@ohif/ui 3.13.0-beta.129 → 3.13.0-beta.130

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -875,7 +875,7 @@ fn main(
875
875
  uniform sampler2D sbtexture;
876
876
  void main () {
877
877
  gl_FragData[0] = texture2D(sbtexture, TexCoords);
878
- }`,"")),t.tris.getShaderSourceTime().modified(),t.tris.getVAO().bind(),t.tris.getVAO().addAttributeArray(t.tris.getProgram(),t.tris.getCABO(),"vertexMC",t.tris.getCABO().getVertexOffset(),t.tris.getCABO().getStride(),t.context.FLOAT,3,t.context.FALSE)||Q0("Error setting vertexMC in shader VAO."));let e=t.renderable.getTextures();e.length||Q0("vtkSkybox requires a texture map"),t.openGLTexture.getRenderable()!==e[0]&&(t.openGLTexture.releaseGraphicsResources(t._openGLRenderWindow),t.openGLTexture.setRenderable(e[0]))}});$r.vtkSkybox=Q2;var{vtkErrorMacro:Q5}=BL,Q3={},Q4=jh(function(e,t,r={}){let n;Object.assign(t,Q3,r),QH(e,t,r),t.classHierarchy.push("vtkOpenGLSphereMapper"),n={...e},e.getShaderTemplate=(e,t,r)=>{e.Vertex="//VTK::System::Dec\n\n/*=========================================================================\n\n Program: Visualization Toolkit\n Module: vtkSphereMapperVS.glsl\n\n Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen\n All rights reserved.\n See Copyright.txt or http://www.kitware.com/Copyright.htm for details.\n\n This software is distributed WITHOUT ANY WARRANTY; without even\n the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR\n PURPOSE. See the above copyright notice for more information.\n\n=========================================================================*/\n// this shader implements imposters in OpenGL for Spheres\n\nattribute vec4 vertexMC;\nattribute vec2 offsetMC;\n\n// optional normal declaration\n//VTK::Normal::Dec\n\n//VTK::Picking::Dec\n\n// Texture coordinates\n//VTK::TCoord::Dec\n\nuniform mat3 normalMatrix; // transform model coordinate directions to view coordinates\n\n// material property values\n//VTK::Color::Dec\n\n// clipping plane vars\n//VTK::Clip::Dec\n\n// camera and actor matrix values\n//VTK::Camera::Dec\n\nvarying vec4 vertexVCVSOutput;\nvarying float radiusVCVSOutput;\nvarying vec3 centerVCVSOutput;\n\nuniform int cameraParallel;\nuniform float scaleFactor;\n\nvoid main()\n{\n //VTK::Picking::Impl\n\n //VTK::Color::Impl\n\n //VTK::Normal::Impl\n\n //VTK::TCoord::Impl\n\n //VTK::Clip::Impl\n\n // compute the projected vertex position\n vec2 scaledOffsetMC = scaleFactor * offsetMC;\n vertexVCVSOutput = MCVCMatrix * vertexMC;\n centerVCVSOutput = vertexVCVSOutput.xyz;\n radiusVCVSOutput = length(scaledOffsetMC)*0.5;\n\n // make the triangle face the camera\n if (cameraParallel == 0)\n {\n vec3 dir = normalize(-vertexVCVSOutput.xyz);\n vec3 base2 = normalize(cross(dir,vec3(1.0,0.0,0.0)));\n vec3 base1 = cross(base2,dir);\n vertexVCVSOutput.xyz = vertexVCVSOutput.xyz + scaledOffsetMC.x*base1 + scaledOffsetMC.y*base2;\n }\n else\n {\n // add in the offset\n vertexVCVSOutput.xy = vertexVCVSOutput.xy + scaledOffsetMC;\n }\n\n gl_Position = VCPCMatrix * vertexVCVSOutput;\n}\n",e.Fragment=Kl,e.Geometry=""},e.replaceShaderValues=(e,r,a)=>{let i=e.Vertex,o=e.Fragment;i=$W.substitute(i,"//VTK::Camera::Dec",["uniform mat4 VCPCMatrix;\n","uniform mat4 MCVCMatrix;"]).result,o=$W.substitute(o,"//VTK::PositionVC::Dec",["varying vec4 vertexVCVSOutput;"]).result,o=$W.substitute(o,"//VTK::PositionVC::Impl",["vec4 vertexVC = vertexVCVSOutput;\n"]).result,o=$W.substitute(o,"//VTK::Normal::Dec",["uniform float invertedDepth;\n","uniform int cameraParallel;\n","varying float radiusVCVSOutput;\n","varying vec3 centerVCVSOutput;\n","uniform mat4 VCPCMatrix;\n"]).result;let s="";t.context.getExtension("EXT_frag_depth")&&(s="gl_FragDepthEXT = (pos.z / pos.w + 1.0) / 2.0;\n"),t._openGLRenderWindow.getWebgl2()&&(s="gl_FragDepth = (pos.z / pos.w + 1.0) / 2.0;\n"),o=$W.substitute(o,"//VTK::Depth::Impl",[" vec3 EyePos;\n"," vec3 EyeDir;\n"," if (cameraParallel != 0) {\n"," EyePos = vec3(vertexVC.x, vertexVC.y, vertexVC.z + 3.0*radiusVCVSOutput);\n"," EyeDir = vec3(0.0,0.0,-1.0); }\n"," else {\n"," EyeDir = vertexVC.xyz;\n"," EyePos = vec3(0.0,0.0,0.0);\n"," float lengthED = length(EyeDir);\n"," EyeDir = normalize(EyeDir);\n"," if (lengthED > radiusVCVSOutput*3.0) {\n"," EyePos = vertexVC.xyz - EyeDir*3.0*radiusVCVSOutput; }\n"," }\n"," EyePos = EyePos - centerVCVSOutput;\n"," EyePos = EyePos/radiusVCVSOutput;\n"," float b = 2.0*dot(EyePos,EyeDir);\n"," float c = dot(EyePos,EyePos) - 1.0;\n"," float d = b*b - 4.0*c;\n"," vec3 normalVCVSOutput = vec3(0.0,0.0,1.0);\n"," if (d < 0.0) { discard; }\n"," else {\n"," float t = (-b - invertedDepth*sqrt(d))*0.5;\n"," normalVCVSOutput = invertedDepth*normalize(EyePos + t*EyeDir);\n"," vertexVC.xyz = normalVCVSOutput*radiusVCVSOutput + centerVCVSOutput;\n"," }\n"," vec4 pos = VCPCMatrix * vertexVC;\n",s]).result,o=$W.substitute(o,"//VTK::Normal::Impl","").result,t.haveSeenDepthRequest&&(o=$W.substitute(o,"//VTK::ZBuffer::Impl",["if (depthRequest == 1) {","float computedZ = (pos.z / pos.w + 1.0) / 2.0;","float iz = floor(computedZ * 65535.0 + 0.1);","float rf = floor(iz/256.0)/255.0;","float gf = mod(iz,256.0)/255.0;","gl_FragData[0] = vec4(rf, gf, 0.0, 1.0); }"]).result),e.Vertex=i,e.Fragment=o,n.replaceShaderValues(e,r,a)},e.setMapperShaderParameters=(e,r,a)=>{if(e.getCABO().getElementCount()&&(t.VBOBuildTime>e.getAttributeUpdateTime().getMTime()||e.getShaderSourceTime().getMTime()>e.getAttributeUpdateTime().getMTime())&&e.getProgram().isAttributeUsed("offsetMC")&&!e.getVAO().addAttributeArray(e.getProgram(),e.getCABO(),"offsetMC",12,e.getCABO().getStride(),t.context.FLOAT,2,!1)&&Q5("Error setting 'offsetMC' in shader VAO."),e.getProgram().isUniformUsed("invertedDepth")&&e.getProgram().setUniformf("invertedDepth",t.invert?-1:1),e.getProgram().isUniformUsed("scaleFactor")){let r=t.currentInput.getPointData();null!=t.renderable.getScaleArray()&&r.hasArray(t.renderable.getScaleArray())?e.getProgram().setUniformf("scaleFactor",t.renderable.getScaleFactor()):e.getProgram().setUniformf("scaleFactor",1)}n.setMapperShaderParameters(e,r,a)},e.setCameraShaderParameters=(e,r,n)=>{let a=e.getProgram(),i=r.getActiveCamera(),o=t.openGLCamera.getKeyMatrices(r);a.isUniformUsed("VCPCMatrix")&&a.setUniformMatrix("VCPCMatrix",o.vcpc);let s=new Float64Array(16);if(a.isUniformUsed("MCVCMatrix"))if(n.getIsIdentity())Lv.mat4.copy(s,o.wcvc),e.getCABO().getCoordShiftAndScaleEnabled()&&Lv.mat4.multiply(s,s,e.getCABO().getInverseShiftAndScaleMatrix()),a.setUniformMatrix("MCVCMatrix",s);else{let r=t.openGLActor.getKeyMatrices();Lv.mat4.multiply(s,o.wcvc,r.mcwc),e.getCABO().getCoordShiftAndScaleEnabled()&&Lv.mat4.multiply(s,s,e.getCABO().getInverseShiftAndScaleMatrix()),a.setUniformMatrix("MCVCMatrix",s)}a.isUniformUsed("cameraParallel")&&e.getProgram().setUniformi("cameraParallel",i.getParallelProjection())},e.getOpenGLMode=(e,r)=>t.context.TRIANGLES,e.buildBufferObjects=(e,r)=>{let n=t.currentInput;if(null===n)return;t.renderable.mapScalars(n,1);let a=t.renderable.getColorMapColors(),i=t.primitives[t.primTypes.Tris].getCABO(),o=n.getPointData(),s=n.getPoints(),l=s.getNumberOfPoints(),u=s.getData(),d=null;null!=t.renderable.getScaleArray()&&o.hasArray(t.renderable.getScaleArray())&&(d=o.getArray(t.renderable.getScaleArray()).getData());let c=null,h=0,p=null;a?(h=a.getNumberOfComponents(),i.setColorOffset(0),i.setColorBOStride(4),c=a.getData(),p=new Uint8Array(3*l*4),i.getColorBO()||i.setColorBO($P.newInstance()),i.getColorBO().setOpenGLRenderWindow(t._openGLRenderWindow)):i.getColorBO()&&i.setColorBO(null),i.setColorComponents(h);let m=new Float32Array(5*l*3);i.setStride(20);let f=Math.cos(jN(30)),g=0,y=0,{useShiftAndScale:v,coordShift:b,coordScale:w}=$_(s);i.setCoordShiftAndScale(v?b:null,v?w:null);let x=0,C=0;for(let e=0;e<l;++e){let r=t.renderable.getRadius();d&&(r=d[e]),g=3*e;let n=(u[g++]-b[0])*w[0],a=(u[g++]-b[1])*w[1],i=(u[g++]-b[2])*w[2];m[x++]=n,m[x++]=a,m[x++]=i,m[x++]=-2*r*f,m[x++]=-r,c&&(y=e*h,p[C++]=c[y],p[C++]=c[y+1],p[C++]=c[y+2],p[C++]=c[y+3]),m[x++]=n,m[x++]=a,m[x++]=i,m[x++]=2*r*f,m[x++]=-r,c&&(p[C++]=c[y],p[C++]=c[y+1],p[C++]=c[y+2],p[C++]=c[y+3]),m[x++]=n,m[x++]=a,m[x++]=i,m[x++]=0,m[x++]=2*r,c&&(p[C++]=c[y],p[C++]=c[y+1],p[C++]=c[y+2],p[C++]=c[y+3])}i.setElementCount(x/5),i.upload(m,$C.ARRAY_BUFFER),a&&i.getColorBO().upload(p,$C.ARRAY_BUFFER),t.VBOBuildTime.modified()}},"vtkOpenGLSphereMapper");$r.vtkSphereMapper=Q4;var{vtkErrorMacro:Q8}=BL,Q6={},Q9=jh(function(e,t,r={}){let n;Object.assign(t,Q6,r),QH(e,t,r),t.classHierarchy.push("vtkOpenGLStickMapper"),n={...e},e.getShaderTemplate=(e,t,r)=>{e.Vertex="//VTK::System::Dec\n\n/*=========================================================================\n\n Program: Visualization Toolkit\n Module: vtkStickMapperVS.glsl\n\n Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen\n All rights reserved.\n See Copyright.txt or http://www.kitware.com/Copyright.htm for details.\n\n This software is distributed WITHOUT ANY WARRANTY; without even\n the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR\n PURPOSE. See the above copyright notice for more information.\n\n=========================================================================*/\n// this shader implements imposters in OpenGL for Sticks\n\nattribute vec4 vertexMC;\nattribute vec3 orientMC;\nattribute vec4 offsetMC;\nattribute float radiusMC;\n\n// optional normal declaration\n//VTK::Normal::Dec\n\n//VTK::Picking::Dec\n\n// Texture coordinates\n//VTK::TCoord::Dec\n\nuniform mat3 normalMatrix; // transform model coordinate directions to view coordinates\n\n// material property values\n//VTK::Color::Dec\n\n// clipping plane vars\n//VTK::Clip::Dec\n\n// camera and actor matrix values\n//VTK::Camera::Dec\n\nvarying vec4 vertexVCVSOutput;\nvarying float radiusVCVSOutput;\nvarying float lengthVCVSOutput;\nvarying vec3 centerVCVSOutput;\nvarying vec3 orientVCVSOutput;\n\nuniform int cameraParallel;\n\nvoid main()\n{\n //VTK::Picking::Impl\n\n //VTK::Color::Impl\n\n //VTK::Normal::Impl\n\n //VTK::TCoord::Impl\n\n //VTK::Clip::Impl\n\n vertexVCVSOutput = MCVCMatrix * vertexMC;\n centerVCVSOutput = vertexVCVSOutput.xyz;\n radiusVCVSOutput = radiusMC;\n lengthVCVSOutput = length(orientMC);\n orientVCVSOutput = normalMatrix * normalize(orientMC);\n\n // make sure it is pointing out of the screen\n if (orientVCVSOutput.z < 0.0)\n {\n orientVCVSOutput = -orientVCVSOutput;\n }\n\n // make the basis\n vec3 xbase;\n vec3 ybase;\n vec3 dir = vec3(0.0,0.0,1.0);\n if (cameraParallel == 0)\n {\n dir = normalize(-vertexVCVSOutput.xyz);\n }\n if (abs(dot(dir,orientVCVSOutput)) == 1.0)\n {\n xbase = normalize(cross(vec3(0.0,1.0,0.0),orientVCVSOutput));\n ybase = cross(xbase,orientVCVSOutput);\n }\n else\n {\n xbase = normalize(cross(orientVCVSOutput,dir));\n ybase = cross(orientVCVSOutput,xbase);\n }\n\n vec3 offsets = offsetMC.xyz*2.0-1.0;\n vertexVCVSOutput.xyz = vertexVCVSOutput.xyz +\n radiusVCVSOutput*offsets.x*xbase +\n radiusVCVSOutput*offsets.y*ybase +\n 0.5*lengthVCVSOutput*offsets.z*orientVCVSOutput;\n\n gl_Position = VCPCMatrix * vertexVCVSOutput;\n}\n",e.Fragment=Kl,e.Geometry=""},e.replaceShaderValues=(e,r,a)=>{let i=e.Vertex,o=e.Fragment;i=$W.substitute(i,"//VTK::Camera::Dec",["uniform mat4 VCPCMatrix;\n","uniform mat4 MCVCMatrix;"]).result,o=$W.substitute(o,"//VTK::PositionVC::Dec","varying vec4 vertexVCVSOutput;").result,o=$W.substitute(o,"//VTK::PositionVC::Impl"," vec4 vertexVC = vertexVCVSOutput;\n").result,o=$W.substitute(o,"//VTK::Normal::Dec",["uniform int cameraParallel;\n","varying float radiusVCVSOutput;\n","varying vec3 orientVCVSOutput;\n","varying float lengthVCVSOutput;\n","varying vec3 centerVCVSOutput;\n","uniform mat4 VCPCMatrix;\n"]).result;let s="";t.context.getExtension("EXT_frag_depth")&&(s=" gl_FragDepthEXT = (pos.z / pos.w + 1.0) / 2.0;\n"),t._openGLRenderWindow.getWebgl2()&&(s="gl_FragDepth = (pos.z / pos.w + 1.0) / 2.0;\n"),o=$W.substitute(o,"//VTK::Depth::Impl",[" vec3 EyePos;\n"," vec3 EyeDir;\n"," if (cameraParallel != 0) {\n"," EyePos = vec3(vertexVC.x, vertexVC.y, vertexVC.z + 3.0*radiusVCVSOutput);\n"," EyeDir = vec3(0.0,0.0,-1.0); }\n"," else {\n"," EyeDir = vertexVC.xyz;\n"," EyePos = vec3(0.0,0.0,0.0);\n"," float lengthED = length(EyeDir);\n"," EyeDir = normalize(EyeDir);\n"," if (lengthED > radiusVCVSOutput*3.0) {\n"," EyePos = vertexVC.xyz - EyeDir*3.0*radiusVCVSOutput; }\n"," }\n"," EyePos = EyePos - centerVCVSOutput;\n"," vec3 base1;\n"," if (abs(orientVCVSOutput.z) < 0.99) {\n"," base1 = normalize(cross(orientVCVSOutput,vec3(0.0,0.0,1.0))); }\n"," else {\n"," base1 = normalize(cross(orientVCVSOutput,vec3(0.0,1.0,0.0))); }\n"," vec3 base2 = cross(orientVCVSOutput,base1);\n"," EyePos = vec3(dot(EyePos,base1),dot(EyePos,base2),dot(EyePos,orientVCVSOutput));\n"," EyeDir = vec3(dot(EyeDir,base1),dot(EyeDir,base2),dot(EyeDir,orientVCVSOutput));\n"," EyePos = EyePos/radiusVCVSOutput;\n"," float a = EyeDir.x*EyeDir.x + EyeDir.y*EyeDir.y;\n"," float b = 2.0*(EyePos.x*EyeDir.x + EyePos.y*EyeDir.y);\n"," float c = EyePos.x*EyePos.x + EyePos.y*EyePos.y - 1.0;\n"," float d = b*b - 4.0*a*c;\n"," vec3 normalVCVSOutput = vec3(0.0,0.0,1.0);\n"," if (d < 0.0) { discard; }\n"," else {\n"," float t = (-b - sqrt(d))/(2.0*a);\n"," float tz = EyePos.z + t*EyeDir.z;\n"," vec3 iPoint = EyePos + t*EyeDir;\n"," if (abs(iPoint.z)*radiusVCVSOutput > lengthVCVSOutput*0.5) {\n"," float t2 = (-b + sqrt(d))/(2.0*a);\n"," float tz2 = EyePos.z + t2*EyeDir.z;\n"," if (tz2*radiusVCVSOutput > lengthVCVSOutput*0.5 || tz*radiusVCVSOutput < -0.5*lengthVCVSOutput) { discard; }\n"," else {\n"," normalVCVSOutput = orientVCVSOutput;\n"," float t3 = (lengthVCVSOutput*0.5/radiusVCVSOutput - EyePos.z)/EyeDir.z;\n"," iPoint = EyePos + t3*EyeDir;\n"," vertexVC.xyz = radiusVCVSOutput*(iPoint.x*base1 + iPoint.y*base2 + iPoint.z*orientVCVSOutput) + centerVCVSOutput;\n"," }\n"," }\n"," else {\n"," normalVCVSOutput = iPoint.x*base1 + iPoint.y*base2;\n"," vertexVC.xyz = radiusVCVSOutput*(normalVCVSOutput + iPoint.z*orientVCVSOutput) + centerVCVSOutput;\n"," }\n"," }\n"," vec4 pos = VCPCMatrix * vertexVC;\n",s]).result,o=$W.substitute(o,"//VTK::Normal::Impl","").result,t.haveSeenDepthRequest&&(o=$W.substitute(o,"//VTK::ZBuffer::Impl",["if (depthRequest == 1) {","float computedZ = (pos.z / pos.w + 1.0) / 2.0;","float iz = floor(computedZ * 65535.0 + 0.1);","float rf = floor(iz/256.0)/255.0;","float gf = mod(iz,256.0)/255.0;","gl_FragData[0] = vec4(rf, gf, 0.0, 1.0); }"]).result),e.Vertex=i,e.Fragment=o,n.replaceShaderValues(e,r,a)},e.setMapperShaderParameters=(e,r,a)=>{e.getCABO().getElementCount()&&(t.VBOBuildTime>e.getAttributeUpdateTime().getMTime()||e.getShaderSourceTime().getMTime()>e.getAttributeUpdateTime().getMTime())&&(e.getProgram().isAttributeUsed("orientMC")&&!e.getVAO().addAttributeArray(e.getProgram(),e.getCABO(),"orientMC",12,e.getCABO().getStride(),t.context.FLOAT,3,!1)&&Q8("Error setting 'orientMC' in shader VAO."),e.getProgram().isAttributeUsed("offsetMC")&&!e.getVAO().addAttributeArray(e.getProgram(),e.getCABO().getColorBO(),"offsetMC",0,e.getCABO().getColorBOStride(),t.context.UNSIGNED_BYTE,3,!0)&&Q8("Error setting 'offsetMC' in shader VAO."),e.getProgram().isAttributeUsed("radiusMC")&&!e.getVAO().addAttributeArray(e.getProgram(),e.getCABO(),"radiusMC",24,e.getCABO().getStride(),t.context.FLOAT,1,!1)&&Q8("Error setting 'radiusMC' in shader VAO.")),n.setMapperShaderParameters(e,r,a)},e.setCameraShaderParameters=(e,r,n)=>{let a=e.getProgram(),i=r.getActiveCamera(),o=t.openGLCamera.getKeyMatrices(r);if(a.isUniformUsed("VCPCMatrix")&&a.setUniformMatrix("VCPCMatrix",o.vcpc),n.getIsIdentity())a.isUniformUsed("MCVCMatrix")&&a.setUniformMatrix("MCVCMatrix",o.wcvc),a.isUniformUsed("normalMatrix")&&a.setUniformMatrix3x3("normalMatrix",o.normalMatrix);else{let e=t.openGLActor.getKeyMatrices();if(a.isUniformUsed("MCVCMatrix")){let t=new Float64Array(16);Lv.mat4.multiply(t,o.wcvc,e.mcwc),a.setUniformMatrix("MCVCMatrix",t)}if(a.isUniformUsed("normalMatrix")){let t=new Float64Array(9);Lv.mat3.multiply(t,o.normalMatrix,e.normalMatrix),a.setUniformMatrix3x3("normalMatrix",t)}}a.isUniformUsed("cameraParallel")&&e.getProgram().setUniformi("cameraParallel",i.getParallelProjection())},e.getOpenGLMode=(e,r)=>t.context.TRIANGLES,e.buildBufferObjects=(e,r)=>{let n=t.currentInput;if(null===n)return;t.renderable.mapScalars(n,1);let a=t.renderable.getColorMapColors(),i=t.primitives[t.primTypes.Tris].getCABO(),o=n.getPointData(),s=n.getPoints(),l=s.getNumberOfPoints(),u=s.getData(),d=null,c=0;i.setColorBOStride(4),i.getColorBO()||i.setColorBO($P.newInstance()),i.getColorBO().setOpenGLRenderWindow(t._openGLRenderWindow),a&&(c=a.getNumberOfComponents(),i.setColorOffset(4),d=a.getData(),i.setColorBOStride(8)),i.setColorComponents(c),i.setStride(28);let h=new Float32Array(7*l*12),p=new Uint8Array(12*l*(d?8:4)),m=null,f=null;null!=t.renderable.getScaleArray()&&o.hasArray(t.renderable.getScaleArray())&&(m=o.getArray(t.renderable.getScaleArray()).getData()),null!=t.renderable.getOrientationArray()&&o.hasArray(t.renderable.getOrientationArray())?f=o.getArray(t.renderable.getOrientationArray()).getData():Q8(["Error setting orientationArray.\n","You have to specify the stick orientation"]);let g=[0,1,3,0,3,2,2,3,5,2,5,4],y=0,v=0,b=0,w=0;for(let e=0;e<l;++e){let r=t.renderable.getLength(),n=t.renderable.getRadius();m&&(r=m[2*e],n=m[2*e+1]);for(let t=0;t<g.length;++t)y=3*e,h[b++]=u[y++],h[b++]=u[y++],h[b++]=u[y++],y=3*e,h[b++]=f[y++]*r,h[b++]=f[y++]*r,h[b++]=f[y++]*r,h[b++]=n,p[w++]=255*(g[t]%2),p[w++]=255*(g[t]>=4),p[w++]=255*(g[t]>=2),p[w++]=255,v=e*c,d&&(p[w++]=d[v],p[w++]=d[v+1],p[w++]=d[v+2],p[w++]=d[v+3])}i.setElementCount(b/7),i.upload(h,$C.ARRAY_BUFFER),i.getColorBO().upload(p,$C.ARRAY_BUFFER),t.VBOBuildTime.modified()}},"vtkOpenGLStickMapper");$r.vtkStickMapper=Q9;let{vtkErrorMacro:Q7}=jS,eee={},eet=jS.newInstance(function(e,t,r={}){Object.assign(t,eee,r),Y4(e,t,r),r.scalarTexture?t.scalarTextures=[r.scalarTexture]:t.scalarTextures=[],t.scalarTextureStrings=[],t._scalarTexturesCore=[];t.classHierarchy.push("vtkStreamingOpenGLImageResliceMapper");let n=new Map;function a(t,r,a){r!==a&&(!function(t,r){if(!r)return;let a=(n.get(r)??0)-1;a<=0?(t.unregisterGraphicsResourceUser(r,e),n.delete(r)):n.set(r,a)}(t,r),function(t,r){if(!r)return;let a=n.get(r)??0;n.set(r,a+1),a<=0&&t.registerGraphicsResourceUser(r,e)}(t,a))}e.renderPiece=(r,n)=>{e.invokeEvent({type:"StartEvent"}),t.renderable.update();let a=t.renderable.getNumberOfInputPorts();t.currentValidInputs=[];for(let e=0;e<a;++e){let r=t.renderable.getInputData(e);r&&!r.isDeleted()&&t.currentValidInputs.push({imageData:r,inputIndex:e})}let i=t.currentValidInputs.length;if(i<=0)return void Q7("No input!");t.labelOutlineProperties=function(e,t){let r=[];for(let n=0;n<t.length;n++){let a=e.getProperty(t[n].inputIndex);a?.getUseLabelOutline()&&r.push({property:a,arrayIndex:n})}return r}(n,t.currentValidInputs);let o=t.currentValidInputs[0].imageData,s=o.getPointData().getScalars(),{numberOfComponents:l}=o.get("numberOfComponents")||{numberOfComponents:void 0};t.multiTexturePerVolumeEnabled=i>1,t.numberOfComponents=t.multiTexturePerVolumeEnabled?i:"number"==typeof l?l:s?.getNumberOfComponents?.()??1,e.updateResliceGeometry(),e.renderPieceStart(r,n),e.renderPieceDraw(r,n),e.renderPieceFinish(r,n),e.invokeEvent({type:"EndEvent"})},e.getNeedToRebuildBufferObjects=(r,n)=>{let a=t.labelOutlineProperties.length>0;if(t.VBOBuildTime.getMTime()<e.getMTime()||t.VBOBuildTime.getMTime()<n.getMTime()||t.VBOBuildTime.getMTime()<t.renderable.getMTime()||t.VBOBuildTime.getMTime()<n.getProperty(t.currentValidInputs[0].inputIndex)?.getMTime()||t.currentValidInputs.some(({imageData:e})=>t.VBOBuildTime.getMTime()<e.getMTime())||t.VBOBuildTime.getMTime()<t.resliceGeom.getMTime()||t.scalarTextures.length!==t.currentValidInputs.length||!t.colorTexture?.getHandle()||!t.pwfTexture?.getHandle()||a&&(!t.labelOutlineThicknessTexture?.getHandle()||!t.labelOutlineOpacityTexture?.getHandle()))return!0;if(t.scalarTextures&&t.scalarTextures.length>0)for(let e=0;e<t.scalarTextures.length;e++){let r=t.scalarTextures[e];if(r&&(t.VBOBuildTime.getMTime()<r.getMTime()||!r.getHandle()))return!0}return!1},e.buildBufferObjects=(r,n)=>{let i=n.getProperties();t.currentValidInputs.forEach(({imageData:e},r)=>{t.scalarTextures||(t.scalarTextures=[]),t.scalarTextures[r]||(t.scalarTextures[r]=$g.newInstance());let n=t.scalarTextures[r],o=i[r],s=o.getUpdatedExtents(),l=!!s.length;if(n&&"function"==typeof n.hasUpdatedFrames){let r=e.getDimensions(),{dataType:a}=e.get("dataType"),i=t.numberOfComponents;n.setOpenGLRenderWindow(t._openGLRenderWindow),n.enableUseHalfFloat?.(!1);let s=n.getTextureParameters?.(),u=!0;if(s?.dataType===a&&s?.width===r[0]&&s?.height===r[1]&&s?.depth===r[2]&&(u=!1),u){let e=t.context.getExtension("EXT_texture_norm16");n.setOglNorm16Ext(BS()?e:null),n.resetFormatAndType(),n.setTextureParameters?.({width:r[0],height:r[1],depth:r[2],numberOfComponents:i,dataType:a}),n.create3DFromRaw({width:r[0],height:r[1],depth:r[2],numComps:i,dataType:a,data:null}),n.update3DFromRaw()}else n.deactivate?.(),n.update3DFromRaw();l&&o.setUpdatedExtents([]);return}let u=e.getPointData().getScalars();if(!u)return void Q7("No scalars available for non-streaming reslice mapper");let d=t._openGLRenderWindow.getGraphicsResourceForObject(u),c=Kh(e,u);if(d?.oglObject?.getHandle()&&d?.hash===c||l)t.scalarTextures[r]=d.oglObject;else{let n=$g.newInstance();n.setOpenGLRenderWindow(t._openGLRenderWindow);let a=e.getDimensions();n.setOglNorm16Ext(t.context.getExtension("EXT_texture_norm16")),n.resetFormatAndType(),n.create3DFilterableFromDataArray({width:a[0],height:a[1],depth:a[2],dataArray:u}),t._openGLRenderWindow.setGraphicsResourceForObject(u,n,c),t.scalarTextures[r]=n}if(l){o.setUpdatedExtents([]);let n=e.getDimensions();t.scalarTextures[r].create3DFilterableFromDataArray({width:n[0],height:n[1],depth:n[2],dataArray:u,updatedExtents:s})}a(t._openGLRenderWindow,t._scalarTexturesCore[r],u),t._scalarTexturesCore[r]=u});let o=i[t.currentValidInputs[0].inputIndex],s=o.getIndependentComponents(),l=s?t.numberOfComponents:1,u=s?2*l:1,d=[];for(let e=0;e<l;++e)d.push(o.getRGBTransferFunction(e));let c=Kc(d,s,l),h=o.getRGBTransferFunction(),p=t._openGLRenderWindow.getGraphicsResourceForObject(h);if(p?.oglObject?.getHandle()&&p?.hash===c)t.colorTexture=p.oglObject;else{let e=t.renderable.getColorTextureWidth();e<=0&&(e=t.context.getParameter(t.context.MAX_TEXTURE_SIZE));let r=new Uint8ClampedArray(e*u*3),n=$g.newInstance();if(n.setOpenGLRenderWindow(t._openGLRenderWindow),h){let t=new Float32Array(3*e);for(let n=0;n<l;n++){let a=o.getRGBTransferFunction(n),i=a.getRange();if(a.getTable(i[0],i[1],e,t,1),s)for(let a=0;a<3*e;a++)r[n*e*6+a]=255*t[a],r[n*e*6+a+3*e]=255*t[a];else for(let a=0;a<3*e;a++)r[n*e*3+a]=255*t[a]}n.resetFormatAndType(),n.create2DFromRaw({width:e,height:u,numComps:3,dataType:UZ.UNSIGNED_CHAR,data:r})}else{for(let t=0;t<3*e;++t){let n=255*t/((e-1)*3);for(let a=0;a<u;++a)r[a*e*3+t+0]=n,r[a*e*3+t+1]=n,r[a*e*3+t+2]=n}n.resetFormatAndType(),n.create2DFromRaw({width:e,height:1,numComps:3,dataType:UZ.UNSIGNED_CHAR,data:r})}h&&t._openGLRenderWindow.setGraphicsResourceForObject(h,n,c),t.colorTexture=n}a(t._openGLRenderWindow,t._colorTextureCore,h),t._colorTextureCore=h;let m=[];for(let e=0;e<l;++e)m.push(o.getPiecewiseFunction(e));let f=Kc(m,s,l),g=o.getPiecewiseFunction(),y=t._openGLRenderWindow.getGraphicsResourceForObject(g);if(y?.oglObject?.getHandle()&&y?.hash===f)t.pwfTexture=y.oglObject;else{let e=t.renderable.getOpacityTextureWidth();e<=0&&(e=t.context.getParameter(t.context.MAX_TEXTURE_SIZE));let r=e*u,n=new Uint8ClampedArray(r),a=$g.newInstance();if(a.setOpenGLRenderWindow(t._openGLRenderWindow),g){let t=new Float32Array(r),n=new Float32Array(e);for(let r=0;r<l;++r){let a=o.getPiecewiseFunction(r);if(null===a)t.fill(1);else{let i=a.getRange();if(a.getTable(i[0],i[1],e,n,1),s)for(let a=0;a<e;a++)t[r*e*2+a]=n[a],t[r*e*2+a+e]=n[a];else for(let r=0;r<e;r++)t[r]=n[r]}}a.resetFormatAndType(),a.create2DFromRaw({width:e,height:u,numComps:1,dataType:UZ.FLOAT,data:t})}else n.fill(255),a.resetFormatAndType(),a.create2DFromRaw({width:e,height:u,numComps:1,dataType:UZ.UNSIGNED_CHAR,data:n});g&&t._openGLRenderWindow.setGraphicsResourceForObject(g,a,f),t.pwfTexture=a}a(t._openGLRenderWindow,t._pwfTextureCore,g),t._pwfTextureCore=g,t.labelOutlineProperties.length>0&&(e.updateLabelOutlineThicknessTexture(t.labelOutlineProperties),e.updateLabelOutlineOpacityTexture(t.labelOutlineProperties));let v=`${t.resliceGeom.getMTime()}A${t.renderable.getSlabThickness()}`;if(!t.tris.getCABO().getElementCount()||t.VBOBuildString!==v){let e=U9.newInstance({numberOfComponents:3,values:t.resliceGeom.getPoints().getData()});e.setName("points");let r=U9.newInstance({numberOfComponents:1,values:t.resliceGeom.getPolys().getData()}),n={points:e,cellOffset:0};if(t.renderable.getSlabThickness()>0){let e=t.resliceGeom.getPointData().getNormals();e?n.normals=e:Q7("Slab mode requested without normals")}t.tris.getCABO().createVBO(r,"polys",qX.SURFACE,n)}t.VBOBuildString=v,t.VBOBuildTime.modified()}},"vtkStreamingOpenGLImageResliceMapper"),eer={},een=jS.newInstance(function(e,t,r={}){Object.assign(t,eer,r),Zs(e,t,r),r.scalarTexture?t.scalarTextures=[r.scalarTexture]:t.scalarTextures=[],t.scalarTextureStrings=[],t._scalarTexturesCore=[],t.previousState={};t.classHierarchy.push("vtkStreamingOpenGLVolumeMapper");let n=new Map;function a(t,r,a){r!==a&&(!function(t,r){if(!r)return;let a=(n.get(r)??0)-1;a<=0?(t.unregisterGraphicsResourceUser(r,e),n.delete(r)):n.set(r,a)}(t,r),function(t,r){if(!r)return;let a=n.get(r)??0;n.set(r,a+1),a<=0&&t.registerGraphicsResourceUser(r,e)}(t,a))}e.renderPiece=(r,n)=>{e.invokeEvent({type:"StartEvent"}),t.renderable.update();let a=t.renderable.getNumberOfInputPorts();t.currentValidInputs=[];for(let e=0;e<a;++e){let r=t.renderable.getInputData(e);r&&!r.isDeleted()&&t.currentValidInputs.push({imageData:r,inputIndex:e})}let i=0;if(t.currentValidInputs.length>0){let e=n.getProperties(),a=t.currentValidInputs[0],o=a.imageData,s=e[a.inputIndex];s.getShade()&&t.renderable.getBlendMode()===NY.COMPOSITE_BLEND&&r.getLights().forEach(e=>{e.getSwitch()>0&&i++});let l=t.currentValidInputs.length,u=l>1,{numberOfComponents:d}=o.get("numberOfComponents");t.numberOfComponents=u?l:d,t.numberOfComponents>1?t.useIndependentComponents=s.getIndependentComponents():t.useIndependentComponents=!1}i!==t.numberOfLights&&(t.numberOfLights=i,e.modified()),e.invokeEvent({type:"EndEvent"}),0!==t.currentValidInputs.length&&(e.renderPieceStart(r,n),e.renderPieceDraw(r,n),e.renderPieceFinish(r,n))},e.buildBufferObjects=(r,n)=>{if(!t.jitterTexture.getHandle()){let e=new Float32Array(1024);for(let t=0;t<1024;++t)e[t]=Math.random();t.jitterTexture.setMinificationFilter(q0.NEAREST),t.jitterTexture.setMagnificationFilter(q0.NEAREST),t.jitterTexture.create2DFromRaw({width:32,height:32,numComps:1,dataType:UZ.FLOAT,data:e})}let i=n.getProperties()[t.currentValidInputs[0].inputIndex],o=t.numberOfComponents,s=t.useIndependentComponents,l=s?o:1,u=[];for(let e=0;e<l;++e)u.push(i.getScalarOpacity(e));let d=Kc(u,s,l),c=i.getScalarOpacity(),h=t._openGLRenderWindow.getGraphicsResourceForObject(c);if(h?.oglObject?.getHandle()&&h.hash===d)t.opacityTexture=h.oglObject;else{let n=$g.newInstance();n.setOpenGLRenderWindow(t._openGLRenderWindow);let a=t.renderable.getOpacityTextureWidth();a<=0&&(a=t.context.getParameter(t.context.MAX_TEXTURE_SIZE));let o=2*a*l,s=new Float32Array(o),u=new Float32Array(a);for(let t=0;t<l;++t){let n=i.getScalarOpacity(t),o=e.getCurrentSampleDistance(r)/i.getScalarOpacityUnitDistance(t),l=n.getRange();n.getTable(l[0],l[1],a,u,1);for(let e=0;e<a;++e)s[t*a*2+e]=1-(1-u[e])**o,s[t*a*2+e+a]=s[t*a*2+e]}if(n.resetFormatAndType(),n.setMinificationFilter(q0.LINEAR),n.setMagnificationFilter(q0.LINEAR),t._openGLRenderWindow.getWebgl2()||t.context.getExtension("OES_texture_float")&&t.context.getExtension("OES_texture_float_linear"))n.create2DFromRaw({width:a,height:2*l,numComps:1,dataType:UZ.FLOAT,data:s});else{let e=new Uint8ClampedArray(o);for(let t=0;t<o;++t)e[t]=255*s[t];n.create2DFromRaw({width:a,height:2*l,numComps:1,dataType:UZ.UNSIGNED_CHAR,data:e})}c&&t._openGLRenderWindow.setGraphicsResourceForObject(c,n,d),t.opacityTexture=n}a(t._openGLRenderWindow,t._opacityTextureCore,c),t._opacityTextureCore=c;let p=[];for(let e=0;e<l;++e)p.push(i.getRGBTransferFunction(e));let m=Kc(p,s,l),f=i.getRGBTransferFunction(),g=t._openGLRenderWindow.getGraphicsResourceForObject(f);if(g?.oglObject?.getHandle()&&g?.hash===m)t.colorTexture=g.oglObject;else{let e=$g.newInstance();e.setOpenGLRenderWindow(t._openGLRenderWindow);let r=t.renderable.getColorTextureWidth();r<=0&&(r=t.context.getParameter(t.context.MAX_TEXTURE_SIZE));let n=new Uint8ClampedArray(2*r*l*3),a=new Float32Array(3*r);for(let e=0;e<l;++e){let t=i.getRGBTransferFunction(e),o=t.getRange();t.getTable(o[0],o[1],r,a,1);for(let t=0;t<3*r;++t)n[e*r*6+t]=255*a[t],n[e*r*6+t+3*r]=255*a[t]}e.resetFormatAndType(),e.setMinificationFilter(q0.LINEAR),e.setMagnificationFilter(q0.LINEAR),e.create2DFromRaw({width:r,height:2*l,numComps:3,dataType:UZ.UNSIGNED_CHAR,data:n}),t._openGLRenderWindow.setGraphicsResourceForObject(f,e,m),t.colorTexture=e}a(t._openGLRenderWindow,t._colorTextureCore,f),t._colorTextureCore=f,t.currentValidInputs.forEach(({imageData:e,inputIndex:r},n)=>{if(t.scalarTextures||(t.scalarTextures=[]),!t.scalarTextures[n])return void console.warn(`ScalarTexture for component ${n} not initialized, skipping.`);let a=t.scalarTextures[n],i=`${e.getMTime()}-${a.getMTime()}`;if(t.scalarTextureStrings||(t.scalarTextureStrings=[]),t.scalarTextureStrings[n]!==i){let r=e.getDimensions();a.setOpenGLRenderWindow(t._openGLRenderWindow),a.enableUseHalfFloat(!1);let o=a.getTextureParameters(),s=e.get("dataType").dataType,l=e.getPointData()?.getScalars()?.getNumberOfComponents?.()??e.get("numberOfComponents").numberOfComponents??1,u=!0;if(o?.dataType===s&&o?.width===r[0]&&o?.height===r[1]&&o?.depth===r[2]&&o?.numberOfComponents===l&&(u=!1),u){let e=t.context.getExtension("EXT_texture_norm16");a.setOglNorm16Ext(BS()?e:null),a.resetFormatAndType(),a.setTextureParameters({width:r[0],height:r[1],depth:r[2],numberOfComponents:l,dataType:s}),a.create3DFromRaw({width:r[0],height:r[1],depth:r[2],numComps:l,dataType:s,data:null}),a.update3DFromRaw()}else a.deactivate(),a.update3DFromRaw();t.scalarTextureStrings[n]=i}t._scalarTexturesCore||(t._scalarTexturesCore=[])});let y=i.getLabelOutlineThickness(),v=t._openGLRenderWindow.getGraphicsResourceForObject(y),b=y.join("-");if(v?.oglObject?.getHandle()&&v?.hash===b)t.labelOutlineThicknessTexture=v.oglObject;else{let e=$g.newInstance();e.setOpenGLRenderWindow(t._openGLRenderWindow);let r=t.renderable.getLabelOutlineTextureWidth();r<=0&&(r=t.context.getParameter(t.context.MAX_TEXTURE_SIZE));let n=new Uint8Array(+r);for(let e=0;e<r;++e){let t=void 0!==y[e]?y[e]:y[0];n[e]=t}e.resetFormatAndType(),e.setMinificationFilter(q0.NEAREST),e.setMagnificationFilter(q0.NEAREST),e.create2DFromRaw({width:r,height:1,numComps:1,dataType:UZ.UNSIGNED_CHAR,data:n}),y&&t._openGLRenderWindow.setGraphicsResourceForObject(y,e,b),t.labelOutlineThicknessTexture=e}if(a(t._openGLRenderWindow,t._labelOutlineThicknessTextureCore,y),t._labelOutlineThicknessTextureCore=y,!t.tris.getCABO().getElementCount()){let e=new Float32Array(12);for(let t=0;t<4;t++)e[3*t]=t%2*2-1,e[3*t+1]=t>1?1:-1,e[3*t+2]=-1;let r=new Uint16Array(8);r[0]=3,r[1]=0,r[2]=1,r[3]=3,r[4]=3,r[5]=0,r[6]=3,r[7]=2;let n=U9.newInstance({numberOfComponents:3,values:e});n.setName("points");let a=U9.newInstance({numberOfComponents:1,values:r});t.tris.getCABO().createVBO(a,"polys",qX.SURFACE,{points:n,cellOffset:0})}t.VBOBuildTime.modified()},e.getNeedToRebuildBufferObjects=(r,n)=>{if(t.VBOBuildTime.getMTime()<e.getMTime()||t.VBOBuildTime.getMTime()<n.getMTime()||t.VBOBuildTime.getMTime()<t.renderable.getMTime()||t.VBOBuildTime.getMTime()<n.getProperty().getMTime()||t.VBOBuildTime.getMTime()<t.colorTexture?.getMTime()||t.VBOBuildTime.getMTime()<t.labelOutlineThicknessTexture?.getMTime()||!t.colorTexture?.getHandle()||!t.labelOutlineThicknessTexture?.getHandle())return!0;if(t.scalarTextures&&t.scalarTextures.length>0)for(let e=0;e<t.scalarTextures.length;e++){let r=t.scalarTextures[e];if(r&&(t.VBOBuildTime.getMTime()<r.getMTime()||!r.getHandle()))return!0}if(t.currentValidInputs&&t.currentValidInputs.length>0)for(let e=0;e<t.currentValidInputs.length;e++){let r=t.currentValidInputs[e];if(r&&r.imageData&&t.VBOBuildTime.getMTime()<r.imageData.getMTime())return!0}return!1}},"vtkStreamingOpenGLVolumeMapper"),eea=Object.create(null),eei={},eeo=jS.newInstance(function(e,t,r={}){Object.assign(t,eei,r),$t(e,t,r),t.classHierarchy.push("vtkStreamingOpenGLViewNodeFactory"),e.createNode=r=>{if(r.isDeleted())return null;let n=0,a=r.getClassName(n++),i=!1,o=Object.keys(t.overrides);for(;a&&!i;)o.includes(a)?i=!0:a=r.getClassName(n++);if(!i)return null;let s=t.getModelInitialValues(r),l=t.overrides[a](s);return l.setMyFactory(e),l},t.overrides=eea,t.getModelInitialValues=e=>{let t={},r=e.getClassName();return"vtkSharedVolumeMapper"===r&&(t.scalarTexture=e.getScalarTexture()),"vtkSharedImageResliceMapper"===r&&(t.scalarTexture=e.getScalarTexture()),t},eea.vtkActor=Qh,eea.vtkActor2D=Qm,eea.vtkCamera=Ko,eea.vtkGlyph3DMapper=QQ,eea.vtkImageMapper=Kg,eea.vtkImageCPRMapper=Zp,eea.vtkImageResliceMapper=Y8,eea.vtkImageSlice=Kv,eea.vtkMapper=QG,eea.vtkPixelSpaceCallbackMapper=Kx,eea.vtkRenderer=KM,eea.vtkSkybox=Q2,eea.vtkSphereMapper=Q4,eea.vtkStickMapper=Q9,eea.vtkTexture=$g.newInstance,eea.vtkVolume=Y9,eea.vtkVolumeMapper=Zl,eea.vtkSharedVolumeMapper=een,eea.vtkSharedImageResliceMapper=eet},"vtkStreamingOpenGLViewNodeFactory"),ees=jS.newInstance(function(e,t,r={}){Object.assign(t,r),Qu(e,t,r),t.myFactory=eeo(),eea.vtkRenderWindow=ees,t.classHierarchy.push("vtkStreamingOpenGLRenderWindow")},"vtkStreamingOpenGLRenderWindow");var eel={switch:!0,intensity:1,color:[1,1,1],position:[0,0,1],focalPoint:[0,0,0],positional:!1,exponent:1,coneAngle:30,coneFalloff:5,attenuationValues:[1,0,0],transformMatrix:null,lightType:"SceneLight",shadowAttenuation:1,direction:[0,0,0],directionMTime:0},eeu=jS.newInstance(function(e,t,r={}){let n;Object.assign(t,eel,r),jS.obj(e,t),jS.setGet(e,t,["intensity","switch","positional","exponent","coneAngle","coneFalloff","transformMatrix","lightType","shadowAttenuation","attenuationValues"]),jS.setGetArray(e,t,["color","position","focalPoint","attenuationValues"],3),t.classHierarchy.push("vtkLight"),n=new Float64Array(3),e.getTransformedPosition=()=>(t.transformMatrix?Lv.vec3.transformMat4(n,t.position,t.transformMatrix):Lv.vec3.set(n,t.position[0],t.position[1],t.position[2]),n),e.getTransformedFocalPoint=()=>(t.transformMatrix?Lv.vec3.transformMat4(n,t.focalPoint,t.transformMatrix):Lv.vec3.set(n,t.focalPoint[0],t.focalPoint[1],t.focalPoint[2]),n),e.getDirection=()=>(t.directionMTime<t.mtime&&(Lv.vec3.sub(t.direction,t.focalPoint,t.position),j2(t.direction),t.directionMTime=t.mtime),t.direction),e.setDirection=e=>{let r=new Float64Array(3);Lv.vec3.sub(r,t.position,e),t.focalPoint=r},e.setDirectionAngle=(t,r)=>{let n=jN(t),a=jN(r);e.setPosition(Math.cos(n)*Math.sin(a),Math.sin(n),Math.cos(n)*Math.cos(a)),e.setFocalPoint(0,0,0),e.setPositional(0)},e.setLightTypeToHeadLight=()=>{e.setLightType("HeadLight")},e.setLightTypeToCameraLight=()=>{e.setLightType("CameraLight")},e.setLightTypeToSceneLight=()=>{e.setTransformMatrix(null),e.setLightType("SceneLight")},e.lightTypeIsHeadLight=()=>"HeadLight"===t.lightType,e.lightTypeIsSceneLight=()=>"SceneLight"===t.lightType,e.lightTypeIsCameraLight=()=>"CameraLight"===t.lightType},"vtkLight"),{vtkErrorMacro:eed}=jS,eec={background:[0,0,0],background2:[.2,.2,.2],gradientBackground:!1,viewport:[0,0,1,1],aspect:[1,1],pixelAspect:[1,1],props:[],actors2D:[]};function eeh(e,t,r={}){Object.assign(t,eec,r),jS.obj(e,t),jS.event(e,t,"event"),jS.setGet(e,t,["gradientBackground"]),jS.setGetArray(e,t,["viewport"],4),jS.setGetArray(e,t,["background","background2"],3),t.classHierarchy.push("vtkViewport"),e.getViewProps=()=>t.props,e.hasViewProp=e=>t.props.includes(e),e.addViewProp=r=>{r&&!e.hasViewProp(r)&&t.props.push(r)},e.removeViewProp=e=>{let r=t.props.filter(t=>t!==e);t.props.length!==r.length&&(t.props=r)},e.removeAllViewProps=()=>{t.props=[]},e.getViewPropsWithNestedProps=()=>{let e=[];t.actors2D=[];for(let r=0;r<t.props.length;r++){let n=t.props[r].getActors2D();n&&(!Array.isArray(n)||n.length>0)?t.actors2D=t.actors2D.concat(n):function e(t,r=[]){r.push(t);let n=t.getNestedProps();if(n&&n.length)for(let t=0;t<n.length;t++)e(n[t],r);return r}(t.props[r],e)}return t.actors2D.sort((e,t)=>e.getLayerNumber()-t.getLayerNumber()),e=e.concat(t.actors2D)},e.addActor2D=e.addViewProp,e.removeActor2D=t=>{e.removeViewProp(t)},e.getActors2D=()=>(t.actors2D=[],t.props.forEach(e=>{t.actors2D=t.actors2D.concat(e.getActors2D())}),t.actors2D),e.displayToView=()=>eed("call displayToView on your view instead"),e.viewToDisplay=()=>eed("callviewtodisplay on your view instead"),e.getSize=()=>eed("call getSize on your View instead"),e.normalizedDisplayToProjection=(t,r,n)=>{let a=e.normalizedDisplayToNormalizedViewport(t,r,n);return e.normalizedViewportToProjection(a[0],a[1],a[2])},e.normalizedDisplayToNormalizedViewport=(e,r,n)=>{let a=[t.viewport[2]-t.viewport[0],t.viewport[3]-t.viewport[1]];return[(e-t.viewport[0])/a[0],(r-t.viewport[1])/a[1],n]},e.normalizedViewportToProjection=(e,t,r)=>[2*e-1,2*t-1,2*r-1],e.projectionToNormalizedDisplay=(t,r,n)=>{let a=e.projectionToNormalizedViewport(t,r,n);return e.normalizedViewportToNormalizedDisplay(a[0],a[1],a[2])},e.normalizedViewportToNormalizedDisplay=(e,r,n)=>{let a=[t.viewport[2]-t.viewport[0],t.viewport[3]-t.viewport[1]];return[e*a[0]+t.viewport[0],r*a[1]+t.viewport[1],n]},e.projectionToNormalizedViewport=(e,t,r)=>[(e+1)*.5,(t+1)*.5,(r+1)*.5],e.PickPropFrom=()=>eed("vtkViewport::PickPropFrom - NOT IMPLEMENTED")}jS.newInstance(eeh,"vtkViewport");var{vtkDebugMacro:eep,vtkErrorMacro:eem,vtkWarningMacro:eef}=BL;function eeg(e){return()=>eem(`vtkRenderer::${e} - NOT IMPLEMENTED`)}var eey={pickedProp:null,activeCamera:null,allBounds:[],ambient:[1,1,1],allocatedRenderTime:100,timeFactor:1,automaticLightCreation:!0,twoSidedLighting:!0,lastRenderTimeInSeconds:-1,renderWindow:null,lights:[],actors:[],volumes:[],lightFollowCamera:!0,numberOfPropsRendered:0,propArray:null,pathArray:null,layer:0,preserveColorBuffer:!1,preserveDepthBuffer:!1,computeVisiblePropBounds:WR(),interactive:!0,nearClippingPlaneTolerance:0,clippingRangeExpansion:.05,erase:!0,draw:!0,useShadows:!1,useDepthPeeling:!1,occlusionRatio:0,maximumNumberOfPeels:4,selector:null,delegate:null,texturedBackground:!1,backgroundTexture:null,environmentTexture:null,environmentTextureDiffuseStrength:1,environmentTextureSpecularStrength:1,useEnvironmentTextureAsBackground:!1,pass:0},eev=jh(function(e,t,r={}){let n,a,i;for(Object.assign(t,eey,r),eeh(e,t,r),t.background||(t.background=[0,0,0,1]);t.background.length<3;)t.background.push(0);3===t.background.length&&t.background.push(1),je(e,t,["_renderWindow","allocatedRenderTime","timeFactor","lastRenderTimeInSeconds","numberOfPropsRendered","lastRenderingUsedDepthPeeling","selector"]),ja(e,t,["twoSidedLighting","lightFollowCamera","automaticLightCreation","erase","draw","nearClippingPlaneTolerance","clippingRangeExpansion","backingStore","interactive","layer","preserveColorBuffer","preserveDepthBuffer","useDepthPeeling","occlusionRatio","maximumNumberOfPeels","delegate","backgroundTexture","texturedBackground","environmentTexture","environmentTextureDiffuseStrength","environmentTextureSpecularStrength","useEnvironmentTextureAsBackground","useShadows","pass"]),ji(e,t,["actors","volumes","lights"]),js(e,t,["background"],4,1),jl(e,t,["renderWindow"]),t.classHierarchy.push("vtkRenderer"),n={type:"ComputeVisiblePropBoundsEvent",renderer:e},a={type:"ResetCameraClippingRangeEvent",renderer:e},i={type:"ResetCameraEvent",renderer:e},e.updateCamera=()=>(t.activeCamera||(eep("No cameras are on, creating one."),e.getActiveCameraAndResetIfCreated()),t.activeCamera.render(e),!0),e.updateLightsGeometryToFollowCamera=()=>{let r=e.getActiveCameraAndResetIfCreated();t.lights.forEach(e=>{e.lightTypeIsSceneLight()||(e.lightTypeIsHeadLight()?(e.setPositionFrom(r.getPositionByReference()),e.setFocalPointFrom(r.getFocalPointByReference()),e.modified(r.getMTime())):e.lightTypeIsCameraLight()?e.setTransformMatrix(r.getCameraLightTransformMatrix(Lv.mat4.create())):eem("light has unknown light type",e.get()))})},e.updateLightGeometry=()=>!t.lightFollowCamera||e.updateLightsGeometryToFollowCamera(),e.allocateTime=eeg("allocateTime"),e.updateGeometry=eeg("updateGeometry"),e.getVTKWindow=()=>t._renderWindow,e.setLayer=r=>{eep(e.getClassName(),e,"setting Layer to ",r),t.layer!==r&&(t.layer=r,e.modified()),e.setPreserveColorBuffer(!!r)},e.setActiveCamera=r=>t.activeCamera!==r&&(t.activeCamera=r,e.modified(),e.invokeEvent({type:"ActiveCameraEvent",camera:r}),!0),e.makeCamera=()=>{let t=zM();return e.invokeEvent({type:"CreateCameraEvent",camera:t}),t},e.getActiveCamera=()=>(t.activeCamera||(t.activeCamera=e.makeCamera()),t.activeCamera),e.getActiveCameraAndResetIfCreated=()=>(t.activeCamera||(e.getActiveCamera(),e.resetCamera()),t.activeCamera),e.getActors=()=>(t.actors=[],t.props.forEach(e=>{t.actors=t.actors.concat(e.getActors())}),t.actors),e.addActor=e.addViewProp,e.removeActor=r=>{t.actors=t.actors.filter(e=>e!==r),e.removeViewProp(r),e.modified()},e.removeAllActors=()=>{e.getActors().forEach(t=>{e.removeViewProp(t)}),t.actors=[],e.modified()},e.getVolumes=()=>(t.volumes=[],t.props.forEach(e=>{t.volumes=t.volumes.concat(e.getVolumes())}),t.volumes),e.addVolume=e.addViewProp,e.removeVolume=r=>{t.volumes=t.volumes.filter(e=>e!==r),e.removeViewProp(r),e.modified()},e.removeAllVolumes=()=>{e.getVolumes().forEach(t=>{e.removeViewProp(t)}),t.volumes=[],e.modified()},e.hasLight=e=>t.lights.includes(e),e.addLight=r=>{r&&!e.hasLight(r)&&(t.lights.push(r),e.modified())},e.removeLight=r=>{t.lights=t.lights.filter(e=>e!==r),e.modified()},e.removeAllLights=()=>{t.lights=[],e.modified()},e.setLightCollection=r=>{t.lights=r,e.modified()},e.makeLight=eeu,e.createLight=()=>{t.automaticLightCreation&&(t._createdLight&&(e.removeLight(t._createdLight),t._createdLight.delete(),t._createdLight=null),t._createdLight=e.makeLight(),e.addLight(t._createdLight),t._createdLight.setLightTypeToHeadLight(),t._createdLight.setPosition(e.getActiveCamera().getPosition()),t._createdLight.setFocalPoint(e.getActiveCamera().getFocalPoint()))},e.normalizedDisplayToWorld=(t,r,n,a)=>{let i=e.normalizedDisplayToProjection(t,r,n);return i=e.projectionToView(i[0],i[1],i[2],a),e.viewToWorld(i[0],i[1],i[2])},e.worldToNormalizedDisplay=(t,r,n,a)=>{let i=e.worldToView(t,r,n);return i=e.viewToProjection(i[0],i[1],i[2],a),e.projectionToNormalizedDisplay(i[0],i[1],i[2])},e.viewToWorld=(e,r,n)=>{if(null===t.activeCamera)return eem("ViewToWorld: no active camera, cannot compute view to world, returning 0,0,0"),[0,0,0];let a=t.activeCamera.getViewMatrix();Lv.mat4.invert(a,a),Lv.mat4.transpose(a,a);let i=new Float64Array([e,r,n]);return Lv.vec3.transformMat4(i,i,a),i},e.projectionToView=(e,r,n,a)=>{if(null===t.activeCamera)return eem("ProjectionToView: no active camera, cannot compute projection to view, returning 0,0,0"),[0,0,0];let i=t.activeCamera.getProjectionMatrix(a,-1,1);Lv.mat4.invert(i,i),Lv.mat4.transpose(i,i);let o=new Float64Array([e,r,n]);return Lv.vec3.transformMat4(o,o,i),o},e.worldToView=(e,r,n)=>{if(null===t.activeCamera)return eem("WorldToView: no active camera, cannot compute view to world, returning 0,0,0"),[0,0,0];let a=t.activeCamera.getViewMatrix();Lv.mat4.transpose(a,a);let i=new Float64Array([e,r,n]);return Lv.vec3.transformMat4(i,i,a),i},e.viewToProjection=(e,r,n,a)=>{if(null===t.activeCamera)return eem("ViewToProjection: no active camera, cannot compute view to projection, returning 0,0,0"),[0,0,0];let i=t.activeCamera.getProjectionMatrix(a,-1,1);Lv.mat4.transpose(i,i);let o=new Float64Array([e,r,n]);return Lv.vec3.transformMat4(o,o,i),o},e.computeVisiblePropBounds=()=>{t.allBounds[0]=UK["0"],t.allBounds[1]=UK["1"],t.allBounds[2]=UK["2"],t.allBounds[3]=UK["3"],t.allBounds[4]=UK["4"],t.allBounds[5]=UK["5"];let r=!0;e.invokeEvent(n);for(let e=0;e<t.props.length;++e){let n=t.props[e];if(n.getVisibility()&&n.getUseBounds()){let e=n.getBounds();e&&WE(e)&&(r=!1,e[0]<t.allBounds[0]&&(t.allBounds[0]=e[0]),e[1]>t.allBounds[1]&&(t.allBounds[1]=e[1]),e[2]<t.allBounds[2]&&(t.allBounds[2]=e[2]),e[3]>t.allBounds[3]&&(t.allBounds[3]=e[3]),e[4]<t.allBounds[4]&&(t.allBounds[4]=e[4]),e[5]>t.allBounds[5]&&(t.allBounds[5]=e[5]))}}return r&&(WS(t.allBounds),eep("Can't compute bounds, no 3D props are visible")),t.allBounds},e.resetCamera=(r=null)=>{let n=r||e.computeVisiblePropBounds(),a=[0,0,0];if(!WE(n))return eep("Cannot reset camera!"),!1;let o=null;if(!e.getActiveCamera())return eem("Trying to reset non-existent camera"),!1;o=t.activeCamera.getViewPlaneNormal(),t.activeCamera.setViewAngle(30),a[0]=(n[0]+n[1])/2,a[1]=(n[2]+n[3])/2,a[2]=(n[4]+n[5])/2;let s=n[1]-n[0],l=n[3]-n[2],u=n[5]-n[4];s*=s,l*=l,u*=u;let d=s+l+u;d=.5*Math.sqrt(d=0===d?1:d);let c=jN(t.activeCamera.getViewAngle()),h=d,p=d/Math.sin(.5*c),m=t.activeCamera.getViewUp();return Math.abs(jQ(m,o))>.999&&(eef("Resetting view-up since view plane normal is parallel"),t.activeCamera.setViewUp(-m[2],m[0],m[1])),t.activeCamera.setFocalPoint(a[0],a[1],a[2]),t.activeCamera.setPosition(a[0]+p*o[0],a[1]+p*o[1],a[2]+p*o[2]),e.resetCameraClippingRange(n),t.activeCamera.setParallelScale(h),t.activeCamera.setPhysicalScale(d),t.activeCamera.setPhysicalTranslation(-a[0],-a[1],-a[2]),e.invokeEvent(i),!0},e.resetCameraClippingRange=(r=null)=>{let n=r||e.computeVisiblePropBounds();if(!WE(n))return eep("Cannot reset camera clipping range!"),!1;if(e.getActiveCameraAndResetIfCreated(),!t.activeCamera)return eem("Trying to reset clipping range of non-existent camera"),!1;let i=t.activeCamera.computeClippingRange(n),o=0;return o=t.activeCamera.getParallelProjection()?.2*t.activeCamera.getParallelScale():.2*Math.tan(jN(t.activeCamera.getViewAngle())/2)*i[1],i[1]-i[0]<o&&(o=o-i[1]+i[0],i[1]+=o/2,i[0]-=o/2),i[0]<0&&(i[0]=0),i[0]=.99*i[0]-(i[1]-i[0])*t.clippingRangeExpansion,i[1]=1.01*i[1]+(i[1]-i[0])*t.clippingRangeExpansion,i[0]=i[0]>=i[1]?.01*i[1]:i[0],t.nearClippingPlaneTolerance||(t.nearClippingPlaneTolerance=.01),i[0]<t.nearClippingPlaneTolerance*i[1]&&(i[0]=t.nearClippingPlaneTolerance*i[1]),t.activeCamera.setClippingRange(i[0],i[1]),e.invokeEvent(a),!1},e.setRenderWindow=e=>{e!==t._renderWindow&&(t._vtkWindow=e,t._renderWindow=e)},e.visibleActorCount=()=>t.props.filter(e=>e.getVisibility()).length,e.visibleVolumeCount=e.visibleActorCount,e.getMTime=()=>{let e=t.mtime,r=t.activeCamera?t.activeCamera.getMTime():0;r>e&&(e=r);let n=t._createdLight?t._createdLight.getMTime():0;return n>e&&(e=n),e},e.getTransparent=()=>!!t.preserveColorBuffer,e.isActiveCameraCreated=()=>!!t.activeCamera},"vtkRenderer"),eeb={Device:{Unknown:0,LeftController:1,RightController:2},Input:{Unknown:0,Trigger:1,TrackPad:2,Grip:3,Thumbstick:4,A:5,B:6,ApplicationMenu:7},Axis:{Unknown:0,TouchpadX:1,TouchpadY:2,ThumbstickX:3,ThumbstickY:4},MouseButton:{LeftButton:1,MiddleButton:2,RightButton:3}},{Device:eew,Input:eex}=eeb,{vtkWarningMacro:eeC,vtkErrorMacro:eek,normalizeWheel:eeM,vtkOnceErrorMacro:eeS}=jS,eeE={ctrlKey:!1,altKey:!1,shiftKey:!1},eeT={"xr-standard":[eex.Trigger,eex.Grip,eex.TrackPad,eex.Thumbstick,eex.A,eex.B]},eeI=["StartAnimation","Animation","EndAnimation","PointerEnter","PointerLeave","MouseEnter","MouseLeave","StartMouseMove","MouseMove","EndMouseMove","LeftButtonPress","LeftButtonRelease","MiddleButtonPress","MiddleButtonRelease","RightButtonPress","RightButtonRelease","KeyPress","KeyDown","KeyUp","StartMouseWheel","MouseWheel","EndMouseWheel","StartPinch","Pinch","EndPinch","StartPan","Pan","EndPan","StartRotate","Rotate","EndRotate","Button3D","Move3D","StartPointerLock","EndPointerLock","StartInteraction","Interaction","EndInteraction","AnimationFrameRateUpdate"];function eeP(e){e.cancelable&&e.preventDefault()}function ee_(e){let t=Object.create(null);return e.forEach(({pointerId:e,position:r})=>{t[e]=r}),t}var eeD={renderWindow:null,interactorStyle:null,picker:null,pickingManager:null,initialized:!1,enabled:!1,enableRender:!0,currentRenderer:null,lightFollowCamera:!0,desiredUpdateRate:30,stillUpdateRate:2,container:null,recognizeGestures:!0,currentGesture:"Start",animationRequest:null,lastFrameTime:.1,recentAnimationFrameRate:10,wheelTimeoutID:0,moveTimeoutID:0,lastGamepadValues:{},preventDefaultOnPointerDown:!1,preventDefaultOnPointerUp:!1,mouseScrollDebounceByPass:!1};function eeO(e,t,r={}){Object.assign(t,eeD,r),jS.obj(e,t),t._animationExtendedEnd=0,jS.event(e,t,"RenderEvent"),eeI.forEach(r=>jS.event(e,t,r)),jS.get(e,t,["initialized","interactorStyle","lastFrameTime","recentAnimationFrameRate","_view"]),jS.setGet(e,t,["container","lightFollowCamera","enabled","enableRender","recognizeGestures","desiredUpdateRate","stillUpdateRate","picker","preventDefaultOnPointerDown","preventDefaultOnPointerUp","mouseScrollDebounceByPass"]),jS.moveToProtected(e,t,["view"]),function(e,t){t.classHierarchy.push("vtkRenderWindowInteractor");let r={...e},n=new Set,a=new Map,i=1,o=0;function s(r,n){t._forcedRenderer||(t.currentRenderer=e.findPokedRenderer(r,n))}e.start=()=>{(t.initialized||(e.initialize(),t.initialized))&&e.startEventLoop()},e.setRenderWindow=e=>{eek("you want to call setView(view) instead of setRenderWindow on a vtk.js interactor")},e.setInteractorStyle=r=>{t.interactorStyle!==r&&(null!=t.interactorStyle&&t.interactorStyle.setInteractor(null),t.interactorStyle=r,null!=t.interactorStyle&&t.interactorStyle.getInteractor()!==e&&t.interactorStyle.setInteractor(e))},e.initialize=()=>{t.initialized=!0,e.enable(),e.render()},e.enable=()=>e.setEnabled(!0),e.disable=()=>e.setEnabled(!1),e.startEventLoop=()=>eeC("empty event loop"),e.getCurrentRenderer=()=>(t.currentRenderer||s(0,0),t.currentRenderer);let l=t._getScreenEventPositionFor||function(e){let r=t._view.getCanvas(),n=r.getBoundingClientRect(),i=r.width/n.width,o=r.height/n.height,l={x:i*(e.clientX-n.left),y:o*(n.height-e.clientY+n.top),z:0,movementX:i*e.movementX,movementY:o*e.movementY};return(a.size<=1||!t.currentRenderer)&&s(l.x,l.y),l};function u(e){return{controlKey:e.ctrlKey,altKey:e.altKey,shiftKey:e.shiftKey}}function d(e){let t=u(e);return{key:e.key,keyCode:e.charCode,...t}}function c(e){return e.pointerType||""}let h=()=>{if(null===t.container)return;let{container:r}=t;r.addEventListener("contextmenu",eeP),r.addEventListener("wheel",e.handleWheel),r.addEventListener("DOMMouseScroll",e.handleWheel),r.addEventListener("pointerenter",e.handlePointerEnter),r.addEventListener("pointerleave",e.handlePointerLeave),r.addEventListener("pointermove",e.handlePointerMove,{passive:!1}),r.addEventListener("pointerdown",e.handlePointerDown,{passive:!1}),r.addEventListener("pointerup",e.handlePointerUp),r.addEventListener("pointercancel",e.handlePointerCancel),r.addEventListener("keypress",e.handleKeyPress),r.addEventListener("keydown",e.handleKeyDown),document.addEventListener("keyup",e.handleKeyUp),document.addEventListener("pointerlockchange",e.handlePointerLockChange),r.tabIndex=0,r.style.touchAction="none",r.style.userSelect="none",r.style.webkitTapHighlightColor="rgba(0,0,0,0)"};e.bindEvents=e=>{null!==e&&r.setContainer(e)&&h()};let p=()=>{clearTimeout(t.moveTimeoutID),clearTimeout(t.wheelTimeoutID),t.moveTimeoutID=0,t.wheelTimeoutID=0,i=1;let{container:r}=t;r&&(r.removeEventListener("contextmenu",eeP),r.removeEventListener("wheel",e.handleWheel),r.removeEventListener("DOMMouseScroll",e.handleWheel),r.removeEventListener("pointerenter",e.handlePointerEnter),r.removeEventListener("pointerleave",e.handlePointerLeave),r.removeEventListener("pointermove",e.handlePointerMove,{passive:!1}),r.removeEventListener("pointerdown",e.handlePointerDown,{passive:!1}),r.removeEventListener("pointerup",e.handlePointerUp),r.removeEventListener("pointercancel",e.handlePointerCancel),r.removeEventListener("keypress",e.handleKeyPress),r.removeEventListener("keydown",e.handleKeyDown)),document.removeEventListener("keyup",e.handleKeyUp),document.removeEventListener("pointerlockchange",e.handlePointerLockChange),a.clear(),o=0};function m(t,r,n){(r&~n&1)!=0&&e.leftButtonReleaseEvent(t),(r&~n&4)!=0&&e.middleButtonReleaseEvent(t),(r&~n&2)!=0&&e.rightButtonReleaseEvent(t),(~r&n&1)!=0&&e.leftButtonPressEvent(t),(~r&n&4)!=0&&e.middleButtonPressEvent(t),(~r&n&2)!=0&&e.rightButtonPressEvent(t)}function f(){t._view&&t.enabled&&t.enableRender&&(t.inRender=!0,t._view.traverseAllPasses(),t.inRender=!1),e.invokeRenderEvent()}e.unbindEvents=()=>{p(),r.setContainer(null)},e.handleKeyPress=t=>{let r=d(t);e.keyPressEvent(r)},e.handleKeyDown=t=>{let r=d(t);e.keyDownEvent(r)},e.handleKeyUp=t=>{let r=d(t);e.keyUpEvent(r)},e.handlePointerEnter=t=>{let r={...u(t),position:l(t),deviceType:c(t)};e.pointerEnterEvent(r),"mouse"===r.deviceType&&e.mouseEnterEvent(r)},e.handlePointerLeave=t=>{let r={...u(t),position:l(t),deviceType:c(t)};e.pointerLeaveEvent(r),"mouse"===r.deviceType&&e.mouseLeaveEvent(r)},e.handlePointerDown=r=>{if(!(r.button>2||e.isPointerLocked()))switch(t.preventDefaultOnPointerDown&&eeP(r),r.target.hasPointerCapture(r.pointerId)&&r.target.releasePointerCapture(r.pointerId),t.container.setPointerCapture(r.pointerId),a.has(r.pointerId)&&eeC("[RenderWindowInteractor] duplicate pointerId detected"),a.set(r.pointerId,{pointerId:r.pointerId,position:l(r)}),r.pointerType){case"pen":case"touch":e.handleTouchStart(r);break;default:e.handleMouseDown(r),o=r.buttons}},e.handlePointerUp=r=>{if(a.has(r.pointerId))switch(t.preventDefaultOnPointerUp&&eeP(r),a.delete(r.pointerId),t.container.releasePointerCapture(r.pointerId),r.pointerType){case"pen":case"touch":e.handleTouchEnd(r);break;default:{let t=[1,4,2][r.button]??0;m({...u(r),position:l(r),deviceType:c(r)},o&~t,r.buttons&~t),e.handleMouseUp(r),o=r.buttons}}},e.handlePointerCancel=t=>{if(a.has(t.pointerId))switch(a.delete(t.pointerId),t.pointerType){case"pen":case"touch":e.handleTouchEnd(t);break;default:m({...u(t),position:l(t),deviceType:c(t)},o,0),o=0}},e.handlePointerMove=t=>{switch(a.has(t.pointerId)&&(a.get(t.pointerId).position=l(t)),t.pointerType){case"pen":case"touch":e.handleTouchMove(t);break;default:{let r=t.buttons;r!==o&&(m({...u(t),position:l(t),deviceType:c(t)},o,r),o=r),e.handleMouseMove(t)}}},e.handleMouseDown=t=>{let r={...u(t),position:l(t),deviceType:c(t)};switch(t.button){case 0:e.leftButtonPressEvent(r);break;case 1:e.middleButtonPressEvent(r);break;case 2:e.rightButtonPressEvent(r);break;default:eek(`Unknown mouse button pressed: ${t.button}`)}},e.requestPointerLock=()=>{if(t.container)return t.container.requestPointerLock()},e.exitPointerLock=()=>document.exitPointerLock?.(),e.isPointerLocked=()=>!!t.container&&document.pointerLockElement===t.container,e.handlePointerLockChange=()=>{e.isPointerLocked()?e.startPointerLockEvent():e.endPointerLockEvent()},e.requestAnimation=r=>{void 0===r?eek("undefined requester, can not start animating"):n.has(r)?eeC("requester is already registered for animating"):(n.add(r),t.animationRequest||1!==n.size||t.xrAnimation||(t._animationStartTime=Date.now(),t._animationFrameCount=0,t.animationRequest=requestAnimationFrame(e.handleAnimation),e.startAnimationEvent()))},e.extendAnimation=r=>{let a=Date.now()+r;t._animationExtendedEnd=Math.max(t._animationExtendedEnd,a),t.animationRequest||0!==n.size||t.xrAnimation||(t._animationStartTime=Date.now(),t._animationFrameCount=0,t.animationRequest=requestAnimationFrame(e.handleAnimation),e.startAnimationEvent())},e.isAnimating=()=>t.xrAnimation||null!==t.animationRequest,e.cancelAnimation=(r,a=!1)=>{if(!n.has(r)){a||eeC(`${r&&r.getClassName?r.getClassName():r} did not request an animation`);return}n.delete(r),t.animationRequest&&0===n.size&&Date.now()>t._animationExtendedEnd&&(cancelAnimationFrame(t.animationRequest),t.animationRequest=null,e.endAnimationEvent(),e.render())},e.switchToXRAnimation=()=>{t.animationRequest&&(cancelAnimationFrame(t.animationRequest),t.animationRequest=null),t.xrAnimation=!0},e.returnFromXRAnimation=()=>{t.xrAnimation=!1,0!==n.size&&(t.recentAnimationFrameRate=10,t.animationRequest=requestAnimationFrame(e.handleAnimation))},e.updateXRGamepads=(r,n,a)=>{r.inputSources.forEach(r=>{let i=null==r.gripSpace?null:n.getPose(r.gripSpace,a),o=null==r.gripSpace?null:n.getPose(r.targetRaySpace,a),s=r.gamepad,l=r.handedness;if(s){s.index in t.lastGamepadValues||(t.lastGamepadValues[s.index]={left:{buttons:{}},right:{buttons:{}},none:{buttons:{}}});for(let n=0;n<s.buttons.length;++n)n in t.lastGamepadValues[s.index][l].buttons||(t.lastGamepadValues[s.index][l].buttons[n]=!1),t.lastGamepadValues[s.index][l].buttons[n]!==s.buttons[n].pressed&&null!=i&&(e.button3DEvent({gamepad:s,position:i.transform.position,orientation:i.transform.orientation,targetPosition:o.transform.position,targetOrientation:o.transform.orientation,pressed:s.buttons[n].pressed,device:"left"===r.handedness?eew.LeftController:eew.RightController,input:eeT[s.mapping]&&eeT[s.mapping][n]?eeT[s.mapping][n]:eex.Trigger}),t.lastGamepadValues[s.index][l].buttons[n]=s.buttons[n].pressed),t.lastGamepadValues[s.index][l].buttons[n]&&null!=i&&e.move3DEvent({gamepad:s,position:i.transform.position,orientation:i.transform.orientation,targetPosition:o.transform.position,targetOrientation:o.transform.orientation,device:"left"===r.handedness?eew.LeftController:eew.RightController})}})},e.handleMouseMove=r=>{let n={...u(r),position:l(r),deviceType:c(r)};0===t.moveTimeoutID?e.startMouseMoveEvent(n):(e.mouseMoveEvent(n),clearTimeout(t.moveTimeoutID)),t.moveTimeoutID=setTimeout(()=>{e.endMouseMoveEvent(),t.moveTimeoutID=0},200)},e.handleAnimation=()=>{let r=Date.now();t._animationFrameCount++,r-t._animationStartTime>1e3&&t._animationFrameCount>1&&(t.recentAnimationFrameRate=1e3*(t._animationFrameCount-1)/(r-t._animationStartTime),t.lastFrameTime=1/t.recentAnimationFrameRate,e.animationFrameRateUpdateEvent(),t._animationStartTime=r,t._animationFrameCount=1),e.animationEvent(),f(),n.size>0||Date.now()<t._animationExtendedEnd?t.animationRequest=requestAnimationFrame(e.handleAnimation):(cancelAnimationFrame(t.animationRequest),t.animationRequest=null,e.endAnimationEvent(),e.render())},e.handleWheel=r=>{eeP(r);let n={...eeM(r),...u(r),position:l(r),deviceType:c(r)};0===t.wheelTimeoutID&&(i=Math.abs(n.spinY)>=.3?Math.abs(n.spinY):1),n.spinY/=i,0===t.wheelTimeoutID?(e.startMouseWheelEvent(n),e.mouseWheelEvent(n)):(e.mouseWheelEvent(n),clearTimeout(t.wheelTimeoutID)),t.mouseScrollDebounceByPass?(e.extendAnimation(600),e.endMouseWheelEvent(),t.wheelTimeoutID=0):t.wheelTimeoutID=setTimeout(()=>{e.extendAnimation(600),e.endMouseWheelEvent(),t.wheelTimeoutID=0},200)},e.handleMouseUp=t=>{let r={...u(t),position:l(t),deviceType:c(t)};switch(t.button){case 0:e.leftButtonReleaseEvent(r);break;case 1:e.middleButtonReleaseEvent(r);break;case 2:e.rightButtonReleaseEvent(r);break;default:eek(`Unknown mouse button released: ${t.button}`)}},e.handleTouchStart=r=>{let n=[...a.values()];if(t.recognizeGestures&&n.length>1){let t=ee_(a);if(2===n.length){let t={...u(eeE),position:n[0].position,deviceType:c(r)};e.leftButtonReleaseEvent(t)}e.recognizeGesture("TouchStart",t)}else if(1===n.length){let t={...u(eeE),position:l(r),deviceType:c(r)};e.leftButtonPressEvent(t)}},e.handleTouchMove=r=>{let n=[...a.values()];if(t.recognizeGestures&&n.length>1){let t=ee_(a);e.recognizeGesture("TouchMove",t)}else if(1===n.length){let t={...u(eeE),position:n[0].position,deviceType:c(r)};e.mouseMoveEvent(t)}},e.handleTouchEnd=r=>{let n=[...a.values()];if(t.recognizeGestures)if(0===n.length){let t={...u(eeE),position:l(r),deviceType:c(r)};e.leftButtonReleaseEvent(t)}else if(1===n.length){let t=ee_(a);e.recognizeGesture("TouchEnd",t);let i={...u(eeE),position:n[0].position,deviceType:c(r)};e.leftButtonPressEvent(i)}else{let t=ee_(a);e.recognizeGesture("TouchMove",t)}else if(1===n.length){let t={...u(eeE),position:n[0].position,deviceType:c(r)};e.leftButtonReleaseEvent(t)}},e.setView=r=>{t._view!==r&&(t._view=r,t._view.getRenderable().setInteractor(e),e.modified())},e.getFirstRenderer=()=>t._view?.getRenderable()?.getRenderersByReference()?.[0],e.findPokedRenderer=(e=0,r=0)=>{if(!t._view)return null;let n=t._view?.getRenderable()?.getRenderers();if(!n||0===n.length)return null;n.sort((e,t)=>e.getLayer()-t.getLayer());let a=null,i=null,o=null,s=n.length;for(;s--;){let l=n[s];if(t._view.isInViewport(e,r,l)&&l.getInteractive()){o=l;break}null===a&&l.getInteractive()&&(a=l),null===i&&t._view.isInViewport(e,r,l)&&(i=l)}return null===o&&(o=a),null===o&&(o=i),null==o&&(o=n[0]),o},e.render=()=>{e.isAnimating()||t.inRender||f()},eeI.forEach(r=>{let n=r.charAt(0).toLowerCase()+r.slice(1);e[`${n}Event`]=n=>{if(!t.enabled)return;if(!e.getCurrentRenderer())return void eeS(`
878
+ }`,"")),t.tris.getShaderSourceTime().modified(),t.tris.getVAO().bind(),t.tris.getVAO().addAttributeArray(t.tris.getProgram(),t.tris.getCABO(),"vertexMC",t.tris.getCABO().getVertexOffset(),t.tris.getCABO().getStride(),t.context.FLOAT,3,t.context.FALSE)||Q0("Error setting vertexMC in shader VAO."));let e=t.renderable.getTextures();e.length||Q0("vtkSkybox requires a texture map"),t.openGLTexture.getRenderable()!==e[0]&&(t.openGLTexture.releaseGraphicsResources(t._openGLRenderWindow),t.openGLTexture.setRenderable(e[0]))}});$r.vtkSkybox=Q2;var{vtkErrorMacro:Q5}=BL,Q3={},Q4=jh(function(e,t,r={}){let n;Object.assign(t,Q3,r),QH(e,t,r),t.classHierarchy.push("vtkOpenGLSphereMapper"),n={...e},e.getShaderTemplate=(e,t,r)=>{e.Vertex="//VTK::System::Dec\n\n/*=========================================================================\n\n Program: Visualization Toolkit\n Module: vtkSphereMapperVS.glsl\n\n Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen\n All rights reserved.\n See Copyright.txt or http://www.kitware.com/Copyright.htm for details.\n\n This software is distributed WITHOUT ANY WARRANTY; without even\n the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR\n PURPOSE. See the above copyright notice for more information.\n\n=========================================================================*/\n// this shader implements imposters in OpenGL for Spheres\n\nattribute vec4 vertexMC;\nattribute vec2 offsetMC;\n\n// optional normal declaration\n//VTK::Normal::Dec\n\n//VTK::Picking::Dec\n\n// Texture coordinates\n//VTK::TCoord::Dec\n\nuniform mat3 normalMatrix; // transform model coordinate directions to view coordinates\n\n// material property values\n//VTK::Color::Dec\n\n// clipping plane vars\n//VTK::Clip::Dec\n\n// camera and actor matrix values\n//VTK::Camera::Dec\n\nvarying vec4 vertexVCVSOutput;\nvarying float radiusVCVSOutput;\nvarying vec3 centerVCVSOutput;\n\nuniform int cameraParallel;\nuniform float scaleFactor;\n\nvoid main()\n{\n //VTK::Picking::Impl\n\n //VTK::Color::Impl\n\n //VTK::Normal::Impl\n\n //VTK::TCoord::Impl\n\n //VTK::Clip::Impl\n\n // compute the projected vertex position\n vec2 scaledOffsetMC = scaleFactor * offsetMC;\n vertexVCVSOutput = MCVCMatrix * vertexMC;\n centerVCVSOutput = vertexVCVSOutput.xyz;\n radiusVCVSOutput = length(scaledOffsetMC)*0.5;\n\n // make the triangle face the camera\n if (cameraParallel == 0)\n {\n vec3 dir = normalize(-vertexVCVSOutput.xyz);\n vec3 base2 = normalize(cross(dir,vec3(1.0,0.0,0.0)));\n vec3 base1 = cross(base2,dir);\n vertexVCVSOutput.xyz = vertexVCVSOutput.xyz + scaledOffsetMC.x*base1 + scaledOffsetMC.y*base2;\n }\n else\n {\n // add in the offset\n vertexVCVSOutput.xy = vertexVCVSOutput.xy + scaledOffsetMC;\n }\n\n gl_Position = VCPCMatrix * vertexVCVSOutput;\n}\n",e.Fragment=Kl,e.Geometry=""},e.replaceShaderValues=(e,r,a)=>{let i=e.Vertex,o=e.Fragment;i=$W.substitute(i,"//VTK::Camera::Dec",["uniform mat4 VCPCMatrix;\n","uniform mat4 MCVCMatrix;"]).result,o=$W.substitute(o,"//VTK::PositionVC::Dec",["varying vec4 vertexVCVSOutput;"]).result,o=$W.substitute(o,"//VTK::PositionVC::Impl",["vec4 vertexVC = vertexVCVSOutput;\n"]).result,o=$W.substitute(o,"//VTK::Normal::Dec",["uniform float invertedDepth;\n","uniform int cameraParallel;\n","varying float radiusVCVSOutput;\n","varying vec3 centerVCVSOutput;\n","uniform mat4 VCPCMatrix;\n"]).result;let s="";t.context.getExtension("EXT_frag_depth")&&(s="gl_FragDepthEXT = (pos.z / pos.w + 1.0) / 2.0;\n"),t._openGLRenderWindow.getWebgl2()&&(s="gl_FragDepth = (pos.z / pos.w + 1.0) / 2.0;\n"),o=$W.substitute(o,"//VTK::Depth::Impl",[" vec3 EyePos;\n"," vec3 EyeDir;\n"," if (cameraParallel != 0) {\n"," EyePos = vec3(vertexVC.x, vertexVC.y, vertexVC.z + 3.0*radiusVCVSOutput);\n"," EyeDir = vec3(0.0,0.0,-1.0); }\n"," else {\n"," EyeDir = vertexVC.xyz;\n"," EyePos = vec3(0.0,0.0,0.0);\n"," float lengthED = length(EyeDir);\n"," EyeDir = normalize(EyeDir);\n"," if (lengthED > radiusVCVSOutput*3.0) {\n"," EyePos = vertexVC.xyz - EyeDir*3.0*radiusVCVSOutput; }\n"," }\n"," EyePos = EyePos - centerVCVSOutput;\n"," EyePos = EyePos/radiusVCVSOutput;\n"," float b = 2.0*dot(EyePos,EyeDir);\n"," float c = dot(EyePos,EyePos) - 1.0;\n"," float d = b*b - 4.0*c;\n"," vec3 normalVCVSOutput = vec3(0.0,0.0,1.0);\n"," if (d < 0.0) { discard; }\n"," else {\n"," float t = (-b - invertedDepth*sqrt(d))*0.5;\n"," normalVCVSOutput = invertedDepth*normalize(EyePos + t*EyeDir);\n"," vertexVC.xyz = normalVCVSOutput*radiusVCVSOutput + centerVCVSOutput;\n"," }\n"," vec4 pos = VCPCMatrix * vertexVC;\n",s]).result,o=$W.substitute(o,"//VTK::Normal::Impl","").result,t.haveSeenDepthRequest&&(o=$W.substitute(o,"//VTK::ZBuffer::Impl",["if (depthRequest == 1) {","float computedZ = (pos.z / pos.w + 1.0) / 2.0;","float iz = floor(computedZ * 65535.0 + 0.1);","float rf = floor(iz/256.0)/255.0;","float gf = mod(iz,256.0)/255.0;","gl_FragData[0] = vec4(rf, gf, 0.0, 1.0); }"]).result),e.Vertex=i,e.Fragment=o,n.replaceShaderValues(e,r,a)},e.setMapperShaderParameters=(e,r,a)=>{if(e.getCABO().getElementCount()&&(t.VBOBuildTime>e.getAttributeUpdateTime().getMTime()||e.getShaderSourceTime().getMTime()>e.getAttributeUpdateTime().getMTime())&&e.getProgram().isAttributeUsed("offsetMC")&&!e.getVAO().addAttributeArray(e.getProgram(),e.getCABO(),"offsetMC",12,e.getCABO().getStride(),t.context.FLOAT,2,!1)&&Q5("Error setting 'offsetMC' in shader VAO."),e.getProgram().isUniformUsed("invertedDepth")&&e.getProgram().setUniformf("invertedDepth",t.invert?-1:1),e.getProgram().isUniformUsed("scaleFactor")){let r=t.currentInput.getPointData();null!=t.renderable.getScaleArray()&&r.hasArray(t.renderable.getScaleArray())?e.getProgram().setUniformf("scaleFactor",t.renderable.getScaleFactor()):e.getProgram().setUniformf("scaleFactor",1)}n.setMapperShaderParameters(e,r,a)},e.setCameraShaderParameters=(e,r,n)=>{let a=e.getProgram(),i=r.getActiveCamera(),o=t.openGLCamera.getKeyMatrices(r);a.isUniformUsed("VCPCMatrix")&&a.setUniformMatrix("VCPCMatrix",o.vcpc);let s=new Float64Array(16);if(a.isUniformUsed("MCVCMatrix"))if(n.getIsIdentity())Lv.mat4.copy(s,o.wcvc),e.getCABO().getCoordShiftAndScaleEnabled()&&Lv.mat4.multiply(s,s,e.getCABO().getInverseShiftAndScaleMatrix()),a.setUniformMatrix("MCVCMatrix",s);else{let r=t.openGLActor.getKeyMatrices();Lv.mat4.multiply(s,o.wcvc,r.mcwc),e.getCABO().getCoordShiftAndScaleEnabled()&&Lv.mat4.multiply(s,s,e.getCABO().getInverseShiftAndScaleMatrix()),a.setUniformMatrix("MCVCMatrix",s)}a.isUniformUsed("cameraParallel")&&e.getProgram().setUniformi("cameraParallel",i.getParallelProjection())},e.getOpenGLMode=(e,r)=>t.context.TRIANGLES,e.buildBufferObjects=(e,r)=>{let n=t.currentInput;if(null===n)return;t.renderable.mapScalars(n,1);let a=t.renderable.getColorMapColors(),i=t.primitives[t.primTypes.Tris].getCABO(),o=n.getPointData(),s=n.getPoints(),l=s.getNumberOfPoints(),u=s.getData(),d=null;null!=t.renderable.getScaleArray()&&o.hasArray(t.renderable.getScaleArray())&&(d=o.getArray(t.renderable.getScaleArray()).getData());let c=null,h=0,p=null;a?(h=a.getNumberOfComponents(),i.setColorOffset(0),i.setColorBOStride(4),c=a.getData(),p=new Uint8Array(3*l*4),i.getColorBO()||i.setColorBO($P.newInstance()),i.getColorBO().setOpenGLRenderWindow(t._openGLRenderWindow)):i.getColorBO()&&i.setColorBO(null),i.setColorComponents(h);let m=new Float32Array(5*l*3);i.setStride(20);let f=Math.cos(jN(30)),g=0,y=0,{useShiftAndScale:v,coordShift:b,coordScale:w}=$_(s);i.setCoordShiftAndScale(v?b:null,v?w:null);let x=0,C=0;for(let e=0;e<l;++e){let r=t.renderable.getRadius();d&&(r=d[e]),g=3*e;let n=(u[g++]-b[0])*w[0],a=(u[g++]-b[1])*w[1],i=(u[g++]-b[2])*w[2];m[x++]=n,m[x++]=a,m[x++]=i,m[x++]=-2*r*f,m[x++]=-r,c&&(y=e*h,p[C++]=c[y],p[C++]=c[y+1],p[C++]=c[y+2],p[C++]=c[y+3]),m[x++]=n,m[x++]=a,m[x++]=i,m[x++]=2*r*f,m[x++]=-r,c&&(p[C++]=c[y],p[C++]=c[y+1],p[C++]=c[y+2],p[C++]=c[y+3]),m[x++]=n,m[x++]=a,m[x++]=i,m[x++]=0,m[x++]=2*r,c&&(p[C++]=c[y],p[C++]=c[y+1],p[C++]=c[y+2],p[C++]=c[y+3])}i.setElementCount(x/5),i.upload(m,$C.ARRAY_BUFFER),a&&i.getColorBO().upload(p,$C.ARRAY_BUFFER),t.VBOBuildTime.modified()}},"vtkOpenGLSphereMapper");$r.vtkSphereMapper=Q4;var{vtkErrorMacro:Q8}=BL,Q6={},Q9=jh(function(e,t,r={}){let n;Object.assign(t,Q6,r),QH(e,t,r),t.classHierarchy.push("vtkOpenGLStickMapper"),n={...e},e.getShaderTemplate=(e,t,r)=>{e.Vertex="//VTK::System::Dec\n\n/*=========================================================================\n\n Program: Visualization Toolkit\n Module: vtkStickMapperVS.glsl\n\n Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen\n All rights reserved.\n See Copyright.txt or http://www.kitware.com/Copyright.htm for details.\n\n This software is distributed WITHOUT ANY WARRANTY; without even\n the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR\n PURPOSE. See the above copyright notice for more information.\n\n=========================================================================*/\n// this shader implements imposters in OpenGL for Sticks\n\nattribute vec4 vertexMC;\nattribute vec3 orientMC;\nattribute vec4 offsetMC;\nattribute float radiusMC;\n\n// optional normal declaration\n//VTK::Normal::Dec\n\n//VTK::Picking::Dec\n\n// Texture coordinates\n//VTK::TCoord::Dec\n\nuniform mat3 normalMatrix; // transform model coordinate directions to view coordinates\n\n// material property values\n//VTK::Color::Dec\n\n// clipping plane vars\n//VTK::Clip::Dec\n\n// camera and actor matrix values\n//VTK::Camera::Dec\n\nvarying vec4 vertexVCVSOutput;\nvarying float radiusVCVSOutput;\nvarying float lengthVCVSOutput;\nvarying vec3 centerVCVSOutput;\nvarying vec3 orientVCVSOutput;\n\nuniform int cameraParallel;\n\nvoid main()\n{\n //VTK::Picking::Impl\n\n //VTK::Color::Impl\n\n //VTK::Normal::Impl\n\n //VTK::TCoord::Impl\n\n //VTK::Clip::Impl\n\n vertexVCVSOutput = MCVCMatrix * vertexMC;\n centerVCVSOutput = vertexVCVSOutput.xyz;\n radiusVCVSOutput = radiusMC;\n lengthVCVSOutput = length(orientMC);\n orientVCVSOutput = normalMatrix * normalize(orientMC);\n\n // make sure it is pointing out of the screen\n if (orientVCVSOutput.z < 0.0)\n {\n orientVCVSOutput = -orientVCVSOutput;\n }\n\n // make the basis\n vec3 xbase;\n vec3 ybase;\n vec3 dir = vec3(0.0,0.0,1.0);\n if (cameraParallel == 0)\n {\n dir = normalize(-vertexVCVSOutput.xyz);\n }\n if (abs(dot(dir,orientVCVSOutput)) == 1.0)\n {\n xbase = normalize(cross(vec3(0.0,1.0,0.0),orientVCVSOutput));\n ybase = cross(xbase,orientVCVSOutput);\n }\n else\n {\n xbase = normalize(cross(orientVCVSOutput,dir));\n ybase = cross(orientVCVSOutput,xbase);\n }\n\n vec3 offsets = offsetMC.xyz*2.0-1.0;\n vertexVCVSOutput.xyz = vertexVCVSOutput.xyz +\n radiusVCVSOutput*offsets.x*xbase +\n radiusVCVSOutput*offsets.y*ybase +\n 0.5*lengthVCVSOutput*offsets.z*orientVCVSOutput;\n\n gl_Position = VCPCMatrix * vertexVCVSOutput;\n}\n",e.Fragment=Kl,e.Geometry=""},e.replaceShaderValues=(e,r,a)=>{let i=e.Vertex,o=e.Fragment;i=$W.substitute(i,"//VTK::Camera::Dec",["uniform mat4 VCPCMatrix;\n","uniform mat4 MCVCMatrix;"]).result,o=$W.substitute(o,"//VTK::PositionVC::Dec","varying vec4 vertexVCVSOutput;").result,o=$W.substitute(o,"//VTK::PositionVC::Impl"," vec4 vertexVC = vertexVCVSOutput;\n").result,o=$W.substitute(o,"//VTK::Normal::Dec",["uniform int cameraParallel;\n","varying float radiusVCVSOutput;\n","varying vec3 orientVCVSOutput;\n","varying float lengthVCVSOutput;\n","varying vec3 centerVCVSOutput;\n","uniform mat4 VCPCMatrix;\n"]).result;let s="";t.context.getExtension("EXT_frag_depth")&&(s=" gl_FragDepthEXT = (pos.z / pos.w + 1.0) / 2.0;\n"),t._openGLRenderWindow.getWebgl2()&&(s="gl_FragDepth = (pos.z / pos.w + 1.0) / 2.0;\n"),o=$W.substitute(o,"//VTK::Depth::Impl",[" vec3 EyePos;\n"," vec3 EyeDir;\n"," if (cameraParallel != 0) {\n"," EyePos = vec3(vertexVC.x, vertexVC.y, vertexVC.z + 3.0*radiusVCVSOutput);\n"," EyeDir = vec3(0.0,0.0,-1.0); }\n"," else {\n"," EyeDir = vertexVC.xyz;\n"," EyePos = vec3(0.0,0.0,0.0);\n"," float lengthED = length(EyeDir);\n"," EyeDir = normalize(EyeDir);\n"," if (lengthED > radiusVCVSOutput*3.0) {\n"," EyePos = vertexVC.xyz - EyeDir*3.0*radiusVCVSOutput; }\n"," }\n"," EyePos = EyePos - centerVCVSOutput;\n"," vec3 base1;\n"," if (abs(orientVCVSOutput.z) < 0.99) {\n"," base1 = normalize(cross(orientVCVSOutput,vec3(0.0,0.0,1.0))); }\n"," else {\n"," base1 = normalize(cross(orientVCVSOutput,vec3(0.0,1.0,0.0))); }\n"," vec3 base2 = cross(orientVCVSOutput,base1);\n"," EyePos = vec3(dot(EyePos,base1),dot(EyePos,base2),dot(EyePos,orientVCVSOutput));\n"," EyeDir = vec3(dot(EyeDir,base1),dot(EyeDir,base2),dot(EyeDir,orientVCVSOutput));\n"," EyePos = EyePos/radiusVCVSOutput;\n"," float a = EyeDir.x*EyeDir.x + EyeDir.y*EyeDir.y;\n"," float b = 2.0*(EyePos.x*EyeDir.x + EyePos.y*EyeDir.y);\n"," float c = EyePos.x*EyePos.x + EyePos.y*EyePos.y - 1.0;\n"," float d = b*b - 4.0*a*c;\n"," vec3 normalVCVSOutput = vec3(0.0,0.0,1.0);\n"," if (d < 0.0) { discard; }\n"," else {\n"," float t = (-b - sqrt(d))/(2.0*a);\n"," float tz = EyePos.z + t*EyeDir.z;\n"," vec3 iPoint = EyePos + t*EyeDir;\n"," if (abs(iPoint.z)*radiusVCVSOutput > lengthVCVSOutput*0.5) {\n"," float t2 = (-b + sqrt(d))/(2.0*a);\n"," float tz2 = EyePos.z + t2*EyeDir.z;\n"," if (tz2*radiusVCVSOutput > lengthVCVSOutput*0.5 || tz*radiusVCVSOutput < -0.5*lengthVCVSOutput) { discard; }\n"," else {\n"," normalVCVSOutput = orientVCVSOutput;\n"," float t3 = (lengthVCVSOutput*0.5/radiusVCVSOutput - EyePos.z)/EyeDir.z;\n"," iPoint = EyePos + t3*EyeDir;\n"," vertexVC.xyz = radiusVCVSOutput*(iPoint.x*base1 + iPoint.y*base2 + iPoint.z*orientVCVSOutput) + centerVCVSOutput;\n"," }\n"," }\n"," else {\n"," normalVCVSOutput = iPoint.x*base1 + iPoint.y*base2;\n"," vertexVC.xyz = radiusVCVSOutput*(normalVCVSOutput + iPoint.z*orientVCVSOutput) + centerVCVSOutput;\n"," }\n"," }\n"," vec4 pos = VCPCMatrix * vertexVC;\n",s]).result,o=$W.substitute(o,"//VTK::Normal::Impl","").result,t.haveSeenDepthRequest&&(o=$W.substitute(o,"//VTK::ZBuffer::Impl",["if (depthRequest == 1) {","float computedZ = (pos.z / pos.w + 1.0) / 2.0;","float iz = floor(computedZ * 65535.0 + 0.1);","float rf = floor(iz/256.0)/255.0;","float gf = mod(iz,256.0)/255.0;","gl_FragData[0] = vec4(rf, gf, 0.0, 1.0); }"]).result),e.Vertex=i,e.Fragment=o,n.replaceShaderValues(e,r,a)},e.setMapperShaderParameters=(e,r,a)=>{e.getCABO().getElementCount()&&(t.VBOBuildTime>e.getAttributeUpdateTime().getMTime()||e.getShaderSourceTime().getMTime()>e.getAttributeUpdateTime().getMTime())&&(e.getProgram().isAttributeUsed("orientMC")&&!e.getVAO().addAttributeArray(e.getProgram(),e.getCABO(),"orientMC",12,e.getCABO().getStride(),t.context.FLOAT,3,!1)&&Q8("Error setting 'orientMC' in shader VAO."),e.getProgram().isAttributeUsed("offsetMC")&&!e.getVAO().addAttributeArray(e.getProgram(),e.getCABO().getColorBO(),"offsetMC",0,e.getCABO().getColorBOStride(),t.context.UNSIGNED_BYTE,3,!0)&&Q8("Error setting 'offsetMC' in shader VAO."),e.getProgram().isAttributeUsed("radiusMC")&&!e.getVAO().addAttributeArray(e.getProgram(),e.getCABO(),"radiusMC",24,e.getCABO().getStride(),t.context.FLOAT,1,!1)&&Q8("Error setting 'radiusMC' in shader VAO.")),n.setMapperShaderParameters(e,r,a)},e.setCameraShaderParameters=(e,r,n)=>{let a=e.getProgram(),i=r.getActiveCamera(),o=t.openGLCamera.getKeyMatrices(r);if(a.isUniformUsed("VCPCMatrix")&&a.setUniformMatrix("VCPCMatrix",o.vcpc),n.getIsIdentity())a.isUniformUsed("MCVCMatrix")&&a.setUniformMatrix("MCVCMatrix",o.wcvc),a.isUniformUsed("normalMatrix")&&a.setUniformMatrix3x3("normalMatrix",o.normalMatrix);else{let e=t.openGLActor.getKeyMatrices();if(a.isUniformUsed("MCVCMatrix")){let t=new Float64Array(16);Lv.mat4.multiply(t,o.wcvc,e.mcwc),a.setUniformMatrix("MCVCMatrix",t)}if(a.isUniformUsed("normalMatrix")){let t=new Float64Array(9);Lv.mat3.multiply(t,o.normalMatrix,e.normalMatrix),a.setUniformMatrix3x3("normalMatrix",t)}}a.isUniformUsed("cameraParallel")&&e.getProgram().setUniformi("cameraParallel",i.getParallelProjection())},e.getOpenGLMode=(e,r)=>t.context.TRIANGLES,e.buildBufferObjects=(e,r)=>{let n=t.currentInput;if(null===n)return;t.renderable.mapScalars(n,1);let a=t.renderable.getColorMapColors(),i=t.primitives[t.primTypes.Tris].getCABO(),o=n.getPointData(),s=n.getPoints(),l=s.getNumberOfPoints(),u=s.getData(),d=null,c=0;i.setColorBOStride(4),i.getColorBO()||i.setColorBO($P.newInstance()),i.getColorBO().setOpenGLRenderWindow(t._openGLRenderWindow),a&&(c=a.getNumberOfComponents(),i.setColorOffset(4),d=a.getData(),i.setColorBOStride(8)),i.setColorComponents(c),i.setStride(28);let h=new Float32Array(7*l*12),p=new Uint8Array(12*l*(d?8:4)),m=null,f=null;null!=t.renderable.getScaleArray()&&o.hasArray(t.renderable.getScaleArray())&&(m=o.getArray(t.renderable.getScaleArray()).getData()),null!=t.renderable.getOrientationArray()&&o.hasArray(t.renderable.getOrientationArray())?f=o.getArray(t.renderable.getOrientationArray()).getData():Q8(["Error setting orientationArray.\n","You have to specify the stick orientation"]);let g=[0,1,3,0,3,2,2,3,5,2,5,4],y=0,v=0,b=0,w=0;for(let e=0;e<l;++e){let r=t.renderable.getLength(),n=t.renderable.getRadius();m&&(r=m[2*e],n=m[2*e+1]);for(let t=0;t<g.length;++t)y=3*e,h[b++]=u[y++],h[b++]=u[y++],h[b++]=u[y++],y=3*e,h[b++]=f[y++]*r,h[b++]=f[y++]*r,h[b++]=f[y++]*r,h[b++]=n,p[w++]=255*(g[t]%2),p[w++]=255*(g[t]>=4),p[w++]=255*(g[t]>=2),p[w++]=255,v=e*c,d&&(p[w++]=d[v],p[w++]=d[v+1],p[w++]=d[v+2],p[w++]=d[v+3])}i.setElementCount(b/7),i.upload(h,$C.ARRAY_BUFFER),i.getColorBO().upload(p,$C.ARRAY_BUFFER),t.VBOBuildTime.modified()}},"vtkOpenGLStickMapper");$r.vtkStickMapper=Q9;let{vtkErrorMacro:Q7}=jS,eee={},eet=jS.newInstance(function(e,t,r={}){Object.assign(t,eee,r),Y4(e,t,r),r.scalarTexture?t.scalarTextures=[r.scalarTexture]:t.scalarTextures=[],t.scalarTextureStrings=[],t._scalarTexturesCore=[];t.classHierarchy.push("vtkStreamingOpenGLImageResliceMapper");let n=new Map;function a(t,r,a){r!==a&&(!function(t,r){if(!r)return;let a=(n.get(r)??0)-1;a<=0?(t.unregisterGraphicsResourceUser(r,e),n.delete(r)):n.set(r,a)}(t,r),function(t,r){if(!r)return;let a=n.get(r)??0;n.set(r,a+1),a<=0&&t.registerGraphicsResourceUser(r,e)}(t,a))}e.renderPiece=(r,n)=>{e.invokeEvent({type:"StartEvent"}),t.renderable.update();let a=t.renderable.getNumberOfInputPorts();t.currentValidInputs=[];for(let e=0;e<a;++e){let r=t.renderable.getInputData(e);r&&!r.isDeleted()&&t.currentValidInputs.push({imageData:r,inputIndex:e})}let i=t.currentValidInputs.length;if(i<=0)return void Q7("No input!");t.labelOutlineProperties=function(e,t){let r=[];for(let n=0;n<t.length;n++){let a=e.getProperty(t[n].inputIndex);a?.getUseLabelOutline()&&r.push({property:a,arrayIndex:n})}return r}(n,t.currentValidInputs);let o=t.currentValidInputs[0].imageData,s=o.getPointData().getScalars(),{numberOfComponents:l}=o.get("numberOfComponents")||{numberOfComponents:void 0};t.multiTexturePerVolumeEnabled=i>1,t.numberOfComponents=t.multiTexturePerVolumeEnabled?i:"number"==typeof l?l:s?.getNumberOfComponents?.()??1,e.updateResliceGeometry(),e.renderPieceStart(r,n),e.renderPieceDraw(r,n),e.renderPieceFinish(r,n),e.invokeEvent({type:"EndEvent"})},e.getNeedToRebuildBufferObjects=(r,n)=>{let a=t.labelOutlineProperties.length>0;if(t.VBOBuildTime.getMTime()<e.getMTime()||t.VBOBuildTime.getMTime()<n.getMTime()||t.VBOBuildTime.getMTime()<t.renderable.getMTime()||t.VBOBuildTime.getMTime()<n.getProperty(t.currentValidInputs[0].inputIndex)?.getMTime()||t.currentValidInputs.some(({imageData:e})=>t.VBOBuildTime.getMTime()<e.getMTime())||t.VBOBuildTime.getMTime()<t.resliceGeom.getMTime()||t.scalarTextures.length!==t.currentValidInputs.length||!t.colorTexture?.getHandle()||!t.pwfTexture?.getHandle()||a&&(!t.labelOutlineThicknessTexture?.getHandle()||!t.labelOutlineOpacityTexture?.getHandle()))return!0;if(t.scalarTextures&&t.scalarTextures.length>0)for(let e=0;e<t.scalarTextures.length;e++){let r=t.scalarTextures[e];if(r&&(t.VBOBuildTime.getMTime()<r.getMTime()||!r.getHandle()))return!0}return!1},e.buildBufferObjects=(r,n)=>{let i=n.getProperties();t.currentValidInputs.forEach(({imageData:e},r)=>{t.scalarTextures||(t.scalarTextures=[]),t.scalarTextures[r]||(t.scalarTextures[r]=$g.newInstance());let n=t.scalarTextures[r],o=i[r],s=o.getUpdatedExtents(),l=!!s.length;if(n&&"function"==typeof n.hasUpdatedFrames){let r=e.getDimensions(),{dataType:a}=e.get("dataType"),i=t.numberOfComponents;n.setOpenGLRenderWindow(t._openGLRenderWindow),n.enableUseHalfFloat?.(!1);let s=n.getTextureParameters?.(),u=!0;if(s?.dataType===a&&s?.width===r[0]&&s?.height===r[1]&&s?.depth===r[2]&&(u=!1),u){let e=t.context.getExtension("EXT_texture_norm16");n.setOglNorm16Ext(BS()?e:null),n.resetFormatAndType(),n.setTextureParameters?.({width:r[0],height:r[1],depth:r[2],numberOfComponents:i,dataType:a}),n.create3DFromRaw({width:r[0],height:r[1],depth:r[2],numComps:i,dataType:a,data:null}),n.update3DFromRaw()}else n.deactivate?.(),n.update3DFromRaw();l&&o.setUpdatedExtents([]);return}let u=e.getPointData().getScalars();if(!u)return void Q7("No scalars available for non-streaming reslice mapper");let d=t._openGLRenderWindow.getGraphicsResourceForObject(u),c=Kh(e,u);if(d?.oglObject?.getHandle()&&d?.hash===c||l)t.scalarTextures[r]=d.oglObject;else{let n=$g.newInstance();n.setOpenGLRenderWindow(t._openGLRenderWindow);let a=e.getDimensions();n.setOglNorm16Ext(t.context.getExtension("EXT_texture_norm16")),n.resetFormatAndType(),n.create3DFilterableFromDataArray({width:a[0],height:a[1],depth:a[2],dataArray:u}),t._openGLRenderWindow.setGraphicsResourceForObject(u,n,c),t.scalarTextures[r]=n}if(l){o.setUpdatedExtents([]);let n=e.getDimensions();t.scalarTextures[r].create3DFilterableFromDataArray({width:n[0],height:n[1],depth:n[2],dataArray:u,updatedExtents:s})}a(t._openGLRenderWindow,t._scalarTexturesCore[r],u),t._scalarTexturesCore[r]=u});let o=i[t.currentValidInputs[0].inputIndex],s=o.getIndependentComponents(),l=s?t.numberOfComponents:1,u=s?2*l:1,d=[];for(let e=0;e<l;++e)d.push(o.getRGBTransferFunction(e));let c=Kc(d,s,l),h=o.getRGBTransferFunction(),p=t._openGLRenderWindow.getGraphicsResourceForObject(h);if(p?.oglObject?.getHandle()&&p?.hash===c)t.colorTexture=p.oglObject;else{let e=t.renderable.getColorTextureWidth();e<=0&&(e=t.context.getParameter(t.context.MAX_TEXTURE_SIZE));let r=new Uint8ClampedArray(e*u*3),n=$g.newInstance();if(n.setOpenGLRenderWindow(t._openGLRenderWindow),h){let t=new Float32Array(3*e);for(let n=0;n<l;n++){let a=o.getRGBTransferFunction(n),i=a.getRange();if(a.getTable(i[0],i[1],e,t,1),s)for(let a=0;a<3*e;a++)r[n*e*6+a]=255*t[a],r[n*e*6+a+3*e]=255*t[a];else for(let a=0;a<3*e;a++)r[n*e*3+a]=255*t[a]}n.resetFormatAndType(),n.create2DFromRaw({width:e,height:u,numComps:3,dataType:UZ.UNSIGNED_CHAR,data:r})}else{for(let t=0;t<3*e;++t){let n=255*t/((e-1)*3);for(let a=0;a<u;++a)r[a*e*3+t+0]=n,r[a*e*3+t+1]=n,r[a*e*3+t+2]=n}n.resetFormatAndType(),n.create2DFromRaw({width:e,height:1,numComps:3,dataType:UZ.UNSIGNED_CHAR,data:r})}h&&t._openGLRenderWindow.setGraphicsResourceForObject(h,n,c),t.colorTexture=n}a(t._openGLRenderWindow,t._colorTextureCore,h),t._colorTextureCore=h;let m=[];for(let e=0;e<l;++e)m.push(o.getPiecewiseFunction(e));let f=Kc(m,s,l),g=o.getPiecewiseFunction(),y=t._openGLRenderWindow.getGraphicsResourceForObject(g);if(y?.oglObject?.getHandle()&&y?.hash===f)t.pwfTexture=y.oglObject;else{let e=t.renderable.getOpacityTextureWidth();e<=0&&(e=t.context.getParameter(t.context.MAX_TEXTURE_SIZE));let r=e*u,n=new Uint8ClampedArray(r),a=$g.newInstance();if(a.setOpenGLRenderWindow(t._openGLRenderWindow),g){let t=new Float32Array(r),n=new Float32Array(e);for(let r=0;r<l;++r){let a=o.getPiecewiseFunction(r);if(null===a)t.fill(1);else{let i=a.getRange();if(a.getTable(i[0],i[1],e,n,1),s)for(let a=0;a<e;a++)t[r*e*2+a]=n[a],t[r*e*2+a+e]=n[a];else for(let r=0;r<e;r++)t[r]=n[r]}}a.resetFormatAndType(),a.create2DFromRaw({width:e,height:u,numComps:1,dataType:UZ.FLOAT,data:t})}else n.fill(255),a.resetFormatAndType(),a.create2DFromRaw({width:e,height:u,numComps:1,dataType:UZ.UNSIGNED_CHAR,data:n});g&&t._openGLRenderWindow.setGraphicsResourceForObject(g,a,f),t.pwfTexture=a}a(t._openGLRenderWindow,t._pwfTextureCore,g),t._pwfTextureCore=g,t.labelOutlineProperties.length>0&&(e.updateLabelOutlineThicknessTexture(t.labelOutlineProperties),e.updateLabelOutlineOpacityTexture(t.labelOutlineProperties));let v=`${t.resliceGeom.getMTime()}A${t.renderable.getSlabThickness()}`;if(!t.tris.getCABO().getElementCount()||t.VBOBuildString!==v){let e=U9.newInstance({numberOfComponents:3,values:t.resliceGeom.getPoints().getData()});e.setName("points");let r=U9.newInstance({numberOfComponents:1,values:t.resliceGeom.getPolys().getData()}),n={points:e,cellOffset:0};if(t.renderable.getSlabThickness()>0){let e=t.resliceGeom.getPointData().getNormals();e?n.normals=e:Q7("Slab mode requested without normals")}t.tris.getCABO().createVBO(r,"polys",qX.SURFACE,n)}t.VBOBuildString=v,t.VBOBuildTime.modified()}},"vtkStreamingOpenGLImageResliceMapper"),eer={},een=jS.newInstance(function(e,t,r={}){Object.assign(t,eer,r),Zs(e,t,r),r.scalarTexture?t.scalarTextures=[r.scalarTexture]:t.scalarTextures=[],t.scalarTextureStrings=[],t._scalarTexturesCore=[],t.previousState={};t.classHierarchy.push("vtkStreamingOpenGLVolumeMapper");let n=new Map;function a(t,r,a){r!==a&&(!function(t,r){if(!r)return;let a=(n.get(r)??0)-1;a<=0?(t.unregisterGraphicsResourceUser(r,e),n.delete(r)):n.set(r,a)}(t,r),function(t,r){if(!r)return;let a=n.get(r)??0;n.set(r,a+1),a<=0&&t.registerGraphicsResourceUser(r,e)}(t,a))}e.renderPiece=(r,n)=>{e.invokeEvent({type:"StartEvent"}),t.renderable.update();let a=t.renderable.getNumberOfInputPorts();t.currentValidInputs=[];for(let e=0;e<a;++e){let r=t.renderable.getInputData(e);r&&!r.isDeleted()&&t.currentValidInputs.push({imageData:r,inputIndex:e})}let i=0;if(t.currentValidInputs.length>0){let e=n.getProperties(),a=t.currentValidInputs[0],o=a.imageData,s=e[a.inputIndex];s.getShade()&&t.renderable.getBlendMode()===NY.COMPOSITE_BLEND&&r.getLights().forEach(e=>{e.getSwitch()>0&&i++});let l=t.currentValidInputs.length,u=l>1,{numberOfComponents:d}=o.get("numberOfComponents");t.numberOfComponents=u?l:d,t.numberOfComponents>1?t.useIndependentComponents=s.getIndependentComponents():t.useIndependentComponents=!1}i!==t.numberOfLights&&(t.numberOfLights=i,e.modified()),e.invokeEvent({type:"EndEvent"}),0!==t.currentValidInputs.length&&(e.renderPieceStart(r,n),e.renderPieceDraw(r,n),e.renderPieceFinish(r,n))},e.buildBufferObjects=(r,n)=>{if(!t.jitterTexture.getHandle()){let e=new Float32Array(1024);for(let t=0;t<1024;++t)e[t]=Math.random();t.jitterTexture.setMinificationFilter(q0.NEAREST),t.jitterTexture.setMagnificationFilter(q0.NEAREST),t.jitterTexture.create2DFromRaw({width:32,height:32,numComps:1,dataType:UZ.FLOAT,data:e})}let i=n.getProperties()[t.currentValidInputs[0].inputIndex],o=t.numberOfComponents,s=t.useIndependentComponents,l=s?o:1,u=[];for(let e=0;e<l;++e)u.push(i.getScalarOpacity(e));let d=Kc(u,s,l),c=i.getScalarOpacity(),h=t._openGLRenderWindow.getGraphicsResourceForObject(c);if(h?.oglObject?.getHandle()&&h.hash===d)t.opacityTexture=h.oglObject;else{var p,m;let n,a,o=$g.newInstance();o.setOpenGLRenderWindow(t._openGLRenderWindow);let s=t.renderable.getOpacityTextureWidth();s<=0&&(s=t.context.getParameter(t.context.MAX_TEXTURE_SIZE));let u=2*s*l,h=new Float32Array(u),f=new Float32Array(s);for(let t=0;t<l;++t){let n=i.getScalarOpacity(t),a=e.getCurrentSampleDistance(r)/i.getScalarOpacityUnitDistance(t),o=n.getRange();n.getTable(o[0],o[1],s,f,1);for(let e=0;e<s;++e)h[t*s*2+e]=1-(1-f[e])**a,h[t*s*2+e+s]=h[t*s*2+e]}if(o.resetFormatAndType(),o.setMinificationFilter(q0.LINEAR),o.setMagnificationFilter(q0.LINEAR),p=t._openGLRenderWindow,m=t.context,n=p.getWebgl2()||!!m.getExtension("OES_texture_float"),a=!!m.getExtension("OES_texture_float_linear"),n&&a)o.create2DFromRaw({width:s,height:2*l,numComps:1,dataType:UZ.FLOAT,data:h});else{let e=new Uint8ClampedArray(u);for(let t=0;t<u;++t)e[t]=255*h[t];o.create2DFromRaw({width:s,height:2*l,numComps:1,dataType:UZ.UNSIGNED_CHAR,data:e})}c&&t._openGLRenderWindow.setGraphicsResourceForObject(c,o,d),t.opacityTexture=o}a(t._openGLRenderWindow,t._opacityTextureCore,c),t._opacityTextureCore=c;let f=[];for(let e=0;e<l;++e)f.push(i.getRGBTransferFunction(e));let g=Kc(f,s,l),y=i.getRGBTransferFunction(),v=t._openGLRenderWindow.getGraphicsResourceForObject(y);if(v?.oglObject?.getHandle()&&v?.hash===g)t.colorTexture=v.oglObject;else{let e=$g.newInstance();e.setOpenGLRenderWindow(t._openGLRenderWindow);let r=t.renderable.getColorTextureWidth();r<=0&&(r=t.context.getParameter(t.context.MAX_TEXTURE_SIZE));let n=new Uint8ClampedArray(2*r*l*3),a=new Float32Array(3*r);for(let e=0;e<l;++e){let t=i.getRGBTransferFunction(e),o=t.getRange();t.getTable(o[0],o[1],r,a,1);for(let t=0;t<3*r;++t)n[e*r*6+t]=255*a[t],n[e*r*6+t+3*r]=255*a[t]}e.resetFormatAndType(),e.setMinificationFilter(q0.LINEAR),e.setMagnificationFilter(q0.LINEAR),e.create2DFromRaw({width:r,height:2*l,numComps:3,dataType:UZ.UNSIGNED_CHAR,data:n}),t._openGLRenderWindow.setGraphicsResourceForObject(y,e,g),t.colorTexture=e}a(t._openGLRenderWindow,t._colorTextureCore,y),t._colorTextureCore=y,t.currentValidInputs.forEach(({imageData:e,inputIndex:r},n)=>{if(t.scalarTextures||(t.scalarTextures=[]),!t.scalarTextures[n])return void console.warn(`ScalarTexture for component ${n} not initialized, skipping.`);let a=t.scalarTextures[n],i=`${e.getMTime()}-${a.getMTime()}`;if(t.scalarTextureStrings||(t.scalarTextureStrings=[]),t.scalarTextureStrings[n]!==i){let r=e.getDimensions();a.setOpenGLRenderWindow(t._openGLRenderWindow),a.enableUseHalfFloat(!1);let o=a.getTextureParameters(),s=e.get("dataType").dataType,l=e.getPointData()?.getScalars()?.getNumberOfComponents?.()??e.get("numberOfComponents").numberOfComponents??1,u=!0;if(o?.dataType===s&&o?.width===r[0]&&o?.height===r[1]&&o?.depth===r[2]&&o?.numberOfComponents===l&&(u=!1),u){let e=t.context.getExtension("EXT_texture_norm16");a.setOglNorm16Ext(BS()?e:null),a.resetFormatAndType(),a.setTextureParameters({width:r[0],height:r[1],depth:r[2],numberOfComponents:l,dataType:s}),a.create3DFromRaw({width:r[0],height:r[1],depth:r[2],numComps:l,dataType:s,data:null}),a.update3DFromRaw()}else a.deactivate(),a.update3DFromRaw();t.scalarTextureStrings[n]=i}t._scalarTexturesCore||(t._scalarTexturesCore=[])});let b=i.getLabelOutlineThickness(),w=t._openGLRenderWindow.getGraphicsResourceForObject(b),x=b.join("-");if(w?.oglObject?.getHandle()&&w?.hash===x)t.labelOutlineThicknessTexture=w.oglObject;else{let e=$g.newInstance();e.setOpenGLRenderWindow(t._openGLRenderWindow);let r=t.renderable.getLabelOutlineTextureWidth();r<=0&&(r=t.context.getParameter(t.context.MAX_TEXTURE_SIZE));let n=new Uint8Array(+r);for(let e=0;e<r;++e){let t=void 0!==b[e]?b[e]:b[0];n[e]=t}e.resetFormatAndType(),e.setMinificationFilter(q0.NEAREST),e.setMagnificationFilter(q0.NEAREST),e.create2DFromRaw({width:r,height:1,numComps:1,dataType:UZ.UNSIGNED_CHAR,data:n}),b&&t._openGLRenderWindow.setGraphicsResourceForObject(b,e,x),t.labelOutlineThicknessTexture=e}if(a(t._openGLRenderWindow,t._labelOutlineThicknessTextureCore,b),t._labelOutlineThicknessTextureCore=b,!t.tris.getCABO().getElementCount()){let e=new Float32Array(12);for(let t=0;t<4;t++)e[3*t]=t%2*2-1,e[3*t+1]=t>1?1:-1,e[3*t+2]=-1;let r=new Uint16Array(8);r[0]=3,r[1]=0,r[2]=1,r[3]=3,r[4]=3,r[5]=0,r[6]=3,r[7]=2;let n=U9.newInstance({numberOfComponents:3,values:e});n.setName("points");let a=U9.newInstance({numberOfComponents:1,values:r});t.tris.getCABO().createVBO(a,"polys",qX.SURFACE,{points:n,cellOffset:0})}t.VBOBuildTime.modified()},e.getNeedToRebuildBufferObjects=(r,n)=>{if(t.VBOBuildTime.getMTime()<e.getMTime()||t.VBOBuildTime.getMTime()<n.getMTime()||t.VBOBuildTime.getMTime()<t.renderable.getMTime()||t.VBOBuildTime.getMTime()<n.getProperty().getMTime()||t.VBOBuildTime.getMTime()<t.colorTexture?.getMTime()||t.VBOBuildTime.getMTime()<t.labelOutlineThicknessTexture?.getMTime()||!t.colorTexture?.getHandle()||!t.labelOutlineThicknessTexture?.getHandle())return!0;if(t.scalarTextures&&t.scalarTextures.length>0)for(let e=0;e<t.scalarTextures.length;e++){let r=t.scalarTextures[e];if(r&&(t.VBOBuildTime.getMTime()<r.getMTime()||!r.getHandle()))return!0}if(t.currentValidInputs&&t.currentValidInputs.length>0)for(let e=0;e<t.currentValidInputs.length;e++){let r=t.currentValidInputs[e];if(r&&r.imageData&&t.VBOBuildTime.getMTime()<r.imageData.getMTime())return!0}return!1}},"vtkStreamingOpenGLVolumeMapper"),eea=Object.create(null),eei={},eeo=jS.newInstance(function(e,t,r={}){Object.assign(t,eei,r),$t(e,t,r),t.classHierarchy.push("vtkStreamingOpenGLViewNodeFactory"),e.createNode=r=>{if(r.isDeleted())return null;let n=0,a=r.getClassName(n++),i=!1,o=Object.keys(t.overrides);for(;a&&!i;)o.includes(a)?i=!0:a=r.getClassName(n++);if(!i)return null;let s=t.getModelInitialValues(r),l=t.overrides[a](s);return l.setMyFactory(e),l},t.overrides=eea,t.getModelInitialValues=e=>{let t={},r=e.getClassName();return"vtkSharedVolumeMapper"===r&&(t.scalarTexture=e.getScalarTexture()),"vtkSharedImageResliceMapper"===r&&(t.scalarTexture=e.getScalarTexture()),t},eea.vtkActor=Qh,eea.vtkActor2D=Qm,eea.vtkCamera=Ko,eea.vtkGlyph3DMapper=QQ,eea.vtkImageMapper=Kg,eea.vtkImageCPRMapper=Zp,eea.vtkImageResliceMapper=Y8,eea.vtkImageSlice=Kv,eea.vtkMapper=QG,eea.vtkPixelSpaceCallbackMapper=Kx,eea.vtkRenderer=KM,eea.vtkSkybox=Q2,eea.vtkSphereMapper=Q4,eea.vtkStickMapper=Q9,eea.vtkTexture=$g.newInstance,eea.vtkVolume=Y9,eea.vtkVolumeMapper=Zl,eea.vtkSharedVolumeMapper=een,eea.vtkSharedImageResliceMapper=eet},"vtkStreamingOpenGLViewNodeFactory"),ees=jS.newInstance(function(e,t,r={}){Object.assign(t,r),Qu(e,t,r),t.myFactory=eeo(),eea.vtkRenderWindow=ees,t.classHierarchy.push("vtkStreamingOpenGLRenderWindow")},"vtkStreamingOpenGLRenderWindow");var eel={switch:!0,intensity:1,color:[1,1,1],position:[0,0,1],focalPoint:[0,0,0],positional:!1,exponent:1,coneAngle:30,coneFalloff:5,attenuationValues:[1,0,0],transformMatrix:null,lightType:"SceneLight",shadowAttenuation:1,direction:[0,0,0],directionMTime:0},eeu=jS.newInstance(function(e,t,r={}){let n;Object.assign(t,eel,r),jS.obj(e,t),jS.setGet(e,t,["intensity","switch","positional","exponent","coneAngle","coneFalloff","transformMatrix","lightType","shadowAttenuation","attenuationValues"]),jS.setGetArray(e,t,["color","position","focalPoint","attenuationValues"],3),t.classHierarchy.push("vtkLight"),n=new Float64Array(3),e.getTransformedPosition=()=>(t.transformMatrix?Lv.vec3.transformMat4(n,t.position,t.transformMatrix):Lv.vec3.set(n,t.position[0],t.position[1],t.position[2]),n),e.getTransformedFocalPoint=()=>(t.transformMatrix?Lv.vec3.transformMat4(n,t.focalPoint,t.transformMatrix):Lv.vec3.set(n,t.focalPoint[0],t.focalPoint[1],t.focalPoint[2]),n),e.getDirection=()=>(t.directionMTime<t.mtime&&(Lv.vec3.sub(t.direction,t.focalPoint,t.position),j2(t.direction),t.directionMTime=t.mtime),t.direction),e.setDirection=e=>{let r=new Float64Array(3);Lv.vec3.sub(r,t.position,e),t.focalPoint=r},e.setDirectionAngle=(t,r)=>{let n=jN(t),a=jN(r);e.setPosition(Math.cos(n)*Math.sin(a),Math.sin(n),Math.cos(n)*Math.cos(a)),e.setFocalPoint(0,0,0),e.setPositional(0)},e.setLightTypeToHeadLight=()=>{e.setLightType("HeadLight")},e.setLightTypeToCameraLight=()=>{e.setLightType("CameraLight")},e.setLightTypeToSceneLight=()=>{e.setTransformMatrix(null),e.setLightType("SceneLight")},e.lightTypeIsHeadLight=()=>"HeadLight"===t.lightType,e.lightTypeIsSceneLight=()=>"SceneLight"===t.lightType,e.lightTypeIsCameraLight=()=>"CameraLight"===t.lightType},"vtkLight"),{vtkErrorMacro:eed}=jS,eec={background:[0,0,0],background2:[.2,.2,.2],gradientBackground:!1,viewport:[0,0,1,1],aspect:[1,1],pixelAspect:[1,1],props:[],actors2D:[]};function eeh(e,t,r={}){Object.assign(t,eec,r),jS.obj(e,t),jS.event(e,t,"event"),jS.setGet(e,t,["gradientBackground"]),jS.setGetArray(e,t,["viewport"],4),jS.setGetArray(e,t,["background","background2"],3),t.classHierarchy.push("vtkViewport"),e.getViewProps=()=>t.props,e.hasViewProp=e=>t.props.includes(e),e.addViewProp=r=>{r&&!e.hasViewProp(r)&&t.props.push(r)},e.removeViewProp=e=>{let r=t.props.filter(t=>t!==e);t.props.length!==r.length&&(t.props=r)},e.removeAllViewProps=()=>{t.props=[]},e.getViewPropsWithNestedProps=()=>{let e=[];t.actors2D=[];for(let r=0;r<t.props.length;r++){let n=t.props[r].getActors2D();n&&(!Array.isArray(n)||n.length>0)?t.actors2D=t.actors2D.concat(n):function e(t,r=[]){r.push(t);let n=t.getNestedProps();if(n&&n.length)for(let t=0;t<n.length;t++)e(n[t],r);return r}(t.props[r],e)}return t.actors2D.sort((e,t)=>e.getLayerNumber()-t.getLayerNumber()),e=e.concat(t.actors2D)},e.addActor2D=e.addViewProp,e.removeActor2D=t=>{e.removeViewProp(t)},e.getActors2D=()=>(t.actors2D=[],t.props.forEach(e=>{t.actors2D=t.actors2D.concat(e.getActors2D())}),t.actors2D),e.displayToView=()=>eed("call displayToView on your view instead"),e.viewToDisplay=()=>eed("callviewtodisplay on your view instead"),e.getSize=()=>eed("call getSize on your View instead"),e.normalizedDisplayToProjection=(t,r,n)=>{let a=e.normalizedDisplayToNormalizedViewport(t,r,n);return e.normalizedViewportToProjection(a[0],a[1],a[2])},e.normalizedDisplayToNormalizedViewport=(e,r,n)=>{let a=[t.viewport[2]-t.viewport[0],t.viewport[3]-t.viewport[1]];return[(e-t.viewport[0])/a[0],(r-t.viewport[1])/a[1],n]},e.normalizedViewportToProjection=(e,t,r)=>[2*e-1,2*t-1,2*r-1],e.projectionToNormalizedDisplay=(t,r,n)=>{let a=e.projectionToNormalizedViewport(t,r,n);return e.normalizedViewportToNormalizedDisplay(a[0],a[1],a[2])},e.normalizedViewportToNormalizedDisplay=(e,r,n)=>{let a=[t.viewport[2]-t.viewport[0],t.viewport[3]-t.viewport[1]];return[e*a[0]+t.viewport[0],r*a[1]+t.viewport[1],n]},e.projectionToNormalizedViewport=(e,t,r)=>[(e+1)*.5,(t+1)*.5,(r+1)*.5],e.PickPropFrom=()=>eed("vtkViewport::PickPropFrom - NOT IMPLEMENTED")}jS.newInstance(eeh,"vtkViewport");var{vtkDebugMacro:eep,vtkErrorMacro:eem,vtkWarningMacro:eef}=BL;function eeg(e){return()=>eem(`vtkRenderer::${e} - NOT IMPLEMENTED`)}var eey={pickedProp:null,activeCamera:null,allBounds:[],ambient:[1,1,1],allocatedRenderTime:100,timeFactor:1,automaticLightCreation:!0,twoSidedLighting:!0,lastRenderTimeInSeconds:-1,renderWindow:null,lights:[],actors:[],volumes:[],lightFollowCamera:!0,numberOfPropsRendered:0,propArray:null,pathArray:null,layer:0,preserveColorBuffer:!1,preserveDepthBuffer:!1,computeVisiblePropBounds:WR(),interactive:!0,nearClippingPlaneTolerance:0,clippingRangeExpansion:.05,erase:!0,draw:!0,useShadows:!1,useDepthPeeling:!1,occlusionRatio:0,maximumNumberOfPeels:4,selector:null,delegate:null,texturedBackground:!1,backgroundTexture:null,environmentTexture:null,environmentTextureDiffuseStrength:1,environmentTextureSpecularStrength:1,useEnvironmentTextureAsBackground:!1,pass:0},eev=jh(function(e,t,r={}){let n,a,i;for(Object.assign(t,eey,r),eeh(e,t,r),t.background||(t.background=[0,0,0,1]);t.background.length<3;)t.background.push(0);3===t.background.length&&t.background.push(1),je(e,t,["_renderWindow","allocatedRenderTime","timeFactor","lastRenderTimeInSeconds","numberOfPropsRendered","lastRenderingUsedDepthPeeling","selector"]),ja(e,t,["twoSidedLighting","lightFollowCamera","automaticLightCreation","erase","draw","nearClippingPlaneTolerance","clippingRangeExpansion","backingStore","interactive","layer","preserveColorBuffer","preserveDepthBuffer","useDepthPeeling","occlusionRatio","maximumNumberOfPeels","delegate","backgroundTexture","texturedBackground","environmentTexture","environmentTextureDiffuseStrength","environmentTextureSpecularStrength","useEnvironmentTextureAsBackground","useShadows","pass"]),ji(e,t,["actors","volumes","lights"]),js(e,t,["background"],4,1),jl(e,t,["renderWindow"]),t.classHierarchy.push("vtkRenderer"),n={type:"ComputeVisiblePropBoundsEvent",renderer:e},a={type:"ResetCameraClippingRangeEvent",renderer:e},i={type:"ResetCameraEvent",renderer:e},e.updateCamera=()=>(t.activeCamera||(eep("No cameras are on, creating one."),e.getActiveCameraAndResetIfCreated()),t.activeCamera.render(e),!0),e.updateLightsGeometryToFollowCamera=()=>{let r=e.getActiveCameraAndResetIfCreated();t.lights.forEach(e=>{e.lightTypeIsSceneLight()||(e.lightTypeIsHeadLight()?(e.setPositionFrom(r.getPositionByReference()),e.setFocalPointFrom(r.getFocalPointByReference()),e.modified(r.getMTime())):e.lightTypeIsCameraLight()?e.setTransformMatrix(r.getCameraLightTransformMatrix(Lv.mat4.create())):eem("light has unknown light type",e.get()))})},e.updateLightGeometry=()=>!t.lightFollowCamera||e.updateLightsGeometryToFollowCamera(),e.allocateTime=eeg("allocateTime"),e.updateGeometry=eeg("updateGeometry"),e.getVTKWindow=()=>t._renderWindow,e.setLayer=r=>{eep(e.getClassName(),e,"setting Layer to ",r),t.layer!==r&&(t.layer=r,e.modified()),e.setPreserveColorBuffer(!!r)},e.setActiveCamera=r=>t.activeCamera!==r&&(t.activeCamera=r,e.modified(),e.invokeEvent({type:"ActiveCameraEvent",camera:r}),!0),e.makeCamera=()=>{let t=zM();return e.invokeEvent({type:"CreateCameraEvent",camera:t}),t},e.getActiveCamera=()=>(t.activeCamera||(t.activeCamera=e.makeCamera()),t.activeCamera),e.getActiveCameraAndResetIfCreated=()=>(t.activeCamera||(e.getActiveCamera(),e.resetCamera()),t.activeCamera),e.getActors=()=>(t.actors=[],t.props.forEach(e=>{t.actors=t.actors.concat(e.getActors())}),t.actors),e.addActor=e.addViewProp,e.removeActor=r=>{t.actors=t.actors.filter(e=>e!==r),e.removeViewProp(r),e.modified()},e.removeAllActors=()=>{e.getActors().forEach(t=>{e.removeViewProp(t)}),t.actors=[],e.modified()},e.getVolumes=()=>(t.volumes=[],t.props.forEach(e=>{t.volumes=t.volumes.concat(e.getVolumes())}),t.volumes),e.addVolume=e.addViewProp,e.removeVolume=r=>{t.volumes=t.volumes.filter(e=>e!==r),e.removeViewProp(r),e.modified()},e.removeAllVolumes=()=>{e.getVolumes().forEach(t=>{e.removeViewProp(t)}),t.volumes=[],e.modified()},e.hasLight=e=>t.lights.includes(e),e.addLight=r=>{r&&!e.hasLight(r)&&(t.lights.push(r),e.modified())},e.removeLight=r=>{t.lights=t.lights.filter(e=>e!==r),e.modified()},e.removeAllLights=()=>{t.lights=[],e.modified()},e.setLightCollection=r=>{t.lights=r,e.modified()},e.makeLight=eeu,e.createLight=()=>{t.automaticLightCreation&&(t._createdLight&&(e.removeLight(t._createdLight),t._createdLight.delete(),t._createdLight=null),t._createdLight=e.makeLight(),e.addLight(t._createdLight),t._createdLight.setLightTypeToHeadLight(),t._createdLight.setPosition(e.getActiveCamera().getPosition()),t._createdLight.setFocalPoint(e.getActiveCamera().getFocalPoint()))},e.normalizedDisplayToWorld=(t,r,n,a)=>{let i=e.normalizedDisplayToProjection(t,r,n);return i=e.projectionToView(i[0],i[1],i[2],a),e.viewToWorld(i[0],i[1],i[2])},e.worldToNormalizedDisplay=(t,r,n,a)=>{let i=e.worldToView(t,r,n);return i=e.viewToProjection(i[0],i[1],i[2],a),e.projectionToNormalizedDisplay(i[0],i[1],i[2])},e.viewToWorld=(e,r,n)=>{if(null===t.activeCamera)return eem("ViewToWorld: no active camera, cannot compute view to world, returning 0,0,0"),[0,0,0];let a=t.activeCamera.getViewMatrix();Lv.mat4.invert(a,a),Lv.mat4.transpose(a,a);let i=new Float64Array([e,r,n]);return Lv.vec3.transformMat4(i,i,a),i},e.projectionToView=(e,r,n,a)=>{if(null===t.activeCamera)return eem("ProjectionToView: no active camera, cannot compute projection to view, returning 0,0,0"),[0,0,0];let i=t.activeCamera.getProjectionMatrix(a,-1,1);Lv.mat4.invert(i,i),Lv.mat4.transpose(i,i);let o=new Float64Array([e,r,n]);return Lv.vec3.transformMat4(o,o,i),o},e.worldToView=(e,r,n)=>{if(null===t.activeCamera)return eem("WorldToView: no active camera, cannot compute view to world, returning 0,0,0"),[0,0,0];let a=t.activeCamera.getViewMatrix();Lv.mat4.transpose(a,a);let i=new Float64Array([e,r,n]);return Lv.vec3.transformMat4(i,i,a),i},e.viewToProjection=(e,r,n,a)=>{if(null===t.activeCamera)return eem("ViewToProjection: no active camera, cannot compute view to projection, returning 0,0,0"),[0,0,0];let i=t.activeCamera.getProjectionMatrix(a,-1,1);Lv.mat4.transpose(i,i);let o=new Float64Array([e,r,n]);return Lv.vec3.transformMat4(o,o,i),o},e.computeVisiblePropBounds=()=>{t.allBounds[0]=UK["0"],t.allBounds[1]=UK["1"],t.allBounds[2]=UK["2"],t.allBounds[3]=UK["3"],t.allBounds[4]=UK["4"],t.allBounds[5]=UK["5"];let r=!0;e.invokeEvent(n);for(let e=0;e<t.props.length;++e){let n=t.props[e];if(n.getVisibility()&&n.getUseBounds()){let e=n.getBounds();e&&WE(e)&&(r=!1,e[0]<t.allBounds[0]&&(t.allBounds[0]=e[0]),e[1]>t.allBounds[1]&&(t.allBounds[1]=e[1]),e[2]<t.allBounds[2]&&(t.allBounds[2]=e[2]),e[3]>t.allBounds[3]&&(t.allBounds[3]=e[3]),e[4]<t.allBounds[4]&&(t.allBounds[4]=e[4]),e[5]>t.allBounds[5]&&(t.allBounds[5]=e[5]))}}return r&&(WS(t.allBounds),eep("Can't compute bounds, no 3D props are visible")),t.allBounds},e.resetCamera=(r=null)=>{let n=r||e.computeVisiblePropBounds(),a=[0,0,0];if(!WE(n))return eep("Cannot reset camera!"),!1;let o=null;if(!e.getActiveCamera())return eem("Trying to reset non-existent camera"),!1;o=t.activeCamera.getViewPlaneNormal(),t.activeCamera.setViewAngle(30),a[0]=(n[0]+n[1])/2,a[1]=(n[2]+n[3])/2,a[2]=(n[4]+n[5])/2;let s=n[1]-n[0],l=n[3]-n[2],u=n[5]-n[4];s*=s,l*=l,u*=u;let d=s+l+u;d=.5*Math.sqrt(d=0===d?1:d);let c=jN(t.activeCamera.getViewAngle()),h=d,p=d/Math.sin(.5*c),m=t.activeCamera.getViewUp();return Math.abs(jQ(m,o))>.999&&(eef("Resetting view-up since view plane normal is parallel"),t.activeCamera.setViewUp(-m[2],m[0],m[1])),t.activeCamera.setFocalPoint(a[0],a[1],a[2]),t.activeCamera.setPosition(a[0]+p*o[0],a[1]+p*o[1],a[2]+p*o[2]),e.resetCameraClippingRange(n),t.activeCamera.setParallelScale(h),t.activeCamera.setPhysicalScale(d),t.activeCamera.setPhysicalTranslation(-a[0],-a[1],-a[2]),e.invokeEvent(i),!0},e.resetCameraClippingRange=(r=null)=>{let n=r||e.computeVisiblePropBounds();if(!WE(n))return eep("Cannot reset camera clipping range!"),!1;if(e.getActiveCameraAndResetIfCreated(),!t.activeCamera)return eem("Trying to reset clipping range of non-existent camera"),!1;let i=t.activeCamera.computeClippingRange(n),o=0;return o=t.activeCamera.getParallelProjection()?.2*t.activeCamera.getParallelScale():.2*Math.tan(jN(t.activeCamera.getViewAngle())/2)*i[1],i[1]-i[0]<o&&(o=o-i[1]+i[0],i[1]+=o/2,i[0]-=o/2),i[0]<0&&(i[0]=0),i[0]=.99*i[0]-(i[1]-i[0])*t.clippingRangeExpansion,i[1]=1.01*i[1]+(i[1]-i[0])*t.clippingRangeExpansion,i[0]=i[0]>=i[1]?.01*i[1]:i[0],t.nearClippingPlaneTolerance||(t.nearClippingPlaneTolerance=.01),i[0]<t.nearClippingPlaneTolerance*i[1]&&(i[0]=t.nearClippingPlaneTolerance*i[1]),t.activeCamera.setClippingRange(i[0],i[1]),e.invokeEvent(a),!1},e.setRenderWindow=e=>{e!==t._renderWindow&&(t._vtkWindow=e,t._renderWindow=e)},e.visibleActorCount=()=>t.props.filter(e=>e.getVisibility()).length,e.visibleVolumeCount=e.visibleActorCount,e.getMTime=()=>{let e=t.mtime,r=t.activeCamera?t.activeCamera.getMTime():0;r>e&&(e=r);let n=t._createdLight?t._createdLight.getMTime():0;return n>e&&(e=n),e},e.getTransparent=()=>!!t.preserveColorBuffer,e.isActiveCameraCreated=()=>!!t.activeCamera},"vtkRenderer"),eeb={Device:{Unknown:0,LeftController:1,RightController:2},Input:{Unknown:0,Trigger:1,TrackPad:2,Grip:3,Thumbstick:4,A:5,B:6,ApplicationMenu:7},Axis:{Unknown:0,TouchpadX:1,TouchpadY:2,ThumbstickX:3,ThumbstickY:4},MouseButton:{LeftButton:1,MiddleButton:2,RightButton:3}},{Device:eew,Input:eex}=eeb,{vtkWarningMacro:eeC,vtkErrorMacro:eek,normalizeWheel:eeM,vtkOnceErrorMacro:eeS}=jS,eeE={ctrlKey:!1,altKey:!1,shiftKey:!1},eeT={"xr-standard":[eex.Trigger,eex.Grip,eex.TrackPad,eex.Thumbstick,eex.A,eex.B]},eeI=["StartAnimation","Animation","EndAnimation","PointerEnter","PointerLeave","MouseEnter","MouseLeave","StartMouseMove","MouseMove","EndMouseMove","LeftButtonPress","LeftButtonRelease","MiddleButtonPress","MiddleButtonRelease","RightButtonPress","RightButtonRelease","KeyPress","KeyDown","KeyUp","StartMouseWheel","MouseWheel","EndMouseWheel","StartPinch","Pinch","EndPinch","StartPan","Pan","EndPan","StartRotate","Rotate","EndRotate","Button3D","Move3D","StartPointerLock","EndPointerLock","StartInteraction","Interaction","EndInteraction","AnimationFrameRateUpdate"];function eeP(e){e.cancelable&&e.preventDefault()}function ee_(e){let t=Object.create(null);return e.forEach(({pointerId:e,position:r})=>{t[e]=r}),t}var eeD={renderWindow:null,interactorStyle:null,picker:null,pickingManager:null,initialized:!1,enabled:!1,enableRender:!0,currentRenderer:null,lightFollowCamera:!0,desiredUpdateRate:30,stillUpdateRate:2,container:null,recognizeGestures:!0,currentGesture:"Start",animationRequest:null,lastFrameTime:.1,recentAnimationFrameRate:10,wheelTimeoutID:0,moveTimeoutID:0,lastGamepadValues:{},preventDefaultOnPointerDown:!1,preventDefaultOnPointerUp:!1,mouseScrollDebounceByPass:!1};function eeO(e,t,r={}){Object.assign(t,eeD,r),jS.obj(e,t),t._animationExtendedEnd=0,jS.event(e,t,"RenderEvent"),eeI.forEach(r=>jS.event(e,t,r)),jS.get(e,t,["initialized","interactorStyle","lastFrameTime","recentAnimationFrameRate","_view"]),jS.setGet(e,t,["container","lightFollowCamera","enabled","enableRender","recognizeGestures","desiredUpdateRate","stillUpdateRate","picker","preventDefaultOnPointerDown","preventDefaultOnPointerUp","mouseScrollDebounceByPass"]),jS.moveToProtected(e,t,["view"]),function(e,t){t.classHierarchy.push("vtkRenderWindowInteractor");let r={...e},n=new Set,a=new Map,i=1,o=0;function s(r,n){t._forcedRenderer||(t.currentRenderer=e.findPokedRenderer(r,n))}e.start=()=>{(t.initialized||(e.initialize(),t.initialized))&&e.startEventLoop()},e.setRenderWindow=e=>{eek("you want to call setView(view) instead of setRenderWindow on a vtk.js interactor")},e.setInteractorStyle=r=>{t.interactorStyle!==r&&(null!=t.interactorStyle&&t.interactorStyle.setInteractor(null),t.interactorStyle=r,null!=t.interactorStyle&&t.interactorStyle.getInteractor()!==e&&t.interactorStyle.setInteractor(e))},e.initialize=()=>{t.initialized=!0,e.enable(),e.render()},e.enable=()=>e.setEnabled(!0),e.disable=()=>e.setEnabled(!1),e.startEventLoop=()=>eeC("empty event loop"),e.getCurrentRenderer=()=>(t.currentRenderer||s(0,0),t.currentRenderer);let l=t._getScreenEventPositionFor||function(e){let r=t._view.getCanvas(),n=r.getBoundingClientRect(),i=r.width/n.width,o=r.height/n.height,l={x:i*(e.clientX-n.left),y:o*(n.height-e.clientY+n.top),z:0,movementX:i*e.movementX,movementY:o*e.movementY};return(a.size<=1||!t.currentRenderer)&&s(l.x,l.y),l};function u(e){return{controlKey:e.ctrlKey,altKey:e.altKey,shiftKey:e.shiftKey}}function d(e){let t=u(e);return{key:e.key,keyCode:e.charCode,...t}}function c(e){return e.pointerType||""}let h=()=>{if(null===t.container)return;let{container:r}=t;r.addEventListener("contextmenu",eeP),r.addEventListener("wheel",e.handleWheel),r.addEventListener("DOMMouseScroll",e.handleWheel),r.addEventListener("pointerenter",e.handlePointerEnter),r.addEventListener("pointerleave",e.handlePointerLeave),r.addEventListener("pointermove",e.handlePointerMove,{passive:!1}),r.addEventListener("pointerdown",e.handlePointerDown,{passive:!1}),r.addEventListener("pointerup",e.handlePointerUp),r.addEventListener("pointercancel",e.handlePointerCancel),r.addEventListener("keypress",e.handleKeyPress),r.addEventListener("keydown",e.handleKeyDown),document.addEventListener("keyup",e.handleKeyUp),document.addEventListener("pointerlockchange",e.handlePointerLockChange),r.tabIndex=0,r.style.touchAction="none",r.style.userSelect="none",r.style.webkitTapHighlightColor="rgba(0,0,0,0)"};e.bindEvents=e=>{null!==e&&r.setContainer(e)&&h()};let p=()=>{clearTimeout(t.moveTimeoutID),clearTimeout(t.wheelTimeoutID),t.moveTimeoutID=0,t.wheelTimeoutID=0,i=1;let{container:r}=t;r&&(r.removeEventListener("contextmenu",eeP),r.removeEventListener("wheel",e.handleWheel),r.removeEventListener("DOMMouseScroll",e.handleWheel),r.removeEventListener("pointerenter",e.handlePointerEnter),r.removeEventListener("pointerleave",e.handlePointerLeave),r.removeEventListener("pointermove",e.handlePointerMove,{passive:!1}),r.removeEventListener("pointerdown",e.handlePointerDown,{passive:!1}),r.removeEventListener("pointerup",e.handlePointerUp),r.removeEventListener("pointercancel",e.handlePointerCancel),r.removeEventListener("keypress",e.handleKeyPress),r.removeEventListener("keydown",e.handleKeyDown)),document.removeEventListener("keyup",e.handleKeyUp),document.removeEventListener("pointerlockchange",e.handlePointerLockChange),a.clear(),o=0};function m(t,r,n){(r&~n&1)!=0&&e.leftButtonReleaseEvent(t),(r&~n&4)!=0&&e.middleButtonReleaseEvent(t),(r&~n&2)!=0&&e.rightButtonReleaseEvent(t),(~r&n&1)!=0&&e.leftButtonPressEvent(t),(~r&n&4)!=0&&e.middleButtonPressEvent(t),(~r&n&2)!=0&&e.rightButtonPressEvent(t)}function f(){t._view&&t.enabled&&t.enableRender&&(t.inRender=!0,t._view.traverseAllPasses(),t.inRender=!1),e.invokeRenderEvent()}e.unbindEvents=()=>{p(),r.setContainer(null)},e.handleKeyPress=t=>{let r=d(t);e.keyPressEvent(r)},e.handleKeyDown=t=>{let r=d(t);e.keyDownEvent(r)},e.handleKeyUp=t=>{let r=d(t);e.keyUpEvent(r)},e.handlePointerEnter=t=>{let r={...u(t),position:l(t),deviceType:c(t)};e.pointerEnterEvent(r),"mouse"===r.deviceType&&e.mouseEnterEvent(r)},e.handlePointerLeave=t=>{let r={...u(t),position:l(t),deviceType:c(t)};e.pointerLeaveEvent(r),"mouse"===r.deviceType&&e.mouseLeaveEvent(r)},e.handlePointerDown=r=>{if(!(r.button>2||e.isPointerLocked()))switch(t.preventDefaultOnPointerDown&&eeP(r),r.target.hasPointerCapture(r.pointerId)&&r.target.releasePointerCapture(r.pointerId),t.container.setPointerCapture(r.pointerId),a.has(r.pointerId)&&eeC("[RenderWindowInteractor] duplicate pointerId detected"),a.set(r.pointerId,{pointerId:r.pointerId,position:l(r)}),r.pointerType){case"pen":case"touch":e.handleTouchStart(r);break;default:e.handleMouseDown(r),o=r.buttons}},e.handlePointerUp=r=>{if(a.has(r.pointerId))switch(t.preventDefaultOnPointerUp&&eeP(r),a.delete(r.pointerId),t.container.releasePointerCapture(r.pointerId),r.pointerType){case"pen":case"touch":e.handleTouchEnd(r);break;default:{let t=[1,4,2][r.button]??0;m({...u(r),position:l(r),deviceType:c(r)},o&~t,r.buttons&~t),e.handleMouseUp(r),o=r.buttons}}},e.handlePointerCancel=t=>{if(a.has(t.pointerId))switch(a.delete(t.pointerId),t.pointerType){case"pen":case"touch":e.handleTouchEnd(t);break;default:m({...u(t),position:l(t),deviceType:c(t)},o,0),o=0}},e.handlePointerMove=t=>{switch(a.has(t.pointerId)&&(a.get(t.pointerId).position=l(t)),t.pointerType){case"pen":case"touch":e.handleTouchMove(t);break;default:{let r=t.buttons;r!==o&&(m({...u(t),position:l(t),deviceType:c(t)},o,r),o=r),e.handleMouseMove(t)}}},e.handleMouseDown=t=>{let r={...u(t),position:l(t),deviceType:c(t)};switch(t.button){case 0:e.leftButtonPressEvent(r);break;case 1:e.middleButtonPressEvent(r);break;case 2:e.rightButtonPressEvent(r);break;default:eek(`Unknown mouse button pressed: ${t.button}`)}},e.requestPointerLock=()=>{if(t.container)return t.container.requestPointerLock()},e.exitPointerLock=()=>document.exitPointerLock?.(),e.isPointerLocked=()=>!!t.container&&document.pointerLockElement===t.container,e.handlePointerLockChange=()=>{e.isPointerLocked()?e.startPointerLockEvent():e.endPointerLockEvent()},e.requestAnimation=r=>{void 0===r?eek("undefined requester, can not start animating"):n.has(r)?eeC("requester is already registered for animating"):(n.add(r),t.animationRequest||1!==n.size||t.xrAnimation||(t._animationStartTime=Date.now(),t._animationFrameCount=0,t.animationRequest=requestAnimationFrame(e.handleAnimation),e.startAnimationEvent()))},e.extendAnimation=r=>{let a=Date.now()+r;t._animationExtendedEnd=Math.max(t._animationExtendedEnd,a),t.animationRequest||0!==n.size||t.xrAnimation||(t._animationStartTime=Date.now(),t._animationFrameCount=0,t.animationRequest=requestAnimationFrame(e.handleAnimation),e.startAnimationEvent())},e.isAnimating=()=>t.xrAnimation||null!==t.animationRequest,e.cancelAnimation=(r,a=!1)=>{if(!n.has(r)){a||eeC(`${r&&r.getClassName?r.getClassName():r} did not request an animation`);return}n.delete(r),t.animationRequest&&0===n.size&&Date.now()>t._animationExtendedEnd&&(cancelAnimationFrame(t.animationRequest),t.animationRequest=null,e.endAnimationEvent(),e.render())},e.switchToXRAnimation=()=>{t.animationRequest&&(cancelAnimationFrame(t.animationRequest),t.animationRequest=null),t.xrAnimation=!0},e.returnFromXRAnimation=()=>{t.xrAnimation=!1,0!==n.size&&(t.recentAnimationFrameRate=10,t.animationRequest=requestAnimationFrame(e.handleAnimation))},e.updateXRGamepads=(r,n,a)=>{r.inputSources.forEach(r=>{let i=null==r.gripSpace?null:n.getPose(r.gripSpace,a),o=null==r.gripSpace?null:n.getPose(r.targetRaySpace,a),s=r.gamepad,l=r.handedness;if(s){s.index in t.lastGamepadValues||(t.lastGamepadValues[s.index]={left:{buttons:{}},right:{buttons:{}},none:{buttons:{}}});for(let n=0;n<s.buttons.length;++n)n in t.lastGamepadValues[s.index][l].buttons||(t.lastGamepadValues[s.index][l].buttons[n]=!1),t.lastGamepadValues[s.index][l].buttons[n]!==s.buttons[n].pressed&&null!=i&&(e.button3DEvent({gamepad:s,position:i.transform.position,orientation:i.transform.orientation,targetPosition:o.transform.position,targetOrientation:o.transform.orientation,pressed:s.buttons[n].pressed,device:"left"===r.handedness?eew.LeftController:eew.RightController,input:eeT[s.mapping]&&eeT[s.mapping][n]?eeT[s.mapping][n]:eex.Trigger}),t.lastGamepadValues[s.index][l].buttons[n]=s.buttons[n].pressed),t.lastGamepadValues[s.index][l].buttons[n]&&null!=i&&e.move3DEvent({gamepad:s,position:i.transform.position,orientation:i.transform.orientation,targetPosition:o.transform.position,targetOrientation:o.transform.orientation,device:"left"===r.handedness?eew.LeftController:eew.RightController})}})},e.handleMouseMove=r=>{let n={...u(r),position:l(r),deviceType:c(r)};0===t.moveTimeoutID?e.startMouseMoveEvent(n):(e.mouseMoveEvent(n),clearTimeout(t.moveTimeoutID)),t.moveTimeoutID=setTimeout(()=>{e.endMouseMoveEvent(),t.moveTimeoutID=0},200)},e.handleAnimation=()=>{let r=Date.now();t._animationFrameCount++,r-t._animationStartTime>1e3&&t._animationFrameCount>1&&(t.recentAnimationFrameRate=1e3*(t._animationFrameCount-1)/(r-t._animationStartTime),t.lastFrameTime=1/t.recentAnimationFrameRate,e.animationFrameRateUpdateEvent(),t._animationStartTime=r,t._animationFrameCount=1),e.animationEvent(),f(),n.size>0||Date.now()<t._animationExtendedEnd?t.animationRequest=requestAnimationFrame(e.handleAnimation):(cancelAnimationFrame(t.animationRequest),t.animationRequest=null,e.endAnimationEvent(),e.render())},e.handleWheel=r=>{eeP(r);let n={...eeM(r),...u(r),position:l(r),deviceType:c(r)};0===t.wheelTimeoutID&&(i=Math.abs(n.spinY)>=.3?Math.abs(n.spinY):1),n.spinY/=i,0===t.wheelTimeoutID?(e.startMouseWheelEvent(n),e.mouseWheelEvent(n)):(e.mouseWheelEvent(n),clearTimeout(t.wheelTimeoutID)),t.mouseScrollDebounceByPass?(e.extendAnimation(600),e.endMouseWheelEvent(),t.wheelTimeoutID=0):t.wheelTimeoutID=setTimeout(()=>{e.extendAnimation(600),e.endMouseWheelEvent(),t.wheelTimeoutID=0},200)},e.handleMouseUp=t=>{let r={...u(t),position:l(t),deviceType:c(t)};switch(t.button){case 0:e.leftButtonReleaseEvent(r);break;case 1:e.middleButtonReleaseEvent(r);break;case 2:e.rightButtonReleaseEvent(r);break;default:eek(`Unknown mouse button released: ${t.button}`)}},e.handleTouchStart=r=>{let n=[...a.values()];if(t.recognizeGestures&&n.length>1){let t=ee_(a);if(2===n.length){let t={...u(eeE),position:n[0].position,deviceType:c(r)};e.leftButtonReleaseEvent(t)}e.recognizeGesture("TouchStart",t)}else if(1===n.length){let t={...u(eeE),position:l(r),deviceType:c(r)};e.leftButtonPressEvent(t)}},e.handleTouchMove=r=>{let n=[...a.values()];if(t.recognizeGestures&&n.length>1){let t=ee_(a);e.recognizeGesture("TouchMove",t)}else if(1===n.length){let t={...u(eeE),position:n[0].position,deviceType:c(r)};e.mouseMoveEvent(t)}},e.handleTouchEnd=r=>{let n=[...a.values()];if(t.recognizeGestures)if(0===n.length){let t={...u(eeE),position:l(r),deviceType:c(r)};e.leftButtonReleaseEvent(t)}else if(1===n.length){let t=ee_(a);e.recognizeGesture("TouchEnd",t);let i={...u(eeE),position:n[0].position,deviceType:c(r)};e.leftButtonPressEvent(i)}else{let t=ee_(a);e.recognizeGesture("TouchMove",t)}else if(1===n.length){let t={...u(eeE),position:n[0].position,deviceType:c(r)};e.leftButtonReleaseEvent(t)}},e.setView=r=>{t._view!==r&&(t._view=r,t._view.getRenderable().setInteractor(e),e.modified())},e.getFirstRenderer=()=>t._view?.getRenderable()?.getRenderersByReference()?.[0],e.findPokedRenderer=(e=0,r=0)=>{if(!t._view)return null;let n=t._view?.getRenderable()?.getRenderers();if(!n||0===n.length)return null;n.sort((e,t)=>e.getLayer()-t.getLayer());let a=null,i=null,o=null,s=n.length;for(;s--;){let l=n[s];if(t._view.isInViewport(e,r,l)&&l.getInteractive()){o=l;break}null===a&&l.getInteractive()&&(a=l),null===i&&t._view.isInViewport(e,r,l)&&(i=l)}return null===o&&(o=a),null===o&&(o=i),null==o&&(o=n[0]),o},e.render=()=>{e.isAnimating()||t.inRender||f()},eeI.forEach(r=>{let n=r.charAt(0).toLowerCase()+r.slice(1);e[`${n}Event`]=n=>{if(!t.enabled)return;if(!e.getCurrentRenderer())return void eeS(`
879
879
  Can not forward events without a current renderer on the interactor.
880
880
  `);let a={type:r,pokedRenderer:t.currentRenderer,firstRenderer:e.getFirstRenderer(),...n};e[`invoke${r}`](a)}}),e.recognizeGesture=(r,n)=>{if(Object.keys(n).length>2)return;if(t.startingEventPositions||(t.startingEventPositions={}),"TouchStart"===r){Object.keys(n).forEach(e=>{t.startingEventPositions[e]=n[e]}),t.currentGesture="Start";return}if("TouchEnd"===r){"Pinch"===t.currentGesture&&(e.render(),e.endPinchEvent()),"Rotate"===t.currentGesture&&(e.render(),e.endRotateEvent()),"Pan"===t.currentGesture&&(e.render(),e.endPanEvent()),t.currentGesture="Start",t.startingEventPositions={};return}let a=0,i=[],o=[];Object.keys(n).forEach(e=>{i[a]=n[e],o[a]=t.startingEventPositions[e],a++});let s=Math.sqrt((o[0].x-o[1].x)*(o[0].x-o[1].x)+(o[0].y-o[1].y)*(o[0].y-o[1].y)),l=Math.sqrt((i[0].x-i[1].x)*(i[0].x-i[1].x)+(i[0].y-i[1].y)*(i[0].y-i[1].y)),u=jV(Math.atan2(o[1].y-o[0].y,o[1].x-o[0].x)),d=jV(Math.atan2(i[1].y-i[0].y,i[1].x-i[0].x)),c=d-u;Math.abs((d=d+180>=360?d-180:d+180)-(u=u+180>=360?u-180:u+180))<Math.abs(c)&&(c=d-u);let h=[];if(h[0]=(i[0].x-o[0].x+i[1].x-o[1].x)/2,h[1]=(i[0].y-o[0].y+i[1].y-o[1].y)/2,"TouchMove"===r)if("Start"===t.currentGesture){let r=.01*Math.sqrt(t.container.clientWidth*t.container.clientWidth+t.container.clientHeight*t.container.clientHeight);r<15&&(r=15);let a=Math.abs(l-s),i=3.1415926*l*Math.abs(c)/360,o=Math.sqrt(h[0]*h[0]+h[1]*h[1]);a>r&&a>i&&a>o?(t.currentGesture="Pinch",e.startPinchEvent({scale:1,touches:n})):i>r&&i>o?(t.currentGesture="Rotate",e.startRotateEvent({rotation:0,touches:n})):o>r&&(t.currentGesture="Pan",e.startPanEvent({translation:[0,0],touches:n}))}else{if("Rotate"===t.currentGesture){let t={rotation:c,touches:n};e.rotateEvent(t)}"Pinch"===t.currentGesture&&e.pinchEvent({scale:l/s,touches:n}),"Pan"===t.currentGesture&&e.panEvent({translation:h,touches:n})}},e.handleVisibilityChange=()=>{t._animationStartTime=Date.now(),t._animationFrameCount=0},e.setCurrentRenderer=e=>{t._forcedRenderer=!!e,t.currentRenderer=e},e.setContainer=e=>{p();let t=r.setContainer(e??null);return t&&h(),t},e.delete=()=>{for(;n.size;)e.cancelAnimation(n.values().next().value);void 0!==document.hidden&&document.removeEventListener("visibilitychange",e.handleVisibilityChange),t.container&&e.setContainer(null),r.delete()},void 0!==document.hidden&&document.addEventListener("visibilitychange",e.handleVisibilityChange,!1)}(e,t)}var eeA={newInstance:jS.newInstance(eeO,"vtkRenderWindowInteractor"),extend:eeO,handledEvents:eeI,...eeb},eeR={mapper:null,backfaceProperty:null,forceOpaque:!1,forceTranslucent:!1};function eeL(e,t,r={}){let n;Object.assign(t,eeR,r),HT(e,t,r),t.boundsMTime={},jS.obj(t.boundsMTime),jS.setGet(e,t,["backfaceProperty","forceOpaque","forceTranslucent","mapper"]),t.classHierarchy.push("vtkActor"),n={...e},e.getActors=()=>[e],e.getIsOpaque=()=>{if(t.forceOpaque)return!0;if(t.forceTranslucent)return!1;t.properties[0]||e.getProperty();let r=t.properties[0].getOpacity()>=1;return(r=r&&(!t.texture||!t.texture.isTranslucent()))&&(!t.mapper||t.mapper.getIsOpaque())},e.hasTranslucentPolygonalGeometry=()=>null!==t.mapper&&(t.properties[0]||e.getProperty(),!e.getIsOpaque()),e.makeProperty=$0.newInstance,e.getMTime=()=>{let e=n.getMTime();if(null!==t.backfaceProperty){let r=t.backfaceProperty.getMTime();e=r>e?r:e}return e},e.getRedrawMTime=()=>{let e=t.mtime;if(null!==t.mapper){let r=t.mapper.getMTime();e=r>e?r:e,null!==t.mapper.getInput()&&(t.mapper.getInputAlgorithm().update(),e=(r=t.mapper.getInput().getMTime())>e?r:e)}return e},e.getSupportsSelection=()=>!!t.mapper&&t.mapper.getSupportsSelection(),e.processSelectorPixelBuffers=(e,r)=>{t.mapper&&t.mapper.processSelectorPixelBuffers&&t.mapper.processSelectorPixelBuffers(e,r)}}var eeN=jS.newInstance(eeL,"vtkActor");let eeV={background:[0,0,0],container:null};jS.newInstance(function(e,t,r={}){let n;Object.assign(t,eeV,r),jS.obj(e,t),jS.get(e,t,["renderWindow","openGLRenderWindow","interactor","container"]),jS.event(e,t,"resize"),n=e.invokeResize,delete e.invokeResize,t.renderWindow=JO(),t.rendererMap={},t.openGLRenderWindow=ees(),t.renderWindow.addView(t.openGLRenderWindow),t.interactor=eeA.newInstance(),t.interactor.setView(t.openGLRenderWindow),t.interactor.initialize(),e.addRenderer=({viewport:e,id:r,background:n})=>{let a=eev({viewport:e,background:n||t.background});t.renderWindow.addRenderer(a),t.rendererMap[r]=a},e.destroy=()=>{t.renderWindow.getInteractor().delete()},e.removeRenderer=r=>{let n=e.getRenderer(r);t.renderWindow.removeRenderer(n),n.delete(),delete t.rendererMap[r]},e.getRenderer=e=>t.rendererMap[e],e.getRenderers=()=>{let{rendererMap:e}=t;return Object.keys(e).map(t=>({id:t,renderer:e[t]}))},e.resize=()=>{if(t.container){let{width:e,height:r}=t.container;t.openGLRenderWindow.setSize(Math.floor(e),Math.floor(r)),n(),t.renderWindow.render()}},e.setContainer=e=>{t.container=e,t.openGLRenderWindow.setContainer(t.container)},e.delete=jS.chain(e.setContainer,e.destroy,t.openGLRenderWindow.delete,e.delete),e.resize()});var eeF={MIN:0,MAX:1,MEAN:2,SUM:3},{SlabTypes:eeB}={SlabTypes:eeF},{staticOffsetAPI:eej,otherStaticMethods:eeW}=Hr;function eeU(e,t,r={}){Object.assign(t,{slabThickness:0,slabTrapezoidIntegration:0,slabType:eeB.MEAN,slicePlane:null,slicePolyData:null,...r}),Hh(e,t,r),jS.setGet(e,t,["slabThickness","slabTrapezoidIntegration","slabType","slicePlane","slicePolyData"]),Hr.implementCoincidentTopologyMethods(e,t),t.classHierarchy.push("vtkImageResliceMapper"),e.computeBounds=()=>{let r=e.getInputData();e.getSlicePolyData()?UP(t.bounds,e.getSlicePolyData().getBounds()):r?(UP(t.bounds,r.getBounds()),e.getSlicePlane()&&Uq(t.bounds,e.getSlicePlane().getOrigin(),e.getSlicePlane().getNormal())):U_(t.bounds)}}var eez={newInstance:jS.newInstance(eeU,"vtkImageResliceMapper"),extend:eeU,...eej,...eeW};let eeH={scalarTexture:null},eeG=jS.newInstance(function(e,t,r={}){let n;Object.assign(t,eeH,r),eez.extend(e,t,r),jS.setGet(e,t,["scalarTexture"]),t.classHierarchy.push("vtkSharedImageResliceMapper"),n=e.delete,e.delete=()=>{t.scalarTexture=null,n()}},"vtkSharedImageResliceMapper");var{BlendMode:eeq}=NZ,ee$=["getAnisotropy","getComputeNormalFromOpacity","getFilterMode","getFilterModeAsString","getGlobalIlluminationReach","getIpScalarRange","getIpScalarRangeByReference","getLAOKernelRadius","getLAOKernelSize","getLocalAmbientOcclusion","getPreferSizeOverAccuracy","getVolumetricScatteringBlending","setAnisotropy","setAverageIPScalarRange","setComputeNormalFromOpacity","setFilterMode","setFilterModeToNormalized","setFilterModeToOff","setFilterModeToRaw","setGlobalIlluminationReach","setIpScalarRange","setIpScalarRangeFrom","setLAOKernelRadius","setLAOKernelSize","setLocalAmbientOcclusion","setPreferSizeOverAccuracy","setVolumetricScatteringBlending"];function eeK(e,t,r={}){let n;Object.assign(t,{bounds:[...UK],sampleDistance:1,imageSampleDistance:1,maximumSamplesPerRay:1e3,autoAdjustSampleDistances:!0,initialInteractionScale:1,interactionSampleDistanceFactor:1,blendMode:eeq.COMPOSITE_BLEND,volumeShadowSamplingDistFactor:5,colorTextureWidth:1024,opacityTextureWidth:1024,labelOutlineTextureWidth:1024,...r}),Hd(e,t,r),jS.setGet(e,t,["sampleDistance","imageSampleDistance","maximumSamplesPerRay","autoAdjustSampleDistances","initialInteractionScale","interactionSampleDistanceFactor","blendMode","volumeShadowSamplingDistFactor","colorTextureWidth","opacityTextureWidth","labelOutlineTextureWidth"]),jS.event(e,t,"lightingActivated"),t.classHierarchy.push("vtkVolumeMapper"),n={...e},e.computeBounds=()=>{let r=e.getInputData();r?(t.static||e.update(),UP(t.bounds,r.getBounds())):U_(t.bounds)},e.setBlendModeToComposite=()=>{e.setBlendMode(eeq.COMPOSITE_BLEND)},e.setBlendModeToMaximumIntensity=()=>{e.setBlendMode(eeq.MAXIMUM_INTENSITY_BLEND)},e.setBlendModeToMinimumIntensity=()=>{e.setBlendMode(eeq.MINIMUM_INTENSITY_BLEND)},e.setBlendModeToAverageIntensity=()=>{e.setBlendMode(eeq.AVERAGE_INTENSITY_BLEND)},e.setBlendModeToAdditiveIntensity=()=>{e.setBlendMode(eeq.ADDITIVE_INTENSITY_BLEND)},e.setBlendModeToRadonTransform=()=>{e.setBlendMode(eeq.RADON_TRANSFORM_BLEND)},e.getBlendModeAsString=()=>jS.enumToString(eeq,t.blendMode),e.setVolumeShadowSamplingDistFactor=e=>n.setVolumeShadowSamplingDistFactor(e>=1?e:1),ee$.forEach(t=>{e[t]=()=>{throw Error(`The method "volumeMapper.${t}()" doesn't exist anymore. It is a rendering property that has been moved to the volume property. Replace your code with:
881
881
  volumeActor.getProperty().${t}()
@@ -1245,7 +1245,7 @@ volumeActor.getProperty().${t}()
1245
1245
  .DicomMicroscopyViewer .ol-tooltip {
1246
1246
  font-size: 16px !important;
1247
1247
  }
1248
- `,et9="wsiViewportOverlayCss";async function et7(){return B_("dicom-microscopy-viewer")}function ere(){if(document.getElementById(et9))return;let e=document.createElement("style");e.innerText=et6,e.setAttribute("id",et9),document.getElementsByTagName("head")[0].append(e)}async function ert(e){let{imageIds:t,client:r,dicomMicroscopyViewer:n}=e,a=n||await et7(),i=null,o=t.map(e=>{let t=r.getDICOMwebMetadata(e);Object.defineProperty(t,"isMultiframe",{value:t.isMultiframe,enumerable:!1}),Object.defineProperty(t,"frameNumber",{value:void 0,enumerable:!1});let n=t["00080008"]?.Value;n?.length===1&&(t["00080008"].Value=n[0].split("\\"));let a=t["00200052"]?.Value?.[0];return i?a!==i&&(t["00200052"].Value=[i]):i=a,t}),s=[];return o.forEach(e=>{let t=new a.metadata.VLWholeSlideMicroscopyImage({metadata:e}),r=t.ImageType[2];("VOLUME"===r||"THUMBNAIL"===r)&&s.push(t)}),{volumeImages:s,metadataDicomweb:o,metadata:function(e){let{metadataDicomweb:t,imageIds:r,imageIndex:n=0}=e,a=t.reduce((e,t)=>e?.NumberOfFrames<t.NumberOfFrames?t:e),{TotalPixelMatrixColumns:i,TotalPixelMatrixRows:o,ImageOrientationSlide:s,ImagedVolumeWidth:l,ImagedVolumeHeight:u,ImagedVolumeDepth:d}=a,c=HB(FC.IMAGE_PLANE,r[n]),h=s.slice(0,3),p=s.slice(3,6);(null==h||null==p)&&(h=[1,0,0],p=[0,1,0]);let m=Lv.vec3.fromValues(h[0],h[1],h[2]),f=Lv.vec3.fromValues(p[0],p[1],p[2]),g=Lv.vec3.create();Lv.vec3.cross(g,m,f);let{XOffsetInSlideCoordinateSystem:y=0,YOffsetInSlideCoordinateSystem:v=0,ZOffsetInSlideCoordinateSystem:b=0}=a.TotalPixelMatrixOriginSequence?.[0]||{};return{bitsAllocated:8,numberOfComponents:3,origin:[y,v,b],direction:[...m,...f,...g],dimensions:[i,o,1],spacing:[l/i,u/o,d],hasPixelSpacing:!!(l&&u),numVoxels:i*o*1,imagePlaneModule:c}}({metadataDicomweb:s,imageIds:t}),frameOfReferenceUID:i,imageURISet:new Set(t.map(e=>Gk(e)))}}let err=null,ern="CORNERSTONE_TOOLS_ANNOTATION_REMOVED",era=class e extends GN{constructor(e){super({...e,canvas:e.canvas||GK(e.element)}),this.imageURISet=new Set,this.internalCamera={rotation:0,centerIndex:[0,0],extent:[0,-2,1,-1],xSpacing:1,ySpacing:1,resolution:1,zoom:1},this.annotationRemovedListener=e=>{let{detail:t}=e,r=t?.annotation?.metadata;if(!r)return void this.postrender();let n=r.referencedImageURI??(r.referencedImageId?Gk(r.referencedImageId):null);if(n&&!this.hasImageURI(n))return;let a=r.FrameOfReferenceUID??null;a&&a!==this.frameOfReferenceUID||this.postrender()},this.voiRange={lower:0,upper:255},this.getProperties=()=>({voiRange:{...this.voiRange}}),this.resetCamera=()=>!0,this.getNumberOfSlices=()=>1,this.getFrameOfReferenceUID=()=>this.frameOfReferenceUID,this.resize=()=>{let e=this.canvas,{clientWidth:t,clientHeight:r}=e;(e.width!==t||e.height!==r)&&(e.width=t,e.height=r),this.refreshRenderValues()},this.canvasToWorld=e=>{if(!this.metadata)return;let t=this.canvasToIndex(e);return t[1]=-t[1],this.indexToWorld(t)},this.worldToCanvas=e=>{if(!this.metadata)return;let t=this.worldToIndex(e);return t[1]=-t[1],this.indexToCanvas([t[0],t[1],0])},this.postrender=()=>{this.refreshRenderValues(),Bh(this.element,NH.IMAGE_RENDERED,{element:this.element,viewportId:this.id,viewport:this,renderingEngineId:this.renderingEngineId})},this.getRotation=()=>0,this.canvasToIndex=e=>{let t=this.getTransform();t.invert();let r=t.transformPoint(e);return[r[0],r[1],0]},this.indexToCanvas=e=>this.getTransform().transformPoint([e[0],e[1]]),this.customRenderViewportToCanvas=()=>{},this.getImageIds=()=>[this.imageIds[0]],this.renderingEngineId=e.renderingEngineId,this.element.setAttribute("data-viewport-uid",this.id),this.element.setAttribute("data-rendering-engine-uid",this.renderingEngineId),this.element.style.position="relative",this.microscopyElement=document.createElement("div"),this.microscopyElement.setAttribute("class","DicomMicroscopyViewer"),this.microscopyElement.id=F2(),this.microscopyElement.innerText="Initial",this.microscopyElement.style.background="grey",this.microscopyElement.style.width="100%",this.microscopyElement.style.height="100%",this.microscopyElement.style.position="absolute",this.microscopyElement.style.left="0",this.microscopyElement.style.top="0";const t=this.element.firstElementChild;t.insertBefore(this.microscopyElement,t.childNodes[1]),this.addEventListeners(),this.addWidget("DicomMicroscopyViewer",{getEnabled:()=>!!this.viewer,setEnabled:()=>{this.elementDisabledHandler()}}),this.resize()}static get useCustomRenderingPipeline(){return!0}addEventListeners(){this.canvas.addEventListener(NH.ELEMENT_DISABLED,this.elementDisabledHandler),Bc.addEventListener(ern,this.annotationRemovedListener)}removeEventListeners(){this.canvas.removeEventListener(NH.ELEMENT_DISABLED,this.elementDisabledHandler),Bc.removeEventListener(ern,this.annotationRemovedListener)}elementDisabledHandler(){this.removeEventListeners(),this.viewer?.cleanup(),this.viewer=null,this.element.firstElementChild.removeChild(this.microscopyElement),this.microscopyElement=null,this.imageURISet.clear()}async setFrameNumber(e){}setProperties(e){e.voiRange&&this.setVOI(e.voiRange)}resetProperties(){this.setProperties({voiRange:{lower:0,upper:255}})}setVOI(e){this.voiRange=e;let t=this.setColorTransform(e,this.averageWhite);this.map.getViewport().querySelectorAll(".ol-layers canvas").forEach(e=>{e.style.filter=t})}setAverageWhite(e){this.averageWhite=e,this.setColorTransform(this.voiRange,e)}getScalarData(){return null}computeTransforms(){let e=Lv.mat4.create(),t=Lv.mat4.create();return Lv.mat4.fromTranslation(e,this.metadata.origin),e[0]=this.metadata.direction[0],e[1]=this.metadata.direction[1],e[2]=this.metadata.direction[2],e[4]=this.metadata.direction[3],e[5]=this.metadata.direction[4],e[6]=this.metadata.direction[5],e[8]=this.metadata.direction[6],e[9]=this.metadata.direction[7],e[10]=this.metadata.direction[8],Lv.mat4.scale(e,e,this.metadata.spacing),Lv.mat4.invert(t,e),{indexToWorld:e,worldToIndex:t}}getImageData(){let{metadata:e}=this;if(!e)return null;let{spacing:t}=e;return{dimensions:e.dimensions,spacing:t,numberOfComponents:3,origin:e.origin,direction:e.direction,metadata:{Modality:this.modality,FrameOfReferenceUID:this.frameOfReferenceUID},hasPixelSpacing:this.hasPixelSpacing,calibration:this.calibration,preScale:{scaled:!1},scalarData:this.getScalarData(),imageData:{getDirection:()=>e.direction,getDimensions:()=>e.dimensions,getRange:()=>[0,255],getScalarData:()=>this.getScalarData(),getSpacing:()=>e.spacing,worldToIndex:e=>this.worldToIndex(e),indexToWorld:e=>this.indexToWorld(e)}}}hasImageURI(e){return!!e&&this.imageURISet.has(e)}setCamera(e){let t=this.getCamera(),{parallelScale:r,focalPoint:n}=e,a=this.getView(),{xSpacing:i}=this.internalCamera;if(r){let e=this.element.clientHeight/r;a.setResolution?.(1/i/e)}if(n){let e=this.worldToCanvas(n),t=this.canvasToIndex(e);a.setCenter([t[0],t[1]])}let o=this.getCamera();this.triggerCameraModifiedEventIfNecessary(t,o)}getCurrentImageId(){return this.imageIds[0]}getFrameNumber(){return 1}getCamera(){this.refreshRenderValues();let{resolution:e,xSpacing:t,centerIndex:r}=this.internalCamera,n=this.indexToCanvas([r[0],r[1],0]),a=this.canvasToWorld(n);return{parallelProjection:!0,focalPoint:a,position:a,viewUp:[0,-1,0],parallelScale:this.element.clientHeight*(e*t),viewPlaneNormal:[0,0,1]}}worldToIndexWSI(e){if(!err)return;let t=this.viewer.getAffine(),r=err.applyInverseTransform({coordinate:[e[0],e[1]],affine:t});return[r[0],r[1]]}indexToWorldWSI(e){if(!err)return;let t=err.applyTransform({coordinate:[e[0],e[1]],affine:this.viewer.getAffine()});return[t[0],t[1],0]}worldToIndex(e){let{worldToIndex:t}=this.computeTransforms(),r=Lv.vec3.create();return Lv.vec3.transformMat4(r,e,t),r}indexToWorld(e){let{indexToWorld:t}=this.computeTransforms(),r=Lv.vec3.create(),n=Lv.vec3.fromValues(...e);return Lv.vec3.transformMat4(r,n,t),[r[0],r[1],r[2]]}setDataList(e){if(!e.length)return;let{dataId:t}=e[0],r=HB("genericViewportDisplaySet",t);return r?.imageIds?this.setDataIds(r.imageIds,{webClient:r.options?.webClient}):this.setDataIds([t])}setDataIds(e,t){t?.miniNavigationOverlay!==!1&&ere();let r=t?.webClient||HB(FC.WADO_WEB_CLIENT,e[0]);if(!r)throw Error(`To use setDataIds on WSI data, you must provide metaData.webClient for ${e[0]}.`);return this.setWSI(e,r)}async setWSI(e,t){this.clearDisplaySets(),this.microscopyElement.style.background="black",this.microscopyElement.innerText="Loading",this.imageIds=e;let r=await et7();err||=r.utils;let n=await ert({imageIds:this.imageIds,client:t,dicomMicroscopyViewer:r});this.imageURISet=n.imageURISet,this.frameOfReferenceUID=n.frameOfReferenceUID,this.metadata=n.metadata,this.hasPixelSpacing=n.metadata.hasPixelSpacing;let a=new r.viewer.VolumeImageViewer({client:t,metadata:n.volumeImages,controls:["overview","position"],retrieveRendered:!1,bindings:{}});a.render({container:this.microscopyElement}),a.deactivateDragPanInteraction(),this.viewer=a,this.map=a.getMap(),this.map.on("postrender",this.postrender),this.resize(),this.microscopyElement.innerText="",Object.assign(this.microscopyElement.style,{"--ol-partial-background-color":"rgba(127, 127, 127, 0.7)","--ol-foreground-color":"#000000","--ol-subtle-foreground-color":"#000","--ol-subtle-background-color":"rgba(78, 78, 78, 0.5)",background:"none"})}async setDisplaySets(...t){await this.mountDisplaySets(t,async t=>{let r=HZ(t.displaySetId);if(!r?.imageIds?.length||!r.options?.webClient)throw Error(`[WSIViewport] No registered WSI dataset (imageIds + webClient) for display set ${t.displaySetId}`);!1!==r.options.miniNavigationOverlay&&ere(),await e.prototype.setWSI.call(this,r.imageIds,r.options.webClient)})}scroll(e){let t=this.getCamera();this.setCamera({parallelScale:t.parallelScale*(1+.1*e)})}getSliceIndex(){return 0}getView(){if(!this.viewer)return;let e=this.viewer.getMap(),t=window;return t.map=e,t.viewer=this.viewer,t.view=e?.getView(),t.wsi=this,e?.getView()}refreshRenderValues(){let e=this.getView();if(!e)return;let t=e.getResolution();if(!t||t<FP)return;let r=e.getCenter(),n=e.getProjection().getExtent(),a=e.getRotation(),i=e.getZoom(),{metadata:{spacing:[o,s]}}=this;Object.assign(this.internalCamera,{extent:n,centerIndex:r,worldToCanvasRatio:1/t/o,xSpacing:o,ySpacing:s,resolution:t,rotation:a,zoom:i})}getZoom(){return this.getView()?.getZoom()}setZoom(e){this.getView()?.setZoom(e)}getTransform(){this.refreshRenderValues();let{centerIndex:e,resolution:t,rotation:r}=this.internalCamera,n=[this.canvas.width/2,this.canvas.height/2],a=new GB;return a.translate(n[0],n[1]),a.rotate(r),a.scale(1/t,-1/t),a.translate(-e[0],-e[1]),a}getViewReferenceId(){return`imageId:${this.getCurrentImageId()}`}getCurrentImageIdIndex(){return 0}},eri="#000000";async function ero(e){let t=HB(FC.ECG,e);if(!t?.waveformData?.retrieveBulkData)throw Error(`[ECG] No ECG waveform data for ${e}`);let{numberOfWaveformChannels:r,numberOfWaveformSamples:n,samplingFrequency:a,waveformBitsAllocated:i=16,waveformSampleInterpretation:o="SS",multiplexGroupLabel:s,channelDefinitionSequence:l=[]}=t,u=await t.waveformData.retrieveBulkData(),d=HB(FC.CALIBRATION,e),c=[];for(let e=0;e<r;e++){let t=l[e]||{},r=t.channelSourceSequence?.codeMeaning||t.ChannelSourceSequence?.CodeMeaning||`Channel ${e+1}`,n=u[e]||new Int16Array(0),{min:a,max:i}=function(e){let t=0,r=0;for(let n=0;n<e.length;n++)e[n]<t&&(t=e[n]),e[n]>r&&(r=e[n]);return{min:t,max:r}}(n);c.push({name:r,data:n,min:a,max:i})}return{waveform:{channels:c,numberOfChannels:r,numberOfSamples:n,samplingFrequency:a,bitsAllocated:i,sampleInterpretation:o,multiplexGroupLabel:s,calibration:d},calibration:d}}function ers(e,t){if(!t)return e.filter(e=>e.data.length>0);let r=new Set(t);return e.filter((t,n)=>r.has(n)&&e[n].data.length>0)}function erl(e){return e.filter(e=>!1!==e.visible&&e.data.length>0)}function eru(e,t){let r=0;return e.forEach(e=>{r+=(e.max-e.min)*t*1.25+5}),r||1}function erd(e){let{visibleChannels:t,channelScale:r}=e,n=[],a=0;return t.forEach(e=>{let t=(e.max-e.min)*r*1.25,i=(a+=t+5)+e.min*r;n.push({channel:e,itemHeight:t,yOffset:a,baseline:i})}),n}function erc(e,t,r){if(r?.showGrid===!1||t.channelScale<=0)return;let{ecgWidth:n,ecgHeight:a,channelScale:i}=t,o=100;for(;o*i<8;)o*=2;let s=o*i,l=5*s;e.strokeStyle="#3f0000",e.lineWidth=.5,e.beginPath();for(let t=s;t<=a;t+=s)Math.round(t/s)%5!=0&&(e.moveTo(0,t),e.lineTo(n,t));for(let t=6;t<=n;t+=6)Math.round(t/6)%5!=0&&(e.moveTo(t,0),e.lineTo(t,a));e.stroke(),e.strokeStyle="#7f0000",e.lineWidth=1,e.beginPath();for(let t=l;t<=a;t+=l)e.moveTo(0,t),e.lineTo(n,t);for(let t=30;t<=n;t+=30)e.moveTo(t,0),e.lineTo(t,a);e.stroke()}function erh(e){let{ctx:t,layouts:r,ecgWidth:n,channelScale:a,startIndex:i=0,endIndex:o,lineWidth:s=1,amplitudeScale:l=1}=e;r.forEach(({channel:e,baseline:r})=>{let u=Math.min(o??e.data.length,e.data.length),d=Math.max(0,Math.min(i,u-1)),c=Math.max(1,u-d);t.strokeStyle="#7f4c00",t.lineWidth=2,t.beginPath(),t.moveTo(0,r),t.lineTo(n,r),t.stroke(),t.strokeStyle="#ffffff",t.lineWidth=s,t.beginPath();for(let i=d;i<u;i++){let o=(i-d)*n/c,s=r-e.data[i]*a*l;i===d?t.moveTo(o,s):t.lineTo(o,s)}t.stroke()})}function erp(e,t,r){let n=14/(r||1);t.forEach(({channel:t,itemHeight:r,yOffset:a})=>{let i=a-r+n;e.font=`${n}px monospace`;let o=e.measureText(t.name).width;e.fillStyle=eri,e.fillRect(5,i-n,o+4,n+4),e.fillStyle="#ffff00",e.fillText(t.name,5,i)})}let erm=class extends GN{constructor(e){super({...e,canvas:e.canvas||GK(e.element)}),this.imageId=null,this.channels=[],this.waveformData=null,this.ecgWidth=0,this.ecgHeight=0,this.channelScale=0,this.ecgCamera={panWorld:[0,0],parallelScale:1},this.getProperties=()=>({visibleChannels:this.channels.map((e,t)=>e.visible?t:-1).filter(e=>e>=0)}),this.resetCamera=()=>(this.refreshRenderValues(),this.canvasContext.fillRect(0,0,this.canvas.width,this.canvas.height),this.renderFrame(),!0),this.getFrameOfReferenceUID=()=>`ecg-viewport-${this.id}`,this.resize=()=>{let e=this.canvas,{clientWidth:t,clientHeight:r}=e;(e.width!==t||e.height!==r)&&(e.width=t,e.height=r),this.waveformData&&(this.computeChannelScale(),this.recalculateHeight()),this.refreshRenderValues(),this.renderFrame()},this.canvasToWorld=(e,t=[0,0,0])=>{if(!this.waveformData)return t[0]=0,t[1]=0,t[2]=0,t;let r=this.getWorldToCanvasRatio(),n=this.ecgCamera.panWorld,a=this.computeChannelLayouts(),i=[e[0]/r-n[0],e[1]/r-n[1]],o=0;for(let e=0;e<a.length;e++){let t=a[e];if(i[1]<=t.yOffset){o=e;break}e===a.length-1&&(o=e)}let s=Math.max(0,Math.min(this.waveformData.numberOfSamples-1,i[0]*this.waveformData.numberOfSamples/this.ecgWidth)),l=(a[o].baseline-i[1])/this.channelScale;return t[0]=s,t[1]=l,t[2]=o,t},this.worldToCanvas=e=>{if(!this.waveformData)return[0,0];let t=this.getWorldToCanvasRatio(),r=this.ecgCamera.panWorld,n=this.computeChannelLayouts(),a=Math.round(e[2]);if(a<0||a>=n.length)return[0,0];let i=n[a];return[e[0]/this.waveformData.numberOfSamples*this.ecgWidth*t+r[0]*t,(i.baseline-e[1]*this.channelScale)*t+r[1]*t]},this.getRotation=()=>0,this.getNumberOfSlices=()=>1,this.getCurrentImageIdIndex=()=>0,this.getCurrentImageId=()=>this.imageId,this.getSliceIndex=()=>0,this.getImageIds=()=>this.imageId?[this.imageId]:[],this.scroll=()=>{},this.customRenderViewportToCanvas=()=>{this.renderFrame()},this.renderFrame=()=>{if(!this.waveformData)return;let e=window.devicePixelRatio||1,t=this.getTransform().getMatrix(),r=this.canvasContext;r.resetTransform(),r.fillStyle=eri,r.fillRect(0,0,this.canvas.width,this.canvas.height),r.setTransform(t[0]/e,t[1]/e,t[2]/e,t[3]/e,t[4]/e,t[5]/e);let n=this.computeChannelLayouts();this.drawGrid(r),this.drawTraces(r,n),this.drawLabels(r,n),r.resetTransform(),this.setRendered(),Bh(this.element,NH.IMAGE_RENDERED,{element:this.element,viewportId:this.id,viewport:this,renderingEngineId:this.renderingEngineId})},this.getMiddleSliceData=()=>{throw Error("Method not implemented for ECG viewport.")},this.canvasContext=this.canvas.getContext("2d"),this.renderingEngineId=e.renderingEngineId,this.element.setAttribute("data-viewport-uid",this.id),this.element.setAttribute("data-rendering-engine-uid",this.renderingEngineId),this.addEventListeners(),this.resize()}static get useCustomRenderingPipeline(){return!0}addEventListeners(){this.canvas.addEventListener(NH.ELEMENT_DISABLED,this.elementDisabledHandler)}removeEventListeners(){this.canvas.removeEventListener(NH.ELEMENT_DISABLED,this.elementDisabledHandler)}elementDisabledHandler(){this.removeEventListeners()}async setEcg(e){this.clearDisplaySets(),this.imageId=e;let{waveform:t,calibration:r}=await ero(e);this.channels=t.channels.map(e=>({...e,visible:!0})),this.waveformData={...t,channels:this.channels,multiplexGroupLabel:t.multiplexGroupLabel},this.calibration=r,this.ecgWidth=Math.ceil(150*this.waveformData.numberOfSamples/this.waveformData.samplingFrequency),this.computeChannelScale(),this.recalculateHeight(),this.refreshRenderValues(),this.renderFrame()}async setDisplaySets(...e){await this.mountDisplaySets(e,async e=>{let t=HX(e.displaySetId);await this.setEcg(t)})}setChannelVisibility(e,t){e>=0&&e<this.channels.length&&(this.channels[e].visible=t,this.computeChannelScale(),this.recalculateHeight(),this.refreshRenderValues(),this.renderFrame())}getVisibleChannels(){return this.channels.map(e=>({name:e.name,visible:e.visible}))}getWaveformData(){return this.waveformData}getContentDimensions(){return{width:this.ecgWidth,height:this.ecgHeight}}computeChannelScale(){let e=erl(this.channels);if(0===e.length||0===this.ecgWidth){this.channelScale=0;return}let t=1;for(let r of e)t=Math.max(t,r.max-r.min);let r=this.canvas.offsetHeight&&this.canvas.offsetWidth?this.canvas.offsetHeight/this.canvas.offsetWidth:2/3,n=(this.ecgWidth*r-5*e.length)/e.length;this.channelScale=n/(1.25*t)}recalculateHeight(){this.ecgHeight=eru(erl(this.channels),this.channelScale)}computeChannelLayouts(){return erd({visibleChannels:erl(this.channels),channelScale:this.channelScale})}setProperties(e){if(void 0!==e.visibleChannels){for(let t=0;t<this.channels.length;t++)this.channels[t].visible=e.visibleChannels.includes(t);this.computeChannelScale(),this.recalculateHeight(),this.refreshRenderValues(),this.renderFrame()}}resetProperties(){for(let e of this.channels)e.visible=!0;this.computeChannelScale(),this.recalculateHeight(),this.refreshRenderValues(),this.renderFrame()}setCamera(e){let{parallelScale:t,focalPoint:r}=e;if(t&&(this.ecgCamera.parallelScale=this.element.clientHeight/2/t),void 0!==r){let e=this.worldToCanvas(r),t=[this.element.clientWidth/2,this.element.clientHeight/2],n=[(e[0]-t[0])/this.ecgCamera.parallelScale,(e[1]-t[1])/this.ecgCamera.parallelScale];this.ecgCamera.panWorld=[this.ecgCamera.panWorld[0]-n[0],this.ecgCamera.panWorld[1]-n[1]]}this.canvasContext.fillStyle=eri,this.canvasContext.fillRect(0,0,this.canvas.width,this.canvas.height),this.renderFrame()}getCamera(){let{parallelScale:e}=this.ecgCamera,t=[this.element.clientWidth/2,this.element.clientHeight/2];return{parallelProjection:!0,focalPoint:this.canvasToWorld(t),position:[0,0,0],viewUp:[0,-1,0],parallelScale:this.element.clientHeight/2/e,viewPlaneNormal:[0,0,1]}}getPan(){let e=this.ecgCamera.panWorld;return[e[0],e[1]]}getViewReferenceId(e){return`imageId:${this.imageId}`}hasImageURI(e){return this.imageId?.includes(e)??!1}isReferenceViewable(e){return!e.FrameOfReferenceUID||e.FrameOfReferenceUID===this.getFrameOfReferenceUID()}updateCameraClippingPlanesAndRange(){}refreshRenderValues(){if(!this.ecgWidth||!this.ecgHeight)return;let e=this.canvas.offsetWidth/this.ecgWidth;this.ecgHeight*e>this.canvas.offsetHeight&&(e=this.canvas.offsetHeight/this.ecgHeight);let t=Math.floor(this.ecgWidth*e),r=Math.floor(this.ecgHeight*e),n=(this.canvas.offsetWidth-t)/2,a=(this.canvas.offsetHeight-r)/2,i=n/e,o=a/e;this.ecgCamera.panWorld=[i,o],this.ecgCamera.parallelScale=e}getWorldToCanvasRatio(){return this.ecgCamera.parallelScale}getTransform(){let e=this.ecgCamera.panWorld,t=window.devicePixelRatio||1,r=this.getWorldToCanvasRatio(),n=1/r,a=[this.canvas.offsetWidth/2,this.canvas.offsetHeight/2],i=[a[0]*n,a[1]*n],o=new GB;return o.scale(t,t),o.translate(a[0],a[1]),o.scale(r,r),o.translate(e[0],e[1]),o.translate(-i[0],-i[1]),o}drawGrid(e){erc(e,{ecgWidth:this.ecgWidth,ecgHeight:this.ecgHeight,channelScale:this.channelScale})}drawTraces(e,t){erh({ctx:e,layouts:t,ecgWidth:this.ecgWidth,channelScale:this.channelScale})}drawLabels(e,t){erp(e,t,this.getWorldToCanvasRatio())}getImageData(){if(!this.waveformData)return null;let e=[this.waveformData.numberOfSamples,65536,this.waveformData.numberOfChannels],t=[1,1,1],r=[1,0,0,0,1,0,0,0,1];return{dimensions:e,spacing:t,origin:[0,0,0],direction:r,imageData:{getDirection:()=>r,getDimensions:()=>e,getRange:()=>[0,1],getSpacing:()=>t,worldToIndex:e=>[e[0],e[1]+32768,e[2]],indexToWorld:e=>[e[0],e[1]-32768,e[2]]},hasPixelSpacing:!1,calibration:this.calibration,preScale:{scaled:!1},metadata:{Modality:"ECG"}}}getSliceViewInfo(){throw Error("Method not implemented for ECG viewport.")}};function erf(e){return{dimensionGroupNumber:erk(e?.dimensionGroupNumber),numDimensionGroups:erk(e?.numDimensionGroups)}}function erg(e){return erC([e.referencedImageURI,...e.referencedImageId?erb(e.referencedImageId):[]])}let ery=new Map,erv=new WeakMap;function erb(e){var t;let r,n=ery.get(e);return n||(n=erC([Gk(e),-1===(r=(t=e).indexOf(":"))?t:t.substring(r+1)]),ery.set(e,n)),n}function erw(e,t){return!!e?.some(e=>t.includes(e))}function erx(e){return erC([e.volumeId,...e.volumeIds||[]])}function erC(e){return Array.from(new Set(e.filter(e=>"string"==typeof e)))}function erk(e){if("number"==typeof e&&Number.isInteger(e)&&!(e<1))return e}let erM=class{constructor(e){this.viewportStatus=Fw.NO_DATA,this.bindings=new Map,this.dataPresentation=new Map,this.isDestroyed=!1,this._debug={renderModes:{}},this.id=e.id,this.element=e.element}async setDisplaySets(...e){for(let[t,{displaySetId:r,options:n}]of(this.removeAllData(),e.entries())){if(!n)throw Error(`[${this.type}] setDisplaySets requires per-entry options when the viewport family does not override it.`);await this.addDisplaySet(r,{...n,role:n.role??(0===t?"source":"overlay")})}}async addDisplaySet(e,t){if(this.isDestroyed)throw Error("Viewport has been destroyed");let r=await this.dataProvider.load(e,t);await this.addLoadedData(e,r,t)}getDisplaySets(){return Array.from(this.bindings.entries()).map(([e,t])=>({displaySetId:e,options:{role:t.role}}))}removeData(e){let t=this.bindings.get(e);t&&(t.removeData(),this.bindings.delete(e),this.dataPresentation.delete(e),delete this._debug.renderModes[e],this.isDestroyed||this.render())}setDisplaySetPresentation(e,t){if("string"==typeof e)return void this.mergeDataPresentation(e,t??{});let r=this.getCurrentBinding()?.data.id;r&&this.mergeDataPresentation(r,e)}getDisplaySetPresentation(e){return this.getDataPresentationState(e)}getCurrentMode(){return this.getSourceBinding()?"unknown":"empty"}getViewReference(e={}){return{FrameOfReferenceUID:this.getFrameOfReferenceUID(),dataId:this.getCurrentBinding()?.data.id}}getViewReferenceId(e={}){return`frameOfReference:${this.getFrameOfReferenceUID()}`}setViewReference(e){}isReferenceViewable(e,t={}){return function(e,t,r={}){return!!e&&t.some(t=>{var n,a,i,o,s,l,u,d,c,h,p,m,f;let g,y;return n=e,a=t,i=r,o=n,s=a,(!o.FrameOfReferenceUID||o.FrameOfReferenceUID===s.frameOfReferenceUID)&&(l=n,u=a,!!(!l.dataId||erC([(d=u).dataId,...d.dataIds||[]]).includes(l.dataId)))&&(c=n,h=a,!!(!c.volumeId||erx(h).includes(c.volumeId)))&&!!function(e,t,r){if(e.planeRestriction)return function(e,t,r){if(e.FrameOfReferenceUID!==t.frameOfReferenceUID)return!1;if(r.withOrientation)return!0;let{cameraFocalPoint:n,viewPlaneNormal:a}=t;if(!n||!a||e.inPlaneVector1&&!Vw(0,Lv.vec3.dot(a,e.inPlaneVector1))||e.inPlaneVector2&&!Vw(0,Lv.vec3.dot(a,e.inPlaneVector2)))return!1;if(r.withNavigation)return!0;let i=Lv.vec3.sub(Lv.vec3.create(),e.point,n);return Vw(0,Lv.vec3.dot(i,a))}(e.planeRestriction,t,r);if(!e.viewPlaneNormal)return!0;let{viewPlaneNormal:n}=t;return!!n&&(Vw(e.viewPlaneNormal,n)||Vw(Lv.vec3.negate(Lv.vec3.create(),n),e.viewPlaneNormal)||!!r.withOrientation)}(n,a,i)&&!!function(e,t,r){if(e.planeRestriction&&e.volumeId&&erx(t).includes(e.volumeId))return!0;let n=erg(e);if(!n.length)return!0;let a=function(e){var t;let r,n=e.imageIds?.length?(t=e.imageIds,(r=erv.get(t))||(r=t.map(e=>erb(e)),erv.set(t,r)),r):[],a=e.imageURIs;if(!a?.length)return n;let i=n.slice(),o=new Set;for(let e of n)for(let t of e)o.add(t);for(let e of a)o.has(e)||(i.push([e]),o.add(e));return i}(t);if(!a.length)return!1;let i=t.currentImageIdIndex??0;if(erw(a[i],n))return!0;let o=a.findIndex(e=>erw(e,n));if(-1===o)return!1;if(t.allowAnyImageReference||r.withNavigation)return!0;let s=function(e,t){let r=t.multiSliceReference&&erg(t.multiSliceReference);if(!r?.length)return;let n=e.findIndex(e=>erw(e,r));return -1===n?void 0:n}(a,e);if(void 0!==s){let e=Math.min(o,s),t=Math.max(o,s);return e<=i&&i<=t}return i===o}(n,a,i)&&(p=n,m=a,f=i,g=void 0!==p.dimensionGroupNumber,y=erk(p.dimensionGroupNumber),!g||!!y&&(m.dimensionGroupNumber===y||!!f.withNavigation&&"number"==typeof m.numDimensionGroups&&!!(y<=m.numDimensionGroups)))&&function(e,t,r){var n,a;let i=e.sliceIndex;if(void 0===i)return!0;let{currentImageIdIndex:o}=t;if(Array.isArray(i))return"number"==typeof o&&i[0]<=o&&o<=i[1];return!!Number.isFinite(i)&&(o===i||!!r.withNavigation&&(n=i,a=t.imageIds,!a?.length||n>=0&&n<a.length))}(n,a,i)})}(e,this.getReferenceViewContexts(e),t)}getFrameOfReferenceUID(){return this.getResolvedView()?.getFrameOfReferenceUID()??`${this.type}-viewport-${this.id}`}getRenderingEngine(){return FA(this.renderingEngineId)}canvasToWorld(e){let t=this.getResolvedView();if(!t)throw Error(`[${this.type}] Cannot convert canvas to world for viewport ${this.id} because no data is mounted.`);return t.canvasToWorld(e)}worldToCanvas(e){let t=this.getResolvedView();if(!t)throw Error(`[${this.type}] Cannot convert world to canvas for viewport ${this.id} because no data is mounted.`);return t.worldToCanvas(e)}getAspectRatio(){return[1,1]}setViewState(e){if(this.isDestroyed)return;let t=this.getCameraForEvent(),r={...this.viewState,...e};this.viewState=this.normalizeViewState(r),this.modified(t)}getViewState(){return this.viewState}updateViewState(e){let t="function"==typeof e?e(this.getViewState()):e;t&&this.setViewState(t)}removeWidgets(){}destroy(){if(!this.isDestroyed){for(let e of(this.isDestroyed=!0,this.destroyBindings(),this.onDestroy(),this.bindings.clear(),this.dataPresentation.clear(),Object.keys(this._debug.renderModes)))delete this._debug.renderModes[e];this.element.removeAttribute("data-viewport-uid"),this.element.removeAttribute("data-rendering-engine-uid")}}dispose(){this.destroy()}setRendered(){this.viewportStatus!==Fw.NO_DATA&&this.viewportStatus!==Fw.LOADING&&(this.viewportStatus=Fw.RENDERED)}setNeedsRender(){this.viewportStatus=Fw.NEEDS_RENDER}updateRenderingPipeline(){}resize(){this.isDestroyed||(this.resizeBindings(),this.modified())}resetViewState(e){return!1}resizeForRenderingEngine({keepCamera:e=!0}={}){!this.isDestroyed&&(this.resize(),e||this.resetViewState())}async addLoadedData(e,t,r,n){if(this.isDestroyed)throw Error("Viewport has been destroyed");if(n?.())return!1;let a=this.renderPathResolver.resolve(this.type,t,r),i=a.createRenderPath(),o=a.selectContext?.(this.renderContext)??this.renderContext,s=await i.addData(o,t,r);if(n?.())return s.removeData(),!1;if(this.isDestroyed)throw s.removeData(),Error("Viewport has been destroyed");let l=this.bindings.get(e);l&&l.removeData();let u=r.role??"overlay";if("source"===u)for(let[t,r]of this.bindings.entries())t!==e&&(r.role="overlay");this.bindings.set(e,{data:t,role:u,...s});let d=this.bindings.get(e);if(!d)throw Error(`Failed to bind rendering for ${e}`);let c=this.dataPresentation.get(e);return void 0!==c&&d.updateDataPresentation(c),d.applyViewState(this.viewState),this._debug.renderModes[e]=s.rendering.renderMode,this.viewportStatus=Fw.PRE_RENDER,this.render(),!0}removeAllData(){for(let e of Array.from(this.bindings.keys()))this.removeData(e)}setDataPresentationState(e,t){if(this.isDestroyed)return;this.dataPresentation.set(e,t);let r=this.bindings.get(e);r&&(r.updateDataPresentation(t),this.render())}getDataPresentationState(e){return this.dataPresentation.get(e)}setDefaultDataPresentation(e,t){let r={...t,...this.getDataPresentationState(e)||{}};return this.setDataPresentationState(e,r),r}mergeDataPresentation(e,t){let r={...this.getDataPresentationState(e)||{},...t};return this.setDataPresentationState(e,r),this.bindings.has(e)&&this.notifyDataPresentationModified(e,t),r}notifyDataPresentationModified(e,t){}normalizeViewState(e){return e}modified(e){!this.isDestroyed&&(this.forEachBinding(e=>{e.applyViewState(this.viewState)}),this.render(),e&&this.triggerCameraModifiedEvent(e))}getCameraForEvent(){return this.getResolvedView()?.toICamera()??this.getViewState()}triggerCameraModifiedEvent(e){let t={previousCamera:e,camera:this.getCameraForEvent(),element:this.element,viewportId:this.id,renderingEngineId:this.renderingEngineId};Bh(this.element,NH.CAMERA_MODIFIED,t)}triggerCameraResetEvent(){let e={element:this.element,viewportId:this.id,camera:this.getCameraForEvent(),renderingEngineId:this.renderingEngineId};Bh(this.element,NH.CAMERA_RESET,e)}getBinding(e){return this.bindings.get(e)}getDisplaySetRenderMode(e){return this.getBinding(e)?.rendering.renderMode}getDisplaySetRole(e){return this.getBinding(e)?.role}getFirstBinding(){return this.bindings.values().next().value}getSourceBinding(){for(let e of this.bindings.values())if("source"===e.role)return e;return this.getFirstBinding()}getCurrentBinding(){return this.getFirstBinding()}forEachBinding(e){for(let t of this.bindings.values())e(t)}getReferenceViewContexts(e){let t=[],r=this.getResolvedView(),n=r?.toICamera();for(let[e,a]of this.bindings.entries())t.push({dataId:e,dataIds:[a.data.id],frameOfReferenceUID:a.getFrameOfReferenceUID()??r?.getFrameOfReferenceUID()??this.getFrameOfReferenceUID(),cameraFocalPoint:n?.focalPoint,viewPlaneNormal:n?.viewPlaneNormal});return t.length||t.push({frameOfReferenceUID:this.getFrameOfReferenceUID(),cameraFocalPoint:n?.focalPoint,viewPlaneNormal:n?.viewPlaneNormal}),t}renderBindings(){if(this.isDestroyed)return!1;let e=!1;return this.forEachBinding(t=>{t.render?.(),e=e||!!t.render}),e}resizeBindings(){this.isDestroyed||this.forEachBinding(e=>{e.resize?.()})}destroyBindings(){for(let e of Array.from(this.bindings.keys()))this.removeData(e)}onDestroy(){}};class erS{async load(e){let t=HX(e),{waveform:r}=await ero(t);return{id:e,type:"ecg",...r}}}class erE{constructor(e=[]){this.paths=[],e.forEach(e=>this.add(e))}register(e){this.add(e)}add(e){this.paths.find(t=>t.id===e.id)?console.debug(`[DefaultRenderPathResolver] Duplicate render path registration ignored for "${e.id}"`):this.paths.push(e)}resolve(e,t,r){let n=this.paths.find(n=>n.type===e&&n.matches(t,r));if(!n)throw Error(`No render path for ${e}/${t.type}/${r.renderMode}`);return n}}function erT(e){return{timeRange:[...e.timeRange],valueRange:[...e.valueRange],scrollOffset:0,anchorCanvas:[.5,.5],scale:1,scaleMode:"fit",rotation:0}}function erI(e){var t;return{timeRange:[...e.timeRange],valueRange:[...e.valueRange],...void 0!==e.scrollOffset?{scrollOffset:e.scrollOffset}:{},anchorCanvas:[(t=e.anchorCanvas??[.5,.5])[0],t[1]],scale:Math.max(e.scale??1,.001),scaleMode:"fit",rotation:0,...e.anchorWorld?{anchorWorld:er_(e.anchorWorld)}:{}}}function erP(e){var t;let{metrics:r,camera:n,canvas:a}=e,i=Math.max(n?.scale??1,.001),o=r.worldToCanvasRatio*i,s=r.ecgWidth*o,l=r.ecgHeight*o,u=(a.clientWidth-s)/2,d=(a.clientHeight-l)/2,c=[(t=n?.anchorCanvas??[.5,.5])[0],t[1]],h=er_(n?.anchorWorld)??[r.ecgWidth/2,r.ecgHeight/2],p=a.clientWidth*c[0]-h[0]*o,m=a.clientHeight*c[1]-h[1]*o;return{anchorWorld:h,anchorCanvas:c,canvasHeight:a.clientHeight,canvasWidth:a.clientWidth,centeredXOffset:u,centeredYOffset:d,effectiveRatio:o,xOffset:p,yOffset:m}}function er_(e){return e?[e[0],e[1]]:void 0}new erE;class erD{async addData(e,t,r){let n={renderMode:"signal2d",canvas:e.canvas,canvasContext:e.canvasContext,metrics:{ecgWidth:1,ecgHeight:1,channelScale:1,worldToCanvasRatio:1,xOffsetCanvas:0,yOffsetCanvas:0}};return{rendering:n,updateDataPresentation:e=>{this.updateDataPresentation(n,e)},applyViewState:e=>{this.applyViewState(n,e)},getFrameOfReferenceUID:()=>this.getFrameOfReferenceUID(e),render:()=>{this.render(e,n,t)},removeData:()=>{this.removeData()}}}updateDataPresentation(e,t){e.currentDataPresentation=t}applyViewState(e,t){e.currentCamera=t}getFrameOfReferenceUID(e){return`ecg-viewport-${e.viewportId}`}render(e,t,r){!function(e,t,r){let n,a,i,o,s,l,u,d,c,h,p,m,{canvas:f,canvasContext:g,currentCamera:y,currentDataPresentation:v}=t;if(!y)return;let b=ers(r.channels,v?.visibleChannels);n=window.devicePixelRatio||1,a=Math.max(1,f.clientWidth||f.width||1),i=Math.max(1,f.clientHeight||f.height||1),o=Math.floor(a*n),s=Math.floor(i*n),(f.width!==o||f.height!==s)&&(f.width=o,f.height=s);let w=function(e){let{canvas:t,visibleChannels:r,windowMs:n,valueRange:a}=e,i=Math.max(1,Math.ceil(n/1e3*150)),[o,s]=a,l=Math.max(1,s-o),u=(i*(t.clientHeight&&t.clientWidth?t.clientHeight/t.clientWidth:2/3)-5*Math.max(1,r.length))/Math.max(1,r.length)/(1.25*l),d=eru(r,u),c=Math.min(t.clientWidth/Math.max(1,i),t.clientHeight/Math.max(1,d));return{ecgWidth:i,ecgHeight:d,channelScale:u,worldToCanvasRatio:c,xOffsetCanvas:(t.clientWidth-i*c)/2,yOffsetCanvas:(t.clientHeight-d*c)/2}}({canvas:f,visibleChannels:b,windowMs:Math.max(1,y.timeRange[1]-y.timeRange[0]),valueRange:y.valueRange}),x=erd({visibleChannels:b,channelScale:w.channelScale}),C=(l=r.numberOfSamples/r.samplingFrequency*1e3,d=Math.max((u=Math.max(0,Math.min(y.timeRange[0],l)))+1,y.timeRange[1]),c=Math.max(u+1,Math.min(d,l)),p=Math.max((h=Math.max(0,Math.min(r.numberOfSamples-1,Math.floor(u/1e3*r.samplingFrequency))))+1,Math.min(r.numberOfSamples,Math.ceil(c/1e3*r.samplingFrequency))),{startMs:u,endMs:c,startIndex:h,endIndex:p}),k=window.devicePixelRatio||1;t.metrics=w;let{effectiveRatio:M,xOffset:S,yOffset:E}={effectiveRatio:(m=erP({metrics:w,camera:y,canvas:f})).effectiveRatio,xOffset:m.xOffset,yOffset:m.yOffset};g.resetTransform(),g.fillStyle="#000000",g.fillRect(0,0,f.width,f.height),v?.visible!==!1&&(g.globalAlpha=v?.opacity??1,g.setTransform(M*k,0,0,M*k,S*k,E*k),erc(g,w,{showGrid:v?.showGrid}),erh({ctx:g,layouts:x,ecgWidth:w.ecgWidth,channelScale:w.channelScale,startIndex:C.startIndex,endIndex:C.endIndex,lineWidth:v?.lineWidth,amplitudeScale:v?.amplitudeScale}),erp(g,x,w.worldToCanvasRatio),g.resetTransform(),g.globalAlpha=1,Bh(e.element,NH.IMAGE_RENDERED,{element:e.element,viewportId:e.viewportId,renderingEngineId:e.renderingEngineId,rendering:t}))}(e,t,r)}removeData(){}}class erO{constructor(){this.id="ecg:canvas-signal",this.type=Nq.ECG_NEXT}matches(e,t){return"ecg"===e.type&&"signal2d"===t.renderMode}createRenderPath(){return new erD}}let erA=class{constructor(e){this.state=Object.freeze(e)}toICamera(){return this.cachedICamera||=this.buildICamera(),this.cachedICamera}},erR=class e extends erA{get zoom(){return Math.max(this.state.viewState.scale??1,.001)}get pan(){var e;return[(e=this.getCanvasMapping()).xOffset-e.centeredXOffset,e.yOffset-e.centeredYOffset]}canvasToWorld(e){let t=this.getCanvasMapping(),r=this.getChannelLayouts(),n=[(e[0]-t.xOffset)/t.effectiveRatio,(e[1]-t.yOffset)/t.effectiveRatio],a=0;for(let e=0;e<r.length;e++){let t=r[e];if(n[1]<=t.yOffset||e===r.length-1){a=e;break}}let i=r[a];return[Math.max(0,Math.min(this.state.waveform.numberOfSamples-1,n[0]*this.state.waveform.numberOfSamples/this.state.metrics.ecgWidth)),(i.baseline-n[1])/this.state.metrics.channelScale,a]}worldToCanvas(e){let t=this.getCanvasMapping(),r=this.getChannelLayouts(),n=Math.round(e[2]);return n<0||n>=r.length?[0,0]:[e[0]/this.state.waveform.numberOfSamples*this.state.metrics.ecgWidth*t.effectiveRatio+t.xOffset,(r[n].baseline-e[1]*this.state.metrics.channelScale)*t.effectiveRatio+t.yOffset]}getFrameOfReferenceUID(){return this.state.frameOfReferenceUID}withZoom(e,t){var r;let n=Math.max(e,.001);return t?this.cloneWithViewState({...this.state.viewState,anchorWorld:(r=this.getCanvasMapping(),[(t[0]-r.xOffset)/r.effectiveRatio,(t[1]-r.yOffset)/r.effectiveRatio]),anchorCanvas:[t[0]/Math.max(this.state.canvas.clientWidth,1),t[1]/Math.max(this.state.canvas.clientHeight,1)],scale:n,scaleMode:"fit"}):this.cloneWithViewState({...this.state.viewState,scale:n,scaleMode:"fit"})}withPan(e){var t,r;return this.cloneWithViewState({...this.state.viewState,anchorWorld:(t=[e[0],e[1]],[((r=this.getCanvasMapping()).canvasWidth*r.anchorCanvas[0]-(r.centeredXOffset+t[0]))/r.effectiveRatio,(r.canvasHeight*r.anchorCanvas[1]-(r.centeredYOffset+t[1]))/r.effectiveRatio])})}buildICamera(){let e=this.getCanvasMapping(),t=[this.state.canvas.clientWidth/2,this.state.canvas.clientHeight/2];return{parallelProjection:!0,focalPoint:this.canvasToWorld(t),position:[0,0,0],viewUp:[0,-1,0],parallelScale:this.state.canvas.clientHeight/2/Math.max(e.effectiveRatio,.001),viewPlaneNormal:[0,0,1]}}getCanvasMapping(){return this.cachedCanvasMapping||=erP({canvas:this.state.canvas,camera:this.state.viewState,metrics:this.state.metrics}),this.cachedCanvasMapping}getChannelLayouts(){return erd({visibleChannels:ers(this.state.waveform.channels,this.state.dataPresentation?.visibleChannels),channelScale:this.state.metrics.channelScale})}cloneWithViewState(t){return new e({...this.state,viewState:t})}},erL=class extends erM{static get useCustomRenderingPipeline(){return!0}getUseCustomRenderingPipeline(){return!0}constructor(e){super(e),this.type=Nq.ECG_NEXT,this.renderingEngineId=e.renderingEngineId,this.canvas=GK(this.element),this.canvasContext=this.canvas.getContext("2d"),this.dataProvider=e.dataProvider||new erS,this.renderPathResolver=e.renderPathResolver||function(e=[new erO]){return new erE(e)}(),this.renderContext={viewportId:this.id,type:"ecg",renderingEngineId:this.renderingEngineId,element:this.element,canvas:this.canvas,canvasContext:this.canvasContext},this.viewState=erT({timeRange:[0,1],valueRange:[-1,1]}),this.element.setAttribute("data-viewport-uid",this.id),this.element.setAttribute("data-rendering-engine-uid",this.renderingEngineId),this.resize()}async setDisplaySets(...e){for(let{displaySetId:t}of(this.removeAllData(),e)){let e=await this.loadWaveformData(t),r=e.numberOfSamples/e.samplingFrequency*1e3;this.setDefaultDataPresentation(t,{visible:!0,opacity:1,visibleChannels:e.channels.map((e,t)=>t),lineWidth:1,amplitudeScale:1,showGrid:!0}),this.viewState=erT({timeRange:[0,r],valueRange:function(e){let t=0,r=0;return(e.channels.forEach(e=>{t=Math.min(t,e.min),r=Math.max(r,e.max)}),t===r)?[-1,1]:[t,r]}(e)}),await this.addLoadedData(t,e,{renderMode:"signal2d"})}}getWaveformData(){return this.getWaveformBindingData()??null}getViewReference(e={}){let t=this.getFirstBinding()?.data.id;return{FrameOfReferenceUID:this.getFrameOfReferenceUID(),dataId:t,referencedImageId:this.getCurrentImageId(),sliceIndex:0}}getViewReferenceId(e={}){return`imageId:${this.getCurrentImageId()}`}setViewReference(e){}getSliceIndex(){return 0}getZoom(){return this.getResolvedView()?.zoom??Math.max(this.viewState.scale??1,.001)}normalizeViewState(e){return erI(e)}getReferenceViewContexts(){let e=this.getFirstBinding();return e?[{dataId:e.data.id,dataIds:[e.data.id],frameOfReferenceUID:this.getFrameOfReferenceUID(),imageIds:[e.data.id],currentImageIdIndex:0}]:super.getReferenceViewContexts()}setZoom(e,t){let r=this.getResolvedView();r?this.applyResolvedViewState(r.withZoom(e,t).state.viewState):this.setViewState({scale:Math.max(e,.001),scaleMode:"fit"})}getPan(){return this.getResolvedView()?.pan??[0,0]}setPan(e){let t=this.getResolvedView();t&&this.applyResolvedViewState(t.withPan(e).state.viewState)}getVisibleChannels(){let e=this.getWaveformBindingData();if(!e)return[];let t=e.id,r=new Set(this.getDisplaySetPresentation(t)?.visibleChannels||e.channels.map((e,t)=>t));return e.channels.map((e,t)=>({name:e.name,visible:r.has(t)}))}getContentDimensions(){let e=this.getCurrentRendering();return e?{width:e.metrics.ecgWidth,height:e.metrics.ecgHeight}:{width:0,height:0}}resize(){let{clientWidth:e,clientHeight:t}=this.canvas;if(this.canvas.width!==e||this.canvas.height!==t){let r=window.devicePixelRatio||1;this.canvas.width=Math.floor(Math.max(1,e)*r),this.canvas.height=Math.floor(Math.max(1,t)*r)}this.render()}render(){this.renderBindings()}customRenderViewportToCanvas(){this.render()}resetViewState(){let e=this.getCameraForEvent();return this.viewState=erT({timeRange:this.viewState.timeRange,valueRange:this.viewState.valueRange}),this.modified(e),this.triggerCameraResetEvent(),!0}getRotation(){return 0}scroll(){}getCurrentImageId(){let e=this.getFirstBinding();return e?.data.id}getCurrentImageIdIndex(){return 0}getImageIds(){let e=this.getFirstBinding();return e?[e.data.id]:[]}getImageData(){let e=this.getWaveformBindingData();if(!e)return null;let t=[e.numberOfSamples,65536,e.channels.length],r=[1,1,1],n=[1,0,0,0,1,0,0,0,1];return{dimensions:t,spacing:r,origin:[0,0,0],direction:n,imageData:{getDirection:()=>n,getDimensions:()=>t,getRange:()=>[0,1],getSpacing:()=>r,worldToIndex:e=>[e[0],e[1]+32768,e[2]],indexToWorld:e=>[e[0],e[1]-32768,e[2]]},scalarData:new Int16Array(0),hasPixelSpacing:!1,preScale:{scaled:!1},metadata:{Modality:"ECG",FrameOfReferenceUID:""}}}setScaleAtCanvasPoint(e,t){let r=this.getResolvedView();r?this.applyResolvedViewState(r.withZoom(e,t).state.viewState):this.setZoom(e)}async loadWaveformData(e){let t=await this.dataProvider.load(e);if(!erN(t))throw Error(`[ECGViewport] Loaded data for ${e} is not a valid ECG waveform`);return t}getWaveformBindingData(){let e=this.getFirstBinding();if(e&&erN(e.data))return e.data}getCurrentRendering(){let e=this.getFirstBinding();if(e&&"signal2d"===e.rendering.renderMode)return e.rendering}getResolvedView(){let e=this.getWaveformBindingData(),t=this.getCurrentRendering();if(e&&t)return new erR({viewState:this.viewState,canvas:this.canvas,dataPresentation:this.getDisplaySetPresentation(e.id),frameOfReferenceUID:`ecg-viewport-${this.id}`,metrics:t.metrics,waveform:e})}applyResolvedViewState(e){this.setViewState(e)}};function erN(e){return"object"==typeof e&&null!==e&&"ecg"===e.type&&Array.isArray(e.channels)&&"number"==typeof e.numberOfSamples&&"number"==typeof e.samplingFrequency&&"number"==typeof e.numberOfChannels}class erV{async load(e,t){let r=this.getDataSet(e);if(!r)throw Error(`[PlanarViewport] No registered planar dataset for ${e}`);if(!t)throw Error(`[PlanarViewport] No load options were provided for ${e}`);if(!r.imageIds.length)throw Error("[PlanarViewport] Cannot load an empty planar dataset");let n=Math.min(Math.max(0,r.initialImageIdIndex??0),r.imageIds.length-1),a=void 0===r.initialImageIdIndex?void 0:n;if(t.renderMode===eyK.VTK_VOLUME_SLICE||t.renderMode===eyK.CPU_VOLUME){let n=etu(t.volumeId),i=await ets(n,{imageIds:r.imageIds});i.load();let o=i.imageIds?i.imageIds:r.imageIds,s=a;if(void 0!==a&&o!==r.imageIds){let e=r.imageIds[a],t=o.indexOf(e);t>=0?s=t:console.warn(`[PlanarViewport] initialImageIdIndex remap failed: imageId "${e}" not found in the volume imageIds; using the original index ${a}`)}return{id:e,type:"image",imageIds:o,initialImageIdIndex:s,acquisitionOrientation:t.acquisitionOrientation,imageData:r.imageData,imageVolume:i,reference:r.reference,renderMode:t.renderMode,useWorldCoordinateImageData:r.useWorldCoordinateImageData,volumeId:n}}let i=r.image&&r.image.imageId===r.imageIds[n]?r.image:await qI(r.imageIds[n]);return{id:e,type:"image",imageIds:r.imageIds,image:i,imageData:r.imageData,initialImageIdIndex:a,acquisitionOrientation:t.acquisitionOrientation,reference:r.reference,renderMode:t.renderMode,useWorldCoordinateImageData:r.useWorldCoordinateImageData,volumeId:t.volumeId}}getDataSet(e){var t;let r,n=H0(r=HK(e))?{imageIds:r}:HJ(r)?"kind"in r&&r.kind&&"planar"!==r.kind?void 0:r:void 0;if((t=n)&&"object"==typeof t&&Array.isArray(t.imageIds)&&0!==t.imageIds.length&&(void 0===t.initialImageIdIndex||"number"==typeof t.initialImageIdIndex)&&(void 0===t.volumeId||"string"==typeof t.volumeId))return n}}function erF(e,t){var r,n;let a=(r=e.reference,n=e.volumeId||t.referencedIdFallback,r?"segmentation"===r.kind?{reference:r,referencedId:r.labelmapId??r.representationUID??r.segmentationId,...r.representationUID?{representationUID:r.representationUID}:{}}:{reference:r,referencedId:function(e){switch(e.kind){case"data":return e.dataId;case"image":return e.imageId;case"volume":return e.volumeId;case"geometry":return e.geometryId;case"segmentation":return e.labelmapId??e.representationUID??e.segmentationId}}(r)}:n?{referencedId:n}:{}),i=t.actor,o=t.mapper??("function"==typeof i.getMapper?i.getMapper():void 0);return{uid:t.uid,actor:i,actorMapper:{actor:i,mapper:o,renderMode:t.renderMode},...a}}let erB=new Set(["fit","fitAspect","fitWidth","fitHeight","absolute"]);function erj(e){return"number"==typeof e&&Number.isFinite(e)?Math.max(e,.001):1}function erW(e){if(Array.isArray(e))return[erj(e[0]),erj(e[1])];let t=erj(e);return[t,t]}function erU(e){return erB.has(e||"")?e:"fit"}function erz(e){let[t,r]=erW(e);return t/r}function erH(e){return{tlhc:{x:1,y:1},brhc:{x:Math.max(e.columns,1),y:Math.max(e.rows,1)},rowPixelSpacing:e.rowPixelSpacing??1,columnPixelSpacing:e.columnPixelSpacing??1,presentationSizeMode:"NONE"}}function erG(e,t={}){Bh(e.viewport.element,NH.STACK_NEW_IMAGE,{image:t.image,imageId:t.imageId??t.image?.imageId,imageIdIndex:t.imageIdIndex,viewportId:e.viewportId,renderingEngineId:e.renderingEngineId})}function erq(e,t){let r=t.camera?.orientation;(!r||r===NQ.ACQUISITION||void 0!==t.acquisitionOrientation&&r===t.acquisitionOrientation)&&"number"==typeof t.imageIdIndex&&t.imageIds[t.imageIdIndex]?erG(e,{imageId:t.imageIds[t.imageIdIndex],imageIdIndex:t.imageIdIndex}):erG(e),"number"==typeof t.imageIdIndex&&Bh(e.viewport.element,NH.VOLUME_NEW_IMAGE,{imageIndex:t.imageIdIndex,numberOfSlices:t.maxImageIdIndex+1,viewportId:e.viewportId,renderingEngineId:e.renderingEngineId})}function er$(e){let{canvas:t,renderer:r,canvasPos:n}=e,a=erY(r.getActiveCamera()),i=window.devicePixelRatio||1,{width:o,height:s}=t,l=[n[0]*i,n[1]*i],[u,d,c,h]=r.getViewport(),p=[u+l[0]/o*(c-u),d+(1-l[1]/s)*(h-d),0],m=r.normalizedDisplayToProjection(p[0],p[1],p[2]),f=r.projectionToView(m[0],m[1],m[2],o/s),g=r.viewToWorld(f[0],f[1],f[2]);return a(),[g[0],g[1],g[2]]}function erK(e){let{canvas:t,renderer:r,worldPos:n}=e,a=erY(r.getActiveCamera()),i=window.devicePixelRatio||1,{width:o,height:s}=t,l=r.worldToView(n[0],n[1],n[2]),u=r.viewToProjection(l[0],l[1],l[2],o/s),d=r.projectionToNormalizedDisplay(u[0],u[1],u[2]),[c,h,p,m]=r.getViewport(),f=(d[0]-c)/(p-c)*o,g=(1-(d[1]-h)/(m-h))*s;return a(),[f/i,g/i]}function erY(e){if(e.setIsPerformingCoordinateTransformation)return e.setIsPerformingCoordinateTransformation(!0),()=>{e.setIsPerformingCoordinateTransformation?.(!1)};let t=e.getClippingRange(),r=e.getDistance();return e.setClippingRange(r,r+.1),()=>{e.setClippingRange(t[0],t[1])}}function erZ(e){let t=Lv.vec3.normalize(Lv.vec3.create(),e.viewUp),r=Lv.vec3.normalize(Lv.vec3.create(),e.viewPlaneNormal),n=Lv.vec3.cross(Lv.vec3.create(),t,r);return Lv.vec3.length(n)||(n=Lv.vec3.fromValues(1,0,0)),{right:Lv.vec3.normalize(Lv.vec3.create(),n),viewPlaneNormal:r,viewUp:t}}function erX(e){let{camera:t,canvasWidth:r,canvasHeight:n,canvasPos:a}=e,i=Math.max(r,1),o=Math.max(n,1),{right:s,viewUp:l}=erZ(t),u=2*Math.max(t.parallelScale,.001),d=i/o*u*(1/erz(t.presentationScale)),c=(a[0]/i-.5)*d,h=(.5-a[1]/o)*u,p=[...t.focalPoint];return Lv.vec3.scaleAndAdd(p,p,s,c),Lv.vec3.scaleAndAdd(p,p,l,h),p}function erJ(e){let{camera:t,canvasWidth:r,canvasHeight:n,worldPos:a}=e,i=Math.max(r,1),o=Math.max(n,1),{right:s,viewUp:l}=erZ(t),u=2*Math.max(t.parallelScale,.001),d=i/o*u*(1/erz(t.presentationScale)),c=Lv.vec3.subtract(Lv.vec3.create(),a,t.focalPoint);return[(Lv.vec3.dot(c,s)/d+.5)*i,(.5-Lv.vec3.dot(c,l)/u)*o]}function erQ(e){let t="u"<typeof window?1:window.devicePixelRatio||1;return{canvasWidth:e.width/t,canvasHeight:e.height/t}}function er0(e){let{canvasHeight:t,canvasWidth:r,columnPixelSpacing:n,columns:a,rowPixelSpacing:i,rows:o}=e;return .5*Math.max(Math.max(o,1)*(i||1),Math.max(a,1)*(n||1)/(Math.max(r,1)/Math.max(t,1)))}function er1(e,t){let r=t.map(t=>Math.abs(Lv.vec3.dot(e,t))),n=Math.max(...r);if(!(n<.995))return r.indexOf(n)}function er2(e){return e?[e[0],e[1],e[2]]:void 0}function er5(e=0){return(e%360+360)%360}function er3(e){let{rotation:t=0,viewPlaneNormal:r,viewUp:n}=e,a=er5(t);if(0===a)return[...n];let i=Lv.mat4.fromRotation(Lv.mat4.create(),a*Math.PI/180,r);return Lv.vec3.transformMat4(Lv.vec3.create(),n,i)}function er4(e){let{flipHorizontal:t,flipVertical:r,viewPlaneNormal:n,viewUp:a}=e;return{viewPlaneNormal:!!t!=!!r?Lv.vec3.negate(Lv.vec3.create(),n):[...n],viewUp:r?Lv.vec3.negate(Lv.vec3.create(),a):[...a]}}function er8(e){return Math.max(e||0,1)}function er6(e,t){let r=Lv.vec3.normalize(Lv.vec3.create(),e);return!t||Number.isFinite(r[0])&&Number.isFinite(r[1])&&Number.isFinite(r[2])&&0!==Lv.vec3.length(r)?r:Lv.vec3.clone(t)}function er9(e){var t,r;let n,a,i,{sliceBasis:o,camera:s,canvasHeight:l,canvasWidth:u}=e,d=erW(s?.scale),c=er5(s?.rotation??0),h=Lv.vec2.clone(s?.anchorCanvas??[.5,.5]),p=er8(u),m=er8(l),f=er6(o.viewPlaneNormal,[0,0,1]),g=er6(er3({rotation:c,viewPlaneNormal:f,viewUp:o.viewUp}),[0,-1,0]),{viewPlaneNormal:y,viewUp:v}=er4({flipHorizontal:s?.flipHorizontal,flipVertical:s?.flipVertical,viewPlaneNormal:f,viewUp:g}),b=Lv.vec3.cross(Lv.vec3.create(),v,y);b=Lv.vec3.length(b)?Lv.vec3.normalize(Lv.vec3.create(),b):[1,0,0];let w=s?.anchorWorld?(t=s.anchorWorld,r=o.sliceCenterWorld,n=er6(f,[0,0,1]),a=Lv.vec3.subtract(Lv.vec3.create(),t,r),i=Lv.vec3.dot(a,n),Lv.vec3.scaleAndAdd(Lv.vec3.create(),t,n,-i)):o.sliceCenterWorld,[x,C]=d,k=2*(o.fitParallelScale/C),M=function(e){let{canvasHeight:t,canvasWidth:r,camera:n,scale:a,sliceBasis:i}=e,o=n?.displayArea;if(!o)return;let s=er8(r),l=er8(t),[u,d]=function(e){let{canvasHeight:t,canvasWidth:r,sliceBasis:n}=e,a=er8(r),i=er8(t),o=2*Math.max(n.fitParallelScale,.001);return[Math.max(n.sliceWidthWorld,.001)/Math.max(a/i*o,.001)*a,Math.max(n.sliceHeightWorld,.001)/Math.max(o,.001)*i]}({canvasHeight:t,canvasWidth:r,sliceBasis:i}),c=[...a];if("SCALE"===o.type&&void 0!==o.scale)c=erW(o.scale);else if(o.imageArea){let[e,t]=o.imageArea,r=s/Math.max(Math.max(Math.abs(e),.001)*u,.001),i=l/Math.max(Math.max(Math.abs(t),.001)*d,.001),h=erU(o.scaleMode??n?.scaleMode);if("absolute"===h)c=[r*a[0],i*a[1]];else{let e="fitWidth"===h?r:"fitHeight"===h?i:Math.min(r,i);c=[e*a[0],e*a[1]]}}let h=[0,0];if(o.imageCanvasPoint){let{imagePoint:e,canvasPoint:t=e||[.5,.5]}=o.imageCanvasPoint,[r,n]=t,[a,i]=e||t;h=[c[0]*u*(.5-a)+s*(r-.5),c[1]*d*(.5-i)+l*(n-.5)]}return{pan:h,scale:c,zoom:c[1]}}({sliceBasis:o,camera:s,canvasWidth:u,canvasHeight:l,scale:d}),S=Lv.vec3.subtract(Lv.vec3.create(),o.sliceCenterWorld,w),E=[Lv.vec3.dot(S,b)*p/(C/x*(p/m*k)),-Lv.vec3.dot(S,v)*m/k],T=[(h[0]-.5)*p,(h[1]-.5)*m];return{pan:M?.pan??[E[0]+T[0],E[1]+T[1]],flipHorizontal:s?.flipHorizontal===!0,flipVertical:s?.flipVertical===!0,scale:M?.scale??d,zoom:M?.zoom??d[1],rotation:c}}function er7(e){let{renderer:t,activeSourceICamera:r}=e;if(!r?.focalPoint||!r.position||!r.viewPlaneNormal||!r.viewUp||"number"!=typeof r.parallelScale)return;let n=t.getActiveCamera();return n.setParallelProjection(!0),n.setDirectionOfProjection(-r.viewPlaneNormal[0],-r.viewPlaneNormal[1],-r.viewPlaneNormal[2]),n.setParallelScale(r.parallelScale),n.setFocalPoint(...r.focalPoint),n.setPosition(...r.position),n.setViewUp(...r.viewUp),r}function ene(e){let{actor:t,activeSourceICamera:r}=e;t?.setUserMatrix?.(function(e){let t,r,n,a=Lv.mat4.create();if(!e?.focalPoint||!e.viewPlaneNormal||!e.viewUp)return a;let[i,o]=erW(e.presentationScale),s=Math.max(i/o,.001);if(1e-6>Math.abs(s-1))return a;let l=(t=er6(e.viewUp,[0,-1,0]),r=er6(e.viewPlaneNormal,[0,0,1]),n=Lv.vec3.cross(Lv.vec3.create(),t,r),1e-6>Lv.vec3.length(n)?[1,0,0]:Lv.vec3.normalize(Lv.vec3.create(),n)),u=s-1,[d,c,h]=l,p=[1+u*d*d,u*d*c,u*d*h,u*c*d,1+u*c*c,u*c*h,u*h*d,u*h*c,1+u*h*h],[m,f,g]=e.focalPoint,y=[p[0]*m+p[3]*f+p[6]*g,p[1]*m+p[4]*f+p[7]*g,p[2]*m+p[5]*f+p[8]*g];return a[0]=p[0],a[1]=p[1],a[2]=p[2],a[4]=p[3],a[5]=p[4],a[6]=p[5],a[8]=p[6],a[9]=p[7],a[10]=p[8],a[12]=m-y[0],a[13]=f-y[1],a[14]=g-y[2],a}(r))}function ent(e){if(e)return{lower:e.lower,upper:e.upper}}function enr(e){return!!(e&&"object"==typeof e&&"viewPlaneNormal"in e)}function enn(e,t){let[r,n,a]=e||[],i=Math.hypot(r,n,a);if(!Number.isFinite(r)||!Number.isFinite(n)||!Number.isFinite(a)||i<1e-6)throw Error(`[PlanarViewport] Invalid orientation vector ${t}. Expected a finite non-zero Point3.`);return[r/i,n/i,a/i]}function ena(e){if(!enr(e))return e;let t={viewPlaneNormal:enn(e.viewPlaneNormal,"viewPlaneNormal")};if(e.viewUp&&(t.viewUp=enn(e.viewUp,"viewUp"),Math.abs(t.viewPlaneNormal[0]*t.viewUp[0]+t.viewPlaneNormal[1]*t.viewUp[1]+t.viewPlaneNormal[2]*t.viewUp[2])>.001))throw Error("[PlanarViewport] Invalid orientation vectors. viewPlaneNormal and viewUp must be orthogonal.");return t}function eni(e){var t;if(!e)return;let r={};void 0!==e.name&&(r.name=e.name);let n=Array.isArray(t=e.opacity)?t.map(({opacity:e,value:t})=>({opacity:e,value:t})):t;return void 0!==n&&(r.opacity=n),void 0!==e.threshold&&(r.threshold=e.threshold),r}function eno(e={}){let t=Object.assign({},e);return e.voiRange&&(t.voiRange=ent(e.voiRange)),e.colormap&&(t.colormap=eni(e.colormap)),void 0!==e.orientation&&(t.orientation=ena(e.orientation)),t}function ens(e={},t={}){let r=eno(e),n=eno(t),a=Object.assign({},r);return Object.assign(a,n),n.colormap&&(a.colormap=function(e,t){if(!t)return eni(e);if(void 0!==t.name)return eni(t);let r=eni(e)||{},n=eni(t);return n&&Object.assign(r,n),r}(r.colormap,n.colormap)),a}function enl(e={}){let t={};return e.colormap&&(t.colormap=eni(e.colormap)),e.voiRange&&(t.voiRange=ent(e.voiRange)),void 0!==e.invert&&(t.invert=e.invert),void 0!==e.blendMode&&(t.blendMode=e.blendMode),void 0!==e.interpolationType&&(t.interpolationType=e.interpolationType),void 0!==e.opacity&&(t.opacity=e.opacity),void 0!==e.slabThickness&&(t.slabThickness=e.slabThickness),void 0!==e.visible&&(t.visible=e.visible),t}function enu(e){let{viewPlaneNormal:t,viewUp:r}=Ka(e);return{viewPlaneNormal:t,viewUp:r}}function end(e){let{imageVolume:t,orientation:r}=e;if(!r)return;if(r===NQ.ACQUISITION)return enu(t);if(enr(r))return{viewPlaneNormal:[...r.viewPlaneNormal],viewUp:[...r.viewUp||enu(t).viewUp]};let n=F_[r];if(n)return{viewPlaneNormal:[...n.viewPlaneNormal],viewUp:[...n.viewUp]}}function enc(){return{fitParallelScale:1,sliceWidthWorld:2,sliceHeightWorld:2}}function enh(e){return 1e-6>Math.abs(Math.abs(e)-1)}function enp(e,t){return enh(e[t])||enh(e[t+1])||enh(e[t+2])}function enm(e){var t;let r=e.imageData;if(!r)return[];if(enp(t=r.getDirection(),0)&&enp(t,3)&&enp(t,6)){let e=r.extentToBounds(r.getExtent());return[[e[0],e[2],e[4]],[e[0],e[2],e[5]],[e[0],e[3],e[4]],[e[0],e[3],e[5]],[e[1],e[2],e[4]],[e[1],e[2],e[5]],[e[1],e[3],e[4]],[e[1],e[3],e[5]]]}let[n,a,i]=r.getDimensions();return[[0,0,0],[n-1,0,0],[0,a-1,0],[n-1,a-1,0],[0,0,i-1],[n-1,0,i-1],[0,a-1,i-1],[n-1,a-1,i-1]].map(e=>r.indexToWorld(e))}function enf(e,t){let r=e?.imageData;if(!r)return;let n=r.getDimensions(),a=e.flatImageIdIndexToImageIdIndex,i=Math.min(Math.max(0,"function"==typeof a?a.call(e,Math.max(0,t)):t),n[2]-1);return r.indexToWorld([(n[0]-1)/2,(n[1]-1)/2,i])}function eng(e){let{viewState:t,fallbackImageIdIndex:r}=e,n=t?.slice;if(n?.kind!=="volumePoint"){if(n?.kind==="stackIndex")return n.imageIdIndex;if(t?.orientation===NQ.ACQUISITION)return r}}function eny(e){let{imageVolume:t,orientation:r}=e,n=end({imageVolume:t,orientation:r}),a=n?function(e){let{imageVolume:t,viewPlaneNormal:r,viewUp:n,canvasWidth:a,canvasHeight:i}=e,o=function(e){let{dimensions:t,direction:r,spacing:n,viewPlaneNormal:a,viewUp:i}=e,o=Array.from(r),s=o.slice(0,3),l=o.slice(3,6),u=o.slice(6,9),d=Lv.vec3.normalize(Lv.vec3.create(),i),c=Lv.vec3.normalize(Lv.vec3.create(),a),h=Lv.vec3.normalize(Lv.vec3.create(),Lv.vec3.cross(Lv.vec3.create(),d,c)),p=[s,l,u],m=er1(h,p),f=er1(Lv.vec3.negate(Lv.vec3.create(),d),p);if(void 0!==m&&void 0!==f&&m!==f)return{columns:t[m],rows:t[f],columnPixelSpacing:n[m],rowPixelSpacing:n[f]}}({dimensions:t.dimensions,direction:t.direction,spacing:t.spacing,viewPlaneNormal:r,viewUp:n});if(o){let e=Math.max(o.columns,1),t=Math.max(o.rows,1),r=e*o.columnPixelSpacing,n=t*o.rowPixelSpacing;return{fitParallelScale:er0({canvasHeight:er8(i),canvasWidth:er8(a),columnPixelSpacing:o.columnPixelSpacing,columns:e,rowPixelSpacing:o.rowPixelSpacing,rows:t}),sliceWidthWorld:r,sliceHeightWorld:n}}let s=t.imageData;if(s){let{widthWorld:e,heightWorld:t}=GA(s,r,n);if(e>0&&t>0)return{fitParallelScale:function(e){let{canvasHeight:t,canvasWidth:r,heightWorld:n,widthWorld:a}=e,i=er8(r),o=er8(t),s=Math.max(n,1e-6),l=Math.max(a,1e-6)/s/(i/o);return l<1?s/2:s*l/2}({canvasHeight:i,canvasWidth:a,widthWorld:e,heightWorld:t}),sliceWidthWorld:e,sliceHeightWorld:t}}return enc()}({...e,viewPlaneNormal:n.viewPlaneNormal,viewUp:n.viewUp}):enc();return function(e){let{center:t,fitParallelScale:r,imageIdIndex:n,imageVolume:a,orientation:i,sliceHeightWorld:o,sliceWidthWorld:s,viewState:l}=e,u=end({imageVolume:a,orientation:i});if(!u)return{sliceBasis:{sliceCenterWorld:[0,0,0],viewPlaneNormal:[0,0,1],viewUp:[0,-1,0],fitParallelScale:1,sliceWidthWorld:2,sliceHeightWorld:2,cameraDistance:1},currentImageIdIndex:0,maxImageIdIndex:0};let d=er6(u.viewPlaneNormal),c=er6(u.viewUp),{max:h,maxImageIdIndex:p,min:m,spacingInNormalDirection:f}=function(e){let{imageVolume:t,viewPlaneNormal:r}=e,n=enm(t),a=Math.max(qG(t,r),1e-6);if(!n.length)return{min:0,max:0,spacingInNormalDirection:a,maxImageIdIndex:0};let i=n.map(e=>Lv.vec3.dot(e,r)),o=Math.min(...i),s=Math.max(...i),l=Math.max(0,Math.round((s-o)/a));return{min:o,max:s,spacingInNormalDirection:a,maxImageIdIndex:l}}({imageVolume:a,viewPlaneNormal:d}),g=Lv.vec3.dot(t,d),y=l?.slice?.kind==="volumePoint"?l.slice.sliceWorldPoint:void 0,v=Math.min(h,Math.max(m,y?Lv.vec3.dot(y,d):g)),b=function(e){let{centerProjection:t,imageIdIndex:r,max:n,maxImageIdIndex:a,min:i}=e;return"number"!=typeof r?function(e){let{centerProjection:t,min:r,max:n,maxImageIdIndex:a}=e,i=n-r;return i>0&&0!==a?Math.round((t-r)/i*a):0}({centerProjection:t,min:i,max:n,maxImageIdIndex:a}):Math.min(Math.max(0,r),a)}({imageIdIndex:n,centerProjection:v,min:m,max:h,maxImageIdIndex:p}),w="number"==typeof n?Math.min(h,m+b*f):v;return{sliceBasis:{sliceCenterWorld:Lv.vec3.scaleAndAdd(Lv.vec3.create(),t,d,w-g),viewPlaneNormal:d,viewUp:c,fitParallelScale:r,sliceWidthWorld:s,sliceHeightWorld:o,cameraDistance:Math.max(h-m,f,1)},currentImageIdIndex:b,maxImageIdIndex:p}}({...e,center:function(e,t){let r=e.imageData;if(r){let e=r.getDimensions(),n=t?GL(e,r.getDirection(),t):e.map(e=>(e-1)/2);return r.indexToWorld(n)}let n=enm(e);if(!n.length)return[0,0,0];let a=Lv.vec3.create();for(let e of n)Lv.vec3.add(a,a,e);return Lv.vec3.scale(a,a,1/n.length)}(t,n?.viewPlaneNormal),...a})}function env(e){return eny(e)}function enb(e=NK.LINEAR){return e===NK.NEAREST}function enw(){return{slice:{kind:"stackIndex",imageIdIndex:0},orientation:NQ.ACQUISITION,flipHorizontal:!1,flipVertical:!1,anchorCanvas:[.5,.5],scale:[1,1],scaleMode:"fit",rotation:0}}function enx(e){return{...e.slice?{slice:function(e){if(e)return"stackIndex"===e.kind?{kind:"stackIndex",imageIdIndex:Math.max(0,Math.round(e.imageIdIndex))}:{kind:"volumePoint",sliceWorldPoint:[...e.sliceWorldPoint]}}(e.slice)}:{},orientation:ena(e.orientation)??NQ.ACQUISITION,flipHorizontal:!0===e.flipHorizontal,flipVertical:!0===e.flipVertical,anchorCanvas:e.anchorCanvas?[...e.anchorCanvas]:[.5,.5],scale:erW(e.scale),scaleMode:erU(e.displayArea?.scaleMode??e.scaleMode),rotation:er5(e.rotation??0),...e.displayArea?{displayArea:G_(e.displayArea)}:{},...e.anchorWorld?{anchorWorld:[...e.anchorWorld]}:{}}}function enC(e){let{fallbackImageIdIndex:t,viewState:r}=e;return r?.slice?.kind==="stackIndex"?r.slice.imageIdIndex:t}function enk(e){return[e[0],e[1]]}class enM extends erA{get pan(){return enk(this.getPresentation().pan)}get zoom(){return this.getPresentation().zoom}get scale(){return enk(this.getPresentation().scale)}get rotation(){return this.getPresentation().rotation}getSliceBasis(){return this.cachedSliceBasis||=this.buildSliceBasis(),this.cachedSliceBasis}canvasToWorld(e){return erX({camera:this.requireResolvedICamera(),canvasHeight:this.state.canvasHeight,canvasPos:e,canvasWidth:this.state.canvasWidth})}worldToCanvas(e){return erJ({camera:this.requireResolvedICamera(),canvasHeight:this.state.canvasHeight,canvasWidth:this.state.canvasWidth,worldPos:e})}getFrameOfReferenceUID(){return this.state.frameOfReferenceUID}withZoom(e,t){return this.withScale(e,t)}withScale(e,t){let r=erW(e);if(!t)return this.cloneWithViewState({...this.state.viewState,displayArea:void 0,scale:r,scaleMode:"fit"});let n=this.canvasToWorld(t);return this.cloneWithViewState({...this.state.viewState,anchorCanvas:[t[0]/Math.max(this.state.canvasWidth,1),t[1]/Math.max(this.state.canvasHeight,1)],anchorWorld:n,displayArea:void 0,scale:r,scaleMode:"fit"})}withPan(e){let t=this.pan,[r,n]=this.state.viewState.anchorCanvas??[.5,.5];return this.cloneWithViewState({...this.state.viewState,anchorCanvas:[r+(e[0]-t[0])/Math.max(this.state.canvasWidth,1),n+(e[1]-t[1])/Math.max(this.state.canvasHeight,1)],displayArea:void 0})}flipHorizontal(){return this.cloneWithViewState({...this.state.viewState,flipHorizontal:!this.state.viewState.flipHorizontal})}flipVertical(){return this.cloneWithViewState({...this.state.viewState,flipVertical:!this.state.viewState.flipVertical})}indexToWorld(e){}buildICamera(){return function(e){let{sliceBasis:t,camera:r,canvasHeight:n,canvasWidth:a}=e,i=er9({sliceBasis:t,camera:r,canvasWidth:a,canvasHeight:n}),{deltaWorld:o,parallelScale:s,presentationScale:l,viewPlaneNormal:u,viewUp:d}=function(e){let{sliceBasis:t,canvasWidth:r,canvasHeight:n,flipHorizontal:a,flipVertical:i,pan:o=[0,0],rotation:s,scale:l=[1,1]}=e,u=er6(t.viewPlaneNormal),d=er6(er3({rotation:s,viewPlaneNormal:u,viewUp:t.viewUp})),{viewPlaneNormal:c,viewUp:h}=er4({flipHorizontal:a,flipVertical:i,viewPlaneNormal:u,viewUp:d}),p=Lv.vec3.cross(Lv.vec3.create(),h,c);0===Lv.vec3.length(p)&&(p=Lv.vec3.fromValues(1,0,0)),p=Lv.vec3.normalize(Lv.vec3.create(),p);let[m,f]=erW(l),[g,y]=o,v=t.fitParallelScale/f,b=er8(r),w=er8(n),x=2*v,C=Lv.vec3.create();return Lv.vec3.scaleAndAdd(C,C,p,f/m*(b/w*x)*g/b),Lv.vec3.scaleAndAdd(C,C,h,-y*x/w),{deltaWorld:C,parallelScale:v,presentationScale:[m,f],viewPlaneNormal:c,viewUp:h}}({sliceBasis:t,canvasWidth:a,canvasHeight:n,flipHorizontal:i.flipHorizontal,flipVertical:i.flipVertical,pan:i.pan,rotation:i.rotation,scale:i.scale}),c=Lv.vec3.subtract(Lv.vec3.create(),t.sliceCenterWorld,o);return{focalPoint:c,parallelProjection:!0,parallelScale:s,presentationScale:l,scale:i.scale,scaleMode:erU(r?.scaleMode),position:Lv.vec3.scaleAndAdd(Lv.vec3.create(),c,u,t.cameraDistance),flipHorizontal:i.flipHorizontal,flipVertical:i.flipVertical,viewPlaneNormal:u,viewUp:d}}({camera:this.state.viewState,canvasHeight:this.state.canvasHeight,canvasWidth:this.state.canvasWidth,sliceBasis:this.getSliceBasis()})}getPresentation(){return this.cachedPresentation||=er9({camera:this.state.viewState,canvasHeight:this.state.canvasHeight,canvasWidth:this.state.canvasWidth,sliceBasis:this.getSliceBasis()}),this.cachedPresentation}requireResolvedICamera(){let e=this.toICamera();if(!e.focalPoint||"number"!=typeof e.parallelScale||!e.viewPlaneNormal||!e.viewUp)throw Error("[PlanarResolvedView] Failed to compute planar viewState");return{focalPoint:er2(e.focalPoint),parallelScale:e.parallelScale,presentationScale:e.presentationScale?enk(e.presentationScale):void 0,viewPlaneNormal:er2(e.viewPlaneNormal),viewUp:er2(e.viewUp)}}createViewStateState(e){return{...this.state,viewState:enx(e)}}}class enS extends enM{constructor(e){super({...e,viewState:enx(e.viewState||enw())})}buildSliceBasis(){let e={canvasHeight:this.state.canvasHeight,canvasWidth:this.state.canvasWidth,image:this.state.image};return this.state.usePixelGridCenter,function(e){let{image:t}=e,{dimensions:r,spacing:n}=HH(t);return function(e){let{canvasHeight:t,canvasWidth:r,columnOffset:n,columnsForFit:a,image:i,rowOffset:o,rowsForFit:s}=e,{direction:l,origin:u}=HH(i),d=l.slice(0,3),c=l.slice(3,6),h=l.slice(6,9).map(e=>-e),p=c.map(e=>-e),m=[...u],f=Math.max(a,1)*(i.columnPixelSpacing||1),g=Math.max(s,1)*(i.rowPixelSpacing||1);return Lv.vec3.scaleAndAdd(m,m,d,o),Lv.vec3.scaleAndAdd(m,m,c,n),{sliceCenterWorld:m,viewPlaneNormal:Lv.vec3.clone(h),viewUp:p,fitParallelScale:er0({canvasHeight:t,canvasWidth:r,columnPixelSpacing:i.columnPixelSpacing||1,columns:a,rowPixelSpacing:i.rowPixelSpacing||1,rows:s}),sliceWidthWorld:f,sliceHeightWorld:g,cameraDistance:1}}({...e,rowOffset:(r[0]-1)/2*n[0],columnOffset:(r[1]-1)/2*n[1],rowsForFit:Math.max(t.rows,1),columnsForFit:Math.max(t.columns,1)})}(e)}cloneWithViewState(e){return new enS(this.createViewStateState(e))}}class enE extends enM{constructor(e){const{sliceBasis:t,...r}=e;super({...r,viewState:enx(e.viewState||enw())}),this.cachedSliceBasis=t}indexToWorld(e){return this.state.imageVolume.imageData?.indexToWorld(e)}buildSliceBasis(){return(this.state.usePixelGridCenter?env:eny)({viewState:this.state.viewState,canvasHeight:this.state.canvasHeight,canvasWidth:this.state.canvasWidth,imageIdIndex:eng({viewState:this.state.viewState,fallbackImageIdIndex:this.state.currentImageIdIndex}),imageVolume:this.state.imageVolume,orientation:this.state.viewState.orientation}).sliceBasis}cloneWithViewState(e){return new enE(this.createViewStateState(e))}}function enT(e){return e.currentImageIdIndex}function enI(e){let{renderContext:t,rendering:r}=e;if(r.renderMode===eyK.CPU_IMAGE||r.renderMode===eyK.CPU_VOLUME){if(!t.cpu)throw Error("[PlanarResolvedView] CPU render paths require a CPU canvas context");return erQ(t.cpu.canvas)}if(!t.vtk)throw Error("[PlanarResolvedView] VTK render paths require a VTK canvas context");return{canvasHeight:t.vtk.canvas.clientHeight||t.vtk.canvas.height,canvasWidth:t.vtk.canvas.clientWidth||t.vtk.canvas.width}}function enP(e){let{data:t,frameOfReferenceUID:r,imageIds:n,canvasDimensions:a,renderContext:i,rendering:o,sliceIndex:s}=e;if(!o)return;let{canvasHeight:l,canvasWidth:u}=a??enI({renderContext:i,rendering:o}),d=e.viewState;if(o.renderMode===eyK.CPU_IMAGE||o.renderMode===eyK.VTK_IMAGE){let e=(o.renderMode===eyK.CPU_IMAGE?o.enabledElement?.image:o.currentImage)||t?.image;if(!e)return;let a=enC({fallbackImageIdIndex:enT(o),viewState:d}),i=n?.length??t?.imageIds.length,s="number"==typeof i&&i>0?i-1:Math.max(a,enT(o),0);return new enS({viewState:d,canvasHeight:l,canvasWidth:u,currentImageIdIndex:a,frameOfReferenceUID:r,image:e,maxImageIdIndex:s,usePixelGridCenter:o.renderMode===eyK.CPU_IMAGE})}if(o.renderMode===eyK.CPU_VOLUME||o.renderMode===eyK.VTK_VOLUME_SLICE){let e="number"==typeof s?{...d,slice:{kind:"stackIndex",imageIdIndex:s}}:d,t=enb(o.dataPresentation?.interpolationType)?env:eny,n="number"==typeof s?s:eng({viewState:e,fallbackImageIdIndex:o.currentImageIdIndex}),{currentImageIdIndex:a,maxImageIdIndex:i,sliceBasis:c}=t({viewState:e,canvasHeight:l,canvasWidth:u,imageIdIndex:n,imageVolume:o.imageVolume,orientation:e.orientation});return new enE({viewState:e,canvasHeight:l,canvasWidth:u,currentImageIdIndex:a,frameOfReferenceUID:r,imageVolume:o.imageVolume,maxImageIdIndex:i,sliceBasis:c,usePixelGridCenter:o.renderMode===eyK.CPU_VOLUME&&enb(o.dataPresentation?.interpolationType)})}}function en_(e){let{projection:t,rendering:r,viewState:n}=e;return t?t.currentImageIdIndex:r.renderMode===eyK.CPU_IMAGE||r.renderMode===eyK.VTK_IMAGE?enC({fallbackImageIdIndex:r.currentImageIdIndex,viewState:n}):r.currentImageIdIndex}function enD(e){let t=e.view.activeSourceICamera;if(t?.focalPoint&&"number"==typeof t.parallelScale&&t.viewPlaneNormal&&t.viewUp)return t}function enO(e){let t=enD(e.ctx);if(!t)return[0,0,0];let{canvasWidth:r,canvasHeight:n}=erQ(e.canvas);return erX({camera:t,canvasWidth:r,canvasHeight:n,canvasPos:e.canvasPos})}function enA(e){let t=enD(e.ctx);if(!t)return[0,0];let{canvasWidth:r,canvasHeight:n}=erQ(e.canvas);return erJ({camera:t,canvasWidth:r,canvasHeight:n,worldPos:e.worldPos})}function enR(e){var t;let{ctx:r,data:n,dataId:a,frameOfReferenceUID:i,imageIds:o,rendering:s,sliceIndex:l,viewState:u={}}=e,d=enP({viewState:u,data:n,frameOfReferenceUID:i,imageIds:o,rendering:s,renderContext:r,sliceIndex:l});if(!d)return;let c=d.toICamera(),h=r.viewport.isCurrentDataId(a);return h&&(r.view.activeSourceICamera=c),{activeSourceICamera:h?c:enD(r)||c,currentImageIdIndex:d.state.currentImageIdIndex,isSourceBinding:h,maxImageIdIndex:d.state.maxImageIdIndex,presentation:{pan:(t=d).pan,zoom:t.zoom,scale:t.scale,rotation:t.rotation,flipHorizontal:t.state.viewState.flipHorizontal??!1,flipVertical:t.state.viewState.flipVertical??!1},resolvedICamera:c,resolvedView:d}}class enL{async addData(e,t,r){let n;if(!t.image)throw Error("[PlanarViewport] CPU rendering requires an image");e.display.activateRenderMode(eyK.CPU_IMAGE),enj(t.image);let a=new etQ({getImageData:()=>this.getImageData(n)},t.image);a.setVisibility(!0);let i=qR(e.cpu.canvas,t.image,enW(t.image));i.displayedArea=erH(t.image);let o={canvas:e.cpu.canvas,image:t.image,renderingTools:{},viewport:i};return qN(o,!0),o.transform=Gj(o),n={renderMode:eyK.CPU_IMAGE,actorEntryUID:F2(),enabledElement:o,compatibilityActor:a,currentImageIdIndex:t.initialImageIdIndex??0,defaultVOIRange:qi(t.image),dataPresentation:void 0,fitScale:enF(o.viewport.scale),loadRequestId:0,renderingInvalidated:!0},erG(e,{image:t.image,imageIdIndex:t.initialImageIdIndex??0}),{rendering:n,updateDataPresentation:e=>{this.updateDataPresentation(n,e)},applyViewState:r=>{this.applyViewState(e,n,t.id,r,t.imageIds)},getFrameOfReferenceUID:()=>this.getFrameOfReferenceUID(n),getActorEntry:e=>erF(e,{actor:n.compatibilityActor,mapper:n.compatibilityActor.getMapper(),renderMode:eyK.CPU_IMAGE,uid:n.actorEntryUID,referencedIdFallback:n.enabledElement.image?.imageId}),getImageData:()=>this.getImageData(n),render:()=>{this.render(e,n,t.id)},resize:()=>{this.resize(e,n,t.id)},removeData:()=>{this.removeData(e,n)}}}updateDataPresentation(e,t){e.dataPresentation=t,enV(e,e.dataPresentation)}applyViewState(e,t,r,n,a){let i=t.enabledElement.image;e.display.activateRenderMode(eyK.CPU_IMAGE);let o=i?enR({ctx:e,dataId:r,imageIds:a,rendering:t,viewState:n}):void 0,s=en_({projection:o,rendering:t,viewState:n});if(o&&enB(t,o.presentation,o.resolvedICamera),s===(t.lastRequestedImageIdIndex??t.currentImageIdIndex)||s<0||s>=a.length)return;t.lastRequestedImageIdIndex=s;let l=++t.loadRequestId;qI(a[s]).then(n=>{l===t.loadRequestId&&enz({ctx:e,dataId:r,image:n,imageIdIndex:s,props:t.dataPresentation,rendering:t})})}canvasToWorld(e,t,r){return enO({canvas:e.cpu.canvas,canvasPos:r,ctx:e})}worldToCanvas(e,t,r){return enA({canvas:e.cpu.canvas,ctx:e,worldPos:r})}getFrameOfReferenceUID(e){let t=e.enabledElement.image?.imageId,r=t?HB(FC.IMAGE_PLANE,t):void 0;return r?.frameOfReferenceUID}getImageData(e){let t=e.enabledElement.image;if(t)return enU(t,this.getFrameOfReferenceUID(e))}render(e,t,r){e.viewport.isCurrentDataId(r)&&(function(e){let{enabledElement:t,renderingInvalidated:r}=e;t.image&&(qr(t,r),e.renderingInvalidated=!1)}(t),function(e){for(let t of e.viewport.getOverlayActors())t.actorMapper?.renderMode===eyK.CPU_IMAGE&&t.actor.render(void 0,e.cpu.context)}(e),e.display.markRendered(),Bh(e.viewport.element,NH.IMAGE_RENDERED,{element:e.viewport.element,viewportId:e.viewportId,renderingEngineId:e.renderingEngineId,viewportStatus:Fw.RENDERED}))}resize(e,t,r){qN(t.enabledElement,!0);let n=t.enabledElement.image,a=e.viewport.getViewState();if(!n)return;let i=enR({ctx:e,dataId:r,rendering:t,viewState:a});t.fitScale=enF(qR(t.enabledElement.canvas,n,enW(n)).scale),t.renderingInvalidated=!0,i&&enB(t,i.presentation,i.resolvedICamera)}removeData(e,t){let{enabledElement:r}=t;e.cpu.context.setTransform(1,0,0,1,0,0),e.cpu.context.clearRect(0,0,e.cpu.canvas.width,e.cpu.canvas.height),r.image=void 0}}class enN{constructor(){this.id="planar:cpu-image-slice",this.type=Nq.PLANAR_NEXT}matches(e,t){return"image"===e.type&&t.renderMode===eyK.CPU_IMAGE}createRenderPath(){return new enL}selectContext(e){return{viewportId:e.viewportId,renderingEngineId:e.renderingEngineId,type:e.type,viewport:e.viewport,renderPath:e.renderPath,view:e.view,display:e.display,cpu:e.cpu}}}function enV(e,t){let{enabledElement:r,defaultVOIRange:n}=e,{viewport:a}=r,i=r.canvas,o=t?.voiRange??n;if(i.style.display=t?.visible===!1?"none":"",i.style.opacity=String(t?.opacity??1),a.colormap=G5(t?.colormap,r.image?.colormap),a.invert=t?.invert??!1,o){let{windowCenter:e,windowWidth:t}=Gm(o.lower,o.upper);a.voi={windowCenter:e,windowWidth:t,voiLUTFunction:r.image?.voiLUTFunction}}e.renderingInvalidated=!0,t?.interpolationType!==void 0&&(a.pixelReplication=t.interpolationType!==NK.LINEAR)}function enF(e){return Array.isArray(e)?e[1]:e??1}function enB(e,t,r){let{enabledElement:n,fitScale:a}=e,i=n.viewport,o=t?.pan??[0,0],s=Math.max(t?.zoom??1,.001);i.hflip=t?.flipHorizontal??!1,i.vflip=t?.flipVertical??!1,i.rotation=t?.rotation??0,i.scale="number"==typeof r?.parallelScale?function(e){let{canvas:t,columnPixelSpacing:r,parallelScale:n,presentationScale:a,rowPixelSpacing:i}=e,o=Math.max((n??1)*2,1e-6),s=t.height/o,l=erz(a);if(Math.abs(l-1)>1e-6){let e=Math.max(t.height,1),n=Math.max(t.width,1);return[Math.max(n*(r||1)/Math.max(n/e*o*(1/l),1e-6),1e-6),Math.max(e*(i||1)/o,1e-6)]}return Math.max(Math.min(i||1,r||1)*s,1e-6)}({canvas:n.canvas,parallelScale:r.parallelScale,presentationScale:r.presentationScale,columnPixelSpacing:n.image?.columnPixelSpacing||1,rowPixelSpacing:n.image?.rowPixelSpacing||1}):[a*(t?.scale?.[0]??s),a*s],i.parallelScale=r?.parallelScale,i.translation=r?.focalPoint?function(e,t){let{image:r,viewport:n}=e,a=n.translation||{x:0,y:0};if(!r)return a;n.translation={x:0,y:0},e.transform=Gj(e);let i=qP(e,[e.canvas.width/2,e.canvas.height/2]),o=function(e,t){let{image:r,viewport:n}=e;if(!r)return[0,0];let{spacing:a,direction:i,origin:o}=HH(r),s=i.slice(0,3),l=i.slice(3,6),u=n.displayedArea,d=(u?.tlhc.x??1)-1,c=(u?.tlhc.y??1)-1,h=Lv.vec3.subtract(Lv.vec3.create(),t,o);return[Lv.vec3.dot(h,s)/a[0]+.5-d,Lv.vec3.dot(h,l)/a[1]+.5-c]}(e,t),s=qH({x:o[0]-i[0],y:o[1]-i[1]},n);return n.translation=a,{x:-s.x,y:-s.y}}(n,r.focalPoint):function(e,t){let{viewport:r}=e,n=r.translation||{x:0,y:0};r.translation={x:0,y:0};let a=Gj(e).transformPoint([0,0]);r.translation={x:1,y:0};let i=Gj(e).transformPoint([0,0]);r.translation={x:0,y:1};let o=Gj(e).transformPoint([0,0]);r.translation=n;let s=[i[0]-a[0],i[1]-a[1]],l=[o[0]-a[0],o[1]-a[1]],u=s[0]*l[1]-s[1]*l[0];return 1e-6>Math.abs(u)?{x:0,y:0}:{x:(t[0]*l[1]-t[1]*l[0])/u,y:(s[0]*t[1]-s[1]*t[0])/u}}(n,o),n.transform=Gj(n)}function enj(e){e.isPreScaled=e.preScale?.scaled}function enW(e){return e.preScale?.scalingParameters?.modality||ee.get(FC.GENERAL_SERIES,e.imageId)?.modality}function enU(e,t){let r=HH(e),{dimensions:n,direction:a,modality:i,origin:o,spacing:s}=r,l=HB("calibratedPixelSpacing",e.imageId),u=l?{...r.calibration,...l}:r.calibration,d=a.slice(0,3),c=a.slice(3,6),h=e.voxelManager?.getScalarData()||e.getPixelData?.();return{dimensions:n,spacing:s,origin:o,direction:a,metadata:{Modality:i,FrameOfReferenceUID:t},imageData:{getDirection:()=>a,getDimensions:()=>n,getScalarData:()=>h,getSpacing:()=>s,worldToIndex:e=>{let t=Lv.vec3.subtract(Lv.vec3.create(),e,o);return[Lv.vec3.dot(t,d)/s[0],Lv.vec3.dot(t,c)/s[1],0]},indexToWorld:e=>{let t=[...o];return Lv.vec3.scaleAndAdd(t,t,d,e[0]*s[0]),Lv.vec3.scaleAndAdd(t,t,c,e[1]*s[1]),t}},scalarData:h,scaling:e.scaling,hasPixelSpacing:!!(e.rowPixelSpacing||e.columnPixelSpacing),calibration:u,preScale:e.preScale,voxelManager:e.voxelManager}}async function enz(e){let{ctx:t,dataId:r,image:n,imageIdIndex:a,props:i,rendering:o}=e,s=o.enabledElement;enj(n);let l=t.viewport.getViewState(),u=qR(t.cpu.canvas,n,enW(n)),d=s.viewport;u.displayedArea=erH(n),s.image=n,s.viewport={...u,hflip:d?.hflip??u.hflip,invert:u.invert,pixelReplication:d?.pixelReplication??u.pixelReplication,rotation:d?.rotation??u.rotation,translation:d?.translation??u.translation,vflip:d?.vflip??u.vflip},o.currentImageIdIndex=a,o.defaultVOIRange=qi(n),o.fitScale=enF(u.scale),o.renderingInvalidated=!0,t.viewport.invalidateResolvedView(),o.compatibilityActor.getMapper().getInputData().setDerivedImage(n),enV(o,i);let c=enR({ctx:t,dataId:r,rendering:o,viewState:l});c&&enB(o,c.presentation,c.resolvedICamera),erG(t,{image:n,imageIdIndex:a}),t.display.renderNow()}function enH(e,t){return Lv.vec3.dot(e,t)}function enG(e,t,r=.995){let n=e.direction.slice(0,3),a=e.direction.slice(3,6),i=e.direction.slice(6,9),o=[enH(t,n),enH(t,a),enH(t,i)],s=o.map(e=>Math.abs(e)),l=Math.max(...s),u=s.indexOf(l);if(!(l<r)&&!s.filter((e,t)=>t!==u).some(e=>e>1-r))return{axis:u,sign:o[u]>=0?1:-1}}function enq(e,t){if(!(t<-.5001)&&!(t>e-.5+1e-4))return Math.min(e-1,Math.max(0,t))}function en$(e){return Math.floor(e+.5-1e-6)}function enK(e,t,r=1e-6){for(let n=0;n<3;n++)if(n!==t&&Math.abs(e[n])>r)return!1;return!0}function enY(e){return Math.round(1e6*e)}class enZ{constructor(){this.completeScalarDataCache=new WeakMap,this.axisAlignedGeometryCache=new WeakMap}clearCachedVoxelManager(e){this.completeScalarDataCache.delete(e),this.axisAlignedGeometryCache.delete(e)}getCompleteScalarDataArray(e){let t=this.completeScalarDataCache.get(e);if(t)return t;let r=e.getCompleteScalarDataArray?.();if(r)return r.length&&this.completeScalarDataCache.set(e,r),r}sampleAxisAligned(e){let{volume:t,voxelManager:r,pixelData:n,width:a,height:i,rowStartIndex:o,xStepIndexDelta:s,yStepIndexDelta:l,right:u,up:d,normal:c,interpolationType:h,numberOfComponents:p,fallbackMin:m,fallbackMax:f}=e;if(1!==p||!r.getCompleteScalarDataArray)return;let g=enG(t,c),y=enG(t,u),v=enG(t,d);if(!g||!y||!v||g.axis===y.axis||g.axis===v.axis||y.axis===v.axis)return;let b=this.getCompleteScalarDataArray(r);if(!b?.length)return;let w=n instanceof Float32Array||n instanceof Float64Array,x=this.trySampleFixedAxisAligned({volume:t,voxelManager:r,scalarData:b,pixelData:n,width:a,height:i,rowStartIndex:o,xStepIndexDelta:s,yStepIndexDelta:l,rightAxis:y,upAxis:v,normalAxis:g,interpolationType:h,fallbackMin:m,fallbackMax:f,preserveFloatScalarSamples:w});return x||this.sampleGeneralAxisAligned({scalarData:b,pixelData:n,dimensions:t.dimensions,width:a,height:i,rowStartIndex:o,xStepIndexDelta:s,yStepIndexDelta:l,interpolationType:h,fallbackMin:m,fallbackMax:f,preserveFloatScalarSamples:w})}sampleGeneralAxisAligned(e){let{scalarData:t,pixelData:r,dimensions:n,width:a,height:i,rowStartIndex:o,xStepIndexDelta:s,yStepIndexDelta:l,interpolationType:u,fallbackMin:d,fallbackMax:c,preserveFloatScalarSamples:h}=e,p=1/0,m=-1/0,f=0,g=o[0],y=o[1],v=o[2];for(let e=0;e<i;e++){let e=g,i=y,o=v;for(let l=0;l<a;l++){let a=this.sampleScalarDataAtContinuousCoordinates(t,n,e,i,o,u),l=Number.isFinite(a)?h?Math.min(c,Math.max(d,a)):Math.round(Math.min(c,Math.max(d,a))):d;r[f++]=l,p=Math.min(p,l),m=Math.max(m,l),e+=s[0],i+=s[1],o+=s[2]}g+=l[0],y+=l[1],v+=l[2]}return{min:p,max:m}}trySampleFixedAxisAligned(e){let{volume:t,voxelManager:r,scalarData:n,pixelData:a,width:i,height:o,rowStartIndex:s,xStepIndexDelta:l,yStepIndexDelta:u,rightAxis:d,upAxis:c,normalAxis:h,interpolationType:p,fallbackMin:m,fallbackMax:f,preserveFloatScalarSamples:g}=e;if(!enK(l,d.axis)||!enK(u,c.axis))return;let y=this.getOrCreateAxisAlignedGeometry({voxelManager:r,dimensions:t.dimensions,width:i,height:o,rowStartIndex:s,xStepIndexDelta:l,yStepIndexDelta:u,rightAxis:d,upAxis:c,normalAxis:h,interpolationType:p}),v=this.createSingleAxisInterpolation(t.dimensions[h.axis],s[h.axis],p);return p===NK.NEAREST?this.sampleNearestFixedAxis({scalarData:n,pixelData:a,dimensions:t.dimensions,width:i,height:o,rightAxis:d.axis,upAxis:c.axis,normalAxis:h.axis,geometry:y,normal:v,fallbackMin:m,fallbackMax:f,preserveFloatScalarSamples:g}):this.sampleLinearFixedAxis({scalarData:n,pixelData:a,dimensions:t.dimensions,width:i,height:o,rightAxis:d.axis,upAxis:c.axis,normalAxis:h.axis,geometry:y,normal:v,fallbackMin:m,fallbackMax:f,preserveFloatScalarSamples:g})}getOrCreateAxisAlignedGeometry(e){let{voxelManager:t,dimensions:r,width:n,height:a,rowStartIndex:i,xStepIndexDelta:o,yStepIndexDelta:s,rightAxis:l,upAxis:u,normalAxis:d,interpolationType:c}=e,h=[c,r[0],r[1],r[2],n,a,l.axis,u.axis,d.axis,enY(i[l.axis]),enY(i[u.axis]),enY(o[l.axis]),enY(s[u.axis])].join(":"),p=this.axisAlignedGeometryCache.get(t);p||(p=new Map,this.axisAlignedGeometryCache.set(t,p));let m=p.get(h);if(m)return m;let f={key:h,columns:this.createAxisInterpolationPlan(r[l.axis],i[l.axis],o[l.axis],n,c),rows:this.createAxisInterpolationPlan(r[u.axis],i[u.axis],s[u.axis],a,c)};if(p.set(h,f),p.size>8){let e=p.keys().next().value;p.delete(e)}return f}createAxisInterpolationPlan(e,t,r,n,a){let i=new Int32Array(n),o=new Int32Array(n),s=new Float64Array(n),l=new Uint8Array(n),u=t;for(let t=0;t<n;t++){let n=this.createSingleAxisInterpolation(e,u,a);i[t]=n.lower,o[t]=n.upper,s[t]=n.fraction,l[t]=+!!n.valid,u+=r}return{lower:i,upper:o,fraction:s,valid:l}}createSingleAxisInterpolation(e,t,r){let n=enq(e,t);if(void 0===n)return{lower:-1,upper:-1,fraction:0,valid:!1};if(r===NK.NEAREST){let e=en$(n);return{lower:e,upper:e,fraction:0,valid:!0}}let a=Math.floor(n),i=Math.min(a+1,e-1);return{lower:a,upper:i,fraction:n-a,valid:!0}}sampleNearestFixedAxis(e){let{scalarData:t,pixelData:r,dimensions:n,width:a,height:i,rightAxis:o,upAxis:s,normalAxis:l,geometry:u,normal:d,fallbackMin:c,fallbackMax:h,preserveFloatScalarSamples:p}=e,m=[1,n[0],n[0]*n[1]],f=u.columns,g=u.rows,y=1/0,v=-1/0,b=0;if(!d.valid)return r.fill(c),{min:c,max:c};let w=d.lower*m[l];for(let e=0;e<i;e++){if(!g.valid[e]){for(let e=0;e<a;e++)r[b++]=c;y=Math.min(y,c),v=Math.max(v,c);continue}let n=g.lower[e]*m[s]+w;for(let e=0;e<a;e++){let a=c;if(f.valid[e]){let r=Number(t[n+f.lower[e]*m[o]]);a=Number.isFinite(r)?p?Math.min(h,Math.max(c,r)):Math.round(Math.min(h,Math.max(c,r))):c}r[b++]=a,y=Math.min(y,a),v=Math.max(v,a)}}return{min:y,max:v}}sampleLinearFixedAxis(e){let{scalarData:t,pixelData:r,dimensions:n,width:a,height:i,rightAxis:o,upAxis:s,normalAxis:l,geometry:u,normal:d,fallbackMin:c,fallbackMax:h,preserveFloatScalarSamples:p}=e,m=[1,n[0],n[0]*n[1]],f=u.columns,g=u.rows,y=d.lower*m[l],v=d.upper*m[l],b=d.fraction,w=1-b,x=1/0,C=-1/0,k=0;if(!d.valid)return r.fill(c),{min:c,max:c};for(let e=0;e<i;e++){if(!g.valid[e]){for(let e=0;e<a;e++)r[k++]=c;x=Math.min(x,c),C=Math.max(C,c);continue}let n=g.lower[e]*m[s],i=g.upper[e]*m[s],l=g.fraction[e],u=1-l;for(let e=0;e<a;e++){let a=c;if(f.valid[e]){let r=f.lower[e]*m[o],s=f.upper[e]*m[o],d=f.fraction[e],g=1-d,x=((Number(t[r+n+y])*g+Number(t[s+n+y])*d)*u+(Number(t[r+i+y])*g+Number(t[s+i+y])*d)*l)*w+((Number(t[r+n+v])*g+Number(t[s+n+v])*d)*u+(Number(t[r+i+v])*g+Number(t[s+i+v])*d)*l)*b;a=Number.isFinite(x)?p?Math.min(h,Math.max(c,x)):Math.round(Math.min(h,Math.max(c,x))):c}r[k++]=a,x=Math.min(x,a),C=Math.max(C,a)}}return{min:x,max:C}}sampleScalarDataAtContinuousCoordinates(e,t,r,n,a,i){let o=enq(t[0],r),s=enq(t[1],n),l=enq(t[2],a);return void 0===o||void 0===s||void 0===l?NaN:i===NK.NEAREST?this.sampleNearestScalarDataAtContinuousCoordinates(e,t,o,s,l):this.sampleLinearScalarDataAtContinuousCoordinates(e,t,o,s,l)}sampleNearestScalarDataAtContinuousCoordinates(e,t,r,n,a){let i=en$(r),o=en$(n),s=en$(a);return Number(e[i+o*t[0]+s*t[0]*t[1]])}sampleLinearScalarDataAtContinuousCoordinates(e,t,r,n,a){let i=t[0],o=t[1],s=t[2],l=i*o,u=Math.floor(r),d=Math.floor(n),c=Math.floor(a),h=Math.min(u+1,i-1),p=Math.min(d+1,o-1),m=Math.min(c+1,s-1),f=r-u,g=n-d,y=a-c,v=1-f,b=1-g,w=d*i,x=p*i,C=c*l,k=m*l;return((Number(e[u+w+C])*v+Number(e[h+w+C])*f)*b+(Number(e[u+x+C])*v+Number(e[h+x+C])*f)*g)*(1-y)+((Number(e[u+w+k])*v+Number(e[h+w+k])*f)*b+(Number(e[u+x+k])*v+Number(e[h+x+k])*f)*g)*y}}function enX(e,t){return Lv.vec3.dot(e,t)}function enJ(e,t,r,n){if(!Number.isFinite(e))return t;let a=e;return a<t?a=t:a>r&&(a=r),n?Math.round(a):a}function enQ(e,t){t<e.min&&(e.min=t),t>e.max&&(e.max=t)}function en0(e,t){return Lv.vec3.subtract([0,0,0],e,t)}function en1(e,t,r=1e-4){return Lv.vec3.distance(e,t)<=r}function en2(e,t){let r=e.direction.slice(0,3),n=e.direction.slice(3,6),a=e.direction.slice(6,9);return[enX(t,r)/e.spacing[0],enX(t,n)/e.spacing[1],enX(t,a)/e.spacing[2]]}class en5{constructor(){this.sampleSequence=0,this.scalarViewportSampler=new enZ,this.scalarRangeCache=new WeakMap,this.sliceArrayPool=new Map}clearCachedScalarRange(e){this.scalarRangeCache.delete(e),this.scalarViewportSampler.clearCachedVoxelManager(e)}releaseSampledSliceState(e){let t=e?.image.getPixelData?.();!t||!ArrayBuffer.isView(t)||t instanceof DataView||this.releaseSliceArray(t)}clearSliceArrayPool(){this.sliceArrayPool.clear()}getScalarDataRange(e){let t;t=this.scalarViewportSampler.getCompleteScalarDataArray(e)??e.getScalarData();let r=1/0,n=-1/0;for(let e=0;e<t.length;e++){let a=Number(t[e]);Number.isFinite(a)&&(a<r&&(r=a),a>n&&(n=a))}return{min:r,max:n}}getCameraBasis(e){let t=Lv.vec3.normalize(Lv.vec3.create(),e.viewPlaneNormal),r=Lv.vec3.normalize(Lv.vec3.create(),e.viewUp),n=Lv.vec3.cross(Lv.vec3.create(),r,t);Lv.vec3.length(n)<FP&&(n=Lv.vec3.cross(Lv.vec3.create(),[0,1,0],t)),n=Lv.vec3.normalize(Lv.vec3.create(),n);let a=Lv.vec3.normalize(Lv.vec3.create(),Lv.vec3.cross(Lv.vec3.create(),t,n));return{right:n,up:a,normal:t}}getResolvedVOIRange(e,t,r){return e&&Number.isFinite(e.lower)&&Number.isFinite(e.upper)&&e.upper>e.lower?e:r>t?{lower:t,upper:r}:{lower:t,upper:t+1}}getFallbackStoredRange(e){let t=e.voxelManager,[r,n]=t.getRange(),a=Number.isFinite(r)?Math.floor(r):0,i=Number.isFinite(n)?Math.ceil(n):a+1;if(i<=a){let e=this.scalarRangeCache.get(t);if(e)return e;let r=this.getScalarDataRange(t);Number.isFinite(r.min)&&(a=Math.floor(r.min)),Number.isFinite(r.max)&&(i=Math.ceil(r.max))}i<=a&&(i=a+1);let o={min:a,max:i};return this.scalarRangeCache.set(t,o),o}createOrUpdateEnabledElement(e){let{enabledElement:t,canvas:r,image:n,modality:a}=e;return t?(t.canvas=r,t.image=n,t.options||={},t.options.transparentBackground=!0,t.viewport=qR(r,n,a),t):{canvas:r,image:n,options:{transparentBackground:!0},renderingTools:{},viewport:qR(r,n,a)}}updateCPUFallbackViewport(e){let{enabledElement:t,sampledSliceState:r,camera:n,dataPresentation:a,defaultVOIRange:i}=e,o=r.image.rowPixelSpacing||1,s=r.image.columnPixelSpacing||1,l=en0(n.focalPoint,r.translationReferenceFocalPoint),u=t.viewport,d=this.getResolvedVOIRange(a?.voiRange??i,r.image.minPixelValue??0,r.image.maxPixelValue??1);u.translation={x:-enX(l,r.right)/s,y:enX(l,r.up)/o},u.scale=function(e){let{camera:t,canvas:r,columnPixelSpacing:n,rowPixelSpacing:a}=e,i=Math.max((t.parallelScale??1)*2,FP),o=r.height/i,s=erz(t.presentationScale);if(Math.abs(s-1)>FP){let e=Math.max(r.height,1),t=Math.max(r.width,1);return[Math.max(t*(n||1)/Math.max(t/e*i*(1/s),FP),FP),Math.max(e*(a||1)/i,FP)]}return Math.max(Math.min(a||1,n||1)*o,FP)}({canvas:t.canvas,camera:n,columnPixelSpacing:s,rowPixelSpacing:o}),u.parallelScale=n.parallelScale,u.colormap=G5(a?.colormap,r.image.colormap,{voiRange:d}),u.invert=a?.invert??!1,u.pixelReplication=a?.interpolationType===NK.NEAREST,u.voi={windowCenter:(d.lower+d.upper)/2,windowWidth:Math.max(d.upper-d.lower,1),voiLUTFunction:N2.LINEAR}}needsResample(e){return"reuse"!==this.getResampleDecision(e)}getResampleDecision(e){let{sampledSliceState:t,width:r,height:n,camera:a,dataPresentation:i,deferViewportResample:o=!1}=e;if(!t)return"resample";let{right:s,up:l,normal:u}=this.getCameraBasis(a),d=a.focalPoint,c=i?.interpolationType??NK.LINEAR,h=en0(d,t.focalPoint),p=Math.abs(enX(h,t.normal)),m=t.image.columnPixelSpacing||1,f=t.image.rowPixelSpacing||1,g=Math.abs(enX(h,t.right))/m,y=Math.abs(enX(h,t.up))/f,v=t.samplingMode??"viewport",b=Math.max(a.parallelScale??1,FP),w=erz(a.presentationScale),x=!en1(t.right,s)||!en1(t.up,l)||!en1(t.normal,u),C=p>.5*t.spacingInNormalDirection;return t.canvasWidth!==r||t.canvasHeight!==n||t.interpolationType!==c||x||C?"resample":"source-slice"!==v&&(Math.abs(t.parallelScale-b)>1e-4*b||Math.abs(t.scaleRatio-w)>1e-4||g>.001||y>.001||g>.35*t.image.width||y>.35*t.image.height)?o?"defer":"resample":"reuse"}sampleSliceImage(e){let{volume:t,width:r,height:n,camera:a,dataPresentation:i,useViewportSamplingForLinear:o=!0}=e,{right:s,up:l,normal:u}=this.getCameraBasis(a),d=this.getVolumeNumberOfComponents(t),c=1===d&&this.shouldPreserveFloatScalarSamples(t),h=i?.interpolationType??NK.LINEAR,p=h!==NK.NEAREST&&o?void 0:this.trySampleOrthogonalSliceFromVoxelManager(t,a,s,l,u,h),m=this.getFallbackStoredRange(t),f=this.getResolvedVOIRange(i?.voiRange,m.min,m.max);if(p)return{image:this.createSliceImage(t,p.scalarData,p.width,p.height,p.columnPixelSpacing,p.rowPixelSpacing,p.minPixelValue,p.maxPixelValue,p.numberOfComponents,f),samplingMode:"source-slice",focalPoint:Lv.vec3.clone(a.focalPoint),translationReferenceFocalPoint:Lv.vec3.clone(p.translationReferenceFocalPoint),right:Lv.vec3.clone(s),up:Lv.vec3.clone(l),normal:Lv.vec3.clone(u),spacingInNormalDirection:Math.max(qG(t,u),FP),canvasWidth:r,canvasHeight:n,parallelScale:Math.max(a.parallelScale??1,FP),scaleRatio:erz(a.presentationScale),interpolationType:h};let g=t.voxelManager;if(!g)throw Error("[PlanarViewport] CPU volume rendering requires voxels");let y=Math.max(a.parallelScale??1,FP),v=2*y,b=r/Math.max(n,1)*v*(1/erz(a.presentationScale)),w=b/Math.max(r,1),x=v/Math.max(n,1),C=-b/2+w/2,k=v/2-x/2,M=qk.worldToIndexContinuous(t,a.focalPoint),S=en2(t,[s[0]*C+l[0]*k,s[1]*C+l[1]*k,s[2]*C+l[2]*k]),E=en2(t,[s[0]*w,s[1]*w,s[2]*w]),T=en2(t,[-l[0]*x,-l[1]*x,-l[2]*x]),I=this.getSliceArrayConstructor(t,m.min,m.max,d,c),P=this.acquireSliceArray(I,r*n*d),_=[M[0]+S[0],M[1]+S[1],M[2]+S[2]],D={min:1/0,max:-1/0},O=this.scalarViewportSampler.sampleAxisAligned({volume:t,voxelManager:g,pixelData:P,width:r,height:n,rowStartIndex:_,xStepIndexDelta:E,yStepIndexDelta:T,right:s,up:l,normal:u,interpolationType:h,numberOfComponents:d,fallbackMin:m.min,fallbackMax:m.max});if(O)D.min=O.min,D.max=O.max;else{let e=[..._];for(let a=0;a<n;a++){e[0]=_[0],e[1]=_[1],e[2]=_[2];for(let n=0;n<r;n++){let i=this.sampleVoxelAtContinuousIndex(g,t.dimensions,e,d,h);this.writeVoxelValue(P,a*r+n,i,d,m.min,m.max,D),e[0]+=E[0],e[1]+=E[1],e[2]+=E[2]}_[0]+=T[0],_[1]+=T[1],_[2]+=T[2]}}let A=Number.isFinite(D.min)?c?D.min:Math.floor(D.min):m.min,R=Number.isFinite(D.max)&&D.max>D.min?c?D.max:Math.ceil(D.max):Math.max(A+1,m.max);return{image:this.createSliceImage(t,P,r,n,b/Math.max(r,1),v/Math.max(n,1),A,R,d,f),samplingMode:"viewport",focalPoint:Lv.vec3.clone(a.focalPoint),translationReferenceFocalPoint:Lv.vec3.clone(a.focalPoint),right:Lv.vec3.clone(s),up:Lv.vec3.clone(l),normal:Lv.vec3.clone(u),spacingInNormalDirection:Math.max(qG(t,u),FP),canvasWidth:r,canvasHeight:n,parallelScale:y,scaleRatio:erz(a.presentationScale),interpolationType:h}}trySampleOrthogonalSliceFromVoxelManager(e,t,r,n,a,i){let o=e.voxelManager;if(!o)return;let s=enG(e,a),l=enG(e,r),u=enG(e,n);if(!s||!l||!u||s.axis===l.axis||s.axis===u.axis||l.axis===u.axis)return;let d=u.axis,c=-u.sign,h=l.sign,p=this.getVolumeNumberOfComponents(e),m=qk.worldToIndexContinuous(e,t.focalPoint)[s.axis],f=Math.round(m),g=e.dimensions[s.axis]-.5;if(m<-.5001||m>g+1e-4||i!==NK.NEAREST&&Math.abs(m-f)>1e-4)return;let y=i===NK.NEAREST?Math.min(e.dimensions[s.axis]-1,Math.max(0,en$(m))):f;if(y<0||y>=e.dimensions[s.axis])return;let v=[(e.dimensions[0]-1)/2,(e.dimensions[1]-1)/2,(e.dimensions[2]-1)/2],b=1===p&&this.shouldPreserveFloatScalarSamples(e);v[s.axis]=y;let w=function(e,t){let[r,n,a]=t,[i,o,s]=e.spacing,l=e.direction.slice(0,3),u=e.direction.slice(3,6),d=e.direction.slice(6,9),c=Lv.vec3.copy([0,0,0],e.origin);return Lv.vec3.scaleAndAdd(c,c,l,i*r),Lv.vec3.scaleAndAdd(c,c,u,o*n),Lv.vec3.scaleAndAdd(c,c,d,s*a),c}(e,v),x=e.dimensions[l.axis],C=e.dimensions[d],k=this.getFallbackStoredRange(e),M=this.getSliceArrayConstructor(e,k.min,k.max,p,b),S=this.acquireSliceArray(M,x*C*p),E={min:1/0,max:-1/0},T=[0,0,0];T[s.axis]=y;for(let e=0;e<C;e++){T[d]=c>0?e:C-1-e;for(let t=0;t<x;t++)T[l.axis]=h>0?t:x-1-t,this.writeVoxelValue(S,e*x+t,o.getAtIJK(T[0],T[1],T[2]),p,k.min,k.max,E)}return Number.isFinite(E.min)||(E.min=k.min),(!Number.isFinite(E.max)||E.max<=E.min)&&(E.max=Math.max(E.min+1,k.max)),{scalarData:S,width:x,height:C,columnPixelSpacing:e.spacing[l.axis],rowPixelSpacing:e.spacing[d],minPixelValue:b?E.min:Math.floor(E.min),maxPixelValue:b?E.max:Math.ceil(E.max),numberOfComponents:p,translationReferenceFocalPoint:w}}sampleVoxelAtContinuousIndex(e,t,r,n,a){let i=function(e,t){let r=[0,0,0];for(let n=0;n<3;n++){let a=enq(e[n],t[n]);if(void 0===a)return;r[n]=a}return r}(t,r);return i?n<2?qk.sampleAtContinuousIndex(e,t,i,a):a===NK.NEAREST?this.sampleNearestColorAtContinuousIndex(e,t,i,n):this.sampleLinearColorAtContinuousIndex(e,t,i,n):n<2?NaN:this.createDefaultColorSample(n)}sampleNearestColorAtContinuousIndex(e,t,r,n){let a=Math.floor(r[0]+.5-1e-6),i=Math.floor(r[1]+.5-1e-6),o=Math.floor(r[2]+.5-1e-6);return a<0||a>=t[0]||i<0||i>=t[1]||o<0||o>=t[2]?this.createDefaultColorSample(n):this.toColorSample(e.getAtIJK(a,i,o),n)}sampleLinearColorAtContinuousIndex(e,t,r,n){let[a,i,o]=r;if(a<0||a>t[0]-1||i<0||i>t[1]-1||o<0||o>t[2]-1)return this.createDefaultColorSample(n);let s=Math.floor(a),l=Math.floor(i),u=Math.floor(o),d=Math.min(s+1,t[0]-1),c=Math.min(l+1,t[1]-1),h=Math.min(u+1,t[2]-1),p=a-s,m=i-l,f=o-u,g=1-p,y=1-m,v=1-f,b=this.toColorSample(e.getAtIJK(s,l,u),n),w=this.toColorSample(e.getAtIJK(d,l,u),n),x=this.toColorSample(e.getAtIJK(s,c,u),n),C=this.toColorSample(e.getAtIJK(d,c,u),n),k=this.toColorSample(e.getAtIJK(s,l,h),n),M=this.toColorSample(e.getAtIJK(d,l,h),n),S=this.toColorSample(e.getAtIJK(s,c,h),n),E=this.toColorSample(e.getAtIJK(d,c,h),n),T=this.createDefaultColorSample(n);for(let e=0;e<n;e++){let t=b[e]*g+w[e]*p,r=x[e]*g+C[e]*p,n=k[e]*g+M[e]*p,a=S[e]*g+E[e]*p,i=t*y+r*m,o=n*y+a*m;T[e]=i*v+o*f}return T}toColorSample(e,t){if(Array.isArray(e))return Array.from({length:t},(t,r)=>Number(e[r]??0));let r=Number(e)||0;return Array.from({length:t},()=>r)}createDefaultColorSample(e){return Array.from({length:e},()=>0)}writeVoxelValue(e,t,r,n,a,i,o){if(n<2){let n=enJ(Number(r),a,i,!(e instanceof Float32Array||e instanceof Float64Array));e[t]=n,enQ(o,n);return}let s=this.toColorSample(r,n),l=t*n;for(let t=0;t<n;t++){let r=enJ(Number(s[t]),a,i,!0);e[l+t]=r,enQ(o,r)}}getVolumeNumberOfComponents(e){let t=e.imageData?.get("numberOfComponents");return Math.max(1,t?.numberOfComponents??e.voxelManager?.numberOfComponents??1)}getSliceArrayConstructor(e,t,r,n,a=!1){return n>1?e.voxelManager?.getConstructor()||Uint8Array:a?Float32Array:t>=0&&r<=65535?Uint16Array:t>=-32768&&r<=32767?Int16Array:Int32Array}acquireSliceArray(e,t){let r=this.getSliceArrayPoolKey(e,t),n=this.sliceArrayPool.get(r),a=n?.pop();return a||new e(t)}releaseSliceArray(e){let t=e.constructor,r=this.getSliceArrayPoolKey(t,e.length),n=this.sliceArrayPool.get(r);n||(n=[],this.sliceArrayPool.set(r,n)),n.length<1&&n.push(e)}getSliceArrayPoolKey(e,t){let r=e.name||"SliceArray";return`${r}:${t}`}createSliceImage(e,t,r,n,a,i,o,s,l,u){let d=u&&u.upper>u.lower?u:{lower:o,upper:s},c=Math.max(1,d.upper-d.lower),h=(d.lower+d.upper)/2,p=`cpuVolumeSlice:${e.volumeId}:${++this.sampleSequence}`,m=qk.createImageVoxelManager({width:r,height:n,scalarData:t,numberOfComponents:l,id:p});return{imageId:p,intercept:0,windowCenter:h,windowWidth:c,voiLUTFunction:N2.LINEAR,isPreScaled:e.isPreScaled,scaling:e.scaling,color:l>1,numberOfComponents:l,dataType:t.constructor.name,slope:1,minPixelValue:o,maxPixelValue:s,rows:n,columns:r,getCanvas:void 0,height:n,width:r,rgba:4===l,columnPixelSpacing:a,rowPixelSpacing:i,FrameOfReferenceUID:e.metadata?.FrameOfReferenceUID,invert:!1,photometricInterpretation:l>1?"RGB":void 0,getPixelData:()=>t,voxelManager:m,sizeInBytes:t.byteLength}}shouldPreserveFloatScalarSamples(e){return e.metadata?.Modality==="PT"}}class en3{constructor(){this.sampler=new en5}async addData(e,t,r){var n,a;let i,o,s,l,u,d,c,h,p,m;if(!t.imageVolume)throw Error("[PlanarViewport] CPU volume rendering requires a prepared image volume");let f=await etx(t.imageVolume),g=new etQ({getImageData:()=>this.getImageData(i)},t.imageVolume.imageIds?.length?{imageId:t.imageVolume.imageIds[0]}:{});g.setVisibility(!0),e.display.activateRenderMode(eyK.CPU_VOLUME);return i={renderMode:eyK.CPU_VOLUME,actorEntryUID:F2(),compatibilityActor:g,imageVolume:t.imageVolume,imageIds:t.imageIds,acquisitionOrientation:t.acquisitionOrientation,layerCanvas:G$(null,e.cpu.canvas.width,e.cpu.canvas.height),currentImageIdIndex:t.initialImageIdIndex??0,maxImageIdIndex:t.imageIds.length-1,defaultVOIRange:f,renderingInvalidated:!0,compositeActor:t.reference?.kind==="segmentation",removeStreamingSubscriptions:(l=!0,u=-1/0,d=Number.isFinite(p=BM.rendering?.planar?.cpuVolume?.volumeModifiedThrottleMs)?Math.max(0,Math.trunc(p)):0,c=()=>{l&&(u=performance.now(),e.display.renderNow())},n=t.volumeId,a=r=>{if(!l)return;let n=r===NH.IMAGE_VOLUME_LOADING_COMPLETED,a=t.imageVolume.voxelManager;a?.invalidateCache?.(),a&&this.sampler.clearCachedScalarRange(a),en4(i),i.pendingVolumeLoadCallback=!1,this.releaseSampledSliceState(i),i.renderingInvalidated=!0,r===NH.IMAGE_VOLUME_MODIFIED?(()=>{if(d<=0)return c();if(void 0!==s)return;let e=Math.max(0,d-(performance.now()-u));0===e?c():s=window.setTimeout(()=>{s=void 0,c()},e)})():(void 0!==s&&(window.clearTimeout(s),s=void 0),e.display.renderNow()),!l||n&&(e.display.setNeedsRender(),o=window.requestAnimationFrame(()=>{o=void 0,l&&(n&&(a?.invalidateCache?.(),a&&this.sampler.clearCachedScalarRange(a),this.releaseSampledSliceState(i),i.renderingInvalidated=!0),e.display.renderNow())}))},m=e=>{let t=e.detail;t?.volumeId===n&&a(e.type)},Bc.addEventListener(NH.IMAGE_VOLUME_MODIFIED,m),Bc.addEventListener(NH.IMAGE_VOLUME_LOADING_COMPLETED,m),h=()=>{Bc.removeEventListener(NH.IMAGE_VOLUME_MODIFIED,m),Bc.removeEventListener(NH.IMAGE_VOLUME_LOADING_COMPLETED,m)},()=>{l=!1,i.pendingVolumeLoadCallback=!1,this.releaseSampledSliceState(i),void 0!==o&&(window.cancelAnimationFrame(o),o=void 0),void 0!==s&&(window.clearTimeout(s),s=void 0),h()})},erq(e,{camera:e.viewport.getViewState(),acquisitionOrientation:i.acquisitionOrientation,imageIds:i.imageIds,imageIdIndex:i.currentImageIdIndex,maxImageIdIndex:i.maxImageIdIndex}),{rendering:i,updateDataPresentation:r=>{this.updateDataPresentation(e,i,t.id,r)},applyViewState:r=>{this.applyViewState(e,i,t.id,r)},getFrameOfReferenceUID:()=>this.getFrameOfReferenceUID(i),getActorEntry:e=>erF(e,{actor:i.compatibilityActor,renderMode:eyK.CPU_VOLUME,uid:i.actorEntryUID,referencedIdFallback:e.volumeId}),getImageData:()=>this.getImageData(i),render:()=>{this.render(e,i)},resize:()=>{this.resize(e,i,t.id)},removeData:()=>{this.removeData(e,i)}}}updateDataPresentation(e,t,r,n){let a=t.dataPresentation?.interpolationType,{slabThickness:i,...o}=n||{};(t.dataPresentation=Object.keys(o).length?o:void 0,a!==t.dataPresentation?.interpolationType)?this.syncRenderCamera(e,t,r,e.viewport.getViewState()):t.renderingInvalidated=!0}applyViewState(e,t,r,n){e.display.activateRenderMode(eyK.CPU_VOLUME),this.syncRenderCamera(e,t,r,n)}canvasToWorld(e,t,r){return enO({canvas:e.cpu.canvas,canvasPos:r,ctx:e})}worldToCanvas(e,t,r){return enA({canvas:e.cpu.canvas,ctx:e,worldPos:r})}getFrameOfReferenceUID(e){return e.imageVolume.metadata?.FrameOfReferenceUID}getImageData(e){var t=e.imageVolume;let r=t.imageData;return r?{dimensions:r.getDimensions(),spacing:r.getSpacing(),origin:r.getOrigin(),direction:r.getDirection(),imageData:r,metadata:{Modality:t.metadata?.Modality,FrameOfReferenceUID:t.metadata?.FrameOfReferenceUID},get scalarData(){return t.voxelManager?.getScalarData()},scaling:t.scaling,hasPixelSpacing:t.hasPixelSpacing,voxelManager:t.voxelManager}:void 0}render(e,t){var r,n,a,i,o,s,l;let u;if(e.display.activateRenderMode(eyK.CPU_VOLUME),e.cpu.canvas.style.display="",e.cpu.canvas.style.opacity="1",t.dataPresentation?.visible===!1)return void en6(e);let d=t.imageVolume.loadStatus,c=!!(((r=t.imageVolume).framesLoaded??0)>0||(r.framesProcessed??0)>0||(r.framesUpdated??0)>0);if(!(void 0===d||!0===d.loaded||c)){t.pendingVolumeLoadCallback||(t.pendingVolumeLoadCallback=!0,t.imageVolume.load()),e.display.setNeedsRender();return}if(t.pendingVolumeLoadCallback=!1,!e.cpu.canvas.width||!e.cpu.canvas.height)return;let h=enD(e);if(!h)return;en6(e),n=t.layerCanvas,a=e.cpu.canvas,(n.width!==a.width||n.height!==a.height)&&(n.width=a.width,n.height=a.height,1)&&(t.renderingInvalidated=!0);let p=BM.rendering?.planar?.cpuVolume?.useViewportSamplingForLinear===!0,m=t.forceHighQualityResample?"resample":this.sampler.getResampleDecision({sampledSliceState:t.sampledSliceState,width:e.cpu.canvas.width,height:e.cpu.canvas.height,camera:h,dataPresentation:t.dataPresentation,deferViewportResample:p}),f="resample"===m;"defer"===m?(i=e,en4(o=t),i.display.setNeedsRender(),o.deferredResampleTimeoutId=window.setTimeout(()=>{o.deferredResampleTimeoutId=void 0,o.forceHighQualityResample=!0,o.renderingInvalidated=!0,i.display.renderNow()},80)):en4(t);let g=t.sampledSliceState;f&&(this.releaseSampledSliceState(t),t.forceHighQualityResample=!1,g=t.sampledSliceState=this.sampler.sampleSliceImage({volume:t.imageVolume,width:e.cpu.canvas.width,height:e.cpu.canvas.height,camera:h,dataPresentation:t.dataPresentation,useViewportSamplingForLinear:p})),g&&(f&&(t.renderingInvalidated=!0),t.enabledElement=this.sampler.createOrUpdateEnabledElement({enabledElement:t.enabledElement,canvas:t.layerCanvas,image:g.image,modality:t.imageVolume.metadata?.Modality}),this.sampler.updateCPUFallbackViewport({enabledElement:t.enabledElement,sampledSliceState:g,camera:h,dataPresentation:t.dataPresentation,defaultVOIRange:t.defaultVOIRange}),t.defaultVOIRange||=this.sampler.getResolvedVOIRange(t.dataPresentation?.voiRange,g.image.minPixelValue??0,g.image.maxPixelValue??1),f&&t.compatibilityActor.getMapper().getInputData().setDerivedImage(g.image),t.compositeActor?function(e){let t=e.enabledElement;if(!t)return;let r=e.layerCanvas.getContext("2d");r&&(r.setTransform(1,0,0,1,0,0),r.clearRect(0,0,e.layerCanvas.width,e.layerCanvas.height),r.imageSmoothingEnabled=!t.viewport.pixelReplication,GW(t,r),e.compatibilityActor.render(void 0,r))}(t):qr(t.enabledElement,t.renderingInvalidated),t.renderingInvalidated=!1,s=e,l=t,(u=l.dataPresentation?.opacity??1)<=0||(s.cpu.context.save(),s.cpu.context.globalAlpha=u,s.cpu.context.drawImage(l.layerCanvas,0,0),s.cpu.context.restore()),e.display.markRendered(),Bh(e.viewport.element,NH.IMAGE_RENDERED,{element:e.viewport.element,viewportId:e.viewportId,renderingEngineId:e.renderingEngineId,viewportStatus:Fw.RENDERED}))}resize(e,t,r){this.syncRenderCamera(e,t,r,e.viewport.getViewState())}removeData(e,t){let{removeStreamingSubscriptions:r}=t;en4(t),r?.(),this.releaseSampledSliceState(t),this.sampler.clearSliceArrayPool?.()}syncRenderCamera(e,t,r,n){let a=enR({ctx:e,dataId:r,rendering:t,viewState:n});if(!a)return;let{currentImageIdIndex:i,maxImageIdIndex:o}=a,s=i!==t.currentImageIdIndex,l=o!==t.maxImageIdIndex;t.currentImageIdIndex=i,t.maxImageIdIndex=o,t.renderingInvalidated=!0,(s||l)&&e.viewport.invalidateResolvedView(),s&&erq(e,{camera:n,acquisitionOrientation:t.acquisitionOrientation,imageIds:t.imageIds,imageIdIndex:t.currentImageIdIndex,maxImageIdIndex:t.maxImageIdIndex})}releaseSampledSliceState(e){this.sampler.releaseSampledSliceState?.(e.sampledSliceState),e.sampledSliceState=void 0}}function en4(e){void 0!==e.deferredResampleTimeoutId&&(window.clearTimeout(e.deferredResampleTimeoutId),e.deferredResampleTimeoutId=void 0)}class en8{constructor(){this.id="planar:cpu-volume-slice",this.type=Nq.PLANAR_NEXT}matches(e,t){return"image"===e.type&&t.renderMode===eyK.CPU_VOLUME}createRenderPath(){return new en3}selectContext(e){return{viewportId:e.viewportId,renderingEngineId:e.renderingEngineId,type:e.type,viewport:e.viewport,renderPath:e.renderPath,view:e.view,display:e.display,cpu:e.cpu}}}function en6(e){e.cpu.composition.clearedRenderPassId!==e.cpu.composition.renderPassId&&(e.cpu.context.setTransform(1,0,0,1,0,0),e.cpu.context.clearRect(0,0,e.cpu.canvas.width,e.cpu.canvas.height),e.cpu.context.fillStyle="#000",e.cpu.context.fillRect(0,0,e.cpu.canvas.width,e.cpu.canvas.height),e.cpu.composition.clearedRenderPassId=e.cpu.composition.renderPassId)}class en9{async addData(e,t,r){if(!t.image)throw Error("[PlanarViewport] VTK image rendering requires an image");let n=Hb.newInstance(),a=HA(),i=t.imageData??qa(t.image);e.display.activateRenderMode(eyK.VTK_IMAGE),n.setInputData(i),a.setMapper(n),i.getPointData().getScalars().getNumberOfComponents()>1&&a.getProperty().setIndependentComponents(!1),e.vtk.renderer.addActor(a);let o={renderMode:eyK.VTK_IMAGE,actorEntryUID:F2(),actor:a,currentImage:t.image,mapper:n,imageData:i,useWorldCoordinateImageData:t.useWorldCoordinateImageData,currentImageIdIndex:t.initialImageIdIndex??0,defaultVOIRange:qi(t.image),dataPresentation:void 0,loadRequestId:0};return"overlay"!==r.role&&erG(e,{image:t.image,imageIdIndex:t.initialImageIdIndex??0}),{rendering:o,updateDataPresentation:e=>{this.updateDataPresentation(o,e)},applyViewState:r=>{this.applyViewState(e,o,t.id,r,t.imageIds)},getFrameOfReferenceUID:()=>this.getFrameOfReferenceUID(o),getActorEntry:e=>erF(e,{actor:o.actor,mapper:o.mapper,renderMode:eyK.VTK_IMAGE,uid:o.actorEntryUID,referencedIdFallback:o.currentImage.imageId}),getImageData:()=>this.getImageData(o),resize:()=>{this.resize(e,o,t.id)},removeData:()=>{this.removeData(e,o)}}}updateDataPresentation(e,t){e.dataPresentation=t,qo({actor:e.actor,defaultVOIRange:e.defaultVOIRange,defaultVOILUTFunction:e.currentImage?.voiLUTFunction,props:{interpolationType:NK.LINEAR,...t}})}applyViewState(e,t,r,n,a){if(e.display.activateRenderMode(eyK.VTK_IMAGE),t.useWorldCoordinateImageData)return;let i=enR({ctx:e,dataId:r,imageIds:a,rendering:t,viewState:n}),o=en_({projection:i,rendering:t,viewState:n});if(i&&(eat(e,t,i.resolvedICamera),i.isSourceBinding&&er7({renderer:e.vtk.renderer,activeSourceICamera:i.resolvedICamera})),o===(t.lastRequestedImageIdIndex??t.currentImageIdIndex)||o<0||o>=a.length)return;t.lastRequestedImageIdIndex=o;let s=++t.loadRequestId;qI(a[o]).then(n=>{s===t.loadRequestId&&eae({ctx:e,dataId:r,image:n,rendering:t,imageIdIndex:o,dataPresentation:t.dataPresentation})})}canvasToWorld(e,t){return er$({canvas:e.vtk.canvas,renderer:e.vtk.renderer,canvasPos:t})}worldToCanvas(e,t){return erK({canvas:e.vtk.canvas,renderer:e.vtk.renderer,worldPos:t})}getFrameOfReferenceUID(e){let t=e.currentImage.imageId,r=t?HB(FC.IMAGE_PLANE,t):void 0;return r?.frameOfReferenceUID}getImageData(e){return enU(e.currentImage,this.getFrameOfReferenceUID(e))}removeData(e,t){let{actor:r}=t;e.vtk.renderer.removeActor(r)}resize(e,t,r){if(t.useWorldCoordinateImageData)return void e.display.requestRender();let n=e.viewport.getViewState(),a=enR({ctx:e,dataId:r,rendering:t,viewState:n});a&&(eat(e,t,a.resolvedICamera),a.isSourceBinding&&er7({renderer:e.vtk.renderer,activeSourceICamera:a.resolvedICamera})),e.display.requestRender()}}class en7{constructor(){this.id="planar:vtk-image-mapper",this.type=Nq.PLANAR_NEXT}matches(e,t){return"image"===e.type&&t.renderMode===eyK.VTK_IMAGE}createRenderPath(){return new en9}selectContext(e){return{viewportId:e.viewportId,renderingEngineId:e.renderingEngineId,type:e.type,viewport:e.viewport,renderPath:e.renderPath,view:e.view,display:e.display,vtk:e.vtk}}}async function eae(e){let{ctx:t,dataId:r,image:n,rendering:a,imageIdIndex:i,dataPresentation:o}=e,s=t.viewport.getViewState(),{actor:l,mapper:u}=a,d=a.imageData;d&&function(e,t){let r=e.getPointData?.()?.getScalars?.();if(!r)return!1;let[n,a]=e.getDimensions();if(n!==t.columns||a!==t.rows||r.getDataType()!==t.voxelManager.getScalarData().constructor.name)return!1;let i=t.color?3:1;return r.getNumberOfComponents()===i}(d,n)?(Gv(d,n),function(e,t){let{direction:r,origin:n,spacing:a}=HH(t);e.setOrigin(n),e.setDirection(new Float32Array(Array.from(r))),e.setSpacing(a)}(d,n)):(d=qa(n),u.setInputData(d)),a.currentImage=n,a.imageData=d,a.currentImageIdIndex=i,a.defaultVOIRange=qi(n),t.viewport.invalidateResolvedView(),d.getPointData().getScalars().getNumberOfComponents()>1&&l.getProperty().setIndependentComponents(!1),qo({actor:l,defaultVOIRange:a.defaultVOIRange,defaultVOILUTFunction:n.voiLUTFunction,props:{interpolationType:o?.interpolationType??NK.LINEAR,...o}});let c=enR({ctx:t,dataId:r,rendering:a,viewState:s});c&&(eat(t,a,c.resolvedICamera),c.isSourceBinding&&er7({renderer:t.vtk.renderer,activeSourceICamera:c.resolvedICamera})),c?.isSourceBinding&&erG(t,{image:n,imageIdIndex:i}),t.display.requestRender()}function eat(e,t,r){ene({actor:t.actor,activeSourceICamera:r})}async function ear(e,t,r,n=!1){let{volumeId:a,callback:i}=e,o=await eto(a);if(!o)throw Error(`imageVolume with id: ${a} does not exist`);let{imageData:s,vtkOpenGLTexture:l}=o,u=o.loadStatus,d=WX.newInstance(),c=eeG();(!u||u.loaded)&&l.modified(),c.setInputData(s),c.setSlicePlane(d),c.setSlabThickness(0),c.setScalarTexture?.(l),c.modified();let h=HA();h.setMapper(c);let p=s.get("numberOfComponents");(p?.numberOfComponents??1)>1&&h.getProperty().setIndependentComponents(!1);let m=h.getProperty();m.set({viewportId:r},!0),await etw(h,o);let f=m.getColorWindow?.(),g=m.getColorLevel?.();if(255===f&&127.5===g){let e=o.voxelManager?.getRange?.();e?.length===2&&(m.setColorWindow(e[1]-e[0]),m.setColorLevel((e[1]+e[0])/2))}return i&&i({volumeActor:h,volumeId:a}),n||function(e,t,r,n){let a=r.getProperty().getRGBTransferFunction(0);if(!a)return;let i=a.getRange(),o={viewportId:t,range:{lower:i[0],upper:i[1]},volumeId:n};Bh(e,NH.VOI_MODIFIED,o)}(t,r,h,a),{actor:h,slicePlane:d}}function ean(e){switch(e){case eeF.MAX:return NJ.MAXIMUM_INTENSITY_BLEND;case eeF.MIN:return NJ.MINIMUM_INTENSITY_BLEND;case eeF.MEAN:return NJ.AVERAGE_INTENSITY_BLEND;default:return NJ.COMPOSITE}}function eaa(e){let t=[];return e.forEach(([e,r])=>{let n=t[t.length-1];if(n&&n[0]===e){n[1]=r;return}t.push([e,r])}),t}function eai(e){return Math.max(0,Math.min(1,e))}function eao(e,t){if(t&&Number.isFinite(t.lower)&&Number.isFinite(t.upper))return t;let r=e.getMapper()?.getInputData?.(),n=r?.getPointData?.()?.getScalars?.()?.getRange?.();if(n&&Number.isFinite(n[0])&&Number.isFinite(n[1]))return{lower:n[0],upper:n[1]};let a=e.getProperty().getRGBTransferFunction(0)?.getRange?.();return a&&Number.isFinite(a[0])&&Number.isFinite(a[1])?{lower:a[0],upper:a[1]}:{lower:0,upper:1}}class eas{async addData(e,t,r){var n,a,i,o;let s,l=t.imageVolume,u="overlay"===r.role&&t.reference?.kind==="segmentation";if(!l)throw Error("[PlanarViewport] Volume rendering requires a prepared image volume");let{actor:d}=await ear({volumeId:t.volumeId},e.viewport.element,e.viewportId,!0),c=d.getMapper();e.display.activateRenderMode(eyK.VTK_VOLUME_SLICE),e.vtk.renderer.addActor(d);let h=d.getProperty().getRGBTransferFunction(0),p=h?.getRange?.(),m={renderMode:eyK.VTK_VOLUME_SLICE,actorEntryUID:F2(),actor:d,overlayOrder:(n=e.vtk.renderer,a=d,Math.max(0,n.getActors().filter(e=>e?.getClassName?.()==="vtkImageSlice").indexOf(a))),imageVolume:l,imageIds:t.imageIds,acquisitionOrientation:t.acquisitionOrientation,mapper:c,currentImageIdIndex:t.initialImageIdIndex??0,maxImageIdIndex:t.imageIds.length-1,defaultVOIRange:p?{lower:p[0],upper:p[1]}:void 0,dataPresentation:void 0,removeStreamingSubscriptions:(i=t.volumeId,o=t=>{t===NH.IMAGE_VOLUME_MODIFIED&&(u&&l.vtkOpenGLTexture?.modified?.(),c.modified()),e.display.requestRender()},s=e=>{let t=e.detail;t?.volumeId===i&&o(e.type)},Bc.addEventListener(NH.IMAGE_VOLUME_MODIFIED,s),Bc.addEventListener(NH.IMAGE_VOLUME_LOADING_COMPLETED,s),()=>{Bc.removeEventListener(NH.IMAGE_VOLUME_MODIFIED,s),Bc.removeEventListener(NH.IMAGE_VOLUME_LOADING_COMPLETED,s)})};return l.load(()=>{e.display.requestRender()}),erq(e,{camera:e.viewport.getViewState(),acquisitionOrientation:m.acquisitionOrientation,imageIds:m.imageIds,imageIdIndex:m.currentImageIdIndex,maxImageIdIndex:m.maxImageIdIndex}),{rendering:m,updateDataPresentation:t=>{this.updateDataPresentation(e,m,t)},applyViewState:r=>{this.applyViewState(e,m,t.id,r)},getFrameOfReferenceUID:()=>this.getFrameOfReferenceUID(m),getActorEntry:e=>erF(e,{actor:m.actor,mapper:m.mapper,renderMode:eyK.VTK_VOLUME_SLICE,uid:m.actorEntryUID,referencedIdFallback:e.volumeId}),getImageData:()=>this.getImageData(m),render:()=>{this.render(e)},resize:()=>{this.resize(e,m,t.id)},removeData:()=>{this.removeData(e,m)}}}updateDataPresentation(e,t,r){t.dataPresentation=r,function(e){var t;let{actor:r,defaultVOIRange:n,mapper:a,props:i}=e,o=r.getProperty(),s=i?.voiRange??n;if(r.setVisibility(i?.visible!==!1),i?.interpolationType!==void 0&&o.setInterpolationType(i.interpolationType),i?.blendMode!==void 0){let e=function(e){switch(e){case NJ.MAXIMUM_INTENSITY_BLEND:return eeF.MAX;case NJ.MINIMUM_INTENSITY_BLEND:return eeF.MIN;case NJ.AVERAGE_INTENSITY_BLEND:case NJ.COMPOSITE:return eeF.MEAN;case NJ.LABELMAP_EDGE_PROJECTION_BLEND:return eeF.MAX;default:return}}(i.blendMode);void 0!==e&&a.setSlabType(e)}if(a.setSlabThickness("number"!=typeof(t=i?.slabThickness)||t<=0?0:Math.max(t,FI.MINIMUM_SLAB_THICKNESS)),i?.opacity!==void 0&&function(e){var t;let r,n,a,{actor:i,opacity:o,voiRange:s}=e;if(2>(t=i,r=t.getMapper()?.getInputData?.(),n=r?.getPointData?.()?.getScalars?.(),a=r?.get?.("numberOfComponents"),n?.getNumberOfComponents?.()??a?.numberOfComponents??1))return i.getProperty().setOpacity(o);let l=Ge(),u=eao(i,s);l.addPoint(u.lower,o),u.upper>u.lower&&l.addPoint(u.upper,o),i.getProperty().setScalarOpacity(0,l)}({actor:r,opacity:i.opacity,voiRange:s}),!s)return;let l=qs({colormap:i?.colormap,invert:i?.invert,voiRange:s});o.setUseLookupTableScalarRange(!0),o.setRGBTransferFunction(0,l),function(e){let{actor:t,colormap:r,voiRange:n}=e;if(!r||void 0===r.opacity&&void 0===r.threshold)return;let a=void 0!==r.threshold?function(e){let t=e.getMapper()?.getInputData?.(),r=t?.get?.("voxelManager")?.voxelManager,n=r?.getRange?.();if(n&&Number.isFinite(n[0])&&Number.isFinite(n[1])&&n[1]>n[0])return{lower:n[0],upper:n[1]};let a=t?.getPointData?.()?.getScalars?.()?.getRange?.();if(a&&Number.isFinite(a[0])&&Number.isFinite(a[1])&&a[1]>a[0])return{lower:a[0],upper:a[1]}}(t)??eao(t,n):eao(t,n),i=Ge();(function(e){let{colormap:t,range:r,fallbackOpacity:n}=e,a=r.upper-r.lower,i=Math.max(.001*Math.abs(a),.001),o=void 0!==t.threshold?Math.max(r.lower,Math.min(r.upper,t.threshold)):void 0;if(Array.isArray(t.opacity)&&t.opacity.length){let e=t.opacity.map(({opacity:e,value:t})=>({opacity:eai(e),value:r.lower+t*a})).sort((e,t)=>e.value-t.value);if(void 0===o)return eaa(e.map(({value:e,opacity:t})=>[e,t]));let s=function(e,t,r){if(!t.length)return eai(r);if(e<=t[0].value)return t[0].opacity;for(let r=1;r<t.length;r++){let n=t[r-1],a=t[r];if(e<=a.value){let t=a.value-n.value,r=t>0?(e-n.value)/t:0;return eai(n.opacity+(a.opacity-n.opacity)*r)}}return t[t.length-1].opacity}(o,e,n),l=[[r.lower,0],[Math.max(r.lower,o-i),0],[o,s]];if(e.forEach(({value:e,opacity:t})=>{e>o&&l.push([e,t])}),o<r.upper){let e=l[l.length-1][1];l[l.length-1][0]<r.upper&&l.push([r.upper,e])}return eaa(l)}let s=void 0!==t.opacity?eai(t.opacity):eai(n);return void 0===o?[[r.lower,s],[r.upper,s]]:o>=r.upper?[[r.lower,0],[r.upper,0]]:[[r.lower,0],[Math.max(r.lower,o-i),0],[o,s],[r.upper,s]]})({colormap:r,range:a,fallbackOpacity:function(e){let t=e.getProperty().getScalarOpacity(0),r=t?.getDataPointer?.();if(!r?.length)return e.getProperty().getOpacity?.()??1;let n=0;for(let e=1;e<r.length;e+=2)r[e]>n&&(n=r[e]);return eai(n||1)}(t)}).forEach(([e,t])=>{i.addPoint(e,t)}),t.getProperty().setScalarOpacity(0,i)}({actor:r,colormap:i?.colormap,voiRange:s})}({actor:t.actor,defaultVOIRange:t.defaultVOIRange,mapper:t.mapper,props:t.dataPresentation});let n=enD(e);eau(t.mapper,n),ene({actor:t.actor,activeSourceICamera:n}),ead(t.actor,n,t.overlayOrder),e.vtk.renderer.resetCameraClippingRange()}applyViewState(e,t,r,n){e.display.activateRenderMode(eyK.VTK_VOLUME_SLICE),this.syncRenderCamera(e,t,r,n,!0)}syncRenderCamera(e,t,r,n,a){let i=enR({ctx:e,dataId:r,rendering:t,viewState:n});if(!i)return;i.isSourceBinding&&er7({renderer:e.vtk.renderer,activeSourceICamera:i.resolvedICamera}),ene({actor:t.actor,activeSourceICamera:i.activeSourceICamera});let o=i.currentImageIdIndex!==t.currentImageIdIndex,s=i.maxImageIdIndex!==t.maxImageIdIndex;t.currentImageIdIndex=i.currentImageIdIndex,t.maxImageIdIndex=i.maxImageIdIndex,(o||s)&&e.viewport.invalidateResolvedView(),eau(t.mapper,i.activeSourceICamera),ead(t.actor,i.activeSourceICamera,t.overlayOrder),e.vtk.renderer.resetCameraClippingRange(),a&&o&&erq(e,{camera:n,acquisitionOrientation:t.acquisitionOrientation,imageIds:t.imageIds,imageIdIndex:t.currentImageIdIndex,maxImageIdIndex:t.maxImageIdIndex})}canvasToWorld(e,t){return er$({canvas:e.vtk.canvas,renderer:e.vtk.renderer,canvasPos:t})}worldToCanvas(e,t){return erK({canvas:e.vtk.canvas,renderer:e.vtk.renderer,worldPos:t})}getFrameOfReferenceUID(e){return e.imageVolume.metadata?.FrameOfReferenceUID}getImageData(e){var t=e.imageVolume;let r=t.imageData;return r?{dimensions:r.getDimensions(),spacing:r.getSpacing(),origin:r.getOrigin(),direction:r.getDirection(),imageData:r,metadata:{Modality:t.metadata?.Modality,FrameOfReferenceUID:t.metadata?.FrameOfReferenceUID},get scalarData(){return t.voxelManager?.getScalarData()},scaling:t.scaling,hasPixelSpacing:t.hasPixelSpacing,voxelManager:t.voxelManager}:void 0}render(e){e.display.requestRender()}resize(e,t,r){let n=e.viewport.getViewState();this.syncRenderCamera(e,t,r,n,!1),e.display.requestRender()}removeData(e,t){let{actor:r,removeStreamingSubscriptions:n}=t;n?.(),e.vtk.renderer.removeActor(r)}}class eal{constructor(){this.id="planar:vtk-volume-slice",this.type=Nq.PLANAR_NEXT}matches(e,t){return"image"===e.type&&t.renderMode===eyK.VTK_VOLUME_SLICE}createRenderPath(){return new eas}selectContext(e){return{viewportId:e.viewportId,renderingEngineId:e.renderingEngineId,type:e.type,viewport:e.viewport,renderPath:e.renderPath,view:e.view,display:e.display,vtk:e.vtk}}}function eau(e,t){if(!t?.focalPoint||!t.viewPlaneNormal)return;let r=function(e){let t=e.getSlicePlane?.();if(t)return t;let r=WX.newInstance();return e.setSlicePlane(r),r}(e);r.setOrigin(...t.focalPoint),r.setNormal(...t.viewPlaneNormal)}function ead(e,t,r=0){if(!t?.viewPlaneNormal||r<=0)return void e.setPosition(0,0,0);let[n,a,i]=t.viewPlaneNormal,o=1e-4*r;e.setPosition(n*o,a*o,i*o)}let eac=new class{select(e,t={}){var r;if(!e.imageIds.length)throw Error("[PlanarViewport] Cannot add an empty planar dataset");let n=t.orientation||NQ.ACQUISITION,a=eah(e.imageIds),i=(r=e).volumeId||ql.generateVolumeId(r.imageIds),o=n===NQ.ACQUISITION||void 0!==a&&n===a,s=eam(e,o);if(!o&&!s&&!e.useWorldCoordinateImageData)throw Error("[PlanarViewport] Non-acquisition rendering requires a valid volume dataset");if(s&&!eap(e))throw Error("[PlanarViewport] Volume rendering requires a valid volume dataset");return{acquisitionOrientation:a,renderMode:s?this.selectVolumeRenderMode(t):this.selectImageRenderMode(t),volumeId:i}}canRender(e,t={}){if(!e.imageIds.length)return!1;let r=t.orientation||NQ.ACQUISITION,n=eah(e.imageIds),a=r===NQ.ACQUISITION||void 0!==n&&r===n,i=eam(e,a);return(!!a||!!i||!!e.useWorldCoordinateImageData)&&(!i||!!eap(e))}selectImageRenderMode(e){return Bb(this.resolveBackend(e),"image")}selectVolumeRenderMode(e){return Bb(this.resolveBackend(e),"volume")}resolveBackend(e){let t=e.renderBackend??BM.rendering.planar?.renderBackend??FS.Auto;if(t!==FS.Auto){if(By(),Bp.has(t))return t;BE.has(t)||(BE.add(t),console.warn(`[getEffectiveRenderBackend] Unregistered render backend "${t}"; falling back to 'auto'. Register custom backends with registerRenderBackend().`))}return BM.rendering.useCPURendering?FS.CPU:FS.GPU}};function eah(e){let t=e[0];if(!t)return;let r=HB("imagePlaneModule",t),n=r?.imageOrientationPatient;if(!n||6!==n.length)return;let a=Lv.vec3.fromValues(n[0],n[1],n[2]),i=Lv.vec3.fromValues(n[3],n[4],n[5]),o=Lv.vec3.create();Lv.vec3.cross(o,a,i);let s=etz([o[0],o[1],o[2]]);if(s===NQ.AXIAL||s===NQ.CORONAL||s===NQ.SAGITTAL)return s}function eap(e){return!!(e.volumeId&&ql.getVolume(e.volumeId))||function(e){if(!e.length)return!1;let t=e[0],r=HB(FC.GENERAL_SERIES,t);if(!r)return!1;let{modality:n,seriesInstanceUID:a}=r,i=HB(FC.IMAGE_PLANE,t);if(!i)return!1;let{imageOrientationPatient:o,pixelSpacing:s,frameOfReferenceUID:l,columns:u,rows:d,usingDefaultValues:c}=i;if(c)return!1;let h=!0;for(let t=0;t<e.length;t++){let r=e[t],i=HB(FC.GENERAL_SERIES,r),l=HB(FC.IMAGE_PLANE,r);if(!i||!l){h=!1;break}let{modality:c,seriesInstanceUID:p}=i,{imageOrientationPatient:m,pixelSpacing:f,columns:g,rows:y}=l;if(p!==a||c!==n||g!==u||y!==d||!Vw(m,o)||!Vw(f,s)){h=!1;break}}return h}(e.imageIds)}function eam(e,t){return!e.useWorldCoordinateImageData&&(!!e.volumeId||!t&&eap(e))}function eaf(e,t,r){let n=e.anchorCanvas??[.5,.5],a=e.anchorWorld??[0,0,0],[i,o]=erW(e.scale);return[(0-a[0])*i+(n[0]-.5)*t,(0-a[1])*o+(n[1]-.5)*r]}let eag="planar";function eay(e){return[e[0],e[1]]}function eav(e){return[e[0],e[1],e[2]]}function eab(e){let{viewport:t}=e,r=enx(e.viewState??t.getViewState?.()??{}),n=e.resolvedView??(e.viewState&&e.resolveViewState?e.resolveViewState(r):t.getResolvedView?.({frameOfReferenceUID:e.frameOfReferenceUID,sliceIndex:e.sliceIndex})),a=e.canvasWidth??n?.state.canvasWidth??t.element?.clientWidth??1,i=e.canvasHeight??n?.state.canvasHeight??t.element?.clientHeight??1,o=e.displayArea??t.getDisplayArea?.()??r.displayArea,s=n?.scale??erW(r.scale),l=n?.zoom??erW(r.scale)[1],u=n?.pan??eaf(r,a,i),d=n?.toICamera(),c=e.frameOfReferenceUID??n?.getFrameOfReferenceUID()??t.getFrameOfReferenceUID?.();return{kind:eag,adapterId:eag,canvasHeight:i,canvasWidth:a,dataId:e.dataId,displayArea:G_(o),frameOfReferenceUID:c,presentation:{displayArea:G_(o),flipHorizontal:!0===r.flipHorizontal,flipVertical:!0===r.flipVertical,pan:eay(u),position:r.anchorWorld?{kind:"anchor",worldPoint:eav(r.anchorWorld),canvasPoint:eay(r.anchorCanvas??[.5,.5])}:d?.focalPoint?{kind:"focalPoint",worldPoint:eav(d.focalPoint)}:{kind:"anchor",canvasPoint:eay(r.anchorCanvas??[.5,.5])},rawPan:eay(u),rotation:n?.rotation??er5(r.rotation),scale:function(e){let{displayArea:t,scaleMode:r,zoom:n}=e;return t?{kind:"displayArea",value:n,area:t}:"fitWidth"===r?{kind:"fitWidth",value:n}:"fitHeight"===r?{kind:"fitHeight",value:n}:{kind:"fit",value:n}}({displayArea:o,scaleMode:r.scaleMode,zoom:l}),scaleVector:eay(s),zoom:l},rendererCamera:d,resolveViewState:e.resolveViewState,resolvedView:n,spaces:{canvas:!0,image:!0,renderer:!!d,world:!!n},transforms:n?{canvasToWorld:e=>n.canvasToWorld(e),worldToCanvas:e=>n.worldToCanvas(e)}:void 0,viewState:r,viewportType:t.type}}function eaw(e){return e.presentation.zoom??1}function eax(e){return eay(e.presentation.scaleVector)}function eaC(e){return eay(e.presentation.rawPan)}let eak={rotation:!0,displayArea:!0,zoom:!0,scale:!0,pan:!0,flipHorizontal:!0,flipVertical:!0};function eaM(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function eaS(e,t){return t?{...e,displayArea:void 0}:e}let eaE={id:eag,viewportTypes:[Nq.PLANAR_NEXT],getSnapshot:e=>eab(e),getPresentation:(e,t)=>(function(e,t){let r={},n=t??eak;if(n.rotation&&(r.rotation=e.presentation.rotation),n.displayArea&&(r.displayArea=G_(e.displayArea)),n.zoom&&(r.zoom=eaw(e)),n.scale&&(r.scale=eax(e)),n.pan){let t=eax(e),n=eaC(e);r.pan=[n[0]/t[0],n[1]/t[1]]}return n.flipHorizontal&&(r.flipHorizontal=e.presentation.flipHorizontal??!1),n.flipVertical&&(r.flipVertical=e.presentation.flipVertical??!1),r})(e,t),withPresentation:(e,t,r)=>(function(e,t){let{pan:r,rotation:n=e.presentation.rotation,flipHorizontal:a=e.viewState?.flipHorizontal??!1,flipVertical:i=e.viewState?.flipVertical??!1}=t,o=e.viewState??{},s=eaM(t,"zoom"),l=eaM(t,"scale"),u=eaM(t,"displayArea"),d=l?erW(t.scale):erW(t.zoom??e.presentation.scaleVector),c={flipHorizontal:a,flipVertical:i,rotation:n};if(u){let e=G_(t.displayArea);c.anchorCanvas=[.5,.5],c.anchorWorld=void 0,c.displayArea=e,c.scale=s||l?d:[1,1],c.scaleMode=e?.scaleMode??"fit"}else(s||l||!o.displayArea)&&(c.scale=d,c.scaleMode="fit");if(r){let n=[r[0]*d[0],r[1]*d[1]],a=enx({...o,...c}),i=e.resolveViewState?.(a)??(a===e.viewState?e.resolvedView:void 0);return eaS(i?.withPan(n).state.viewState??function(e,t,r,n){let a=eaf(e,r,n),[i,o]=e.anchorCanvas??[.5,.5],s=t[0]-a[0],l=t[1]-a[1];return enx({...e,anchorCanvas:[i+s/Math.max(r,1),o+l/Math.max(n,1)],displayArea:void 0})}(a,n,e.canvasWidth,e.canvasHeight),u&&void 0===t.displayArea)}return eaS(enx({...o,...c}),u&&void 0===t.displayArea)})(e,t),applyToRenderer:(e,t)=>{t&&"object"==typeof t&&"getActiveCamera"in t&&"function"==typeof t.getActiveCamera&&er7({activeSourceICamera:e.rendererCamera,renderer:t})}},eaT=class{constructor(e){this.host=e}resolveBindingRole(e){return"source"===e.role?"source":"overlay"}getActiveDataId(){return this.sourceDataId}clearActiveDataId(){this.sourceDataId=void 0}getCurrentBinding(){return this.sourceDataId?this.host.getBinding(this.sourceDataId)??this.host.getFirstBinding():this.host.getFirstBinding()}getFirstBoundDataId(){for(let[e]of this.host.getBindings())return e}hasBinding(e){return!!this.host.getBinding(e)}promoteSourceDataId(e){for(let[t,r]of this.host.getBindings())r.role=t===e?"source":"overlay";this.sourceDataId=e}handleRemovedData(e){this.sourceDataId===e&&(this.sourceDataId=void 0,this.promoteFirstAvailableBindingToSource())}removeBindingsExcept(e){for(let t of Array.from(this.host.getBindings(),([e])=>e))e.has(t)||this.host.removeData(t)}getActorForDataId(e){let t=this.host.getBinding(e);return t?.getActorEntry?.(t.data)}getBindingActor(e){let t=this.host.getBinding(e)?.rendering;return t?.actor??t?.compatibilityActor}getActors(){return[...this.getProjectedActorEntries("source"),...this.getProjectedActorEntries("overlay")]}getDefaultActor(){return this.getProjectedActorEntries("source")[0]??this.getProjectedActorEntries()[0]}getProjectedActorEntries(e){let t=[];for(let[,r]of this.host.getBindings()){if(e&&r.role!==e)continue;let n=r.getActorEntry?.(r.data);n&&t.push(n)}return t}findBindingDataIdByActorEntryUID(e){for(let[t,r]of this.host.getBindings()){let n=r.getActorEntry?.(r.data);if(n?.uid===e)return t}}findDataIdByVolumeId(e){for(let[t,r]of this.host.getBindings())if(r.data?.volumeId===e)return t}getDefaultVOIRange(e){let t=e??this.sourceDataId??this.getCurrentBinding()?.data.id,r=t?this.host.getBinding(t)?.rendering:void 0,n=r?.defaultVOIRange;return n?{...n}:void 0}promoteFirstAvailableBindingToSource(){let e=this.getFirstBoundDataId();e&&this.promoteSourceDataId(e)}};function eaI(e){var t;let{rendering:r,viewRefSpecifier:n}=e;if(!r)return;let a=(t=e.data,t?.imageVolume?.imageIds||t?.imageIds||[]);if(!a.length)return;if(r.renderMode===eyK.CPU_IMAGE||r.renderMode===eyK.VTK_IMAGE){let t="number"==typeof n?.sliceIndex?Math.min(Math.max(0,n.sliceIndex),a.length-1):e.viewState?.slice?.kind==="stackIndex"?Math.min(Math.max(0,e.viewState.slice.imageIdIndex),a.length-1):eaP(r);return a[t]}let i=enP({viewState:e.viewState,data:e.data,frameOfReferenceUID:e.frameOfReferenceUID,renderContext:e.renderContext,rendering:r,sliceIndex:n?.sliceIndex})?.toICamera();return i?.focalPoint&&i.viewPlaneNormal?q$(r.imageVolume,i.focalPoint,i.viewPlaneNormal):a[Math.min(eaP(r),a.length-1)]}function eaP(e){return e.currentImageIdIndex}function ea_(e){if(e)return[e[0],e[1],e[2]]}let eaD=class{constructor(e){this.host=e}getVolumeId(e={}){return this.getPlanarReferenceContext(e)?.data.volumeId??this.getCurrentPlanarReferenceContext()?.data.volumeId}getCurrentImageId(e={}){let t=this.getPlanarReferenceContext(e);return eaI({viewState:this.host.getViewState(),data:t?.data,frameOfReferenceUID:t?.frameOfReferenceUID,rendering:t?.rendering,renderContext:this.host.getRenderContext(),viewRefSpecifier:e})}getViewReference(e={}){let t=this.getPlanarReferenceContext(e);return function(e){let{frameOfReferenceUID:t,rendering:r,viewRefSpecifier:n}=e,{dimensionGroupNumber:a}=erf(e.data?.imageVolume),i=n?.sliceIndex??(r?eaP(r):void 0),o=n?.rangeEndSliceIndex,s=enP({...e,sliceIndex:i})?.toICamera(),l=ea_(s?.focalPoint),u=ea_(s?.viewPlaneNormal),d=ea_(s?.viewUp),c=d&&u?ea_(Lv.vec3.cross(Lv.vec3.create(),d,u)):void 0,h={FrameOfReferenceUID:t,dataId:e.dataId,dimensionGroupNumber:a,cameraFocalPoint:l,viewPlaneNormal:u,viewUp:d,sliceIndex:i,planeRestriction:u&&d&&l?{FrameOfReferenceUID:t,point:ea_(n?.points?.[0])||l,inPlaneVector1:d,inPlaneVector2:c}:void 0},p=eaI(e),m="number"==typeof i&&"number"==typeof o&&o>i?eaI({...e,viewRefSpecifier:{...n,sliceIndex:o}}):void 0;return r&&(r.renderMode===eyK.CPU_VOLUME||r.renderMode===eyK.VTK_VOLUME_SLICE)&&n?.forFrameOfReference!==!0&&(h.volumeId=e.data?.volumeId),p&&(h.referencedImageId=p,h.referencedImageURI=Gk(p)),m&&"number"==typeof o&&"number"==typeof i&&o>i&&(h.multiSliceReference={FrameOfReferenceUID:t,referencedImageId:m,referencedImageURI:Gk(m),sliceIndex:o}),n?.points&&h.planeRestriction&&GD(n.points,h),h}({viewState:this.host.getViewState(),dataId:t?.dataId,frameOfReferenceUID:t?.frameOfReferenceUID??this.getFrameOfReferenceUID(),data:t?.data,rendering:t?.rendering,renderContext:this.host.getRenderContext(),viewRefSpecifier:e})}getViewReferenceId(e={}){let t=this.getPlanarReferenceContext(e);return function(e){let{rendering:t,viewRefSpecifier:r}=e;if(!t)return null;if(t.renderMode===eyK.CPU_VOLUME||t.renderMode===eyK.VTK_VOLUME_SLICE){let n=enP({...e,sliceIndex:r?.sliceIndex})?.toICamera(),a=r?.sliceIndex??eaP(t),i=e.data?.volumeId;return i&&n?.viewPlaneNormal?etG({sliceIndex:a,viewPlaneNormal:n.viewPlaneNormal,volumeId:i}):null}let n=eaI(e);return n?`imageId:${n}`:null}({viewState:this.host.getViewState(),frameOfReferenceUID:t?.frameOfReferenceUID,data:t?.data,rendering:t?.rendering,renderContext:this.host.getRenderContext(),viewRefSpecifier:e})}setViewReference(e){if(!e)return;let t=this.resolveViewReferenceContext(e);if(!t)return;let r=this.activatePlanarReferenceContext(t.dataId),n=this.applyViewReferenceToCurrentBinding(e);r&&!n&&this.host.render()}getFrameOfReferenceUID(){let e=this.resolveFrameOfReferenceUID();return this.host.getResolvedView({frameOfReferenceUID:e})?.getFrameOfReferenceUID()??e}resolveFrameOfReferenceUID(){let e=this.host.getCurrentBinding();return e?.getFrameOfReferenceUID()??`${this.host.viewportType}-viewport-${this.host.viewportId}`}isPlaneViewable(e,t){return function(e){let{frameOfReferenceUID:t,options:r,planeRestriction:n}=e;if(n.FrameOfReferenceUID!==t)return!1;let{focalPoint:a,viewPlaneNormal:i}=enP(e)?.toICamera()||{};if(!a||!i)return!1;if(r?.withOrientation)return!0;if(n.inPlaneVector1&&!Vw(0,Lv.vec3.dot(i,n.inPlaneVector1))||n.inPlaneVector2&&!Vw(0,Lv.vec3.dot(i,n.inPlaneVector2)))return!1;if(r?.withNavigation)return!0;let{point:o}=n,s=Lv.vec3.sub(Lv.vec3.create(),o,a);return Vw(0,Lv.vec3.dot(s,i))}({viewState:this.host.getViewState(),frameOfReferenceUID:this.getFrameOfReferenceUID(),options:t,planeRestriction:e,rendering:this.getCurrentPlanarRendering(),renderContext:this.host.getRenderContext()})}getReferenceViewContexts(e){let t=this.getAllPlanarReferenceContexts();return t.length?t.map(e=>this.getGenericViewportReferenceContext(e)):e}getPlanarReferenceContext(e={}){return e.volumeId?this.findPlanarReferenceContextByVolumeId(e.volumeId)??this.getCurrentPlanarReferenceContext():this.getCurrentPlanarReferenceContext()}getCurrentPlanarReferenceContext(){let e=this.host.getActiveDataId();if(e){let t=this.getPlanarReferenceContextByDataId(e);if(t)return t}for(let[e]of this.host.getBindings())return this.getPlanarReferenceContextByDataId(e)}getPlanarReferenceContextByDataId(e){let t=this.host.getBinding(e);if(t)return{dataId:e,data:t.data,frameOfReferenceUID:t.getFrameOfReferenceUID()??`${this.host.viewportType}-viewport-${this.host.viewportId}`,rendering:t.rendering}}getAllPlanarReferenceContexts(){let e=[];for(let[t]of this.host.getBindings()){let r=this.getPlanarReferenceContextByDataId(t);r&&e.push(r)}return e}getGenericViewportReferenceContext(e){let t=enP({viewState:this.host.getViewState(),data:e.data,frameOfReferenceUID:e.frameOfReferenceUID,rendering:e.rendering,renderContext:this.host.getRenderContext()})?.toICamera(),r=e.data.volumeId;return{dataId:e.dataId,dataIds:[e.data.id],frameOfReferenceUID:e.frameOfReferenceUID,imageIds:this.getImageIdsForReferenceContext(e),currentImageIdIndex:e.rendering.currentImageIdIndex,volumeId:r,volumeIds:r?[r]:void 0,cameraFocalPoint:t?.focalPoint,viewPlaneNormal:t?.viewPlaneNormal,...erf(e.data.imageVolume)}}findPlanarReferenceContextByVolumeId(e){for(let[t,r]of this.host.getBindings())if(r.data.volumeId===e)return this.getPlanarReferenceContextByDataId(t)}findPlanarReferenceContextByImageReference(e,t){let r=t||(e?Gk(e):void 0);if(r){for(let e of this.getAllPlanarReferenceContexts())if(this.getImageIdsForReferenceContext(e).some(e=>Gk(e)===r))return e}}resolveViewReferenceContext(e){if(e.dataId){let t=this.getPlanarReferenceContextByDataId(e.dataId);if(t)return t}if(e.volumeId){let t=this.findPlanarReferenceContextByVolumeId(e.volumeId);if(t)return t}let t=this.findPlanarReferenceContextByImageReference(e.referencedImageId,e.referencedImageURI);if(t)return t;let r=this.getCurrentPlanarReferenceContext();if(!e.FrameOfReferenceUID||r?.frameOfReferenceUID===e.FrameOfReferenceUID)return r}activatePlanarReferenceContext(e){return this.host.getActiveDataId()!==e&&(this.host.promoteSourceDataId(e),this.host.updateBindingsCameraState(),!0)}applyViewReferenceToCurrentBinding(e){let t=this.getCurrentPlanarReferenceContext();if(!t||e.FrameOfReferenceUID&&t.frameOfReferenceUID!==e.FrameOfReferenceUID)return!1;let{rendering:r}=t;return r.renderMode===eyK.CPU_IMAGE||r.renderMode===eyK.VTK_IMAGE?this.applyImageViewReference(t,e):this.applyVolumeViewReference(t,e)}applyImageViewReference(e,t){let r=this.getImageIdsForReferenceContext(e),n=this.findImageIdIndexByReference(r,t.referencedImageId,t.referencedImageURI);return"number"==typeof n?(this.host.setImageIdIndex(n),!0):"number"==typeof t.sliceIndex&&(this.host.setImageIdIndex(t.sliceIndex),!0)}applyVolumeViewReference(e,t){let r=this.normalizeVolumeViewReference(e,t),n=this.host.getResolvedView({frameOfReferenceUID:e.frameOfReferenceUID})?.toICamera();if(!n?.viewPlaneNormal)return!1;let a=n.viewPlaneNormal,i=r.viewPlaneNormal,o=i&&!this.areNormalsEqual(a,i)&&!this.areNormalsOpposite(a,i),s=i??a,l=!o&&this.areNormalsOpposite(a,s),u=this.resolveVolumeReferenceSliceTarget(e,r,s,l),d={};o&&i&&(d.orientation={viewPlaneNormal:[...i],...r.viewUp?{viewUp:[...r.viewUp]}:{}});let c=r.cameraFocalPoint??u?.sliceWorldPoint??("number"==typeof u?.imageIdIndex?this.host.getVolumeSliceWorldPointForImageIdIndex(u.imageIdIndex):void 0);return c&&(d.slice={kind:"volumePoint",sliceWorldPoint:[...c]}),!!Object.keys(d).length&&(this.host.setViewState(d),!0)}normalizeVolumeViewReference(e,t){if(!t.planeRestriction||t.viewPlaneNormal)return t;let r=this.deriveOrientationFromPlaneRestriction(e,t.planeRestriction);return{...t,cameraFocalPoint:t.cameraFocalPoint??t.planeRestriction.point,...r}}deriveOrientationFromPlaneRestriction(e,t){let r,n=this.host.getResolvedView({frameOfReferenceUID:e.frameOfReferenceUID})?.toICamera(),a=n?.viewPlaneNormal,i=n?.viewUp,{inPlaneVector1:o,inPlaneVector2:s}=t,l={};if(a&&this.isPlaneRestrictionCompatibleWithNormal(t,a))return l.viewPlaneNormal=[...a],o?l.viewUp=[...o]:i&&(l.viewUp=[...i]),l;if(o&&s){let e=Lv.vec3.cross(Lv.vec3.create(),s,o);Lv.vec3.length(e)>0&&(Lv.vec3.normalize(e,e),r=[...e])}else if(o&&a){let e=Lv.vec3.cross(Lv.vec3.create(),a,o);Lv.vec3.length(e)>0&&(Lv.vec3.normalize(e,e),r=[...e])}return r&&(l.viewPlaneNormal=r),o?l.viewUp=[...o]:i&&(l.viewUp=[...i]),l}isPlaneRestrictionCompatibleWithNormal(e,t){return(!e.inPlaneVector1||Vw(0,Lv.vec3.dot(t,e.inPlaneVector1)))&&(!e.inPlaneVector2||Vw(0,Lv.vec3.dot(t,e.inPlaneVector2)))}resolveVolumeReferenceSliceTarget(e,t,r,n){let{rendering:a}=e;if(a.renderMode!==eyK.CPU_VOLUME&&a.renderMode!==eyK.VTK_VOLUME_SLICE)return;let i=this.getImageIdsForReferenceContext(e),o=a.maxImageIdIndex;if("number"==typeof t.sliceIndex&&t.volumeId===e.data.volumeId&&t.viewPlaneNormal)return{imageIdIndex:Math.min(Math.max(0,n?o-t.sliceIndex:t.sliceIndex),o)};let s=this.findImageIdIndexByReference(i,t.referencedImageId,t.referencedImageURI);if("number"==typeof s)return this.toVolumeSliceTarget(a.imageVolume,s);let l=t.cameraFocalPoint??t.planeRestriction?.point;if(l){let e=q$(a.imageVolume,l,r),t=this.findImageIdIndexByReference(i,e);return"number"==typeof t?this.toVolumeSliceTarget(a.imageVolume,t):void 0}if("number"==typeof t.sliceIndex)return{imageIdIndex:Math.min(Math.max(0,t.sliceIndex),o)}}toVolumeSliceTarget(e,t){let r=enf(e,t);return r?{sliceWorldPoint:r}:{imageIdIndex:t}}getImageIdsForReferenceContext(e){return e.data.imageVolume?.imageIds||e.data.imageIds}findImageIdIndexByReference(e,t,r){let n=r||(t?Gk(t):void 0);if(!n)return;let a=e.findIndex(e=>Gk(e)===n);return a>=0?a:void 0}getCurrentPlanarRendering(){return this.host.getCurrentBinding()?.rendering}areNormalsEqual(e,t){return!!(e&&t&&Vw(e,t))}areNormalsOpposite(e,t){return!!e&&!!t&&Vw(Lv.vec3.negate(Lv.vec3.create(),e),t)}};function eaO(e={}){return G_(e)}let eaA=class extends erM{static get useCustomRenderingPipeline(){return!1}constructor(e){super(e),this.type=Nq.PLANAR_NEXT,this.suppressEvents=!1,this.resolvedViewCacheRevision=0,this.setDataRequestId=0,this.renderPipelineSwapId=0,this.lastRenderPathErrorByDataId=new Map,this.mountOptionsByDataId=new Map,this.renderingEngineId=e.renderingEngineId,this.canvas=e.canvas,this.sWidth=e.sWidth,this.sHeight=e.sHeight,this.defaultOptions=eaO(e.defaultOptions||{}),this.options=eaO(this.defaultOptions),this.canvasToWorld=this.canvasToWorld.bind(this),this.worldToCanvas=this.worldToCanvas.bind(this),this.dataProvider=e.dataProvider||new erV,this.renderPathResolver=e.renderPathResolver||function(e=[new enN,new en8,new en7,new eal,...function(){By();let e=[];for(let t of Bp.values()){let{image:r,volume:n}=t.renderModes;for(let t of[r,n])t?.createDefinition&&e.push(t.createDefinition())}return e}()]){return new erE(e)}(),this.mountedData=new eaT({getBinding:e=>this.getBinding(e),getFirstBinding:()=>this.getFirstBinding(),getBindings:()=>this.bindings.entries(),removeData:e=>this.removeData(e)}),this.viewReferences=new eaD({viewportId:this.id,viewportType:this.type,getActiveDataId:()=>this.mountedData.getActiveDataId(),getBinding:e=>this.getBinding(e),getBindings:()=>this.bindings.entries(),getCurrentBinding:()=>this.getCurrentBinding(),getRenderContext:()=>this.renderContext,getResolvedView:e=>this.getResolvedView(e),getViewState:()=>this.viewState,getVolumeSliceWorldPointForImageIdIndex:e=>this.getVolumeSliceWorldPointForImageIdIndex(e),promoteSourceDataId:e=>{this.clearResolvedViewCache(),this.mountedData.promoteSourceDataId(e)},render:()=>this.render(),setImageIdIndex:e=>this.setImageIdIndex(e),setViewState:e=>this.setViewState(e),updateBindingsCameraState:()=>this.updateBindingsCameraState()});const t=FA(this.renderingEngineId),r=t?.getRenderer(this.id);if(!r)throw Error("[PlanarViewport] No renderer available. Ensure WebGL is supported and the rendering engine has been properly initialized.");this.element.style.position=this.element.style.position||"relative",this.element.style.overflow="hidden",this.element.style.background=this.element.style.background||"#000",this.element.style.isolation="isolate";const n=e.canvas,a=this.element.querySelector(".viewport-element"),i=document.createElement("canvas");i.style.display="none",i.style.height="100%",i.style.inset="0",i.style.pointerEvents="none",i.style.position="absolute",i.style.width="100%",i.style.zIndex="0",this.element.appendChild(i),this.cpuCanvas=i,a&&(a.style.position=a.style.position||"relative",a.style.zIndex="1");const o=i.getContext("2d");if(!o)throw Error("[PlanarViewport] Failed to initialize CPU canvas");r.getActiveCamera().setParallelProjection(!0),this.renderContext={viewportId:this.id,renderingEngineId:this.renderingEngineId,type:"planar",viewport:{element:this.element,getActiveDataId:()=>this.mountedData.getActiveDataId(),invalidateResolvedView:()=>this.clearResolvedViewCache(),getViewState:()=>this.getViewState(),isCurrentDataId:e=>this.getCurrentBinding()?.data.id===e,getOverlayActors:()=>this.mountedData.getProjectedActorEntries("overlay")},renderPath:{renderMode:eyK.VTK_IMAGE},view:{},display:{requestRender:()=>{this.requestRenderingEngineRender()},renderNow:()=>{this.render()},setNeedsRender:()=>{this.setNeedsRender()},markRendered:()=>{this.setRendered()},activateRenderMode:e=>{this.renderContext.renderPath.renderMode=e,this.setRenderModeVisibility(e,i,n)}},cpu:{canvas:i,composition:{clearedRenderPassId:-1,renderPassId:0},context:o},vtk:{renderer:r,canvas:n}},this.viewState=enx({...enw(),orientation:this.resolveRequestedOrientation()}),this.setRenderModeVisibility(eyK.VTK_IMAGE,i,n),this.element.setAttribute("data-viewport-uid",this.id),this.element.setAttribute("data-rendering-engine-uid",this.renderingEngineId),this.resize()}async setDisplaySets(...e){let t=++this.setDataRequestId,r=()=>t!==this.setDataRequestId;for(let[t,{displaySetId:n,options:a={}}]of(this.clearResolvedViewCache(),this.removeReplaceableData(e),e.entries())){if(r())return;let e=a.role??(0===t?"source":"overlay");await this.addDisplaySetInternal(n,{...a,role:e},r)}}async addDisplaySet(e,t={}){await this.addDisplaySetInternal(e,t),this.clearResolvedViewCache()}async addDisplaySetInternal(e,t={},r){let n=this.mountedData.resolveBindingRole(t),a={...t,role:n},{data:i,resolvedOrientation:o,selectedPath:s}=await this.loadPlanarData(e,a);if(r?.()||("source"===n&&(this.mountedData.promoteSourceDataId(e),this.applyLoadedPlanarViewState(o,i,s)),!await this.addLoadedData(e,i,{renderMode:s.renderMode,role:n},r)))return;this.mountOptionsByDataId.set(e,a),this.clearResolvedViewCache(),this.setDefaultDataPresentation(e,{visible:!0});let l=this.getDisplaySetPresentation(e),u=l?.voiRange??this.getDefaultVOIRange(e);u&&this.notifyDataPresentationModified(e,{voiRange:u}),"source"===n&&this.triggerCameraModifiedEvent(this.getCameraForEvent())}removeData(e){this.clearResolvedViewCache(),this.mountOptionsByDataId.delete(e),this.lastRenderPathErrorByDataId.delete(e),super.removeData(e),this.mountedData.handleRemovedData(e),!this.isDestroyed&&this.getCurrentBinding()&&this.updateBindingsCameraState()}getActors(){return this.mountedData.getActors()}getDefaultActor(){return this.mountedData.getDefaultActor()}getImageActor(e){let t=this.getActors(),r=t[0];return(e&&(r=t.find(t=>t.referencedId===e)??this.mountedData.getActorForDataId(e)),r&&H2(r))?r.actor:null}getDefaultImageData(){return this.getImageActor()?.getMapper().getInputData()}renderImageObject(e){let t=`image-object:${this.id}:${Gk(e.imageId)}`;return this.renderImageObjectDataId&&this.renderImageObjectDataId!==t&&H$.remove(this.renderImageObjectDataId),this.renderImageObjectDataId=t,H$.add(t,{image:e,imageIds:[e.imageId],initialImageIdIndex:0,kind:"planar"}),this.setDisplaySets({displaySetId:t,options:{orientation:this.resolveRequestedOrientation()}})}getCanvas(){let e=this.getCurrentPlanarRendering();return"cpu"===BC(e?.renderMode)?this.renderContext.cpu.canvas:this.renderContext.vtk.canvas}async addImages(e){let t=this.getCurrentPlanarRendering(),r=t?.renderMode;if(Bx(r)||Bw(r)&&"cpu"!==BC(r)){for(let t of e){let e=this.resolveStackInputImage(t);if(!e)continue;let r=this.resolveOverlayReference(t,e),n=this.resolveOverlayDataId(t,e,r);H$.add(n,{image:e,imageData:t.imageData,imageIds:[t.imageId],initialImageIdIndex:0,kind:"planar",reference:r,useWorldCoordinateImageData:!0===t.useWorldCoordinateImageData}),await this.addDisplaySet(n,{role:"overlay"});let a=this.mountedData.getActorForDataId(n);t.callback&&a&&t.callback({imageActor:a.actor,imageId:t.imageId})}this.render()}}getImageDataMetadata(e){return HH(e)}getImageIds(){let e=this.getPlanarData();return e?e.imageVolume?.imageIds||e.imageIds:[]}getVolumeId(e={}){return this.viewReferences.getVolumeId(e)??this.getPlanarData()?.volumeId}getSourceDataId(){return this.mountedData.getActiveDataId()}getCurrentMode(){let e=this.getSourceBinding();if(!e)return"empty";let t=e.rendering.renderMode;return t===eyK.VTK_VOLUME||Bw(t)?"volume":Bx(t)?"stack":this.getVolumeId()?"volume":"stack"}notifyDataPresentationModified(e,t){if(this.suppressEvents)return;let r="voiRange"in t||"invert"in t||"voiLUTFunction"in t,n="colormap"in t;if(!r&&!n)return;let a=this.getDisplaySetPresentation(e),i=this.getDataSet(e)?.volumeId??(e===this.getSourceDataId()?this.getVolumeId():void 0);if(r){let e=t.voiRange??a?.voiRange;e&&Bh(this.element,NH.VOI_MODIFIED,{viewportId:this.id,range:e,volumeId:i,VOILUTFunction:t.voiLUTFunction??a?.voiLUTFunction,invert:t.invert??a?.invert,colormap:a?.colormap})}n&&t.colormap&&Bh(this.element,NH.COLORMAP_MODIFIED,{viewportId:this.id,colormap:t.colormap,volumeId:i})}getDefaultVOIRange(e){return this.mountedData.getDefaultVOIRange(e)}getCurrentImageIdIndex(){return this.getActiveImageIdIndex()}getCurrentImageId(e={}){return this.viewReferences.getCurrentImageId(e)}getSliceIndex(){return this.getCurrentImageIdIndex()}getNumberOfSlices(){return this.getImageIds().length?this.getMaxImageIdIndex()+1:0}calibrateSpacing(e){this.render();let t=this.getImageData();Bh(this.element,NH.IMAGE_SPACING_CALIBRATED,{element:this.element,viewportId:this.id,renderingEngineId:this.renderingEngineId,imageId:e,calibration:t?.calibration,imageData:t?.imageData})}normalizeViewState(e){return enx(e)}setViewState(e){if(this.isDestroyed)return;let t=this.getResolvedCameraForEvent();Object.prototype.hasOwnProperty.call(e,"displayArea")&&(this.options={...this.options,displayArea:G_(e.displayArea)});let r={...this.viewState,...e};this.clearResolvedViewCache(),this.viewState=this.normalizeViewState(r),this.modified(t)}setDisplaySetPresentation(e,t){(this.clearResolvedViewCache(),"string"==typeof e)?super.setDisplaySetPresentation(e,t??{}):super.setDisplaySetPresentation(e)}setDataPresentationState(e,t){this.clearResolvedViewCache(),super.setDataPresentationState(e,t)}getRotation(){return this.getResolvedView()?.rotation??er5(this.viewState.rotation)}getAnchorWorld(){let e=this.viewState.anchorWorld;return e?[...e]:void 0}setAnchorWorld(e){this.setViewState({anchorWorld:e?[...e]:void 0})}setOptions(e,t=!1){this.options=eaO(e),this.options.displayArea&&this.setDisplayArea(this.options.displayArea,this.options.suppressEvents??!1),t&&this.render()}reset(e=!1){this.options=eaO(this.defaultOptions),e&&this.render()}getDisplayArea(){return G_(this.viewState.displayArea??this.options.displayArea)}setDisplayArea(e,t=!1){let r=G_(e);r&&(this.options={...this.options,displayArea:G_(r)},this.setViewState({anchorCanvas:[.5,.5],anchorWorld:void 0,displayArea:r,scale:[1,1],scaleMode:r.scaleMode??"fit"}),t||this.suppressEvents||Bh(this.element,NH.DISPLAY_AREA_MODIFIED,{viewportId:this.id,displayArea:G_(r),storeAsInitialCamera:r.storeAsInitialCamera}))}getZoom(){return eaw(this.getProjectionSnapshot())}getScale(){return eax(this.getProjectionSnapshot())}setZoom(e,t){this.setScale(e,t)}setScale(e,t){let r=this.getResolvedView(),n=erW(e);r?this.applyResolvedViewState(r.withScale(n,t).state.viewState):t?this.setScaleAtCanvasPoint(n,t):this.setViewState({displayArea:void 0,scale:n,scaleMode:"fit"})}getPan(){return eaC(this.getProjectionSnapshot())}setPan(e){let t=this.getResolvedView();t?this.applyResolvedViewState(t.withPan(e).state.viewState):this.applyResolvedViewState(this.getFallbackViewStateWithPan(this.viewState,e))}setScaleAtCanvasPoint(e,t){let r=this.getResolvedView(),n=erW(e);if(r)return void this.applyResolvedViewState(r.withScale(n,t).state.viewState);let a=this.buildFallbackCanvasToWorld(t),{height:i,width:o}=this.getCurrentCanvasDimensions();this.setViewState({anchorWorld:a,anchorCanvas:[t[0]/Math.max(o,1),t[1]/Math.max(i,1)],displayArea:void 0,scale:n,scaleMode:"fit"})}getViewState(){return enx(this.viewState)}getResolvedView(e={}){return this.resolveCachedViewState(this.viewState,e)}getRenderingEngine(){return FA(this.renderingEngineId)}getViewReference(e={}){return this.viewReferences.getViewReference(e)}getViewReferenceId(e={}){return this.viewReferences.getViewReferenceId(e)}setViewReference(e){this.viewReferences.setViewReference(e)}getImageData(e){if(e){let t=this.findDataIdByVolumeId(e),r=t?this.getBinding(t):void 0;return r?.getImageData?.()}return this.getCurrentBinding()?.getImageData?.()}canvasToWorld(e){let t=this.getResolvedView();return t?t.canvasToWorld(e):this.buildFallbackCanvasToWorld(e)}worldToCanvas(e){let t=this.getResolvedView();return t?t.worldToCanvas(e):this.buildFallbackWorldToCanvas(e)}getFrameOfReferenceUID(){return this.viewReferences.getFrameOfReferenceUID()}hasImageId(e){return this.getImageIds().includes(e)}hasImageURI(e){return this.getImageIds().some(t=>Gk(t)===e)}hasVolumeId(e){return void 0!==this.findDataIdByVolumeId(e)}hasVolumeURI(e){return String(this.getVolumeId()||"").includes(e)}isPlaneViewable(e,t){return this.viewReferences.isPlaneViewable(e,t)}isReferenceViewable(e,t={}){return super.isReferenceViewable(e,t)}setImageIdIndex(e){let t=this.getImageIds();if(!t.length)return Promise.reject(Error("[PlanarViewport] Cannot set image index on empty stack"));let r=Math.min(Math.max(0,e),this.getMaxImageIdIndex()),n=t[r]||t[t.length-1],a=this.getCurrentPlanarRendering();if(Bw(a?.renderMode)){let e=this.getVolumeSliceWorldPointForImageIdIndex(r);return e&&this.setViewState({slice:{kind:"volumePoint",sliceWorldPoint:e}}),Promise.resolve(n)}return this.setViewState({slice:{kind:"stackIndex",imageIdIndex:r}}),Promise.resolve(n)}scroll(e){return this.setImageIdIndex(this.getActiveImageIdIndex()+e)}setOrientation(e){this.setViewState({orientation:this.resolveSetOrientation(e)})}canRenderOrientation(e,t){let r=t??this.getSourceDataId();if(!r)return!1;let n=this.getDataSet(r);return!!n&&eac.canRender(n,{orientation:this.resolveSetOrientation(e)})}resetViewState(e){let{resetPan:t=!0,resetZoom:r=!0,resetOrientation:n=!0,resetFlip:a=!0}=e||{},i={rotation:0};return t&&(i.anchorWorld=void 0,i.anchorCanvas=[.5,.5]),r&&(i.scale=[1,1],i.scaleMode="fit"),n&&(i.orientation=this.resolveRequestedOrientation()),a&&(i.flipHorizontal=!1,i.flipVertical=!1),this.setViewState(i),this.triggerCameraResetEvent(),!0}resetViewStateForResize(){return this.resetViewState()}resetDisplaySetPresentation(e){if(this.isDestroyed)return;let t=e??this.getSourceDataId();if(!t)return;this.setDataPresentationState(t,{});let r=this.getDefaultVOIRange(t);r&&this.notifyDataPresentationModified(t,{voiRange:r})}getUseCustomRenderingPipeline(){return!1}setRendered(){super.setRendered()}resize(){if(this.isDestroyed)return;this.clearResolvedViewCache(),this.cachedCanvasDimensions=void 0;let{clientHeight:e,clientWidth:t}=this.element,{canvas:r}=this.renderContext.cpu,n=window.devicePixelRatio||1,a=Math.round(t*n),i=Math.round(e*n);(r.width!==a||r.height!==i)&&(r.width=a,r.height=i),this.resizeBindingsWithActiveFirst()}render(){if(!this.isDestroyed){if(!this.bindings.size){this.viewportStatus=Fw.NO_DATA;return}this.setNeedsRender(),this.renderContext.cpu.composition.renderPassId+=1,this.renderBindings()||this.requestRenderingEngineRender()}}onDestroy(){this.clearResolvedViewCache(),this.renderImageObjectDataId&&(H$.remove(this.renderImageObjectDataId),this.renderImageObjectDataId=void 0),this.cpuCanvas?.remove(),this.cpuCanvas=void 0,this.mountedData.clearActiveDataId(),this.renderContext.view.activeSourceICamera=void 0}modified(e){!this.isDestroyed&&(this.updateBindingsCameraState(),this.render(),e&&this.triggerCameraModifiedEvent(e))}renderBindings(){if(this.isDestroyed)return!1;let e=!1,t=this.getCurrentBinding(),r=(t,r)=>{if(t.render){e=!0;try{t.render(),this.lastRenderPathErrorByDataId.delete(r)}catch(e){this.reportRenderPathError(e,r)}}};for(let[e,n]of this.bindings.entries())n===t&&r(n,e);for(let[e,n]of this.bindings.entries())n!==t&&r(n,e);return e}updateRenderingPipeline(){this.applyRenderingPipelineUpdate()}async applyRenderingPipelineUpdate(){if(this.isDestroyed)return;let e=++this.renderPipelineSwapId,t=()=>e!==this.renderPipelineSwapId||this.isDestroyed,r=!1,n=this.getCurrentBinding(),a=Array.from(this.bindings.entries());for(let[e,i]of[...a.filter(([,e])=>e===n),...a.filter(([,e])=>e!==n)]){if(t())return;if(this.bindings.get(e)!==i)continue;let n=this.mountOptionsByDataId.get(e)??{};try{let{data:a,selectedPath:o}=await this.loadPlanarData(e,{...n,role:i.role});if(t()||this.bindings.get(e)!==i||o.renderMode===i.rendering.renderMode)continue;let s=await this.addLoadedData(e,a,{renderMode:o.renderMode,role:i.role},()=>t()||this.bindings.get(e)!==i);r=r||s}catch(t){this.reportRenderPathError(t,e)}}if(t()||!r)return;let i=this.getCurrentPlanarRendering()?.renderMode;i&&this.renderContext.display.activateRenderMode(i),this.clearResolvedViewCache(),this.updateBindingsCameraState(),this.render(),Bh(Bc,NH.RENDERING_PIPELINE_CHANGED,{renderingEngineId:this.renderingEngineId,viewportId:this.id})}reportRenderPathError(e,t){let r=e instanceof Error?e.message:String(e),n=t??"";this.lastRenderPathErrorByDataId.get(n)!==r&&(this.lastRenderPathErrorByDataId.set(n,r),console.error("[PlanarViewport] Render path error",t??"",e),Bh(Bc,NH.RENDER_PATH_ERROR,{renderingEngineId:this.renderingEngineId,viewportId:this.id,dataId:t,error:e}))}requestRenderingEngineRender(){let e=FA(this.renderingEngineId);e&&e.renderViewport(this.id)}setRenderModeVisibility(e,t,r){let n="cpu"===BC(e),a=this.element.querySelector(".viewport-element");t.style.display=n?"":"none",t.style.pointerEvents=n?"auto":"none",r.style.display=n?"none":"",a&&(a.style.pointerEvents=n?"none":"")}createLegacyCompatibilityHost(){return{getElement:()=>this.element,getViewportId:()=>this.id,getRequestedOrientation:()=>this.resolveRequestedOrientation(),prepareVolumeCompatibilityCamera:()=>{this.viewState=this.normalizeViewState({...this.viewState,orientation:this.resolveRequestedOrientation()})},setDisplaySets:(...e)=>this.setDisplaySets(...e),setImageIdIndex:e=>this.setImageIdIndex(e),getCurrentImageId:()=>this.getCurrentImageId(),render:()=>this.render(),removeBindingsExcept:e=>this.removeBindingsExcept(e),setCameraOrientation:e=>{this.setViewState({orientation:this.resolveSetOrientation(e)})},setDataPresentationState:(e,t)=>{this.setDataPresentationState(e,t)},setDisplaySetPresentation:(e,t)=>{this.setDisplaySetPresentation(e,t)},getDisplaySetPresentation:e=>this.getDisplaySetPresentation(e),getCameraOrientation:()=>this.viewState.orientation,getCurrentPlanarRendering:()=>this.getCurrentPlanarRendering(),getActiveDataId:()=>this.mountedData.getActiveDataId(),getFirstBoundDataId:()=>this.mountedData.getFirstBoundDataId(),findDataIdByVolumeId:e=>this.mountedData.findDataIdByVolumeId(e),getBindingActor:e=>this.mountedData.getBindingActor(e),getDefaultVOIRange:e=>this.getDefaultVOIRange(e),getImageCount:()=>this.getImageIds().length,getMaxImageIdIndex:()=>this.getMaxImageIdIndex()}}updateBindingsCameraState(){let e=this.getCurrentBinding();e?e.applyViewState(this.viewState):this.renderContext.view.activeSourceICamera=void 0,this.forEachBinding(t=>{t!==e&&t.applyViewState(this.viewState)})}resizeBindingsWithActiveFirst(){let e=this.getCurrentBinding();e?.resize?.(),this.forEachBinding(t=>{t!==e&&t.resize?.()})}getActiveImageIdIndex(){let e=this.getCurrentBinding();if("volume"===this.getCurrentMode()){let e=this.getResolvedView()?.state?.currentImageIdIndex;if("number"==typeof e)return e}let t=e?.rendering?.currentImageIdIndex;return"number"==typeof t?t:this.viewState.slice?.kind==="stackIndex"?this.viewState.slice.imageIdIndex:0}getMaxImageIdIndex(){let e=this.getCurrentBinding(),t=e?.rendering?.maxImageIdIndex;return"number"==typeof t?t:Math.max(0,this.getImageIds().length-1)}getVolumeSliceWorldPointForImageIdIndex(e){let t=this.getResolvedView({sliceIndex:e})?.getSliceBasis(),r=t?.sliceCenterWorld;return r?[...r]:void 0}getPlanarData(){return this.getCurrentPlanarData()}getCurrentBinding(){return this.mountedData.getCurrentBinding()}removeReplaceableData(e){let t=this.resolveNextSourceId(e),r=void 0!==t&&t===this.getSourceDataId();for(let e of Array.from(this.bindings.keys()))r&&this.isSegmentationOverlayBinding(e)||this.removeData(e)}resolveNextSourceId(e){let t=e.find(e=>e.options?.role==="source");return t?.displaySetId??e[0]?.displaySetId}isSegmentationOverlayBinding(e){return"overlay"===this.getDisplaySetRole(e)&&this.getDataSet(e)?.reference?.kind==="segmentation"}getDataSet(e){var t;let r=HY(e);if(HJ(t=r)&&0!==t.imageIds.length&&(void 0===t.initialImageIdIndex||"number"==typeof t.initialImageIdIndex)&&(void 0===t.volumeId||"string"==typeof t.volumeId))return r}async loadPlanarData(e,t){let r=this.getDataSet(e);if(!r)throw Error(`[PlanarViewport] No registered planar dataset metadata for ${e}`);let n=this.resolveRequestedOrientation(t.orientation),a=function(e,t={}){return eac.select(e,t)}(r,{orientation:n,renderBackend:t.renderBackend??this.getInheritedOverlayRenderBackend(t.role)});return{data:await this.dataProvider.load(e,{acquisitionOrientation:a.acquisitionOrientation,orientation:n,renderMode:a.renderMode,volumeId:a.volumeId}),selectedPath:a,resolvedOrientation:n}}getInheritedOverlayRenderBackend(e){if("source"!==e){var t;return t=this.getCurrentPlanarRendering()?.renderMode,By(),t?Bm.get(t)?.backend:void 0}}applyLoadedPlanarViewState(e,t,r){var n;let a=Bw(r.renderMode),i=(n=r.acquisitionOrientation,!e||e===NQ.ACQUISITION||n&&e===n?NQ.ACQUISITION:ena(e)),o=a?this.createInitialVolumeSliceState(t,r.renderMode,i):{kind:"stackIndex",imageIdIndex:t.initialImageIdIndex??0};this.clearResolvedViewCache(),this.viewState=this.normalizeViewState({...this.viewState,slice:o,orientation:i})}createInitialVolumeSliceState(e,t,r){if(!e.imageVolume)return;let{height:n,width:a}=this.getCurrentCanvasDimensions(),i="cpu"===BC(t)?env:eny,o=r===NQ.ACQUISITION?e.initialImageIdIndex:void 0;if("number"==typeof o){let t=enf(e.imageVolume,o);if(t)return{kind:"volumePoint",sliceWorldPoint:t}}let{sliceBasis:s}=i({canvasHeight:n,canvasWidth:a,imageIdIndex:o,imageVolume:e.imageVolume,orientation:r});return{kind:"volumePoint",sliceWorldPoint:[...s.sliceCenterWorld]}}resolveRequestedOrientation(e){return ena((e??this.defaultOptions.orientation)||NQ.ACQUISITION)||NQ.ACQUISITION}resolveSetOrientation(e){var t;if("string"!=typeof e)return ena(e)||NQ.ACQUISITION;if((t=e)!==NQ.REFORMAT&&t!==NQ.AXIAL_REFORMAT&&t!==NQ.CORONAL_REFORMAT&&t!==NQ.SAGITTAL_REFORMAT)return e;let r=function(e){switch(e){case NQ.AXIAL_REFORMAT:return NQ.AXIAL;case NQ.CORONAL_REFORMAT:return NQ.CORONAL;case NQ.SAGITTAL_REFORMAT:return NQ.SAGITTAL;default:return}}(e),n=etU({getActors:()=>this.getActors(),getCamera:()=>this.getCameraForEvent(),getCurrentImageId:()=>this.getCurrentImageId(),getImageIds:()=>this.getImageIds(),type:Nq.ORTHOGRAPHIC},{useViewportNormal:!0,...r?{orientation:r}:{}});return n?{viewPlaneNormal:n.viewPlaneNormal,viewUp:n.viewUp}:r||this.viewState.orientation}removeBindingsExcept(e){this.mountedData.removeBindingsExcept(e)}resolveStackInputImage(e){let t=ql.getImage(e.imageId);return t||(e.imageData?function(e,t){let r=t.getDimensions(),n=t.getSpacing(),a=r[0]??1,i=r[1]??1,o=n[0]??1,s=n[1]??1,l=t.getPointData().getScalars(),u=l.getData(),d=u.length?function(e){let t,r=e[0],n=e[0],a=e.length;for(let i=1;i<a;i++)r=Math.min(r,t=e[i]),n=Math.max(n,t);return{min:r,max:n}}(u):{min:0,max:1},{min:c,max:h}=Number.isFinite(d.min)&&Number.isFinite(d.max)?d:{min:0,max:1},p=Math.max(h-c,1),m=u.constructor?.name||"Uint8Array";return{imageId:e,minPixelValue:c,maxPixelValue:h,slope:1,intercept:0,windowCenter:c+p/2,windowWidth:p,voiLUTFunction:N2.LINEAR,getPixelData:()=>u,getCanvas:()=>{let e=document.createElement("canvas");return e.width=a,e.height=i,e},rows:i,columns:a,height:i,width:a,color:!1,rgba:!1,numberOfComponents:l.getNumberOfComponents?.()??1,columnPixelSpacing:o,rowPixelSpacing:s,invert:!1,photometricInterpretation:"MONOCHROME2",sizeInBytes:u.byteLength??4*u.length,dataType:m}}(e.imageId,e.imageData):void 0)}resolveOverlayReference(e,t){let r=e.reference;return r&&"string"==typeof r.kind?r:{kind:"image",imageId:t.imageId}}resolveOverlayDataId(e,t,r){let n=e.dataId;if("string"==typeof n)return n;if("segmentation"===r.kind&&"string"==typeof r.representationUID)return r.representationUID;let a=t.imageId;return this.mountedData.hasBinding(a)?`overlay:${a}`:a}findBindingDataIdByActorEntryUID(e){return this.mountedData.findBindingDataIdByActorEntryUID(e)}findDataIdByVolumeId(e){return this.mountedData.findDataIdByVolumeId(e)}getCurrentPlanarRendering(){return this.getCurrentBinding()?.rendering}resolveViewState(e,t={}){let r=this.getPlanarData(),n=this.getCurrentPlanarRendering();return enP({viewState:e,data:r,frameOfReferenceUID:t.frameOfReferenceUID??this.resolveFrameOfReferenceUID(),renderContext:this.renderContext,rendering:n,sliceIndex:t.sliceIndex})}getProjectionSnapshot(){let{height:e,width:t}=this.getCurrentCanvasDimensions(),r=eab({viewport:this,canvasHeight:e,canvasWidth:t,displayArea:this.getDisplayArea(),frameOfReferenceUID:this.resolveFrameOfReferenceUID(),resolvedView:this.getResolvedView(),resolveViewState:e=>this.resolveViewState(e),viewState:this.viewState});if(!r)throw Error("[PlanarViewport] Unable to resolve projection snapshot");return r}getCachedPlanarCanvasDimensions(e){let t=this.cachedCanvasDimensions;if(t)return t;let r=enI({renderContext:this.renderContext,rendering:e});return r.canvasHeight>0&&r.canvasWidth>0&&(this.cachedCanvasDimensions=r),r}resolveCachedViewState(e,t={}){if(t.frameOfReferenceUID||"number"==typeof t.sliceIndex)return this.resolveViewState(e,t);let r=this.getPlanarData(),n=this.getCurrentPlanarRendering(),a=this.mountedData.getActiveDataId(),i=this.resolveFrameOfReferenceUID(),o=this.resolvedViewCache;if(!n)return this.resolveViewState(e,t);let{canvasHeight:s,canvasWidth:l}=this.getCachedPlanarCanvasDimensions(n);if(o&&o.activeDataId===a&&o.viewState===e&&o.data===r&&o.rendering===n&&o.frameOfReferenceUID===i&&o.canvasHeight===s&&o.canvasWidth===l&&o.revision===this.resolvedViewCacheRevision)return o.resolvedView;let u=enP({viewState:e,data:r,frameOfReferenceUID:i,renderContext:this.renderContext,rendering:n,canvasDimensions:{canvasHeight:s,canvasWidth:l}});return u&&(this.resolvedViewCache={activeDataId:a,canvasHeight:s,canvasWidth:l,data:r,frameOfReferenceUID:i,rendering:n,resolvedView:u,revision:this.resolvedViewCacheRevision,viewState:e}),u}clearResolvedViewCache(){this.resolvedViewCache=void 0,this.resolvedViewCacheRevision+=1}resolveFrameOfReferenceUID(){return this.viewReferences.resolveFrameOfReferenceUID()}getFallbackPan(e=this.viewState){let t=e.anchorCanvas??[.5,.5],r=e.anchorWorld??[0,0,0],{height:n,width:a}=this.getCurrentCanvasDimensions(),[i,o]=erW(e.scale);return[(0-r[0])*i+(t[0]-.5)*a,(0-r[1])*o+(t[1]-.5)*n]}getFallbackViewStateWithPan(e,t){let r=this.getFallbackPan(e),[n,a]=e.anchorCanvas??[.5,.5],{height:i,width:o}=this.getCurrentCanvasDimensions(),s=t[0]-r[0],l=t[1]-r[1];return this.normalizeViewState({...e,anchorCanvas:[n+s/Math.max(o,1),a+l/Math.max(i,1)],displayArea:void 0})}buildFallbackCanvasToWorld(e){let t=this.viewState.anchorCanvas??[.5,.5],r=this.viewState.anchorWorld??[0,0,0],{height:n,width:a}=this.getCurrentCanvasDimensions(),[i,o]=erW(this.viewState.scale);return[r[0]+(e[0]-t[0]*a)/i,r[1]+(e[1]-t[1]*n)/o,r[2]]}buildFallbackWorldToCanvas(e){let t=this.viewState.anchorCanvas??[.5,.5],r=this.viewState.anchorWorld??[0,0,0],{height:n,width:a}=this.getCurrentCanvasDimensions(),[i,o]=erW(this.viewState.scale);return[(e[0]-r[0])*i+t[0]*a,(e[1]-r[1])*o+t[1]*n]}applyResolvedViewState(e){let t=this.getResolvedCameraForEvent();this.clearResolvedViewCache(),this.viewState=this.normalizeViewState(e),this.modified(t)}getResolvedCameraForEvent(){return this.getResolvedView()?.toICamera()}getCameraForEvent(){let e=this.getResolvedView();return e?e.toICamera():this.getViewState()}getCurrentPresentation(){let e=this.getResolvedView();if(e)return{flipHorizontal:!0===e.state.viewState.flipHorizontal,flipVertical:!0===e.state.viewState.flipVertical,pan:e.pan,rotation:e.rotation,scale:e.scale,zoom:e.zoom}}getCurrentCanvasDimensions(){let e=this.getCurrentPlanarRendering();if(e){let{canvasHeight:t,canvasWidth:r}=this.getCachedPlanarCanvasDimensions(e);return{width:r||this.element.clientWidth,height:t||this.element.clientHeight}}return{width:this.element.clientWidth,height:this.element.clientHeight}}getCurrentPlanarData(){return this.getCurrentBinding()?.data}getReferenceViewContexts(){return this.viewReferences.getReferenceViewContexts(super.getReferenceViewContexts())}};function eaR(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function eaL(e,t,r={}){if(!t)return;let n=e.vtk.renderer.getActiveCamera();void 0!==t.parallelProjection&&n.setParallelProjection(t.parallelProjection),t.viewUp&&n.setViewUp(...t.viewUp),t.viewPlaneNormal&&n.setDirectionOfProjection(-t.viewPlaneNormal[0],-t.viewPlaneNormal[1],-t.viewPlaneNormal[2]),t.position&&n.setPosition(...t.position),t.focalPoint&&n.setFocalPoint(...t.focalPoint),void 0!==t.parallelScale&&n.setParallelScale(t.parallelScale),void 0!==t.viewAngle&&n.setViewAngle(t.viewAngle),void 0!==t.clippingRange?n.setClippingRange(...t.clippingRange):r.resetClippingRange&&e.vtk.renderer.resetCameraClippingRange()}function eaN(e){return e?[e[0],e[1],e[2]]:void 0}function eaV(e){var t;return{...e,clippingRange:(t=e.clippingRange)?[t[0],t[1]]:void 0,focalPoint:eaN(e.focalPoint),position:eaN(e.position),viewPlaneNormal:eaN(e.viewPlaneNormal),viewUp:eaN(e.viewUp)}}let eaF="volume3d";function eaB(e){let{viewport:t}=e,r=e.resolvedView??t.getResolvedView?.(),n=e.camera??t.getViewState?.(),a=r?.toICamera()??n;if(!a)return;let i=eaV(a),o=e.canvasWidth??t.canvas?.clientWidth??t.element?.clientWidth??1,s=e.canvasHeight??t.canvas?.clientHeight??t.element?.clientHeight??1,l=e.frameOfReferenceUID??r?.getFrameOfReferenceUID()??t.getFrameOfReferenceUID?.();return{kind:eaF,adapterId:eaF,canvasHeight:s,canvasWidth:o,dataId:e.dataId,frameOfReferenceUID:l,presentation:{camera:eaV(i),position:function(e){if(e.focalPoint)return{kind:"focalPoint",worldPoint:eaN(e.focalPoint)}}(i),rotation:i.rotation,scale:function(e){let{camera:t,canvasHeight:r}=e;if("number"==typeof t.parallelScale)return{kind:"physical",mmPerCanvasPixel:2*t.parallelScale/Math.max(r,1)}}({camera:i,canvasHeight:s})},rendererCamera:eaV(i),resolvedView:r,spaces:{canvas:!!r,renderer:!0,world:!!(r||i.focalPoint)},transforms:r?{canvasToWorld:e=>r.canvasToWorld(e),worldToCanvas:e=>r.worldToCanvas(e)}:void 0,viewState:eaV(i),viewportType:t.type}}let eaj={id:eaF,viewportTypes:[Nq.VOLUME_3D_NEXT],getSnapshot:e=>eaB(e),getPresentation:e=>({...e.presentation,camera:eaV(e.presentation.camera)}),withPresentation:(e,t,r)=>eaV({...e.presentation.camera,...Object.prototype.hasOwnProperty.call(t,"camera")?t.camera??{}:t}),applyToRenderer:(e,t)=>{t&&"object"==typeof t&&"vtk"in t&&t.vtk?.renderer&&eaL(t,e.rendererCamera,{resetClippingRange:!0})}};function eaW(){return{currentTimeSeconds:0,anchorCanvas:[.5,.5],scale:1,scaleMode:"fit",rotation:0}}function eaU(e){var t;return{...void 0!==e.currentTimeSeconds?{currentTimeSeconds:Math.max(0,e.currentTimeSeconds)}:{},anchorCanvas:[(t=e.anchorCanvas??[.5,.5])[0],t[1]],scale:Math.max(e.scale??1,.001),scaleMode:"fit",rotation:e.rotation??0,...e.anchorWorld?{anchorWorld:eaH(e.anchorWorld)}:{}}}function eaz(e){var t;let{containerWidth:r,containerHeight:n,intrinsicWidth:a,intrinsicHeight:i,objectFit:o="contain",camera:s}=e;if(!r||!n||!a||!i)return;let l=Math.min(r/a,n/i),u=Math.max(r/a,n/i),d=a*l,c=i*l;switch(o){case"cover":d=a*u,c=i*u;break;case"fill":d=r,c=n;break;case"none":d=a,c=i;break;case"scale-down":{let e=Math.min(1,l);d=a*e,c=i*e}}let h=Math.max(s?.scale??1,.001);d*=h,c*=h;let p=d/a,m=[(t=s?.anchorCanvas??[.5,.5])[0],t[1]],f=eaH(s?.anchorWorld)??[a/2,i/2];return{left:r*m[0]-f[0]*p,top:n*m[1]-f[1]*p,width:d,height:c,containerWidth:r,containerHeight:n,intrinsicWidth:a,intrinsicHeight:i,anchorWorld:f,anchorCanvas:m,worldToCanvasRatio:p}}function eaH(e){return e?[e[0],e[1]]:void 0}let eaG={rotation:!0,zoom:!0,pan:!0};function eaq(e,t){return Object.prototype.hasOwnProperty.call(e,t)}let ea$="video";function eaK(e){return[e[0],e[1]]}let eaY={id:ea$,viewportTypes:[Nq.VIDEO_NEXT],getSnapshot:e=>(function(e){let{viewport:t}=e,r=eaU(e.viewState??t.getViewState?.()??{}),n=e.resolvedView??t.getResolvedView?.(),a=e.canvasWidth??n?.state?.containerWidth??t.element?.clientWidth??1,i=e.canvasHeight??n?.state?.containerHeight??t.element?.clientHeight??1,o=[a/2,i/2],s=function(e,t,r){if(e){let r=e.canvasToWorld(t);return[r[0],r[1]]}return r.anchorWorld?eaK(r.anchorWorld):[0,0]}(n,o,r),l=n?.zoom??Math.max(r.scale??1,.001),u=n?.pan??[0,0],d=n?.toICamera(),c=e.frameOfReferenceUID??n?.getFrameOfReferenceUID()??t.getFrameOfReferenceUID?.();return{kind:ea$,adapterId:ea$,canvasHeight:i,canvasWidth:a,dataId:e.dataId,frameOfReferenceUID:c,presentation:{pan:eaK(u),position:{kind:"mediaPoint",mediaPoint:s,canvasPoint:o},rawPan:eaK(u),rotation:n?.rotation??r.rotation??0,scale:function(e,t){let r;return e?{kind:"nativePixel",pixelsPerCanvasPixel:(r=e.canvasToWorld([0,0]),Math.abs(e.canvasToWorld([1,0])[0]-r[0])||1)}:{kind:"fit",value:t}}(n,l),zoom:l},rendererCamera:d,resolvedView:n,spaces:{canvas:!0,image:!1,renderer:!!d,world:!!n},transforms:n?{canvasToWorld:e=>n.canvasToWorld(e),worldToCanvas:e=>n.worldToCanvas(e)}:void 0,viewState:r,viewportType:t.type}})(e),getPresentation:(e,t)=>(function(e,t){let r={},n=t??eaG,a=e.presentation.zoom??1;if(n.rotation&&(r.rotation=e.presentation.rotation??0),n.zoom&&(r.zoom=a),n.pan){let t=e.presentation.rawPan;r.pan=[t[0]/a,t[1]/a]}return r})(e,t),withPresentation:(e,t,r)=>(function(e,t,r={}){let n=e.viewState??{},a=eaq(t,"zoom"),i=eaq(t,"pan"),o=eaq(t,"rotation"),s=Math.max(t.zoom??e.presentation.zoom??n.scale??1,.001),l=e.resolvedView,u=eaU({...n,...o?{rotation:t.rotation??0}:{}});if(a&&(l?(l=l.withZoom(s,r.anchorCanvas),u=eaU({...l.state?.viewState,...o?{rotation:t.rotation??0}:{}})):u=eaU({...u,scale:s,scaleMode:"fit"})),i&&t.pan){let e=[t.pan[0]*s,t.pan[1]*s];l&&(u=eaU({...l.withPan(e).state?.viewState,...o?{rotation:t.rotation??0}:{}}))}return u})(e,t,r)},eaZ={zoom:!0,pan:!0};function eaX(e,t){return Object.prototype.hasOwnProperty.call(e,t)}let eaJ={id:"ecg",viewportTypes:[Nq.ECG_NEXT],getSnapshot:e=>(function(e){let{viewport:t}=e,r=e.viewState??t.getViewState?.();if(!r)return;let n=erI(r),a=e.resolvedView??t.getResolvedView?.(),i=e.canvasWidth??a?.state?.canvas?.clientWidth??t.canvas?.clientWidth??t.element?.clientWidth??1,o=e.canvasHeight??a?.state?.canvas?.clientHeight??t.canvas?.clientHeight??t.element?.clientHeight??1,s=[i/2,o/2],l=a?.canvasToWorld(s),u=a?.zoom??Math.max(n.scale??1,.001),d=a?.pan??[0,0],c=a?.toICamera(),h=e.frameOfReferenceUID??a?.getFrameOfReferenceUID()??t.getFrameOfReferenceUID?.();return{kind:"ecg",adapterId:"ecg",canvasHeight:o,canvasWidth:i,dataId:e.dataId,frameOfReferenceUID:h,presentation:{pan:[d[0],d[1]],position:function(e,t){if(e)return{kind:"signalPoint",sampleIndex:e[0],value:e[1],channelIndex:e[2],canvasPoint:t}}(l,s),rawPan:[d[0],d[1]],scale:function(e,t){let r,n,a;return e?(r=e.canvasToWorld([0,0]),n=e.canvasToWorld([1,0]),a=e.canvasToWorld([0,1]),{kind:"signal",samplesPerCanvasPixel:Math.abs(n[0]-r[0])||0,valueUnitsPerCanvasPixel:Math.abs(a[1]-r[1])||0}):{kind:"fit",value:t}}(a,u),zoom:u},rendererCamera:c,resolvedView:a,spaces:{canvas:!0,image:!1,renderer:!!c,world:!!a},transforms:a?{canvasToWorld:e=>a.canvasToWorld(e),worldToCanvas:e=>a.worldToCanvas(e)}:void 0,viewState:n,viewportType:t.type}})(e),getPresentation:(e,t)=>(function(e,t){let r={},n=t??eaZ,a=e.presentation.zoom??1;if(n.zoom&&(r.zoom=a),n.pan){let t=e.presentation.rawPan;r.pan=[t[0]/a,t[1]/a]}return r})(e,t),withPresentation:(e,t,r)=>(function(e,t,r={}){let n=e.viewState,a=eaX(t,"zoom"),i=eaX(t,"pan"),o=Math.max(t.zoom??e.presentation.zoom??n.scale??1,.001),s=e.resolvedView,l=erI(n);if(a&&(l=s?erI((s=s.withZoom(o,r.anchorCanvas)).state.viewState):erI({...l,scale:o,scaleMode:"fit"})),i&&t.pan){let e=[t.pan[0]*o,t.pan[1]*o];s&&(l=erI(s.withPan(e).state.viewState))}return l})(e,t,r)},eaQ={rotation:!0,zoom:!0};function ea0(e,t){return Object.prototype.hasOwnProperty.call(e,t)}let ea1={id:"wsi",viewportTypes:[Nq.WHOLE_SLIDE_NEXT],getSnapshot:e=>(function(e){let{viewport:t}=e,r=e.viewState??t.getViewState?.();if(!r)return;let n={...r,centerIndex:r.centerIndex?[r.centerIndex[0],r.centerIndex[1]]:void 0,resolution:"number"==typeof r.resolution?Math.max(r.resolution,1e-6):void 0,rotation:r.rotation??0,zoom:Math.max(r.zoom??1,.001)},a=e.resolvedView??t.getResolvedView?.(),i=e.canvasWidth??a?.state?.canvasWidth??t.element?.clientWidth??1,o=e.canvasHeight??a?.state?.canvasHeight??t.element?.clientHeight??1,s=[i/2,o/2],l=a?.canvasToWorld(s),u=a?.toICamera(),d=a?.state?.view,c=Math.max(d?.getZoom?.()??n.zoom??1,.001),h=d?.getRotation?.()??n.rotation??0,p=e.frameOfReferenceUID??a?.getFrameOfReferenceUID()??t.getFrameOfReferenceUID?.();return{kind:"wsi",adapterId:"wsi",canvasHeight:o,canvasWidth:i,dataId:e.dataId,frameOfReferenceUID:p,presentation:{position:{kind:"anchor",worldPoint:l,canvasPoint:[s[0],s[1]]},rotation:h,scale:function(e){let{canvasHeight:t,rendererCamera:r,zoom:n}=e;return"number"==typeof r?.parallelScale?{kind:"physical",mmPerCanvasPixel:r.parallelScale/Math.max(t,1)}:{kind:"fit",value:n}}({canvasHeight:o,rendererCamera:u,zoom:c}),zoom:c},rendererCamera:u,resolvedView:a,spaces:{canvas:!!a,image:!0,renderer:!!u,world:!!a},transforms:a?{canvasToWorld:e=>a.canvasToWorld(e),worldToCanvas:e=>a.worldToCanvas(e)}:void 0,viewState:n,viewportType:t.type}})(e),getPresentation:(e,t)=>{let r,n;return r={},(n=t??eaQ).zoom&&(r.zoom=e.presentation.zoom),n.rotation&&(r.rotation=e.presentation.rotation),r},withPresentation:(e,t,r)=>(function(e,t,r={}){let n=ea0(t,"zoom"),a=ea0(t,"rotation"),i=Math.max(t.zoom??e.presentation.zoom??e.viewState.zoom??1,.001),o={...e.viewState,centerIndex:e.viewState.centerIndex?[e.viewState.centerIndex[0],e.viewState.centerIndex[1]]:void 0};return n&&(e.resolvedView?o={...e.resolvedView.withZoom(i,r.anchorCanvas).state.viewState}:o.zoom=i),a&&(o.rotation=t.rotation??0),o})(e,t,r)},ea2=new class{constructor(){this.adapters=new Map}register(e){this.adapters.set(e.id,e)}unregister(e){this.adapters.delete(e)}getAdapter(e,t={}){var r;let n,a=void 0===(n=(r={...t,viewport:e}).viewportType??r.viewport?.type)?void 0:String(n);for(let e of this.adapters.values())if((!t.kind||e.id===t.kind)&&(!a||e.viewportTypes.some(e=>String(e)===a)))return e}get(e,t={}){let r=this.getAdapter(e,t);return r?.getSnapshot({...t,viewport:e})}getPresentation(e,t={}){let r=this.getAdapter(e,t),n=r?.getSnapshot({...t,viewport:e});if(n)return r.getPresentation(n,t.selector)}withPresentation(e,t,r={},n){let a=this.getAdapter(e,r),i=a?.getSnapshot({...r,viewport:e});if(i)return a.withPresentation(i,t,n)}getRegisteredAdapters(){return Array.from(this.adapters.values())}clear(){this.adapters.clear()}};ea2.register(eaE),ea2.register(eaj),ea2.register(eaY),ea2.register(eaJ),ea2.register(ea1);let ea5=class{constructor(e){this.host=e,this.managedDataIds=new Set,this.volumeDataIds=new Map,this.stackSetRequestId=0,this.properties=new Map,this.globalDefaultProperties=new Map,this.perImageIdDefaultProperties=new Map,this.onStackNewImage=e=>{if(0===this.perImageIdDefaultProperties.size)return;let t=e.detail,r=t?.imageId,n=this.resolveTargetDataId();if(!n)return;let a=r?this.getPerImageDefaultProperties(r):void 0,i=this.globalDefaultProperties.get(n),o=a||i;o&&this.setProperties(o)},e.getElement().addEventListener(NH.STACK_NEW_IMAGE,this.onStackNewImage)}async setStack(e,t=0){if(!e.length)throw Error("[PlanarViewport] Cannot set an empty stack");let r=++this.stackSetRequestId,n=this.getLegacyStackDataId(),a=Math.min(Math.max(0,t),e.length-1),i=!1;try{if(this.host.removeBindingsExcept(new Set),this.registerDataSet(n,{imageIds:e,initialImageIdIndex:a}),i=!0,await this.host.setDisplaySets({displaySetId:n,options:{orientation:this.host.getRequestedOrientation()}}),r!==this.stackSetRequestId)return e[a];let t=await this.host.setImageIdIndex(a);return this.prunePerImageDefaultProperties(new Set(e)),this.host.getCurrentImageId()||t}catch(e){throw i&&r===this.stackSetRequestId&&this.removeData(n),e}}async setVolumes(e,t=!1,r=!1){await this.mountVolumes(e,!0,r),t&&this.host.render()}async addVolumes(e,t=!1,r=!1){await this.mountVolumes(e,!1,r),t&&this.host.render()}setProperties(e={},t,r=!1){let n="string"==typeof t?t:void 0,a=this.resolveTargetDataId(n);if(!a)return;let i=ens(this.properties.get(a)||{},e),o=this.globalDefaultProperties.get(a)||{};this.globalDefaultProperties.set(a,ens(e,o)),this.properties.set(a,i),void 0!==e.orientation&&this.host.setCameraOrientation(ena(e.orientation)),this.host.setDataPresentationState(a,enl(i)),r||void 0===e.colormap||this.emitColormapModified(a,n)}setDefaultProperties(e={},t){if(null==t){let t=this.resolveTargetDataId();if(!t)return;this.globalDefaultProperties.set(t,eno(e));return}this.setPerImageDefaultProperties(t,eno(e)),this.host.getCurrentImageId()===t&&this.setProperties(e)}clearDefaultProperties(e){if(null==e){let e=this.resolveTargetDataId();e&&this.globalDefaultProperties.delete(e),this.resetProperties();return}this.perImageIdDefaultProperties.delete(e),this.resetToDefaultProperties()}resetToDefaultProperties(){let e=this.resolveTargetDataId();if(!e)return;let t=this.host.getCurrentImageId(),r=(t?this.getPerImageDefaultProperties(t):void 0)||this.globalDefaultProperties.get(e)||{};this.properties.set(e,eno(r)),void 0!==r.orientation&&this.host.setCameraOrientation(ena(r.orientation)),this.host.setDataPresentationState(e,enl(r))}getProperties(e){let t=this.resolveTargetDataId(e),r=t?this.host.getDisplaySetPresentation(t):void 0,n={...eno((t?this.properties.get(t):void 0)||{}),...r?eno(r):{},...this.host.getCameraOrientation()?{orientation:ena(this.host.getCameraOrientation())}:{}};if(!n.voiRange&&t){let e=this.host.getDefaultVOIRange(t);e&&(n.voiRange={...e})}return n}resetProperties(e){let t=this.resolveTargetDataId(e);t&&(this.properties.set(t,{}),this.host.setDataPresentationState(t,{}))}getBlendMode(e=[]){let t=this.getBlendModeTargetDataIds(e)[0];if(!t)return;let r=this.host.getDisplaySetPresentation(t)?.blendMode;if(void 0!==r)return r;let n=this.host.getBindingActor(t),a=n?.getMapper?.(),i=a?.getBlendMode?.();return void 0!==i?i:ean(a?.getSlabType?.())}setBlendMode(e,t=[],r=!1){let n=this.getBlendModeTargetDataIds(t);n.length&&(n.forEach(t=>{let r=ens(this.properties.get(t)||{},{blendMode:e});this.properties.set(t,r),this.host.setDisplaySetPresentation(t,{blendMode:e})}),r&&this.host.render())}getNumberOfSlices(){return Math.max(this.host.getImageCount(),this.host.getMaxImageIdIndex()+1)}removeData(e){this.managedDataIds.delete(e)&&this.unregisterDataId(e)}destroy(){let e;for(let t of(this.host.getElement().removeEventListener(NH.STACK_NEW_IMAGE,this.onStackNewImage),Array.from(this.managedDataIds)))try{this.unregisterDataId(t)}catch(t){e??=t}if(this.managedDataIds.clear(),this.volumeDataIds.clear(),this.properties.clear(),this.globalDefaultProperties.clear(),this.perImageIdDefaultProperties.clear(),void 0!==e)throw e}getLegacyStackDataId(){return`__planar_v2__:${this.host.getViewportId()}:stack`}getLegacyVolumeDataId(e){return`__planar_v2__:${this.host.getViewportId()}:volume:${e}`}registerDataSet(e,t){H$.add(e,t),this.managedDataIds.add(e)}async mountVolumes(e,t,r){if(!e.length)return;let n=[];try{for(let t of e){let e=ql.getVolume(t.volumeId);if(!e)throw Error(`imageVolume with id: ${t.volumeId} does not exist, you need to create/allocate the volume first`);let r=this.getLegacyVolumeDataId(t.volumeId);this.registerDataSet(r,{imageIds:e.imageIds,initialImageIdIndex:this.getInitialVolumeImageIdIndex(e.imageIds.length),reference:{kind:"volume",volumeId:t.volumeId},volumeId:t.volumeId}),this.volumeDataIds.set(t.volumeId,r),n.push(r)}t&&this.host.removeBindingsExcept(new Set(n)),this.host.prepareVolumeCompatibilityCamera();let a={orientation:this.host.getRequestedOrientation()},i=this.host.getActiveDataId();await this.host.setDisplaySets(...n.map((e,r)=>({displaySetId:e,options:{...a,role:0===r&&(t||!i)?"source":"overlay"}}))),e.forEach((e,t)=>{let r=n[t];if(void 0!==e.visibility&&this.host.setDisplaySetPresentation(r,{visible:e.visibility}),void 0!==e.blendMode){let t=ens(this.properties.get(r)||{},{blendMode:e.blendMode});this.properties.set(r,t),this.host.setDisplaySetPresentation(r,{blendMode:e.blendMode})}void 0!==e.slabThickness&&this.host.setDisplaySetPresentation(r,{slabThickness:e.slabThickness});let a=this.host.getBindingActor(r);if(a&&e.callback){e.callback({volumeActor:a,volumeId:e.volumeId});let t=this.buildVolumePresentationFromActor(r);t&&this.applyVolumePresentation(r,t)}}),r||Bh(this.host.getElement(),NH.VOLUME_VIEWPORT_NEW_VOLUME,{viewportId:this.host.getViewportId(),volumeActors:this.buildVolumeActorEntries(e,n)})}catch(e){throw n.forEach(e=>{this.removeData(e)}),e}}getInitialVolumeImageIdIndex(e){let t=this.host.getCurrentPlanarRendering();return t&&(t.renderMode===eyK.CPU_VOLUME||t.renderMode===eyK.VTK_VOLUME_SLICE)?Math.min(Math.max(0,t.currentImageIdIndex),Math.max(e-1,0)):Math.floor(e/2)}getBlendModeTargetDataIds(e){let t=Array.from(new Set(this.volumeDataIds.values()));return e.length?t.filter(t=>{let r=this.host.getBindingActor(t),n=r?.getUID?.()||r?.uid||(r?.get?.("uid")?.uid??void 0);return!!n&&e.includes(n)}):t}resolveTargetDataId(e){if(e){let t=this.volumeDataIds.get(e)||this.host.findDataIdByVolumeId(e);if(t)return t}return this.host.getActiveDataId()||this.host.getFirstBoundDataId()}emitColormapModified(e,t){let r=t||this.resolveVolumeIdForDataId(e),n=(r?this.buildVolumeColormap(e):void 0)||this.properties.get(e)?.colormap;n&&Bh(this.host.getElement(),NH.COLORMAP_MODIFIED,{viewportId:this.host.getViewportId(),volumeId:r,colormap:n})}applyVolumePresentation(e,t){let r=ens(this.properties.get(e)||{},t);this.properties.set(e,r);let n=this.globalDefaultProperties.get(e)||{};this.globalDefaultProperties.set(e,ens(r,n)),this.host.setDataPresentationState(e,enl(r))}buildVolumeActorEntries(e,t){return e.flatMap((e,r)=>{let n=this.host.getBindingActor(t[r]);if(!n)return[];let{actorUID:a,slabThickness:i,volumeId:o,...s}=e;return[{uid:a||o,actor:n,slabThickness:i,referencedId:o,...s}]})}buildVolumeColormap(e){let t=this.host.getBindingActor(e),r=t?.getProperty?.().getRGBTransferFunction?.(0);if(!t||!r)return;let n=Go(Gh(r).reduce((e,t)=>(e.push(t[0],t[1],t[2],t[3]),e),[]),t)||{},a=Gd(t);return void 0===n.opacity&&(n.opacity=Gc(t)),null!==a&&(n.threshold=a),Object.keys(n).length?n:void 0}buildVolumePresentationFromActor(e){let t=this.host.getBindingActor(e),r=t?.getProperty?.().getRGBTransferFunction?.(0),n=this.buildVolumeColormap(e),a=t?.getMapper?.(),i=a?.getBlendMode?.()??ean(a?.getSlabType?.()),o=r?.getRange?.(),s={};return n&&(s.colormap=n),o&&o[1]>o[0]&&(s.voiRange={lower:o[0],upper:o[1]}),void 0!==i&&(s.blendMode=i),Object.keys(s).length?s:void 0}resolveVolumeIdForDataId(e){for(let[t,r]of this.volumeDataIds.entries())if(r===e)return t}getPerImageDefaultProperties(e){let t=this.perImageIdDefaultProperties.get(e);return t&&(this.perImageIdDefaultProperties.delete(e),this.perImageIdDefaultProperties.set(e,t)),t}setPerImageDefaultProperties(e,t){this.perImageIdDefaultProperties.has(e)&&this.perImageIdDefaultProperties.delete(e),this.perImageIdDefaultProperties.set(e,t),this.evictPerImageDefaultProperties()}prunePerImageDefaultProperties(e){for(let t of this.perImageIdDefaultProperties.keys())e.has(t)||this.perImageIdDefaultProperties.delete(t);this.evictPerImageDefaultProperties()}evictPerImageDefaultProperties(){for(;this.perImageIdDefaultProperties.size>2048;){let e=this.perImageIdDefaultProperties.keys().next().value;if(void 0===e)return;this.perImageIdDefaultProperties.delete(e)}}unregisterDataId(e){try{H$.remove(e)}finally{this.properties.delete(e),this.globalDefaultProperties.delete(e),this.removeVolumeDataId(e)}}removeVolumeDataId(e){for(let[t,r]of this.volumeDataIds.entries())r===e&&this.volumeDataIds.delete(t)}},ea3=class extends eaA{constructor(){super(...arguments),this.legacyCompatibility=new ea5(this.createLegacyCompatibilityHost())}cloneTuple(e){if(e)return Array.from(e)}getCamera(){let e=this.getViewState(),t={...e,...this.getCameraForEvent()},r=e.orientation&&"object"==typeof e.orientation?{...e.orientation,viewUp:this.cloneTuple(e.orientation.viewUp),viewPlaneNormal:this.cloneTuple(e.orientation.viewPlaneNormal)}:e.orientation;return{...t,focalPoint:this.cloneTuple(t.focalPoint),position:this.cloneTuple(t.position),viewUp:this.cloneTuple(t.viewUp),viewPlaneNormal:this.cloneTuple(t.viewPlaneNormal),orientation:r}}setCamera(e){let t={};(this.applyLegacyPlanarPresentationPatch(t,e),this.applyLegacyParallelScalePatch(t,e),this.applyLegacyOrientationPatch(t,e),this.applyLegacyFocalPointPatch(t,e),!e.position||e.focalPoint||Object.keys(t).length)?Object.keys(t).length&&this.setViewState(t):this.warnUnsupportedPositionOnlyCameraPatch()}getViewPresentation(e){return ea2.getPresentation(this,{selector:e})}setViewPresentation(e){if(!e)return;eaR(e,"displayArea")&&(this.options={...this.options,displayArea:G_(e.displayArea)});let t=ea2.withPresentation(this,e);t&&this.setViewState(t)}resetCamera(e){return this.resetViewState(e)}resetCameraForResize(){return this.resetViewStateForResize()}get volumeIds(){let e=new Set;for(let t of this.getActors())for(let r of[t.referencedId,t.uid])"string"==typeof r&&ql.getVolume(r)&&e.add(r);return e}get csImage(){return this.getCornerstoneImage()}getCornerstoneImage(){let e=this.getCurrentBinding()?.data;return e?.image}getAllVolumeIds(){return Array.from(this.volumeIds)}applyLegacyPlanarPresentationPatch(e,t){eaR(t,"orientation")&&(e.orientation=t.orientation),eaR(t,"anchorWorld")&&(e.anchorWorld=er2(t.anchorWorld)),eaR(t,"anchorCanvas")&&(e.anchorCanvas=t.anchorCanvas?[...t.anchorCanvas]:void 0),eaR(t,"scale")&&(e.scale=t.scale),eaR(t,"scaleMode")&&(e.scaleMode=t.scaleMode),eaR(t,"rotation")&&(e.rotation=t.rotation),eaR(t,"flipHorizontal")&&(e.flipHorizontal=t.flipHorizontal),eaR(t,"flipVertical")&&(e.flipVertical=t.flipVertical),eaR(t,"displayArea")&&(e.displayArea=t.displayArea),eaR(t,"slice")&&(e.slice=t.slice)}applyLegacyParallelScalePatch(e,t){if("number"!=typeof t.parallelScale)return;let r=this.getResolvedView()?.toICamera();if(!r||"number"!=typeof r.parallelScale)return;let n=this.getScale(),a=Math.max(r.presentationScale?.[1]??n[1]??1,1e-6),i=Math.max(r.presentationScale?.[0]??n[0]??a,1e-6),o=r.parallelScale*a/Math.max(t.parallelScale,1e-6);e.displayArea=void 0,e.scale=[i/a*o,o],e.scaleMode="fit"}applyLegacyOrientationPatch(e,t){if(!t.viewPlaneNormal)return;let r=this.getResolvedView()?.toICamera();e.orientation={viewPlaneNormal:[...t.viewPlaneNormal],viewUp:t.viewUp?[...t.viewUp]:r?.viewUp?[...r.viewUp]:void 0}}applyLegacyFocalPointPatch(e,t){if(!t.focalPoint)return;let r=[...t.focalPoint];e.anchorCanvas=[.5,.5],e.anchorWorld=r,e.displayArea=void 0,this.isVolumeSliceRenderingActive()&&(e.slice={kind:"volumePoint",sliceWorldPoint:r})}isVolumeSliceRenderingActive(){let e=this.getCurrentPlanarRendering();return e?.renderMode===eyK.CPU_VOLUME||e?.renderMode===eyK.VTK_VOLUME_SLICE}warnUnsupportedPositionOnlyCameraPatch(){"u"<typeof process&&console.warn("[PlanarViewportLegacyAdapter] Position-only planar camera patches are unsupported. Use focalPoint, parallelScale, or view state APIs.")}removeData(e){super.removeData(e),this.legacyCompatibility.removeData(e)}getActor(e){return this.getActors().find(t=>t.uid===e)}removeActors(e){let t=!1;e.filter(e=>"string"==typeof e).forEach(e=>{let r=this.findBindingDataIdByActorEntryUID(e);r&&("overlay"===this.getDisplaySetRole(r)&&H$.remove(r),this.removeData(r),t=!0)}),t&&this.render()}async setStack(e,t=0){return this.legacyCompatibility.setStack(e,t)}async setVolumes(e,t=!1,r=!1){return this.legacyCompatibility.setVolumes(e,t,r)}async addVolumes(e,t=!1,r=!1){return this.legacyCompatibility.addVolumes(e,t,r)}setProperties(e={},t,r=!1){this.legacyCompatibility.setProperties(e,t,r)}getProperties(e){return this.legacyCompatibility.getProperties(e)}resetProperties(e){this.legacyCompatibility.resetProperties(e)}setDefaultProperties(e={},t){this.legacyCompatibility.setDefaultProperties(e,t)}clearDefaultProperties(e){this.legacyCompatibility.clearDefaultProperties(e)}resetToDefaultProperties(){this.legacyCompatibility.resetToDefaultProperties()}getBlendMode(e){return this.legacyCompatibility.getBlendMode(e)}setBlendMode(e,t,r=!1){this.legacyCompatibility.setBlendMode(e,t,r)}getSlabThickness(){let e=FI.MINIMUM_SLAB_THICKNESS;for(let t of this.getActors())t.slabThickness>e&&(e=t.slabThickness);return e}getNumberOfSlices(){return this.legacyCompatibility.getNumberOfSlices()}onDestroy(){this.legacyCompatibility.destroy(),super.onDestroy()}},{Qy:ea4,FM:ea8,Hf:ea6}=Z;class ea9{async load(e){let t=et5(HX(e));return{id:e,type:"video",renderedUrl:t.renderedUrl,fps:t.cineRate||30,numberOfFrames:t.numberOfFrames||1,frameRange:[1,t.numberOfFrames||1],modality:t.modality,metadata:t.metadata}}}class ea7{async addData(e,t,r){let n=document.createElement("video");n.src=t.renderedUrl,n.preload="auto",n.crossOrigin="anonymous",n.playsInline=!0,n.style.position="absolute",n.style.left="0",n.style.top="0",n.style.transformOrigin="top left",n.style.objectFit="fill",await new Promise(t=>{let r=()=>{n.removeEventListener("loadedmetadata",r),t()};n.addEventListener("loadedmetadata",r),e.element.appendChild(n)});let a=et3({durationSeconds:n.duration,cineRate:t.fps,numberOfFrames:t.numberOfFrames}),i={...t,durationSeconds:n.duration,fps:a.fps,numberOfFrames:a.numberOfFrames,frameRange:a.frameRange};Object.assign(t,i);let o={renderMode:"video2d",element:n};return{rendering:o,updateDataPresentation:e=>{this.updateDataPresentation(o,e)},applyViewState:e=>{this.applyViewState(o,e,t)},getFrameOfReferenceUID:()=>this.getFrameOfReferenceUID(o),removeData:()=>{this.removeData(o)}}}updateDataPresentation(e,t){let{element:r}=e;r.style.display=t?.visible===!1?"none":"",r.style.opacity=String(t?.opacity??1),r.loop=t?.loop??!0,r.muted=t?.muted??!0,r.playbackRate=t?.playbackRate??1,r.style.objectFit=t?.objectFit??"contain"}applyViewState(e,t,r){let{element:n}=e,a=t.rotation??0,i=this.getCanvasMapping(n,t);e.currentCamera=t,i&&(n.style.width=`${i.width}px`,n.style.height=`${i.height}px`,n.style.left=`${i.left}px`,n.style.top=`${i.top}px`),n.style.transform=`rotate(${a}deg)`,"number"==typeof t.currentTimeSeconds&&Math.abs(n.currentTime-t.currentTimeSeconds)>.5/Math.max(1,r.fps)&&(n.currentTime=t.currentTimeSeconds)}canvasToWorld(e,t){let r=this.getCanvasMapping(e.element,e.currentCamera);return r?[(t[0]-r.left)/r.worldToCanvasRatio,(t[1]-r.top)/r.worldToCanvasRatio,0]:[0,0,0]}worldToCanvas(e,t){let r=this.getCanvasMapping(e.element,e.currentCamera);return r?[r.left+t[0]*r.worldToCanvasRatio,r.top+t[1]*r.worldToCanvasRatio]:[0,0]}getCanvasMapping(e,t){let r=e.parentElement;return eaz({containerWidth:r?.clientWidth??0,containerHeight:r?.clientHeight??0,intrinsicWidth:e.videoWidth||r?.clientWidth||0,intrinsicHeight:e.videoHeight||r?.clientHeight||0,objectFit:e.style.objectFit,camera:t})}getFrameOfReferenceUID(e){let{element:t}=e;return t.currentSrc||t.src}removeData(e){let{element:t}=e;t.pause(),t.remove()}}class eie{constructor(){this.id="video:html-element",this.type=Nq.VIDEO_NEXT}matches(e,t){return"video"===e.type&&"video2d"===t.renderMode}createRenderPath(){return new ea7}}let eit=class e extends erA{get zoom(){return Math.max(this.state.viewState.scale??1,.001)}get pan(){var e;return this.getCanvasMapping()?[(e=this.getCanvasMapping()).left/e.worldToCanvasRatio,e.top/e.worldToCanvasRatio]:[0,0]}get rotation(){return this.state.viewState.rotation??0}canvasToWorld(e){let t=this.getCanvasMapping();return[(e[0]-t.left)/t.worldToCanvasRatio,(e[1]-t.top)/t.worldToCanvasRatio,0]}worldToCanvas(e){let t=this.getCanvasMapping();return[t.left+e[0]*t.worldToCanvasRatio,t.top+e[1]*t.worldToCanvasRatio]}getFrameOfReferenceUID(){return this.state.frameOfReferenceUID}withZoom(e,t){let r=Math.max(e,.001);if(!t)return this.cloneWithViewState({...this.state.viewState,scale:r,scaleMode:"fit"});let n=this.canvasToWorld(t);return this.cloneWithViewState({...this.state.viewState,anchorCanvas:[t[0]/Math.max(this.state.containerWidth,1),t[1]/Math.max(this.state.containerHeight,1)],anchorWorld:[n[0],n[1]],scale:r,scaleMode:"fit"})}withPan(e){var t,r;return this.cloneWithViewState({...this.state.viewState,anchorWorld:(t=[e[0],e[1]],[(r=this.getCanvasMapping()).containerWidth*r.anchorCanvas[0]/r.worldToCanvasRatio-t[0],r.containerHeight*r.anchorCanvas[1]/r.worldToCanvasRatio-t[1]])})}buildICamera(){let e=this.getCanvasMapping();return{parallelProjection:!0,focalPoint:this.canvasToWorld([this.state.containerWidth/2,this.state.containerHeight/2]),position:[0,0,0],viewUp:[0,-1,0],parallelScale:this.state.containerHeight/2/Math.max(e.worldToCanvasRatio,.001),viewPlaneNormal:[0,0,1],rotation:this.rotation}}getCanvasMapping(){return this.cachedCanvasMapping||=eaz({camera:this.state.viewState,containerHeight:this.state.containerHeight,containerWidth:this.state.containerWidth,intrinsicHeight:this.state.intrinsicHeight,intrinsicWidth:this.state.intrinsicWidth,objectFit:this.state.objectFit})||{left:0,top:0,width:Math.max(this.state.intrinsicWidth,1),height:Math.max(this.state.intrinsicHeight,1),containerWidth:Math.max(this.state.containerWidth,1),containerHeight:Math.max(this.state.containerHeight,1),intrinsicWidth:Math.max(this.state.intrinsicWidth,1),intrinsicHeight:Math.max(this.state.intrinsicHeight,1),anchorWorld:[0,0],anchorCanvas:[.5,.5],worldToCanvasRatio:1},this.cachedCanvasMapping}cloneWithViewState(t){return new e({...this.state,viewState:t})}},eir=class extends erM{static get useCustomRenderingPipeline(){return!0}constructor(e){super(e),this.type=Nq.VIDEO_NEXT,this.renderingEngineId=e.renderingEngineId,this.element.style.position=this.element.style.position||"relative",this.element.style.overflow="hidden",this.element.style.background=this.element.style.background||"#000",this.dataProvider=e.dataProvider||new ea9,this.renderPathResolver=e.renderPathResolver||function(e=[new eie]){return new erE(e)}(),this.renderContext={viewportId:this.id,renderingEngineId:this.renderingEngineId,type:"video",element:this.element},this.viewState=eaW(),this.element.setAttribute("data-viewport-uid",this.id),this.element.setAttribute("data-rendering-engine-uid",this.renderingEngineId)}async setDisplaySets(...e){for(let[t,{displaySetId:r}]of(this.removeAllData(),e.entries())){await this.addDisplaySet(r,{renderMode:"video2d",role:0===t?"source":"overlay"});let e=this.getBinding(r);if(!e)continue;this.setDefaultDataPresentation(r,{visible:!0,opacity:1,playbackRate:1,loop:!0,muted:!0,objectFit:"contain"});let n=this.getVideoDataFromBinding(e);if(!n)throw Error(`[VideoViewport] Loaded data for ${r} is not a valid video stream`);this.viewState=eaW(),n.frameRange[0]>1&&(this.viewState.currentTimeSeconds=et4(n.frameRange[0],n.fps)),this.modified(),this.trackVideoElement(),await this.primeInitialFrame(n)}}removeData(e){let t=this.getFirstBinding()?.data.id;super.removeData(e),t===e&&(this.untrackVideoElement(),this.trackVideoElement())}getViewReference(e={}){let t=e.frameNumber??("number"==typeof e.sliceIndex?e.sliceIndex+1:this.getFrameNumber()),r="number"==typeof e.sliceIndex?e.sliceIndex:t-1,n="number"==typeof r?this.getCurrentImageId(r):this.getCurrentImageId(),a=this.getFirstBinding()?.data.id;return{FrameOfReferenceUID:this.getFrameOfReferenceUID(),dataId:a,dimensionGroupNumber:t,referencedImageId:n,sliceIndex:r}}getCurrentImageId(e=this.getCurrentImageIdIndex()){let t=HX(this.getFirstBinding()?.data.id||"");if(t)return ea6(t,e+1)}getViewReferenceId(e={}){let t=e.sliceIndex;return void 0===t?`videoId:${this.getCurrentImageId()}`:`videoId:${this.getCurrentImageId(t)}`}setViewReference(e){"number"==typeof e.dimensionGroupNumber?this.setFrameNumber(e.dimensionGroupNumber):"number"==typeof e.sliceIndex&&this.setFrameNumber(e.sliceIndex+1)}getSliceIndex(){return this.getCurrentImageIdIndex()}getZoom(){return this.getResolvedView()?.zoom??Math.max(this.viewState.scale??1,.001)}setZoom(e,t){let r=this.getResolvedView();r?this.applyResolvedViewState(r.withZoom(e,t).state.viewState):this.setViewState({scale:Math.max(e,.001),scaleMode:"fit"})}getPan(){return this.getResolvedView()?.pan??[0,0]}setPan(e){let t=this.getResolvedView();t&&this.applyResolvedViewState(t.withPan(e).state.viewState)}getResolvedView(){let e=this.getVideoElement(),t=this.getVideoData();if(e&&t)return new eit({viewState:this.viewState,containerHeight:this.element.clientHeight,containerWidth:this.element.clientWidth,frameOfReferenceUID:t.metadata.imagePlaneModule?.frameOfReferenceUID||t.renderedUrl,intrinsicHeight:e.videoHeight||this.element.clientHeight,intrinsicWidth:e.videoWidth||this.element.clientWidth,objectFit:this.getDisplaySetPresentation(t.id)?.objectFit,payload:t})}getReferenceViewContexts(){let e=this.getFirstBinding(),t=this.getVideoData();if(!e||!t)return super.getReferenceViewContexts();let r=HX(e.data.id),n=this.getFrameNumber();return[{dataId:e.data.id,dataIds:[e.data.id,r],frameOfReferenceUID:this.getFrameOfReferenceUID(),imageIds:this.getImageIds(),currentImageIdIndex:n-1,dimensionGroupNumber:n,numDimensionGroups:t.numberOfFrames}]}play(){let e=this.getVideoElement();return e?e.play().then(()=>void 0).catch(()=>void 0):Promise.resolve()}pause(){this.getVideoElement()?.pause(),this.syncCameraCurrentTimeFromElement()}seek(e){let t=this.getVideoData(),r=t?.durationSeconds?Math.max(t.durationSeconds,0):1/0;this.setViewState({currentTimeSeconds:Math.max(0,Math.min(e,r))})}setFrameNumber(e){let t=this.getVideoData();t&&this.seek(et4(e,t.fps))}setPlaybackRate(e){let t=this.getFirstBinding()?.data.id;t&&this.setDisplaySetPresentation(t,{playbackRate:e})}scroll(e=1,t=!0,r=!1){let n=this.getVideoData();if(!n?.fps)return;this.pause();let a=et4(n.frameRange[0],n.fps),i=n.durationSeconds??et4(n.frameRange[1],n.fps),o=this.getCurrentTime()+e/n.fps;if(r){let e=Math.max(i-a,1/n.fps);for(;o<a;)o+=e;for(;o>i;)o-=e}else o=Math.max(a,Math.min(o,i));this.seek(o)}getFrameRate(){return this.getVideoData()?.fps??0}getNumberOfFrames(){return this.getVideoData()?.numberOfFrames??0}getNumberOfSlices(){return this.getImageIds().length||this.getNumberOfFrames()}getCurrentTime(){return this.syncCameraCurrentTimeFromElement(),this.viewState.currentTimeSeconds??0}getFrameNumber(){let e=this.getVideoData();if(!e)return 1;let t=1+Math.round(Math.max(0,this.getCurrentTime())*Math.max(1,e.fps));return Math.max(e.frameRange[0],Math.min(t,e.frameRange[1]))}getCurrentImageIdIndex(){return Math.max(0,this.getFrameNumber()-1)}getImageIds(){let e=this.getFirstBinding()?.data.id,t=this.getVideoData();if(!e||!t)return[];let r=HX(e),n=Array(t.numberOfFrames);for(let e=1;e<=t.numberOfFrames;e++)try{n[e-1]=ea6(r,e)}catch{return[r]}return n}render(){if(this.isDestroyed)return}customRenderViewportToCanvas(){this.render()}resetViewState(){if(this.isDestroyed)return!1;let e=this.getCameraForEvent(),{currentTimeSeconds:t}=this.viewState;return this.viewState=this.normalizeViewState({...eaW(),currentTimeSeconds:t}),this.modified(e),this.triggerCameraResetEvent(),!0}dispose(){this.destroy()}getUseCustomRenderingPipeline(){return!0}normalizeViewState(e){return eaU(e)}onDestroy(){this.untrackVideoElement()}getVideoElement(){return this.getVideoRendering()?.element}getVideoData(){let e=this.getCurrentBinding();if(e)return this.getVideoDataFromBinding(e)}getVideoDataFromBinding(e){var t;if("object"==typeof(t=e.data)&&null!==t&&"video"===t.type&&"string"==typeof t.renderedUrl&&"number"==typeof t.fps&&"number"==typeof t.numberOfFrames&&Array.isArray(t.frameRange)&&2===t.frameRange.length&&"number"==typeof t.frameRange[0]&&"number"==typeof t.frameRange[1])return e.data}getVideoRendering(){let e=this.getFirstBinding();if(e&&"video2d"===e.rendering.renderMode)return e.rendering}syncCameraCurrentTimeFromElement(){let e=this.getVideoElement();if(!e)return;let t=Math.max(0,e.currentTime||0);t!==(this.viewState.currentTimeSeconds??0)&&(this.viewState={...this.viewState,currentTimeSeconds:t})}trackVideoElement(){let e=this.getVideoElement();if(!e||this.trackedVideoElement===e)return;this.untrackVideoElement();let t=()=>{this.syncCameraCurrentTimeFromElement()};e.addEventListener("loadedmetadata",t),e.addEventListener("seeked",t),e.addEventListener("timeupdate",t),this.trackedVideoElement=e,this.cleanupTrackedVideoElement=()=>{e.removeEventListener("loadedmetadata",t),e.removeEventListener("seeked",t),e.removeEventListener("timeupdate",t)},t()}untrackVideoElement(){this.cleanupTrackedVideoElement?.(),this.cleanupTrackedVideoElement=void 0,this.trackedVideoElement=void 0}applyResolvedViewState(e){this.setViewState(e)}async primeInitialFrame(e){let t=this.getVideoElement();if(!t)return;await ein(t);let r=e.frameRange[0]>1?et4(e.frameRange[0],e.fps):0;try{await t.play().catch(()=>void 0)}catch(e){}await eia(t,r),await eii(t),t.pause(),this.syncCameraCurrentTimeFromElement()}};async function ein(e){e.readyState>=HTMLMediaElement.HAVE_CURRENT_DATA||await new Promise(t=>{let r=()=>{n(),t()},n=()=>{e.removeEventListener("loadeddata",r),e.removeEventListener("canplay",r)};e.addEventListener("loadeddata",r,{once:!0}),e.addEventListener("canplay",r,{once:!0})})}async function eia(e,t){.001>=Math.abs((e.currentTime||0)-t)||await new Promise(r=>{let n=()=>{e.removeEventListener("seeked",n),r()};e.addEventListener("seeked",n,{once:!0}),e.currentTime=t})}async function eii(e){let t=e.requestVideoFrameCallback;t?await new Promise(r=>{t.call(e,()=>r())}):await new Promise(e=>requestAnimationFrame(()=>e()))}let eio=class extends eir{setDataIds(e,t){let r=e[0];if(r)return this.setVideo(r,(t?.viewReference?.sliceIndex||0)+1)}async setVideo(e,t){return await this.setDisplaySets({displaySetId:e}),"number"==typeof t&&this.setFrameNumber(t),this}setProperties(e){let t=this.getFirstBinding()?.data.id;if(!t)return;let r={},n={};"boolean"==typeof e.loop&&(r.loop=e.loop),"boolean"==typeof e.muted&&(r.muted=e.muted),"number"==typeof e.playbackRate&&(r.playbackRate=e.playbackRate),e.pan&&(n.pan=e.pan),e.voiRange&&(r.voiRange=e.voiRange),void 0!==e.invert&&(r.invert=e.invert),Object.keys(r).length&&this.setDisplaySetPresentation(t,r),Object.keys(n).length&&this.setViewPresentation(n)}getViewPresentation(e){return ea2.getPresentation(this,{selector:e})}setViewPresentation(e){if(!e)return;let t=ea2.withPresentation(this,e);t&&this.setViewState(t)}resetCamera(){return this.resetViewState()}getProperties(){let e=this.getFirstBinding()?.data.id,t=e?this.getDisplaySetPresentation(e):void 0,r=this.getViewPresentation();return{invert:t?.invert,loop:t?.loop,muted:t?.muted,pan:r?.pan,playbackRate:t?.playbackRate,voiRange:t?.voiRange}}resetProperties(){let e=this.getFirstBinding()?.data.id;e&&(this.setDisplaySetPresentation(e,{invert:!1,loop:!0,muted:!0,playbackRate:1,voiRange:void 0}),this.setViewPresentation({pan:[0,0],zoom:1}))}setVOI(e){let t=this.getFirstBinding()?.data.id;t&&this.setDisplaySetPresentation(t,{voiRange:e})}setAverageWhite(e){let t=this.getFirstBinding()?.data.id;t&&this.setDisplaySetPresentation(t,{averageWhite:e})}};var eis={image:null,canvas:null,jsImageData:null,imageBitmap:null,imageLoaded:!1,repeat:!1,interpolate:!1,edgeClamp:!1,mipLevel:0,resizable:!1};function eil(e,t,r={}){Object.assign(t,eis,r),jS.obj(e,t),jS.algo(e,t,6,0),jS.get(e,t,["canvas","image","jsImageData","imageBitmap","imageLoaded","resizable"]),jS.setGet(e,t,["repeat","edgeClamp","interpolate","mipLevel"]),t.classHierarchy.push("vtkTexture"),e.imageLoaded=()=>{t.image.removeEventListener("load",e.imageLoaded),t.imageLoaded=!0,e.modified()},e.setJsImageData=r=>{t.jsImageData!==r&&(null!==r&&(e.setInputData(null),e.setInputConnection(null),t.image=null,t.canvas=null,t.imageBitmap=null),t.jsImageData=r,t.imageLoaded=!0,e.modified())},e.setImageBitmap=r=>{t.imageBitmap!==r&&(null!==r&&(e.setInputData(null),e.setInputConnection(null),t.image=null,t.canvas=null,t.jsImageData=null),t.imageBitmap=r,t.imageLoaded=!0,e.modified())},e.setCanvas=r=>{t.canvas!==r&&(null!==r&&(e.setInputData(null),e.setInputConnection(null),t.image=null,t.imageBitmap=null,t.jsImageData=null),t.canvas=r,e.modified())},e.setImage=r=>{t.image!==r&&(null!==r&&(e.setInputData(null),e.setInputConnection(null),t.canvas=null,t.jsImageData=null,t.imageBitmap=null),t.image=r,t.imageLoaded=!1,r.complete?e.imageLoaded():r.addEventListener("load",e.imageLoaded),e.modified())},e.getDimensionality=()=>{let r=0,n=0,a=1;if(e.getInputData()){let t=e.getInputData();r=t.getDimensions()[0],n=t.getDimensions()[1],a=t.getDimensions()[2]}return t.jsImageData&&(r=t.jsImageData.width,n=t.jsImageData.height),t.canvas&&(r=t.canvas.width,n=t.canvas.height),t.image&&(r=t.image.width,n=t.image.height),t.imageBitmap&&(r=t.imageBitmap.width,n=t.imageBitmap.height),(r>1)+(n>1)+(a>1)},e.getInputAsJsImageData=()=>{if(!t.imageLoaded||e.getInputData())return null;if(t.jsImageData)return t.jsImageData;if(t.imageBitmap)return t.imageBitmap;if(t.canvas)return t.canvas.getContext("2d").getImageData(0,0,t.canvas.width,t.canvas.height);if(t.image){let e=t.image.width,r=t.image.height,n=new OffscreenCanvas(e,r).getContext("2d");return n.translate(0,r),n.scale(1,-1),n.drawImage(t.image,0,0,e,r),n.getImageData(0,0,e,r)}return null}}var eiu=jS.newInstance(eil,"vtkTexture"),eid=(e,t,r)=>{let n=e.createShaderModule({code:`
1248
+ `,et9="wsiViewportOverlayCss";async function et7(){return B_("dicom-microscopy-viewer")}function ere(){if(document.getElementById(et9))return;let e=document.createElement("style");e.innerText=et6,e.setAttribute("id",et9),document.getElementsByTagName("head")[0].append(e)}async function ert(e){let{imageIds:t,client:r,dicomMicroscopyViewer:n}=e,a=n||await et7(),i=null,o=t.map(e=>{let t=r.getDICOMwebMetadata(e);Object.defineProperty(t,"isMultiframe",{value:t.isMultiframe,enumerable:!1}),Object.defineProperty(t,"frameNumber",{value:void 0,enumerable:!1});let n=t["00080008"]?.Value;n?.length===1&&(t["00080008"].Value=n[0].split("\\"));let a=t["00200052"]?.Value?.[0];return i?a!==i&&(t["00200052"].Value=[i]):i=a,t}),s=[];return o.forEach(e=>{let t=new a.metadata.VLWholeSlideMicroscopyImage({metadata:e}),r=t.ImageType[2];("VOLUME"===r||"THUMBNAIL"===r)&&s.push(t)}),{volumeImages:s,metadataDicomweb:o,metadata:function(e){let{metadataDicomweb:t,imageIds:r,imageIndex:n=0}=e,a=t.reduce((e,t)=>e?.NumberOfFrames<t.NumberOfFrames?t:e),{TotalPixelMatrixColumns:i,TotalPixelMatrixRows:o,ImageOrientationSlide:s,ImagedVolumeWidth:l,ImagedVolumeHeight:u,ImagedVolumeDepth:d}=a,c=HB(FC.IMAGE_PLANE,r[n]),h=s.slice(0,3),p=s.slice(3,6);(null==h||null==p)&&(h=[1,0,0],p=[0,1,0]);let m=Lv.vec3.fromValues(h[0],h[1],h[2]),f=Lv.vec3.fromValues(p[0],p[1],p[2]),g=Lv.vec3.create();Lv.vec3.cross(g,m,f);let{XOffsetInSlideCoordinateSystem:y=0,YOffsetInSlideCoordinateSystem:v=0,ZOffsetInSlideCoordinateSystem:b=0}=a.TotalPixelMatrixOriginSequence?.[0]||{};return{bitsAllocated:8,numberOfComponents:3,origin:[y,v,b],direction:[...m,...f,...g],dimensions:[i,o,1],spacing:[l/i,u/o,d],hasPixelSpacing:!!(l&&u),numVoxels:i*o*1,imagePlaneModule:c}}({metadataDicomweb:s,imageIds:t}),frameOfReferenceUID:i,imageURISet:new Set(t.map(e=>Gk(e)))}}let err=null,ern="CORNERSTONE_TOOLS_ANNOTATION_REMOVED",era=class e extends GN{constructor(e){super({...e,canvas:e.canvas||GK(e.element)}),this.imageURISet=new Set,this.internalCamera={rotation:0,centerIndex:[0,0],extent:[0,-2,1,-1],xSpacing:1,ySpacing:1,resolution:1,zoom:1},this.annotationRemovedListener=e=>{let{detail:t}=e,r=t?.annotation?.metadata;if(!r)return void this.postrender();let n=r.referencedImageURI??(r.referencedImageId?Gk(r.referencedImageId):null);if(n&&!this.hasImageURI(n))return;let a=r.FrameOfReferenceUID??null;a&&a!==this.frameOfReferenceUID||this.postrender()},this.voiRange={lower:0,upper:255},this.getProperties=()=>({voiRange:{...this.voiRange}}),this.resetCamera=()=>!0,this.getNumberOfSlices=()=>1,this.getFrameOfReferenceUID=()=>this.frameOfReferenceUID,this.resize=()=>{let e=this.canvas,{clientWidth:t,clientHeight:r}=e;(e.width!==t||e.height!==r)&&(e.width=t,e.height=r),this.refreshRenderValues()},this.canvasToWorld=e=>{if(!this.metadata)return;let t=this.canvasToIndex(e);return t[1]=-t[1],this.indexToWorld(t)},this.worldToCanvas=e=>{if(!this.metadata)return;let t=this.worldToIndex(e);return t[1]=-t[1],this.indexToCanvas([t[0],t[1],0])},this.postrender=()=>{this.refreshRenderValues(),Bh(this.element,NH.IMAGE_RENDERED,{element:this.element,viewportId:this.id,viewport:this,renderingEngineId:this.renderingEngineId})},this.getRotation=()=>0,this.canvasToIndex=e=>{let t=this.getTransform();t.invert();let r=t.transformPoint(e);return[r[0],r[1],0]},this.indexToCanvas=e=>this.getTransform().transformPoint([e[0],e[1]]),this.customRenderViewportToCanvas=()=>{},this.getImageIds=()=>[this.imageIds[0]],this.renderingEngineId=e.renderingEngineId,this.element.setAttribute("data-viewport-uid",this.id),this.element.setAttribute("data-rendering-engine-uid",this.renderingEngineId),this.element.style.position="relative",this.microscopyElement=document.createElement("div"),this.microscopyElement.setAttribute("class","DicomMicroscopyViewer"),this.microscopyElement.id=F2(),this.microscopyElement.innerText="Initial",this.microscopyElement.style.background="grey",this.microscopyElement.style.width="100%",this.microscopyElement.style.height="100%",this.microscopyElement.style.position="absolute",this.microscopyElement.style.left="0",this.microscopyElement.style.top="0";const t=this.element.firstElementChild;t.insertBefore(this.microscopyElement,t.childNodes[1]),this.addEventListeners(),this.addWidget("DicomMicroscopyViewer",{getEnabled:()=>!!this.viewer,setEnabled:()=>{this.elementDisabledHandler()}}),this.resize()}static get useCustomRenderingPipeline(){return!0}addEventListeners(){this.canvas.addEventListener(NH.ELEMENT_DISABLED,this.elementDisabledHandler),Bc.addEventListener(ern,this.annotationRemovedListener)}removeEventListeners(){this.canvas.removeEventListener(NH.ELEMENT_DISABLED,this.elementDisabledHandler),Bc.removeEventListener(ern,this.annotationRemovedListener)}elementDisabledHandler(){this.removeEventListeners(),this.viewer?.cleanup(),this.viewer=null,this.element.firstElementChild.removeChild(this.microscopyElement),this.microscopyElement=null,this.imageURISet.clear()}async setFrameNumber(e){}setProperties(e){e.voiRange&&this.setVOI(e.voiRange)}resetProperties(){this.setProperties({voiRange:{lower:0,upper:255}})}setVOI(e){this.voiRange=e;let t=this.setColorTransform(e,this.averageWhite);this.map.getViewport().querySelectorAll(".ol-layers canvas").forEach(e=>{e.style.filter=t})}setAverageWhite(e){this.averageWhite=e,this.setColorTransform(this.voiRange,e)}getScalarData(){return null}computeTransforms(){let e=Lv.mat4.create(),t=Lv.mat4.create();return Lv.mat4.fromTranslation(e,this.metadata.origin),e[0]=this.metadata.direction[0],e[1]=this.metadata.direction[1],e[2]=this.metadata.direction[2],e[4]=this.metadata.direction[3],e[5]=this.metadata.direction[4],e[6]=this.metadata.direction[5],e[8]=this.metadata.direction[6],e[9]=this.metadata.direction[7],e[10]=this.metadata.direction[8],Lv.mat4.scale(e,e,this.metadata.spacing),Lv.mat4.invert(t,e),{indexToWorld:e,worldToIndex:t}}getImageData(){let{metadata:e}=this;if(!e)return null;let{spacing:t}=e;return{dimensions:e.dimensions,spacing:t,numberOfComponents:3,origin:e.origin,direction:e.direction,metadata:{Modality:this.modality,FrameOfReferenceUID:this.frameOfReferenceUID},hasPixelSpacing:this.hasPixelSpacing,calibration:this.calibration,preScale:{scaled:!1},scalarData:this.getScalarData(),imageData:{getDirection:()=>e.direction,getDimensions:()=>e.dimensions,getRange:()=>[0,255],getScalarData:()=>this.getScalarData(),getSpacing:()=>e.spacing,worldToIndex:e=>this.worldToIndex(e),indexToWorld:e=>this.indexToWorld(e)}}}hasImageURI(e){return!!e&&this.imageURISet.has(e)}setCamera(e){let t=this.getCamera(),{parallelScale:r,focalPoint:n}=e,a=this.getView(),{xSpacing:i}=this.internalCamera;if(r){let e=this.element.clientHeight/r;a.setResolution?.(1/i/e)}if(n){let e=this.worldToCanvas(n),t=this.canvasToIndex(e);a.setCenter([t[0],t[1]])}let o=this.getCamera();this.triggerCameraModifiedEventIfNecessary(t,o)}getCurrentImageId(){return this.imageIds[0]}getFrameNumber(){return 1}getCamera(){this.refreshRenderValues();let{resolution:e,xSpacing:t,centerIndex:r}=this.internalCamera,n=this.indexToCanvas([r[0],r[1],0]),a=this.canvasToWorld(n);return{parallelProjection:!0,focalPoint:a,position:a,viewUp:[0,-1,0],parallelScale:this.element.clientHeight*(e*t),viewPlaneNormal:[0,0,1]}}worldToIndexWSI(e){if(!err)return;let t=this.viewer.getAffine(),r=err.applyInverseTransform({coordinate:[e[0],e[1]],affine:t});return[r[0],r[1]]}indexToWorldWSI(e){if(!err)return;let t=err.applyTransform({coordinate:[e[0],e[1]],affine:this.viewer.getAffine()});return[t[0],t[1],0]}worldToIndex(e){let{worldToIndex:t}=this.computeTransforms(),r=Lv.vec3.create();return Lv.vec3.transformMat4(r,e,t),r}indexToWorld(e){let{indexToWorld:t}=this.computeTransforms(),r=Lv.vec3.create(),n=Lv.vec3.fromValues(...e);return Lv.vec3.transformMat4(r,n,t),[r[0],r[1],r[2]]}setDataList(e){if(!e.length)return;let{dataId:t}=e[0],r=HB("genericViewportDisplaySet",t);return r?.imageIds?this.setDataIds(r.imageIds,{webClient:r.options?.webClient}):this.setDataIds([t])}setDataIds(e,t){t?.miniNavigationOverlay!==!1&&ere();let r=t?.webClient||HB(FC.WADO_WEB_CLIENT,e[0]);if(!r)throw Error(`To use setDataIds on WSI data, you must provide metaData.webClient for ${e[0]}.`);return this.setWSI(e,r)}async setWSI(e,t){this.clearDisplaySets(),this.microscopyElement.style.background="black",this.microscopyElement.innerText="Loading",this.imageIds=e;let r=await et7();err||=r.utils;let n=await ert({imageIds:this.imageIds,client:t,dicomMicroscopyViewer:r});this.imageURISet=n.imageURISet,this.frameOfReferenceUID=n.frameOfReferenceUID,this.metadata=n.metadata,this.hasPixelSpacing=n.metadata.hasPixelSpacing;let a=new r.viewer.VolumeImageViewer({client:t,metadata:n.volumeImages,controls:["overview","position"],retrieveRendered:!1,bindings:{}});a.render({container:this.microscopyElement}),a.deactivateDragPanInteraction(),this.viewer=a,this.map=a.getMap(),this.map.on("postrender",this.postrender),this.resize(),this.microscopyElement.innerText="",Object.assign(this.microscopyElement.style,{"--ol-partial-background-color":"rgba(127, 127, 127, 0.7)","--ol-foreground-color":"#000000","--ol-subtle-foreground-color":"#000","--ol-subtle-background-color":"rgba(78, 78, 78, 0.5)",background:"none"})}async setDisplaySets(...t){await this.mountDisplaySets(t,async t=>{let r=HZ(t.displaySetId);if(!r?.imageIds?.length||!r.options?.webClient)throw Error(`[WSIViewport] No registered WSI dataset (imageIds + webClient) for display set ${t.displaySetId}`);!1!==r.options.miniNavigationOverlay&&ere(),await e.prototype.setWSI.call(this,r.imageIds,r.options.webClient)})}scroll(e){let t=this.getCamera();this.setCamera({parallelScale:t.parallelScale*(1+.1*e)})}getSliceIndex(){return 0}getView(){if(!this.viewer)return;let e=this.viewer.getMap(),t=window;return t.map=e,t.viewer=this.viewer,t.view=e?.getView(),t.wsi=this,e?.getView()}refreshRenderValues(){let e=this.getView();if(!e)return;let t=e.getResolution();if(!t||t<FP)return;let r=e.getCenter(),n=e.getProjection().getExtent(),a=e.getRotation(),i=e.getZoom(),{metadata:{spacing:[o,s]}}=this;Object.assign(this.internalCamera,{extent:n,centerIndex:r,worldToCanvasRatio:1/t/o,xSpacing:o,ySpacing:s,resolution:t,rotation:a,zoom:i})}getZoom(){return this.getView()?.getZoom()}setZoom(e){this.getView()?.setZoom(e)}getTransform(){this.refreshRenderValues();let{centerIndex:e,resolution:t,rotation:r}=this.internalCamera,n=[this.canvas.width/2,this.canvas.height/2],a=new GB;return a.translate(n[0],n[1]),a.rotate(r),a.scale(1/t,-1/t),a.translate(-e[0],-e[1]),a}getViewReferenceId(){return`imageId:${this.getCurrentImageId()}`}getCurrentImageIdIndex(){return 0}},eri="#000000";async function ero(e){let t=HB(FC.ECG,e);if(!t?.waveformData?.retrieveBulkData)throw Error(`[ECG] No ECG waveform data for ${e}`);let{numberOfWaveformChannels:r,numberOfWaveformSamples:n,samplingFrequency:a,waveformBitsAllocated:i=16,waveformSampleInterpretation:o="SS",multiplexGroupLabel:s,channelDefinitionSequence:l=[]}=t,u=await t.waveformData.retrieveBulkData(),d=HB(FC.CALIBRATION,e),c=[];for(let e=0;e<r;e++){let t=l[e]||{},r=t.channelSourceSequence?.codeMeaning||t.ChannelSourceSequence?.CodeMeaning||`Channel ${e+1}`,n=u[e]||new Int16Array(0),{min:a,max:i}=function(e){let t=0,r=0;for(let n=0;n<e.length;n++)e[n]<t&&(t=e[n]),e[n]>r&&(r=e[n]);return{min:t,max:r}}(n);c.push({name:r,data:n,min:a,max:i})}return{waveform:{channels:c,numberOfChannels:r,numberOfSamples:n,samplingFrequency:a,bitsAllocated:i,sampleInterpretation:o,multiplexGroupLabel:s,calibration:d},calibration:d}}function ers(e,t){if(!t)return e.filter(e=>e.data.length>0);let r=new Set(t);return e.filter((t,n)=>r.has(n)&&e[n].data.length>0)}function erl(e){return e.filter(e=>!1!==e.visible&&e.data.length>0)}function eru(e,t){let r=0;return e.forEach(e=>{r+=(e.max-e.min)*t*1.25+5}),r||1}function erd(e){let{visibleChannels:t,channelScale:r}=e,n=[],a=0;return t.forEach(e=>{let t=(e.max-e.min)*r*1.25,i=(a+=t+5)+e.min*r;n.push({channel:e,itemHeight:t,yOffset:a,baseline:i})}),n}function erc(e,t,r){if(r?.showGrid===!1||t.channelScale<=0)return;let{ecgWidth:n,ecgHeight:a,channelScale:i}=t,o=100;for(;o*i<8;)o*=2;let s=o*i,l=5*s;e.strokeStyle="#3f0000",e.lineWidth=.5,e.beginPath();for(let t=s;t<=a;t+=s)Math.round(t/s)%5!=0&&(e.moveTo(0,t),e.lineTo(n,t));for(let t=6;t<=n;t+=6)Math.round(t/6)%5!=0&&(e.moveTo(t,0),e.lineTo(t,a));e.stroke(),e.strokeStyle="#7f0000",e.lineWidth=1,e.beginPath();for(let t=l;t<=a;t+=l)e.moveTo(0,t),e.lineTo(n,t);for(let t=30;t<=n;t+=30)e.moveTo(t,0),e.lineTo(t,a);e.stroke()}function erh(e){let{ctx:t,layouts:r,ecgWidth:n,channelScale:a,startIndex:i=0,endIndex:o,lineWidth:s=1,amplitudeScale:l=1}=e;r.forEach(({channel:e,baseline:r})=>{let u=Math.min(o??e.data.length,e.data.length),d=Math.max(0,Math.min(i,u-1)),c=Math.max(1,u-d);t.strokeStyle="#7f4c00",t.lineWidth=2,t.beginPath(),t.moveTo(0,r),t.lineTo(n,r),t.stroke(),t.strokeStyle="#ffffff",t.lineWidth=s,t.beginPath();for(let i=d;i<u;i++){let o=(i-d)*n/c,s=r-e.data[i]*a*l;i===d?t.moveTo(o,s):t.lineTo(o,s)}t.stroke()})}function erp(e,t,r){let n=14/(r||1);t.forEach(({channel:t,itemHeight:r,yOffset:a})=>{let i=a-r+n;e.font=`${n}px monospace`;let o=e.measureText(t.name).width;e.fillStyle=eri,e.fillRect(5,i-n,o+4,n+4),e.fillStyle="#ffff00",e.fillText(t.name,5,i)})}let erm=class extends GN{constructor(e){super({...e,canvas:e.canvas||GK(e.element)}),this.imageId=null,this.channels=[],this.waveformData=null,this.ecgWidth=0,this.ecgHeight=0,this.channelScale=0,this.ecgCamera={panWorld:[0,0],parallelScale:1},this.getProperties=()=>({visibleChannels:this.channels.map((e,t)=>e.visible?t:-1).filter(e=>e>=0)}),this.resetCamera=()=>(this.refreshRenderValues(),this.canvasContext.fillRect(0,0,this.canvas.width,this.canvas.height),this.renderFrame(),!0),this.getFrameOfReferenceUID=()=>`ecg-viewport-${this.id}`,this.resize=()=>{let e=this.canvas,{clientWidth:t,clientHeight:r}=e;(e.width!==t||e.height!==r)&&(e.width=t,e.height=r),this.waveformData&&(this.computeChannelScale(),this.recalculateHeight()),this.refreshRenderValues(),this.renderFrame()},this.canvasToWorld=(e,t=[0,0,0])=>{if(!this.waveformData)return t[0]=0,t[1]=0,t[2]=0,t;let r=this.getWorldToCanvasRatio(),n=this.ecgCamera.panWorld,a=this.computeChannelLayouts(),i=[e[0]/r-n[0],e[1]/r-n[1]],o=0;for(let e=0;e<a.length;e++){let t=a[e];if(i[1]<=t.yOffset){o=e;break}e===a.length-1&&(o=e)}let s=Math.max(0,Math.min(this.waveformData.numberOfSamples-1,i[0]*this.waveformData.numberOfSamples/this.ecgWidth)),l=(a[o].baseline-i[1])/this.channelScale;return t[0]=s,t[1]=l,t[2]=o,t},this.worldToCanvas=e=>{if(!this.waveformData)return[0,0];let t=this.getWorldToCanvasRatio(),r=this.ecgCamera.panWorld,n=this.computeChannelLayouts(),a=Math.round(e[2]);if(a<0||a>=n.length)return[0,0];let i=n[a];return[e[0]/this.waveformData.numberOfSamples*this.ecgWidth*t+r[0]*t,(i.baseline-e[1]*this.channelScale)*t+r[1]*t]},this.getRotation=()=>0,this.getNumberOfSlices=()=>1,this.getCurrentImageIdIndex=()=>0,this.getCurrentImageId=()=>this.imageId,this.getSliceIndex=()=>0,this.getImageIds=()=>this.imageId?[this.imageId]:[],this.scroll=()=>{},this.customRenderViewportToCanvas=()=>{this.renderFrame()},this.renderFrame=()=>{if(!this.waveformData)return;let e=window.devicePixelRatio||1,t=this.getTransform().getMatrix(),r=this.canvasContext;r.resetTransform(),r.fillStyle=eri,r.fillRect(0,0,this.canvas.width,this.canvas.height),r.setTransform(t[0]/e,t[1]/e,t[2]/e,t[3]/e,t[4]/e,t[5]/e);let n=this.computeChannelLayouts();this.drawGrid(r),this.drawTraces(r,n),this.drawLabels(r,n),r.resetTransform(),this.setRendered(),Bh(this.element,NH.IMAGE_RENDERED,{element:this.element,viewportId:this.id,viewport:this,renderingEngineId:this.renderingEngineId})},this.getMiddleSliceData=()=>{throw Error("Method not implemented for ECG viewport.")},this.canvasContext=this.canvas.getContext("2d"),this.renderingEngineId=e.renderingEngineId,this.element.setAttribute("data-viewport-uid",this.id),this.element.setAttribute("data-rendering-engine-uid",this.renderingEngineId),this.addEventListeners(),this.resize()}static get useCustomRenderingPipeline(){return!0}addEventListeners(){this.canvas.addEventListener(NH.ELEMENT_DISABLED,this.elementDisabledHandler)}removeEventListeners(){this.canvas.removeEventListener(NH.ELEMENT_DISABLED,this.elementDisabledHandler)}elementDisabledHandler(){this.removeEventListeners()}async setEcg(e){this.clearDisplaySets(),this.imageId=e;let{waveform:t,calibration:r}=await ero(e);this.channels=t.channels.map(e=>({...e,visible:!0})),this.waveformData={...t,channels:this.channels,multiplexGroupLabel:t.multiplexGroupLabel},this.calibration=r,this.ecgWidth=Math.ceil(150*this.waveformData.numberOfSamples/this.waveformData.samplingFrequency),this.computeChannelScale(),this.recalculateHeight(),this.refreshRenderValues(),this.renderFrame()}async setDisplaySets(...e){await this.mountDisplaySets(e,async e=>{let t=HX(e.displaySetId);await this.setEcg(t)})}setChannelVisibility(e,t){e>=0&&e<this.channels.length&&(this.channels[e].visible=t,this.computeChannelScale(),this.recalculateHeight(),this.refreshRenderValues(),this.renderFrame())}getVisibleChannels(){return this.channels.map(e=>({name:e.name,visible:e.visible}))}getWaveformData(){return this.waveformData}getContentDimensions(){return{width:this.ecgWidth,height:this.ecgHeight}}computeChannelScale(){let e=erl(this.channels);if(0===e.length||0===this.ecgWidth){this.channelScale=0;return}let t=1;for(let r of e)t=Math.max(t,r.max-r.min);let r=this.canvas.offsetHeight&&this.canvas.offsetWidth?this.canvas.offsetHeight/this.canvas.offsetWidth:2/3,n=(this.ecgWidth*r-5*e.length)/e.length;this.channelScale=n/(1.25*t)}recalculateHeight(){this.ecgHeight=eru(erl(this.channels),this.channelScale)}computeChannelLayouts(){return erd({visibleChannels:erl(this.channels),channelScale:this.channelScale})}setProperties(e){if(void 0!==e.visibleChannels){for(let t=0;t<this.channels.length;t++)this.channels[t].visible=e.visibleChannels.includes(t);this.computeChannelScale(),this.recalculateHeight(),this.refreshRenderValues(),this.renderFrame()}}resetProperties(){for(let e of this.channels)e.visible=!0;this.computeChannelScale(),this.recalculateHeight(),this.refreshRenderValues(),this.renderFrame()}setCamera(e){let{parallelScale:t,focalPoint:r}=e;if(t&&(this.ecgCamera.parallelScale=this.element.clientHeight/2/t),void 0!==r){let e=this.worldToCanvas(r),t=[this.element.clientWidth/2,this.element.clientHeight/2],n=[(e[0]-t[0])/this.ecgCamera.parallelScale,(e[1]-t[1])/this.ecgCamera.parallelScale];this.ecgCamera.panWorld=[this.ecgCamera.panWorld[0]-n[0],this.ecgCamera.panWorld[1]-n[1]]}this.canvasContext.fillStyle=eri,this.canvasContext.fillRect(0,0,this.canvas.width,this.canvas.height),this.renderFrame()}getCamera(){let{parallelScale:e}=this.ecgCamera,t=[this.element.clientWidth/2,this.element.clientHeight/2];return{parallelProjection:!0,focalPoint:this.canvasToWorld(t),position:[0,0,0],viewUp:[0,-1,0],parallelScale:this.element.clientHeight/2/e,viewPlaneNormal:[0,0,1]}}getPan(){let e=this.ecgCamera.panWorld;return[e[0],e[1]]}getViewReferenceId(e){return`imageId:${this.imageId}`}hasImageURI(e){return this.imageId?.includes(e)??!1}isReferenceViewable(e){return!e.FrameOfReferenceUID||e.FrameOfReferenceUID===this.getFrameOfReferenceUID()}updateCameraClippingPlanesAndRange(){}refreshRenderValues(){if(!this.ecgWidth||!this.ecgHeight)return;let e=this.canvas.offsetWidth/this.ecgWidth;this.ecgHeight*e>this.canvas.offsetHeight&&(e=this.canvas.offsetHeight/this.ecgHeight);let t=Math.floor(this.ecgWidth*e),r=Math.floor(this.ecgHeight*e),n=(this.canvas.offsetWidth-t)/2,a=(this.canvas.offsetHeight-r)/2,i=n/e,o=a/e;this.ecgCamera.panWorld=[i,o],this.ecgCamera.parallelScale=e}getWorldToCanvasRatio(){return this.ecgCamera.parallelScale}getTransform(){let e=this.ecgCamera.panWorld,t=window.devicePixelRatio||1,r=this.getWorldToCanvasRatio(),n=1/r,a=[this.canvas.offsetWidth/2,this.canvas.offsetHeight/2],i=[a[0]*n,a[1]*n],o=new GB;return o.scale(t,t),o.translate(a[0],a[1]),o.scale(r,r),o.translate(e[0],e[1]),o.translate(-i[0],-i[1]),o}drawGrid(e){erc(e,{ecgWidth:this.ecgWidth,ecgHeight:this.ecgHeight,channelScale:this.channelScale})}drawTraces(e,t){erh({ctx:e,layouts:t,ecgWidth:this.ecgWidth,channelScale:this.channelScale})}drawLabels(e,t){erp(e,t,this.getWorldToCanvasRatio())}getImageData(){if(!this.waveformData)return null;let e=[this.waveformData.numberOfSamples,65536,this.waveformData.numberOfChannels],t=[1,1,1],r=[1,0,0,0,1,0,0,0,1];return{dimensions:e,spacing:t,origin:[0,0,0],direction:r,imageData:{getDirection:()=>r,getDimensions:()=>e,getRange:()=>[0,1],getSpacing:()=>t,worldToIndex:e=>[e[0],e[1]+32768,e[2]],indexToWorld:e=>[e[0],e[1]-32768,e[2]]},hasPixelSpacing:!1,calibration:this.calibration,preScale:{scaled:!1},metadata:{Modality:"ECG"}}}getSliceViewInfo(){throw Error("Method not implemented for ECG viewport.")}};function erf(e){return{dimensionGroupNumber:erk(e?.dimensionGroupNumber),numDimensionGroups:erk(e?.numDimensionGroups)}}function erg(e){return erC([e.referencedImageURI,...e.referencedImageId?erb(e.referencedImageId):[]])}let ery=new Map,erv=new WeakMap;function erb(e){var t;let r,n=ery.get(e);return n||(n=erC([Gk(e),-1===(r=(t=e).indexOf(":"))?t:t.substring(r+1)]),ery.set(e,n)),n}function erw(e,t){return!!e?.some(e=>t.includes(e))}function erx(e){return erC([e.volumeId,...e.volumeIds||[]])}function erC(e){return Array.from(new Set(e.filter(e=>"string"==typeof e)))}function erk(e){if("number"==typeof e&&Number.isInteger(e)&&!(e<1))return e}let erM=class{constructor(e){this.viewportStatus=Fw.NO_DATA,this.bindings=new Map,this.dataPresentation=new Map,this.isDestroyed=!1,this._debug={renderModes:{}},this.id=e.id,this.element=e.element}async setDisplaySets(...e){for(let[t,{displaySetId:r,options:n}]of(this.removeAllData(),e.entries())){if(!n)throw Error(`[${this.type}] setDisplaySets requires per-entry options when the viewport family does not override it.`);await this.addDisplaySet(r,{...n,role:n.role??(0===t?"source":"overlay")})}}async addDisplaySet(e,t){if(this.isDestroyed)throw Error("Viewport has been destroyed");let r=await this.dataProvider.load(e,t);await this.addLoadedData(e,r,t)}getDisplaySets(){return Array.from(this.bindings.entries()).map(([e,t])=>({displaySetId:e,options:{role:t.role}}))}removeData(e){let t=this.bindings.get(e);t&&(t.removeData(),this.bindings.delete(e),this.dataPresentation.delete(e),delete this._debug.renderModes[e],this.isDestroyed||this.render())}setDisplaySetPresentation(e,t){if("string"==typeof e)return void this.mergeDataPresentation(e,t??{});let r=this.getCurrentBinding()?.data.id;r&&this.mergeDataPresentation(r,e)}getDisplaySetPresentation(e){return this.getDataPresentationState(e)}getCurrentMode(){return this.getSourceBinding()?"unknown":"empty"}getViewReference(e={}){return{FrameOfReferenceUID:this.getFrameOfReferenceUID(),dataId:this.getCurrentBinding()?.data.id}}getViewReferenceId(e={}){return`frameOfReference:${this.getFrameOfReferenceUID()}`}setViewReference(e){}isReferenceViewable(e,t={}){return function(e,t,r={}){return!!e&&t.some(t=>{var n,a,i,o,s,l,u,d,c,h,p,m,f;let g,y;return n=e,a=t,i=r,o=n,s=a,(!o.FrameOfReferenceUID||o.FrameOfReferenceUID===s.frameOfReferenceUID)&&(l=n,u=a,!!(!l.dataId||erC([(d=u).dataId,...d.dataIds||[]]).includes(l.dataId)))&&(c=n,h=a,!!(!c.volumeId||erx(h).includes(c.volumeId)))&&!!function(e,t,r){if(e.planeRestriction)return function(e,t,r){if(e.FrameOfReferenceUID!==t.frameOfReferenceUID)return!1;if(r.withOrientation)return!0;let{cameraFocalPoint:n,viewPlaneNormal:a}=t;if(!n||!a||e.inPlaneVector1&&!Vw(0,Lv.vec3.dot(a,e.inPlaneVector1))||e.inPlaneVector2&&!Vw(0,Lv.vec3.dot(a,e.inPlaneVector2)))return!1;if(r.withNavigation)return!0;let i=Lv.vec3.sub(Lv.vec3.create(),e.point,n);return Vw(0,Lv.vec3.dot(i,a))}(e.planeRestriction,t,r);if(!e.viewPlaneNormal)return!0;let{viewPlaneNormal:n}=t;return!!n&&(Vw(e.viewPlaneNormal,n)||Vw(Lv.vec3.negate(Lv.vec3.create(),n),e.viewPlaneNormal)||!!r.withOrientation)}(n,a,i)&&!!function(e,t,r){if(e.planeRestriction&&e.volumeId&&erx(t).includes(e.volumeId))return!0;let n=erg(e);if(!n.length)return!0;let a=function(e){var t;let r,n=e.imageIds?.length?(t=e.imageIds,(r=erv.get(t))||(r=t.map(e=>erb(e)),erv.set(t,r)),r):[],a=e.imageURIs;if(!a?.length)return n;let i=n.slice(),o=new Set;for(let e of n)for(let t of e)o.add(t);for(let e of a)o.has(e)||(i.push([e]),o.add(e));return i}(t);if(!a.length)return!1;let i=t.currentImageIdIndex??0;if(erw(a[i],n))return!0;let o=a.findIndex(e=>erw(e,n));if(-1===o)return!1;if(t.allowAnyImageReference||r.withNavigation)return!0;let s=function(e,t){let r=t.multiSliceReference&&erg(t.multiSliceReference);if(!r?.length)return;let n=e.findIndex(e=>erw(e,r));return -1===n?void 0:n}(a,e);if(void 0!==s){let e=Math.min(o,s),t=Math.max(o,s);return e<=i&&i<=t}return i===o}(n,a,i)&&(p=n,m=a,f=i,g=void 0!==p.dimensionGroupNumber,y=erk(p.dimensionGroupNumber),!g||!!y&&(m.dimensionGroupNumber===y||!!f.withNavigation&&"number"==typeof m.numDimensionGroups&&!!(y<=m.numDimensionGroups)))&&function(e,t,r){var n,a;let i=e.sliceIndex;if(void 0===i)return!0;let{currentImageIdIndex:o}=t;if(Array.isArray(i))return"number"==typeof o&&i[0]<=o&&o<=i[1];return!!Number.isFinite(i)&&(o===i||!!r.withNavigation&&(n=i,a=t.imageIds,!a?.length||n>=0&&n<a.length))}(n,a,i)})}(e,this.getReferenceViewContexts(e),t)}getFrameOfReferenceUID(){return this.getResolvedView()?.getFrameOfReferenceUID()??`${this.type}-viewport-${this.id}`}getRenderingEngine(){return FA(this.renderingEngineId)}canvasToWorld(e){let t=this.getResolvedView();if(!t)throw Error(`[${this.type}] Cannot convert canvas to world for viewport ${this.id} because no data is mounted.`);return t.canvasToWorld(e)}worldToCanvas(e){let t=this.getResolvedView();if(!t)throw Error(`[${this.type}] Cannot convert world to canvas for viewport ${this.id} because no data is mounted.`);return t.worldToCanvas(e)}getAspectRatio(){return[1,1]}setViewState(e){if(this.isDestroyed)return;let t=this.getCameraForEvent(),r={...this.viewState,...e};this.viewState=this.normalizeViewState(r),this.modified(t)}getViewState(){return this.viewState}updateViewState(e){let t="function"==typeof e?e(this.getViewState()):e;t&&this.setViewState(t)}removeWidgets(){}destroy(){if(!this.isDestroyed){for(let e of(this.isDestroyed=!0,this.destroyBindings(),this.onDestroy(),this.bindings.clear(),this.dataPresentation.clear(),Object.keys(this._debug.renderModes)))delete this._debug.renderModes[e];this.element.removeAttribute("data-viewport-uid"),this.element.removeAttribute("data-rendering-engine-uid")}}dispose(){this.destroy()}setRendered(){this.viewportStatus!==Fw.NO_DATA&&this.viewportStatus!==Fw.LOADING&&(this.viewportStatus=Fw.RENDERED)}setNeedsRender(){this.viewportStatus=Fw.NEEDS_RENDER}updateRenderingPipeline(){}resize(){this.isDestroyed||(this.resizeBindings(),this.modified())}resetViewState(e){return!1}resizeForRenderingEngine({keepCamera:e=!0}={}){!this.isDestroyed&&(this.resize(),e||this.resetViewState())}async addLoadedData(e,t,r,n){if(this.isDestroyed)throw Error("Viewport has been destroyed");if(n?.())return!1;let a=this.renderPathResolver.resolve(this.type,t,r),i=a.createRenderPath(),o=a.selectContext?.(this.renderContext)??this.renderContext,s=await i.addData(o,t,r);if(n?.())return s.removeData(),!1;if(this.isDestroyed)throw s.removeData(),Error("Viewport has been destroyed");let l=this.bindings.get(e);l&&l.removeData();let u=r.role??"overlay";if("source"===u)for(let[t,r]of this.bindings.entries())t!==e&&(r.role="overlay");this.bindings.set(e,{data:t,role:u,...s});let d=this.bindings.get(e);if(!d)throw Error(`Failed to bind rendering for ${e}`);let c=this.dataPresentation.get(e);return void 0!==c&&d.updateDataPresentation(c),d.applyViewState(this.viewState),this._debug.renderModes[e]=s.rendering.renderMode,this.viewportStatus=Fw.PRE_RENDER,this.render(),!0}removeAllData(){for(let e of Array.from(this.bindings.keys()))this.removeData(e)}setDataPresentationState(e,t){if(this.isDestroyed)return;this.dataPresentation.set(e,t);let r=this.bindings.get(e);r&&(r.updateDataPresentation(t),this.render())}getDataPresentationState(e){return this.dataPresentation.get(e)}setDefaultDataPresentation(e,t){let r={...t,...this.getDataPresentationState(e)||{}};return this.setDataPresentationState(e,r),r}mergeDataPresentation(e,t){let r={...this.getDataPresentationState(e)||{},...t};return this.setDataPresentationState(e,r),this.bindings.has(e)&&this.notifyDataPresentationModified(e,t),r}notifyDataPresentationModified(e,t){}normalizeViewState(e){return e}modified(e){!this.isDestroyed&&(this.forEachBinding(e=>{e.applyViewState(this.viewState)}),this.render(),e&&this.triggerCameraModifiedEvent(e))}getCameraForEvent(){return this.getResolvedView()?.toICamera()??this.getViewState()}triggerCameraModifiedEvent(e){let t={previousCamera:e,camera:this.getCameraForEvent(),element:this.element,viewportId:this.id,renderingEngineId:this.renderingEngineId};Bh(this.element,NH.CAMERA_MODIFIED,t)}triggerCameraResetEvent(){let e={element:this.element,viewportId:this.id,camera:this.getCameraForEvent(),renderingEngineId:this.renderingEngineId};Bh(this.element,NH.CAMERA_RESET,e)}getBinding(e){return this.bindings.get(e)}getDisplaySetRenderMode(e){return this.getBinding(e)?.rendering.renderMode}getDisplaySetRole(e){return this.getBinding(e)?.role}getFirstBinding(){return this.bindings.values().next().value}getSourceBinding(){for(let e of this.bindings.values())if("source"===e.role)return e;return this.getFirstBinding()}getCurrentBinding(){return this.getFirstBinding()}forEachBinding(e){for(let t of this.bindings.values())e(t)}getReferenceViewContexts(e){let t=[],r=this.getResolvedView(),n=r?.toICamera();for(let[e,a]of this.bindings.entries())t.push({dataId:e,dataIds:[a.data.id],frameOfReferenceUID:a.getFrameOfReferenceUID()??r?.getFrameOfReferenceUID()??this.getFrameOfReferenceUID(),cameraFocalPoint:n?.focalPoint,viewPlaneNormal:n?.viewPlaneNormal});return t.length||t.push({frameOfReferenceUID:this.getFrameOfReferenceUID(),cameraFocalPoint:n?.focalPoint,viewPlaneNormal:n?.viewPlaneNormal}),t}renderBindings(){if(this.isDestroyed)return!1;let e=!1;return this.forEachBinding(t=>{t.render?.(),e=e||!!t.render}),e}resizeBindings(){this.isDestroyed||this.forEachBinding(e=>{e.resize?.()})}destroyBindings(){for(let e of Array.from(this.bindings.keys()))this.removeData(e)}onDestroy(){}};class erS{async load(e){let t=HX(e),{waveform:r}=await ero(t);return{id:e,type:"ecg",...r}}}class erE{constructor(e=[]){this.paths=[],e.forEach(e=>this.add(e))}register(e){this.add(e)}add(e){this.paths.find(t=>t.id===e.id)?console.debug(`[DefaultRenderPathResolver] Duplicate render path registration ignored for "${e.id}"`):this.paths.push(e)}resolve(e,t,r){let n=this.paths.find(n=>n.type===e&&n.matches(t,r));if(!n)throw Error(`No render path for ${e}/${t.type}/${r.renderMode}`);return n}}function erT(e){return{timeRange:[...e.timeRange],valueRange:[...e.valueRange],scrollOffset:0,anchorCanvas:[.5,.5],scale:1,scaleMode:"fit",rotation:0}}function erI(e){var t;return{timeRange:[...e.timeRange],valueRange:[...e.valueRange],...void 0!==e.scrollOffset?{scrollOffset:e.scrollOffset}:{},anchorCanvas:[(t=e.anchorCanvas??[.5,.5])[0],t[1]],scale:Math.max(e.scale??1,.001),scaleMode:"fit",rotation:0,...e.anchorWorld?{anchorWorld:er_(e.anchorWorld)}:{}}}function erP(e){var t;let{metrics:r,camera:n,canvas:a}=e,i=Math.max(n?.scale??1,.001),o=r.worldToCanvasRatio*i,s=r.ecgWidth*o,l=r.ecgHeight*o,u=(a.clientWidth-s)/2,d=(a.clientHeight-l)/2,c=[(t=n?.anchorCanvas??[.5,.5])[0],t[1]],h=er_(n?.anchorWorld)??[r.ecgWidth/2,r.ecgHeight/2],p=a.clientWidth*c[0]-h[0]*o,m=a.clientHeight*c[1]-h[1]*o;return{anchorWorld:h,anchorCanvas:c,canvasHeight:a.clientHeight,canvasWidth:a.clientWidth,centeredXOffset:u,centeredYOffset:d,effectiveRatio:o,xOffset:p,yOffset:m}}function er_(e){return e?[e[0],e[1]]:void 0}new erE;class erD{async addData(e,t,r){let n={renderMode:"signal2d",canvas:e.canvas,canvasContext:e.canvasContext,metrics:{ecgWidth:1,ecgHeight:1,channelScale:1,worldToCanvasRatio:1,xOffsetCanvas:0,yOffsetCanvas:0}};return{rendering:n,updateDataPresentation:e=>{this.updateDataPresentation(n,e)},applyViewState:e=>{this.applyViewState(n,e)},getFrameOfReferenceUID:()=>this.getFrameOfReferenceUID(e),render:()=>{this.render(e,n,t)},removeData:()=>{this.removeData()}}}updateDataPresentation(e,t){e.currentDataPresentation=t}applyViewState(e,t){e.currentCamera=t}getFrameOfReferenceUID(e){return`ecg-viewport-${e.viewportId}`}render(e,t,r){!function(e,t,r){let n,a,i,o,s,l,u,d,c,h,p,m,{canvas:f,canvasContext:g,currentCamera:y,currentDataPresentation:v}=t;if(!y)return;let b=ers(r.channels,v?.visibleChannels);n=window.devicePixelRatio||1,a=Math.max(1,f.clientWidth||f.width||1),i=Math.max(1,f.clientHeight||f.height||1),o=Math.floor(a*n),s=Math.floor(i*n),(f.width!==o||f.height!==s)&&(f.width=o,f.height=s);let w=function(e){let{canvas:t,visibleChannels:r,windowMs:n,valueRange:a}=e,i=Math.max(1,Math.ceil(n/1e3*150)),[o,s]=a,l=Math.max(1,s-o),u=(i*(t.clientHeight&&t.clientWidth?t.clientHeight/t.clientWidth:2/3)-5*Math.max(1,r.length))/Math.max(1,r.length)/(1.25*l),d=eru(r,u),c=Math.min(t.clientWidth/Math.max(1,i),t.clientHeight/Math.max(1,d));return{ecgWidth:i,ecgHeight:d,channelScale:u,worldToCanvasRatio:c,xOffsetCanvas:(t.clientWidth-i*c)/2,yOffsetCanvas:(t.clientHeight-d*c)/2}}({canvas:f,visibleChannels:b,windowMs:Math.max(1,y.timeRange[1]-y.timeRange[0]),valueRange:y.valueRange}),x=erd({visibleChannels:b,channelScale:w.channelScale}),C=(l=r.numberOfSamples/r.samplingFrequency*1e3,d=Math.max((u=Math.max(0,Math.min(y.timeRange[0],l)))+1,y.timeRange[1]),c=Math.max(u+1,Math.min(d,l)),p=Math.max((h=Math.max(0,Math.min(r.numberOfSamples-1,Math.floor(u/1e3*r.samplingFrequency))))+1,Math.min(r.numberOfSamples,Math.ceil(c/1e3*r.samplingFrequency))),{startMs:u,endMs:c,startIndex:h,endIndex:p}),k=window.devicePixelRatio||1;t.metrics=w;let{effectiveRatio:M,xOffset:S,yOffset:E}={effectiveRatio:(m=erP({metrics:w,camera:y,canvas:f})).effectiveRatio,xOffset:m.xOffset,yOffset:m.yOffset};g.resetTransform(),g.fillStyle="#000000",g.fillRect(0,0,f.width,f.height),v?.visible!==!1&&(g.globalAlpha=v?.opacity??1,g.setTransform(M*k,0,0,M*k,S*k,E*k),erc(g,w,{showGrid:v?.showGrid}),erh({ctx:g,layouts:x,ecgWidth:w.ecgWidth,channelScale:w.channelScale,startIndex:C.startIndex,endIndex:C.endIndex,lineWidth:v?.lineWidth,amplitudeScale:v?.amplitudeScale}),erp(g,x,w.worldToCanvasRatio),g.resetTransform(),g.globalAlpha=1,Bh(e.element,NH.IMAGE_RENDERED,{element:e.element,viewportId:e.viewportId,renderingEngineId:e.renderingEngineId,rendering:t}))}(e,t,r)}removeData(){}}class erO{constructor(){this.id="ecg:canvas-signal",this.type=Nq.ECG_NEXT}matches(e,t){return"ecg"===e.type&&"signal2d"===t.renderMode}createRenderPath(){return new erD}}let erA=class{constructor(e){this.state=Object.freeze(e)}toICamera(){return this.cachedICamera||=this.buildICamera(),this.cachedICamera}},erR=class e extends erA{get zoom(){return Math.max(this.state.viewState.scale??1,.001)}get pan(){var e;return[(e=this.getCanvasMapping()).xOffset-e.centeredXOffset,e.yOffset-e.centeredYOffset]}canvasToWorld(e){let t=this.getCanvasMapping(),r=this.getChannelLayouts(),n=[(e[0]-t.xOffset)/t.effectiveRatio,(e[1]-t.yOffset)/t.effectiveRatio],a=0;for(let e=0;e<r.length;e++){let t=r[e];if(n[1]<=t.yOffset||e===r.length-1){a=e;break}}let i=r[a];return[Math.max(0,Math.min(this.state.waveform.numberOfSamples-1,n[0]*this.state.waveform.numberOfSamples/this.state.metrics.ecgWidth)),(i.baseline-n[1])/this.state.metrics.channelScale,a]}worldToCanvas(e){let t=this.getCanvasMapping(),r=this.getChannelLayouts(),n=Math.round(e[2]);return n<0||n>=r.length?[0,0]:[e[0]/this.state.waveform.numberOfSamples*this.state.metrics.ecgWidth*t.effectiveRatio+t.xOffset,(r[n].baseline-e[1]*this.state.metrics.channelScale)*t.effectiveRatio+t.yOffset]}getFrameOfReferenceUID(){return this.state.frameOfReferenceUID}withZoom(e,t){var r;let n=Math.max(e,.001);return t?this.cloneWithViewState({...this.state.viewState,anchorWorld:(r=this.getCanvasMapping(),[(t[0]-r.xOffset)/r.effectiveRatio,(t[1]-r.yOffset)/r.effectiveRatio]),anchorCanvas:[t[0]/Math.max(this.state.canvas.clientWidth,1),t[1]/Math.max(this.state.canvas.clientHeight,1)],scale:n,scaleMode:"fit"}):this.cloneWithViewState({...this.state.viewState,scale:n,scaleMode:"fit"})}withPan(e){var t,r;return this.cloneWithViewState({...this.state.viewState,anchorWorld:(t=[e[0],e[1]],[((r=this.getCanvasMapping()).canvasWidth*r.anchorCanvas[0]-(r.centeredXOffset+t[0]))/r.effectiveRatio,(r.canvasHeight*r.anchorCanvas[1]-(r.centeredYOffset+t[1]))/r.effectiveRatio])})}buildICamera(){let e=this.getCanvasMapping(),t=[this.state.canvas.clientWidth/2,this.state.canvas.clientHeight/2];return{parallelProjection:!0,focalPoint:this.canvasToWorld(t),position:[0,0,0],viewUp:[0,-1,0],parallelScale:this.state.canvas.clientHeight/2/Math.max(e.effectiveRatio,.001),viewPlaneNormal:[0,0,1]}}getCanvasMapping(){return this.cachedCanvasMapping||=erP({canvas:this.state.canvas,camera:this.state.viewState,metrics:this.state.metrics}),this.cachedCanvasMapping}getChannelLayouts(){return erd({visibleChannels:ers(this.state.waveform.channels,this.state.dataPresentation?.visibleChannels),channelScale:this.state.metrics.channelScale})}cloneWithViewState(t){return new e({...this.state,viewState:t})}},erL=class extends erM{static get useCustomRenderingPipeline(){return!0}getUseCustomRenderingPipeline(){return!0}constructor(e){super(e),this.type=Nq.ECG_NEXT,this.renderingEngineId=e.renderingEngineId,this.canvas=GK(this.element),this.canvasContext=this.canvas.getContext("2d"),this.dataProvider=e.dataProvider||new erS,this.renderPathResolver=e.renderPathResolver||function(e=[new erO]){return new erE(e)}(),this.renderContext={viewportId:this.id,type:"ecg",renderingEngineId:this.renderingEngineId,element:this.element,canvas:this.canvas,canvasContext:this.canvasContext},this.viewState=erT({timeRange:[0,1],valueRange:[-1,1]}),this.element.setAttribute("data-viewport-uid",this.id),this.element.setAttribute("data-rendering-engine-uid",this.renderingEngineId),this.resize()}async setDisplaySets(...e){for(let{displaySetId:t}of(this.removeAllData(),e)){let e=await this.loadWaveformData(t),r=e.numberOfSamples/e.samplingFrequency*1e3;this.setDefaultDataPresentation(t,{visible:!0,opacity:1,visibleChannels:e.channels.map((e,t)=>t),lineWidth:1,amplitudeScale:1,showGrid:!0}),this.viewState=erT({timeRange:[0,r],valueRange:function(e){let t=0,r=0;return(e.channels.forEach(e=>{t=Math.min(t,e.min),r=Math.max(r,e.max)}),t===r)?[-1,1]:[t,r]}(e)}),await this.addLoadedData(t,e,{renderMode:"signal2d"})}}getWaveformData(){return this.getWaveformBindingData()??null}getViewReference(e={}){let t=this.getFirstBinding()?.data.id;return{FrameOfReferenceUID:this.getFrameOfReferenceUID(),dataId:t,referencedImageId:this.getCurrentImageId(),sliceIndex:0}}getViewReferenceId(e={}){return`imageId:${this.getCurrentImageId()}`}setViewReference(e){}getSliceIndex(){return 0}getZoom(){return this.getResolvedView()?.zoom??Math.max(this.viewState.scale??1,.001)}normalizeViewState(e){return erI(e)}getReferenceViewContexts(){let e=this.getFirstBinding();return e?[{dataId:e.data.id,dataIds:[e.data.id],frameOfReferenceUID:this.getFrameOfReferenceUID(),imageIds:[e.data.id],currentImageIdIndex:0}]:super.getReferenceViewContexts()}setZoom(e,t){let r=this.getResolvedView();r?this.applyResolvedViewState(r.withZoom(e,t).state.viewState):this.setViewState({scale:Math.max(e,.001),scaleMode:"fit"})}getPan(){return this.getResolvedView()?.pan??[0,0]}setPan(e){let t=this.getResolvedView();t&&this.applyResolvedViewState(t.withPan(e).state.viewState)}getVisibleChannels(){let e=this.getWaveformBindingData();if(!e)return[];let t=e.id,r=new Set(this.getDisplaySetPresentation(t)?.visibleChannels||e.channels.map((e,t)=>t));return e.channels.map((e,t)=>({name:e.name,visible:r.has(t)}))}getContentDimensions(){let e=this.getCurrentRendering();return e?{width:e.metrics.ecgWidth,height:e.metrics.ecgHeight}:{width:0,height:0}}resize(){let{clientWidth:e,clientHeight:t}=this.canvas;if(this.canvas.width!==e||this.canvas.height!==t){let r=window.devicePixelRatio||1;this.canvas.width=Math.floor(Math.max(1,e)*r),this.canvas.height=Math.floor(Math.max(1,t)*r)}this.render()}render(){this.renderBindings()}customRenderViewportToCanvas(){this.render()}resetViewState(){let e=this.getCameraForEvent();return this.viewState=erT({timeRange:this.viewState.timeRange,valueRange:this.viewState.valueRange}),this.modified(e),this.triggerCameraResetEvent(),!0}getRotation(){return 0}scroll(){}getCurrentImageId(){let e=this.getFirstBinding();return e?.data.id}getCurrentImageIdIndex(){return 0}getImageIds(){let e=this.getFirstBinding();return e?[e.data.id]:[]}getImageData(){let e=this.getWaveformBindingData();if(!e)return null;let t=[e.numberOfSamples,65536,e.channels.length],r=[1,1,1],n=[1,0,0,0,1,0,0,0,1];return{dimensions:t,spacing:r,origin:[0,0,0],direction:n,imageData:{getDirection:()=>n,getDimensions:()=>t,getRange:()=>[0,1],getSpacing:()=>r,worldToIndex:e=>[e[0],e[1]+32768,e[2]],indexToWorld:e=>[e[0],e[1]-32768,e[2]]},scalarData:new Int16Array(0),hasPixelSpacing:!1,preScale:{scaled:!1},metadata:{Modality:"ECG",FrameOfReferenceUID:""}}}setScaleAtCanvasPoint(e,t){let r=this.getResolvedView();r?this.applyResolvedViewState(r.withZoom(e,t).state.viewState):this.setZoom(e)}async loadWaveformData(e){let t=await this.dataProvider.load(e);if(!erN(t))throw Error(`[ECGViewport] Loaded data for ${e} is not a valid ECG waveform`);return t}getWaveformBindingData(){let e=this.getFirstBinding();if(e&&erN(e.data))return e.data}getCurrentRendering(){let e=this.getFirstBinding();if(e&&"signal2d"===e.rendering.renderMode)return e.rendering}getResolvedView(){let e=this.getWaveformBindingData(),t=this.getCurrentRendering();if(e&&t)return new erR({viewState:this.viewState,canvas:this.canvas,dataPresentation:this.getDisplaySetPresentation(e.id),frameOfReferenceUID:`ecg-viewport-${this.id}`,metrics:t.metrics,waveform:e})}applyResolvedViewState(e){this.setViewState(e)}};function erN(e){return"object"==typeof e&&null!==e&&"ecg"===e.type&&Array.isArray(e.channels)&&"number"==typeof e.numberOfSamples&&"number"==typeof e.samplingFrequency&&"number"==typeof e.numberOfChannels}class erV{async load(e,t){let r=this.getDataSet(e);if(!r)throw Error(`[PlanarViewport] No registered planar dataset for ${e}`);if(!t)throw Error(`[PlanarViewport] No load options were provided for ${e}`);if(!r.imageIds.length)throw Error("[PlanarViewport] Cannot load an empty planar dataset");let n=Math.min(Math.max(0,r.initialImageIdIndex??0),r.imageIds.length-1),a=void 0===r.initialImageIdIndex?void 0:n;if(t.renderMode===eyK.VTK_VOLUME_SLICE||t.renderMode===eyK.CPU_VOLUME){let n=etu(t.volumeId),i=await ets(n,{imageIds:r.imageIds});i.load();let o=i.imageIds?i.imageIds:r.imageIds,s=a;if(void 0!==a&&o!==r.imageIds){let e=r.imageIds[a],t=o.indexOf(e);t>=0?s=t:console.warn(`[PlanarViewport] initialImageIdIndex remap failed: imageId "${e}" not found in the volume imageIds; using the original index ${a}`)}return{id:e,type:"image",imageIds:o,initialImageIdIndex:s,acquisitionOrientation:t.acquisitionOrientation,imageData:r.imageData,imageVolume:i,reference:r.reference,renderMode:t.renderMode,useWorldCoordinateImageData:r.useWorldCoordinateImageData,volumeId:n}}let i=r.image&&r.image.imageId===r.imageIds[n]?r.image:await qI(r.imageIds[n]);return{id:e,type:"image",imageIds:r.imageIds,image:i,imageData:r.imageData,initialImageIdIndex:a,acquisitionOrientation:t.acquisitionOrientation,reference:r.reference,renderMode:t.renderMode,useWorldCoordinateImageData:r.useWorldCoordinateImageData,volumeId:t.volumeId}}getDataSet(e){var t;let r,n=H0(r=HK(e))?{imageIds:r}:HJ(r)?"kind"in r&&r.kind&&"planar"!==r.kind?void 0:r:void 0;if((t=n)&&"object"==typeof t&&Array.isArray(t.imageIds)&&0!==t.imageIds.length&&(void 0===t.initialImageIdIndex||"number"==typeof t.initialImageIdIndex)&&(void 0===t.volumeId||"string"==typeof t.volumeId))return n}}function erF(e,t){var r,n;let a=(r=e.reference,n=e.volumeId||t.referencedIdFallback,r?"segmentation"===r.kind?{reference:r,referencedId:r.labelmapId??r.representationUID??r.segmentationId,...r.representationUID?{representationUID:r.representationUID}:{}}:{reference:r,referencedId:function(e){switch(e.kind){case"data":return e.dataId;case"image":return e.imageId;case"volume":return e.volumeId;case"geometry":return e.geometryId;case"segmentation":return e.labelmapId??e.representationUID??e.segmentationId}}(r)}:n?{referencedId:n}:{}),i=t.actor,o=t.mapper??("function"==typeof i.getMapper?i.getMapper():void 0);return{uid:t.uid,actor:i,actorMapper:{actor:i,mapper:o,renderMode:t.renderMode},...a}}let erB=new Set(["fit","fitAspect","fitWidth","fitHeight","absolute"]);function erj(e){return"number"==typeof e&&Number.isFinite(e)?Math.max(e,.001):1}function erW(e){if(Array.isArray(e))return[erj(e[0]),erj(e[1])];let t=erj(e);return[t,t]}function erU(e){return erB.has(e||"")?e:"fit"}function erz(e){let[t,r]=erW(e);return t/r}function erH(e){return{tlhc:{x:1,y:1},brhc:{x:Math.max(e.columns,1),y:Math.max(e.rows,1)},rowPixelSpacing:e.rowPixelSpacing??1,columnPixelSpacing:e.columnPixelSpacing??1,presentationSizeMode:"NONE"}}function erG(e,t={}){Bh(e.viewport.element,NH.STACK_NEW_IMAGE,{image:t.image,imageId:t.imageId??t.image?.imageId,imageIdIndex:t.imageIdIndex,viewportId:e.viewportId,renderingEngineId:e.renderingEngineId})}function erq(e,t){let r=t.camera?.orientation;(!r||r===NQ.ACQUISITION||void 0!==t.acquisitionOrientation&&r===t.acquisitionOrientation)&&"number"==typeof t.imageIdIndex&&t.imageIds[t.imageIdIndex]?erG(e,{imageId:t.imageIds[t.imageIdIndex],imageIdIndex:t.imageIdIndex}):erG(e),"number"==typeof t.imageIdIndex&&Bh(e.viewport.element,NH.VOLUME_NEW_IMAGE,{imageIndex:t.imageIdIndex,numberOfSlices:t.maxImageIdIndex+1,viewportId:e.viewportId,renderingEngineId:e.renderingEngineId})}function er$(e){let{canvas:t,renderer:r,canvasPos:n}=e,a=erY(r.getActiveCamera()),i=window.devicePixelRatio||1,{width:o,height:s}=t,l=[n[0]*i,n[1]*i],[u,d,c,h]=r.getViewport(),p=[u+l[0]/o*(c-u),d+(1-l[1]/s)*(h-d),0],m=r.normalizedDisplayToProjection(p[0],p[1],p[2]),f=r.projectionToView(m[0],m[1],m[2],o/s),g=r.viewToWorld(f[0],f[1],f[2]);return a(),[g[0],g[1],g[2]]}function erK(e){let{canvas:t,renderer:r,worldPos:n}=e,a=erY(r.getActiveCamera()),i=window.devicePixelRatio||1,{width:o,height:s}=t,l=r.worldToView(n[0],n[1],n[2]),u=r.viewToProjection(l[0],l[1],l[2],o/s),d=r.projectionToNormalizedDisplay(u[0],u[1],u[2]),[c,h,p,m]=r.getViewport(),f=(d[0]-c)/(p-c)*o,g=(1-(d[1]-h)/(m-h))*s;return a(),[f/i,g/i]}function erY(e){if(e.setIsPerformingCoordinateTransformation)return e.setIsPerformingCoordinateTransformation(!0),()=>{e.setIsPerformingCoordinateTransformation?.(!1)};let t=e.getClippingRange(),r=e.getDistance();return e.setClippingRange(r,r+.1),()=>{e.setClippingRange(t[0],t[1])}}function erZ(e){let t=Lv.vec3.normalize(Lv.vec3.create(),e.viewUp),r=Lv.vec3.normalize(Lv.vec3.create(),e.viewPlaneNormal),n=Lv.vec3.cross(Lv.vec3.create(),t,r);return Lv.vec3.length(n)||(n=Lv.vec3.fromValues(1,0,0)),{right:Lv.vec3.normalize(Lv.vec3.create(),n),viewPlaneNormal:r,viewUp:t}}function erX(e){let{camera:t,canvasWidth:r,canvasHeight:n,canvasPos:a}=e,i=Math.max(r,1),o=Math.max(n,1),{right:s,viewUp:l}=erZ(t),u=2*Math.max(t.parallelScale,.001),d=i/o*u*(1/erz(t.presentationScale)),c=(a[0]/i-.5)*d,h=(.5-a[1]/o)*u,p=[...t.focalPoint];return Lv.vec3.scaleAndAdd(p,p,s,c),Lv.vec3.scaleAndAdd(p,p,l,h),p}function erJ(e){let{camera:t,canvasWidth:r,canvasHeight:n,worldPos:a}=e,i=Math.max(r,1),o=Math.max(n,1),{right:s,viewUp:l}=erZ(t),u=2*Math.max(t.parallelScale,.001),d=i/o*u*(1/erz(t.presentationScale)),c=Lv.vec3.subtract(Lv.vec3.create(),a,t.focalPoint);return[(Lv.vec3.dot(c,s)/d+.5)*i,(.5-Lv.vec3.dot(c,l)/u)*o]}function erQ(e){let t="u"<typeof window?1:window.devicePixelRatio||1;return{canvasWidth:e.width/t,canvasHeight:e.height/t}}function er0(e){let{canvasHeight:t,canvasWidth:r,columnPixelSpacing:n,columns:a,rowPixelSpacing:i,rows:o}=e;return .5*Math.max(Math.max(o,1)*(i||1),Math.max(a,1)*(n||1)/(Math.max(r,1)/Math.max(t,1)))}function er1(e,t){let r=t.map(t=>Math.abs(Lv.vec3.dot(e,t))),n=Math.max(...r);if(!(n<.995))return r.indexOf(n)}function er2(e){return e?[e[0],e[1],e[2]]:void 0}function er5(e=0){return(e%360+360)%360}function er3(e){let{rotation:t=0,viewPlaneNormal:r,viewUp:n}=e,a=er5(t);if(0===a)return[...n];let i=Lv.mat4.fromRotation(Lv.mat4.create(),a*Math.PI/180,r);return Lv.vec3.transformMat4(Lv.vec3.create(),n,i)}function er4(e){let{flipHorizontal:t,flipVertical:r,viewPlaneNormal:n,viewUp:a}=e;return{viewPlaneNormal:!!t!=!!r?Lv.vec3.negate(Lv.vec3.create(),n):[...n],viewUp:r?Lv.vec3.negate(Lv.vec3.create(),a):[...a]}}function er8(e){return Math.max(e||0,1)}function er6(e,t){let r=Lv.vec3.normalize(Lv.vec3.create(),e);return!t||Number.isFinite(r[0])&&Number.isFinite(r[1])&&Number.isFinite(r[2])&&0!==Lv.vec3.length(r)?r:Lv.vec3.clone(t)}function er9(e){var t,r;let n,a,i,{sliceBasis:o,camera:s,canvasHeight:l,canvasWidth:u}=e,d=erW(s?.scale),c=er5(s?.rotation??0),h=Lv.vec2.clone(s?.anchorCanvas??[.5,.5]),p=er8(u),m=er8(l),f=er6(o.viewPlaneNormal,[0,0,1]),g=er6(er3({rotation:c,viewPlaneNormal:f,viewUp:o.viewUp}),[0,-1,0]),{viewPlaneNormal:y,viewUp:v}=er4({flipHorizontal:s?.flipHorizontal,flipVertical:s?.flipVertical,viewPlaneNormal:f,viewUp:g}),b=Lv.vec3.cross(Lv.vec3.create(),v,y);b=Lv.vec3.length(b)?Lv.vec3.normalize(Lv.vec3.create(),b):[1,0,0];let w=s?.anchorWorld?(t=s.anchorWorld,r=o.sliceCenterWorld,n=er6(f,[0,0,1]),a=Lv.vec3.subtract(Lv.vec3.create(),t,r),i=Lv.vec3.dot(a,n),Lv.vec3.scaleAndAdd(Lv.vec3.create(),t,n,-i)):o.sliceCenterWorld,[x,C]=d,k=2*(o.fitParallelScale/C),M=function(e){let{canvasHeight:t,canvasWidth:r,camera:n,scale:a,sliceBasis:i}=e,o=n?.displayArea;if(!o)return;let s=er8(r),l=er8(t),[u,d]=function(e){let{canvasHeight:t,canvasWidth:r,sliceBasis:n}=e,a=er8(r),i=er8(t),o=2*Math.max(n.fitParallelScale,.001);return[Math.max(n.sliceWidthWorld,.001)/Math.max(a/i*o,.001)*a,Math.max(n.sliceHeightWorld,.001)/Math.max(o,.001)*i]}({canvasHeight:t,canvasWidth:r,sliceBasis:i}),c=[...a];if("SCALE"===o.type&&void 0!==o.scale)c=erW(o.scale);else if(o.imageArea){let[e,t]=o.imageArea,r=s/Math.max(Math.max(Math.abs(e),.001)*u,.001),i=l/Math.max(Math.max(Math.abs(t),.001)*d,.001),h=erU(o.scaleMode??n?.scaleMode);if("absolute"===h)c=[r*a[0],i*a[1]];else{let e="fitWidth"===h?r:"fitHeight"===h?i:Math.min(r,i);c=[e*a[0],e*a[1]]}}let h=[0,0];if(o.imageCanvasPoint){let{imagePoint:e,canvasPoint:t=e||[.5,.5]}=o.imageCanvasPoint,[r,n]=t,[a,i]=e||t;h=[c[0]*u*(.5-a)+s*(r-.5),c[1]*d*(.5-i)+l*(n-.5)]}return{pan:h,scale:c,zoom:c[1]}}({sliceBasis:o,camera:s,canvasWidth:u,canvasHeight:l,scale:d}),S=Lv.vec3.subtract(Lv.vec3.create(),o.sliceCenterWorld,w),E=[Lv.vec3.dot(S,b)*p/(C/x*(p/m*k)),-Lv.vec3.dot(S,v)*m/k],T=[(h[0]-.5)*p,(h[1]-.5)*m];return{pan:M?.pan??[E[0]+T[0],E[1]+T[1]],flipHorizontal:s?.flipHorizontal===!0,flipVertical:s?.flipVertical===!0,scale:M?.scale??d,zoom:M?.zoom??d[1],rotation:c}}function er7(e){let{renderer:t,activeSourceICamera:r}=e;if(!r?.focalPoint||!r.position||!r.viewPlaneNormal||!r.viewUp||"number"!=typeof r.parallelScale)return;let n=t.getActiveCamera();return n.setParallelProjection(!0),n.setDirectionOfProjection(-r.viewPlaneNormal[0],-r.viewPlaneNormal[1],-r.viewPlaneNormal[2]),n.setParallelScale(r.parallelScale),n.setFocalPoint(...r.focalPoint),n.setPosition(...r.position),n.setViewUp(...r.viewUp),r}function ene(e){let{actor:t,activeSourceICamera:r}=e;t?.setUserMatrix?.(function(e){let t,r,n,a=Lv.mat4.create();if(!e?.focalPoint||!e.viewPlaneNormal||!e.viewUp)return a;let[i,o]=erW(e.presentationScale),s=Math.max(i/o,.001);if(1e-6>Math.abs(s-1))return a;let l=(t=er6(e.viewUp,[0,-1,0]),r=er6(e.viewPlaneNormal,[0,0,1]),n=Lv.vec3.cross(Lv.vec3.create(),t,r),1e-6>Lv.vec3.length(n)?[1,0,0]:Lv.vec3.normalize(Lv.vec3.create(),n)),u=s-1,[d,c,h]=l,p=[1+u*d*d,u*d*c,u*d*h,u*c*d,1+u*c*c,u*c*h,u*h*d,u*h*c,1+u*h*h],[m,f,g]=e.focalPoint,y=[p[0]*m+p[3]*f+p[6]*g,p[1]*m+p[4]*f+p[7]*g,p[2]*m+p[5]*f+p[8]*g];return a[0]=p[0],a[1]=p[1],a[2]=p[2],a[4]=p[3],a[5]=p[4],a[6]=p[5],a[8]=p[6],a[9]=p[7],a[10]=p[8],a[12]=m-y[0],a[13]=f-y[1],a[14]=g-y[2],a}(r))}function ent(e){if(e)return{lower:e.lower,upper:e.upper}}function enr(e){return!!(e&&"object"==typeof e&&"viewPlaneNormal"in e)}function enn(e,t){let[r,n,a]=e||[],i=Math.hypot(r,n,a);if(!Number.isFinite(r)||!Number.isFinite(n)||!Number.isFinite(a)||i<1e-6)throw Error(`[PlanarViewport] Invalid orientation vector ${t}. Expected a finite non-zero Point3.`);return[r/i,n/i,a/i]}function ena(e){if(!enr(e))return e;let t={viewPlaneNormal:enn(e.viewPlaneNormal,"viewPlaneNormal")};if(e.viewUp&&(t.viewUp=enn(e.viewUp,"viewUp"),Math.abs(t.viewPlaneNormal[0]*t.viewUp[0]+t.viewPlaneNormal[1]*t.viewUp[1]+t.viewPlaneNormal[2]*t.viewUp[2])>.001))throw Error("[PlanarViewport] Invalid orientation vectors. viewPlaneNormal and viewUp must be orthogonal.");return t}function eni(e){var t;if(!e)return;let r={};void 0!==e.name&&(r.name=e.name);let n=Array.isArray(t=e.opacity)?t.map(({opacity:e,value:t})=>({opacity:e,value:t})):t;return void 0!==n&&(r.opacity=n),void 0!==e.threshold&&(r.threshold=e.threshold),r}function eno(e={}){let t=Object.assign({},e);return e.voiRange&&(t.voiRange=ent(e.voiRange)),e.colormap&&(t.colormap=eni(e.colormap)),void 0!==e.orientation&&(t.orientation=ena(e.orientation)),t}function ens(e={},t={}){let r=eno(e),n=eno(t),a=Object.assign({},r);return Object.assign(a,n),n.colormap&&(a.colormap=function(e,t){if(!t)return eni(e);if(void 0!==t.name)return eni(t);let r=eni(e)||{},n=eni(t);return n&&Object.assign(r,n),r}(r.colormap,n.colormap)),a}function enl(e={}){let t={};return e.colormap&&(t.colormap=eni(e.colormap)),e.voiRange&&(t.voiRange=ent(e.voiRange)),void 0!==e.invert&&(t.invert=e.invert),void 0!==e.blendMode&&(t.blendMode=e.blendMode),void 0!==e.interpolationType&&(t.interpolationType=e.interpolationType),void 0!==e.opacity&&(t.opacity=e.opacity),void 0!==e.slabThickness&&(t.slabThickness=e.slabThickness),void 0!==e.visible&&(t.visible=e.visible),t}function enu(e){let{viewPlaneNormal:t,viewUp:r}=Ka(e);return{viewPlaneNormal:t,viewUp:r}}function end(e){let{imageVolume:t,orientation:r}=e;if(!r)return;if(r===NQ.ACQUISITION)return enu(t);if(enr(r))return{viewPlaneNormal:[...r.viewPlaneNormal],viewUp:[...r.viewUp||enu(t).viewUp]};let n=F_[r];if(n)return{viewPlaneNormal:[...n.viewPlaneNormal],viewUp:[...n.viewUp]}}function enc(){return{fitParallelScale:1,sliceWidthWorld:2,sliceHeightWorld:2}}function enh(e){return 1e-6>Math.abs(Math.abs(e)-1)}function enp(e,t){return enh(e[t])||enh(e[t+1])||enh(e[t+2])}function enm(e){var t;let r=e.imageData;if(!r)return[];if(enp(t=r.getDirection(),0)&&enp(t,3)&&enp(t,6)){let e=r.extentToBounds(r.getExtent());return[[e[0],e[2],e[4]],[e[0],e[2],e[5]],[e[0],e[3],e[4]],[e[0],e[3],e[5]],[e[1],e[2],e[4]],[e[1],e[2],e[5]],[e[1],e[3],e[4]],[e[1],e[3],e[5]]]}let[n,a,i]=r.getDimensions();return[[0,0,0],[n-1,0,0],[0,a-1,0],[n-1,a-1,0],[0,0,i-1],[n-1,0,i-1],[0,a-1,i-1],[n-1,a-1,i-1]].map(e=>r.indexToWorld(e))}function enf(e,t){let r=e?.imageData;if(!r)return;let n=r.getDimensions(),a=e.flatImageIdIndexToImageIdIndex,i=Math.min(Math.max(0,"function"==typeof a?a.call(e,Math.max(0,t)):t),n[2]-1);return r.indexToWorld([(n[0]-1)/2,(n[1]-1)/2,i])}function eng(e){let{viewState:t,fallbackImageIdIndex:r}=e,n=t?.slice;if(n?.kind!=="volumePoint"){if(n?.kind==="stackIndex")return n.imageIdIndex;if(t?.orientation===NQ.ACQUISITION)return r}}function eny(e){let{imageVolume:t,orientation:r}=e,n=end({imageVolume:t,orientation:r}),a=n?function(e){let{imageVolume:t,viewPlaneNormal:r,viewUp:n,canvasWidth:a,canvasHeight:i}=e,o=function(e){let{dimensions:t,direction:r,spacing:n,viewPlaneNormal:a,viewUp:i}=e,o=Array.from(r),s=o.slice(0,3),l=o.slice(3,6),u=o.slice(6,9),d=Lv.vec3.normalize(Lv.vec3.create(),i),c=Lv.vec3.normalize(Lv.vec3.create(),a),h=Lv.vec3.normalize(Lv.vec3.create(),Lv.vec3.cross(Lv.vec3.create(),d,c)),p=[s,l,u],m=er1(h,p),f=er1(Lv.vec3.negate(Lv.vec3.create(),d),p);if(void 0!==m&&void 0!==f&&m!==f)return{columns:t[m],rows:t[f],columnPixelSpacing:n[m],rowPixelSpacing:n[f]}}({dimensions:t.dimensions,direction:t.direction,spacing:t.spacing,viewPlaneNormal:r,viewUp:n});if(o){let e=Math.max(o.columns,1),t=Math.max(o.rows,1),r=e*o.columnPixelSpacing,n=t*o.rowPixelSpacing;return{fitParallelScale:er0({canvasHeight:er8(i),canvasWidth:er8(a),columnPixelSpacing:o.columnPixelSpacing,columns:e,rowPixelSpacing:o.rowPixelSpacing,rows:t}),sliceWidthWorld:r,sliceHeightWorld:n}}let s=t.imageData;if(s){let{widthWorld:e,heightWorld:t}=GA(s,r,n);if(e>0&&t>0)return{fitParallelScale:function(e){let{canvasHeight:t,canvasWidth:r,heightWorld:n,widthWorld:a}=e,i=er8(r),o=er8(t),s=Math.max(n,1e-6),l=Math.max(a,1e-6)/s/(i/o);return l<1?s/2:s*l/2}({canvasHeight:i,canvasWidth:a,widthWorld:e,heightWorld:t}),sliceWidthWorld:e,sliceHeightWorld:t}}return enc()}({...e,viewPlaneNormal:n.viewPlaneNormal,viewUp:n.viewUp}):enc();return function(e){let{center:t,fitParallelScale:r,imageIdIndex:n,imageVolume:a,orientation:i,sliceHeightWorld:o,sliceWidthWorld:s,viewState:l}=e,u=end({imageVolume:a,orientation:i});if(!u)return{sliceBasis:{sliceCenterWorld:[0,0,0],viewPlaneNormal:[0,0,1],viewUp:[0,-1,0],fitParallelScale:1,sliceWidthWorld:2,sliceHeightWorld:2,cameraDistance:1},currentImageIdIndex:0,maxImageIdIndex:0};let d=er6(u.viewPlaneNormal),c=er6(u.viewUp),{max:h,maxImageIdIndex:p,min:m,spacingInNormalDirection:f}=function(e){let{imageVolume:t,viewPlaneNormal:r}=e,n=enm(t),a=Math.max(qG(t,r),1e-6);if(!n.length)return{min:0,max:0,spacingInNormalDirection:a,maxImageIdIndex:0};let i=n.map(e=>Lv.vec3.dot(e,r)),o=Math.min(...i),s=Math.max(...i),l=Math.max(0,Math.round((s-o)/a));return{min:o,max:s,spacingInNormalDirection:a,maxImageIdIndex:l}}({imageVolume:a,viewPlaneNormal:d}),g=Lv.vec3.dot(t,d),y=l?.slice?.kind==="volumePoint"?l.slice.sliceWorldPoint:void 0,v=Math.min(h,Math.max(m,y?Lv.vec3.dot(y,d):g)),b=function(e){let{centerProjection:t,imageIdIndex:r,max:n,maxImageIdIndex:a,min:i}=e;return"number"!=typeof r?function(e){let{centerProjection:t,min:r,max:n,maxImageIdIndex:a}=e,i=n-r;return i>0&&0!==a?Math.round((t-r)/i*a):0}({centerProjection:t,min:i,max:n,maxImageIdIndex:a}):Math.min(Math.max(0,r),a)}({imageIdIndex:n,centerProjection:v,min:m,max:h,maxImageIdIndex:p}),w="number"==typeof n?Math.min(h,m+b*f):v;return{sliceBasis:{sliceCenterWorld:Lv.vec3.scaleAndAdd(Lv.vec3.create(),t,d,w-g),viewPlaneNormal:d,viewUp:c,fitParallelScale:r,sliceWidthWorld:s,sliceHeightWorld:o,cameraDistance:Math.max(h-m,f,1)},currentImageIdIndex:b,maxImageIdIndex:p}}({...e,center:function(e,t){let r=e.imageData;if(r){let e=r.getDimensions(),n=t?GL(e,r.getDirection(),t):e.map(e=>(e-1)/2);return r.indexToWorld(n)}let n=enm(e);if(!n.length)return[0,0,0];let a=Lv.vec3.create();for(let e of n)Lv.vec3.add(a,a,e);return Lv.vec3.scale(a,a,1/n.length)}(t,n?.viewPlaneNormal),...a})}function env(e){return eny(e)}function enb(e=NK.LINEAR){return e===NK.NEAREST}function enw(){return{slice:{kind:"stackIndex",imageIdIndex:0},orientation:NQ.ACQUISITION,flipHorizontal:!1,flipVertical:!1,anchorCanvas:[.5,.5],scale:[1,1],scaleMode:"fit",rotation:0}}function enx(e){return{...e.slice?{slice:function(e){if(e)return"stackIndex"===e.kind?{kind:"stackIndex",imageIdIndex:Math.max(0,Math.round(e.imageIdIndex))}:{kind:"volumePoint",sliceWorldPoint:[...e.sliceWorldPoint]}}(e.slice)}:{},orientation:ena(e.orientation)??NQ.ACQUISITION,flipHorizontal:!0===e.flipHorizontal,flipVertical:!0===e.flipVertical,anchorCanvas:e.anchorCanvas?[...e.anchorCanvas]:[.5,.5],scale:erW(e.scale),scaleMode:erU(e.displayArea?.scaleMode??e.scaleMode),rotation:er5(e.rotation??0),...e.displayArea?{displayArea:G_(e.displayArea)}:{},...e.anchorWorld?{anchorWorld:[...e.anchorWorld]}:{}}}function enC(e){let{fallbackImageIdIndex:t,viewState:r}=e;return r?.slice?.kind==="stackIndex"?r.slice.imageIdIndex:t}function enk(e){return[e[0],e[1]]}class enM extends erA{get pan(){return enk(this.getPresentation().pan)}get zoom(){return this.getPresentation().zoom}get scale(){return enk(this.getPresentation().scale)}get rotation(){return this.getPresentation().rotation}getSliceBasis(){return this.cachedSliceBasis||=this.buildSliceBasis(),this.cachedSliceBasis}canvasToWorld(e){return erX({camera:this.requireResolvedICamera(),canvasHeight:this.state.canvasHeight,canvasPos:e,canvasWidth:this.state.canvasWidth})}worldToCanvas(e){return erJ({camera:this.requireResolvedICamera(),canvasHeight:this.state.canvasHeight,canvasWidth:this.state.canvasWidth,worldPos:e})}getFrameOfReferenceUID(){return this.state.frameOfReferenceUID}withZoom(e,t){return this.withScale(e,t)}withScale(e,t){let r=erW(e);if(!t)return this.cloneWithViewState({...this.state.viewState,displayArea:void 0,scale:r,scaleMode:"fit"});let n=this.canvasToWorld(t);return this.cloneWithViewState({...this.state.viewState,anchorCanvas:[t[0]/Math.max(this.state.canvasWidth,1),t[1]/Math.max(this.state.canvasHeight,1)],anchorWorld:n,displayArea:void 0,scale:r,scaleMode:"fit"})}withPan(e){let t=this.pan,[r,n]=this.state.viewState.anchorCanvas??[.5,.5];return this.cloneWithViewState({...this.state.viewState,anchorCanvas:[r+(e[0]-t[0])/Math.max(this.state.canvasWidth,1),n+(e[1]-t[1])/Math.max(this.state.canvasHeight,1)],displayArea:void 0})}flipHorizontal(){return this.cloneWithViewState({...this.state.viewState,flipHorizontal:!this.state.viewState.flipHorizontal})}flipVertical(){return this.cloneWithViewState({...this.state.viewState,flipVertical:!this.state.viewState.flipVertical})}indexToWorld(e){}buildICamera(){return function(e){let{sliceBasis:t,camera:r,canvasHeight:n,canvasWidth:a}=e,i=er9({sliceBasis:t,camera:r,canvasWidth:a,canvasHeight:n}),{deltaWorld:o,parallelScale:s,presentationScale:l,viewPlaneNormal:u,viewUp:d}=function(e){let{sliceBasis:t,canvasWidth:r,canvasHeight:n,flipHorizontal:a,flipVertical:i,pan:o=[0,0],rotation:s,scale:l=[1,1]}=e,u=er6(t.viewPlaneNormal),d=er6(er3({rotation:s,viewPlaneNormal:u,viewUp:t.viewUp})),{viewPlaneNormal:c,viewUp:h}=er4({flipHorizontal:a,flipVertical:i,viewPlaneNormal:u,viewUp:d}),p=Lv.vec3.cross(Lv.vec3.create(),h,c);0===Lv.vec3.length(p)&&(p=Lv.vec3.fromValues(1,0,0)),p=Lv.vec3.normalize(Lv.vec3.create(),p);let[m,f]=erW(l),[g,y]=o,v=t.fitParallelScale/f,b=er8(r),w=er8(n),x=2*v,C=Lv.vec3.create();return Lv.vec3.scaleAndAdd(C,C,p,f/m*(b/w*x)*g/b),Lv.vec3.scaleAndAdd(C,C,h,-y*x/w),{deltaWorld:C,parallelScale:v,presentationScale:[m,f],viewPlaneNormal:c,viewUp:h}}({sliceBasis:t,canvasWidth:a,canvasHeight:n,flipHorizontal:i.flipHorizontal,flipVertical:i.flipVertical,pan:i.pan,rotation:i.rotation,scale:i.scale}),c=Lv.vec3.subtract(Lv.vec3.create(),t.sliceCenterWorld,o);return{focalPoint:c,parallelProjection:!0,parallelScale:s,presentationScale:l,scale:i.scale,scaleMode:erU(r?.scaleMode),position:Lv.vec3.scaleAndAdd(Lv.vec3.create(),c,u,t.cameraDistance),flipHorizontal:i.flipHorizontal,flipVertical:i.flipVertical,viewPlaneNormal:u,viewUp:d}}({camera:this.state.viewState,canvasHeight:this.state.canvasHeight,canvasWidth:this.state.canvasWidth,sliceBasis:this.getSliceBasis()})}getPresentation(){return this.cachedPresentation||=er9({camera:this.state.viewState,canvasHeight:this.state.canvasHeight,canvasWidth:this.state.canvasWidth,sliceBasis:this.getSliceBasis()}),this.cachedPresentation}requireResolvedICamera(){let e=this.toICamera();if(!e.focalPoint||"number"!=typeof e.parallelScale||!e.viewPlaneNormal||!e.viewUp)throw Error("[PlanarResolvedView] Failed to compute planar viewState");return{focalPoint:er2(e.focalPoint),parallelScale:e.parallelScale,presentationScale:e.presentationScale?enk(e.presentationScale):void 0,viewPlaneNormal:er2(e.viewPlaneNormal),viewUp:er2(e.viewUp)}}createViewStateState(e){return{...this.state,viewState:enx(e)}}}class enS extends enM{constructor(e){super({...e,viewState:enx(e.viewState||enw())})}buildSliceBasis(){let e={canvasHeight:this.state.canvasHeight,canvasWidth:this.state.canvasWidth,image:this.state.image};return this.state.usePixelGridCenter,function(e){let{image:t}=e,{dimensions:r,spacing:n}=HH(t);return function(e){let{canvasHeight:t,canvasWidth:r,columnOffset:n,columnsForFit:a,image:i,rowOffset:o,rowsForFit:s}=e,{direction:l,origin:u}=HH(i),d=l.slice(0,3),c=l.slice(3,6),h=l.slice(6,9).map(e=>-e),p=c.map(e=>-e),m=[...u],f=Math.max(a,1)*(i.columnPixelSpacing||1),g=Math.max(s,1)*(i.rowPixelSpacing||1);return Lv.vec3.scaleAndAdd(m,m,d,o),Lv.vec3.scaleAndAdd(m,m,c,n),{sliceCenterWorld:m,viewPlaneNormal:Lv.vec3.clone(h),viewUp:p,fitParallelScale:er0({canvasHeight:t,canvasWidth:r,columnPixelSpacing:i.columnPixelSpacing||1,columns:a,rowPixelSpacing:i.rowPixelSpacing||1,rows:s}),sliceWidthWorld:f,sliceHeightWorld:g,cameraDistance:1}}({...e,rowOffset:(r[0]-1)/2*n[0],columnOffset:(r[1]-1)/2*n[1],rowsForFit:Math.max(t.rows,1),columnsForFit:Math.max(t.columns,1)})}(e)}cloneWithViewState(e){return new enS(this.createViewStateState(e))}}class enE extends enM{constructor(e){const{sliceBasis:t,...r}=e;super({...r,viewState:enx(e.viewState||enw())}),this.cachedSliceBasis=t}indexToWorld(e){return this.state.imageVolume.imageData?.indexToWorld(e)}buildSliceBasis(){return(this.state.usePixelGridCenter?env:eny)({viewState:this.state.viewState,canvasHeight:this.state.canvasHeight,canvasWidth:this.state.canvasWidth,imageIdIndex:eng({viewState:this.state.viewState,fallbackImageIdIndex:this.state.currentImageIdIndex}),imageVolume:this.state.imageVolume,orientation:this.state.viewState.orientation}).sliceBasis}cloneWithViewState(e){return new enE(this.createViewStateState(e))}}function enT(e){return e.currentImageIdIndex}function enI(e){let{renderContext:t,rendering:r}=e;if(r.renderMode===eyK.CPU_IMAGE||r.renderMode===eyK.CPU_VOLUME){if(!t.cpu)throw Error("[PlanarResolvedView] CPU render paths require a CPU canvas context");return erQ(t.cpu.canvas)}if(!t.vtk)throw Error("[PlanarResolvedView] VTK render paths require a VTK canvas context");return{canvasHeight:t.vtk.canvas.clientHeight||t.vtk.canvas.height,canvasWidth:t.vtk.canvas.clientWidth||t.vtk.canvas.width}}function enP(e){let{data:t,frameOfReferenceUID:r,imageIds:n,canvasDimensions:a,renderContext:i,rendering:o,sliceIndex:s}=e;if(!o)return;let{canvasHeight:l,canvasWidth:u}=a??enI({renderContext:i,rendering:o}),d=e.viewState;if(o.renderMode===eyK.CPU_IMAGE||o.renderMode===eyK.VTK_IMAGE){let e=(o.renderMode===eyK.CPU_IMAGE?o.enabledElement?.image:o.currentImage)||t?.image;if(!e)return;let a=enC({fallbackImageIdIndex:enT(o),viewState:d}),i=n?.length??t?.imageIds.length,s="number"==typeof i&&i>0?i-1:Math.max(a,enT(o),0);return new enS({viewState:d,canvasHeight:l,canvasWidth:u,currentImageIdIndex:a,frameOfReferenceUID:r,image:e,maxImageIdIndex:s,usePixelGridCenter:o.renderMode===eyK.CPU_IMAGE})}if(o.renderMode===eyK.CPU_VOLUME||o.renderMode===eyK.VTK_VOLUME_SLICE){let e="number"==typeof s?{...d,slice:{kind:"stackIndex",imageIdIndex:s}}:d,t=enb(o.dataPresentation?.interpolationType)?env:eny,n="number"==typeof s?s:eng({viewState:e,fallbackImageIdIndex:o.currentImageIdIndex}),{currentImageIdIndex:a,maxImageIdIndex:i,sliceBasis:c}=t({viewState:e,canvasHeight:l,canvasWidth:u,imageIdIndex:n,imageVolume:o.imageVolume,orientation:e.orientation});return new enE({viewState:e,canvasHeight:l,canvasWidth:u,currentImageIdIndex:a,frameOfReferenceUID:r,imageVolume:o.imageVolume,maxImageIdIndex:i,sliceBasis:c,usePixelGridCenter:o.renderMode===eyK.CPU_VOLUME&&enb(o.dataPresentation?.interpolationType)})}}function en_(e){let{projection:t,rendering:r,viewState:n}=e;return t?t.currentImageIdIndex:r.renderMode===eyK.CPU_IMAGE||r.renderMode===eyK.VTK_IMAGE?enC({fallbackImageIdIndex:r.currentImageIdIndex,viewState:n}):r.currentImageIdIndex}function enD(e){let t=e.view.activeSourceICamera;if(t?.focalPoint&&"number"==typeof t.parallelScale&&t.viewPlaneNormal&&t.viewUp)return t}function enO(e){let t=enD(e.ctx);if(!t)return[0,0,0];let{canvasWidth:r,canvasHeight:n}=erQ(e.canvas);return erX({camera:t,canvasWidth:r,canvasHeight:n,canvasPos:e.canvasPos})}function enA(e){let t=enD(e.ctx);if(!t)return[0,0];let{canvasWidth:r,canvasHeight:n}=erQ(e.canvas);return erJ({camera:t,canvasWidth:r,canvasHeight:n,worldPos:e.worldPos})}function enR(e){var t;let{ctx:r,data:n,dataId:a,frameOfReferenceUID:i,imageIds:o,rendering:s,sliceIndex:l,viewState:u={}}=e,d=enP({viewState:u,data:n,frameOfReferenceUID:i,imageIds:o,rendering:s,renderContext:r,sliceIndex:l});if(!d)return;let c=d.toICamera(),h=r.viewport.isCurrentDataId(a);return h&&(r.view.activeSourceICamera=c),{activeSourceICamera:h?c:enD(r)||c,currentImageIdIndex:d.state.currentImageIdIndex,isSourceBinding:h,maxImageIdIndex:d.state.maxImageIdIndex,presentation:{pan:(t=d).pan,zoom:t.zoom,scale:t.scale,rotation:t.rotation,flipHorizontal:t.state.viewState.flipHorizontal??!1,flipVertical:t.state.viewState.flipVertical??!1},resolvedICamera:c,resolvedView:d}}class enL{async addData(e,t,r){let n;if(!t.image)throw Error("[PlanarViewport] CPU rendering requires an image");e.display.activateRenderMode(eyK.CPU_IMAGE),enj(t.image);let a=new etQ({getImageData:()=>this.getImageData(n)},t.image);a.setVisibility(!0);let i=qR(e.cpu.canvas,t.image,enW(t.image));i.displayedArea=erH(t.image);let o={canvas:e.cpu.canvas,image:t.image,renderingTools:{},viewport:i};return qN(o,!0),o.transform=Gj(o),n={renderMode:eyK.CPU_IMAGE,actorEntryUID:F2(),enabledElement:o,compatibilityActor:a,currentImageIdIndex:t.initialImageIdIndex??0,defaultVOIRange:qi(t.image),dataPresentation:void 0,fitScale:enF(o.viewport.scale),loadRequestId:0,renderingInvalidated:!0},erG(e,{image:t.image,imageIdIndex:t.initialImageIdIndex??0}),{rendering:n,updateDataPresentation:e=>{this.updateDataPresentation(n,e)},applyViewState:r=>{this.applyViewState(e,n,t.id,r,t.imageIds)},getFrameOfReferenceUID:()=>this.getFrameOfReferenceUID(n),getActorEntry:e=>erF(e,{actor:n.compatibilityActor,mapper:n.compatibilityActor.getMapper(),renderMode:eyK.CPU_IMAGE,uid:n.actorEntryUID,referencedIdFallback:n.enabledElement.image?.imageId}),getImageData:()=>this.getImageData(n),render:()=>{this.render(e,n,t.id)},resize:()=>{this.resize(e,n,t.id)},removeData:()=>{this.removeData(e,n)}}}updateDataPresentation(e,t){e.dataPresentation=t,enV(e,e.dataPresentation)}applyViewState(e,t,r,n,a){let i=t.enabledElement.image;e.display.activateRenderMode(eyK.CPU_IMAGE);let o=i?enR({ctx:e,dataId:r,imageIds:a,rendering:t,viewState:n}):void 0,s=en_({projection:o,rendering:t,viewState:n});if(o&&enB(t,o.presentation,o.resolvedICamera),s===(t.lastRequestedImageIdIndex??t.currentImageIdIndex)||s<0||s>=a.length)return;t.lastRequestedImageIdIndex=s;let l=++t.loadRequestId;qI(a[s]).then(n=>{l===t.loadRequestId&&enz({ctx:e,dataId:r,image:n,imageIdIndex:s,props:t.dataPresentation,rendering:t})})}canvasToWorld(e,t,r){return enO({canvas:e.cpu.canvas,canvasPos:r,ctx:e})}worldToCanvas(e,t,r){return enA({canvas:e.cpu.canvas,ctx:e,worldPos:r})}getFrameOfReferenceUID(e){let t=e.enabledElement.image?.imageId,r=t?HB(FC.IMAGE_PLANE,t):void 0;return r?.frameOfReferenceUID}getImageData(e){let t=e.enabledElement.image;if(t)return enU(t,this.getFrameOfReferenceUID(e))}render(e,t,r){e.viewport.isCurrentDataId(r)&&(function(e){let{enabledElement:t,renderingInvalidated:r}=e;t.image&&(qr(t,r),e.renderingInvalidated=!1)}(t),function(e){for(let t of e.viewport.getOverlayActors())t.actorMapper?.renderMode===eyK.CPU_IMAGE&&t.actor.render(void 0,e.cpu.context)}(e),e.display.markRendered(),Bh(e.viewport.element,NH.IMAGE_RENDERED,{element:e.viewport.element,viewportId:e.viewportId,renderingEngineId:e.renderingEngineId,viewportStatus:Fw.RENDERED}))}resize(e,t,r){qN(t.enabledElement,!0);let n=t.enabledElement.image,a=e.viewport.getViewState();if(!n)return;let i=enR({ctx:e,dataId:r,rendering:t,viewState:a});t.fitScale=enF(qR(t.enabledElement.canvas,n,enW(n)).scale),t.renderingInvalidated=!0,i&&enB(t,i.presentation,i.resolvedICamera)}removeData(e,t){let{enabledElement:r}=t;e.cpu.context.setTransform(1,0,0,1,0,0),e.cpu.context.clearRect(0,0,e.cpu.canvas.width,e.cpu.canvas.height),r.image=void 0}}class enN{constructor(){this.id="planar:cpu-image-slice",this.type=Nq.PLANAR_NEXT}matches(e,t){return"image"===e.type&&t.renderMode===eyK.CPU_IMAGE}createRenderPath(){return new enL}selectContext(e){return{viewportId:e.viewportId,renderingEngineId:e.renderingEngineId,type:e.type,viewport:e.viewport,renderPath:e.renderPath,view:e.view,display:e.display,cpu:e.cpu}}}function enV(e,t){let{enabledElement:r,defaultVOIRange:n}=e,{viewport:a}=r,i=r.canvas,o=t?.voiRange??n;if(i.style.display=t?.visible===!1?"none":"",i.style.opacity=String(t?.opacity??1),a.colormap=G5(t?.colormap,r.image?.colormap),a.invert=t?.invert??!1,o){let{windowCenter:e,windowWidth:t}=Gm(o.lower,o.upper);a.voi={windowCenter:e,windowWidth:t,voiLUTFunction:r.image?.voiLUTFunction}}e.renderingInvalidated=!0,t?.interpolationType!==void 0&&(a.pixelReplication=t.interpolationType!==NK.LINEAR)}function enF(e){return Array.isArray(e)?e[1]:e??1}function enB(e,t,r){let{enabledElement:n,fitScale:a}=e,i=n.viewport,o=t?.pan??[0,0],s=Math.max(t?.zoom??1,.001);i.hflip=t?.flipHorizontal??!1,i.vflip=t?.flipVertical??!1,i.rotation=t?.rotation??0,i.scale="number"==typeof r?.parallelScale?function(e){let{canvas:t,columnPixelSpacing:r,parallelScale:n,presentationScale:a,rowPixelSpacing:i}=e,o=Math.max((n??1)*2,1e-6),s=t.height/o,l=erz(a);if(Math.abs(l-1)>1e-6){let e=Math.max(t.height,1),n=Math.max(t.width,1);return[Math.max(n*(r||1)/Math.max(n/e*o*(1/l),1e-6),1e-6),Math.max(e*(i||1)/o,1e-6)]}return Math.max(Math.min(i||1,r||1)*s,1e-6)}({canvas:n.canvas,parallelScale:r.parallelScale,presentationScale:r.presentationScale,columnPixelSpacing:n.image?.columnPixelSpacing||1,rowPixelSpacing:n.image?.rowPixelSpacing||1}):[a*(t?.scale?.[0]??s),a*s],i.parallelScale=r?.parallelScale,i.translation=r?.focalPoint?function(e,t){let{image:r,viewport:n}=e,a=n.translation||{x:0,y:0};if(!r)return a;n.translation={x:0,y:0},e.transform=Gj(e);let i=qP(e,[e.canvas.width/2,e.canvas.height/2]),o=function(e,t){let{image:r,viewport:n}=e;if(!r)return[0,0];let{spacing:a,direction:i,origin:o}=HH(r),s=i.slice(0,3),l=i.slice(3,6),u=n.displayedArea,d=(u?.tlhc.x??1)-1,c=(u?.tlhc.y??1)-1,h=Lv.vec3.subtract(Lv.vec3.create(),t,o);return[Lv.vec3.dot(h,s)/a[0]+.5-d,Lv.vec3.dot(h,l)/a[1]+.5-c]}(e,t),s=qH({x:o[0]-i[0],y:o[1]-i[1]},n);return n.translation=a,{x:-s.x,y:-s.y}}(n,r.focalPoint):function(e,t){let{viewport:r}=e,n=r.translation||{x:0,y:0};r.translation={x:0,y:0};let a=Gj(e).transformPoint([0,0]);r.translation={x:1,y:0};let i=Gj(e).transformPoint([0,0]);r.translation={x:0,y:1};let o=Gj(e).transformPoint([0,0]);r.translation=n;let s=[i[0]-a[0],i[1]-a[1]],l=[o[0]-a[0],o[1]-a[1]],u=s[0]*l[1]-s[1]*l[0];return 1e-6>Math.abs(u)?{x:0,y:0}:{x:(t[0]*l[1]-t[1]*l[0])/u,y:(s[0]*t[1]-s[1]*t[0])/u}}(n,o),n.transform=Gj(n)}function enj(e){e.isPreScaled=e.preScale?.scaled}function enW(e){return e.preScale?.scalingParameters?.modality||ee.get(FC.GENERAL_SERIES,e.imageId)?.modality}function enU(e,t){let r=HH(e),{dimensions:n,direction:a,modality:i,origin:o,spacing:s}=r,l=HB("calibratedPixelSpacing",e.imageId),u=l?{...r.calibration,...l}:r.calibration,d=a.slice(0,3),c=a.slice(3,6),h=e.voxelManager?.getScalarData()||e.getPixelData?.();return{dimensions:n,spacing:s,origin:o,direction:a,metadata:{Modality:i,FrameOfReferenceUID:t},imageData:{getDirection:()=>a,getDimensions:()=>n,getScalarData:()=>h,getSpacing:()=>s,worldToIndex:e=>{let t=Lv.vec3.subtract(Lv.vec3.create(),e,o);return[Lv.vec3.dot(t,d)/s[0],Lv.vec3.dot(t,c)/s[1],0]},indexToWorld:e=>{let t=[...o];return Lv.vec3.scaleAndAdd(t,t,d,e[0]*s[0]),Lv.vec3.scaleAndAdd(t,t,c,e[1]*s[1]),t}},scalarData:h,scaling:e.scaling,hasPixelSpacing:!!(e.rowPixelSpacing||e.columnPixelSpacing),calibration:u,preScale:e.preScale,voxelManager:e.voxelManager}}async function enz(e){let{ctx:t,dataId:r,image:n,imageIdIndex:a,props:i,rendering:o}=e,s=o.enabledElement;enj(n);let l=t.viewport.getViewState(),u=qR(t.cpu.canvas,n,enW(n)),d=s.viewport;u.displayedArea=erH(n),s.image=n,s.viewport={...u,hflip:d?.hflip??u.hflip,invert:u.invert,pixelReplication:d?.pixelReplication??u.pixelReplication,rotation:d?.rotation??u.rotation,translation:d?.translation??u.translation,vflip:d?.vflip??u.vflip},o.currentImageIdIndex=a,o.defaultVOIRange=qi(n),o.fitScale=enF(u.scale),o.renderingInvalidated=!0,t.viewport.invalidateResolvedView(),o.compatibilityActor.getMapper().getInputData().setDerivedImage(n),enV(o,i);let c=enR({ctx:t,dataId:r,rendering:o,viewState:l});c&&enB(o,c.presentation,c.resolvedICamera),erG(t,{image:n,imageIdIndex:a}),t.display.renderNow()}function enH(e,t){return Lv.vec3.dot(e,t)}function enG(e,t,r=.995){let n=e.direction.slice(0,3),a=e.direction.slice(3,6),i=e.direction.slice(6,9),o=[enH(t,n),enH(t,a),enH(t,i)],s=o.map(e=>Math.abs(e)),l=Math.max(...s),u=s.indexOf(l);if(!(l<r)&&!s.filter((e,t)=>t!==u).some(e=>e>1-r))return{axis:u,sign:o[u]>=0?1:-1}}function enq(e,t){if(!(t<-.5001)&&!(t>e-.5+1e-4))return Math.min(e-1,Math.max(0,t))}function en$(e){return Math.floor(e+.5-1e-6)}function enK(e,t,r=1e-6){for(let n=0;n<3;n++)if(n!==t&&Math.abs(e[n])>r)return!1;return!0}function enY(e){return Math.round(1e6*e)}class enZ{constructor(){this.completeScalarDataCache=new WeakMap,this.axisAlignedGeometryCache=new WeakMap}clearCachedVoxelManager(e){this.completeScalarDataCache.delete(e),this.axisAlignedGeometryCache.delete(e)}getCompleteScalarDataArray(e){let t=this.completeScalarDataCache.get(e);if(t)return t;let r=e.getCompleteScalarDataArray?.();if(r)return r.length&&this.completeScalarDataCache.set(e,r),r}sampleAxisAligned(e){let{volume:t,voxelManager:r,pixelData:n,width:a,height:i,rowStartIndex:o,xStepIndexDelta:s,yStepIndexDelta:l,right:u,up:d,normal:c,interpolationType:h,numberOfComponents:p,fallbackMin:m,fallbackMax:f}=e;if(1!==p||!r.getCompleteScalarDataArray)return;let g=enG(t,c),y=enG(t,u),v=enG(t,d);if(!g||!y||!v||g.axis===y.axis||g.axis===v.axis||y.axis===v.axis)return;let b=this.getCompleteScalarDataArray(r);if(!b?.length)return;let w=n instanceof Float32Array||n instanceof Float64Array,x=this.trySampleFixedAxisAligned({volume:t,voxelManager:r,scalarData:b,pixelData:n,width:a,height:i,rowStartIndex:o,xStepIndexDelta:s,yStepIndexDelta:l,rightAxis:y,upAxis:v,normalAxis:g,interpolationType:h,fallbackMin:m,fallbackMax:f,preserveFloatScalarSamples:w});return x||this.sampleGeneralAxisAligned({scalarData:b,pixelData:n,dimensions:t.dimensions,width:a,height:i,rowStartIndex:o,xStepIndexDelta:s,yStepIndexDelta:l,interpolationType:h,fallbackMin:m,fallbackMax:f,preserveFloatScalarSamples:w})}sampleGeneralAxisAligned(e){let{scalarData:t,pixelData:r,dimensions:n,width:a,height:i,rowStartIndex:o,xStepIndexDelta:s,yStepIndexDelta:l,interpolationType:u,fallbackMin:d,fallbackMax:c,preserveFloatScalarSamples:h}=e,p=1/0,m=-1/0,f=0,g=o[0],y=o[1],v=o[2];for(let e=0;e<i;e++){let e=g,i=y,o=v;for(let l=0;l<a;l++){let a=this.sampleScalarDataAtContinuousCoordinates(t,n,e,i,o,u),l=Number.isFinite(a)?h?Math.min(c,Math.max(d,a)):Math.round(Math.min(c,Math.max(d,a))):d;r[f++]=l,p=Math.min(p,l),m=Math.max(m,l),e+=s[0],i+=s[1],o+=s[2]}g+=l[0],y+=l[1],v+=l[2]}return{min:p,max:m}}trySampleFixedAxisAligned(e){let{volume:t,voxelManager:r,scalarData:n,pixelData:a,width:i,height:o,rowStartIndex:s,xStepIndexDelta:l,yStepIndexDelta:u,rightAxis:d,upAxis:c,normalAxis:h,interpolationType:p,fallbackMin:m,fallbackMax:f,preserveFloatScalarSamples:g}=e;if(!enK(l,d.axis)||!enK(u,c.axis))return;let y=this.getOrCreateAxisAlignedGeometry({voxelManager:r,dimensions:t.dimensions,width:i,height:o,rowStartIndex:s,xStepIndexDelta:l,yStepIndexDelta:u,rightAxis:d,upAxis:c,normalAxis:h,interpolationType:p}),v=this.createSingleAxisInterpolation(t.dimensions[h.axis],s[h.axis],p);return p===NK.NEAREST?this.sampleNearestFixedAxis({scalarData:n,pixelData:a,dimensions:t.dimensions,width:i,height:o,rightAxis:d.axis,upAxis:c.axis,normalAxis:h.axis,geometry:y,normal:v,fallbackMin:m,fallbackMax:f,preserveFloatScalarSamples:g}):this.sampleLinearFixedAxis({scalarData:n,pixelData:a,dimensions:t.dimensions,width:i,height:o,rightAxis:d.axis,upAxis:c.axis,normalAxis:h.axis,geometry:y,normal:v,fallbackMin:m,fallbackMax:f,preserveFloatScalarSamples:g})}getOrCreateAxisAlignedGeometry(e){let{voxelManager:t,dimensions:r,width:n,height:a,rowStartIndex:i,xStepIndexDelta:o,yStepIndexDelta:s,rightAxis:l,upAxis:u,normalAxis:d,interpolationType:c}=e,h=[c,r[0],r[1],r[2],n,a,l.axis,u.axis,d.axis,enY(i[l.axis]),enY(i[u.axis]),enY(o[l.axis]),enY(s[u.axis])].join(":"),p=this.axisAlignedGeometryCache.get(t);p||(p=new Map,this.axisAlignedGeometryCache.set(t,p));let m=p.get(h);if(m)return m;let f={key:h,columns:this.createAxisInterpolationPlan(r[l.axis],i[l.axis],o[l.axis],n,c),rows:this.createAxisInterpolationPlan(r[u.axis],i[u.axis],s[u.axis],a,c)};if(p.set(h,f),p.size>8){let e=p.keys().next().value;p.delete(e)}return f}createAxisInterpolationPlan(e,t,r,n,a){let i=new Int32Array(n),o=new Int32Array(n),s=new Float64Array(n),l=new Uint8Array(n),u=t;for(let t=0;t<n;t++){let n=this.createSingleAxisInterpolation(e,u,a);i[t]=n.lower,o[t]=n.upper,s[t]=n.fraction,l[t]=+!!n.valid,u+=r}return{lower:i,upper:o,fraction:s,valid:l}}createSingleAxisInterpolation(e,t,r){let n=enq(e,t);if(void 0===n)return{lower:-1,upper:-1,fraction:0,valid:!1};if(r===NK.NEAREST){let e=en$(n);return{lower:e,upper:e,fraction:0,valid:!0}}let a=Math.floor(n),i=Math.min(a+1,e-1);return{lower:a,upper:i,fraction:n-a,valid:!0}}sampleNearestFixedAxis(e){let{scalarData:t,pixelData:r,dimensions:n,width:a,height:i,rightAxis:o,upAxis:s,normalAxis:l,geometry:u,normal:d,fallbackMin:c,fallbackMax:h,preserveFloatScalarSamples:p}=e,m=[1,n[0],n[0]*n[1]],f=u.columns,g=u.rows,y=1/0,v=-1/0,b=0;if(!d.valid)return r.fill(c),{min:c,max:c};let w=d.lower*m[l];for(let e=0;e<i;e++){if(!g.valid[e]){for(let e=0;e<a;e++)r[b++]=c;y=Math.min(y,c),v=Math.max(v,c);continue}let n=g.lower[e]*m[s]+w;for(let e=0;e<a;e++){let a=c;if(f.valid[e]){let r=Number(t[n+f.lower[e]*m[o]]);a=Number.isFinite(r)?p?Math.min(h,Math.max(c,r)):Math.round(Math.min(h,Math.max(c,r))):c}r[b++]=a,y=Math.min(y,a),v=Math.max(v,a)}}return{min:y,max:v}}sampleLinearFixedAxis(e){let{scalarData:t,pixelData:r,dimensions:n,width:a,height:i,rightAxis:o,upAxis:s,normalAxis:l,geometry:u,normal:d,fallbackMin:c,fallbackMax:h,preserveFloatScalarSamples:p}=e,m=[1,n[0],n[0]*n[1]],f=u.columns,g=u.rows,y=d.lower*m[l],v=d.upper*m[l],b=d.fraction,w=1-b,x=1/0,C=-1/0,k=0;if(!d.valid)return r.fill(c),{min:c,max:c};for(let e=0;e<i;e++){if(!g.valid[e]){for(let e=0;e<a;e++)r[k++]=c;x=Math.min(x,c),C=Math.max(C,c);continue}let n=g.lower[e]*m[s],i=g.upper[e]*m[s],l=g.fraction[e],u=1-l;for(let e=0;e<a;e++){let a=c;if(f.valid[e]){let r=f.lower[e]*m[o],s=f.upper[e]*m[o],d=f.fraction[e],g=1-d,x=((Number(t[r+n+y])*g+Number(t[s+n+y])*d)*u+(Number(t[r+i+y])*g+Number(t[s+i+y])*d)*l)*w+((Number(t[r+n+v])*g+Number(t[s+n+v])*d)*u+(Number(t[r+i+v])*g+Number(t[s+i+v])*d)*l)*b;a=Number.isFinite(x)?p?Math.min(h,Math.max(c,x)):Math.round(Math.min(h,Math.max(c,x))):c}r[k++]=a,x=Math.min(x,a),C=Math.max(C,a)}}return{min:x,max:C}}sampleScalarDataAtContinuousCoordinates(e,t,r,n,a,i){let o=enq(t[0],r),s=enq(t[1],n),l=enq(t[2],a);return void 0===o||void 0===s||void 0===l?NaN:i===NK.NEAREST?this.sampleNearestScalarDataAtContinuousCoordinates(e,t,o,s,l):this.sampleLinearScalarDataAtContinuousCoordinates(e,t,o,s,l)}sampleNearestScalarDataAtContinuousCoordinates(e,t,r,n,a){let i=en$(r),o=en$(n),s=en$(a);return Number(e[i+o*t[0]+s*t[0]*t[1]])}sampleLinearScalarDataAtContinuousCoordinates(e,t,r,n,a){let i=t[0],o=t[1],s=t[2],l=i*o,u=Math.floor(r),d=Math.floor(n),c=Math.floor(a),h=Math.min(u+1,i-1),p=Math.min(d+1,o-1),m=Math.min(c+1,s-1),f=r-u,g=n-d,y=a-c,v=1-f,b=1-g,w=d*i,x=p*i,C=c*l,k=m*l;return((Number(e[u+w+C])*v+Number(e[h+w+C])*f)*b+(Number(e[u+x+C])*v+Number(e[h+x+C])*f)*g)*(1-y)+((Number(e[u+w+k])*v+Number(e[h+w+k])*f)*b+(Number(e[u+x+k])*v+Number(e[h+x+k])*f)*g)*y}}function enX(e,t){return Lv.vec3.dot(e,t)}function enJ(e,t,r,n){if(!Number.isFinite(e))return t;let a=e;return a<t?a=t:a>r&&(a=r),n?Math.round(a):a}function enQ(e,t){t<e.min&&(e.min=t),t>e.max&&(e.max=t)}function en0(e,t){return Lv.vec3.subtract([0,0,0],e,t)}function en1(e,t,r=1e-4){return Lv.vec3.distance(e,t)<=r}function en2(e,t){let r=e.direction.slice(0,3),n=e.direction.slice(3,6),a=e.direction.slice(6,9);return[enX(t,r)/e.spacing[0],enX(t,n)/e.spacing[1],enX(t,a)/e.spacing[2]]}class en5{constructor(){this.sampleSequence=0,this.scalarViewportSampler=new enZ,this.scalarRangeCache=new WeakMap,this.sliceArrayPool=new Map}clearCachedScalarRange(e){this.scalarRangeCache.delete(e),this.scalarViewportSampler.clearCachedVoxelManager(e)}releaseSampledSliceState(e){let t=e?.image.getPixelData?.();!t||!ArrayBuffer.isView(t)||t instanceof DataView||this.releaseSliceArray(t)}clearSliceArrayPool(){this.sliceArrayPool.clear()}getScalarDataRange(e){let t;t=this.scalarViewportSampler.getCompleteScalarDataArray(e)??e.getScalarData();let r=1/0,n=-1/0;for(let e=0;e<t.length;e++){let a=Number(t[e]);Number.isFinite(a)&&(a<r&&(r=a),a>n&&(n=a))}return{min:r,max:n}}getCameraBasis(e){let t=Lv.vec3.normalize(Lv.vec3.create(),e.viewPlaneNormal),r=Lv.vec3.normalize(Lv.vec3.create(),e.viewUp),n=Lv.vec3.cross(Lv.vec3.create(),r,t);Lv.vec3.length(n)<FP&&(n=Lv.vec3.cross(Lv.vec3.create(),[0,1,0],t)),n=Lv.vec3.normalize(Lv.vec3.create(),n);let a=Lv.vec3.normalize(Lv.vec3.create(),Lv.vec3.cross(Lv.vec3.create(),t,n));return{right:n,up:a,normal:t}}getResolvedVOIRange(e,t,r){return e&&Number.isFinite(e.lower)&&Number.isFinite(e.upper)&&e.upper>e.lower?e:r>t?{lower:t,upper:r}:{lower:t,upper:t+1}}getFallbackStoredRange(e){let t=e.voxelManager,[r,n]=t.getRange(),a=Number.isFinite(r)?Math.floor(r):0,i=Number.isFinite(n)?Math.ceil(n):a+1;if(i<=a){let e=this.scalarRangeCache.get(t);if(e)return e;let r=this.getScalarDataRange(t);Number.isFinite(r.min)&&(a=Math.floor(r.min)),Number.isFinite(r.max)&&(i=Math.ceil(r.max))}i<=a&&(i=a+1);let o={min:a,max:i};return this.scalarRangeCache.set(t,o),o}createOrUpdateEnabledElement(e){let{enabledElement:t,canvas:r,image:n,modality:a}=e;return t?(t.canvas=r,t.image=n,t.options||={},t.options.transparentBackground=!0,t.viewport=qR(r,n,a),t):{canvas:r,image:n,options:{transparentBackground:!0},renderingTools:{},viewport:qR(r,n,a)}}updateCPUFallbackViewport(e){let{enabledElement:t,sampledSliceState:r,camera:n,dataPresentation:a,defaultVOIRange:i}=e,o=r.image.rowPixelSpacing||1,s=r.image.columnPixelSpacing||1,l=en0(n.focalPoint,r.translationReferenceFocalPoint),u=t.viewport,d=this.getResolvedVOIRange(a?.voiRange??i,r.image.minPixelValue??0,r.image.maxPixelValue??1);u.translation={x:-enX(l,r.right)/s,y:enX(l,r.up)/o},u.scale=function(e){let{camera:t,canvas:r,columnPixelSpacing:n,rowPixelSpacing:a}=e,i=Math.max((t.parallelScale??1)*2,FP),o=r.height/i,s=erz(t.presentationScale);if(Math.abs(s-1)>FP){let e=Math.max(r.height,1),t=Math.max(r.width,1);return[Math.max(t*(n||1)/Math.max(t/e*i*(1/s),FP),FP),Math.max(e*(a||1)/i,FP)]}return Math.max(Math.min(a||1,n||1)*o,FP)}({canvas:t.canvas,camera:n,columnPixelSpacing:s,rowPixelSpacing:o}),u.parallelScale=n.parallelScale,u.colormap=G5(a?.colormap,r.image.colormap,{voiRange:d}),u.invert=a?.invert??!1,u.pixelReplication=a?.interpolationType===NK.NEAREST,u.voi={windowCenter:(d.lower+d.upper)/2,windowWidth:Math.max(d.upper-d.lower,1),voiLUTFunction:N2.LINEAR}}needsResample(e){return"reuse"!==this.getResampleDecision(e)}getResampleDecision(e){let{sampledSliceState:t,width:r,height:n,camera:a,dataPresentation:i,deferViewportResample:o=!1}=e;if(!t)return"resample";let{right:s,up:l,normal:u}=this.getCameraBasis(a),d=a.focalPoint,c=i?.interpolationType??NK.LINEAR,h=en0(d,t.focalPoint),p=Math.abs(enX(h,t.normal)),m=t.image.columnPixelSpacing||1,f=t.image.rowPixelSpacing||1,g=Math.abs(enX(h,t.right))/m,y=Math.abs(enX(h,t.up))/f,v=t.samplingMode??"viewport",b=Math.max(a.parallelScale??1,FP),w=erz(a.presentationScale),x=!en1(t.right,s)||!en1(t.up,l)||!en1(t.normal,u),C=p>.5*t.spacingInNormalDirection;return t.canvasWidth!==r||t.canvasHeight!==n||t.interpolationType!==c||x||C?"resample":"source-slice"!==v&&(Math.abs(t.parallelScale-b)>1e-4*b||Math.abs(t.scaleRatio-w)>1e-4||g>.001||y>.001||g>.35*t.image.width||y>.35*t.image.height)?o?"defer":"resample":"reuse"}sampleSliceImage(e){let{volume:t,width:r,height:n,camera:a,dataPresentation:i,useViewportSamplingForLinear:o=!0}=e,{right:s,up:l,normal:u}=this.getCameraBasis(a),d=this.getVolumeNumberOfComponents(t),c=1===d&&this.shouldPreserveFloatScalarSamples(t),h=i?.interpolationType??NK.LINEAR,p=h!==NK.NEAREST&&o?void 0:this.trySampleOrthogonalSliceFromVoxelManager(t,a,s,l,u,h),m=this.getFallbackStoredRange(t),f=this.getResolvedVOIRange(i?.voiRange,m.min,m.max);if(p)return{image:this.createSliceImage(t,p.scalarData,p.width,p.height,p.columnPixelSpacing,p.rowPixelSpacing,p.minPixelValue,p.maxPixelValue,p.numberOfComponents,f),samplingMode:"source-slice",focalPoint:Lv.vec3.clone(a.focalPoint),translationReferenceFocalPoint:Lv.vec3.clone(p.translationReferenceFocalPoint),right:Lv.vec3.clone(s),up:Lv.vec3.clone(l),normal:Lv.vec3.clone(u),spacingInNormalDirection:Math.max(qG(t,u),FP),canvasWidth:r,canvasHeight:n,parallelScale:Math.max(a.parallelScale??1,FP),scaleRatio:erz(a.presentationScale),interpolationType:h};let g=t.voxelManager;if(!g)throw Error("[PlanarViewport] CPU volume rendering requires voxels");let y=Math.max(a.parallelScale??1,FP),v=2*y,b=r/Math.max(n,1)*v*(1/erz(a.presentationScale)),w=b/Math.max(r,1),x=v/Math.max(n,1),C=-b/2+w/2,k=v/2-x/2,M=qk.worldToIndexContinuous(t,a.focalPoint),S=en2(t,[s[0]*C+l[0]*k,s[1]*C+l[1]*k,s[2]*C+l[2]*k]),E=en2(t,[s[0]*w,s[1]*w,s[2]*w]),T=en2(t,[-l[0]*x,-l[1]*x,-l[2]*x]),I=this.getSliceArrayConstructor(t,m.min,m.max,d,c),P=this.acquireSliceArray(I,r*n*d),_=[M[0]+S[0],M[1]+S[1],M[2]+S[2]],D={min:1/0,max:-1/0},O=this.scalarViewportSampler.sampleAxisAligned({volume:t,voxelManager:g,pixelData:P,width:r,height:n,rowStartIndex:_,xStepIndexDelta:E,yStepIndexDelta:T,right:s,up:l,normal:u,interpolationType:h,numberOfComponents:d,fallbackMin:m.min,fallbackMax:m.max});if(O)D.min=O.min,D.max=O.max;else{let e=[..._];for(let a=0;a<n;a++){e[0]=_[0],e[1]=_[1],e[2]=_[2];for(let n=0;n<r;n++){let i=this.sampleVoxelAtContinuousIndex(g,t.dimensions,e,d,h);this.writeVoxelValue(P,a*r+n,i,d,m.min,m.max,D),e[0]+=E[0],e[1]+=E[1],e[2]+=E[2]}_[0]+=T[0],_[1]+=T[1],_[2]+=T[2]}}let A=Number.isFinite(D.min)?c?D.min:Math.floor(D.min):m.min,R=Number.isFinite(D.max)&&D.max>D.min?c?D.max:Math.ceil(D.max):Math.max(A+1,m.max);return{image:this.createSliceImage(t,P,r,n,b/Math.max(r,1),v/Math.max(n,1),A,R,d,f),samplingMode:"viewport",focalPoint:Lv.vec3.clone(a.focalPoint),translationReferenceFocalPoint:Lv.vec3.clone(a.focalPoint),right:Lv.vec3.clone(s),up:Lv.vec3.clone(l),normal:Lv.vec3.clone(u),spacingInNormalDirection:Math.max(qG(t,u),FP),canvasWidth:r,canvasHeight:n,parallelScale:y,scaleRatio:erz(a.presentationScale),interpolationType:h}}trySampleOrthogonalSliceFromVoxelManager(e,t,r,n,a,i){let o=e.voxelManager;if(!o)return;let s=enG(e,a),l=enG(e,r),u=enG(e,n);if(!s||!l||!u||s.axis===l.axis||s.axis===u.axis||l.axis===u.axis)return;let d=u.axis,c=-u.sign,h=l.sign,p=this.getVolumeNumberOfComponents(e),m=qk.worldToIndexContinuous(e,t.focalPoint)[s.axis],f=Math.round(m),g=e.dimensions[s.axis]-.5;if(m<-.5001||m>g+1e-4||i!==NK.NEAREST&&Math.abs(m-f)>1e-4)return;let y=i===NK.NEAREST?Math.min(e.dimensions[s.axis]-1,Math.max(0,en$(m))):f;if(y<0||y>=e.dimensions[s.axis])return;let v=[(e.dimensions[0]-1)/2,(e.dimensions[1]-1)/2,(e.dimensions[2]-1)/2],b=1===p&&this.shouldPreserveFloatScalarSamples(e);v[s.axis]=y;let w=function(e,t){let[r,n,a]=t,[i,o,s]=e.spacing,l=e.direction.slice(0,3),u=e.direction.slice(3,6),d=e.direction.slice(6,9),c=Lv.vec3.copy([0,0,0],e.origin);return Lv.vec3.scaleAndAdd(c,c,l,i*r),Lv.vec3.scaleAndAdd(c,c,u,o*n),Lv.vec3.scaleAndAdd(c,c,d,s*a),c}(e,v),x=e.dimensions[l.axis],C=e.dimensions[d],k=this.getFallbackStoredRange(e),M=this.getSliceArrayConstructor(e,k.min,k.max,p,b),S=this.acquireSliceArray(M,x*C*p),E={min:1/0,max:-1/0},T=[0,0,0];T[s.axis]=y;for(let e=0;e<C;e++){T[d]=c>0?e:C-1-e;for(let t=0;t<x;t++)T[l.axis]=h>0?t:x-1-t,this.writeVoxelValue(S,e*x+t,o.getAtIJK(T[0],T[1],T[2]),p,k.min,k.max,E)}return Number.isFinite(E.min)||(E.min=k.min),(!Number.isFinite(E.max)||E.max<=E.min)&&(E.max=Math.max(E.min+1,k.max)),{scalarData:S,width:x,height:C,columnPixelSpacing:e.spacing[l.axis],rowPixelSpacing:e.spacing[d],minPixelValue:b?E.min:Math.floor(E.min),maxPixelValue:b?E.max:Math.ceil(E.max),numberOfComponents:p,translationReferenceFocalPoint:w}}sampleVoxelAtContinuousIndex(e,t,r,n,a){let i=function(e,t){let r=[0,0,0];for(let n=0;n<3;n++){let a=enq(e[n],t[n]);if(void 0===a)return;r[n]=a}return r}(t,r);return i?n<2?qk.sampleAtContinuousIndex(e,t,i,a):a===NK.NEAREST?this.sampleNearestColorAtContinuousIndex(e,t,i,n):this.sampleLinearColorAtContinuousIndex(e,t,i,n):n<2?NaN:this.createDefaultColorSample(n)}sampleNearestColorAtContinuousIndex(e,t,r,n){let a=Math.floor(r[0]+.5-1e-6),i=Math.floor(r[1]+.5-1e-6),o=Math.floor(r[2]+.5-1e-6);return a<0||a>=t[0]||i<0||i>=t[1]||o<0||o>=t[2]?this.createDefaultColorSample(n):this.toColorSample(e.getAtIJK(a,i,o),n)}sampleLinearColorAtContinuousIndex(e,t,r,n){let[a,i,o]=r;if(a<0||a>t[0]-1||i<0||i>t[1]-1||o<0||o>t[2]-1)return this.createDefaultColorSample(n);let s=Math.floor(a),l=Math.floor(i),u=Math.floor(o),d=Math.min(s+1,t[0]-1),c=Math.min(l+1,t[1]-1),h=Math.min(u+1,t[2]-1),p=a-s,m=i-l,f=o-u,g=1-p,y=1-m,v=1-f,b=this.toColorSample(e.getAtIJK(s,l,u),n),w=this.toColorSample(e.getAtIJK(d,l,u),n),x=this.toColorSample(e.getAtIJK(s,c,u),n),C=this.toColorSample(e.getAtIJK(d,c,u),n),k=this.toColorSample(e.getAtIJK(s,l,h),n),M=this.toColorSample(e.getAtIJK(d,l,h),n),S=this.toColorSample(e.getAtIJK(s,c,h),n),E=this.toColorSample(e.getAtIJK(d,c,h),n),T=this.createDefaultColorSample(n);for(let e=0;e<n;e++){let t=b[e]*g+w[e]*p,r=x[e]*g+C[e]*p,n=k[e]*g+M[e]*p,a=S[e]*g+E[e]*p,i=t*y+r*m,o=n*y+a*m;T[e]=i*v+o*f}return T}toColorSample(e,t){if(Array.isArray(e))return Array.from({length:t},(t,r)=>Number(e[r]??0));let r=Number(e)||0;return Array.from({length:t},()=>r)}createDefaultColorSample(e){return Array.from({length:e},()=>0)}writeVoxelValue(e,t,r,n,a,i,o){if(n<2){let n=enJ(Number(r),a,i,!(e instanceof Float32Array||e instanceof Float64Array));e[t]=n,enQ(o,n);return}let s=this.toColorSample(r,n),l=t*n;for(let t=0;t<n;t++){let r=enJ(Number(s[t]),a,i,!0);e[l+t]=r,enQ(o,r)}}getVolumeNumberOfComponents(e){let t=e.imageData?.get("numberOfComponents");return Math.max(1,t?.numberOfComponents??e.voxelManager?.numberOfComponents??1)}getSliceArrayConstructor(e,t,r,n,a=!1){return n>1?e.voxelManager?.getConstructor()||Uint8Array:a?Float32Array:t>=0&&r<=65535?Uint16Array:t>=-32768&&r<=32767?Int16Array:Int32Array}acquireSliceArray(e,t){let r=this.getSliceArrayPoolKey(e,t),n=this.sliceArrayPool.get(r),a=n?.pop();return a||new e(t)}releaseSliceArray(e){let t=e.constructor,r=this.getSliceArrayPoolKey(t,e.length),n=this.sliceArrayPool.get(r);n||(n=[],this.sliceArrayPool.set(r,n)),n.length<1&&n.push(e)}getSliceArrayPoolKey(e,t){let r=e.name||"SliceArray";return`${r}:${t}`}createSliceImage(e,t,r,n,a,i,o,s,l,u){let d=u&&u.upper>u.lower?u:{lower:o,upper:s},c=Math.max(1,d.upper-d.lower),h=(d.lower+d.upper)/2,p=`cpuVolumeSlice:${e.volumeId}:${++this.sampleSequence}`,m=qk.createImageVoxelManager({width:r,height:n,scalarData:t,numberOfComponents:l,id:p});return{imageId:p,intercept:0,windowCenter:h,windowWidth:c,voiLUTFunction:N2.LINEAR,isPreScaled:e.isPreScaled,scaling:e.scaling,color:l>1,numberOfComponents:l,dataType:t.constructor.name,slope:1,minPixelValue:o,maxPixelValue:s,rows:n,columns:r,getCanvas:void 0,height:n,width:r,rgba:4===l,columnPixelSpacing:a,rowPixelSpacing:i,FrameOfReferenceUID:e.metadata?.FrameOfReferenceUID,invert:!1,photometricInterpretation:l>1?"RGB":void 0,getPixelData:()=>t,voxelManager:m,sizeInBytes:t.byteLength}}shouldPreserveFloatScalarSamples(e){return e.metadata?.Modality==="PT"}}class en3{constructor(){this.sampler=new en5}async addData(e,t,r){var n,a;let i,o,s,l,u,d,c,h,p,m;if(!t.imageVolume)throw Error("[PlanarViewport] CPU volume rendering requires a prepared image volume");let f=await etx(t.imageVolume),g=new etQ({getImageData:()=>this.getImageData(i)},t.imageVolume.imageIds?.length?{imageId:t.imageVolume.imageIds[0]}:{});g.setVisibility(!0),e.display.activateRenderMode(eyK.CPU_VOLUME);return i={renderMode:eyK.CPU_VOLUME,actorEntryUID:F2(),compatibilityActor:g,imageVolume:t.imageVolume,imageIds:t.imageIds,acquisitionOrientation:t.acquisitionOrientation,layerCanvas:G$(null,e.cpu.canvas.width,e.cpu.canvas.height),currentImageIdIndex:t.initialImageIdIndex??0,maxImageIdIndex:t.imageIds.length-1,defaultVOIRange:f,renderingInvalidated:!0,compositeActor:t.reference?.kind==="segmentation",removeStreamingSubscriptions:(l=!0,u=-1/0,d=Number.isFinite(p=BM.rendering?.planar?.cpuVolume?.volumeModifiedThrottleMs)?Math.max(0,Math.trunc(p)):0,c=()=>{l&&(u=performance.now(),e.display.renderNow())},n=t.volumeId,a=r=>{if(!l)return;let n=r===NH.IMAGE_VOLUME_LOADING_COMPLETED,a=t.imageVolume.voxelManager;a?.invalidateCache?.(),a&&this.sampler.clearCachedScalarRange(a),en4(i),i.pendingVolumeLoadCallback=!1,this.releaseSampledSliceState(i),i.renderingInvalidated=!0,r===NH.IMAGE_VOLUME_MODIFIED?(()=>{if(d<=0)return c();if(void 0!==s)return;let e=Math.max(0,d-(performance.now()-u));0===e?c():s=window.setTimeout(()=>{s=void 0,c()},e)})():(void 0!==s&&(window.clearTimeout(s),s=void 0),e.display.renderNow()),!l||n&&(e.display.setNeedsRender(),o=window.requestAnimationFrame(()=>{o=void 0,l&&(n&&(a?.invalidateCache?.(),a&&this.sampler.clearCachedScalarRange(a),this.releaseSampledSliceState(i),i.renderingInvalidated=!0),e.display.renderNow())}))},m=e=>{let t=e.detail;t?.volumeId===n&&a(e.type)},Bc.addEventListener(NH.IMAGE_VOLUME_MODIFIED,m),Bc.addEventListener(NH.IMAGE_VOLUME_LOADING_COMPLETED,m),h=()=>{Bc.removeEventListener(NH.IMAGE_VOLUME_MODIFIED,m),Bc.removeEventListener(NH.IMAGE_VOLUME_LOADING_COMPLETED,m)},()=>{l=!1,i.pendingVolumeLoadCallback=!1,this.releaseSampledSliceState(i),void 0!==o&&(window.cancelAnimationFrame(o),o=void 0),void 0!==s&&(window.clearTimeout(s),s=void 0),h()})},erq(e,{camera:e.viewport.getViewState(),acquisitionOrientation:i.acquisitionOrientation,imageIds:i.imageIds,imageIdIndex:i.currentImageIdIndex,maxImageIdIndex:i.maxImageIdIndex}),{rendering:i,updateDataPresentation:r=>{this.updateDataPresentation(e,i,t.id,r)},applyViewState:r=>{this.applyViewState(e,i,t.id,r)},getFrameOfReferenceUID:()=>this.getFrameOfReferenceUID(i),getActorEntry:e=>erF(e,{actor:i.compatibilityActor,renderMode:eyK.CPU_VOLUME,uid:i.actorEntryUID,referencedIdFallback:e.volumeId}),getImageData:()=>this.getImageData(i),render:()=>{this.render(e,i)},resize:()=>{this.resize(e,i,t.id)},removeData:()=>{this.removeData(e,i)}}}updateDataPresentation(e,t,r,n){let a=t.dataPresentation?.interpolationType,{slabThickness:i,...o}=n||{};(t.dataPresentation=Object.keys(o).length?o:void 0,a!==t.dataPresentation?.interpolationType)?this.syncRenderCamera(e,t,r,e.viewport.getViewState()):t.renderingInvalidated=!0}applyViewState(e,t,r,n){e.display.activateRenderMode(eyK.CPU_VOLUME),this.syncRenderCamera(e,t,r,n)}canvasToWorld(e,t,r){return enO({canvas:e.cpu.canvas,canvasPos:r,ctx:e})}worldToCanvas(e,t,r){return enA({canvas:e.cpu.canvas,ctx:e,worldPos:r})}getFrameOfReferenceUID(e){return e.imageVolume.metadata?.FrameOfReferenceUID}getImageData(e){var t=e.imageVolume;let r=t.imageData;return r?{dimensions:r.getDimensions(),spacing:r.getSpacing(),origin:r.getOrigin(),direction:r.getDirection(),imageData:r,metadata:{Modality:t.metadata?.Modality,FrameOfReferenceUID:t.metadata?.FrameOfReferenceUID},get scalarData(){return t.voxelManager?.getScalarData()},scaling:t.scaling,hasPixelSpacing:t.hasPixelSpacing,voxelManager:t.voxelManager}:void 0}render(e,t){var r,n,a,i,o,s,l;let u;if(e.display.activateRenderMode(eyK.CPU_VOLUME),e.cpu.canvas.style.display="",e.cpu.canvas.style.opacity="1",t.dataPresentation?.visible===!1)return void en6(e);let d=t.imageVolume.loadStatus,c=!!(((r=t.imageVolume).framesLoaded??0)>0||(r.framesProcessed??0)>0||(r.framesUpdated??0)>0);if(!(void 0===d||!0===d.loaded||c)){t.pendingVolumeLoadCallback||(t.pendingVolumeLoadCallback=!0,t.imageVolume.load()),e.display.setNeedsRender();return}if(t.pendingVolumeLoadCallback=!1,!e.cpu.canvas.width||!e.cpu.canvas.height)return;let h=enD(e);if(!h)return;en6(e),n=t.layerCanvas,a=e.cpu.canvas,(n.width!==a.width||n.height!==a.height)&&(n.width=a.width,n.height=a.height,1)&&(t.renderingInvalidated=!0);let p=BM.rendering?.planar?.cpuVolume?.useViewportSamplingForLinear===!0,m=t.forceHighQualityResample?"resample":this.sampler.getResampleDecision({sampledSliceState:t.sampledSliceState,width:e.cpu.canvas.width,height:e.cpu.canvas.height,camera:h,dataPresentation:t.dataPresentation,deferViewportResample:p}),f="resample"===m;"defer"===m?(i=e,en4(o=t),i.display.setNeedsRender(),o.deferredResampleTimeoutId=window.setTimeout(()=>{o.deferredResampleTimeoutId=void 0,o.forceHighQualityResample=!0,o.renderingInvalidated=!0,i.display.renderNow()},80)):en4(t);let g=t.sampledSliceState;f&&(this.releaseSampledSliceState(t),t.forceHighQualityResample=!1,g=t.sampledSliceState=this.sampler.sampleSliceImage({volume:t.imageVolume,width:e.cpu.canvas.width,height:e.cpu.canvas.height,camera:h,dataPresentation:t.dataPresentation,useViewportSamplingForLinear:p})),g&&(f&&(t.renderingInvalidated=!0),t.enabledElement=this.sampler.createOrUpdateEnabledElement({enabledElement:t.enabledElement,canvas:t.layerCanvas,image:g.image,modality:t.imageVolume.metadata?.Modality}),this.sampler.updateCPUFallbackViewport({enabledElement:t.enabledElement,sampledSliceState:g,camera:h,dataPresentation:t.dataPresentation,defaultVOIRange:t.defaultVOIRange}),t.defaultVOIRange||=this.sampler.getResolvedVOIRange(t.dataPresentation?.voiRange,g.image.minPixelValue??0,g.image.maxPixelValue??1),f&&t.compatibilityActor.getMapper().getInputData().setDerivedImage(g.image),t.compositeActor?function(e){let t=e.enabledElement;if(!t)return;let r=e.layerCanvas.getContext("2d");r&&(r.setTransform(1,0,0,1,0,0),r.clearRect(0,0,e.layerCanvas.width,e.layerCanvas.height),r.imageSmoothingEnabled=!t.viewport.pixelReplication,GW(t,r),e.compatibilityActor.render(void 0,r))}(t):qr(t.enabledElement,t.renderingInvalidated),t.renderingInvalidated=!1,s=e,l=t,(u=l.dataPresentation?.opacity??1)<=0||(s.cpu.context.save(),s.cpu.context.globalAlpha=u,s.cpu.context.drawImage(l.layerCanvas,0,0),s.cpu.context.restore()),e.display.markRendered(),Bh(e.viewport.element,NH.IMAGE_RENDERED,{element:e.viewport.element,viewportId:e.viewportId,renderingEngineId:e.renderingEngineId,viewportStatus:Fw.RENDERED}))}resize(e,t,r){this.syncRenderCamera(e,t,r,e.viewport.getViewState())}removeData(e,t){let{removeStreamingSubscriptions:r}=t;en4(t),r?.(),this.releaseSampledSliceState(t),this.sampler.clearSliceArrayPool?.()}syncRenderCamera(e,t,r,n){let a=enR({ctx:e,dataId:r,rendering:t,viewState:n});if(!a)return;let{currentImageIdIndex:i,maxImageIdIndex:o}=a,s=i!==t.currentImageIdIndex,l=o!==t.maxImageIdIndex;t.currentImageIdIndex=i,t.maxImageIdIndex=o,t.renderingInvalidated=!0,(s||l)&&e.viewport.invalidateResolvedView(),s&&erq(e,{camera:n,acquisitionOrientation:t.acquisitionOrientation,imageIds:t.imageIds,imageIdIndex:t.currentImageIdIndex,maxImageIdIndex:t.maxImageIdIndex})}releaseSampledSliceState(e){this.sampler.releaseSampledSliceState?.(e.sampledSliceState),e.sampledSliceState=void 0}}function en4(e){void 0!==e.deferredResampleTimeoutId&&(window.clearTimeout(e.deferredResampleTimeoutId),e.deferredResampleTimeoutId=void 0)}class en8{constructor(){this.id="planar:cpu-volume-slice",this.type=Nq.PLANAR_NEXT}matches(e,t){return"image"===e.type&&t.renderMode===eyK.CPU_VOLUME}createRenderPath(){return new en3}selectContext(e){return{viewportId:e.viewportId,renderingEngineId:e.renderingEngineId,type:e.type,viewport:e.viewport,renderPath:e.renderPath,view:e.view,display:e.display,cpu:e.cpu}}}function en6(e){e.cpu.composition.clearedRenderPassId!==e.cpu.composition.renderPassId&&(e.cpu.context.setTransform(1,0,0,1,0,0),e.cpu.context.clearRect(0,0,e.cpu.canvas.width,e.cpu.canvas.height),e.cpu.context.fillStyle="#000",e.cpu.context.fillRect(0,0,e.cpu.canvas.width,e.cpu.canvas.height),e.cpu.composition.clearedRenderPassId=e.cpu.composition.renderPassId)}class en9{async addData(e,t,r){if(!t.image)throw Error("[PlanarViewport] VTK image rendering requires an image");let n=Hb.newInstance(),a=HA(),i=t.imageData??qa(t.image);e.display.activateRenderMode(eyK.VTK_IMAGE),n.setInputData(i),a.setMapper(n),i.getPointData().getScalars().getNumberOfComponents()>1&&a.getProperty().setIndependentComponents(!1),e.vtk.renderer.addActor(a);let o={renderMode:eyK.VTK_IMAGE,actorEntryUID:F2(),actor:a,currentImage:t.image,mapper:n,imageData:i,useWorldCoordinateImageData:t.useWorldCoordinateImageData,currentImageIdIndex:t.initialImageIdIndex??0,defaultVOIRange:qi(t.image),dataPresentation:void 0,loadRequestId:0};return"overlay"!==r.role&&erG(e,{image:t.image,imageIdIndex:t.initialImageIdIndex??0}),{rendering:o,updateDataPresentation:e=>{this.updateDataPresentation(o,e)},applyViewState:r=>{this.applyViewState(e,o,t.id,r,t.imageIds)},getFrameOfReferenceUID:()=>this.getFrameOfReferenceUID(o),getActorEntry:e=>erF(e,{actor:o.actor,mapper:o.mapper,renderMode:eyK.VTK_IMAGE,uid:o.actorEntryUID,referencedIdFallback:o.currentImage.imageId}),getImageData:()=>this.getImageData(o),resize:()=>{this.resize(e,o,t.id)},removeData:()=>{this.removeData(e,o)}}}updateDataPresentation(e,t){e.dataPresentation=t,qo({actor:e.actor,defaultVOIRange:e.defaultVOIRange,defaultVOILUTFunction:e.currentImage?.voiLUTFunction,props:{interpolationType:NK.LINEAR,...t}})}applyViewState(e,t,r,n,a){if(e.display.activateRenderMode(eyK.VTK_IMAGE),t.useWorldCoordinateImageData)return;let i=enR({ctx:e,dataId:r,imageIds:a,rendering:t,viewState:n}),o=en_({projection:i,rendering:t,viewState:n});if(i&&(eat(e,t,i.resolvedICamera),i.isSourceBinding&&er7({renderer:e.vtk.renderer,activeSourceICamera:i.resolvedICamera})),o===(t.lastRequestedImageIdIndex??t.currentImageIdIndex)||o<0||o>=a.length)return;t.lastRequestedImageIdIndex=o;let s=++t.loadRequestId;qI(a[o]).then(n=>{s===t.loadRequestId&&eae({ctx:e,dataId:r,image:n,rendering:t,imageIdIndex:o,dataPresentation:t.dataPresentation})})}canvasToWorld(e,t){return er$({canvas:e.vtk.canvas,renderer:e.vtk.renderer,canvasPos:t})}worldToCanvas(e,t){return erK({canvas:e.vtk.canvas,renderer:e.vtk.renderer,worldPos:t})}getFrameOfReferenceUID(e){let t=e.currentImage.imageId,r=t?HB(FC.IMAGE_PLANE,t):void 0;return r?.frameOfReferenceUID}getImageData(e){return enU(e.currentImage,this.getFrameOfReferenceUID(e))}removeData(e,t){let{actor:r}=t;e.vtk.renderer.removeActor(r)}resize(e,t,r){if(t.useWorldCoordinateImageData)return void e.display.requestRender();let n=e.viewport.getViewState(),a=enR({ctx:e,dataId:r,rendering:t,viewState:n});a&&(eat(e,t,a.resolvedICamera),a.isSourceBinding&&er7({renderer:e.vtk.renderer,activeSourceICamera:a.resolvedICamera})),e.display.requestRender()}}class en7{constructor(){this.id="planar:vtk-image-mapper",this.type=Nq.PLANAR_NEXT}matches(e,t){return"image"===e.type&&t.renderMode===eyK.VTK_IMAGE}createRenderPath(){return new en9}selectContext(e){return{viewportId:e.viewportId,renderingEngineId:e.renderingEngineId,type:e.type,viewport:e.viewport,renderPath:e.renderPath,view:e.view,display:e.display,vtk:e.vtk}}}async function eae(e){let{ctx:t,dataId:r,image:n,rendering:a,imageIdIndex:i,dataPresentation:o}=e,s=t.viewport.getViewState(),{actor:l,mapper:u}=a,d=a.imageData;d&&function(e,t){let r=e.getPointData?.()?.getScalars?.();if(!r)return!1;let[n,a]=e.getDimensions();if(n!==t.columns||a!==t.rows||r.getDataType()!==t.voxelManager.getScalarData().constructor.name)return!1;let i=t.color?3:1;return r.getNumberOfComponents()===i}(d,n)?(Gv(d,n),function(e,t){let{direction:r,origin:n,spacing:a}=HH(t);e.setOrigin(n),e.setDirection(new Float32Array(Array.from(r))),e.setSpacing(a)}(d,n)):(d=qa(n),u.setInputData(d)),a.currentImage=n,a.imageData=d,a.currentImageIdIndex=i,a.defaultVOIRange=qi(n),t.viewport.invalidateResolvedView(),d.getPointData().getScalars().getNumberOfComponents()>1&&l.getProperty().setIndependentComponents(!1),qo({actor:l,defaultVOIRange:a.defaultVOIRange,defaultVOILUTFunction:n.voiLUTFunction,props:{interpolationType:o?.interpolationType??NK.LINEAR,...o}});let c=enR({ctx:t,dataId:r,rendering:a,viewState:s});c&&(eat(t,a,c.resolvedICamera),c.isSourceBinding&&er7({renderer:t.vtk.renderer,activeSourceICamera:c.resolvedICamera})),c?.isSourceBinding&&erG(t,{image:n,imageIdIndex:i}),t.display.requestRender()}function eat(e,t,r){ene({actor:t.actor,activeSourceICamera:r})}async function ear(e,t,r,n=!1){let{volumeId:a,callback:i}=e,o=await eto(a);if(!o)throw Error(`imageVolume with id: ${a} does not exist`);let{imageData:s,vtkOpenGLTexture:l}=o,u=o.loadStatus,d=WX.newInstance(),c=eeG();(!u||u.loaded)&&l.modified(),c.setInputData(s),c.setSlicePlane(d),c.setSlabThickness(0),c.setScalarTexture?.(l),c.modified();let h=HA();h.setMapper(c);let p=s.get("numberOfComponents");(p?.numberOfComponents??1)>1&&h.getProperty().setIndependentComponents(!1);let m=h.getProperty();m.set({viewportId:r},!0),await etw(h,o);let f=m.getColorWindow?.(),g=m.getColorLevel?.();if(255===f&&127.5===g){let e=o.voxelManager?.getRange?.();e?.length===2&&(m.setColorWindow(e[1]-e[0]),m.setColorLevel((e[1]+e[0])/2))}return i&&i({volumeActor:h,volumeId:a}),n||function(e,t,r,n){let a=r.getProperty().getRGBTransferFunction(0);if(!a)return;let i=a.getRange(),o={viewportId:t,range:{lower:i[0],upper:i[1]},volumeId:n};Bh(e,NH.VOI_MODIFIED,o)}(t,r,h,a),{actor:h,slicePlane:d}}function ean(e){switch(e){case eeF.MAX:return NJ.MAXIMUM_INTENSITY_BLEND;case eeF.MIN:return NJ.MINIMUM_INTENSITY_BLEND;case eeF.MEAN:return NJ.AVERAGE_INTENSITY_BLEND;default:return NJ.COMPOSITE}}function eaa(e){let t=[];return e.forEach(([e,r])=>{let n=t[t.length-1];if(n&&n[0]===e){n[1]=r;return}t.push([e,r])}),t}function eai(e){return Math.max(0,Math.min(1,e))}function eao(e,t){if(t&&Number.isFinite(t.lower)&&Number.isFinite(t.upper))return t;let r=e.getMapper()?.getInputData?.(),n=r?.getPointData?.()?.getScalars?.()?.getRange?.();if(n&&Number.isFinite(n[0])&&Number.isFinite(n[1]))return{lower:n[0],upper:n[1]};let a=e.getProperty().getRGBTransferFunction(0)?.getRange?.();return a&&Number.isFinite(a[0])&&Number.isFinite(a[1])?{lower:a[0],upper:a[1]}:{lower:0,upper:1}}class eas{async addData(e,t,r){var n,a,i,o;let s,l=t.imageVolume,u="overlay"===r.role&&t.reference?.kind==="segmentation";if(!l)throw Error("[PlanarViewport] Volume rendering requires a prepared image volume");let{actor:d}=await ear({volumeId:t.volumeId},e.viewport.element,e.viewportId,!0),c=d.getMapper();e.display.activateRenderMode(eyK.VTK_VOLUME_SLICE),e.vtk.renderer.addActor(d);let h=d.getProperty().getRGBTransferFunction(0),p=h?.getRange?.(),m={renderMode:eyK.VTK_VOLUME_SLICE,actorEntryUID:F2(),actor:d,overlayOrder:(n=e.vtk.renderer,a=d,Math.max(0,n.getActors().filter(e=>e?.getClassName?.()==="vtkImageSlice").indexOf(a))),imageVolume:l,imageIds:t.imageIds,acquisitionOrientation:t.acquisitionOrientation,mapper:c,currentImageIdIndex:t.initialImageIdIndex??0,maxImageIdIndex:t.imageIds.length-1,defaultVOIRange:p?{lower:p[0],upper:p[1]}:void 0,dataPresentation:void 0,isSegmentationOverlay:u},f=null,g=(i=t.volumeId,o=t=>{(t===NH.IMAGE_VOLUME_MODIFIED&&c.modified(),m.isSegmentationOverlay&&(m.dataPresentation?.slabThickness??0)>0)?(null!==f&&clearTimeout(f),f=setTimeout(()=>{f=null,e.display.requestRender()},240)):e.display.requestRender()},s=e=>{let t=e.detail;t?.volumeId===i&&o(e.type)},Bc.addEventListener(NH.IMAGE_VOLUME_MODIFIED,s),Bc.addEventListener(NH.IMAGE_VOLUME_LOADING_COMPLETED,s),()=>{Bc.removeEventListener(NH.IMAGE_VOLUME_MODIFIED,s),Bc.removeEventListener(NH.IMAGE_VOLUME_LOADING_COMPLETED,s)});return m.removeStreamingSubscriptions=()=>{null!==f&&(clearTimeout(f),f=null),g()},l.load(()=>{e.display.requestRender()}),erq(e,{camera:e.viewport.getViewState(),acquisitionOrientation:m.acquisitionOrientation,imageIds:m.imageIds,imageIdIndex:m.currentImageIdIndex,maxImageIdIndex:m.maxImageIdIndex}),{rendering:m,updateDataPresentation:t=>{this.updateDataPresentation(e,m,t)},applyViewState:r=>{this.applyViewState(e,m,t.id,r)},getFrameOfReferenceUID:()=>this.getFrameOfReferenceUID(m),getActorEntry:e=>erF(e,{actor:m.actor,mapper:m.mapper,renderMode:eyK.VTK_VOLUME_SLICE,uid:m.actorEntryUID,referencedIdFallback:e.volumeId}),getImageData:()=>this.getImageData(m),render:()=>{this.render(e)},resize:()=>{this.resize(e,m,t.id)},removeData:()=>{this.removeData(e,m)}}}updateDataPresentation(e,t,r){t.dataPresentation=r,function(e){var t;let{actor:r,defaultVOIRange:n,mapper:a,props:i}=e,o=r.getProperty(),s=i?.voiRange??n;if(r.setVisibility(i?.visible!==!1),i?.interpolationType!==void 0&&o.setInterpolationType(i.interpolationType),i?.blendMode!==void 0){let e=function(e){switch(e){case NJ.MAXIMUM_INTENSITY_BLEND:return eeF.MAX;case NJ.MINIMUM_INTENSITY_BLEND:return eeF.MIN;case NJ.AVERAGE_INTENSITY_BLEND:case NJ.COMPOSITE:return eeF.MEAN;case NJ.LABELMAP_EDGE_PROJECTION_BLEND:return eeF.MAX;default:return}}(i.blendMode);void 0!==e&&a.setSlabType(e)}if(a.setSlabThickness("number"!=typeof(t=i?.slabThickness)||t<=0?0:Math.max(t,FI.MINIMUM_SLAB_THICKNESS)),i?.opacity!==void 0&&function(e){var t;let r,n,a,{actor:i,opacity:o,voiRange:s}=e;if(2>(t=i,r=t.getMapper()?.getInputData?.(),n=r?.getPointData?.()?.getScalars?.(),a=r?.get?.("numberOfComponents"),n?.getNumberOfComponents?.()??a?.numberOfComponents??1))return i.getProperty().setOpacity(o);let l=Ge(),u=eao(i,s);l.addPoint(u.lower,o),u.upper>u.lower&&l.addPoint(u.upper,o),i.getProperty().setScalarOpacity(0,l)}({actor:r,opacity:i.opacity,voiRange:s}),!s)return;let l=qs({colormap:i?.colormap,invert:i?.invert,voiRange:s});o.setUseLookupTableScalarRange(!0),o.setRGBTransferFunction(0,l),function(e){let{actor:t,colormap:r,voiRange:n}=e;if(!r||void 0===r.opacity&&void 0===r.threshold)return;let a=void 0!==r.threshold?function(e){let t=e.getMapper()?.getInputData?.(),r=t?.get?.("voxelManager")?.voxelManager,n=r?.getRange?.();if(n&&Number.isFinite(n[0])&&Number.isFinite(n[1])&&n[1]>n[0])return{lower:n[0],upper:n[1]};let a=t?.getPointData?.()?.getScalars?.()?.getRange?.();if(a&&Number.isFinite(a[0])&&Number.isFinite(a[1])&&a[1]>a[0])return{lower:a[0],upper:a[1]}}(t)??eao(t,n):eao(t,n),i=Ge();(function(e){let{colormap:t,range:r,fallbackOpacity:n}=e,a=r.upper-r.lower,i=Math.max(.001*Math.abs(a),.001),o=void 0!==t.threshold?Math.max(r.lower,Math.min(r.upper,t.threshold)):void 0;if(Array.isArray(t.opacity)&&t.opacity.length){let e=t.opacity.map(({opacity:e,value:t})=>({opacity:eai(e),value:r.lower+t*a})).sort((e,t)=>e.value-t.value);if(void 0===o)return eaa(e.map(({value:e,opacity:t})=>[e,t]));let s=function(e,t,r){if(!t.length)return eai(r);if(e<=t[0].value)return t[0].opacity;for(let r=1;r<t.length;r++){let n=t[r-1],a=t[r];if(e<=a.value){let t=a.value-n.value,r=t>0?(e-n.value)/t:0;return eai(n.opacity+(a.opacity-n.opacity)*r)}}return t[t.length-1].opacity}(o,e,n),l=[[r.lower,0],[Math.max(r.lower,o-i),0],[o,s]];if(e.forEach(({value:e,opacity:t})=>{e>o&&l.push([e,t])}),o<r.upper){let e=l[l.length-1][1];l[l.length-1][0]<r.upper&&l.push([r.upper,e])}return eaa(l)}let s=void 0!==t.opacity?eai(t.opacity):eai(n);return void 0===o?[[r.lower,s],[r.upper,s]]:o>=r.upper?[[r.lower,0],[r.upper,0]]:[[r.lower,0],[Math.max(r.lower,o-i),0],[o,s],[r.upper,s]]})({colormap:r,range:a,fallbackOpacity:function(e){let t=e.getProperty().getScalarOpacity(0),r=t?.getDataPointer?.();if(!r?.length)return e.getProperty().getOpacity?.()??1;let n=0;for(let e=1;e<r.length;e+=2)r[e]>n&&(n=r[e]);return eai(n||1)}(t)}).forEach(([e,t])=>{i.addPoint(e,t)}),t.getProperty().setScalarOpacity(0,i)}({actor:r,colormap:i?.colormap,voiRange:s})}({actor:t.actor,defaultVOIRange:t.isSegmentationOverlay?void 0:t.defaultVOIRange,mapper:t.mapper,props:t.dataPresentation});let n=enD(e);eau(t.mapper,n),ene({actor:t.actor,activeSourceICamera:n}),ead(t.actor,n,t.overlayOrder),e.vtk.renderer.resetCameraClippingRange()}applyViewState(e,t,r,n){e.display.activateRenderMode(eyK.VTK_VOLUME_SLICE),this.syncRenderCamera(e,t,r,n,!0)}syncRenderCamera(e,t,r,n,a){let i=enR({ctx:e,dataId:r,rendering:t,viewState:n});if(!i)return;i.isSourceBinding&&er7({renderer:e.vtk.renderer,activeSourceICamera:i.resolvedICamera}),ene({actor:t.actor,activeSourceICamera:i.activeSourceICamera});let o=i.currentImageIdIndex!==t.currentImageIdIndex,s=i.maxImageIdIndex!==t.maxImageIdIndex;t.currentImageIdIndex=i.currentImageIdIndex,t.maxImageIdIndex=i.maxImageIdIndex,(o||s)&&e.viewport.invalidateResolvedView(),eau(t.mapper,i.activeSourceICamera),ead(t.actor,i.activeSourceICamera,t.overlayOrder),e.vtk.renderer.resetCameraClippingRange(),a&&o&&erq(e,{camera:n,acquisitionOrientation:t.acquisitionOrientation,imageIds:t.imageIds,imageIdIndex:t.currentImageIdIndex,maxImageIdIndex:t.maxImageIdIndex})}canvasToWorld(e,t){return er$({canvas:e.vtk.canvas,renderer:e.vtk.renderer,canvasPos:t})}worldToCanvas(e,t){return erK({canvas:e.vtk.canvas,renderer:e.vtk.renderer,worldPos:t})}getFrameOfReferenceUID(e){return e.imageVolume.metadata?.FrameOfReferenceUID}getImageData(e){var t=e.imageVolume;let r=t.imageData;return r?{dimensions:r.getDimensions(),spacing:r.getSpacing(),origin:r.getOrigin(),direction:r.getDirection(),imageData:r,metadata:{Modality:t.metadata?.Modality,FrameOfReferenceUID:t.metadata?.FrameOfReferenceUID},get scalarData(){return t.voxelManager?.getScalarData()},scaling:t.scaling,hasPixelSpacing:t.hasPixelSpacing,voxelManager:t.voxelManager}:void 0}render(e){e.display.requestRender()}resize(e,t,r){let n=e.viewport.getViewState();this.syncRenderCamera(e,t,r,n,!1),e.display.requestRender()}removeData(e,t){let{actor:r,removeStreamingSubscriptions:n}=t;n?.(),e.vtk.renderer.removeActor(r)}}class eal{constructor(){this.id="planar:vtk-volume-slice",this.type=Nq.PLANAR_NEXT}matches(e,t){return"image"===e.type&&t.renderMode===eyK.VTK_VOLUME_SLICE}createRenderPath(){return new eas}selectContext(e){return{viewportId:e.viewportId,renderingEngineId:e.renderingEngineId,type:e.type,viewport:e.viewport,renderPath:e.renderPath,view:e.view,display:e.display,vtk:e.vtk}}}function eau(e,t){if(!t?.focalPoint||!t.viewPlaneNormal)return;let r=function(e){let t=e.getSlicePlane?.();if(t)return t;let r=WX.newInstance();return e.setSlicePlane(r),r}(e);r.setOrigin(...t.focalPoint),r.setNormal(...t.viewPlaneNormal)}function ead(e,t,r=0){if(!t?.viewPlaneNormal||r<=0)return void e.setPosition(0,0,0);let[n,a,i]=t.viewPlaneNormal,o=1e-4*r;e.setPosition(n*o,a*o,i*o)}let eac=new class{select(e,t={}){var r;if(!e.imageIds.length)throw Error("[PlanarViewport] Cannot add an empty planar dataset");let n=t.orientation||NQ.ACQUISITION,a=eah(e.imageIds),i=(r=e).volumeId||ql.generateVolumeId(r.imageIds),o=n===NQ.ACQUISITION||void 0!==a&&n===a,s=eam(e,o);if(!o&&!s&&!e.useWorldCoordinateImageData)throw Error("[PlanarViewport] Non-acquisition rendering requires a valid volume dataset");if(s&&!eap(e))throw Error("[PlanarViewport] Volume rendering requires a valid volume dataset");return{acquisitionOrientation:a,renderMode:s?this.selectVolumeRenderMode(t):this.selectImageRenderMode(t),volumeId:i}}canRender(e,t={}){if(!e.imageIds.length)return!1;let r=t.orientation||NQ.ACQUISITION,n=eah(e.imageIds),a=r===NQ.ACQUISITION||void 0!==n&&r===n,i=eam(e,a);return(!!a||!!i||!!e.useWorldCoordinateImageData)&&(!i||!!eap(e))}selectImageRenderMode(e){return Bb(this.resolveBackend(e),"image")}selectVolumeRenderMode(e){return Bb(this.resolveBackend(e),"volume")}resolveBackend(e){let t=e.renderBackend??BM.rendering.planar?.renderBackend??FS.Auto;if(t!==FS.Auto){if(By(),Bp.has(t))return t;BE.has(t)||(BE.add(t),console.warn(`[getEffectiveRenderBackend] Unregistered render backend "${t}"; falling back to 'auto'. Register custom backends with registerRenderBackend().`))}return BM.rendering.useCPURendering?FS.CPU:FS.GPU}};function eah(e){let t=e[0];if(!t)return;let r=HB("imagePlaneModule",t),n=r?.imageOrientationPatient;if(!n||6!==n.length)return;let a=Lv.vec3.fromValues(n[0],n[1],n[2]),i=Lv.vec3.fromValues(n[3],n[4],n[5]),o=Lv.vec3.create();Lv.vec3.cross(o,a,i);let s=etz([o[0],o[1],o[2]]);if(s===NQ.AXIAL||s===NQ.CORONAL||s===NQ.SAGITTAL)return s}function eap(e){return!!(e.volumeId&&ql.getVolume(e.volumeId))||function(e){if(!e.length)return!1;let t=e[0],r=HB(FC.GENERAL_SERIES,t);if(!r)return!1;let{modality:n,seriesInstanceUID:a}=r,i=HB(FC.IMAGE_PLANE,t);if(!i)return!1;let{imageOrientationPatient:o,pixelSpacing:s,frameOfReferenceUID:l,columns:u,rows:d,usingDefaultValues:c}=i;if(c)return!1;let h=!0;for(let t=0;t<e.length;t++){let r=e[t],i=HB(FC.GENERAL_SERIES,r),l=HB(FC.IMAGE_PLANE,r);if(!i||!l){h=!1;break}let{modality:c,seriesInstanceUID:p}=i,{imageOrientationPatient:m,pixelSpacing:f,columns:g,rows:y}=l;if(p!==a||c!==n||g!==u||y!==d||!Vw(m,o)||!Vw(f,s)){h=!1;break}}return h}(e.imageIds)}function eam(e,t){return!e.useWorldCoordinateImageData&&(!!e.volumeId||!t&&eap(e))}function eaf(e,t,r){let n=e.anchorCanvas??[.5,.5],a=e.anchorWorld??[0,0,0],[i,o]=erW(e.scale);return[(0-a[0])*i+(n[0]-.5)*t,(0-a[1])*o+(n[1]-.5)*r]}let eag="planar";function eay(e){return[e[0],e[1]]}function eav(e){return[e[0],e[1],e[2]]}function eab(e){let{viewport:t}=e,r=enx(e.viewState??t.getViewState?.()??{}),n=e.resolvedView??(e.viewState&&e.resolveViewState?e.resolveViewState(r):t.getResolvedView?.({frameOfReferenceUID:e.frameOfReferenceUID,sliceIndex:e.sliceIndex})),a=e.canvasWidth??n?.state.canvasWidth??t.element?.clientWidth??1,i=e.canvasHeight??n?.state.canvasHeight??t.element?.clientHeight??1,o=e.displayArea??t.getDisplayArea?.()??r.displayArea,s=n?.scale??erW(r.scale),l=n?.zoom??erW(r.scale)[1],u=n?.pan??eaf(r,a,i),d=n?.toICamera(),c=e.frameOfReferenceUID??n?.getFrameOfReferenceUID()??t.getFrameOfReferenceUID?.();return{kind:eag,adapterId:eag,canvasHeight:i,canvasWidth:a,dataId:e.dataId,displayArea:G_(o),frameOfReferenceUID:c,presentation:{displayArea:G_(o),flipHorizontal:!0===r.flipHorizontal,flipVertical:!0===r.flipVertical,pan:eay(u),position:r.anchorWorld?{kind:"anchor",worldPoint:eav(r.anchorWorld),canvasPoint:eay(r.anchorCanvas??[.5,.5])}:d?.focalPoint?{kind:"focalPoint",worldPoint:eav(d.focalPoint)}:{kind:"anchor",canvasPoint:eay(r.anchorCanvas??[.5,.5])},rawPan:eay(u),rotation:n?.rotation??er5(r.rotation),scale:function(e){let{displayArea:t,scaleMode:r,zoom:n}=e;return t?{kind:"displayArea",value:n,area:t}:"fitWidth"===r?{kind:"fitWidth",value:n}:"fitHeight"===r?{kind:"fitHeight",value:n}:{kind:"fit",value:n}}({displayArea:o,scaleMode:r.scaleMode,zoom:l}),scaleVector:eay(s),zoom:l},rendererCamera:d,resolveViewState:e.resolveViewState,resolvedView:n,spaces:{canvas:!0,image:!0,renderer:!!d,world:!!n},transforms:n?{canvasToWorld:e=>n.canvasToWorld(e),worldToCanvas:e=>n.worldToCanvas(e)}:void 0,viewState:r,viewportType:t.type}}function eaw(e){return e.presentation.zoom??1}function eax(e){return eay(e.presentation.scaleVector)}function eaC(e){return eay(e.presentation.rawPan)}let eak={rotation:!0,displayArea:!0,zoom:!0,scale:!0,pan:!0,flipHorizontal:!0,flipVertical:!0};function eaM(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function eaS(e,t){return t?{...e,displayArea:void 0}:e}let eaE={id:eag,viewportTypes:[Nq.PLANAR_NEXT],getSnapshot:e=>eab(e),getPresentation:(e,t)=>(function(e,t){let r={},n=t??eak;if(n.rotation&&(r.rotation=e.presentation.rotation),n.displayArea&&(r.displayArea=G_(e.displayArea)),n.zoom&&(r.zoom=eaw(e)),n.scale&&(r.scale=eax(e)),n.pan){let t=eax(e),n=eaC(e);r.pan=[n[0]/t[0],n[1]/t[1]]}return n.flipHorizontal&&(r.flipHorizontal=e.presentation.flipHorizontal??!1),n.flipVertical&&(r.flipVertical=e.presentation.flipVertical??!1),r})(e,t),withPresentation:(e,t,r)=>(function(e,t){let{pan:r,rotation:n=e.presentation.rotation,flipHorizontal:a=e.viewState?.flipHorizontal??!1,flipVertical:i=e.viewState?.flipVertical??!1}=t,o=e.viewState??{},s=eaM(t,"zoom"),l=eaM(t,"scale"),u=eaM(t,"displayArea"),d=l?erW(t.scale):erW(t.zoom??e.presentation.scaleVector),c={flipHorizontal:a,flipVertical:i,rotation:n};if(u){let e=G_(t.displayArea);c.anchorCanvas=[.5,.5],c.anchorWorld=void 0,c.displayArea=e,c.scale=s||l?d:[1,1],c.scaleMode=e?.scaleMode??"fit"}else(s||l||!o.displayArea)&&(c.scale=d,c.scaleMode="fit");if(r){let n=[r[0]*d[0],r[1]*d[1]],a=enx({...o,...c}),i=e.resolveViewState?.(a)??(a===e.viewState?e.resolvedView:void 0);return eaS(i?.withPan(n).state.viewState??function(e,t,r,n){let a=eaf(e,r,n),[i,o]=e.anchorCanvas??[.5,.5],s=t[0]-a[0],l=t[1]-a[1];return enx({...e,anchorCanvas:[i+s/Math.max(r,1),o+l/Math.max(n,1)],displayArea:void 0})}(a,n,e.canvasWidth,e.canvasHeight),u&&void 0===t.displayArea)}return eaS(enx({...o,...c}),u&&void 0===t.displayArea)})(e,t),applyToRenderer:(e,t)=>{t&&"object"==typeof t&&"getActiveCamera"in t&&"function"==typeof t.getActiveCamera&&er7({activeSourceICamera:e.rendererCamera,renderer:t})}},eaT=class{constructor(e){this.host=e}resolveBindingRole(e){return"source"===e.role?"source":"overlay"}getActiveDataId(){return this.sourceDataId}clearActiveDataId(){this.sourceDataId=void 0}getCurrentBinding(){return this.sourceDataId?this.host.getBinding(this.sourceDataId)??this.host.getFirstBinding():this.host.getFirstBinding()}getFirstBoundDataId(){for(let[e]of this.host.getBindings())return e}hasBinding(e){return!!this.host.getBinding(e)}promoteSourceDataId(e){for(let[t,r]of this.host.getBindings())r.role=t===e?"source":"overlay";this.sourceDataId=e}handleRemovedData(e){this.sourceDataId===e&&(this.sourceDataId=void 0,this.promoteFirstAvailableBindingToSource())}removeBindingsExcept(e){for(let t of Array.from(this.host.getBindings(),([e])=>e))e.has(t)||this.host.removeData(t)}getActorForDataId(e){let t=this.host.getBinding(e);return t?.getActorEntry?.(t.data)}getBindingActor(e){let t=this.host.getBinding(e)?.rendering;return t?.actor??t?.compatibilityActor}getActors(){return[...this.getProjectedActorEntries("source"),...this.getProjectedActorEntries("overlay")]}getDefaultActor(){return this.getProjectedActorEntries("source")[0]??this.getProjectedActorEntries()[0]}getProjectedActorEntries(e){let t=[];for(let[,r]of this.host.getBindings()){if(e&&r.role!==e)continue;let n=r.getActorEntry?.(r.data);n&&t.push(n)}return t}findBindingDataIdByActorEntryUID(e){for(let[t,r]of this.host.getBindings()){let n=r.getActorEntry?.(r.data);if(n?.uid===e)return t}}findDataIdByVolumeId(e){for(let[t,r]of this.host.getBindings())if(r.data?.volumeId===e)return t}getDefaultVOIRange(e){let t=e??this.sourceDataId??this.getCurrentBinding()?.data.id,r=t?this.host.getBinding(t)?.rendering:void 0,n=r?.defaultVOIRange;return n?{...n}:void 0}promoteFirstAvailableBindingToSource(){let e=this.getFirstBoundDataId();e&&this.promoteSourceDataId(e)}};function eaI(e){var t;let{rendering:r,viewRefSpecifier:n}=e;if(!r)return;let a=(t=e.data,t?.imageVolume?.imageIds||t?.imageIds||[]);if(!a.length)return;if(r.renderMode===eyK.CPU_IMAGE||r.renderMode===eyK.VTK_IMAGE){let t="number"==typeof n?.sliceIndex?Math.min(Math.max(0,n.sliceIndex),a.length-1):e.viewState?.slice?.kind==="stackIndex"?Math.min(Math.max(0,e.viewState.slice.imageIdIndex),a.length-1):eaP(r);return a[t]}let i=enP({viewState:e.viewState,data:e.data,frameOfReferenceUID:e.frameOfReferenceUID,renderContext:e.renderContext,rendering:r,sliceIndex:n?.sliceIndex})?.toICamera();return i?.focalPoint&&i.viewPlaneNormal?q$(r.imageVolume,i.focalPoint,i.viewPlaneNormal):a[Math.min(eaP(r),a.length-1)]}function eaP(e){return e.currentImageIdIndex}function ea_(e){if(e)return[e[0],e[1],e[2]]}let eaD=class{constructor(e){this.host=e}getVolumeId(e={}){return this.getPlanarReferenceContext(e)?.data.volumeId??this.getCurrentPlanarReferenceContext()?.data.volumeId}getCurrentImageId(e={}){let t=this.getPlanarReferenceContext(e);return eaI({viewState:this.host.getViewState(),data:t?.data,frameOfReferenceUID:t?.frameOfReferenceUID,rendering:t?.rendering,renderContext:this.host.getRenderContext(),viewRefSpecifier:e})}getViewReference(e={}){let t=this.getPlanarReferenceContext(e);return function(e){let{frameOfReferenceUID:t,rendering:r,viewRefSpecifier:n}=e,{dimensionGroupNumber:a}=erf(e.data?.imageVolume),i=n?.sliceIndex??(r?eaP(r):void 0),o=n?.rangeEndSliceIndex,s=enP({...e,sliceIndex:i})?.toICamera(),l=ea_(s?.focalPoint),u=ea_(s?.viewPlaneNormal),d=ea_(s?.viewUp),c=d&&u?ea_(Lv.vec3.cross(Lv.vec3.create(),d,u)):void 0,h={FrameOfReferenceUID:t,dataId:e.dataId,dimensionGroupNumber:a,cameraFocalPoint:l,viewPlaneNormal:u,viewUp:d,sliceIndex:i,planeRestriction:u&&d&&l?{FrameOfReferenceUID:t,point:ea_(n?.points?.[0])||l,inPlaneVector1:d,inPlaneVector2:c}:void 0},p=eaI(e),m="number"==typeof i&&"number"==typeof o&&o>i?eaI({...e,viewRefSpecifier:{...n,sliceIndex:o}}):void 0;return r&&(r.renderMode===eyK.CPU_VOLUME||r.renderMode===eyK.VTK_VOLUME_SLICE)&&n?.forFrameOfReference!==!0&&(h.volumeId=e.data?.volumeId),p&&(h.referencedImageId=p,h.referencedImageURI=Gk(p)),m&&"number"==typeof o&&"number"==typeof i&&o>i&&(h.multiSliceReference={FrameOfReferenceUID:t,referencedImageId:m,referencedImageURI:Gk(m),sliceIndex:o}),n?.points&&h.planeRestriction&&GD(n.points,h),h}({viewState:this.host.getViewState(),dataId:t?.dataId,frameOfReferenceUID:t?.frameOfReferenceUID??this.getFrameOfReferenceUID(),data:t?.data,rendering:t?.rendering,renderContext:this.host.getRenderContext(),viewRefSpecifier:e})}getViewReferenceId(e={}){let t=this.getPlanarReferenceContext(e);return function(e){let{rendering:t,viewRefSpecifier:r}=e;if(!t)return null;if(t.renderMode===eyK.CPU_VOLUME||t.renderMode===eyK.VTK_VOLUME_SLICE){let n=enP({...e,sliceIndex:r?.sliceIndex})?.toICamera(),a=r?.sliceIndex??eaP(t),i=e.data?.volumeId;return i&&n?.viewPlaneNormal?etG({sliceIndex:a,viewPlaneNormal:n.viewPlaneNormal,volumeId:i}):null}let n=eaI(e);return n?`imageId:${n}`:null}({viewState:this.host.getViewState(),frameOfReferenceUID:t?.frameOfReferenceUID,data:t?.data,rendering:t?.rendering,renderContext:this.host.getRenderContext(),viewRefSpecifier:e})}setViewReference(e){if(!e)return;let t=this.resolveViewReferenceContext(e);if(!t)return;let r=this.activatePlanarReferenceContext(t.dataId),n=this.applyViewReferenceToCurrentBinding(e);r&&!n&&this.host.render()}getFrameOfReferenceUID(){let e=this.resolveFrameOfReferenceUID();return this.host.getResolvedView({frameOfReferenceUID:e})?.getFrameOfReferenceUID()??e}resolveFrameOfReferenceUID(){let e=this.host.getCurrentBinding();return e?.getFrameOfReferenceUID()??`${this.host.viewportType}-viewport-${this.host.viewportId}`}isPlaneViewable(e,t){return function(e){let{frameOfReferenceUID:t,options:r,planeRestriction:n}=e;if(n.FrameOfReferenceUID!==t)return!1;let{focalPoint:a,viewPlaneNormal:i}=enP(e)?.toICamera()||{};if(!a||!i)return!1;if(r?.withOrientation)return!0;if(n.inPlaneVector1&&!Vw(0,Lv.vec3.dot(i,n.inPlaneVector1))||n.inPlaneVector2&&!Vw(0,Lv.vec3.dot(i,n.inPlaneVector2)))return!1;if(r?.withNavigation)return!0;let{point:o}=n,s=Lv.vec3.sub(Lv.vec3.create(),o,a);return Vw(0,Lv.vec3.dot(s,i))}({viewState:this.host.getViewState(),frameOfReferenceUID:this.getFrameOfReferenceUID(),options:t,planeRestriction:e,rendering:this.getCurrentPlanarRendering(),renderContext:this.host.getRenderContext()})}getReferenceViewContexts(e){let t=this.getAllPlanarReferenceContexts();return t.length?t.map(e=>this.getGenericViewportReferenceContext(e)):e}getPlanarReferenceContext(e={}){return e.volumeId?this.findPlanarReferenceContextByVolumeId(e.volumeId)??this.getCurrentPlanarReferenceContext():this.getCurrentPlanarReferenceContext()}getCurrentPlanarReferenceContext(){let e=this.host.getActiveDataId();if(e){let t=this.getPlanarReferenceContextByDataId(e);if(t)return t}for(let[e]of this.host.getBindings())return this.getPlanarReferenceContextByDataId(e)}getPlanarReferenceContextByDataId(e){let t=this.host.getBinding(e);if(t)return{dataId:e,data:t.data,frameOfReferenceUID:t.getFrameOfReferenceUID()??`${this.host.viewportType}-viewport-${this.host.viewportId}`,rendering:t.rendering}}getAllPlanarReferenceContexts(){let e=[];for(let[t]of this.host.getBindings()){let r=this.getPlanarReferenceContextByDataId(t);r&&e.push(r)}return e}getGenericViewportReferenceContext(e){let t=enP({viewState:this.host.getViewState(),data:e.data,frameOfReferenceUID:e.frameOfReferenceUID,rendering:e.rendering,renderContext:this.host.getRenderContext()})?.toICamera(),r=e.data.volumeId;return{dataId:e.dataId,dataIds:[e.data.id],frameOfReferenceUID:e.frameOfReferenceUID,imageIds:this.getImageIdsForReferenceContext(e),currentImageIdIndex:e.rendering.currentImageIdIndex,volumeId:r,volumeIds:r?[r]:void 0,cameraFocalPoint:t?.focalPoint,viewPlaneNormal:t?.viewPlaneNormal,...erf(e.data.imageVolume)}}findPlanarReferenceContextByVolumeId(e){for(let[t,r]of this.host.getBindings())if(r.data.volumeId===e)return this.getPlanarReferenceContextByDataId(t)}findPlanarReferenceContextByImageReference(e,t){let r=t||(e?Gk(e):void 0);if(r){for(let e of this.getAllPlanarReferenceContexts())if(this.getImageIdsForReferenceContext(e).some(e=>Gk(e)===r))return e}}resolveViewReferenceContext(e){if(e.dataId){let t=this.getPlanarReferenceContextByDataId(e.dataId);if(t)return t}if(e.volumeId){let t=this.findPlanarReferenceContextByVolumeId(e.volumeId);if(t)return t}let t=this.findPlanarReferenceContextByImageReference(e.referencedImageId,e.referencedImageURI);if(t)return t;let r=this.getCurrentPlanarReferenceContext();if(!e.FrameOfReferenceUID||r?.frameOfReferenceUID===e.FrameOfReferenceUID)return r}activatePlanarReferenceContext(e){return this.host.getActiveDataId()!==e&&(this.host.promoteSourceDataId(e),this.host.updateBindingsCameraState(),!0)}applyViewReferenceToCurrentBinding(e){let t=this.getCurrentPlanarReferenceContext();if(!t||e.FrameOfReferenceUID&&t.frameOfReferenceUID!==e.FrameOfReferenceUID)return!1;let{rendering:r}=t;return r.renderMode===eyK.CPU_IMAGE||r.renderMode===eyK.VTK_IMAGE?this.applyImageViewReference(t,e):this.applyVolumeViewReference(t,e)}applyImageViewReference(e,t){let r=this.getImageIdsForReferenceContext(e),n=this.findImageIdIndexByReference(r,t.referencedImageId,t.referencedImageURI);return"number"==typeof n?(this.host.setImageIdIndex(n),!0):"number"==typeof t.sliceIndex&&(this.host.setImageIdIndex(t.sliceIndex),!0)}applyVolumeViewReference(e,t){let r=this.normalizeVolumeViewReference(e,t),n=this.host.getResolvedView({frameOfReferenceUID:e.frameOfReferenceUID})?.toICamera();if(!n?.viewPlaneNormal)return!1;let a=n.viewPlaneNormal,i=r.viewPlaneNormal,o=i&&!this.areNormalsEqual(a,i)&&!this.areNormalsOpposite(a,i),s=i??a,l=!o&&this.areNormalsOpposite(a,s),u=this.resolveVolumeReferenceSliceTarget(e,r,s,l),d={};o&&i&&(d.orientation={viewPlaneNormal:[...i],...r.viewUp?{viewUp:[...r.viewUp]}:{}});let c=r.cameraFocalPoint??u?.sliceWorldPoint??("number"==typeof u?.imageIdIndex?this.host.getVolumeSliceWorldPointForImageIdIndex(u.imageIdIndex):void 0);return c&&(d.slice={kind:"volumePoint",sliceWorldPoint:[...c]}),!!Object.keys(d).length&&(this.host.setViewState(d),!0)}normalizeVolumeViewReference(e,t){if(!t.planeRestriction||t.viewPlaneNormal)return t;let r=this.deriveOrientationFromPlaneRestriction(e,t.planeRestriction);return{...t,cameraFocalPoint:t.cameraFocalPoint??t.planeRestriction.point,...r}}deriveOrientationFromPlaneRestriction(e,t){let r,n=this.host.getResolvedView({frameOfReferenceUID:e.frameOfReferenceUID})?.toICamera(),a=n?.viewPlaneNormal,i=n?.viewUp,{inPlaneVector1:o,inPlaneVector2:s}=t,l={};if(a&&this.isPlaneRestrictionCompatibleWithNormal(t,a))return l.viewPlaneNormal=[...a],o?l.viewUp=[...o]:i&&(l.viewUp=[...i]),l;if(o&&s){let e=Lv.vec3.cross(Lv.vec3.create(),s,o);Lv.vec3.length(e)>0&&(Lv.vec3.normalize(e,e),r=[...e])}else if(o&&a){let e=Lv.vec3.cross(Lv.vec3.create(),a,o);Lv.vec3.length(e)>0&&(Lv.vec3.normalize(e,e),r=[...e])}return r&&(l.viewPlaneNormal=r),o?l.viewUp=[...o]:i&&(l.viewUp=[...i]),l}isPlaneRestrictionCompatibleWithNormal(e,t){return(!e.inPlaneVector1||Vw(0,Lv.vec3.dot(t,e.inPlaneVector1)))&&(!e.inPlaneVector2||Vw(0,Lv.vec3.dot(t,e.inPlaneVector2)))}resolveVolumeReferenceSliceTarget(e,t,r,n){let{rendering:a}=e;if(a.renderMode!==eyK.CPU_VOLUME&&a.renderMode!==eyK.VTK_VOLUME_SLICE)return;let i=this.getImageIdsForReferenceContext(e),o=a.maxImageIdIndex;if("number"==typeof t.sliceIndex&&t.volumeId===e.data.volumeId&&t.viewPlaneNormal)return{imageIdIndex:Math.min(Math.max(0,n?o-t.sliceIndex:t.sliceIndex),o)};let s=this.findImageIdIndexByReference(i,t.referencedImageId,t.referencedImageURI);if("number"==typeof s)return this.toVolumeSliceTarget(a.imageVolume,s);let l=t.cameraFocalPoint??t.planeRestriction?.point;if(l){let e=q$(a.imageVolume,l,r),t=this.findImageIdIndexByReference(i,e);return"number"==typeof t?this.toVolumeSliceTarget(a.imageVolume,t):void 0}if("number"==typeof t.sliceIndex)return{imageIdIndex:Math.min(Math.max(0,t.sliceIndex),o)}}toVolumeSliceTarget(e,t){let r=enf(e,t);return r?{sliceWorldPoint:r}:{imageIdIndex:t}}getImageIdsForReferenceContext(e){return e.data.imageVolume?.imageIds||e.data.imageIds}findImageIdIndexByReference(e,t,r){let n=r||(t?Gk(t):void 0);if(!n)return;let a=e.findIndex(e=>Gk(e)===n);return a>=0?a:void 0}getCurrentPlanarRendering(){return this.host.getCurrentBinding()?.rendering}areNormalsEqual(e,t){return!!(e&&t&&Vw(e,t))}areNormalsOpposite(e,t){return!!e&&!!t&&Vw(Lv.vec3.negate(Lv.vec3.create(),e),t)}};function eaO(e={}){return G_(e)}let eaA=class extends erM{static get useCustomRenderingPipeline(){return!1}constructor(e){super(e),this.type=Nq.PLANAR_NEXT,this.suppressEvents=!1,this.resolvedViewCacheRevision=0,this.setDataRequestId=0,this.renderPipelineSwapId=0,this.lastRenderPathErrorByDataId=new Map,this.mountOptionsByDataId=new Map,this.renderingEngineId=e.renderingEngineId,this.canvas=e.canvas,this.sWidth=e.sWidth,this.sHeight=e.sHeight,this.defaultOptions=eaO(e.defaultOptions||{}),this.options=eaO(this.defaultOptions),this.canvasToWorld=this.canvasToWorld.bind(this),this.worldToCanvas=this.worldToCanvas.bind(this),this.dataProvider=e.dataProvider||new erV,this.renderPathResolver=e.renderPathResolver||function(e=[new enN,new en8,new en7,new eal,...function(){By();let e=[];for(let t of Bp.values()){let{image:r,volume:n}=t.renderModes;for(let t of[r,n])t?.createDefinition&&e.push(t.createDefinition())}return e}()]){return new erE(e)}(),this.mountedData=new eaT({getBinding:e=>this.getBinding(e),getFirstBinding:()=>this.getFirstBinding(),getBindings:()=>this.bindings.entries(),removeData:e=>this.removeData(e)}),this.viewReferences=new eaD({viewportId:this.id,viewportType:this.type,getActiveDataId:()=>this.mountedData.getActiveDataId(),getBinding:e=>this.getBinding(e),getBindings:()=>this.bindings.entries(),getCurrentBinding:()=>this.getCurrentBinding(),getRenderContext:()=>this.renderContext,getResolvedView:e=>this.getResolvedView(e),getViewState:()=>this.viewState,getVolumeSliceWorldPointForImageIdIndex:e=>this.getVolumeSliceWorldPointForImageIdIndex(e),promoteSourceDataId:e=>{this.clearResolvedViewCache(),this.mountedData.promoteSourceDataId(e)},render:()=>this.render(),setImageIdIndex:e=>this.setImageIdIndex(e),setViewState:e=>this.setViewState(e),updateBindingsCameraState:()=>this.updateBindingsCameraState()});const t=FA(this.renderingEngineId),r=t?.getRenderer(this.id);if(!r)throw Error("[PlanarViewport] No renderer available. Ensure WebGL is supported and the rendering engine has been properly initialized.");this.element.style.position=this.element.style.position||"relative",this.element.style.overflow="hidden",this.element.style.background=this.element.style.background||"#000",this.element.style.isolation="isolate";const n=e.canvas,a=this.element.querySelector(".viewport-element"),i=document.createElement("canvas");i.style.display="none",i.style.height="100%",i.style.inset="0",i.style.pointerEvents="none",i.style.position="absolute",i.style.width="100%",i.style.zIndex="0",this.element.appendChild(i),this.cpuCanvas=i,a&&(a.style.position=a.style.position||"relative",a.style.zIndex="1");const o=i.getContext("2d");if(!o)throw Error("[PlanarViewport] Failed to initialize CPU canvas");r.getActiveCamera().setParallelProjection(!0),this.renderContext={viewportId:this.id,renderingEngineId:this.renderingEngineId,type:"planar",viewport:{element:this.element,getActiveDataId:()=>this.mountedData.getActiveDataId(),invalidateResolvedView:()=>this.clearResolvedViewCache(),getViewState:()=>this.getViewState(),isCurrentDataId:e=>this.getCurrentBinding()?.data.id===e,getOverlayActors:()=>this.mountedData.getProjectedActorEntries("overlay")},renderPath:{renderMode:eyK.VTK_IMAGE},view:{},display:{requestRender:()=>{this.requestRenderingEngineRender()},renderNow:()=>{this.render()},setNeedsRender:()=>{this.setNeedsRender()},markRendered:()=>{this.setRendered()},activateRenderMode:e=>{this.renderContext.renderPath.renderMode=e,this.setRenderModeVisibility(e,i,n)}},cpu:{canvas:i,composition:{clearedRenderPassId:-1,renderPassId:0},context:o},vtk:{renderer:r,canvas:n}},this.viewState=enx({...enw(),orientation:this.resolveRequestedOrientation()}),this.setRenderModeVisibility(eyK.VTK_IMAGE,i,n),this.element.setAttribute("data-viewport-uid",this.id),this.element.setAttribute("data-rendering-engine-uid",this.renderingEngineId),this.resize()}async setDisplaySets(...e){let t=++this.setDataRequestId,r=()=>t!==this.setDataRequestId;for(let[t,{displaySetId:n,options:a={}}]of(this.clearResolvedViewCache(),this.removeReplaceableData(e),e.entries())){if(r())return;let e=a.role??(0===t?"source":"overlay");await this.addDisplaySetInternal(n,{...a,role:e},r)}}async addDisplaySet(e,t={}){await this.addDisplaySetInternal(e,t),this.clearResolvedViewCache()}async addDisplaySetInternal(e,t={},r){let n=this.mountedData.resolveBindingRole(t),a={...t,role:n},{data:i,resolvedOrientation:o,selectedPath:s}=await this.loadPlanarData(e,a);if(r?.()||("source"===n&&(this.mountedData.promoteSourceDataId(e),this.applyLoadedPlanarViewState(o,i,s)),!await this.addLoadedData(e,i,{renderMode:s.renderMode,role:n},r)))return;this.mountOptionsByDataId.set(e,a),this.clearResolvedViewCache(),this.setDefaultDataPresentation(e,{visible:!0});let l=this.getDisplaySetPresentation(e),u=l?.voiRange??this.getDefaultVOIRange(e);u&&this.notifyDataPresentationModified(e,{voiRange:u}),"source"===n&&this.triggerCameraModifiedEvent(this.getCameraForEvent())}removeData(e){this.clearResolvedViewCache(),this.mountOptionsByDataId.delete(e),this.lastRenderPathErrorByDataId.delete(e),super.removeData(e),this.mountedData.handleRemovedData(e),!this.isDestroyed&&this.getCurrentBinding()&&this.updateBindingsCameraState()}getActors(){return this.mountedData.getActors()}getDefaultActor(){return this.mountedData.getDefaultActor()}getImageActor(e){let t=this.getActors(),r=t[0];return(e&&(r=t.find(t=>t.referencedId===e)??this.mountedData.getActorForDataId(e)),r&&H2(r))?r.actor:null}getDefaultImageData(){return this.getImageActor()?.getMapper().getInputData()}renderImageObject(e){let t=`image-object:${this.id}:${Gk(e.imageId)}`;return this.renderImageObjectDataId&&this.renderImageObjectDataId!==t&&H$.remove(this.renderImageObjectDataId),this.renderImageObjectDataId=t,H$.add(t,{image:e,imageIds:[e.imageId],initialImageIdIndex:0,kind:"planar"}),this.setDisplaySets({displaySetId:t,options:{orientation:this.resolveRequestedOrientation()}})}getCanvas(){let e=this.getCurrentPlanarRendering();return"cpu"===BC(e?.renderMode)?this.renderContext.cpu.canvas:this.renderContext.vtk.canvas}async addImages(e){let t=this.getCurrentPlanarRendering(),r=t?.renderMode;if(Bx(r)||Bw(r)&&"cpu"!==BC(r)){for(let t of e){let e=this.resolveStackInputImage(t);if(!e)continue;let r=this.resolveOverlayReference(t,e),n=this.resolveOverlayDataId(t,e,r);H$.add(n,{image:e,imageData:t.imageData,imageIds:[t.imageId],initialImageIdIndex:0,kind:"planar",reference:r,useWorldCoordinateImageData:!0===t.useWorldCoordinateImageData}),await this.addDisplaySet(n,{role:"overlay"});let a=this.mountedData.getActorForDataId(n);t.callback&&a&&t.callback({imageActor:a.actor,imageId:t.imageId})}this.render()}}getImageDataMetadata(e){return HH(e)}getImageIds(){let e=this.getPlanarData();return e?e.imageVolume?.imageIds||e.imageIds:[]}getVolumeId(e={}){return this.viewReferences.getVolumeId(e)??this.getPlanarData()?.volumeId}getSourceDataId(){return this.mountedData.getActiveDataId()}getCurrentMode(){let e=this.getSourceBinding();if(!e)return"empty";let t=e.rendering.renderMode;return t===eyK.VTK_VOLUME||Bw(t)?"volume":Bx(t)?"stack":this.getVolumeId()?"volume":"stack"}notifyDataPresentationModified(e,t){if(this.suppressEvents)return;let r="voiRange"in t||"invert"in t||"voiLUTFunction"in t,n="colormap"in t;if(!r&&!n)return;let a=this.getDisplaySetPresentation(e),i=this.getDataSet(e)?.volumeId??(e===this.getSourceDataId()?this.getVolumeId():void 0);if(r){let e=t.voiRange??a?.voiRange;e&&Bh(this.element,NH.VOI_MODIFIED,{viewportId:this.id,range:e,volumeId:i,VOILUTFunction:t.voiLUTFunction??a?.voiLUTFunction,invert:t.invert??a?.invert,colormap:a?.colormap})}n&&t.colormap&&Bh(this.element,NH.COLORMAP_MODIFIED,{viewportId:this.id,colormap:t.colormap,volumeId:i})}getDefaultVOIRange(e){return this.mountedData.getDefaultVOIRange(e)}getCurrentImageIdIndex(){return this.getActiveImageIdIndex()}getCurrentImageId(e={}){return this.viewReferences.getCurrentImageId(e)}getSliceIndex(){return this.getCurrentImageIdIndex()}getNumberOfSlices(){return this.getImageIds().length?this.getMaxImageIdIndex()+1:0}calibrateSpacing(e){this.render();let t=this.getImageData();Bh(this.element,NH.IMAGE_SPACING_CALIBRATED,{element:this.element,viewportId:this.id,renderingEngineId:this.renderingEngineId,imageId:e,calibration:t?.calibration,imageData:t?.imageData})}normalizeViewState(e){return enx(e)}setViewState(e){if(this.isDestroyed)return;let t=this.getResolvedCameraForEvent();Object.prototype.hasOwnProperty.call(e,"displayArea")&&(this.options={...this.options,displayArea:G_(e.displayArea)});let r={...this.viewState,...e};this.clearResolvedViewCache(),this.viewState=this.normalizeViewState(r),this.modified(t)}setDisplaySetPresentation(e,t){(this.clearResolvedViewCache(),"string"==typeof e)?super.setDisplaySetPresentation(e,t??{}):super.setDisplaySetPresentation(e)}setDataPresentationState(e,t){this.clearResolvedViewCache(),super.setDataPresentationState(e,t)}getRotation(){return this.getResolvedView()?.rotation??er5(this.viewState.rotation)}getAnchorWorld(){let e=this.viewState.anchorWorld;return e?[...e]:void 0}setAnchorWorld(e){this.setViewState({anchorWorld:e?[...e]:void 0})}setOptions(e,t=!1){this.options=eaO(e),this.options.displayArea&&this.setDisplayArea(this.options.displayArea,this.options.suppressEvents??!1),t&&this.render()}reset(e=!1){this.options=eaO(this.defaultOptions),e&&this.render()}getDisplayArea(){return G_(this.viewState.displayArea??this.options.displayArea)}setDisplayArea(e,t=!1){let r=G_(e);r&&(this.options={...this.options,displayArea:G_(r)},this.setViewState({anchorCanvas:[.5,.5],anchorWorld:void 0,displayArea:r,scale:[1,1],scaleMode:r.scaleMode??"fit"}),t||this.suppressEvents||Bh(this.element,NH.DISPLAY_AREA_MODIFIED,{viewportId:this.id,displayArea:G_(r),storeAsInitialCamera:r.storeAsInitialCamera}))}getZoom(){return eaw(this.getProjectionSnapshot())}getScale(){return eax(this.getProjectionSnapshot())}setZoom(e,t){this.setScale(e,t)}setScale(e,t){let r=this.getResolvedView(),n=erW(e);r?this.applyResolvedViewState(r.withScale(n,t).state.viewState):t?this.setScaleAtCanvasPoint(n,t):this.setViewState({displayArea:void 0,scale:n,scaleMode:"fit"})}getPan(){return eaC(this.getProjectionSnapshot())}setPan(e){let t=this.getResolvedView();t?this.applyResolvedViewState(t.withPan(e).state.viewState):this.applyResolvedViewState(this.getFallbackViewStateWithPan(this.viewState,e))}setScaleAtCanvasPoint(e,t){let r=this.getResolvedView(),n=erW(e);if(r)return void this.applyResolvedViewState(r.withScale(n,t).state.viewState);let a=this.buildFallbackCanvasToWorld(t),{height:i,width:o}=this.getCurrentCanvasDimensions();this.setViewState({anchorWorld:a,anchorCanvas:[t[0]/Math.max(o,1),t[1]/Math.max(i,1)],displayArea:void 0,scale:n,scaleMode:"fit"})}getViewState(){return enx(this.viewState)}getResolvedView(e={}){return this.resolveCachedViewState(this.viewState,e)}getRenderingEngine(){return FA(this.renderingEngineId)}getViewReference(e={}){return this.viewReferences.getViewReference(e)}getViewReferenceId(e={}){return this.viewReferences.getViewReferenceId(e)}setViewReference(e){this.viewReferences.setViewReference(e)}getImageData(e){if(e){let t=this.findDataIdByVolumeId(e),r=t?this.getBinding(t):void 0;return r?.getImageData?.()}return this.getCurrentBinding()?.getImageData?.()}canvasToWorld(e){let t=this.getResolvedView();return t?t.canvasToWorld(e):this.buildFallbackCanvasToWorld(e)}worldToCanvas(e){let t=this.getResolvedView();return t?t.worldToCanvas(e):this.buildFallbackWorldToCanvas(e)}getFrameOfReferenceUID(){return this.viewReferences.getFrameOfReferenceUID()}hasImageId(e){return this.getImageIds().includes(e)}hasImageURI(e){return this.getImageIds().some(t=>Gk(t)===e)}hasVolumeId(e){return void 0!==this.findDataIdByVolumeId(e)}hasVolumeURI(e){return String(this.getVolumeId()||"").includes(e)}isPlaneViewable(e,t){return this.viewReferences.isPlaneViewable(e,t)}isReferenceViewable(e,t={}){return super.isReferenceViewable(e,t)}setImageIdIndex(e){let t=this.getImageIds();if(!t.length)return Promise.reject(Error("[PlanarViewport] Cannot set image index on empty stack"));let r=Math.min(Math.max(0,e),this.getMaxImageIdIndex()),n=t[r]||t[t.length-1],a=this.getCurrentPlanarRendering();if(Bw(a?.renderMode)){let e=this.getVolumeSliceWorldPointForImageIdIndex(r);return e&&this.setViewState({slice:{kind:"volumePoint",sliceWorldPoint:e}}),Promise.resolve(n)}return this.setViewState({slice:{kind:"stackIndex",imageIdIndex:r}}),Promise.resolve(n)}scroll(e){return this.setImageIdIndex(this.getActiveImageIdIndex()+e)}setOrientation(e){this.setViewState({orientation:this.resolveSetOrientation(e)})}canRenderOrientation(e,t){let r=t??this.getSourceDataId();if(!r)return!1;let n=this.getDataSet(r);return!!n&&eac.canRender(n,{orientation:this.resolveSetOrientation(e)})}resetViewState(e){let{resetPan:t=!0,resetZoom:r=!0,resetOrientation:n=!0,resetFlip:a=!0}=e||{},i={rotation:0};return t&&(i.anchorWorld=void 0,i.anchorCanvas=[.5,.5]),r&&(i.scale=[1,1],i.scaleMode="fit"),n&&(i.orientation=this.resolveRequestedOrientation()),a&&(i.flipHorizontal=!1,i.flipVertical=!1),this.setViewState(i),this.triggerCameraResetEvent(),!0}resetViewStateForResize(){return this.resetViewState()}resetDisplaySetPresentation(e){if(this.isDestroyed)return;let t=e??this.getSourceDataId();if(!t)return;this.setDataPresentationState(t,{});let r=this.getDefaultVOIRange(t);r&&this.notifyDataPresentationModified(t,{voiRange:r})}getUseCustomRenderingPipeline(){return!1}setRendered(){super.setRendered()}resize(){if(this.isDestroyed)return;this.clearResolvedViewCache(),this.cachedCanvasDimensions=void 0;let{clientHeight:e,clientWidth:t}=this.element,{canvas:r}=this.renderContext.cpu,n=window.devicePixelRatio||1,a=Math.round(t*n),i=Math.round(e*n);(r.width!==a||r.height!==i)&&(r.width=a,r.height=i),this.resizeBindingsWithActiveFirst()}render(){if(!this.isDestroyed){if(!this.bindings.size){this.viewportStatus=Fw.NO_DATA;return}this.setNeedsRender(),this.renderContext.cpu.composition.renderPassId+=1,this.renderBindings()||this.requestRenderingEngineRender()}}onDestroy(){this.clearResolvedViewCache(),this.renderImageObjectDataId&&(H$.remove(this.renderImageObjectDataId),this.renderImageObjectDataId=void 0),this.cpuCanvas?.remove(),this.cpuCanvas=void 0,this.mountedData.clearActiveDataId(),this.renderContext.view.activeSourceICamera=void 0}modified(e){!this.isDestroyed&&(this.updateBindingsCameraState(),this.render(),e&&this.triggerCameraModifiedEvent(e))}renderBindings(){if(this.isDestroyed)return!1;let e=!1,t=this.getCurrentBinding(),r=(t,r)=>{if(t.render){e=!0;try{t.render(),this.lastRenderPathErrorByDataId.delete(r)}catch(e){this.reportRenderPathError(e,r)}}};for(let[e,n]of this.bindings.entries())n===t&&r(n,e);for(let[e,n]of this.bindings.entries())n!==t&&r(n,e);return e}updateRenderingPipeline(){this.applyRenderingPipelineUpdate()}async applyRenderingPipelineUpdate(){if(this.isDestroyed)return;let e=++this.renderPipelineSwapId,t=()=>e!==this.renderPipelineSwapId||this.isDestroyed,r=!1,n=this.getCurrentBinding(),a=Array.from(this.bindings.entries());for(let[e,i]of[...a.filter(([,e])=>e===n),...a.filter(([,e])=>e!==n)]){if(t())return;if(this.bindings.get(e)!==i)continue;let n=this.mountOptionsByDataId.get(e)??{};try{let{data:a,selectedPath:o}=await this.loadPlanarData(e,{...n,role:i.role});if(t()||this.bindings.get(e)!==i||o.renderMode===i.rendering.renderMode)continue;let s=await this.addLoadedData(e,a,{renderMode:o.renderMode,role:i.role},()=>t()||this.bindings.get(e)!==i);r=r||s}catch(t){this.reportRenderPathError(t,e)}}if(t()||!r)return;let i=this.getCurrentPlanarRendering()?.renderMode;i&&this.renderContext.display.activateRenderMode(i),this.clearResolvedViewCache(),this.updateBindingsCameraState(),this.render(),Bh(Bc,NH.RENDERING_PIPELINE_CHANGED,{renderingEngineId:this.renderingEngineId,viewportId:this.id})}reportRenderPathError(e,t){let r=e instanceof Error?e.message:String(e),n=t??"";this.lastRenderPathErrorByDataId.get(n)!==r&&(this.lastRenderPathErrorByDataId.set(n,r),console.error("[PlanarViewport] Render path error",t??"",e),Bh(Bc,NH.RENDER_PATH_ERROR,{renderingEngineId:this.renderingEngineId,viewportId:this.id,dataId:t,error:e}))}requestRenderingEngineRender(){let e=FA(this.renderingEngineId);e&&e.renderViewport(this.id)}setRenderModeVisibility(e,t,r){let n="cpu"===BC(e),a=this.element.querySelector(".viewport-element");t.style.display=n?"":"none",t.style.pointerEvents=n?"auto":"none",r.style.display=n?"none":"",a&&(a.style.pointerEvents=n?"none":"")}createLegacyCompatibilityHost(){return{getElement:()=>this.element,getViewportId:()=>this.id,getRequestedOrientation:()=>this.resolveRequestedOrientation(),prepareVolumeCompatibilityCamera:()=>{this.viewState=this.normalizeViewState({...this.viewState,orientation:this.resolveRequestedOrientation()})},setDisplaySets:(...e)=>this.setDisplaySets(...e),setImageIdIndex:e=>this.setImageIdIndex(e),getCurrentImageId:()=>this.getCurrentImageId(),render:()=>this.render(),removeBindingsExcept:e=>this.removeBindingsExcept(e),setCameraOrientation:e=>{this.setViewState({orientation:this.resolveSetOrientation(e)})},setDataPresentationState:(e,t)=>{this.setDataPresentationState(e,t)},setDisplaySetPresentation:(e,t)=>{this.setDisplaySetPresentation(e,t)},getDisplaySetPresentation:e=>this.getDisplaySetPresentation(e),getCameraOrientation:()=>this.viewState.orientation,getCurrentPlanarRendering:()=>this.getCurrentPlanarRendering(),getActiveDataId:()=>this.mountedData.getActiveDataId(),getFirstBoundDataId:()=>this.mountedData.getFirstBoundDataId(),findDataIdByVolumeId:e=>this.mountedData.findDataIdByVolumeId(e),getBindingActor:e=>this.mountedData.getBindingActor(e),getDefaultVOIRange:e=>this.getDefaultVOIRange(e),getImageCount:()=>this.getImageIds().length,getMaxImageIdIndex:()=>this.getMaxImageIdIndex()}}updateBindingsCameraState(){let e=this.getCurrentBinding();e?e.applyViewState(this.viewState):this.renderContext.view.activeSourceICamera=void 0,this.forEachBinding(t=>{t!==e&&t.applyViewState(this.viewState)})}resizeBindingsWithActiveFirst(){let e=this.getCurrentBinding();e?.resize?.(),this.forEachBinding(t=>{t!==e&&t.resize?.()})}getActiveImageIdIndex(){let e=this.getCurrentBinding();if("volume"===this.getCurrentMode()){let e=this.getResolvedView()?.state?.currentImageIdIndex;if("number"==typeof e)return e}let t=e?.rendering?.currentImageIdIndex;return"number"==typeof t?t:this.viewState.slice?.kind==="stackIndex"?this.viewState.slice.imageIdIndex:0}getMaxImageIdIndex(){let e=this.getCurrentBinding(),t=e?.rendering?.maxImageIdIndex;return"number"==typeof t?t:Math.max(0,this.getImageIds().length-1)}getVolumeSliceWorldPointForImageIdIndex(e){let t=this.getResolvedView({sliceIndex:e})?.getSliceBasis(),r=t?.sliceCenterWorld;return r?[...r]:void 0}getPlanarData(){return this.getCurrentPlanarData()}getCurrentBinding(){return this.mountedData.getCurrentBinding()}removeReplaceableData(e){let t=this.resolveNextSourceId(e),r=void 0!==t&&t===this.getSourceDataId();for(let e of Array.from(this.bindings.keys()))r&&this.isSegmentationOverlayBinding(e)||this.removeData(e)}resolveNextSourceId(e){let t=e.find(e=>e.options?.role==="source");return t?.displaySetId??e[0]?.displaySetId}isSegmentationOverlayBinding(e){return"overlay"===this.getDisplaySetRole(e)&&this.getDataSet(e)?.reference?.kind==="segmentation"}getDataSet(e){var t;let r=HY(e);if(HJ(t=r)&&0!==t.imageIds.length&&(void 0===t.initialImageIdIndex||"number"==typeof t.initialImageIdIndex)&&(void 0===t.volumeId||"string"==typeof t.volumeId))return r}async loadPlanarData(e,t){let r=this.getDataSet(e);if(!r)throw Error(`[PlanarViewport] No registered planar dataset metadata for ${e}`);let n=this.resolveRequestedOrientation(t.orientation),a=function(e,t={}){return eac.select(e,t)}(r,{orientation:n,renderBackend:t.renderBackend??this.getInheritedOverlayRenderBackend(t.role)});return{data:await this.dataProvider.load(e,{acquisitionOrientation:a.acquisitionOrientation,orientation:n,renderMode:a.renderMode,volumeId:a.volumeId}),selectedPath:a,resolvedOrientation:n}}getInheritedOverlayRenderBackend(e){if("source"!==e){var t;return t=this.getCurrentPlanarRendering()?.renderMode,By(),t?Bm.get(t)?.backend:void 0}}applyLoadedPlanarViewState(e,t,r){var n;let a=Bw(r.renderMode),i=(n=r.acquisitionOrientation,!e||e===NQ.ACQUISITION||n&&e===n?NQ.ACQUISITION:ena(e)),o=a?this.createInitialVolumeSliceState(t,r.renderMode,i):{kind:"stackIndex",imageIdIndex:t.initialImageIdIndex??0};this.clearResolvedViewCache(),this.viewState=this.normalizeViewState({...this.viewState,slice:o,orientation:i})}createInitialVolumeSliceState(e,t,r){if(!e.imageVolume)return;let{height:n,width:a}=this.getCurrentCanvasDimensions(),i="cpu"===BC(t)?env:eny,o=r===NQ.ACQUISITION?e.initialImageIdIndex:void 0;if("number"==typeof o){let t=enf(e.imageVolume,o);if(t)return{kind:"volumePoint",sliceWorldPoint:t}}let{sliceBasis:s}=i({canvasHeight:n,canvasWidth:a,imageIdIndex:o,imageVolume:e.imageVolume,orientation:r});return{kind:"volumePoint",sliceWorldPoint:[...s.sliceCenterWorld]}}resolveRequestedOrientation(e){return ena((e??this.defaultOptions.orientation)||NQ.ACQUISITION)||NQ.ACQUISITION}resolveSetOrientation(e){var t;if("string"!=typeof e)return ena(e)||NQ.ACQUISITION;if((t=e)!==NQ.REFORMAT&&t!==NQ.AXIAL_REFORMAT&&t!==NQ.CORONAL_REFORMAT&&t!==NQ.SAGITTAL_REFORMAT)return e;let r=function(e){switch(e){case NQ.AXIAL_REFORMAT:return NQ.AXIAL;case NQ.CORONAL_REFORMAT:return NQ.CORONAL;case NQ.SAGITTAL_REFORMAT:return NQ.SAGITTAL;default:return}}(e),n=etU({getActors:()=>this.getActors(),getCamera:()=>this.getCameraForEvent(),getCurrentImageId:()=>this.getCurrentImageId(),getImageIds:()=>this.getImageIds(),type:Nq.ORTHOGRAPHIC},{useViewportNormal:!0,...r?{orientation:r}:{}});return n?{viewPlaneNormal:n.viewPlaneNormal,viewUp:n.viewUp}:r||this.viewState.orientation}removeBindingsExcept(e){this.mountedData.removeBindingsExcept(e)}resolveStackInputImage(e){let t=ql.getImage(e.imageId);return t||(e.imageData?function(e,t){let r=t.getDimensions(),n=t.getSpacing(),a=r[0]??1,i=r[1]??1,o=n[0]??1,s=n[1]??1,l=t.getPointData().getScalars(),u=l.getData(),d=u.length?function(e){let t,r=e[0],n=e[0],a=e.length;for(let i=1;i<a;i++)r=Math.min(r,t=e[i]),n=Math.max(n,t);return{min:r,max:n}}(u):{min:0,max:1},{min:c,max:h}=Number.isFinite(d.min)&&Number.isFinite(d.max)?d:{min:0,max:1},p=Math.max(h-c,1),m=u.constructor?.name||"Uint8Array";return{imageId:e,minPixelValue:c,maxPixelValue:h,slope:1,intercept:0,windowCenter:c+p/2,windowWidth:p,voiLUTFunction:N2.LINEAR,getPixelData:()=>u,getCanvas:()=>{let e=document.createElement("canvas");return e.width=a,e.height=i,e},rows:i,columns:a,height:i,width:a,color:!1,rgba:!1,numberOfComponents:l.getNumberOfComponents?.()??1,columnPixelSpacing:o,rowPixelSpacing:s,invert:!1,photometricInterpretation:"MONOCHROME2",sizeInBytes:u.byteLength??4*u.length,dataType:m}}(e.imageId,e.imageData):void 0)}resolveOverlayReference(e,t){let r=e.reference;return r&&"string"==typeof r.kind?r:{kind:"image",imageId:t.imageId}}resolveOverlayDataId(e,t,r){let n=e.dataId;if("string"==typeof n)return n;if("segmentation"===r.kind&&"string"==typeof r.representationUID)return r.representationUID;let a=t.imageId;return this.mountedData.hasBinding(a)?`overlay:${a}`:a}findBindingDataIdByActorEntryUID(e){return this.mountedData.findBindingDataIdByActorEntryUID(e)}findDataIdByVolumeId(e){return this.mountedData.findDataIdByVolumeId(e)}getCurrentPlanarRendering(){return this.getCurrentBinding()?.rendering}resolveViewState(e,t={}){let r=this.getPlanarData(),n=this.getCurrentPlanarRendering();return enP({viewState:e,data:r,frameOfReferenceUID:t.frameOfReferenceUID??this.resolveFrameOfReferenceUID(),renderContext:this.renderContext,rendering:n,sliceIndex:t.sliceIndex})}getProjectionSnapshot(){let{height:e,width:t}=this.getCurrentCanvasDimensions(),r=eab({viewport:this,canvasHeight:e,canvasWidth:t,displayArea:this.getDisplayArea(),frameOfReferenceUID:this.resolveFrameOfReferenceUID(),resolvedView:this.getResolvedView(),resolveViewState:e=>this.resolveViewState(e),viewState:this.viewState});if(!r)throw Error("[PlanarViewport] Unable to resolve projection snapshot");return r}getCachedPlanarCanvasDimensions(e){let t=this.cachedCanvasDimensions;if(t)return t;let r=enI({renderContext:this.renderContext,rendering:e});return r.canvasHeight>0&&r.canvasWidth>0&&(this.cachedCanvasDimensions=r),r}resolveCachedViewState(e,t={}){if(t.frameOfReferenceUID||"number"==typeof t.sliceIndex)return this.resolveViewState(e,t);let r=this.getPlanarData(),n=this.getCurrentPlanarRendering(),a=this.mountedData.getActiveDataId(),i=this.resolveFrameOfReferenceUID(),o=this.resolvedViewCache;if(!n)return this.resolveViewState(e,t);let{canvasHeight:s,canvasWidth:l}=this.getCachedPlanarCanvasDimensions(n);if(o&&o.activeDataId===a&&o.viewState===e&&o.data===r&&o.rendering===n&&o.frameOfReferenceUID===i&&o.canvasHeight===s&&o.canvasWidth===l&&o.revision===this.resolvedViewCacheRevision)return o.resolvedView;let u=enP({viewState:e,data:r,frameOfReferenceUID:i,renderContext:this.renderContext,rendering:n,canvasDimensions:{canvasHeight:s,canvasWidth:l}});return u&&(this.resolvedViewCache={activeDataId:a,canvasHeight:s,canvasWidth:l,data:r,frameOfReferenceUID:i,rendering:n,resolvedView:u,revision:this.resolvedViewCacheRevision,viewState:e}),u}clearResolvedViewCache(){this.resolvedViewCache=void 0,this.resolvedViewCacheRevision+=1}resolveFrameOfReferenceUID(){return this.viewReferences.resolveFrameOfReferenceUID()}getFallbackPan(e=this.viewState){let t=e.anchorCanvas??[.5,.5],r=e.anchorWorld??[0,0,0],{height:n,width:a}=this.getCurrentCanvasDimensions(),[i,o]=erW(e.scale);return[(0-r[0])*i+(t[0]-.5)*a,(0-r[1])*o+(t[1]-.5)*n]}getFallbackViewStateWithPan(e,t){let r=this.getFallbackPan(e),[n,a]=e.anchorCanvas??[.5,.5],{height:i,width:o}=this.getCurrentCanvasDimensions(),s=t[0]-r[0],l=t[1]-r[1];return this.normalizeViewState({...e,anchorCanvas:[n+s/Math.max(o,1),a+l/Math.max(i,1)],displayArea:void 0})}buildFallbackCanvasToWorld(e){let t=this.viewState.anchorCanvas??[.5,.5],r=this.viewState.anchorWorld??[0,0,0],{height:n,width:a}=this.getCurrentCanvasDimensions(),[i,o]=erW(this.viewState.scale);return[r[0]+(e[0]-t[0]*a)/i,r[1]+(e[1]-t[1]*n)/o,r[2]]}buildFallbackWorldToCanvas(e){let t=this.viewState.anchorCanvas??[.5,.5],r=this.viewState.anchorWorld??[0,0,0],{height:n,width:a}=this.getCurrentCanvasDimensions(),[i,o]=erW(this.viewState.scale);return[(e[0]-r[0])*i+t[0]*a,(e[1]-r[1])*o+t[1]*n]}applyResolvedViewState(e){let t=this.getResolvedCameraForEvent();this.clearResolvedViewCache(),this.viewState=this.normalizeViewState(e),this.modified(t)}getResolvedCameraForEvent(){return this.getResolvedView()?.toICamera()}getCameraForEvent(){let e=this.getResolvedView();return e?e.toICamera():this.getViewState()}getCurrentPresentation(){let e=this.getResolvedView();if(e)return{flipHorizontal:!0===e.state.viewState.flipHorizontal,flipVertical:!0===e.state.viewState.flipVertical,pan:e.pan,rotation:e.rotation,scale:e.scale,zoom:e.zoom}}getCurrentCanvasDimensions(){let e=this.getCurrentPlanarRendering();if(e){let{canvasHeight:t,canvasWidth:r}=this.getCachedPlanarCanvasDimensions(e);return{width:r||this.element.clientWidth,height:t||this.element.clientHeight}}return{width:this.element.clientWidth,height:this.element.clientHeight}}getCurrentPlanarData(){return this.getCurrentBinding()?.data}getReferenceViewContexts(){return this.viewReferences.getReferenceViewContexts(super.getReferenceViewContexts())}};function eaR(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function eaL(e,t,r={}){if(!t)return;let n=e.vtk.renderer.getActiveCamera();void 0!==t.parallelProjection&&n.setParallelProjection(t.parallelProjection),t.viewUp&&n.setViewUp(...t.viewUp),t.viewPlaneNormal&&n.setDirectionOfProjection(-t.viewPlaneNormal[0],-t.viewPlaneNormal[1],-t.viewPlaneNormal[2]),t.position&&n.setPosition(...t.position),t.focalPoint&&n.setFocalPoint(...t.focalPoint),void 0!==t.parallelScale&&n.setParallelScale(t.parallelScale),void 0!==t.viewAngle&&n.setViewAngle(t.viewAngle),void 0!==t.clippingRange?n.setClippingRange(...t.clippingRange):r.resetClippingRange&&e.vtk.renderer.resetCameraClippingRange()}function eaN(e){return e?[e[0],e[1],e[2]]:void 0}function eaV(e){var t;return{...e,clippingRange:(t=e.clippingRange)?[t[0],t[1]]:void 0,focalPoint:eaN(e.focalPoint),position:eaN(e.position),viewPlaneNormal:eaN(e.viewPlaneNormal),viewUp:eaN(e.viewUp)}}let eaF="volume3d";function eaB(e){let{viewport:t}=e,r=e.resolvedView??t.getResolvedView?.(),n=e.camera??t.getViewState?.(),a=r?.toICamera()??n;if(!a)return;let i=eaV(a),o=e.canvasWidth??t.canvas?.clientWidth??t.element?.clientWidth??1,s=e.canvasHeight??t.canvas?.clientHeight??t.element?.clientHeight??1,l=e.frameOfReferenceUID??r?.getFrameOfReferenceUID()??t.getFrameOfReferenceUID?.();return{kind:eaF,adapterId:eaF,canvasHeight:s,canvasWidth:o,dataId:e.dataId,frameOfReferenceUID:l,presentation:{camera:eaV(i),position:function(e){if(e.focalPoint)return{kind:"focalPoint",worldPoint:eaN(e.focalPoint)}}(i),rotation:i.rotation,scale:function(e){let{camera:t,canvasHeight:r}=e;if("number"==typeof t.parallelScale)return{kind:"physical",mmPerCanvasPixel:2*t.parallelScale/Math.max(r,1)}}({camera:i,canvasHeight:s})},rendererCamera:eaV(i),resolvedView:r,spaces:{canvas:!!r,renderer:!0,world:!!(r||i.focalPoint)},transforms:r?{canvasToWorld:e=>r.canvasToWorld(e),worldToCanvas:e=>r.worldToCanvas(e)}:void 0,viewState:eaV(i),viewportType:t.type}}let eaj={id:eaF,viewportTypes:[Nq.VOLUME_3D_NEXT],getSnapshot:e=>eaB(e),getPresentation:e=>({...e.presentation,camera:eaV(e.presentation.camera)}),withPresentation:(e,t,r)=>eaV({...e.presentation.camera,...Object.prototype.hasOwnProperty.call(t,"camera")?t.camera??{}:t}),applyToRenderer:(e,t)=>{t&&"object"==typeof t&&"vtk"in t&&t.vtk?.renderer&&eaL(t,e.rendererCamera,{resetClippingRange:!0})}};function eaW(){return{currentTimeSeconds:0,anchorCanvas:[.5,.5],scale:1,scaleMode:"fit",rotation:0}}function eaU(e){var t;return{...void 0!==e.currentTimeSeconds?{currentTimeSeconds:Math.max(0,e.currentTimeSeconds)}:{},anchorCanvas:[(t=e.anchorCanvas??[.5,.5])[0],t[1]],scale:Math.max(e.scale??1,.001),scaleMode:"fit",rotation:e.rotation??0,...e.anchorWorld?{anchorWorld:eaH(e.anchorWorld)}:{}}}function eaz(e){var t;let{containerWidth:r,containerHeight:n,intrinsicWidth:a,intrinsicHeight:i,objectFit:o="contain",camera:s}=e;if(!r||!n||!a||!i)return;let l=Math.min(r/a,n/i),u=Math.max(r/a,n/i),d=a*l,c=i*l;switch(o){case"cover":d=a*u,c=i*u;break;case"fill":d=r,c=n;break;case"none":d=a,c=i;break;case"scale-down":{let e=Math.min(1,l);d=a*e,c=i*e}}let h=Math.max(s?.scale??1,.001);d*=h,c*=h;let p=d/a,m=[(t=s?.anchorCanvas??[.5,.5])[0],t[1]],f=eaH(s?.anchorWorld)??[a/2,i/2];return{left:r*m[0]-f[0]*p,top:n*m[1]-f[1]*p,width:d,height:c,containerWidth:r,containerHeight:n,intrinsicWidth:a,intrinsicHeight:i,anchorWorld:f,anchorCanvas:m,worldToCanvasRatio:p}}function eaH(e){return e?[e[0],e[1]]:void 0}let eaG={rotation:!0,zoom:!0,pan:!0};function eaq(e,t){return Object.prototype.hasOwnProperty.call(e,t)}let ea$="video";function eaK(e){return[e[0],e[1]]}let eaY={id:ea$,viewportTypes:[Nq.VIDEO_NEXT],getSnapshot:e=>(function(e){let{viewport:t}=e,r=eaU(e.viewState??t.getViewState?.()??{}),n=e.resolvedView??t.getResolvedView?.(),a=e.canvasWidth??n?.state?.containerWidth??t.element?.clientWidth??1,i=e.canvasHeight??n?.state?.containerHeight??t.element?.clientHeight??1,o=[a/2,i/2],s=function(e,t,r){if(e){let r=e.canvasToWorld(t);return[r[0],r[1]]}return r.anchorWorld?eaK(r.anchorWorld):[0,0]}(n,o,r),l=n?.zoom??Math.max(r.scale??1,.001),u=n?.pan??[0,0],d=n?.toICamera(),c=e.frameOfReferenceUID??n?.getFrameOfReferenceUID()??t.getFrameOfReferenceUID?.();return{kind:ea$,adapterId:ea$,canvasHeight:i,canvasWidth:a,dataId:e.dataId,frameOfReferenceUID:c,presentation:{pan:eaK(u),position:{kind:"mediaPoint",mediaPoint:s,canvasPoint:o},rawPan:eaK(u),rotation:n?.rotation??r.rotation??0,scale:function(e,t){let r;return e?{kind:"nativePixel",pixelsPerCanvasPixel:(r=e.canvasToWorld([0,0]),Math.abs(e.canvasToWorld([1,0])[0]-r[0])||1)}:{kind:"fit",value:t}}(n,l),zoom:l},rendererCamera:d,resolvedView:n,spaces:{canvas:!0,image:!1,renderer:!!d,world:!!n},transforms:n?{canvasToWorld:e=>n.canvasToWorld(e),worldToCanvas:e=>n.worldToCanvas(e)}:void 0,viewState:r,viewportType:t.type}})(e),getPresentation:(e,t)=>(function(e,t){let r={},n=t??eaG,a=e.presentation.zoom??1;if(n.rotation&&(r.rotation=e.presentation.rotation??0),n.zoom&&(r.zoom=a),n.pan){let t=e.presentation.rawPan;r.pan=[t[0]/a,t[1]/a]}return r})(e,t),withPresentation:(e,t,r)=>(function(e,t,r={}){let n=e.viewState??{},a=eaq(t,"zoom"),i=eaq(t,"pan"),o=eaq(t,"rotation"),s=Math.max(t.zoom??e.presentation.zoom??n.scale??1,.001),l=e.resolvedView,u=eaU({...n,...o?{rotation:t.rotation??0}:{}});if(a&&(l?(l=l.withZoom(s,r.anchorCanvas),u=eaU({...l.state?.viewState,...o?{rotation:t.rotation??0}:{}})):u=eaU({...u,scale:s,scaleMode:"fit"})),i&&t.pan){let e=[t.pan[0]*s,t.pan[1]*s];l&&(u=eaU({...l.withPan(e).state?.viewState,...o?{rotation:t.rotation??0}:{}}))}return u})(e,t,r)},eaZ={zoom:!0,pan:!0};function eaX(e,t){return Object.prototype.hasOwnProperty.call(e,t)}let eaJ={id:"ecg",viewportTypes:[Nq.ECG_NEXT],getSnapshot:e=>(function(e){let{viewport:t}=e,r=e.viewState??t.getViewState?.();if(!r)return;let n=erI(r),a=e.resolvedView??t.getResolvedView?.(),i=e.canvasWidth??a?.state?.canvas?.clientWidth??t.canvas?.clientWidth??t.element?.clientWidth??1,o=e.canvasHeight??a?.state?.canvas?.clientHeight??t.canvas?.clientHeight??t.element?.clientHeight??1,s=[i/2,o/2],l=a?.canvasToWorld(s),u=a?.zoom??Math.max(n.scale??1,.001),d=a?.pan??[0,0],c=a?.toICamera(),h=e.frameOfReferenceUID??a?.getFrameOfReferenceUID()??t.getFrameOfReferenceUID?.();return{kind:"ecg",adapterId:"ecg",canvasHeight:o,canvasWidth:i,dataId:e.dataId,frameOfReferenceUID:h,presentation:{pan:[d[0],d[1]],position:function(e,t){if(e)return{kind:"signalPoint",sampleIndex:e[0],value:e[1],channelIndex:e[2],canvasPoint:t}}(l,s),rawPan:[d[0],d[1]],scale:function(e,t){let r,n,a;return e?(r=e.canvasToWorld([0,0]),n=e.canvasToWorld([1,0]),a=e.canvasToWorld([0,1]),{kind:"signal",samplesPerCanvasPixel:Math.abs(n[0]-r[0])||0,valueUnitsPerCanvasPixel:Math.abs(a[1]-r[1])||0}):{kind:"fit",value:t}}(a,u),zoom:u},rendererCamera:c,resolvedView:a,spaces:{canvas:!0,image:!1,renderer:!!c,world:!!a},transforms:a?{canvasToWorld:e=>a.canvasToWorld(e),worldToCanvas:e=>a.worldToCanvas(e)}:void 0,viewState:n,viewportType:t.type}})(e),getPresentation:(e,t)=>(function(e,t){let r={},n=t??eaZ,a=e.presentation.zoom??1;if(n.zoom&&(r.zoom=a),n.pan){let t=e.presentation.rawPan;r.pan=[t[0]/a,t[1]/a]}return r})(e,t),withPresentation:(e,t,r)=>(function(e,t,r={}){let n=e.viewState,a=eaX(t,"zoom"),i=eaX(t,"pan"),o=Math.max(t.zoom??e.presentation.zoom??n.scale??1,.001),s=e.resolvedView,l=erI(n);if(a&&(l=s?erI((s=s.withZoom(o,r.anchorCanvas)).state.viewState):erI({...l,scale:o,scaleMode:"fit"})),i&&t.pan){let e=[t.pan[0]*o,t.pan[1]*o];s&&(l=erI(s.withPan(e).state.viewState))}return l})(e,t,r)},eaQ={rotation:!0,zoom:!0};function ea0(e,t){return Object.prototype.hasOwnProperty.call(e,t)}let ea1={id:"wsi",viewportTypes:[Nq.WHOLE_SLIDE_NEXT],getSnapshot:e=>(function(e){let{viewport:t}=e,r=e.viewState??t.getViewState?.();if(!r)return;let n={...r,centerIndex:r.centerIndex?[r.centerIndex[0],r.centerIndex[1]]:void 0,resolution:"number"==typeof r.resolution?Math.max(r.resolution,1e-6):void 0,rotation:r.rotation??0,zoom:Math.max(r.zoom??1,.001)},a=e.resolvedView??t.getResolvedView?.(),i=e.canvasWidth??a?.state?.canvasWidth??t.element?.clientWidth??1,o=e.canvasHeight??a?.state?.canvasHeight??t.element?.clientHeight??1,s=[i/2,o/2],l=a?.canvasToWorld(s),u=a?.toICamera(),d=a?.state?.view,c=Math.max(d?.getZoom?.()??n.zoom??1,.001),h=d?.getRotation?.()??n.rotation??0,p=e.frameOfReferenceUID??a?.getFrameOfReferenceUID()??t.getFrameOfReferenceUID?.();return{kind:"wsi",adapterId:"wsi",canvasHeight:o,canvasWidth:i,dataId:e.dataId,frameOfReferenceUID:p,presentation:{position:{kind:"anchor",worldPoint:l,canvasPoint:[s[0],s[1]]},rotation:h,scale:function(e){let{canvasHeight:t,rendererCamera:r,zoom:n}=e;return"number"==typeof r?.parallelScale?{kind:"physical",mmPerCanvasPixel:r.parallelScale/Math.max(t,1)}:{kind:"fit",value:n}}({canvasHeight:o,rendererCamera:u,zoom:c}),zoom:c},rendererCamera:u,resolvedView:a,spaces:{canvas:!!a,image:!0,renderer:!!u,world:!!a},transforms:a?{canvasToWorld:e=>a.canvasToWorld(e),worldToCanvas:e=>a.worldToCanvas(e)}:void 0,viewState:n,viewportType:t.type}})(e),getPresentation:(e,t)=>{let r,n;return r={},(n=t??eaQ).zoom&&(r.zoom=e.presentation.zoom),n.rotation&&(r.rotation=e.presentation.rotation),r},withPresentation:(e,t,r)=>(function(e,t,r={}){let n=ea0(t,"zoom"),a=ea0(t,"rotation"),i=Math.max(t.zoom??e.presentation.zoom??e.viewState.zoom??1,.001),o={...e.viewState,centerIndex:e.viewState.centerIndex?[e.viewState.centerIndex[0],e.viewState.centerIndex[1]]:void 0};return n&&(e.resolvedView?o={...e.resolvedView.withZoom(i,r.anchorCanvas).state.viewState}:o.zoom=i),a&&(o.rotation=t.rotation??0),o})(e,t,r)},ea2=new class{constructor(){this.adapters=new Map}register(e){this.adapters.set(e.id,e)}unregister(e){this.adapters.delete(e)}getAdapter(e,t={}){var r;let n,a=void 0===(n=(r={...t,viewport:e}).viewportType??r.viewport?.type)?void 0:String(n);for(let e of this.adapters.values())if((!t.kind||e.id===t.kind)&&(!a||e.viewportTypes.some(e=>String(e)===a)))return e}get(e,t={}){let r=this.getAdapter(e,t);return r?.getSnapshot({...t,viewport:e})}getPresentation(e,t={}){let r=this.getAdapter(e,t),n=r?.getSnapshot({...t,viewport:e});if(n)return r.getPresentation(n,t.selector)}withPresentation(e,t,r={},n){let a=this.getAdapter(e,r),i=a?.getSnapshot({...r,viewport:e});if(i)return a.withPresentation(i,t,n)}getRegisteredAdapters(){return Array.from(this.adapters.values())}clear(){this.adapters.clear()}};ea2.register(eaE),ea2.register(eaj),ea2.register(eaY),ea2.register(eaJ),ea2.register(ea1);let ea5=class{constructor(e){this.host=e,this.managedDataIds=new Set,this.volumeDataIds=new Map,this.stackSetRequestId=0,this.properties=new Map,this.globalDefaultProperties=new Map,this.perImageIdDefaultProperties=new Map,this.onStackNewImage=e=>{if(0===this.perImageIdDefaultProperties.size)return;let t=e.detail,r=t?.imageId,n=this.resolveTargetDataId();if(!n)return;let a=r?this.getPerImageDefaultProperties(r):void 0,i=this.globalDefaultProperties.get(n),o=a||i;o&&this.setProperties(o)},e.getElement().addEventListener(NH.STACK_NEW_IMAGE,this.onStackNewImage)}async setStack(e,t=0){if(!e.length)throw Error("[PlanarViewport] Cannot set an empty stack");let r=++this.stackSetRequestId,n=this.getLegacyStackDataId(),a=Math.min(Math.max(0,t),e.length-1),i=!1;try{if(this.host.removeBindingsExcept(new Set),this.registerDataSet(n,{imageIds:e,initialImageIdIndex:a}),i=!0,await this.host.setDisplaySets({displaySetId:n,options:{orientation:this.host.getRequestedOrientation()}}),r!==this.stackSetRequestId)return e[a];let t=await this.host.setImageIdIndex(a);return this.prunePerImageDefaultProperties(new Set(e)),this.host.getCurrentImageId()||t}catch(e){throw i&&r===this.stackSetRequestId&&this.removeData(n),e}}async setVolumes(e,t=!1,r=!1){await this.mountVolumes(e,!0,r),t&&this.host.render()}async addVolumes(e,t=!1,r=!1){await this.mountVolumes(e,!1,r),t&&this.host.render()}setProperties(e={},t,r=!1){let n="string"==typeof t?t:void 0,a=this.resolveTargetDataId(n);if(!a)return;let i=ens(this.properties.get(a)||{},e),o=this.globalDefaultProperties.get(a)||{};this.globalDefaultProperties.set(a,ens(e,o)),this.properties.set(a,i),void 0!==e.orientation&&this.host.setCameraOrientation(ena(e.orientation)),this.host.setDataPresentationState(a,enl(i)),r||void 0===e.colormap||this.emitColormapModified(a,n)}setDefaultProperties(e={},t){if(null==t){let t=this.resolveTargetDataId();if(!t)return;this.globalDefaultProperties.set(t,eno(e));return}this.setPerImageDefaultProperties(t,eno(e)),this.host.getCurrentImageId()===t&&this.setProperties(e)}clearDefaultProperties(e){if(null==e){let e=this.resolveTargetDataId();e&&this.globalDefaultProperties.delete(e),this.resetProperties();return}this.perImageIdDefaultProperties.delete(e),this.resetToDefaultProperties()}resetToDefaultProperties(){let e=this.resolveTargetDataId();if(!e)return;let t=this.host.getCurrentImageId(),r=(t?this.getPerImageDefaultProperties(t):void 0)||this.globalDefaultProperties.get(e)||{};this.properties.set(e,eno(r)),void 0!==r.orientation&&this.host.setCameraOrientation(ena(r.orientation)),this.host.setDataPresentationState(e,enl(r))}getProperties(e){let t=this.resolveTargetDataId(e),r=t?this.host.getDisplaySetPresentation(t):void 0,n={...eno((t?this.properties.get(t):void 0)||{}),...r?eno(r):{},...this.host.getCameraOrientation()?{orientation:ena(this.host.getCameraOrientation())}:{}};if(!n.voiRange&&t){let e=this.host.getDefaultVOIRange(t);e&&(n.voiRange={...e})}return n}resetProperties(e){let t=this.resolveTargetDataId(e);t&&(this.properties.set(t,{}),this.host.setDataPresentationState(t,{}))}getBlendMode(e=[]){let t=this.getBlendModeTargetDataIds(e)[0];if(!t)return;let r=this.host.getDisplaySetPresentation(t)?.blendMode;if(void 0!==r)return r;let n=this.host.getBindingActor(t),a=n?.getMapper?.(),i=a?.getBlendMode?.();return void 0!==i?i:ean(a?.getSlabType?.())}setBlendMode(e,t=[],r=!1){let n=this.getBlendModeTargetDataIds(t);n.length&&(n.forEach(t=>{let r=ens(this.properties.get(t)||{},{blendMode:e});this.properties.set(t,r),this.host.setDisplaySetPresentation(t,{blendMode:e})}),r&&this.host.render())}getNumberOfSlices(){return Math.max(this.host.getImageCount(),this.host.getMaxImageIdIndex()+1)}removeData(e){this.managedDataIds.delete(e)&&this.unregisterDataId(e)}destroy(){let e;for(let t of(this.host.getElement().removeEventListener(NH.STACK_NEW_IMAGE,this.onStackNewImage),Array.from(this.managedDataIds)))try{this.unregisterDataId(t)}catch(t){e??=t}if(this.managedDataIds.clear(),this.volumeDataIds.clear(),this.properties.clear(),this.globalDefaultProperties.clear(),this.perImageIdDefaultProperties.clear(),void 0!==e)throw e}getLegacyStackDataId(){return`__planar_v2__:${this.host.getViewportId()}:stack`}getLegacyVolumeDataId(e){return`__planar_v2__:${this.host.getViewportId()}:volume:${e}`}registerDataSet(e,t){H$.add(e,t),this.managedDataIds.add(e)}async mountVolumes(e,t,r){if(!e.length)return;let n=[];try{for(let t of e){let e=ql.getVolume(t.volumeId);if(!e)throw Error(`imageVolume with id: ${t.volumeId} does not exist, you need to create/allocate the volume first`);let r=this.getLegacyVolumeDataId(t.volumeId);this.registerDataSet(r,{imageIds:e.imageIds,initialImageIdIndex:this.getInitialVolumeImageIdIndex(e.imageIds.length),reference:{kind:"volume",volumeId:t.volumeId},volumeId:t.volumeId}),this.volumeDataIds.set(t.volumeId,r),n.push(r)}t&&this.host.removeBindingsExcept(new Set(n)),this.host.prepareVolumeCompatibilityCamera();let a={orientation:this.host.getRequestedOrientation()},i=this.host.getActiveDataId();await this.host.setDisplaySets(...n.map((e,r)=>({displaySetId:e,options:{...a,role:0===r&&(t||!i)?"source":"overlay"}}))),e.forEach((e,t)=>{let r=n[t];if(void 0!==e.visibility&&this.host.setDisplaySetPresentation(r,{visible:e.visibility}),void 0!==e.blendMode){let t=ens(this.properties.get(r)||{},{blendMode:e.blendMode});this.properties.set(r,t),this.host.setDisplaySetPresentation(r,{blendMode:e.blendMode})}void 0!==e.slabThickness&&this.host.setDisplaySetPresentation(r,{slabThickness:e.slabThickness});let a=this.host.getBindingActor(r);if(a&&e.callback){e.callback({volumeActor:a,volumeId:e.volumeId});let t=this.buildVolumePresentationFromActor(r);t&&this.applyVolumePresentation(r,t)}}),r||Bh(this.host.getElement(),NH.VOLUME_VIEWPORT_NEW_VOLUME,{viewportId:this.host.getViewportId(),volumeActors:this.buildVolumeActorEntries(e,n)})}catch(e){throw n.forEach(e=>{this.removeData(e)}),e}}getInitialVolumeImageIdIndex(e){let t=this.host.getCurrentPlanarRendering();return t&&(t.renderMode===eyK.CPU_VOLUME||t.renderMode===eyK.VTK_VOLUME_SLICE)?Math.min(Math.max(0,t.currentImageIdIndex),Math.max(e-1,0)):Math.floor(e/2)}getBlendModeTargetDataIds(e){let t=Array.from(new Set(this.volumeDataIds.values()));return e.length?t.filter(t=>{let r=this.host.getBindingActor(t),n=r?.getUID?.()||r?.uid||(r?.get?.("uid")?.uid??void 0);return!!n&&e.includes(n)}):t}resolveTargetDataId(e){if(e){let t=this.volumeDataIds.get(e)||this.host.findDataIdByVolumeId(e);if(t)return t}return this.host.getActiveDataId()||this.host.getFirstBoundDataId()}emitColormapModified(e,t){let r=t||this.resolveVolumeIdForDataId(e),n=(r?this.buildVolumeColormap(e):void 0)||this.properties.get(e)?.colormap;n&&Bh(this.host.getElement(),NH.COLORMAP_MODIFIED,{viewportId:this.host.getViewportId(),volumeId:r,colormap:n})}applyVolumePresentation(e,t){let r=ens(this.properties.get(e)||{},t);this.properties.set(e,r);let n=this.globalDefaultProperties.get(e)||{};this.globalDefaultProperties.set(e,ens(r,n)),this.host.setDataPresentationState(e,enl(r))}buildVolumeActorEntries(e,t){return e.flatMap((e,r)=>{let n=this.host.getBindingActor(t[r]);if(!n)return[];let{actorUID:a,slabThickness:i,volumeId:o,...s}=e;return[{uid:a||o,actor:n,slabThickness:i,referencedId:o,...s}]})}buildVolumeColormap(e){let t=this.host.getBindingActor(e),r=t?.getProperty?.().getRGBTransferFunction?.(0);if(!t||!r)return;let n=Go(Gh(r).reduce((e,t)=>(e.push(t[0],t[1],t[2],t[3]),e),[]),t)||{},a=Gd(t);return void 0===n.opacity&&(n.opacity=Gc(t)),null!==a&&(n.threshold=a),Object.keys(n).length?n:void 0}buildVolumePresentationFromActor(e){let t=this.host.getBindingActor(e),r=t?.getProperty?.().getRGBTransferFunction?.(0),n=this.buildVolumeColormap(e),a=t?.getMapper?.(),i=a?.getBlendMode?.()??ean(a?.getSlabType?.()),o=r?.getRange?.(),s={};return n&&(s.colormap=n),o&&o[1]>o[0]&&(s.voiRange={lower:o[0],upper:o[1]}),void 0!==i&&(s.blendMode=i),Object.keys(s).length?s:void 0}resolveVolumeIdForDataId(e){for(let[t,r]of this.volumeDataIds.entries())if(r===e)return t}getPerImageDefaultProperties(e){let t=this.perImageIdDefaultProperties.get(e);return t&&(this.perImageIdDefaultProperties.delete(e),this.perImageIdDefaultProperties.set(e,t)),t}setPerImageDefaultProperties(e,t){this.perImageIdDefaultProperties.has(e)&&this.perImageIdDefaultProperties.delete(e),this.perImageIdDefaultProperties.set(e,t),this.evictPerImageDefaultProperties()}prunePerImageDefaultProperties(e){for(let t of this.perImageIdDefaultProperties.keys())e.has(t)||this.perImageIdDefaultProperties.delete(t);this.evictPerImageDefaultProperties()}evictPerImageDefaultProperties(){for(;this.perImageIdDefaultProperties.size>2048;){let e=this.perImageIdDefaultProperties.keys().next().value;if(void 0===e)return;this.perImageIdDefaultProperties.delete(e)}}unregisterDataId(e){try{H$.remove(e)}finally{this.properties.delete(e),this.globalDefaultProperties.delete(e),this.removeVolumeDataId(e)}}removeVolumeDataId(e){for(let[t,r]of this.volumeDataIds.entries())r===e&&this.volumeDataIds.delete(t)}},ea3=class extends eaA{constructor(){super(...arguments),this.legacyCompatibility=new ea5(this.createLegacyCompatibilityHost())}cloneTuple(e){if(e)return Array.from(e)}getCamera(){let e=this.getViewState(),t={...e,...this.getCameraForEvent()},r=e.orientation&&"object"==typeof e.orientation?{...e.orientation,viewUp:this.cloneTuple(e.orientation.viewUp),viewPlaneNormal:this.cloneTuple(e.orientation.viewPlaneNormal)}:e.orientation;return{...t,focalPoint:this.cloneTuple(t.focalPoint),position:this.cloneTuple(t.position),viewUp:this.cloneTuple(t.viewUp),viewPlaneNormal:this.cloneTuple(t.viewPlaneNormal),orientation:r}}setCamera(e){let t={};(this.applyLegacyPlanarPresentationPatch(t,e),this.applyLegacyParallelScalePatch(t,e),this.applyLegacyOrientationPatch(t,e),this.applyLegacyFocalPointPatch(t,e),!e.position||e.focalPoint||Object.keys(t).length)?Object.keys(t).length&&this.setViewState(t):this.warnUnsupportedPositionOnlyCameraPatch()}getViewPresentation(e){return ea2.getPresentation(this,{selector:e})}setViewPresentation(e){if(!e)return;eaR(e,"displayArea")&&(this.options={...this.options,displayArea:G_(e.displayArea)});let t=ea2.withPresentation(this,e);t&&this.setViewState(t)}resetCamera(e){return this.resetViewState(e)}resetCameraForResize(){return this.resetViewStateForResize()}get volumeIds(){let e=new Set;for(let t of this.getActors())for(let r of[t.referencedId,t.uid])"string"==typeof r&&ql.getVolume(r)&&e.add(r);return e}get csImage(){return this.getCornerstoneImage()}getCornerstoneImage(){let e=this.getCurrentBinding()?.data;return e?.image}getAllVolumeIds(){return Array.from(this.volumeIds)}applyLegacyPlanarPresentationPatch(e,t){eaR(t,"orientation")&&(e.orientation=t.orientation),eaR(t,"anchorWorld")&&(e.anchorWorld=er2(t.anchorWorld)),eaR(t,"anchorCanvas")&&(e.anchorCanvas=t.anchorCanvas?[...t.anchorCanvas]:void 0),eaR(t,"scale")&&(e.scale=t.scale),eaR(t,"scaleMode")&&(e.scaleMode=t.scaleMode),eaR(t,"rotation")&&(e.rotation=t.rotation),eaR(t,"flipHorizontal")&&(e.flipHorizontal=t.flipHorizontal),eaR(t,"flipVertical")&&(e.flipVertical=t.flipVertical),eaR(t,"displayArea")&&(e.displayArea=t.displayArea),eaR(t,"slice")&&(e.slice=t.slice)}applyLegacyParallelScalePatch(e,t){if("number"!=typeof t.parallelScale)return;let r=this.getResolvedView()?.toICamera();if(!r||"number"!=typeof r.parallelScale)return;let n=this.getScale(),a=Math.max(r.presentationScale?.[1]??n[1]??1,1e-6),i=Math.max(r.presentationScale?.[0]??n[0]??a,1e-6),o=r.parallelScale*a/Math.max(t.parallelScale,1e-6);e.displayArea=void 0,e.scale=[i/a*o,o],e.scaleMode="fit"}applyLegacyOrientationPatch(e,t){if(!t.viewPlaneNormal)return;let r=this.getResolvedView()?.toICamera();e.orientation={viewPlaneNormal:[...t.viewPlaneNormal],viewUp:t.viewUp?[...t.viewUp]:r?.viewUp?[...r.viewUp]:void 0}}applyLegacyFocalPointPatch(e,t){if(!t.focalPoint)return;let r=[...t.focalPoint];e.anchorCanvas=[.5,.5],e.anchorWorld=r,e.displayArea=void 0,this.isVolumeSliceRenderingActive()&&(e.slice={kind:"volumePoint",sliceWorldPoint:r})}isVolumeSliceRenderingActive(){let e=this.getCurrentPlanarRendering();return e?.renderMode===eyK.CPU_VOLUME||e?.renderMode===eyK.VTK_VOLUME_SLICE}warnUnsupportedPositionOnlyCameraPatch(){"u"<typeof process&&console.warn("[PlanarViewportLegacyAdapter] Position-only planar camera patches are unsupported. Use focalPoint, parallelScale, or view state APIs.")}removeData(e){super.removeData(e),this.legacyCompatibility.removeData(e)}getActor(e){return this.getActors().find(t=>t.uid===e)}removeActors(e){let t=!1;e.filter(e=>"string"==typeof e).forEach(e=>{let r=this.findBindingDataIdByActorEntryUID(e);r&&("overlay"===this.getDisplaySetRole(r)&&H$.remove(r),this.removeData(r),t=!0)}),t&&this.render()}async setStack(e,t=0){return this.legacyCompatibility.setStack(e,t)}async setVolumes(e,t=!1,r=!1){return this.legacyCompatibility.setVolumes(e,t,r)}async addVolumes(e,t=!1,r=!1){return this.legacyCompatibility.addVolumes(e,t,r)}setProperties(e={},t,r=!1){this.legacyCompatibility.setProperties(e,t,r)}getProperties(e){return this.legacyCompatibility.getProperties(e)}resetProperties(e){this.legacyCompatibility.resetProperties(e)}setDefaultProperties(e={},t){this.legacyCompatibility.setDefaultProperties(e,t)}clearDefaultProperties(e){this.legacyCompatibility.clearDefaultProperties(e)}resetToDefaultProperties(){this.legacyCompatibility.resetToDefaultProperties()}getBlendMode(e){return this.legacyCompatibility.getBlendMode(e)}setBlendMode(e,t,r=!1){this.legacyCompatibility.setBlendMode(e,t,r)}getSlabThickness(){let e=FI.MINIMUM_SLAB_THICKNESS;for(let t of this.getActors())t.slabThickness>e&&(e=t.slabThickness);return e}getNumberOfSlices(){return this.legacyCompatibility.getNumberOfSlices()}onDestroy(){this.legacyCompatibility.destroy(),super.onDestroy()}},{Qy:ea4,FM:ea8,Hf:ea6}=Z;class ea9{async load(e){let t=et5(HX(e));return{id:e,type:"video",renderedUrl:t.renderedUrl,fps:t.cineRate||30,numberOfFrames:t.numberOfFrames||1,frameRange:[1,t.numberOfFrames||1],modality:t.modality,metadata:t.metadata}}}class ea7{async addData(e,t,r){let n=document.createElement("video");n.src=t.renderedUrl,n.preload="auto",n.crossOrigin="anonymous",n.playsInline=!0,n.style.position="absolute",n.style.left="0",n.style.top="0",n.style.transformOrigin="top left",n.style.objectFit="fill",await new Promise(t=>{let r=()=>{n.removeEventListener("loadedmetadata",r),t()};n.addEventListener("loadedmetadata",r),e.element.appendChild(n)});let a=et3({durationSeconds:n.duration,cineRate:t.fps,numberOfFrames:t.numberOfFrames}),i={...t,durationSeconds:n.duration,fps:a.fps,numberOfFrames:a.numberOfFrames,frameRange:a.frameRange};Object.assign(t,i);let o={renderMode:"video2d",element:n};return{rendering:o,updateDataPresentation:e=>{this.updateDataPresentation(o,e)},applyViewState:e=>{this.applyViewState(o,e,t)},getFrameOfReferenceUID:()=>this.getFrameOfReferenceUID(o),removeData:()=>{this.removeData(o)}}}updateDataPresentation(e,t){let{element:r}=e;r.style.display=t?.visible===!1?"none":"",r.style.opacity=String(t?.opacity??1),r.loop=t?.loop??!0,r.muted=t?.muted??!0,r.playbackRate=t?.playbackRate??1,r.style.objectFit=t?.objectFit??"contain"}applyViewState(e,t,r){let{element:n}=e,a=t.rotation??0,i=this.getCanvasMapping(n,t);e.currentCamera=t,i&&(n.style.width=`${i.width}px`,n.style.height=`${i.height}px`,n.style.left=`${i.left}px`,n.style.top=`${i.top}px`),n.style.transform=`rotate(${a}deg)`,"number"==typeof t.currentTimeSeconds&&Math.abs(n.currentTime-t.currentTimeSeconds)>.5/Math.max(1,r.fps)&&(n.currentTime=t.currentTimeSeconds)}canvasToWorld(e,t){let r=this.getCanvasMapping(e.element,e.currentCamera);return r?[(t[0]-r.left)/r.worldToCanvasRatio,(t[1]-r.top)/r.worldToCanvasRatio,0]:[0,0,0]}worldToCanvas(e,t){let r=this.getCanvasMapping(e.element,e.currentCamera);return r?[r.left+t[0]*r.worldToCanvasRatio,r.top+t[1]*r.worldToCanvasRatio]:[0,0]}getCanvasMapping(e,t){let r=e.parentElement;return eaz({containerWidth:r?.clientWidth??0,containerHeight:r?.clientHeight??0,intrinsicWidth:e.videoWidth||r?.clientWidth||0,intrinsicHeight:e.videoHeight||r?.clientHeight||0,objectFit:e.style.objectFit,camera:t})}getFrameOfReferenceUID(e){let{element:t}=e;return t.currentSrc||t.src}removeData(e){let{element:t}=e;t.pause(),t.remove()}}class eie{constructor(){this.id="video:html-element",this.type=Nq.VIDEO_NEXT}matches(e,t){return"video"===e.type&&"video2d"===t.renderMode}createRenderPath(){return new ea7}}let eit=class e extends erA{get zoom(){return Math.max(this.state.viewState.scale??1,.001)}get pan(){var e;return this.getCanvasMapping()?[(e=this.getCanvasMapping()).left/e.worldToCanvasRatio,e.top/e.worldToCanvasRatio]:[0,0]}get rotation(){return this.state.viewState.rotation??0}canvasToWorld(e){let t=this.getCanvasMapping();return[(e[0]-t.left)/t.worldToCanvasRatio,(e[1]-t.top)/t.worldToCanvasRatio,0]}worldToCanvas(e){let t=this.getCanvasMapping();return[t.left+e[0]*t.worldToCanvasRatio,t.top+e[1]*t.worldToCanvasRatio]}getFrameOfReferenceUID(){return this.state.frameOfReferenceUID}withZoom(e,t){let r=Math.max(e,.001);if(!t)return this.cloneWithViewState({...this.state.viewState,scale:r,scaleMode:"fit"});let n=this.canvasToWorld(t);return this.cloneWithViewState({...this.state.viewState,anchorCanvas:[t[0]/Math.max(this.state.containerWidth,1),t[1]/Math.max(this.state.containerHeight,1)],anchorWorld:[n[0],n[1]],scale:r,scaleMode:"fit"})}withPan(e){var t,r;return this.cloneWithViewState({...this.state.viewState,anchorWorld:(t=[e[0],e[1]],[(r=this.getCanvasMapping()).containerWidth*r.anchorCanvas[0]/r.worldToCanvasRatio-t[0],r.containerHeight*r.anchorCanvas[1]/r.worldToCanvasRatio-t[1]])})}buildICamera(){let e=this.getCanvasMapping();return{parallelProjection:!0,focalPoint:this.canvasToWorld([this.state.containerWidth/2,this.state.containerHeight/2]),position:[0,0,0],viewUp:[0,-1,0],parallelScale:this.state.containerHeight/2/Math.max(e.worldToCanvasRatio,.001),viewPlaneNormal:[0,0,1],rotation:this.rotation}}getCanvasMapping(){return this.cachedCanvasMapping||=eaz({camera:this.state.viewState,containerHeight:this.state.containerHeight,containerWidth:this.state.containerWidth,intrinsicHeight:this.state.intrinsicHeight,intrinsicWidth:this.state.intrinsicWidth,objectFit:this.state.objectFit})||{left:0,top:0,width:Math.max(this.state.intrinsicWidth,1),height:Math.max(this.state.intrinsicHeight,1),containerWidth:Math.max(this.state.containerWidth,1),containerHeight:Math.max(this.state.containerHeight,1),intrinsicWidth:Math.max(this.state.intrinsicWidth,1),intrinsicHeight:Math.max(this.state.intrinsicHeight,1),anchorWorld:[0,0],anchorCanvas:[.5,.5],worldToCanvasRatio:1},this.cachedCanvasMapping}cloneWithViewState(t){return new e({...this.state,viewState:t})}},eir=class extends erM{static get useCustomRenderingPipeline(){return!0}constructor(e){super(e),this.type=Nq.VIDEO_NEXT,this.renderingEngineId=e.renderingEngineId,this.element.style.position=this.element.style.position||"relative",this.element.style.overflow="hidden",this.element.style.background=this.element.style.background||"#000",this.dataProvider=e.dataProvider||new ea9,this.renderPathResolver=e.renderPathResolver||function(e=[new eie]){return new erE(e)}(),this.renderContext={viewportId:this.id,renderingEngineId:this.renderingEngineId,type:"video",element:this.element},this.viewState=eaW(),this.element.setAttribute("data-viewport-uid",this.id),this.element.setAttribute("data-rendering-engine-uid",this.renderingEngineId)}async setDisplaySets(...e){for(let[t,{displaySetId:r}]of(this.removeAllData(),e.entries())){await this.addDisplaySet(r,{renderMode:"video2d",role:0===t?"source":"overlay"});let e=this.getBinding(r);if(!e)continue;this.setDefaultDataPresentation(r,{visible:!0,opacity:1,playbackRate:1,loop:!0,muted:!0,objectFit:"contain"});let n=this.getVideoDataFromBinding(e);if(!n)throw Error(`[VideoViewport] Loaded data for ${r} is not a valid video stream`);this.viewState=eaW(),n.frameRange[0]>1&&(this.viewState.currentTimeSeconds=et4(n.frameRange[0],n.fps)),this.modified(),this.trackVideoElement(),await this.primeInitialFrame(n)}}removeData(e){let t=this.getFirstBinding()?.data.id;super.removeData(e),t===e&&(this.untrackVideoElement(),this.trackVideoElement())}getViewReference(e={}){let t=e.frameNumber??("number"==typeof e.sliceIndex?e.sliceIndex+1:this.getFrameNumber()),r="number"==typeof e.sliceIndex?e.sliceIndex:t-1,n="number"==typeof r?this.getCurrentImageId(r):this.getCurrentImageId(),a=this.getFirstBinding()?.data.id;return{FrameOfReferenceUID:this.getFrameOfReferenceUID(),dataId:a,dimensionGroupNumber:t,referencedImageId:n,sliceIndex:r}}getCurrentImageId(e=this.getCurrentImageIdIndex()){let t=HX(this.getFirstBinding()?.data.id||"");if(t)return ea6(t,e+1)}getViewReferenceId(e={}){let t=e.sliceIndex;return void 0===t?`videoId:${this.getCurrentImageId()}`:`videoId:${this.getCurrentImageId(t)}`}setViewReference(e){"number"==typeof e.dimensionGroupNumber?this.setFrameNumber(e.dimensionGroupNumber):"number"==typeof e.sliceIndex&&this.setFrameNumber(e.sliceIndex+1)}getSliceIndex(){return this.getCurrentImageIdIndex()}getZoom(){return this.getResolvedView()?.zoom??Math.max(this.viewState.scale??1,.001)}setZoom(e,t){let r=this.getResolvedView();r?this.applyResolvedViewState(r.withZoom(e,t).state.viewState):this.setViewState({scale:Math.max(e,.001),scaleMode:"fit"})}getPan(){return this.getResolvedView()?.pan??[0,0]}setPan(e){let t=this.getResolvedView();t&&this.applyResolvedViewState(t.withPan(e).state.viewState)}getResolvedView(){let e=this.getVideoElement(),t=this.getVideoData();if(e&&t)return new eit({viewState:this.viewState,containerHeight:this.element.clientHeight,containerWidth:this.element.clientWidth,frameOfReferenceUID:t.metadata.imagePlaneModule?.frameOfReferenceUID||t.renderedUrl,intrinsicHeight:e.videoHeight||this.element.clientHeight,intrinsicWidth:e.videoWidth||this.element.clientWidth,objectFit:this.getDisplaySetPresentation(t.id)?.objectFit,payload:t})}getReferenceViewContexts(){let e=this.getFirstBinding(),t=this.getVideoData();if(!e||!t)return super.getReferenceViewContexts();let r=HX(e.data.id),n=this.getFrameNumber();return[{dataId:e.data.id,dataIds:[e.data.id,r],frameOfReferenceUID:this.getFrameOfReferenceUID(),imageIds:this.getImageIds(),currentImageIdIndex:n-1,dimensionGroupNumber:n,numDimensionGroups:t.numberOfFrames}]}play(){let e=this.getVideoElement();return e?e.play().then(()=>void 0).catch(()=>void 0):Promise.resolve()}pause(){this.getVideoElement()?.pause(),this.syncCameraCurrentTimeFromElement()}seek(e){let t=this.getVideoData(),r=t?.durationSeconds?Math.max(t.durationSeconds,0):1/0;this.setViewState({currentTimeSeconds:Math.max(0,Math.min(e,r))})}setFrameNumber(e){let t=this.getVideoData();t&&this.seek(et4(e,t.fps))}setPlaybackRate(e){let t=this.getFirstBinding()?.data.id;t&&this.setDisplaySetPresentation(t,{playbackRate:e})}scroll(e=1,t=!0,r=!1){let n=this.getVideoData();if(!n?.fps)return;this.pause();let a=et4(n.frameRange[0],n.fps),i=n.durationSeconds??et4(n.frameRange[1],n.fps),o=this.getCurrentTime()+e/n.fps;if(r){let e=Math.max(i-a,1/n.fps);for(;o<a;)o+=e;for(;o>i;)o-=e}else o=Math.max(a,Math.min(o,i));this.seek(o)}getFrameRate(){return this.getVideoData()?.fps??0}getNumberOfFrames(){return this.getVideoData()?.numberOfFrames??0}getNumberOfSlices(){return this.getImageIds().length||this.getNumberOfFrames()}getCurrentTime(){return this.syncCameraCurrentTimeFromElement(),this.viewState.currentTimeSeconds??0}getFrameNumber(){let e=this.getVideoData();if(!e)return 1;let t=1+Math.round(Math.max(0,this.getCurrentTime())*Math.max(1,e.fps));return Math.max(e.frameRange[0],Math.min(t,e.frameRange[1]))}getCurrentImageIdIndex(){return Math.max(0,this.getFrameNumber()-1)}getImageIds(){let e=this.getFirstBinding()?.data.id,t=this.getVideoData();if(!e||!t)return[];let r=HX(e),n=Array(t.numberOfFrames);for(let e=1;e<=t.numberOfFrames;e++)try{n[e-1]=ea6(r,e)}catch{return[r]}return n}render(){if(this.isDestroyed)return}customRenderViewportToCanvas(){this.render()}resetViewState(){if(this.isDestroyed)return!1;let e=this.getCameraForEvent(),{currentTimeSeconds:t}=this.viewState;return this.viewState=this.normalizeViewState({...eaW(),currentTimeSeconds:t}),this.modified(e),this.triggerCameraResetEvent(),!0}dispose(){this.destroy()}getUseCustomRenderingPipeline(){return!0}normalizeViewState(e){return eaU(e)}onDestroy(){this.untrackVideoElement()}getVideoElement(){return this.getVideoRendering()?.element}getVideoData(){let e=this.getCurrentBinding();if(e)return this.getVideoDataFromBinding(e)}getVideoDataFromBinding(e){var t;if("object"==typeof(t=e.data)&&null!==t&&"video"===t.type&&"string"==typeof t.renderedUrl&&"number"==typeof t.fps&&"number"==typeof t.numberOfFrames&&Array.isArray(t.frameRange)&&2===t.frameRange.length&&"number"==typeof t.frameRange[0]&&"number"==typeof t.frameRange[1])return e.data}getVideoRendering(){let e=this.getFirstBinding();if(e&&"video2d"===e.rendering.renderMode)return e.rendering}syncCameraCurrentTimeFromElement(){let e=this.getVideoElement();if(!e)return;let t=Math.max(0,e.currentTime||0);t!==(this.viewState.currentTimeSeconds??0)&&(this.viewState={...this.viewState,currentTimeSeconds:t})}trackVideoElement(){let e=this.getVideoElement();if(!e||this.trackedVideoElement===e)return;this.untrackVideoElement();let t=()=>{this.syncCameraCurrentTimeFromElement()};e.addEventListener("loadedmetadata",t),e.addEventListener("seeked",t),e.addEventListener("timeupdate",t),this.trackedVideoElement=e,this.cleanupTrackedVideoElement=()=>{e.removeEventListener("loadedmetadata",t),e.removeEventListener("seeked",t),e.removeEventListener("timeupdate",t)},t()}untrackVideoElement(){this.cleanupTrackedVideoElement?.(),this.cleanupTrackedVideoElement=void 0,this.trackedVideoElement=void 0}applyResolvedViewState(e){this.setViewState(e)}async primeInitialFrame(e){let t=this.getVideoElement();if(!t)return;await ein(t);let r=e.frameRange[0]>1?et4(e.frameRange[0],e.fps):0;try{await t.play().catch(()=>void 0)}catch(e){}await eia(t,r),await eii(t),t.pause(),this.syncCameraCurrentTimeFromElement()}};async function ein(e){e.readyState>=HTMLMediaElement.HAVE_CURRENT_DATA||await new Promise(t=>{let r=()=>{n(),t()},n=()=>{e.removeEventListener("loadeddata",r),e.removeEventListener("canplay",r)};e.addEventListener("loadeddata",r,{once:!0}),e.addEventListener("canplay",r,{once:!0})})}async function eia(e,t){.001>=Math.abs((e.currentTime||0)-t)||await new Promise(r=>{let n=()=>{e.removeEventListener("seeked",n),r()};e.addEventListener("seeked",n,{once:!0}),e.currentTime=t})}async function eii(e){let t=e.requestVideoFrameCallback;t?await new Promise(r=>{t.call(e,()=>r())}):await new Promise(e=>requestAnimationFrame(()=>e()))}let eio=class extends eir{setDataIds(e,t){let r=e[0];if(r)return this.setVideo(r,(t?.viewReference?.sliceIndex||0)+1)}async setVideo(e,t){return await this.setDisplaySets({displaySetId:e}),"number"==typeof t&&this.setFrameNumber(t),this}setProperties(e){let t=this.getFirstBinding()?.data.id;if(!t)return;let r={},n={};"boolean"==typeof e.loop&&(r.loop=e.loop),"boolean"==typeof e.muted&&(r.muted=e.muted),"number"==typeof e.playbackRate&&(r.playbackRate=e.playbackRate),e.pan&&(n.pan=e.pan),e.voiRange&&(r.voiRange=e.voiRange),void 0!==e.invert&&(r.invert=e.invert),Object.keys(r).length&&this.setDisplaySetPresentation(t,r),Object.keys(n).length&&this.setViewPresentation(n)}getViewPresentation(e){return ea2.getPresentation(this,{selector:e})}setViewPresentation(e){if(!e)return;let t=ea2.withPresentation(this,e);t&&this.setViewState(t)}resetCamera(){return this.resetViewState()}getProperties(){let e=this.getFirstBinding()?.data.id,t=e?this.getDisplaySetPresentation(e):void 0,r=this.getViewPresentation();return{invert:t?.invert,loop:t?.loop,muted:t?.muted,pan:r?.pan,playbackRate:t?.playbackRate,voiRange:t?.voiRange}}resetProperties(){let e=this.getFirstBinding()?.data.id;e&&(this.setDisplaySetPresentation(e,{invert:!1,loop:!0,muted:!0,playbackRate:1,voiRange:void 0}),this.setViewPresentation({pan:[0,0],zoom:1}))}setVOI(e){let t=this.getFirstBinding()?.data.id;t&&this.setDisplaySetPresentation(t,{voiRange:e})}setAverageWhite(e){let t=this.getFirstBinding()?.data.id;t&&this.setDisplaySetPresentation(t,{averageWhite:e})}};var eis={image:null,canvas:null,jsImageData:null,imageBitmap:null,imageLoaded:!1,repeat:!1,interpolate:!1,edgeClamp:!1,mipLevel:0,resizable:!1};function eil(e,t,r={}){Object.assign(t,eis,r),jS.obj(e,t),jS.algo(e,t,6,0),jS.get(e,t,["canvas","image","jsImageData","imageBitmap","imageLoaded","resizable"]),jS.setGet(e,t,["repeat","edgeClamp","interpolate","mipLevel"]),t.classHierarchy.push("vtkTexture"),e.imageLoaded=()=>{t.image.removeEventListener("load",e.imageLoaded),t.imageLoaded=!0,e.modified()},e.setJsImageData=r=>{t.jsImageData!==r&&(null!==r&&(e.setInputData(null),e.setInputConnection(null),t.image=null,t.canvas=null,t.imageBitmap=null),t.jsImageData=r,t.imageLoaded=!0,e.modified())},e.setImageBitmap=r=>{t.imageBitmap!==r&&(null!==r&&(e.setInputData(null),e.setInputConnection(null),t.image=null,t.canvas=null,t.jsImageData=null),t.imageBitmap=r,t.imageLoaded=!0,e.modified())},e.setCanvas=r=>{t.canvas!==r&&(null!==r&&(e.setInputData(null),e.setInputConnection(null),t.image=null,t.imageBitmap=null,t.jsImageData=null),t.canvas=r,e.modified())},e.setImage=r=>{t.image!==r&&(null!==r&&(e.setInputData(null),e.setInputConnection(null),t.canvas=null,t.jsImageData=null,t.imageBitmap=null),t.image=r,t.imageLoaded=!1,r.complete?e.imageLoaded():r.addEventListener("load",e.imageLoaded),e.modified())},e.getDimensionality=()=>{let r=0,n=0,a=1;if(e.getInputData()){let t=e.getInputData();r=t.getDimensions()[0],n=t.getDimensions()[1],a=t.getDimensions()[2]}return t.jsImageData&&(r=t.jsImageData.width,n=t.jsImageData.height),t.canvas&&(r=t.canvas.width,n=t.canvas.height),t.image&&(r=t.image.width,n=t.image.height),t.imageBitmap&&(r=t.imageBitmap.width,n=t.imageBitmap.height),(r>1)+(n>1)+(a>1)},e.getInputAsJsImageData=()=>{if(!t.imageLoaded||e.getInputData())return null;if(t.jsImageData)return t.jsImageData;if(t.imageBitmap)return t.imageBitmap;if(t.canvas)return t.canvas.getContext("2d").getImageData(0,0,t.canvas.width,t.canvas.height);if(t.image){let e=t.image.width,r=t.image.height,n=new OffscreenCanvas(e,r).getContext("2d");return n.translate(0,r),n.scale(1,-1),n.drawImage(t.image,0,0,e,r),n.getImageData(0,0,e,r)}return null}}var eiu=jS.newInstance(eil,"vtkTexture"),eid=(e,t,r)=>{let n=e.createShaderModule({code:`
1249
1249
  @group(0) @binding(0) var inputTexture: texture_2d<f32>;
1250
1250
  @group(0) @binding(1) var outputTexture: texture_storage_2d<rgba8unorm, write>;
1251
1251