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

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.
@@ -34,7 +34,7 @@ For more information, see https://radix-ui.com/primitives/docs/components/${t.do
34
34
  0 0 ${a[2]*s} 0 ${l} \
35
35
  0 0 0 1 0" />\
36
36
  </filter>\
37
- </svg>#colour')`}getRenderingEngine(){return FA(this.renderingEngineId)}getRenderer(){let e=this.getRenderingEngine();if(!e||e.hasBeenDestroyed)throw Error("Rendering engine has been destroyed");return e.offscreenMultiRenderWindow?.getRenderer(this.id)}render(){this.getRenderingEngine().renderViewport(this.id)}setOptions(e,t=!1){this.options=G_(e),this.options?.displayArea&&this.setDisplayArea(this.options?.displayArea),t&&this.render()}reset(e=!1){this.options=G_(this.defaultOptions),e&&this.render()}getSliceViewInfo(){throw Error("Method not implemented.")}flip({flipHorizontal:e,flipVertical:t}){let r=this.getDefaultImageData();if(!r)return;let n=this.getCamera(),{viewPlaneNormal:a,viewUp:i,focalPoint:o,position:s}=n,l=Lv.vec3.cross(Lv.vec3.create(),a,i),u=Lv.vec3.copy(Lv.vec3.create(),i),d=Lv.vec3.negate(Lv.vec3.create(),a),c=Lv.vec3.distance(s,o),h=GL(r.getDimensions(),r.getDirection(),a),p=[h[0],h[1],h[2]],m=r.indexToWorld(p,Lv.vec3.create()),f=this._getFocalPointForResetCamera(m,n,{resetPan:!0,resetToCenter:!1}),g=Lv.vec3.subtract(Lv.vec3.create(),o,f),y=Lv.vec3.length(g),v=e=>{let t=Lv.vec3.scale(Lv.vec3.create(),e,2*Lv.vec3.dot(g,e));return Lv.vec3.subtract(t,t,g),Lv.vec3.normalize(t,t),t};if(e){let e=v(u),t=Lv.vec3.scaleAndAdd(Lv.vec3.create(),f,e,y),r=Lv.vec3.scaleAndAdd(Lv.vec3.create(),t,d,c);this.setCamera({viewPlaneNormal:d,position:r,focalPoint:t}),this.flipHorizontal=!this.flipHorizontal}if(t){u=Lv.vec3.negate(u,i);let e=v(l),t=Lv.vec3.scaleAndAdd(Lv.vec3.create(),f,e,y),r=Lv.vec3.scaleAndAdd(Lv.vec3.create(),t,d,c);this.setCamera({focalPoint:t,viewPlaneNormal:d,viewUp:u,position:r}),this.flipVertical=!this.flipVertical}this.render()}getDefaultImageData(){let e=this.getDefaultActor();if(e&&H2(e))return e.actor.getMapper().getInputData()}getDefaultActor(){return this.getActors()[0]}getActors(){return Array.from(this._actors.values())}getActorUIDs(){return Array.from(this._actors.keys())}getActor(e){return this._actors.get(e)}getImageActor(e){let t=this.getActors(),r=t[0];return(e&&(r=t.find(t=>t.referencedId===e)),r&&H2(r))?r.actor:null}getActorUIDByIndex(e){let t=this.getActors()[e];if(t)return t.uid}getActorByIndex(e){return this.getActors()[e]}setActors(e){let t=this.getActors();this.removeAllActors(),this.addActors(e,{resetCamera:!0}),Bh(this.element,NH.ACTORS_CHANGED,{viewportId:this.id,removedActors:t,addedActors:e,currentActors:e})}_removeActor(e){let t=this.getActor(e);return t?(this.getRenderer().removeActor(t.actor),this._actors.delete(e),t):void console.warn(`Actor ${e} does not exist in ${this.id}, can't remove`)}removeActors(e){let t=[];e.forEach(e=>{let r=this._removeActor(e);r&&t.push(r)});let r=this.getActors();Bh(this.element,NH.ACTORS_CHANGED,{viewportId:this.id,removedActors:t,addedActors:[],currentActors:r})}addActors(e,t={}){let{resetCamera:r=!1}=t,n=this.getRenderingEngine();if(!n||n.hasBeenDestroyed)return void console.warn("Viewport::addActors::Rendering engine has not been initialized or has been destroyed");if(e.forEach(e=>{this.addActor(e)}),r)this.resetCamera();else{let e=this.getViewPresentation(),t=this.getViewReference();this.resetCamera(),this.setViewReference(t),this.setViewPresentation(e)}Bh(this.element,NH.ACTORS_CHANGED,{viewportId:this.id,removedActors:[],addedActors:e,currentActors:this.getActors()})}addActor(e){let{uid:t,actor:r}=e,n=this.getRenderingEngine();if(!n||n.hasBeenDestroyed)return void console.warn(`Cannot add actor UID of ${t} Rendering Engine has been destroyed`);if(!t||!r)throw Error("Actors should have uid and vtk Actor properties");if(this.getActor(t))return void console.warn(`Actor ${t} already exists for this viewport`);let a=this.getRenderer();a?.addActor(r),this._actors.set(t,Object.assign({},e)),this.updateCameraClippingPlanesAndRange(),Bh(this.element,NH.ACTORS_CHANGED,{viewportId:this.id,removedActors:[],addedActors:[e],currentActors:this.getActors()})}removeAllActors(){let e=this.getActors();this.getRenderer()?.removeAllViewProps(),this._actors=new Map,Bh(this.element,NH.ACTORS_CHANGED,{viewportId:this.id,removedActors:e,addedActors:[],currentActors:[]})}resetCameraNoEvent(){let e=this._suppressCameraModifiedEvents;this._suppressCameraModifiedEvents=!0,this.resetCamera(),this._suppressCameraModifiedEvents=e}setCameraNoEvent(e){let t=this._suppressCameraModifiedEvents;this._suppressCameraModifiedEvents=!0,this.setCamera(e),this._suppressCameraModifiedEvents=t}_getViewImageDataIntersections(e,t,r){let n=r[0],a=r[1],i=r[2],o=n*t[0]+a*t[1]+i*t[2],s=e.getBounds(),l=this._getEdges(s),u=[];for(let e of l){let[[t,r,l],[d,c,h]]=e;if(n*(d-t)+a*(c-r)+i*(h-l)==0)continue;let p=function(e,t,r){let[n,a,i]=e,[o,s,l]=t,[u,d,c,h]=r,p=o-n,m=s-a,f=l-i,g=-1*(u*n+d*a+c*i-h)/(u*p+d*m+c*f);return[p*g+n,m*g+a,f*g+i]}([t,r,l],[d,c,h],[n,a,i,o]);this._isInBounds(p,s)&&u.push(p)}return u}setInterpolationType(e,t){}setDisplayArea(e,t=!1){if(!e)return;let{storeAsInitialCamera:r,type:n}=e;r&&(this.options.displayArea=e);let{_suppressCameraModifiedEvents:a}=this;if(this._suppressCameraModifiedEvents=!0,this.setCamera(this.fitToCanvasCamera),"SCALE"===n?this.setDisplayAreaScale(e):(this.setInterpolationType(this.getProperties()?.interpolationType??NK.LINEAR),this.setDisplayAreaFit(e)),r&&(this.initialCamera=this.getCamera()),this._suppressCameraModifiedEvents=a,!t&&!a){let t={viewportId:this.id,displayArea:e,storeAsInitialCamera:r};Bh(this.element,NH.DISPLAY_AREA_MODIFIED,t),this.setCamera(this.getCamera())}}setDisplayAreaScale(e){let{scale:t=1}=e,r=this.canvas,n=r.height,a=r.width;if(n<8||a<8)return;let i=this.getDefaultImageData().getSpacing()[1];this.setInterpolationType(NK.NEAREST),this.setCamera({parallelScale:n*i/(2*t)}),delete e.imageArea,this.setDisplayAreaFit(e);let{focalPoint:o,position:s,viewUp:l,viewPlaneNormal:u}=this.getCamera(),d=Lv.vec3.create();if(r.height%2&&Lv.vec3.scaleAndAdd(d,d,l,.5*t*i),r.width%2){let e=Lv.vec3.cross(Lv.vec3.create(),l,u);Lv.vec3.scaleAndAdd(d,d,e,.5*t*i)}(d[0]||d[1]||d[2])&&this.setCamera({focalPoint:Lv.vec3.add(Lv.vec3.create(),o,d),position:Lv.vec3.add(Lv.vec3.create(),s,d)})}setDisplayAreaFit(e){let{imageArea:t,imageCanvasPoint:r}=e,n=window?.devicePixelRatio||1,a=this.getDefaultImageData();if(!a)return;let i=this.sWidth/n,o=this.sHeight/n,s=a.getDimensions(),l=this.worldToCanvas(a.indexToWorld([0,0,0])),u=this.worldToCanvas(a.indexToWorld([s[0],s[1],s[2]])),[d,c]=[Math.abs(u[0]-l[0]),Math.abs(u[1]-l[1])],h=this.getZoom()/this.insetImageMultiplier;if(t){let[e,r]=t,n=Math.max(Math.abs(d/i),Math.abs(c/o)),a=Math.abs(e*d/i),s=Math.abs(r*c/o);h=(a>s?n/a:n/s)*this.getZoom()/this.getZoom(this.fitToCanvasCamera),this.setZoom(this.insetImageMultiplier*h,!1)}if(r){let{imagePoint:e,canvasPoint:t=e||[.5,.5]}=r,[n,a]=t,[s,l]=e||t,u=h,p=[this.insetImageMultiplier*u*d*(.5-s)+i*(n-.5),this.insetImageMultiplier*u*c*(.5-l)+o*(a-.5)];Lv.vec2.add(p,p,this.getPan()),this.setPan(p,!1)}}getDisplayArea(){return this.options?.displayArea}resetCamera(e){let t,{resetPan:r=!0,resetZoom:n=!0,resetToCenter:a=!0,storeAsInitialCamera:i=!0,resetAspectRatio:o=!0}=e||{},s=this.getRenderer();this.setCameraNoEvent({flipHorizontal:!1,flipVertical:!1});let l=this.getCamera(),u=this.getDefaultActor();t=u&&H2(u)?u.actor.getMapper().getInputData().getBounds():s.computeVisiblePropBounds();let d=[0,0,0],c=this.getDefaultImageData(),h=this.getVtkActiveCamera(),p=h.getViewPlaneNormal(),m=h.getViewUp();if(d[0]=(t[0]+t[1])/2,d[1]=(t[2]+t[3])/2,d[2]=(t[4]+t[5])/2,c){let e=GL(c.getDimensions(),c.getDirection(),p),t=[e[0],e[1],e[2]];c.indexToWorld(t,d)}let{widthWorld:f,heightWorld:g}=c?GA(c,p,m):this._getWorldDistanceViewUpAndViewRight(t,m,p),y=[this.sWidth,this.sHeight],v=f/g/(y[0]/y[1]),b=v<1?this.insetImageMultiplier*g/2:this.insetImageMultiplier*g*v/2,w=GR.boundsRadius(t)*(this.type===Nq.VOLUME_3D?10:1),x=this.insetImageMultiplier*w,C=Math.abs(WF.dot(m,p))>.999?[-m[2],m[0],m[1]]:m,k=this._getFocalPointForResetCamera(d,l,{resetPan:r,resetToCenter:a}),M=[k[0]+x*p[0],k[1]+x*p[1],k[2]+x*p[2]];s.resetCameraClippingRange(t);let S=[-FI.MAXIMUM_RAY_DISTANCE,FI.MAXIMUM_RAY_DISTANCE];h.setPhysicalScale(w),h.setPhysicalTranslation(-k[0],-k[1],-k[2]);let E=o?this.options?.aspectRatio||[1,1]:this.getAspectRatio();this.setCamera({parallelScale:n?b:l.parallelScale,focalPoint:k,position:M,viewAngle:90,viewUp:C,clippingRange:S,aspectRatio:E,isFitViewportAfterStretch:!1});let T=this.getCamera();return this.setFitToCanvasCamera(this.getCamera()),i&&this.setInitialCamera(T),n&&this.setZoom(1,i),s.invokeEvent({type:"ResetCameraEvent",renderer:s}),this.triggerCameraModifiedEventIfNecessary(l,T),c&&this.options.displayArea&&n&&r&&a&&this.setDisplayArea(this.options.displayArea),!0}setInitialCamera(e){this.initialCamera=e}setFitToCanvasCamera(e){this.fitToCanvasCamera=e}getPan(e=this.initialCamera){if(!e)return[0,0];let t=this.getVtkActiveCamera().getFocalPoint(),r=this.canvasToWorld([0,0]),n=this.worldToCanvas(Lv.vec3.subtract([0,0,0],e.focalPoint,r)),a=this.worldToCanvas(Lv.vec3.subtract([0,0,0],t,r));return Lv.vec2.subtract([0,0],n,a)}getCurrentImageIdIndex(){throw Error("Not implemented")}getSliceIndex(){throw Error("Not implemented")}getImageData(){throw Error("Not implemented")}getViewReferenceId(e){return null}setPan(e,t=!1){let r=this.getCamera(),{focalPoint:n,position:a}=r,i=this.canvasToWorld([0,0]),o=Lv.vec2.subtract([0,0],e,this.getPan());if(1>Math.abs(o[0])&&1>Math.abs(o[1])&&!t)return;let s=Lv.vec3.subtract(Lv.vec3.create(),this.canvasToWorld(o),i),l=Lv.vec3.subtract(Lv.vec3.create(),n,s),u=Lv.vec3.subtract(Lv.vec3.create(),a,s);this.setCamera({...r,focalPoint:l,position:u},t)}getZoom(e=this.initialCamera){if(!e)return 1;let t=this.getVtkActiveCamera(),{parallelScale:r}=e;return r/t.getParallelScale()}setZoom(e,t=!1){let r=this.getCamera(),{parallelScale:n}=this.initialCamera,a=n/e;(r.parallelScale!==a||t)&&this.setCamera({...r,parallelScale:a},t)}getAspectRatio(){let{aspectRatio:e}=this.getCamera();return e??this.options?.aspectRatio??[1,1]}setAspectRatio(e,t=!0,r=!1){let n=this.getCamera();r&&(this.options.aspectRatio=e),this.setCamera({...n,aspectRatio:e,isFitViewportAfterStretch:t},r)}_getFocalPointForViewPlaneReset(e){let{focalPoint:t,viewPlaneNormal:r}=this.getCamera(),n=this._getViewImageDataIntersections(e,t,r),a=0,i=0,o=0;return n.forEach(([e,t,r])=>{a+=e,i+=t,o+=r}),[a/n.length,i/n.length,o/n.length]}getCanvas(){return this.canvas}getVtkActiveCamera(){let e=this.getRenderer();return e?e.getActiveCamera():(console.warn("No renderer found for the viewport"),null)}getCameraNoRotation(){let e=this.getVtkActiveCamera(),t=(e,t)=>e.some(e=>isNaN(e))?t:e,r=t([...e.getViewUp()],[0,1,0]),n=t([...e.getViewPlaneNormal()],[0,0,-1]);return{viewUp:r,viewPlaneNormal:n,position:t([...e.getPosition()],[0,0,1]),focalPoint:t([...e.getFocalPoint()],[0,0,0]),parallelProjection:e.getParallelProjection(),parallelScale:e.getParallelScale(),viewAngle:e.getViewAngle(),flipHorizontal:this.flipHorizontal,flipVertical:this.flipVertical,aspectRatio:e.getAspectRatio()}}getCamera(){return{...this.getCameraNoRotation(),rotation:this.getRotation()}}setAspectRatioForVTKCamera(e,t=!0){let r=this.getVtkActiveCamera();if(!t)return void r.setAspectRatio(e);let n=r.getAspectRatio()||[1,1];if(n[0]===e[0]&&n[1]===e[1])return;let a=(([e,t])=>e/t)(n),i=(([e,t])=>e/t)(e);r.setAspectRatio(e);let o=this.getDefaultImageData();if(!o)return;let s=e=>{let{widthWorld:t,heightWorld:n}=GA(o,r.getViewPlaneNormal(),r.getViewUp()),a=this.sWidth/this.sHeight,i=t*e,s=i/n>a?i/(2*a):n/2;return e<1&&(s/=e),s},l=s(i)/s(a);r.setParallelScale(r.getParallelScale()*l),this.initialCamera?.parallelScale&&(this.initialCamera={...this.initialCamera,parallelScale:this.initialCamera.parallelScale*l}),this.fitToCanvasCamera?.parallelScale&&(this.fitToCanvasCamera={...this.fitToCanvasCamera,parallelScale:this.fitToCanvasCamera.parallelScale*l})}setCamera(e,t=!1){let r=this.getVtkActiveCamera(),n=this.getCamera(),a=Object.assign({},n,e),{viewUp:i,viewPlaneNormal:o,position:s,focalPoint:l,parallelScale:u,viewAngle:d,flipHorizontal:c,flipVertical:h,clippingRange:p,aspectRatio:m,isFitViewportAfterStretch:f}=e;if(void 0!==c){let e=c&&!this.flipHorizontal||!c&&this.flipHorizontal;e&&this.flip({flipHorizontal:e})}if(void 0!==h){let e=h&&!this.flipVertical||!h&&this.flipVertical;e&&this.flip({flipVertical:e})}void 0!==i&&r.setViewUp(i),void 0!==o&&r.setDirectionOfProjection(-o[0],-o[1],-o[2]),void 0!==s&&r.setPosition(...s),void 0!==l&&r.setFocalPoint(...l),void 0!==u&&r.setParallelScale(u),void 0!==d&&r.setViewAngle(d),void 0!==p&&r.setClippingRange(p),m&&this.setAspectRatioForVTKCamera(m,f);let g=n.focalPoint,y=n.viewUp;if(g&&l||y&&i){let e=r.getViewPlaneNormal(),t=r.getViewUp(),n=!1,o=!1;if(l){let t=[l[0]-g[0],l[1]-g[1],l[2]-g[2]];n=Math.abs(WF.dot(t,e))>0}if(i&&(o=!Vw(t,y)),n||o){let e=this.getDefaultActor();if(!e?.actor)return;H5(e,"vtkActor")||this.updateClippingPlanesForActors(a),(H5(e,"vtkImageSlice")||this.type===Nq.VOLUME_3D)&&this.getRenderer().resetCameraClippingRange()}}t&&this.setInitialCamera(a),this.triggerCameraModifiedEventIfNecessary(n,this.getCamera())}triggerCameraModifiedEventIfNecessary(e,t){if(!this._suppressCameraModifiedEvents&&!this.suppressEvents){let r={previousCamera:e,camera:t,element:this.element,viewportId:this.id,renderingEngineId:this.renderingEngineId};Bh(this.element,NH.CAMERA_MODIFIED,r)}}updateCameraClippingPlanesAndRange(){let e=this.getCamera();this.updateClippingPlanesForActors(e),this.getRenderer().resetCameraClippingRange()}async updateClippingPlanesForActors(e){this.getActors().map(t=>{if(!t.actor)return;let r=t.actor.getMapper(),n=t?.clippingFilter?t?.clippingFilter.getClippingPlanes():r.getClippingPlanes();0===n.length&&t?.clippingFilter&&(n=[WX.newInstance(),WX.newInstance()]);let a=FI.MINIMUM_SLAB_THICKNESS;t.slabThickness&&(a=t.slabThickness);let{viewPlaneNormal:i,focalPoint:o}=e;this.setOrientationOfClippingPlanes(n,a,i,o),Bh(this.element,NH.CLIPPING_PLANES_UPDATED,{actorEntry:t,focalPoint:o,vtkPlanes:n,viewport:this})})}setOrientationOfClippingPlanes(e,t,r,n){if(e.length<2)return;let a=[r[0],r[1],r[2]];WF.multiplyScalar(a,t),e[0].setNormal(r);let i=[0,0,0];WF.subtract(n,a,i),e[0].setOrigin(i),e[1].setNormal(-r[0],-r[1],-r[2]);let o=[0,0,0];WF.add(n,a,o),e[1].setOrigin(o)}getClippingPlanesForActor(e){if(e||(e=this.getDefaultActor()),!e.actor)throw Error("Invalid actor entry: Actor is undefined");let t=e.actor.getMapper(),r=e?.clippingFilter?e?.clippingFilter.getClippingPlanes():t.getClippingPlanes();return 0===r.length&&e?.clippingFilter&&(r=[WX.newInstance(),WX.newInstance()]),r}_getWorldDistanceViewUpAndViewRight(e,t,r){let n=this._getCorners(e),a=this._getCorners(e),i=Lv.vec3.cross(Lv.vec3.create(),t,r),o=GT().identity().rotateFromDirections(t,[1,0,0]);n.forEach(e=>o.apply(e));let s=1/0,l=-1/0;for(let e=0;e<8;e++){let t=n[e][0];t>l&&(l=t),t<s&&(s=t)}o=GT().identity().rotateFromDirections([i[0],i[1],i[2]],[1,0,0]),a.forEach(e=>o.apply(e));let u=1/0,d=-1/0;for(let e=0;e<8;e++){let t=a[e][0];t>d&&(d=t),t<u&&(u=t)}return{widthWorld:d-u,heightWorld:l-s}}getViewReference(e){let{focalPoint:t,viewPlaneNormal:r,viewUp:n}=this.getCamera(),a=this.getFrameOfReferenceUID(),i={FrameOfReferenceUID:a,cameraFocalPoint:t,viewPlaneNormal:r,viewUp:n,sliceIndex:e?.sliceIndex??this.getSliceIndex(),planeRestriction:{FrameOfReferenceUID:a,point:e?.points?.[0]||t,inPlaneVector1:n,inPlaneVector2:Lv.vec3.cross(Lv.vec3.create(),n,r)}};return e?.points&&GD(e.points,i.planeRestriction),i}isPlaneViewable(e,t){if(e.FrameOfReferenceUID!==this.getFrameOfReferenceUID())return!1;let{focalPoint:r,viewPlaneNormal:n}=this.getCamera(),{point:a,inPlaneVector1:i,inPlaneVector2:o}=e;if(t?.withOrientation)return!0;if(i&&!Vw(0,Lv.vec3.dot(n,i))||o&&!Vw(0,Lv.vec3.dot(n,o)))return!1;if(t?.withNavigation)return!0;let s=Lv.vec3.sub(Lv.vec3.create(),a,r);return Vw(0,Lv.vec3.dot(s,n))}isReferenceViewable(e,t){if(e.planeRestriction)return this.isPlaneViewable(e.planeRestriction,t);if(e.FrameOfReferenceUID&&e.FrameOfReferenceUID!==this.getFrameOfReferenceUID())return!1;let{viewPlaneNormal:r}=e,n=this.getCamera();return!r||!!Vw(r,n.viewPlaneNormal)||!!Vw(Lv.vec3.negate(n.viewPlaneNormal,n.viewPlaneNormal),r)||t?.withOrientation}getViewPresentation(e={rotation:!0,displayArea:!0,zoom:!0,pan:!0,aspectRatio:!0,flipHorizontal:!0,flipVertical:!0}){let t={},{rotation:r,displayArea:n,zoom:a,pan:i,flipHorizontal:o,flipVertical:s}=e;r&&(t.rotation=this.getRotation()),n&&(t.displayArea=this.getDisplayArea());let l=this.getZoom();a&&(t.zoom=l);let u=this.getAspectRatio();if(t.aspectRatio=u,i){let e=this.getPan(),[r,n]=u;t.pan=[e[0]/(l*r),e[1]/(l*n)]}return o&&(t.flipHorizontal=this.flipHorizontal),s&&(t.flipVertical=this.flipVertical),t}setViewReference(e){}setViewPresentation(e){if(!e)return;let{displayArea:t,zoom:r=this.getZoom(),pan:n,aspectRatio:a=this.getAspectRatio(),rotation:i,flipHorizontal:o=this.flipHorizontal,flipVertical:s=this.flipVertical}=e;if(t!==this.getDisplayArea()&&this.setDisplayArea(t),this.setZoom(r),this.setAspectRatio(a),n){let[e,t]=a;this.setPan([n[0]*r*e,n[1]*r*t])}void 0!==o&&o!==this.flipHorizontal&&this.flip({flipHorizontal:o}),void 0!==s&&s!==this.flipVertical&&this.flip({flipVertical:s}),i>=0&&this.setRotation(i)}_getCorners(e){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]]]}_getFocalPointForResetCamera(e,t,{resetPan:r=!0,resetToCenter:n=!0}){if(n&&r)return e;if(n&&!r)return GP(t.focalPoint)?e:t.focalPoint;if(!n&&r){let r=t.focalPoint,n=t.viewPlaneNormal,a=Lv.vec3.subtract(Lv.vec3.create(),e,r),i=Lv.vec3.dot(a,n),o=Lv.vec3.scaleAndAdd(Lv.vec3.create(),e,n,-1*i);return[o[0],o[1],o[2]]}if(!r&&!n)return GP(t.focalPoint)?e:t.focalPoint}_isInBounds(e,t){let[r,n,a,i,o,s]=t,[l,u,d]=e;return!(l<r)&&!(l>n)&&!(u<a)&&!(u>i)&&!(d<o)&&!(d>s)}_getEdges(e){let[t,r,n,a,i,o,s,l]=this._getCorners(e);return[[t,r],[t,i],[t,n],[r,a],[r,o],[n,a],[n,s],[a,l],[i,s],[i,o],[o,l],[s,l]]}static boundsRadius(e){return .5*Math.sqrt((e[1]-e[0])**2+(e[3]-e[2])**2+(e[5]-e[4])**2||1)}setDataList(e){throw Error("Unsupported operation setDataList")}setDisplaySets(...e){this._displaySets=e}async mountDisplaySets(e,t){let[r]=e;if(!r?.displaySetId)throw Error(`${this.constructor.name}: setDisplaySets requires a displaySetId`);await t(r),this._displaySets=[r]}getDisplaySets(){return this._displaySets}clearDisplaySets(){this._displaySets=[]}}function GL(e,t,r){let n=[[t[0],t[1],t[2]],[t[3],t[4],t[5]],[t[6],t[7],t[8]]],a=[r[0],r[1],r[2]],i=0,o=-1;for(let e=0;e<3;e++){let t=Math.abs(Lv.vec3.dot(n[e],a));t>o&&(o=t,i=e)}let s=.001>Math.abs(o-1);return e.map((e,t)=>t===i&&s?Math.floor(e/2):(e-1)/2)}GR.CameraViewPresentation={rotation:!0,pan:!0,zoom:!0,aspectRatio:!0,displayArea:!0},GR.TransferViewPresentation={windowLevel:!0,paletteLut:!0};let GN=GR;function GV(){return window.performance?performance.now():Date.now()}function GF(e,t,r){if(r){let e,t,n,a;return e=Math.max(...r.lut).toString(2).length-8,t=r.lut[0]>>e,n=r.lut[r.lut.length-1]>>e,a=r.firstValueMapped+r.lut.length-1,function(i){return i<r.firstValueMapped?t:i>=a?n:r.lut[i-r.firstValueMapped]>>e}}return function(r){return Math.min(Math.max(((r-(t-.5))/(e-1)+.5)*255,0),255)}}class GB{constructor(){this.reset()}getMatrix(){return this.m}reset(){this.m=[1,0,0,1,0,0]}clone(){let e=new GB;return e.m[0]=this.m[0],e.m[1]=this.m[1],e.m[2]=this.m[2],e.m[3]=this.m[3],e.m[4]=this.m[4],e.m[5]=this.m[5],e}multiply(e){let t=this.m[0]*e[0]+this.m[2]*e[1],r=this.m[1]*e[0]+this.m[3]*e[1],n=this.m[0]*e[2]+this.m[2]*e[3],a=this.m[1]*e[2]+this.m[3]*e[3],i=this.m[0]*e[4]+this.m[2]*e[5]+this.m[4],o=this.m[1]*e[4]+this.m[3]*e[5]+this.m[5];this.m[0]=t,this.m[1]=r,this.m[2]=n,this.m[3]=a,this.m[4]=i,this.m[5]=o}invert(){let e=1/(this.m[0]*this.m[3]-this.m[1]*this.m[2]),t=this.m[3]*e,r=-this.m[1]*e,n=-this.m[2]*e,a=this.m[0]*e,i=e*(this.m[2]*this.m[5]-this.m[3]*this.m[4]),o=e*(this.m[1]*this.m[4]-this.m[0]*this.m[5]);this.m[0]=t,this.m[1]=r,this.m[2]=n,this.m[3]=a,this.m[4]=i,this.m[5]=o}rotate(e){let t=Math.cos(e),r=Math.sin(e),n=this.m[0]*t+this.m[2]*r,a=this.m[1]*t+this.m[3]*r,i=-(this.m[0]*r)+this.m[2]*t,o=-(this.m[1]*r)+this.m[3]*t;this.m[0]=n,this.m[1]=a,this.m[2]=i,this.m[3]=o}translate(e,t){this.m[4]+=this.m[0]*e+this.m[2]*t,this.m[5]+=this.m[1]*e+this.m[3]*t}scale(e,t){this.m[0]*=e,this.m[1]*=e,this.m[2]*=t,this.m[3]*=t}transformPoint(e){let t=e[0],r=e[1];return[t*this.m[0]+r*this.m[2]+this.m[4],t*this.m[1]+r*this.m[3]+this.m[5]]}}function Gj(e,t){let r=new GB,n=e.viewport.aspectRatio;if(!e.viewport.displayedArea)return r;r.translate(e.canvas.width/2,e.canvas.height/2);let a=e.viewport.rotation;0!==a&&r.rotate(a*Math.PI/180);let[i,o,s]=function(e){if(Array.isArray(e))return[e[0]??1,e[1]??1,!0];let t=e??1;return[t,t,!1]}(e.viewport.scale),l=i,u=o,d=e.viewport.displayedArea.brhc.x-(e.viewport.displayedArea.tlhc.x-1),c=e.viewport.displayedArea.brhc.y-(e.viewport.displayedArea.tlhc.y-1);if(s);else if("NONE"===e.viewport.displayedArea.presentationSizeMode)e.image.rowPixelSpacing<e.image.columnPixelSpacing?l*=e.image.columnPixelSpacing/e.image.rowPixelSpacing:e.image.columnPixelSpacing<e.image.rowPixelSpacing&&(u*=e.image.rowPixelSpacing/e.image.columnPixelSpacing);else if(l=e.viewport.displayedArea.columnPixelSpacing,u=e.viewport.displayedArea.rowPixelSpacing,"SCALE TO FIT"===e.viewport.displayedArea.presentationSizeMode){let t=e.canvas.height/(c*u);l=u=Math.min(e.canvas.width/(d*l),t),e.viewport.displayedArea.rowPixelSpacing<e.viewport.displayedArea.columnPixelSpacing?l*=e.viewport.displayedArea.columnPixelSpacing/e.viewport.displayedArea.rowPixelSpacing:e.viewport.displayedArea.columnPixelSpacing<e.viewport.displayedArea.rowPixelSpacing&&(u*=e.viewport.displayedArea.rowPixelSpacing/e.viewport.displayedArea.columnPixelSpacing)}if(r.scale(l,u),0!==a&&r.rotate(-a*Math.PI/180),r.translate(e.viewport.translation.x,e.viewport.translation.y),0!==a&&r.rotate(a*Math.PI/180),void 0!==t&&void 0===n&&r.scale(t,t),void 0!==n&&void 0===t){let[e,t]=n;r.scale(e,t)}return e.viewport.hflip&&r.scale(-1,1),e.viewport.vflip&&r.scale(1,-1),r.translate(-d/2,-c/2),r}function GW(e,t,r){if(void 0===e)throw Error("setToPixelCoordinateSystem: parameter enabledElement must not be undefined");if(void 0===t)throw Error("setToPixelCoordinateSystem: parameter context must not be undefined");let n=Gj(e,r).getMatrix();t.setTransform(n[0],n[1],n[2],n[3],n[4],n[5])}function GU(e,t){let r=e.renderingTools.lastRenderedImageId,n=e.renderingTools.lastRenderedViewport;return t.imageId!==r||!n||n.windowCenter!==e.viewport.voi.windowCenter||n.windowWidth!==e.viewport.voi.windowWidth||n.invert!==e.viewport.invert||n.rotation!==e.viewport.rotation||n.hflip!==e.viewport.hflip||n.vflip!==e.viewport.vflip||n.modalityLUT!==e.viewport.modalityLUT||n.voiLUT!==e.viewport.voiLUT||n.colormap!==e.viewport.colormap}function Gz(e,t){let r=e.renderingTools.renderCanvas;r.width=t.width,r.height=t.height;let n=r.getContext("2d");n.fillStyle="white",n.fillRect(0,0,r.width,r.height);let a=n.getImageData(0,0,t.width,t.height);e.renderingTools.renderCanvasContext=n,e.renderingTools.renderCanvasData=a}function GH(e){let t=e.image.imageId,r=e.viewport,n=e.image.color;return e.renderingTools.lastRenderedImageId=t,e.renderingTools.lastRenderedIsColor=n,e.renderingTools.lastRenderedViewport={windowCenter:r.voi.windowCenter,windowWidth:r.voi.windowWidth,invert:r.invert,rotation:r.rotation,hflip:r.hflip,vflip:r.vflip,modalityLUT:r.modalityLUT,voiLUT:r.voiLUT,colormap:r.colormap},e.renderingTools}let GG="viewport-element",Gq="cornerstone-canvas";function G$(e,t=512,r=512){let n=v?v(t,r):document.createElement("canvas");return e&&(n.style.position="absolute",n.style.width="100%",n.style.height="100%",n.style.imageRendering="pixelated",n.classList.add(Gq),e.appendChild(n)),n}function GK(e){let t,r=`canvas.${Gq}`,n=`div.${GG}`,a=e.querySelector(n)||((t=document.createElement("div")).style.position="relative",t.style.width="100%",t.style.height="100%",t.style.overflow="hidden",t.classList.add(GG),e.appendChild(t),t),i=a.querySelector(r);if(i)return i;let o=G$(a),s=a.getBoundingClientRect(),l=window.devicePixelRatio||1,u=Math.ceil(s.width*l),d=Math.ceil(s.height*l);return u>0&&d>0&&(o.width=u,o.height=d,o.style.aspectRatio=`${u} / ${d}`),o}function GY(e,t){if(void 0===e)throw Error("renderColorImage: enabledElement parameter must not be undefined");let r=e.image;if(void 0===r)throw Error("renderColorImage: image must be loaded before it can be drawn");let n=e.canvas.getContext("2d");n.setTransform(1,0,0,1,0,0),n.fillStyle="black",n.fillRect(0,0,e.canvas.width,e.canvas.height),n.imageSmoothingEnabled=!e.viewport.pixelReplication,GW(e,n);let a=function(e,t,r){var n;let a=e.renderingTools.lastRenderedIsColor;e.renderingTools.renderCanvas&&a||(e.renderingTools.renderCanvas=G$(null,t.width,t.height));let i=e.renderingTools.renderCanvas,{windowWidth:o,windowCenter:s}=e.viewport.voi;if((256===o||255===o)&&(128===s||127===s)&&!e.viewport.invert&&t.getCanvas&&t.getCanvas())return t.getCanvas();if(!GU(e,t)&&!r)return i;e.renderingTools.renderCanvasContext&&i.width===t.width&&i.height===t.height||Gz(e,t);let l=GV(),u=(n=e.viewport,void 0!==t.cachedLut&&t.cachedLut.windowCenter===n.voi.windowCenter&&t.cachedLut.windowWidth===n.voi.windowWidth&&t.cachedLut.invert===n.invert||(!function(e,t,r,n){let a=e.maxPixelValue,i=e.minPixelValue,o=Math.min(i,0);void 0===e.cachedLut&&(e.cachedLut={},e.cachedLut.lutArray=new Uint8ClampedArray(a-o+1));let s=e.cachedLut.lutArray,l=GF(Array.isArray(t)?t[0]:t,Array.isArray(r)?r[0]:r,void 0);if(n)for(let e=i;e<=a;e++)s[e+-o]=255-l(e);else for(let e=i;e<=a;e++)s[e+-o]=l(e)}(t,n.voi.windowWidth,n.voi.windowCenter,n.invert),t.cachedLut.windowWidth=n.voi.windowWidth,t.cachedLut.windowCenter=n.voi.windowCenter,t.cachedLut.invert=n.invert),t.cachedLut.lutArray);t.stats=t.stats||{},t.stats.lastLutGenerateTime=GV()-l;let d=e.renderingTools.renderCanvasData,c=e.renderingTools.renderCanvasContext;return t.rgba?!function(e,t,r){let n=GV(),a=e.getPixelData();e.stats.lastGetPixelDataTime=GV()-n;let i=e.minPixelValue,o=0,s=0,l=a.length;if(n=GV(),i<0)for(;s<l;)r[o++]=t[a[s++]+-i],r[o++]=t[a[s++]+-i],r[o++]=t[a[s++]+-i],r[o++]=a[s++];else for(;s<l;)r[o++]=t[a[s++]],r[o++]=t[a[s++]],r[o++]=t[a[s++]],r[o++]=a[s++];e.stats.lastStoredPixelDataToCanvasImageDataTime=GV()-n}(t,u,d.data):!function(e,t,r){let n=GV(),a=e.voxelManager.getScalarData();e.stats.lastGetPixelDataTime=GV()-n;let i=e.minPixelValue,o=0,s=0,l=a.length;if(n=GV(),i<0)for(;s<l;)r[o++]=t[a[s++]+-i],r[o++]=t[a[s++]+-i],r[o++]=t[a[s++]+-i],r[o++]=255;else for(;s<l;)r[o++]=t[a[s++]],r[o++]=t[a[s++]],r[o++]=t[a[s++]],r[o++]=255;e.stats.lastStoredPixelDataToCanvasImageDataTime=GV()-n}(t,u,d.data),l=GV(),c.putImageData(d,0,0),t.stats.lastPutImageDataTime=GV()-l,i}(e,r,t),i=e.viewport.displayedArea.tlhc.x-1,o=e.viewport.displayedArea.tlhc.y-1,s=e.viewport.displayedArea.brhc.x-i,l=e.viewport.displayedArea.brhc.y-o;n.drawImage(a,i,o,s,l,0,0,s,l),e.renderingTools=GH(e)}function GZ(e,t){return!e&&!t||!!e&&!!t&&e.id===t.id}function GX(e,t,r){return void 0!==e.cachedLut&&e.cachedLut.windowCenter===t.voi.windowCenter&&e.cachedLut.windowWidth===t.voi.windowWidth&&GZ(e.cachedLut.modalityLUT,t.modalityLUT)&&GZ(e.cachedLut.voiLUT,t.voiLUT)&&e.cachedLut.invert===t.invert&&!r||(!function(e,t){var r;if((r=e).voiLUT&&r.voiLUT.lut&&r.voiLUT.lut.length>0||void 0!==r.voi.windowWidth&&void 0!==r.voi.windowCenter)return;let n=t.maxPixelValue*t.slope+t.intercept,a=t.minPixelValue*t.slope+t.intercept,i=n-a,o=(n+a)/2;void 0===e.voi?e.voi={windowWidth:i,windowCenter:o,voiLUTFunction:t.voiLUTFunction}:(e.voi.windowWidth=i,e.voi.windowCenter=o)}(t,e),!function(e,t,r,n,a,i){let o=e.maxPixelValue,s=e.minPixelValue,l=Math.min(s,0);void 0===e.cachedLut&&(e.cachedLut={},e.cachedLut.lutArray=new Uint8ClampedArray(o-l+1));let u=e.cachedLut.lutArray,d=function(e,t,r){if(r){let e,t,n;return e=r.lut[0],t=r.lut[r.lut.length-1],n=r.firstValueMapped+r.lut.length,a=>a<r.firstValueMapped?e:a>=n?t:r.lut[a]}return r=>r*e+t}(e.slope,e.intercept,a),c=GF(t,r,i);if(e.isPreScaled)if(n)for(let e=s;e<=o;e++)u[e+-l]=255-c(e);else for(let e=s;e<=o;e++)u[e+-l]=c(e);else if(n)for(let e=s;e<=o;e++)u[e+-l]=255-c(d(e));else for(let e=s;e<=o;e++)u[e+-l]=c(d(e))}(e,t.voi.windowWidth,t.voi.windowCenter,t.invert,t.modalityLUT,t.voiLUT),e.cachedLut.windowWidth=t.voi.windowWidth,e.cachedLut.windowCenter=t.voi.windowCenter,e.cachedLut.invert=t.invert,e.cachedLut.voiLUT=t.voiLUT,e.cachedLut.modalityLUT=t.modalityLUT),e.cachedLut.lutArray}function GJ(e,t){if(void 0===e)throw Error("drawImage: enabledElement parameter must not be undefined");let r=e.image;if(void 0===r)throw Error("drawImage: image must be loaded before it can be drawn");let n=e.canvas.getContext("2d");n.setTransform(1,0,0,1,0,0),n.fillStyle="black",n.fillRect(0,0,e.canvas.width,e.canvas.height),n.imageSmoothingEnabled=!e.viewport.pixelReplication,GW(e,n);let a=function(e,t,r,n=!0){let a=e.renderingTools.lastRenderedIsColor;(!e.renderingTools.renderCanvas||a)&&(e.renderingTools.renderCanvas=G$(null,t.width,t.height),Gz(e,t));let i=e.renderingTools.renderCanvas;if(!GU(e,t)&&!r)return i;(i.width!==t.width||i.height!==t.height)&&Gz(e,t),t.stats=t.stats||{};let o=e.renderingTools.renderCanvasData,s=e.renderingTools.renderCanvasContext,l=GV();t.stats.lastLutGenerateTime=GV()-l;let{viewport:u}=e;if("PT"===u.modality&&t.isPreScaled){let{windowWidth:e,windowCenter:r}=u.voi,n=r-e/2,a=255/(r+e/2-n);!function(e,t,r){let n=GV(),a=e.voxelManager.getScalarData();e.stats.lastGetPixelDataTime=GV()-n;let i=a.length,o=3,s=0;for(n=GV();s<i;)r[o]=t(a[s++]),o+=4;e.stats.lastStoredPixelDataToCanvasImageDataTime=GV()-n}(t,u.invert?e=>255-(e-n)*a:e=>(e-n)*a,o.data)}else{let e=GX(t,u,r);n?function(e,t,r){let n=GV(),a=e.voxelManager.getScalarData();e.stats.lastGetPixelDataTime=GV()-n;let i=a.length,o=e.minPixelValue,s=3,l=0;if(n=GV(),a instanceof Int16Array)if(o<0)for(;l<i;)r[s]=t[a[l++]+-o],s+=4;else for(;l<i;)r[s]=t[a[l++]],s+=4;else if(a instanceof Uint16Array)for(;l<i;)r[s]=t[a[l++]],s+=4;else if(o<0)for(;l<i;)r[s]=t[a[l++]+-o],s+=4;else for(;l<i;)r[s]=t[a[l++]],s+=4;e.stats.lastStoredPixelDataToCanvasImageDataTime=GV()-n}(t,e,o.data):function(e,t,r){let n,a=GV(),i=e.voxelManager.getScalarData();e.stats.lastGetPixelDataTime=GV()-a;let o=i.length,s=e.minPixelValue,l=0,u=0;if(a=GV(),i instanceof Int16Array)if(s<0)for(;u<o;)n=t[i[u++]+-s],r[l++]=n,r[l++]=n,r[l++]=n,r[l++]=255;else for(;u<o;)n=t[i[u++]],r[l++]=n,r[l++]=n,r[l++]=n,r[l++]=255;else if(i instanceof Uint16Array)for(;u<o;)n=t[i[u++]],r[l++]=n,r[l++]=n,r[l++]=n,r[l++]=255;else if(s<0)for(;u<o;)n=t[i[u++]+-s],r[l++]=n,r[l++]=n,r[l++]=n,r[l++]=255;else for(;u<o;)n=t[i[u++]],r[l++]=n,r[l++]=n,r[l++]=n,r[l++]=255;e.stats.lastStoredPixelDataToCanvasImageDataTime=GV()-a}(t,e,o.data)}return l=GV(),s.putImageData(o,0,0),t.stats.lastPutImageDataTime=GV()-l,i}(e,r,t),i=e.viewport.displayedArea.tlhc.x-1,o=e.viewport.displayedArea.tlhc.y-1,s=e.viewport.displayedArea.brhc.x-i,l=e.viewport.displayedArea.brhc.y-o;n.drawImage(a,i,o,s,l,0,0,s,l),e.renderingTools=GH(e)}let GQ=class{constructor(){this.NumberOfColors=256,this.Ramp="linear",this.TableRange=[0,255],this.HueRange=[0,.66667],this.SaturationRange=[1,1],this.ValueRange=[1,1],this.AlphaRange=[1,1],this.NaNColor=[128,0,0,255],this.BelowRangeColor=[0,0,0,255],this.UseBelowRangeColor=!0,this.AboveRangeColor=[255,255,255,255],this.UseAboveRangeColor=!0,this.InputRange=[0,255],this.Table=[]}setNumberOfTableValues(e){this.NumberOfColors=e}setRamp(e){this.Ramp=e}setTableRange(e,t){this.TableRange[0]=e,this.TableRange[1]=t}setHueRange(e,t){this.HueRange[0]=e,this.HueRange[1]=t}setSaturationRange(e,t){this.SaturationRange[0]=e,this.SaturationRange[1]=t}setValueRange(e,t){this.ValueRange[0]=e,this.ValueRange[1]=t}setRange(e,t){this.InputRange[0]=e,this.InputRange[1]=t}setAlphaRange(e,t){this.AlphaRange[0]=e,this.AlphaRange[1]=t}getColor(e){return this.mapValue(e)}build(e){let t,r,n,a;if(this.Table.length>1&&!e)return;this.Table=[];let i=this.NumberOfColors-1;i?(t=(this.HueRange[1]-this.HueRange[0])/i,r=(this.SaturationRange[1]-this.SaturationRange[0])/i,n=(this.ValueRange[1]-this.ValueRange[0])/i,a=(this.AlphaRange[1]-this.AlphaRange[0])/i):t=r=n=a=0;for(let e=0;e<=i;e++){let i=this.HueRange[0]+e*t,o=this.SaturationRange[0]+e*r,s=this.ValueRange[0]+e*n,l=this.AlphaRange[0]+e*a,u=function(e,t,r){if(e>1)throw Error("HSVToRGB expects hue < 1");let n=[];if(0===t)return n[0]=r,n[1]=r,n[2]=r,n;let a=Math.floor(6*e),i=6*e-a,o=r*(1-t),s=r*(1-t*i),l=r*(1-t*(1-i));switch(a){case 0:case 6:n[0]=r,n[1]=l,n[2]=o;break;case 1:n[0]=s,n[1]=r,n[2]=o;break;case 2:n[0]=o,n[1]=r,n[2]=l;break;case 3:n[0]=o,n[1]=s,n[2]=r;break;case 4:n[0]=l,n[1]=o,n[2]=r;break;case 5:n[0]=r,n[1]=o,n[2]=s}return n}(i,o,s),d=[0,0,0,0];switch(this.Ramp){case"scurve":d[0]=Math.floor(127.5*(1+Math.cos((1-u[0])*Math.PI))),d[1]=Math.floor(127.5*(1+Math.cos((1-u[1])*Math.PI))),d[2]=Math.floor(127.5*(1+Math.cos((1-u[2])*Math.PI))),d[3]=Math.floor(255*l);break;case"linear":d[0]=Math.floor(255*u[0]+.5),d[1]=Math.floor(255*u[1]+.5),d[2]=Math.floor(255*u[2]+.5),d[3]=Math.floor(255*l+.5);break;case"sqrt":d[0]=Math.floor(255*Math.sqrt(u[0])+.5),d[1]=Math.floor(255*Math.sqrt(u[1])+.5),d[2]=Math.floor(255*Math.sqrt(u[2])+.5),d[3]=Math.floor(255*Math.sqrt(l)+.5);break;default:throw Error(`Invalid Ramp value (${this.Ramp})`)}this.Table.push(d)}this.buildSpecialColors()}buildSpecialColors(){let e=this.NumberOfColors,t=e+0,r=e+1;this.UseBelowRangeColor||0===e?this.Table[t]=this.BelowRangeColor:this.Table[t]=this.Table[0],this.UseAboveRangeColor||0===e?this.Table[r]=this.AboveRangeColor:this.Table[r]=this.Table[e-1],this.Table[e+2]=this.NaNColor}mapValue(e){let t=this.getIndex(e);if(t<0)return this.NaNColor;if(0===t){if(this.UseBelowRangeColor&&e<this.TableRange[0])return this.BelowRangeColor}else if(t===this.NumberOfColors-1&&this.UseAboveRangeColor&&e>this.TableRange[1])return this.AboveRangeColor;return this.Table[t]}getIndex(e){let t={Range:[],MaxIndex:this.NumberOfColors-1,Shift:-this.TableRange[0],Scale:1};if(this.TableRange[1]<=this.TableRange[0]?t.Scale=Number.MAX_VALUE:t.Scale=t.MaxIndex/(this.TableRange[1]-this.TableRange[0]),t.Range[0]=this.TableRange[0],t.Range[1]=this.TableRange[1],isNaN(e))return -1;let r=Math.floor(e<t.Range[0]?t.MaxIndex+0+1.5:e>t.Range[1]?t.MaxIndex+1+1.5:(e+t.Shift)*t.Scale);return r===this.NumberOfColors+0?r=0:r===this.NumberOfColors+1&&(r=this.NumberOfColors-1),r}setTableValue(e,t,r,n,a){let i;if("number"==typeof t&&void 0!==r&&void 0!==n&&void 0!==a)i=[t,r,n,a];else if(Array.isArray(t))i=t;else throw Error("Invalid arguments for setTableValue");if(e<0)throw Error(`Can't set the table value for negative index (${e})`);if(e>=this.NumberOfColors)throw Error(`Index ${e} is greater than the number of colors ${this.NumberOfColors}`);this.Table[e]=i,(0===e||e===this.NumberOfColors-1)&&this.buildSpecialColors()}},G0=[0,0,0,0],G1=new Set(["gray","grey","grayscale","greyscale"]);function G2(e,t,r){let n,a=[],i=[],o=[],s=[];for(n=0,r=null===r?1:r;n<t.length;n++){let r=t[n];a.push((e-1)*r[0]),i.push(r[1]),o.push(r[1])}let l=function(e,t){let r=(1-e)/((t=null===t?100:t)-1),n=[];for(;t-- >0;)n.push(e),e+=r;return n[n.length-1]=1,n}(0,e);for(n=0;n<e;n++)l[n]=(e-1)*Math.pow(l[n],r);let u=function(e,t){let r,n=[],a=t.length;for(e.sort(function(e,t){return e-t}),r=0;r<a;r++)n[r]=function(e,t){let r=0,n=e.length-1;for(;r<=n;){let a=r+Math.floor((n-r)/2),i=e[a];if(i===t)return a;t<i?n=a-1:r=a+1}return r}(e,t[r]);return n}(a,l);for(n=1;n<e-1;n++){let e=u[n],t=(l[n]-a[e-1])/(a[e]-a[e-1]),r=i[e]-o[e-1];s[n]=t*r+o[e-1]}return s[0]=o[0],s[e-1]=i[t.length-1],s}function G5(e,t,r){let n,a="string"==typeof e?e.trim():e?.name?.trim();if(!a)return t;let i=a.toLowerCase();if(G1.has(i))return;let o=Gi(a);if(o){var s,l;return G4((s=o,l=a,G3(`vtk:${(s.name||s.Name||l).trim().toLowerCase()}`,function(e,t){let r=z2.newInstance();r.applyColorMap(e);let[n,a]=r.getRange(),i=Array.from({length:256},(e,t)=>{let i=[];return r.getColor(n+t/256*(a-n),i),[Math.round(255*i[0]),Math.round(255*i[1]),Math.round(255*i[2]),255]});return{colors:i,name:e.Name||t,numColors:i.length}}(s,l))),"string"==typeof e?void 0:e,r?.voiRange)}let u=(n=a.trim().toLowerCase(),Object.keys(FE).find(e=>{let t=FE[e];return e.toLowerCase()===n||t.name?.trim().toLowerCase()===n}));return G4(u?G3(u):void 0,"string"==typeof e?void 0:e,r?.voiRange)}function G3(e,t){let r=FE[e];return r||(r=FE[e]=t||{name:"",colors:[]}),!r.colors&&r.segmentedData&&(r.colors=function(e,t,r){let n,a=[];r=null===r?1:r;let i=G2(t=null===t?256:t,e.red,r),o=G2(t,e.green,r),s=G2(t,e.blue,r);for(n=0;n<t;n++){let e=[Math.round(255*i[n]),Math.round(255*o[n]),Math.round(255*s[n]),255];a.push(e)}return a}(r.segmentedData,r.numColors,r.gamma)),{getId:()=>e,getColorSchemeName:()=>r.name,setColorSchemeName(e){r.name=e},getNumberOfColors:()=>r.colors.length,setNumberOfColors(e){for(;r.colors.length<e;)r.colors.push(G0);r.colors.length=e},getColor(e){return this.isValidIndex(e)?r.colors[e]:G0},getColorRepeating(e){let t=r.colors.length;return e=t?e%t:0,this.getColor(e)},setColor(e,t){this.isValidIndex(e)&&(r.colors[e]=t)},addColor(e){r.colors.push(e)},insertColor(e,t){this.isValidIndex(e)&&r.colors.splice(e,1,t)},removeColor(e){this.isValidIndex(e)&&r.colors.splice(e,1)},clearColors(){r.colors=[]},buildLookupTable(e){if(!e)return;let t=r.colors.length;e.setNumberOfTableValues(t);for(let n=0;n<t;n++)e.setTableValue(n,r.colors[n])},createLookupTable(){let e=new GQ;return this.buildLookupTable(e),e},isValidIndex:e=>e>=0&&e<r.colors.length}}function G4(e,t,r){var n,a,i,o;let s;if(!e)return;if(t?.opacity===void 0&&t?.threshold===void 0||!r||r.upper<=r.lower)return e;let l=(n=e,a=t,i=r,s=Math.max(n.getNumberOfColors(),1),Array.from({length:256},(e,t)=>{var r,o;let l=1===s?0:(r=t,Math.min((o=s)-1,Math.floor(r/256*o))),u=n.getColor(l),d=function(e,t,r){if(void 0!==r&&e<r)return 0;if(void 0===t)return 1;if("number"==typeof t)return G8(t);if(!t.length)return 1;if(e<=t[0].value)return G8(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 G8(n.opacity+(a.opacity-n.opacity)*r)}}return G8(t[t.length-1].opacity)}(i.lower+(i.upper-i.lower)*(t/256),a?.opacity,a?.threshold);return[u[0],u[1],u[2],Math.round(u[3]/255*d*255)]}));return G3([e.getId(),`lower:${G6(r.lower)}`,`upper:${G6(r.upper)}`,`opacity:${void 0===(o=t?.opacity)?"none":"number"==typeof o?String(G6(o)):o.map(({opacity:e,value:t})=>`${G6(t)}-${G6(e)}`).join(",")}`,`threshold:${G6(t?.threshold)}`].join(":"),{colors:l,name:e.getColorSchemeName(),numColors:l.length})}function G8(e){return Math.max(0,Math.min(1,e))}function G6(e){return void 0===e?"none":String(Math.round(1e3*e)/1e3)}let G9=function(e,t,r,n){let a,i,o=GV(),s=e.voxelManager.getScalarData();e.stats.lastGetPixelDataTime=GV()-o;let l=s.length,u=e.minPixelValue,d=0,c=0;if(o=GV(),i=r instanceof GQ?r.Table:r,u<0)for(;c<l;)a=i[t[s[c++]+-u]],n[d++]=a[0],n[d++]=a[1],n[d++]=a[2],n[d++]=a[3];else for(;c<l;)a=i[t[s[c++]]],n[d++]=a[0],n[d++]=a[1],n[d++]=a[2],n[d++]=a[3];e.stats.lastStoredPixelDataToCanvasImageDataTime=GV()-o},G7=function(e,t,r,n){let a,i,o=GV(),s=e.voxelManager.getScalarData();e.stats.lastGetPixelDataTime=GV()-o;let l=s.length,u=e.minPixelValue,d=0,c=0;if(o=GV(),i=r instanceof GQ?r.Table:r,u<0)for(;c<l;)a=i[t(s[c++]+-u)],n[d++]=a[0],n[d++]=a[1],n[d++]=a[2],n[d++]=a[3];else for(;c<l;)a=i[t(s[c++])],n[d++]=a[0],n[d++]=a[1],n[d++]=a[2],n[d++]=a[3];e.stats.lastStoredPixelDataToCanvasImageDataTime=GV()-o};function qe(e,t,r){return Math.max(t,Math.min(r,e))}function qt(e,t){if(void 0===e)throw Error("drawImage: enabledElement parameter must not be undefined");let r=e.image;if(void 0===r)throw Error("drawImage: image must be loaded before it can be drawn");let n=e.canvas.getContext("2d");n.setTransform(1,0,0,1,0,0),e.options?.transparentBackground?n.clearRect(0,0,e.canvas.width,e.canvas.height):(n.fillStyle="black",n.fillRect(0,0,e.canvas.width,e.canvas.height)),n.imageSmoothingEnabled=!e.viewport.pixelReplication,GW(e,n);let a=function(e,t,r){e.renderingTools.renderCanvas||(e.renderingTools.renderCanvas=G$(null,t.width,t.height));let n=e.renderingTools.renderCanvas,a=e.viewport.colormap||e.options.colormap;if(e.options&&e.options.colormap&&console.warn("enabledElement.options.colormap is deprecated. Use enabledElement.viewport.colormap instead"),a&&"string"==typeof a?a=G5(a):a&&"object"==typeof a&&"function"!=typeof a.getId&&(a=G5(a)),!a)throw Error("renderPseudoColorImage: colormap not found.");let i=a.getId();if(!GU(e,t)&&!r&&e.renderingTools.colormapId===i)return n;e.renderingTools.renderCanvasContext&&n.width===t.width&&n.height===t.height||Gz(e,t);let o=GV();(!e.renderingTools.colorLUT||r||e.renderingTools.colormapId!==i)&&(a.setNumberOfColors(256),e.renderingTools.colorLUT=a.createLookupTable(),e.renderingTools.colormapId=i);let s=e.renderingTools.renderCanvasData,l=e.renderingTools.renderCanvasContext,{viewport:u}=e,d=e.renderingTools.colorLUT;if("PT"===u.modality){let{windowWidth:e,windowCenter:r}=u.voi,n=r-e/2,a=255/(r+e/2-n);G7(t,u.invert?e=>qe(Math.floor(255-(e-n)*a),0,255):e=>qe(Math.floor((e-n)*a),0,255),d,s.data)}else{let n=GX(t,e.viewport,r);t.stats=t.stats||{},t.stats.lastLutGenerateTime=GV()-o,G9(t,n,d,s.data)}return o=GV(),l.putImageData(s,0,0),t.stats.lastPutImageDataTime=GV()-o,n}(e,r,t),i=e.viewport.displayedArea.tlhc.x-1,o=e.viewport.displayedArea.tlhc.y-1,s=e.viewport.displayedArea.brhc.x-i,l=e.viewport.displayedArea.brhc.y-o;n.drawImage(a,i,o,s,l,0,0,s,l),e.renderingTools=GH(e)}function qr(e,t){let r=e.image;if(!e.canvas||!e.image)return;let n=GV();if(r.stats={lastGetPixelDataTime:-1,lastStoredPixelDataToCanvasImageDataTime:-1,lastPutImageDataTime:-1,lastRenderTime:-1,lastLutGenerateTime:-1},r){let n=r.render;n||(n=e.viewport.colormap?qt:r.color?GY:GJ),n(e,t)}let a=GV()-n;r.stats.lastRenderTime=a,e.invalid=!1,e.needsRedraw=!1}function qn(e){let{dimensions:t,direction:r,numberOfComponents:n,origin:a,pixelArray:i,spacing:o}=e,s=!ArrayBuffer.isView(i)||i instanceof DataView?Array.from(i):i,l=!ArrayBuffer.isView(s)||s instanceof DataView?void 0:U9.getDataType(s),u=U9.newInstance({...l?{dataType:l}:{},name:"Pixels",numberOfComponents:n,values:s}),d=zw();return d.setDimensions(t),d.setSpacing(o),d.setDirection(new Float32Array(Array.from(r))),d.setOrigin(a),d.getPointData().setScalars(u),d}function qa(e){let{dimensions:t,direction:r,numberOfComponents:n,origin:a,spacing:i}=HH(e),o=e.voxelManager.getScalarData().slice(),s=qn({dimensions:t,direction:Array.from(r),numberOfComponents:n,origin:a,pixelArray:o,spacing:i});return Gv(s,e),s}function qi(e){return e.preScale?.scaled&&e.preScale?.scalingParameters?.suvbw?{lower:0,upper:5}:GM(e.windowWidth,e.windowCenter,e.voiLUTFunction)}function qo(e){let{actor:t,defaultVOIRange:r,defaultVOILUTFunction:n,props:a}=e,i=t.getProperty(),o=a?.voiRange??r;if(a?.visible!==void 0&&t.setVisibility(a.visible),a?.opacity!==void 0&&i.setOpacity(a.opacity),a?.interpolationType!==void 0&&i.setInterpolationType(a.interpolationType),!o)return;let s=qs({colormap:a?.colormap,invert:a?.invert,voiRange:o,voiLUTFunction:a?.voiLUTFunction??n});i.setUseLookupTableScalarRange(!0),i.setRGBTransferFunction(0,s)}function qs(e){let{colormap:t,invert:r,voiRange:n,voiLUTFunction:a}=e,i=t?.name!==void 0?function(e,t){let r=e.name,n=r?Gi(r):void 0;if(!n)throw Error(`Colormap ${r} not found`);let a=z2.newInstance();return a.applyColorMap(n),a.setMappingRange(t.lower,t.upper),a}(t,n):a===N2.SAMPLED_SIGMOID?Gy(n):Gg(n);return r&&Gb(i),i}let ql=new class{constructor(){this._imageCache=new Map,this._volumeCache=new Map,this._imageIdsToVolumeIdCache=new Map,this._referencedImageIdToImageIdCache=new Map,this._geometryCache=new Map,this._imageCacheSize=0,this._maxCacheSize=0xc0000000,this._geometryCacheSize=0,this.setMaxCacheSize=e=>{if(!e||"number"!=typeof e)throw Error(`New max cacheSize ${this._maxCacheSize} should be defined and should be a number.`);this._maxCacheSize=e},this.isCacheable=e=>this.getBytesAvailable()+Array.from(this._imageCache.values()).reduce((e,t)=>t.sharedCacheKey?e:e+t.sizeInBytes,0)>=e,this.getMaxCacheSize=()=>this._maxCacheSize,this.getCacheSize=()=>this._imageCacheSize,this._decacheImage=(e,t=!1)=>{let r=this._imageCache.get(e);if(!r)return;if(r.sharedCacheKey&&!t)throw Error("Cannot decache an image with a shared cache key. You need to manually decache the volume first.");let{imageLoadObject:n}=r;r.image?.referencedImageId&&this._referencedImageIdToImageIdCache.delete(r.image.referencedImageId),n?.cancelFn&&n.cancelFn(),n?.decache&&n.decache(),this._imageCache.delete(e)},this._decacheVolume=e=>{let t=this._volumeCache.get(e);if(!t)return;let{volumeLoadObject:r,volume:n}=t;n&&(n.cancelLoading&&n.cancelLoading(),n.imageData&&n.imageData.delete(),r.cancelFn&&r.cancelFn(),n.imageIds&&n.imageIds.forEach(t=>{let r=this._imageCache.get(t);r&&r.sharedCacheKey===e&&(r.sharedCacheKey=void 0)}),this._volumeCache.delete(e))},this.purgeCache=()=>{let e=this._imageCache.keys();for(this.purgeVolumeCache();;){let{value:t,done:r}=e.next();if(r)break;this.removeImageLoadObject(t,{force:!0}),Bh(Bc,NH.IMAGE_CACHE_IMAGE_REMOVED,{imageId:t})}},this.purgeVolumeCache=()=>{let e=this._volumeCache.keys();for(;;){let{value:t,done:r}=e.next();if(r)break;this.removeVolumeLoadObject(t),Bh(Bc,NH.VOLUME_CACHE_VOLUME_REMOVED,{volumeId:t})}},this.getVolumeLoadObject=e=>{if(void 0===e)throw Error("getVolumeLoadObject: volumeId must not be undefined");let t=this._volumeCache.get(e);if(t)return t.timeStamp=Date.now(),t.volumeLoadObject},this.putGeometryLoadObject=(e,t)=>{if(void 0===e)throw Error("putGeometryLoadObject: geometryId must not be undefined");if(void 0===t.promise)throw Error("putGeometryLoadObject: geometryLoadObject.promise must not be undefined");if(this._geometryCache.has(e))throw Error("putGeometryLoadObject: geometryId already present in geometryCache");if(t.cancelFn&&"function"!=typeof t.cancelFn)throw Error("putGeometryLoadObject: geometryLoadObject.cancel must be a function");let r={loaded:!1,geometryId:e,geometryLoadObject:t,timeStamp:Date.now(),sizeInBytes:0};return this._geometryCache.set(e,r),t.promise.then(t=>{try{this._putGeometryCommon(e,t,r)}catch(t){throw console.debug(`Error in _putGeometryCommon for geometry ${e}:`,t),t}}).catch(t=>{throw console.debug(`Error caching geometry ${e}:`,t),this._geometryCache.delete(e),t})},this.getGeometry=e=>{if(void 0===e)throw Error("getGeometry: geometryId must not be undefined");let t=this._geometryCache.get(e);if(t)return t.timeStamp=Date.now(),t.geometry},this.removeGeometryLoadObject=e=>{if(void 0===e)throw Error("removeGeometryLoadObject: geometryId must not be undefined");let t=this._geometryCache.get(e);if(!t)throw Error("removeGeometryLoadObject: geometryId was not present in geometryCache");this.decrementGeometryCacheSize(t.sizeInBytes),Bh(Bc,NH.GEOMETRY_CACHE_GEOMETRY_REMOVED,{geometry:t,geometryId:e}),this._decacheGeometry(e)},this._decacheGeometry=e=>{let t=this._geometryCache.get(e);if(!t)return;let{geometryLoadObject:r}=t;r.cancelFn&&r.cancelFn(),r.decache&&r.decache(),this._geometryCache.delete(e)},this.incrementGeometryCacheSize=e=>{this._geometryCacheSize+=e},this.decrementGeometryCacheSize=e=>{this._geometryCacheSize-=e},this.getImageByReferencedImageId=e=>{let t=this._referencedImageIdToImageIdCache.get(e);if(t)return this._imageCache.get(t)?.image},this.getImage=(e,t=Fx.FAR_REPLICATE)=>{if(void 0===e)throw Error("getImage: imageId must not be undefined");let r=this._imageCache.get(e);if(r&&(r.timeStamp=Date.now(),!(r.image?.imageQualityStatus<t)))return r.image},this.getVolume=(e,t=!1)=>{if(void 0===e)throw Error("getVolume: volumeId must not be undefined");let r=this._volumeCache.get(e);return r?(r.timeStamp=Date.now(),r.volume):t?[...this._volumeCache.values()].find(t=>t.volumeId.includes(e))?.volume:void 0},this.getVolumes=()=>Array.from(this._volumeCache.values()).map(e=>e.volume),this.filterVolumesByReferenceId=e=>this.getVolumes().filter(t=>t.referencedVolumeId===e),this.removeImageLoadObject=(e,{force:t=!1}={})=>{if(void 0===e)throw Error("removeImageLoadObject: imageId must not be undefined");let r=this._imageCache.get(e);if(!r)throw Error("removeImageLoadObject: imageId was not present in imageCache");this._decacheImage(e,t),this.incrementImageCacheSize(-r.sizeInBytes),Bh(Bc,NH.IMAGE_CACHE_IMAGE_REMOVED,{image:r,imageId:e})},this.removeVolumeLoadObject=e=>{if(void 0===e)throw Error("removeVolumeLoadObject: volumeId must not be undefined");let t=this._volumeCache.get(e);if(!t)throw Error("removeVolumeLoadObject: volumeId was not present in volumeCache");Bh(Bc,NH.VOLUME_CACHE_VOLUME_REMOVED,{volume:t,volumeId:e}),this._decacheVolume(e)},this.incrementImageCacheSize=e=>{this._imageCacheSize+=e},this.decrementImageCacheSize=e=>{this._imageCacheSize-=e},this.getGeometryLoadObject=e=>{if(void 0===e)throw Error("getGeometryLoadObject: geometryId must not be undefined");let t=this._geometryCache.get(e);if(t)return t.timeStamp=Date.now(),t.geometryLoadObject}}generateVolumeId(e){let t=e.map(Gk).sort(),r=0x811c9dc5;for(let e of t){let t=function(e){let t=0x811c9dc5;for(let r=0;r<e.length;r++)t^=e.charCodeAt(r),t+=(t<<1)+(t<<4)+(t<<7)+(t<<8)+(t<<24);return(t>>>0).toString(36)}(e);for(let e=0;e<t.length;e++)r^=t.charCodeAt(e),r+=(r<<1)+(r<<4)+(r<<7)+(r<<8)+(r<<24)}return`volume-${(r>>>0).toString(36)}`}getImageIdsForVolumeId(e){return Array.from(this._imageIdsToVolumeIdCache.entries()).filter(([t,r])=>r===e).map(([e])=>e)}getBytesAvailable(){return this.getMaxCacheSize()-this.getCacheSize()}decacheIfNecessaryUntilBytesAvailable(e,t){let r=this.getBytesAvailable();if(r>=e)return r;let n=Array.from(this._imageCache.values()).filter(e=>!e.sharedCacheKey);n.sort(function(e,t){return e.timeStamp>t.timeStamp?1:e.timeStamp<t.timeStamp?-1:0});let a=n.map(e=>e.imageId),i=a;for(let n of(t&&(i=a.filter(e=>!t.includes(e))),i))if(this.removeImageLoadObject(n),Bh(Bc,NH.IMAGE_CACHE_IMAGE_REMOVED,{imageId:n}),(r=this.getBytesAvailable())>=e)return r;for(let t of a)if(this.removeImageLoadObject(t),Bh(Bc,NH.IMAGE_CACHE_IMAGE_REMOVED,{imageId:t}),(r=this.getBytesAvailable())>=e)return r}_putImageCommon(e,t,r){if(!this._imageCache.has(e))return void console.warn("The image was purged from the cache before it completed loading.");if(!t)return void console.warn("Image is undefined");if(void 0===t.sizeInBytes||Number.isNaN(t.sizeInBytes))throw Error("_putImageCommon: image.sizeInBytes must not be undefined");if(void 0===t.sizeInBytes.toFixed)throw Error("_putImageCommon: image.sizeInBytes is not a number");if(!this.isCacheable(t.sizeInBytes))throw Error(NH.CACHE_SIZE_EXCEEDED);this.decacheIfNecessaryUntilBytesAvailable(t.sizeInBytes),r.loaded=!0,r.image=t,r.sizeInBytes=t.sizeInBytes,this.incrementImageCacheSize(r.sizeInBytes),t.referencedImageId&&this._referencedImageIdToImageIdCache.set(t.referencedImageId,e),Bh(Bc,NH.IMAGE_CACHE_IMAGE_ADDED,{image:r}),r.sharedCacheKey=t.sharedCacheKey}async putImageLoadObject(e,t){if(void 0===e)throw console.error("putImageLoadObject: imageId must not be undefined"),Error("putImageLoadObject: imageId must not be undefined");if(void 0===t.promise)throw console.error("putImageLoadObject: imageLoadObject.promise must not be undefined"),Error("putImageLoadObject: imageLoadObject.promise must not be undefined");let r=this._imageCache.get(e);if(r?.imageLoadObject)throw console.warn(`putImageLoadObject: imageId ${e} already in cache`),Error("putImageLoadObject: imageId already in cache");if(t.cancelFn&&"function"!=typeof t.cancelFn)throw console.error("putImageLoadObject: imageLoadObject.cancel must be a function"),Error("putImageLoadObject: imageLoadObject.cancel must be a function");let n={...r,loaded:!1,imageId:e,sharedCacheKey:void 0,imageLoadObject:t,timeStamp:Date.now(),sizeInBytes:0};return this._imageCache.set(e,n),t.promise.then(t=>{try{this._putImageCommon(e,t,n)}catch(t){throw console.debug(`Error in _putImageCommon for image ${e}:`,t),t}}).catch(t=>{throw console.debug(`Error caching image ${e}:`,t),this._imageCache.delete(e),t})}putImageSync(e,t){if(void 0===e)throw Error("putImageSync: imageId must not be undefined");if(this._imageCache.has(e))throw Error("putImageSync: imageId already in cache");let r={loaded:!1,imageId:e,sharedCacheKey:void 0,imageLoadObject:{promise:Promise.resolve(t)},timeStamp:Date.now(),sizeInBytes:0};this._imageCache.set(e,r);try{this._putImageCommon(e,t,r)}catch(t){throw this._imageCache.delete(e),t}}getImageLoadObject(e){if(void 0===e)throw Error("getImageLoadObject: imageId must not be undefined");let t=this._imageCache.get(e);if(t)return t.timeStamp=Date.now(),t.imageLoadObject}isLoaded(e){let t=this._imageCache.get(e);return!!t&&t.loaded}getVolumeContainingImageId(e){let t=Array.from(this._volumeCache.keys()),r=Gk(e);for(let e of t){let t=this._volumeCache.get(e);if(!t)return;let{volume:n}=t;if(!n.imageIds.length)return;let a=n.getImageURIIndex(r);if(a>-1)return{volume:n,imageIdIndex:a}}}getCachedImageBasedOnImageURI(e){let t=Gk(e),r=Array.from(this._imageCache.keys()).find(e=>Gk(e)===t);if(r)return this._imageCache.get(r)}_putVolumeCommon(e,t,r){this._volumeCache.get(e)?(r.loaded=!0,r.volume=t,t.imageIds?.forEach(t=>{let r=this._imageCache.get(t);r&&(r.sharedCacheKey=e)}),Bh(Bc,NH.VOLUME_CACHE_VOLUME_ADDED,{volume:r})):console.warn("The volume was purged from the cache before it completed loading.")}putVolumeSync(e,t){if(void 0===e)throw Error("putVolumeSync: volumeId must not be undefined");if(this._volumeCache.has(e))throw Error("putVolumeSync: volumeId already in cache");let r={loaded:!1,volumeId:e,volumeLoadObject:{promise:Promise.resolve(t)},timeStamp:Date.now(),sizeInBytes:0};this._volumeCache.set(e,r);try{this._putVolumeCommon(e,t,r)}catch(t){throw this._volumeCache.delete(e),t}}async putVolumeLoadObject(e,t){if(void 0===e)throw Error("putVolumeLoadObject: volumeId must not be undefined");if(void 0===t.promise)throw Error("putVolumeLoadObject: volumeLoadObject.promise must not be undefined");if(this._volumeCache.has(e))throw Error(`putVolumeLoadObject: volumeId:${e} already in cache`);if(t.cancelFn&&"function"!=typeof t.cancelFn)throw Error("putVolumeLoadObject: volumeLoadObject.cancel must be a function");let r={loaded:!1,volumeId:e,volumeLoadObject:t,timeStamp:Date.now(),sizeInBytes:0};return this._volumeCache.set(e,r),t.promise.then(t=>{try{this._putVolumeCommon(e,t,r)}catch(t){throw console.error(`Error in _putVolumeCommon for volume ${e}:`,t),this._volumeCache.delete(e),t}}).catch(t=>{throw this._volumeCache.delete(e),t})}_putGeometryCommon(e,t,r){if(!this._geometryCache.get(e))return void console.warn("The geometry was purged from the cache before it completed loading.");if(!t)return void console.warn("Geometry is undefined");if(void 0===t.sizeInBytes||Number.isNaN(t.sizeInBytes))throw Error("_putGeometryCommon: geometry.sizeInBytes must not be undefined");if(void 0===t.sizeInBytes.toFixed)throw Error("_putGeometryCommon: geometry.sizeInBytes is not a number");if(!this.isCacheable(t.sizeInBytes))throw Error(NH.CACHE_SIZE_EXCEEDED);this.decacheIfNecessaryUntilBytesAvailable(t.sizeInBytes),r.loaded=!0,r.geometry=t,r.sizeInBytes=t.sizeInBytes,this.incrementGeometryCacheSize(r.sizeInBytes),Bh(Bc,NH.GEOMETRY_CACHE_GEOMETRY_ADDED,{geometry:r})}putGeometrySync(e,t){if(void 0===e)throw Error("putGeometrySync: geometryId must not be undefined");if(this._geometryCache.has(e))throw Error("putGeometrySync: geometryId already in cache");let r={loaded:!1,geometryId:e,geometryLoadObject:{promise:Promise.resolve(t)},timeStamp:Date.now(),sizeInBytes:0};this._geometryCache.set(e,r);try{this._putGeometryCommon(e,t,r)}catch(t){throw this._geometryCache.delete(e),t}}setPartialImage(e,t,r=!1){let n=this._imageCache.get(e);if(!n){t&&this._imageCache.set(e,{image:t,imageId:e,loaded:!1,timeStamp:Date.now(),sizeInBytes:0});return}n.loaded?(n.loaded=!1,n.imageLoadObject=null,this.incrementImageCacheSize(-n.sizeInBytes),n.sizeInBytes=0):r&&(n.imageLoadObject=null),n.image=t||n.image}getImageQuality(e){let t=this._imageCache.get(e)?.image;return t?t.imageQualityStatus||Fx.FULL_RESOLUTION:void 0}},qu={},qd={add:(e,t)=>{qd.addRaw(e,{...t,metadata:G_(t.metadata)})},addRaw:(e,t)=>{let r=t.type;qu[e]||(qu[e]={}),qu[e][r]=t.metadata},get:(e,t)=>qu[t]?.[e],clear:()=>{qu={}}};function qc(e,t){switch(e){case"Float32Array":return Float32Array;case"Uint8Array":return Uint8Array;case"Uint32Array":return Uint32Array;case"Uint16Array":case"Int16Array":if(!t)return"Uint16Array"===e?Uint16Array:Int16Array;return console.debug(`${e} is not supported for volume rendering, switching back to Float32Array`),Float32Array;default:if(!e)return Float32Array;throw Error("TargetBuffer should be Float32Array, Uint8Array, Uint16Array, Int16Array, or Uint32Array")}}HR(qd.get);let qh=[[0,-1,0],[0,1,0],[0,0,-1],[0,0,1]],qp=[[0,-1,0],[0,1,0]],qm=[[0,-1,0],[0,1,0],[0,0,-1]],qf=[[0,-1,0],[0,1,0],[0,0,1]];class qg{static copyMap(e,t){for(let[r,n]of t.rows)e.rows.set(r,G_(n))}constructor(e,t,r=1){this.rows=new Map,this.height=1,this.width=1,this.depth=1,this.jMultiple=1,this.kMultiple=1,this.numComps=1,this.pixelDataConstructor=Uint8Array,this.updateScalarData=function(e){e.fill(0),this.forEach((t,r,n)=>{let{start:a,end:i,value:o}=r;for(let r=a;r<i;r++)e[t+r]=o})},this.get=e=>{let t=e%this.jMultiple,r=(e-t)/this.jMultiple,n=this.getRLE(t,r);return n?.value??this.defaultValue},this.getRun=(e,t)=>{let r=e+t*this.height;return this.rows.get(r)},this.set=(e,t)=>{if(void 0===t)return;let r=e%this.width,n=(e-r)/this.width,a=this.rows.get(n);if(!a)return void this.rows.set(n,[{start:r,end:r+1,value:t}]);let i=this.findIndex(a,r),o=a[i],s=a[i-1];if(!o){if(!s||s.value!==t||s.end!==r){a[i]={start:r,end:r+1,value:t};return}s.end++;return}let{start:l,end:u,value:d}=o;if(t===d&&r>=l)return;let c={start:r,end:r+1,value:t},h=r>l,p=h?i+1:i,m=h?o:s,f=h?a[i+1]:o;if(m?.value===t&&m?.end===r){m.end++,f?.value===t&&f.start===r+1?(m.end=f.end,a.splice(i,1)):f?.start===r&&(f.start++,f.start===f.end&&(a.splice(i,1),f=a[i],f?.start===r+1&&f.value===t&&(m.end=f.end,a.splice(i,1))));return}if(f?.value===t&&f.start===r+1){f.start--,m?.end>r&&(m.end=r,m.end===m.start&&a.splice(i,1));return}if(f?.start===r&&f.end===r+1){f.value=t;let e=a[i+1];e?.start==r+1&&e.value===t&&(a.splice(i+1,1),f.end=e.end);return}r===f?.start&&f.start++,h&&u>r+1?a.splice(p,0,c,{start:r+1,end:m.end,value:m.value}):a.splice(p,0,c),m?.end>r&&(m.end=r)},this.width=e,this.height=t,this.depth=r,this.jMultiple=e,this.kMultiple=this.jMultiple*t}toIJK(e){let t=e%this.jMultiple,r=(e-t)/this.jMultiple%this.height;return[t,r,Math.floor(e/this.kMultiple)]}toIndex([e,t,r]){return e+r*this.kMultiple+t*this.jMultiple}getRLE(e,t,r=0){let n=this.rows.get(t+r*this.height);if(!n)return;let a=this.findIndex(n,e),i=n[a];return e>=i?.start?i:void 0}has(e){let t=e%this.jMultiple,r=(e-t)/this.jMultiple,n=this.getRLE(t,r);return n?.value!==void 0}delete(e){let t=e%this.width,r=(e-t)/this.width,n=this.rows.get(r);if(!n)return;let a=this.findIndex(n,t),i=n[a];if(!i||i.start>t)return;if(i.end===t+1){i.end--,i.start>=i.end&&(n.splice(a,1),n.length||this.rows.delete(r));return}if(i.start===t)return void i.start++;let o={value:i.value,start:t+1,end:i.end};i.end=t,n.splice(a+1,0,o)}findIndex(e,t){for(let r=0;r<e.length;r++){let{end:n}=e[r];if(t<n)return r}return e.length}forEach(e,t){let r=t?.rowModified;for(let[t,n]of this.rows)for(let a of r?[...n]:n)e(t*this.width,a,n)}forEachRow(e){for(let[t,r]of this.rows)e(t*this.width,r)}clear(){this.rows.clear()}keys(){return[...this.rows.keys()]}getPixelData(e=0,t){t?t.fill(0):t=new this.pixelDataConstructor(this.width*this.height*this.numComps);let{width:r,height:n,numComps:a}=this;for(let i=0;i<n;i++){let n=this.getRun(i,e);if(n)if(1===a)for(let e of n){let n=i*r,{start:a,end:o,value:s}=e;for(let e=a;e<o;e++)t[n+e]=s}else for(let e of n){let n=i*r*a,{start:o,end:s,value:l}=e;for(let e=o;e<s;e+=a)for(let r=0;r<a;r++)t[n+e+r]=l[r]}}return t}floodFill(e,t,r,n,a){let i=this.getRLE(e,t,r);if(!i)throw Error(`Initial point ${e},${t},${r} isn't in the RLE`);let o=[[i,t,r]],s=i.value;if(s===n)throw Error(`source (${s}) and destination (${n}) are identical`);return this.flood(o,s,n,a)}flood(e,t,r,n){let a=0,{planar:i=!0,diagonals:o=!0,singlePlane:s=!1}=n||{},l={planar:i,diagonals:o,singlePlane:s};for(;e.length;){let n=e.pop(),[i]=n;if(i.value!==t)continue;i.value=r,a+=i.end-i.start;let o=this.findAdjacents(n,l).filter(e=>e&&e[0].value===t);e.push(...o)}return a}fillFrom(e,t){for(let r=t[2][0];r<=t[2][1];r++)for(let n=t[1][0];n<=t[1][1];n++){let a,i;for(let o=t[0][0];o<=t[0][1];o++){let t=e(o,n,r);if(void 0===t){a=void 0;continue}i||(i=[],this.rows.set(n+r*this.height,i)),a&&a.value!==t&&(a=void 0),a||(a={start:o,end:o,value:t},i.push(a)),a.end++}}}findAdjacents(e,{diagonals:t=!0,planar:r=!0,singlePlane:n=!1}){let[a,i,o,s]=e,{start:l,end:u}=a,d=l>0&&this.getRLE(l-1,i,o),c=u<this.width&&this.getRLE(u,i,o),h=t?[l>0?l-1:l,u<this.width?u+1:u]:[l,u],p=[];for(let e of(d&&p.push([d,i,o]),c&&p.push([c,i,o]),s||(n?qp:qh))){let[,t,a]=e,l=t+i,u=a+o;if(l<0||l>=this.height||u<0||u>=this.depth)continue;let d=this.getRun(l,u);if(d)for(let e of d){let t=s||n&&qp||r&&a>0&&qf||r&&a<0&&qm||qh;e.end<=h[0]||e.start>=h[1]||p.push([e,l,u,t])}}return p}}qg.getScalarData=function(e=Uint8ClampedArray){let t=new e(this.frameSize);return this.map.updateScalarData(t),t};var qy=u(4164);class qv{constructor(e={}){this._dimensions=3,this._length=0,this._byteSize=4,this.growSize=128;const{initialSize:t=1024,dimensions:r=3,growSize:n=128}=e;this.growSize=n,this.array=new ArrayBuffer(t*r*this._byteSize),this.data=new Float32Array(this.array),this._dimensions=r}forEach(e){for(let t=0;t<this._length;t++)e(this.getPoint(t),t)}get length(){return this._length}get dimensions(){return this._dimensions}get dimensionLength(){return this._length*this._dimensions}getPoint(e){if(e<0&&(e+=this._length),e<0||e>=this._length)return;let t=this._dimensions*e;return this.data.subarray(t,t+this._dimensions)}getPointArray(e){let t=[];if(e<0&&(e+=this._length),e<0||e>=this._length)return;let r=this._dimensions*e;for(let e=0;e<this._dimensions;e++)t.push(this.data[e+r]);return t}grow(e=1,t=this.growSize){if(this.dimensionLength+e*this._dimensions<=this.data.length)return;let r=new ArrayBuffer((this.data.length+t)*this._dimensions*this._byteSize),n=new Float32Array(r);n.set(this.data),this.data=n,this.array=r}reverse(){let e=Math.floor(this._length/2);for(let t=0;t<e;t++){let e=t*this._dimensions,r=(this._length-1-t)*this._dimensions;for(let t=0;t<this._dimensions;t++){let n=this.data[e+t];this.data[e+t]=this.data[r+t],this.data[r+t]=n}}}getTypedArray(){return this.data}push(e){this.grow(1);let t=this.length*this._dimensions;for(let r=0;r<this._dimensions;r++)this.data[r+t]=e[r];this._length++}map(e){let t=[];for(let r=0;r<this._length;r++)t.push(e(this.getPoint(r),r));return t}get points(){return this.map(e=>e)}toXYZ(){let e={x:[],y:[]};this._dimensions>=3&&(e.z=[]);let{x:t,y:r,z:n}=e;return this.forEach(e=>{t.push(e[0]),r.push(e[1]),n&&n.push(e[2])}),e}static fromXYZ({x:e,y:t,z:r}){let n=qv.create3(e.length),a=0;for(let i=0;i<e.length;i++)n.data[a++]=e[i],n.data[a++]=t[i],n.data[a++]=r?r[i]:0;return n._length=e.length,n}subselect(e=10,t=0){let r=new qv({initialSize:e,dimensions:this._dimensions});for(let n=0;n<e;n++){let a=(t+Math.floor(this.length*n/e))%this.length;r.push(this.getPoint(a))}return r}static create3(e=128,t){let r=new qv({initialSize:e=Math.max(e,t?.length||0),dimensions:3});return t&&t.forEach(e=>r.push(e)),r}static create2(e=128){return new qv({initialSize:e,dimensions:2})}}function qb(e){let t=qy.create(),r=e.getDimensions(),n=qv.create3(r[0]),a=qv.create3(r[1]),i=qv.create3(r[2]),o=e.getDirection(),s=o.slice(0,3),l=o.slice(3,6),u=o.slice(6,9),[d,c,h]=e.getSpacing(),p=e.indexToWorld([0,0,0]),m=qy.fromValues(s[0]*d,s[1]*d,s[2]*d),f=qy.fromValues(l[0]*c,l[1]*c,l[2]*c),g=qy.fromValues(u[0]*h,u[1]*h,u[2]*h),y=qy.create();for(let e=0;e<r[0];e++)n.push(qy.add(y,p,qy.scale(y,m,e)));for(let e=0;e<r[1];e++)a.push(qy.scale(y,f,e));for(let e=0;e<r[2];e++)i.push(qy.scale(y,g,e));let v=n.getTypedArray(),b=a.getTypedArray(),w=i.getTypedArray();return(e,r=t)=>{let[n,a,i]=e,o=3*n,s=3*a,l=3*i;return r[0]=v[o]+b[s]+w[l],r[1]=v[o+1]+b[s+1]+w[l+1],r[2]=v[o+2]+b[s+2]+w[l+2],r}}let qw=[0,0,0],qx=[0,0,0],qC=new WeakMap;class qk{get id(){return this._id}constructor(e,t){this.modifiedSlices=new Set,this.boundsIJK=[[1/0,-1/0],[1/0,-1/0],[1/0,-1/0]],this.scalarData=null,this._scalarDataIsCachedExpansion=!1,this._sliceDataCache=null,this.getAtIJK=(e,t,r)=>this._get(e+t*this.width+r*this.frameSize),this.setAtIJK=(e,t,r,n)=>{let a=e+t*this.width+r*this.frameSize,i=this._set(a,n);return!1!==i&&(this.modifiedSlices.add(r),qk.addBounds(this.boundsIJK,[e,t,r]),this.invalidateCachedScalarExpansion()),i},this.getAtIJKPoint=([e,t,r])=>this.getAtIJK(e,t,r),this.setAtIJKPoint=([e,t,r],n)=>{this.setAtIJK(e,t,r,n)},this.getAtIndex=e=>this._get(e),this.setAtIndex=(e,t)=>{let r=this._set(e,t);if(!1!==r){let t=this.toIJK(e);this.modifiedSlices.add(t[2]),qk.addBounds(this.boundsIJK,t),this.invalidateCachedScalarExpansion()}return r},this.getMiddleSliceData=()=>{let e=Math.floor(this.dimensions[2]/2);return this.getSliceData({sliceIndex:e,slicePlane:2})},this.forEach=(e,t={})=>{let r=t.boundsIJK||this.getBoundsIJK(),n=t.isInObject||this.isInObject||(()=>!0),a=t.returnPoints||!1,i=t.imageData,o=Math.min(r[0][0],r[0][1]),s=Math.max(r[0][0],r[0][1]),l=Math.min(r[1][0],r[1][1]),u=Math.max(r[1][0],r[1][1]),d=Math.min(r[2][0],r[2][1]),c=Math.max(r[2][0],r[2][1]),h=[];if(i)return function({voxelManager:e,bounds:t,imageData:r,pointInShapeFn:n,callback:a,returnPoints:i}){let[[o,s],[l,u],[d,c]]=t,h=qb(r),p=[0,0,0],m=[];for(let t=d;t<=c;t++){p[2]=t;for(let t=l;t<=u;t++){p[1]=t;for(let t=o;t<=s;t++){p[0]=t;let r=h(p);if(n(r,p)){let t=e.toIndex(p),n=e.getAtIndex(t);i&&m.push({value:n,index:t,pointIJK:[...p],pointLPS:r.slice()}),a?.({value:n,index:t,pointIJK:p,pointLPS:r})}}}}return m}({voxelManager:this,imageData:t.imageData,bounds:[[o,s],[l,u],[d,c]],pointInShapeFn:n,callback:e,returnPoints:a});if(this.map){if(this.map instanceof qg)return this.rleForEach(e,t);for(let t of this.map.keys()){let r=this.toIJK(t);if(!n(null,r))continue;let i=this._get(t);a&&h.push({value:i,index:t,pointIJK:r,pointLPS:null}),e({value:i,index:t,pointIJK:r,pointLPS:null})}return h}for(let t=d;t<=c;t++){let r=t*this.frameSize;for(let i=l;i<=u;i++){let l=r+i*this.width;for(let r=o,u=l+r;r<=s;r++,u++){let o=this.getAtIndex(u),s=[r,i,t];n(null,s)&&(a&&h.push({value:o,index:u,pointIJK:s,pointLPS:null}),e({value:o,index:u,pointIJK:[r,i,t],pointLPS:null}))}}}return h},this.getSliceData=({sliceIndex:e,slicePlane:t})=>{let r,n,[a,i,o]=this.dimensions,s=a*i,l=e*s,u=this.getConstructor();if("function"!=typeof u)return new Uint8Array(0);switch(t){case 0:n=new u(r=i*o);for(let t=0;t<i;t++)for(let r=0;r<o;r++){let o=e+t*a+r*s;this.setSliceDataValue(n,t+r*i,this._get(o))}break;case 1:n=new u(r=a*o);for(let t=0;t<a;t++)for(let r=0;r<o;r++){let i=t+e*a+r*s;this.setSliceDataValue(n,t+r*a,this._get(i))}break;case 2:n=new u(r=a*i);for(let e=0;e<r;e++)this.setSliceDataValue(n,e,this._get(l+e));break;default:throw Error("Oblique plane - todo - implement as ortho normal vector")}return n},this.dimensions=e,this.width=e[0],this.frameSize=this.width*e[1],this._get=t._get,this._set=t._set,this._id=t._id||"",this._getConstructor=t._getConstructor,this.numberOfComponents=t.numberOfComponents||1,this.scalarData=t.scalarData,this._getScalarData=t._getScalarData,this._updateScalarData=t._updateScalarData}getMinMax(){let e,t;return this.forEach(({value:r})=>{let n=Array.isArray(r);if(void 0===e&&(e=n?[...r]:r,t=n?[...r]:r),n)for(let n=0;n<r.length;n++)e[n]=Math.min(e[n],r[n]),t[n]=Math.max(t[n],r[n]);else e=Math.min(e,r),t=Math.max(t,r)},{boundsIJK:this.getDefaultBounds()}),{min:e,max:t}}invalidateCachedScalarExpansion(){this._scalarDataIsCachedExpansion&&(this.scalarData=null,this._scalarDataIsCachedExpansion=!1)}toIJK(e){return[e%this.width,Math.floor(e%this.frameSize/this.width),Math.floor(e/this.frameSize)]}toIndex(e){return e[0]+e[1]*this.width+e[2]*this.frameSize}getDefaultBounds(){return this.dimensions.map(e=>[0,e-1])}getBoundsIJK(){return this.boundsIJK[0][0]<this.dimensions[0]?this.boundsIJK:this.getDefaultBounds()}rleForEach(e,t){let r=t?.boundsIJK||this.getBoundsIJK(),{isWithinObject:n}=t||{},a=this.map;if(!a)return void console.warn("No map found, you need to use a map voxel manager to use rleForEach");a.defaultValue=void 0;for(let t=r[2][0];t<=r[2][1];t++)for(let i=r[1][0];i<=r[1][1];i++){let r=a.getRun(i,t);if(r)for(let a of r){let{start:r,end:o,value:s}=a,l=this.toIndex([0,i,t]);for(let a=r;a<o;a++){let r={value:s,index:l+a,pointIJK:[a,i,t]};n?.(r)!==!1&&e(r)}}}}getScalarData(e=!1){if(this.scalarData)return this._updateScalarData?.(this.scalarData),this.scalarData;if(this._getScalarData){let t=this._getScalarData();return e&&(this.scalarData=t,this._scalarDataIsCachedExpansion=!0),t}throw Error("No scalar data available")}setScalarData(e){this.scalarData=e,this._scalarDataIsCachedExpansion=!1}getScalarDataLength(){if(this.scalarData)return this.scalarData.length;if(this._getScalarDataLength)return this._getScalarDataLength();throw Error("No scalar data available")}get sizeInBytes(){return this.getScalarDataLength()*this.bytePerVoxel}get bytePerVoxel(){return this.scalarData?this.scalarData.BYTES_PER_ELEMENT:this._get(0).BYTES_PER_ELEMENT}clearBounds(){this.boundsIJK.map(e=>{e[0]=1/0,e[1]=-1/0})}clear(){this.map?.clear(),this.clearBounds(),this.modifiedSlices.clear(),this.points?.clear()}getConstructor(){return this.scalarData?this.scalarData.constructor:this._getConstructor?this._getConstructor():(console.warn("No scalar data available or can be used to get the constructor"),Float32Array)}getArrayOfModifiedSlices(){return Array.from(this.modifiedSlices)}resetModifiedSlices(){this.modifiedSlices.clear()}setBounds(e){this.boundsIJK=e}static addBounds(e,t){e||(e=[[1/0,-1/0],[1/0,-1/0],[1/0,-1/0]]),e[0][0]=Math.min(t[0],e[0][0]),e[0][1]=Math.max(t[0],e[0][1]),e[1][0]=Math.min(t[1],e[1][0]),e[1][1]=Math.max(t[1],e[1][1]),e[2][0]=Math.min(t[2],e[2][0]),e[2][1]=Math.max(t[2],e[2][1])}static getWorldToIndexTransform(e){let t=qC.get(e);if(t)return t;let r=e.direction,n=e.spacing,a=Lv.mat3.fromValues(r[0]/n[0],r[3]/n[1],r[6]/n[2],r[1]/n[0],r[4]/n[1],r[7]/n[2],r[2]/n[0],r[5]/n[1],r[8]/n[2]);return qC.set(e,a),a}static worldToIndexContinuous(e,t){let r=e.origin;qw[0]=t[0]-r[0],qw[1]=t[1]-r[1],qw[2]=t[2]-r[2];let n=Lv.vec3.transformMat3(qx,qw,qk.getWorldToIndexTransform(e));return[n[0],n[1],n[2]]}static sampleAtWorldCoordinates(e,t,r,n,a=NK.LINEAR){if(!e.voxelManager)return NaN;let i=e.origin;qw[0]=t-i[0],qw[1]=r-i[1],qw[2]=n-i[2];let o=Lv.vec3.transformMat3(qx,qw,qk.getWorldToIndexTransform(e));return qk.sampleAtContinuousCoordinates(e.voxelManager,e.dimensions,o[0],o[1],o[2],a)}static sampleAtWorld(e,t,r=NK.LINEAR){return qk.sampleAtWorldCoordinates(e,t[0],t[1],t[2],r)}static sampleAtContinuousIndex(e,t,r,n=NK.LINEAR){return qk.sampleAtContinuousCoordinates(e,t,r[0],r[1],r[2],n)}static sampleAtContinuousCoordinates(e,t,r,n,a,i){return i===NK.NEAREST?qk.sampleNearestAtContinuousCoordinates(e,t,r,n,a):qk.sampleLinearAtContinuousCoordinates(e,t,r,n,a)}static sampleNearestAtContinuousCoordinates(e,t,r,n,a){let i=Math.floor(r+.5-1e-6),o=Math.floor(n+.5-1e-6),s=Math.floor(a+.5-1e-6),l=t[0],u=t[1],d=t[2];return i<0||i>=l||o<0||o>=u||s<0||s>=d?NaN:Number(e.getAtIJK(i,o,s))}static sampleLinearAtContinuousCoordinates(e,t,r,n,a){let i=t[0],o=t[1],s=t[2];if(r<0||r>i-1||n<0||n>o-1||a<0||a>s-1)return NaN;let l=Math.floor(r),u=Math.floor(n),d=Math.floor(a),c=Math.min(l+1,i-1),h=Math.min(u+1,o-1),p=Math.min(d+1,s-1),m=r-l,f=n-u,g=a-d,y=1-m,v=1-f;return((Number(e.getAtIJK(l,u,d))*y+Number(e.getAtIJK(c,u,d))*m)*v+(Number(e.getAtIJK(l,h,d))*y+Number(e.getAtIJK(c,h,d))*m)*f)*(1-g)+((Number(e.getAtIJK(l,u,p))*y+Number(e.getAtIJK(c,u,p))*m)*v+(Number(e.getAtIJK(l,h,p))*y+Number(e.getAtIJK(c,h,p))*m)*f)*g}addPoint(e){let t=Array.isArray(e)?e[0]+this.width*e[1]+this.frameSize*e[2]:e;this.points||(this.points=new Set),this.points.add(t)}getPoints(){return this.points?[...this.points].map(e=>this.toIJK(e)):[]}setSliceDataValue(e,t,r){if(Array.isArray(r))for(let n=0;n<r.length;n++)e[t*r.length+n]=this.toNumber(r[n]);else e[t]=this.toNumber(r)}toNumber(e){return"number"==typeof e?e:Array.isArray(e)&&e[0]||0}static _createRGBScalarVolumeVoxelManager({dimensions:e,scalarData:t,numberOfComponents:r=3,id:n}){let a=new qk(e,{_get:e=>(e*=r,[t[e++],t[e++],t[e++]]),_id:n||"_createRGBScalarVolumeVoxelManager",_set:(e,r)=>{let n=!Vw(t[e*=3],r);return t[e++]=r[0],t[e++]=r[1],t[e++]=r[2],n},numberOfComponents:r,scalarData:t});return a.clear=()=>{t.fill(0)},a}static createImageVolumeVoxelManager({dimensions:e,imageIds:t,numberOfComponents:r=1,id:n}){let a=e[0]*e[1],i=e[2],o=Array(i),s=-1,l=null,u=new Set,d=new Set,c=e=>{if(e<0||e>=i)return null;let r=o[e];if(void 0!==r)return r;let n=t[e];if(!n)return u.has(e)||(u.add(e),console.warn(`ImageId not found for sliceIndex: ${e}`)),o[e]=null,null;let a=ql.getImage(n);if(!a?.voxelManager)return d.has(n)||(d.add(n),console.warn(`Image not found for imageId: ${n}`)),null;let s=a.voxelManager;return o[e]=s,s},h=new qk(e,{_get:function(e){let t=Math.floor(e/a);if(t<0||t>=i)return null;let r=t===s?l:c(t);return r?(t!==s&&(s=t,l=r),r.getAtIndex(e-t*a)):null},_set:function(e,t){let r=Math.floor(e/a);if(r<0||r>=i)return!1;let n=r===s?l:c(r);if(!n)return!1;r!==s&&(s=r,l=n);let o=e-r*a,u=!Vw(t,n.getAtIndex(o));return u?(n.setAtIndex(o,t),!0):u},numberOfComponents:r,_getConstructor:()=>{let e=c(0);return e?e.getConstructor():null},_id:n||"createImageVolumeVoxelManager"});return h.invalidateCache=()=>{o.fill(void 0),s=-1,l=null},h.getMiddleSliceData=()=>{let t=Math.floor(e[2]/2);return h.getSliceData({sliceIndex:t,slicePlane:2})},h.clear=()=>{for(let e of t)ql.getImage(e).voxelManager.clear()},h.getRange=()=>{let e=1/0,r=-1/0;for(let n of t){let t=ql.getImage(n);t&&(t.minPixelValue<e&&(e=t.minPixelValue),t.maxPixelValue>r&&(r=t.maxPixelValue))}return e===1/0&&r===-1/0?[0,0]:[e,r]},h._getScalarDataLength=()=>{let t=c(0);return t?t.getScalarDataLength()*e[2]:0},h.getCompleteScalarDataArray=()=>{let t=h._getConstructor();if(!t)return new Uint8Array(0);let n=new t(h.getScalarDataLength()),a=e[0]*e[1]*r;for(let t=0;t<e[2];t++){let e=c(t);if(e){let i=t*a,o=e.getScalarData();if(1===r)n.set(o,i);else for(let e=0;e<o.length;e+=r)for(let t=0;t<r;t++)n[i+e+t]=o[e+t]}}return n},h.setCompleteScalarDataArray=n=>{let a=e[0]*e[1]*r,i=h._getConstructor(),o=1/0,s=-1/0;for(let r=0;r<e[2];r++){let e=c(r);if(e&&i){let l=r*a,u=l+a,d=new i(a);if(d.set(n.subarray(l,u)),e.scalarData)e.scalarData.set(d),e.modifiedSlices.add(r);else for(let t=0;t<a;t++)e.setAtIndex(t,d[t]);for(let e=0;e<d.length;e++){let t=d[e];o=Math.min(o,t),s=Math.max(s,t)}let c=t[r],h=ql.getImage(c);h&&(h.minPixelValue=o,h.maxPixelValue=s)}}for(let t=0;t<e[2];t++)h.modifiedSlices.add(t);h.boundsIJK=[[0,e[0]-1],[0,e[1]-1],[0,e[2]-1]]},h}static createScalarVolumeVoxelManager({dimensions:e,scalarData:t,numberOfComponents:r,id:n}){if(3!==e.length)throw Error("Dimensions must be provided as [number, number, number] for [width, height, depth]");if(!r&&((r=t.length/e[0]/e[1]/e[2])>4||r<1||2===r))throw Error(`Number of components ${r} must be 1, 3 or 4`);return r>1?qk._createRGBScalarVolumeVoxelManager({dimensions:e,scalarData:t,numberOfComponents:r,id:n}):qk._createNumberVolumeVoxelManager({dimensions:e,scalarData:t,id:n})}static createScalarDynamicVolumeVoxelManager({imageIdGroups:e,dimensions:t,dimensionGroupNumber:r=1,timePoint:n=0,numberOfComponents:a=1,id:i}){let o=0;if(void 0!==r?o=r-1:void 0!==n&&(console.warn("Warning: timePoint parameter is deprecated. Please use dimensionGroupNumber instead. timePoint is zero-based while dimensionGroupNumber starts at 1."),o=n),!a){let r=ql.getImage(e[0][0]);if(!r)throw Error("Unable to determine number of components: No image found");if((a=r.getPixelData().length/(t[0]*t[1]))>4||a<1||2===a)throw Error(`Number of components ${a} must be 1, 3 or 4`)}let s=e.map(e=>qk.createImageVolumeVoxelManager({dimensions:t,imageIds:e,numberOfComponents:a,id:i})),l=new qk(t,{_get:e=>s[o]._get(e),_set:(e,t)=>s[o]._set(e,t),numberOfComponents:a,_id:i||"createScalarDynamicVolumeVoxelManager"});return l.getScalarDataLength=()=>s[o].getScalarDataLength(),l.getConstructor=()=>s[o].getConstructor(),l.getRange=()=>s[o].getRange(),l.getMiddleSliceData=()=>s[o].getMiddleSliceData(),l.setTimePoint=e=>{console.warn("Warning: setTimePoint is deprecated. Please use setDimensionGroupNumber instead. Note that timePoint is zero-based while dimensionGroupNumber starts at 1."),l.setDimensionGroupNumber(e+1)},l.setDimensionGroupNumber=e=>{o=e-1,l._get=e=>s[o]._get(e),l._set=(e,t)=>s[o]._set(e,t)},l.getAtIndexAndTimePoint=(e,t)=>(console.warn("Warning: getAtIndexAndTimePoint is deprecated. Please use getAtIndexAndDimensionGroup instead. Note that timePoint is zero-based while dimensionGroupNumber starts at 1."),l.getAtIndexAndDimensionGroup(e,t+1)),l.getAtIndexAndDimensionGroup=(e,t)=>s[t-1]._get(e),l.getTimePointScalarData=e=>(console.warn("Warning: getTimePointScalarData is deprecated. Please use getDimensionGroupScalarData instead. Note that timePoint is zero-based while dimensionGroupNumber starts at 1."),l.getDimensionGroupScalarData(e+1)),l.getDimensionGroupScalarData=e=>s[e-1].getCompleteScalarDataArray(),l.getCurrentTimePointScalarData=()=>(console.warn("Warning: getCurrentTimePointScalarData is deprecated. Please use getCurrentDimensionGroupScalarData instead."),l.getCurrentDimensionGroupScalarData()),l.getCurrentDimensionGroupScalarData=()=>s[o].getCompleteScalarDataArray(),l.getCurrentTimePoint=()=>(console.warn("Warning: getCurrentTimePoint is deprecated. Please use getCurrentDimensionGroupNumber instead. Note that timePoint is zero-based while dimensionGroupNumber starts at 1."),o),l.getCurrentDimensionGroupNumber=()=>o+1,l}static createImageVoxelManager({width:e,height:t,scalarData:r,numberOfComponents:n=1,id:a}){let i=[e,t,1];if(!n&&((n=r.length/e/t)>4||n<1||2===n))throw Error(`Number of components ${n} must be 1, 3 or 4`);return n>1?qk._createRGBScalarVolumeVoxelManager({dimensions:i,scalarData:r,numberOfComponents:n,id:a}):qk._createNumberVolumeVoxelManager({dimensions:i,scalarData:r,id:a})}static _createNumberVolumeVoxelManager({dimensions:e,scalarData:t,id:r}){let n=new qk(e,{_get:e=>t[e],_set:(e,r)=>{let n=t[e]!==r;return t[e]=r,n},_getConstructor:()=>t.constructor,_id:r||"_createNumberVolumeVoxelManager"});return n.scalarData=t,n.clear=()=>{n.scalarData.fill(0)},n.getMiddleSliceData=()=>{let t=Math.floor(e[2]/2);return n.getSliceData({sliceIndex:t,slicePlane:2})},n}static createMapVoxelManager({dimension:e,id:t}){let r=new Map,n=new qk(e,{_get:r.get.bind(r),_set:(e,t)=>r.set(e,t)&&!0,_id:t||"createMapVoxelManager"});return n.map=r,n}static createHistoryVoxelManager(e,t){let r=new Map,{dimensions:n}=e,a=new qk(n,{_get:e=>r.get(e),_set:function(e,t){if(r.has(e))t===r.get(e)&&r.delete(e);else{let n=this.sourceVoxelManager.getAtIndex(e);if(n===t)return!1;r.set(e,n)}this.sourceVoxelManager.setAtIndex(e,t)},_id:t||"createHistoryVoxelManager"});return a.map=r,a.scalarData=e.scalarData,a.sourceVoxelManager=e,a}static createRLEHistoryVoxelManager(e,t){let{dimensions:r}=e,n=new qg(r[0],r[1],r[2]),a=new qk(r,{_get:e=>n.get(e),_set:function(e,t){let r=n.get(e);if(void 0===r){let r=this.sourceVoxelManager.getAtIndex(e);if(r===t||void 0===r&&0===t||null===t)return!1;n.set(e,r??0)}else(t===r||null===t)&&(n.delete(e),t=r);this.sourceVoxelManager.setAtIndex(e,t)},_getScalarData:qg.getScalarData,_updateScalarData:e=>(n.updateScalarData(e),e),_id:t||"createRLEHistoryVoxelManager"});return a.map=n,a.sourceVoxelManager=e,a}static createLazyVoxelManager({dimensions:e,planeFactory:t,id:r}){let n=new Map,[a,i]=e,o=a*i,s=new qk(e,{_get:e=>n.get(Math.floor(e/o))[e%o],_set:(e,r)=>{let s=Math.floor(e/o),l=n.get(s);return l||(l=t(a,i),n.set(s,l)),l[e%o]=r,!0},_id:r||"createLazyVoxelManager"});return s.map=n,s}static createRLEVolumeVoxelManager({dimensions:e,id:t}){let[r,n,a]=e,i=new qg(r,n,a),o=new qk(e,{_get:e=>i.get(e),_set:(e,t)=>(i.set(e,t),!0),_getScalarData:qg.getScalarData,_updateScalarData:e=>(i.updateScalarData(e),e),_id:t||"createRLEVolumeVoxelManager"});return o.map=i,o.getPixelData=i.getPixelData.bind(i),o}static createRLEImageVoxelManager({dimensions:e,id:t}){let[r,n]=e;return qk.createRLEVolumeVoxelManager({dimensions:[r,n,1],id:t})}static addInstanceToImage(e){let{width:t,height:r}=e,n=e.voxelManager.getScalarData();if(n.length>=t*r){e.voxelManager=qk.createScalarVolumeVoxelManager({dimensions:[t,r,1],scalarData:n});return}e.voxelManager=qk.createRLEVolumeVoxelManager({dimensions:[t,r,1]}),e.getPixelData=e.voxelManager.getPixelData,e.sizeInBytes=5120}}let qM=new F5("imageLoadPool");qM.grabDelay=0,qM.setMaxSimultaneousRequests(NG.Interaction,1e3),qM.setMaxSimultaneousRequests(NG.Thumbnail,1e3),qM.setMaxSimultaneousRequests(NG.Prefetch,1e3);let qS={};function qE(e,t){let r=!t.ignoreCache&&ql.getImageLoadObject(e);if(r)return qT(r.promise,e),r;let n=!t.ignoreCache&&ql.getImage(e,t.retrieveOptions?.imageQualityStatus??Fx.FULL_RESOLUTION);if(n){let t={promise:Promise.resolve(n)};return qT(t.promise,e),t}let a=e.split(":")[0],i=qS[a]||b;if(!i)throw Error(`loadImageFromImageLoader: No image loader found for scheme '${a}'`);let o=i(e,t);return qT(o.promise,e),o}function qT(e,t){Promise.resolve(e).then(e=>{(function(e){if(!e.voxelManager){let{width:t,height:r,numberOfComponents:n}=e,a=qk.createImageVoxelManager({scalarData:e.getPixelData(),width:t,height:r,numberOfComponents:n});e.voxelManager=a,e.getPixelData=()=>a.getScalarData(),delete e.imageFrame.pixelData}})(e),Bh(Bc,NH.IMAGE_LOADED,{image:e})}).catch(e=>{Bh(Bc,NH.IMAGE_LOAD_FAILED,{imageId:t,error:e})})}function qI(e,t={priority:0,requestType:"prefetch"}){if(void 0===e)throw Error("loadAndCacheImage: parameter imageId must not be undefined");let r=qE(e,t);return ql.getImageLoadObject(e)||ql.putImageLoadObject(e,r),r.promise}function qP(e,t){let r=Gj(e);return r.invert(),r.transformPoint(t)}let q_={};function qD(e,t){if(null==e)throw Error(t)}function qO(e,t=null){return(qD(e,"getImageSize: parameter image must not be undefined"),qD(e.width,"getImageSize: parameter image must have width"),qD(e.height,"getImageSize: parameter image must have height"),null!=t&&0!==t&&180!==t)?{height:e.width,width:e.height}:{width:e.width,height:e.height}}function qA(e,t,r=null){qD(e,"getImageScale: parameter canvas must not be undefined"),qD(t,"getImageScale: parameter image must not be undefined");let n=qO(t,r),a=t.rowPixelSpacing||1,i=t.columnPixelSpacing||1,o=1,s=1;a<i?s=i/a:o=a/i;let l=e.height/n.height/o,u=e.width/n.width/s;return{verticalScale:l,horizontalScale:u,scaleFactor:Math.min(u,l)}}function qR(e,t,r,n){let a;if(void 0===e)throw Error("getDefaultViewport: parameter canvas must not be undefined");if(void 0===t)return Object.assign({},{scale:1,translation:{x:0,y:0},voi:{windowWidth:void 0,windowCenter:void 0,voiLUTFunction:N2.LINEAR},invert:!1,pixelReplication:!1,rotation:0,hflip:!1,vflip:!1,modalityLUT:void 0,voiLUT:void 0,colormap:void 0,labelmap:!1,displayedArea:{tlhc:{x:1,y:1},brhc:{x:1,y:1},rowPixelSpacing:1,columnPixelSpacing:1,presentationSizeMode:"NONE"}},q_);let i=qA(e,t,0).scaleFactor;return"PT"===r&&t.isPreScaled?a={windowWidth:5,windowCenter:2.5}:void 0!==t.windowWidth&&void 0!==t.windowCenter&&(a={windowWidth:Array.isArray(t.windowWidth)?t.windowWidth[0]:t.windowWidth,windowCenter:Array.isArray(t.windowCenter)?t.windowCenter[0]:t.windowCenter}),{scale:i,translation:{x:0,y:0},voi:a,invert:t.invert,pixelReplication:!1,rotation:0,hflip:!1,vflip:!1,modalityLUT:t.modalityLUT,modality:r,voiLUT:t.voiLUT,colormap:void 0!==n?n:t.colormap,displayedArea:{tlhc:{x:1,y:1},brhc:{x:t.columns,y:t.rows},rowPixelSpacing:void 0===t.rowPixelSpacing?1:t.rowPixelSpacing,columnPixelSpacing:void 0===t.columnPixelSpacing?1:t.columnPixelSpacing,presentationSizeMode:"NONE"}}}function qL(e,t){return Gj(e).transformPoint(t)}function qN(e,t=!1){let r=e.canvas.width,n=e.canvas.height;if(!function(e){let{canvas:t}=e,{clientWidth:r,clientHeight:n}=t;(t.width!==r||t.height!==n)&&(t.width=r,t.height=n)}(e),void 0!==e.image){let a,i,o,s,l,u;if(t||(a=e.viewport.scale,o=Math.round((i=qO(e.image,e.viewport.rotation)).width*a),s=Math.round(i.height*a),l=e.viewport.translation.x,u=e.viewport.translation.y,o===r&&s<=n||o<=r&&s===n&&0===l&&0===u))!function(e){let{image:t}=e;e.viewport.scale=qA(e.canvas,t,e.viewport.rotation).scaleFactor,e.viewport.translation.x=0,e.viewport.translation.y=0}(e);else{let t,a,i;t=e.viewport.scale,a=e.canvas.width,i=Math.sqrt(a/r*(e.canvas.height/n)),e.viewport.scale=i*t}}}let qV=[{id:"initialImages",retrieveType:"single"}],qF=[{offset:-1,imageQualityStatus:Fx.ADJACENT_REPLICATE},{offset:1,imageQualityStatus:Fx.ADJACENT_REPLICATE},{offset:2,imageQualityStatus:Fx.FAR_REPLICATE}],qB=[{id:"initialImages",positions:[.5,0,-1],retrieveType:"default",requestType:NG.Thumbnail,priority:5,nearbyFrames:qF},{id:"quarterThumb",decimate:4,offset:3,requestType:NG.Thumbnail,retrieveType:"multipleFast",priority:6,nearbyFrames:qF},{id:"halfThumb",decimate:4,offset:1,priority:7,requestType:NG.Thumbnail,retrieveType:"multipleFast",nearbyFrames:qF},{id:"quarterFull",decimate:4,offset:2,priority:8,requestType:NG.Thumbnail,retrieveType:"multipleFinal"},{id:"halfFull",decimate:4,offset:0,priority:9,requestType:NG.Thumbnail,retrieveType:"multipleFinal"},{id:"threeQuarterFull",decimate:4,offset:1,priority:10,requestType:NG.Thumbnail,retrieveType:"multipleFinal"},{id:"finalFull",decimate:4,offset:3,priority:11,requestType:NG.Thumbnail,retrieveType:"multipleFinal"},{id:"errorRetrieve"}];class qj{constructor(e){this.name=e||"unknown"}static as(e){if(e.iterator)return e.iterator;let t=new qj("as iterator");return e.then(e=>{try{t.add(e,!0)}catch(e){t.reject(e)}},e=>{t.reject(e)}),t}add(e,t=!1){this.nextValue=e,this.done||=t,this.waiting&&(this.waiting.resolve(e),this.waiting=void 0)}resolve(){this.done=!0,this.waiting&&(this.waiting.resolve(this.nextValue),this.waiting=void 0)}reject(e){this.rejectReason=e,this.waiting?.reject(e)}getRecent(){if(this.rejectReason)throw this.rejectReason;return this.nextValue}async *[Symbol.asyncIterator](){for(;!this.done;){if(this.rejectReason)throw this.rejectReason;if(void 0!==this.nextValue&&(yield this.nextValue,this.done))break;this.waiting||(this.waiting={},this.waiting.promise=new Promise((e,t)=>{this.waiting.resolve=e,this.waiting.reject=t})),await this.waiting.promise}yield this.nextValue}async forEach(e,t){let r=0;try{for await(let n of this){let{done:a}=this;try{await e(n,a,r),r++}catch(e){if(!a){console.warn("Caught exception in intermediate value",e);continue}if(t)t(e,a);else throw e}}}catch(e){if(t)t(e,!0);else throw e}}generate(e,t){return e(this,this.reject.bind(this)).then(()=>{this.done||this.resolve()},e=>{this.reject(e),t?t(e):console.warn("Couldn't process because",e)})}async nextPromise(){for await(let e of this)if(e)return e;return this.nextValue}async donePromise(){for await(let e of this);return this.nextValue}getNextPromise(){let e=this.nextPromise();return e.iterator=this,e}getDonePromise(){let e=this.donePromise();return e.iterator=this,e}}class qW{constructor(e){this.stages=e.stages||qV,this.retrieveOptions=e.retrieveOptions||{}}loadImages(e,t){return new qU(this,e,t).loadImages()}}qW.createProgressive=qz,qW.interleavedRetrieveStages={stages:qB},qW.singleRetrieveStages={stages:qV},qW.sequentialRetrieveStages={stages:[{id:"lossySequential",retrieveType:"singleFast"},{id:"finalSequential",retrieveType:"singleFinal"}]};class qU{constructor(e,t,r){this.outstandingRequests=0,this.stageStatusMap=new Map,this.displayedIterator=new qj("displayed"),this.stages=e.stages,this.retrieveOptions=e.retrieveOptions,this.imageIds=t,this.listener=r}async loadImages(){let e=this.createStageRequests();for(let t of(this.outstandingRequests=e.length,e))this.addRequest(t);return 0===this.outstandingRequests?Promise.resolve(null):this.displayedIterator.getDonePromise()}sendRequest(e,t){let{imageId:r,next:n}=e,a=(t,a)=>{this.listener.errorCallback(r,s||!n,t),a&&this.updateStageStatus(e.stage,t)},i=(t.loader||qI)(r,t),o=qj.as(i),s=!1;return o.forEach(async(t,n)=>{let a=ql.getImageQuality(r);if(!t)return void console.warn("No image retrieved",r);let{imageQualityStatus:i}=t;(s||=i===Fx.FULL_RESOLUTION,void 0!==a&&a>i)?this.updateStageStatus(e.stage,null,!0):(this.listener.successCallback(r,t),this.displayedIterator.add(t),n&&this.updateStageStatus(e.stage),function(e,t,r){if(t?.nearbyRequests?.length)for(let n of t.nearbyRequests)try{let{itemId:t,imageQualityStatus:a}=n,i=ql.getImageQuality(t);if(void 0!==i&&i>=a)continue;let o={...r,imageId:t,imageQualityStatus:a};ql.setPartialImage(t,o),e.successCallback(t,o)}catch(e){console.warn("Couldn't fill nearby item ",n.itemId,e)}}(this.listener,e,t))},a).finally(()=>{if(!s&&n)ql.setPartialImage(r,void 0,!0),this.addRequest(n,t.streamingData);else{s||this.listener.errorCallback(r,!0,"Couldn't decode"),this.outstandingRequests--;for(let e=n;e;e=e.next)this.updateStageStatus(e.stage,null,!0)}this.outstandingRequests<=0&&this.displayedIterator.resolve()}),o.getDonePromise().catch(e=>null)}addRequest(e,t={}){let{imageId:r,stage:n}=e,a=this.listener.getLoaderImageOptions(r);if(!a)return;let{retrieveType:i="default"}=n,{retrieveOptions:o}=this,s=o[i]||o.default,l={...a,retrieveType:i,retrieveOptions:s,streamingData:t},u=n.priority??-5,d=n.requestType||NG.Interaction;qM.addRequest(this.sendRequest.bind(this,e,l),d,{imageId:r},u)}updateStageStatus(e,t,r=!1){let{id:n}=e,a=this.stageStatusMap.get(n);if(a&&(a.imageLoadPendingCount--,t?a.imageLoadFailedCount++:!r&&a.totalImageCount++,r||a.stageStartTime||(a.stageStartTime=Date.now()),!a.imageLoadPendingCount)){let{imageLoadFailedCount:e,totalImageCount:t,stageStartTime:r=Date.now(),startTime:i}=a,o={stageId:n,numberOfFailures:e,numberOfImages:t,stageDurationInMS:r?Date.now()-r:null,startDurationInMS:Date.now()-i};Bh(Bc,NH.IMAGE_RETRIEVAL_STAGE,o),this.stageStatusMap.delete(n)}}createStageRequests(){let e=[],t=new Map,r=(r,n)=>{let a=n<0?this.imageIds.length+n:n<1?Math.floor((this.imageIds.length-1)*n):n,i=this.imageIds[a];if(!i)throw Error(`No value found to add to requests at ${n}`);let o={imageId:i,stage:r,index:a,nearbyRequests:this.findNearbyRequests(a,r)};this.addStageStatus(r);let s=t.get(i);s?s.next=o:e.push(o),t.set(i,o)};for(let e of this.stages)(e.positions||function(e,t,r=0){let n=[];for(let a=r;a<e.length;a+=t)n.push(a);return n}(this.imageIds,e.decimate||1,e.offset??0)).forEach(t=>{r(e,t)});return e}findNearbyRequests(e,t){let r=[];if(!t.nearbyFrames)return r;for(let n of t.nearbyFrames){let t=e+n.offset;t<0||t>=this.imageIds.length||r.push({itemId:this.imageIds[t],imageQualityStatus:n.imageQualityStatus,index:t})}return r}addStageStatus(e){let{id:t}=e,r=this.stageStatusMap.get(t)||{stageId:t,startTime:Date.now(),stageStartTime:null,totalImageCount:0,imageLoadFailedCount:0,imageLoadPendingCount:0};return r.imageLoadPendingCount++,this.stageStatusMap.set(t,r),r}}function qz(e){return new qW(e)}function qH(e,t){let{hflip:r,vflip:n,rotation:a}=t;if(e.x*=r?-1:1,e.y*=n?-1:1,0!==a){let t=a*Math.PI/180,r=Math.cos(t),n=Math.sin(t),i=e.x*r-e.y*n,o=e.x*n+e.y*r;e.x=i,e.y=o}return e}function qG(e,t){let{direction:r,spacing:n}=e,a=r.slice(0,3),i=r.slice(3,6),o=r.slice(6,9),s=[Lv.vec3.dot(a,t),Lv.vec3.dot(i,t),Lv.vec3.dot(o,t)],l=Lv.vec3.create();return Lv.vec3.set(l,s[0]*n[0],s[1]*n[1],s[2]*n[2]),Lv.vec3.length(l)}let qq=F9.getLogger("utilities","getClosestImageId");function q$(e,t,r,n){let a,i,{direction:o,spacing:s,imageIds:l}=e,{ignoreSpacing:u=!1}=n||{};if(!l?.length)return;let d=o.slice(6,9);if(Math.abs(Lv.vec3.dot(d,r))<1-FP)return;u||(a=qG({direction:o,spacing:s},r)/2);let c=1/0;for(let e=0;e<l.length;e++){let n=l[e],o=HB(FC.IMAGE_PLANE,n);if(!o?.imagePositionPatient){qq.warn(`Missing imagePositionPatient for imageId: ${n}`);continue}let{imagePositionPatient:s}=o,d=Lv.vec3.create();Lv.vec3.sub(d,t,s);let h=Math.abs(Lv.vec3.dot(d,r));u?h<c&&(c=h,i=n):h<a&&h<c&&(c=h,i=n)}return void 0===i&&qq.warn("No imageId found within the specified criteria (half spacing or absolute closest)."),i}function qK(e,t,r,n){let a=Lv.vec3.clone(e);if(r&&Lv.vec3.negate(a,a),t){var i;let e,t,r=Lv.vec3.cross(Lv.vec3.create(),n,a);Lv.vec3.normalize(r,r),i=a,e=Lv.vec3.dot(i,r),t=Lv.vec3.scale(Lv.vec3.create(),r,2*e),a=Lv.vec3.sub(Lv.vec3.create(),i,t)}return a}function qY(){return BM?.rendering?.renderingEngineMode===Fk.ContextPool}var qZ={FLAT:0,GOURAUD:1,PHONG:2},qX={POINTS:0,WIREFRAME:1,SURFACE:2},qJ={Shading:qZ,Representation:qX,Interpolation:qZ},qQ={CLAMP_TO_EDGE:0,REPEAT:1,MIRRORED_REPEAT:2},q0={NEAREST:0,LINEAR:1,NEAREST_MIPMAP_NEAREST:2,NEAREST_MIPMAP_LINEAR:3,LINEAR_MIPMAP_NEAREST:4,LINEAR_MIPMAP_LINEAR:5},q1={Wrap:qQ,Filter:q0},q2=new Float32Array(1),q5=new Int32Array(q2.buffer),q3={fromHalf:function(e){let t=(32768&e)>>15,r=(31744&e)>>10,n=1023&e;return 0===r?(t?-1:1)*6103515625e-14*(n/1024):31===r?n?NaN:1/0*(t?-1:1):(t?-1:1)*2**(r-15)*(1+n/1024)},toHalf:function(e){q2[0]=e;let t=q5[0],r=t>>16&32768,n=t>>12&2047,a=t>>23&255;return a<103?r:a>142?(r|=31744,r|=+(255!==a)&&8388607&t):a<113?(n|=2048,r|=(n>>114-a)+(n>>113-a&1)):(r|=a-112<<10|n>>1,r+=1&n)}},{vtkErrorMacro:q4}=jS,q8={renderable:null,myFactory:null,children:[],visited:!1};function q6(e,t,r={}){let n;Object.assign(t,q8,r),jS.obj(e,t),jS.event(e,t,"event"),t._renderableChildMap=new Map,jS.get(e,t,["visited"]),jS.setGet(e,t,["_parent","renderable","myFactory"]),jS.getArray(e,t,["children"]),jS.moveToProtected(e,t,["parent"]),t.classHierarchy.push("vtkViewNode"),e.build=e=>{},e.render=e=>{},e.traverse=r=>{let n=e[r.getTraverseOperation()];if(n)return void n(r);e.apply(r,!0);for(let e=0;e<t.children.length;e++)t.children[e].traverse(r);e.apply(r,!1)},e.apply=(t,r)=>{let n=e[t.getOperation()];n&&n(r,t)},e.getViewNodeFor=(r,n=null)=>{if(n&&n.renderable===r)return n;if(t.renderable===r)return e;for(let e=0;e<t.children.length;++e){let n=t.children[e].getViewNodeFor(r);if(n)return n}},e.getFirstAncestorOfType=e=>t._parent?t._parent.isA(e)?t._parent:t._parent.getFirstAncestorOfType(e):null,e.getLastAncestorOfType=e=>{if(!t._parent)return null;let r=t._parent.getLastAncestorOfType(e);return r||(t._parent.isA(e)?t._parent:null)},e.addMissingNode=r=>{if(!r)return;let n=t._renderableChildMap.get(r);if(void 0!==n)return n.setVisited(!0),n;let a=e.createViewNode(r);if(a)return a.setParent(e),a.setVisited(!0),t._renderableChildMap.set(r,a),t.children.push(a),a},e.addMissingNodes=(r,n=!1)=>{let a;if(r&&r.length)for(let i=0;i<r.length;++i){let o=r[i],s=e.addMissingNode(o);n&&void 0!==s&&(void 0===a?a=t.children.lastIndexOf(s):t.children[a]!==s&&function(e,r){for(let n=0;n<t.children.length;++n){let a=(r+1+n)%t.children.length;if(t.children[a]===e)return t.children[a]=t.children[r],t.children[r]=e,!0}}(t.children,s),a++)}},e.addMissingChildren=r=>{if(r&&r.length)for(let n=0;n<r.length;++n){let a=r[n];if(-1===t.children.indexOf(a)){a.setParent(e),t.children.push(a);let r=a.getRenderable();r&&t._renderableChildMap.set(r,a)}a.setVisited(!0)}},e.removeNode=e=>{let r=t.children.findIndex(t=>t===e);if(r<0)return!1;let n=e.getRenderable();return n&&t._renderableChildMap.delete(n),e.delete(),t.children.splice(r,1),!0},e.prepareNodes=()=>{for(let e=0;e<t.children.length;++e)t.children[e].setVisited(!1)},e.setVisited=e=>{t.visited=e},e.removeUnusedNodes=()=>{let e=0;for(let r=0;r<t.children.length;++r){let n=t.children[r];if(n.getVisited())t.children[e++]=n,n.setVisited(!1);else{let e=n.getRenderable();e&&t._renderableChildMap.delete(e),n.delete()}}t.children.length=e},e.createViewNode=e=>{if(!t.myFactory)return q4("Cannot create view nodes without my own factory"),null;let r=t.myFactory.createNode(e);return r&&r.setRenderable(e),r},n=e.delete,e.delete=()=>{for(let e=0;e<t.children.length;e++)t.children[e].delete();n()}}var q9={newInstance:jS.newInstance(q6,"vtkViewNode"),extend:q6,PASS_TYPES:["Build","Render"]},{vtkWarningMacro:q7}=jS,$e={};function $t(e,t,r={}){Object.assign(t,$e,r),jS.obj(e,t),t.overrides||(t.overrides={}),t.classHierarchy.push("vtkViewNodeFactory"),e.createNode=r=>{if(r.isDeleted())return null;let n=function(e){let t=[],r=0,n=e.getClassName(r++);for(;n;)t.push(n),n=e.getClassName(r++);return t}(r),a=0,i=n[a++],o=!1,s=Object.keys(t.overrides);for(;i&&!o;)-1!==s.indexOf(i)?o=!0:i=r.getClassName(a++);if(!o){var l;let t;return n.includes("vtkAbstractWidget")||n.includes("vtkWidgetRepresentation")?null:(q7((l=e.getClassName(),t=n.join(" → "),`No ${l} implementation found for ${n[0]}.
37
+ </svg>#colour')`}getRenderingEngine(){return FA(this.renderingEngineId)}getRenderer(){let e=this.getRenderingEngine();if(!e||e.hasBeenDestroyed)throw Error("Rendering engine has been destroyed");return e.offscreenMultiRenderWindow?.getRenderer(this.id)}render(){this.getRenderingEngine().renderViewport(this.id)}setOptions(e,t=!1){this.options=G_(e),this.options?.displayArea&&this.setDisplayArea(this.options?.displayArea),t&&this.render()}reset(e=!1){this.options=G_(this.defaultOptions),e&&this.render()}getSliceViewInfo(){throw Error("Method not implemented.")}flip({flipHorizontal:e,flipVertical:t}){let r=this.getDefaultImageData();if(!r)return;let n=this.getCamera(),{viewPlaneNormal:a,viewUp:i,focalPoint:o,position:s}=n,l=Lv.vec3.cross(Lv.vec3.create(),a,i),u=Lv.vec3.copy(Lv.vec3.create(),i),d=Lv.vec3.negate(Lv.vec3.create(),a),c=Lv.vec3.distance(s,o),h=GL(r.getDimensions(),r.getDirection(),a),p=[h[0],h[1],h[2]],m=r.indexToWorld(p,Lv.vec3.create()),f=this._getFocalPointForResetCamera(m,n,{resetPan:!0,resetToCenter:!1}),g=Lv.vec3.subtract(Lv.vec3.create(),o,f),y=Lv.vec3.length(g),v=e=>{let t=Lv.vec3.scale(Lv.vec3.create(),e,2*Lv.vec3.dot(g,e));return Lv.vec3.subtract(t,t,g),Lv.vec3.normalize(t,t),t};if(e){let e=v(u),t=Lv.vec3.scaleAndAdd(Lv.vec3.create(),f,e,y),r=Lv.vec3.scaleAndAdd(Lv.vec3.create(),t,d,c);this.setCamera({viewPlaneNormal:d,position:r,focalPoint:t}),this.flipHorizontal=!this.flipHorizontal}if(t){u=Lv.vec3.negate(u,i);let e=v(l),t=Lv.vec3.scaleAndAdd(Lv.vec3.create(),f,e,y),r=Lv.vec3.scaleAndAdd(Lv.vec3.create(),t,d,c);this.setCamera({focalPoint:t,viewPlaneNormal:d,viewUp:u,position:r}),this.flipVertical=!this.flipVertical}this.render()}getDefaultImageData(){let e=this.getDefaultActor();if(e&&H2(e))return e.actor.getMapper().getInputData()}getDefaultActor(){return this.getActors()[0]}getActors(){return Array.from(this._actors.values())}getActorUIDs(){return Array.from(this._actors.keys())}getActor(e){return this._actors.get(e)}getImageActor(e){let t=this.getActors(),r=t[0];return(e&&(r=t.find(t=>t.referencedId===e)),r&&H2(r))?r.actor:null}getActorUIDByIndex(e){let t=this.getActors()[e];if(t)return t.uid}getActorByIndex(e){return this.getActors()[e]}setActors(e){let t=this.getActors();this.removeAllActors(),this.addActors(e,{resetCamera:!0}),Bh(this.element,NH.ACTORS_CHANGED,{viewportId:this.id,removedActors:t,addedActors:e,currentActors:e})}_removeActor(e){let t=this.getActor(e);return t?(this.getRenderer().removeActor(t.actor),this._actors.delete(e),t):void console.warn(`Actor ${e} does not exist in ${this.id}, can't remove`)}removeActors(e){let t=[];e.forEach(e=>{let r=this._removeActor(e);r&&t.push(r)});let r=this.getActors();Bh(this.element,NH.ACTORS_CHANGED,{viewportId:this.id,removedActors:t,addedActors:[],currentActors:r})}addActors(e,t={}){let{resetCamera:r=!1}=t,n=this.getRenderingEngine();if(!n||n.hasBeenDestroyed)return void console.warn("Viewport::addActors::Rendering engine has not been initialized or has been destroyed");if(e.forEach(e=>{this.addActor(e)}),r)this.resetCamera();else{let e=this.getViewPresentation(),t=this.getViewReference();this.resetCamera(),this.setViewReference(t),this.setViewPresentation(e)}Bh(this.element,NH.ACTORS_CHANGED,{viewportId:this.id,removedActors:[],addedActors:e,currentActors:this.getActors()})}addActor(e){let{uid:t,actor:r}=e,n=this.getRenderingEngine();if(!n||n.hasBeenDestroyed)return void console.warn(`Cannot add actor UID of ${t} Rendering Engine has been destroyed`);if(!t||!r)throw Error("Actors should have uid and vtk Actor properties");if(this.getActor(t))return void console.warn(`Actor ${t} already exists for this viewport`);let a=this.getRenderer();a?.addActor(r),this._actors.set(t,Object.assign({},e)),this.updateCameraClippingPlanesAndRange(),Bh(this.element,NH.ACTORS_CHANGED,{viewportId:this.id,removedActors:[],addedActors:[e],currentActors:this.getActors()})}removeAllActors(){let e=this.getActors();this.getRenderer()?.removeAllViewProps(),this._actors=new Map,Bh(this.element,NH.ACTORS_CHANGED,{viewportId:this.id,removedActors:e,addedActors:[],currentActors:[]})}resetCameraNoEvent(){let e=this._suppressCameraModifiedEvents;this._suppressCameraModifiedEvents=!0,this.resetCamera(),this._suppressCameraModifiedEvents=e}setCameraNoEvent(e){let t=this._suppressCameraModifiedEvents;this._suppressCameraModifiedEvents=!0,this.setCamera(e),this._suppressCameraModifiedEvents=t}_getViewImageDataIntersections(e,t,r){let n=r[0],a=r[1],i=r[2],o=n*t[0]+a*t[1]+i*t[2],s=e.getBounds(),l=this._getEdges(s),u=[];for(let e of l){let[[t,r,l],[d,c,h]]=e;if(n*(d-t)+a*(c-r)+i*(h-l)==0)continue;let p=function(e,t,r){let[n,a,i]=e,[o,s,l]=t,[u,d,c,h]=r,p=o-n,m=s-a,f=l-i,g=-1*(u*n+d*a+c*i-h)/(u*p+d*m+c*f);return[p*g+n,m*g+a,f*g+i]}([t,r,l],[d,c,h],[n,a,i,o]);this._isInBounds(p,s)&&u.push(p)}return u}setInterpolationType(e,t){}setDisplayArea(e,t=!1){if(!e)return;let{storeAsInitialCamera:r,type:n}=e;r&&(this.options.displayArea=e);let{_suppressCameraModifiedEvents:a}=this;if(this._suppressCameraModifiedEvents=!0,this.setCamera(this.fitToCanvasCamera),"SCALE"===n?this.setDisplayAreaScale(e):(this.setInterpolationType(this.getProperties()?.interpolationType??NK.LINEAR),this.setDisplayAreaFit(e)),r&&(this.initialCamera=this.getCamera()),this._suppressCameraModifiedEvents=a,!t&&!a){let t={viewportId:this.id,displayArea:e,storeAsInitialCamera:r};Bh(this.element,NH.DISPLAY_AREA_MODIFIED,t),this.setCamera(this.getCamera())}}setDisplayAreaScale(e){let{scale:t=1}=e,r=this.canvas,n=r.height,a=r.width;if(n<8||a<8)return;let i=this.getDefaultImageData().getSpacing()[1];this.setInterpolationType(NK.NEAREST),this.setCamera({parallelScale:n*i/(2*t)}),delete e.imageArea,this.setDisplayAreaFit(e);let{focalPoint:o,position:s,viewUp:l,viewPlaneNormal:u}=this.getCamera(),d=Lv.vec3.create();if(r.height%2&&Lv.vec3.scaleAndAdd(d,d,l,.5*t*i),r.width%2){let e=Lv.vec3.cross(Lv.vec3.create(),l,u);Lv.vec3.scaleAndAdd(d,d,e,.5*t*i)}(d[0]||d[1]||d[2])&&this.setCamera({focalPoint:Lv.vec3.add(Lv.vec3.create(),o,d),position:Lv.vec3.add(Lv.vec3.create(),s,d)})}setDisplayAreaFit(e){let{imageArea:t,imageCanvasPoint:r}=e,n=window?.devicePixelRatio||1,a=this.getDefaultImageData();if(!a)return;let i=this.sWidth/n,o=this.sHeight/n,s=a.getDimensions(),l=this.worldToCanvas(a.indexToWorld([0,0,0])),u=this.worldToCanvas(a.indexToWorld([s[0],s[1],s[2]])),[d,c]=[Math.abs(u[0]-l[0]),Math.abs(u[1]-l[1])],h=this.getZoom()/this.insetImageMultiplier;if(t){let[e,r]=t,n=Math.max(Math.abs(d/i),Math.abs(c/o)),a=Math.abs(e*d/i),s=Math.abs(r*c/o);h=(a>s?n/a:n/s)*this.getZoom()/this.getZoom(this.fitToCanvasCamera),this.setZoom(this.insetImageMultiplier*h,!1)}if(r){let{imagePoint:e,canvasPoint:t=e||[.5,.5]}=r,[n,a]=t,[s,l]=e||t,u=h,p=[this.insetImageMultiplier*u*d*(.5-s)+i*(n-.5),this.insetImageMultiplier*u*c*(.5-l)+o*(a-.5)];Lv.vec2.add(p,p,this.getPan()),this.setPan(p,!1)}}getDisplayArea(){return this.options?.displayArea}resetCamera(e){let t,{resetPan:r=!0,resetZoom:n=!0,resetToCenter:a=!0,storeAsInitialCamera:i=!0,resetAspectRatio:o=!0}=e||{},s=this.getRenderer();this.setCameraNoEvent({flipHorizontal:!1,flipVertical:!1});let l=this.getCamera(),u=this.getDefaultActor();t=u&&H2(u)?u.actor.getMapper().getInputData().getBounds():s.computeVisiblePropBounds();let d=[0,0,0],c=this.getDefaultImageData(),h=this.getVtkActiveCamera(),p=h.getViewPlaneNormal(),m=h.getViewUp();if(d[0]=(t[0]+t[1])/2,d[1]=(t[2]+t[3])/2,d[2]=(t[4]+t[5])/2,c){let e=GL(c.getDimensions(),c.getDirection(),p),t=[e[0],e[1],e[2]];c.indexToWorld(t,d)}let{widthWorld:f,heightWorld:g}=c?GA(c,p,m):this._getWorldDistanceViewUpAndViewRight(t,m,p),y=[this.sWidth,this.sHeight],v=f/g/(y[0]/y[1]),b=v<1?this.insetImageMultiplier*g/2:this.insetImageMultiplier*g*v/2,w=GR.boundsRadius(t)*(this.type===Nq.VOLUME_3D?10:1),x=this.insetImageMultiplier*w,C=Math.abs(WF.dot(m,p))>.999?[-m[2],m[0],m[1]]:m,k=this._getFocalPointForResetCamera(d,l,{resetPan:r,resetToCenter:a}),M=[k[0]+x*p[0],k[1]+x*p[1],k[2]+x*p[2]];s.resetCameraClippingRange(t);let S=[-FI.MAXIMUM_RAY_DISTANCE,FI.MAXIMUM_RAY_DISTANCE];h.setPhysicalScale(w),h.setPhysicalTranslation(-k[0],-k[1],-k[2]);let E=o?this.options?.aspectRatio||[1,1]:this.getAspectRatio();this.setCamera({parallelScale:n?b:l.parallelScale,focalPoint:k,position:M,viewAngle:90,viewUp:C,clippingRange:S,aspectRatio:E,isFitViewportAfterStretch:!1});let T=this.getCamera();return this.setFitToCanvasCamera(this.getCamera()),i&&this.setInitialCamera(T),n&&this.setZoom(1,i),s.invokeEvent({type:"ResetCameraEvent",renderer:s}),this.triggerCameraModifiedEventIfNecessary(l,T),c&&this.options.displayArea&&n&&r&&a&&this.setDisplayArea(this.options.displayArea),!0}setInitialCamera(e){this.initialCamera=e}setFitToCanvasCamera(e){this.fitToCanvasCamera=e}getPan(e=this.initialCamera){if(!e)return[0,0];let t=this.getVtkActiveCamera().getFocalPoint(),r=this.canvasToWorld([0,0]),n=this.worldToCanvas(Lv.vec3.subtract([0,0,0],e.focalPoint,r)),a=this.worldToCanvas(Lv.vec3.subtract([0,0,0],t,r));return Lv.vec2.subtract([0,0],n,a)}getCurrentImageIdIndex(){throw Error("Not implemented")}getSliceIndex(){throw Error("Not implemented")}getImageData(){throw Error("Not implemented")}getViewReferenceId(e){return null}setPan(e,t=!1){let r=this.getCamera(),{focalPoint:n,position:a}=r,i=this.canvasToWorld([0,0]),o=Lv.vec2.subtract([0,0],e,this.getPan());if(1>Math.abs(o[0])&&1>Math.abs(o[1])&&!t)return;let s=Lv.vec3.subtract(Lv.vec3.create(),this.canvasToWorld(o),i),l=Lv.vec3.subtract(Lv.vec3.create(),n,s),u=Lv.vec3.subtract(Lv.vec3.create(),a,s);this.setCamera({...r,focalPoint:l,position:u},t)}getZoom(e=this.initialCamera){if(!e)return 1;let t=this.getVtkActiveCamera(),{parallelScale:r}=e;return r/t.getParallelScale()}setZoom(e,t=!1){let r=this.getCamera(),{parallelScale:n}=this.initialCamera,a=n/e;(r.parallelScale!==a||t)&&this.setCamera({...r,parallelScale:a},t)}getAspectRatio(){let{aspectRatio:e}=this.getCamera();return e??this.options?.aspectRatio??[1,1]}setAspectRatio(e,t=!0,r=!1){let n=this.getCamera();r&&(this.options.aspectRatio=e),this.setCamera({...n,aspectRatio:e,isFitViewportAfterStretch:t},r)}_getFocalPointForViewPlaneReset(e){let{focalPoint:t,viewPlaneNormal:r}=this.getCamera(),n=this._getViewImageDataIntersections(e,t,r),a=0,i=0,o=0;return n.forEach(([e,t,r])=>{a+=e,i+=t,o+=r}),[a/n.length,i/n.length,o/n.length]}getCanvas(){return this.canvas}getVtkActiveCamera(){let e=this.getRenderer();return e?e.getActiveCamera():(console.warn("No renderer found for the viewport"),null)}getCameraNoRotation(){let e=this.getVtkActiveCamera(),t=(e,t)=>e.some(e=>isNaN(e))?t:e,r=t([...e.getViewUp()],[0,1,0]),n=t([...e.getViewPlaneNormal()],[0,0,-1]);return{viewUp:r,viewPlaneNormal:n,position:t([...e.getPosition()],[0,0,1]),focalPoint:t([...e.getFocalPoint()],[0,0,0]),parallelProjection:e.getParallelProjection(),parallelScale:e.getParallelScale(),viewAngle:e.getViewAngle(),flipHorizontal:this.flipHorizontal,flipVertical:this.flipVertical,aspectRatio:e.getAspectRatio()}}getCamera(){return{...this.getCameraNoRotation(),rotation:this.getRotation()}}setAspectRatioForVTKCamera(e,t=!0){let r=this.getVtkActiveCamera();if(!t)return void r.setAspectRatio(e);let n=r.getAspectRatio()||[1,1];if(n[0]===e[0]&&n[1]===e[1])return;let a=(([e,t])=>e/t)(n),i=(([e,t])=>e/t)(e);r.setAspectRatio(e);let o=this.getDefaultImageData();if(!o)return;let s=e=>{let{widthWorld:t,heightWorld:n}=GA(o,r.getViewPlaneNormal(),r.getViewUp()),a=this.sWidth/this.sHeight,i=t*e,s=i/n>a?i/(2*a):n/2;return e<1&&(s/=e),s},l=s(i)/s(a);r.setParallelScale(r.getParallelScale()*l),this.initialCamera?.parallelScale&&(this.initialCamera={...this.initialCamera,parallelScale:this.initialCamera.parallelScale*l}),this.fitToCanvasCamera?.parallelScale&&(this.fitToCanvasCamera={...this.fitToCanvasCamera,parallelScale:this.fitToCanvasCamera.parallelScale*l})}setCamera(e,t=!1){let r=this.getVtkActiveCamera(),n=this.getCamera(),a=Object.assign({},n,e),{viewUp:i,viewPlaneNormal:o,position:s,focalPoint:l,parallelScale:u,viewAngle:d,flipHorizontal:c,flipVertical:h,clippingRange:p,aspectRatio:m,isFitViewportAfterStretch:f}=e;if(void 0!==c){let e=c&&!this.flipHorizontal||!c&&this.flipHorizontal;e&&this.flip({flipHorizontal:e})}if(void 0!==h){let e=h&&!this.flipVertical||!h&&this.flipVertical;e&&this.flip({flipVertical:e})}void 0!==i&&r.setViewUp(i),void 0!==o&&r.setDirectionOfProjection(-o[0],-o[1],-o[2]),void 0!==s&&r.setPosition(...s),void 0!==l&&r.setFocalPoint(...l),void 0!==u&&r.setParallelScale(u),void 0!==d&&r.setViewAngle(d),void 0!==p&&r.setClippingRange(p),m&&this.setAspectRatioForVTKCamera(m,f);let g=n.focalPoint,y=n.viewUp;if(g&&l||y&&i){let e=r.getViewPlaneNormal(),t=r.getViewUp(),n=!1,o=!1;if(l){let t=[l[0]-g[0],l[1]-g[1],l[2]-g[2]];n=Math.abs(WF.dot(t,e))>0}if(i&&(o=!Vw(t,y)),n||o){let e=this.getDefaultActor();if(!e?.actor)return;H5(e,"vtkActor")||this.updateClippingPlanesForActors(a),(H5(e,"vtkImageSlice")||this.type===Nq.VOLUME_3D)&&this.getRenderer().resetCameraClippingRange()}}t&&this.setInitialCamera(a),this.triggerCameraModifiedEventIfNecessary(n,this.getCamera())}triggerCameraModifiedEventIfNecessary(e,t){if(!this._suppressCameraModifiedEvents&&!this.suppressEvents){let r={previousCamera:e,camera:t,element:this.element,viewportId:this.id,renderingEngineId:this.renderingEngineId};Bh(this.element,NH.CAMERA_MODIFIED,r)}}updateCameraClippingPlanesAndRange(){let e=this.getCamera();this.updateClippingPlanesForActors(e),this.getRenderer().resetCameraClippingRange()}async updateClippingPlanesForActors(e){this.getActors().map(t=>{if(!t.actor)return;let r=t.actor.getMapper(),n=t?.clippingFilter?t?.clippingFilter.getClippingPlanes():r.getClippingPlanes();0===n.length&&t?.clippingFilter&&(n=[WX.newInstance(),WX.newInstance()]);let a=FI.MINIMUM_SLAB_THICKNESS;t.slabThickness&&(a=t.slabThickness);let{viewPlaneNormal:i,focalPoint:o}=e;this.setOrientationOfClippingPlanes(n,a,i,o),Bh(this.element,NH.CLIPPING_PLANES_UPDATED,{actorEntry:t,focalPoint:o,vtkPlanes:n,viewport:this})})}setOrientationOfClippingPlanes(e,t,r,n){if(e.length<2)return;let a=[r[0],r[1],r[2]];WF.multiplyScalar(a,t),e[0].setNormal(r);let i=[0,0,0];WF.subtract(n,a,i),e[0].setOrigin(i),e[1].setNormal(-r[0],-r[1],-r[2]);let o=[0,0,0];WF.add(n,a,o),e[1].setOrigin(o)}getClippingPlanesForActor(e){if(e||(e=this.getDefaultActor()),!e.actor)throw Error("Invalid actor entry: Actor is undefined");let t=e.actor.getMapper(),r=e?.clippingFilter?e?.clippingFilter.getClippingPlanes():t.getClippingPlanes();return 0===r.length&&e?.clippingFilter&&(r=[WX.newInstance(),WX.newInstance()]),r}_getWorldDistanceViewUpAndViewRight(e,t,r){let n=this._getCorners(e),a=this._getCorners(e),i=Lv.vec3.cross(Lv.vec3.create(),t,r),o=GT().identity().rotateFromDirections(t,[1,0,0]);n.forEach(e=>o.apply(e));let s=1/0,l=-1/0;for(let e=0;e<8;e++){let t=n[e][0];t>l&&(l=t),t<s&&(s=t)}o=GT().identity().rotateFromDirections([i[0],i[1],i[2]],[1,0,0]),a.forEach(e=>o.apply(e));let u=1/0,d=-1/0;for(let e=0;e<8;e++){let t=a[e][0];t>d&&(d=t),t<u&&(u=t)}return{widthWorld:d-u,heightWorld:l-s}}getViewReference(e){let{focalPoint:t,viewPlaneNormal:r,viewUp:n}=this.getCamera(),a=this.getFrameOfReferenceUID(),i={FrameOfReferenceUID:a,cameraFocalPoint:t,viewPlaneNormal:r,viewUp:n,sliceIndex:e?.sliceIndex??this.getSliceIndex(),planeRestriction:{FrameOfReferenceUID:a,point:e?.points?.[0]||t,inPlaneVector1:n,inPlaneVector2:Lv.vec3.cross(Lv.vec3.create(),n,r)}};return e?.points&&GD(e.points,i.planeRestriction),i}isPlaneViewable(e,t){if(e.FrameOfReferenceUID!==this.getFrameOfReferenceUID())return!1;let{focalPoint:r,viewPlaneNormal:n}=this.getCamera(),{point:a,inPlaneVector1:i,inPlaneVector2:o}=e;if(t?.withOrientation)return!0;if(i&&!Vw(0,Lv.vec3.dot(n,i))||o&&!Vw(0,Lv.vec3.dot(n,o)))return!1;if(t?.withNavigation)return!0;let s=Lv.vec3.sub(Lv.vec3.create(),a,r);return Vw(0,Lv.vec3.dot(s,n))}isReferenceViewable(e,t){if(e.planeRestriction)return this.isPlaneViewable(e.planeRestriction,t);if(e.FrameOfReferenceUID&&e.FrameOfReferenceUID!==this.getFrameOfReferenceUID())return!1;let{viewPlaneNormal:r}=e,n=this.getCamera();return!r||!!Vw(r,n.viewPlaneNormal)||!!Vw(Lv.vec3.negate(n.viewPlaneNormal,n.viewPlaneNormal),r)||t?.withOrientation}getViewPresentation(e={rotation:!0,displayArea:!0,zoom:!0,pan:!0,aspectRatio:!0,flipHorizontal:!0,flipVertical:!0}){let t={},{rotation:r,displayArea:n,zoom:a,pan:i,flipHorizontal:o,flipVertical:s}=e;r&&(t.rotation=this.getRotation()),n&&(t.displayArea=this.getDisplayArea());let l=this.getZoom();a&&(t.zoom=l);let u=this.getAspectRatio();if(t.aspectRatio=u,i){let e=this.getPan(),[r,n]=u;t.pan=[e[0]/(l*r),e[1]/(l*n)]}return o&&(t.flipHorizontal=this.flipHorizontal),s&&(t.flipVertical=this.flipVertical),t}setViewReference(e){}setViewPresentation(e){if(!e)return;let{displayArea:t,zoom:r=this.getZoom(),pan:n,aspectRatio:a=this.getAspectRatio(),rotation:i,flipHorizontal:o=this.flipHorizontal,flipVertical:s=this.flipVertical}=e;if(t!==this.getDisplayArea()&&this.setDisplayArea(t),this.setZoom(r),this.setAspectRatio(a),n){let[e,t]=a;this.setPan([n[0]*r*e,n[1]*r*t])}void 0!==o&&o!==this.flipHorizontal&&this.flip({flipHorizontal:o}),void 0!==s&&s!==this.flipVertical&&this.flip({flipVertical:s}),i>=0&&this.setRotation(i)}_getCorners(e){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]]]}_getFocalPointForResetCamera(e,t,{resetPan:r=!0,resetToCenter:n=!0}){if(n&&r)return e;if(n&&!r)return GP(t.focalPoint)?e:t.focalPoint;if(!n&&r){let r=t.focalPoint,n=t.viewPlaneNormal,a=Lv.vec3.subtract(Lv.vec3.create(),e,r),i=Lv.vec3.dot(a,n),o=Lv.vec3.scaleAndAdd(Lv.vec3.create(),e,n,-1*i);return[o[0],o[1],o[2]]}if(!r&&!n)return GP(t.focalPoint)?e:t.focalPoint}_isInBounds(e,t){let[r,n,a,i,o,s]=t,[l,u,d]=e;return!(l<r)&&!(l>n)&&!(u<a)&&!(u>i)&&!(d<o)&&!(d>s)}_getEdges(e){let[t,r,n,a,i,o,s,l]=this._getCorners(e);return[[t,r],[t,i],[t,n],[r,a],[r,o],[n,a],[n,s],[a,l],[i,s],[i,o],[o,l],[s,l]]}static boundsRadius(e){return .5*Math.sqrt((e[1]-e[0])**2+(e[3]-e[2])**2+(e[5]-e[4])**2||1)}setDataList(e){throw Error("Unsupported operation setDataList")}setDisplaySets(...e){this._displaySets=e}async mountDisplaySets(e,t){let[r]=e;if(!r?.displaySetId)throw Error(`${this.constructor.name}: setDisplaySets requires a displaySetId`);await t(r),this._displaySets=[r]}getDisplaySets(){return this._displaySets}clearDisplaySets(){this._displaySets=[]}}function GL(e,t,r){let n=[[t[0],t[1],t[2]],[t[3],t[4],t[5]],[t[6],t[7],t[8]]],a=[r[0],r[1],r[2]],i=0,o=-1;for(let e=0;e<3;e++){let t=Math.abs(Lv.vec3.dot(n[e],a));t>o&&(o=t,i=e)}let s=.001>Math.abs(o-1);return e.map((e,t)=>t===i&&s?Math.floor(e/2):(e-1)/2)}GR.CameraViewPresentation={rotation:!0,pan:!0,zoom:!0,aspectRatio:!0,displayArea:!0},GR.TransferViewPresentation={windowLevel:!0,paletteLut:!0};let GN=GR;function GV(){return window.performance?performance.now():Date.now()}function GF(e,t,r){if(r){let e,t,n,a;return e=Math.max(...r.lut).toString(2).length-8,t=r.lut[0]>>e,n=r.lut[r.lut.length-1]>>e,a=r.firstValueMapped+r.lut.length-1,function(i){return i<r.firstValueMapped?t:i>=a?n:r.lut[i-r.firstValueMapped]>>e}}return function(r){return Math.min(Math.max(((r-(t-.5))/(e-1)+.5)*255,0),255)}}class GB{constructor(){this.reset()}getMatrix(){return this.m}reset(){this.m=[1,0,0,1,0,0]}clone(){let e=new GB;return e.m[0]=this.m[0],e.m[1]=this.m[1],e.m[2]=this.m[2],e.m[3]=this.m[3],e.m[4]=this.m[4],e.m[5]=this.m[5],e}multiply(e){let t=this.m[0]*e[0]+this.m[2]*e[1],r=this.m[1]*e[0]+this.m[3]*e[1],n=this.m[0]*e[2]+this.m[2]*e[3],a=this.m[1]*e[2]+this.m[3]*e[3],i=this.m[0]*e[4]+this.m[2]*e[5]+this.m[4],o=this.m[1]*e[4]+this.m[3]*e[5]+this.m[5];this.m[0]=t,this.m[1]=r,this.m[2]=n,this.m[3]=a,this.m[4]=i,this.m[5]=o}invert(){let e=1/(this.m[0]*this.m[3]-this.m[1]*this.m[2]),t=this.m[3]*e,r=-this.m[1]*e,n=-this.m[2]*e,a=this.m[0]*e,i=e*(this.m[2]*this.m[5]-this.m[3]*this.m[4]),o=e*(this.m[1]*this.m[4]-this.m[0]*this.m[5]);this.m[0]=t,this.m[1]=r,this.m[2]=n,this.m[3]=a,this.m[4]=i,this.m[5]=o}rotate(e){let t=Math.cos(e),r=Math.sin(e),n=this.m[0]*t+this.m[2]*r,a=this.m[1]*t+this.m[3]*r,i=-(this.m[0]*r)+this.m[2]*t,o=-(this.m[1]*r)+this.m[3]*t;this.m[0]=n,this.m[1]=a,this.m[2]=i,this.m[3]=o}translate(e,t){this.m[4]+=this.m[0]*e+this.m[2]*t,this.m[5]+=this.m[1]*e+this.m[3]*t}scale(e,t){this.m[0]*=e,this.m[1]*=e,this.m[2]*=t,this.m[3]*=t}transformPoint(e){let t=e[0],r=e[1];return[t*this.m[0]+r*this.m[2]+this.m[4],t*this.m[1]+r*this.m[3]+this.m[5]]}}function Gj(e,t){let r=new GB,n=e.viewport.aspectRatio;if(!e.viewport.displayedArea)return r;r.translate(e.canvas.width/2,e.canvas.height/2);let a=e.viewport.rotation;0!==a&&r.rotate(a*Math.PI/180);let[i,o,s]=function(e){if(Array.isArray(e))return[e[0]??1,e[1]??1,!0];let t=e??1;return[t,t,!1]}(e.viewport.scale),l=i,u=o,d=e.viewport.displayedArea.brhc.x-(e.viewport.displayedArea.tlhc.x-1),c=e.viewport.displayedArea.brhc.y-(e.viewport.displayedArea.tlhc.y-1);if(s);else if("NONE"===e.viewport.displayedArea.presentationSizeMode)e.image.rowPixelSpacing<e.image.columnPixelSpacing?l*=e.image.columnPixelSpacing/e.image.rowPixelSpacing:e.image.columnPixelSpacing<e.image.rowPixelSpacing&&(u*=e.image.rowPixelSpacing/e.image.columnPixelSpacing);else if(l=e.viewport.displayedArea.columnPixelSpacing,u=e.viewport.displayedArea.rowPixelSpacing,"SCALE TO FIT"===e.viewport.displayedArea.presentationSizeMode){let t=e.canvas.height/(c*u);l=u=Math.min(e.canvas.width/(d*l),t),e.viewport.displayedArea.rowPixelSpacing<e.viewport.displayedArea.columnPixelSpacing?l*=e.viewport.displayedArea.columnPixelSpacing/e.viewport.displayedArea.rowPixelSpacing:e.viewport.displayedArea.columnPixelSpacing<e.viewport.displayedArea.rowPixelSpacing&&(u*=e.viewport.displayedArea.rowPixelSpacing/e.viewport.displayedArea.columnPixelSpacing)}if(r.scale(l,u),0!==a&&r.rotate(-a*Math.PI/180),r.translate(e.viewport.translation.x,e.viewport.translation.y),0!==a&&r.rotate(a*Math.PI/180),void 0!==t&&void 0===n&&r.scale(t,t),void 0!==n&&void 0===t){let[e,t]=n;r.scale(e,t)}return e.viewport.hflip&&r.scale(-1,1),e.viewport.vflip&&r.scale(1,-1),r.translate(-d/2,-c/2),r}function GW(e,t,r){if(void 0===e)throw Error("setToPixelCoordinateSystem: parameter enabledElement must not be undefined");if(void 0===t)throw Error("setToPixelCoordinateSystem: parameter context must not be undefined");let n=Gj(e,r).getMatrix();t.setTransform(n[0],n[1],n[2],n[3],n[4],n[5])}function GU(e,t){let r=e.renderingTools.lastRenderedImageId,n=e.renderingTools.lastRenderedViewport;return t.imageId!==r||!n||n.windowCenter!==e.viewport.voi.windowCenter||n.windowWidth!==e.viewport.voi.windowWidth||n.invert!==e.viewport.invert||n.rotation!==e.viewport.rotation||n.hflip!==e.viewport.hflip||n.vflip!==e.viewport.vflip||n.modalityLUT!==e.viewport.modalityLUT||n.voiLUT!==e.viewport.voiLUT||n.colormap!==e.viewport.colormap}function Gz(e,t){let r=e.renderingTools.renderCanvas;r.width=t.width,r.height=t.height;let n=r.getContext("2d");n.fillStyle="white",n.fillRect(0,0,r.width,r.height);let a=n.getImageData(0,0,t.width,t.height);e.renderingTools.renderCanvasContext=n,e.renderingTools.renderCanvasData=a}function GH(e){let t=e.image.imageId,r=e.viewport,n=e.image.color;return e.renderingTools.lastRenderedImageId=t,e.renderingTools.lastRenderedIsColor=n,e.renderingTools.lastRenderedViewport={windowCenter:r.voi.windowCenter,windowWidth:r.voi.windowWidth,invert:r.invert,rotation:r.rotation,hflip:r.hflip,vflip:r.vflip,modalityLUT:r.modalityLUT,voiLUT:r.voiLUT,colormap:r.colormap},e.renderingTools}let GG="viewport-element",Gq="cornerstone-canvas";function G$(e,t=512,r=512){let n=v?v(t,r):document.createElement("canvas");return e&&(n.style.position="absolute",n.style.width="100%",n.style.height="100%",n.style.imageRendering="pixelated",n.classList.add(Gq),e.appendChild(n)),n}function GK(e){let t,r=`canvas.${Gq}`,n=`div.${GG}`,a=e.querySelector(n)||((t=document.createElement("div")).style.position="relative",t.style.width="100%",t.style.height="100%",t.style.overflow="hidden",t.classList.add(GG),e.appendChild(t),t),i=a.querySelector(r);if(i)return i;let o=G$(a),s=a.getBoundingClientRect(),l=window.devicePixelRatio||1,u=Math.ceil(s.width*l),d=Math.ceil(s.height*l);return u>0&&d>0&&(o.width=u,o.height=d,o.style.aspectRatio=`${u} / ${d}`),o}function GY(e,t){if(void 0===e)throw Error("renderColorImage: enabledElement parameter must not be undefined");let r=e.image;if(void 0===r)throw Error("renderColorImage: image must be loaded before it can be drawn");let n=e.canvas.getContext("2d");n.setTransform(1,0,0,1,0,0),n.fillStyle="black",n.fillRect(0,0,e.canvas.width,e.canvas.height),n.imageSmoothingEnabled=!e.viewport.pixelReplication,GW(e,n);let a=function(e,t,r){var n;let a=e.renderingTools.lastRenderedIsColor;e.renderingTools.renderCanvas&&a||(e.renderingTools.renderCanvas=G$(null,t.width,t.height));let i=e.renderingTools.renderCanvas,{windowWidth:o,windowCenter:s}=e.viewport.voi;if((256===o||255===o)&&(128===s||127===s)&&!e.viewport.invert&&t.getCanvas&&t.getCanvas())return t.getCanvas();if(!GU(e,t)&&!r)return i;e.renderingTools.renderCanvasContext&&i.width===t.width&&i.height===t.height||Gz(e,t);let l=GV(),u=(n=e.viewport,void 0!==t.cachedLut&&t.cachedLut.windowCenter===n.voi.windowCenter&&t.cachedLut.windowWidth===n.voi.windowWidth&&t.cachedLut.invert===n.invert||(!function(e,t,r,n){let a=e.maxPixelValue,i=e.minPixelValue,o=Math.min(i,0);void 0===e.cachedLut&&(e.cachedLut={},e.cachedLut.lutArray=new Uint8ClampedArray(a-o+1));let s=e.cachedLut.lutArray,l=GF(Array.isArray(t)?t[0]:t,Array.isArray(r)?r[0]:r,void 0);if(n)for(let e=i;e<=a;e++)s[e+-o]=255-l(e);else for(let e=i;e<=a;e++)s[e+-o]=l(e)}(t,n.voi.windowWidth,n.voi.windowCenter,n.invert),t.cachedLut.windowWidth=n.voi.windowWidth,t.cachedLut.windowCenter=n.voi.windowCenter,t.cachedLut.invert=n.invert),t.cachedLut.lutArray);t.stats=t.stats||{},t.stats.lastLutGenerateTime=GV()-l;let d=e.renderingTools.renderCanvasData,c=e.renderingTools.renderCanvasContext;return t.rgba?!function(e,t,r){let n=GV(),a=e.getPixelData();e.stats.lastGetPixelDataTime=GV()-n;let i=e.minPixelValue,o=0,s=0,l=a.length;if(n=GV(),i<0)for(;s<l;)r[o++]=t[a[s++]+-i],r[o++]=t[a[s++]+-i],r[o++]=t[a[s++]+-i],r[o++]=a[s++];else for(;s<l;)r[o++]=t[a[s++]],r[o++]=t[a[s++]],r[o++]=t[a[s++]],r[o++]=a[s++];e.stats.lastStoredPixelDataToCanvasImageDataTime=GV()-n}(t,u,d.data):!function(e,t,r){let n=GV(),a=e.voxelManager.getScalarData();e.stats.lastGetPixelDataTime=GV()-n;let i=e.minPixelValue,o=0,s=0,l=a.length;if(n=GV(),i<0)for(;s<l;)r[o++]=t[a[s++]+-i],r[o++]=t[a[s++]+-i],r[o++]=t[a[s++]+-i],r[o++]=255;else for(;s<l;)r[o++]=t[a[s++]],r[o++]=t[a[s++]],r[o++]=t[a[s++]],r[o++]=255;e.stats.lastStoredPixelDataToCanvasImageDataTime=GV()-n}(t,u,d.data),l=GV(),c.putImageData(d,0,0),t.stats.lastPutImageDataTime=GV()-l,i}(e,r,t),i=e.viewport.displayedArea.tlhc.x-1,o=e.viewport.displayedArea.tlhc.y-1,s=e.viewport.displayedArea.brhc.x-i,l=e.viewport.displayedArea.brhc.y-o;n.drawImage(a,i,o,s,l,0,0,s,l),e.renderingTools=GH(e)}function GZ(e,t){return!e&&!t||!!e&&!!t&&e.id===t.id}function GX(e,t,r){return void 0!==e.cachedLut&&e.cachedLut.windowCenter===t.voi.windowCenter&&e.cachedLut.windowWidth===t.voi.windowWidth&&GZ(e.cachedLut.modalityLUT,t.modalityLUT)&&GZ(e.cachedLut.voiLUT,t.voiLUT)&&e.cachedLut.invert===t.invert&&!r||(!function(e,t){var r;if((r=e).voiLUT&&r.voiLUT.lut&&r.voiLUT.lut.length>0||void 0!==r.voi.windowWidth&&void 0!==r.voi.windowCenter)return;let n=t.maxPixelValue*t.slope+t.intercept,a=t.minPixelValue*t.slope+t.intercept,i=n-a,o=(n+a)/2;void 0===e.voi?e.voi={windowWidth:i,windowCenter:o,voiLUTFunction:t.voiLUTFunction}:(e.voi.windowWidth=i,e.voi.windowCenter=o)}(t,e),!function(e,t,r,n,a,i){let o=e.maxPixelValue,s=e.minPixelValue,l=Math.min(s,0);void 0===e.cachedLut&&(e.cachedLut={},e.cachedLut.lutArray=new Uint8ClampedArray(o-l+1));let u=e.cachedLut.lutArray,d=function(e,t,r){if(r){let e,t,n;return e=r.lut[0],t=r.lut[r.lut.length-1],n=r.firstValueMapped+r.lut.length,a=>a<r.firstValueMapped?e:a>=n?t:r.lut[a]}return r=>r*e+t}(e.slope,e.intercept,a),c=GF(t,r,i);if(e.isPreScaled)if(n)for(let e=s;e<=o;e++)u[e+-l]=255-c(e);else for(let e=s;e<=o;e++)u[e+-l]=c(e);else if(n)for(let e=s;e<=o;e++)u[e+-l]=255-c(d(e));else for(let e=s;e<=o;e++)u[e+-l]=c(d(e))}(e,t.voi.windowWidth,t.voi.windowCenter,t.invert,t.modalityLUT,t.voiLUT),e.cachedLut.windowWidth=t.voi.windowWidth,e.cachedLut.windowCenter=t.voi.windowCenter,e.cachedLut.invert=t.invert,e.cachedLut.voiLUT=t.voiLUT,e.cachedLut.modalityLUT=t.modalityLUT),e.cachedLut.lutArray}function GJ(e,t){if(void 0===e)throw Error("drawImage: enabledElement parameter must not be undefined");let r=e.image;if(void 0===r)throw Error("drawImage: image must be loaded before it can be drawn");let n=e.canvas.getContext("2d");n.setTransform(1,0,0,1,0,0),n.fillStyle="black",n.fillRect(0,0,e.canvas.width,e.canvas.height),n.imageSmoothingEnabled=!e.viewport.pixelReplication,GW(e,n);let a=function(e,t,r,n=!0){let a=e.renderingTools.lastRenderedIsColor;(!e.renderingTools.renderCanvas||a)&&(e.renderingTools.renderCanvas=G$(null,t.width,t.height),Gz(e,t));let i=e.renderingTools.renderCanvas;if(!GU(e,t)&&!r)return i;(i.width!==t.width||i.height!==t.height)&&Gz(e,t),t.stats=t.stats||{};let o=e.renderingTools.renderCanvasData,s=e.renderingTools.renderCanvasContext,l=GV();t.stats.lastLutGenerateTime=GV()-l;let{viewport:u}=e;if("PT"===u.modality&&t.isPreScaled){let{windowWidth:e,windowCenter:r}=u.voi,n=r-e/2,a=255/(r+e/2-n);!function(e,t,r){let n=GV(),a=e.voxelManager.getScalarData();e.stats.lastGetPixelDataTime=GV()-n;let i=a.length,o=3,s=0;for(n=GV();s<i;)r[o]=t(a[s++]),o+=4;e.stats.lastStoredPixelDataToCanvasImageDataTime=GV()-n}(t,u.invert?e=>255-(e-n)*a:e=>(e-n)*a,o.data)}else{let e=GX(t,u,r);n?function(e,t,r){let n=GV(),a=e.voxelManager.getScalarData();e.stats.lastGetPixelDataTime=GV()-n;let i=a.length,o=e.minPixelValue,s=3,l=0;if(n=GV(),a instanceof Int16Array)if(o<0)for(;l<i;)r[s]=t[a[l++]+-o],s+=4;else for(;l<i;)r[s]=t[a[l++]],s+=4;else if(a instanceof Uint16Array)for(;l<i;)r[s]=t[a[l++]],s+=4;else if(o<0)for(;l<i;)r[s]=t[a[l++]+-o],s+=4;else for(;l<i;)r[s]=t[a[l++]],s+=4;e.stats.lastStoredPixelDataToCanvasImageDataTime=GV()-n}(t,e,o.data):function(e,t,r){let n,a=GV(),i=e.voxelManager.getScalarData();e.stats.lastGetPixelDataTime=GV()-a;let o=i.length,s=e.minPixelValue,l=0,u=0;if(a=GV(),i instanceof Int16Array)if(s<0)for(;u<o;)n=t[i[u++]+-s],r[l++]=n,r[l++]=n,r[l++]=n,r[l++]=255;else for(;u<o;)n=t[i[u++]],r[l++]=n,r[l++]=n,r[l++]=n,r[l++]=255;else if(i instanceof Uint16Array)for(;u<o;)n=t[i[u++]],r[l++]=n,r[l++]=n,r[l++]=n,r[l++]=255;else if(s<0)for(;u<o;)n=t[i[u++]+-s],r[l++]=n,r[l++]=n,r[l++]=n,r[l++]=255;else for(;u<o;)n=t[i[u++]],r[l++]=n,r[l++]=n,r[l++]=n,r[l++]=255;e.stats.lastStoredPixelDataToCanvasImageDataTime=GV()-a}(t,e,o.data)}return l=GV(),s.putImageData(o,0,0),t.stats.lastPutImageDataTime=GV()-l,i}(e,r,t),i=e.viewport.displayedArea.tlhc.x-1,o=e.viewport.displayedArea.tlhc.y-1,s=e.viewport.displayedArea.brhc.x-i,l=e.viewport.displayedArea.brhc.y-o;n.drawImage(a,i,o,s,l,0,0,s,l),e.renderingTools=GH(e)}let GQ=class{constructor(){this.NumberOfColors=256,this.Ramp="linear",this.TableRange=[0,255],this.HueRange=[0,.66667],this.SaturationRange=[1,1],this.ValueRange=[1,1],this.AlphaRange=[1,1],this.NaNColor=[128,0,0,255],this.BelowRangeColor=[0,0,0,255],this.UseBelowRangeColor=!0,this.AboveRangeColor=[255,255,255,255],this.UseAboveRangeColor=!0,this.InputRange=[0,255],this.Table=[]}setNumberOfTableValues(e){this.NumberOfColors=e}setRamp(e){this.Ramp=e}setTableRange(e,t){this.TableRange[0]=e,this.TableRange[1]=t}setHueRange(e,t){this.HueRange[0]=e,this.HueRange[1]=t}setSaturationRange(e,t){this.SaturationRange[0]=e,this.SaturationRange[1]=t}setValueRange(e,t){this.ValueRange[0]=e,this.ValueRange[1]=t}setRange(e,t){this.InputRange[0]=e,this.InputRange[1]=t}setAlphaRange(e,t){this.AlphaRange[0]=e,this.AlphaRange[1]=t}getColor(e){return this.mapValue(e)}build(e){let t,r,n,a;if(this.Table.length>1&&!e)return;this.Table=[];let i=this.NumberOfColors-1;i?(t=(this.HueRange[1]-this.HueRange[0])/i,r=(this.SaturationRange[1]-this.SaturationRange[0])/i,n=(this.ValueRange[1]-this.ValueRange[0])/i,a=(this.AlphaRange[1]-this.AlphaRange[0])/i):t=r=n=a=0;for(let e=0;e<=i;e++){let i=this.HueRange[0]+e*t,o=this.SaturationRange[0]+e*r,s=this.ValueRange[0]+e*n,l=this.AlphaRange[0]+e*a,u=function(e,t,r){if(e>1)throw Error("HSVToRGB expects hue < 1");let n=[];if(0===t)return n[0]=r,n[1]=r,n[2]=r,n;let a=Math.floor(6*e),i=6*e-a,o=r*(1-t),s=r*(1-t*i),l=r*(1-t*(1-i));switch(a){case 0:case 6:n[0]=r,n[1]=l,n[2]=o;break;case 1:n[0]=s,n[1]=r,n[2]=o;break;case 2:n[0]=o,n[1]=r,n[2]=l;break;case 3:n[0]=o,n[1]=s,n[2]=r;break;case 4:n[0]=l,n[1]=o,n[2]=r;break;case 5:n[0]=r,n[1]=o,n[2]=s}return n}(i,o,s),d=[0,0,0,0];switch(this.Ramp){case"scurve":d[0]=Math.floor(127.5*(1+Math.cos((1-u[0])*Math.PI))),d[1]=Math.floor(127.5*(1+Math.cos((1-u[1])*Math.PI))),d[2]=Math.floor(127.5*(1+Math.cos((1-u[2])*Math.PI))),d[3]=Math.floor(255*l);break;case"linear":d[0]=Math.floor(255*u[0]+.5),d[1]=Math.floor(255*u[1]+.5),d[2]=Math.floor(255*u[2]+.5),d[3]=Math.floor(255*l+.5);break;case"sqrt":d[0]=Math.floor(255*Math.sqrt(u[0])+.5),d[1]=Math.floor(255*Math.sqrt(u[1])+.5),d[2]=Math.floor(255*Math.sqrt(u[2])+.5),d[3]=Math.floor(255*Math.sqrt(l)+.5);break;default:throw Error(`Invalid Ramp value (${this.Ramp})`)}this.Table.push(d)}this.buildSpecialColors()}buildSpecialColors(){let e=this.NumberOfColors,t=e+0,r=e+1;this.UseBelowRangeColor||0===e?this.Table[t]=this.BelowRangeColor:this.Table[t]=this.Table[0],this.UseAboveRangeColor||0===e?this.Table[r]=this.AboveRangeColor:this.Table[r]=this.Table[e-1],this.Table[e+2]=this.NaNColor}mapValue(e){let t=this.getIndex(e);if(t<0)return this.NaNColor;if(0===t){if(this.UseBelowRangeColor&&e<this.TableRange[0])return this.BelowRangeColor}else if(t===this.NumberOfColors-1&&this.UseAboveRangeColor&&e>this.TableRange[1])return this.AboveRangeColor;return this.Table[t]}getIndex(e){let t={Range:[],MaxIndex:this.NumberOfColors-1,Shift:-this.TableRange[0],Scale:1};if(this.TableRange[1]<=this.TableRange[0]?t.Scale=Number.MAX_VALUE:t.Scale=t.MaxIndex/(this.TableRange[1]-this.TableRange[0]),t.Range[0]=this.TableRange[0],t.Range[1]=this.TableRange[1],isNaN(e))return -1;let r=Math.floor(e<t.Range[0]?t.MaxIndex+0+1.5:e>t.Range[1]?t.MaxIndex+1+1.5:(e+t.Shift)*t.Scale);return r===this.NumberOfColors+0?r=0:r===this.NumberOfColors+1&&(r=this.NumberOfColors-1),r}setTableValue(e,t,r,n,a){let i;if("number"==typeof t&&void 0!==r&&void 0!==n&&void 0!==a)i=[t,r,n,a];else if(Array.isArray(t))i=t;else throw Error("Invalid arguments for setTableValue");if(e<0)throw Error(`Can't set the table value for negative index (${e})`);if(e>=this.NumberOfColors)throw Error(`Index ${e} is greater than the number of colors ${this.NumberOfColors}`);this.Table[e]=i,(0===e||e===this.NumberOfColors-1)&&this.buildSpecialColors()}},G0=[0,0,0,0],G1=new Set(["gray","grey","grayscale","greyscale"]);function G2(e,t,r){let n,a=[],i=[],o=[],s=[];for(n=0,r=null===r?1:r;n<t.length;n++){let r=t[n];a.push((e-1)*r[0]),i.push(r[1]),o.push(r[1])}let l=function(e,t){let r=(1-e)/((t=null===t?100:t)-1),n=[];for(;t-- >0;)n.push(e),e+=r;return n[n.length-1]=1,n}(0,e);for(n=0;n<e;n++)l[n]=(e-1)*Math.pow(l[n],r);let u=function(e,t){let r,n=[],a=t.length;for(e.sort(function(e,t){return e-t}),r=0;r<a;r++)n[r]=function(e,t){let r=0,n=e.length-1;for(;r<=n;){let a=r+Math.floor((n-r)/2),i=e[a];if(i===t)return a;t<i?n=a-1:r=a+1}return r}(e,t[r]);return n}(a,l);for(n=1;n<e-1;n++){let e=u[n],t=(l[n]-a[e-1])/(a[e]-a[e-1]),r=i[e]-o[e-1];s[n]=t*r+o[e-1]}return s[0]=o[0],s[e-1]=i[t.length-1],s}function G5(e,t,r){let n,a="string"==typeof e?e.trim():e?.name?.trim();if(!a)return t;let i=a.toLowerCase();if(G1.has(i))return;let o=Gi(a);if(o){var s,l;return G4((s=o,l=a,G3(`vtk:${(s.name||s.Name||l).trim().toLowerCase()}`,function(e,t){let r=z2.newInstance();r.applyColorMap(e);let[n,a]=r.getRange(),i=Array.from({length:256},(e,t)=>{let i=[];return r.getColor(n+t/256*(a-n),i),[Math.round(255*i[0]),Math.round(255*i[1]),Math.round(255*i[2]),255]});return{colors:i,name:e.Name||t,numColors:i.length}}(s,l))),"string"==typeof e?void 0:e,r?.voiRange)}let u=(n=a.trim().toLowerCase(),Object.keys(FE).find(e=>{let t=FE[e];return e.toLowerCase()===n||t.name?.trim().toLowerCase()===n}));return G4(u?G3(u):void 0,"string"==typeof e?void 0:e,r?.voiRange)}function G3(e,t){let r=FE[e];return r||(r=FE[e]=t||{name:"",colors:[]}),!r.colors&&r.segmentedData&&(r.colors=function(e,t,r){let n,a=[];r=null===r?1:r;let i=G2(t=null===t?256:t,e.red,r),o=G2(t,e.green,r),s=G2(t,e.blue,r);for(n=0;n<t;n++){let e=[Math.round(255*i[n]),Math.round(255*o[n]),Math.round(255*s[n]),255];a.push(e)}return a}(r.segmentedData,r.numColors,r.gamma)),{getId:()=>e,getColorSchemeName:()=>r.name,setColorSchemeName(e){r.name=e},getNumberOfColors:()=>r.colors.length,setNumberOfColors(e){for(;r.colors.length<e;)r.colors.push(G0);r.colors.length=e},getColor(e){return this.isValidIndex(e)?r.colors[e]:G0},getColorRepeating(e){let t=r.colors.length;return e=t?e%t:0,this.getColor(e)},setColor(e,t){this.isValidIndex(e)&&(r.colors[e]=t)},addColor(e){r.colors.push(e)},insertColor(e,t){this.isValidIndex(e)&&r.colors.splice(e,1,t)},removeColor(e){this.isValidIndex(e)&&r.colors.splice(e,1)},clearColors(){r.colors=[]},buildLookupTable(e){if(!e)return;let t=r.colors.length;e.setNumberOfTableValues(t);for(let n=0;n<t;n++)e.setTableValue(n,r.colors[n])},createLookupTable(){let e=new GQ;return this.buildLookupTable(e),e},isValidIndex:e=>e>=0&&e<r.colors.length}}function G4(e,t,r){var n,a,i,o;let s;if(!e)return;if(t?.opacity===void 0&&t?.threshold===void 0||!r||r.upper<=r.lower)return e;let l=(n=e,a=t,i=r,s=Math.max(n.getNumberOfColors(),1),Array.from({length:256},(e,t)=>{var r,o;let l=1===s?0:(r=t,Math.min((o=s)-1,Math.floor(r/256*o))),u=n.getColor(l),d=function(e,t,r){if(void 0!==r&&e<r)return 0;if(void 0===t)return 1;if("number"==typeof t)return G8(t);if(!t.length)return 1;if(e<=t[0].value)return G8(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 G8(n.opacity+(a.opacity-n.opacity)*r)}}return G8(t[t.length-1].opacity)}(i.lower+(i.upper-i.lower)*(t/256),a?.opacity,a?.threshold);return[u[0],u[1],u[2],Math.round(u[3]/255*d*255)]}));return G3([e.getId(),`lower:${G6(r.lower)}`,`upper:${G6(r.upper)}`,`opacity:${void 0===(o=t?.opacity)?"none":"number"==typeof o?String(G6(o)):o.map(({opacity:e,value:t})=>`${G6(t)}-${G6(e)}`).join(",")}`,`threshold:${G6(t?.threshold)}`].join(":"),{colors:l,name:e.getColorSchemeName(),numColors:l.length})}function G8(e){return Math.max(0,Math.min(1,e))}function G6(e){return void 0===e?"none":String(Math.round(1e3*e)/1e3)}let G9=function(e,t,r,n){let a,i,o=GV(),s=e.voxelManager.getScalarData();e.stats.lastGetPixelDataTime=GV()-o;let l=s.length,u=e.minPixelValue,d=0,c=0;if(o=GV(),i=r instanceof GQ?r.Table:r,u<0)for(;c<l;)a=i[t[s[c++]+-u]],n[d++]=a[0],n[d++]=a[1],n[d++]=a[2],n[d++]=a[3];else for(;c<l;)a=i[t[s[c++]]],n[d++]=a[0],n[d++]=a[1],n[d++]=a[2],n[d++]=a[3];e.stats.lastStoredPixelDataToCanvasImageDataTime=GV()-o},G7=function(e,t,r,n){let a,i,o=GV(),s=e.voxelManager.getScalarData();e.stats.lastGetPixelDataTime=GV()-o;let l=s.length,u=e.minPixelValue,d=0,c=0;if(o=GV(),i=r instanceof GQ?r.Table:r,u<0)for(;c<l;)a=i[t(s[c++]+-u)],n[d++]=a[0],n[d++]=a[1],n[d++]=a[2],n[d++]=a[3];else for(;c<l;)a=i[t(s[c++])],n[d++]=a[0],n[d++]=a[1],n[d++]=a[2],n[d++]=a[3];e.stats.lastStoredPixelDataToCanvasImageDataTime=GV()-o};function qe(e,t,r){return Math.max(t,Math.min(r,e))}function qt(e,t){if(void 0===e)throw Error("drawImage: enabledElement parameter must not be undefined");let r=e.image;if(void 0===r)throw Error("drawImage: image must be loaded before it can be drawn");let n=e.canvas.getContext("2d");n.setTransform(1,0,0,1,0,0),e.options?.transparentBackground?n.clearRect(0,0,e.canvas.width,e.canvas.height):(n.fillStyle="black",n.fillRect(0,0,e.canvas.width,e.canvas.height)),n.imageSmoothingEnabled=!e.viewport.pixelReplication,GW(e,n);let a=function(e,t,r){e.renderingTools.renderCanvas||(e.renderingTools.renderCanvas=G$(null,t.width,t.height));let n=e.renderingTools.renderCanvas,a=e.viewport.colormap||e.options.colormap;if(e.options&&e.options.colormap&&console.warn("enabledElement.options.colormap is deprecated. Use enabledElement.viewport.colormap instead"),a&&"string"==typeof a?a=G5(a):a&&"object"==typeof a&&"function"!=typeof a.getId&&(a=G5(a)),!a)throw Error("renderPseudoColorImage: colormap not found.");let i=a.getId();if(!GU(e,t)&&!r&&e.renderingTools.colormapId===i)return n;e.renderingTools.renderCanvasContext&&n.width===t.width&&n.height===t.height||Gz(e,t);let o=GV();(!e.renderingTools.colorLUT||r||e.renderingTools.colormapId!==i)&&(a.setNumberOfColors(256),e.renderingTools.colorLUT=a.createLookupTable(),e.renderingTools.colormapId=i);let s=e.renderingTools.renderCanvasData,l=e.renderingTools.renderCanvasContext,{viewport:u}=e,d=e.renderingTools.colorLUT;if("PT"===u.modality){let{windowWidth:e,windowCenter:r}=u.voi,n=r-e/2,a=255/(r+e/2-n);G7(t,u.invert?e=>qe(Math.floor(255-(e-n)*a),0,255):e=>qe(Math.floor((e-n)*a),0,255),d,s.data)}else{let n=GX(t,e.viewport,r);t.stats=t.stats||{},t.stats.lastLutGenerateTime=GV()-o,G9(t,n,d,s.data)}return o=GV(),l.putImageData(s,0,0),t.stats.lastPutImageDataTime=GV()-o,n}(e,r,t),i=e.viewport.displayedArea.tlhc.x-1,o=e.viewport.displayedArea.tlhc.y-1,s=e.viewport.displayedArea.brhc.x-i,l=e.viewport.displayedArea.brhc.y-o;n.drawImage(a,i,o,s,l,0,0,s,l),e.renderingTools=GH(e)}function qr(e,t){let r=e.image;if(!e.canvas||!e.image)return;let n=GV();if(r.stats={lastGetPixelDataTime:-1,lastStoredPixelDataToCanvasImageDataTime:-1,lastPutImageDataTime:-1,lastRenderTime:-1,lastLutGenerateTime:-1},r){let n=r.render;n||(n=e.viewport.colormap?qt:r.color?GY:GJ),n(e,t)}let a=GV()-n;r.stats.lastRenderTime=a,e.invalid=!1,e.needsRedraw=!1}function qn(e){let{dimensions:t,direction:r,numberOfComponents:n,origin:a,pixelArray:i,spacing:o}=e,s=!ArrayBuffer.isView(i)||i instanceof DataView?Array.from(i):i,l=!ArrayBuffer.isView(s)||s instanceof DataView?void 0:U9.getDataType(s),u=U9.newInstance({...l?{dataType:l}:{},name:"Pixels",numberOfComponents:n,values:s}),d=zw();return d.setDimensions(t),d.setSpacing(o),d.setDirection(new Float32Array(Array.from(r))),d.setOrigin(a),d.getPointData().setScalars(u),d}function qa(e){let{dimensions:t,direction:r,numberOfComponents:n,origin:a,spacing:i}=HH(e),o=e.voxelManager.getScalarData().slice(),s=qn({dimensions:t,direction:Array.from(r),numberOfComponents:n,origin:a,pixelArray:o,spacing:i});return Gv(s,e),s}function qi(e){return e.preScale?.scaled&&e.preScale?.scalingParameters?.suvbw?{lower:0,upper:5}:GM(e.windowWidth,e.windowCenter,e.voiLUTFunction)}function qo(e){let{actor:t,defaultVOIRange:r,defaultVOILUTFunction:n,props:a}=e,i=t.getProperty(),o=a?.voiRange??r;if(a?.visible!==void 0&&t.setVisibility(a.visible),a?.opacity!==void 0&&i.setOpacity(a.opacity),a?.interpolationType!==void 0&&i.setInterpolationType(a.interpolationType),!o)return;let s=qs({colormap:a?.colormap,invert:a?.invert,voiRange:o,voiLUTFunction:a?.voiLUTFunction??n});i.setUseLookupTableScalarRange(!0),i.setRGBTransferFunction(0,s)}function qs(e){let{colormap:t,invert:r,voiRange:n,voiLUTFunction:a}=e,i=t?.name!==void 0?function(e,t){let r=e.name,n=r?Gi(r):void 0;if(!n)throw Error(`Colormap ${r} not found`);let a=z2.newInstance();return a.applyColorMap(n),a.setMappingRange(t.lower,t.upper),a}(t,n):a===N2.SAMPLED_SIGMOID?Gy(n):Gg(n);return r&&Gb(i),i}let ql=new class{constructor(){this._imageCache=new Map,this._volumeCache=new Map,this._imageIdsToVolumeIdCache=new Map,this._referencedImageIdToImageIdCache=new Map,this._geometryCache=new Map,this._imageCacheSize=0,this._maxCacheSize=0xc0000000,this._geometryCacheSize=0,this.setMaxCacheSize=e=>{if(!e||"number"!=typeof e)throw Error(`New max cacheSize ${this._maxCacheSize} should be defined and should be a number.`);this._maxCacheSize=e},this.isCacheable=e=>this.getBytesAvailable()+Array.from(this._imageCache.values()).reduce((e,t)=>t.sharedCacheKey?e:e+t.sizeInBytes,0)>=e,this.getMaxCacheSize=()=>this._maxCacheSize,this.getCacheSize=()=>this._imageCacheSize,this._decacheImage=(e,t=!1)=>{let r=this._imageCache.get(e);if(!r)return;if(r.sharedCacheKey&&!t)throw Error("Cannot decache an image with a shared cache key. You need to manually decache the volume first.");let{imageLoadObject:n}=r;r.image?.referencedImageId&&this._referencedImageIdToImageIdCache.delete(r.image.referencedImageId),n?.cancelFn&&n.cancelFn(),n?.decache&&n.decache(),this._imageCache.delete(e)},this._decacheVolume=e=>{let t=this._volumeCache.get(e);if(!t)return;let{volumeLoadObject:r,volume:n}=t;n&&(n.cancelLoading&&n.cancelLoading(),n.imageData&&n.imageData.delete(),r.cancelFn&&r.cancelFn(),n.imageIds&&n.imageIds.forEach(t=>{let r=this._imageCache.get(t);r&&r.sharedCacheKey===e&&(r.sharedCacheKey=void 0)}),this._volumeCache.delete(e))},this.purgeCache=()=>{let e=this._imageCache.keys();for(this.purgeVolumeCache();;){let{value:t,done:r}=e.next();if(r)break;this.removeImageLoadObject(t,{force:!0}),Bh(Bc,NH.IMAGE_CACHE_IMAGE_REMOVED,{imageId:t})}},this.purgeVolumeCache=()=>{let e=this._volumeCache.keys();for(;;){let{value:t,done:r}=e.next();if(r)break;this.removeVolumeLoadObject(t),Bh(Bc,NH.VOLUME_CACHE_VOLUME_REMOVED,{volumeId:t})}},this.getVolumeLoadObject=e=>{if(void 0===e)throw Error("getVolumeLoadObject: volumeId must not be undefined");let t=this._volumeCache.get(e);if(t)return t.timeStamp=Date.now(),t.volumeLoadObject},this.putGeometryLoadObject=(e,t)=>{if(void 0===e)throw Error("putGeometryLoadObject: geometryId must not be undefined");if(void 0===t.promise)throw Error("putGeometryLoadObject: geometryLoadObject.promise must not be undefined");if(this._geometryCache.has(e))throw Error("putGeometryLoadObject: geometryId already present in geometryCache");if(t.cancelFn&&"function"!=typeof t.cancelFn)throw Error("putGeometryLoadObject: geometryLoadObject.cancel must be a function");let r={loaded:!1,geometryId:e,geometryLoadObject:t,timeStamp:Date.now(),sizeInBytes:0};return this._geometryCache.set(e,r),t.promise.then(t=>{try{this._putGeometryCommon(e,t,r)}catch(t){throw console.debug(`Error in _putGeometryCommon for geometry ${e}:`,t),t}}).catch(t=>{throw console.debug(`Error caching geometry ${e}:`,t),this._geometryCache.delete(e),t})},this.getGeometry=e=>{if(void 0===e)throw Error("getGeometry: geometryId must not be undefined");let t=this._geometryCache.get(e);if(t)return t.timeStamp=Date.now(),t.geometry},this.removeGeometryLoadObject=e=>{if(void 0===e)throw Error("removeGeometryLoadObject: geometryId must not be undefined");let t=this._geometryCache.get(e);if(!t)throw Error("removeGeometryLoadObject: geometryId was not present in geometryCache");this.decrementGeometryCacheSize(t.sizeInBytes),Bh(Bc,NH.GEOMETRY_CACHE_GEOMETRY_REMOVED,{geometry:t,geometryId:e}),this._decacheGeometry(e)},this._decacheGeometry=e=>{let t=this._geometryCache.get(e);if(!t)return;let{geometryLoadObject:r}=t;r.cancelFn&&r.cancelFn(),r.decache&&r.decache(),this._geometryCache.delete(e)},this.incrementGeometryCacheSize=e=>{this._geometryCacheSize+=e},this.decrementGeometryCacheSize=e=>{this._geometryCacheSize-=e},this.getImageByReferencedImageId=e=>{let t=this._referencedImageIdToImageIdCache.get(e);if(t)return this._imageCache.get(t)?.image},this.getImage=(e,t=Fx.FAR_REPLICATE)=>{if(void 0===e)throw Error("getImage: imageId must not be undefined");let r=this._imageCache.get(e);if(r&&(r.timeStamp=Date.now(),!(r.image?.imageQualityStatus<t)))return r.image},this.getVolume=(e,t=!1)=>{if(void 0===e)throw Error("getVolume: volumeId must not be undefined");let r=this._volumeCache.get(e);return r?(r.timeStamp=Date.now(),r.volume):t?[...this._volumeCache.values()].find(t=>t.volumeId.includes(e))?.volume:void 0},this.getVolumes=()=>Array.from(this._volumeCache.values()).map(e=>e.volume),this.filterVolumesByReferenceId=e=>this.getVolumes().filter(t=>t.referencedVolumeId===e),this.removeImageLoadObject=(e,{force:t=!1}={})=>{if(void 0===e)throw Error("removeImageLoadObject: imageId must not be undefined");let r=this._imageCache.get(e);if(!r)throw Error("removeImageLoadObject: imageId was not present in imageCache");this._decacheImage(e,t),this.incrementImageCacheSize(-r.sizeInBytes),Bh(Bc,NH.IMAGE_CACHE_IMAGE_REMOVED,{image:r,imageId:e})},this.removeVolumeLoadObject=e=>{if(void 0===e)throw Error("removeVolumeLoadObject: volumeId must not be undefined");let t=this._volumeCache.get(e);if(!t)throw Error("removeVolumeLoadObject: volumeId was not present in volumeCache");Bh(Bc,NH.VOLUME_CACHE_VOLUME_REMOVED,{volume:t,volumeId:e}),this._decacheVolume(e)},this.incrementImageCacheSize=e=>{this._imageCacheSize+=e},this.decrementImageCacheSize=e=>{this._imageCacheSize-=e},this.getGeometryLoadObject=e=>{if(void 0===e)throw Error("getGeometryLoadObject: geometryId must not be undefined");let t=this._geometryCache.get(e);if(t)return t.timeStamp=Date.now(),t.geometryLoadObject}}generateVolumeId(e){let t=e.map(Gk).sort(),r=0x811c9dc5;for(let e of t){let t=function(e){let t=0x811c9dc5;for(let r=0;r<e.length;r++)t^=e.charCodeAt(r),t+=(t<<1)+(t<<4)+(t<<7)+(t<<8)+(t<<24);return(t>>>0).toString(36)}(e);for(let e=0;e<t.length;e++)r^=t.charCodeAt(e),r+=(r<<1)+(r<<4)+(r<<7)+(r<<8)+(r<<24)}return`volume-${(r>>>0).toString(36)}`}getImageIdsForVolumeId(e){return Array.from(this._imageIdsToVolumeIdCache.entries()).filter(([t,r])=>r===e).map(([e])=>e)}getBytesAvailable(){return this.getMaxCacheSize()-this.getCacheSize()}decacheIfNecessaryUntilBytesAvailable(e,t){let r=this.getBytesAvailable();if(r>=e)return r;let n=Array.from(this._imageCache.values()).filter(e=>!e.sharedCacheKey);n.sort(function(e,t){return e.timeStamp>t.timeStamp?1:e.timeStamp<t.timeStamp?-1:0});let a=n.map(e=>e.imageId),i=a;for(let n of(t&&(i=a.filter(e=>!t.includes(e))),i))if(this.removeImageLoadObject(n),Bh(Bc,NH.IMAGE_CACHE_IMAGE_REMOVED,{imageId:n}),(r=this.getBytesAvailable())>=e)return r;for(let t of a)if(this.removeImageLoadObject(t),Bh(Bc,NH.IMAGE_CACHE_IMAGE_REMOVED,{imageId:t}),(r=this.getBytesAvailable())>=e)return r}_putImageCommon(e,t,r){if(!this._imageCache.has(e))return void console.warn("The image was purged from the cache before it completed loading.");if(!t)return void console.warn("Image is undefined");if(void 0===t.sizeInBytes||Number.isNaN(t.sizeInBytes))throw Error("_putImageCommon: image.sizeInBytes must not be undefined");if(void 0===t.sizeInBytes.toFixed)throw Error("_putImageCommon: image.sizeInBytes is not a number");if(!this.isCacheable(t.sizeInBytes))throw Error(NH.CACHE_SIZE_EXCEEDED);this.decacheIfNecessaryUntilBytesAvailable(t.sizeInBytes),r.loaded=!0,r.image=t,r.sizeInBytes=t.sizeInBytes,this.incrementImageCacheSize(r.sizeInBytes),t.referencedImageId&&this._referencedImageIdToImageIdCache.set(t.referencedImageId,e),Bh(Bc,NH.IMAGE_CACHE_IMAGE_ADDED,{image:r}),r.sharedCacheKey=t.sharedCacheKey}async putImageLoadObject(e,t){if(void 0===e)throw console.error("putImageLoadObject: imageId must not be undefined"),Error("putImageLoadObject: imageId must not be undefined");if(void 0===t.promise)throw console.error("putImageLoadObject: imageLoadObject.promise must not be undefined"),Error("putImageLoadObject: imageLoadObject.promise must not be undefined");let r=this._imageCache.get(e);if(r?.imageLoadObject)throw console.warn(`putImageLoadObject: imageId ${e} already in cache`),Error("putImageLoadObject: imageId already in cache");if(t.cancelFn&&"function"!=typeof t.cancelFn)throw console.error("putImageLoadObject: imageLoadObject.cancel must be a function"),Error("putImageLoadObject: imageLoadObject.cancel must be a function");let n={...r,loaded:!1,imageId:e,sharedCacheKey:void 0,imageLoadObject:t,timeStamp:Date.now(),sizeInBytes:0};return this._imageCache.set(e,n),t.promise.then(t=>{try{this._putImageCommon(e,t,n)}catch(t){throw console.debug(`Error in _putImageCommon for image ${e}:`,t),t}}).catch(t=>{throw console.debug(`Error caching image ${e}:`,t),this._imageCache.delete(e),t})}putImageSync(e,t){if(void 0===e)throw Error("putImageSync: imageId must not be undefined");if(this._imageCache.has(e))throw Error("putImageSync: imageId already in cache");let r={loaded:!1,imageId:e,sharedCacheKey:void 0,imageLoadObject:{promise:Promise.resolve(t)},timeStamp:Date.now(),sizeInBytes:0};this._imageCache.set(e,r);try{this._putImageCommon(e,t,r)}catch(t){throw this._imageCache.delete(e),t}}getImageLoadObject(e){if(void 0===e)throw Error("getImageLoadObject: imageId must not be undefined");let t=this._imageCache.get(e);if(t)return t.timeStamp=Date.now(),t.imageLoadObject}isLoaded(e){let t=this._imageCache.get(e);return!!t&&t.loaded}getVolumeContainingImageId(e){let t=Array.from(this._volumeCache.keys()),r=Gk(e);for(let e of t){let t=this._volumeCache.get(e);if(!t)return;let{volume:n}=t;if(!n.imageIds.length)return;let a=n.getImageURIIndex(r);if(a>-1)return{volume:n,imageIdIndex:a}}}getCachedImageBasedOnImageURI(e){let t=Gk(e),r=Array.from(this._imageCache.keys()).find(e=>Gk(e)===t);if(r)return this._imageCache.get(r)}_putVolumeCommon(e,t,r){this._volumeCache.get(e)?(r.loaded=!0,r.volume=t,t.imageIds?.forEach(t=>{let r=this._imageCache.get(t);r&&(r.sharedCacheKey=e)}),Bh(Bc,NH.VOLUME_CACHE_VOLUME_ADDED,{volume:r})):console.warn("The volume was purged from the cache before it completed loading.")}putVolumeSync(e,t){if(void 0===e)throw Error("putVolumeSync: volumeId must not be undefined");if(this._volumeCache.has(e))throw Error("putVolumeSync: volumeId already in cache");let r={loaded:!1,volumeId:e,volumeLoadObject:{promise:Promise.resolve(t)},timeStamp:Date.now(),sizeInBytes:0};this._volumeCache.set(e,r);try{this._putVolumeCommon(e,t,r)}catch(t){throw this._volumeCache.delete(e),t}}async putVolumeLoadObject(e,t){if(void 0===e)throw Error("putVolumeLoadObject: volumeId must not be undefined");if(void 0===t.promise)throw Error("putVolumeLoadObject: volumeLoadObject.promise must not be undefined");if(this._volumeCache.has(e))throw Error(`putVolumeLoadObject: volumeId:${e} already in cache`);if(t.cancelFn&&"function"!=typeof t.cancelFn)throw Error("putVolumeLoadObject: volumeLoadObject.cancel must be a function");let r={loaded:!1,volumeId:e,volumeLoadObject:t,timeStamp:Date.now(),sizeInBytes:0};return this._volumeCache.set(e,r),t.promise.then(t=>{try{this._putVolumeCommon(e,t,r)}catch(t){throw console.error(`Error in _putVolumeCommon for volume ${e}:`,t),this._volumeCache.delete(e),t}}).catch(t=>{throw this._volumeCache.delete(e),t})}_putGeometryCommon(e,t,r){if(!this._geometryCache.get(e))return void console.warn("The geometry was purged from the cache before it completed loading.");if(!t)return void console.warn("Geometry is undefined");if(void 0===t.sizeInBytes||Number.isNaN(t.sizeInBytes))throw Error("_putGeometryCommon: geometry.sizeInBytes must not be undefined");if(void 0===t.sizeInBytes.toFixed)throw Error("_putGeometryCommon: geometry.sizeInBytes is not a number");if(!this.isCacheable(t.sizeInBytes))throw Error(NH.CACHE_SIZE_EXCEEDED);this.decacheIfNecessaryUntilBytesAvailable(t.sizeInBytes),r.loaded=!0,r.geometry=t,r.sizeInBytes=t.sizeInBytes,this.incrementGeometryCacheSize(r.sizeInBytes),Bh(Bc,NH.GEOMETRY_CACHE_GEOMETRY_ADDED,{geometry:r})}putGeometrySync(e,t){if(void 0===e)throw Error("putGeometrySync: geometryId must not be undefined");if(this._geometryCache.has(e))throw Error("putGeometrySync: geometryId already in cache");let r={loaded:!1,geometryId:e,geometryLoadObject:{promise:Promise.resolve(t)},timeStamp:Date.now(),sizeInBytes:0};this._geometryCache.set(e,r);try{this._putGeometryCommon(e,t,r)}catch(t){throw this._geometryCache.delete(e),t}}setPartialImage(e,t,r=!1){let n=this._imageCache.get(e);if(!n){t&&this._imageCache.set(e,{image:t,imageId:e,loaded:!1,timeStamp:Date.now(),sizeInBytes:0});return}n.loaded?(n.loaded=!1,n.imageLoadObject=null,this.incrementImageCacheSize(-n.sizeInBytes),n.sizeInBytes=0):r&&(n.imageLoadObject=null),n.image=t||n.image}getImageQuality(e){let t=this._imageCache.get(e)?.image;return t?t.imageQualityStatus||Fx.FULL_RESOLUTION:void 0}},qu={},qd={add:(e,t)=>{qd.addRaw(e,{...t,metadata:G_(t.metadata)})},addRaw:(e,t)=>{let r=t.type;qu[e]||(qu[e]={}),qu[e][r]=t.metadata},get:(e,t)=>qu[t]?.[e],clear:()=>{qu={}}};function qc(e,t){switch(e){case"Float32Array":return Float32Array;case"Uint8Array":return Uint8Array;case"Uint32Array":return Uint32Array;case"Uint16Array":case"Int16Array":if(!t)return"Uint16Array"===e?Uint16Array:Int16Array;return console.debug(`${e} is not supported for volume rendering, switching back to Float32Array`),Float32Array;default:if(!e)return Float32Array;throw Error("TargetBuffer should be Float32Array, Uint8Array, Uint16Array, Int16Array, or Uint32Array")}}HR(qd.get);let qh=[[0,-1,0],[0,1,0],[0,0,-1],[0,0,1]],qp=[[0,-1,0],[0,1,0]],qm=[[0,-1,0],[0,1,0],[0,0,-1]],qf=[[0,-1,0],[0,1,0],[0,0,1]];class qg{static copyMap(e,t){for(let[r,n]of t.rows)e.rows.set(r,G_(n))}constructor(e,t,r=1){this.rows=new Map,this.height=1,this.width=1,this.depth=1,this.jMultiple=1,this.kMultiple=1,this.numComps=1,this.pixelDataConstructor=Uint8Array,this.updateScalarData=function(e){e.fill(0),this.forEach((t,r,n)=>{let{start:a,end:i,value:o}=r;for(let r=a;r<i;r++)e[t+r]=o})},this.get=e=>{let t=e%this.jMultiple,r=(e-t)/this.jMultiple,n=this.getRLE(t,r);return n?.value??this.defaultValue},this.getRun=(e,t)=>{let r=e+t*this.height;return this.rows.get(r)},this.set=(e,t)=>{if(void 0===t)return;let r=e%this.width,n=(e-r)/this.width,a=this.rows.get(n);if(!a)return void this.rows.set(n,[{start:r,end:r+1,value:t}]);let i=this.findIndex(a,r),o=a[i],s=a[i-1];if(!o){if(!s||s.value!==t||s.end!==r){a[i]={start:r,end:r+1,value:t};return}s.end++;return}let{start:l,end:u,value:d}=o;if(t===d&&r>=l)return;let c={start:r,end:r+1,value:t},h=r>l,p=h?i+1:i,m=h?o:s,f=h?a[i+1]:o;if(m?.value===t&&m?.end===r){m.end++,f?.value===t&&f.start===r+1?(m.end=f.end,a.splice(i,1)):f?.start===r&&(f.start++,f.start===f.end&&(a.splice(i,1),f=a[i],f?.start===r+1&&f.value===t&&(m.end=f.end,a.splice(i,1))));return}if(f?.value===t&&f.start===r+1){f.start--,m?.end>r&&(m.end=r,m.end===m.start&&a.splice(i,1));return}if(f?.start===r&&f.end===r+1){f.value=t;let e=a[i+1];e?.start==r+1&&e.value===t&&(a.splice(i+1,1),f.end=e.end);return}r===f?.start&&f.start++,h&&u>r+1?a.splice(p,0,c,{start:r+1,end:m.end,value:m.value}):a.splice(p,0,c),m?.end>r&&(m.end=r)},this.width=e,this.height=t,this.depth=r,this.jMultiple=e,this.kMultiple=this.jMultiple*t}toIJK(e){let t=e%this.jMultiple,r=(e-t)/this.jMultiple%this.height;return[t,r,Math.floor(e/this.kMultiple)]}toIndex([e,t,r]){return e+r*this.kMultiple+t*this.jMultiple}getRLE(e,t,r=0){let n=this.rows.get(t+r*this.height);if(!n)return;let a=this.findIndex(n,e),i=n[a];return e>=i?.start?i:void 0}has(e){let t=e%this.jMultiple,r=(e-t)/this.jMultiple,n=this.getRLE(t,r);return n?.value!==void 0}delete(e){let t=e%this.width,r=(e-t)/this.width,n=this.rows.get(r);if(!n)return;let a=this.findIndex(n,t),i=n[a];if(!i||i.start>t)return;if(i.end===t+1){i.end--,i.start>=i.end&&(n.splice(a,1),n.length||this.rows.delete(r));return}if(i.start===t)return void i.start++;let o={value:i.value,start:t+1,end:i.end};i.end=t,n.splice(a+1,0,o)}findIndex(e,t){for(let r=0;r<e.length;r++){let{end:n}=e[r];if(t<n)return r}return e.length}forEach(e,t){let r=t?.rowModified;for(let[t,n]of this.rows)for(let a of r?[...n]:n)e(t*this.width,a,n)}forEachRow(e){for(let[t,r]of this.rows)e(t*this.width,r)}clear(){this.rows.clear()}keys(){return[...this.rows.keys()]}getPixelData(e=0,t){t?t.fill(0):t=new this.pixelDataConstructor(this.width*this.height*this.numComps);let{width:r,height:n,numComps:a}=this;for(let i=0;i<n;i++){let n=this.getRun(i,e);if(n)if(1===a)for(let e of n){let n=i*r,{start:a,end:o,value:s}=e;for(let e=a;e<o;e++)t[n+e]=s}else for(let e of n){let n=i*r*a,{start:o,end:s,value:l}=e;for(let e=o;e<s;e+=a)for(let r=0;r<a;r++)t[n+e+r]=l[r]}}return t}floodFill(e,t,r,n,a){let i=this.getRLE(e,t,r);if(!i)throw Error(`Initial point ${e},${t},${r} isn't in the RLE`);let o=[[i,t,r]],s=i.value;if(s===n)throw Error(`source (${s}) and destination (${n}) are identical`);return this.flood(o,s,n,a)}flood(e,t,r,n){let a=0,{planar:i=!0,diagonals:o=!0,singlePlane:s=!1}=n||{},l={planar:i,diagonals:o,singlePlane:s};for(;e.length;){let n=e.pop(),[i]=n;if(i.value!==t)continue;i.value=r,a+=i.end-i.start;let o=this.findAdjacents(n,l).filter(e=>e&&e[0].value===t);e.push(...o)}return a}fillFrom(e,t){for(let r=t[2][0];r<=t[2][1];r++)for(let n=t[1][0];n<=t[1][1];n++){let a,i;for(let o=t[0][0];o<=t[0][1];o++){let t=e(o,n,r);if(void 0===t){a=void 0;continue}i||(i=[],this.rows.set(n+r*this.height,i)),a&&a.value!==t&&(a=void 0),a||(a={start:o,end:o,value:t},i.push(a)),a.end++}}}findAdjacents(e,{diagonals:t=!0,planar:r=!0,singlePlane:n=!1}){let[a,i,o,s]=e,{start:l,end:u}=a,d=l>0&&this.getRLE(l-1,i,o),c=u<this.width&&this.getRLE(u,i,o),h=t?[l>0?l-1:l,u<this.width?u+1:u]:[l,u],p=[];for(let e of(d&&p.push([d,i,o]),c&&p.push([c,i,o]),s||(n?qp:qh))){let[,t,a]=e,l=t+i,u=a+o;if(l<0||l>=this.height||u<0||u>=this.depth)continue;let d=this.getRun(l,u);if(d)for(let e of d){let t=s||n&&qp||r&&a>0&&qf||r&&a<0&&qm||qh;e.end<=h[0]||e.start>=h[1]||p.push([e,l,u,t])}}return p}}qg.getScalarData=function(e=Uint8ClampedArray){let t=new e(this.frameSize);return this.map.updateScalarData(t),t};var qy=u(4164);class qv{constructor(e={}){this._dimensions=3,this._length=0,this._byteSize=4,this.growSize=128;const{initialSize:t=1024,dimensions:r=3,growSize:n=128}=e;this.growSize=n,this.array=new ArrayBuffer(t*r*this._byteSize),this.data=new Float32Array(this.array),this._dimensions=r}forEach(e){for(let t=0;t<this._length;t++)e(this.getPoint(t),t)}get length(){return this._length}get dimensions(){return this._dimensions}get dimensionLength(){return this._length*this._dimensions}getPoint(e){if(e<0&&(e+=this._length),e<0||e>=this._length)return;let t=this._dimensions*e;return this.data.subarray(t,t+this._dimensions)}getPointArray(e){let t=[];if(e<0&&(e+=this._length),e<0||e>=this._length)return;let r=this._dimensions*e;for(let e=0;e<this._dimensions;e++)t.push(this.data[e+r]);return t}grow(e=1,t=this.growSize){if(this.dimensionLength+e*this._dimensions<=this.data.length)return;let r=new ArrayBuffer((this.data.length+t)*this._dimensions*this._byteSize),n=new Float32Array(r);n.set(this.data),this.data=n,this.array=r}reverse(){let e=Math.floor(this._length/2);for(let t=0;t<e;t++){let e=t*this._dimensions,r=(this._length-1-t)*this._dimensions;for(let t=0;t<this._dimensions;t++){let n=this.data[e+t];this.data[e+t]=this.data[r+t],this.data[r+t]=n}}}getTypedArray(){return this.data}push(e){this.grow(1);let t=this.length*this._dimensions;for(let r=0;r<this._dimensions;r++)this.data[r+t]=e[r];this._length++}map(e){let t=[];for(let r=0;r<this._length;r++)t.push(e(this.getPoint(r),r));return t}get points(){return this.map(e=>e)}toXYZ(){let e={x:[],y:[]};this._dimensions>=3&&(e.z=[]);let{x:t,y:r,z:n}=e;return this.forEach(e=>{t.push(e[0]),r.push(e[1]),n&&n.push(e[2])}),e}static fromXYZ({x:e,y:t,z:r}){let n=qv.create3(e.length),a=0;for(let i=0;i<e.length;i++)n.data[a++]=e[i],n.data[a++]=t[i],n.data[a++]=r?r[i]:0;return n._length=e.length,n}subselect(e=10,t=0){let r=new qv({initialSize:e,dimensions:this._dimensions});for(let n=0;n<e;n++){let a=(t+Math.floor(this.length*n/e))%this.length;r.push(this.getPoint(a))}return r}static create3(e=128,t){let r=new qv({initialSize:e=Math.max(e,t?.length||0),dimensions:3});return t&&t.forEach(e=>r.push(e)),r}static create2(e=128){return new qv({initialSize:e,dimensions:2})}}function qb(e){let t=qy.create(),r=e.getDimensions(),n=qv.create3(r[0]),a=qv.create3(r[1]),i=qv.create3(r[2]),o=e.getDirection(),s=o.slice(0,3),l=o.slice(3,6),u=o.slice(6,9),[d,c,h]=e.getSpacing(),p=e.indexToWorld([0,0,0]),m=qy.fromValues(s[0]*d,s[1]*d,s[2]*d),f=qy.fromValues(l[0]*c,l[1]*c,l[2]*c),g=qy.fromValues(u[0]*h,u[1]*h,u[2]*h),y=qy.create();for(let e=0;e<r[0];e++)n.push(qy.add(y,p,qy.scale(y,m,e)));for(let e=0;e<r[1];e++)a.push(qy.scale(y,f,e));for(let e=0;e<r[2];e++)i.push(qy.scale(y,g,e));let v=n.getTypedArray(),b=a.getTypedArray(),w=i.getTypedArray();return(e,r=t)=>{let[n,a,i]=e,o=3*n,s=3*a,l=3*i;return r[0]=v[o]+b[s]+w[l],r[1]=v[o+1]+b[s+1]+w[l+1],r[2]=v[o+2]+b[s+2]+w[l+2],r}}let qw=[0,0,0],qx=[0,0,0],qC=new WeakMap;class qk{get id(){return this._id}constructor(e,t){this.modifiedSlices=new Set,this.boundsIJK=[[1/0,-1/0],[1/0,-1/0],[1/0,-1/0]],this.scalarData=null,this._scalarDataIsCachedExpansion=!1,this._sliceDataCache=null,this.getAtIJK=(e,t,r)=>this._get(e+t*this.width+r*this.frameSize),this.setAtIJK=(e,t,r,n)=>{let a=e+t*this.width+r*this.frameSize,i=this._set(a,n);return!1!==i&&(this.modifiedSlices.add(r),qk.addBounds(this.boundsIJK,[e,t,r]),this.invalidateCachedScalarExpansion()),i},this.getAtIJKPoint=([e,t,r])=>this.getAtIJK(e,t,r),this.setAtIJKPoint=([e,t,r],n)=>{this.setAtIJK(e,t,r,n)},this.getAtIndex=e=>this._get(e),this.setAtIndex=(e,t)=>{let r=this._set(e,t);if(!1!==r){let t=this.toIJK(e);this.modifiedSlices.add(t[2]),qk.addBounds(this.boundsIJK,t),this.invalidateCachedScalarExpansion()}return r},this.getMiddleSliceData=()=>{let e=Math.floor(this.dimensions[2]/2);return this.getSliceData({sliceIndex:e,slicePlane:2})},this.forEach=(e,t={})=>{let r=t.boundsIJK||this.getBoundsIJK(),n=t.isInObject||this.isInObject||(()=>!0),a=t.returnPoints||!1,i=t.imageData,o=Math.min(r[0][0],r[0][1]),s=Math.max(r[0][0],r[0][1]),l=Math.min(r[1][0],r[1][1]),u=Math.max(r[1][0],r[1][1]),d=Math.min(r[2][0],r[2][1]),c=Math.max(r[2][0],r[2][1]),h=[];if(i)return function({voxelManager:e,bounds:t,imageData:r,pointInShapeFn:n,callback:a,returnPoints:i}){let[[o,s],[l,u],[d,c]]=t,h=qb(r),p=[0,0,0],m=[];for(let t=d;t<=c;t++){p[2]=t;for(let t=l;t<=u;t++){p[1]=t;for(let t=o;t<=s;t++){p[0]=t;let r=h(p);if(n(r,p)){let t=e.toIndex(p),n=e.getAtIndex(t);i&&m.push({value:n,index:t,pointIJK:[...p],pointLPS:r.slice()}),a?.({value:n,index:t,pointIJK:p,pointLPS:r})}}}}return m}({voxelManager:this,imageData:t.imageData,bounds:[[o,s],[l,u],[d,c]],pointInShapeFn:n,callback:e,returnPoints:a});if(this.map){if(this.map instanceof qg)return this.rleForEach(e,t);for(let t of this.map.keys()){let r=this.toIJK(t);if(!n(null,r))continue;let i=this._get(t);a&&h.push({value:i,index:t,pointIJK:r,pointLPS:null}),e({value:i,index:t,pointIJK:r,pointLPS:null})}return h}for(let t=d;t<=c;t++){let r=t*this.frameSize;for(let i=l;i<=u;i++){let l=r+i*this.width;for(let r=o,u=l+r;r<=s;r++,u++){let o=this.getAtIndex(u),s=[r,i,t];n(null,s)&&(a&&h.push({value:o,index:u,pointIJK:s,pointLPS:null}),e({value:o,index:u,pointIJK:[r,i,t],pointLPS:null}))}}}return h},this.getSliceData=({sliceIndex:e,slicePlane:t})=>{let r,n,[a,i,o]=this.dimensions,s=a*i,l=e*s,u=this.getConstructor();if("function"!=typeof u)return new Uint8Array(0);switch(t){case 0:n=new u(r=i*o);for(let t=0;t<i;t++)for(let r=0;r<o;r++){let o=e+t*a+r*s;this.setSliceDataValue(n,t+r*i,this._get(o))}break;case 1:n=new u(r=a*o);for(let t=0;t<a;t++)for(let r=0;r<o;r++){let i=t+e*a+r*s;this.setSliceDataValue(n,t+r*a,this._get(i))}break;case 2:n=new u(r=a*i);for(let e=0;e<r;e++)this.setSliceDataValue(n,e,this._get(l+e));break;default:throw Error("Oblique plane - todo - implement as ortho normal vector")}return n},this.dimensions=e,this.width=e[0],this.frameSize=this.width*e[1],this._get=t._get,this._set=t._set,this._id=t._id||"",this._getConstructor=t._getConstructor,this.numberOfComponents=t.numberOfComponents||1,this.scalarData=t.scalarData,this._getScalarData=t._getScalarData,this._updateScalarData=t._updateScalarData}getMinMax(){let e,t;return this.forEach(({value:r})=>{let n=Array.isArray(r);if(void 0===e&&(e=n?[...r]:r,t=n?[...r]:r),n)for(let n=0;n<r.length;n++)e[n]=Math.min(e[n],r[n]),t[n]=Math.max(t[n],r[n]);else e=Math.min(e,r),t=Math.max(t,r)},{boundsIJK:this.getDefaultBounds()}),{min:e,max:t}}invalidateCachedScalarExpansion(){this._scalarDataIsCachedExpansion&&(this.scalarData=null,this._scalarDataIsCachedExpansion=!1)}toIJK(e){return[e%this.width,Math.floor(e%this.frameSize/this.width),Math.floor(e/this.frameSize)]}toIndex(e){return e[0]+e[1]*this.width+e[2]*this.frameSize}getDefaultBounds(){return this.dimensions.map(e=>[0,e-1])}getBoundsIJK(){return this.boundsIJK[0][0]<this.dimensions[0]?this.boundsIJK:this.getDefaultBounds()}rleForEach(e,t){let r=t?.boundsIJK||this.getBoundsIJK(),{isWithinObject:n}=t||{},a=this.map;if(!a)return void console.warn("No map found, you need to use a map voxel manager to use rleForEach");a.defaultValue=void 0;for(let t=r[2][0];t<=r[2][1];t++)for(let i=r[1][0];i<=r[1][1];i++){let r=a.getRun(i,t);if(r)for(let a of r){let{start:r,end:o,value:s}=a,l=this.toIndex([0,i,t]);for(let a=r;a<o;a++){let r={value:s,index:l+a,pointIJK:[a,i,t]};n?.(r)!==!1&&e(r)}}}}getScalarData(e=!1){if(this.scalarData)return this._updateScalarData?.(this.scalarData),this.scalarData;if(this._getScalarData){let t=this._getScalarData();return e&&(this.scalarData=t,this._scalarDataIsCachedExpansion=!0),t}throw Error("No scalar data available")}setScalarData(e){this.scalarData=e,this._scalarDataIsCachedExpansion=!1}getScalarDataLength(){if(this.scalarData)return this.scalarData.length;if(this._getScalarDataLength)return this._getScalarDataLength();throw Error("No scalar data available")}get sizeInBytes(){return this.getScalarDataLength()*this.bytePerVoxel}get bytePerVoxel(){return this.scalarData?this.scalarData.BYTES_PER_ELEMENT:this._get(0).BYTES_PER_ELEMENT}clearBounds(){this.boundsIJK.map(e=>{e[0]=1/0,e[1]=-1/0})}clear(){this.map?.clear(),this.clearBounds(),this.modifiedSlices.clear(),this.points?.clear()}getConstructor(){return this.scalarData?this.scalarData.constructor:this._getConstructor?this._getConstructor():(console.warn("No scalar data available or can be used to get the constructor"),Float32Array)}getArrayOfModifiedSlices(){return Array.from(this.modifiedSlices)}resetModifiedSlices(){this.modifiedSlices.clear()}setBounds(e){this.boundsIJK=e}static addBounds(e,t){e||(e=[[1/0,-1/0],[1/0,-1/0],[1/0,-1/0]]),e[0][0]=Math.min(t[0],e[0][0]),e[0][1]=Math.max(t[0],e[0][1]),e[1][0]=Math.min(t[1],e[1][0]),e[1][1]=Math.max(t[1],e[1][1]),e[2][0]=Math.min(t[2],e[2][0]),e[2][1]=Math.max(t[2],e[2][1])}static getWorldToIndexTransform(e){let t=qC.get(e);if(t)return t;let r=e.direction,n=e.spacing,a=Lv.mat3.fromValues(r[0]/n[0],r[3]/n[1],r[6]/n[2],r[1]/n[0],r[4]/n[1],r[7]/n[2],r[2]/n[0],r[5]/n[1],r[8]/n[2]);return qC.set(e,a),a}static worldToIndexContinuous(e,t){let r=e.origin;qw[0]=t[0]-r[0],qw[1]=t[1]-r[1],qw[2]=t[2]-r[2];let n=Lv.vec3.transformMat3(qx,qw,qk.getWorldToIndexTransform(e));return[n[0],n[1],n[2]]}static sampleAtWorldCoordinates(e,t,r,n,a=NK.LINEAR){if(!e.voxelManager)return NaN;let i=e.origin;qw[0]=t-i[0],qw[1]=r-i[1],qw[2]=n-i[2];let o=Lv.vec3.transformMat3(qx,qw,qk.getWorldToIndexTransform(e));return qk.sampleAtContinuousCoordinates(e.voxelManager,e.dimensions,o[0],o[1],o[2],a)}static sampleAtWorld(e,t,r=NK.LINEAR){return qk.sampleAtWorldCoordinates(e,t[0],t[1],t[2],r)}static sampleAtContinuousIndex(e,t,r,n=NK.LINEAR){return qk.sampleAtContinuousCoordinates(e,t,r[0],r[1],r[2],n)}static sampleAtContinuousCoordinates(e,t,r,n,a,i){return i===NK.NEAREST?qk.sampleNearestAtContinuousCoordinates(e,t,r,n,a):qk.sampleLinearAtContinuousCoordinates(e,t,r,n,a)}static sampleNearestAtContinuousCoordinates(e,t,r,n,a){let i=Math.floor(r+.5-1e-6),o=Math.floor(n+.5-1e-6),s=Math.floor(a+.5-1e-6),l=t[0],u=t[1],d=t[2];return i<0||i>=l||o<0||o>=u||s<0||s>=d?NaN:Number(e.getAtIJK(i,o,s))}static sampleLinearAtContinuousCoordinates(e,t,r,n,a){let i=t[0],o=t[1],s=t[2];if(r<0||r>i-1||n<0||n>o-1||a<0||a>s-1)return NaN;let l=Math.floor(r),u=Math.floor(n),d=Math.floor(a),c=Math.min(l+1,i-1),h=Math.min(u+1,o-1),p=Math.min(d+1,s-1),m=r-l,f=n-u,g=a-d,y=1-m,v=1-f;return((Number(e.getAtIJK(l,u,d))*y+Number(e.getAtIJK(c,u,d))*m)*v+(Number(e.getAtIJK(l,h,d))*y+Number(e.getAtIJK(c,h,d))*m)*f)*(1-g)+((Number(e.getAtIJK(l,u,p))*y+Number(e.getAtIJK(c,u,p))*m)*v+(Number(e.getAtIJK(l,h,p))*y+Number(e.getAtIJK(c,h,p))*m)*f)*g}addPoint(e){let t=Array.isArray(e)?e[0]+this.width*e[1]+this.frameSize*e[2]:e;this.points||(this.points=new Set),this.points.add(t)}getPoints(){return this.points?[...this.points].map(e=>this.toIJK(e)):[]}setSliceDataValue(e,t,r){if(Array.isArray(r))for(let n=0;n<r.length;n++)e[t*r.length+n]=this.toNumber(r[n]);else e[t]=this.toNumber(r)}toNumber(e){return"number"==typeof e?e:Array.isArray(e)&&e[0]||0}static _createRGBScalarVolumeVoxelManager({dimensions:e,scalarData:t,numberOfComponents:r=3,id:n}){let a=new qk(e,{_get:e=>(e*=r,[t[e++],t[e++],t[e++]]),_id:n||"_createRGBScalarVolumeVoxelManager",_set:(e,r)=>{let n=!Vw(t[e*=3],r);return t[e++]=r[0],t[e++]=r[1],t[e++]=r[2],n},numberOfComponents:r,scalarData:t});return a.clear=()=>{t.fill(0)},a}static createImageVolumeVoxelManager({dimensions:e,imageIds:t,numberOfComponents:r=1,id:n}){let a=e[0]*e[1],i=e[2],o=Array(i),s=-1,l=null,u=new Set,d=new Set,c=e=>{if(e<0||e>=i)return null;let r=o[e];if(void 0!==r)return r;let n=t[e];if(!n)return u.has(e)||(u.add(e),console.warn(`ImageId not found for sliceIndex: ${e}`)),o[e]=null,null;let a=ql.getImage(n);if(!a?.voxelManager)return d.has(n)||(d.add(n),console.warn(`Image not found for imageId: ${n}`)),null;let s=a.voxelManager;return o[e]=s,s},h=new qk(e,{_get:function(e){let t=Math.floor(e/a);if(t<0||t>=i)return null;let r=t===s?l:c(t);return r?(t!==s&&(s=t,l=r),r.getAtIndex(e-t*a)):null},_set:function(e,t){let r=Math.floor(e/a);if(r<0||r>=i)return!1;let n=r===s?l:c(r);if(!n)return!1;r!==s&&(s=r,l=n);let o=e-r*a,u=!Vw(t,n.getAtIndex(o));return u?(n.setAtIndex(o,t),!0):u},numberOfComponents:r,_getConstructor:()=>{let e=c(0);return e?e.getConstructor():null},_id:n||"createImageVolumeVoxelManager"});return h.invalidateCache=()=>{o.fill(void 0),s=-1,l=null},h.getMiddleSliceData=()=>{let t=Math.floor(e[2]/2);return h.getSliceData({sliceIndex:t,slicePlane:2})},h.clear=()=>{for(let e of t)ql.getImage(e).voxelManager.clear()},h.getRange=()=>{let e=1/0,r=-1/0;for(let n of t){let t=ql.getImage(n);t&&(t.minPixelValue<e&&(e=t.minPixelValue),t.maxPixelValue>r&&(r=t.maxPixelValue))}return e===1/0&&r===-1/0?[0,0]:[e,r]},h._getScalarDataLength=()=>{let t=c(0);return t?t.getScalarDataLength()*e[2]:0},h.getCompleteScalarDataArray=()=>{let t=h._getConstructor();if(!t)return new Uint8Array(0);let n=new t(h.getScalarDataLength()),a=e[0]*e[1]*r;for(let t=0;t<e[2];t++){let e=c(t);if(e){let i=t*a,o=e.getScalarData();if(1===r)n.set(o,i);else for(let e=0;e<o.length;e+=r)for(let t=0;t<r;t++)n[i+e+t]=o[e+t]}}return n},h.setCompleteScalarDataArray=n=>{let a=e[0]*e[1]*r,i=h._getConstructor(),o=1/0,s=-1/0;for(let r=0;r<e[2];r++){let e=c(r);if(e&&i){let l=r*a,u=l+a,d=new i(a);if(d.set(n.subarray(l,u)),e.scalarData)e.scalarData.set(d),e.modifiedSlices.add(r);else for(let t=0;t<a;t++)e.setAtIndex(t,d[t]);for(let e=0;e<d.length;e++){let t=d[e];o=Math.min(o,t),s=Math.max(s,t)}let c=t[r],h=ql.getImage(c);h&&(h.minPixelValue=o,h.maxPixelValue=s)}}for(let t=0;t<e[2];t++)h.modifiedSlices.add(t);h.boundsIJK=[[0,e[0]-1],[0,e[1]-1],[0,e[2]-1]]},h}static createScalarVolumeVoxelManager({dimensions:e,scalarData:t,numberOfComponents:r,id:n}){if(3!==e.length)throw Error("Dimensions must be provided as [number, number, number] for [width, height, depth]");if(!r&&((r=t.length/e[0]/e[1]/e[2])>4||r<1||2===r))throw Error(`Number of components ${r} must be 1, 3 or 4`);return r>1?qk._createRGBScalarVolumeVoxelManager({dimensions:e,scalarData:t,numberOfComponents:r,id:n}):qk._createNumberVolumeVoxelManager({dimensions:e,scalarData:t,id:n})}static createScalarDynamicVolumeVoxelManager({imageIdGroups:e,dimensions:t,dimensionGroupNumber:r=1,timePoint:n=0,numberOfComponents:a=1,id:i}){let o=0;if(void 0!==r?o=r-1:void 0!==n&&(console.warn("Warning: timePoint parameter is deprecated. Please use dimensionGroupNumber instead. timePoint is zero-based while dimensionGroupNumber starts at 1."),o=n),!a){let r=ql.getImage(e[0][0]);if(!r)throw Error("Unable to determine number of components: No image found");if((a=r.getPixelData().length/(t[0]*t[1]))>4||a<1||2===a)throw Error(`Number of components ${a} must be 1, 3 or 4`)}let s=e.map(e=>qk.createImageVolumeVoxelManager({dimensions:t,imageIds:e,numberOfComponents:a,id:i})),l=new qk(t,{_get:e=>s[o]._get(e),_set:(e,t)=>s[o]._set(e,t),numberOfComponents:a,_id:i||"createScalarDynamicVolumeVoxelManager"});return l.getScalarDataLength=()=>s[o].getScalarDataLength(),l.getConstructor=()=>s[o].getConstructor(),l.getRange=()=>s[o].getRange(),l.getMiddleSliceData=()=>s[o].getMiddleSliceData(),l.setTimePoint=e=>{console.warn("Warning: setTimePoint is deprecated. Please use setDimensionGroupNumber instead. Note that timePoint is zero-based while dimensionGroupNumber starts at 1."),l.setDimensionGroupNumber(e+1)},l.setDimensionGroupNumber=e=>{o=e-1,l._get=e=>s[o]._get(e),l._set=(e,t)=>s[o]._set(e,t)},l.getAtIndexAndTimePoint=(e,t)=>(console.warn("Warning: getAtIndexAndTimePoint is deprecated. Please use getAtIndexAndDimensionGroup instead. Note that timePoint is zero-based while dimensionGroupNumber starts at 1."),l.getAtIndexAndDimensionGroup(e,t+1)),l.getAtIndexAndDimensionGroup=(e,t)=>s[t-1]._get(e),l.getTimePointScalarData=e=>(console.warn("Warning: getTimePointScalarData is deprecated. Please use getDimensionGroupScalarData instead. Note that timePoint is zero-based while dimensionGroupNumber starts at 1."),l.getDimensionGroupScalarData(e+1)),l.getDimensionGroupScalarData=e=>s[e-1].getCompleteScalarDataArray(),l.getCurrentTimePointScalarData=()=>(console.warn("Warning: getCurrentTimePointScalarData is deprecated. Please use getCurrentDimensionGroupScalarData instead."),l.getCurrentDimensionGroupScalarData()),l.getCurrentDimensionGroupScalarData=()=>s[o].getCompleteScalarDataArray(),l.getCompleteScalarDataArray=()=>s[o].getCompleteScalarDataArray(),l.getCurrentTimePoint=()=>(console.warn("Warning: getCurrentTimePoint is deprecated. Please use getCurrentDimensionGroupNumber instead. Note that timePoint is zero-based while dimensionGroupNumber starts at 1."),o),l.getCurrentDimensionGroupNumber=()=>o+1,l}static createImageVoxelManager({width:e,height:t,scalarData:r,numberOfComponents:n=1,id:a}){let i=[e,t,1];if(!n&&((n=r.length/e/t)>4||n<1||2===n))throw Error(`Number of components ${n} must be 1, 3 or 4`);return n>1?qk._createRGBScalarVolumeVoxelManager({dimensions:i,scalarData:r,numberOfComponents:n,id:a}):qk._createNumberVolumeVoxelManager({dimensions:i,scalarData:r,id:a})}static _createNumberVolumeVoxelManager({dimensions:e,scalarData:t,id:r}){let n=new qk(e,{_get:e=>t[e],_set:(e,r)=>{let n=t[e]!==r;return t[e]=r,n},_getConstructor:()=>t.constructor,_id:r||"_createNumberVolumeVoxelManager"});return n.scalarData=t,n.clear=()=>{n.scalarData.fill(0)},n.getMiddleSliceData=()=>{let t=Math.floor(e[2]/2);return n.getSliceData({sliceIndex:t,slicePlane:2})},n}static createMapVoxelManager({dimension:e,id:t}){let r=new Map,n=new qk(e,{_get:r.get.bind(r),_set:(e,t)=>r.set(e,t)&&!0,_id:t||"createMapVoxelManager"});return n.map=r,n}static createHistoryVoxelManager(e,t){let r=new Map,{dimensions:n}=e,a=new qk(n,{_get:e=>r.get(e),_set:function(e,t){if(r.has(e))t===r.get(e)&&r.delete(e);else{let n=this.sourceVoxelManager.getAtIndex(e);if(n===t)return!1;r.set(e,n)}this.sourceVoxelManager.setAtIndex(e,t)},_id:t||"createHistoryVoxelManager"});return a.map=r,a.scalarData=e.scalarData,a.sourceVoxelManager=e,a}static createRLEHistoryVoxelManager(e,t){let{dimensions:r}=e,n=new qg(r[0],r[1],r[2]),a=new qk(r,{_get:e=>n.get(e),_set:function(e,t){let r=n.get(e);if(void 0===r){let r=this.sourceVoxelManager.getAtIndex(e);if(r===t||void 0===r&&0===t||null===t)return!1;n.set(e,r??0)}else(t===r||null===t)&&(n.delete(e),t=r);this.sourceVoxelManager.setAtIndex(e,t)},_getScalarData:qg.getScalarData,_updateScalarData:e=>(n.updateScalarData(e),e),_id:t||"createRLEHistoryVoxelManager"});return a.map=n,a.sourceVoxelManager=e,a}static createLazyVoxelManager({dimensions:e,planeFactory:t,id:r}){let n=new Map,[a,i]=e,o=a*i,s=new qk(e,{_get:e=>n.get(Math.floor(e/o))[e%o],_set:(e,r)=>{let s=Math.floor(e/o),l=n.get(s);return l||(l=t(a,i),n.set(s,l)),l[e%o]=r,!0},_id:r||"createLazyVoxelManager"});return s.map=n,s}static createRLEVolumeVoxelManager({dimensions:e,id:t}){let[r,n,a]=e,i=new qg(r,n,a),o=new qk(e,{_get:e=>i.get(e),_set:(e,t)=>(i.set(e,t),!0),_getScalarData:qg.getScalarData,_updateScalarData:e=>(i.updateScalarData(e),e),_id:t||"createRLEVolumeVoxelManager"});return o.map=i,o.getPixelData=i.getPixelData.bind(i),o}static createRLEImageVoxelManager({dimensions:e,id:t}){let[r,n]=e;return qk.createRLEVolumeVoxelManager({dimensions:[r,n,1],id:t})}static addInstanceToImage(e){let{width:t,height:r}=e,n=e.voxelManager.getScalarData();if(n.length>=t*r){e.voxelManager=qk.createScalarVolumeVoxelManager({dimensions:[t,r,1],scalarData:n});return}e.voxelManager=qk.createRLEVolumeVoxelManager({dimensions:[t,r,1]}),e.getPixelData=e.voxelManager.getPixelData,e.sizeInBytes=5120}}let qM=new F5("imageLoadPool");qM.grabDelay=0,qM.setMaxSimultaneousRequests(NG.Interaction,1e3),qM.setMaxSimultaneousRequests(NG.Thumbnail,1e3),qM.setMaxSimultaneousRequests(NG.Prefetch,1e3);let qS={};function qE(e,t){let r=!t.ignoreCache&&ql.getImageLoadObject(e);if(r)return qT(r.promise,e),r;let n=!t.ignoreCache&&ql.getImage(e,t.retrieveOptions?.imageQualityStatus??Fx.FULL_RESOLUTION);if(n){let t={promise:Promise.resolve(n)};return qT(t.promise,e),t}let a=e.split(":")[0],i=qS[a]||b;if(!i)throw Error(`loadImageFromImageLoader: No image loader found for scheme '${a}'`);let o=i(e,t);return qT(o.promise,e),o}function qT(e,t){Promise.resolve(e).then(e=>{(function(e){if(!e.voxelManager){let{width:t,height:r,numberOfComponents:n}=e,a=qk.createImageVoxelManager({scalarData:e.getPixelData(),width:t,height:r,numberOfComponents:n});e.voxelManager=a,e.getPixelData=()=>a.getScalarData(),delete e.imageFrame.pixelData}})(e),Bh(Bc,NH.IMAGE_LOADED,{image:e})}).catch(e=>{Bh(Bc,NH.IMAGE_LOAD_FAILED,{imageId:t,error:e})})}function qI(e,t={priority:0,requestType:"prefetch"}){if(void 0===e)throw Error("loadAndCacheImage: parameter imageId must not be undefined");let r=qE(e,t);return ql.getImageLoadObject(e)||ql.putImageLoadObject(e,r),r.promise}function qP(e,t){let r=Gj(e);return r.invert(),r.transformPoint(t)}let q_={};function qD(e,t){if(null==e)throw Error(t)}function qO(e,t=null){return(qD(e,"getImageSize: parameter image must not be undefined"),qD(e.width,"getImageSize: parameter image must have width"),qD(e.height,"getImageSize: parameter image must have height"),null!=t&&0!==t&&180!==t)?{height:e.width,width:e.height}:{width:e.width,height:e.height}}function qA(e,t,r=null){qD(e,"getImageScale: parameter canvas must not be undefined"),qD(t,"getImageScale: parameter image must not be undefined");let n=qO(t,r),a=t.rowPixelSpacing||1,i=t.columnPixelSpacing||1,o=1,s=1;a<i?s=i/a:o=a/i;let l=e.height/n.height/o,u=e.width/n.width/s;return{verticalScale:l,horizontalScale:u,scaleFactor:Math.min(u,l)}}function qR(e,t,r,n){let a;if(void 0===e)throw Error("getDefaultViewport: parameter canvas must not be undefined");if(void 0===t)return Object.assign({},{scale:1,translation:{x:0,y:0},voi:{windowWidth:void 0,windowCenter:void 0,voiLUTFunction:N2.LINEAR},invert:!1,pixelReplication:!1,rotation:0,hflip:!1,vflip:!1,modalityLUT:void 0,voiLUT:void 0,colormap:void 0,labelmap:!1,displayedArea:{tlhc:{x:1,y:1},brhc:{x:1,y:1},rowPixelSpacing:1,columnPixelSpacing:1,presentationSizeMode:"NONE"}},q_);let i=qA(e,t,0).scaleFactor;return"PT"===r&&t.isPreScaled?a={windowWidth:5,windowCenter:2.5}:void 0!==t.windowWidth&&void 0!==t.windowCenter&&(a={windowWidth:Array.isArray(t.windowWidth)?t.windowWidth[0]:t.windowWidth,windowCenter:Array.isArray(t.windowCenter)?t.windowCenter[0]:t.windowCenter}),{scale:i,translation:{x:0,y:0},voi:a,invert:t.invert,pixelReplication:!1,rotation:0,hflip:!1,vflip:!1,modalityLUT:t.modalityLUT,modality:r,voiLUT:t.voiLUT,colormap:void 0!==n?n:t.colormap,displayedArea:{tlhc:{x:1,y:1},brhc:{x:t.columns,y:t.rows},rowPixelSpacing:void 0===t.rowPixelSpacing?1:t.rowPixelSpacing,columnPixelSpacing:void 0===t.columnPixelSpacing?1:t.columnPixelSpacing,presentationSizeMode:"NONE"}}}function qL(e,t){return Gj(e).transformPoint(t)}function qN(e,t=!1){let r=e.canvas.width,n=e.canvas.height;if(!function(e){let{canvas:t}=e,{clientWidth:r,clientHeight:n}=t;(t.width!==r||t.height!==n)&&(t.width=r,t.height=n)}(e),void 0!==e.image){let a,i,o,s,l,u;if(t||(a=e.viewport.scale,o=Math.round((i=qO(e.image,e.viewport.rotation)).width*a),s=Math.round(i.height*a),l=e.viewport.translation.x,u=e.viewport.translation.y,o===r&&s<=n||o<=r&&s===n&&0===l&&0===u))!function(e){let{image:t}=e;e.viewport.scale=qA(e.canvas,t,e.viewport.rotation).scaleFactor,e.viewport.translation.x=0,e.viewport.translation.y=0}(e);else{let t,a,i;t=e.viewport.scale,a=e.canvas.width,i=Math.sqrt(a/r*(e.canvas.height/n)),e.viewport.scale=i*t}}}let qV=[{id:"initialImages",retrieveType:"single"}],qF=[{offset:-1,imageQualityStatus:Fx.ADJACENT_REPLICATE},{offset:1,imageQualityStatus:Fx.ADJACENT_REPLICATE},{offset:2,imageQualityStatus:Fx.FAR_REPLICATE}],qB=[{id:"initialImages",positions:[.5,0,-1],retrieveType:"default",requestType:NG.Thumbnail,priority:5,nearbyFrames:qF},{id:"quarterThumb",decimate:4,offset:3,requestType:NG.Thumbnail,retrieveType:"multipleFast",priority:6,nearbyFrames:qF},{id:"halfThumb",decimate:4,offset:1,priority:7,requestType:NG.Thumbnail,retrieveType:"multipleFast",nearbyFrames:qF},{id:"quarterFull",decimate:4,offset:2,priority:8,requestType:NG.Thumbnail,retrieveType:"multipleFinal"},{id:"halfFull",decimate:4,offset:0,priority:9,requestType:NG.Thumbnail,retrieveType:"multipleFinal"},{id:"threeQuarterFull",decimate:4,offset:1,priority:10,requestType:NG.Thumbnail,retrieveType:"multipleFinal"},{id:"finalFull",decimate:4,offset:3,priority:11,requestType:NG.Thumbnail,retrieveType:"multipleFinal"},{id:"errorRetrieve"}];class qj{constructor(e){this.name=e||"unknown"}static as(e){if(e.iterator)return e.iterator;let t=new qj("as iterator");return e.then(e=>{try{t.add(e,!0)}catch(e){t.reject(e)}},e=>{t.reject(e)}),t}add(e,t=!1){this.nextValue=e,this.done||=t,this.waiting&&(this.waiting.resolve(e),this.waiting=void 0)}resolve(){this.done=!0,this.waiting&&(this.waiting.resolve(this.nextValue),this.waiting=void 0)}reject(e){this.rejectReason=e,this.waiting?.reject(e)}getRecent(){if(this.rejectReason)throw this.rejectReason;return this.nextValue}async *[Symbol.asyncIterator](){for(;!this.done;){if(this.rejectReason)throw this.rejectReason;if(void 0!==this.nextValue&&(yield this.nextValue,this.done))break;this.waiting||(this.waiting={},this.waiting.promise=new Promise((e,t)=>{this.waiting.resolve=e,this.waiting.reject=t})),await this.waiting.promise}yield this.nextValue}async forEach(e,t){let r=0;try{for await(let n of this){let{done:a}=this;try{await e(n,a,r),r++}catch(e){if(!a){console.warn("Caught exception in intermediate value",e);continue}if(t)t(e,a);else throw e}}}catch(e){if(t)t(e,!0);else throw e}}generate(e,t){return e(this,this.reject.bind(this)).then(()=>{this.done||this.resolve()},e=>{this.reject(e),t?t(e):console.warn("Couldn't process because",e)})}async nextPromise(){for await(let e of this)if(e)return e;return this.nextValue}async donePromise(){for await(let e of this);return this.nextValue}getNextPromise(){let e=this.nextPromise();return e.iterator=this,e}getDonePromise(){let e=this.donePromise();return e.iterator=this,e}}class qW{constructor(e){this.stages=e.stages||qV,this.retrieveOptions=e.retrieveOptions||{}}loadImages(e,t){return new qU(this,e,t).loadImages()}}qW.createProgressive=qz,qW.interleavedRetrieveStages={stages:qB},qW.singleRetrieveStages={stages:qV},qW.sequentialRetrieveStages={stages:[{id:"lossySequential",retrieveType:"singleFast"},{id:"finalSequential",retrieveType:"singleFinal"}]};class qU{constructor(e,t,r){this.outstandingRequests=0,this.stageStatusMap=new Map,this.displayedIterator=new qj("displayed"),this.stages=e.stages,this.retrieveOptions=e.retrieveOptions,this.imageIds=t,this.listener=r}async loadImages(){let e=this.createStageRequests();for(let t of(this.outstandingRequests=e.length,e))this.addRequest(t);return 0===this.outstandingRequests?Promise.resolve(null):this.displayedIterator.getDonePromise()}sendRequest(e,t){let{imageId:r,next:n}=e,a=(t,a)=>{this.listener.errorCallback(r,s||!n,t),a&&this.updateStageStatus(e.stage,t)},i=(t.loader||qI)(r,t),o=qj.as(i),s=!1;return o.forEach(async(t,n)=>{let a=ql.getImageQuality(r);if(!t)return void console.warn("No image retrieved",r);let{imageQualityStatus:i}=t;(s||=i===Fx.FULL_RESOLUTION,void 0!==a&&a>i)?this.updateStageStatus(e.stage,null,!0):(this.listener.successCallback(r,t),this.displayedIterator.add(t),n&&this.updateStageStatus(e.stage),function(e,t,r){if(t?.nearbyRequests?.length)for(let n of t.nearbyRequests)try{let{itemId:t,imageQualityStatus:a}=n,i=ql.getImageQuality(t);if(void 0!==i&&i>=a)continue;let o={...r,imageId:t,imageQualityStatus:a};ql.setPartialImage(t,o),e.successCallback(t,o)}catch(e){console.warn("Couldn't fill nearby item ",n.itemId,e)}}(this.listener,e,t))},a).finally(()=>{if(!s&&n)ql.setPartialImage(r,void 0,!0),this.addRequest(n,t.streamingData);else{s||this.listener.errorCallback(r,!0,"Couldn't decode"),this.outstandingRequests--;for(let e=n;e;e=e.next)this.updateStageStatus(e.stage,null,!0)}this.outstandingRequests<=0&&this.displayedIterator.resolve()}),o.getDonePromise().catch(e=>null)}addRequest(e,t={}){let{imageId:r,stage:n}=e,a=this.listener.getLoaderImageOptions(r);if(!a)return;let{retrieveType:i="default"}=n,{retrieveOptions:o}=this,s=o[i]||o.default,l={...a,retrieveType:i,retrieveOptions:s,streamingData:t},u=n.priority??-5,d=n.requestType||NG.Interaction;qM.addRequest(this.sendRequest.bind(this,e,l),d,{imageId:r},u)}updateStageStatus(e,t,r=!1){let{id:n}=e,a=this.stageStatusMap.get(n);if(a&&(a.imageLoadPendingCount--,t?a.imageLoadFailedCount++:!r&&a.totalImageCount++,r||a.stageStartTime||(a.stageStartTime=Date.now()),!a.imageLoadPendingCount)){let{imageLoadFailedCount:e,totalImageCount:t,stageStartTime:r=Date.now(),startTime:i}=a,o={stageId:n,numberOfFailures:e,numberOfImages:t,stageDurationInMS:r?Date.now()-r:null,startDurationInMS:Date.now()-i};Bh(Bc,NH.IMAGE_RETRIEVAL_STAGE,o),this.stageStatusMap.delete(n)}}createStageRequests(){let e=[],t=new Map,r=(r,n)=>{let a=n<0?this.imageIds.length+n:n<1?Math.floor((this.imageIds.length-1)*n):n,i=this.imageIds[a];if(!i)throw Error(`No value found to add to requests at ${n}`);let o={imageId:i,stage:r,index:a,nearbyRequests:this.findNearbyRequests(a,r)};this.addStageStatus(r);let s=t.get(i);s?s.next=o:e.push(o),t.set(i,o)};for(let e of this.stages)(e.positions||function(e,t,r=0){let n=[];for(let a=r;a<e.length;a+=t)n.push(a);return n}(this.imageIds,e.decimate||1,e.offset??0)).forEach(t=>{r(e,t)});return e}findNearbyRequests(e,t){let r=[];if(!t.nearbyFrames)return r;for(let n of t.nearbyFrames){let t=e+n.offset;t<0||t>=this.imageIds.length||r.push({itemId:this.imageIds[t],imageQualityStatus:n.imageQualityStatus,index:t})}return r}addStageStatus(e){let{id:t}=e,r=this.stageStatusMap.get(t)||{stageId:t,startTime:Date.now(),stageStartTime:null,totalImageCount:0,imageLoadFailedCount:0,imageLoadPendingCount:0};return r.imageLoadPendingCount++,this.stageStatusMap.set(t,r),r}}function qz(e){return new qW(e)}function qH(e,t){let{hflip:r,vflip:n,rotation:a}=t;if(e.x*=r?-1:1,e.y*=n?-1:1,0!==a){let t=a*Math.PI/180,r=Math.cos(t),n=Math.sin(t),i=e.x*r-e.y*n,o=e.x*n+e.y*r;e.x=i,e.y=o}return e}function qG(e,t){let{direction:r,spacing:n}=e,a=r.slice(0,3),i=r.slice(3,6),o=r.slice(6,9),s=[Lv.vec3.dot(a,t),Lv.vec3.dot(i,t),Lv.vec3.dot(o,t)],l=Lv.vec3.create();return Lv.vec3.set(l,s[0]*n[0],s[1]*n[1],s[2]*n[2]),Lv.vec3.length(l)}let qq=F9.getLogger("utilities","getClosestImageId");function q$(e,t,r,n){let a,i,{direction:o,spacing:s,imageIds:l}=e,{ignoreSpacing:u=!1}=n||{};if(!l?.length)return;let d=o.slice(6,9);if(Math.abs(Lv.vec3.dot(d,r))<1-FP)return;u||(a=qG({direction:o,spacing:s},r)/2);let c=1/0;for(let e=0;e<l.length;e++){let n=l[e],o=HB(FC.IMAGE_PLANE,n);if(!o?.imagePositionPatient){qq.warn(`Missing imagePositionPatient for imageId: ${n}`);continue}let{imagePositionPatient:s}=o,d=Lv.vec3.create();Lv.vec3.sub(d,t,s);let h=Math.abs(Lv.vec3.dot(d,r));u?h<c&&(c=h,i=n):h<a&&h<c&&(c=h,i=n)}return void 0===i&&qq.warn("No imageId found within the specified criteria (half spacing or absolute closest)."),i}function qK(e,t,r,n){let a=Lv.vec3.clone(e);if(r&&Lv.vec3.negate(a,a),t){var i;let e,t,r=Lv.vec3.cross(Lv.vec3.create(),n,a);Lv.vec3.normalize(r,r),i=a,e=Lv.vec3.dot(i,r),t=Lv.vec3.scale(Lv.vec3.create(),r,2*e),a=Lv.vec3.sub(Lv.vec3.create(),i,t)}return a}function qY(){return BM?.rendering?.renderingEngineMode===Fk.ContextPool}var qZ={FLAT:0,GOURAUD:1,PHONG:2},qX={POINTS:0,WIREFRAME:1,SURFACE:2},qJ={Shading:qZ,Representation:qX,Interpolation:qZ},qQ={CLAMP_TO_EDGE:0,REPEAT:1,MIRRORED_REPEAT:2},q0={NEAREST:0,LINEAR:1,NEAREST_MIPMAP_NEAREST:2,NEAREST_MIPMAP_LINEAR:3,LINEAR_MIPMAP_NEAREST:4,LINEAR_MIPMAP_LINEAR:5},q1={Wrap:qQ,Filter:q0},q2=new Float32Array(1),q5=new Int32Array(q2.buffer),q3={fromHalf:function(e){let t=(32768&e)>>15,r=(31744&e)>>10,n=1023&e;return 0===r?(t?-1:1)*6103515625e-14*(n/1024):31===r?n?NaN:1/0*(t?-1:1):(t?-1:1)*2**(r-15)*(1+n/1024)},toHalf:function(e){q2[0]=e;let t=q5[0],r=t>>16&32768,n=t>>12&2047,a=t>>23&255;return a<103?r:a>142?(r|=31744,r|=+(255!==a)&&8388607&t):a<113?(n|=2048,r|=(n>>114-a)+(n>>113-a&1)):(r|=a-112<<10|n>>1,r+=1&n)}},{vtkErrorMacro:q4}=jS,q8={renderable:null,myFactory:null,children:[],visited:!1};function q6(e,t,r={}){let n;Object.assign(t,q8,r),jS.obj(e,t),jS.event(e,t,"event"),t._renderableChildMap=new Map,jS.get(e,t,["visited"]),jS.setGet(e,t,["_parent","renderable","myFactory"]),jS.getArray(e,t,["children"]),jS.moveToProtected(e,t,["parent"]),t.classHierarchy.push("vtkViewNode"),e.build=e=>{},e.render=e=>{},e.traverse=r=>{let n=e[r.getTraverseOperation()];if(n)return void n(r);e.apply(r,!0);for(let e=0;e<t.children.length;e++)t.children[e].traverse(r);e.apply(r,!1)},e.apply=(t,r)=>{let n=e[t.getOperation()];n&&n(r,t)},e.getViewNodeFor=(r,n=null)=>{if(n&&n.renderable===r)return n;if(t.renderable===r)return e;for(let e=0;e<t.children.length;++e){let n=t.children[e].getViewNodeFor(r);if(n)return n}},e.getFirstAncestorOfType=e=>t._parent?t._parent.isA(e)?t._parent:t._parent.getFirstAncestorOfType(e):null,e.getLastAncestorOfType=e=>{if(!t._parent)return null;let r=t._parent.getLastAncestorOfType(e);return r||(t._parent.isA(e)?t._parent:null)},e.addMissingNode=r=>{if(!r)return;let n=t._renderableChildMap.get(r);if(void 0!==n)return n.setVisited(!0),n;let a=e.createViewNode(r);if(a)return a.setParent(e),a.setVisited(!0),t._renderableChildMap.set(r,a),t.children.push(a),a},e.addMissingNodes=(r,n=!1)=>{let a;if(r&&r.length)for(let i=0;i<r.length;++i){let o=r[i],s=e.addMissingNode(o);n&&void 0!==s&&(void 0===a?a=t.children.lastIndexOf(s):t.children[a]!==s&&function(e,r){for(let n=0;n<t.children.length;++n){let a=(r+1+n)%t.children.length;if(t.children[a]===e)return t.children[a]=t.children[r],t.children[r]=e,!0}}(t.children,s),a++)}},e.addMissingChildren=r=>{if(r&&r.length)for(let n=0;n<r.length;++n){let a=r[n];if(-1===t.children.indexOf(a)){a.setParent(e),t.children.push(a);let r=a.getRenderable();r&&t._renderableChildMap.set(r,a)}a.setVisited(!0)}},e.removeNode=e=>{let r=t.children.findIndex(t=>t===e);if(r<0)return!1;let n=e.getRenderable();return n&&t._renderableChildMap.delete(n),e.delete(),t.children.splice(r,1),!0},e.prepareNodes=()=>{for(let e=0;e<t.children.length;++e)t.children[e].setVisited(!1)},e.setVisited=e=>{t.visited=e},e.removeUnusedNodes=()=>{let e=0;for(let r=0;r<t.children.length;++r){let n=t.children[r];if(n.getVisited())t.children[e++]=n,n.setVisited(!1);else{let e=n.getRenderable();e&&t._renderableChildMap.delete(e),n.delete()}}t.children.length=e},e.createViewNode=e=>{if(!t.myFactory)return q4("Cannot create view nodes without my own factory"),null;let r=t.myFactory.createNode(e);return r&&r.setRenderable(e),r},n=e.delete,e.delete=()=>{for(let e=0;e<t.children.length;e++)t.children[e].delete();n()}}var q9={newInstance:jS.newInstance(q6,"vtkViewNode"),extend:q6,PASS_TYPES:["Build","Render"]},{vtkWarningMacro:q7}=jS,$e={};function $t(e,t,r={}){Object.assign(t,$e,r),jS.obj(e,t),t.overrides||(t.overrides={}),t.classHierarchy.push("vtkViewNodeFactory"),e.createNode=r=>{if(r.isDeleted())return null;let n=function(e){let t=[],r=0,n=e.getClassName(r++);for(;n;)t.push(n),n=e.getClassName(r++);return t}(r),a=0,i=n[a++],o=!1,s=Object.keys(t.overrides);for(;i&&!o;)-1!==s.indexOf(i)?o=!0:i=r.getClassName(a++);if(!o){var l;let t;return n.includes("vtkAbstractWidget")||n.includes("vtkWidgetRepresentation")?null:(q7((l=e.getClassName(),t=n.join(" → "),`No ${l} implementation found for ${n[0]}.
38
38
  Class hierarchy: ${t}.
39
39
  A rendering Profile is likely missing for ${n[0]}.
40
40
  Try importing '@kitware/vtk.js/Rendering/Profiles/All' or 'vtk.js/Sources/Rendering/Profiles/All',
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ohif/ui",
3
- "version": "3.13.0-beta.127",
3
+ "version": "3.13.0-beta.129",
4
4
  "description": "A set of React components for Medical Imaging Viewers",
5
5
  "author": "OHIF Contributors",
6
6
  "license": "MIT",