diff --git a/rad/static/dv3d/index.js b/rad/static/dv3d/index.js index bd079867..27581538 100644 --- a/rad/static/dv3d/index.js +++ b/rad/static/dv3d/index.js @@ -4040,7 +4040,7 @@ fn main( ${o} ${r} `;return sF(c,e)}const X9=Symbol("ElementCursorsMap");function cF(t,e){b1(t)[0]=e,hm(t,e)}function hm(t,e){const r=b1(t);r[1]=r[0],r[0]=e,t.style.cursor=(e instanceof Go?e:Go.getDefinedCursor("auto")).getStyleProperty()}function Xt(t){hm(t,b1(t)[1])}function Ft(t){hm(t,Go.getDefinedCursor("none"))}function b1(t){let e=b1[X9];e instanceof WeakMap||(e=new WeakMap,Object.defineProperty(b1,X9,{value:e}));let r=e.get(t);return r||(r=[null,null],e.set(t,r)),r}const Zge=Object.freeze(Object.defineProperty({__proto__:null,hideElementCursor:Ft,initElementCursor:cF,resetElementCursor:Xt,setElementCursor:hm},Symbol.toStringTag,{value:"Module"}));function Qge(t,e){let r=Q0.getDefinedCursor(e,!0);r||(r=Go.getDefinedCursor(e)),r||(console.log(`Cursor ${e} is not defined either as SVG or as a standard cursor.`),r=Go.getDefinedCursor(e)),hm(t,r)}const epe=[...Bge,...kge],tpe=Object.freeze(Object.defineProperty({__proto__:null,CursorNames:epe,CursorSVG:Tw,ImageMouseCursor:E1,MouseCursor:Go,SVGMouseCursor:Q0,elementCursor:Zge,registerCursor:Fge,setCursorForElement:Qge},Symbol.toStringTag,{value:"Module"}));function fi(t){return He.toolGroups.find(e=>e.id===t)}const{Active:Dg,Passive:v3,Enabled:y3,Disabled:w3}=$n,npe=[{mouseButton:$c.Primary}];class EE{constructor(e){this.viewportsInfo=[],this.toolOptions={},this.currentActivePrimaryToolName=null,this.prevActivePrimaryToolName=null,this.restoreToolOptions={},this._toolInstances={},this.id=e}getViewportIds(){return this.viewportsInfo.map(({viewportId:e})=>e)}getViewportsInfo(){return this.viewportsInfo.slice()}getToolInstance(e){const r=this._toolInstances[e];if(!r){console.warn(`'${e}' is not registered with this toolGroup (${this.id}).`);return}return r}getToolInstances(){return this._toolInstances}hasTool(e){return!!this._toolInstances[e]}addTool(e,r={}){const n=He.tools[e],i=typeof e<"u"&&e!=="",o=this.toolOptions[e];if(!i){console.warn("Tool with configuration did not produce a toolName: ",r);return}if(!n){console.warn(`'${e}' is not registered with the library. You need to use cornerstoneTools.addTool to register it.`);return}if(o){console.warn(`'${e}' is already registered for ToolGroup ${this.id}.`);return}const{toolClass:a}=n,s={name:e,toolGroupId:this.id,configuration:r},c=new a(s);this._toolInstances[e]=c}addToolInstance(e,r,n={}){var o;let i=(o=He.tools[e])==null?void 0:o.toolClass;if(!i){const a=He.tools[r].toolClass;class s extends a{}s.toolName=e,i=s,He.tools[e]={toolClass:s}}this.addTool(i.toolName,n)}addViewport(e,r){if(typeof e!="string")throw new Error("viewportId must be defined and be a string");const n=this._findRenderingEngine(e,r);this.viewportsInfo.some(({viewportId:s})=>s===e)||this.viewportsInfo.push({viewportId:e,renderingEngineId:n});const i=this.getActivePrimaryMouseButtonTool();Dr.getRuntimeSettings().get("useCursors")&&this.setViewportsCursorByToolName(i);const a={toolGroupId:this.id,viewportId:e,renderingEngineId:n};it(Je,k.TOOLGROUP_VIEWPORT_ADDED,a)}removeViewports(e,r){const n=[];if(this.viewportsInfo.forEach((o,a)=>{let s=!1;o.renderingEngineId===e&&(s=!0,r&&o.viewportId!==r&&(s=!1)),s&&n.push(a)}),n.length)for(let o=n.length-1;o>=0;o--)this.viewportsInfo.splice(n[o],1);const i={toolGroupId:this.id,viewportId:r,renderingEngineId:e};it(Je,k.TOOLGROUP_VIEWPORT_REMOVED,i)}setActiveStrategy(e,r){const n=this._toolInstances[e];if(n===void 0){console.warn(`Tool ${e} not added to toolGroup, can't set tool configuration.`);return}n.setActiveStrategy(r)}setToolMode(e,r,n={}){if(!e){console.warn("setToolMode: toolName must be defined");return}if(r===$n.Active){this.setToolActive(e,n||this.restoreToolOptions[e]);return}if(r===$n.Passive){this.setToolPassive(e);return}if(r===$n.Enabled){this.setToolEnabled(e);return}if(r===$n.Disabled){this.setToolDisabled(e);return}console.warn("setToolMode: mode must be defined")}setToolActive(e,r={}){const n=this._toolInstances[e];if(n===void 0){console.warn(`Tool ${e} not added to toolGroup, can't set tool mode.`);return}if(!n){console.warn(`'${e}' instance ${n} is not registered with this toolGroup, can't set tool mode.`);return}const i=this.toolOptions[e]?this.toolOptions[e].bindings:[],o=r.bindings?r.bindings:[],s={bindings:[...i,...o].reduce((u,d)=>{const h=d.numTouchPoints!==void 0,g=d.mouseButton!==void 0;return!u.some(p=>x3(p,d))&&(h||g)&&u.push(d),u},[]),mode:Dg};this.toolOptions[e]=s,this._toolInstances[e].mode=Dg;const l=Dr.getRuntimeSettings().get("useCursors");if(this._hasMousePrimaryButtonBinding(r)&&l)this.setViewportsCursorByToolName(e);else if(!this.getActivePrimaryMouseButtonTool()&&l){const d=Go.getDefinedCursor("default");this._setCursorForViewports(d)}this._hasMousePrimaryButtonBinding(r)&&(this.prevActivePrimaryToolName===null?this.prevActivePrimaryToolName=e:this.prevActivePrimaryToolName=this.currentActivePrimaryToolName,this.currentActivePrimaryToolName=e),typeof n.onSetToolActive=="function"&&n.onSetToolActive(),this._renderViewports();const f={toolGroupId:this.id,toolName:e,toolBindingsOptions:r};it(Je,k.TOOL_ACTIVATED,f),this._triggerToolModeChangedEvent(e,Dg,r)}setToolPassive(e,r){const n=this._toolInstances[e];if(n===void 0){console.warn(`Tool ${e} not added to toolGroup, can't set tool mode.`);return}const i=this.getToolOptions(e),o=Object.assign({bindings:i?i.bindings:[]},i,{mode:v3}),a=Array.isArray(r==null?void 0:r.removeAllBindings)?r.removeAllBindings:this.getDefaultPrimaryBindings();o.bindings=o.bindings.filter(c=>(r==null?void 0:r.removeAllBindings)!==!0&&!a.some(l=>x3(c,l)));let s=v3;o.bindings.length!==0&&(s=Dg,o.mode=s),this.toolOptions[e]=o,n.mode=s,typeof n.onSetToolPassive=="function"&&n.onSetToolPassive(),this._renderViewports(),this._triggerToolModeChangedEvent(e,v3)}setToolEnabled(e){const r=this._toolInstances[e];if(r===void 0){console.warn(`Tool ${e} not added to toolGroup, can't set tool mode.`);return}const n={bindings:[],mode:y3};this.toolOptions[e]=n,r.mode=y3,typeof r.onSetToolEnabled=="function"&&r.onSetToolEnabled(),this._renderViewports(),this._triggerToolModeChangedEvent(e,y3)}setToolDisabled(e){const r=this._toolInstances[e];if(r===void 0){console.warn(`Tool ${e} not added to toolGroup, can't set tool mode.`);return}const n={bindings:[],mode:w3};this.restoreToolOptions[e]=this.toolOptions[e],this.toolOptions[e]=n,r.mode=w3,typeof r.onSetToolDisabled=="function"&&r.onSetToolDisabled(),this._renderViewports(),this._triggerToolModeChangedEvent(e,w3)}getToolOptions(e){const r=this.toolOptions[e];if(r!==void 0)return r}getActivePrimaryMouseButtonTool(){return Object.keys(this.toolOptions).find(e=>{const r=this.toolOptions[e];return r.mode===Dg&&this._hasMousePrimaryButtonBinding(r)})}setViewportsCursorByToolName(e,r){const n=this._getCursor(e,r);this._setCursorForViewports(n)}_getCursor(e,r){let n,i;return r&&(n=`${e}.${r}`,i=Q0.getDefinedCursor(n,!0),i)||(n=`${e}`,i=Q0.getDefinedCursor(n,!0),i)||(n=e,i=Q0.getDefinedCursor(n,!0),i)?i:Go.getDefinedCursor("default")}_setCursorForViewports(e){this.viewportsInfo.forEach(({renderingEngineId:r,viewportId:n})=>{const i=Ii(n,r);if(!i)return;const{viewport:o}=i;cF(o.element,e)})}setToolConfiguration(e,r,n){const i=this._toolInstances[e];if(i===void 0)return console.warn(`Tool ${e} not present, can't set tool configuration.`),!1;let o;return n?o=r:o=Object.assign(i.configuration,r),i.configuration=o,typeof i.onSetToolConfiguration=="function"&&i.onSetToolConfiguration(),this._renderViewports(),!0}getDefaultMousePrimary(){return $c.Primary}getDefaultPrimaryBindings(){return npe}getToolConfiguration(e,r){if(this._toolInstances[e]===void 0){console.warn(`Tool ${e} not present, can't set tool configuration.`);return}const n=Nge(this._toolInstances[e].configuration,r)||this._toolInstances[e].configuration;return ys(n)}getPrevActivePrimaryToolName(){return this.prevActivePrimaryToolName}setActivePrimaryTool(e){const r=this.getCurrentActivePrimaryToolName();this.setToolDisabled(r),this.setToolActive(e,{bindings:[{mouseButton:$c.Primary}]})}getCurrentActivePrimaryToolName(){return this.currentActivePrimaryToolName}clone(e,r=null){let n=fi(e);return n?(console.debug(`ToolGroup ${e} already exists`),n):(n=new EE(e),He.toolGroups.push(n),r=r??(()=>!0),Object.keys(this._toolInstances).filter(r).forEach(i=>{const o=this._toolInstances[i],a=this.toolOptions[i],s=o.mode;n.addTool(i),n.setToolMode(i,s,{bindings:a.bindings??[]})}),n)}_hasMousePrimaryButtonBinding(e){var n;const r=this.getDefaultPrimaryBindings();return(n=e==null?void 0:e.bindings)==null?void 0:n.some(i=>r.some(o=>x3(i,o)))}_renderViewports(){this.viewportsInfo.forEach(({renderingEngineId:e,viewportId:r})=>{ni(e).renderViewport(r)})}_triggerToolModeChangedEvent(e,r,n){const i={toolGroupId:this.id,toolName:e,mode:r,toolBindingsOptions:n};it(Je,k.TOOL_MODE_CHANGED,i)}_findRenderingEngine(e,r){const n=Ho();if((n==null?void 0:n.length)===0)throw new Error("No rendering engines found.");if(r)return r;const i=n.filter(o=>o.getViewport(e));if(i.length===0){if(n.length===1)return n[0].id;throw new Error("No rendering engines found that contain the viewport with the same viewportId, you must specify a renderingEngineId.")}if(i.length>1)throw new Error("Multiple rendering engines found that contain the viewport with the same viewportId, you must specify a renderingEngineId.");return i[0].id}}function x3(t,e){return t.mouseButton!==e.mouseButton||t.numTouchPoints!==e.numTouchPoints?!1:t.modifierKey===e.modifierKey}function lF(t){if(He.toolGroups.some(n=>n.id===t)){console.warn(`'${t}' already exists.`);return}const r=new EE(t);return He.toolGroups.push(r),r}function uF(t){const e=He.toolGroups.findIndex(r=>r.id===t);e>-1&&He.toolGroups.splice(e,1)}function fF(){const t=[...He.toolGroups];for(const e of t)uF(e.id);He.toolGroups=[]}function Fr(t,e){var n;e||(e=(n=Ho().find(i=>i.getViewports().find(o=>o.id===t)))==null?void 0:n.id);const r=He.toolGroups.filter(i=>i.viewportsInfo.some(o=>o.renderingEngineId===e&&(!o.viewportId||o.viewportId===t)));if(r.length){if(r.length>1)throw new Error(`Multiple tool groups found for renderingEngineId: ${e} and viewportId: ${t}. You should only - have one tool group per viewport in a renderingEngine.`);return r[0]}}function rpe(){return He.toolGroups}const ipe=[$n.Active,$n.Passive,$n.Enabled];function dF(t){return He.toolGroups.filter(({toolOptions:e})=>{const r=Object.keys(e);for(let n=0;n{a.viewportsInfo.forEach(s=>{const{renderingEngineId:c,viewportId:l}=s,{FrameOfReferenceUID:f}=Ii(l,c);t.metadata.FrameOfReferenceUID===f&&n.push(s)})});const i=k.ANNOTATION_ADDED,o={annotation:t};if(!n.length){it(Je,i,o);return}n.forEach(({renderingEngineId:a,viewportId:s})=>{o.viewportId=s,o.renderingEngineId=a,it(Je,i,o)})}function _w(t){const e=k.ANNOTATION_REMOVED;it(Je,e,t)}function cn(t,e,r=Zt.HandlesUpdated){const n=e&&Se(e),{viewportId:i,renderingEngineId:o}=n||{},a=k.ANNOTATION_MODIFIED;it(Je,a,{annotation:t,viewportId:i,renderingEngineId:o,changeType:r})}function jn(t){mF({annotation:t})}function Ew(t,e=!1){mF({annotation:t,contourHoleProcessingEnabled:e})}function mF(t){const e=k.ANNOTATION_COMPLETED;it(Je,e,t)}const ope=Object.freeze(Object.defineProperty({__proto__:null,triggerAnnotationAddedForElement:gF,triggerAnnotationAddedForFOR:pF,triggerAnnotationCompleted:jn,triggerAnnotationModified:cn,triggerAnnotationRemoved:_w,triggerContourAnnotationCompleted:Ew},Symbol.toStringTag,{value:"Module"}));let vF;function uc(){return vF}function bE(t){vF=t}function pn(t,e){const r=uc(),n=r.getGroupKey(e);return r.getAnnotations(n,t)}function ri(t){return uc().getAnnotation(t)}function gm(){return uc().getAllAnnotations()}function bw(t){const{annotationUID:e,parentAnnotationUID:r}=t;if(!r)return;const n=ri(r),i=n.childAnnotationUIDs.indexOf(e);n.childAnnotationUIDs.splice(i,1),t.parentAnnotationUID=void 0}function pm(t,e){const{annotationUID:r}=t,{annotationUID:n}=e;bw(e),t.childAnnotationUIDs||(t.childAnnotationUIDs=[]),!t.childAnnotationUIDs.includes(n)&&(t.childAnnotationUIDs.push(n),e.parentAnnotationUID=r)}function yF(t){return t.parentAnnotationUID?ri(t.parentAnnotationUID):void 0}function mm(t){var e;return((e=t.childAnnotationUIDs)==null?void 0:e.map(r=>ri(r)))??[]}function ln(t,e){t.annotationUID||(t.annotationUID=kn());const r=uc();if(e instanceof HTMLDivElement){const n=r.getGroupKey(e);r.addAnnotation(t,n),gF(t,e)}else r.addAnnotation(t,void 0),pF(t);return t.annotationUID}function ape(t,e){const r=uc(),n=r.getGroupKey(e);return r.getNumberOfAnnotations(n,t)}function yn(t){var n;if(!t)return;const e=uc(),r=e.getAnnotation(t);r&&((n=r.childAnnotationUIDs)==null||n.forEach(i=>yn(i)),e.removeAnnotation(t),_w({annotation:r,annotationManagerUID:e.uid}))}function spe(){const t=uc(),e=t.removeAllAnnotations();for(const r of e)_w({annotation:r,annotationManagerUID:t.uid})}function cpe(t,e){const r=uc(),n=r.getGroupKey(e),i=r.removeAnnotations(n,t);for(const o of i)_w({annotation:o,annotationManagerUID:r.uid})}function wF(t){let e=t;for(;e;)e.invalidated=!0,e=e.parentAnnotationUID?ri(e.parentAnnotationUID):void 0}const lpe=Object.freeze(Object.defineProperty({__proto__:null,addAnnotation:ln,addChildAnnotation:pm,clearParentAnnotation:bw,getAllAnnotations:gm,getAnnotation:ri,getAnnotationManager:uc,getAnnotations:pn,getChildAnnotations:mm,getNumberOfAnnotations:ape,getParentAnnotation:yF,invalidateAnnotation:wF,removeAllAnnotations:spe,removeAnnotation:yn,removeAnnotations:cpe,setAnnotationManager:bE},Symbol.toStringTag,{value:"Module"}));function Ui(t){const e=t.toolName;if(!e)throw new Error(`No Tool Found for the ToolClass ${t.name}`);He.tools[e]||(He.tools[e]={toolClass:t})}function upe(t){const e=t.toolName;return!!(e&&He.tools[e])}function Dw(t){return!!(t&&He.tools[t])}function xF(t){const e=t.toolName;if(!e)throw new Error(`No tool found for: ${t.name}`);if(!He.tools[e]!==void 0)delete He.tools[e];else throw new Error(`${e} cannot be removed because it has not been added`)}function Bd(t,e){const r=e||t.currentTarget,{viewport:n}=Se(r)||{};if(!n)return;const i=hpe(t),o=dpe(t),a=fpe(r,o),s=n.canvasToWorld(a);return{page:o,client:i,canvas:a,world:s}}function fpe(t,e){const r=t.getBoundingClientRect();return[e[0]-r.left-window.pageXOffset,e[1]-r.top-window.pageYOffset]}function dpe(t){return[t.pageX,t.pageY]}function hpe(t){return[t.clientX,t.clientY]}function CF(t){const e=t.currentTarget,{viewportId:r,renderingEngineId:n}=Se(e),i=Bd(t,e),o={page:[0,0],client:[0,0],canvas:[0,0],world:[0,0,0]},a={event:t,eventName:k.MOUSE_DOUBLE_CLICK,viewportId:r,renderingEngineId:n,camera:{},element:e,startPoints:i,lastPoints:i,currentPoints:i,deltaPoints:o};!it(e,k.MOUSE_DOUBLE_CLICK,a)&&(t.stopImmediatePropagation(),t.preventDefault())}const Y9=k.MOUSE_MOVE;function vm(t){const e=t.currentTarget,r=Se(e);if(!r)return;const{renderingEngineId:n,viewportId:i}=r,o=Bd(t);!it(e,Y9,{renderingEngineId:n,viewportId:i,camera:{},element:e,currentPoints:o,eventName:Y9,event:t})&&(t.stopImmediatePropagation(),t.preventDefault())}const{MOUSE_DOWN:J9,MOUSE_DOWN_ACTIVATE:gpe,MOUSE_CLICK:ppe,MOUSE_UP:mpe,MOUSE_DRAG:Z9}=k,vpe=400,ype=150,wpe=3,xpe={mouseButton:void 0,element:null,renderingEngineId:void 0,viewportId:void 0,isClickEvent:!0,clickDelay:200,preventClickTimeout:null,startPoints:{page:[0,0],client:[0,0],canvas:[0,0],world:[0,0,0]},lastPoints:{page:[0,0],client:[0,0],canvas:[0,0],world:[0,0,0]}};let on={mouseButton:void 0,renderingEngineId:void 0,viewportId:void 0,isClickEvent:!0,clickDelay:200,element:null,preventClickTimeout:null,startPoints:{page:[0,0],client:[0,0],canvas:[0,0],world:[0,0,0]},lastPoints:{page:[0,0],client:[0,0],canvas:[0,0],world:[0,0,0]}};const Bi={doubleClickTimeout:null,mouseDownEvent:null,mouseUpEvent:null,ignoreDoubleClick:!1};function SF(t){if(Bi.doubleClickTimeout){if(t.buttons===Bi.mouseDownEvent.buttons)return;Bi.mouseDownEvent=t,Zy();return}Bi.doubleClickTimeout=setTimeout(Zy,t.buttons===1?vpe:ype),Bi.mouseDownEvent=t,Bi.ignoreDoubleClick=!1,on.element=t.currentTarget,on.mouseButton=t.buttons;const e=Se(on.element),{renderingEngineId:r,viewportId:n}=e;on.renderingEngineId=r,on.viewportId=n,on.preventClickTimeout=setTimeout(Spe,on.clickDelay),on.element.removeEventListener("mousemove",vm);const i=Bd(t,on.element);on.startPoints=zu(i),on.lastPoints=zu(i),document.addEventListener("mouseup",DE),document.addEventListener("mousemove",TF)}function Cpe(t){const e=Iw(on.startPoints,on.startPoints),r={event:t,eventName:J9,element:on.element,mouseButton:on.mouseButton,renderingEngineId:on.renderingEngineId,viewportId:on.viewportId,camera:{},startPoints:on.startPoints,lastPoints:on.startPoints,currentPoints:on.startPoints,deltaPoints:e};on.lastPoints=zu(r.lastPoints),it(r.element,J9,r)&&it(r.element,gpe,r)}function TF(t){const e=Se(on.element);if(!(e!=null&&e.viewport))return;const r=Bd(t,on.element),n=DF(on.element,on.lastPoints),i=Iw(r,n);if(Bi.doubleClickTimeout)if(EF(i.canvas))Zy();else return;const o={event:t,eventName:Z9,mouseButton:on.mouseButton,renderingEngineId:on.renderingEngineId,viewportId:on.viewportId,camera:{},element:on.element,startPoints:zu(on.startPoints),lastPoints:zu(n),currentPoints:r,deltaPoints:i};!it(on.element,Z9,o)&&(t.stopImmediatePropagation(),t.preventDefault()),on.lastPoints=zu(r)}function DE(t){if(clearTimeout(on.preventClickTimeout),Bi.doubleClickTimeout)Bi.mouseUpEvent?kS():(Bi.mouseUpEvent=t,on.element.addEventListener("mousemove",_F));else{const e=on.isClickEvent?ppe:mpe,r=Bd(t,on.element),n=Iw(r,on.lastPoints),i={event:t,eventName:e,mouseButton:on.mouseButton,element:on.element,renderingEngineId:on.renderingEngineId,viewportId:on.viewportId,camera:{},startPoints:zu(on.startPoints),lastPoints:zu(on.lastPoints),currentPoints:r,deltaPoints:n};it(i.element,e,i),kS()}document.removeEventListener("mousemove",TF)}function _F(t){const e=Bd(t,on.element),r=DF(on.element,on.lastPoints),n=Iw(e,r);EF(n.canvas)&&(Zy(),vm(t))}function EF(t){return Math.abs(t[0])+Math.abs(t[1])>wpe}function Spe(){on.isClickEvent=!1}function Zy(){Bi.ignoreDoubleClick=!0;const t=Bi.mouseDownEvent,e=Bi.mouseUpEvent;bF(),Cpe(t),e&&DE(e)}function bF(){Bi.doubleClickTimeout&&(clearTimeout(Bi.doubleClickTimeout),Bi.doubleClickTimeout=null),Bi.mouseDownEvent=null,Bi.mouseUpEvent=null}function kS(){var t,e;document.removeEventListener("mouseup",DE),(t=on.element)==null||t.removeEventListener("mousemove",_F),(e=on.element)==null||e.addEventListener("mousemove",vm),bF(),on=JSON.parse(JSON.stringify(xpe))}function zu(t){return JSON.parse(JSON.stringify(t))}function DF(t,e){const{viewport:r}=Se(t)||{};if(!r)return e;const n=r.canvasToWorld(e.canvas);return{page:e.page,client:e.client,canvas:e.canvas,world:n}}function Iw(t,e){return!t||!e?{page:[0,0],client:[0,0],canvas:[0,0],world:[0,0,0]}:{page:C3(t.page,e.page),client:C3(t.client,e.client),canvas:C3(t.canvas,e.canvas),world:Tpe(t.world,e.world)}}function C3(t,e){return[t[0]-e[0],t[1]-e[1]]}function Tpe(t,e){return[t[0]-e[0],t[1]-e[1],t[2]-e[2]]}function _pe(){return on.mouseButton}function IF(t){Bi.ignoreDoubleClick?(Bi.ignoreDoubleClick=!1,t.stopImmediatePropagation(),t.preventDefault()):kS()}function OF(t){t.removeEventListener("dblclick",CF),t.removeEventListener("mousedown",SF),t.removeEventListener("mousemove",vm),t.removeEventListener("dblclick",IF,{capture:!0})}function Epe(t){OF(t),t.addEventListener("dblclick",CF),t.addEventListener("mousedown",SF),t.addEventListener("mousemove",vm),t.addEventListener("dblclick",IF,{capture:!0})}const MF={enable:Epe,disable:OF},bpe=2e3,Eh={mouse:0,touch:1};let Q9,eI;function PF(t,e){const r=Date.now();if(t!==Q9){if(r-eI<=bpe)return e.preventDefault(),e.stopPropagation(),e.stopImmediatePropagation(),!1;Q9=t}eI=r}const RF=PF.bind(null,Eh.mouse),LF=PF.bind(null,Eh.touch);function tI(t,e,r){const n=r?RF:LF;e.forEach(function(i){t.addEventListener(i,n,{passive:!1})})}function nI(t,e,r){const n=r?RF:LF;e.forEach(function(i){t.removeEventListener(i,n)})}const AF=["mousedown","mouseup","mousemove"],NF=["touchstart","touchend"];function kF(t){nI(t,AF,Eh.mouse),nI(t,NF,Eh.touch)}function Dpe(t){kF(t),tI(t,AF,Eh.mouse),tI(t,NF,Eh.touch)}const VF={enable:Dpe,disable:kF};function Ow(t,e){const r=e||t.currentTarget,n=t.type==="touchend"?t.changedTouches:t.touches;return Object.keys(n).map(i=>{const o=Mpe(n[i]),a=Ope(n[i]),s=Ipe(r,a),{viewport:c}=Se(r),l=c.canvasToWorld(s);return{page:a,client:o,canvas:s,world:l,touch:{identifier:i,radiusX:n[i].radiusX,radiusY:n[i].radiusY,force:n[i].force,rotationAngle:n[i].rotationAngle}}})}function Ipe(t,e){const r=t.getBoundingClientRect();return[e[0]-r.left-window.pageXOffset,e[1]-r.top-window.pageYOffset]}function Ope(t){return[t.pageX,t.pageY]}function Mpe(t){return[t.clientX,t.clientY]}function Qy(t,e){const r=D1(t),n=D1(e);return{page:S3(r.page,n.page),client:S3(r.client,n.client),canvas:S3(r.canvas,n.canvas),world:Rpe(r.world,n.world)}}function IE(t,e){const r=D1(t),n=D1(e);return{page:eh(r.page,n.page),client:eh(r.client,n.client),canvas:eh(r.canvas,n.canvas),world:FF(r.world,n.world)}}function Ppe(t,e){}function e5(t,e){const r=rI(t),n=rI(e);return{page:r.page-n.page,client:r.client-n.client,canvas:r.canvas-n.canvas,world:r.world-n.world}}function kc(t){return JSON.parse(JSON.stringify(t))}function VS(t){return JSON.parse(JSON.stringify(t))}function D1(t){return t.reduce((e,r)=>({page:[e.page[0]+r.page[0]/t.length,e.page[1]+r.page[1]/t.length],client:[e.client[0]+r.client[0]/t.length,e.client[1]+r.client[1]/t.length],canvas:[e.canvas[0]+r.canvas[0]/t.length,e.canvas[1]+r.canvas[1]/t.length],world:[e.world[0]+r.world[0]/t.length,e.world[1]+r.world[1]/t.length,e.world[2]+r.world[2]/t.length]}),{page:[0,0],client:[0,0],canvas:[0,0],world:[0,0,0]})}function nc(t){return t.reduce((e,r)=>({page:[e.page[0]+r.page[0]/t.length,e.page[1]+r.page[1]/t.length],client:[e.client[0]+r.client[0]/t.length,e.client[1]+r.client[1]/t.length],canvas:[e.canvas[0]+r.canvas[0]/t.length,e.canvas[1]+r.canvas[1]/t.length],world:[e.world[0]+r.world[0]/t.length,e.world[1]+r.world[1]/t.length,e.world[2]+r.world[2]/t.length],touch:{identifier:null,radiusX:e.touch.radiusX+r.touch.radiusX/t.length,radiusY:e.touch.radiusY+r.touch.radiusY/t.length,force:e.touch.force+r.touch.force/t.length,rotationAngle:e.touch.rotationAngle+r.touch.rotationAngle/t.length}}),{page:[0,0],client:[0,0],canvas:[0,0],world:[0,0,0],touch:{identifier:null,radiusX:0,radiusY:0,force:0,rotationAngle:0}})}function S3(t,e){return[t[0]-e[0],t[1]-e[1]]}function Rpe(t,e){return[t[0]-e[0],t[1]-e[1],t[2]-e[2]]}function rI(t){const e=[];for(let r=0;r({page:r.page+n.page/e.length,client:r.client+n.client/e.length,canvas:r.canvas+n.canvas/e.length,world:r.world+n.world/e.length}),{page:0,client:0,canvas:0,world:0})}function eh(t,e){return Math.sqrt(Math.pow(t[0]-e[0],2)+Math.pow(t[1]-e[1],2))}function FF(t,e){return Math.sqrt(Math.pow(t[0]-e[0],2)+Math.pow(t[1]-e[1],2)+Math.pow(t[2]-e[2],2))}const Lpe=Object.freeze(Object.defineProperty({__proto__:null,copyPoints:VS,copyPointsList:kc,getDeltaDistance:IE,getDeltaDistanceBetweenIPoints:e5,getDeltaPoints:Qy,getDeltaRotation:Ppe,getMeanPoints:D1,getMeanTouchPoints:nc},Symbol.toStringTag,{value:"Module"}));Dr.getRuntimeSettings();const{TOUCH_START:iI,TOUCH_START_ACTIVATE:Ape,TOUCH_PRESS:oI,TOUCH_DRAG:aI,TOUCH_END:sI,TOUCH_TAP:cI,TOUCH_SWIPE:T3}=k,I1={page:[0,0],client:[0,0],canvas:[0,0],world:[0,0,0]},t5={page:0,client:0,canvas:0,world:0},UF={renderingEngineId:void 0,viewportId:void 0,element:null,startPointsList:[{...I1,touch:null}],lastPointsList:[{...I1,touch:null}],isTouchStart:!1,startTime:null,pressTimeout:null,pressDelay:700,pressMaxDistance:5,accumulatedDistance:t5,swipeDistanceThreshold:48,swiped:!1,swipeToleranceMs:300},BF={renderingEngineId:void 0,viewportId:void 0,element:null,startPointsList:[{...I1,touch:null}],taps:0,tapTimeout:null,tapMaxDistance:24,tapToleranceMs:300};let kt=JSON.parse(JSON.stringify(UF)),yi=JSON.parse(JSON.stringify(BF));function Qu(t,e,r){return it(t,e,r)}function GF(t){kt.element=t.currentTarget;const e=Se(kt.element),{renderingEngineId:r,viewportId:n}=e;kt.renderingEngineId=r,kt.viewportId=n,!kt.isTouchStart&&(clearTimeout(kt.pressTimeout),kt.pressTimeout=setTimeout(()=>Npe(t),kt.pressDelay),kpe(t),document.addEventListener("touchmove",WF),document.addEventListener("touchend",zF))}function Npe(t){if(kt.accumulatedDistance.canvas>kt.pressMaxDistance)return;const r={event:t,eventName:oI,renderingEngineId:kt.renderingEngineId,viewportId:kt.viewportId,camera:{},element:kt.element,startPointsList:kc(kt.startPointsList),lastPointsList:kc(kt.lastPointsList),startPoints:VS(nc(kt.startPointsList)),lastPoints:VS(nc(kt.lastPointsList))};Qu(r.element,oI,r)}function kpe(t){kt.isTouchStart=!0,kt.startTime=new Date;const e=Ow(t,kt.element),r=nc(e),n=I1,i=t5,o={event:t,eventName:iI,element:kt.element,renderingEngineId:kt.renderingEngineId,viewportId:kt.viewportId,camera:{},startPointsList:e,lastPointsList:e,currentPointsList:e,startPoints:r,lastPoints:r,currentPoints:r,deltaPoints:n,deltaDistance:i};kt.startPointsList=kc(o.startPointsList),kt.lastPointsList=kc(o.lastPointsList),Qu(o.element,iI,o)&&Qu(o.element,Ape,o)}function WF(t){const e=Ow(t,kt.element),r=$F(kt.element,kt.lastPointsList),n=e.length===r.length?Qy(e,r):I1,i=e.length===r.length?e5(e,r):t5,o=e.length===r.length?IE(e,kt.lastPointsList):t5;kt.accumulatedDistance={page:kt.accumulatedDistance.page+o.page,client:kt.accumulatedDistance.client+o.client,canvas:kt.accumulatedDistance.canvas+o.canvas,world:kt.accumulatedDistance.world+o.world};const a={event:t,eventName:aI,renderingEngineId:kt.renderingEngineId,viewportId:kt.viewportId,camera:{},element:kt.element,startPoints:nc(kt.startPointsList),lastPoints:nc(r),currentPoints:nc(e),startPointsList:kc(kt.startPointsList),lastPointsList:kc(r),currentPointsList:e,deltaPoints:n,deltaDistance:i};Qu(kt.element,aI,a),Fpe(t,n),kt.lastPointsList=kc(e)}function zF(t){clearTimeout(kt.pressTimeout);const e=Ow(t,kt.element),r=$F(kt.element,kt.lastPointsList),n=e.length===r.length?Qy(e,r):Qy(e,e),i=e.length===r.length?e5(e,r):e5(e,e),o={event:t,eventName:sI,element:kt.element,renderingEngineId:kt.renderingEngineId,viewportId:kt.viewportId,camera:{},startPointsList:kc(kt.startPointsList),lastPointsList:kc(r),currentPointsList:e,startPoints:nc(kt.startPointsList),lastPoints:nc(r),currentPoints:nc(e),deltaPoints:n,deltaDistance:i};Qu(o.element,sI,o),Vpe(t),kt=JSON.parse(JSON.stringify(UF)),document.removeEventListener("touchmove",WF),document.removeEventListener("touchend",zF)}function Vpe(t){const e=new Date().getTime(),r=kt.startTime.getTime();if(e-r>yi.tapToleranceMs||(yi.taps===0&&(yi.element=kt.element,yi.renderingEngineId=kt.renderingEngineId,yi.viewportId=kt.viewportId,yi.startPointsList=kt.startPointsList),yi.taps>0&&!(yi.element==kt.element&&yi.renderingEngineId==kt.renderingEngineId&&yi.viewportId==kt.viewportId)))return;const n=Ow(t,yi.element);IE(n,yi.startPointsList).canvas>yi.tapMaxDistance||(clearTimeout(yi.tapTimeout),yi.taps+=1,yi.tapTimeout=setTimeout(()=>{const o={event:t,eventName:cI,element:yi.element,renderingEngineId:yi.renderingEngineId,viewportId:yi.viewportId,camera:{},currentPointsList:n,currentPoints:nc(n),taps:yi.taps};Qu(o.element,cI,o),yi=JSON.parse(JSON.stringify(BF))},yi.tapToleranceMs))}function Fpe(t,e){const r=new Date().getTime(),n=kt.startTime.getTime();if(kt.swiped||r-n>kt.swipeToleranceMs)return;const[i,o]=e.canvas,a={event:t,eventName:T3,renderingEngineId:kt.renderingEngineId,viewportId:kt.viewportId,camera:{},element:kt.element,swipe:null};Math.abs(i)>kt.swipeDistanceThreshold&&(a.swipe=i>0?rd.RIGHT:rd.LEFT,Qu(a.element,T3,a),kt.swiped=!0),Math.abs(o)>kt.swipeDistanceThreshold&&(a.swipe=o>0?rd.DOWN:rd.UP,Qu(a.element,T3,a),kt.swiped=!0)}function $F(t,e){const{viewport:r}=Se(t);return e.map(n=>{const i=r.canvasToWorld(n.canvas);return{page:n.page,client:n.client,canvas:n.canvas,world:i,touch:n.touch}})}function jF(t){VF.disable(t),t.removeEventListener("touchstart",GF)}function Upe(t){jF(t),VF.enable(t),t.addEventListener("touchstart",GF,{passive:!1})}const HF={enable:Upe,disable:jF},lI=10,uI=40,fI=800;function Bpe(t){let e=0,r=0,n=0,i=0;return"detail"in t&&(r=t.detail),"wheelDelta"in t&&(r=-t.wheelDelta/120),"wheelDeltaY"in t&&(r=-t.wheelDeltaY/120),"wheelDeltaX"in t&&(e=-t.wheelDeltaX/120),n=e*lI,i=r*lI,"deltaY"in t&&(i=t.deltaY),"deltaX"in t&&(n=t.deltaX),(n||i)&&t.deltaMode&&(t.deltaMode===1?(n*=uI,i*=uI):(n*=fI,i*=fI)),n&&!e&&(e=n<1?-1:1),i&&!r&&(r=i<1?-1:1),{spinX:e,spinY:r,pixelX:n,pixelY:i}}function KF(t){const e=t.currentTarget,r=Se(e),{renderingEngineId:n,viewportId:i}=r;if(t.deltaY>-1&&t.deltaY<1)return;t.preventDefault();const{spinX:o,spinY:a,pixelX:s,pixelY:c}=Bpe(t),l=a<0?-1:1,f={event:t,eventName:k.MOUSE_WHEEL,renderingEngineId:n,viewportId:i,element:e,camera:{},detail:t,wheel:{spinX:o,spinY:a,pixelX:s,pixelY:c,direction:l},points:Bd(t)};it(e,k.MOUSE_WHEEL,f)}function Gpe(t){qF(t),t.addEventListener("wheel",KF,{passive:!1})}function qF(t){t.removeEventListener("wheel",KF)}const XF={enable:Gpe,disable:qF},Wpe={renderingEngineId:void 0,viewportId:void 0,key:void 0,keyCode:void 0,element:null};let Ei={renderingEngineId:void 0,viewportId:void 0,key:void 0,keyCode:void 0,element:null};function Mw(t){Ei.element=t.currentTarget;const e=Se(Ei.element),{renderingEngineId:r,viewportId:n}=e;Ei.renderingEngineId=r,Ei.viewportId=n,Ei.key=t.key,Ei.keyCode=t.keyCode,t.preventDefault();const i={renderingEngineId:Ei.renderingEngineId,viewportId:Ei.viewportId,element:Ei.element,key:Ei.key,keyCode:Ei.keyCode};it(i.element,k.KEY_DOWN,i),document.addEventListener("keyup",YF),document.addEventListener("visibilitychange",OE),Ei.element.removeEventListener("keydown",Mw)}function OE(){document.removeEventListener("visibilitychange",OE),document.visibilityState==="hidden"&&JF()}function YF(t){const e={renderingEngineId:Ei.renderingEngineId,viewportId:Ei.viewportId,element:Ei.element,key:Ei.key,keyCode:Ei.keyCode};document.removeEventListener("keyup",YF),document.removeEventListener("visibilitychange",OE),Ei.element.addEventListener("keydown",Mw),Ei=structuredClone(Wpe),it(e.element,k.KEY_UP,e)}function zpe(){return Ei.keyCode}function JF(){Ei.keyCode=void 0}function $pe(t){ZF(t),t.addEventListener("keydown",Mw)}function ZF(t){t.removeEventListener("keydown",Mw)}const Kh={enable:$pe,disable:ZF,getModifierKey:zpe},{EPSILON:e0}=df;function QF(t,e,r=!1){var f;let n=1/0,i=r?-1/0:0,o=1/0,a=r?-1/0:0,s=1/0,c=r?-1/0:0;const l=((f=t[0])==null?void 0:f.length)===3;for(let u=0;uJSON.stringify(t)===JSON.stringify(e);function ME(t,e,r,n){const i=r[0]/2,o=r[1]/2,a=r[2]/2,s=new Array(8);s[0]=ei(t,[n[0]-i,n[1]-o,n[2]-a]);const c=[[1,-1,-1],[-1,1,-1],[1,1,-1],[-1,-1,1],[1,-1,1],[-1,1,1],[1,1,1]];for(let l=0;l<7;l++){const[f,u,d]=c[l];s[l+1]=ei(t,[n[0]+f*i,n[1]+u*o,n[2]+d*a])}return ef(s,e)}function tU(t,e){const{spacing:r}=t,n=t.voxelManager.getScalarDataLength(),i=[];let o=0;for(let a=0;a{const e=PE.get(t);e&&(e.isDirty=!0)},Kpe=t=>{const e=PE.get(t);return e&&!e.isDirty?e.indices:null},qpe=(t,e)=>{PE.set(t,{indices:e,isDirty:!1})};function bo(t,e,r){const n={segmentationId:t,modifiedSlicesToUse:e,segmentIndex:r};Hpe(t),it(Je,k.SEGMENTATION_DATA_MODIFIED,n)}function ns(t){const e={segmentationId:t};it(Je,k.SEGMENTATION_MODIFIED,e)}function RE(t){const e={segmentationId:t};it(Je,k.SEGMENTATION_REMOVED,e)}function bc(t,e,r){const n={segmentationId:e,type:r,viewportId:t};it(Je,k.SEGMENTATION_REPRESENTATION_MODIFIED,n)}function FS(t,e,r){const n={viewportId:t,segmentationId:e,type:r};it(Je,k.SEGMENTATION_REPRESENTATION_REMOVED,n)}const Xpe=Object.freeze(Object.defineProperty({__proto__:null,triggerSegmentationDataModified:bo,triggerSegmentationModified:ns,triggerSegmentationRemoved:RE,triggerSegmentationRepresentationModified:bc,triggerSegmentationRepresentationRemoved:FS},Symbol.toStringTag,{value:"Module"})),Ype={renderOutline:!0,outlineWidthAutoGenerated:3,outlineWidth:1,outlineWidthInactive:1,outlineOpacity:1,outlineOpacityInactive:.85,outlineDash:void 0,outlineDashInactive:void 0,outlineDashAutoGenerated:"5,3",activeSegmentOutlineWidthDelta:0,renderFill:!0,fillAlpha:.5,fillAlphaInactive:.3,fillAlphaAutoGenerated:.3};function Jpe(){return Ype}const Zpe={renderOutline:!0,renderOutlineInactive:!0,outlineWidth:3,outlineWidthInactive:2,activeSegmentOutlineWidthDelta:0,renderFill:!0,renderFillInactive:!0,fillAlpha:.5,fillAlphaInactive:.4,outlineOpacity:1,outlineOpacityInactive:.85};function Qpe(){return Zpe}class e1e{constructor(){this.config={global:{},segmentations:{},viewportsStyle:{}}}setStyle(e,r){const{viewportId:n,segmentationId:i,type:o,segmentIndex:a}=e,s=this.getStyle(e);let c;if(!n&&!i?c={...s,...r}:c=this.copyActiveToInactiveIfNotProvided({...s,...r},o),!o)throw new Error("Type is required to set a style");if(n){this.config.viewportsStyle[n]||(this.config.viewportsStyle[n]={renderInactiveSegmentations:!1,representations:{}});const l=this.config.viewportsStyle[n].representations;if(i){l[i]||(l[i]={}),l[i][o]||(l[i][o]={});const f=l[i][o];a!==void 0?(f.perSegment||(f.perSegment={}),f.perSegment[a]=c):f.allSegments=c}else{const f="__allSegmentations__";l[f]||(l[f]={}),l[f][o]||(l[f][o]={}),l[f][o].allSegments=c}}else if(i){this.config.segmentations[i]||(this.config.segmentations[i]={}),this.config.segmentations[i][o]||(this.config.segmentations[i][o]={});const l=this.config.segmentations[i][o];a!==void 0?(l.perSegment||(l.perSegment={}),l.perSegment[a]=c):l.allSegments=c}else this.config.global[o]=c}copyActiveToInactiveIfNotProvided(e,r){const n={...e};if(r===Lt.Labelmap){const i=n;i.renderOutlineInactive??(i.renderOutlineInactive=i.renderOutline),i.outlineWidthInactive??(i.outlineWidthInactive=i.outlineWidth),i.renderFillInactive??(i.renderFillInactive=i.renderFill),i.fillAlphaInactive??(i.fillAlphaInactive=i.fillAlpha),i.outlineOpacityInactive??(i.outlineOpacityInactive=i.outlineOpacity)}else if(r===Lt.Contour){const i=n;i.outlineWidthInactive??(i.outlineWidthInactive=i.outlineWidth),i.outlineOpacityInactive??(i.outlineOpacityInactive=i.outlineOpacity),i.outlineDashInactive??(i.outlineDashInactive=i.outlineDash),i.renderOutlineInactive??(i.renderOutlineInactive=i.renderOutline),i.renderFillInactive??(i.renderFillInactive=i.renderFill),i.fillAlphaInactive??(i.fillAlphaInactive=i.fillAlpha)}return n}getStyle(e){var s,c,l,f,u;const{viewportId:r,segmentationId:n,type:i,segmentIndex:o}=e;let a=this.getDefaultStyle(i);if(this.config.global[i]&&(a={...a,...this.config.global[i]}),(s=this.config.segmentations[n])!=null&&s[i]&&(a={...a,...this.config.segmentations[n][i].allSegments},o!==void 0&&((c=this.config.segmentations[n][i].perSegment)!=null&&c[o])&&(a={...a,...this.config.segmentations[n][i].perSegment[o]})),r&&this.config.viewportsStyle[r]){this.config.viewportsStyle[r].renderInactiveSegmentations;const d="__allSegmentations__";(l=this.config.viewportsStyle[r].representations[d])!=null&&l[i]&&(a={...a,...this.config.viewportsStyle[r].representations[d][i].allSegments}),n&&((f=this.config.viewportsStyle[r].representations[n])!=null&&f[i])&&(a={...a,...this.config.viewportsStyle[r].representations[n][i].allSegments},o!==void 0&&((u=this.config.viewportsStyle[r].representations[n][i].perSegment)!=null&&u[o])&&(a={...a,...this.config.viewportsStyle[r].representations[n][i].perSegment[o]}))}return a}getRenderInactiveSegmentations(e){var r;return(r=this.config.viewportsStyle[e])==null?void 0:r.renderInactiveSegmentations}setRenderInactiveSegmentations(e,r){this.config.viewportsStyle[e]||(this.config.viewportsStyle[e]={renderInactiveSegmentations:!1,representations:{}}),this.config.viewportsStyle[e].renderInactiveSegmentations=r}getDefaultStyle(e){switch(e){case Lt.Labelmap:return Qpe();case Lt.Contour:return Jpe();case Lt.Surface:return{};default:throw new Error(`Unknown representation type: ${e}`)}}clearSegmentationStyle(e){this.config.segmentations[e]&&delete this.config.segmentations[e]}clearAllSegmentationStyles(){this.config.segmentations={}}clearViewportStyle(e){this.config.viewportsStyle[e]&&delete this.config.viewportsStyle[e]}clearAllViewportStyles(){for(const e in this.config.viewportsStyle){const n=this.config.viewportsStyle[e].renderInactiveSegmentations;this.config.viewportsStyle[e]={renderInactiveSegmentations:n,representations:{}}}}resetToGlobalStyle(){this.clearAllSegmentationStyles(),this.clearAllViewportStyles()}hasCustomStyle(e){const{type:r}=e,n=this.getStyle(e),i=this.getDefaultStyle(r);return!xV(n,i)}}const qa=new e1e;function t1e(t){const e={segmentationId:t};it(Je,k.SEGMENTATION_ADDED,e)}const dI={colorLUT:[],segmentations:[],viewportSegRepresentations:{}};class n1e{constructor(e){this._stackLabelmapImageIdReferenceMap=new Map,this._labelmapImageIdReferenceMap=new Map,e||(e=kn()),this.state=Object.freeze(ys(dI)),this.uid=e}getState(){return this.state}updateState(e){const r=ys(this.state);e(r),this.state=Object.freeze(r)}getColorLUT(e){return this.state.colorLUT[e]}getNextColorLUTIndex(){return this.state.colorLUT.length}resetState(){this._stackLabelmapImageIdReferenceMap.clear(),this._labelmapImageIdReferenceMap.clear(),this.state=Object.freeze(ys(dI))}getSegmentation(e){return this.state.segmentations.find(r=>r.segmentationId===e)}updateSegmentation(e,r){this.updateState(n=>{const i=n.segmentations.find(o=>o.segmentationId===e);if(!i){console.warn(`Segmentation with id ${e} not found. Update aborted.`);return}Object.assign(i,r)}),ns(e)}addSegmentation(e){if(this.getSegmentation(e.segmentationId))throw new Error(`Segmentation with id ${e.segmentationId} already exists`);this.updateState(r=>{const n=ys(e);if(n.representationData.Labelmap&&"volumeId"in n.representationData.Labelmap&&!("imageIds"in n.representationData.Labelmap)){const i=this.getLabelmapImageIds(n.representationData);n.representationData.Labelmap.imageIds=i}r.segmentations.push(n)}),t1e(e.segmentationId)}removeSegmentation(e){this.updateState(r=>{const n=r.segmentations.filter(i=>i.segmentationId!==e);r.segmentations.splice(0,r.segmentations.length,...n)}),RE(e)}addSegmentationRepresentation(e,r,n,i){if(!qn(e))return;if(this.getSegmentationRepresentations(e,{type:n,segmentationId:r}).length>0){console.debug("A segmentation representation of type",n,"already exists in viewport",e,"for segmentation",r);return}this.updateState(s=>{s.viewportSegRepresentations[e]||(s.viewportSegRepresentations[e]=[],qa.setRenderInactiveSegmentations(e,!0)),n!==Lt.Labelmap?this.addDefaultSegmentationRepresentation(s,e,r,n,i):this.addLabelmapRepresentation(s,e,r,i)}),bc(e,r,n)}addDefaultSegmentationRepresentation(e,r,n,i,o){const a=e.segmentations.find(c=>c.segmentationId===n);if(!a)return;const s={};Object.keys(a.segments).forEach(c=>{s[Number(c)]={visible:!0}}),e.viewportSegRepresentations[r].push({segmentationId:n,type:i,active:!0,visible:!0,colorLUTIndex:(o==null?void 0:o.colorLUTIndex)||0,segments:s,config:{...hI(i),...o}}),this._setActiveSegmentation(e,r,n)}addLabelmapRepresentation(e,r,n,i=hI(Lt.Labelmap)){if(!qn(r))return;const a=this.getSegmentation(n);if(!a)return;const{representationData:s}=a;if(!s.Labelmap)return this.addDefaultSegmentationRepresentation(e,r,n,Lt.Labelmap,i);this.processLabelmapRepresentationAddition(r,n),this.addDefaultSegmentationRepresentation(e,r,n,Lt.Labelmap,i)}async processLabelmapRepresentationAddition(e,r){const n=qn(e);if(!n)return;const i=this.getSegmentation(r);if(!i)return;const o=n.viewport instanceof Or,{representationData:a}=i,s="volumeId"in a.Labelmap;n.viewport,!o&&!s&&this.updateLabelmapSegmentationImageReferences(e,i.segmentationId)}_updateLabelmapSegmentationReferences(e,r,n,i){const o=r.getCurrentImageId();let a=!1;for(const s of n)r.isReferenceViewable({referencedImageId:s},{asOverlay:!0})&&(a=!0,this._stackLabelmapImageIdReferenceMap.get(e).set(o,s),this._updateLabelmapImageIdReferenceMap({segmentationId:e,referenceImageId:o,labelmapImageId:s}));return i&&i(r,e,n),a?this._stackLabelmapImageIdReferenceMap.get(e).get(o):void 0}updateLabelmapSegmentationImageReferences(e,r){const n=this.getSegmentation(r);if(!n)return;this._stackLabelmapImageIdReferenceMap.has(r)||this._stackLabelmapImageIdReferenceMap.set(r,new Map);const{representationData:i}=n;if(!i.Labelmap)return;const o=this.getLabelmapImageIds(i),s=qn(e).viewport;return this._updateLabelmapSegmentationReferences(r,s,o,null)}_updateAllLabelmapSegmentationImageReferences(e,r){const n=this.getSegmentation(r);if(!n)return;this._stackLabelmapImageIdReferenceMap.has(r)||this._stackLabelmapImageIdReferenceMap.set(r,new Map);const{representationData:i}=n;if(!i.Labelmap)return;const o=this.getLabelmapImageIds(i),s=qn(e).viewport;this._updateLabelmapSegmentationReferences(r,s,o,(c,l,f)=>{c.getImageIds().forEach((d,h)=>{for(const g of f)c.isReferenceViewable({referencedImageId:g,sliceIndex:h},{asOverlay:!0,withNavigation:!0})&&(this._stackLabelmapImageIdReferenceMap.get(l).set(d,g),this._updateLabelmapImageIdReferenceMap({segmentationId:l,referenceImageId:d,labelmapImageId:g}))})})}getLabelmapImageIds(e){const r=e.Labelmap;let n;if(r.imageIds)n=r.imageIds;else if(!n&&r.volumeId){const i=r.volumeId;n=Fe.getVolume(i).imageIds}return n}getLabelmapImageIdsForImageId(e,r){const n=this._generateMapKey({segmentationId:r,referenceImageId:e});return this._labelmapImageIdReferenceMap.get(n)}getCurrentLabelmapImageIdsForViewport(e,r){const n=qn(e);if(!n)return;const o=n.viewport.getCurrentImageId();return this.getLabelmapImageIdsForImageId(o,r)}getCurrentLabelmapImageIdForViewport(e,r){const n=qn(e);if(!n||!this._stackLabelmapImageIdReferenceMap.has(r))return;const o=n.viewport.getCurrentImageId();return this._stackLabelmapImageIdReferenceMap.get(r).get(o)}getStackSegmentationImageIdsForViewport(e,r){if(!this.getSegmentation(r))return[];this._updateAllLabelmapSegmentationImageReferences(e,r);const{viewport:i}=qn(e),o=i.getImageIds(),a=this._stackLabelmapImageIdReferenceMap.get(r);return o.map(s=>a.get(s))}removeSegmentationRepresentationsInternal(e,r){const n=[];return this.updateState(i=>{if(!i.viewportSegRepresentations[e])return;const o=i.viewportSegRepresentations[e];let a=!1;if(!r||Object.values(r).every(s=>s===void 0))n.push(...o),delete i.viewportSegRepresentations[e];else{const{segmentationId:s,type:c}=r;i.viewportSegRepresentations[e]=o.filter(l=>{const f=s&&c&&l.segmentationId===s&&l.type===c||s&&!c&&l.segmentationId===s||!s&&c&&l.type===c;return f&&(n.push(l),l.active&&(a=!0)),!f}),i.viewportSegRepresentations[e].length===0?delete i.viewportSegRepresentations[e]:a&&(i.viewportSegRepresentations[e][0].active=!0)}}),n}removeSegmentationRepresentations(e,r){const n=this.removeSegmentationRepresentationsInternal(e,r);n.forEach(o=>{FS(e,o.segmentationId,o.type)});const i=this.getSegmentationRepresentations(e);return i.length>0&&i[0].active&&bc(e,i[0].segmentationId,i[0].type),n}removeSegmentationRepresentation(e,r,n){const i=this.removeSegmentationRepresentationsInternal(e,r);return n||i.forEach(({segmentationId:o,type:a})=>{FS(e,o,a)}),i}_updateLabelmapImageIdReferenceMap({segmentationId:e,referenceImageId:r,labelmapImageId:n}){const i=this._generateMapKey({segmentationId:e,referenceImageId:r});if(!this._labelmapImageIdReferenceMap.has(i)){this._labelmapImageIdReferenceMap.set(i,[n]);return}const o=this._labelmapImageIdReferenceMap.get(i),a=Array.from(new Set([...o,n]));this._labelmapImageIdReferenceMap.set(i,a)}_setActiveSegmentation(e,r,n){const i=e.viewportSegRepresentations[r];i&&i.forEach(o=>{o.active=o.segmentationId===n})}setActiveSegmentation(e,r){this.updateState(n=>{const i=n.viewportSegRepresentations[e];i&&i.forEach(o=>{o.active=o.segmentationId===r})}),bc(e,r)}getActiveSegmentation(e){if(!this.state.viewportSegRepresentations[e])return;const r=this.state.viewportSegRepresentations[e].find(n=>n.active);if(r)return this.getSegmentation(r.segmentationId)}getSegmentationRepresentations(e,r={}){const n=this.state.viewportSegRepresentations[e];return n?!r.type&&!r.segmentationId?n:n.filter(i=>{const o=r.type?i.type===r.type:!0,a=r.segmentationId?i.segmentationId===r.segmentationId:!0;return o&&a}):[]}getSegmentationRepresentation(e,r){return this.getSegmentationRepresentations(e,r)[0]}getSegmentationRepresentationVisibility(e,r){const n=this.getSegmentationRepresentation(e,r);return n==null?void 0:n.visible}setSegmentationRepresentationVisibility(e,r,n){this.updateState(i=>{const o=this.getSegmentationRepresentations(e,r);o&&o.forEach(a=>{a.visible=n,Object.entries(a.segments).forEach(([s,c])=>{c.visible=n})})}),bc(e,r.segmentationId,r.type)}addColorLUT(e,r){this.updateState(n=>{n.colorLUT[r]&&console.warn("Color LUT table already exists, overwriting"),n.colorLUT[r]=ys(e)})}removeColorLUT(e){this.updateState(r=>{delete r.colorLUT[e]})}_getStackIdForImageIds(e){return e.map(r=>r.slice(-Math.round(r.length*.15))).join("_")}getAllViewportSegmentationRepresentations(){return Object.entries(this.state.viewportSegRepresentations).map(([e,r])=>({viewportId:e,representations:r}))}getSegmentationRepresentationsBySegmentationId(e){const r=[];return Object.entries(this.state.viewportSegRepresentations).forEach(([n,i])=>{const o=i.filter(a=>a.segmentationId===e);o.length>0&&r.push({viewportId:n,representations:o})}),r}_generateMapKey({segmentationId:e,referenceImageId:r}){return`${e}-${r}`}}async function nU({imageIds:t,options:e}){const r=t,n=(e==null?void 0:e.volumeId)||kn();return await q4(n,r),{volumeId:n}}async function r1e({segmentationId:t,options:e}){const r=sr.getSegmentation(t),n=r.representationData.Labelmap,{volumeId:i}=await nU({imageIds:n.imageIds,options:e});r.representationData.Labelmap.volumeId=i}function hI(t){const e=Fl.newInstance(),r=Td.newInstance();return r.addPoint(0,0),t===Lt.Labelmap?{cfun:e,ofun:r}:{}}const sr=new n1e("DEFAULT");function Ma(t,e={}){return sr.getSegmentationRepresentations(t,e)}function LE(t,e){const r=sr;if(!e.segmentationId||!e.type)throw new Error("getSegmentationRepresentation: No segmentationId or type provided, you need to provide at least one of them");const n=r.getSegmentationRepresentations(t,e);return n==null?void 0:n[0]}function rU(t){return sr.getSegmentationRepresentationsBySegmentationId(t)}function i1e(t,e){const r=Se(t),{viewport:n}=r,o=n.getActors().filter(a=>a.representationUID&&typeof a.representationUID=="string"&&a.representationUID.startsWith(e));n.removeActors(o.map(a=>a.uid))}function iU(t,e,r){const n=qn(t);if(!n)return;const{renderingEngine:i,viewport:o}=n;if(!i||!o)return;const s=o.getActors().filter(r);return s.length>0?s[0]:void 0}function o1e(t,e){const r=qn(t);if(!r)return;const{renderingEngine:n,viewport:i}=r;if(!n||!i)return;const a=i.getActors().filter(e);return a.length>0?a:void 0}function a1e(t,e){const r=Pw(t,e);return r==null?void 0:r.uid}function Cp(t,e){return o1e(t,r=>{var n;return(n=r.representationUID)==null?void 0:n.startsWith(`${e}-${Lt.Labelmap}`)})}function Pw(t,e){return iU(t,e,r=>{var n;return(n=r.representationUID)==null?void 0:n.startsWith(`${e}-${Lt.Labelmap}`)})}function s1e(t,e,r){return iU(t,e,n=>n.representationUID===oU(e,r))}function oU(t,e){return`${t}-${Lt.Surface}-${e}`}function c1e(t,e,r){const n=Se(t),{viewport:i}=n,o=s1e(i.id,r,e.segmentIndex),a=o==null?void 0:o.actor,s=e.visible;if(a){if(a.setVisibility(s),!s)return;const y=a.getMapper(),m=y.getInputData(),w=e.points,x=e.polys,C=m.getPoints().getData(),S=m.getPolys().getData();if(w.length===C.length&&x.length===S.length)return;const T=Kr.newInstance();T.getPoints().setData(w,3);const _=Sd.newInstance({values:Float32Array.from(x)});T.setPolys(_),y.setInputData(T),y.modified(),i.getRenderer().resetCameraClippingRange();return}const c=e.points,l=e.polys,f=e.color,u=Kr.newInstance();u.getPoints().setData(c,3);const d=Sd.newInstance({values:Float32Array.from(l)});u.setPolys(d);const h=_a.newInstance({});let g;h.setInputData(u);const p=ic.newInstance();p.setMapper(h),p.getProperty().setColor(f[0]/255,f[1]/255,f[2]/255),p.getProperty().setLineWidth(2);const v=oU(r,e.segmentIndex);i.addActor({uid:kn(),actor:p,clippingFilter:g,representationUID:v}),i.resetCamera(),i.getRenderer().resetCameraClippingRange(),i.render()}function zn(t){return sr.getSegmentation(t)}function ym(t){return sr.getColorLUT(t)}let n5={};function l1e(){return n5}function u1e(t){n5=t}let gI=!1;function Ml(){var e;if(!((e=n5.addons)!=null&&e.polySeg))return console.warn("PolySeg add-on not configured. This will prevent automatic conversion between segmentation representations (labelmap, contour, surface). To enable these features, install @cornerstonejs/polymorphic-segmentation and register it during initialization: cornerstoneTools.init({ addons: { polySeg } })."),null;const t=n5.addons.polySeg;return gI||(t.init(),gI=!0),t}function AE({segmentationId:t,type:e,data:r}){const n=zn(t);if(!n)throw new Error(`Segmentation ${t} not found`);switch(n.representationData[e]&&console.warn(`Representation data of type ${e} already exists for segmentation ${t}, overwriting it.`),e){case Lt.Labelmap:r&&(n.representationData[e]=r);break;case Lt.Contour:r&&(n.representationData[e]=r);break;case Lt.Surface:r&&(n.representationData[e]=r);break;default:throw new Error(`Invalid representation type ${e}`)}}function NE(t){const e=typeof t;return t!==null&&(e==="object"||e==="function")}function qh(t,e,r){let n,i,o,a,s,c,l=0,f=!1,u=!1,d=!0;const h=!e&&e!==0&&typeof window.requestAnimationFrame=="function";if(typeof t!="function")throw new TypeError("Expected a function");e=Number(e)||0,NE(r)&&(f=!!r.leading,u="maxWait"in r,o=u?Math.max(Number(r.maxWait)||0,e):o,d="trailing"in r?!!r.trailing:d);function g(b){const D=n,I=i;return n=i=void 0,l=b,a=t.apply(I,D),a}function p(b,D){return h?window.requestAnimationFrame(b):setTimeout(b,D)}function v(b){if(h)return window.cancelAnimationFrame(b);clearTimeout(b)}function y(b){return l=b,s=p(x,e),f?g(b):a}function m(b){const D=b-c,I=b-l,P=e-D;return u?Math.min(P,o-I):P}function w(b){const D=b-c,I=b-l;return c===void 0||D>=e||D<0||u&&I>=o}function x(){const b=Date.now();if(w(b))return C(b);s=p(x,m(b))}function C(b){return s=void 0,d&&n?g(b):(n=i=void 0,a)}function S(){s!==void 0&&v(s),l=0,n=c=i=s=void 0}function T(){return s===void 0?a:C(Date.now())}function _(){return s!==void 0}function E(...b){const D=Date.now(),I=w(D);if(n=b,i=this,c=D,I){if(s===void 0)return y(c);if(u)return s=p(x,e),g(c)}return s===void 0&&(s=p(x,e)),a}return E.cancel=S,E.flush=T,E.pending=_,E}const Rv=new Map;async function kE(t,e,r,n,i){const o=await r();AE({segmentationId:t,type:e,data:o}),i==null||i(),Rv.has(t)||Rv.set(t,[]);const a=Rv.get(t);return a.includes(e)||a.push(e),f1e(n),ns(t),o}function f1e(t){const e=r=>{d1e(r,t)};t._debouncedUpdateFunction=e,Je.removeEventListener(k.SEGMENTATION_DATA_MODIFIED,t._debouncedUpdateFunction),Je.addEventListener(k.SEGMENTATION_DATA_MODIFIED,t._debouncedUpdateFunction)}const d1e=qh((t,e)=>{const r=t.detail.segmentationId,n=Rv.get(r);!n||!n.length||(e(r),n.length&&ns(r))},300);function VE(t,e){const r=LE(t,e);return r?Object.entries(r.segments).reduce((i,[o,a])=>(a.visible||i.add(Number(o)),i),new Set):new Set}function h1e(t,e,r=!1){const n=qn(t);if(!n)return;const{viewport:i}=n;i1e(i.element,e),r&&i.render()}async function g1e(t,e){var l;const{segmentationId:r,type:n}=e,i=zn(r);if(!i)return;let o=i.representationData[Lt.Surface];if(!o&&((l=Ml())!=null&&l.canComputeRequestedRepresentation(r,Lt.Surface))){const f=Ml();if(o=await kE(r,Lt.Surface,()=>f.computeSurfaceData(r,{viewport:t}),()=>f.updateSurfaceData(r,{viewport:t})),!o)throw new Error(`No Surface data found for segmentationId ${r} even we tried to compute it`)}else!o&&!Ml()&&console.debug(`No surface data found for segmentationId ${r} and PolySeg add-on is not configured. Unable to convert from other representations to surface. Please register PolySeg using cornerstoneTools.init({ addons: { polySeg } }) to enable automatic conversion.`);if(!o){console.warn(`No Surface data found for segmentationId ${r}. Skipping render.`);return}const{geometryIds:a}=o;a!=null&&a.size||console.warn(`No Surfaces found for segmentationId ${r}. Skipping render.`);const{colorLUTIndex:s}=e,c=ym(s);a.forEach(f=>{const u=Fe.getGeometry(f);if(!(u!=null&&u.data)){console.warn(`No Surfaces found for geometryId ${f}. Skipping render.`);return}const{segmentIndex:d}=u.data,g=VE(t.id,{segmentationId:r,type:n}).has(d),p=u.data,v=c[d];p.color=v.slice(0,3),p.visible=!g,c1e(t.element,p,r)}),t.render()}const aU={render:g1e,removeRepresentation:h1e};function p1e(t,e,r,n){const i=t.getViewReference(),{viewPlaneNormal:o,FrameOfReferenceUID:a}=i,s={annotationUID:(n==null?void 0:n.annotationUID)||kn(),data:{handles:{points:r}},highlighted:!1,autoGenerated:!1,invalidated:!1,isLocked:!1,isVisible:!0,metadata:{toolName:e,viewPlaneNormal:o,FrameOfReferenceUID:a,referencedImageId:m1e(t,r[0],o),...n}};return ln(s,t.element),s}function m1e(t,e,r){let n;if(t instanceof mr)n=FE(t,e,r);else if(t instanceof Or){const i=v1e(t),o=Jc(i),a=Fe.getVolume(o);n=Vl(a,e,r)}else throw new Error("getReferencedImageId: viewport must be a StackViewport or BaseVolumeViewport");return n}function v1e(t){var r;const e=(r=t.getViewReferenceId)==null?void 0:r.call(t);if(e)return e;if(t instanceof Or)return`volumeId:${y1e(t)}`;throw new Error("getTargetId: viewport must have a getTargetId method")}function y1e(t){var r;const e=t.getActors();if(e)return(r=e.find(n=>n.actor.getClassName()==="vtkVolume"))==null?void 0:r.uid}function FE(t,e,r){const n=t.getImageIds();if(!n||!n.length)return;const i=n.map(o=>{const{imagePositionPatient:a}=vt("imagePlaneModule",o),s=w1e(e,a,r);return{imageId:o,distance:s}});return i.sort((o,a)=>o.distance-a.distance),i[0].imageId}function w1e(t,e,r){const n=Ge();Nn(n,t,e);const i=Pt(n,r);return Math.abs(i)}function sU(t,e){const{segmentation:r}=t.data,{segmentation:n}=e.data;return r.segmentationId===n.segmentationId&&r.segmentIndex===n.segmentIndex}class cU{constructor(e){this.getGroupKey=r=>{if(typeof r=="string")return r;const i=Se(r);if(!i)throw new Error("Element not enabled, you must have an enabled element if you are not providing a FrameOfReferenceUID");return i.FrameOfReferenceUID},this._imageVolumeModifiedHandler=r=>{const n=r.detail,{FrameOfReferenceUID:i}=n,a=this.annotations[i];a&&Object.keys(a).forEach(s=>{a[s].forEach(l=>{l.invalidated!==void 0&&(l.invalidated=!0)})})},this.getFramesOfReference=()=>Object.keys(this.annotations),this.getAnnotations=(r,n)=>{const i=this.annotations;return i[r]?n?i[r][n]?i[r][n]:[]:i[r]:[]},this.getAnnotation=r=>{const n=this.annotations;for(const i in n){const o=n[i];for(const a in o){const s=o[a];for(const c of s)if(r===c.annotationUID)return c}}},this.getNumberOfAnnotations=(r,n)=>{const i=this.getAnnotations(r,n);if(!i.length)return 0;if(n)return i.length;let o=0;for(const a in i)o+=i[a].length;return o},this.addAnnotation=(r,n)=>{const{metadata:i}=r,{FrameOfReferenceUID:o,toolName:a}=i;n=n||o;const s=this.annotations;let c=s[n];c||(s[n]={},c=s[n]);let l=c[a];l||(c[a]=[],l=c[a]),this.preprocessingFn&&(r=this.preprocessingFn(r)),l.push(r)},this.removeAnnotation=r=>{const{annotations:n}=this;for(const i in n){const o=n[i];for(const a in o){const s=o[a],c=s.findIndex(l=>l.annotationUID===r);c!==-1&&(s.splice(c,1),s.length===0&&delete o[a])}Object.keys(o).length===0&&delete n[i]}},this.removeAnnotations=(r,n)=>{const i=this.annotations,o=[];if(!i[r])return o;if(n){const a=i[r][n];for(const s of a)this.removeAnnotation(s.annotationUID),o.push(s)}else for(const a in i[r]){const s=i[r][a];for(const c of s)this.removeAnnotation(c.annotationUID),o.push(c)}return o},this.saveAnnotations=(r,n)=>{const i=this.annotations;if(r&&n){const o=i[r];if(!o)return;const a=o[n];return structuredClone(a)}else if(r){const o=i[r];return structuredClone(o)}return structuredClone(i)},this.restoreAnnotations=(r,n,i)=>{const o=this.annotations;if(n&&i){let a=o[n];a||(o[n]={},a=o[n]),a[i]=r}else n?o[n]=r:this.annotations=structuredClone(r)},this.getAllAnnotations=()=>Object.values(this.annotations).map(r=>Object.values(r)).flat(2),this.getNumberOfAllAnnotations=()=>{let r=0;const n=this.annotations;for(const i in n){const o=n[i];for(const a in o){const s=o[a];r+=s.length}}return r},this.removeAllAnnotations=()=>{const r=[];for(const n of this.getAllAnnotations())this.removeAnnotation(n.annotationUID),r.push(n);return r},e||(e=kn()),this.annotations={},this.uid=e,Je.addEventListener(Ze.IMAGE_VOLUME_MODIFIED,this._imageVolumeModifiedHandler)}setPreprocessingFn(e){this.preprocessingFn=e}}const x1e=new cU("DEFAULT"),$u=new Set;function lU(t,e=!0){const r=fU();t&&(e?_1e(t,$u,r):dU(t,$u,r)),hU(r,$u)}function C1e(){const t=fU();E1e($u,t),hU(t,$u)}function S1e(){return Array.from($u)}function mi(t){return $u.has(t)}function T1e(){return $u.size}function uU(t){const e=mi(t);return lU(t,e),e}function fU(){return Object.freeze({added:[],removed:[],locked:[]})}function _1e(t,e,r){if(!e.has(t)){e.add(t),r.added.push(t);const n=ri(t);n&&(n.isLocked=!0)}}function dU(t,e,r){if(e.delete(t)){r.removed.push(t);const n=ri(t);n&&(n.isLocked=!1)}}function E1e(t,e){t.forEach(r=>{dU(r,t,e)})}function hU(t,e){(t.added.length>0||t.removed.length>0)&&(e.forEach(r=>void t.locked.push(r)),it(Je,k.ANNOTATION_LOCK_CHANGE,t))}const b1e=Object.freeze(Object.defineProperty({__proto__:null,checkAndSetAnnotationLocked:uU,getAnnotationsLocked:S1e,getAnnotationsLockedCount:T1e,isAnnotationLocked:mi,setAnnotationLocked:lU,unlockAllAnnotations:C1e},Symbol.toStringTag,{value:"Module"})),Dc=new Set;function ca(t,e=!0,r=!1){e?D1e(t,r):UE(t)}function D1e(t,e=!1){const r=pU();if(!e){mU(Dc,r);const n=ri(t);n&&(n.isSelected=!0)}if(t&&!Dc.has(t)){Dc.add(t),r.added.push(t);const n=ri(t);n&&(n.isSelected=!0)}vU(r,Dc)}function UE(t){const e=pU();if(t){if(Dc.delete(t)){e.removed.push(t);const r=ri(t);r.isSelected=!1}}else mU(Dc,e);vU(e,Dc)}function gU(){return Array.from(Dc)}function I1e(t){return gU().filter(e=>{var n;const r=ri(e);return((n=r==null?void 0:r.metadata)==null?void 0:n.toolName)===t})}function wm(t){return Dc.has(t)}function O1e(){return Dc.size}function pU(){return Object.freeze({added:[],removed:[],selection:[]})}function mU(t,e){t.forEach(r=>{if(t.delete(r)){e.removed.push(r);const n=ri(r);n&&(n.isSelected=!1)}})}function vU(t,e){(t.added.length>0||t.removed.length>0)&&(e.forEach(r=>void t.selection.push(r)),it(Je,k.ANNOTATION_SELECTION_CHANGE,t))}const M1e=Object.freeze(Object.defineProperty({__proto__:null,deselectAnnotation:UE,getAnnotationsSelected:gU,getAnnotationsSelectedByToolName:I1e,getAnnotationsSelectedCount:O1e,isAnnotationSelected:wm,setAnnotationSelected:ca},Symbol.toStringTag,{value:"Module"})),P1e=t=>(t.data||(t.data={}),t.data.handles||(t.data.handles={}),t.data.handles.textBox||(t.data.handles.textBox={}),t),R1e=t=>(t.data||(t.data={}),t.data.cachedStats||(t.data.cachedStats={}),t),bd=new Set;function yU(t,e=!0){const r=wU();t&&(e?xU(t,bd,r):A1e(t,bd,r)),CU(r)}function L1e(){const t=wU();bd.forEach(e=>{xU(e,bd,t)}),CU(t)}function ii(t){if(ri(t))return!bd.has(t)}function wU(){return Object.freeze({lastVisible:[],lastHidden:[],hidden:[]})}function xU(t,e,r){if(e.delete(t)){r.lastVisible.push(t);const n=ri(t);n.isVisible=!0}}function A1e(t,e,r){e.has(t)||(e.add(t),wm(t)&&UE(t),r.lastHidden.push(t))}function CU(t){(t.lastHidden.length>0||t.lastVisible.length>0)&&(bd.forEach(e=>void t.hidden.push(e)),it(Je,k.ANNOTATION_VISIBILITY_CHANGE,t))}function SU(t){const e=!bd.has(t);return yU(t,e),e}const N1e=Object.freeze(Object.defineProperty({__proto__:null,checkAndSetAnnotationVisibility:SU,isAnnotationVisible:ii,setAnnotationVisibility:yU,showAllAnnotations:L1e},Symbol.toStringTag,{value:"Module"})),BE=x1e,k1e=t=>{t=P1e(t),t=R1e(t);const e=t.annotationUID,r=uU(e);t.isLocked=r;const n=SU(e);return t.isVisible=n,t};BE.setPreprocessingFn(k1e);bE(BE);function V1e(){bE(BE)}function Ul(t){if(!t.data.segmentation)throw new Error("removeContourSegmentationAnnotation: annotation does not have a segmentation data");const{segmentationId:e,segmentIndex:r}=t.data.segmentation,n=zn(e),{annotationUIDsMap:i}=(n==null?void 0:n.representationData.Contour)||{},o=i==null?void 0:i.get(r);o&&(o.delete(t.annotationUID),o.size||i.delete(r))}function Bl(t){if(t.parentAnnotationUID)return;if(!t.data.segmentation)throw new Error("addContourSegmentationAnnotation: annotation does not have a segmentation data");const{segmentationId:e,segmentIndex:r}=t.data.segmentation,n=zn(e);n.representationData.Contour||(n.representationData.Contour={annotationUIDsMap:new Map});let{annotationUIDsMap:i}=n.representationData.Contour;i||(i=new Map);let o=i==null?void 0:i.get(r);o||(o=new Set,i.set(r,o)),i.set(r,o.add(t.annotationUID))}const F1e="PlanarFreehandContourSegmentationTool";function GE(t){var o;const{polyline:e}=((o=t.data)==null?void 0:o.contour)||{};if(!e||e.length<3){console.warn("Skipping creation of new annotation due to invalid polyline:",e);return}yn(t.annotationUID),Ul(t);const r=e[0],n=e[e.length-1],i={metadata:{...t.metadata,toolName:F1e,originalToolName:t.metadata.originalToolName||t.metadata.toolName},data:{cachedStats:{},handles:{points:[r,n],textBox:t.data.handles.textBox?{...t.data.handles.textBox}:void 0},contour:{...t.data.contour},spline:t.data.spline,segmentation:{...t.data.segmentation}},annotationUID:kn(),highlighted:!0,invalidated:!0,isLocked:!1,isVisible:void 0,interpolationUID:t.interpolationUID,interpolationCompleted:t.interpolationCompleted};return ln(i,t.metadata.FrameOfReferenceUID),Bl(i),i}var la;(function(t){t[t.CounterClockwise=-1]="CounterClockwise",t[t.Unknown=0]="Unknown",t[t.Clockwise=1]="Clockwise"})(la||(la={}));function WE(t,e){return t.minX<=e.maxX&&t.maxX>=e.minX&&t.minY<=e.maxY&&t.maxY>=e.minY}function r5(t,e){const r=t.maxX-t.minX,n=t.maxY-t.minY,i=[r,n],o=[t.minX+r/2,t.minY+n/2],a=[Math.abs(e[0]-o[0]),Math.abs(e[1]-o[1])],s=a[0]-i[0]*.5,c=a[1]-i[1]*.5;if(s>0&&c>0)return s*s+c*c;const l=Math.max(s,0)+Math.max(c,0);return l*l}function U1e(t,e){return Math.sqrt(r5(t,e))}const B1e=Object.freeze(Object.defineProperty({__proto__:null,distanceToPoint:U1e,distanceToPointSquared:r5,intersectAABB:WE},Symbol.toStringTag,{value:"Module"}));class TU{}class _U{constructor(e){this.storePointData=e.storePointData}getStatistics(){console.debug("InstanceCalculator getStatistics called")}}const{PointsManager:G1e}=Vn;function O1(t){return{max:[-1/0],min:[1/0],sum:[0],count:0,maxIJK:null,maxLPS:null,minIJK:null,minLPS:null,runMean:[0],m2:[0],m3:[0],m4:[0],allValues:[[]],pointsInShape:t?G1e.create3(1024):null,sumLPS:[0,0,0]}}function EU(t,e,r=null,n=null){Array.isArray(e)&&e.length>1&&t.max.length===1&&(t.max.push(t.max[0],t.max[0]),t.min.push(t.min[0],t.min[0]),t.sum.push(t.sum[0],t.sum[0]),t.runMean.push(0,0),t.m2.push(t.m2[0],t.m2[0]),t.m3.push(t.m3[0],t.m3[0]),t.m4.push(t.m4[0],t.m4[0]),t.allValues.push([],[])),t!=null&&t.pointsInShape&&r&&t.pointsInShape.push(r);const i=Array.isArray(e)?e:[e];t.count+=1,r&&(t.sumLPS[0]+=r[0],t.sumLPS[1]+=r[1],t.sumLPS[2]+=r[2]),t.max.forEach((o,a)=>{const s=i[a];t.allValues[a].push(s);const c=t.count,l=s-t.runMean[a],f=l/c,u=l*f*(c-1);t.sum[a]+=s,t.runMean[a]+=f,t.m4[a]+=u*f*f*(c*c-3*c+3)+6*f*f*t.m2[a]-4*f*t.m3[a],t.m3[a]+=u*f*(c-2)-3*f*t.m2[a],t.m2[a]+=u,st.max[a]&&(t.max[a]=s,a===0&&(t.maxIJK=n?[...n]:null,t.maxLPS=r?[...r]:null))})}function W1e(t){if(t.length===0)return 0;const e=[...t].sort((n,i)=>n-i),r=Math.floor(e.length/2);return e.length%2===0?(e[r-1]+e[r])/2:e[r]}function bU(t,e){const r=t.sum.map(u=>u/t.count),n=t.m2.map(u=>Math.sqrt(u/t.count)),i=t.sumLPS.map(u=>u/t.count),o=t.m3.map((u,d)=>{const h=t.m2[d]/t.count;return h===0?0:u/(t.count*Math.pow(h,1.5))}),a=t.m4.map((u,d)=>{const h=t.m2[d]/t.count;return h===0?0:u/(t.count*h*h)-3}),s=t.allValues.map(u=>W1e(u)),c={max:{name:"max",label:"Max Pixel",value:t.max.length===1?t.max[0]:t.max,unit:e,pointIJK:t.maxIJK?[...t.maxIJK]:null,pointLPS:t.maxLPS?[...t.maxLPS]:null},min:{name:"min",label:"Min Pixel",value:t.min.length===1?t.min[0]:t.min,unit:e,pointIJK:t.minIJK?[...t.minIJK]:null,pointLPS:t.minLPS?[...t.minLPS]:null},mean:{name:"mean",label:"Mean Pixel",value:r.length===1?r[0]:r,unit:e},stdDev:{name:"stdDev",label:"Standard Deviation",value:n.length===1?n[0]:n,unit:e},count:{name:"count",label:"Voxel Count",value:t.count,unit:null},median:{name:"median",label:"Median",value:s.length===1?s[0]:s,unit:e},skewness:{name:"skewness",label:"Skewness",value:o.length===1?o[0]:o,unit:null},kurtosis:{name:"kurtosis",label:"Kurtosis",value:a.length===1?a[0]:a,unit:null},maxLPS:{name:"maxLPS",label:"Max LPS",value:t.maxLPS?Array.from(t.maxLPS):null,unit:null},minLPS:{name:"minLPS",label:"Min LPS",value:t.minLPS?Array.from(t.minLPS):null,unit:null},pointsInShape:t.pointsInShape,center:{name:"center",label:"Center",value:i?[...i]:null,unit:null},array:[]};c.array.push(c.min,c.max,c.mean,c.stdDev,c.median,c.skewness,c.kurtosis,c.count,c.maxLPS,c.minLPS),c.center.value&&c.array.push(c.center);const l=t.pointsInShape!==null,f=O1(l);return t.max=f.max,t.min=f.min,t.sum=f.sum,t.count=f.count,t.maxIJK=f.maxIJK,t.maxLPS=f.maxLPS,t.minIJK=f.minIJK,t.minLPS=f.minLPS,t.runMean=f.runMean,t.m2=f.m2,t.m3=f.m3,t.m4=f.m4,t.allValues=f.allValues,t.pointsInShape=f.pointsInShape,t.sumLPS=f.sumLPS,c}const Xf=class Xf extends TU{static statsInit(e){e.storePointData||(this.state.pointsInShape=null),this.state=O1(e.storePointData)}};Xf.state=O1(!0),Xf.statsCallback=({value:e,pointLPS:r=null,pointIJK:n=null})=>{EU(Xf.state,e,r,n)},Xf.getStatistics=e=>bU(Xf.state,e==null?void 0:e.unit);let jc=Xf;class DU extends _U{constructor(e){super(e),this.state=O1(e.storePointData)}statsInit(e){this.state=O1(e.storePointData)}statsCallback(e){EU(this.state,e.value,e.pointLPS,e.pointIJK)}getStatistics(e){return bU(this.state,e==null?void 0:e.unit)}}const z1e=Object.freeze(Object.defineProperty({__proto__:null,BasicStatsCalculator:jc,Calculator:TU,InstanceBasicStatsCalculator:DU,InstanceCalculator:_U},Symbol.toStringTag,{value:"Module"}));function Gl(t,e){if(t.length!==e.length)throw Error("Both points should have the same dimensionality");const[r,n,i=0]=t,[o,a,s=0]=e,c=o-r,l=a-n,f=s-i;return c*c+l*l+f*f}function Wo(t,e){return Math.sqrt(Gl(t,e))}function US(t,e){const[r,n]=t,[i,o]=e,a=2*i-r,s=2*o-n;return[a,s]}const $1e=Object.freeze(Object.defineProperty({__proto__:null,distanceToPoint:Wo,distanceToPointSquared:Gl,mirror:US},Symbol.toStringTag,{value:"Module"}));function ju(t){const[e,r]=t;return Wo(e,r)}function th(t){const[e,r]=t,n=Wo(e,r),i=[e[0]-n,e[1]-n],o=[e[0]+n,e[1]+n];return[i,o]}const j1e=Object.freeze(Object.defineProperty({__proto__:null,getCanvasCircleCorners:th,getCanvasCircleRadius:ju},Symbol.toStringTag,{value:"Module"}));function Rw(t,e,r={}){return r.precalculated||zE(t,r),r.precalculated(e)}const zE=(t,e={})=>{const{xRadius:r,yRadius:n,zRadius:i}=t;(e.invXRadiusSq===void 0||e.invYRadiusSq===void 0||e.invZRadiusSq===void 0)&&(e.invXRadiusSq=r!==0?1/r**2:0,e.invYRadiusSq=n!==0?1/n**2:0,e.invZRadiusSq=i!==0?1/i**2:0);const{invXRadiusSq:o,invYRadiusSq:a,invZRadiusSq:s}=e,{center:c}=t,[l,f,u]=c;return e.precalculated=d=>{const h=d[0]-l;let g=h*h*o;if(g>1)return!1;const p=d[1]-f;if(g+=p*p*a,g>1)return!1;const v=d[2]-u;return g+=v*v*s,g<=1},e};function i5(t){const[e,r,n,i]=t,o=[n[0],r[1]],a=[i[0],e[1]];return[o,a]}const H1e=Object.freeze(Object.defineProperty({__proto__:null,getCanvasEllipseCorners:i5,pointInEllipse:Rw,precalculatePointInEllipse:zE},Symbol.toStringTag,{value:"Module"}));function o5(t,e,r){let n;const i=Gl(t,e);if(t[0]===e[0]&&t[1]===e[1]&&(n=t),!n){const o=((r[0]-t[0])*(e[0]-t[0])+(r[1]-t[1])*(e[1]-t[1]))/i;o<0?n=t:o>1?n=e:n=[t[0]+o*(e[0]-t[0]),t[1]+o*(e[1]-t[1])]}return{point:[...n],distanceSquared:Gl(r,n)}}function xm(t,e,r){return o5(t,e,r).distanceSquared}function Di(t,e,r){if(t.length!==2||e.length!==2||r.length!==2)throw Error("lineStart, lineEnd, and point should have 2 elements of [x, y]");return Math.sqrt(xm(t,e,r))}function R2(t){return typeof t=="number"?t?t<0?-1:1:t===t?0:NaN:NaN}function a5(t,e,r,n,i=!1){const[o,a]=t,[s,c]=e,[l,f]=r,[u,d]=n;if(i){const I=(o-s)*(f-d)-(a-c)*(l-u);if(Math.abs(I)<1e-10)return;const P=((o-l)*(f-d)-(a-f)*(l-u))/I,O=o+P*(s-o),A=a+P*(c-a);return[O,A]}const h=c-a,g=o-s,p=s*a-o*c,v=h*l+g*f+p,y=h*u+g*d+p;if(v!==0&&y!==0&&R2(v)===R2(y))return;const m=d-f,w=l-u,x=u*f-l*d,C=m*o+w*a+x,S=m*s+w*c+x;if(C!==0&&S!==0&&R2(C)===R2(S))return;const T=h*w-m*g;let _;_=g*x-w*p;const E=_/T;_=m*p-h*x;const b=_/T;return[E,b]}const Ig=.01;function Lv(t,e,r){const n=t[0]<=e[0]?t[0]:e[0],i=t[0]>=e[0]?t[0]:e[0],o=t[1]<=e[1]?t[1]:e[1],a=t[1]>=e[1]?t[1]:e[1];if(!(r[0]>=n-Ig&&r[0]<=i+Ig&&r[1]>=o-Ig&&r[1]<=a+Ig))return!1;const c=(e[1]-t[1])*(r[0]-e[0])-(e[0]-t[0])*(r[1]-e[1]);return(c>=0?c:-c)<=Ig}const K1e=Object.freeze(Object.defineProperty({__proto__:null,distanceToPoint:Di,distanceToPointSquared:xm,distanceToPointSquaredInfo:o5,intersectLine:a5,isPointOnLineSegment:Lv},Symbol.toStringTag,{value:"Module"}));function IU(t){if(t.length<3)return!1;const e=t.length,r=t[0],n=t[e-1],i=Gl(r,n);return Ju(0,i)}function tf(t,e,r={closed:void 0}){if(t.length<3)return!1;const n=t.length;let i=0;const{closed:o,holes:a}=r;if(a!=null&&a.length){for(const l of a)if(tf(l,e))return!1}const s=!(o===void 0?IU(t):o),c=t.length-(s?1:2);for(let l=0;l<=c;l++){const f=t[l],u=l===n-1?0:l+1,d=t[u],h=f[0]>=d[0]?f[0]:d[0],g=f[1]>=d[1]?f[1]:d[1],p=f[1]<=d[1]?f[1]:d[1];if(e[0]<=h&&e[1]>=p&&e[1]h?s:h,c=c>g?c:g,i&&(l=lp?f:p)}return i?{minX:o,maxX:s,minY:a,maxY:c,minZ:l,maxZ:f}:{minX:o,maxX:s,minY:a,maxY:c}}function Sm(t){const e=t.length;let r=0,n=e-1;for(let i=0;i=0?1:-1}function q1e(t){const e=Ge(),r=t[0];for(let n=0,i=t.length;ne[0]?t[0]:e[0],c=t[1]>e[1]?t[1]:e[1],l=r[0]n[0]?r[0]:n[0],d=r[1]>n[1]?r[1]:n[1];if(o>u||sd||c0?1:2}function A2(t,e,r){return e[0]<=Math.max(t[0],r[0])&&e[0]>=Math.min(t[0],r[0])&&e[1]<=Math.max(t[1],r[1])&&e[1]>=Math.min(t[1],r[1])}function HE(t,e,r,n=!0){const i=[],o=t.length,a=o-(n?1:2);for(let s=0;s<=a;s++){const c=t[s],l=s===o-1?0:s+1,f=t[l];jE(e,r,c,f)&&i.push([s,l])}return i}const Y1e=.01;function OU(t,e,r,n){const i=[e[0]-t[0],e[1]-t[1]],o=[n[0]-r[0],n[1]-r[1]],a=o[1]*i[0]-o[0]*i[1];if((a>=0?a:-a)e[0]?t[0]:e[0],t[1]e[1]?t[1]:e[1]],p=[r[0]n[0]?r[0]:n[0],r[1]n[1]?r[1]:n[1]];if(!(g[0]<=p[1]&&g[1]>=p[0]&&g[2]<=p[3]&&g[3]>=p[2])||!(Lv(t,e,r)||Lv(t,e,n)||Lv(r,n,t)))return;const m=g[0]>p[0]?g[0]:p[0],w=g[1]p[2]?g[2]:p[2],C=g[3]{const p=g[0],v=e[g[0]],y=e[g[1]],m=OU(l,d,v,y),w=Gl(l,m);return{sourceLineSegmentId:p,coordinate:m,targetStartPointDistSquared:w}});h.sort((g,p)=>g.targetStartPointDistSquared-p.targetStartPointDistSquared),h.forEach(g=>{const{sourceLineSegmentId:p,coordinate:v}=g,y={type:ud.Intersection,coordinates:v,position:nh.Edge,direction:a,visited:!1,next:null},m={...y,direction:T0.Unknown,cloned:!0};a===T0.Entering?y.next=m:m.next=y;let w=i.get(p);w||(w=[],i.set(p,w)),r.push(y),w.push(m),a*=-1})}for(let s=0,c=e.length;s({intersectionPoint:h,lineSegStartDistSquared:Gl(f,h.coordinates)})).sort((h,g)=>h.lineSegStartDistSquared-g.lineSegStartDistSquared).map(({intersectionPoint:h})=>h).forEach(h=>n.push(h))}return pI(r),pI(n),{targetPolylinePoints:r,sourcePolylinePoints:n}}function PU(t){for(let e=0,r=t.length;e=f&&console.warn("Maximum iterations reached in mergePolylines, possible infinite loop detected"),s}function Aw(t,e){const r=M1(t),n=M1(e),i=Pt(n,r);Ju(-1,i)||(e=e.slice().reverse());const{targetPolylinePoints:o}=MU(t,e);let a=null;const s=[];let c=0;const l=t.length*2;for(;(a=PU(o))&&c=h&&console.warn("Maximum inner iterations reached in subtractPolylines, possible infinite loop detected"),s.push(f)}return c>=l&&console.warn("Maximum outer iterations reached in subtractPolylines, possible infinite loop detected"),s}function RU(t,e,r,n=!0){let i,o;n?(o=t.length-1,i=0):(o=0,i=1);for(let a=i;ad&&(d=v,h=g)}d{const u=[t[f[0]],t[f[1]]],d=[(u[0][0]+u[1][0])/2,(u[0][1]+u[1][1])/2];s.push(Ir(d,e))});const c=Math.min(...s),l=s.indexOf(c);return{segment:a[l],distance:c}}const t0=.001,Q1e=(t,e)=>{let r,n,i;if(t instanceof mr){const a=t.getImageData();if(!a)return;n=a.direction.slice(0,3),i=a.direction.slice(3,6),r=a.spacing}else{const a=t.getImageData(),{direction:s,spacing:c}=a,{viewPlaneNormal:l,viewUp:f}=t.getCamera(),u=s.slice(0,3),d=s.slice(3,6),h=s.slice(6,9),g=Ge();Wn(g,f,l);const p=Math.abs(Pt(g,u)),v=Math.abs(Pt(g,d)),y=Math.abs(Pt(g,h));let m;if(Math.abs(1-p)o4(t,e){const{xDir:i,yDir:o,spacing:a}=n,s=Se(t),{viewport:c}=s;if(!e.length)return e.push(r),console.log(">>>>> !canvasPoints. :: RETURN"),1;const l=c.canvasToWorld(e[e.length-1]),f=c.canvasToWorld(r),u=Ge();Qn(u,f,l);const d=Math.abs(Pt(u,i)),h=Math.abs(Pt(u,o)),g=Math.max(Math.floor(d/a[0]),Math.floor(h/a[0]));if(g>1){const p=e[e.length-1],v=o4(p,r),y=nn();ai(y,r,p),vs(y,y[0]/v,y[1]/v);const m=v/g;for(let w=1;w<=g;w++)e.push([p[0]+m*y[0]*w,p[1]+m*y[1]*w])}else e.push(r);return g},nme=(t,e,r,n)=>{const i=[t[0]-e[0],t[1]-e[1]],o=[r[0]-e[0],r[1]-e[1]],a=i[0]*o[0]+i[1]*o[1];if(a<0)return!1;const s=Math.sqrt(o[0]*o[0]+o[1]*o[1]);if(s===0)return!1;const c=a/s,l=[o[0]/s,o[1]/s],f=[l[0]*c,l[1]*c],u=[e[0]+f[0],e[1]+f[1]];return!(Ir(t,u)>n||Ir(e,u)>Ir(e,r))},rme=1e-6;function AU(t){let e;const r=dE(t,50);for(let a=0;a<3;a++)if(r.every((s,c,l)=>Math.abs(s[a]-l[0][a])[o[0],o[1]]).sort((o,a)=>o[0]===a[0]?o[1]-a[1]:o[0]-a[0]);function r(o,a,s){return(a[0]-o[0])*(s[1]-o[1])-(a[1]-o[1])*(s[0]-o[0])}const n=[];for(const o of e){for(;n.length>=2&&r(n[n.length-2],n[n.length-1],o)<=0;)n.pop();n.push(o)}const i=[];for(let o=e.length-1;o>=0;o--){const a=e[o];for(;i.length>=2&&r(i[i.length-2],i[i.length-1],a)<=0;)i.pop();i.push(a)}return n.pop(),i.pop(),n.concat(i)}const pf=Object.freeze(Object.defineProperty({__proto__:null,addCanvasPointsToArray:tme,containsPoint:tf,containsPoints:Cm,convexHull:NU,decimate:qE,getAABB:nf,getArea:Sm,getClosestLineSegmentIntersection:Z1e,getFirstLineSegmentIntersectionIndexes:RU,getLineSegmentIntersectionsCoordinates:LU,getLineSegmentIntersectionsIndexes:HE,getNormal2:M1,getNormal3:X1e,getSignedArea:$E,getSubPixelSpacingAndXYDirections:Q1e,getWindingDirection:Av,intersectPolyline:KE,isClosed:IU,isPointInsidePolyline3D:XE,mergePolylines:Lw,pointCanProjectOnLine:nme,pointsAreWithinCloseContourProximity:eme,projectTo2D:AU,subtractPolylines:Aw},Symbol.toStringTag,{value:"Module"}));function ime(t,e,r,n){const i=[t,e],o=[t+r,e],a=[t+r,e],s=[t+r,e+n],c=[t+r,e+n],l=[t,e+n],f=[t,e+n];return{top:[i,o],right:[a,s],bottom:[c,l],left:[f,[t,e]]}}function YE(t,e){if(t.length!==4||e.length!==2)throw Error("rectangle:[left, top, width, height] or point: [x,y] not defined correctly");const[r,n,i,o]=t;let a=655535;const s=ime(r,n,i,o);return Object.keys(s).forEach(c=>{const[l,f]=s[c],u=Di(l,f,e);u0){if(o>i)return 0;o>n&&(r[0]=o)}else{if(o=r[0]&&o<=r[2]&&a>=r[1]&&a<=r[3])return mI;const u=[0,1];if(N2(r[0]-o,l,u)&&N2(o-r[2],-l,u)&&N2(r[1]-a,f,u)&&N2(a-r[3],-f,u)){const[d,h]=u;return h<1&&(i[0]=o+h*l,i[1]=a+h*f),d>0&&(n[0]+=d*l,n[1]+=d*f),mI}return sme}const cme=Object.freeze(Object.defineProperty({__proto__:null,findClosestPoint:BS,liangBarksyClip:Zg},Symbol.toStringTag,{value:"Module"}));function lme(t,e){const[r,n]=t,[i,o]=e,a=Nn(Ge(),n,r),s=Nn(Ge(),i,o),c=Pt(a,s),l=sa(a),f=sa(s),u=c/(l*f);return Math.acos(u)*180/Math.PI}function ume(t,e){const[r,n]=t,[i,o]=e,a=Cs(nn(),n,r),s=Cs(nn(),i,o),c=i4(a,s),l=wy(a),f=wy(s),u=c/(l*f);return Math.acos(u)*(180/Math.PI)}function rh(t,e){return t[0].length===3?lme(t,e):ume(t,e)}const fme=Object.freeze(Object.defineProperty({__proto__:null,angleBetweenLines:rh},Symbol.toStringTag,{value:"Module"})),dme=Object.freeze(Object.defineProperty({__proto__:null,BasicStatsCalculator:z1e,aabb:B1e,angle:fme,circle:j1e,ellipse:H1e,lineSegment:K1e,point:$1e,polyline:pf,rectangle:ome,vec2:cme},Symbol.toStringTag,{value:"Module"}));function fc(t,e,r,n){var g,p,v;const{canvasToWorld:i,worldToCanvas:o}=r,{data:a}=t,{targetWindingDirection:s}=e;let{points:c}=e,l=Av(c);(g=n==null?void 0:n.decimate)!=null&&g.enabled&&(c=qE(e.points,(p=n==null?void 0:n.decimate)==null?void 0:p.epsilon));let{closed:f}=e;const u=c.length,d=new Array(u);Av(c);const h=yF(t);if(f===void 0){let y=!1;if(c.length>3){const m=Gl(c[0],c[u-1]);y=Yt(0,m)}f=y}if((n==null?void 0:n.updateWindingDirection)!==!1){let y=h?h.data.contour.windingDirection*-1:s;y===void 0&&(y=l),y!==l&&c.reverse();const m=(((v=a.handles)==null?void 0:v.points)??[]).map(o);m.length>2&&Av(m)!==y&&a.handles.points.reverse(),l=y}for(let y=0;y{He.svgNodeCache[i][a].touched=!1}),{svgLayerElement:o,svgNodeCacheForCanvas:He.svgNodeCache,getSvgNode:mme.bind(this,i),appendNode:vme.bind(this,o,i),setNodeTouched:yme.bind(this,i),clearUntouched:wme.bind(this,o,i)}}function pme(t){const e=`.${hme}`,r=t.querySelector(e);return r==null?void 0:r.querySelector(":scope > .svg-layer")}function mme(t,e){if(He.svgNodeCache[t]&&He.svgNodeCache[t][e])return He.svgNodeCache[t][e].domRef}function vme(t,e,r,n){if(!He.svgNodeCache[e])return null;He.svgNodeCache[e][n]={touched:!0,domRef:r},t.appendChild(r)}function yme(t,e){He.svgNodeCache[t]&&He.svgNodeCache[t][e]&&(He.svgNodeCache[t][e].touched=!0)}function wme(t,e){He.svgNodeCache[e]&&Object.keys(He.svgNodeCache[e]).forEach(r=>{const n=He.svgNodeCache[e][r];!n.touched&&n.domRef&&(t.removeChild(n.domRef),delete He.svgNodeCache[e][r])})}function kU(t,e){const r=gme(t);e(r),r.clearUntouched()}function Zc(t,e,r){return`${t}::${e}::${r}`}function Za(t,e){Object.keys(t).forEach(r=>{const n=e.getAttribute(r),i=t[r];i===void 0||i===""?e.removeAttribute(r):n!==i&&e.setAttribute(r,i)})}function Qc(t,e){Object.keys(t).forEach(r=>{const n=t[r];n!==void 0&&n!==""&&e.setAttribute(r,n)})}function ua(t,e,r,n,i,o={},a=""){const{color:s,fill:c,width:l,lineWidth:f,lineDash:u,fillOpacity:d,strokeOpacity:h}=Object.assign({color:"rgb(0, 255, 0)",fill:"transparent",width:"2",lineDash:void 0,lineWidth:void 0,strokeOpacity:1,fillOpacity:1},o),g=f||l,p="http://www.w3.org/2000/svg",v=Zc(e,"circle",r),y=t.getSvgNode(v),m={cx:`${n[0]}`,cy:`${n[1]}`,r:`${i}`,stroke:s,fill:c,"stroke-width":g,"stroke-dasharray":u,"fill-opacity":d,"stroke-opacity":h};if(y)Za(m,y),t.setNodeTouched(v);else{const w=document.createElementNS(p,"circle");a!==""&&w.setAttribute("data-id",a),Qc(m,w),t.appendNode(w,v)}}function JE(t,e,r,n,i={},o=""){const{color:a,width:s,lineWidth:c,lineDash:l}=Object.assign({color:"rgb(0, 255, 0)",width:"2",lineWidth:void 0,lineDash:void 0},i),f=c||s,u="http://www.w3.org/2000/svg",d=Zc(e,"ellipse",r),h=t.getSvgNode(d),[g,p,v,y]=n,m=Math.hypot(v[0]-y[0],v[1]-y[1]),w=Math.hypot(p[0]-g[0],p[1]-g[1]),x=Math.atan2(v[1]-y[1],v[0]-y[0])*180/Math.PI,C=[(v[0]+y[0])/2,(p[1]+g[1])/2],S=m/2,T=w/2,_={cx:`${C[0]}`,cy:`${C[1]}`,rx:`${S}`,ry:`${T}`,stroke:a,fill:"transparent",transform:`rotate(${x} ${C[0]} ${C[1]})`,"stroke-width":f,"stroke-dasharray":l};if(h)Za(_,h),t.setNodeTouched(d);else{const E=document.createElementNS(u,"ellipse");o!==""&&E.setAttribute("data-id",o),Qc(_,E),t.appendNode(E,d)}}function xme(t,e,r,n,i,o={},a=""){const s=[(n[0]+i[0])/2,n[1]],c=[(n[0]+i[0])/2,i[1]],l=[n[0],(n[1]+i[1])/2],f=[i[0],(n[1]+i[1])/2];JE(t,e,r,[c,s,l,f],o={},a="")}function s5(t,e,r,n,i={},o){const{color:a,handleRadius:s,width:c,lineWidth:l,fill:f,type:u,opacity:d}=Object.assign({color:"rgb(0, 255, 0)",handleRadius:"6",width:"2",lineWidth:void 0,fill:"transparent",type:"circle",opacity:1},i),h=l||c,g="http://www.w3.org/2000/svg",p=Zc(e,"handle",`hg-${r}-index-${o}`);let v;if(u==="circle")v={cx:`${n[0]}`,cy:`${n[1]}`,r:s,stroke:a,fill:f,"stroke-width":h,opacity:d};else if(u==="rect"){const w=parseFloat(s)*1.5,x=n[0]-w*.5,C=n[1]-w*.5;v={x:`${x}`,y:`${C}`,width:`${w}`,height:`${w}`,stroke:a,fill:f,"stroke-width":h,rx:`${w*.1}`,opacity:d}}else throw new Error(`Unsupported handle type: ${u}`);const y=t.getSvgNode(p);if(y)Za(v,y),t.setNodeTouched(p);else{const m=document.createElementNS(g,u);Qc(v,m),t.appendNode(m,p)}}function ur(t,e,r,n,i={}){n.forEach((o,a)=>{s5(t,e,r,o,i,a)})}function Tn(t,e,r,n,i,o={},a=""){if(isNaN(n[0])||isNaN(n[1])||isNaN(i[0])||isNaN(i[1]))return;const{color:s="rgb(0, 255, 0)",width:c=10,lineWidth:l,lineDash:f,markerStartId:u=null,markerEndId:d=null,shadow:h=!1,strokeOpacity:g=1}=o,p=l||c,v="http://www.w3.org/2000/svg",y=Zc(e,"line",r),m=t.getSvgNode(y),w=t.svgLayerElement.id,x=h?`filter:url(#shadow-${w});`:"",C={x1:`${n[0]}`,y1:`${n[1]}`,x2:`${i[0]}`,y2:`${i[1]}`,stroke:s,style:x,"stroke-width":p,"stroke-dasharray":f,"marker-start":u?`url(#${u})`:"","marker-end":d?`url(#${d})`:"","stroke-opacity":g};if(m)Za(C,m),t.setNodeTouched(y);else{const S=document.createElementNS(v,"line");a!==""&&S.setAttribute("data-id",a),Qc(C,S),t.appendNode(S,y)}}function VU(t,e,r,n,i,o={}){if(isNaN(n[0])||isNaN(n[1])||isNaN(i[0])||isNaN(i[1]))return;const{color:a,width:s,lineWidth:c,lineDash:l}=Object.assign({color:"rgb(0, 255, 0)",width:"2",lineWidth:void 0,lineDash:void 0},o),f=i[0]+(n[0]-i[0])/2,u=[f,n[1]],d=[f,i[1]],h={start:n,end:u},g={start:u,end:d},p={start:d,end:i};Tn(t,e,"1",h.start,h.end,{color:a,width:s,lineWidth:c,lineDash:l}),Tn(t,e,"2",g.start,g.end,{color:a,width:s,lineWidth:c,lineDash:l}),Tn(t,e,"3",p.start,p.end,{color:a,width:s,lineWidth:c,lineDash:l})}function ac(t,e,r,n,i){if(n.length<2)return;const{color:o="rgb(0, 255, 0)",width:a=10,fillColor:s="none",fillOpacity:c=0,lineWidth:l,lineDash:f,closePath:u=!1,markerStartId:d=null,markerEndId:h=null}=i,g=l||a,p="http://www.w3.org/2000/svg",v=Zc(e,"polyline",r),y=t.getSvgNode(v);let m="";for(const x of n)m+=`${x[0].toFixed(1)}, ${x[1].toFixed(1)} `;if(u){const x=n[0];m+=`${x[0]}, ${x[1]}`}const w={points:m,stroke:o,fill:s,"fill-opacity":c,"stroke-width":g,"stroke-dasharray":f,"marker-start":d?`url(#${d})`:"","marker-end":h?`url(#${h})`:""};if(y)Za(w,y),t.setNodeTouched(v);else{const x=document.createElementNS(p,"polyline");Qc(w,x),t.appendNode(x,v)}}function Pl(t,e,r,n,i){const a=n.length&&n[0].length&&Array.isArray(n[0][0])?n:[n],{color:s="rgb(0, 255, 0)",width:c=10,fillColor:l="none",fillOpacity:f=0,lineWidth:u,lineDash:d,closePath:h=!1}=i,g=u||c,p="http://www.w3.org/2000/svg",v=Zc(e,"path",r),y=t.getSvgNode(v);let m="";for(let x=0,C=a.length;xm.length){for(let C=0;C0?BS(n,i):i,c=_me(o),l=BS(c,s),f=Object.assign({color:"rgb(255, 255, 0)",lineWidth:"1",lineDash:"2,3"},a);Tn(t,e,`link-${r}`,s,l,f)}function _me(t){const{x:e,y:r,height:n,width:i}=t,o=i/2,a=n/2,s=[e+o,r],c=[e,r+a],l=[e+o,r+n],f=[e+i,r+a];return[s,c,l,f]}function uo(t,e,r,n,i,o,a,s={}){const c=Object.assign({handleRadius:"6",centering:{x:!1,y:!0}},s),l=rf(t,e,r,n,i,c);return Tme(t,e,r,o,i,l,c),l}function ZE(t,e,r,n,i={},o=""){const{color:a,width:s,lineWidth:c,lineDash:l}=Object.assign({color:"rgb(0, 255, 0)",width:"2",lineWidth:void 0,lineDash:void 0},i),f=c||s,u="http://www.w3.org/2000/svg",d=Zc(e,"rect",r),h=t.getSvgNode(d),[g,p,v,y]=n,m=Math.hypot(g[0]-p[0],g[1]-p[1]),w=Math.hypot(g[0]-v[0],g[1]-v[1]),x=[(y[0]+g[0])/2,(y[1]+g[1])/2],C=[(v[0]+g[0])/2,(v[1]+g[1])/2],S=Math.atan2(x[1]-C[1],x[0]-C[0])*180/Math.PI,T={x:`${x[0]-m/2}`,y:`${x[1]-w/2}`,width:`${m}`,height:`${w}`,stroke:a,fill:"transparent",transform:`rotate(${S} ${x[0]} ${x[1]})`,"stroke-width":f,"stroke-dasharray":l};if(h)Za(T,h),t.setNodeTouched(d);else{const _=document.createElementNS(u,"rect");o!==""&&_.setAttribute("data-id",o),Qc(T,_),t.appendNode(_,d)}}function Tm(t,e,r,n,i,o={},a=""){const s=[n[0],n[1]],c=[i[0],n[1]],l=[n[0],i[1]],f=[i[0],i[1]];ZE(t,e,r,[s,c,l,f],o,a)}const wI="http://www.w3.org/2000/svg";function c5(t,e,r,n,i,o={}){if(isNaN(n[0])||isNaN(n[1])||isNaN(i[0])||isNaN(i[1]))return;const{viaMarker:a=!1,color:s="rgb(0, 255, 0)",markerSize:c=10}=o;if(!a){Eme(t,e,r,n,i,o);return}const l=t.svgLayerElement.id,u=`${`arrow-${e}`}-${l}`,d=t.svgLayerElement.querySelector("defs");let h=d.querySelector(`#${u}`);if(h){h.setAttribute("markerWidth",`${c}`),h.setAttribute("markerHeight",`${c}`);const g=h.querySelector("path");g&&g.setAttribute("fill",s)}else{h=document.createElementNS(wI,"marker"),h.setAttribute("id",u),h.setAttribute("viewBox","0 0 10 10"),h.setAttribute("refX","8"),h.setAttribute("refY","5"),h.setAttribute("markerWidth",`${c}`),h.setAttribute("markerHeight",`${c}`),h.setAttribute("orient","auto");const g=document.createElementNS(wI,"path");g.setAttribute("d","M 0 0 L 10 5 L 0 10 z"),g.setAttribute("fill",s),h.appendChild(g),d.appendChild(h)}o.markerEndId=u,Tn(t,e,r,n,i,o)}function Eme(t,e,r,n,i,o={}){const{color:a="rgb(0, 255, 0)",width:s=2,lineWidth:c,lineDash:l}=o,f=10,u=Math.atan2(i[1]-n[1],i[0]-n[0]),d={start:[i[0]-f*Math.cos(u-Math.PI/7),i[1]-f*Math.sin(u-Math.PI/7)],end:i},h={start:[i[0]-f*Math.cos(u+Math.PI/7),i[1]-f*Math.sin(u+Math.PI/7)],end:i};Tn(t,e,r,n,i,{color:a,width:s,lineWidth:c,lineDash:l}),Tn(t,e,"2",d.start,d.end,{color:a,width:s,lineWidth:c,lineDash:l}),Tn(t,e,"3",h.start,h.end,{color:a,width:s,lineWidth:c,lineDash:l})}function FU(t,e,r,n,i,o={}){const{color:a,width:s,lineWidth:c,lineDash:l}=Object.assign({color:"rgb(0, 255, 0)",width:"2",lineWidth:void 0,lineDash:void 0},o),f=c||s,u="http://www.w3.org/2000/svg",d=Zc(e,"rect",r),h=t.getSvgNode(d),g=[Math.min(n[0],i[0]),Math.min(n[1],i[1])],p=Math.abs(n[0]-i[0]),v=Math.abs(n[1]-i[1]),y={x:`${g[0]}`,y:`${g[1]}`,width:`${p}`,height:`${v}`,stroke:a,fill:"black","stroke-width":f,"stroke-dasharray":l};if(h)Za(y,h),t.setNodeTouched(d);else{const m=document.createElementNS(u,"rect");Qc(y,m),t.appendNode(m,d)}}const bme=Object.freeze(Object.defineProperty({__proto__:null,draw:kU,drawArrow:c5,drawCircle:ua,drawEllipse:xme,drawEllipseByCoordinates:JE,drawFan:WS,drawHandle:s5,drawHandles:ur,drawHeight:VU,drawLine:Tn,drawLinkedTextBox:uo,drawPath:Pl,drawPolyline:ac,drawRect:Tm,drawRectByCoordinates:ZE,drawRedactionRect:FU,drawTextBox:rf,setAttributesIfNecessary:Za,setNewAttributesIfValid:Qc},Symbol.toStringTag,{value:"Module"}));function UU(t,e){const r=Se(t),{renderingEngineId:n,viewportId:i}=r,o=Fr(i,n);if(!o)return[];const a=[],s=Object.keys(o.toolOptions);for(let c=0;c{this._throwIfDestroyed();const e=Array.from(this._viewportElements.values());for(let r=0;r{this._needsRender.add(r)}),this._renderFlaggedViewports()}_setViewportsToBeRenderedNextFrame(e){const r=[...this._viewportElements.values()];e.forEach(n=>{r.indexOf(n)!==-1&&this._needsRender.add(n)}),this._render()}_render(){this._needsRender.size>0&&this._animationFrameSet===!1&&(this._animationFrameHandle=window.requestAnimationFrame(this._renderFlaggedViewports),this._animationFrameSet=!0)}_triggerRender(e){const r=Se(e);if(!r)return;if(!ni(r.renderingEngineId)){console.warn("rendering Engine has been destroyed");return}const i=UU(e,[Dme,Ime,Ome]),{renderingEngineId:o,viewportId:a}=r,s={element:e,renderingEngineId:o,viewportId:a};kU(e,c=>{let l=!1;const f=u=>{if(u.renderAnnotation){const d=u.renderAnnotation(r,c);l=l||d}};i.forEach(f),l&&it(e,k.ANNOTATION_RENDERED,{...s})})}_reset(){window.cancelAnimationFrame(this._animationFrameHandle),this._needsRender.clear(),this._animationFrameSet=!1,this._animationFrameHandle=null,this._setAllViewportsToBeRenderedNextFrame()}}const QE=new Mme;function Xh(t){QE.renderViewport(t)}function Ne(t){t.length&&t.forEach(e=>{const r=qn(e);if(!r){console.warn(`Viewport not available for ${e}`);return}const{viewport:n}=r;if(!n){console.warn(`Viewport not available for ${e}`);return}const i=n.element;Xh(i)})}function BU(t,e){const r=t.length,n=[];for(let i=0;i{const i=n.getCamera();return Math.abs(Pt(i.viewPlaneNormal,e.viewPlaneNormal))>r})}function Ot(t,e,r=!0){const n=Se(t),{renderingEngine:i,FrameOfReferenceUID:o}=n;let a=i.getViewports();a=BU(a,o),a=Nw(a,e);const s=i.getViewport(n.viewportId);return r&&(a=GU(a,s.getCamera())),a.map(l=>l.id)}const Nme=Object.freeze(Object.defineProperty({__proto__:null,filterViewportsWithFrameOfReferenceUID:BU,filterViewportsWithParallelNormals:GU,filterViewportsWithToolEnabled:Nw,getViewportIdsWithToolToRender:Ot},Symbol.toStringTag,{value:"Module"})),l5="PlanarFreehandContourSegmentationTool";function of(t,e){const r=t.length,n=new Array(r);for(let i=0;i{const n=r,i=of(n.data.contour.polyline,t);return{annotation:n,polyline:i}})}function Vw(t,e,r){pm(e,r),Ul(r);const{contour:n}=r.data,i=of(n.polyline,t);fc(r,{points:i,closed:n.closed,targetWindingDirection:e.data.contour.windingDirection===la.Clockwise?la.CounterClockwise:la.Clockwise},t);const{element:o}=t;n8(t,[e,r])}function t8(t,e,r,n,i){var m;if(!Dw(l5)){console.warn(`${l5} is not registered in cornerstone. Cannot combine polylines.`);return}const o=i[0],a=tf(r,o),s=WU(t,e),c=new Set(s),l=new Map,f=(w,x)=>{let C=l.get(w);C||(C=[],l.set(w,C)),C.push(x),c.delete(x)},u=[];if(a){const w=Lw(r,i);u.push(w),Array.from(c.keys()).forEach(x=>f(w,x))}else Aw(r,i).forEach(x=>{u.push(x),Array.from(c.keys()).forEach(C=>{Cm(x,C.polyline)&&f(x,C)})});Array.from(l.values()).forEach(w=>w.forEach(x=>bw(x.annotation)));const{element:d}=t,{metadata:h,data:g}=e,{handles:p,segmentation:v}=g,{textBox:y}=p;yn(n.annotationUID),yn(e.annotationUID),Ul(n),Ul(e);for(let w=0;wpm(C,S.annotation))}n8(t,[e,n])}function zU(t,e,r){const n=t.canvasToWorld(r[0]),i=t.canvasToWorld(r[r.length-1]),o={metadata:{...e.metadata,toolName:l5,originalToolName:e.metadata.originalToolName||e.metadata.toolName},data:{cachedStats:{},handles:{points:[n,i],textBox:e.data.handles.textBox?{...e.data.handles.textBox}:void 0},contour:{polyline:[],closed:!0},spline:e.data.spline,segmentation:{...e.data.segmentation}},annotationUID:kn(),highlighted:!0,invalidated:!0,isLocked:!1,isVisible:void 0,interpolationUID:e.interpolationUID,interpolationCompleted:e.interpolationCompleted};return fc(o,{points:r,closed:!0,targetWindingDirection:la.Clockwise},t),o}function n8(t,e){const{element:r}=t,n=new Set([l5]);e.forEach(i=>{n.add(i.metadata.toolName)});for(const i of n.values())if(Dw(i)){const o=Ot(r,i);Ne(o)}}function Fw(t,e){const r=[],n=new Set,i=new Set;for(let o=0;o[...r]);let e=t[0].map(r=>[...r]);for(let r=1;ru5(o.data.contour.polyline,r)),i=e.map(o=>u5(o.data.contour.polyline,r));return Fw(n,i)}function u5(t,e){const r=t.length,n=new Array(r);for(let i=0;i[...n]);let r=t.map(n=>[...n]);for(let n=0;nu5(o.data.contour.polyline,r)),i=e.map(o=>u5(o.data.contour.polyline,r));return Uw(n,i)}const Bme="PlanarFreehandContourSegmentationTool";function $U(t,e,r,n){const i=new Map;return r.forEach(o=>{if(o.length<3)return;const a={annotationUID:kn(),data:{contour:{closed:!0,polyline:o},segmentation:{segmentationId:e,segmentIndex:n},handles:{}},handles:{},highlighted:!1,autoGenerated:!1,invalidated:!1,isLocked:!1,isVisible:!0,metadata:{toolName:Bme,...t.getViewReference()}};ln(a,t.element);const s=(i==null?void 0:i.get(n))||new Set;s.add(a.annotationUID),i.set(n,s)}),i}function xI(t,e){const r=[],{annotationUIDsMap:n}=t,i=n.get(e);for(const o of i){const a=ri(o),{polyline:s}=a.data.contour;r.push(s)}return r}function jU(t,e,r,n){if(!e||!e.representationData.Contour)return;const i=e.representationData.Contour,{annotationUIDsMap:o}=i;if(!o||!o.get(r)||!o.get(n))return;const a=xI(i,r),s=xI(i,n),c=a.map(f=>of(f,t)),l=s.map(f=>of(f,t));return{polyLinesCanvas1:c,polyLinesCanvas2:l}}function Gme(t,e,r,n,{name:i,segmentIndex:o,color:a}){const{polyLinesCanvas1:s,polyLinesCanvas2:c}=jU(t,e,r,n)||{};if(!s||c)return;const f=Fw(s,c).map(g=>e8(g,t)),u=$U(t,e.segmentationId,f,o),d=e.representationData.Contour,{annotationUIDsMap:h}=d;h&&h.set(o,u.get(o))}function Wme(t,e,r,n,{name:i,segmentIndex:o,color:a}){const{polyLinesCanvas1:s,polyLinesCanvas2:c}=jU(t,e,r,n)||{};if(!s||c)return;const f=Uw(s,c).map(g=>e8(g,t)),u=$U(t,e.segmentationId,f,o),d=e.representationData.Contour,{annotationUIDsMap:h}=d;h&&h.set(o,u.get(o))}function _m(t){var e;return!!((e=t.data)!=null&&e.segmentation)}function HU(t,e,r){const n=[],i=nf(e);for(let o=0;oa.isContourHole),o=n.filter(a=>!a.isContourHole);if(i.length>0){const a=i[0];qme(t,a.targetAnnotation,e),qU(t,[e,a.targetAnnotation]);return}if(o.length!==0){if(!Dw(f5)){console.warn(`${f5} is not registered in cornerstone. Cannot process multiple intersections.`);return}$me(t,e,r,o)}}function $me(t,e,r,n){const{element:i}=t,o=[e],a=[],s=[];n.forEach(({targetAnnotation:d})=>{const h=Kme(t,d);s.push(...h),o.push(d)});const c=r[0];if(n.some(({targetPolyline:d})=>tf(d,c))){let d=r;n.forEach(({targetPolyline:h})=>{d=Lw(d,h)}),a.push(d)}else n.forEach(({targetPolyline:d})=>{const h=Aw(d,r);a.push(...h)});o.forEach(d=>{yn(d.annotationUID),Ul(d)}),s.forEach(d=>bw(d.annotation));const f=n[0].targetAnnotation,u=[];a.forEach(d=>{if(!d||d.length<3){console.warn("Skipping creation of new annotation due to invalid polyline:",d);return}const h=jme(t,f,d);ln(h,i),Bl(h),cn(h,t.element),u.push(h)}),Hme(t,s,u),qU(t,o)}function jme(t,e,r){const n=t.canvasToWorld(r[0]),i=t.canvasToWorld(r[r.length-1]),o={metadata:{...e.metadata,toolName:f5,originalToolName:e.metadata.originalToolName||e.metadata.toolName},data:{cachedStats:{},handles:{points:[n,i],textBox:e.data.handles.textBox?{...e.data.handles.textBox}:void 0},contour:{polyline:[],closed:!0},spline:e.data.spline,segmentation:{...e.data.segmentation}},annotationUID:kn(),highlighted:!0,invalidated:!0,isLocked:!1,isVisible:void 0,interpolationUID:e.interpolationUID,interpolationCompleted:e.interpolationCompleted};return fc(o,{points:r,closed:!0,targetWindingDirection:la.Clockwise},t),o}function Hme(t,e,r){e.forEach(n=>{const i=r.find(o=>{const a=r8(o.data.contour.polyline,t);return Cm(a,n.polyline)});i&&pm(i,n.annotation)})}function Kme(t,e){return mm(e).map(r=>{const n=r,i=r8(n.data.contour.polyline,t);return{annotation:n,polyline:i}})}function qme(t,e,r){pm(e,r),Ul(r);const{contour:n}=r.data,i=r8(n.polyline,t);fc(r,{points:i,closed:n.closed,targetWindingDirection:e.data.contour.windingDirection===la.Clockwise?la.CounterClockwise:la.Clockwise},t)}function r8(t,e){const r=t.length,n=new Array(r);for(let i=0;i{n.add(i.metadata.toolName)});for(const i of n.values())if(Dw(i)){const o=Ot(r,i);Ne(o)}}const{isEqual:CI}=Vn;function i8(t){const{metadata:e}=t;return vV().filter(r=>{if(r.FrameOfReferenceUID===e.FrameOfReferenceUID){const n=r.viewport,{viewPlaneNormal:i,viewUp:o}=n.getCamera();return CI(i,e.viewPlaneNormal)&&(!e.viewUp||CI(o,e.viewUp))}}).map(r=>r.viewport)}async function Xme(t,e,r,n=!0){const i=typeof t=="string"?ri(t):t,o=typeof e=="string"?ri(e):e;if(!i||!o)throw new Error("Both source and target annotations must be valid");r||(r=Yme(i));const a=of(i.data.contour.polyline,r),s=of(o.data.contour.polyline,r),c=kw(a,s);if(!c.hasIntersection){console.warn("No intersection found between the two annotations");return}if(c.isContourHole){if(!n){console.warn("Hole processing is disabled");return}Vw(r,o,i)}else t8(r,o,s,i,a)}function Yme(t){const e=i8(t);if(!e.length)throw new Error("No viewport found for the annotation");return e[0]}const Jme=Object.freeze(Object.defineProperty({__proto__:null,addContourSegmentationAnnotation:Bl,addition:Gme,areSameSegment:sU,checkIntersection:kw,combinePolylines:t8,contourSegmentationOperation:Xme,convertContourPolylineToCanvasSpace:of,convertContourPolylineToWorld:e8,convertContourSegmentationAnnotation:GE,createNewAnnotationFromPolyline:zU,createPolylineHole:Vw,findAllIntersectingContours:HU,getContourHolesData:WU,isContourSegmentationAnnotation:_m,processMultipleIntersections:KU,removeContourSegmentationAnnotation:Ul,subtractAnnotationPolylines:Ume,subtractMultiplePolylineSets:Fme,subtractPolylineSets:Uw,subtraction:Wme,unifyAnnotationPolylines:Vme,unifyMultiplePolylineSets:kme,unifyPolylineSets:Fw,updateViewportsForAnnotations:n8},Symbol.toStringTag,{value:"Module"}));function Zme(t){if(!t)throw new Error(`No contours found for geometryId ${t.id}`);const e=t.id;if(t.type!==Pc.CONTOUR)throw new Error(`Geometry type ${t.type} not supported for rendering.`);if(!t.data){console.warn(`No contours found for geometryId ${e}. Skipping render.`);return}}function Qme(t,e,r,n){r.size?t.render():e2e(t,e,n)}function e2e(t,e,r){const{segmentationId:n}=r,i=new Map;e.forEach(o=>{const a=Fe.getGeometry(o);if(!a){console.warn(`No geometry found for geometryId ${o}. Skipping render.`);return}const s=a.data.segmentIndex;Zme(a);const c=qa.getStyle({viewportId:t.id,segmentationId:n,type:Lt.Contour,segmentIndex:s}),l=a.data,f=t.getCamera().viewPlaneNormal;l.contours.forEach(u=>{const{points:d,color:h,id:g}=u,p=FE(t,d[0],f),v={annotationUID:kn(),data:{contour:{closed:!0,polyline:d},segmentation:{segmentationId:n,segmentIndex:s,color:h,id:g},handles:{}},handles:{},highlighted:!1,autoGenerated:!1,invalidated:!1,isLocked:!0,isVisible:!0,metadata:{referencedImageId:p,toolName:"PlanarFreehandContourSegmentationTool",FrameOfReferenceUID:t.getFrameOfReferenceUID(),viewPlaneNormal:t.getCamera().viewPlaneNormal}},y=t.element;ln(v,y),Bl(v)}),c&&i.set(s,c)}),t.render()}function t2e(t,e,r=!1){const n=zn(e),{annotationUIDsMap:i}=n.representationData.Contour;i.forEach(o=>{o.forEach(a=>{yn(a)})})}function XU(t){const e=Kpe(t);if(e)return e;const r=zn(t);if(!r)throw new Error(`No segmentation found for segmentationId ${t}`);let n;if(r.representationData.Labelmap)n=n2e(r,t);else if(r.representationData.Contour)n=o2e(r);else if(r.representationData.Surface)n=a2e(r);else throw new Error(`Unsupported segmentation type: ${r.representationData}`);return qpe(t,n),n}function n2e(t,e){const r=t.representationData[Lt.Labelmap],n=new Set;return r.imageIds?i2e(n,r.imageIds):r2e(n,e),Array.from(n).map(Number).sort((i,o)=>i-o)}function r2e(t,e){Fe.getVolume(e).voxelManager.forEach(({value:n})=>{n!==0&&t.add(n)})}function i2e(t,e){e.forEach(r=>{Fe.getImage(r).voxelManager.getScalarData().forEach(o=>{o!==0&&t.add(o)})})}function o2e(t){const{annotationUIDsMap:e,geometryIds:r}=t.representationData.Contour||{};if(!r)throw new Error(`No geometryIds found for segmentationId ${t.segmentationId}`);const n=new Set([...e.keys()]);return r.forEach(i=>{const o=Fe.getGeometry(i);n.add(o.data.segmentIndex)}),Array.from(n).sort((i,o)=>i-o)}function a2e(t){var r;const e=((r=t.representationData.Surface)==null?void 0:r.geometryIds)??[];return Array.from(e.keys()).map(Number).sort((n,i)=>n-i)}const n0=new Map,SI=new Map;function s2e(t,e,r=!1){const n=qn(t);if(!n)return;const{viewport:i}=n;t2e(t,e),r&&i.render()}async function c2e(t,e){var l,f;const{segmentationId:r}=e,n=zn(r);if(!n)return;let i=n.representationData[Lt.Contour];const o=Ml();if(!i&&((l=Ml())!=null&&l.canComputeRequestedRepresentation(r,Lt.Contour))&&!n0.get(t.id)?(n0.set(t.id,!0),i=await kE(r,Lt.Contour,()=>o.computeContourData(r,{viewport:t}),()=>{}),n0.set(t.id,!1)):!i&&!Ml()&&console.debug(`No contour data found for segmentationId ${r} and PolySeg add-on is not configured. Unable to convert from other representations to contour. Please register PolySeg using cornerstoneTools.init({ addons: { polySeg } }) to enable automatic conversion.`),!i||!((f=i.geometryIds)!=null&&f.length))return;let a=!1;const s=t.getCamera().viewPlaneNormal;i.annotationUIDsMap&&(a=!u2e(i.annotationUIDsMap,s)),i.geometryIds.length>0&&(a=!l2e(i.geometryIds,s));const c=SI.get(t.id)||new Set;if(a&&!n0.get(t.id)&&!c.has(r)&&t.viewportStatus===Uo.RENDERED){n0.set(t.id,!0);const u=XU(r),h=(await o.computeSurfaceData(r,{segmentIndices:u,viewport:t})).geometryIds,g=[];for(const m of h.values()){const x=Fe.getGeometry(m).data;g.push({points:x.points,polys:x.polys,segmentIndex:x.segmentIndex,id:x.segmentIndex})}const p=await o.clipAndCacheSurfacesForViewport(g,t),v=o.extractContourData(p),y=o.createAndAddContourSegmentationsFromClippedSurfaces(v,t,r);i.annotationUIDsMap=new Map([...i.annotationUIDsMap,...y]),c.add(r),SI.set(t.id,c),n0.set(t.id,!1)}Qme(t,i.geometryIds,i.annotationUIDsMap,e)}function l2e(t,e){var u,d,h;let r=null,n=null;for(const g of t){const p=Fe.getGeometry(g);if(!p)continue;const v=p.data;if(((h=(d=(u=v.contours)==null?void 0:u[0])==null?void 0:d.points)==null?void 0:h.length)>=3){r=p,n=v;break}}if(!r||!n)return!1;const o=n.contours[0].points,a=o[0],s=o[1],c=o[2];let l=Wn(Ge(),Nn(Ge(),s,a),Nn(Ge(),c,a));l=rr(Ge(),l);const f=Pt(l,e);return Math.abs(f)>.9}function u2e(t,e){const r=Array.from(t.values()).flat().map(i=>Array.from(i)).flat(),n=dE(r,3);for(const i of n){const o=ri(i);if(o!=null&&o.metadata){if(!o.metadata.viewPlaneNormal)continue;const a=o.metadata.viewPlaneNormal,s=Math.abs(e[0]*a[0]+e[1]*a[1]+e[2]*a[2]);if(Math.abs(s-1)>.01)return!1}}return!0}const YU={render:c2e,removeRepresentation:s2e};function mf(t,e){return Wl(t,e)[0]}function Wl(t,e){return sr.getCurrentLabelmapImageIdsForViewport(t,e)}function f2e(t,e){return sr.getLabelmapImageIdsForImageId(t,e)}const TI=new Map,d2e=({cfun:t,ofun:e,actor:r})=>{r.getProperty().setRGBTransferFunction(1,t),r.getProperty().setScalarOpacity(1,e)};async function h2e({viewport:t,volumeInputs:e,segmentationId:r}){var E;const n=t.getDefaultActor(),{actor:i}=n,{uid:o,callback:a}=n,s=t.getVolumeId();if((E=TI.get(o))!=null&&E.added)return{uid:o,actor:i};const c=e,l=Fe.getVolume(c[0].volumeId);if(!l)throw new Error(`imageVolume with id: ${l.volumeId} does not exist`);const{volumeId:f}=c[0],u=await K4(f);if(!u)throw new Error(`segImageVolume with id: ${u.volumeId} does not exist`);const h=u.voxelManager.getCompleteScalarDataArray(),{imageData:g}=u,p=Fe.getVolume(s),y=p.voxelManager.getCompleteScalarDataArray(),m=2,w=new Float32Array(m*p.voxelManager.getScalarDataLength()),x=g.getDimensions();for(let b=0;bte);for(const X of j)for(let te=0;te{Je.removeEventListener(k.SEGMENTATION_DATA_MODIFIED,_);const D=t.getActor(o),{element:I,id:P}=t;t.removeActors([o]);const O=await Vy({volumeId:o,blendMode:Mc.MAXIMUM_INTENSITY_BLEND,callback:({volumeActor:A})=>{D.callback&&D.callback({volumeActor:A,volumeId:f})}},I,P);t.addActor({actor:O,uid:o}),t.render()}),{uid:o,actor:i}}const{uuidv4:JU}=Vn;async function g2e(t,e,r,n){const i=Se(t),{renderingEngine:o,viewport:a}=i,{id:s}=a,c=!0,l=!1,f=!0;if(a instanceof Or){const d=p2e(e,r);Fe.getVolume(d)||await m2e(e);let h=(n==null?void 0:n.blendMode)??Mc.MAXIMUM_INTENSITY_BLEND,g=h===Mc.LABELMAP_EDGE_PROJECTION_BLEND;if(g){const v=a.getVolumeId(),y=Fe.getVolume(v),w=Fe.getVolume(d).dimensions,x=y.dimensions;(w[0]!==x[0]||w[1]!==x[1]||w[2]!==x[2])&&(g=!1,h=Mc.MAXIMUM_INTENSITY_BLEND,console.debug("Dimensions mismatch - falling back to regular volume addition"))}const p=[{volumeId:d,visibility:c,representationUID:`${r}-${Lt.Labelmap}`,useIndependentComponents:g,blendMode:h}];if(!p[0].useIndependentComponents)await kk(o,p,[s],l,f);else return await h2e({viewport:a,volumeInputs:p,segmentationId:r})}else{const d=Wl(a.id,r).map(h=>({imageId:h,representationUID:`${r}-${Lt.Labelmap}-${h}`}));Vk(o,d,[s])}bo(r)}function p2e(t,e){let{volumeId:r}=t;if(!r){r=JU();const n=zn(e);n.representationData.Labelmap={...n.representationData.Labelmap,volumeId:r},t.volumeId=r,ns(e)}return r}async function m2e(t){const e=t;if(!(e.imageIds.length>0))throw new Error("cannot create labelmap, no imageIds found for the volume labelmap");return await q4(t.volumeId||JU(),e.imageIds)}function v2e(t,e){const r=Se(t),{viewport:n}=r;n.removeActors([a1e(n.id,e)])}function Dd(t){return sr.getActiveSegmentation(t)}function y2e(t,e){sr.setActiveSegmentation(t,e)}function Kl(t){return Dd(t)}function w2e(t,e){y2e(t,e)}const x2e=Object.freeze(Object.defineProperty({__proto__:null,getActiveSegmentation:Kl,setActiveSegmentation:w2e},Symbol.toStringTag,{value:"Module"}));function Ra(t){const e=zn(t);if(e){const r=Object.keys(e.segments).find(n=>e.segments[n].active);return r?Number(r):void 0}}const _3=255,Sp=new Map;let E3=!1;function C2e(t,e,r=!1){const n=qn(t);if(Sp.forEach((o,a)=>{a.includes(e)&&Sp.delete(a)}),!n)return;const{viewport:i}=n;v2e(i.element,e),r&&i.render()}async function S2e(t,e){var s;const{segmentationId:r,config:n}=e,i=zn(r);if(!i){console.warn("No segmentation found for segmentationId: ",r);return}let o=i.representationData[Lt.Labelmap],a=Cp(t.id,r);if(!o&&((s=Ml())!=null&&s.canComputeRequestedRepresentation(r,Lt.Labelmap))&&!E3){E3=!0;const c=Ml();if(o=await kE(r,Lt.Labelmap,()=>c.computeLabelmapData(r,{viewport:t}),()=>null,()=>{sr.processLabelmapRepresentationAddition(t.id,r),setTimeout(()=>{bo(r)},0)}),!o)throw new Error(`No labelmap data found for segmentationId ${r}.`);E3=!1}else!o&&!Ml()&&console.debug(`No labelmap data found for segmentationId ${r} and PolySeg add-on is not configured. Unable to convert from other representations to labelmap. Please register PolySeg using cornerstoneTools.init({ addons: { polySeg } }) to enable automatic conversion.`);if(o){if(t instanceof vr)a!=null&&a.length||await EI(t,o,r,n),a=Cp(t.id,r);else{const c=Wl(t.id,r);if(!(c!=null&&c.length))return;a||await EI(t,o,r,n),a=Cp(t.id,r)}if(a!=null&&a.length)for(const c of a)T2e(t.id,c,e)}}function T2e(t,e,r){var C;const{segmentationId:n}=r,{cfun:i,ofun:o}=r.config,{colorLUTIndex:a}=r,s=Kl(t),c=(s==null?void 0:s.segmentationId)===n,l=qa.getStyle({viewportId:t,type:Lt.Labelmap,segmentationId:n}),f=qa.getRenderInactiveSegmentations(t),u=ym(a),d=Math.min(256,u.length),{outlineWidth:h,renderOutline:g,outlineOpacity:p,activeSegmentOutlineWidthDelta:v}=_I(l,c),y=VE(t,{segmentationId:n,type:Lt.Labelmap});for(let S=0;So.getCurrentImageId()===r),!i||!i.length)?void 0:i[0].getImageData()}else if(e.startsWith("volumeId:")){const r=Jc(e),n=om(r);return!n||!n.length?void 0:n[0].getImageData()}else if(e.startsWith("videoId:")){const r=Hr(e),n=Gy(r);return!n||!n.length?void 0:n[0].getImageData()}else throw new Error('getTargetIdImage: targetId must start with "imageId:" or "volumeId:"')}getTargetId(e){var n;const r=(n=e.getViewReferenceId)==null?void 0:n.call(e);if(r)return r;throw new Error("getTargetId: viewport must have a getViewReferenceId method")}undo(){this.doneEditMemo(),k2.undo()}redo(){k2.redo()}static createZoomPanMemo(e){const r={pan:e.getPan(),zoom:e.getZoom()},n={restoreMemo:()=>{const i=e.getPan(),o=e.getZoom();e.setZoom(r.zoom),e.setPan(r.pan),e.render(),r.pan=i,r.zoom=o}};return k2.push(n),n}doneEditMemo(){var e,r;(r=(e=this.memo)==null?void 0:e.commitMemo)!=null&&r.call(e)&&k2.push(this.memo),this.memo=null}};Pp.defaults={configuration:{strategies:{},defaultStrategy:void 0,activeStrategy:void 0,strategyOptions:{}}};let Ci=Pp;Ci.toolName="BaseTool";const{isEqual:E2e}=Vn,{EPSILON:b2e}=df,D2e=1-b2e;function o8(t,e,r){var c;const{viewPlaneNormal:n}=e,i=t.filter(l=>{let f=l.metadata.viewPlaneNormal;if(!l.metadata.referencedImageId&&!f&&l.metadata.FrameOfReferenceUID){for(const d of l.data.handles.points){const h=Nn(Ge(),d,e.focalPoint),g=Pt(h,e.viewPlaneNormal);if(!E2e(g,0))return!1}return l.metadata.viewPlaneNormal=e.viewPlaneNormal,l.metadata.cameraFocalPoint=e.focalPoint,!0}if(!f){const{referencedImageId:d}=l.metadata,{imageOrientationPatient:h}=vt("imagePlaneModule",d),g=At(h[0],h[1],h[2]),p=At(h[3],h[4],h[5]);f=Ge(),Wn(f,g,p),l.metadata.viewPlaneNormal=f}const u=Math.abs(Pt(n,f))>D2e;return f&&u});if(!i.length)return[];const o=r/2,{focalPoint:a}=e,s=[];for(const l of i){const f=l.data,u=f.handles.points[0]||((c=f.contour)==null?void 0:c.polyline[0]);if(!l.isVisible)continue;const d=Ge();if(!u){s.push(l);continue}Nn(d,a,u);const h=Pt(d,n);Math.abs(h)n.isVisible?n.data.isCanvasAnnotation?!0:t.isReferenceViewable(n.metadata,r):!1)}function QU(t){if(t){if(t.data&&t.highlighted)return Xs.Highlighted;if(wm(t.annotationUID))return Xs.Selected;if(mi(t.annotationUID))return Xs.Locked;if(t.data&&t.autoGenerated)return Xs.AutoGenerated}return Xs.Default}function I2e(t,e,r){const n=_h("textBoxFontSize",t,e,r),i=_h("textBoxFontFamily",t,e,r);return`${n}px ${i}`}const O2e=Object.freeze(Object.defineProperty({__proto__:null,getFont:I2e,getState:QU,style:_E},Symbol.toStringTag,{value:"Module"}));class vf extends Ci{constructor(){super(...arguments),this.onImageSpacingCalibrated=e=>{const{element:r,imageId:n}=e.detail,i=Hr(n),o=uc();o.getFramesOfReference().forEach(s=>{const l=o.getAnnotations(s)[this.getToolName()];!l||!l.length||(l.forEach(f=>{var d;if(!((d=f.metadata)!=null&&d.referencedImageId))return;Hr(f.metadata.referencedImageId)===i&&(f.invalidated=!0,f.data.cachedStats={})}),Xh(r))})}}filterInteractableAnnotationsForElement(e,r){if(!(r!=null&&r.length))return[];const n=Se(e),{viewport:i}=n;return Em(i,r)}createAnnotation(e){const r=e.detail,{currentPoints:n,element:i}=r,{world:o}=n,a=Se(i),{viewport:s}=a,c=s.getCamera(),{viewPlaneNormal:l,viewUp:f,position:u}=c,d=this.getReferencedImageId(s,o,l,f),h=s.getViewReference({points:[o]});return{highlighted:!0,invalidated:!0,metadata:{toolName:this.getToolName(),...h,referencedImageId:d,viewUp:f,cameraPosition:u},data:{cachedStats:{},handles:{points:[],activeHandleIndex:null,textBox:{hasMoved:!1,worldPosition:[0,0,0],worldBoundingBox:{topLeft:[0,0,0],topRight:[0,0,0],bottomLeft:[0,0,0],bottomRight:[0,0,0]}}}}}}getReferencedImageId(e,r,n,i){const o=this.getTargetId(e);let a=o.split(/^[a-zA-Z]+:/)[1];if(e instanceof Or){const s=Jc(o),c=Fe.getVolume(s);a=Vl(c,r,n)}return a}getStyle(e,r,n){return _h(e,r,QU(n),this.mode)}}vf.toolName="AnnotationDisplayTool";const{DefaultHistoryMemo:M2e}=lE,{PointsManager:P2e}=Vn;class pr extends vf{static createAnnotation(...e){let r={annotationUID:null,highlighted:!0,invalidated:!0,metadata:{toolName:this.toolName},data:{text:"",handles:{points:new Array,textBox:{hasMoved:!1,worldPosition:[0,0,0],worldBoundingBox:{topLeft:[0,0,0],topRight:[0,0,0],bottomLeft:[0,0,0],bottomRight:[0,0,0]}}},label:""}};for(const n of e)r=Wi(r,n);return r}static createAnnotationForViewport(e,...r){return this.createAnnotation({metadata:e.getViewReference()},...r)}static createAndAddAnnotation(e,...r){const n=this.createAnnotationForViewport(e,...r);ln(n,e.element),cn(n,e.element)}constructor(e,r){var n,i;super(e,r),this.mouseMoveCallback=(o,a)=>{if(!a)return!1;const{element:s,currentPoints:c}=o.detail,l=c.canvas;let f=!1;for(const u of a){if(mi(u.annotationUID)||!ii(u.annotationUID))continue;const{data:d}=u,h=d.handles?d.handles.activeHandleIndex:void 0,g=this._imagePointNearToolOrHandle(s,u,l,6),p=g&&!u.highlighted,v=!g&&u.highlighted;p||v?(u.highlighted=!u.highlighted,f=!0):d.handles&&d.handles.activeHandleIndex!==h&&(f=!0)}return f},this.isSuvScaled=pr.isSuvScaled,(n=e.configuration)!=null&&n.getTextLines&&(this.configuration.getTextLines=e.configuration.getTextLines),(i=e.configuration)!=null&&i.statsCalculator&&(this.configuration.statsCalculator=e.configuration.statsCalculator)}getHandleNearImagePoint(e,r,n,i){const o=Se(e),{viewport:a}=o,{data:s}=r,{isCanvasAnnotation:c}=s,{points:l,textBox:f}=s.handles;if(f){const{worldBoundingBox:u}=f;if(u){const d={topLeft:a.worldToCanvas(u.topLeft),topRight:a.worldToCanvas(u.topRight),bottomLeft:a.worldToCanvas(u.bottomLeft),bottomRight:a.worldToCanvas(u.bottomRight)};if(n[0]>=d.topLeft[0]&&n[0]<=d.bottomRight[0]&&n[1]>=d.topLeft[1]&&n[1]<=d.bottomRight[1])return s.handles.activeHandleIndex=null,f}}for(let u=0;u<(l==null?void 0:l.length);u++){const d=l[u],h=c?d.slice(0,2):a.worldToCanvas(d);if(Ir(n,h)this.getStyle(p,n,r),{annotationUID:o}=r,a=ii(o),s=mi(o),c=i("lineWidth"),l=i("lineDash"),f=i("angleArcLineDash"),u=i("color"),d=i("markerSize"),h=i("shadow"),g=this.getLinkedTextBoxStyle(n,r);return{visibility:a,locked:s,color:u,lineWidth:c,lineDash:l,lineOpacity:1,fillColor:u,fillOpacity:0,shadow:h,textbox:g,markerSize:d,angleArcLineDash:f}}_imagePointNearToolOrHandle(e,r,n,i){if(this.getHandleNearImagePoint(e,r,n,i)||this.isPointNearTool(e,r,n,i,"mouse"))return!0}static createAnnotationState(e,r){const{data:n,annotationUID:i}=e,o={...n,cachedStats:{}};delete o.contour,delete o.spline;const a={annotationUID:i,data:structuredClone(o),deleting:r},s=n.contour;return s&&(a.data.contour={...s,polyline:null,pointsManager:P2e.create3(s.polyline.length,s.polyline)}),a}static createAnnotationMemo(e,r,n){if(!r)return;const{newAnnotation:i,deleting:o=i?!1:void 0}=n||{},{annotationUID:a}=r,s=pr.createAnnotationState(r,o),c={restoreMemo:()=>{const l=pr.createAnnotationState(r,o),{viewport:f}=Se(e)||{};if(f==null||f.setViewReference(r.metadata),s.deleting===!0){if(s.deleting=!1,Object.assign(r.data,s.data),r.data.contour){const d=r.data;d.contour.polyline=s.data.contour.pointsManager.points,delete s.data.contour.pointsManager,d.segmentation&&Bl(r)}s.data=l.data,ln(r,e),ca(r.annotationUID,!0),f==null||f.render();return}if(s.deleting===!1){s.deleting=!0,s.data=l.data,ca(r.annotationUID),yn(r.annotationUID),f==null||f.render();return}const u=ri(a);if(!u){console.warn("No current annotation");return}Object.assign(u.data,s.data),u.data.contour&&(u.data.contour.polyline=s.data.contour.pointsManager.points),s.data=l.data,u.invalidated=!0,cn(u,e,Zt.History)},id:a,operationType:"annotation"};return M2e.push(c),c}createMemo(e,r,n){this.memo||(this.memo=pr.createAnnotationMemo(e,r,n))}static hydrateBase(e,r,n,i={}){if(!r)return null;const{viewport:o}=r,a=o.getFrameOfReferenceUID(),s=o.getCamera(),c=i.viewplaneNormal??s.viewPlaneNormal,l=i.viewUp??s.viewUp,f=i.toolInstance||new e;let u,d=c,h=l;if(i.referencedImageId)u=i.referencedImageId,d=void 0,h=void 0;else if(o instanceof mr){const g=uE(n[0],o);g!==void 0&&(u=o.getImageIds()[g])}else if(o instanceof Or)u=f.getReferencedImageId(o,n[0],c,l);else throw new Error("Unsupported viewport type");return{FrameOfReferenceUID:a,referencedImageId:u,viewPlaneNormal:d,viewUp:h,instance:f,viewport:o}}}pr.toolName="AnnotationTool";const{CalibrationTypes:Nf}=ts,kf="px",V2="voxels",eB=[1,2,3,4],R2e=["3,3","4,7"],L2e=["4,3","4,7"],zS={0:"px",1:"percent",2:"dB",3:"cm",4:"seconds",5:"hertz",6:"dB/seconds",7:"cm/sec",8:"cm²",9:"cm²/s",12:"degrees"},A2e=.001,Og="²",La=(t,e)=>{const{calibration:r,hasPixelSpacing:n}=t;let i=n?"mm":kf;const o=n?"mm³":V2;let a=i+Og,s=1,c="";if(!r||!r.type&&!r.sequenceOfUltrasoundRegions)return{unit:i,areaUnit:a,scale:s,volumeUnit:o};if(r.type===Nf.UNCALIBRATED)return{unit:kf,areaUnit:kf+Og,scale:s,volumeUnit:V2};if(r.sequenceOfUltrasoundRegions){let f,u;if(Array.isArray(e)&&e.length===2)[f,u]=e;else if(typeof e=="function"){const y=e();f=y[0],u=y[1]}let d=r.sequenceOfUltrasoundRegions.filter(y=>f[0]>=y.regionLocationMinX0&&f[0]<=y.regionLocationMaxX1&&f[1]>=y.regionLocationMinY0&&f[1]<=y.regionLocationMaxY1&&u[0]>=y.regionLocationMinX0&&u[0]<=y.regionLocationMaxX1&&u[1]>=y.regionLocationMinY0&&u[1]<=y.regionLocationMaxY1);if(!(d!=null&&d.length))return{unit:i,areaUnit:a,scale:s,volumeUnit:o};if(d=d.filter(y=>eB.includes(y.regionDataType)&&R2e.includes(`${y.physicalUnitsXDirection},${y.physicalUnitsYDirection}`)),!d.length)return{unit:kf,areaUnit:kf+Og,scale:s,volumeUnit:V2};const h=d[0],g=Math.abs(h.physicalDeltaX),p=Math.abs(h.physicalDeltaY);if(Yt(g,p,A2e))s=1/g,c="US Region",i=zS[h.physicalUnitsXDirection]||"unknown",a=i+Og;else return{unit:kf,areaUnit:kf+Og,scale:s,volumeUnit:V2}}else r.scale&&(s=r.scale);return[Nf.ERMF,Nf.USER,Nf.ERROR,Nf.PROJECTION,Nf.CALIBRATED,Nf.UNKNOWN].includes(r==null?void 0:r.type)&&(c=r.type),{unit:i+(c?` ${c}`:""),areaUnit:a+(c?` ${c}`:""),scale:s,volumeUnit:o+(c?` ${c}`:"")}},d5=(t,e)=>{const[r]=e,{calibration:n}=t;let i=["raw"],o=[null],a="";if(!n||!n.type&&!n.sequenceOfUltrasoundRegions)return{units:i,values:o};if(n.sequenceOfUltrasoundRegions){const s=n.sequenceOfUltrasoundRegions.filter(p=>eB.includes(p.regionDataType)&&L2e.includes(`${p.physicalUnitsXDirection},${p.physicalUnitsYDirection}`));if(!(s!=null&&s.length))return{units:i,values:o};const c=s.find(p=>r[0]>=p.regionLocationMinX0&&r[0]<=p.regionLocationMaxX1&&r[1]>=p.regionLocationMinY0&&r[1]<=p.regionLocationMaxY1);if(!c)return{units:i,values:o};const{referencePixelX0:l=0,referencePixelY0:f=0}=c,{physicalDeltaX:u,physicalDeltaY:d}=c,h=(r[1]-c.regionLocationMinY0-f)*d,g=(r[0]-c.regionLocationMinX0-l)*u;a="US Region",o=[g,h],i=[zS[c.physicalUnitsXDirection],zS[c.physicalUnitsYDirection]]}return{units:i,values:o,calibrationType:a}},a8=t=>{var e;return((e=t.calibration)==null?void 0:e.aspect)||1};function Bw(t,e,r,n){const i=Ge();Wn(i,e,t);const o=At(...r),a=At(...n),s=Ge();Qn(s,o,a);const c=sa(s);if(c<1e-4)return{worldWidth:0,worldHeight:0};const l=Pt(s,i)/(c*sa(i)),u=Math.sqrt(1-l*l)*c,d=l*c;return{worldWidth:u,worldHeight:d}}function Yh(t,e,r,n){const i=Ge();Wn(i,e,t);const o=At(...r),a=At(...n),s=Ge();Qn(s,o,a);const c=sa(s);if(c<1e-4)return{worldWidth:0,worldHeight:0};const l=Pt(s,i)/(c*sa(i)),u=Math.sqrt(1-l*l)*c,d=l*c;return{worldWidth:u,worldHeight:d}}function s8(t,e,r,n,i=.25){const o=c8(t,e,{targetVolumeId:r,stepSize:i});let a;for(const s of o){const c=t.getIntensityFromWorld(s),l=n(c,s);l&&(a=l)}return a}function c8(t,e,{targetVolumeId:r,stepSize:n}){const i=t.getCamera(),{viewPlaneNormal:o}=i,{spacingInNormalDirection:a}=zh(t,i,r),s=a*n||1,c=t.getBounds(),l=[];let f=[...e];for(;bI(f,c);)l.push([...f]),f[0]+=o[0]*s,f[1]+=o[1]*s,f[2]+=o[2]*s;for(f=[...e];bI(f,c);)l.push([...f]),f[0]-=o[0]*s,f[1]-=o[1]*s,f[2]-=o[2]*s;return l}const bI=function(t,e){const[r,n,i,o,a,s]=e,c=10;return t[0]>r+c&&t[0]i+c&&t[1]a+c&&t[2]{const c=[At(r,n,i),At(o,n,i),At(r,a,i),At(o,a,i),At(r,n,s),At(o,n,s),At(r,a,s),At(o,a,s)],l=At(e[0],e[1],e[2]),f=At(t[0],t[1],t[2]),u=-Pt(l,f);let d=null;for(const h of c){const g=Pt(l,h)+u;if(d===null)d=Math.sign(g);else if(Math.sign(g)!==d)return!0}return!1},{EPSILON:N2e}=df,k2e=1-N2e;function Gw(t,e){const{viewPlaneNormal:r}=e,n=t.filter(i=>{let o=i.metadata.viewPlaneNormal;if(!o){const{referencedImageId:s}=i.metadata,{imageOrientationPatient:c}=vt("imagePlaneModule",s),l=At(c[0],c[1],c[2]),f=At(c[3],c[4],c[5]);o=Ge(),Wn(o,l,f),i.metadata.viewPlaneNormal=o}const a=Math.abs(Pt(r,o))>k2e;return o&&a});return n.length?n:[]}const V2e={filterAnnotationsWithinSlice:o8,getWorldWidthAndHeightFromCorners:Bw,getWorldWidthAndHeightFromTwoPoints:Yh,filterAnnotationsForDisplay:Em,getPointInLineOfSightWithCriteria:s8,isPlaneIntersectingAABB:tB,filterAnnotationsWithinSamePlane:Gw,getPointsInLineOfSight:c8},F2e=Object.freeze(Object.defineProperty({__proto__:null,default:V2e,filterAnnotationsForDisplay:Em,filterAnnotationsWithinSamePlane:Gw,filterAnnotationsWithinSlice:o8,getPointInLineOfSightWithCriteria:s8,getPointsInLineOfSight:c8,getWorldWidthAndHeightFromCorners:Bw,getWorldWidthAndHeightFromTwoPoints:Yh,isPlaneIntersectingAABB:tB},Symbol.toStringTag,{value:"Module"}));function qo(t,e,r){let n=!0,i=!0;if(typeof t!="function")throw new TypeError("Expected a function");return NE(r)&&(n="leading"in r?!!r.leading:n,i="trailing"in r?!!r.trailing:i),qh(t,e,{leading:n,trailing:i,maxWait:e})}function U2e(t){var e;return((e=t[0])==null?void 0:e.length)===3}function B2e(t,e){if(!e||e.length===0||e.length===t.length)return t;const r=e[e.length-1]-e[0]+1,n=u3(e.map(o=>t[o][0])),i=u3(e.map(o=>t[o][1]));if(U2e(t)){const o=u3(e.map(a=>t[a][2]));return y9(bg(n,r),bg(i,r),bg(o,r))}else return y9(bg(n,r),bg(i,r))}function G2e(t,e){const r=[],[n,i]=e,o=i-n+1,a=Math.floor(o/t);let s=0,c=Math.round((o-1)/(a-1)*s)+n;for(;c<=i;)r.push(c),s++,c=Math.round((o-1)/(a-1)*s)+n;return r}function $S(t,e,r,n){const i=r-e+1,o=Math.floor(n/100*i)??1,a=Math.floor(i/o)??1;if(isNaN(i)||!i||!a||i/a<2)return t;const s=Math.max(0,e),c=Math.min(t.length-1,r),l=t.slice(0,s),f=t.slice(c+1,t.length),u=G2e(a,[s,c]),d=B2e(t,u);return[...l,...d,...f]}function Ww(t,e){var n,i;return e!=null&&e.autoGenerated?!1:((n=t==null?void 0:t.smoothing)==null?void 0:n.smoothOnAdd)===!0||((i=t==null?void 0:t.smoothing)==null?void 0:i.smoothOnEdit)===!0}function W2e(t,e){return Wo(t,e)<.001}function z2e(t,e){return Wo(t,e)===0}function $2e(t,e){for(let r=0;rW2e(c,l)===!1,[o,a]=DI([_0(r,t.length,1),r,t],[_0(n,e.length,1),n,e],i,1),[s]=DI([_0(o,t.length,-1),o,t],[_0(a,e.length,-1),a,e],i,-1);return[o,s]}function zw(t,e,r){const{interpolation:n,smoothing:i}=t,o=e;if(n){const{knotsRatioPercentageOnAdd:a,knotsRatioPercentageOnEdit:s,smoothOnAdd:c=!1,smoothOnEdit:l=!1}=i,f=r?s:a;if(r?l:c){const[d,h]=r?j2e(e,r):[0,e.length-1];return!e[d]||!e[h]?e:$S(e,d,h,f)}}return o}const Jh=t=>{if(t.shiftKey)return t.ctrlKey?Yi.ShiftCtrl:t.altKey?Yi.ShiftAlt:t.metaKey?Yi.ShiftMeta:Yi.Shift;if(t.ctrlKey)return t.altKey?Yi.CtrlAlt:t.metaKey?Yi.CtrlMeta:Yi.Ctrl;if(t.altKey)return t.metaKey&&Yi.AltMeta||Yi.Alt;if(t.metaKey)return Yi.Meta};function l8(t,e){const r=t[0],n=t[t.length-1],i=nn();vs(i,n[0]-r[0],n[1]-r[1]),Tl(i,i);const o=nn(),a=nn();vs(o,-i[1],i[0]),vs(a,i[1],-i[0]);const s=[(r[0]+n[0])/2,(r[1]+n[1])/2],c={dist:0,index:null};for(let u=0;uc.dist&&(c.dist=h,c.index=u)}return[t[c.index],s].map(e.canvasToWorld)}function H2e(t,e){const{viewport:r}=t,n=e.data.contour.polyline.map(r.worldToCanvas);return l8(n,r)}const{addCanvasPointsToArray:u8,pointsAreWithinCloseContourProximity:nB,getFirstLineSegmentIntersectionIndexes:rB,getSubPixelSpacingAndXYDirections:K2e}=pf;function q2e(t,e,r){this.isDrawing=!0;const n=t.detail,{currentPoints:i,element:o}=n,a=i.canvas,s=Se(o),{viewport:c}=s,l=Jh(t.detail.event)===this.configuration.contourHoleAdditionModifierKey,{spacing:f,xDir:u,yDir:d}=K2e(c,this.configuration.subPixelResolution)||{};!f||!u||!d||(this.drawData={canvasPoints:[a],polylineIndex:0,contourHoleProcessingEnabled:l,newAnnotation:!0},this.commonData={annotation:e,viewportIdsToRender:r,spacing:f,xDir:u,yDir:d,movingTextBox:!1},He.isInteractingWithTool=!0,o.addEventListener(k.MOUSE_UP,this.mouseUpDrawCallback),o.addEventListener(k.MOUSE_DRAG,this.mouseDragDrawCallback),o.addEventListener(k.MOUSE_CLICK,this.mouseUpDrawCallback),o.addEventListener(k.TOUCH_END,this.mouseUpDrawCallback),o.addEventListener(k.TOUCH_DRAG,this.mouseDragDrawCallback),o.addEventListener(k.TOUCH_TAP,this.mouseUpDrawCallback),Ft(o))}function X2e(t){He.isInteractingWithTool=!1,t.removeEventListener(k.MOUSE_UP,this.mouseUpDrawCallback),t.removeEventListener(k.MOUSE_DRAG,this.mouseDragDrawCallback),t.removeEventListener(k.MOUSE_CLICK,this.mouseUpDrawCallback),t.removeEventListener(k.TOUCH_END,this.mouseUpDrawCallback),t.removeEventListener(k.TOUCH_DRAG,this.mouseDragDrawCallback),t.removeEventListener(k.TOUCH_TAP,this.mouseUpDrawCallback),Xt(t)}function Y2e(t){const e=t.detail,{currentPoints:r,element:n}=e,i=r.world,o=r.canvas,a=Se(n),{viewport:s}=a,{annotation:c,viewportIdsToRender:l,xDir:f,yDir:u,spacing:d,movingTextBox:h}=this.commonData,{polylineIndex:g,canvasPoints:p,newAnnotation:v}=this.drawData;this.createMemo(n,c,{newAnnotation:v});const y=p[p.length-1],m=s.canvasToWorld(y),w=Ge();Qn(w,i,m);const x=Math.abs(Pt(w,f)),C=Math.abs(Pt(w,u));if(!(x<=d[0]&&C<=d[1])){if(h){this.isDrawing=!1;const{deltaPoints:S}=e,T=S.world,{textBox:_}=c.data.handles,{worldPosition:E}=_;E[0]+=T[0],E[1]+=T[1],E[2]+=T[2],_.hasMoved=!0}else{const S=this.findCrossingIndexDuringCreate(t);if(S!==void 0)this.applyCreateOnCross(t,S);else{const T=u8(n,p,o,this.commonData);this.drawData.polylineIndex=g+T}c.invalidated=!0}Ne(l),c.invalidated&&cn(c,n,Zt.HandlesUpdated)}}function J2e(t){const{allowOpenContours:e}=this.configuration,{canvasPoints:r,contourHoleProcessingEnabled:n}=this.drawData,i=r[0],o=r[r.length-1],a=t.detail,{element:s}=a;this.doneEditMemo(),this.drawData.newAnnotation=!1,e&&!nB(i,o,this.configuration.closeContourProximity)?this.completeDrawOpenContour(s,{contourHoleProcessingEnabled:n}):this.completeDrawClosedContour(s,{contourHoleProcessingEnabled:n})}function Z2e(t,e){this.removeCrossedLinesOnCompleteDraw();const{canvasPoints:r}=this.drawData,{contourHoleProcessingEnabled:n,minPointsToSave:i}=e??{};if(i&&r.length=2)if(c.length>this.configuration.checkCanvasEditFallbackProximity){const u=c[0],d=[];for(let p=0;pp.distance-v.distance);const h=[d[0],d[1]],g=Math.min(h[0].index,h[1].index);this.editData.startCrossingIndex=g}else{const u=nn();ai(u,c[1],c[0]),Tl(u,u);const d=6,h=[c[0][0]-u[0]*d,c[0][1]-u[1]*d],g=Id(l,h,c[0],e);if(g){const p=[h];sve(n,p,c[0],this.commonData),c.unshift(...p),this.removePointsUpUntilFirstCrossing(e),this.editData.editIndex=c.length-1,this.editData.startCrossingIndex=g[0]}}}function lve(t){const{editCanvasPoints:e,prevCanvasPoints:r}=this.editData;let n=0;for(let i=0;i0;n--){const i=[r[n],r[n-1]],o=!!Id(e,i[0],i[1],t);if(r.pop(),o)break}}function dve(){const{editCanvasPoints:t,prevCanvasPoints:e,startCrossingIndex:r}=this.editData;if(r===void 0)return;const n=t[t.length-1],i=[];for(let a=0;aa.distance-s.distance);const o=t.slice(0,-1);for(let a=0;a1&&this.checkForFirstCrossing(t,!0),this.editData.snapIndex=this.findSnapIndex(),this.editData.snapIndex===-1){this.finishEditAndStartNewEdit(t);return}this.editData.fusedCanvasPoints=this.fuseEditPointsWithClosedContour(t),g!==void 0&&this.checkForSecondCrossing(t,!0)&&(this.removePointsAfterSecondCrossing(!0),this.finishEditAndStartNewEdit(t)),Ne(c)}function wve(t){const e=t.detail,{element:r}=e,n=Se(r),{viewport:i,renderingEngine:o}=n,{annotation:a,viewportIdsToRender:s}=this.commonData,{fusedCanvasPoints:c,editCanvasPoints:l}=this.editData;fc(a,{points:c,closed:!0,targetWindingDirection:la.Clockwise},i),a.autoGenerated&&(a.autoGenerated=!1),cn(a,r);const f=l.pop();this.editData={prevCanvasPoints:c,editCanvasPoints:[f],startCrossingIndex:void 0,editIndex:0,snapIndex:void 0,annotation:a},Ne(s)}function xve(t){const{prevCanvasPoints:e,editCanvasPoints:r,startCrossingIndex:n,snapIndex:i}=this.editData;if(n===void 0||i===void 0)return;const o=t.detail,{element:a}=o,s=[...r];iB(a,s,e[i],this.commonData),s.length>r.length&&s.pop();let c,l;n>i?(c=i,l=n):(c=n,l=i);const f=Ir(e[c],s[0]),u=Ir(e[c],s[s.length-1]),d=Ir(e[l],s[0]),h=Ir(e[l],s[s.length-1]),g=[];for(let C=0;C=0;C--){const S=s[C];g.push([S[0],S[1]])}for(let C=l;C=0;C--){const S=s[C];y.push([S[0],S[1]])}const m=II(g),w=II(y);return m>w?g:y}function Cve(t){const e=t.detail,{element:r}=e;this.completeClosedContourEdit(r)}function Sve(t){var s;const e=Se(t),{viewport:r}=e,{annotation:n,viewportIdsToRender:i}=this.commonData;this.doneEditMemo();const{fusedCanvasPoints:o,prevCanvasPoints:a}=this.editData;if(o){const c=Ww(this.configuration,n)?zw(this.configuration,o,a):o,l=((s=this.configuration)==null?void 0:s.decimate)||{};fc(n,{points:c,closed:!0,targetWindingDirection:la.Clockwise},r,{decimate:{enabled:!!l.enabled,epsilon:l.epsilon}}),n.autoGenerated&&(n.autoGenerated=!1),cn(n,t)}this.isEditingClosed=!1,this.editData=void 0,this.commonData=void 0,Ne(i),this.deactivateClosedContourEdit(t)}function Tve(t){this.completeClosedContourEdit(t)}function _ve(t){t.activateClosedContourEdit=mve.bind(t),t.deactivateClosedContourEdit=vve.bind(t),t.mouseDragClosedContourEditCallback=yve.bind(t),t.mouseUpClosedContourEditCallback=Cve.bind(t),t.finishEditAndStartNewEdit=wve.bind(t),t.fuseEditPointsWithClosedContour=xve.bind(t),t.cancelClosedContourEdit=Tve.bind(t),t.completeClosedContourEdit=Sve.bind(t)}const{addCanvasPointsToArray:oB,getSubPixelSpacingAndXYDirections:Eve}=pf;function bve(t,e,r){this.isEditingOpen=!0;const n=t.detail,{currentPoints:i,element:o}=n,a=i.canvas,s=Se(o),{viewport:c}=s;this.doneEditMemo();const l=e.data.contour.polyline.map(c.worldToCanvas),{spacing:f,xDir:u,yDir:d}=Eve(c,this.configuration.subPixelResolution);this.editData={prevCanvasPoints:l,editCanvasPoints:[a],startCrossingIndex:void 0,editIndex:0},this.commonData={annotation:e,viewportIdsToRender:r,spacing:f,xDir:u,yDir:d,movingTextBox:!1},He.isInteractingWithTool=!0,o.addEventListener(k.MOUSE_UP,this.mouseUpOpenContourEditCallback),o.addEventListener(k.MOUSE_DRAG,this.mouseDragOpenContourEditCallback),o.addEventListener(k.MOUSE_CLICK,this.mouseUpOpenContourEditCallback),o.addEventListener(k.TOUCH_END,this.mouseUpOpenContourEditCallback),o.addEventListener(k.TOUCH_DRAG,this.mouseDragOpenContourEditCallback),o.addEventListener(k.TOUCH_TAP,this.mouseUpOpenContourEditCallback),Ft(o)}function Dve(t){He.isInteractingWithTool=!1,t.removeEventListener(k.MOUSE_UP,this.mouseUpOpenContourEditCallback),t.removeEventListener(k.MOUSE_DRAG,this.mouseDragOpenContourEditCallback),t.removeEventListener(k.MOUSE_CLICK,this.mouseUpOpenContourEditCallback),t.removeEventListener(k.TOUCH_END,this.mouseUpOpenContourEditCallback),t.removeEventListener(k.TOUCH_DRAG,this.mouseDragOpenContourEditCallback),t.removeEventListener(k.TOUCH_TAP,this.mouseUpOpenContourEditCallback),Xt(t)}function Ive(t){const e=t.detail,{currentPoints:r,element:n}=e,i=r.world,o=r.canvas,a=Se(n),{viewport:s}=a,{viewportIdsToRender:c,xDir:l,yDir:f,spacing:u}=this.commonData,{editIndex:d,editCanvasPoints:h,startCrossingIndex:g}=this.editData,p=h[h.length-1],v=s.canvasToWorld(p),y=Ge();this.createMemo(n,this.commonData.annotation),Qn(y,i,v);const m=Math.abs(Pt(y,l)),w=Math.abs(Pt(y,f));if(m<=u[0]&&w<=u[1])return;g!==void 0&&this.checkAndRemoveCrossesOnEditLine(t);const x=oB(n,h,o,this.commonData),C=d+x;this.editData.editIndex=C,g===void 0&&h.length>1&&this.checkForFirstCrossing(t,!1),this.editData.snapIndex=this.findSnapIndex(),this.editData.fusedCanvasPoints=this.fuseEditPointsWithOpenContour(t),g!==void 0&&this.checkForSecondCrossing(t,!1)?(this.removePointsAfterSecondCrossing(!1),this.finishEditOpenOnSecondCrossing(t)):this.checkIfShouldOverwriteAnEnd(t)&&this.openContourEditOverwriteEnd(t),Ne(c)}function Ove(t){const e=t.detail,{element:r}=e,n=Se(r),{viewport:i}=n,{annotation:o,viewportIdsToRender:a}=this.commonData,s=this.fuseEditPointsForOpenContourEndEdit();fc(o,{points:s,closed:!1},i);const c=o.data.contour.polyline;o.data.handles.points=[c[0],c[c.length-1]],o.data.handles.activeHandleIndex=1,cn(o,r),this.isEditingOpen=!1,this.editData=void 0,this.commonData=void 0,this.doneEditMemo(),this.deactivateOpenContourEdit(r),this.activateOpenContourEndEdit(t,o,a,null)}function Mve(t){const e=t.detail,{currentPoints:r,lastPoints:n}=e,i=r.canvas,o=n.canvas,{snapIndex:a,prevCanvasPoints:s,startCrossingIndex:c}=this.editData;if(c===void 0||a===void 0)return!1;if(a===-1)return!0;if(a!==0&&a!==s.length-1)return!1;const l=i,f=o,u=s[a],d=nn(),h=nn();vs(d,l[0]-f[0],l[1]-f[1]),vs(h,l[0]-u[0],l[1]-u[1]);const g=i4(d,h),p=Math.sqrt(d[0]*d[0]+d[1]*d[1]),v=Math.sqrt(h[0]*h[0]+h[1]*h[1]);return Math.acos(g/(p*v))=n;s--){const c=e[s];i.push([c[0],c[1]])}else for(let s=0;s=0;s--){const c=r[s];i.push([c[0],c[1]])}return i}function Rve(t){const{prevCanvasPoints:e,editCanvasPoints:r,startCrossingIndex:n,snapIndex:i}=this.editData;if(n===void 0||i===void 0)return;const o=t.detail,{element:a}=o,s=[...r];oB(a,s,e[i],this.commonData),s.length>r.length&&s.pop();let c,l;n>i?(c=i,l=n):(c=n,l=i);const f=Ir(e[c],s[0]),u=Ir(e[c],s[s.length-1]),d=Ir(e[l],s[0]),h=Ir(e[l],s[s.length-1]),g=[];for(let y=0;y=0;y--){const m=s[y];g.push([m[0],m[1]])}for(let y=l;yri(r).data.contour.polyline)}function bm(t,e){const r=aB(t),n=[];return r.forEach(i=>{const o=i.length,a=new Array(o);for(let s=0;sn.worldToCanvas(l)),a=bm(r,n),s=[o,...a];Pl(e,r.annotationUID,"1",s,i)}function Hve(t,e,r){var c;const{viewport:n}=t,i=this._getRenderingOptions(t,r),o=r.data.contour.polyline.map(l=>n.worldToCanvas(l));ac(e,r.annotationUID,"1",o,i);const s=r.data.handles.activeHandleIndex;if(((c=this.configuration.alwaysRenderOpenContourHandles)==null?void 0:c.enabled)===!0){const l=this.configuration.alwaysRenderOpenContourHandles.radius,f="0",u=[o[0],o[o.length-1]];s===0?u.shift():s===1&&u.pop(),ur(e,r.annotationUID,f,u,{color:i.color,handleRadius:l})}if(s!==null){const l="1",f=s===0?0:o.length-1,u=o[f];ur(e,r.annotationUID,l,[u],{color:i.color})}}function Kve(t,e,r){const{viewport:n}=t,{openUShapeContourVectorToPeak:i}=r.data,{polyline:o}=r.data.contour;if(this.renderOpenContour(t,e,r),!i)return;const a=n.worldToCanvas(o[0]),s=n.worldToCanvas(o[o.length-1]),c=[n.worldToCanvas(i[0]),n.worldToCanvas(i[1])],l=this._getRenderingOptions(t,r);ac(e,r.annotationUID,"first-to-last",[a,s],{color:l.color,width:l.width,closePath:!1,lineDash:"2,2"}),ac(e,r.annotationUID,"midpoint-to-open-contour",[c[0],c[1]],{color:l.color,width:l.width,closePath:!1,lineDash:"2,2"})}function qve(t,e,r){const n=this._getRenderingOptions(t,r),{allowOpenContours:i}=this.configuration,{canvasPoints:o}=this.drawData;if(n.closePath=!1,ac(e,r.annotationUID,"1",o,n),i){const a=o[0],s=o[o.length-1];Gve(a,s,this.configuration.closeContourProximity)?ac(e,r.annotationUID,"2",[s,a],n):ur(e,r.annotationUID,"0",[a],{color:n.color,handleRadius:2})}}function Xve(t,e,r){const{viewport:n}=t,{fusedCanvasPoints:i}=this.editData;if(i===void 0){this.renderClosedContour(t,e,r);return}const o=bm(r,n),a=[i,...o],s=this._getRenderingOptions(t,r),c="preview-1";r.parentAnnotationUID&&s.fillOpacity&&(s.fillOpacity=0),Pl(e,r.annotationUID,c,a,s)}function Yve(t,e,r){const{fusedCanvasPoints:n}=this.editData;if(n===void 0){this.renderOpenContour(t,e,r);return}const i=this._getRenderingOptions(t,r);ac(e,r.annotationUID,"preview-1",n,i)}function Jve(t,e,r){if(r.parentAnnotationUID)return;const{viewport:n}=t,i=this._getRenderingOptions(t,r),o=r.data.contour.polyline.map(g=>n.worldToCanvas(g)),a=bm(r,n),s="1",c=o[0],l=6,f=100,u=[];for(let g=0;g0}else if(t instanceof mr){const{preScale:r}=t.getImageData()||{};return!!(r!=null&&r.scaled)}else return!1}function jS(t,e){let r=0;for(let n=0;nthis.moveAnnotation(i,r))}updateContourPolyline(e,r,n,i){var a;const o=((a=this.configuration)==null?void 0:a.decimate)||{};fc(e,r,n,{decimate:{enabled:!!o.enabled,epsilon:o.epsilon},updateWindingDirection:i==null?void 0:i.updateWindingDirection})}getPolylinePoints(e){var r;return((r=e.data.contour)==null?void 0:r.polyline)??e.data.polyline}renderAnnotationInstance(e){const{enabledElement:r,annotationStyle:n,svgDrawingHelper:i}=e,o=e.annotation;if(o.parentAnnotationUID)return;const{annotationUID:a}=o,{viewport:s}=r,{worldToCanvas:c}=s,l=this.getPolylinePoints(o).map(y=>c(y)),{lineWidth:f,lineDash:u,color:d,fillColor:h,fillOpacity:g}=n,p=bm(o,s),v=[l,...p];return Pl(i,a,"contourPolyline",v,{color:d,lineDash:u,lineWidth:Math.max(.1,f),fillColor:h,fillOpacity:g}),!0}}class nye{constructor(){this.annotationUIDs=new Set,this._isVisible=!0,this.visibleFilter=this.unboundVisibleFilter.bind(this)}unboundVisibleFilter(e){return!this._isVisible||!this.annotationUIDs.has(e)}has(e){return this.annotationUIDs.has(e)}setVisible(e=!0,r,n){this._isVisible!==e&&(this._isVisible=e,this.annotationUIDs.forEach(i=>{const o=ri(i);if(!o){this.annotationUIDs.delete(i);return}if(o.isVisible===e||!e&&(n==null?void 0:n(i))===!1)return;o.isVisible=e;const a={...r,annotation:o};it(Je,k.ANNOTATION_MODIFIED,a)}))}get isVisible(){return this._isVisible}findNearby(e,r){const n=[...this.annotationUIDs];if(n.length===0)return null;if(!e)return n[r===1?0:n.length-1];const i=n.indexOf(e);return i===-1||i+r<0||i+r>=n.length?null:n[i+r]}add(...e){e.forEach(r=>this.annotationUIDs.add(r))}remove(...e){e.forEach(r=>this.annotationUIDs.delete(r))}clear(){this.annotationUIDs.clear()}}const Zr={...lpe,...ope,resetAnnotationManager:V1e},rye=Object.freeze(Object.defineProperty({__proto__:null,AnnotationGroup:nye,FrameOfReferenceSpecificAnnotationManager:cU,config:O2e,locking:b1e,selection:M1e,state:Zr,visibility:N1e},Symbol.toStringTag,{value:"Module"})),OI="PlanarFreehandContourSegmentationTool";function f8(t,e=[]){const{viewport:r,sliceData:n,annotation:i}=t,o=new Map,{toolName:a,originalToolName:s}=i.metadata,c=s||a,l=(pn(c,r.element)||[]).filter(f=>!f.metadata.originalToolName||f.metadata.originalToolName===c);if(c!==OI){const f=pn(OI,r.element);f!=null&&f.length&&f.forEach(u=>{const{metadata:d}=u;d.originalToolName===c&&d.originalToolName!==d.toolName&&l.push(u)})}if(!(l!=null&&l.length))return o;for(let f=0;fh.metadata.sliceIndex===f);if(!(u!=null&&u.length))continue;const d=u.filter(h=>e.every(g=>{const p=g.parentKey?g.parentKey(h):h,v=p==null?void 0:p[g.key];return Array.isArray(v)?v.every((y,m)=>y===g.value[m]):v===g.value}));d.length&&o.set(f,d)}return o}function iye(t,e){const r=f8(t,e),n=[];if(!(r!=null&&r.size))return n;for(const i of r.values())i.forEach(o=>{n.push(o)});return n}function sB(t,e,r){const n=Wi({data:{},metadata:{}},r);return Object.assign(n,{highlighted:!1,invalidated:!0,autoGenerated:!0,annotationUID:void 0,cachedStats:{},childAnnotationUIDs:[],parentAnnotationUID:void 0}),Object.assign(n.data,{handles:{points:e.points||e||[],interpolationSources:e.sources,activeHandleIndex:null,textBox:{hasMoved:!1,worldPosition:[0,0,0],worldBoundingBox:{topLeft:[0,0,0],topRight:[0,0,0],bottomLeft:[0,0,0],bottomRight:[0,0,0]}}},contour:{...r.data.contour,polyline:t}}),n}function oye(t,e){const r=f8(e,[{key:"interpolationUID",value:e.interpolationUID}]),n=aye(r);if(!n){console.warn("No annotations found to interpolate",r);return}const i=sye(r,t.annotationUID),o=[];for(let a=n[0]+1;a=e[0];o--){const a=r.get(o);if(a!=null&&a.length){if(a[0].autoGenerated)continue;a.length>1&&(i=!1),n.push(o);break}}if(!(!i||!n.length)){for(let o=t+1;o<=e[1];o++){const a=r.get(o);if(a!=null&&a.length){if(a[0].autoGenerated)continue;a.length>1&&(i=!1),n.push(o);break}}if(!(!i||n.length<2))return n}}const{PointsManager:MI}=Vn;function fye(t,e=12){const r=MI.create3(e);r.sources=[];const{sources:n}=r,{length:i,sources:o=[]}=t,a=5;if(in.push(MI.create3(e)));const c=dye(t,a),l=hye(c,e),f=[];if((l==null?void 0:l.length)>2){let u=-1;const d=s/3;l.forEach(p=>{const[v,,y]=p,m=Math.ceil((v+y)/2);y-u2*d?(r0(f,u,v,s,i),u=r0(f,v,m,s,i)):u=r0(f,u,m,s,i),y-u>d&&(u=r0(f,u,y,s,i)))});const h=f[0];HS(h+i-u,i)>2*d&&r0(f,u,h-d,s,i)}else{const u=Math.floor(i/e);r0(f,-1,i-u,u,i)}return f.forEach(u=>{const d=t.getPointArray(u);r.push(d),o.forEach((h,g)=>n[g].push(h.getPoint(u)))}),r}function dye(t,e=6){const{length:r}=t,n=Ge(),i=Ge(),o=new Float32Array(r);for(let a=0;a{try{e&&(r.isInterpolationUpdate=!0,r.autoGenerated=!1),mye(t)}finally{e&&(r.autoGenerated=!0)}})}function mye(t){const{annotation:e}=t;pye(e);const{interpolationData:r,interpolationList:n}=oye(e,t)||{};if(!r||!n)return;const i={toolName:e.metadata.toolName,toolType:e.metadata.toolName,viewport:t.viewport};for(let l=0;ls.x.length,n)})}function yye(t,e,r,n,i,o,a){const[s,c]=n,l=(r-s)/(c-s),f=i.get(s)[0],u=i.get(c)[0],d=Cye(t,e,l,o),h=l>.5?u:f,g=fye(d);i.has(r)?xye(d,g,r,h,a):wye(d,g,r,h,a)}function wye(t,e,r,n,i){var f;const o=t.points,{viewport:a}=i,s=sB(o,e,n),c=a.getViewReference({sliceIndex:r});if(!c)throw new Error(`Can't find slice ${r}`);Object.assign(s.metadata,c),Zr.addAnnotation(s,a.element),(f=n.onInterpolationComplete)==null||f.call(n,s,n);const{parentAnnotationUID:l}=n;if(l){const u=Zr.getAnnotation(l),d=cB(u,r,i);Vw(a,d,s)}}function cB(t,e,r){const{viewport:n}=r,i=Zr.getAnnotations(t.metadata.toolName,n.element);for(let o=0;o!f.autoGenerated)||(s=o||s===n||c.forEach(l=>{l.autoGenerated&&(Zr.removeAnnotation(l.annotationUID),a.push(l))});if(a.length){const s={annotations:a,element:t.viewport.element,viewportId:t.viewport.id,renderingEngineId:t.viewport.getRenderingEngine().id};it(t.viewport.element,k.INTERPOLATED_ANNOTATIONS_REMOVED,s)}if(i>=0&&o{var h;const r=e.detail.annotation;if(!(r!=null&&r.metadata))return;const{toolName:n,originalToolName:i}=r.metadata;if(!ds.toolNames.includes(n)&&!ds.toolNames.includes(i))return;const o=kv(r);if(!o){console.warn("Unable to find viewport for",r);return}const a=b3(o),s={viewport:o,sliceData:a,annotation:r,interpolationUID:r.interpolationUID},c=!!r.interpolationUID;if(r.autoGenerated=!1,c){UI(s),Nv(s);return}const l=[{key:"segmentIndex",value:r.data.segmentation.segmentIndex,parentKey:g=>g.data.segmentation},{key:"viewPlaneNormal",value:r.metadata.viewPlaneNormal,parentKey:g=>g.metadata},{key:"viewUp",value:r.metadata.viewUp,parentKey:g=>g.metadata}];let f=iye(s,l);const{sliceIndex:u}=r.metadata,d=new Set;f.forEach(g=>{if(g.interpolationCompleted||g.metadata.sliceIndex===u){const{interpolationUID:p}=g;d.add(p)}}),f=f.filter(g=>!d.has(g.interpolationUID)),r.interpolationUID=((h=f[0])==null?void 0:h.interpolationUID)||Eye(),s.interpolationUID=r.interpolationUID,Nv(s)},ds.handleAnnotationUpdate=e=>{const r=e.detail.annotation,{changeType:n=Zt.HandlesUpdated}=e.detail;if(!(r!=null&&r.metadata))return;const{toolName:i,originalToolName:o}=r.metadata;if(!ds.toolNames.includes(i)&&!ds.toolNames.includes(o)||!bye.includes(n))return;const a=kv(r);if(!a){console.warn("Unable to find matching viewport for annotation interpolation",r);return}r.autoGenerated&&(Bl(r),r.autoGenerated=!1);const s=b3(a),c={viewport:a,sliceData:s,annotation:r,interpolationUID:r.interpolationUID,isInterpolationUpdate:n===Zt.InterpolationUpdated};Nv(c)},ds.handleAnnotationDelete=e=>{const r=e.detail.annotation;if(!(r!=null&&r.metadata))return;const{toolName:n}=r.metadata;if(!ds.toolNames.includes(n)||r.autoGenerated)return;const i=kv(r);if(!i){console.warn("No viewport, can't delete interpolated results",r);return}const o=b3(i),a={viewport:i,sliceData:o,annotation:r,interpolationUID:r.interpolationUID};r.autoGenerated=!1,UI(a)};let Vc=ds;function b3(t){return{numberOfSlices:t.getNumberOfSlices(),imageIndex:t.getCurrentImageIdIndex()}}function lB(t){t.forEach(e=>{const r=fi(e);if(!r){console.warn(`ToolGroup not available for ${e}`);return}r.getViewportsInfo().forEach(i=>{const{renderingEngineId:o,viewportId:a}=i,s=ni(o);if(!s){console.warn(`RenderingEngine not available for ${o}`);return}const c=s.getViewport(a);Xh(c.element)})})}function Zh(t){const n=sr.getState().viewportSegRepresentations;return Object.entries(n).filter(([,o])=>o.some(a=>a.segmentationId===t)).map(([o])=>o)}function Dye(t,e){const r=zn(t);if(!r)throw new Error(`No segmentation state found for ${t}`);const{segments:n}=r;return n[e].locked}function Iye(t,e,r=!0){const n=zn(t);if(!n)throw new Error(`No segmentation state found for ${t}`);const{segments:i}=n;i[e].locked=r,ns(t)}function Gd(t){const e=zn(t);if(!e)throw new Error(`No segmentation state found for ${t}`);const{segments:r}=e;return Object.keys(r).filter(i=>r[i].locked).map(i=>parseInt(i))}const Oye=Object.freeze(Object.defineProperty({__proto__:null,getLockedSegmentIndices:Gd,isSegmentIndexLocked:Dye,setSegmentIndexLocked:Iye},Symbol.toStringTag,{value:"Module"}));function uB(){return sr.getNextColorLUTIndex()}const h5=[[0,0,0,0],[221,84,84,255],[77,228,121,255],[166,70,235,255],[189,180,116,255],[109,182,196,255],[204,101,157,255],[123,211,94,255],[93,87,218,255],[225,128,80,255],[73,232,172,255],[181,119,186,255],[176,193,112,255],[105,153,200,255],[208,97,120,255],[90,215,101,255],[135,83,222,255],[229,178,76,255],[122,183,181,255],[190,115,171,255],[149,197,108,255],[100,118,205,255],[212,108,93,255],[86,219,141,255],[183,79,226,255],[233,233,72,255],[118,167,187,255],[194,111,146,255],[116,201,104,255],[115,96,209,255],[216,147,89,255],[82,223,188,255],[230,75,224,255],[163,184,121,255],[114,143,191,255],[198,107,114,255],[99,206,122,255],[153,92,213,255],[220,192,85,255],[78,215,227,255],[234,71,173,255],[141,188,117,255],[110,113,195,255],[202,128,103,255],[95,210,157,255],[195,88,217,255],[206,224,81,255],[74,166,231,255],[185,120,139,255],[113,192,113,255],[133,106,199,255],[207,162,98,255],[91,214,198,255],[221,84,198,255],[159,228,77,255],[70,111,235,255],[189,119,116,255],[109,196,138,255],[165,101,204,255],[211,201,94,255],[87,191,218,255],[225,80,153,255],[106,232,73,255],[124,119,186,255],[193,142,112,255],[105,200,168,255],[203,97,208,255],[184,215,90,255],[83,147,222,255],[229,76,101,255],[122,183,130,255],[146,115,190,255],[197,171,108,255],[100,205,205,255],[212,93,177,255],[141,219,86,255],[79,97,226,255],[233,99,72,255],[118,187,150,255],[173,111,194,255],[197,201,104,255],[96,171,209,255],[216,89,137,255],[94,223,82,255],[107,75,230,255],[184,153,121,255],[114,191,175,255],[198,107,191,255],[166,206,99,255],[92,132,213,255],[220,85,91,255],[78,227,115,255],[159,71,234,255],[188,176,117,255],[110,185,195,255],[202,103,161,255],[129,210,95,255],[88,88,217,255],[224,123,81,255],[74,231,166,255],[177,120,185,255],[179,192,113,255],[106,156,199,255],[207,98,125,255],[91,214,96,255],[130,84,221,255],[228,171,77,255],[70,235,221,255],[189,116,174,255],[153,196,109,255],[101,123,204,255],[211,104,94,255],[87,218,136,255],[177,80,225,255],[232,225,73,255],[119,169,186,255],[193,112,149,255],[121,200,105,255],[111,97,208,255],[215,142,90,255],[83,222,181,255],[229,76,229,255],[165,183,122,255],[115,146,190,255],[197,108,119,255],[100,205,118,255],[148,93,212,255],[219,186,86,255],[79,220,226,255],[233,72,179,255],[144,187,118,255],[111,118,194,255],[201,124,104,255],[96,209,153,255],[189,89,216,255],[211,223,82,255],[75,172,230,255],[184,121,142,255],[117,191,114,255],[130,107,198,255],[206,157,99,255],[92,213,193,255],[220,85,203,255],[165,227,78,255],[71,118,234,255],[188,117,117,255],[110,195,135,255],[161,103,202,255],[210,195,95,255],[88,195,217,255],[224,81,158,255],[113,231,74,255],[123,120,185,255],[192,139,113,255],[106,199,164,255],[198,98,207,255],[188,214,91,255],[84,153,221,255],[228,77,108,255],[70,235,84,255],[143,116,189,255],[196,167,109,255],[101,204,199,255],[211,94,182,255],[147,218,87,255],[80,104,225,255],[232,93,73,255],[119,186,147,255],[170,112,193,255],[200,200,105,255],[97,175,208,255],[215,90,142,255],[100,222,83,255],[101,76,229,255],[183,150,122,255],[115,190,171,255],[197,108,194,255],[170,205,100,255],[93,138,212,255],[219,86,97,255],[79,226,110,255],[153,72,233,255],[187,173,118,255],[111,187,194,255],[201,104,165,255],[134,209,96,255],[89,95,216,255],[223,117,82,255],[75,230,159,255],[174,121,184,255],[182,191,114,255],[107,160,198,255],[206,99,130,255],[92,213,92,255],[124,85,220,255],[227,165,78,255],[71,234,214,255],[188,117,176,255],[156,195,110,255],[103,128,202,255],[210,100,95,255],[88,217,131,255],[170,81,224,255],[231,218,74,255],[120,172,185,255],[192,113,153,255],[125,199,106,255],[107,98,207,255],[214,137,91,255],[84,221,175,255],[222,77,228,255],[194,235,70,255],[116,149,189,255],[196,109,123,255],[101,204,114,255],[143,94,211,255],[218,180,87,255],[80,225,225,255],[232,73,186,255],[147,186,119,255],[112,122,193,255],[200,121,105,255],[97,208,148,255],[184,90,215,255],[216,222,83,255],[76,178,229,255],[183,122,145,255],[121,190,115,255],[126,108,197,255],[205,153,100,255],[93,212,187,255],[219,86,208,255],[171,226,79,255],[72,126,233,255],[187,118,121,255],[111,194,132,255],[157,104,201,255],[209,190,96,255],[89,200,216,255],[223,82,164,255],[120,230,75,255],[121,121,184,255],[191,136,114,255],[107,198,160,255],[192,99,206,255],[193,213,92,255],[85,158,220,255],[227,78,115,255],[71,234,78,255],[141,117,188,255],[195,163,110,255],[103,202,194,255],[210,95,186,255],[153,217,88,255],[81,111,224,255]];function Tp(t,e){const r=sr,n=e??uB();let i=[...t];if(Yt(i[0],[0,0,0,0])||(console.warn("addColorLUT: [0, 0, 0, 0] color is not provided for the background color (segmentIndex =0), automatically adding it"),i=[[0,0,0,0],...i]),i=i.map(o=>o.length===3?[o[0],o[1],o[2],255]:o),i.length<255){const o=h5.slice(i.length);i=[...i,...o]}return r.addColorLUT(i,n),n}function Mye(t,e){if(!t)throw new Error("addColorLUT: colorLUT is required");return Tp(t,e)}function Pye(t,e,r){if(!ym(r))throw new Error(`setColorLUT: could not find colorLUT with index ${r}`);const n=Ma(t,{segmentationId:e});if(!n)throw new Error(`viewport specific state for viewport ${t} does not exist`);n.forEach(i=>{i.colorLUTIndex=r}),bc(t,e)}function zl(t,e,r){const n=Ma(t,{segmentationId:e});if(!n||n.length===0)return null;const i=n[0],{colorLUTIndex:o}=i,a=ym(o);let s=a[r];if(!s){if(typeof r!="number")return console.warn(`Can't create colour for LUT index ${r}`),null;s=a[r]=[0,0,0,0]}return s}function fB(t,e,r,n){const i=zl(t,e,r);for(let o=0;oFr(c).id);lB(s)}return i}_getContourSegmentationStyle(e){const r=e.annotation,{segmentationId:n,segmentIndex:i}=r.data.segmentation,{viewportId:o}=e.styleSpecifier,a=Ma(o,{segmentationId:n});if(!(a!=null&&a.length))return{};a.length>1?a.find(v=>v.segmentationId===n&&v.type===Lt.Contour):a[0];const{autoGenerated:s}=r,l=Gd(n).includes(i),{color:f,fillColor:u,lineWidth:d,fillOpacity:h,lineDash:g,visibility:p}=hB({segmentationId:n,segmentIndex:i,viewportId:o,autoGenerated:s});return{color:f,fillColor:u,lineWidth:d,fillOpacity:h,lineDash:g,textbox:{color:f},visibility:p,locked:l}}};J8.PreviewSegmentIndex=255;let P1=J8;function gB(t,e){const r=vt("generalSeriesModule",t);return Xl(r.modality,t,e)}function Xl(t,e,r){return t==="CT"?"HU":t==="PT"?Lye(e,r):""}function Lye(t,e){if(!e.isPreScaled)return"raw";if(e.isSuvScaled)return"SUV";const r=vt("generalSeriesModule",t);if((r==null?void 0:r.modality)==="PT"){const n=vt("petSeriesModule",t);return(n==null?void 0:n.units)||"unitless"}return"unknown"}const{pointCanProjectOnLine:BI}=pf,{EPSILON:Aye}=df,Nye=1-Aye,Z8=class Z8 extends P1{constructor(e={},r={supportedInteractionTypes:["Mouse","Touch"],configuration:{storePointData:!1,shadow:!0,preventHandleOutsideImage:!1,contourHoleAdditionModifierKey:Yi.Shift,alwaysRenderOpenContourHandles:{enabled:!1,radius:2},allowOpenContours:!0,closeContourProximity:10,checkCanvasEditFallbackProximity:6,makeClockWise:!0,subPixelResolution:4,smoothing:{smoothOnAdd:!1,smoothOnEdit:!1,knotsRatioPercentageOnAdd:40,knotsRatioPercentageOnEdit:40},interpolation:{enabled:!1,onInterpolationComplete:null},decimate:{enabled:!1,epsilon:.1},displayOnePointAsCrosshairs:!1,calculateStats:!0,getTextLines:kye,statsCalculator:jc}}){super(e,r),this.isDrawing=!1,this.isEditingClosed=!1,this.isEditingOpen=!1,this.addNewAnnotation=n=>{const i=n.detail,{element:o}=i,a=this.createAnnotation(n);this.addAnnotation(a,o);const s=Ot(o,this.getToolName());return this.activateDraw(n,a,s),n.preventDefault(),Ne(s),a},this.handleSelectedCallback=(n,i,o)=>{const a=n.detail,{element:s}=a,c=Ot(s,this.getToolName());this.activateOpenContourEndEdit(n,i,c,o)},this.toolSelectedCallback=(n,i)=>{const o=n.detail,{element:a}=o,s=Ot(a,this.getToolName());i.data.contour.closed?this.activateClosedContourEdit(n,i,s):this.activateOpenContourEdit(n,i,s),n.preventDefault()},this.isPointNearTool=(n,i,o,a)=>{const s=Se(n),{viewport:c}=s,{polyline:l}=i.data.contour;let f=c.worldToCanvas(l[0]);for(let h=1;h{const i=this.isDrawing,o=this.isEditingOpen,a=this.isEditingClosed;i?this.cancelDrawing(n):o?this.cancelOpenContourEdit(n):a&&this.cancelClosedContourEdit(n)},this._calculateCachedStats=(n,i,o,a)=>{const{data:s}=n,{cachedStats:c}=s,{polyline:l,closed:f}=s.contour,u=Object.keys(c);for(let h=0;hi.worldToCanvas(I)),w={isPreScaled:ql(i,g),isSuvScaled:this.isSuvScaled(i,g,n.metadata.referencedImageId)},x=Xl(y.Modality,n.metadata.referencedImageId,w),C=La(p,()=>{const I=s.contour.polyline,P=I.length,O=new Array(P);for(let te=0;te{const{data:s}=n,c=this.getTargetId(i),l={toolGroupId:this.toolGroupId,toolName:this.getToolName(),viewportId:o.viewport.id,annotationUID:n.annotationUID},f=this.getLinkedTextBoxStyle(l,n);if(!f.visibility)return;const u=this.configuration.getTextLines(s,c);if(!u||u.length===0)return;const d=s.contour.polyline.map(x=>i.worldToCanvas(x));if(!s.handles.textBox.hasMoved){const x=Aa(d);s.handles.textBox.worldPosition=i.canvasToWorld(x)}const h=i.worldToCanvas(s.handles.textBox.worldPosition),p=uo(a,n.annotationUID??"","1",u,h,d,{},f),{x:v,y,width:m,height:w}=p;s.handles.textBox.worldBoundingBox={topLeft:i.canvasToWorld([v,y]),topRight:i.canvasToWorld([v+m,y]),bottomLeft:i.canvasToWorld([v,y+w]),bottomRight:i.canvasToWorld([v+m,y+w])}},ave(this),gve(this),_ve(this),Vve(this),Bve(this),Zve(this),this._throttledCalculateCachedStats=qo(this._calculateCachedStats,100,{trailing:!0})}filterInteractableAnnotationsForElement(e,r){if(!r||!r.length)return;const n=Se(e),{viewport:i}=n;let o;if(i instanceof vr){const a=i.getCamera(),{spacingInNormalDirection:s}=zh(i,a);o=this.filterAnnotationsWithinSlice(r,a,s)}else o=Em(i,r);return o}filterAnnotationsWithinSlice(e,r,n){const{viewPlaneNormal:i}=r,o=e.filter(l=>{let f=l.metadata.viewPlaneNormal;if(!l.metadata.referencedImageId&&!f&&l.metadata.FrameOfReferenceUID){for(const d of l.data.contour.polyline){const h=Nn(Ge(),d,r.focalPoint),g=Pt(h,r.viewPlaneNormal);if(!Yt(g,0))return!1}return l.metadata.viewPlaneNormal=r.viewPlaneNormal,l.metadata.cameraFocalPoint=r.focalPoint,!0}if(!f){const{referencedImageId:d}=l.metadata,{imageOrientationPatient:h}=vt("imagePlaneModule",d),g=At(h[0],h[1],h[2]),p=At(h[3],h[4],h[5]);f=Ge(),Wn(f,g,p),l.metadata.viewPlaneNormal=f}const u=Math.abs(Pt(i,f))>Nye;return f&&u});if(!o.length)return[];const a=n/2,{focalPoint:s}=r,c=[];for(const l of o){const u=l.data.contour.polyline[0];if(!l.isVisible)continue;const d=Ge();Nn(d,s,u);const h=Pt(d,i);Math.abs(h){a.data.handles.points.length=0};return Wi(n,{data:{contour:{polyline:[[...r]]},label:"",cachedStats:{}},onInterpolationComplete:i})}getAnnotationStyle(e){return super.getAnnotationStyle(e)}renderAnnotationInstance(e){const{enabledElement:r,targetId:n,svgDrawingHelper:i}=e,o=e.annotation;let a=!1;const{viewport:s,renderingEngine:c}=r,l=this.isDrawing,f=this.isEditingOpen,u=this.isEditingClosed;if(!(l||f||u))this.configuration.displayOnePointAsCrosshairs&&o.data.contour.polyline.length===1?this.renderPointContourWithMarker(r,i,o):this.renderContour(r,i,o);else{const d=this.commonData.annotation.annotationUID;if(o.annotationUID===d)if(l)this.renderContourBeingDrawn(r,i,o);else if(u)this.renderClosedContourBeingEdited(r,i,o);else if(f)this.renderOpenContourBeingEdited(r,i,o);else throw new Error(`Unknown ${this.getToolName()} annotation rendering state`);else this.configuration.displayOnePointAsCrosshairs&&o.data.contour.polyline.length===1?this.renderPointContourWithMarker(r,i,o):this.renderContour(r,i,o);a=!0}if(this.configuration.calculateStats)return this._calculateStatsIfActive(o,n,s,c,r),this._renderStats(o,s,r,i),a}_calculateStatsIfActive(e,r,n,i,o){var s,c,l,f;const a=(s=this.commonData)==null?void 0:s.annotation.annotationUID;if(!(e.annotationUID===a&&!((c=this.commonData)!=null&&c.movingTextBox))&&!((l=this.commonData)!=null&&l.movingTextBox)){const{data:u}=e;(f=u.cachedStats[r])!=null&&f.unit?e.invalidated&&this._throttledCalculateCachedStats(e,n,i,o):(u.cachedStats[r]={Modality:null,area:null,max:null,mean:null,stdDev:null,areaUnit:null,unit:null},this._calculateCachedStats(e,n,i,o))}}updateClosedCachedStats({viewport:e,points:r,imageData:n,metadata:i,cachedStats:o,targetId:a,modalityUnit:s,canvasCoordinates:c,calibratedScale:l,deltaInX:f,deltaInY:u}){var j,X,te,fe;const{scale:d,areaUnit:h,unit:g}=l,{voxelManager:p}=e.getImageData(),v=ei(n,r[0]);v[0]=Math.floor(v[0]),v[1]=Math.floor(v[1]),v[2]=Math.floor(v[2]);let y=v[0],m=v[0],w=v[1],x=v[1],C=v[2],S=v[2];for(let le=1;le{let Ie=!0;const Me=e.worldToCanvas(le);return Me[1]!=V&&(R=0,V=Me[1],G=LU(c,Me,[A[0],Me[1]]),G.sort(function(_e){return function(B,M){return B[_e]===M[_e]?0:B[_e]G[0][0]&&(G.shift(),R++),R%2===0&&(Ie=!1),Ie},boundsIJK:P,returnPoints:this.configuration.storePointData}));const F=this.configuration.statsCalculator.getStatistics();o[a]={Modality:i.Modality,area:_,perimeter:E,mean:(j=F.mean)==null?void 0:j.value,max:(X=F.max)==null?void 0:X.value,min:(te=F.min)==null?void 0:te.value,stdDev:(fe=F.stdDev)==null?void 0:fe.value,statsArray:F.array,pointsInShape:N,areaUnit:h,modalityUnit:s,unit:g}}updateOpenCachedStats({targetId:e,metadata:r,canvasCoordinates:n,cachedStats:i,modalityUnit:o,calibratedScale:a,deltaInX:s,deltaInY:c}){const{scale:l,unit:f}=a;let u=jS(n,closed)/l;u*=Math.sqrt(Math.pow(s,2)+Math.pow(c,2)),i[e]={Modality:r.Modality,length:u,modalityUnit:o,unit:f}}};Z8.toolName="PlanarFreehandROI";let af=Z8;function kye(t,e){const r=t.cachedStats[e],{area:n,mean:i,stdDev:o,length:a,perimeter:s,max:c,min:l,isEmptyArea:f,unit:u,areaUnit:d,modalityUnit:h}=r||{},g=[];if(Gr(n)){const p=f?"Area: Oblique not supported":`Area: ${dn(n)} ${d}`;g.push(p)}return Gr(i)&&g.push(`Mean: ${dn(i)} ${h}`),Gr(c)&&g.push(`Max: ${dn(c)} ${h}`),Gr(l)&&g.push(`Min: ${dn(l)} ${h}`),Gr(o)&&g.push(`Std Dev: ${dn(o)} ${h}`),Gr(s)&&g.push(`Perimeter: ${dn(s)} ${u}`),Gr(a)&&g.push(`${dn(a)} ${u}`),g}const Q8=class Q8 extends af{constructor(e){const r=Wi({configuration:{calculateStats:!1,allowOpenContours:!1}},e);super(r)}isContourSegmentationTool(){return!0}renderAnnotationInstance(e){const r=e.annotation,{invalidated:n}=r,i=super.renderAnnotationInstance(e);if(n){const{segmentationId:o}=r.data.segmentation;bo(o)}return i}};Q8.toolName="PlanarFreehandContourSegmentationTool";let Hc=Q8;const Vye={[Lt.Labelmap]:ZU,[Lt.Contour]:YU,[Lt.Surface]:aU},U2=Hc.toolName;class Fye{constructor(){this._needsRender=new Set,this._animationFrameSet=!1,this._animationFrameHandle=null,this._getAllViewports=()=>Ho().flatMap(r=>r.getViewports()),this._renderFlaggedSegmentations=()=>{this._throwIfDestroyed(),Array.from(this._needsRender).forEach(r=>{this._triggerRender(r)}),this._needsRender.clear(),this._animationFrameSet=!1,this._animationFrameHandle=null}}renderSegmentationsForViewport(e){const r=e?[e]:this._getViewportIdsForSegmentation();this._setViewportsToBeRenderedNextFrame(r)}renderSegmentation(e){const r=this._getViewportIdsForSegmentation(e);this._setViewportsToBeRenderedNextFrame(r)}_getViewportIdsForSegmentation(e){const r=this._getAllViewports(),n=[];for(const i of r){const o=i.id;if(e){const a=Ma(o,{segmentationId:e});(a==null?void 0:a.length)>0&&n.push(o)}else{const a=Ma(o);(a==null?void 0:a.length)>0&&n.push(o)}}return n}_throwIfDestroyed(){if(this.hasBeenDestroyed)throw new Error("this.destroy() has been manually called to free up memory, can not longer use this instance. Instead make a new one.")}_setViewportsToBeRenderedNextFrame(e){e.forEach(r=>{this._needsRender.add(r)}),this._render()}_render(){this._needsRender.size>0&&this._animationFrameSet===!1&&(this._animationFrameHandle=window.requestAnimationFrame(this._renderFlaggedSegmentations),this._animationFrameSet=!0)}_triggerRender(e){const r=Ma(e);if(!(r!=null&&r.length))return;const{viewport:n}=qn(e)||{};if(!n)return;const i=[],o=r.map(a=>{a.type===Lt.Contour&&this._addPlanarFreeHandToolIfAbsent(n);const s=Vye[a.type];try{const c=s.render(n,a);i.push(c)}catch(c){console.error(c)}return Promise.resolve({segmentationId:a.segmentationId,type:a.type})});Promise.allSettled(o).then(a=>{const s=a.filter(f=>f.status==="fulfilled").map(f=>f.value);function c(f){const{element:u,viewportId:d}=f.detail;u.removeEventListener(Ze.IMAGE_RENDERED,c),s.forEach(h=>{const g={viewportId:d,segmentationId:h.segmentationId,type:h.type};it(Je,k.SEGMENTATION_RENDERED,{...g})})}n.element.addEventListener(Ze.IMAGE_RENDERED,c),n.render()})}_addPlanarFreeHandToolIfAbsent(e){U2 in He.tools||Ui(Hc);const r=Fr(e.id);r.hasTool(U2)||(r.addTool(U2),r.setToolPassive(U2))}}function Qh(t){pB.renderSegmentationsForViewport(t)}function $w(t){pB.renderSegmentation(t)}const pB=new Fye;function Uye({modifiedSlicesToUse:t,representationData:e,type:r}){const n=Fe.getVolume(e[r].volumeId);if(!n){console.warn("segmentation not found in cache");return}const{imageData:i,vtkOpenGLTexture:o}=n;let a;if((t==null?void 0:t.length)>0)a=t;else{const s=i.getDimensions()[2];a=[...Array(s).keys()]}a.forEach(s=>{o.setUpdatedFrame(s)}),i.modified()}function Bye({viewportIds:t,segmentationId:e}){t.forEach(r=>{let n=Ma(r,{segmentationId:e});n=n.filter(i=>i.type===Lt.Labelmap),n.forEach(i=>{if(i.segmentationId!==e)return;const o=qn(r);if(!o)return;const{viewport:a}=o;if(a instanceof vr)return;const s=Cp(r,e);s!=null&&s.length&&s.forEach((c,l)=>{const f=c.actor.getMapper().getInputData(),u=Wl(r,e),d=Fe.getImage(u[l]);f.modified(),mw(f,d)})})})}const Gye=function(t){const{segmentationId:e,modifiedSlicesToUse:r}=t.detail,{representationData:n}=zn(e),i=Zh(e),o=i.some(c=>{const{viewport:l}=qn(c);return l instanceof vr}),a=i.some(c=>{const{viewport:l}=qn(c);return l instanceof mr}),s=o&&a;i.forEach(c=>{const{viewport:l}=qn(c);l instanceof vr&&Uye({modifiedSlicesToUse:s?[]:r,representationData:n,type:Lt.Labelmap}),l instanceof mr&&Bye({viewportIds:i,segmentationId:e})})},mB=function(t){const{segmentationId:e}=t.detail,{representationData:r}=zn(e);r.Labelmap&&Gye(t),$w(e)},vB=function(t){const{segmentationId:e}=t.detail;$w(e)};function yB(t,e){return sr.updateLabelmapSegmentationImageReferences(t,e)}const Wye=function(t){if(!t)return;const e=Se(t);if(!e)return;const{viewport:r}=e;r instanceof Or||(t.addEventListener(Ze.STACK_NEW_IMAGE,R1),t.addEventListener(Ze.IMAGE_RENDERED,R1))},zye=function(t){t.removeEventListener(Ze.STACK_NEW_IMAGE,R1),t.removeEventListener(Ze.IMAGE_RENDERED,R1)};function R1(t){const e=t.detail,{viewportId:r,renderingEngineId:n}=e,{viewport:i}=Ii(r,n),o=Ma(r);if(!(o!=null&&o.length))return;const a=o.filter(l=>l.type===Lt.Labelmap),s=i.getActors();a.forEach(l=>{const{segmentationId:f}=l;yB(r,f)});const c=a.flatMap(l=>Cp(r,l.segmentationId)).filter(l=>l!==void 0);c.length&&(c.forEach(l=>{a.find(u=>{const d=Wl(r,u.segmentationId);return d==null?void 0:d.includes(l.referencedId)})||i.removeActors([l.uid])}),a.forEach(l=>{const{segmentationId:f}=l,u=i.getCurrentImageId(),d=Wl(r,f);if(!d)return;const h=g=>{const p=Fe.getImage(g);if(!p){console.warn("No derived image found in the cache for segmentation representation",l);return}const v=s.find(y=>y.referencedId===g);if(v){const y=v.actor.getMapper().getInputData();y.setDerivedImage?y.setDerivedImage(p):mw(y,p)}else{const{dimensions:y,spacing:m,direction:w}=i.getImageDataMetadata(p),x=Fe.getImage(u)||{imageId:u},{origin:C}=i.getImageDataMetadata(x),S=C,T=p.voxelManager.getConstructor(),_=p.voxelManager.getScalarData(),E=Vt.newInstance({name:"Pixels",numberOfComponents:1,values:new T(_)}),b=Q1.newInstance();b.setDimensions(y[0],y[1],1),b.setSpacing(m),b.setDirection(w),b.setOrigin(S),b.getPointData().setScalars(E),b.modified(),i.addImages([{imageId:g,representationUID:`${f}-${Lt.Labelmap}-${p.imageId}`,callback:({imageActor:D})=>{D.getMapper().setInputData(b)}}]),Qh(r);return}};d.forEach(h),i.render(),t.type===Ze.IMAGE_RENDERED&&i.element.removeEventListener(Ze.IMAGE_RENDERED,R1)}))}const wB={enable:Wye,disable:zye};async function $ye(t){const e=t.detail.annotation;if(!_m(e))return;const r=Hye(e),n=Kye(r,e);if(!n.length){it(Je,k.ANNOTATION_CUT_MERGE_PROCESS_COMPLETED,{element:r.element,sourceAnnotation:e});return}const i=of(e.data.contour.polyline,r),o=HU(r,i,n);if(!o.length){it(Je,k.ANNOTATION_CUT_MERGE_PROCESS_COMPLETED,{element:r.element,sourceAnnotation:e});return}if(o.length>1){KU(r,e,i,o);return}const{targetAnnotation:a,targetPolyline:s,isContourHole:c}=o[0];if(c){const{contourHoleProcessingEnabled:l=!1}=t.detail;if(!l)return;Vw(r,a,e)}else t8(r,a,s,e,i)}function jye(t,e=!1){const r="PlanarFreehandContourSegmentationTool",n=Fr(t.id,t.renderingEngineId);let i;return n?n.hasTool(r)?n.getToolOptions(r)||(i=`Tool ${r} must be in active/passive state in ${n.id} toolGroup`):i=`Tool ${r} not added to ${n.id} toolGroup`:i=`ToolGroup not found for viewport ${t.id}`,i&&!e&&console.warn(i),!i}function Hye(t){const e=i8(t);return e.find(n=>jye(n,!0))??e[0]}function Kye(t,e){const{annotationUID:r}=e;return gm().filter(i=>i.annotationUID&&i.annotationUID!==r&&_m(i)&&sU(i,e)&&t.isReferenceViewable(i.metadata))}function qye(t){const e=t.detail.annotation;Ul(e)}function xB(t){const e=t.detail.annotation;_m(e)&&$ye(t)}function g5(t){if(!t.detail.removed.length)return;Ho().forEach(n=>{const o=n.getViewports().map(a=>a.id);Ne(o)})}function CB(t){const{viewportId:e}=t.detail;Ne([e])}function Xye(t){const e=t.detail.annotation;_m(e)&&qye(t)}const SB=function(t){Xh(t.detail.element)},Yye=function(t){t.addEventListener(Ze.IMAGE_RENDERED,SB)},Jye=function(t){t.removeEventListener(Ze.IMAGE_RENDERED,SB)},TB={enable:Yye,disable:Jye},{Active:Zye}=$n;function eg(t,e,r){if(He.isInteractingWithTool)return!1;const{renderingEngineId:n,viewportId:i}=r.detail,o=Fr(i,n);if(!o)return!1;let a;const s=Object.keys(o.toolOptions);for(let c=0;c{for(const c of s){if(c.isLocked||!c.isVisible)continue;const l=a.getHandleNearImagePoint(t,c,r,i);if(l){o.push({tool:a,annotation:c,handle:l});break}}}),o}function Dm(t,e){const r=[];for(let n=0;n0&&r.push({tool:i,annotations:o}))}return r}function d8(t,e,r,n="mouse"){const i=n==="touch"?36:6,o=[];return e.forEach(({tool:a,annotations:s})=>{for(const c of s){if(c.isLocked||!c.isVisible)continue;if(a.isPointNearTool(t,c,r,i,n)){o.push({tool:a,annotation:c});break}}}),o}const{Active:Qye}=$n;function jw(t){const{renderingEngineId:e,viewportId:r,event:n}=t.detail,i=Jh(n)||Kh.getModifierKey(),o=Fr(r,e);if(!o)return null;const a=Object.keys(o.toolOptions),s=o.getDefaultMousePrimary(),c=t.detail.buttons??(n==null?void 0:n.buttons)??s;for(let l=0;lh.mouseButton===c&&h.modifierKey===i);if(u.mode===Qye&&d)return o.getToolInstance(f)}}function bh(t,e,r){const{renderingEngineId:n,viewportId:i}=t.detail,o=Fr(i,n);if(!o)return[];const a=[],s=Object.keys(o.toolOptions);for(let c=0;cd.mouseButton===r);if(e.includes(f.mode)&&(!r||u)){const d=o.getToolInstance(l);a.push(d)}}return a}function e5e(t,e){var u;const r=new Map,{renderingEngineId:n,viewportId:i}=t.detail,o=Fr(i,n);if(!o)return r;const a=Object.keys(o.toolOptions),s=o.getDefaultMousePrimary(),c=t.detail.event,l=(c==null?void 0:c.buttons)??s,f=Jh(c)||Kh.getModifierKey();for(let d=0;d{var w;return((w=m.bindings)==null?void 0:w.length)&&m.bindings.some(x=>x.mouseButton===l&&x.modifierKey===f)});y&&r.set(g,y)}return r}const{Active:t5e,Passive:n5e}=$n;function r5e(t){if(He.isInteractingWithTool)return!1;const e=t.detail,{element:r}=e,n=Se(r),{canvas:i}=e.currentPoints;if(!n)return!1;const o=e5e(t,[t5e,n5e]),a=Array.from(o.keys()),s=Dm(r,a),c=d8(r,s,i);if(c.length>0){const{tool:l,annotation:f}=c[0],u=o.get(l);return(typeof u.method=="string"?l[u.method]:u.method).call(l,t,f),!0}return!1}const{Active:i5e,Passive:o5e}=$n;function DB(t){if(He.isInteractingWithTool)return;const e=jw(t);if(e&&typeof e.preMouseDownCallback=="function"&&e.preMouseDownCallback(t))return;const r=t.detail.event.buttons===1,n=bh(t,[i5e],t.detail.event.buttons),i=r?bh(t,[o5e]):void 0,o=[...n||[],...i||[]];if(r5e(t))return;const s=t.detail,{element:c}=s,l=Dm(c,o),f=s.currentPoints.canvas,u=bB(c,l,f,"mouse"),d=!!t.detail.event.shiftKey;if(u.length>0){const{tool:g,annotation:p,handle:v}=GI(u);WI(p.annotationUID,d),g.handleSelectedCallback(t,p,v,"Mouse");return}const h=d8(c,l,f,"mouse");if(h.length>0){const{tool:g,annotation:p}=GI(h);WI(p.annotationUID,d),g.toolSelectedCallback(t,p,"Mouse",f);return}e&&typeof e.postMouseDownCallback=="function"&&e.postMouseDownCallback(t)}function GI(t){if(t.length>1){const e=t.find(r=>{const n=!mi(r.annotation.annotationUID),i=ii(r.annotation.annotationUID);return n&&i});if(e)return e}return t[0]}function WI(t,e=!1){e?wm(t)?ca(t,!1):ca(t,!0,!0):ca(t,!0,!1)}function IB(t){if(He.isInteractingWithTool)return;const e=jw(t);if(e&&!He.isMultiPartToolActive&&e.addNewAnnotation){const r=e.addNewAnnotation(t,"mouse");ca(r.annotationUID)}}function OB(t){if(He.isInteractingWithTool)return;const e=jw(t);!e||typeof e.mouseDragCallback!="function"||e.mouseDragCallback(t)}const{Active:a5e,Passive:s5e}=$n;function MB(t){if(He.isInteractingWithTool||He.isMultiPartToolActive)return;const e=bh(t,[a5e,s5e]),r=t.detail,{element:n}=r,i=Dm(n,e),o=e.filter(s=>!i.some(l=>l.tool.getToolName()===s.getToolName()));let a=!1;for(const{tool:s,annotations:c}of i)typeof s.mouseMoveCallback=="function"&&(a=s.mouseMoveCallback(t,c)||a);o.forEach(s=>{typeof s.mouseMoveCallback=="function"&&s.mouseMoveCallback(t)}),a===!0&&Xh(n)}const PB=eg.bind(null,"Mouse","mouseUpCallback");function RB(t){if(He.isInteractingWithTool)return;t.detail.buttons=$c.Wheel|(t.detail.event.buttons||0);const e=jw(t);if(e)return e.mouseWheelCallback(t)}const c5e=function(t){t.addEventListener(k.MOUSE_CLICK,_B),t.addEventListener(k.MOUSE_DOWN,DB),t.addEventListener(k.MOUSE_DOWN_ACTIVATE,IB),t.addEventListener(k.MOUSE_DOUBLE_CLICK,EB),t.addEventListener(k.MOUSE_DRAG,OB),t.addEventListener(k.MOUSE_MOVE,MB),t.addEventListener(k.MOUSE_UP,PB),t.addEventListener(k.MOUSE_WHEEL,RB)},l5e=function(t){t.removeEventListener(k.MOUSE_CLICK,_B),t.removeEventListener(k.MOUSE_DOWN,DB),t.removeEventListener(k.MOUSE_DOWN_ACTIVATE,IB),t.removeEventListener(k.MOUSE_DOUBLE_CLICK,EB),t.removeEventListener(k.MOUSE_DRAG,OB),t.removeEventListener(k.MOUSE_MOVE,MB),t.removeEventListener(k.MOUSE_UP,PB),t.removeEventListener(k.MOUSE_WHEEL,RB)},LB={enable:c5e,disable:l5e},{Active:u5e}=$n;function AB(t){const{renderingEngineId:e,viewportId:r}=t.detail,n=_pe(),i=Kh.getModifierKey(),o=Fr(r,e);if(!o)return null;const a=Object.keys(o.toolOptions),s=o.getDefaultMousePrimary();for(let c=0;cd.mouseButton===(n??s)&&d.modifierKey===i))return o.getToolInstance(l)}}function f5e(t,e){var c;const r=new Map,{renderingEngineId:n,viewportId:i}=t.detail,o=Fr(i,n);if(!o)return r;const a=Object.keys(o.toolOptions),s=t.detail.key;for(let l=0;l{var v;return(v=p.bindings)==null?void 0:v.some(y=>y.key===s)});g&&r.set(u,g)}return r}function NB(t){const e=AB(t);if(e){const{renderingEngineId:n,viewportId:i}=t.detail,o=Fr(i,n),a=e.getToolName();Object.keys(o.toolOptions).includes(a)&&o.setViewportsCursorByToolName(a)}const r=f5e(t,[$n.Active]);if(r!=null&&r.size){const{element:n}=t.detail;for(const[i,o]of[...r.entries()])(typeof o.method=="function"?o.method:i[o.method]).call(i,n,o,t)}}function kB(t){const e=AB(t);if(!e)return;const{renderingEngineId:r,viewportId:n}=t.detail,i=Fr(n,r);JF();const o=e.getToolName();Object.keys(i.toolOptions).includes(o)&&i.setViewportsCursorByToolName(o)}const d5e=function(t){t.addEventListener(k.KEY_DOWN,NB),t.addEventListener(k.KEY_UP,kB)},h5e=function(t){t.removeEventListener(k.KEY_DOWN,NB),t.removeEventListener(k.KEY_UP,kB)},VB={enable:d5e,disable:h5e},{Active:g5e,Passive:p5e,Enabled:m5e}=$n,FB=function(t){bh(t,[g5e,p5e,m5e]).forEach(r=>{r.onCameraModified&&r.onCameraModified(t)})},v5e=function(t){t.addEventListener(Ze.CAMERA_MODIFIED,FB)},y5e=function(t){t.removeEventListener(Ze.CAMERA_MODIFIED,FB)},UB={enable:v5e,disable:y5e},{Active:w5e,Passive:x5e,Enabled:C5e}=$n,BB=function(t){bh(t,[w5e,x5e,C5e]).forEach(r=>{r.onImageSpacingCalibrated&&r.onImageSpacingCalibrated(t)})},S5e=function(t){t.addEventListener(Ze.IMAGE_SPACING_CALIBRATED,BB)},T5e=function(t){t.removeEventListener(Ze.IMAGE_SPACING_CALIBRATED,BB)},GB={enable:S5e,disable:T5e},{Active:_5e}=$n;function h8(t){const{renderingEngineId:e,viewportId:r}=t.detail,n=t.detail.event,i=Fr(r,e);if(!i)return null;const o=Object.keys(i.toolOptions),a=Object.keys(n.touches).length,s=Jh(n)||Kh.getModifierKey(),c=i.getDefaultMousePrimary();for(let l=0;l(h.numTouchPoints===a||a===1&&h.mouseButton===c)&&h.modifierKey===s);if(u.mode===_5e&&d)return i.getToolInstance(f)}}function zI(t,e,r){const{renderingEngineId:n,viewportId:i}=t.detail,o=Fr(i,n);if(!o)return[];const a=[],s=Object.keys(o.toolOptions);for(let c=0;cd.numTouchPoints===r);if(e.includes(f.mode)&&(!r||u)){const d=o.getToolInstance(l);a.push(d)}}return a}const{Active:E5e,Passive:b5e}=$n;function WB(t){if(He.isInteractingWithTool)return;const e=h8(t);if(e&&typeof e.preTouchStartCallback=="function"&&e.preTouchStartCallback(t))return;const r=Object.keys(t.detail.event.touches).length===1,n=zI(t,[E5e],Object.keys(t.detail.event.touches).length),i=r?zI(t,[b5e]):void 0,o=[...n||[],...i||[],e],a=t.detail,{element:s}=a,c=Dm(s,o),l=a.currentPoints.canvas,f=bB(s,c,l,"touch"),u=!1;if(f.length>0){const{tool:h,annotation:g,handle:p}=$I(f);jI(g.annotationUID,u),h.handleSelectedCallback(t,g,p,"Touch");return}const d=d8(s,c,l,"touch");if(d.length>0){const{tool:h,annotation:g}=$I(d);jI(g.annotationUID,u),h.toolSelectedCallback(t,g,"Touch",l);return}e&&typeof e.postTouchStartCallback=="function"&&e.postTouchStartCallback(t)}function $I(t){return t.length>1&&t.find(e=>!mi(e.annotation.annotationUID)&&ii(e.annotation.annotationUID))||t[0]}function jI(t,e=!1){e?wm(t)?ca(t,!1):ca(t,!0,!0):ca(t,!0,!1)}function zB(t){if(He.isInteractingWithTool)return;const e=h8(t);if(e&&!He.isMultiPartToolActive&&e.addNewAnnotation){const r=e.addNewAnnotation(t,"touch");ca(r.annotationUID)}}function $B(t){if(He.isInteractingWithTool)return;const e=h8(t);!e||typeof e.touchDragCallback!="function"||e.touchDragCallback(t)}const jB=eg.bind(null,"Touch","touchEndCallback"),D5e=eg.bind(null,"Touch","touchTapCallback"),HB=eg.bind(null,"Touch","touchPressCallback"),I5e=function(t){t.addEventListener(k.TOUCH_START,WB),t.addEventListener(k.TOUCH_START_ACTIVATE,zB),t.addEventListener(k.TOUCH_DRAG,$B),t.addEventListener(k.TOUCH_END,jB),t.addEventListener(k.TOUCH_TAP,D5e),t.addEventListener(k.TOUCH_PRESS,HB)},O5e=function(t){t.removeEventListener(k.TOUCH_START,WB),t.removeEventListener(k.TOUCH_START_ACTIVATE,zB),t.removeEventListener(k.TOUCH_DRAG,$B),t.removeEventListener(k.TOUCH_END,jB),t.removeEventListener(k.TOUCH_PRESS,HB)},KB={enable:I5e,disable:O5e},M5e=function(){Je.addEventListener(k.ANNOTATION_COMPLETED,Vc.handleAnnotationCompleted),Je.addEventListener(k.ANNOTATION_MODIFIED,Vc.handleAnnotationUpdate),Je.addEventListener(k.ANNOTATION_REMOVED,Vc.handleAnnotationDelete)},P5e=function(){Je.removeEventListener(k.ANNOTATION_COMPLETED,Vc.handleAnnotationCompleted),Je.removeEventListener(k.ANNOTATION_MODIFIED,Vc.handleAnnotationUpdate),Je.removeEventListener(k.ANNOTATION_REMOVED,Vc.handleAnnotationDelete)},qB={enable:M5e,disable:P5e},{Active:R5e,Passive:L5e,Enabled:A5e}=$n,XB=function(t){bh(t,[R5e,L5e,A5e]).forEach(r=>{r.onResetCamera&&r.onResetCamera(t)})},N5e=function(t){t.addEventListener(Ze.CAMERA_RESET,XB)},k5e=function(t){t.removeEventListener(Ze.CAMERA_RESET,XB)},YB={enable:N5e,disable:k5e};function g8(t){const{element:e,viewportId:r}=t.detail,n=V5e(r);F5e(e),U5e(n,e),QE.addViewportElement(r,e),MF.enable(e),XF.enable(e),HF.enable(e),Kh.enable(e),wB.enable(e),TB.enable(e),UB.enable(e),GB.enable(e),YB.enable(e),LB.enable(e),VB.enable(e),KB.enable(e),He.enabledElements.push(e)}function V5e(t){const e="http://www.w3.org/2000/svg",r=document.createElementNS(e,"svg"),n=`svg-layer-${t}`;r.classList.add("svg-layer"),r.setAttribute("id",n),r.setAttribute("xmlns","http://www.w3.org/2000/svg"),r.style.width="100%",r.style.height="100%",r.style.pointerEvents="none",r.style.position="absolute";const i=document.createElementNS(e,"defs"),o=document.createElementNS(e,"filter"),a=document.createElementNS(e,"feOffset"),s=document.createElementNS(e,"feColorMatrix"),c=document.createElementNS(e,"feBlend");return o.setAttribute("id",`shadow-${n}`),o.setAttribute("filterUnits","userSpaceOnUse"),a.setAttribute("result","offOut"),a.setAttribute("in","SourceGraphic"),a.setAttribute("dx","0.5"),a.setAttribute("dy","0.5"),s.setAttribute("result","matrixOut"),s.setAttribute("in","offOut"),s.setAttribute("in2","matrix"),s.setAttribute("values","0.2 0 0 0 0 0 0.2 0 0 0 0 0 0.2 0 0 0 0 0 1 0"),c.setAttribute("in","SourceGraphic"),c.setAttribute("in2","matrixOut"),c.setAttribute("mode","normal"),o.appendChild(a),o.appendChild(s),o.appendChild(c),i.appendChild(o),r.appendChild(i),r}function F5e(t){const{viewportUid:e,renderingEngineUid:r}=t.dataset,n=`${e}:${r}`;He.svgNodeCache[n]={}}function U5e(t,e){e.querySelector("div.viewport-element").appendChild(t)}function JB(t,e){const r=[];if(!e&&!t)throw new Error("At least one of renderingEngineId or viewportId should be given");for(let n=0;n{const e=Se(t);if(!e)return;JB(e.viewportId,e.renderingEngineId).forEach(n=>{n.remove(e)})},W5e=t=>{const e=Se(t);if(!e)return;const{renderingEngineId:r,viewportId:n}=e,i=Fr(n,r);i&&i.removeViewports(r,n)};function z5e(t){const{viewportUid:e,renderingEngineUid:r}=t.dataset,n=`${e}:${r}`;delete He.svgNodeCache[n]}function $5e(t){const e=t.querySelector(`div.${B5e}`),r=e.querySelector("svg");r&&e.removeChild(r)}const j5e=function(t){const e=He.enabledElements.findIndex(r=>r===t);e>-1&&He.enabledElements.splice(e,1)};function ZB(t){const e=UU(t,[$n.Active,$n.Passive]),r=Dm(t,e);for(const{tool:n}of r){const i=n.cancel(t);if(i)return i}}class m8{constructor(e,r,n,i){this._viewportOptions={},this._onEvent=o=>{var l;if(this._ignoreFiredEvents===!0||!this._targetViewports.length)return;const a=this._eventSource==="element"?Se(o.currentTarget):qn((l=o.detail)==null?void 0:l.viewportId);if(!a)return;const{renderingEngineId:s,viewportId:c}=a;this._sourceViewports.find(f=>f.viewportId===c)&&this.fireEvent({renderingEngineId:s,viewportId:c},o)},this._enabled=!0,this._eventName=r,this._eventHandler=n,this._ignoreFiredEvents=!1,this._sourceViewports=[],this._targetViewports=[],this._options=i||{},this._eventSource=this._options.eventSource||"element",this._auxiliaryEvents=this._options.auxiliaryEvents||[],this.id=e}isDisabled(){return!this._enabled||!this._hasSourceElements()}setOptions(e,r={}){this._viewportOptions[e]=r}setEnabled(e){this._enabled=e}getOptions(e){return this._viewportOptions[e]}add(e){this.addTarget(e),this.addSource(e)}addSource(e){if(B2(this._sourceViewports,e))return;const{renderingEngineId:r,viewportId:n}=e,i=ni(r).getViewport(n);if(!i){console.warn(`Synchronizer.addSource: No viewport for ${r} ${n}`);return}(this._eventSource==="element"?i.element:Je).addEventListener(this._eventName,this._onEvent.bind(this)),this._auxiliaryEvents.forEach(({name:a,source:s})=>{(s==="element"?i.element:Je).addEventListener(a,this._onEvent.bind(this))}),this._updateDisableHandlers(),this._sourceViewports.push(e)}addTarget(e){B2(this._targetViewports,e)||(this._targetViewports.push(e),this._updateDisableHandlers())}getSourceViewports(){return this._sourceViewports}getTargetViewports(){return this._targetViewports}destroy(){this._sourceViewports.forEach(e=>this.removeSource(e)),this._targetViewports.forEach(e=>this.removeTarget(e))}remove(e){this.removeTarget(e),this.removeSource(e)}removeSource(e){const r=HI(this._sourceViewports,e);if(r===-1)return;const n=this._eventSource==="element"?this.getViewportElement(e):Je;this._sourceViewports.splice(r,1),n.removeEventListener(this._eventName,this._eventHandler),this._auxiliaryEvents.forEach(({name:i,source:o})=>{(o==="element"?this.getViewportElement(e):Je).removeEventListener(i,this._eventHandler)}),this._updateDisableHandlers()}removeTarget(e){const r=HI(this._targetViewports,e);r!==-1&&(this._targetViewports.splice(r,1),this._updateDisableHandlers())}hasSourceViewport(e,r){return B2(this._sourceViewports,{renderingEngineId:e,viewportId:r})}hasTargetViewport(e,r){return B2(this._targetViewports,{renderingEngineId:e,viewportId:r})}fireEvent(e,r){if(this.isDisabled()||this._ignoreFiredEvents)return;this._ignoreFiredEvents=!0;const n=[];try{for(let i=0;i{this._ignoreFiredEvents=!1}):this._ignoreFiredEvents=!1}}_hasSourceElements(){return this._sourceViewports.length!==0}_updateDisableHandlers(){const e=H5e(this._sourceViewports,this._targetViewports),r=this.remove.bind(this),n=i=>{r(i.detail.element)};e.forEach(i=>{const o=this.getEventSource(i);o&&(o.removeEventListener(Ze.ELEMENT_DISABLED,n),o.addEventListener(Ze.ELEMENT_DISABLED,n))})}getEventSource(e){return this._eventSource==="element"?this.getViewportElement(e):Je}getViewportElement(e){const{renderingEngineId:r,viewportId:n}=e,i=ni(r);if(!i)return null;const o=i.getViewport(n);return o?o.element:null}}function H5e(t,e){const r=[],n=t.concat(e);for(let i=0;io.renderingEngineId===a.renderingEngineId&&o.viewportId===a.viewportId)||r.push(o)}return r}function HI(t,e){return t.findIndex(r=>e.renderingEngineId===r.renderingEngineId&&e.viewportId===r.viewportId)}function B2(t,e){return t.some(r=>r.renderingEngineId===e.renderingEngineId&&r.viewportId===e.viewportId)}function Wd(t,e,r,n){if(He.synchronizers.some(a=>a.id===t))throw new Error(`Synchronizer with id '${t}' already exists.`);const o=new m8(t,e,r,n);return He.synchronizers.push(o),o}function K5e(){for(;He.synchronizers.length>0;)He.synchronizers.pop().destroy()}function q5e(t){return He.synchronizers.find(e=>e.id===t)}function X5e(){return He.synchronizers}function Y5e(t){const e=He.synchronizers.findIndex(r=>r.id===t);e>-1&&(He.synchronizers[e].destroy(),He.synchronizers.splice(e,1))}const QB=Object.freeze(Object.defineProperty({__proto__:null,createSynchronizer:Wd,destroy:K5e,destroySynchronizer:Y5e,getAllSynchronizers:X5e,getSynchronizer:q5e,getSynchronizersForViewport:JB},Symbol.toStringTag,{value:"Module"})),J5e=Object.freeze(Object.defineProperty({__proto__:null,Synchronizer:m8,SynchronizerManager:QB,ToolGroupManager:hF,addEnabledElement:g8,addTool:Ui,cancelActiveManipulations:ZB,hasTool:upe,removeEnabledElement:p8,removeTool:xF,get state(){return He},svgNodeCache:xw},Symbol.toStringTag,{value:"Module"})),p5=function(t){const{viewportId:e}=t.detail;Qh(e)};let KS=!1;function eG(t={}){KS||(u1e(t),Q5e(),ewe(),KS=!0)}function Z5e(){tG(),nG(),fF(),Vhe();const t=uc(),e=sr;t.restoreAnnotations({}),e.resetState(),KS=!1}function Q5e(){tG();const t=Ze.ELEMENT_ENABLED,e=Ze.ELEMENT_DISABLED;Je.addEventListener(t,g8),Je.addEventListener(e,p8),qB.enable()}function tG(){const t=Ze.ELEMENT_ENABLED,e=Ze.ELEMENT_DISABLED;Je.removeEventListener(t,g8),Je.removeEventListener(e,p8),qB.disable()}function ewe(){nG(),Je.addEventListener(k.ANNOTATION_COMPLETED,xB),Je.addEventListener(k.ANNOTATION_MODIFIED,CB),Je.addEventListener(k.ANNOTATION_SELECTION_CHANGE,g5),Je.addEventListener(k.ANNOTATION_SELECTION_CHANGE,g5),Je.addEventListener(k.ANNOTATION_REMOVED,Xye),Je.addEventListener(k.SEGMENTATION_MODIFIED,vB),Je.addEventListener(k.SEGMENTATION_DATA_MODIFIED,mB),Je.addEventListener(k.SEGMENTATION_REPRESENTATION_MODIFIED,p5),Je.addEventListener(k.SEGMENTATION_REPRESENTATION_ADDED,p5)}function nG(){Je.removeEventListener(k.ANNOTATION_COMPLETED,xB),Je.removeEventListener(k.ANNOTATION_MODIFIED,CB),Je.removeEventListener(k.ANNOTATION_SELECTION_CHANGE,g5),Je.removeEventListener(k.ANNOTATION_SELECTION_CHANGE,g5),Je.removeEventListener(k.SEGMENTATION_MODIFIED,vB),Je.removeEventListener(k.SEGMENTATION_DATA_MODIFIED,mB),Je.removeEventListener(k.SEGMENTATION_REPRESENTATION_MODIFIED,p5),Je.removeEventListener(k.SEGMENTATION_REPRESENTATION_ADDED,p5)}const twe=Object.freeze(Object.defineProperty({__proto__:null,COLOR_LUT:h5},Symbol.toStringTag,{value:"Module"})),nwe="3.20.0";function rwe(t,e,r,n){const{camera:i}=n.detail,o=ni(r.renderingEngineId);if(!o)throw new Error(`No RenderingEngine for Id: ${r.renderingEngineId}`);const a=o.getViewport(r.viewportId);a.setCamera(i),a.render()}const{CAMERA_MODIFIED:iwe}=Ze;function owe(t){return Wd(t,iwe,rwe)}function awe(t,e,r,n,i){const o=ni(r.renderingEngineId);if(!o)throw new Error(`No RenderingEngine for Id: ${r.renderingEngineId}`);const a=o.getViewport(r.viewportId),c=o.getViewport(e.viewportId).getViewPresentation(i);a.setViewPresentation(c),a.render()}const{CAMERA_MODIFIED:swe}=Ze;function cwe(t,e){return Wd(t,swe,awe,{viewPresentation:e})}function lwe(t,e,r,n,i){const o=n.detail,{volumeId:a,range:s,invertStateChanged:c,invert:l,colormap:f}=o,u=ni(r.renderingEngineId);if(!u)throw new Error(`Rendering Engine does not exist: ${r.renderingEngineId}`);const d=u.getViewport(r.viewportId),h={voiRange:s};if(i!=null&&i.syncInvertState&&c&&(h.invert=l),i!=null&&i.syncColormap&&f&&(h.colormap=f),d instanceof Or)d._actors&&d._actors.size>1?d.setProperties(h,a):d.setProperties(h);else if(d instanceof mr)d.setProperties(h);else throw new Error("Viewport type not supported.");d.render()}function uwe(t,e){return e=Object.assign({syncInvertState:!0,syncColormap:!0},e),Wd(t,Ze.VOI_MODIFIED,lwe,{auxiliaryEvents:[{name:Ze.COLORMAP_MODIFIED}],...e})}function fwe(t,e,r){const n=ni(r.renderingEngineId);if(!n)throw new Error(`No RenderingEngine for Id: ${r.renderingEngineId}`);const i=t.getOptions(r.viewportId),o=n.getViewport(r.viewportId),a=n.getViewport(e.viewportId);if((i==null?void 0:i.syncZoom)!==!1){const s=a.getZoom();o.setZoom(s)}if((i==null?void 0:i.syncPan)!==!1){const s=a.getPan();o.setPan(s)}o.render()}const{CAMERA_MODIFIED:dwe}=Ze;function hwe(t){return Wd(t,dwe,fwe)}function gwe(t,e){const{viewPlaneNormal:r}=t.getCamera(),{viewPlaneNormal:n}=e.getCamera(),i=Pt(r,n);return Math.abs(i)>.9}const KI=(t,e)=>x1.get("spatialRegistrationModule",t,e);async function pwe(t,e,r){const n=ni(r.renderingEngineId);if(!n)throw new Error(`No RenderingEngine for Id: ${r.renderingEngineId}`);const i=n.getViewport(e.viewportId),o=t.getOptions(r.viewportId);if(o!=null&&o.disabled)return;const a=n.getViewport(r.viewportId),s=i.getCurrentImageId(),l=vt("imagePlaneModule",s).imagePositionPatient,f=a.getImageIds();if(!gwe(i,a))return;let u=KI(r.viewportId,e.viewportId);if(!u){const p=i.getFrameOfReferenceUID(),v=a.getFrameOfReferenceUID();if(p===v&&(o==null?void 0:o.useInitialPosition)!==!1?u=Ut(Pa()):(mV(i,a),u=KI(r.viewportId,e.viewportId)),!u)return}const d=Ht(Ge(),l,u),h=mwe(d,f);let g=h.index;a instanceof vr&&(g=f.length-h.index-1),h.index!==-1&&a.getCurrentImageIdIndex()!==h.index&&await hs(a.element,{imageIndex:g})}function mwe(t,e){return e.reduce((r,n,i)=>{const{imagePositionPatient:o}=vt("imagePlaneModule",n),a=no(o,t);return a{i.getImageIds().includes(t)&&i.calibrateSpacing(t)})}function oG(t,e){const r=t.findIndex(([n,i])=>n===i);if(r===-1)throw new Error("3D bounding boxes not supported in an oblique plane");return t[r][0]-=e,t[r][1]+=e,t}const Dwe=Object.freeze(Object.defineProperty({__proto__:null,extend2DBoundingBoxInViewAxis:oG,getBoundingBoxAroundShape:ef,getBoundingBoxAroundShapeIJK:ef,getBoundingBoxAroundShapeWorld:eU},Symbol.toStringTag,{value:"Module"})),{transformWorldToIndex:D3}=Vn;function aG(t,e,r){const[n,i]=t,o=At((n[0]+i[0])/2,(n[1]+i[1])/2,(n[2]+i[2])/2),a=no(n,i)/2,{boundsIJK:s,topLeftWorld:c,bottomRightWorld:l}=Owe(e,r,t,o,a);return{boundsIJK:s,centerWorld:o,radiusWorld:a,topLeftWorld:c,bottomRightWorld:l}}function sG(t,e){const r=e.getDirection(),n=At(r[0],r[1],r[2]),i=At(r[3],r[4],r[5]),o=At(r[6],r[7],r[8]),a=Rc(Ge(),o);return aG(t,e,{row:n,column:i,normal:a})}function Iwe(t,e,r){if(!r)throw new Error("viewport is required in order to calculate the sphere bounds");const n=r.getCamera(),i=At(n.viewUp[0],n.viewUp[1],n.viewUp[2]),o=At(n.viewPlaneNormal[0],n.viewPlaneNormal[1],n.viewPlaneNormal[2]),a=Ge();Wn(a,i,o);const s={row:a,normal:o,column:Rc(Ge(),i)};return aG(t,e,s)}function Owe(t,e,r,n,i){const o=t.getDimensions(),{row:a,column:s,normal:c}=e,l=Ge(),f=Ge();An(l,n,c,i),An(f,n,c,-i),An(l,l,s,-i),An(f,f,s,i),An(l,l,a,-i),An(f,f,a,i);const u=D3(t,l),d=D3(t,f),h=r.map(p=>D3(t,p));return{boundsIJK:ef([u,d,...h],o),topLeftWorld:l,bottomRightWorld:f}}function cG(t,e=5){return parseFloat(t[0]).toFixed(e)+","+parseFloat(t[1]).toFixed(e)+","+parseFloat(t[2]).toFixed(e)+","}class Mwe{static setStartRange(e,r,n=e.getCurrentImageIdIndex()){this.setRange(e,r,n)}static setEndRange(e,r,n=e.getCurrentImageIdIndex()){this.setRange(e,r,void 0,n)}static setRange(e,r,n,i){var c;const{metadata:o}=r;n===void 0&&(n=o.sliceIndex=n?a:e.getNumberOfSlices()-1),i=Math.max(n,i),o.sliceIndex=Math.min(n,i),o.referencedImageId=e.getCurrentImageId(o.sliceIndex),o.referencedImageURI=void 0,i===o.sliceIndex?o.multiSliceReference=void 0:i!==((c=o.multiSliceReference)==null?void 0:c.sliceIndex)&&(o.multiSliceReference={referencedImageId:e.getCurrentImageId(i),sliceIndex:i});const s={viewportId:e.id,renderingEngineId:e.renderingEngineId,changeType:Zt.MetadataReferenceModified,annotation:r};it(Je,k.ANNOTATION_MODIFIED,s),this.setViewportFrameRange(e,o)}static setSingle(e,r,n=e.getCurrentImageIdIndex()){this.setRange(e,r,n,n)}static getFrameRange(e){const{metadata:r}=e,{sliceIndex:n,multiSliceReference:i}=r,o=i==null?void 0:i.sliceIndex;return o?[n+1,o+1]:n+1}static getFrameRangeStr(e){const r=this.getFrameRange(e);return Array.isArray(r)?`${r[0]}-${r[1]}`:String(r)}static setViewportFrameRange(e,r){var n;e.setFrameRange&&((n=r.multiSliceReference)!=null&&n.sliceIndex)&&e.setFrameRange(r.sliceIndex+1,r.multiSliceReference.sliceIndex+1)}}function Pwe(t,e){const{viewPlaneNormal:r}=t.metadata,{viewPlaneNormal:n}=e.metadata,i=Pt(r,n);if(!Ju(1,Math.abs(i)))return!1;const{polyline:a}=t.data.contour,{polyline:s}=e.data.contour,c=Pt(r,a[0]),l=Pt(r,s[0]);return Ju(c,l)}function lG(t,e,r){let n=-1;if(e.forEach((i,o)=>{n>=0||i.a==t.b&&(n=o)}),n>=0){const i=e[n];return e.splice(n,1),r.push(i.b),r[0]==i.b?{remainingLines:e,contourPoints:r,type:"CLOSED_PLANAR"}:lG(i,e,r)}return{remainingLines:e,contourPoints:r,type:"OPEN_PLANAR"}}function v8(t){if(t.length==0)return[];const e=[],r=t.shift();e.push(r.a),e.push(r.b);const n=lG(r,t,e);if(n.remainingLines.length==0)return[{type:n.type,contourPoints:n.contourPoints}];{const i=v8(n.remainingLines);return i.push({type:n.type,contourPoints:n.contourPoints}),i}}function Rwe(t){return v8(t)}const Lwe={findContours:v8,findContoursFromReducedSet:Rwe};function Awe(t,e=!1){const r=t.getPoints(),n=t.getLines(),i=new Array(r.getNumberOfPoints()).fill(0).map((c,l)=>r.getPoint(l).slice()),o=new Array(n.getNumberOfCells()).fill(0).map((c,l)=>{const f=n.getCell(l*3).slice();return{a:f[0],b:f[1]}});if(e)return{points:i,lines:o};const a=[];for(const[c,l]of i.entries()){const f=a.findIndex(u=>u[0]===l[0]&&u[1]===l[1]&&u[2]===l[2]);if(f>=0)o.map(u=>(u.a===c&&(u.a=f),u.b===c&&(u.b=f),u));else{const u=a.length;a.push(l),o.map(d=>(d.a===c&&(d.a=u),d.b===c&&(d.b=u),d))}}const s=o.filter(c=>c.a!==c.b);return{points:a,lines:s}}const Nwe=(t,e)=>{const r=t[0],n=t[1];let i=!1;for(let o=0,a=e.length-1;on!=f>n&&r<(l-s)*(n-c)/(f-c)+s&&(i=!i)}return i};function kwe(t,e,r){const n=[];t.contourPoints.forEach(o=>{n.push([r[o][0],r[o][1]])});let i=0;return e.contourPoints.forEach(o=>{Nwe([r[o][0],r[o][1]],n)||i++}),i===0}function Vwe(t,e,r=!0){const n=t.filter(s=>s.type!=="CLOSED_PLANAR"),i=t.filter(s=>s.type==="CLOSED_PLANAR"),o=[];let a=[];return i.forEach((s,c)=>{const l=[];i.forEach((f,u)=>{c!=u&&kwe(s,f,e)&&l.push(u)}),l.length>0?o.push({contour:s,holes:l}):a.push(c)}),r&&(o.forEach(s=>{s.contour.type="CLOSEDPLANAR_XOR",n.push(s.contour),s.holes.forEach(c=>{i[c].type="CLOSEDPLANAR_XOR",n.push(i[c]),a=a.filter(l=>l!==c)})}),a.forEach(s=>{n.push(i[s])})),n}const Fwe={processContourHoles:Vwe};let qI=!1;function Hw(){if(qI)return;qI=!0;const t=()=>new Worker(new URL("/static/dv3d/assets/computeWorker-FOqOvCDJ.js",import.meta.url),{name:"compute",type:"module"}),e=Yc(),n=l1e().computeWorker,i={maxWorkerInstances:1,autoTerminateOnIdle:(n==null?void 0:n.autoTerminateOnIdle)??{enabled:!0,idleTimeThreshold:2e3}};e.registerWorker("compute",t,i)}function Kw(){return sr.getState().segmentations}function Uwe(t){const{segmentationId:e,representation:r,config:n}=t,{type:i,data:o}=r,a=o?{...o}:{};if(!a)throw new Error("Segmentation representation data may not be undefined");i===Lt.Contour&&Bwe(a);const s=Gwe(n==null?void 0:n.segments,i,a);return n==null||delete n.segments,{segmentationId:e,label:(n==null?void 0:n.label)??null,cachedStats:(n==null?void 0:n.cachedStats)??{},segments:s,representationData:{[i]:{...a}}}}function Bwe(t){t.geometryIds=t.geometryIds??[],t.annotationUIDsMap=t.annotationUIDsMap??new Map}function Gwe(t,e,r){const n={};return t?Object.entries(t).forEach(([i,o])=>{const{label:a,locked:s,cachedStats:c,active:l,...f}=o,u={segmentIndex:Number(i),label:a??`Segment ${i}`,locked:s??!1,cachedStats:c??{},active:l??!1,...f};n[i]=u}):e===Lt.Surface?Wwe(n,r):n[1]=zwe(),n}function Wwe(t,e){const{geometryIds:r}=e;r==null||r.forEach(n=>{const i=Fe.getGeometry(n);if(i!=null&&i.data){const{segmentIndex:o}=i.data;t[o]={segmentIndex:o}}})}function zwe(){return{segmentIndex:1,label:"Segment 1",locked:!1,cachedStats:{},active:!0}}function uG(t,e){const r=sr;t.forEach(n=>{const i=Uwe(n);r.addSegmentation(i),e||ns(i.segmentationId)})}function tg(t,e,r){return dG(t,e,r)}function fG(t,e,r){return dG(t,e,r)}function dG(t,e,r){const{segmentationId:n,type:i}=e;return $we(t,n,i,r),sr.removeSegmentationRepresentations(t,{segmentationId:n,type:i})}function hG(){sr.getAllViewportSegmentationRepresentations().forEach(({viewportId:e,representations:r})=>{r.forEach(({segmentationId:n,type:i})=>{tg(e,{segmentationId:n,type:i})})}),sr.resetState()}function gG(t,e,r){tg(t,{segmentationId:e,type:Lt.Labelmap},r)}function pG(t,e,r){tg(t,{segmentationId:e,type:Lt.Contour},r)}function mG(t,e,r){tg(t,{segmentationId:e,type:Lt.Surface},r)}function $we(t,e,r,n){Ma(t,{segmentationId:e,type:r}).forEach(a=>{a.type===Lt.Labelmap?ZU.removeRepresentation(t,a.segmentationId,n):a.type===Lt.Contour?YU.removeRepresentation(t,a.segmentationId,n):a.type===Lt.Surface&&aU.removeRepresentation(t,a.segmentationId,n)});const{viewport:o}=qn(t)||{};o&&o.render()}function y8(t){const e=sr;e.getAllViewportSegmentationRepresentations().filter(({representations:n})=>n.some(i=>i.segmentationId===t)).map(({viewportId:n})=>n).forEach(n=>{fG(n,{segmentationId:t})}),e.removeSegmentation(t),RE(t)}function vG(){const t=sr;t.getState().segmentations.map(n=>n.segmentationId).forEach(n=>{y8(n)}),t.resetState()}function jwe(t){sr.removeColorLUT(t)}function yG(t,e){return wG(t).map(o=>(e&&o.type===e,zn(o.segmentationId))).filter(o=>o!==void 0)}function wG(t){return sr.getState().viewportSegRepresentations[t]}function Hwe(t,e){return sr.getStackSegmentationImageIdsForViewport(t,e)}function Kwe(){sr.resetState()}const qwe=Object.freeze(Object.defineProperty({__proto__:null,addColorLUT:Tp,addSegmentations:uG,destroy:Kwe,getColorLUT:ym,getCurrentLabelmapImageIdForViewport:mf,getCurrentLabelmapImageIdsForViewport:Wl,getNextColorLUTIndex:uB,getSegmentation:zn,getSegmentationRepresentation:LE,getSegmentationRepresentations:Ma,getSegmentationRepresentationsBySegmentationId:rU,getSegmentations:Kw,getStackSegmentationImageIdsForViewport:Hwe,getViewportIdsWithSegmentation:Zh,getViewportSegmentationRepresentations:wG,getViewportSegmentations:yG,removeAllSegmentationRepresentations:hG,removeAllSegmentations:vG,removeColorLUT:jwe,removeContourRepresentation:pG,removeLabelmapRepresentation:gG,removeSegmentation:y8,removeSegmentationRepresentation:tg,removeSurfaceRepresentation:mG,updateLabelmapSegmentationImageReferences:yB},Symbol.toStringTag,{value:"Module"}));function xG(t){if("volumeId"in t){if(t=t,!Fe.getVolume(t.volumeId))throw new Error(`volumeId of ${t.volumeId} not found in cache, you should load and cache volume before adding segmentation`)}else if("imageIds"in t){if(t=t,!t.imageIds)throw new Error("The segmentationInput.representationData.imageIds is undefined, please provide a valid representationData.imageIds for stack data")}else throw new Error("The segmentationInput.representationData is undefined, please provide a valid representationData")}function Xwe(t){if(!t.representation.data)throw new Error("The segmentationInput.representationData.data is undefined, please provide a valid representationData.data");const e=t.representation.data;xG(e)}function Ywe(t){xG(t)}const Jwe=Object.freeze(Object.defineProperty({__proto__:null,validate:Ywe,validatePublic:Xwe},Symbol.toStringTag,{value:"Module"}));function CG(t){const e=Fe.getVolume(t);if(!e)return null;const r=e.referencedVolumeId;let n;if(r)n=Fe.getVolume(r);else{const i=e.imageIds,a=Fe.getImage(i[0]).referencedImageId,s=Fe.getVolumeContainingImageId(a);n=s==null?void 0:s.volume}return n}function Zwe({operationData:t}){const{volumeId:e}=t;if(!e){const c=new CustomEvent(Ze.ERROR_EVENT,{detail:{type:"Segmentation",message:"No volume id found for the segmentation"},cancelable:!0});return Je.dispatchEvent(c),null}const r=Fe.getVolume(e),n=CG(e);if(!r||!n)return null;const{imageData:i}=r,{voxelManager:o}=r,{voxelManager:a,imageData:s}=n;return{segmentationImageData:i,segmentationVoxelManager:o,segmentationScalarData:null,imageScalarData:null,imageVoxelManager:a,imageData:s}}function Qwe({operationData:t,viewport:e,strategy:r}){var f;const{segmentationId:n}=t;let i,o,a,s,c,l;if(r.ensureSegmentationVolumeFor3DManipulation)r.ensureSegmentationVolumeFor3DManipulation({operationData:t,viewport:e}),o=t.segmentationVoxelManager,i=t.segmentationImageData,a=null;else{const u=mf(e.id,n);if(!u)return null;const d=Pw(e.id,n);if(!d)return null;const h=Fe.getImage(u);i=d.actor.getMapper().getInputData(),o=h.voxelManager;const g=t.imageId,p=Fe.getImage(g);if(!p)return null;a=(f=p.getPixelData)==null?void 0:f.call(p)}if(r.ensureImageVolumeFor3DManipulation)r.ensureImageVolumeFor3DManipulation({operationData:t,viewport:e}),c=t.imageVoxelManager,s=t.imageScalarData,l=t.imageData;else{const u=e.getCurrentImageId();if(!u)return null;const d=Fe.getImage(u);l=d?null:e.getImageData(),s=(d==null?void 0:d.getPixelData())||l.getScalarData(),c=d==null?void 0:d.voxelManager}return{segmentationImageData:i,segmentationScalarData:a,imageScalarData:s,segmentationVoxelManager:o,imageVoxelManager:c,imageData:l}}function w8({operationData:t,viewport:e,strategy:r}){return t?"volumeId"in t&&t.volumeId!=null||"referencedVolumeId"in t&&t.referencedVolumeId!=null?Zwe({operationData:t}):Qwe({operationData:t,viewport:e,strategy:r}):null}function ng(t){const{representationData:e}=zn(t);let{volumeId:r}=e.Labelmap,n;if(r&&(n=Fe.getVolume(r),n))return n;const{imageIds:i}=e.Labelmap;if(r=Fe.generateVolumeId(i),!(!i||i.length===1||!gf(i)))return n=am(r,i),n}const SG={[It.EnsureSegmentationVolumeFor3DManipulation]:t=>{const{operationData:e,viewport:r}=t,{segmentationId:n,imageIds:i}=e,o=r?r.getImageIds():i.map(c=>Fe.getImage(c).referencedImageId);if(!gf(o))throw new Error("Volume is not reconstructable for sphere manipulation");const s=ng(n);s&&(e.segmentationVoxelManager=s.voxelManager,e.segmentationImageData=s.imageData)}};function qw(t){if(!t||t.length<=1||!gf(t))return;const r=Fe.generateVolumeId(t);let n=Fe.getVolume(r);return n||(n=am(r,t),n)}const TG={[It.EnsureImageVolumeFor3DManipulation]:t=>{const{operationData:e,viewport:r}=t;let n;if(r){if(n=r.getImageIds(),!gf(n))throw new Error("Volume is not reconstructable for sphere manipulation")}else n=zn(e.segmentationId).representationData.Labelmap.imageIds.map(s=>Fe.getImage(s).referencedImageId);const i=qw(n);if(!i)throw new Error("Failed to create or get image volume");e.imageVoxelManager=i.voxelManager,e.imageData=i.imageData}},Kc=(t,e)=>{it(Je,Ze.WEB_WORKER_PROGRESS,{progress:e,type:t})},_G=(t,e)=>{const r=zn(t),{representationData:n}=r,{Labelmap:i}=n;if(!i)return console.debug("No labelmap found for segmentation",t),null;const o=i.volumeId,a=i.imageIds,s={segmentationId:t,volumeId:o,imageIds:a};let c=!1;if(a){const f=a.map(u=>Fe.getImage(u).referencedImageId);c=gf(f)}let l=e;return l?Array.isArray(l)||(l=[l,255]):l=[Ra(t)],{operationData:s,segVolumeId:o,segImageIds:a,reconstructableVolume:c,indices:l}},EG=t=>w8({operationData:t,strategy:{ensureSegmentationVolumeFor3DManipulation:SG.ensureSegmentationVolumeFor3DManipulation,ensureImageVolumeFor3DManipulation:TG.ensureImageVolumeFor3DManipulation}}),bG=t=>{const e=[],r=[];for(const n of t){const i=Fe.getImage(n),o=i.getPixelData(),{origin:a,direction:s,spacing:c,dimensions:l}=pw(i);e.push({scalarData:o,dimensions:l,spacing:c,origin:a,direction:s});const f=i.referencedImageId;if(f){const u=Fe.getImage(f);if(!u)continue;const d=u.getPixelData(),h=u.voxelManager,g=[u.rowPixelSpacing,u.columnPixelSpacing];r.push({scalarData:d,dimensions:h?h.dimensions:[u.columns,u.rows,1],spacing:g})}}return{segmentationInfo:e,imageInfo:r}},exe=(t,e)=>{var a;let r;if(t){const c=Fe.getVolume(t).imageIds,l=Fe.getImage(c[0]);l&&(r=l.referencedImageId)}else e!=null&&e.length&&(r=Fe.getImage(e[0]).referencedImageId);const n=Fe.getImage(r),i=vt("scalingModule",r),o={isPreScaled:!!((a=n==null?void 0:n.preScale)!=null&&a.scaled),isSuvScaled:typeof(i==null?void 0:i.suvbw)=="number"};return{refImageId:r,modalityUnitOptions:o}},{Labelmap:txe}=Lt;async function DG({segmentations:t}){Hw(),Kc(Ja.GENERATE_CONTOUR_SETS,0);const{representationData:e,segments:r=[0,1],segmentationId:n}=t;let{volumeId:i}=e[txe];if(!i){const g=ng(n);g&&(i=g.volumeId)}const o=Fe.getVolume(i);if(!o){console.warn(`No volume found for ${i}`);return}const c={scalarData:o.voxelManager.getCompleteScalarDataArray(),dimensions:o.dimensions,spacing:o.imageData.getSpacing(),origin:o.imageData.getOrigin(),direction:o.imageData.getDirection()},l=Array.isArray(r)?r.filter(g=>g!==null).map(g=>g.segmentIndex||g):Object.values(r).filter(g=>g!==null).map(g=>g.segmentIndex||g),f=await Yc().executeTask("compute","generateContourSetsFromLabelmapVolume",{segmentation:c,indices:l,mode:"individual"}),u=o.imageIds.map(g=>{var v;const p=(v=Fe.getImage(g))==null?void 0:v.referencedImageId;return p?Fe.getImage(p):void 0}),d=u.map(g=>pw(g)),h=f.map(g=>{const p=r[g.segment.segmentIndex]||{};if(!g.sliceContours.length)return null;const v=g.sliceContours[0].polyData.points[0];let y;if(v){const m=d.findIndex(w=>{const{scanAxisNormal:x,origin:C}=w,S=Ac(x,C);return mk(v,S)});m!==-1&&(y=u[m].imageId)}return{label:p.label,color:p.color,metadata:{FrameOfReferenceUID:o.metadata.FrameOfReferenceUID,referencedImageId:y},sliceContours:g.sliceContours.map(m=>({contours:m.contours,polyData:m.polyData,FrameNumber:m.sliceIndex+1,sliceIndex:m.sliceIndex,FrameOfReferenceUID:o.metadata.FrameOfReferenceUID,referencedImageId:y}))}}).filter(g=>g!==null);return Kc(Ja.GENERATE_CONTOUR_SETS,100),h}class IG{constructor(){}static getContourSequence(e,r){const{data:n}=e,{projectionPoints:i,projectionPointsImageIds:o}=n.cachedStats;return i.map((a,s)=>{const c=nxe(a),l=rxe(o[s],r);return{NumberOfContourPoints:c.length/3,ContourImageSequence:l,ContourGeometricType:"CLOSED_PLANAR",ContourData:c}})}}IG.toolName="RectangleROIStartEndThreshold";function nxe(t){return[...t[0],...t[1],...t[3],...t[2]].flat().map(i=>i.toFixed(2))}function rxe(t,e){const r=e.get("sopCommonModule",t);return{ReferencedSOPClassUID:r.sopClassUID,ReferencedSOPInstanceUID:r.sopInstanceUID}}function ixe(t){if(!(t!=null&&t.data))throw new Error("Tool data is empty");if(!t.metadata||t.metadata.referencedImageId)throw new Error("Tool data is not associated with any imageId")}const Rp=class Rp{constructor(){}static convert(e,r,n){ixe(e);const{toolName:i}=e.metadata,o=Rp.TOOL_NAMES[i];if(!o)throw new Error(`Unknown tool type: ${i}, cannot convert to RTSSReport`);const a=o.getContourSequence(e,n),s=[Math.floor(Math.random()*255),Math.floor(Math.random()*255),Math.floor(Math.random()*255)];return{ReferencedROINumber:r+1,ROIDisplayColor:s,ContourSequence:a}}static register(e){Rp.TOOL_NAMES[e.toolName]=e}};Rp.TOOL_NAMES={};let m5=Rp;m5.register(IG);function oxe(t,e){Vc.acceptAutoGenerated(t,e)}const{isEqual:axe}=Vn;function qS(t,e){const{polyline:r}=t.data.contour,{points:n}=t.data.handles,{length:i}=n;if(e===i)return r.length;if(e<0&&(e=(e+i)%i),e===0)return 0;const o=n[e],a=r.findIndex(c=>axe(o,c));if(a!==-1)return a;let s=1/0;return r.reduce((c,l,f)=>{const u=NR(l,o);return u{const S=({value:O})=>{h=h+1,O>=g.lower&&O<=g.upper&&(d=d+1)},{imageData:T,dimensions:_,lower:E,upper:b}=w,D=ME(T,_,x,C);h=0,d=0,g={lower:E,upper:b};let I=!1;const{voxelManager:P}=T.get("voxelManager");return P.forEach(S,{imageData:T,boundsIJK:D}),s===0?I=d>0:s==1&&(I=d===h),I},v=(w,x)=>{const{imageData:C,lower:S,upper:T}=w,_=C.get("voxelManager").voxelManager,E=_.toIndex(x),b=_.getAtIndex(E);return!(b<=S||b>=T)},y=({index:w,pointIJK:x,pointLPS:C})=>{let S=u.length>0;for(let T=0;T{const i=n.detail,{currentPoints:o,element:a}=i,s=o.world,c=Se(a),{viewport:l}=c;this.isDrawing=!0;const f=this.constructor.createAnnotationForViewport(l,{data:{handles:{points:[[...s],[...s],[...s],[...s]],textBox:{hasMoved:!1,worldPosition:[0,0,0],worldBoundingBox:{topLeft:[0,0,0],topRight:[0,0,0],bottomLeft:[0,0,0],bottomRight:[0,0,0]}}},cachedStats:{}}});ln(f,a);const u=Ot(a,this.getToolName());return this.editData={annotation:f,viewportIdsToRender:u,handleIndex:3,movingTextBox:!1,newAnnotation:!0,hasMoved:!1},this._activateDraw(a),Ft(a),n.preventDefault(),Ne(u),f},this.isPointNearTool=(n,i,o,a)=>{const s=Se(n),{viewport:c}=s,{data:l}=i,{points:f}=l.handles,u=c.worldToCanvas(f[0]),d=c.worldToCanvas(f[3]),h=this._getRectangleImageCoordinates([u,d]),g=[o[0],o[1]],{left:p,top:v,width:y,height:m}=h;return YE([p,v,y,m],g)<=a},this.toolSelectedCallback=(n,i)=>{const o=n.detail,{element:a}=o;i.highlighted=!0;const s=Ot(a,this.getToolName());this.editData={annotation:i,viewportIdsToRender:s,movingTextBox:!1},this._activateModify(a),Ft(a);const c=Se(a),{renderingEngine:l}=c;Ne(s),n.preventDefault()},this.handleSelectedCallback=(n,i,o)=>{const a=n.detail,{element:s}=a,{data:c}=i;i.highlighted=!0;let l=!1,f;o.worldPosition?l=!0:f=c.handles.points.findIndex(g=>g===o);const u=Ot(s,this.getToolName());this.editData={annotation:i,viewportIdsToRender:u,handleIndex:f,movingTextBox:l},this._activateModify(s),Ft(s);const d=Se(s),{renderingEngine:h}=d;Ne(u),n.preventDefault()},this._endCallback=n=>{const i=n.detail,{element:o}=i,{annotation:a,viewportIdsToRender:s,newAnnotation:c,hasMoved:l}=this.editData,{data:f}=a;c&&!l||(f.handles.activeHandleIndex=null,this._deactivateModify(o),this._deactivateDraw(o),Xt(o),this.doneEditMemo(),this.editData=null,this.isDrawing=!1,this.isHandleOutsideImage&&this.configuration.preventHandleOutsideImage&&yn(a.annotationUID),Ne(s),c&&jn(a))},this._dragCallback=n=>{this.isDrawing=!0;const i=n.detail,{element:o}=i,{annotation:a,viewportIdsToRender:s,handleIndex:c,movingTextBox:l,newAnnotation:f}=this.editData;this.createMemo(o,a,{newAnnotation:f});const{data:u}=a;if(l){const{deltaPoints:d}=i,h=d.world,{textBox:g}=u.handles,{worldPosition:p}=g;p[0]+=h[0],p[1]+=h[1],p[2]+=h[2],g.hasMoved=!0}else if(c===void 0){const{deltaPoints:d}=i,h=d.world,{points:g}=u.handles;g.forEach(p=>{p[0]+=h[0],p[1]+=h[1],p[2]+=h[2]}),a.invalidated=!0}else{const{currentPoints:d}=i,h=Se(o),{worldToCanvas:g,canvasToWorld:p}=h.viewport,v=d.world,{points:y}=u.handles;y[c]=[...v];let m,w,x,C,S,T,_,E;switch(c){case 0:case 3:m=g(y[0]),C=g(y[3]),w=[C[0],m[1]],x=[m[0],C[1]],T=p(w),_=p(x),y[1]=T,y[2]=_;break;case 1:case 2:w=g(y[1]),x=g(y[2]),m=[x[0],w[1]],C=[w[0],x[1]],S=p(m),E=p(C),y[0]=S,y[3]=E;break}a.invalidated=!0}this.editData.hasMoved=!0,Se(o),Ne(s),a.invalidated&&cn(a,o,Zt.HandlesUpdated)},this.cancel=n=>{if(this.isDrawing){this.isDrawing=!1,this._deactivateDraw(n),this._deactivateModify(n),Xt(n);const{annotation:i,viewportIdsToRender:o,newAnnotation:a}=this.editData,{data:s}=i;return i.highlighted=!1,s.handles.activeHandleIndex=null,Ne(o),a&&jn(i),this.editData=null,i.annotationUID}},this._activateDraw=n=>{He.isInteractingWithTool=!0,n.addEventListener(k.MOUSE_UP,this._endCallback),n.addEventListener(k.MOUSE_DRAG,this._dragCallback),n.addEventListener(k.MOUSE_MOVE,this._dragCallback),n.addEventListener(k.MOUSE_CLICK,this._endCallback),n.addEventListener(k.TOUCH_END,this._endCallback),n.addEventListener(k.TOUCH_DRAG,this._dragCallback),n.addEventListener(k.TOUCH_TAP,this._endCallback)},this._deactivateDraw=n=>{He.isInteractingWithTool=!1,n.removeEventListener(k.MOUSE_UP,this._endCallback),n.removeEventListener(k.MOUSE_DRAG,this._dragCallback),n.removeEventListener(k.MOUSE_MOVE,this._dragCallback),n.removeEventListener(k.MOUSE_CLICK,this._endCallback),n.removeEventListener(k.TOUCH_END,this._endCallback),n.removeEventListener(k.TOUCH_DRAG,this._dragCallback),n.removeEventListener(k.TOUCH_TAP,this._endCallback)},this._activateModify=n=>{He.isInteractingWithTool=!0,n.addEventListener(k.MOUSE_UP,this._endCallback),n.addEventListener(k.MOUSE_DRAG,this._dragCallback),n.addEventListener(k.MOUSE_CLICK,this._endCallback),n.addEventListener(k.TOUCH_END,this._endCallback),n.addEventListener(k.TOUCH_DRAG,this._dragCallback),n.addEventListener(k.TOUCH_TAP,this._endCallback)},this._deactivateModify=n=>{He.isInteractingWithTool=!1,n.removeEventListener(k.MOUSE_UP,this._endCallback),n.removeEventListener(k.MOUSE_DRAG,this._dragCallback),n.removeEventListener(k.MOUSE_CLICK,this._endCallback),n.removeEventListener(k.TOUCH_END,this._endCallback),n.removeEventListener(k.TOUCH_DRAG,this._dragCallback),n.removeEventListener(k.TOUCH_TAP,this._endCallback)},this.renderAnnotation=(n,i)=>{let o=!1;const{viewport:a}=n,{element:s}=a;let c=pn(this.getToolName(),s);if(!(c!=null&&c.length)||(c=this.filterInteractableAnnotationsForElement(s,c),!(c!=null&&c.length)))return o;const l=this.getTargetId(a),f=a.getRenderingEngine(),u={toolGroupId:this.toolGroupId,toolName:this.getToolName(),viewportId:n.viewport.id};for(let d=0;da.worldToCanvas(F));u.annotationUID=g;const{color:w,lineWidth:x,lineDash:C}=this.getAnnotationStyle({annotation:h,styleSpecifier:u}),{viewPlaneNormal:S,viewUp:T}=a.getCamera();if(!p.cachedStats[l]||p.cachedStats[l].areaUnit==null)p.cachedStats[l]={Modality:null,area:null,max:null,mean:null,stdDev:null,areaUnit:null},this._calculateCachedStats(h,S,T,f,n);else if(h.invalidated&&(this._throttledCalculateCachedStats(h,S,T,f,n),a instanceof vr)){const{referencedImageId:F}=h.metadata;for(const j in p.cachedStats)j.startsWith("imageId")&&f.getStackViewports().find(fe=>{const le=Hr(F),de=fe.hasImageURI(le),Ie=Hr(fe.getCurrentImageId());return de&&Ie!==le})&&delete p.cachedStats[j]}if(!a.getRenderingEngine())return console.warn("Rendering Engine has been destroyed"),o;let _;if(!ii(g))continue;!mi(g)&&!this.editData&&y!==null&&(_=[m[y]]),_&&ur(i,g,"0",_,{color:w});const E=`${g}-rect`;ZE(i,g,"0",m,{color:w,lineDash:C,lineWidth:x},E),o=!0;const D=this.getLinkedTextBoxStyle(u,h);if(!D.visibility){p.handles.textBox={hasMoved:!1,worldPosition:[0,0,0],worldBoundingBox:{topLeft:[0,0,0],topRight:[0,0,0],bottomLeft:[0,0,0],bottomRight:[0,0,0]}};continue}const I=this.configuration.getTextLines(p,l);if(!I||I.length===0)continue;if(!p.handles.textBox.hasMoved){const F=Aa(m);p.handles.textBox.worldPosition=a.canvasToWorld(F)}const P=a.worldToCanvas(p.handles.textBox.worldPosition),A=uo(i,g,"1",I,P,m,{},D),{x:V,y:G,width:R,height:N}=A;p.handles.textBox.worldBoundingBox={topLeft:a.canvasToWorld([V,G]),topRight:a.canvasToWorld([V+R,G]),bottomLeft:a.canvasToWorld([V,G+N]),bottomRight:a.canvasToWorld([V+R,G+N])}}return o},this._getRectangleImageCoordinates=n=>{const[i,o]=n;return{left:Math.min(i[0],o[0]),top:Math.min(i[1],o[1]),width:Math.abs(i[0]-o[0]),height:Math.abs(i[1]-o[1])}},this._calculateCachedStats=(n,i,o,a,s)=>{var v,y,m,w;if(!this.configuration.calculateStats)return;const{data:c}=n,{viewport:l}=s,{element:f}=l,u=c.handles.points[0],d=c.handles.points[3],{cachedStats:h}=c,g=Object.keys(h);for(let x=0;xxr(n,o)&&xr(i,o),this._throttledCalculateCachedStats=qo(this._calculateCachedStats,100,{trailing:!0})}};M0.toolName="RectangleROI",M0.hydrate=(e,r,n)=>{const i=qn(e);if(!i)return;const{FrameOfReferenceUID:o,referencedImageId:a,viewPlaneNormal:s,instance:c,viewport:l}=M0.hydrateBase(M0,i,r,n),{toolInstance:f,...u}=n||{},d={annotationUID:(n==null?void 0:n.annotationUID)||kn(),data:{handles:{points:r,activeHandleIndex:null},label:"",cachedStats:{}},highlighted:!1,autoGenerated:!1,invalidated:!1,isLocked:!1,isVisible:!0,metadata:{toolName:c.getToolName(),viewPlaneNormal:s,FrameOfReferenceUID:o,referencedImageId:a,...u}};ln(d,l.element),Ne([l.id])};let $l=M0;function cxe(t,e){const r=t.cachedStats[e],{area:n,mean:i,max:o,stdDev:a,areaUnit:s,modalityUnit:c,min:l}=r;if(i==null)return;const f=[];return Gr(n)&&f.push(`Area: ${dn(n)} ${s}`),Gr(i)&&f.push(`Mean: ${dn(i)} ${c}`),Gr(o)&&f.push(`Max: ${dn(o)} ${c}`),Gr(l)&&f.push(`Max: ${dn(l)} ${c}`),Gr(a)&&f.push(`Std Dev: ${dn(a)} ${c}`),f}const{transformWorldToIndex:Pg}=Vn;class x8 extends $l{constructor(e={},r={configuration:{storePointData:!1,numSlicesToPropagate:10,calculatePointsInsideVolume:!0,getTextLines:lxe,statsCalculator:jc,showTextBox:!1,throttleTimeout:100}}){super(e,r),this.addNewAnnotation=n=>{const i=n.detail,{currentPoints:o,element:a}=i,s=o.world,c=Se(a),{viewport:l,renderingEngine:f}=c;this.isDrawing=!0;const u=l.getCamera(),{viewPlaneNormal:d,viewUp:h}=u;let g,p,v;if(l instanceof mr)throw new Error("Stack Viewport Not implemented");{const T=this.getTargetId(l);v=Jc(T),p=Fe.getVolume(v),g=Vl(p,s,d)}const y=hf(p,d),m=this._getStartCoordinate(s,d),w=this._getEndCoordinate(s,y,d),x=l.getFrameOfReferenceUID(),C={highlighted:!0,invalidated:!0,metadata:{viewPlaneNormal:[...d],enabledElement:c,viewUp:[...h],FrameOfReferenceUID:x,referencedImageId:g,toolName:this.getToolName(),volumeId:v,spacingInNormal:y},data:{label:"",startCoordinate:m,endCoordinate:w,cachedStats:{pointsInVolume:[],projectionPoints:[],projectionPointsImageIds:[g],statistics:[]},handles:{textBox:{hasMoved:!1,worldPosition:[0,0,0],worldBoundingBox:{topLeft:[0,0,0],topRight:[0,0,0],bottomLeft:[0,0,0],bottomRight:[0,0,0]}},points:[[...s],[...s],[...s],[...s]],activeHandleIndex:null},labelmapUID:null}};this._computeProjectionPoints(C,p),ln(C,a);const S=Ot(a,this.getToolName());return this.editData={annotation:C,viewportIdsToRender:S,handleIndex:3,newAnnotation:!0,hasMoved:!1},this._activateDraw(a),Ft(a),n.preventDefault(),Ne(S),C},this._endCallback=n=>{const i=n.detail,{element:o}=i,{annotation:a,viewportIdsToRender:s,newAnnotation:c,hasMoved:l}=this.editData,{data:f}=a;if(c&&!l)return;f.handles.activeHandleIndex=null,this._deactivateModify(o),this._deactivateDraw(o),Xt(o);const u=Se(o);this.editData=null,this.isDrawing=!1,this.isHandleOutsideImage&&this.configuration.preventHandleOutsideImage&&yn(a.annotationUID);const d=this.getTargetId(u.viewport),h=Fe.getVolume(d.split(/volumeId:|\?/)[1]);this._computePointsInsideVolume(a,d,h,u),Ne(s),c?jn(a):cn(a,o)},this.renderAnnotation=(n,i)=>{let o=!1;const{viewport:a}=n;let s=pn(this.getToolName(),a.element);if(!(s!=null&&s.length))return o;s=Gw(s,a.getCamera());const c={toolGroupId:this.toolGroupId,toolName:this.getToolName(),viewportId:n.viewport.id};for(let l=0;la.worldToCanvas(R));c.annotationUID=u;const w=this.getStyle("lineWidth",c,f),x=this.getStyle("lineDash",c,f),C=this.getStyle("color",c,f),S=a.getCamera().focalPoint,T=a.getCamera().viewPlaneNormal;let _=g,E=p;if(Array.isArray(g)){_=this._getCoordinateForViewplaneNormal(_,T);const R=this._getIndexOfCoordinatesForViewplaneNormal(T);d.handles.points.forEach(N=>{N[R]=_}),d.startCoordinate=_}Array.isArray(p)&&(E=this._getCoordinateForViewplaneNormal(E,T),d.endCoordinate=E,d.endCoordinate=E);const b=Lu(_),D=Lu(E),I=this._getCoordinateForViewplaneNormal(S,T),P=Lu(I);if(PMath.max(b,D))continue;f.invalidated&&this._throttledCalculateCachedStats(f,n);let O=!1;if((P===b||P===D)&&(O=!0),!a.getRenderingEngine())return console.warn("Rendering Engine has been destroyed"),o;let A;if(!ii(u))continue;!mi(u)&&!this.editData&&y!==null&&O&&(A=[m[y]]),A&&ur(i,u,"0",A,{color:C});let V=x;if(O||(V=2),Tm(i,u,"0",m[0],m[3],{color:C,lineDash:V,lineWidth:w}),o=!0,this.configuration.showTextBox){const R=this.getLinkedTextBoxStyle(c,f);if(!R.visibility){d.handles.textBox={hasMoved:!1,worldPosition:[0,0,0],worldBoundingBox:{topLeft:[0,0,0],topRight:[0,0,0],bottomLeft:[0,0,0],bottomRight:[0,0,0]}};continue}const N=this.configuration.getTextLines(d,{metadata:h});if(!N||N.length===0)continue;if(!d.handles.textBox.hasMoved){const Ie=Aa(m);d.handles.textBox.worldPosition=a.canvasToWorld(Ie)}const F=a.worldToCanvas(d.handles.textBox.worldPosition),X=uo(i,u,"1",N,F,m,{},R),{x:te,y:fe,width:le,height:de}=X;d.handles.textBox.worldBoundingBox={topLeft:a.canvasToWorld([te,fe]),topRight:a.canvasToWorld([te+le,fe]),bottomLeft:a.canvasToWorld([te,fe+de]),bottomRight:a.canvasToWorld([te+le,fe+de])}}}return o},this.configuration.calculatePointsInsideVolume?this._throttledCalculateCachedStats=qo(this._calculateCachedStatsTool,this.configuration.throttleTimeout,{trailing:!0}):this._throttledCalculateCachedStats=qh(this._calculateCachedStatsTool,this.configuration.throttleTimeout)}_computeProjectionPoints(e,r){const{data:n,metadata:i}=e,{viewPlaneNormal:o,spacingInNormal:a}=i,{imageData:s}=r,{startCoordinate:c,endCoordinate:l}=n,{points:f}=n.handles,u=Pg(s,f[0]),d=Pg(s,f[0]),h=Ge();s.indexToWorldVec3(u,h);const g=Ge();s.indexToWorldVec3(d,g),this._getIndexOfCoordinatesForViewplaneNormal(o)==2?(h[2]=c,g[2]=l):this._getIndexOfCoordinatesForViewplaneNormal(o)==0?(h[0]=c,g[0]=l):this._getIndexOfCoordinatesForViewplaneNormal(o)==1&&(h[1]=c,g[1]=l);const p=no(h,g),v=[];for(let y=0;y{const w=Ge();return An(w,m,o,y),Array.from(w)}));n.cachedStats.projectionPoints=v}_computePointsInsideVolume(e,r,n,i){var S,T,_;const{data:o,metadata:a}=e,{viewPlaneNormal:s,viewUp:c}=a,{viewport:l}=i,f=o.cachedStats.projectionPoints,u=[[]],d=this.getTargetImageData(r),h=o.handles.points[0],g=o.handles.points[3],{worldWidth:p,worldHeight:v}=Bw(s,c,h,g),y=La(d,o.habdles),m=Math.abs(p*v)/(y.scale*y.scale),w={isPreScaled:ql(l,r),isSuvScaled:this.isSuvScaled(l,r,e.metadata.referencedImageId)},x=Xl(a.Modality,e.metadata.referencedImageId,w);for(let E=0;E{const i=n.detail,{currentPoints:o,element:a}=i,s=o.world,c=Se(a),{viewport:l,renderingEngine:f}=c;this.isDrawing=!0;const u=l.getCamera(),{viewPlaneNormal:d,viewUp:h}=u,g=this.getTargetId(l);let p,v;if(l instanceof mr)p=g.split("imageId:")[1];else{v=Jc(g);const x=Fe.getVolume(v);p=Vl(x,s,d)}const y=l.getFrameOfReferenceUID(),m={highlighted:!0,invalidated:!0,metadata:{viewPlaneNormal:[...d],enabledElement:c,viewUp:[...h],FrameOfReferenceUID:y,referencedImageId:p,toolName:this.getToolName(),volumeId:v},data:{label:"",handles:{textBox:{hasMoved:!1,worldPosition:null,worldBoundingBox:null},points:[[...s],[...s],[...s],[...s]],activeHandleIndex:null},segmentationId:null}};ln(m,a);const w=Ot(a,this.getToolName());return this.editData={annotation:m,viewportIdsToRender:w,handleIndex:3,newAnnotation:!0,hasMoved:!1},this._activateDraw(a),Ft(a),n.preventDefault(),Ne(w),m},this.renderAnnotation=(n,i)=>{let o=!1;const{viewport:a}=n,{element:s}=a;let c=pn(this.getToolName(),s);if(!(c!=null&&c.length)||(c=this.filterInteractableAnnotationsForElement(s,c),!(c!=null&&c.length)))return o;const l={toolGroupId:this.toolGroupId,toolName:this.getToolName(),viewportId:n.viewport.id};for(let f=0;fa.worldToCanvas(S));l.annotationUID=d;const y=this.getStyle("lineWidth",l,u),m=this.getStyle("lineDash",l,u),w=this.getStyle("color",l,u);if(!a.getRenderingEngine())return console.warn("Rendering Engine has been destroyed"),o;cn(u,s);let x;if(!ii(d))continue;!mi(d)&&!this.editData&&p!==null&&(x=[v[p]]),x&&ur(i,d,"0",x,{color:w}),Tm(i,d,"0",v[0],v[3],{color:w,lineDash:m,lineWidth:y}),o=!0}return o}}}C8.toolName="RectangleROIThreshold";function MG(t,e,r={}){const n=[];return t.forEach(o=>{var h,g;const{data:a}=o,{points:s}=a.handles,{imageData:c,dimensions:l}=e;let f=s;if((h=a.cachedStats)!=null&&h.projectionPoints){const{projectionPoints:p}=a.cachedStats;f=[].concat(...p)}const u=f.map(p=>ei(c,p));let d=ef(u,l);r.numSlicesToProject&&!((g=a.cachedStats)!=null&&g.projectionPoints)&&(d=oG(d,r.numSlicesToProject)),n.push(d)}),n.length===1?n[0]:n.reduce((o,a)=>({iMin:Math.min(o.iMin,a.iMin),jMin:Math.min(o.jMin,a.jMin),kMin:Math.min(o.kMin,a.kMin),iMax:Math.max(o.iMax,a.iMax),jMax:Math.max(o.jMax,a.jMax),kMax:Math.max(o.kMax,a.kMax)}),{iMin:1/0,jMin:1/0,kMin:1/0,iMax:-1/0,jMax:-1/0,kMax:-1/0})}function uxe(t,e,r,n){const i=t.map(s=>Zr.getAnnotation(s));fxe(i);let o;for(let s=0;s{if(!Yt(f,t[0].dimensions)||!Yt(l,t[0].direction)||!Yt(d,t[0].spacing)||!Yt(u,t[0].origin))throw new Error("labelmaps must have the same size and shape")});const n=t[0],i=n.voxelManager.getConstructor(),o=new i(n.voxelManager.getScalarDataLength());t.forEach(l=>{const f=l.voxelManager,u=f.getScalarDataLength();for(let d=0;d0;)g(f.pop());return{flooded:u};function g(_){const E=_.currentArgs,b=_.previousArgs;p(E)||(v(E),y(E)?(m(E),x(E)):w(b))}function p(_){const[E,b,D=0]=_,I=E+32768+65536*(b+32768+65536*(D+32768));return d.has(I)}function v(_){const[E,b,D=0]=_,I=E+32768+65536*(b+32768+65536*(D+32768));d.add(I)}function y(_){const E=C(_);return o?o(E,c):E===c}function m(_){u.push(_),n&&n(..._)}function w(_){const[E,b,D=0]=_,I=E+32768+65536*(b+32768+65536*(D+32768));h==null||h.set(I,_),i&&i(..._)}function x(_){for(let E=0;E{const{segmentIndex:e,previewSegmentIndex:r,segmentationVoxelManager:n,centerIJK:i,viewPlaneNormal:o,segmentationImageData:a,configuration:s}=t;if(!(s!=null&&s.useCenterSegmentIndex))return;let c=!1,l=!1;const f=[...n.getBoundsIJK()];Math.abs(o[0])>.8?f[0]=[i[0],i[0]]:Math.abs(o[1])>.8?f[1]=[i[1],i[1]]:Math.abs(o[2])>.8&&(f[2]=[i[2],i[2]]);const u=({value:h})=>{c||(c=h===e),l||(l=h===r)};if(n.forEach(u,{imageData:a,isInObject:t.isInObject,boundsIJK:f}),!c&&!l){t.centerSegmentIndexInfo.segmentIndex=null;return}const d=n.getAtIJKPoint(i);t.centerSegmentIndexInfo.segmentIndex=d,t.centerSegmentIndexInfo.hasSegmentIndex=c,t.centerSegmentIndexInfo.hasPreviewIndex=l}},mxe={[It.Initialize]:t=>{var y;const{operationName:e,centerIJK:r,segmentationVoxelManager:n,imageVoxelManager:i,configuration:o,segmentIndex:a,viewport:s}=t;if(!((y=o==null?void 0:o.threshold)!=null&&y.isDynamic)||!r||!a||e===It.RejectPreview||e===It.OnInteractionEnd)return;const c=n.getBoundsIJK(),{range:l,dynamicRadius:f=0}=o.threshold,u=l?0:f,{viewPlaneNormal:d}=s.getCamera(),h=c.map((m,w)=>{const[x,C]=m;return[Math.max(x,r[w]-u),Math.min(C,r[w]+u)]});Math.abs(d[0])>.8?h[0]=[r[0],r[0]]:Math.abs(d[1])>.8?h[1]=[r[1],r[1]]:Math.abs(d[2])>.8&&(h[2]=[r[2],r[2]]);const g=l||[1/0,-1/0],p=u*u,v=({value:m,pointIJK:w})=>{if(oS(r,w)>p)return;const C=Array.isArray(m)?mh(m):m;g[0]=Math.min(C,g[0]),g[1]=Math.max(C,g[1])};i.forEach(v,{boundsIJK:h}),o.threshold.range=g},[It.OnInteractionStart]:t=>{var r;const{configuration:e}=t;(r=e==null?void 0:e.threshold)!=null&&r.isDynamic&&(e.threshold.range=null)},[It.ComputeInnerCircleRadius]:t=>{const{configuration:e,viewport:r}=t,{dynamicRadius:n=0,isDynamic:i}=e.threshold;if(!i){e.threshold.dynamicRadiusInCanvas=0;return}if(n===0)return;const o=r.getImageData();if(!o)return;const{spacing:a}=o,s=[r.element.clientWidth/2,r.element.clientHeight/2],c=n*a[0],f=r.canvasToWorld(s).map(h=>h+c),u=r.worldToCanvas(f),d=Math.abs(s[0]-u[0]);e.threshold.dynamicRadiusInCanvas||(e.threshold.dynamicRadiusInCanvas=0),e.threshold.dynamicRadiusInCanvas=3+d}},vxe={[It.Initialize]:t=>{t.segmentIndex=0}},{isEqual:I3}=Vn,YI={toIJK:t=>t,fromIJK:t=>t,type:"acquistion"},yxe={toIJK:([t,e,r])=>[r,t,e],fromIJK:([t,e,r])=>[e,r,t],type:"jk"},wxe={toIJK:([t,e,r])=>[t,r,e],fromIJK:([t,e,r])=>[t,r,e],type:"ik"};function RG(t,e){if(!(t instanceof Or))return{...YI,boundsIJKPrime:e};const{viewPlaneNormal:r}=t.getCamera(),n=I3(Math.abs(r[0]),1)&&yxe||I3(Math.abs(r[1]),1)&&wxe||I3(Math.abs(r[2]),1)&&YI;return n?{...n,boundsIJKPrime:n.fromIJK(e)}:{toIJK:null,boundsIJKPrime:null,fromIJK:null,error:`Only mappings orthogonal to acquisition plane are permitted, but requested ${r}`}}const{RLEVoxelMap:xxe,VoxelManager:Cxe}=Vn,Sxe=65535;var yo;(function(t){t[t.SEGMENT=-1]="SEGMENT",t[t.ISLAND=-2]="ISLAND",t[t.INTERIOR=-3]="INTERIOR",t[t.EXTERIOR=-4]="EXTERIOR",t[t.INTERIOR_SMALL=-5]="INTERIOR_SMALL",t[t.INTERIOR_TEST=-6]="INTERIOR_TEST"})(yo||(yo={}));class Od{constructor(e){this.fillInternalEdge=!1,this.maxInternalRemove=128,this.maxInternalRemove=(e==null?void 0:e.maxInternalRemove)??this.maxInternalRemove,this.fillInternalEdge=(e==null?void 0:e.fillInternalEdge)??this.fillInternalEdge}initialize(e,r,n){const i=!!r.sourceVoxelManager,o=i?r.sourceVoxelManager:r,a=i?r:Cxe.createRLEHistoryVoxelManager(o),{segmentIndex:s=1,previewSegmentIndex:c=1}=n,l=n.points||o.getPoints();if(!(l!=null&&l.length))return;const f=o.getBoundsIJK().map((x,C)=>[Math.min(x[0],...l.map(S=>S[C])),Math.max(x[1],...l.map(S=>S[C]))]);if(f.find(x=>x[0]<0||x[1]>Sxe))return;const{toIJK:u,fromIJK:d,boundsIJKPrime:h,error:g}=RG(e,f);if(g){console.warn("Not performing island removal for planes not orthogonal to acquisition plane",g);return}const[p,v,y]=d(o.dimensions),m=new xxe(p,v,y),w=(x,C,S)=>{const T=o.toIndex(u([x,C,S])),_=o.getAtIndex(T);if(_===c||_===s)return yo.SEGMENT};return m.fillFrom(w,h),m.normalizer={toIJK:u,fromIJK:d,boundsIJKPrime:h},this.segmentSet=m,this.previewVoxelManager=a,this.segmentIndex=s,this.previewSegmentIndex=c??s,this.selectedPoints=l,!0}floodFillSegmentIsland(){const{selectedPoints:e,segmentSet:r}=this;let n=0;const{fromIJK:i}=r.normalizer;return e.forEach(o=>{const a=i(o),s=r.toIndex(a),[c,l,f]=a;r.get(s)===yo.SEGMENT&&(n+=r.floodFill(c,l,f,yo.ISLAND))}),n}removeExternalIslands(){const{previewVoxelManager:e,segmentSet:r}=this,{toIJK:n}=r.normalizer,i=(o,a)=>{const[,s,c]=r.toIJK(o);if(a.value!==yo.ISLAND)for(let l=a.start;l{let f;for(const u of[...l])if(u.value===yo.ISLAND){if(!f){if(this.fillInternalEdge&&u.start>0)for(let d=0;d{if(l.value!==yo.INTERIOR)return;const[,f,u]=e.toIJK(c),d=f>0?e.getRun(f-1,u):null,h=f+12&&(!v||!y)&&e.floodFill(l.start,f,u,yo.EXTERIOR,{singlePlane:!0})}),e.forEach((c,l)=>{if(l.value!==yo.INTERIOR)return;const[,f,u]=e.toIJK(c),g=e.floodFill(l.start,f,u,yo.INTERIOR_TEST)>this.maxInternalRemove?yo.EXTERIOR:yo.INTERIOR_SMALL;e.floodFill(l.start,f,u,g)}),e.forEach((c,l)=>{if(l.value===yo.INTERIOR_SMALL)for(let f=l.start;f=o.start&&n=i))return!0;return!1}}const Txe={[It.OnInteractionEnd]:t=>{const{previewSegmentIndex:e,segmentIndex:r,viewport:n,segmentationVoxelManager:i,activeStrategy:o,memo:a}=t;if(o!=="THRESHOLD_INSIDE_SPHERE_WITH_ISLAND_REMOVAL"||r===null)return;const s=new Od,c=(a==null?void 0:a.voxelManager)||i;if(!s.initialize(n,c,{previewSegmentIndex:e,segmentIndex:r}))return;s.floodFillSegmentIsland(),s.removeExternalIslands(),s.removeInternalIslands();const l=c.getArrayOfModifiedSlices();l&&bo(t.segmentationId,l,e)}},_xe={[It.Preview]:function(t){var o,a;const{previewSegmentIndex:e,configuration:r,enabledElement:n}=t;if(!e||!r)return;(o=this.onInteractionStart)==null||o.call(this,n,t);const i=this.fill(n,t);return i&&((a=this.onInteractionEnd)==null||a.call(this,n,t)),i},[It.Initialize]:t=>{const{segmentIndex:e,previewColor:r,previewSegmentIndex:n}=t;if(n==null||e==null)return;const i=Zh(t.segmentationId);i==null||i.forEach(o=>{fB(o,t.segmentationId,n,r)})},[It.AcceptPreview]:t=>{const{previewSegmentIndex:e,segmentationVoxelManager:r,memo:n,segmentIndex:i,centerSegmentIndexInfo:o}=t||{},{changedIndices:a}=o||{},s=n,c=({index:l})=>{const f=r.getAtIndex(l);(a==null?void 0:a.length)>0?a.includes(l)&&s.voxelManager.setAtIndex(l,0):f===e&&s.voxelManager.setAtIndex(l,i)};r.forEach(c),bo(t.segmentationId,r.getArrayOfModifiedSlices(),i),t.centerSegmentIndexInfo.changedIndices=[]},[It.RejectPreview]:t=>{t&&gV.undoIf(e=>{const r=e;if(!(r!=null&&r.voxelManager))return!1;const{segmentationVoxelManager:n}=r;let i=!1;const o=({value:a})=>{a===t.previewSegmentIndex&&(i=!0)};return n.forEach(o),i})}},Exe={[It.Fill]:t=>{var l;const{segmentsLocked:e,segmentationImageData:r,segmentationVoxelManager:n,brushStrategy:i,centerIJK:o}=t,a=(l=i.createIsInThreshold)==null?void 0:l.call(i,t),{setValue:s}=i,c=a?f=>{const{value:u,index:d}=f;e.includes(u)||!a(d)||s(t,f)}:f=>s(t,f);n.forEach(c,{imageData:r,isInObject:t.isInObject,boundsIJK:t.isInObjectBoundsIJK}),n.addPoint(o)}};function bxe({operationData:t,existingValue:e,index:r}){const{previewSegmentIndex:n,memo:i,centerSegmentIndexInfo:o,previewOnHover:a,segmentIndex:s}=t,{hasPreviewIndex:c,hasSegmentIndex:l,segmentIndex:f}=o;if(f===0&&l&&c){if(e===s||a)return;if(e===n){i.voxelManager.setAtIndex(r,0);return}return}if(f===0&&l&&!c){if(e===0||e!==s)return;i.voxelManager.setAtIndex(r,n),o.changedIndices.push(r);return}if(f===0&&!l&&c){if(e===s||a)return;if(e===n){i.voxelManager.setAtIndex(r,0);return}return}if(f===0&&!l&&!c){if(e===s)return;if(e===n){i.voxelManager.setAtIndex(r,n);return}return}if(f===n&&l&&c){if(e===s)return;i.voxelManager.setAtIndex(r,n);return}if(f===n&&!l&&c){if(e===s)return;i.voxelManager.setAtIndex(r,n);return}if(f===s&&l&&c){if(e===s)return;i.voxelManager.setAtIndex(r,n);return}if(f===s&&l&&!c){if(e===s)return;i.voxelManager.setAtIndex(r,n);return}}const Dxe={[It.INTERNAL_setValue]:(t,{value:e,index:r})=>{const{segmentsLocked:n,previewSegmentIndex:i,memo:o,segmentationVoxelManager:a,centerSegmentIndexInfo:s,segmentIndex:c}=t,l=a.getAtIndex(r);if(!n.includes(e)&&!(!s&&l===c)&&!((s==null?void 0:s.segmentIndex)!==0&&l===c)){if((s==null?void 0:s.segmentIndex)===null){o.voxelManager.setAtIndex(r,i??c);return}if(!i){let f=c;s&&(f=s.segmentIndex),o.voxelManager.setAtIndex(r,f);return}bxe({operationData:t,existingValue:l,index:r})}}},Ixe={[It.CreateIsInThreshold]:t=>{const{imageVoxelManager:e,segmentIndex:r,configuration:n}=t;if(!(!n||!r))return i=>{var c;const o=e.getAtIndex(i),a=Array.isArray(o)?sa(o):o,{threshold:s}=n||{};return(c=s==null?void 0:s.range)!=null&&c.length?s.range[0]<=a&&a<=s.range[1]:!0}}},JI=10;function v5(){return{maxIJKs:[]}}function LG(t,e){const{value:r}=e,{maxIJKs:n}=t,i=n.length;if(typeof r!="number"||i>=JI&&r=n[i-1].value)n.push(o);else for(let a=0;a=JI&&n.splice(0,1)}function AG(t,e,r){const{spacing:n,calibration:i}=r,{volumeUnit:o}=La({calibration:i,hasPixelSpacing:!0},[]),a=n?n[0]*n[1]*n[2]:1;return e.volume={value:Array.isArray(e.count.value)?e.count.value.map(s=>s*a):e.count.value*a,unit:o,name:"volume",label:"Volume"},e.maxIJKs=t.maxIJKs.filter(s=>s.pointIJK!==void 0),e.array.push(e.volume),t.maxIJKs=[],e}const eb=class eb extends jc{static statsInit(e){super.statsInit(e),this.volumetricState=v5()}static statsCallback(e){super.statsCallback(e),LG(this.volumetricState,e)}static getStatistics(e){const r={...e,unit:(e==null?void 0:e.unit)||"none",calibration:e==null?void 0:e.calibration,hasPixelSpacing:e==null?void 0:e.hasPixelSpacing},n=super.getStatistics(r);return AG(this.volumetricState,n,r)}};eb.volumetricState=v5();let fd=eb;class ZI extends DU{constructor(e){super(e),this.volumetricState=v5()}statsInit(e){super.statsInit(e),this.volumetricState=v5()}statsCallback(e){super.statsCallback(e),LG(this.volumetricState,e)}getStatistics(e){const r={...e,unit:(e==null?void 0:e.unit)||"none",calibration:e==null?void 0:e.calibration,hasPixelSpacing:e==null?void 0:e.hasPixelSpacing},n=super.getStatistics(r);return AG(this.volumetricState,n,r)}}const Oxe=Math.pow(3*1e3/(4*Math.PI),1/3);async function NG({segmentationId:t,segmentIndices:e,mode:r="collective"}){Hw(),Kc(Ja.COMPUTE_STATISTICS,0);const n=_G(t,e);if(!n)return;const{operationData:i,segVolumeId:o,segImageIds:a,reconstructableVolume:s,indices:c}=n,{refImageId:l,modalityUnitOptions:f}=exe(o,a),u=gB(l,f);return s?await Mxe({operationData:i,indices:c,unit:u,mode:r}):await Pxe({segImageIds:a,indices:c,unit:u,mode:r})}async function Mxe({operationData:t,indices:e,unit:r,mode:n}){var p;const i=EG(t),{segmentationVoxelManager:o,imageVoxelManager:a,segmentationImageData:s,imageData:c}=i;if(!o||!s)return;const l=s.getSpacing(),{boundsIJK:f}=o;if(!f)return fd.getStatistics({spacing:l});const d={scalarData:o.getCompleteScalarDataArray(),dimensions:s.getDimensions(),spacing:s.getSpacing(),origin:s.getOrigin(),direction:s.getDirection()},h={scalarData:a.getCompleteScalarDataArray(),dimensions:c.getDimensions(),spacing:c.getSpacing(),origin:c.getOrigin(),direction:c.getDirection()};if(!((p=h.scalarData)!=null&&p.length))return;const g=await Yc().executeTask("compute","calculateSegmentsStatisticsVolume",{segmentationInfo:d,imageInfo:h,indices:e,unit:r,mode:n});if(Kc(Ja.COMPUTE_STATISTICS,100),n==="collective")return y5({stats:g,unit:r,spacing:l,segmentationImageData:s,imageVoxelManager:a});{const v={};return Object.entries(g).forEach(([y,m])=>{v[y]=y5({stats:m,unit:r,spacing:l,segmentationImageData:s,imageVoxelManager:a})}),v}}const O3=(t,e)=>{if(!t.array)return;const r=t.array.findIndex(n=>n.name===e.name);r!==-1?t.array[r]=e:t.array.push(e)},y5=({stats:t,unit:e,spacing:r,segmentationImageData:n,imageVoxelManager:i})=>{if(t.mean.unit=e,t.max.unit=e,t.min.unit=e,e!=="SUV")return t;const o=r.map(a=>Math.max(1,Math.round(1.1*Oxe/a)));for(const a of t.maxIJKs){const s=Rxe(a,o,n,i,r);if(!s)continue;const{mean:c}=s;(!t.peakValue||t.peakValue.value<=c.value)&&(t.peakValue={name:"peakValue",label:"Peak Value",value:c.value,unit:e},t.peakPoint={name:"peakLPS",label:"Peak SUV Point",value:a.pointLPS?[...a.pointLPS]:null,unit:null},O3(t,t.peakValue),O3(t,t.peakPoint))}if(t.volume&&t.mean){const a=t.volume.value,s=t.mean.value;t.lesionGlycolysis={name:"lesionGlycolysis",label:"Lesion Glycolysis",value:a*s,unit:`${t.volume.unit}·${e}`},O3(t,t.lesionGlycolysis)}return t};async function Pxe({segImageIds:t,indices:e,unit:r,mode:n}){Kc(Ja.COMPUTE_STATISTICS,0);const{segmentationInfo:i,imageInfo:o}=bG(t),a=await Yc().executeTask("compute","calculateSegmentsStatisticsStack",{segmentationInfo:i,imageInfo:o,indices:e,mode:n});Kc(Ja.COMPUTE_STATISTICS,100);const s=i[0].spacing,c=i[0],l=o[0].voxelManager;if(n==="collective")return y5({stats:a,unit:r,spacing:s,segmentationImageData:c,imageVoxelManager:l});{const f={};return Object.entries(a).forEach(([u,d])=>{f[u]=y5({stats:d,unit:r,spacing:s,segmentationImageData:c,imageVoxelManager:l})}),f}}function Rxe(t,e,r,n,i){const{pointIJK:o,pointLPS:a}=t;if(!o)return;const s=o.map((f,u)=>[f-e[u],f+e[u]]),c=(f,u)=>{const d=(u[0]-o[0])/e[0],h=(u[1]-o[1])/e[1],g=(u[2]-o[2])/e[2];return d*d+h*h+g*g<=1},l=({pointIJK:f,pointLPS:u})=>{const d=n.getAtIJKPoint(f);d!==void 0&&fd.statsCallback({value:d,pointLPS:u,pointIJK:f})};return fd.statsInit({storePointData:!1}),G4(r,{pointInShapeFn:c,callback:l,boundsIJK:s}),fd.getStatistics({spacing:i})}const Lxe={[It.GetStatistics]:function(t,e,r){const{indices:n}=r,{segmentationId:i,viewport:o}=e;NG({segmentationId:i,segmentIndices:n})}},Sn={determineSegmentIndex:pxe,dynamicThreshold:mxe,erase:vxe,islandRemoval:Txe,preview:_xe,regionFill:Exe,setValue:Dxe,threshold:Ixe,labelmapStatistics:Lxe,ensureSegmentationVolumeFor3DManipulation:SG,ensureImageVolumeFor3DManipulation:TG},Yf=class Yf{constructor(e,...r){this._initialize=[],this._fill=[],this._onInteractionStart=[],this.fill=(n,i)=>{const o=this.initialize(n,i,It.Fill);if(!o)return;this._fill.forEach(c=>c(o));const{segmentationVoxelManager:a,segmentIndex:s}=o;return bo(o.segmentationId,a.getArrayOfModifiedSlices(),s),o},this.onInteractionStart=(n,i)=>{const o=this.initialize(n,i);o&&this._onInteractionStart.forEach(a=>a.call(this,o))},this.addPreview=(n,i)=>{const o=this.initialize(n,i,It.AddPreview);if(o)return o},this.configurationName=e,this.compositions=r,r.forEach(n=>{const i=typeof n=="function"?n():n;if(i)for(const o in i){if(!Yf.childFunctions[o])throw new Error(`Didn't find ${o} as a brush strategy`);Yf.childFunctions[o](this,i[o])}}),this.strategyFunction=(n,i)=>this.fill(n,i);for(const n of Object.keys(Yf.childFunctions))this.strategyFunction[n]=this[n]}initialize(e,r,n){const{viewport:i}=e,o=w8({operationData:r,viewport:i,strategy:this});if(!o)return null;const{imageVoxelManager:a,segmentationVoxelManager:s,segmentationImageData:c}=o,l=r.createMemo(r.segmentationId,s),f={operationName:n,...r,segmentIndex:r.segmentIndex,enabledElement:e,imageVoxelManager:a,segmentationVoxelManager:s,segmentationImageData:c,viewport:i,centerWorld:null,isInObject:null,isInObjectBoundsIJK:null,brushStrategy:this,memo:l};return this._initialize.forEach(u=>u(f)),f}};Yf.COMPOSITIONS=Sn,Yf.childFunctions={[It.OnInteractionStart]:ks(It.OnInteractionStart,It.Initialize),[It.OnInteractionEnd]:ks(It.OnInteractionEnd,It.Initialize),[It.Fill]:ks(It.Fill),[It.Initialize]:ks(It.Initialize),[It.CreateIsInThreshold]:G2(It.CreateIsInThreshold),[It.Interpolate]:ks(It.Interpolate,It.Initialize),[It.AcceptPreview]:ks(It.AcceptPreview,It.Initialize),[It.RejectPreview]:ks(It.RejectPreview,It.Initialize),[It.INTERNAL_setValue]:G2(It.INTERNAL_setValue),[It.Preview]:G2(It.Preview,!1),[It.ComputeInnerCircleRadius]:ks(It.ComputeInnerCircleRadius),[It.EnsureSegmentationVolumeFor3DManipulation]:ks(It.EnsureSegmentationVolumeFor3DManipulation),[It.EnsureImageVolumeFor3DManipulation]:ks(It.EnsureImageVolumeFor3DManipulation),[It.AddPreview]:ks(It.AddPreview),[It.GetStatistics]:G2(It.GetStatistics),compositions:null};let sc=Yf;function ks(t,e){const r=`_${t}`;return(n,i)=>{n[r]||(n[r]=[]),n[r].push(i),n[t]||(n[t]=e?(o,a,...s)=>{const c=n[e](o,a,t);let l;return n[r].forEach(f=>{const u=f.call(n,c,...s);l||(l=u)}),l}:(o,...a)=>{n[r].forEach(s=>s.call(n,o,...a))})}}function G2(t,e=!0){return(r,n)=>{if(r[t])throw new Error(`The singleton method ${t} already exists`);r[t]=e?n:(i,o,...a)=>(o.enabledElement=i,n.call(r,o,...a))}}function kG(t,e){const{center:r,radius:n}=t,i=t.radius2||n*n;return(e[0]-r[0])*(e[0]-r[0])+(e[1]-r[1])*(e[1]-r[1])+(e[2]-r[2])*(e[2]-r[2])<=i}const{transformWorldToIndex:QI,isEqual:M3}=Vn,VG={[It.Initialize]:t=>{const{points:e,viewport:r,segmentationImageData:n}=t;if(!e)return;const i=At(0,0,0);e.forEach(d=>{di(i,i,d)}),Nr(i,i,1/e.length),t.centerWorld=i,t.centerIJK=QI(n,i);const o=e.map(d=>r.worldToCanvas(d)),[a,s]=i5(o),c=r.canvasToWorld(a),l=r.canvasToWorld(s),f=e.map(d=>QI(n,d)),u=ef(f,n.getDimensions());t.isInObject=FG({topLeftWorld:c,bottomRightWorld:l,center:i}),t.isInObjectBoundsIJK=u}};function FG(t){const{topLeftWorld:e,bottomRightWorld:r,center:n}=t,i=Math.abs(e[0]-r[0])/2,o=Math.abs(e[1]-r[1])/2,a=Math.abs(e[2]-r[2])/2,s=Math.max(i,o,a);if(M3(i,s)&&M3(o,s)&&M3(a,s)){const f={center:n,radius:s,radius2:s*s};return u=>kG(f,u)}const c={center:n,xRadius:i,yRadius:o,zRadius:a},{precalculated:l}=zE(c,{});return l}const UG=new sc("Circle",Sn.regionFill,Sn.setValue,VG,Sn.determineSegmentIndex,Sn.preview,Sn.labelmapStatistics),Axe=new sc("CircleThreshold",Sn.regionFill,Sn.setValue,VG,Sn.determineSegmentIndex,Sn.dynamicThreshold,Sn.threshold,Sn.preview,Sn.islandRemoval,Sn.labelmapStatistics),Xw=UG.strategyFunction,Nxe=Axe.strategyFunction;function kxe(){throw new Error("Not yet implemented")}const{transformWorldToIndex:Vxe}=Vn,Fxe={[It.Initialize]:t=>{const{points:e,viewport:r,segmentationImageData:n}=t;if(!e)return;const i=At(0,0,0);e.forEach(c=>{di(i,i,c)}),Nr(i,i,1/e.length),t.centerWorld=i,t.centerIJK=Vxe(n,i);const{boundsIJK:o,topLeftWorld:a,bottomRightWorld:s}=Iwe(e.slice(0,2),n,r);t.isInObjectBoundsIJK=o,t.isInObject=FG({topLeftWorld:a,bottomRightWorld:s,center:i})}},Yw=new sc("Sphere",Sn.regionFill,Sn.setValue,Fxe,Sn.determineSegmentIndex,Sn.preview,Sn.labelmapStatistics,Sn.ensureSegmentationVolumeFor3DManipulation),BG=Yw.strategyFunction,Uxe=new sc("SphereThreshold",...Yw.compositions,Sn.dynamicThreshold,Sn.threshold,Sn.ensureSegmentationVolumeFor3DManipulation,Sn.ensureImageVolumeFor3DManipulation),Bxe=new sc("SphereThreshold",...Yw.compositions,Sn.dynamicThreshold,Sn.threshold,Sn.islandRemoval,Sn.ensureSegmentationVolumeFor3DManipulation,Sn.ensureImageVolumeFor3DManipulation),Gxe=Uxe.strategyFunction,Wxe=Bxe.strategyFunction,zxe=new sc("EraseSphere",Sn.erase,...Yw.compositions),GG=zxe.strategyFunction,$xe=new sc("EraseCircle",Sn.erase,...UG.compositions),WG=$xe.strategyFunction,{VoxelManager:XS,RLEVoxelMap:jxe}=Vn;function YS(t,e){return $G(t,e)}function zG(t){const{segmentationVoxelManager:e,undoVoxelManager:r,redoVoxelManager:n}=this,i=t===!1?n:r;i.forEach(({value:a,pointIJK:s})=>{e.setAtIJKPoint(s,a)});const o=i.getArrayOfModifiedSlices();bo(this.segmentationId,o)}function $G(t,e){const r=XS.createRLEHistoryVoxelManager(e);return{segmentationId:t,restoreMemo:zG,commitMemo:Hxe,segmentationVoxelManager:e,voxelManager:r,id:kn(),operationType:"labelmap"}}function Hxe(){if(this.redoVoxelManager)return!0;if(!this.voxelManager.modifiedSlices.size)return!1;const{segmentationVoxelManager:t}=this,e=XS.createRLEHistoryVoxelManager(t);jxe.copyMap(e.map,this.voxelManager.map);for(const n of this.voxelManager.modifiedSlices.keys())e.modifiedSlices.add(n);this.undoVoxelManager=e;const r=XS.createRLEVolumeVoxelManager({dimensions:this.segmentationVoxelManager.dimensions});return this.redoVoxelManager=r,e.forEach(({index:n,pointIJK:i,value:o})=>{const a=t.getAtIJKPoint(i);a!==o&&r.setAtIndex(n,a)}),!0}const Kxe=Object.freeze(Object.defineProperty({__proto__:null,createLabelmapMemo:YS,createRleMemo:$G,restoreMemo:zG},Symbol.toStringTag,{value:"Module"})),{isEqual:W2}=Vn,qxe=At(1,0,0),Xxe=At(0,1,0),Yxe=At(0,0,1),e7=[qxe,Xxe,Yxe];function jG(t){const e=Qn(Ge(),t[0],t[1]),r=Qn(Ge(),t[0],t[2]),n=t7(e,e7),i=t7(r,e7);return[...n,...i].every(a=>W2(a,0)||W2(a,90)||W2(a,180)||W2(a,270))}function t7(t,e){return e.map(r=>r4(t,r)*180/Math.PI)}const{transformWorldToIndex:HG}=Vn,KG={[It.Initialize]:t=>{const{points:e,imageVoxelManager:r,viewport:n,segmentationImageData:i,segmentationVoxelManager:o}=t;if(!e)return;const a=At(0,0,0);e.forEach(l=>{di(a,a,l)}),Nr(a,a,1/e.length),t.centerWorld=a,t.centerIJK=HG(i,a);const{boundsIJK:s,pointInShapeFn:c}=Jxe(n,e,i);t.isInObject=c,t.isInObjectBoundsIJK=s}};function Jxe(t,e,r){let n=e.map(w=>HG(r,w));n=n.map(w=>w.map(x=>Math.round(x)));const i=ef(n,r.getDimensions()),a=t instanceof mr||jG(n),s=r.getDirection(),c=r.getSpacing(),{viewPlaneNormal:l}=t.getCamera(),f=hf({direction:s,spacing:c},l),u=eU(e);let[[d,h],[g,p],[v,y]]=u;return d-=f,h+=f,g-=f,p+=f,v-=f,y+=f,{boundsIJK:i,pointInShapeFn:a?()=>!0:w=>{const[x,C,S]=w,T=x>=d&&x<=h,_=C>=g&&C<=p,E=S>=v&&S<=y;return T&&_&&E}}}const Zxe=new sc("Rectangle",Sn.regionFill,Sn.setValue,KG,Sn.determineSegmentIndex,Sn.preview,Sn.labelmapStatistics),Qxe=new sc("RectangleThreshold",Sn.regionFill,Sn.setValue,KG,Sn.determineSegmentIndex,Sn.dynamicThreshold,Sn.threshold,Sn.preview,Sn.islandRemoval,Sn.labelmapStatistics),T8=Zxe.strategyFunction,e3e=Qxe.strategyFunction,t3e=Object.freeze(Object.defineProperty({__proto__:null,fillInsideCircle:Xw,fillInsideRectangle:T8,fillOutsideCircle:kxe,thresholdInsideRectangle:e3e},Symbol.toStringTag,{value:"Module"})),Lp=class Lp extends Ci{constructor(e,r){super(e,r),this.memoMap=new Map,this.acceptedMemoIds=new Map,this.centerSegmentIndexInfo={segmentIndex:null,hasSegmentIndex:!1,hasPreviewIndex:!1,changedIndices:[]}}_historyRedoHandler(e){const{id:r,operationType:n}=e.detail;if(n==="labelmap"){if(this.acceptedMemoIds.has(r)){this._hoverData=null;const i=this.acceptedMemoIds.get(r),o=i==null?void 0:i.element,a=this.getOperationData(o);a.segmentIndex=i==null?void 0:i.segmentIndex,o&&this.applyActiveStrategyCallback(Se(o),a,It.AcceptPreview)}this._previewData.isDrag=!0}}get _previewData(){return Lp.previewData}createMemo(e,r){const n=r.id;if(this.memo&&this.memo.segmentationVoxelManager===r)return this.memo;let i=this.memoMap.get(n);return i?i.redoVoxelManager&&(i=YS(e,r),this.memoMap.set(n,i)):(i=YS(e,r),this.memoMap.set(n,i)),this.memo=i,i}createEditData(e){const r=Se(e),{viewport:n}=r,i=Dd(n.id);if(!i){const l=new CustomEvent(Ze.ERROR_EVENT,{detail:{type:"Segmentation",message:"No active segmentation detected, create a segmentation representation before using the brush tool"},cancelable:!0});return Je.dispatchEvent(l),null}const{segmentationId:o}=i,a=Gd(o),{representationData:s}=zn(o);return this.getEditData({viewport:n,representationData:s,segmentsLocked:a,segmentationId:o})}getEditData({viewport:e,representationData:r,segmentsLocked:n,segmentationId:i}){var o,a,s;if(e instanceof Or){const{volumeId:c}=r[Lt.Labelmap],l=e.getActors();if(e instanceof mr){const g=new CustomEvent(Ze.ERROR_EVENT,{detail:{type:"Segmentation",message:"Cannot perform brush operation on the selected viewport"},cancelable:!0});return Je.dispatchEvent(g),null}const u=l.map(g=>Fe.getVolume(g.referencedId)),d=Fe.getVolume(c),h=((o=u.find(g=>Yt(g.dimensions,d.dimensions)))==null?void 0:o.volumeId)||((a=u[0])==null?void 0:a.volumeId);return{volumeId:c,referencedVolumeId:((s=this.configuration.threshold)==null?void 0:s.volumeId)??h,segmentsLocked:n}}else{const c=mf(e.id,i);return c?{imageId:c,segmentsLocked:n}:void 0}}createHoverData(e,r){const n=Se(e),{viewport:i}=n,o=i.getCamera(),{viewPlaneNormal:a,viewUp:s}=o,c=[i.id],{segmentIndex:l,segmentationId:f,segmentColor:u}=this.getActiveSegmentationData(i)||{};return{brushCursor:{metadata:{viewPlaneNormal:[...a],viewUp:[...s],FrameOfReferenceUID:i.getFrameOfReferenceUID(),referencedImageId:"",toolName:this.getToolName(),segmentColor:u},data:{}},centerCanvas:r,segmentIndex:l,viewport:i,segmentationId:f,segmentColor:u,viewportIdsToRender:c}}getActiveSegmentationData(e){const r=e.id,n=Dd(r);if(!n)return;const{segmentationId:i}=n,o=Ra(i);if(!o)return;const a=zl(r,i,o);return{segmentIndex:o,segmentationId:i,segmentColor:a}}getOperationData(e){var v,y,m,w;const r=this._editData||this.createEditData(e),{segmentIndex:n,segmentationId:i,brushCursor:o}=this._hoverData||this.createHoverData(e),{data:a,metadata:s={}}=o||{},{viewPlaneNormal:c,viewUp:l}=s,f=(y=(v=this.configuration.preview)==null?void 0:v.previewColors)==null?void 0:y[n],{viewport:u}=Se(e),d=zl(u.id,i,n);if(!f&&!d)return;let h=null,g=null;return(m=this.configuration.preview)!=null&&m.enabled&&(h=f||n3e(...d),g=255),{...r,points:(w=a==null?void 0:a.handles)==null?void 0:w.points,segmentIndex:n,viewPlaneNormal:c,previewOnHover:!this._previewData.isDrag,toolGroupId:this.toolGroupId,segmentationId:i,viewUp:l,centerSegmentIndexInfo:this.centerSegmentIndexInfo,activeStrategy:this.configuration.activeStrategy,configuration:this.configuration,previewColor:h,previewSegmentIndex:g,createMemo:this.createMemo.bind(this)}}addPreview(e=this._previewData.element,r){const{_previewData:n}=this,i=r==null?void 0:r.acceptReject;i===!0?this.acceptPreview(e):i===!1&&this.rejectPreview(e);const o=Se(e),a=this.applyActiveStrategyCallback(o,this.getOperationData(e),It.AddPreview);return n.isDrag=!0,a}rejectPreview(e=this._previewData.element){if(!e)return;this.doneEditMemo();const r=Se(e);this.applyActiveStrategyCallback(r,this.getOperationData(e),It.RejectPreview),this._previewData.preview=null,this._previewData.isDrag=!1}acceptPreview(e=this._previewData.element){if(!e)return;const r=this.getOperationData(e);this.memo&&this.memo.id&&this.acceptedMemoIds.set(this.memo.id,{element:e,segmentIndex:r.segmentIndex});const n=Se(e);this.applyActiveStrategyCallback(n,r,It.AcceptPreview),this.doneEditMemo(),this._previewData.preview=null,this._previewData.isDrag=!1}static viewportContoursToLabelmap(e,r){var v;const n=(r==null?void 0:r.removeContours)??!0,i=gm(),o=Em(e,i);if(!(o!=null&&o.length))return;const a=o.filter(y=>{var m,w;return(w=(m=y.data.contour)==null?void 0:m.polyline)==null?void 0:w.length});if(!a.length)return;const c=new Lp({},{configuration:{strategies:{FILL_INSIDE_CIRCLE:Xw},activeStrategy:"FILL_INSIDE_CIRCLE"}}).addPreview(e.element),{memo:l,segmentationId:f}=c,u=l==null?void 0:l.voxelManager,d=u.sourceVoxelManager||u,{dimensions:h}=u,g=e.getDefaultActor().actor.getMapper().getInputData();for(const y of a){const m=[[1/0,-1/0],[1/0,-1/0],[1/0,-1/0]],{polyline:w}=y.data.contour;for(const I of w)g.worldToIndex(I).forEach((O,A)=>{m[A][0]=Math.min(m[A][0],O),m[A][1]=Math.max(m[A][1],O)});m.forEach((I,P)=>{I[0]=Math.round(Math.max(0,I[0])),I[1]=Math.round(Math.min(h[P]-1,I[1]))});const x=Ra(f),C=((v=y.data.handles)==null?void 0:v[0])||w[0],S=g.worldToIndex(C).map(Math.round),T=d.getAtIJKPoint(S)||0;let _=!1,E=!1;for(const I of w){const P=g.worldToIndex(I).map(Math.round),O=d.getAtIJKPoint(P);O===T?_=!0:O>=0&&(E=!0)}const D=_&&E?T:T===0?x:0;for(let I=m[0][0];I<=m[0][1];I++)for(let P=m[1][0];P<=m[1][1];P++)for(let O=m[2][0];O<=m[2][1];O++){const A=g.indexToWorld([I,P,O]);XE(A,w)&&u.setAtIJK(I,P,O,D)}n&&yn(y.annotationUID)}const p=u.getArrayOfModifiedSlices();bo(f,p)}};Lp.previewData={preview:null,element:null,timerStart:0,timer:null,startPoint:[NaN,NaN],isDrag:!1};let Md=Lp;function n3e(t,e,r,n,i=.4){return[Math.round(t+(255-t)*i),Math.round(e+(255-e)*i),Math.round(r+(255-r)*i),n]}class Jw extends Md{constructor(e={},r={supportedInteractionTypes:["Mouse","Touch"],configuration:{strategies:{FILL_INSIDE_CIRCLE:Xw,ERASE_INSIDE_CIRCLE:WG,FILL_INSIDE_SPHERE:BG,ERASE_INSIDE_SPHERE:GG,THRESHOLD_INSIDE_CIRCLE:Nxe,THRESHOLD_INSIDE_SPHERE:Gxe,THRESHOLD_INSIDE_SPHERE_WITH_ISLAND_REMOVAL:Wxe},defaultStrategy:"FILL_INSIDE_CIRCLE",activeStrategy:"FILL_INSIDE_CIRCLE",brushSize:25,useCenterSegmentIndex:!1,preview:{enabled:!1,previewColors:{0:[255,255,255,128]},previewTimeMs:250,previewMoveDistance:8,dragMoveDistance:4,dragTimeMs:500},actions:{[It.AcceptPreview]:{method:It.AcceptPreview,bindings:[{key:"Enter"}]},[It.RejectPreview]:{method:It.RejectPreview,bindings:[{key:"Escape"}]},[It.Interpolate]:{method:It.Interpolate,bindings:[{key:"i"}],configuration:{useBallStructuringElement:!0,noUseDistanceTransform:!0,noUseExtrapolation:!0}},interpolateExtrapolation:{method:It.Interpolate,bindings:[{key:"e"}],configuration:{}}}}}){super(e,r),this.onSetToolPassive=n=>{this.disableCursor()},this.onSetToolEnabled=()=>{this.disableCursor()},this.onSetToolDisabled=n=>{this.disableCursor()},this.preMouseDownCallback=n=>{const i=n.detail,{element:o}=i,a=Se(o);this._editData=this.createEditData(o),this._activateDraw(o),Ft(o),n.preventDefault(),this._previewData.isDrag=!1,this._previewData.timerStart=Date.now();const s=this._hoverData||this.createHoverData(o);Ne(s.viewportIdsToRender);const c=this.getOperationData(o);return this.applyActiveStrategyCallback(a,c,It.OnInteractionStart),!0},this.mouseMoveCallback=n=>{if(this.mode===$n.Active){if(this.updateCursor(n),!this.configuration.preview.enabled)return;const{previewTimeMs:i,previewMoveDistance:o,dragMoveDistance:a}=this.configuration.preview,{currentPoints:s,element:c}=n.detail,{canvas:l}=s,{startPoint:f,timer:u,timerStart:d,isDrag:h}=this._previewData;if(h)return;const g=Ir(l,f),p=Date.now()-d;if((g>o||p>i&&g>a)&&(u&&(window.clearTimeout(u),this._previewData.timer=null),h||this.rejectPreview(c)),!this._previewData.timer){const v=window.setTimeout(this.previewCallback,250);Object.assign(this._previewData,{timerStart:Date.now(),timer:v,startPoint:l,element:c})}}},this.previewCallback=()=>{if(this._previewData.isDrag){this._previewData.timer=null;return}this._previewData.timer=null;const n=this.getOperationData(this._previewData.element),i=Se(this._previewData.element);if(!i)return;const{viewport:o}=i,a=this.configuration.activeStrategy,s=w8({operationData:n,viewport:o,strategy:a});if(!n)return;const c=this.createMemo(n.segmentationId,s.segmentationVoxelManager);this._previewData.preview=this.applyActiveStrategyCallback(Se(this._previewData.element),{...n,...s,memo:c},It.Preview)},this._dragCallback=n=>{const i=n.detail,{element:o,currentPoints:a}=i,s=Se(o);this.updateCursor(n);const{viewportIdsToRender:c}=this._hoverData;Ne(c);const l=Ir(a.canvas,this._previewData.startPoint),{dragTimeMs:f,dragMoveDistance:u}=this.configuration.preview;!this._previewData.isDrag&&Date.now()-this._previewData.timerStart{const i=n.detail,{element:o}=i,a=Se(o),s=this.getOperationData(o);!this._previewData.preview&&!this._previewData.isDrag&&this.applyActiveStrategy(a,s),this.doneEditMemo(),this._deactivateDraw(o),Xt(o),this.updateCursor(n),this._editData=null,this.applyActiveStrategyCallback(a,s,It.OnInteractionEnd),this._previewData.isDrag||this.acceptPreview(o)},this._activateDraw=n=>{n.addEventListener(k.MOUSE_UP,this._endCallback),n.addEventListener(k.MOUSE_DRAG,this._dragCallback),n.addEventListener(k.MOUSE_CLICK,this._endCallback)},this._deactivateDraw=n=>{n.removeEventListener(k.MOUSE_UP,this._endCallback),n.removeEventListener(k.MOUSE_DRAG,this._dragCallback),n.removeEventListener(k.MOUSE_CLICK,this._endCallback)}}disableCursor(){this._hoverData=void 0,this.rejectPreview()}updateCursor(e){const r=e.detail,{element:n}=r,{currentPoints:i}=r,o=i.canvas;this._hoverData=this.createHoverData(n,o),this._calculateCursor(n,o),this._hoverData&&Ne(this._hoverData.viewportIdsToRender)}_calculateCursor(e,r){const n=Se(e),{viewport:i}=n,{canvasToWorld:o}=i,a=i.getCamera(),{brushSize:s}=this.configuration,c=At(a.viewUp[0],a.viewUp[1],a.viewUp[2]),l=At(a.viewPlaneNormal[0],a.viewPlaneNormal[1],a.viewPlaneNormal[2]),f=Ge();Wn(f,c,l);const u=o([r[0],r[1]]),d=Ge(),h=Ge(),g=Ge(),p=Ge();for(let x=0;x<=2;x++)d[x]=u[x]-c[x]*s,h[x]=u[x]+c[x]*s,g[x]=u[x]-f[x]*s,p[x]=u[x]+f[x]*s;if(!this._hoverData)return;const{brushCursor:v}=this._hoverData,{data:y}=v;y.handles===void 0&&(y.handles={}),y.handles.points=[d,h,g,p];const m=this.configuration.activeStrategy,w=this.configuration.strategies[m];typeof(w==null?void 0:w.computeInnerCircleRadius)=="function"&&w.computeInnerCircleRadius({configuration:this.configuration,viewport:i}),y.invalidated=!1}getStatistics(e,r){if(!e)return;const n=Se(e);return this.applyActiveStrategyCallback(n,this.getOperationData(e),It.GetStatistics,r)}rejectPreview(e=this._previewData.element){if(!e)return;this.doneEditMemo();const r=Se(e);r&&(this.applyActiveStrategyCallback(r,this.getOperationData(e),It.RejectPreview),this._previewData.preview=null,this._previewData.isDrag=!1)}acceptPreview(e=this._previewData.element){e&&super.acceptPreview(e)}interpolate(e,r){if(!e)return;const n=Se(e);this._previewData.preview=this.applyActiveStrategyCallback(n,this.getOperationData(e),It.Interpolate,r.configuration),this._previewData.isDrag=!0}invalidateBrushCursor(){if(this._hoverData===void 0)return;const{data:e}=this._hoverData.brushCursor,{viewport:r}=this._hoverData;e.invalidated=!0;const{segmentColor:n}=this.getActiveSegmentationData(r)||{};this._hoverData.brushCursor.metadata.segmentColor=n}renderAnnotation(e,r){var m,w;if(!this._hoverData)return;const{viewport:n}=e;if(!this._hoverData.viewportIdsToRender.includes(n.id))return;const o=this._hoverData.brushCursor;if(o.data.invalidated===!0){const{centerCanvas:x}=this._hoverData,{element:C}=n;this._calculateCursor(C,x)}const a=o.metadata;if(!a)return;const s=a.brushCursorUID,c=o.data,{points:l}=c.handles,f=l.map(x=>n.worldToCanvas(x)),u=f[0],d=f[1],h=[Math.floor((u[0]+d[0])/2),Math.floor((u[1]+d[1])/2)],g=Math.abs(u[1]-Math.floor((u[1]+d[1])/2)),p=`rgb(${((m=a.segmentColor)==null?void 0:m.slice(0,3))||[0,0,0]})`;if(!n.getRenderingEngine()){console.warn("Rendering Engine has been destroyed");return}ua(r,s,"0",h,g,{color:p,lineDash:this.centerSegmentIndexInfo.segmentIndex===0?[1,2]:null});const{dynamicRadiusInCanvas:y}=((w=this.configuration)==null?void 0:w.threshold)||{dynamicRadiusInCanvas:0};y&&ua(r,s,"1",h,y,{color:p})}}Jw.toolName="Brush";function rg(t,e){const r=fi(t);if(r===void 0)return;const n=r._toolInstances;return Object.keys(n).length?e&&n[e]?[n[e]]:Object.values(n).filter(o=>o instanceof Jw):void 0}function r3e(t,e,r){const n=fi(t);if(n===void 0)return;rg(t,r).forEach(l=>{l.configuration.brushSize=e,l.invalidateBrushCursor()});const o=n.getViewportsInfo(),a=Object.keys(o).map(l=>o[l]);if(!a.length)return;const{renderingEngineId:s}=a[0],c=n.getViewportIds();ni(s),Ne(c)}function i3e(t,e){const r=fi(t);if(r===void 0)return;const n=r._toolInstances;if(!Object.keys(n).length)return;const o=rg(t,e)[0];if(o)return o.configuration.brushSize}function o3e(t,e){const r=fi(t);if(r===void 0||(rg(t).forEach(a=>{a.configuration.activeStrategy.toLowerCase().includes("threshold")&&(a.configuration={...a.configuration,threshold:{...a.configuration.threshold,...e}})}),!r.getViewportsInfo().length))return;const o=r.getViewportIds();Ne(o)}function a3e(t){const e=fi(t);if(e===void 0)return;const r=e._toolInstances;if(!Object.keys(r).length)return;const i=rg(t)[0];if(i)return i.configuration.threshold.range}const Ap=class Ap{static statsInit(e){const{storePointData:r,indices:n,mode:i}=e;this.mode=i,this.indices=n,this.calculators.clear(),this.mode==="individual"?n.forEach(o=>{this.calculators.set(o,new ZI({storePointData:r}))}):this.calculators.set(n,new ZI({storePointData:r}))}static statsCallback(e){const{segmentIndex:r,...n}=e;if(!r)throw new Error("Segment index is required for stats calculation");const i=this.mode==="individual"?this.calculators.get(r):this.calculators.get(this.indices);if(!i)throw new Error(`No calculator found for segment ${r}`);i.statsCallback(n)}static getStatistics(e){if(this.mode==="individual"){const n={};return this.calculators.forEach((i,o)=>{n[o]=i.getStatistics(e)}),n}return this.calculators.get(this.indices).getStatistics(e)}};Ap.calculators=new Map,Ap.indices=[],Ap.mode="collective";let JS=Ap;function s3e(t,e,r,n,i){if(!i)throw new Error("Segmentation ID is required to be passed inside thresholdSegmentationByRange");const{baseVolumeIdx:o,volumeInfoList:a}=tU(t,r),{voxelManager:s}=a[o],c=s,l=t.voxelManager.getScalarDataLength(),f=t.voxelManager;return a.forEach(u=>{const{volumeSize:d}=u;d===l?l3e(f,c,e,u):c3e(f,c,e,u,a,o,n)}),bo(i),t}function c3e(t,e,r,n,i,o,a){const{imageData:s,lower:c,upper:l,dimensions:f}=n;let u,d,h;const g=t.getScalarDataLength();for(let p=0;p{u=u+1,w>=h.lower&&w<=h.upper&&(d=d+1)};u=0,d=0,h={lower:c,upper:l};let m=!1;t.forEach(y,{imageData:s,boundsIJK:v}),m=a===0?d>0:d===u,t.setAtIndex(p,m?r:0)}return{total:u,range:h,overlaps:d}}function l3e(t,e,r,n){const{lower:i,upper:o}=n,a=t.getScalarDataLength();for(let s=0;s=i&&c<=o?r:0)}}function n7(t,e,r){const n=r.toIJK(t),i=r.toIJK(e),o=Ge(),{testIJK:a}=r,s=Nn(Ge(),n,i),c=Math.round(Math.max(...s.map(Math.abs)));if(c<2)return!0;const l=Nr(Ge(),s,1/c);for(let f=1;f{const l=di(Ge(),s,c).map(v=>v/2),f=e.worldToIndex(l).map(Math.round),[u,d,h]=f,g=u+d*o+h*a,p=r.getAtIndex(g);return p===n||(i==null?void 0:i.has(p))},toIJK:s=>e.worldToIndex(s),testIJK:s=>{const[c,l,f]=s,u=Math.round(c)+Math.round(l)*o+Math.round(f)*a,d=r.getAtIndex(u);return d===n||(i==null?void 0:i.has(d))}}}function f3e(t,e,r){const n=Fe.getVolume(t);if(!n){console.warn(`No volume found for ${t}`);return}return u3e({dimensions:n.dimensions,imageData:n.imageData,voxelManager:n.voxelManager,segmentIndex:e,containedSegmentIndices:r})}const Rg=.01;function d3e(t,e,r){const{sliceContours:n}=t,{segmentIndex:i,containedSegmentIndices:o}=r;let a;const s=f3e(e,i,o);for(const c of n){const l=h3e(c,s,a);l&&(a=l)}return a&&Object.assign(a,r),a}function h3e(t,e,r={maxMajor:0,maxMinor:0}){const{points:n}=t.polyData,{maxMinor:i,maxMajor:o}=r;let a=o*o,s=i*i,c;for(let v=0;vRg||e.testCenter(m,w)&&n7(m,w,e)&&(s=x,d=[v,y])}if(!d)return;s=Math.sqrt(s);const h=n[d[0]],g=n[d[1]];return{majorAxis:[l,f],minorAxis:[h,g],maxMajor:a,maxMinor:s,...t}}async function qG(t){const e=await DG({segmentations:t});if(!(e!=null&&e.length)||!e[0].sliceContours.length)return;const{segments:r=[null,{label:"Unspecified",color:null,containedSegmentIndices:null}]}=t,n=ng(t.segmentationId);if(!n)return;const i=r.findIndex(o=>!!o);if(i!==-1)return r[i].segmentIndex=i,d3e(e[0],n.volumeId,r[i])}function XG(t,e){const{majorAxis:r,minorAxis:n,label:i="",sliceIndex:o}=t,[a,s]=r,[c,l]=n,f=[a,s,c,l];return{highlighted:!0,invalidated:!0,metadata:{toolName:"Bidirectional",...e.getViewReference({sliceIndex:o})},data:{handles:{points:f,textBox:{hasMoved:!1,worldPosition:[0,0,0],worldBoundingBox:{topLeft:[0,0,0],topRight:[0,0,0],bottomLeft:[0,0,0],bottomRight:[0,0,0]}},activeHandleIndex:null},label:i,cachedStats:{}},isLocked:!1,isVisible:!0}}const{transformWorldToIndex:z2}=Vn,P0=class P0 extends pr{constructor(e={},r={supportedInteractionTypes:["Mouse","Touch"],configuration:{preventHandleOutsideImage:!1,getTextLines:g3e}}){super(e,r),this.isPointNearTool=(n,i,o,a)=>{const s=Se(n),{viewport:c}=s,{data:l}=i,{points:f}=l.handles;let u=c.worldToCanvas(f[0]),d=c.worldToCanvas(f[1]),h={start:{x:u[0],y:u[1]},end:{x:d[0],y:d[1]}},g=Di([h.start.x,h.start.y],[h.end.x,h.end.y],[o[0],o[1]]);return g<=a||(u=c.worldToCanvas(f[2]),d=c.worldToCanvas(f[3]),h={start:{x:u[0],y:u[1]},end:{x:d[0],y:d[1]}},g=Di([h.start.x,h.start.y],[h.end.x,h.end.y],[o[0],o[1]]),g<=a)},this.toolSelectedCallback=(n,i)=>{const o=n.detail,{element:a}=o;i.highlighted=!0;const s=Ot(a,this.getToolName());this.editData={annotation:i,viewportIdsToRender:s,movingTextBox:!1},this._activateModify(a);const c=Se(a),{renderingEngine:l}=c;Ne(s),Ft(a),n.preventDefault()},this.handleSelectedCallback=(n,i,o)=>{const a=n.detail,{element:s}=a,c=i.data;i.highlighted=!0;let l=!1,f;o.worldPosition?l=!0:f=c.handles.points.findIndex(g=>g===o);const u=Ot(s,this.getToolName());Ft(s),this.editData={annotation:i,viewportIdsToRender:u,handleIndex:f,movingTextBox:l},this._activateModify(s);const d=Se(s),{renderingEngine:h}=d;Ne(u),n.preventDefault()},this._endCallback=n=>{const i=n.detail,{element:o}=i,{annotation:a,viewportIdsToRender:s,newAnnotation:c,hasMoved:l}=this.editData,{data:f}=a;if(c&&!l)return;this.doneEditMemo(),f.handles.activeHandleIndex=null,this._deactivateModify(o),this._deactivateDraw(o),Xt(o);const{renderingEngine:u}=Se(o);if(this.editData.handleIndex!==void 0){const{points:d}=f.handles,h=no(d[0],d[1]);if(no(d[2],d[3])>h){const p=[[...d[2]],[...d[3]]],v=[...d[0]],y=[...d[1]],m=nn();vs(m,p[1][0]-p[0][0],p[1][1]-p[1][0]);const w=nn();vs(w,-m[1],m[0]);const x=nn();vs(x,y[0]-v[0],y[1]-v[0]);let C;i4(x,w)>0?C=[v,y]:C=[y,v],f.handles.points=[p[0],p[1],C[0],C[1]]}}this.isHandleOutsideImage&&this.configuration.preventHandleOutsideImage&&yn(a.annotationUID),Ne(s),c&&jn(a),this.editData=null,this.isDrawing=!1},this._dragDrawCallback=n=>{this.isDrawing=!0;const i=n.detail,{currentPoints:o,element:a}=i,s=Se(a),{viewport:c}=s,{worldToCanvas:l}=c,{annotation:f,viewportIdsToRender:u,handleIndex:d,newAnnotation:h}=this.editData;this.createMemo(a,f,{newAnnotation:h});const{data:g}=f,p=o.world;g.handles.points[d]=[...p];const v=g.handles.points.map(l),y={longLineSegment:{start:{x:v[0][0],y:v[0][1]},end:{x:v[1][0],y:v[1][1]}},shortLineSegment:{start:{x:v[2][0],y:v[2][1]},end:{x:v[3][0],y:v[3][1]}}},w=Ir(v[0],v[1])/3,x=y.longLineSegment.start.x-y.longLineSegment.end.x,C=y.longLineSegment.start.y-y.longLineSegment.end.y,S=Math.sqrt(x*x+C*C),T=x/S,_=C/S,E=(y.longLineSegment.start.x+y.longLineSegment.end.x)/2,b=(y.longLineSegment.start.y+y.longLineSegment.end.y)/2,D=E+w*_,I=b-w*T,P=E-w*_,O=b+w*T;g.handles.points[2]=c.canvasToWorld([D,I]),g.handles.points[3]=c.canvasToWorld([P,O]),f.invalidated=!0,Ne(u),cn(f,a,Zt.HandlesUpdated),this.editData.hasMoved=!0},this._dragModifyCallback=n=>{this.isDrawing=!0;const i=n.detail,{element:o}=i,{annotation:a,viewportIdsToRender:s,handleIndex:c,movingTextBox:l,newAnnotation:f}=this.editData;this.createMemo(o,a,{newAnnotation:f});const{data:u}=a;if(l){const{deltaPoints:d}=i,h=d.world,{textBox:g}=u.handles,{worldPosition:p}=g;p[0]+=h[0],p[1]+=h[1],p[2]+=h[2],g.hasMoved=!0}else if(c===void 0){const{deltaPoints:d}=i,h=d.world;u.handles.points.forEach(p=>{p[0]+=h[0],p[1]+=h[1],p[2]+=h[2]}),a.invalidated=!0}else this._dragModifyHandle(n),a.invalidated=!0;Ne(s),a.invalidated&&cn(a,o,Zt.HandlesUpdated)},this._dragModifyHandle=n=>{const i=n.detail,{currentPoints:o,element:a}=i,s=Se(a),{viewport:c}=s,{annotation:l,handleIndex:f}=this.editData,{data:u}=l,d=o.world,h=[c.worldToCanvas(u.handles.points[0]),c.worldToCanvas(u.handles.points[1]),c.worldToCanvas(u.handles.points[2]),c.worldToCanvas(u.handles.points[3])],g={start:{x:h[0][0],y:h[0][1]},end:{x:h[1][0],y:h[1][1]}},p={start:{x:h[2][0],y:h[2][1]},end:{x:h[3][0],y:h[3][1]}},v=[...d],y=c.worldToCanvas(v);if(f===0||f===1){const w=h[f===0?1:0],x=vs(nn(),y[0]-w[0],y[1]-w[1]),C=vs(nn(),h[f][0]-w[0],h[f][1]-w[1]);Tl(x,x),Tl(C,C);const S={start:{x:w[0],y:w[1]},end:{x:y[0],y:y[1]}};if(this._movingLongAxisWouldPutItThroughShortAxis(S,p))return;const T=w,_=this._getSignedAngle(C,x);let E=h[2][0],b=h[2][1],D=h[3][0],I=h[3][1];E-=T[0],b-=T[1],D-=T[0],I-=T[1];const P=E*Math.cos(_)-b*Math.sin(_),O=E*Math.sin(_)+b*Math.cos(_),A=D*Math.cos(_)-I*Math.sin(_),V=D*Math.sin(_)+I*Math.cos(_);E=P+T[0],b=O+T[1],D=A+T[0],I=V+T[1];const G=c.canvasToWorld([E,b]),R=c.canvasToWorld([D,I]);u.handles.points[f]=v,u.handles.points[2]=G,u.handles.points[3]=R}else{const m=f===2?3:2,w={longLineSegment:{start:g.start,end:g.end},shortLineSegment:{start:p.start,end:p.end}},x=ai(nn(),[w.longLineSegment.end.x,w.longLineSegment.end.y],[w.longLineSegment.start.x,w.longLineSegment.start.y]),C=Tl(nn(),x),S=ai(nn(),[y[0],y[1]],[h[f][0],h[f][1]]),T=wy(S),_=this._getSignedAngle(C,S),E=Math.cos(_)*T,b=UY(nn(),[h[m][0],h[m][1]],C,E);if(this._movingLongAxisWouldPutItThroughShortAxis({start:{x:y[0],y:y[1]},end:{x:b[0],y:b[1]}},{start:{x:w.longLineSegment.start.x,y:w.longLineSegment.start.y},end:{x:w.longLineSegment.end.x,y:w.longLineSegment.end.y}})||!a5([y[0],y[1]],[b[0],b[1]],[g.start.x,g.start.y],[g.end.x,g.end.y]))return;u.handles.points[m]=c.canvasToWorld(b),u.handles.points[f]=v}},this.cancel=n=>{if(this.isDrawing){this.isDrawing=!1,this._deactivateDraw(n),this._deactivateModify(n),Xt(n);const{annotation:i,viewportIdsToRender:o,newAnnotation:a}=this.editData,{data:s}=i;return i.highlighted=!1,s.handles.activeHandleIndex=null,Ne(o),a&&jn(i),this.editData=null,i.annotationUID}},this._activateDraw=n=>{He.isInteractingWithTool=!0,n.addEventListener(k.MOUSE_UP,this._endCallback),n.addEventListener(k.MOUSE_DRAG,this._dragDrawCallback),n.addEventListener(k.MOUSE_MOVE,this._dragDrawCallback),n.addEventListener(k.MOUSE_CLICK,this._endCallback),n.addEventListener(k.TOUCH_TAP,this._endCallback),n.addEventListener(k.TOUCH_END,this._endCallback),n.addEventListener(k.TOUCH_DRAG,this._dragDrawCallback)},this._deactivateDraw=n=>{He.isInteractingWithTool=!1,n.removeEventListener(k.MOUSE_UP,this._endCallback),n.removeEventListener(k.MOUSE_DRAG,this._dragDrawCallback),n.removeEventListener(k.MOUSE_MOVE,this._dragDrawCallback),n.removeEventListener(k.MOUSE_CLICK,this._endCallback),n.removeEventListener(k.TOUCH_TAP,this._endCallback),n.removeEventListener(k.TOUCH_END,this._endCallback),n.removeEventListener(k.TOUCH_DRAG,this._dragDrawCallback)},this._activateModify=n=>{He.isInteractingWithTool=!0,n.addEventListener(k.MOUSE_UP,this._endCallback),n.addEventListener(k.MOUSE_DRAG,this._dragModifyCallback),n.addEventListener(k.MOUSE_CLICK,this._endCallback),n.addEventListener(k.TOUCH_END,this._endCallback),n.addEventListener(k.TOUCH_DRAG,this._dragModifyCallback),n.addEventListener(k.TOUCH_TAP,this._endCallback)},this._deactivateModify=n=>{He.isInteractingWithTool=!1,n.removeEventListener(k.MOUSE_UP,this._endCallback),n.removeEventListener(k.MOUSE_DRAG,this._dragModifyCallback),n.removeEventListener(k.MOUSE_CLICK,this._endCallback),n.removeEventListener(k.TOUCH_END,this._endCallback),n.removeEventListener(k.TOUCH_DRAG,this._dragModifyCallback),n.removeEventListener(k.TOUCH_TAP,this._endCallback)},this.renderAnnotation=(n,i)=>{let o=!0;const{viewport:a}=n,{element:s}=a;let c=pn(this.getToolName(),s);if(!(c!=null&&c.length)||(c=this.filterInteractableAnnotationsForElement(s,c),!(c!=null&&c.length)))return o;const l=this.getTargetId(a),f=a.getRenderingEngine(),u={toolGroupId:this.toolGroupId,toolName:this.getToolName(),viewportId:n.viewport.id};for(let d=0;da.worldToCanvas(X));u.annotationUID=g;const{color:w,lineWidth:x,lineDash:C,shadow:S}=this.getAnnotationStyle({annotation:h,styleSpecifier:u});if(!p.cachedStats[l]||p.cachedStats[l].unit==null?(p.cachedStats[l]={length:null,width:null,unit:null},this._calculateCachedStats(h,f,n)):h.invalidated&&this._throttledCalculateCachedStats(h,f,n),!a.getRenderingEngine())return console.warn("Rendering Engine has been destroyed"),o;let T;if(!ii(g))continue;!mi(g)&&!this.editData&&y!==null&&(T=[m[y]]),T&&ur(i,g,"0",T,{color:w});const _=`${g}-line-1`,E=`${g}-line-2`;Tn(i,g,"0",m[0],m[1],{color:w,lineDash:C,lineWidth:x,shadow:S},_),Tn(i,g,"1",m[2],m[3],{color:w,lineDash:C,lineWidth:x,shadow:S},E),o=!0;const I=this.getLinkedTextBoxStyle(u,h);if(!I.visibility){p.handles.textBox={hasMoved:!1,worldPosition:[0,0,0],worldBoundingBox:{topLeft:[0,0,0],topRight:[0,0,0],bottomLeft:[0,0,0],bottomRight:[0,0,0]}};continue}const P=this.configuration.getTextLines(p,l);if(!P||P.length===0)continue;let O;p.handles.textBox.hasMoved||(O=Aa(m),p.handles.textBox.worldPosition=a.canvasToWorld(O));const A=a.worldToCanvas(p.handles.textBox.worldPosition),G=uo(i,g,"1",P,A,m,{},I),{x:R,y:N,width:F,height:j}=G;p.handles.textBox.worldBoundingBox={topLeft:a.canvasToWorld([R,N]),topRight:a.canvasToWorld([R+F,N]),bottomLeft:a.canvasToWorld([R,N+j]),bottomRight:a.canvasToWorld([R+F,N+j])}}return o},this._movingLongAxisWouldPutItThroughShortAxis=(n,i)=>{const o=nn();vs(o,i.end.x-i.start.x,i.end.y-i.start.y),Tl(o,o);const a={start:{x:i.start.x-o[0]*10,y:i.start.y-o[1]*10},end:{x:i.end.x+o[0]*10,y:i.end.y+o[1]*10}};return!a5([a.start.x,a.start.y],[a.end.x,a.end.y],[n.start.x,n.start.y],[n.end.x,n.end.y])},this._calculateCachedStats=(n,i,o)=>{const{data:a}=n,{element:s}=o.viewport,c=a.handles.points[0],l=a.handles.points[1],f=a.handles.points[2],u=a.handles.points[3],{cachedStats:d}=a,h=Object.keys(d);for(let p=0;pA?O:A,G=O>A?A:O,R=O>A?D:P,N=O>A?P:D;this._isInsideVolume(x,C,S,T,w)?this.isHandleOutsideImage=!1:this.isHandleOutsideImage=!0,d[v]={length:V,width:G,unit:R,widthUnit:N}}const g=n.invalidated;return n.invalidated=!1,g&&cn(n,s,Zt.StatsUpdated),d},this._isInsideVolume=(n,i,o,a,s)=>xr(n,s)&&xr(i,s)&&xr(o,s)&&xr(a,s),this._getSignedAngle=(n,i)=>Math.atan2(n[0]*i[1]-n[1]*i[0],n[0]*i[0]+n[1]*i[1]),this._throttledCalculateCachedStats=qo(this._calculateCachedStats,100,{trailing:!0})}addNewAnnotation(e){const r=e.detail,{currentPoints:n,element:i}=r,o=n.world,a=Se(i),{viewport:s,renderingEngine:c}=a;this.isDrawing=!0;const l=s.getCamera(),{viewPlaneNormal:f,viewUp:u}=l,d=this.getReferencedImageId(s,o,f,u),h=s.getFrameOfReferenceUID(),g={highlighted:!0,invalidated:!0,metadata:{toolName:this.getToolName(),viewPlaneNormal:[...f],viewUp:[...u],FrameOfReferenceUID:h,referencedImageId:d,...s.getViewReference({points:[o]})},data:{handles:{points:[[...o],[...o],[...o],[...o]],textBox:{hasMoved:!1,worldPosition:[0,0,0],worldBoundingBox:{topLeft:[0,0,0],topRight:[0,0,0],bottomLeft:[0,0,0],bottomRight:[0,0,0]}},activeHandleIndex:null},label:"",cachedStats:{}}};ln(g,i);const p=Ot(i,this.getToolName());return this.editData={annotation:g,viewportIdsToRender:p,handleIndex:1,movingTextBox:!1,newAnnotation:!0,hasMoved:!1},this._activateDraw(i),Ft(i),e.preventDefault(),Ne(p),g}_calculateLength(e,r){const n=e[0]-r[0],i=e[1]-r[1],o=e[2]-r[2];return Math.sqrt(n*n+i*i+o*o)}};P0.toolName="Bidirectional",P0.hydrate=(e,r,n)=>{const i=qn(e);if(!i)return;const{FrameOfReferenceUID:o,referencedImageId:a,viewPlaneNormal:s,instance:c,viewport:l}=P0.hydrateBase(P0,i,r[0],n),[f,u]=r,[d,h]=f,[g,p]=u,v=[d,h,g,p],{toolInstance:y,...m}=n||{},w={annotationUID:(n==null?void 0:n.annotationUID)||kn(),data:{handles:{points:v,activeHandleIndex:null,textBox:{hasMoved:!1,worldPosition:[0,0,0],worldBoundingBox:{topLeft:[0,0,0],topRight:[0,0,0],bottomLeft:[0,0,0],bottomRight:[0,0,0]}}},cachedStats:{}},highlighted:!1,autoGenerated:!1,invalidated:!1,isLocked:!1,isVisible:!0,metadata:{toolName:c.getToolName(),viewPlaneNormal:s,FrameOfReferenceUID:o,referencedImageId:a,...m}};return ln(w,l.element),Ne([l.id]),w};let L1=P0;function g3e(t,e){const{cachedStats:r,label:n}=t,{length:i,width:o,unit:a}=r[e],s=[];return n&&s.push(n),i===void 0||s.push(`L: ${dn(i)} ${a||a}`,`W: ${dn(o)} ${a}`),s}async function p3e(t,e){console.warn("Deprecation Alert: There is a new getSegmentLargestBidirectional function that handles volume, stack and individual segment cases properly. This function is deprecated and will be removed in a future version.");const{data:r}=e,n=Se(t),i=(r.getSegment||m3e)(n,r);if(!i)return;const o=n.viewport.getFrameOfReferenceUID(),a=Kw(),{segmentIndex:s,segmentationId:c}=i,l=Zr.getAnnotations(this.toolName||L1.toolName,o);let f=!1;const u=l.filter(h=>{const g=h.data.segment;return g?(g.segmentationId===c&&g.segmentIndex===s&&(f=!0,h.data.segment=g),!0):!1});f||u.push({data:{segment:i}});let d;if(u.forEach(async h=>{const g=[],p=h.data.segment,{segmentIndex:v,segmentationId:y}=p;g[v]=p,Zr.removeAnnotation(h.annotationUID);const m=await qG({...a.find(C=>C.segmentationId===y),segments:g});if(!m)return;const w=XG(m,n.viewport);w.annotationUID=h.annotationUID,w.data.segment=p;const x=Zr.addAnnotation(w,o);if(p.segmentIndex===i.segmentIndex&&p.segmentationId===i.segmentationId){d=m;const{style:C}=i;C&&_E.setAnnotationStyles(x,C)}}),d){const{sliceIndex:h}=d,g=n.viewport.getImageIds();hs(t,{imageIndex:g.length-1-h}),n.viewport.render()}else console.warn("No bidirectional found");return d}function m3e(t,e){var a;const r=Kw();if(!r.length)return;const n=e.segmentationId||r[0].segmentationId,i=e.segmentIndex??Ra(n);if(!i)return;const o=(a=e.segmentData)==null?void 0:a.get(i);return{label:`Segment ${i}`,segmentIndex:i,segmentationId:n,...o}}function YG(t){const e=fi(t);if(e===void 0)return;rg(t).forEach(a=>{a.invalidateBrushCursor()});const n=e.getViewportsInfo();if(!Object.keys(n).map(a=>n[a]).length)return;const o=e.getViewportIds();Ne(o)}function _8(t,e,r={}){const n=zn(t),i=n.representationData,o=(r==null?void 0:r.representationType)??Object.keys(i)[0];if(!o)throw new Error(`Segmentation ${t} does not have any representations`);switch(o){case Lt.Labelmap:return v3e(n,e,r);case Lt.Contour:return y3e(n,e,r);default:return}}function v3e(t,e,{viewport:r}){const n=t.representationData.Labelmap;if(r instanceof Or){const{volumeId:h}=n,g=Fe.getVolume(h);return g?g.imageData.getScalarValueFromWorld(e):void 0}const i=Wl(r.id,t.segmentationId);if(i.length>1){console.warn("Segment selection for labelmaps with multiple imageIds in stack viewports is not supported yet.");return}const o=i[0];if(!Fe.getImage(o))return;const s=Pw(r.id,t.segmentationId),c=s==null?void 0:s.actor.getMapper().getInputData(),l=ei(c,e),f=c.getDimensions();return(c.voxelManager||oc.createScalarVolumeVoxelManager({dimensions:f,scalarData:c.getPointData().getScalars().getData()})).getAtIJKPoint(l)}function y3e(t,e,{viewport:r}){const n=t.representationData.Contour,i=Array.from(n.annotationUIDsMap.keys()),{viewPlaneNormal:o}=r.getCamera();for(const a of i){const s=n.annotationUIDsMap.get(a);if(s)for(const c of s){const l=ri(c);if(!l)continue;const{polyline:f}=l.data.contour;if(Yt(o,l.metadata.viewPlaneNormal)&&XE(e,f))return Number(a)}}}function JG(t,e,{viewport:r,searchRadius:n}){const o=zn(t).representationData.Labelmap;if(r instanceof Or){const{volumeId:p}=o,v=Fe.getVolume(p);if(!v)return;const y=v.voxelManager,m=v.imageData,w=ei(m,e),x=y.getAtIJK(w[0],w[1],w[2]),C=r.worldToCanvas(e);return x3e(C,x,r,m,n)?x:void 0}const a=mf(r.id,t);if(!Fe.getImage(a))return;const c=Pw(r.id,t),l=c==null?void 0:c.actor.getMapper().getInputData(),f=ei(l,e),u=l.getDimensions(),d=l.voxelManager||oc.createScalarVolumeVoxelManager({dimensions:u,scalarData:l.getPointData().getScalars().getData()}),h=d.getAtIJKPoint(f);return w3e(f,u,d,h)?h:void 0}function ZG(t,e,r=1){const n=Array.from({length:2*r+1},(i,o)=>o-r);for(const i of n)for(const o of n)for(const a of n){if(i===0&&o===0&&a===0)continue;const s=t(i,o,a);if(s!==void 0&&e!==s)return!0}return!1}function w3e(t,e,r,n,i){return ZG((a,s,c)=>{const l=[t[0]+a,t[1]+s,t[2]+c];return r.getAtIJK(l[0],l[1],l[2])},n,i)}function x3e(t,e,r,n,i){return ZG((a,s)=>{const c=[t[0]+a,t[1]+s],l=r.canvasToWorld(c),f=n.get("voxelManager").voxelManager,u=ei(n,l);return f.getAtIJK(u[0],u[1],u[2])},e,i)}function QG(t){const e=zn(t),{annotationUIDsMap:r}=e.representationData.Contour;for(const[n,i]of r.entries())if(Array.from(i).find(a=>ri(a).highlighted))return n}const C3e=` + have one tool group per viewport in a renderingEngine.`);return r[0]}}function rpe(){return He.toolGroups}const ipe=[$n.Active,$n.Passive,$n.Enabled];function dF(t){return He.toolGroups.filter(({toolOptions:e})=>{const r=Object.keys(e);for(let n=0;n{a.viewportsInfo.forEach(s=>{const{renderingEngineId:c,viewportId:l}=s,{FrameOfReferenceUID:f}=Ii(l,c);t.metadata.FrameOfReferenceUID===f&&n.push(s)})});const i=k.ANNOTATION_ADDED,o={annotation:t};if(!n.length){it(Je,i,o);return}n.forEach(({renderingEngineId:a,viewportId:s})=>{o.viewportId=s,o.renderingEngineId=a,it(Je,i,o)})}function _w(t){const e=k.ANNOTATION_REMOVED;it(Je,e,t)}function cn(t,e,r=Zt.HandlesUpdated){const n=e&&Se(e),{viewportId:i,renderingEngineId:o}=n||{},a=k.ANNOTATION_MODIFIED;it(Je,a,{annotation:t,viewportId:i,renderingEngineId:o,changeType:r})}function jn(t){mF({annotation:t})}function Ew(t,e=!1){mF({annotation:t,contourHoleProcessingEnabled:e})}function mF(t){const e=k.ANNOTATION_COMPLETED;it(Je,e,t)}const ope=Object.freeze(Object.defineProperty({__proto__:null,triggerAnnotationAddedForElement:gF,triggerAnnotationAddedForFOR:pF,triggerAnnotationCompleted:jn,triggerAnnotationModified:cn,triggerAnnotationRemoved:_w,triggerContourAnnotationCompleted:Ew},Symbol.toStringTag,{value:"Module"}));let vF;function uc(){return vF}function bE(t){vF=t}function pn(t,e){const r=uc(),n=r.getGroupKey(e);return r.getAnnotations(n,t)}function ri(t){return uc().getAnnotation(t)}function gm(){return uc().getAllAnnotations()}function bw(t){const{annotationUID:e,parentAnnotationUID:r}=t;if(!r)return;const n=ri(r),i=n.childAnnotationUIDs.indexOf(e);n.childAnnotationUIDs.splice(i,1),t.parentAnnotationUID=void 0}function pm(t,e){const{annotationUID:r}=t,{annotationUID:n}=e;bw(e),t.childAnnotationUIDs||(t.childAnnotationUIDs=[]),!t.childAnnotationUIDs.includes(n)&&(t.childAnnotationUIDs.push(n),e.parentAnnotationUID=r)}function yF(t){return t.parentAnnotationUID?ri(t.parentAnnotationUID):void 0}function mm(t){var e;return((e=t.childAnnotationUIDs)==null?void 0:e.map(r=>ri(r)))??[]}function ln(t,e){t.annotationUID||(t.annotationUID=kn());const r=uc();if(e instanceof HTMLDivElement){const n=r.getGroupKey(e);r.addAnnotation(t,n),gF(t,e)}else r.addAnnotation(t,void 0),pF(t);return t.annotationUID}function ape(t,e){const r=uc(),n=r.getGroupKey(e);return r.getNumberOfAnnotations(n,t)}function yn(t){var n;if(!t)return;const e=uc(),r=e.getAnnotation(t);r&&((n=r.childAnnotationUIDs)==null||n.forEach(i=>yn(i)),e.removeAnnotation(t),_w({annotation:r,annotationManagerUID:e.uid}))}function spe(){const t=uc(),e=t.removeAllAnnotations();for(const r of e)_w({annotation:r,annotationManagerUID:t.uid})}function cpe(t,e){const r=uc(),n=r.getGroupKey(e),i=r.removeAnnotations(n,t);for(const o of i)_w({annotation:o,annotationManagerUID:r.uid})}function wF(t){let e=t;for(;e;)e.invalidated=!0,e=e.parentAnnotationUID?ri(e.parentAnnotationUID):void 0}const lpe=Object.freeze(Object.defineProperty({__proto__:null,addAnnotation:ln,addChildAnnotation:pm,clearParentAnnotation:bw,getAllAnnotations:gm,getAnnotation:ri,getAnnotationManager:uc,getAnnotations:pn,getChildAnnotations:mm,getNumberOfAnnotations:ape,getParentAnnotation:yF,invalidateAnnotation:wF,removeAllAnnotations:spe,removeAnnotation:yn,removeAnnotations:cpe,setAnnotationManager:bE},Symbol.toStringTag,{value:"Module"}));function Ui(t){const e=t.toolName;if(!e)throw new Error(`No Tool Found for the ToolClass ${t.name}`);He.tools[e]||(He.tools[e]={toolClass:t})}function upe(t){const e=t.toolName;return!!(e&&He.tools[e])}function Dw(t){return!!(t&&He.tools[t])}function xF(t){const e=t.toolName;if(!e)throw new Error(`No tool found for: ${t.name}`);if(!He.tools[e]!==void 0)delete He.tools[e];else throw new Error(`${e} cannot be removed because it has not been added`)}function Bd(t,e){const r=e||t.currentTarget,{viewport:n}=Se(r)||{};if(!n)return;const i=hpe(t),o=dpe(t),a=fpe(r,o),s=n.canvasToWorld(a);return{page:o,client:i,canvas:a,world:s}}function fpe(t,e){const r=t.getBoundingClientRect();return[e[0]-r.left-window.pageXOffset,e[1]-r.top-window.pageYOffset]}function dpe(t){return[t.pageX,t.pageY]}function hpe(t){return[t.clientX,t.clientY]}function CF(t){const e=t.currentTarget,{viewportId:r,renderingEngineId:n}=Se(e),i=Bd(t,e),o={page:[0,0],client:[0,0],canvas:[0,0],world:[0,0,0]},a={event:t,eventName:k.MOUSE_DOUBLE_CLICK,viewportId:r,renderingEngineId:n,camera:{},element:e,startPoints:i,lastPoints:i,currentPoints:i,deltaPoints:o};!it(e,k.MOUSE_DOUBLE_CLICK,a)&&(t.stopImmediatePropagation(),t.preventDefault())}const Y9=k.MOUSE_MOVE;function vm(t){const e=t.currentTarget,r=Se(e);if(!r)return;const{renderingEngineId:n,viewportId:i}=r,o=Bd(t);!it(e,Y9,{renderingEngineId:n,viewportId:i,camera:{},element:e,currentPoints:o,eventName:Y9,event:t})&&(t.stopImmediatePropagation(),t.preventDefault())}const{MOUSE_DOWN:J9,MOUSE_DOWN_ACTIVATE:gpe,MOUSE_CLICK:ppe,MOUSE_UP:mpe,MOUSE_DRAG:Z9}=k,vpe=400,ype=150,wpe=3,xpe={mouseButton:void 0,element:null,renderingEngineId:void 0,viewportId:void 0,isClickEvent:!0,clickDelay:200,preventClickTimeout:null,startPoints:{page:[0,0],client:[0,0],canvas:[0,0],world:[0,0,0]},lastPoints:{page:[0,0],client:[0,0],canvas:[0,0],world:[0,0,0]}};let on={mouseButton:void 0,renderingEngineId:void 0,viewportId:void 0,isClickEvent:!0,clickDelay:200,element:null,preventClickTimeout:null,startPoints:{page:[0,0],client:[0,0],canvas:[0,0],world:[0,0,0]},lastPoints:{page:[0,0],client:[0,0],canvas:[0,0],world:[0,0,0]}};const Bi={doubleClickTimeout:null,mouseDownEvent:null,mouseUpEvent:null,ignoreDoubleClick:!1};function SF(t){if(Bi.doubleClickTimeout){if(t.buttons===Bi.mouseDownEvent.buttons)return;Bi.mouseDownEvent=t,Zy();return}Bi.doubleClickTimeout=setTimeout(Zy,t.buttons===1?vpe:ype),Bi.mouseDownEvent=t,Bi.ignoreDoubleClick=!1,on.element=t.currentTarget,on.mouseButton=t.buttons;const e=Se(on.element),{renderingEngineId:r,viewportId:n}=e;on.renderingEngineId=r,on.viewportId=n,on.preventClickTimeout=setTimeout(Spe,on.clickDelay),on.element.removeEventListener("mousemove",vm);const i=Bd(t,on.element);on.startPoints=zu(i),on.lastPoints=zu(i),document.addEventListener("mouseup",DE),document.addEventListener("mousemove",TF)}function Cpe(t){const e=Iw(on.startPoints,on.startPoints),r={event:t,eventName:J9,element:on.element,mouseButton:on.mouseButton,renderingEngineId:on.renderingEngineId,viewportId:on.viewportId,camera:{},startPoints:on.startPoints,lastPoints:on.startPoints,currentPoints:on.startPoints,deltaPoints:e};on.lastPoints=zu(r.lastPoints),it(r.element,J9,r)&&it(r.element,gpe,r)}function TF(t){const e=Se(on.element);if(!(e!=null&&e.viewport))return;const r=Bd(t,on.element),n=DF(on.element,on.lastPoints),i=Iw(r,n);if(Bi.doubleClickTimeout)if(EF(i.canvas))Zy();else return;const o={event:t,eventName:Z9,mouseButton:on.mouseButton,renderingEngineId:on.renderingEngineId,viewportId:on.viewportId,camera:{},element:on.element,startPoints:zu(on.startPoints),lastPoints:zu(n),currentPoints:r,deltaPoints:i};!it(on.element,Z9,o)&&(t.stopImmediatePropagation(),t.preventDefault()),on.lastPoints=zu(r)}function DE(t){if(clearTimeout(on.preventClickTimeout),Bi.doubleClickTimeout)Bi.mouseUpEvent?kS():(Bi.mouseUpEvent=t,on.element.addEventListener("mousemove",_F));else{const e=on.isClickEvent?ppe:mpe,r=Bd(t,on.element),n=Iw(r,on.lastPoints),i={event:t,eventName:e,mouseButton:on.mouseButton,element:on.element,renderingEngineId:on.renderingEngineId,viewportId:on.viewportId,camera:{},startPoints:zu(on.startPoints),lastPoints:zu(on.lastPoints),currentPoints:r,deltaPoints:n};it(i.element,e,i),kS()}document.removeEventListener("mousemove",TF)}function _F(t){const e=Bd(t,on.element),r=DF(on.element,on.lastPoints),n=Iw(e,r);EF(n.canvas)&&(Zy(),vm(t))}function EF(t){return Math.abs(t[0])+Math.abs(t[1])>wpe}function Spe(){on.isClickEvent=!1}function Zy(){Bi.ignoreDoubleClick=!0;const t=Bi.mouseDownEvent,e=Bi.mouseUpEvent;bF(),Cpe(t),e&&DE(e)}function bF(){Bi.doubleClickTimeout&&(clearTimeout(Bi.doubleClickTimeout),Bi.doubleClickTimeout=null),Bi.mouseDownEvent=null,Bi.mouseUpEvent=null}function kS(){var t,e;document.removeEventListener("mouseup",DE),(t=on.element)==null||t.removeEventListener("mousemove",_F),(e=on.element)==null||e.addEventListener("mousemove",vm),bF(),on=JSON.parse(JSON.stringify(xpe))}function zu(t){return JSON.parse(JSON.stringify(t))}function DF(t,e){const{viewport:r}=Se(t)||{};if(!r)return e;const n=r.canvasToWorld(e.canvas);return{page:e.page,client:e.client,canvas:e.canvas,world:n}}function Iw(t,e){return!t||!e?{page:[0,0],client:[0,0],canvas:[0,0],world:[0,0,0]}:{page:C3(t.page,e.page),client:C3(t.client,e.client),canvas:C3(t.canvas,e.canvas),world:Tpe(t.world,e.world)}}function C3(t,e){return[t[0]-e[0],t[1]-e[1]]}function Tpe(t,e){return[t[0]-e[0],t[1]-e[1],t[2]-e[2]]}function _pe(){return on.mouseButton}function IF(t){Bi.ignoreDoubleClick?(Bi.ignoreDoubleClick=!1,t.stopImmediatePropagation(),t.preventDefault()):kS()}function OF(t){t.removeEventListener("dblclick",CF),t.removeEventListener("mousedown",SF),t.removeEventListener("mousemove",vm),t.removeEventListener("dblclick",IF,{capture:!0})}function Epe(t){OF(t),t.addEventListener("dblclick",CF),t.addEventListener("mousedown",SF),t.addEventListener("mousemove",vm),t.addEventListener("dblclick",IF,{capture:!0})}const MF={enable:Epe,disable:OF},bpe=2e3,Eh={mouse:0,touch:1};let Q9,eI;function PF(t,e){const r=Date.now();if(t!==Q9){if(r-eI<=bpe)return e.preventDefault(),e.stopPropagation(),e.stopImmediatePropagation(),!1;Q9=t}eI=r}const RF=PF.bind(null,Eh.mouse),LF=PF.bind(null,Eh.touch);function tI(t,e,r){const n=r?RF:LF;e.forEach(function(i){t.addEventListener(i,n,{passive:!1})})}function nI(t,e,r){const n=r?RF:LF;e.forEach(function(i){t.removeEventListener(i,n)})}const AF=["mousedown","mouseup","mousemove"],NF=["touchstart","touchend"];function kF(t){nI(t,AF,Eh.mouse),nI(t,NF,Eh.touch)}function Dpe(t){kF(t),tI(t,AF,Eh.mouse),tI(t,NF,Eh.touch)}const VF={enable:Dpe,disable:kF};function Ow(t,e){const r=e||t.currentTarget,n=t.type==="touchend"?t.changedTouches:t.touches;return Object.keys(n).map(i=>{const o=Mpe(n[i]),a=Ope(n[i]),s=Ipe(r,a),{viewport:c}=Se(r),l=c.canvasToWorld(s);return{page:a,client:o,canvas:s,world:l,touch:{identifier:i,radiusX:n[i].radiusX,radiusY:n[i].radiusY,force:n[i].force,rotationAngle:n[i].rotationAngle}}})}function Ipe(t,e){const r=t.getBoundingClientRect();return[e[0]-r.left-window.pageXOffset,e[1]-r.top-window.pageYOffset]}function Ope(t){return[t.pageX,t.pageY]}function Mpe(t){return[t.clientX,t.clientY]}function Qy(t,e){const r=D1(t),n=D1(e);return{page:S3(r.page,n.page),client:S3(r.client,n.client),canvas:S3(r.canvas,n.canvas),world:Rpe(r.world,n.world)}}function IE(t,e){const r=D1(t),n=D1(e);return{page:eh(r.page,n.page),client:eh(r.client,n.client),canvas:eh(r.canvas,n.canvas),world:FF(r.world,n.world)}}function Ppe(t,e){}function e5(t,e){const r=rI(t),n=rI(e);return{page:r.page-n.page,client:r.client-n.client,canvas:r.canvas-n.canvas,world:r.world-n.world}}function kc(t){return JSON.parse(JSON.stringify(t))}function VS(t){return JSON.parse(JSON.stringify(t))}function D1(t){return t.reduce((e,r)=>({page:[e.page[0]+r.page[0]/t.length,e.page[1]+r.page[1]/t.length],client:[e.client[0]+r.client[0]/t.length,e.client[1]+r.client[1]/t.length],canvas:[e.canvas[0]+r.canvas[0]/t.length,e.canvas[1]+r.canvas[1]/t.length],world:[e.world[0]+r.world[0]/t.length,e.world[1]+r.world[1]/t.length,e.world[2]+r.world[2]/t.length]}),{page:[0,0],client:[0,0],canvas:[0,0],world:[0,0,0]})}function nc(t){return t.reduce((e,r)=>({page:[e.page[0]+r.page[0]/t.length,e.page[1]+r.page[1]/t.length],client:[e.client[0]+r.client[0]/t.length,e.client[1]+r.client[1]/t.length],canvas:[e.canvas[0]+r.canvas[0]/t.length,e.canvas[1]+r.canvas[1]/t.length],world:[e.world[0]+r.world[0]/t.length,e.world[1]+r.world[1]/t.length,e.world[2]+r.world[2]/t.length],touch:{identifier:null,radiusX:e.touch.radiusX+r.touch.radiusX/t.length,radiusY:e.touch.radiusY+r.touch.radiusY/t.length,force:e.touch.force+r.touch.force/t.length,rotationAngle:e.touch.rotationAngle+r.touch.rotationAngle/t.length}}),{page:[0,0],client:[0,0],canvas:[0,0],world:[0,0,0],touch:{identifier:null,radiusX:0,radiusY:0,force:0,rotationAngle:0}})}function S3(t,e){return[t[0]-e[0],t[1]-e[1]]}function Rpe(t,e){return[t[0]-e[0],t[1]-e[1],t[2]-e[2]]}function rI(t){const e=[];for(let r=0;r({page:r.page+n.page/e.length,client:r.client+n.client/e.length,canvas:r.canvas+n.canvas/e.length,world:r.world+n.world/e.length}),{page:0,client:0,canvas:0,world:0})}function eh(t,e){return Math.sqrt(Math.pow(t[0]-e[0],2)+Math.pow(t[1]-e[1],2))}function FF(t,e){return Math.sqrt(Math.pow(t[0]-e[0],2)+Math.pow(t[1]-e[1],2)+Math.pow(t[2]-e[2],2))}const Lpe=Object.freeze(Object.defineProperty({__proto__:null,copyPoints:VS,copyPointsList:kc,getDeltaDistance:IE,getDeltaDistanceBetweenIPoints:e5,getDeltaPoints:Qy,getDeltaRotation:Ppe,getMeanPoints:D1,getMeanTouchPoints:nc},Symbol.toStringTag,{value:"Module"}));Dr.getRuntimeSettings();const{TOUCH_START:iI,TOUCH_START_ACTIVATE:Ape,TOUCH_PRESS:oI,TOUCH_DRAG:aI,TOUCH_END:sI,TOUCH_TAP:cI,TOUCH_SWIPE:T3}=k,I1={page:[0,0],client:[0,0],canvas:[0,0],world:[0,0,0]},t5={page:0,client:0,canvas:0,world:0},UF={renderingEngineId:void 0,viewportId:void 0,element:null,startPointsList:[{...I1,touch:null}],lastPointsList:[{...I1,touch:null}],isTouchStart:!1,startTime:null,pressTimeout:null,pressDelay:700,pressMaxDistance:5,accumulatedDistance:t5,swipeDistanceThreshold:48,swiped:!1,swipeToleranceMs:300},BF={renderingEngineId:void 0,viewportId:void 0,element:null,startPointsList:[{...I1,touch:null}],taps:0,tapTimeout:null,tapMaxDistance:24,tapToleranceMs:300};let kt=JSON.parse(JSON.stringify(UF)),yi=JSON.parse(JSON.stringify(BF));function Qu(t,e,r){return it(t,e,r)}function GF(t){kt.element=t.currentTarget;const e=Se(kt.element),{renderingEngineId:r,viewportId:n}=e;kt.renderingEngineId=r,kt.viewportId=n,!kt.isTouchStart&&(clearTimeout(kt.pressTimeout),kt.pressTimeout=setTimeout(()=>Npe(t),kt.pressDelay),kpe(t),document.addEventListener("touchmove",WF),document.addEventListener("touchend",zF))}function Npe(t){if(kt.accumulatedDistance.canvas>kt.pressMaxDistance)return;const r={event:t,eventName:oI,renderingEngineId:kt.renderingEngineId,viewportId:kt.viewportId,camera:{},element:kt.element,startPointsList:kc(kt.startPointsList),lastPointsList:kc(kt.lastPointsList),startPoints:VS(nc(kt.startPointsList)),lastPoints:VS(nc(kt.lastPointsList))};Qu(r.element,oI,r)}function kpe(t){kt.isTouchStart=!0,kt.startTime=new Date;const e=Ow(t,kt.element),r=nc(e),n=I1,i=t5,o={event:t,eventName:iI,element:kt.element,renderingEngineId:kt.renderingEngineId,viewportId:kt.viewportId,camera:{},startPointsList:e,lastPointsList:e,currentPointsList:e,startPoints:r,lastPoints:r,currentPoints:r,deltaPoints:n,deltaDistance:i};kt.startPointsList=kc(o.startPointsList),kt.lastPointsList=kc(o.lastPointsList),Qu(o.element,iI,o)&&Qu(o.element,Ape,o)}function WF(t){const e=Ow(t,kt.element),r=$F(kt.element,kt.lastPointsList),n=e.length===r.length?Qy(e,r):I1,i=e.length===r.length?e5(e,r):t5,o=e.length===r.length?IE(e,kt.lastPointsList):t5;kt.accumulatedDistance={page:kt.accumulatedDistance.page+o.page,client:kt.accumulatedDistance.client+o.client,canvas:kt.accumulatedDistance.canvas+o.canvas,world:kt.accumulatedDistance.world+o.world};const a={event:t,eventName:aI,renderingEngineId:kt.renderingEngineId,viewportId:kt.viewportId,camera:{},element:kt.element,startPoints:nc(kt.startPointsList),lastPoints:nc(r),currentPoints:nc(e),startPointsList:kc(kt.startPointsList),lastPointsList:kc(r),currentPointsList:e,deltaPoints:n,deltaDistance:i};Qu(kt.element,aI,a),Fpe(t,n),kt.lastPointsList=kc(e)}function zF(t){clearTimeout(kt.pressTimeout);const e=Ow(t,kt.element),r=$F(kt.element,kt.lastPointsList),n=e.length===r.length?Qy(e,r):Qy(e,e),i=e.length===r.length?e5(e,r):e5(e,e),o={event:t,eventName:sI,element:kt.element,renderingEngineId:kt.renderingEngineId,viewportId:kt.viewportId,camera:{},startPointsList:kc(kt.startPointsList),lastPointsList:kc(r),currentPointsList:e,startPoints:nc(kt.startPointsList),lastPoints:nc(r),currentPoints:nc(e),deltaPoints:n,deltaDistance:i};Qu(o.element,sI,o),Vpe(t),kt=JSON.parse(JSON.stringify(UF)),document.removeEventListener("touchmove",WF),document.removeEventListener("touchend",zF)}function Vpe(t){const e=new Date().getTime(),r=kt.startTime.getTime();if(e-r>yi.tapToleranceMs||(yi.taps===0&&(yi.element=kt.element,yi.renderingEngineId=kt.renderingEngineId,yi.viewportId=kt.viewportId,yi.startPointsList=kt.startPointsList),yi.taps>0&&!(yi.element==kt.element&&yi.renderingEngineId==kt.renderingEngineId&&yi.viewportId==kt.viewportId)))return;const n=Ow(t,yi.element);IE(n,yi.startPointsList).canvas>yi.tapMaxDistance||(clearTimeout(yi.tapTimeout),yi.taps+=1,yi.tapTimeout=setTimeout(()=>{const o={event:t,eventName:cI,element:yi.element,renderingEngineId:yi.renderingEngineId,viewportId:yi.viewportId,camera:{},currentPointsList:n,currentPoints:nc(n),taps:yi.taps};Qu(o.element,cI,o),yi=JSON.parse(JSON.stringify(BF))},yi.tapToleranceMs))}function Fpe(t,e){const r=new Date().getTime(),n=kt.startTime.getTime();if(kt.swiped||r-n>kt.swipeToleranceMs)return;const[i,o]=e.canvas,a={event:t,eventName:T3,renderingEngineId:kt.renderingEngineId,viewportId:kt.viewportId,camera:{},element:kt.element,swipe:null};Math.abs(i)>kt.swipeDistanceThreshold&&(a.swipe=i>0?rd.RIGHT:rd.LEFT,Qu(a.element,T3,a),kt.swiped=!0),Math.abs(o)>kt.swipeDistanceThreshold&&(a.swipe=o>0?rd.DOWN:rd.UP,Qu(a.element,T3,a),kt.swiped=!0)}function $F(t,e){const{viewport:r}=Se(t);return e.map(n=>{const i=r.canvasToWorld(n.canvas);return{page:n.page,client:n.client,canvas:n.canvas,world:i,touch:n.touch}})}function jF(t){VF.disable(t),t.removeEventListener("touchstart",GF)}function Upe(t){jF(t),VF.enable(t),t.addEventListener("touchstart",GF,{passive:!1})}const HF={enable:Upe,disable:jF},lI=10,uI=40,fI=800;function Bpe(t){let e=0,r=0,n=0,i=0;return"detail"in t&&(r=t.detail),"wheelDelta"in t&&(r=-t.wheelDelta/120),"wheelDeltaY"in t&&(r=-t.wheelDeltaY/120),"wheelDeltaX"in t&&(e=-t.wheelDeltaX/120),n=e*lI,i=r*lI,"deltaY"in t&&(i=t.deltaY),"deltaX"in t&&(n=t.deltaX),(n||i)&&t.deltaMode&&(t.deltaMode===1?(n*=uI,i*=uI):(n*=fI,i*=fI)),n&&!e&&(e=n<1?-1:1),i&&!r&&(r=i<1?-1:1),{spinX:e,spinY:r,pixelX:n,pixelY:i}}function KF(t){const e=t.currentTarget,r=Se(e),{renderingEngineId:n,viewportId:i}=r;if(t.deltaY>-1&&t.deltaY<1)return;t.preventDefault();const{spinX:o,spinY:a,pixelX:s,pixelY:c}=Bpe(t),l=a<0?-1:1,f={event:t,eventName:k.MOUSE_WHEEL,renderingEngineId:n,viewportId:i,element:e,camera:{},detail:t,wheel:{spinX:o,spinY:a,pixelX:s,pixelY:c,direction:l},points:Bd(t)};it(e,k.MOUSE_WHEEL,f)}function Gpe(t){qF(t),t.addEventListener("wheel",KF,{passive:!1})}function qF(t){t.removeEventListener("wheel",KF)}const XF={enable:Gpe,disable:qF},Wpe={renderingEngineId:void 0,viewportId:void 0,key:void 0,keyCode:void 0,element:null};let Ei={renderingEngineId:void 0,viewportId:void 0,key:void 0,keyCode:void 0,element:null};function Mw(t){Ei.element=t.currentTarget;const e=Se(Ei.element),{renderingEngineId:r,viewportId:n}=e;Ei.renderingEngineId=r,Ei.viewportId=n,Ei.key=t.key,Ei.keyCode=t.keyCode,t.preventDefault();const i={renderingEngineId:Ei.renderingEngineId,viewportId:Ei.viewportId,element:Ei.element,key:Ei.key,keyCode:Ei.keyCode};it(i.element,k.KEY_DOWN,i),document.addEventListener("keyup",YF),document.addEventListener("visibilitychange",OE),Ei.element.removeEventListener("keydown",Mw)}function OE(){document.removeEventListener("visibilitychange",OE),document.visibilityState==="hidden"&&JF()}function YF(t){const e={renderingEngineId:Ei.renderingEngineId,viewportId:Ei.viewportId,element:Ei.element,key:Ei.key,keyCode:Ei.keyCode};document.removeEventListener("keyup",YF),document.removeEventListener("visibilitychange",OE),Ei.element.addEventListener("keydown",Mw),Ei=structuredClone(Wpe),it(e.element,k.KEY_UP,e)}function zpe(){return Ei.keyCode}function JF(){Ei.keyCode=void 0}function $pe(t){ZF(t),t.addEventListener("keydown",Mw)}function ZF(t){t.removeEventListener("keydown",Mw)}const Kh={enable:$pe,disable:ZF,getModifierKey:zpe},{EPSILON:e0}=df;function QF(t,e,r=!1){var f;let n=1/0,i=r?-1/0:0,o=1/0,a=r?-1/0:0,s=1/0,c=r?-1/0:0;const l=((f=t[0])==null?void 0:f.length)===3;for(let u=0;uJSON.stringify(t)===JSON.stringify(e);function ME(t,e,r,n){const i=r[0]/2,o=r[1]/2,a=r[2]/2,s=new Array(8);s[0]=ei(t,[n[0]-i,n[1]-o,n[2]-a]);const c=[[1,-1,-1],[-1,1,-1],[1,1,-1],[-1,-1,1],[1,-1,1],[-1,1,1],[1,1,1]];for(let l=0;l<7;l++){const[f,u,d]=c[l];s[l+1]=ei(t,[n[0]+f*i,n[1]+u*o,n[2]+d*a])}return ef(s,e)}function tU(t,e){const{spacing:r}=t,n=t.voxelManager.getScalarDataLength(),i=[];let o=0;for(let a=0;a{const e=PE.get(t);e&&(e.isDirty=!0)},Kpe=t=>{const e=PE.get(t);return e&&!e.isDirty?e.indices:null},qpe=(t,e)=>{PE.set(t,{indices:e,isDirty:!1})};function bo(t,e,r){const n={segmentationId:t,modifiedSlicesToUse:e,segmentIndex:r};Hpe(t),it(Je,k.SEGMENTATION_DATA_MODIFIED,n)}function ns(t){const e={segmentationId:t};it(Je,k.SEGMENTATION_MODIFIED,e)}function RE(t){const e={segmentationId:t};it(Je,k.SEGMENTATION_REMOVED,e)}function bc(t,e,r){const n={segmentationId:e,type:r,viewportId:t};it(Je,k.SEGMENTATION_REPRESENTATION_MODIFIED,n)}function FS(t,e,r){const n={viewportId:t,segmentationId:e,type:r};it(Je,k.SEGMENTATION_REPRESENTATION_REMOVED,n)}const Xpe=Object.freeze(Object.defineProperty({__proto__:null,triggerSegmentationDataModified:bo,triggerSegmentationModified:ns,triggerSegmentationRemoved:RE,triggerSegmentationRepresentationModified:bc,triggerSegmentationRepresentationRemoved:FS},Symbol.toStringTag,{value:"Module"})),Ype={renderOutline:!0,outlineWidthAutoGenerated:3,outlineWidth:1,outlineWidthInactive:1,outlineOpacity:1,outlineOpacityInactive:.85,outlineDash:void 0,outlineDashInactive:void 0,outlineDashAutoGenerated:"5,3",activeSegmentOutlineWidthDelta:0,renderFill:!0,fillAlpha:.5,fillAlphaInactive:.3,fillAlphaAutoGenerated:.3};function Jpe(){return Ype}const Zpe={renderOutline:!0,renderOutlineInactive:!0,outlineWidth:3,outlineWidthInactive:2,activeSegmentOutlineWidthDelta:0,renderFill:!0,renderFillInactive:!0,fillAlpha:.5,fillAlphaInactive:.4,outlineOpacity:1,outlineOpacityInactive:.85};function Qpe(){return Zpe}class e1e{constructor(){this.config={global:{},segmentations:{},viewportsStyle:{}}}setStyle(e,r){const{viewportId:n,segmentationId:i,type:o,segmentIndex:a}=e,s=this.getStyle(e);let c;if(!n&&!i?c={...s,...r}:c=this.copyActiveToInactiveIfNotProvided({...s,...r},o),!o)throw new Error("Type is required to set a style");if(n){this.config.viewportsStyle[n]||(this.config.viewportsStyle[n]={renderInactiveSegmentations:!1,representations:{}});const l=this.config.viewportsStyle[n].representations;if(i){l[i]||(l[i]={}),l[i][o]||(l[i][o]={});const f=l[i][o];a!==void 0?(f.perSegment||(f.perSegment={}),f.perSegment[a]=c):f.allSegments=c}else{const f="__allSegmentations__";l[f]||(l[f]={}),l[f][o]||(l[f][o]={}),l[f][o].allSegments=c}}else if(i){this.config.segmentations[i]||(this.config.segmentations[i]={}),this.config.segmentations[i][o]||(this.config.segmentations[i][o]={});const l=this.config.segmentations[i][o];a!==void 0?(l.perSegment||(l.perSegment={}),l.perSegment[a]=c):l.allSegments=c}else this.config.global[o]=c}copyActiveToInactiveIfNotProvided(e,r){const n={...e};if(r===Lt.Labelmap){const i=n;i.renderOutlineInactive??(i.renderOutlineInactive=i.renderOutline),i.outlineWidthInactive??(i.outlineWidthInactive=i.outlineWidth),i.renderFillInactive??(i.renderFillInactive=i.renderFill),i.fillAlphaInactive??(i.fillAlphaInactive=i.fillAlpha),i.outlineOpacityInactive??(i.outlineOpacityInactive=i.outlineOpacity)}else if(r===Lt.Contour){const i=n;i.outlineWidthInactive??(i.outlineWidthInactive=i.outlineWidth),i.outlineOpacityInactive??(i.outlineOpacityInactive=i.outlineOpacity),i.outlineDashInactive??(i.outlineDashInactive=i.outlineDash),i.renderOutlineInactive??(i.renderOutlineInactive=i.renderOutline),i.renderFillInactive??(i.renderFillInactive=i.renderFill),i.fillAlphaInactive??(i.fillAlphaInactive=i.fillAlpha)}return n}getStyle(e){var s,c,l,f,u;const{viewportId:r,segmentationId:n,type:i,segmentIndex:o}=e;let a=this.getDefaultStyle(i);if(this.config.global[i]&&(a={...a,...this.config.global[i]}),(s=this.config.segmentations[n])!=null&&s[i]&&(a={...a,...this.config.segmentations[n][i].allSegments},o!==void 0&&((c=this.config.segmentations[n][i].perSegment)!=null&&c[o])&&(a={...a,...this.config.segmentations[n][i].perSegment[o]})),r&&this.config.viewportsStyle[r]){this.config.viewportsStyle[r].renderInactiveSegmentations;const d="__allSegmentations__";(l=this.config.viewportsStyle[r].representations[d])!=null&&l[i]&&(a={...a,...this.config.viewportsStyle[r].representations[d][i].allSegments}),n&&((f=this.config.viewportsStyle[r].representations[n])!=null&&f[i])&&(a={...a,...this.config.viewportsStyle[r].representations[n][i].allSegments},o!==void 0&&((u=this.config.viewportsStyle[r].representations[n][i].perSegment)!=null&&u[o])&&(a={...a,...this.config.viewportsStyle[r].representations[n][i].perSegment[o]}))}return a}getRenderInactiveSegmentations(e){var r;return(r=this.config.viewportsStyle[e])==null?void 0:r.renderInactiveSegmentations}setRenderInactiveSegmentations(e,r){this.config.viewportsStyle[e]||(this.config.viewportsStyle[e]={renderInactiveSegmentations:!1,representations:{}}),this.config.viewportsStyle[e].renderInactiveSegmentations=r}getDefaultStyle(e){switch(e){case Lt.Labelmap:return Qpe();case Lt.Contour:return Jpe();case Lt.Surface:return{};default:throw new Error(`Unknown representation type: ${e}`)}}clearSegmentationStyle(e){this.config.segmentations[e]&&delete this.config.segmentations[e]}clearAllSegmentationStyles(){this.config.segmentations={}}clearViewportStyle(e){this.config.viewportsStyle[e]&&delete this.config.viewportsStyle[e]}clearAllViewportStyles(){for(const e in this.config.viewportsStyle){const n=this.config.viewportsStyle[e].renderInactiveSegmentations;this.config.viewportsStyle[e]={renderInactiveSegmentations:n,representations:{}}}}resetToGlobalStyle(){this.clearAllSegmentationStyles(),this.clearAllViewportStyles()}hasCustomStyle(e){const{type:r}=e,n=this.getStyle(e),i=this.getDefaultStyle(r);return!xV(n,i)}}const qa=new e1e;function t1e(t){const e={segmentationId:t};it(Je,k.SEGMENTATION_ADDED,e)}const dI={colorLUT:[],segmentations:[],viewportSegRepresentations:{}};class n1e{constructor(e){this._stackLabelmapImageIdReferenceMap=new Map,this._labelmapImageIdReferenceMap=new Map,e||(e=kn()),this.state=Object.freeze(ys(dI)),this.uid=e}getState(){return this.state}updateState(e){const r=ys(this.state);e(r),this.state=Object.freeze(r)}getColorLUT(e){return this.state.colorLUT[e]}getNextColorLUTIndex(){return this.state.colorLUT.length}resetState(){this._stackLabelmapImageIdReferenceMap.clear(),this._labelmapImageIdReferenceMap.clear(),this.state=Object.freeze(ys(dI))}getSegmentation(e){return this.state.segmentations.find(r=>r.segmentationId===e)}updateSegmentation(e,r){this.updateState(n=>{const i=n.segmentations.find(o=>o.segmentationId===e);if(!i){console.warn(`Segmentation with id ${e} not found. Update aborted.`);return}Object.assign(i,r)}),ns(e)}addSegmentation(e){if(this.getSegmentation(e.segmentationId))throw new Error(`Segmentation with id ${e.segmentationId} already exists`);this.updateState(r=>{const n=ys(e);if(n.representationData.Labelmap&&"volumeId"in n.representationData.Labelmap&&!("imageIds"in n.representationData.Labelmap)){const i=this.getLabelmapImageIds(n.representationData);n.representationData.Labelmap.imageIds=i}r.segmentations.push(n)}),t1e(e.segmentationId)}removeSegmentation(e){this.updateState(r=>{const n=r.segmentations.filter(i=>i.segmentationId!==e);r.segmentations.splice(0,r.segmentations.length,...n)}),RE(e)}addSegmentationRepresentation(e,r,n,i){if(!qn(e))return;if(this.getSegmentationRepresentations(e,{type:n,segmentationId:r}).length>0){console.debug("A segmentation representation of type",n,"already exists in viewport",e,"for segmentation",r);return}this.updateState(s=>{s.viewportSegRepresentations[e]||(s.viewportSegRepresentations[e]=[],qa.setRenderInactiveSegmentations(e,!0)),n!==Lt.Labelmap?this.addDefaultSegmentationRepresentation(s,e,r,n,i):this.addLabelmapRepresentation(s,e,r,i)}),bc(e,r,n)}addDefaultSegmentationRepresentation(e,r,n,i,o){const a=e.segmentations.find(c=>c.segmentationId===n);if(!a)return;const s={};Object.keys(a.segments).forEach(c=>{s[Number(c)]={visible:!0}}),e.viewportSegRepresentations[r].push({segmentationId:n,type:i,active:!0,visible:!0,colorLUTIndex:(o==null?void 0:o.colorLUTIndex)||0,segments:s,config:{...hI(i),...o}}),this._setActiveSegmentation(e,r,n)}addLabelmapRepresentation(e,r,n,i=hI(Lt.Labelmap)){if(!qn(r))return;const a=this.getSegmentation(n);if(!a)return;const{representationData:s}=a;if(!s.Labelmap)return this.addDefaultSegmentationRepresentation(e,r,n,Lt.Labelmap,i);this.processLabelmapRepresentationAddition(r,n),this.addDefaultSegmentationRepresentation(e,r,n,Lt.Labelmap,i)}async processLabelmapRepresentationAddition(e,r){const n=qn(e);if(!n)return;const i=this.getSegmentation(r);if(!i)return;const o=n.viewport instanceof Or,{representationData:a}=i,s="volumeId"in a.Labelmap;n.viewport,!o&&!s&&this.updateLabelmapSegmentationImageReferences(e,i.segmentationId)}_updateLabelmapSegmentationReferences(e,r,n,i){const o=r.getCurrentImageId();let a=!1;for(const s of n)r.isReferenceViewable({referencedImageId:s},{asOverlay:!0})&&(a=!0,this._stackLabelmapImageIdReferenceMap.get(e).set(o,s),this._updateLabelmapImageIdReferenceMap({segmentationId:e,referenceImageId:o,labelmapImageId:s}));return i&&i(r,e,n),a?this._stackLabelmapImageIdReferenceMap.get(e).get(o):void 0}updateLabelmapSegmentationImageReferences(e,r){const n=this.getSegmentation(r);if(!n)return;this._stackLabelmapImageIdReferenceMap.has(r)||this._stackLabelmapImageIdReferenceMap.set(r,new Map);const{representationData:i}=n;if(!i.Labelmap)return;const o=this.getLabelmapImageIds(i),s=qn(e).viewport;return this._updateLabelmapSegmentationReferences(r,s,o,null)}_updateAllLabelmapSegmentationImageReferences(e,r){const n=this.getSegmentation(r);if(!n)return;this._stackLabelmapImageIdReferenceMap.has(r)||this._stackLabelmapImageIdReferenceMap.set(r,new Map);const{representationData:i}=n;if(!i.Labelmap)return;const o=this.getLabelmapImageIds(i),s=qn(e).viewport;this._updateLabelmapSegmentationReferences(r,s,o,(c,l,f)=>{c.getImageIds().forEach((d,h)=>{for(const g of f)c.isReferenceViewable({referencedImageId:g,sliceIndex:h},{asOverlay:!0,withNavigation:!0})&&(this._stackLabelmapImageIdReferenceMap.get(l).set(d,g),this._updateLabelmapImageIdReferenceMap({segmentationId:l,referenceImageId:d,labelmapImageId:g}))})})}getLabelmapImageIds(e){const r=e.Labelmap;let n;if(r.imageIds)n=r.imageIds;else if(!n&&r.volumeId){const i=r.volumeId;n=Fe.getVolume(i).imageIds}return n}getLabelmapImageIdsForImageId(e,r){const n=this._generateMapKey({segmentationId:r,referenceImageId:e});return this._labelmapImageIdReferenceMap.get(n)}getCurrentLabelmapImageIdsForViewport(e,r){const n=qn(e);if(!n)return;const o=n.viewport.getCurrentImageId();return this.getLabelmapImageIdsForImageId(o,r)}getCurrentLabelmapImageIdForViewport(e,r){const n=qn(e);if(!n||!this._stackLabelmapImageIdReferenceMap.has(r))return;const o=n.viewport.getCurrentImageId();return this._stackLabelmapImageIdReferenceMap.get(r).get(o)}getStackSegmentationImageIdsForViewport(e,r){if(!this.getSegmentation(r))return[];this._updateAllLabelmapSegmentationImageReferences(e,r);const{viewport:i}=qn(e),o=i.getImageIds(),a=this._stackLabelmapImageIdReferenceMap.get(r);return o.map(s=>a.get(s))}removeSegmentationRepresentationsInternal(e,r){const n=[];return this.updateState(i=>{if(!i.viewportSegRepresentations[e])return;const o=i.viewportSegRepresentations[e];let a=!1;if(!r||Object.values(r).every(s=>s===void 0))n.push(...o),delete i.viewportSegRepresentations[e];else{const{segmentationId:s,type:c}=r;i.viewportSegRepresentations[e]=o.filter(l=>{const f=s&&c&&l.segmentationId===s&&l.type===c||s&&!c&&l.segmentationId===s||!s&&c&&l.type===c;return f&&(n.push(l),l.active&&(a=!0)),!f}),i.viewportSegRepresentations[e].length===0?delete i.viewportSegRepresentations[e]:a&&(i.viewportSegRepresentations[e][0].active=!0)}}),n}removeSegmentationRepresentations(e,r){const n=this.removeSegmentationRepresentationsInternal(e,r);n.forEach(o=>{FS(e,o.segmentationId,o.type)});const i=this.getSegmentationRepresentations(e);return i.length>0&&i[0].active&&bc(e,i[0].segmentationId,i[0].type),n}removeSegmentationRepresentation(e,r,n){const i=this.removeSegmentationRepresentationsInternal(e,r);return n||i.forEach(({segmentationId:o,type:a})=>{FS(e,o,a)}),i}_updateLabelmapImageIdReferenceMap({segmentationId:e,referenceImageId:r,labelmapImageId:n}){const i=this._generateMapKey({segmentationId:e,referenceImageId:r});if(!this._labelmapImageIdReferenceMap.has(i)){this._labelmapImageIdReferenceMap.set(i,[n]);return}const o=this._labelmapImageIdReferenceMap.get(i),a=Array.from(new Set([...o,n]));this._labelmapImageIdReferenceMap.set(i,a)}_setActiveSegmentation(e,r,n){const i=e.viewportSegRepresentations[r];i&&i.forEach(o=>{o.active=o.segmentationId===n})}setActiveSegmentation(e,r){this.updateState(n=>{const i=n.viewportSegRepresentations[e];i&&i.forEach(o=>{o.active=o.segmentationId===r})}),bc(e,r)}getActiveSegmentation(e){if(!this.state.viewportSegRepresentations[e])return;const r=this.state.viewportSegRepresentations[e].find(n=>n.active);if(r)return this.getSegmentation(r.segmentationId)}getSegmentationRepresentations(e,r={}){const n=this.state.viewportSegRepresentations[e];return n?!r.type&&!r.segmentationId?n:n.filter(i=>{const o=r.type?i.type===r.type:!0,a=r.segmentationId?i.segmentationId===r.segmentationId:!0;return o&&a}):[]}getSegmentationRepresentation(e,r){return this.getSegmentationRepresentations(e,r)[0]}getSegmentationRepresentationVisibility(e,r){const n=this.getSegmentationRepresentation(e,r);return n==null?void 0:n.visible}setSegmentationRepresentationVisibility(e,r,n){this.updateState(i=>{const o=this.getSegmentationRepresentations(e,r);o&&o.forEach(a=>{a.visible=n,Object.entries(a.segments).forEach(([s,c])=>{c.visible=n})})}),bc(e,r.segmentationId,r.type)}addColorLUT(e,r){this.updateState(n=>{n.colorLUT[r]&&console.warn("Color LUT table already exists, overwriting"),n.colorLUT[r]=ys(e)})}removeColorLUT(e){this.updateState(r=>{delete r.colorLUT[e]})}_getStackIdForImageIds(e){return e.map(r=>r.slice(-Math.round(r.length*.15))).join("_")}getAllViewportSegmentationRepresentations(){return Object.entries(this.state.viewportSegRepresentations).map(([e,r])=>({viewportId:e,representations:r}))}getSegmentationRepresentationsBySegmentationId(e){const r=[];return Object.entries(this.state.viewportSegRepresentations).forEach(([n,i])=>{const o=i.filter(a=>a.segmentationId===e);o.length>0&&r.push({viewportId:n,representations:o})}),r}_generateMapKey({segmentationId:e,referenceImageId:r}){return`${e}-${r}`}}async function nU({imageIds:t,options:e}){const r=t,n=(e==null?void 0:e.volumeId)||kn();return await q4(n,r),{volumeId:n}}async function r1e({segmentationId:t,options:e}){const r=sr.getSegmentation(t),n=r.representationData.Labelmap,{volumeId:i}=await nU({imageIds:n.imageIds,options:e});r.representationData.Labelmap.volumeId=i}function hI(t){const e=Fl.newInstance(),r=Td.newInstance();return r.addPoint(0,0),t===Lt.Labelmap?{cfun:e,ofun:r}:{}}const sr=new n1e("DEFAULT");function Ma(t,e={}){return sr.getSegmentationRepresentations(t,e)}function LE(t,e){const r=sr;if(!e.segmentationId||!e.type)throw new Error("getSegmentationRepresentation: No segmentationId or type provided, you need to provide at least one of them");const n=r.getSegmentationRepresentations(t,e);return n==null?void 0:n[0]}function rU(t){return sr.getSegmentationRepresentationsBySegmentationId(t)}function i1e(t,e){const r=Se(t),{viewport:n}=r,o=n.getActors().filter(a=>a.representationUID&&typeof a.representationUID=="string"&&a.representationUID.startsWith(e));n.removeActors(o.map(a=>a.uid))}function iU(t,e,r){const n=qn(t);if(!n)return;const{renderingEngine:i,viewport:o}=n;if(!i||!o)return;const s=o.getActors().filter(r);return s.length>0?s[0]:void 0}function o1e(t,e){const r=qn(t);if(!r)return;const{renderingEngine:n,viewport:i}=r;if(!n||!i)return;const a=i.getActors().filter(e);return a.length>0?a:void 0}function a1e(t,e){const r=Pw(t,e);return r==null?void 0:r.uid}function Cp(t,e){return o1e(t,r=>{var n;return(n=r.representationUID)==null?void 0:n.startsWith(`${e}-${Lt.Labelmap}`)})}function Pw(t,e){return iU(t,e,r=>{var n;return(n=r.representationUID)==null?void 0:n.startsWith(`${e}-${Lt.Labelmap}`)})}function s1e(t,e,r){return iU(t,e,n=>n.representationUID===oU(e,r))}function oU(t,e){return`${t}-${Lt.Surface}-${e}`}function c1e(t,e,r){const n=Se(t),{viewport:i}=n,o=s1e(i.id,r,e.segmentIndex),a=o==null?void 0:o.actor,s=e.visible;if(a){if(a.setVisibility(s),!s)return;const y=a.getMapper(),m=y.getInputData(),w=e.points,x=e.polys,C=m.getPoints().getData(),S=m.getPolys().getData();if(w.length===C.length&&x.length===S.length)return;const T=Kr.newInstance();T.getPoints().setData(w,3);const _=Sd.newInstance({values:Float32Array.from(x)});T.setPolys(_),y.setInputData(T),y.modified(),i.getRenderer().resetCameraClippingRange();return}const c=e.points,l=e.polys,f=e.color,u=Kr.newInstance();u.getPoints().setData(c,3);const d=Sd.newInstance({values:Float32Array.from(l)});u.setPolys(d);const h=_a.newInstance({});let g;h.setInputData(u);const p=ic.newInstance();p.setMapper(h),p.getProperty().setColor(f[0]/255,f[1]/255,f[2]/255),p.getProperty().setLineWidth(2);const v=oU(r,e.segmentIndex);i.addActor({uid:kn(),actor:p,clippingFilter:g,representationUID:v}),i.resetCamera(),i.getRenderer().resetCameraClippingRange(),i.render()}function zn(t){return sr.getSegmentation(t)}function ym(t){return sr.getColorLUT(t)}let n5={};function l1e(){return n5}function u1e(t){n5=t}let gI=!1;function Ml(){var e;if(!((e=n5.addons)!=null&&e.polySeg))return console.warn("PolySeg add-on not configured. This will prevent automatic conversion between segmentation representations (labelmap, contour, surface). To enable these features, install @cornerstonejs/polymorphic-segmentation and register it during initialization: cornerstoneTools.init({ addons: { polySeg } })."),null;const t=n5.addons.polySeg;return gI||(t.init(),gI=!0),t}function AE({segmentationId:t,type:e,data:r}){const n=zn(t);if(!n)throw new Error(`Segmentation ${t} not found`);switch(n.representationData[e]&&console.warn(`Representation data of type ${e} already exists for segmentation ${t}, overwriting it.`),e){case Lt.Labelmap:r&&(n.representationData[e]=r);break;case Lt.Contour:r&&(n.representationData[e]=r);break;case Lt.Surface:r&&(n.representationData[e]=r);break;default:throw new Error(`Invalid representation type ${e}`)}}function NE(t){const e=typeof t;return t!==null&&(e==="object"||e==="function")}function qh(t,e,r){let n,i,o,a,s,c,l=0,f=!1,u=!1,d=!0;const h=!e&&e!==0&&typeof window.requestAnimationFrame=="function";if(typeof t!="function")throw new TypeError("Expected a function");e=Number(e)||0,NE(r)&&(f=!!r.leading,u="maxWait"in r,o=u?Math.max(Number(r.maxWait)||0,e):o,d="trailing"in r?!!r.trailing:d);function g(b){const D=n,I=i;return n=i=void 0,l=b,a=t.apply(I,D),a}function p(b,D){return h?window.requestAnimationFrame(b):setTimeout(b,D)}function v(b){if(h)return window.cancelAnimationFrame(b);clearTimeout(b)}function y(b){return l=b,s=p(x,e),f?g(b):a}function m(b){const D=b-c,I=b-l,P=e-D;return u?Math.min(P,o-I):P}function w(b){const D=b-c,I=b-l;return c===void 0||D>=e||D<0||u&&I>=o}function x(){const b=Date.now();if(w(b))return C(b);s=p(x,m(b))}function C(b){return s=void 0,d&&n?g(b):(n=i=void 0,a)}function S(){s!==void 0&&v(s),l=0,n=c=i=s=void 0}function T(){return s===void 0?a:C(Date.now())}function _(){return s!==void 0}function E(...b){const D=Date.now(),I=w(D);if(n=b,i=this,c=D,I){if(s===void 0)return y(c);if(u)return s=p(x,e),g(c)}return s===void 0&&(s=p(x,e)),a}return E.cancel=S,E.flush=T,E.pending=_,E}const Rv=new Map;async function kE(t,e,r,n,i){const o=await r();AE({segmentationId:t,type:e,data:o}),i==null||i(),Rv.has(t)||Rv.set(t,[]);const a=Rv.get(t);return a.includes(e)||a.push(e),f1e(n),ns(t),o}function f1e(t){const e=r=>{d1e(r,t)};t._debouncedUpdateFunction=e,Je.removeEventListener(k.SEGMENTATION_DATA_MODIFIED,t._debouncedUpdateFunction),Je.addEventListener(k.SEGMENTATION_DATA_MODIFIED,t._debouncedUpdateFunction)}const d1e=qh((t,e)=>{const r=t.detail.segmentationId,n=Rv.get(r);!n||!n.length||(e(r),n.length&&ns(r))},300);function VE(t,e){const r=LE(t,e);return r?Object.entries(r.segments).reduce((i,[o,a])=>(a.visible||i.add(Number(o)),i),new Set):new Set}function h1e(t,e,r=!1){const n=qn(t);if(!n)return;const{viewport:i}=n;i1e(i.element,e),r&&i.render()}async function g1e(t,e){var l;const{segmentationId:r,type:n}=e,i=zn(r);if(!i)return;let o=i.representationData[Lt.Surface];if(!o&&((l=Ml())!=null&&l.canComputeRequestedRepresentation(r,Lt.Surface))){const f=Ml();if(o=await kE(r,Lt.Surface,()=>f.computeSurfaceData(r,{viewport:t}),()=>f.updateSurfaceData(r,{viewport:t})),!o)throw new Error(`No Surface data found for segmentationId ${r} even we tried to compute it`)}else!o&&!Ml()&&console.debug(`No surface data found for segmentationId ${r} and PolySeg add-on is not configured. Unable to convert from other representations to surface. Please register PolySeg using cornerstoneTools.init({ addons: { polySeg } }) to enable automatic conversion.`);if(!o){console.warn(`No Surface data found for segmentationId ${r}. Skipping render.`);return}const{geometryIds:a}=o;a!=null&&a.size||console.warn(`No Surfaces found for segmentationId ${r}. Skipping render.`);const{colorLUTIndex:s}=e,c=ym(s);a.forEach(f=>{const u=Fe.getGeometry(f);if(!(u!=null&&u.data)){console.warn(`No Surfaces found for geometryId ${f}. Skipping render.`);return}const{segmentIndex:d}=u.data,g=VE(t.id,{segmentationId:r,type:n}).has(d),p=u.data,v=c[d];p.color=v.slice(0,3),p.visible=!g,c1e(t.element,p,r)}),t.render()}const aU={render:g1e,removeRepresentation:h1e};function p1e(t,e,r,n){const i=t.getViewReference(),{viewPlaneNormal:o,FrameOfReferenceUID:a}=i,s={annotationUID:(n==null?void 0:n.annotationUID)||kn(),data:{handles:{points:r}},highlighted:!1,autoGenerated:!1,invalidated:!1,isLocked:!1,isVisible:!0,metadata:{toolName:e,viewPlaneNormal:o,FrameOfReferenceUID:a,referencedImageId:m1e(t,r[0],o),...n}};return ln(s,t.element),s}function m1e(t,e,r){let n;if(t instanceof mr)n=FE(t,e,r);else if(t instanceof Or){const i=v1e(t),o=Jc(i),a=Fe.getVolume(o);n=Vl(a,e,r)}else throw new Error("getReferencedImageId: viewport must be a StackViewport or BaseVolumeViewport");return n}function v1e(t){var r;const e=(r=t.getViewReferenceId)==null?void 0:r.call(t);if(e)return e;if(t instanceof Or)return`volumeId:${y1e(t)}`;throw new Error("getTargetId: viewport must have a getTargetId method")}function y1e(t){var r;const e=t.getActors();if(e)return(r=e.find(n=>n.actor.getClassName()==="vtkVolume"))==null?void 0:r.uid}function FE(t,e,r){const n=t.getImageIds();if(!n||!n.length)return;const i=n.map(o=>{const{imagePositionPatient:a}=vt("imagePlaneModule",o),s=w1e(e,a,r);return{imageId:o,distance:s}});return i.sort((o,a)=>o.distance-a.distance),i[0].imageId}function w1e(t,e,r){const n=Ge();Nn(n,t,e);const i=Pt(n,r);return Math.abs(i)}function sU(t,e){const{segmentation:r}=t.data,{segmentation:n}=e.data;return r.segmentationId===n.segmentationId&&r.segmentIndex===n.segmentIndex}class cU{constructor(e){this.getGroupKey=r=>{if(typeof r=="string")return r;const i=Se(r);if(!i)throw new Error("Element not enabled, you must have an enabled element if you are not providing a FrameOfReferenceUID");return i.FrameOfReferenceUID},this._imageVolumeModifiedHandler=r=>{const n=r.detail,{FrameOfReferenceUID:i}=n,a=this.annotations[i];a&&Object.keys(a).forEach(s=>{a[s].forEach(l=>{l.invalidated!==void 0&&(l.invalidated=!0)})})},this.getFramesOfReference=()=>Object.keys(this.annotations),this.getAnnotations=(r,n)=>{const i=this.annotations;return i[r]?n?i[r][n]?i[r][n]:[]:i[r]:[]},this.getAnnotation=r=>{const n=this.annotations;for(const i in n){const o=n[i];for(const a in o){const s=o[a];for(const c of s)if(r===c.annotationUID)return c}}},this.getNumberOfAnnotations=(r,n)=>{const i=this.getAnnotations(r,n);if(!i.length)return 0;if(n)return i.length;let o=0;for(const a in i)o+=i[a].length;return o},this.addAnnotation=(r,n)=>{const{metadata:i}=r,{FrameOfReferenceUID:o,toolName:a}=i;n=n||o;const s=this.annotations;let c=s[n];c||(s[n]={},c=s[n]);let l=c[a];l||(c[a]=[],l=c[a]),this.preprocessingFn&&(r=this.preprocessingFn(r)),l.push(r)},this.removeAnnotation=r=>{const{annotations:n}=this;for(const i in n){const o=n[i];for(const a in o){const s=o[a],c=s.findIndex(l=>l.annotationUID===r);c!==-1&&(s.splice(c,1),s.length===0&&delete o[a])}Object.keys(o).length===0&&delete n[i]}},this.removeAnnotations=(r,n)=>{const i=this.annotations,o=[];if(!i[r])return o;if(n){const a=i[r][n];for(const s of a)this.removeAnnotation(s.annotationUID),o.push(s)}else for(const a in i[r]){const s=i[r][a];for(const c of s)this.removeAnnotation(c.annotationUID),o.push(c)}return o},this.saveAnnotations=(r,n)=>{const i=this.annotations;if(r&&n){const o=i[r];if(!o)return;const a=o[n];return structuredClone(a)}else if(r){const o=i[r];return structuredClone(o)}return structuredClone(i)},this.restoreAnnotations=(r,n,i)=>{const o=this.annotations;if(n&&i){let a=o[n];a||(o[n]={},a=o[n]),a[i]=r}else n?o[n]=r:this.annotations=structuredClone(r)},this.getAllAnnotations=()=>Object.values(this.annotations).map(r=>Object.values(r)).flat(2),this.getNumberOfAllAnnotations=()=>{let r=0;const n=this.annotations;for(const i in n){const o=n[i];for(const a in o){const s=o[a];r+=s.length}}return r},this.removeAllAnnotations=()=>{const r=[];for(const n of this.getAllAnnotations())this.removeAnnotation(n.annotationUID),r.push(n);return r},e||(e=kn()),this.annotations={},this.uid=e,Je.addEventListener(Ze.IMAGE_VOLUME_MODIFIED,this._imageVolumeModifiedHandler)}setPreprocessingFn(e){this.preprocessingFn=e}}const x1e=new cU("DEFAULT"),$u=new Set;function lU(t,e=!0){const r=fU();t&&(e?_1e(t,$u,r):dU(t,$u,r)),hU(r,$u)}function C1e(){const t=fU();E1e($u,t),hU(t,$u)}function S1e(){return Array.from($u)}function mi(t){return $u.has(t)}function T1e(){return $u.size}function uU(t){const e=mi(t);return lU(t,e),e}function fU(){return Object.freeze({added:[],removed:[],locked:[]})}function _1e(t,e,r){if(!e.has(t)){e.add(t),r.added.push(t);const n=ri(t);n&&(n.isLocked=!0)}}function dU(t,e,r){if(e.delete(t)){r.removed.push(t);const n=ri(t);n&&(n.isLocked=!1)}}function E1e(t,e){t.forEach(r=>{dU(r,t,e)})}function hU(t,e){(t.added.length>0||t.removed.length>0)&&(e.forEach(r=>void t.locked.push(r)),it(Je,k.ANNOTATION_LOCK_CHANGE,t))}const b1e=Object.freeze(Object.defineProperty({__proto__:null,checkAndSetAnnotationLocked:uU,getAnnotationsLocked:S1e,getAnnotationsLockedCount:T1e,isAnnotationLocked:mi,setAnnotationLocked:lU,unlockAllAnnotations:C1e},Symbol.toStringTag,{value:"Module"})),Dc=new Set;function ca(t,e=!0,r=!1){e?D1e(t,r):UE(t)}function D1e(t,e=!1){const r=pU();if(!e){mU(Dc,r);const n=ri(t);n&&(n.isSelected=!0)}if(t&&!Dc.has(t)){Dc.add(t),r.added.push(t);const n=ri(t);n&&(n.isSelected=!0)}vU(r,Dc)}function UE(t){const e=pU();if(t){if(Dc.delete(t)){e.removed.push(t);const r=ri(t);r.isSelected=!1}}else mU(Dc,e);vU(e,Dc)}function gU(){return Array.from(Dc)}function I1e(t){return gU().filter(e=>{var n;const r=ri(e);return((n=r==null?void 0:r.metadata)==null?void 0:n.toolName)===t})}function wm(t){return Dc.has(t)}function O1e(){return Dc.size}function pU(){return Object.freeze({added:[],removed:[],selection:[]})}function mU(t,e){t.forEach(r=>{if(t.delete(r)){e.removed.push(r);const n=ri(r);n&&(n.isSelected=!1)}})}function vU(t,e){(t.added.length>0||t.removed.length>0)&&(e.forEach(r=>void t.selection.push(r)),it(Je,k.ANNOTATION_SELECTION_CHANGE,t))}const M1e=Object.freeze(Object.defineProperty({__proto__:null,deselectAnnotation:UE,getAnnotationsSelected:gU,getAnnotationsSelectedByToolName:I1e,getAnnotationsSelectedCount:O1e,isAnnotationSelected:wm,setAnnotationSelected:ca},Symbol.toStringTag,{value:"Module"})),P1e=t=>(t.data||(t.data={}),t.data.handles||(t.data.handles={}),t.data.handles.textBox||(t.data.handles.textBox={}),t),R1e=t=>(t.data||(t.data={}),t.data.cachedStats||(t.data.cachedStats={}),t),bd=new Set;function yU(t,e=!0){const r=wU();t&&(e?xU(t,bd,r):A1e(t,bd,r)),CU(r)}function L1e(){const t=wU();bd.forEach(e=>{xU(e,bd,t)}),CU(t)}function ii(t){if(ri(t))return!bd.has(t)}function wU(){return Object.freeze({lastVisible:[],lastHidden:[],hidden:[]})}function xU(t,e,r){if(e.delete(t)){r.lastVisible.push(t);const n=ri(t);n.isVisible=!0}}function A1e(t,e,r){e.has(t)||(e.add(t),wm(t)&&UE(t),r.lastHidden.push(t))}function CU(t){(t.lastHidden.length>0||t.lastVisible.length>0)&&(bd.forEach(e=>void t.hidden.push(e)),it(Je,k.ANNOTATION_VISIBILITY_CHANGE,t))}function SU(t){const e=!bd.has(t);return yU(t,e),e}const N1e=Object.freeze(Object.defineProperty({__proto__:null,checkAndSetAnnotationVisibility:SU,isAnnotationVisible:ii,setAnnotationVisibility:yU,showAllAnnotations:L1e},Symbol.toStringTag,{value:"Module"})),BE=x1e,k1e=t=>{t=P1e(t),t=R1e(t);const e=t.annotationUID,r=uU(e);t.isLocked=r;const n=SU(e);return t.isVisible=n,t};BE.setPreprocessingFn(k1e);bE(BE);function V1e(){bE(BE)}function Ul(t){if(!t.data.segmentation)throw new Error("removeContourSegmentationAnnotation: annotation does not have a segmentation data");const{segmentationId:e,segmentIndex:r}=t.data.segmentation,n=zn(e),{annotationUIDsMap:i}=(n==null?void 0:n.representationData.Contour)||{},o=i==null?void 0:i.get(r);o&&(o.delete(t.annotationUID),o.size||i.delete(r))}function Bl(t){if(t.parentAnnotationUID)return;if(!t.data.segmentation)throw new Error("addContourSegmentationAnnotation: annotation does not have a segmentation data");const{segmentationId:e,segmentIndex:r}=t.data.segmentation,n=zn(e);n.representationData.Contour||(n.representationData.Contour={annotationUIDsMap:new Map});let{annotationUIDsMap:i}=n.representationData.Contour;i||(i=new Map);let o=i==null?void 0:i.get(r);o||(o=new Set,i.set(r,o)),i.set(r,o.add(t.annotationUID))}const F1e="PlanarFreehandContourSegmentationTool";function GE(t){var o;const{polyline:e}=((o=t.data)==null?void 0:o.contour)||{};if(!e||e.length<3){console.warn("Skipping creation of new annotation due to invalid polyline:",e);return}yn(t.annotationUID),Ul(t);const r=e[0],n=e[e.length-1],i={metadata:{...t.metadata,toolName:F1e,originalToolName:t.metadata.originalToolName||t.metadata.toolName},data:{cachedStats:{},handles:{points:[r,n],textBox:t.data.handles.textBox?{...t.data.handles.textBox}:void 0},contour:{...t.data.contour},spline:t.data.spline,segmentation:{...t.data.segmentation}},annotationUID:kn(),highlighted:!0,invalidated:!0,isLocked:!1,isVisible:void 0,interpolationUID:t.interpolationUID,interpolationCompleted:t.interpolationCompleted};return ln(i,t.metadata.FrameOfReferenceUID),Bl(i),i}var la;(function(t){t[t.CounterClockwise=-1]="CounterClockwise",t[t.Unknown=0]="Unknown",t[t.Clockwise=1]="Clockwise"})(la||(la={}));function WE(t,e){return t.minX<=e.maxX&&t.maxX>=e.minX&&t.minY<=e.maxY&&t.maxY>=e.minY}function r5(t,e){const r=t.maxX-t.minX,n=t.maxY-t.minY,i=[r,n],o=[t.minX+r/2,t.minY+n/2],a=[Math.abs(e[0]-o[0]),Math.abs(e[1]-o[1])],s=a[0]-i[0]*.5,c=a[1]-i[1]*.5;if(s>0&&c>0)return s*s+c*c;const l=Math.max(s,0)+Math.max(c,0);return l*l}function U1e(t,e){return Math.sqrt(r5(t,e))}const B1e=Object.freeze(Object.defineProperty({__proto__:null,distanceToPoint:U1e,distanceToPointSquared:r5,intersectAABB:WE},Symbol.toStringTag,{value:"Module"}));class TU{}class _U{constructor(e){this.storePointData=e.storePointData}getStatistics(){console.debug("InstanceCalculator getStatistics called")}}const{PointsManager:G1e}=Vn;function O1(t){return{max:[-1/0],min:[1/0],sum:[0],count:0,maxIJK:null,maxLPS:null,minIJK:null,minLPS:null,runMean:[0],m2:[0],m3:[0],m4:[0],allValues:[[]],pointsInShape:t?G1e.create3(1024):null,sumLPS:[0,0,0]}}function EU(t,e,r=null,n=null){Array.isArray(e)&&e.length>1&&t.max.length===1&&(t.max.push(t.max[0],t.max[0]),t.min.push(t.min[0],t.min[0]),t.sum.push(t.sum[0],t.sum[0]),t.runMean.push(0,0),t.m2.push(t.m2[0],t.m2[0]),t.m3.push(t.m3[0],t.m3[0]),t.m4.push(t.m4[0],t.m4[0]),t.allValues.push([],[])),t!=null&&t.pointsInShape&&r&&t.pointsInShape.push(r);const i=Array.isArray(e)?e:[e];t.count+=1,r&&(t.sumLPS[0]+=r[0],t.sumLPS[1]+=r[1],t.sumLPS[2]+=r[2]),t.max.forEach((o,a)=>{const s=i[a];t.allValues[a].push(s);const c=t.count,l=s-t.runMean[a],f=l/c,u=l*f*(c-1);t.sum[a]+=s,t.runMean[a]+=f,t.m4[a]+=u*f*f*(c*c-3*c+3)+6*f*f*t.m2[a]-4*f*t.m3[a],t.m3[a]+=u*f*(c-2)-3*f*t.m2[a],t.m2[a]+=u,st.max[a]&&(t.max[a]=s,a===0&&(t.maxIJK=n?[...n]:null,t.maxLPS=r?[...r]:null))})}function W1e(t){if(t.length===0)return 0;const e=[...t].sort((n,i)=>n-i),r=Math.floor(e.length/2);return e.length%2===0?(e[r-1]+e[r])/2:e[r]}function bU(t,e){const r=t.sum.map(u=>u/t.count),n=t.m2.map(u=>Math.sqrt(u/t.count)),i=t.sumLPS.map(u=>u/t.count),o=t.m3.map((u,d)=>{const h=t.m2[d]/t.count;return h===0?0:u/(t.count*Math.pow(h,1.5))}),a=t.m4.map((u,d)=>{const h=t.m2[d]/t.count;return h===0?0:u/(t.count*h*h)-3}),s=t.allValues.map(u=>W1e(u)),c={max:{name:"max",label:"Max Pixel",value:t.max.length===1?t.max[0]:t.max,unit:e,pointIJK:t.maxIJK?[...t.maxIJK]:null,pointLPS:t.maxLPS?[...t.maxLPS]:null},min:{name:"min",label:"Min Pixel",value:t.min.length===1?t.min[0]:t.min,unit:e,pointIJK:t.minIJK?[...t.minIJK]:null,pointLPS:t.minLPS?[...t.minLPS]:null},mean:{name:"mean",label:"Mean Pixel",value:r.length===1?r[0]:r,unit:e},stdDev:{name:"stdDev",label:"Standard Deviation",value:n.length===1?n[0]:n,unit:e},count:{name:"count",label:"Voxel Count",value:t.count,unit:null},median:{name:"median",label:"Median",value:s.length===1?s[0]:s,unit:e},skewness:{name:"skewness",label:"Skewness",value:o.length===1?o[0]:o,unit:null},kurtosis:{name:"kurtosis",label:"Kurtosis",value:a.length===1?a[0]:a,unit:null},maxLPS:{name:"maxLPS",label:"Max LPS",value:t.maxLPS?Array.from(t.maxLPS):null,unit:null},minLPS:{name:"minLPS",label:"Min LPS",value:t.minLPS?Array.from(t.minLPS):null,unit:null},pointsInShape:t.pointsInShape,center:{name:"center",label:"Center",value:i?[...i]:null,unit:null},array:[]};c.array.push(c.min,c.max,c.mean,c.stdDev,c.median,c.skewness,c.kurtosis,c.count,c.maxLPS,c.minLPS),c.center.value&&c.array.push(c.center);const l=t.pointsInShape!==null,f=O1(l);return t.max=f.max,t.min=f.min,t.sum=f.sum,t.count=f.count,t.maxIJK=f.maxIJK,t.maxLPS=f.maxLPS,t.minIJK=f.minIJK,t.minLPS=f.minLPS,t.runMean=f.runMean,t.m2=f.m2,t.m3=f.m3,t.m4=f.m4,t.allValues=f.allValues,t.pointsInShape=f.pointsInShape,t.sumLPS=f.sumLPS,c}const Xf=class Xf extends TU{static statsInit(e){e.storePointData||(this.state.pointsInShape=null),this.state=O1(e.storePointData)}};Xf.state=O1(!0),Xf.statsCallback=({value:e,pointLPS:r=null,pointIJK:n=null})=>{EU(Xf.state,e,r,n)},Xf.getStatistics=e=>bU(Xf.state,e==null?void 0:e.unit);let jc=Xf;class DU extends _U{constructor(e){super(e),this.state=O1(e.storePointData)}statsInit(e){this.state=O1(e.storePointData)}statsCallback(e){EU(this.state,e.value,e.pointLPS,e.pointIJK)}getStatistics(e){return bU(this.state,e==null?void 0:e.unit)}}const z1e=Object.freeze(Object.defineProperty({__proto__:null,BasicStatsCalculator:jc,Calculator:TU,InstanceBasicStatsCalculator:DU,InstanceCalculator:_U},Symbol.toStringTag,{value:"Module"}));function Gl(t,e){if(t.length!==e.length)throw Error("Both points should have the same dimensionality");const[r,n,i=0]=t,[o,a,s=0]=e,c=o-r,l=a-n,f=s-i;return c*c+l*l+f*f}function Wo(t,e){return Math.sqrt(Gl(t,e))}function US(t,e){const[r,n]=t,[i,o]=e,a=2*i-r,s=2*o-n;return[a,s]}const $1e=Object.freeze(Object.defineProperty({__proto__:null,distanceToPoint:Wo,distanceToPointSquared:Gl,mirror:US},Symbol.toStringTag,{value:"Module"}));function ju(t){const[e,r]=t;return Wo(e,r)}function th(t){const[e,r]=t,n=Wo(e,r),i=[e[0]-n,e[1]-n],o=[e[0]+n,e[1]+n];return[i,o]}const j1e=Object.freeze(Object.defineProperty({__proto__:null,getCanvasCircleCorners:th,getCanvasCircleRadius:ju},Symbol.toStringTag,{value:"Module"}));function Rw(t,e,r={}){return r.precalculated||zE(t,r),r.precalculated(e)}const zE=(t,e={})=>{const{xRadius:r,yRadius:n,zRadius:i}=t;(e.invXRadiusSq===void 0||e.invYRadiusSq===void 0||e.invZRadiusSq===void 0)&&(e.invXRadiusSq=r!==0?1/r**2:0,e.invYRadiusSq=n!==0?1/n**2:0,e.invZRadiusSq=i!==0?1/i**2:0);const{invXRadiusSq:o,invYRadiusSq:a,invZRadiusSq:s}=e,{center:c}=t,[l,f,u]=c;return e.precalculated=d=>{const h=d[0]-l;let g=h*h*o;if(g>1)return!1;const p=d[1]-f;if(g+=p*p*a,g>1)return!1;const v=d[2]-u;return g+=v*v*s,g<=1},e};function i5(t){const[e,r,n,i]=t,o=[n[0],r[1]],a=[i[0],e[1]];return[o,a]}const H1e=Object.freeze(Object.defineProperty({__proto__:null,getCanvasEllipseCorners:i5,pointInEllipse:Rw,precalculatePointInEllipse:zE},Symbol.toStringTag,{value:"Module"}));function o5(t,e,r){let n;const i=Gl(t,e);if(t[0]===e[0]&&t[1]===e[1]&&(n=t),!n){const o=((r[0]-t[0])*(e[0]-t[0])+(r[1]-t[1])*(e[1]-t[1]))/i;o<0?n=t:o>1?n=e:n=[t[0]+o*(e[0]-t[0]),t[1]+o*(e[1]-t[1])]}return{point:[...n],distanceSquared:Gl(r,n)}}function xm(t,e,r){return o5(t,e,r).distanceSquared}function Di(t,e,r){if(t.length!==2||e.length!==2||r.length!==2)throw Error("lineStart, lineEnd, and point should have 2 elements of [x, y]");return Math.sqrt(xm(t,e,r))}function R2(t){return typeof t=="number"?t?t<0?-1:1:t===t?0:NaN:NaN}function a5(t,e,r,n,i=!1){const[o,a]=t,[s,c]=e,[l,f]=r,[u,d]=n;if(i){const I=(o-s)*(f-d)-(a-c)*(l-u);if(Math.abs(I)<1e-10)return;const P=((o-l)*(f-d)-(a-f)*(l-u))/I,O=o+P*(s-o),A=a+P*(c-a);return[O,A]}const h=c-a,g=o-s,p=s*a-o*c,v=h*l+g*f+p,y=h*u+g*d+p;if(v!==0&&y!==0&&R2(v)===R2(y))return;const m=d-f,w=l-u,x=u*f-l*d,C=m*o+w*a+x,S=m*s+w*c+x;if(C!==0&&S!==0&&R2(C)===R2(S))return;const T=h*w-m*g;let _;_=g*x-w*p;const E=_/T;_=m*p-h*x;const b=_/T;return[E,b]}const Ig=.01;function Lv(t,e,r){const n=t[0]<=e[0]?t[0]:e[0],i=t[0]>=e[0]?t[0]:e[0],o=t[1]<=e[1]?t[1]:e[1],a=t[1]>=e[1]?t[1]:e[1];if(!(r[0]>=n-Ig&&r[0]<=i+Ig&&r[1]>=o-Ig&&r[1]<=a+Ig))return!1;const c=(e[1]-t[1])*(r[0]-e[0])-(e[0]-t[0])*(r[1]-e[1]);return(c>=0?c:-c)<=Ig}const K1e=Object.freeze(Object.defineProperty({__proto__:null,distanceToPoint:Di,distanceToPointSquared:xm,distanceToPointSquaredInfo:o5,intersectLine:a5,isPointOnLineSegment:Lv},Symbol.toStringTag,{value:"Module"}));function IU(t){if(t.length<3)return!1;const e=t.length,r=t[0],n=t[e-1],i=Gl(r,n);return Ju(0,i)}function tf(t,e,r={closed:void 0}){if(t.length<3)return!1;const n=t.length;let i=0;const{closed:o,holes:a}=r;if(a!=null&&a.length){for(const l of a)if(tf(l,e))return!1}const s=!(o===void 0?IU(t):o),c=t.length-(s?1:2);for(let l=0;l<=c;l++){const f=t[l],u=l===n-1?0:l+1,d=t[u],h=f[0]>=d[0]?f[0]:d[0],g=f[1]>=d[1]?f[1]:d[1],p=f[1]<=d[1]?f[1]:d[1];if(e[0]<=h&&e[1]>=p&&e[1]h?s:h,c=c>g?c:g,i&&(l=lp?f:p)}return i?{minX:o,maxX:s,minY:a,maxY:c,minZ:l,maxZ:f}:{minX:o,maxX:s,minY:a,maxY:c}}function Sm(t){const e=t.length;let r=0,n=e-1;for(let i=0;i=0?1:-1}function q1e(t){const e=Ge(),r=t[0];for(let n=0,i=t.length;ne[0]?t[0]:e[0],c=t[1]>e[1]?t[1]:e[1],l=r[0]n[0]?r[0]:n[0],d=r[1]>n[1]?r[1]:n[1];if(o>u||sd||c0?1:2}function A2(t,e,r){return e[0]<=Math.max(t[0],r[0])&&e[0]>=Math.min(t[0],r[0])&&e[1]<=Math.max(t[1],r[1])&&e[1]>=Math.min(t[1],r[1])}function HE(t,e,r,n=!0){const i=[],o=t.length,a=o-(n?1:2);for(let s=0;s<=a;s++){const c=t[s],l=s===o-1?0:s+1,f=t[l];jE(e,r,c,f)&&i.push([s,l])}return i}const Y1e=.01;function OU(t,e,r,n){const i=[e[0]-t[0],e[1]-t[1]],o=[n[0]-r[0],n[1]-r[1]],a=o[1]*i[0]-o[0]*i[1];if((a>=0?a:-a)e[0]?t[0]:e[0],t[1]e[1]?t[1]:e[1]],p=[r[0]n[0]?r[0]:n[0],r[1]n[1]?r[1]:n[1]];if(!(g[0]<=p[1]&&g[1]>=p[0]&&g[2]<=p[3]&&g[3]>=p[2])||!(Lv(t,e,r)||Lv(t,e,n)||Lv(r,n,t)))return;const m=g[0]>p[0]?g[0]:p[0],w=g[1]p[2]?g[2]:p[2],C=g[3]{const p=g[0],v=e[g[0]],y=e[g[1]],m=OU(l,d,v,y),w=Gl(l,m);return{sourceLineSegmentId:p,coordinate:m,targetStartPointDistSquared:w}});h.sort((g,p)=>g.targetStartPointDistSquared-p.targetStartPointDistSquared),h.forEach(g=>{const{sourceLineSegmentId:p,coordinate:v}=g,y={type:ud.Intersection,coordinates:v,position:nh.Edge,direction:a,visited:!1,next:null},m={...y,direction:T0.Unknown,cloned:!0};a===T0.Entering?y.next=m:m.next=y;let w=i.get(p);w||(w=[],i.set(p,w)),r.push(y),w.push(m),a*=-1})}for(let s=0,c=e.length;s({intersectionPoint:h,lineSegStartDistSquared:Gl(f,h.coordinates)})).sort((h,g)=>h.lineSegStartDistSquared-g.lineSegStartDistSquared).map(({intersectionPoint:h})=>h).forEach(h=>n.push(h))}return pI(r),pI(n),{targetPolylinePoints:r,sourcePolylinePoints:n}}function PU(t){for(let e=0,r=t.length;e=f&&console.warn("Maximum iterations reached in mergePolylines, possible infinite loop detected"),s}function Aw(t,e){const r=M1(t),n=M1(e),i=Pt(n,r);Ju(-1,i)||(e=e.slice().reverse());const{targetPolylinePoints:o}=MU(t,e);let a=null;const s=[];let c=0;const l=t.length*2;for(;(a=PU(o))&&c=h&&console.warn("Maximum inner iterations reached in subtractPolylines, possible infinite loop detected"),s.push(f)}return c>=l&&console.warn("Maximum outer iterations reached in subtractPolylines, possible infinite loop detected"),s}function RU(t,e,r,n=!0){let i,o;n?(o=t.length-1,i=0):(o=0,i=1);for(let a=i;ad&&(d=v,h=g)}d{const u=[t[f[0]],t[f[1]]],d=[(u[0][0]+u[1][0])/2,(u[0][1]+u[1][1])/2];s.push(Ir(d,e))});const c=Math.min(...s),l=s.indexOf(c);return{segment:a[l],distance:c}}const t0=.001,Q1e=(t,e)=>{let r,n,i;if(t instanceof mr){const a=t.getImageData();if(!a)return;n=a.direction.slice(0,3),i=a.direction.slice(3,6),r=a.spacing}else{const a=t.getImageData(),{direction:s,spacing:c}=a,{viewPlaneNormal:l,viewUp:f}=t.getCamera(),u=s.slice(0,3),d=s.slice(3,6),h=s.slice(6,9),g=Ge();Wn(g,f,l);const p=Math.abs(Pt(g,u)),v=Math.abs(Pt(g,d)),y=Math.abs(Pt(g,h));let m;if(Math.abs(1-p)o4(t,e){const{xDir:i,yDir:o,spacing:a}=n,s=Se(t),{viewport:c}=s;if(!e.length)return e.push(r),console.log(">>>>> !canvasPoints. :: RETURN"),1;const l=c.canvasToWorld(e[e.length-1]),f=c.canvasToWorld(r),u=Ge();Qn(u,f,l);const d=Math.abs(Pt(u,i)),h=Math.abs(Pt(u,o)),g=Math.max(Math.floor(d/a[0]),Math.floor(h/a[0]));if(g>1){const p=e[e.length-1],v=o4(p,r),y=nn();ai(y,r,p),vs(y,y[0]/v,y[1]/v);const m=v/g;for(let w=1;w<=g;w++)e.push([p[0]+m*y[0]*w,p[1]+m*y[1]*w])}else e.push(r);return g},nme=(t,e,r,n)=>{const i=[t[0]-e[0],t[1]-e[1]],o=[r[0]-e[0],r[1]-e[1]],a=i[0]*o[0]+i[1]*o[1];if(a<0)return!1;const s=Math.sqrt(o[0]*o[0]+o[1]*o[1]);if(s===0)return!1;const c=a/s,l=[o[0]/s,o[1]/s],f=[l[0]*c,l[1]*c],u=[e[0]+f[0],e[1]+f[1]];return!(Ir(t,u)>n||Ir(e,u)>Ir(e,r))},rme=1e-6;function AU(t){let e;const r=dE(t,50);for(let a=0;a<3;a++)if(r.every((s,c,l)=>Math.abs(s[a]-l[0][a])[o[0],o[1]]).sort((o,a)=>o[0]===a[0]?o[1]-a[1]:o[0]-a[0]);function r(o,a,s){return(a[0]-o[0])*(s[1]-o[1])-(a[1]-o[1])*(s[0]-o[0])}const n=[];for(const o of e){for(;n.length>=2&&r(n[n.length-2],n[n.length-1],o)<=0;)n.pop();n.push(o)}const i=[];for(let o=e.length-1;o>=0;o--){const a=e[o];for(;i.length>=2&&r(i[i.length-2],i[i.length-1],a)<=0;)i.pop();i.push(a)}return n.pop(),i.pop(),n.concat(i)}const pf=Object.freeze(Object.defineProperty({__proto__:null,addCanvasPointsToArray:tme,containsPoint:tf,containsPoints:Cm,convexHull:NU,decimate:qE,getAABB:nf,getArea:Sm,getClosestLineSegmentIntersection:Z1e,getFirstLineSegmentIntersectionIndexes:RU,getLineSegmentIntersectionsCoordinates:LU,getLineSegmentIntersectionsIndexes:HE,getNormal2:M1,getNormal3:X1e,getSignedArea:$E,getSubPixelSpacingAndXYDirections:Q1e,getWindingDirection:Av,intersectPolyline:KE,isClosed:IU,isPointInsidePolyline3D:XE,mergePolylines:Lw,pointCanProjectOnLine:nme,pointsAreWithinCloseContourProximity:eme,projectTo2D:AU,subtractPolylines:Aw},Symbol.toStringTag,{value:"Module"}));function ime(t,e,r,n){const i=[t,e],o=[t+r,e],a=[t+r,e],s=[t+r,e+n],c=[t+r,e+n],l=[t,e+n],f=[t,e+n];return{top:[i,o],right:[a,s],bottom:[c,l],left:[f,[t,e]]}}function YE(t,e){if(t.length!==4||e.length!==2)throw Error("rectangle:[left, top, width, height] or point: [x,y] not defined correctly");const[r,n,i,o]=t;let a=655535;const s=ime(r,n,i,o);return Object.keys(s).forEach(c=>{const[l,f]=s[c],u=Di(l,f,e);u0){if(o>i)return 0;o>n&&(r[0]=o)}else{if(o=r[0]&&o<=r[2]&&a>=r[1]&&a<=r[3])return mI;const u=[0,1];if(N2(r[0]-o,l,u)&&N2(o-r[2],-l,u)&&N2(r[1]-a,f,u)&&N2(a-r[3],-f,u)){const[d,h]=u;return h<1&&(i[0]=o+h*l,i[1]=a+h*f),d>0&&(n[0]+=d*l,n[1]+=d*f),mI}return sme}const cme=Object.freeze(Object.defineProperty({__proto__:null,findClosestPoint:BS,liangBarksyClip:Zg},Symbol.toStringTag,{value:"Module"}));function lme(t,e){const[r,n]=t,[i,o]=e,a=Nn(Ge(),n,r),s=Nn(Ge(),i,o),c=Pt(a,s),l=sa(a),f=sa(s),u=c/(l*f);return Math.acos(u)*180/Math.PI}function ume(t,e){const[r,n]=t,[i,o]=e,a=Cs(nn(),n,r),s=Cs(nn(),i,o),c=i4(a,s),l=wy(a),f=wy(s),u=c/(l*f);return Math.acos(u)*(180/Math.PI)}function rh(t,e){return t[0].length===3?lme(t,e):ume(t,e)}const fme=Object.freeze(Object.defineProperty({__proto__:null,angleBetweenLines:rh},Symbol.toStringTag,{value:"Module"})),dme=Object.freeze(Object.defineProperty({__proto__:null,BasicStatsCalculator:z1e,aabb:B1e,angle:fme,circle:j1e,ellipse:H1e,lineSegment:K1e,point:$1e,polyline:pf,rectangle:ome,vec2:cme},Symbol.toStringTag,{value:"Module"}));function fc(t,e,r,n){var g,p,v;const{canvasToWorld:i,worldToCanvas:o}=r,{data:a}=t,{targetWindingDirection:s}=e;let{points:c}=e,l=Av(c);(g=n==null?void 0:n.decimate)!=null&&g.enabled&&(c=qE(e.points,(p=n==null?void 0:n.decimate)==null?void 0:p.epsilon));let{closed:f}=e;const u=c.length,d=new Array(u);Av(c);const h=yF(t);if(f===void 0){let y=!1;if(c.length>3){const m=Gl(c[0],c[u-1]);y=Yt(0,m)}f=y}if((n==null?void 0:n.updateWindingDirection)!==!1){let y=h?h.data.contour.windingDirection*-1:s;y===void 0&&(y=l),y!==l&&c.reverse();const m=(((v=a.handles)==null?void 0:v.points)??[]).map(o);m.length>2&&Av(m)!==y&&a.handles.points.reverse(),l=y}for(let y=0;y{He.svgNodeCache[i][a].touched=!1}),{svgLayerElement:o,svgNodeCacheForCanvas:He.svgNodeCache,getSvgNode:mme.bind(this,i),appendNode:vme.bind(this,o,i),setNodeTouched:yme.bind(this,i),clearUntouched:wme.bind(this,o,i)}}function pme(t){const e=`.${hme}`,r=t.querySelector(e);return r==null?void 0:r.querySelector(":scope > .svg-layer")}function mme(t,e){if(He.svgNodeCache[t]&&He.svgNodeCache[t][e])return He.svgNodeCache[t][e].domRef}function vme(t,e,r,n){if(!He.svgNodeCache[e])return null;He.svgNodeCache[e][n]={touched:!0,domRef:r},t.appendChild(r)}function yme(t,e){He.svgNodeCache[t]&&He.svgNodeCache[t][e]&&(He.svgNodeCache[t][e].touched=!0)}function wme(t,e){He.svgNodeCache[e]&&Object.keys(He.svgNodeCache[e]).forEach(r=>{const n=He.svgNodeCache[e][r];!n.touched&&n.domRef&&(t.removeChild(n.domRef),delete He.svgNodeCache[e][r])})}function kU(t,e){const r=gme(t);e(r),r.clearUntouched()}function Zc(t,e,r){return`${t}::${e}::${r}`}function Za(t,e){Object.keys(t).forEach(r=>{const n=e.getAttribute(r),i=t[r];i===void 0||i===""?e.removeAttribute(r):n!==i&&e.setAttribute(r,i)})}function Qc(t,e){Object.keys(t).forEach(r=>{const n=t[r];n!==void 0&&n!==""&&e.setAttribute(r,n)})}function ua(t,e,r,n,i,o={},a=""){const{color:s,fill:c,width:l,lineWidth:f,lineDash:u,fillOpacity:d,strokeOpacity:h}=Object.assign({color:"rgb(0, 255, 0)",fill:"transparent",width:"2",lineDash:void 0,lineWidth:void 0,strokeOpacity:1,fillOpacity:1},o),g=f||l,p="http://www.w3.org/2000/svg",v=Zc(e,"circle",r),y=t.getSvgNode(v),m={cx:`${n[0]}`,cy:`${n[1]}`,r:`${i}`,stroke:s,fill:c,"stroke-width":g,"stroke-dasharray":u,"fill-opacity":d,"stroke-opacity":h};if(y)Za(m,y),t.setNodeTouched(v);else{const w=document.createElementNS(p,"circle");a!==""&&w.setAttribute("data-id",a),Qc(m,w),t.appendNode(w,v)}}function JE(t,e,r,n,i={},o=""){const{color:a,width:s,lineWidth:c,lineDash:l}=Object.assign({color:"rgb(0, 255, 0)",width:"2",lineWidth:void 0,lineDash:void 0},i),f=c||s,u="http://www.w3.org/2000/svg",d=Zc(e,"ellipse",r),h=t.getSvgNode(d),[g,p,v,y]=n,m=Math.hypot(v[0]-y[0],v[1]-y[1]),w=Math.hypot(p[0]-g[0],p[1]-g[1]),x=Math.atan2(v[1]-y[1],v[0]-y[0])*180/Math.PI,C=[(v[0]+y[0])/2,(p[1]+g[1])/2],S=m/2,T=w/2,_={cx:`${C[0]}`,cy:`${C[1]}`,rx:`${S}`,ry:`${T}`,stroke:a,fill:"transparent",transform:`rotate(${x} ${C[0]} ${C[1]})`,"stroke-width":f,"stroke-dasharray":l};if(h)Za(_,h),t.setNodeTouched(d);else{const E=document.createElementNS(u,"ellipse");o!==""&&E.setAttribute("data-id",o),Qc(_,E),t.appendNode(E,d)}}function xme(t,e,r,n,i,o={},a=""){const s=[(n[0]+i[0])/2,n[1]],c=[(n[0]+i[0])/2,i[1]],l=[n[0],(n[1]+i[1])/2],f=[i[0],(n[1]+i[1])/2];JE(t,e,r,[c,s,l,f],o={},a="")}function s5(t,e,r,n,i={},o){const{color:a,handleRadius:s,width:c,lineWidth:l,fill:f,type:u,opacity:d}=Object.assign({color:"rgb(0, 255, 0)",handleRadius:"6",width:"2",lineWidth:void 0,fill:"transparent",type:"circle",opacity:1},i),h=l||c,g="http://www.w3.org/2000/svg",p=Zc(e,"handle",`hg-${r}-index-${o}`);let v;if(u==="circle")v={cx:`${n[0]}`,cy:`${n[1]}`,r:s,stroke:a,fill:f,"stroke-width":h,opacity:d};else if(u==="rect"){const w=parseFloat(s)*1.5,x=n[0]-w*.5,C=n[1]-w*.5;v={x:`${x}`,y:`${C}`,width:`${w}`,height:`${w}`,stroke:a,fill:f,"stroke-width":h,rx:`${w*.1}`,opacity:d}}else throw new Error(`Unsupported handle type: ${u}`);const y=t.getSvgNode(p);if(y)Za(v,y),t.setNodeTouched(p);else{const m=document.createElementNS(g,u);Qc(v,m),t.appendNode(m,p)}}function ur(t,e,r,n,i={}){n.forEach((o,a)=>{s5(t,e,r,o,i,a)})}function Tn(t,e,r,n,i,o={},a=""){if(isNaN(n[0])||isNaN(n[1])||isNaN(i[0])||isNaN(i[1]))return;const{color:s="rgb(0, 255, 0)",width:c=10,lineWidth:l,lineDash:f,markerStartId:u=null,markerEndId:d=null,shadow:h=!1,strokeOpacity:g=1}=o,p=l||c,v="http://www.w3.org/2000/svg",y=Zc(e,"line",r),m=t.getSvgNode(y),w=t.svgLayerElement.id,x=h?`filter:url(#shadow-${w});`:"",C={x1:`${n[0]}`,y1:`${n[1]}`,x2:`${i[0]}`,y2:`${i[1]}`,stroke:s,style:x,"stroke-width":p,"stroke-dasharray":f,"marker-start":u?`url(#${u})`:"","marker-end":d?`url(#${d})`:"","stroke-opacity":g};if(m)Za(C,m),t.setNodeTouched(y);else{const S=document.createElementNS(v,"line");a!==""&&S.setAttribute("data-id",a),Qc(C,S),t.appendNode(S,y)}}function VU(t,e,r,n,i,o={}){if(isNaN(n[0])||isNaN(n[1])||isNaN(i[0])||isNaN(i[1]))return;const{color:a,width:s,lineWidth:c,lineDash:l}=Object.assign({color:"rgb(0, 255, 0)",width:"2",lineWidth:void 0,lineDash:void 0},o),f=i[0]+(n[0]-i[0])/2,u=[f,n[1]],d=[f,i[1]],h={start:n,end:u},g={start:u,end:d},p={start:d,end:i};Tn(t,e,"1",h.start,h.end,{color:a,width:s,lineWidth:c,lineDash:l}),Tn(t,e,"2",g.start,g.end,{color:a,width:s,lineWidth:c,lineDash:l}),Tn(t,e,"3",p.start,p.end,{color:a,width:s,lineWidth:c,lineDash:l})}function ac(t,e,r,n,i){if(n.length<2)return;const{color:o="rgb(0, 255, 0)",width:a=10,fillColor:s="none",fillOpacity:c=0,lineWidth:l,lineDash:f,closePath:u=!1,markerStartId:d=null,markerEndId:h=null}=i,g=l||a,p="http://www.w3.org/2000/svg",v=Zc(e,"polyline",r),y=t.getSvgNode(v);let m="";for(const x of n)m+=`${x[0].toFixed(1)}, ${x[1].toFixed(1)} `;if(u){const x=n[0];m+=`${x[0]}, ${x[1]}`}const w={points:m,stroke:o,fill:s,"fill-opacity":c,"stroke-width":g,"stroke-dasharray":f,"marker-start":d?`url(#${d})`:"","marker-end":h?`url(#${h})`:""};if(y)Za(w,y),t.setNodeTouched(v);else{const x=document.createElementNS(p,"polyline");Qc(w,x),t.appendNode(x,v)}}function Pl(t,e,r,n,i){const a=n.length&&n[0].length&&Array.isArray(n[0][0])?n:[n],{color:s="rgb(0, 255, 0)",width:c=10,fillColor:l="none",fillOpacity:f=0,lineWidth:u,lineDash:d,closePath:h=!1}=i,g=u||c,p="http://www.w3.org/2000/svg",v=Zc(e,"path",r),y=t.getSvgNode(v);let m="";for(let x=0,C=a.length;xm.length){for(let C=0;C0?BS(n,i):i,c=_me(o),l=BS(c,s),f=Object.assign({color:"rgb(255, 255, 0)",lineWidth:"1",lineDash:"2,3"},a);Tn(t,e,`link-${r}`,s,l,f)}function _me(t){const{x:e,y:r,height:n,width:i}=t,o=i/2,a=n/2,s=[e+o,r],c=[e,r+a],l=[e+o,r+n],f=[e+i,r+a];return[s,c,l,f]}function uo(t,e,r,n,i,o,a,s={}){const c=Object.assign({handleRadius:"6",centering:{x:!1,y:!0}},s),l=rf(t,e,r,n,i,c);return Tme(t,e,r,o,i,l,c),l}function ZE(t,e,r,n,i={},o=""){const{color:a,width:s,lineWidth:c,lineDash:l}=Object.assign({color:"rgb(0, 255, 0)",width:"2",lineWidth:void 0,lineDash:void 0},i),f=c||s,u="http://www.w3.org/2000/svg",d=Zc(e,"rect",r),h=t.getSvgNode(d),[g,p,v,y]=n,m=Math.hypot(g[0]-p[0],g[1]-p[1]),w=Math.hypot(g[0]-v[0],g[1]-v[1]),x=[(y[0]+g[0])/2,(y[1]+g[1])/2],C=[(v[0]+g[0])/2,(v[1]+g[1])/2],S=Math.atan2(x[1]-C[1],x[0]-C[0])*180/Math.PI,T={x:`${x[0]-m/2}`,y:`${x[1]-w/2}`,width:`${m}`,height:`${w}`,stroke:a,fill:"transparent",transform:`rotate(${S} ${x[0]} ${x[1]})`,"stroke-width":f,"stroke-dasharray":l};if(h)Za(T,h),t.setNodeTouched(d);else{const _=document.createElementNS(u,"rect");o!==""&&_.setAttribute("data-id",o),Qc(T,_),t.appendNode(_,d)}}function Tm(t,e,r,n,i,o={},a=""){const s=[n[0],n[1]],c=[i[0],n[1]],l=[n[0],i[1]],f=[i[0],i[1]];ZE(t,e,r,[s,c,l,f],o,a)}const wI="http://www.w3.org/2000/svg";function c5(t,e,r,n,i,o={}){if(isNaN(n[0])||isNaN(n[1])||isNaN(i[0])||isNaN(i[1]))return;const{viaMarker:a=!1,color:s="rgb(0, 255, 0)",markerSize:c=10}=o;if(!a){Eme(t,e,r,n,i,o);return}const l=t.svgLayerElement.id,u=`${`arrow-${e}`}-${l}`,d=t.svgLayerElement.querySelector("defs");let h=d.querySelector(`#${u}`);if(h){h.setAttribute("markerWidth",`${c}`),h.setAttribute("markerHeight",`${c}`);const g=h.querySelector("path");g&&g.setAttribute("fill",s)}else{h=document.createElementNS(wI,"marker"),h.setAttribute("id",u),h.setAttribute("viewBox","0 0 10 10"),h.setAttribute("refX","8"),h.setAttribute("refY","5"),h.setAttribute("markerWidth",`${c}`),h.setAttribute("markerHeight",`${c}`),h.setAttribute("orient","auto");const g=document.createElementNS(wI,"path");g.setAttribute("d","M 0 0 L 10 5 L 0 10 z"),g.setAttribute("fill",s),h.appendChild(g),d.appendChild(h)}o.markerEndId=u,Tn(t,e,r,n,i,o)}function Eme(t,e,r,n,i,o={}){const{color:a="rgb(0, 255, 0)",width:s=2,lineWidth:c,lineDash:l}=o,f=10,u=Math.atan2(i[1]-n[1],i[0]-n[0]),d={start:[i[0]-f*Math.cos(u-Math.PI/7),i[1]-f*Math.sin(u-Math.PI/7)],end:i},h={start:[i[0]-f*Math.cos(u+Math.PI/7),i[1]-f*Math.sin(u+Math.PI/7)],end:i};Tn(t,e,r,n,i,{color:a,width:s,lineWidth:c,lineDash:l}),Tn(t,e,"2",d.start,d.end,{color:a,width:s,lineWidth:c,lineDash:l}),Tn(t,e,"3",h.start,h.end,{color:a,width:s,lineWidth:c,lineDash:l})}function FU(t,e,r,n,i,o={}){const{color:a,width:s,lineWidth:c,lineDash:l}=Object.assign({color:"rgb(0, 255, 0)",width:"2",lineWidth:void 0,lineDash:void 0},o),f=c||s,u="http://www.w3.org/2000/svg",d=Zc(e,"rect",r),h=t.getSvgNode(d),g=[Math.min(n[0],i[0]),Math.min(n[1],i[1])],p=Math.abs(n[0]-i[0]),v=Math.abs(n[1]-i[1]),y={x:`${g[0]}`,y:`${g[1]}`,width:`${p}`,height:`${v}`,stroke:a,fill:"black","stroke-width":f,"stroke-dasharray":l};if(h)Za(y,h),t.setNodeTouched(d);else{const m=document.createElementNS(u,"rect");Qc(y,m),t.appendNode(m,d)}}const bme=Object.freeze(Object.defineProperty({__proto__:null,draw:kU,drawArrow:c5,drawCircle:ua,drawEllipse:xme,drawEllipseByCoordinates:JE,drawFan:WS,drawHandle:s5,drawHandles:ur,drawHeight:VU,drawLine:Tn,drawLinkedTextBox:uo,drawPath:Pl,drawPolyline:ac,drawRect:Tm,drawRectByCoordinates:ZE,drawRedactionRect:FU,drawTextBox:rf,setAttributesIfNecessary:Za,setNewAttributesIfValid:Qc},Symbol.toStringTag,{value:"Module"}));function UU(t,e){const r=Se(t),{renderingEngineId:n,viewportId:i}=r,o=Fr(i,n);if(!o)return[];const a=[],s=Object.keys(o.toolOptions);for(let c=0;c{this._throwIfDestroyed();const e=Array.from(this._viewportElements.values());for(let r=0;r{this._needsRender.add(r)}),this._renderFlaggedViewports()}_setViewportsToBeRenderedNextFrame(e){const r=[...this._viewportElements.values()];e.forEach(n=>{r.indexOf(n)!==-1&&this._needsRender.add(n)}),this._render()}_render(){this._needsRender.size>0&&this._animationFrameSet===!1&&(this._animationFrameHandle=window.requestAnimationFrame(this._renderFlaggedViewports),this._animationFrameSet=!0)}_triggerRender(e){const r=Se(e);if(!r)return;if(!ni(r.renderingEngineId)){console.warn("rendering Engine has been destroyed");return}const i=UU(e,[Dme,Ime,Ome]),{renderingEngineId:o,viewportId:a}=r,s={element:e,renderingEngineId:o,viewportId:a};kU(e,c=>{let l=!1;const f=u=>{if(u.renderAnnotation){const d=u.renderAnnotation(r,c);l=l||d}};i.forEach(f),l&&it(e,k.ANNOTATION_RENDERED,{...s})})}_reset(){window.cancelAnimationFrame(this._animationFrameHandle),this._needsRender.clear(),this._animationFrameSet=!1,this._animationFrameHandle=null,this._setAllViewportsToBeRenderedNextFrame()}}const QE=new Mme;function Xh(t){QE.renderViewport(t)}function Ne(t){t.length&&t.forEach(e=>{const r=qn(e);if(!r){console.warn(`Viewport not available for ${e}`);return}const{viewport:n}=r;if(!n){console.warn(`Viewport not available for ${e}`);return}const i=n.element;Xh(i)})}function BU(t,e){const r=t.length,n=[];for(let i=0;i{const i=n.getCamera();return Math.abs(Pt(i.viewPlaneNormal,e.viewPlaneNormal))>r})}function Ot(t,e,r=!0){const n=Se(t),{renderingEngine:i,FrameOfReferenceUID:o}=n;let a=i.getViewports();a=BU(a,o),a=Nw(a,e);const s=i.getViewport(n.viewportId);return r&&(a=GU(a,s.getCamera())),a.map(l=>l.id)}const Nme=Object.freeze(Object.defineProperty({__proto__:null,filterViewportsWithFrameOfReferenceUID:BU,filterViewportsWithParallelNormals:GU,filterViewportsWithToolEnabled:Nw,getViewportIdsWithToolToRender:Ot},Symbol.toStringTag,{value:"Module"})),l5="PlanarFreehandContourSegmentationTool";function of(t,e){const r=t.length,n=new Array(r);for(let i=0;i{const n=r,i=of(n.data.contour.polyline,t);return{annotation:n,polyline:i}})}function Vw(t,e,r){pm(e,r),Ul(r);const{contour:n}=r.data,i=of(n.polyline,t);fc(r,{points:i,closed:n.closed,targetWindingDirection:e.data.contour.windingDirection===la.Clockwise?la.CounterClockwise:la.Clockwise},t);const{element:o}=t;n8(t,[e,r])}function t8(t,e,r,n,i){var m;if(!Dw(l5)){console.warn(`${l5} is not registered in cornerstone. Cannot combine polylines.`);return}const o=i[0],a=tf(r,o),s=WU(t,e),c=new Set(s),l=new Map,f=(w,x)=>{let C=l.get(w);C||(C=[],l.set(w,C)),C.push(x),c.delete(x)},u=[];if(a){const w=Lw(r,i);u.push(w),Array.from(c.keys()).forEach(x=>f(w,x))}else Aw(r,i).forEach(x=>{u.push(x),Array.from(c.keys()).forEach(C=>{Cm(x,C.polyline)&&f(x,C)})});Array.from(l.values()).forEach(w=>w.forEach(x=>bw(x.annotation)));const{element:d}=t,{metadata:h,data:g}=e,{handles:p,segmentation:v}=g,{textBox:y}=p;yn(n.annotationUID),yn(e.annotationUID),Ul(n),Ul(e);for(let w=0;wpm(C,S.annotation))}n8(t,[e,n])}function zU(t,e,r){const n=t.canvasToWorld(r[0]),i=t.canvasToWorld(r[r.length-1]),o={metadata:{...e.metadata,toolName:l5,originalToolName:e.metadata.originalToolName||e.metadata.toolName},data:{cachedStats:{},handles:{points:[n,i],textBox:e.data.handles.textBox?{...e.data.handles.textBox}:void 0},contour:{polyline:[],closed:!0},spline:e.data.spline,segmentation:{...e.data.segmentation}},annotationUID:kn(),highlighted:!0,invalidated:!0,isLocked:!1,isVisible:void 0,interpolationUID:e.interpolationUID,interpolationCompleted:e.interpolationCompleted};return fc(o,{points:r,closed:!0,targetWindingDirection:la.Clockwise},t),o}function n8(t,e){const{element:r}=t,n=new Set([l5]);e.forEach(i=>{n.add(i.metadata.toolName)});for(const i of n.values())if(Dw(i)){const o=Ot(r,i);Ne(o)}}function Fw(t,e){const r=[],n=new Set,i=new Set;for(let o=0;o[...r]);let e=t[0].map(r=>[...r]);for(let r=1;ru5(o.data.contour.polyline,r)),i=e.map(o=>u5(o.data.contour.polyline,r));return Fw(n,i)}function u5(t,e){const r=t.length,n=new Array(r);for(let i=0;i[...n]);let r=t.map(n=>[...n]);for(let n=0;nu5(o.data.contour.polyline,r)),i=e.map(o=>u5(o.data.contour.polyline,r));return Uw(n,i)}const Bme="PlanarFreehandContourSegmentationTool";function $U(t,e,r,n){const i=new Map;return r.forEach(o=>{if(o.length<3)return;const a={annotationUID:kn(),data:{contour:{closed:!0,polyline:o},segmentation:{segmentationId:e,segmentIndex:n},handles:{}},handles:{},highlighted:!1,autoGenerated:!1,invalidated:!1,isLocked:!1,isVisible:!0,metadata:{toolName:Bme,...t.getViewReference()}};ln(a,t.element);const s=(i==null?void 0:i.get(n))||new Set;s.add(a.annotationUID),i.set(n,s)}),i}function xI(t,e){const r=[],{annotationUIDsMap:n}=t,i=n.get(e);for(const o of i){const a=ri(o),{polyline:s}=a.data.contour;r.push(s)}return r}function jU(t,e,r,n){if(!e||!e.representationData.Contour)return;const i=e.representationData.Contour,{annotationUIDsMap:o}=i;if(!o||!o.get(r)||!o.get(n))return;const a=xI(i,r),s=xI(i,n),c=a.map(f=>of(f,t)),l=s.map(f=>of(f,t));return{polyLinesCanvas1:c,polyLinesCanvas2:l}}function Gme(t,e,r,n,{name:i,segmentIndex:o,color:a}){const{polyLinesCanvas1:s,polyLinesCanvas2:c}=jU(t,e,r,n)||{};if(!s||c)return;const f=Fw(s,c).map(g=>e8(g,t)),u=$U(t,e.segmentationId,f,o),d=e.representationData.Contour,{annotationUIDsMap:h}=d;h&&h.set(o,u.get(o))}function Wme(t,e,r,n,{name:i,segmentIndex:o,color:a}){const{polyLinesCanvas1:s,polyLinesCanvas2:c}=jU(t,e,r,n)||{};if(!s||c)return;const f=Uw(s,c).map(g=>e8(g,t)),u=$U(t,e.segmentationId,f,o),d=e.representationData.Contour,{annotationUIDsMap:h}=d;h&&h.set(o,u.get(o))}function _m(t){var e;return!!((e=t.data)!=null&&e.segmentation)}function HU(t,e,r){const n=[],i=nf(e);for(let o=0;oa.isContourHole),o=n.filter(a=>!a.isContourHole);if(i.length>0){const a=i[0];qme(t,a.targetAnnotation,e),qU(t,[e,a.targetAnnotation]);return}if(o.length!==0){if(!Dw(f5)){console.warn(`${f5} is not registered in cornerstone. Cannot process multiple intersections.`);return}$me(t,e,r,o)}}function $me(t,e,r,n){const{element:i}=t,o=[e],a=[],s=[];n.forEach(({targetAnnotation:d})=>{const h=Kme(t,d);s.push(...h),o.push(d)});const c=r[0];if(n.some(({targetPolyline:d})=>tf(d,c))){let d=r;n.forEach(({targetPolyline:h})=>{d=Lw(d,h)}),a.push(d)}else n.forEach(({targetPolyline:d})=>{const h=Aw(d,r);a.push(...h)});o.forEach(d=>{yn(d.annotationUID),Ul(d)}),s.forEach(d=>bw(d.annotation));const f=n[0].targetAnnotation,u=[];a.forEach(d=>{if(!d||d.length<3){console.warn("Skipping creation of new annotation due to invalid polyline:",d);return}const h=jme(t,f,d);ln(h,i),Bl(h),cn(h,t.element),u.push(h)}),Hme(t,s,u),qU(t,o)}function jme(t,e,r){const n=t.canvasToWorld(r[0]),i=t.canvasToWorld(r[r.length-1]),o={metadata:{...e.metadata,toolName:f5,originalToolName:e.metadata.originalToolName||e.metadata.toolName},data:{cachedStats:{},handles:{points:[n,i],textBox:e.data.handles.textBox?{...e.data.handles.textBox}:void 0},contour:{polyline:[],closed:!0},spline:e.data.spline,segmentation:{...e.data.segmentation}},annotationUID:kn(),highlighted:!0,invalidated:!0,isLocked:!1,isVisible:void 0,interpolationUID:e.interpolationUID,interpolationCompleted:e.interpolationCompleted};return fc(o,{points:r,closed:!0,targetWindingDirection:la.Clockwise},t),o}function Hme(t,e,r){e.forEach(n=>{const i=r.find(o=>{const a=r8(o.data.contour.polyline,t);return Cm(a,n.polyline)});i&&pm(i,n.annotation)})}function Kme(t,e){return mm(e).map(r=>{const n=r,i=r8(n.data.contour.polyline,t);return{annotation:n,polyline:i}})}function qme(t,e,r){pm(e,r),Ul(r);const{contour:n}=r.data,i=r8(n.polyline,t);fc(r,{points:i,closed:n.closed,targetWindingDirection:e.data.contour.windingDirection===la.Clockwise?la.CounterClockwise:la.Clockwise},t)}function r8(t,e){const r=t.length,n=new Array(r);for(let i=0;i{n.add(i.metadata.toolName)});for(const i of n.values())if(Dw(i)){const o=Ot(r,i);Ne(o)}}const{isEqual:CI}=Vn;function i8(t){const{metadata:e}=t;return vV().filter(r=>{if(r.FrameOfReferenceUID===e.FrameOfReferenceUID){const n=r.viewport,{viewPlaneNormal:i,viewUp:o}=n.getCamera();return CI(i,e.viewPlaneNormal)&&(!e.viewUp||CI(o,e.viewUp))}}).map(r=>r.viewport)}async function Xme(t,e,r,n=!0){const i=typeof t=="string"?ri(t):t,o=typeof e=="string"?ri(e):e;if(!i||!o)throw new Error("Both source and target annotations must be valid");r||(r=Yme(i));const a=of(i.data.contour.polyline,r),s=of(o.data.contour.polyline,r),c=kw(a,s);if(!c.hasIntersection){console.warn("No intersection found between the two annotations");return}if(c.isContourHole){if(!n){console.warn("Hole processing is disabled");return}Vw(r,o,i)}else t8(r,o,s,i,a)}function Yme(t){const e=i8(t);if(!e.length)throw new Error("No viewport found for the annotation");return e[0]}const Jme=Object.freeze(Object.defineProperty({__proto__:null,addContourSegmentationAnnotation:Bl,addition:Gme,areSameSegment:sU,checkIntersection:kw,combinePolylines:t8,contourSegmentationOperation:Xme,convertContourPolylineToCanvasSpace:of,convertContourPolylineToWorld:e8,convertContourSegmentationAnnotation:GE,createNewAnnotationFromPolyline:zU,createPolylineHole:Vw,findAllIntersectingContours:HU,getContourHolesData:WU,isContourSegmentationAnnotation:_m,processMultipleIntersections:KU,removeContourSegmentationAnnotation:Ul,subtractAnnotationPolylines:Ume,subtractMultiplePolylineSets:Fme,subtractPolylineSets:Uw,subtraction:Wme,unifyAnnotationPolylines:Vme,unifyMultiplePolylineSets:kme,unifyPolylineSets:Fw,updateViewportsForAnnotations:n8},Symbol.toStringTag,{value:"Module"}));function Zme(t){if(!t)throw new Error(`No contours found for geometryId ${t.id}`);const e=t.id;if(t.type!==Pc.CONTOUR)throw new Error(`Geometry type ${t.type} not supported for rendering.`);if(!t.data){console.warn(`No contours found for geometryId ${e}. Skipping render.`);return}}function Qme(t,e,r,n){r.size?t.render():e2e(t,e,n)}function e2e(t,e,r){const{segmentationId:n}=r,i=new Map;e.forEach(o=>{const a=Fe.getGeometry(o);if(!a){console.warn(`No geometry found for geometryId ${o}. Skipping render.`);return}const s=a.data.segmentIndex;Zme(a);const c=qa.getStyle({viewportId:t.id,segmentationId:n,type:Lt.Contour,segmentIndex:s}),l=a.data,f=t.getCamera().viewPlaneNormal;l.contours.forEach(u=>{const{points:d,color:h,id:g}=u,p=FE(t,d[0],f),v={annotationUID:kn(),data:{contour:{closed:!0,polyline:d},segmentation:{segmentationId:n,segmentIndex:s,color:h,id:g},handles:{}},handles:{},highlighted:!1,autoGenerated:!1,invalidated:!1,isLocked:!0,isVisible:!0,metadata:{referencedImageId:p,toolName:"PlanarFreehandContourSegmentationTool",FrameOfReferenceUID:t.getFrameOfReferenceUID(),viewPlaneNormal:t.getCamera().viewPlaneNormal}},y=t.element;ln(v,y),Bl(v)}),c&&i.set(s,c)}),t.render()}function t2e(t,e,r=!1){const n=zn(e),{annotationUIDsMap:i}=n.representationData.Contour;i.forEach(o=>{o.forEach(a=>{yn(a)})})}function XU(t){const e=Kpe(t);if(e)return e;const r=zn(t);if(!r)throw new Error(`No segmentation found for segmentationId ${t}`);let n;if(r.representationData.Labelmap)n=n2e(r,t);else if(r.representationData.Contour)n=o2e(r);else if(r.representationData.Surface)n=a2e(r);else throw new Error(`Unsupported segmentation type: ${r.representationData}`);return qpe(t,n),n}function n2e(t,e){const r=t.representationData[Lt.Labelmap],n=new Set;return r.imageIds?i2e(n,r.imageIds):r2e(n,e),Array.from(n).map(Number).sort((i,o)=>i-o)}function r2e(t,e){Fe.getVolume(e).voxelManager.forEach(({value:n})=>{n!==0&&t.add(n)})}function i2e(t,e){e.forEach(r=>{Fe.getImage(r).voxelManager.getScalarData().forEach(o=>{o!==0&&t.add(o)})})}function o2e(t){const{annotationUIDsMap:e,geometryIds:r}=t.representationData.Contour||{};if(!r)throw new Error(`No geometryIds found for segmentationId ${t.segmentationId}`);const n=new Set([...e.keys()]);return r.forEach(i=>{const o=Fe.getGeometry(i);n.add(o.data.segmentIndex)}),Array.from(n).sort((i,o)=>i-o)}function a2e(t){var r;const e=((r=t.representationData.Surface)==null?void 0:r.geometryIds)??[];return Array.from(e.keys()).map(Number).sort((n,i)=>n-i)}const n0=new Map,SI=new Map;function s2e(t,e,r=!1){const n=qn(t);if(!n)return;const{viewport:i}=n;t2e(t,e),r&&i.render()}async function c2e(t,e){var l,f;const{segmentationId:r}=e,n=zn(r);if(!n)return;let i=n.representationData[Lt.Contour];const o=Ml();if(!i&&((l=Ml())!=null&&l.canComputeRequestedRepresentation(r,Lt.Contour))&&!n0.get(t.id)?(n0.set(t.id,!0),i=await kE(r,Lt.Contour,()=>o.computeContourData(r,{viewport:t}),()=>{}),n0.set(t.id,!1)):!i&&!Ml()&&console.debug(`No contour data found for segmentationId ${r} and PolySeg add-on is not configured. Unable to convert from other representations to contour. Please register PolySeg using cornerstoneTools.init({ addons: { polySeg } }) to enable automatic conversion.`),!i||!((f=i.geometryIds)!=null&&f.length))return;let a=!1;const s=t.getCamera().viewPlaneNormal;i.annotationUIDsMap&&(a=!u2e(i.annotationUIDsMap,s)),i.geometryIds.length>0&&(a=!l2e(i.geometryIds,s));const c=SI.get(t.id)||new Set;if(a&&!n0.get(t.id)&&!c.has(r)&&t.viewportStatus===Uo.RENDERED){n0.set(t.id,!0);const u=XU(r),h=(await o.computeSurfaceData(r,{segmentIndices:u,viewport:t})).geometryIds,g=[];for(const m of h.values()){const x=Fe.getGeometry(m).data;g.push({points:x.points,polys:x.polys,segmentIndex:x.segmentIndex,id:x.segmentIndex})}const p=await o.clipAndCacheSurfacesForViewport(g,t),v=o.extractContourData(p),y=o.createAndAddContourSegmentationsFromClippedSurfaces(v,t,r);i.annotationUIDsMap=new Map([...i.annotationUIDsMap,...y]),c.add(r),SI.set(t.id,c),n0.set(t.id,!1)}Qme(t,i.geometryIds,i.annotationUIDsMap,e)}function l2e(t,e){var u,d,h;let r=null,n=null;for(const g of t){const p=Fe.getGeometry(g);if(!p)continue;const v=p.data;if(((h=(d=(u=v.contours)==null?void 0:u[0])==null?void 0:d.points)==null?void 0:h.length)>=3){r=p,n=v;break}}if(!r||!n)return!1;const o=n.contours[0].points,a=o[0],s=o[1],c=o[2];let l=Wn(Ge(),Nn(Ge(),s,a),Nn(Ge(),c,a));l=rr(Ge(),l);const f=Pt(l,e);return Math.abs(f)>.9}function u2e(t,e){const r=Array.from(t.values()).flat().map(i=>Array.from(i)).flat(),n=dE(r,3);for(const i of n){const o=ri(i);if(o!=null&&o.metadata){if(!o.metadata.viewPlaneNormal)continue;const a=o.metadata.viewPlaneNormal,s=Math.abs(e[0]*a[0]+e[1]*a[1]+e[2]*a[2]);if(Math.abs(s-1)>.01)return!1}}return!0}const YU={render:c2e,removeRepresentation:s2e};function mf(t,e){return Wl(t,e)[0]}function Wl(t,e){return sr.getCurrentLabelmapImageIdsForViewport(t,e)}function f2e(t,e){return sr.getLabelmapImageIdsForImageId(t,e)}const TI=new Map,d2e=({cfun:t,ofun:e,actor:r})=>{r.getProperty().setRGBTransferFunction(1,t),r.getProperty().setScalarOpacity(1,e)};async function h2e({viewport:t,volumeInputs:e,segmentationId:r}){var E;const n=t.getDefaultActor(),{actor:i}=n,{uid:o,callback:a}=n,s=t.getVolumeId();if((E=TI.get(o))!=null&&E.added)return{uid:o,actor:i};const c=e,l=Fe.getVolume(c[0].volumeId);if(!l)throw new Error(`imageVolume with id: ${l.volumeId} does not exist`);const{volumeId:f}=c[0],u=await K4(f);if(!u)throw new Error(`segImageVolume with id: ${u.volumeId} does not exist`);const h=u.voxelManager.getCompleteScalarDataArray(),{imageData:g}=u,p=Fe.getVolume(s),y=p.voxelManager.getCompleteScalarDataArray(),m=2,w=new Float32Array(m*p.voxelManager.getScalarDataLength()),x=g.getDimensions();for(let b=0;bte);for(const X of j)for(let te=0;te{Je.removeEventListener(k.SEGMENTATION_DATA_MODIFIED,_);const D=t.getActor(o),{element:I,id:P}=t;t.removeActors([o]);const O=await Vy({volumeId:o,blendMode:Mc.MAXIMUM_INTENSITY_BLEND,callback:({volumeActor:A})=>{D.callback&&D.callback({volumeActor:A,volumeId:f})}},I,P);t.addActor({actor:O,uid:o}),t.render()}),{uid:o,actor:i}}const{uuidv4:JU}=Vn;async function g2e(t,e,r,n){const i=Se(t),{renderingEngine:o,viewport:a}=i,{id:s}=a,c=!0,l=!1,f=!0;if(a instanceof Or){const d=p2e(e,r);Fe.getVolume(d)||await m2e(e);let h=(n==null?void 0:n.blendMode)??Mc.MAXIMUM_INTENSITY_BLEND,g=h===Mc.LABELMAP_EDGE_PROJECTION_BLEND;if(g){const v=a.getVolumeId(),y=Fe.getVolume(v),w=Fe.getVolume(d).dimensions,x=y.dimensions;(w[0]!==x[0]||w[1]!==x[1]||w[2]!==x[2])&&(g=!1,h=Mc.MAXIMUM_INTENSITY_BLEND,console.debug("Dimensions mismatch - falling back to regular volume addition"))}const p=[{volumeId:d,visibility:c,representationUID:`${r}-${Lt.Labelmap}`,useIndependentComponents:g,blendMode:h}];if(!p[0].useIndependentComponents)await kk(o,p,[s],l,f);else return await h2e({viewport:a,volumeInputs:p,segmentationId:r})}else{const d=Wl(a.id,r).map(h=>({imageId:h,representationUID:`${r}-${Lt.Labelmap}-${h}`}));Vk(o,d,[s])}bo(r)}function p2e(t,e){let{volumeId:r}=t;if(!r){r=JU();const n=zn(e);n.representationData.Labelmap={...n.representationData.Labelmap,volumeId:r},t.volumeId=r,ns(e)}return r}async function m2e(t){const e=t;if(!(e.imageIds.length>0))throw new Error("cannot create labelmap, no imageIds found for the volume labelmap");return await q4(t.volumeId||JU(),e.imageIds)}function v2e(t,e){const r=Se(t),{viewport:n}=r;n.removeActors([a1e(n.id,e)])}function Dd(t){return sr.getActiveSegmentation(t)}function y2e(t,e){sr.setActiveSegmentation(t,e)}function Kl(t){return Dd(t)}function w2e(t,e){y2e(t,e)}const x2e=Object.freeze(Object.defineProperty({__proto__:null,getActiveSegmentation:Kl,setActiveSegmentation:w2e},Symbol.toStringTag,{value:"Module"}));function Ra(t){const e=zn(t);if(e){const r=Object.keys(e.segments).find(n=>e.segments[n].active);return r?Number(r):void 0}}const _3=255,Sp=new Map;let E3=!1;function C2e(t,e,r=!1){const n=qn(t);if(Sp.forEach((o,a)=>{a.includes(e)&&Sp.delete(a)}),!n)return;const{viewport:i}=n;v2e(i.element,e),r&&i.render()}async function S2e(t,e){var s;const{segmentationId:r,config:n}=e,i=zn(r);if(!i){console.warn("No segmentation found for segmentationId: ",r);return}let o=i.representationData[Lt.Labelmap],a=Cp(t.id,r);if(!o&&((s=Ml())!=null&&s.canComputeRequestedRepresentation(r,Lt.Labelmap))&&!E3){E3=!0;const c=Ml();if(o=await kE(r,Lt.Labelmap,()=>c.computeLabelmapData(r,{viewport:t}),()=>null,()=>{sr.processLabelmapRepresentationAddition(t.id,r),setTimeout(()=>{bo(r)},0)}),!o)throw new Error(`No labelmap data found for segmentationId ${r}.`);E3=!1}else!o&&!Ml()&&console.debug(`No labelmap data found for segmentationId ${r} and PolySeg add-on is not configured. Unable to convert from other representations to labelmap. Please register PolySeg using cornerstoneTools.init({ addons: { polySeg } }) to enable automatic conversion.`);if(o){if(t instanceof vr)a!=null&&a.length||await EI(t,o,r,n),a=Cp(t.id,r);else{const c=Wl(t.id,r);if(!(c!=null&&c.length))return;a||await EI(t,o,r,n),a=Cp(t.id,r)}if(a!=null&&a.length)for(const c of a)T2e(t.id,c,e)}}function T2e(t,e,r){var C;const{segmentationId:n}=r,{cfun:i,ofun:o}=r.config,{colorLUTIndex:a}=r,s=Kl(t),c=(s==null?void 0:s.segmentationId)===n,l=qa.getStyle({viewportId:t,type:Lt.Labelmap,segmentationId:n}),f=qa.getRenderInactiveSegmentations(t),u=ym(a),d=Math.min(256,u.length),{outlineWidth:h,renderOutline:g,outlineOpacity:p,activeSegmentOutlineWidthDelta:v}=_I(l,c),y=VE(t,{segmentationId:n,type:Lt.Labelmap});for(let S=0;So.getCurrentImageId()===r),!i||!i.length)?void 0:i[0].getImageData()}else if(e.startsWith("volumeId:")){const r=Jc(e),n=om(r);return!n||!n.length?void 0:n[0].getImageData()}else if(e.startsWith("videoId:")){const r=Hr(e),n=Gy(r);return!n||!n.length?void 0:n[0].getImageData()}else throw new Error('getTargetIdImage: targetId must start with "imageId:" or "volumeId:"')}getTargetId(e){var n;const r=(n=e.getViewReferenceId)==null?void 0:n.call(e);if(r)return r;throw new Error("getTargetId: viewport must have a getViewReferenceId method")}undo(){this.doneEditMemo(),k2.undo()}redo(){k2.redo()}static createZoomPanMemo(e){const r={pan:e.getPan(),zoom:e.getZoom()},n={restoreMemo:()=>{const i=e.getPan(),o=e.getZoom();e.setZoom(r.zoom),e.setPan(r.pan),e.render(),r.pan=i,r.zoom=o}};return k2.push(n),n}doneEditMemo(){var e,r;(r=(e=this.memo)==null?void 0:e.commitMemo)!=null&&r.call(e)&&k2.push(this.memo),this.memo=null}};Pp.defaults={configuration:{strategies:{},defaultStrategy:void 0,activeStrategy:void 0,strategyOptions:{}}};let Ci=Pp;Ci.toolName="BaseTool";const{isEqual:E2e}=Vn,{EPSILON:b2e}=df,D2e=1-b2e;function o8(t,e,r){var c;const{viewPlaneNormal:n}=e,i=t.filter(l=>{let f=l.metadata.viewPlaneNormal;if(!l.metadata.referencedImageId&&!f&&l.metadata.FrameOfReferenceUID){for(const d of l.data.handles.points){const h=Nn(Ge(),d,e.focalPoint),g=Pt(h,e.viewPlaneNormal);if(!E2e(g,0))return!1}return l.metadata.viewPlaneNormal=e.viewPlaneNormal,l.metadata.cameraFocalPoint=e.focalPoint,!0}if(!f){const{referencedImageId:d}=l.metadata,{imageOrientationPatient:h}=vt("imagePlaneModule",d),g=At(h[0],h[1],h[2]),p=At(h[3],h[4],h[5]);f=Ge(),Wn(f,g,p),l.metadata.viewPlaneNormal=f}const u=Math.abs(Pt(n,f))>D2e;return f&&u});if(!i.length)return[];const o=r/2,{focalPoint:a}=e,s=[];for(const l of i){const f=l.data,u=f.handles.points[0]||((c=f.contour)==null?void 0:c.polyline[0]);if(!l.isVisible)continue;const d=Ge();if(!u){s.push(l);continue}Nn(d,a,u);const h=Pt(d,n);Math.abs(h)n.isVisible?n.data.isCanvasAnnotation?!0:t.isReferenceViewable(n.metadata,r):!1)}function QU(t){if(t){if(t.data&&t.highlighted)return Xs.Highlighted;if(wm(t.annotationUID))return Xs.Selected;if(mi(t.annotationUID))return Xs.Locked;if(t.data&&t.autoGenerated)return Xs.AutoGenerated}return Xs.Default}function I2e(t,e,r){const n=_h("textBoxFontSize",t,e,r),i=_h("textBoxFontFamily",t,e,r);return`${n}px ${i}`}const O2e=Object.freeze(Object.defineProperty({__proto__:null,getFont:I2e,getState:QU,style:_E},Symbol.toStringTag,{value:"Module"}));class vf extends Ci{constructor(){super(...arguments),this.onImageSpacingCalibrated=e=>{const{element:r,imageId:n}=e.detail,i=Hr(n),o=uc();o.getFramesOfReference().forEach(s=>{const l=o.getAnnotations(s)[this.getToolName()];!l||!l.length||(l.forEach(f=>{var d;if(!((d=f.metadata)!=null&&d.referencedImageId))return;Hr(f.metadata.referencedImageId)===i&&(f.invalidated=!0,f.data.cachedStats={})}),Xh(r))})}}filterInteractableAnnotationsForElement(e,r){if(!(r!=null&&r.length))return[];const n=Se(e),{viewport:i}=n;return Em(i,r)}createAnnotation(e){const r=e.detail,{currentPoints:n,element:i}=r,{world:o}=n,a=Se(i),{viewport:s}=a,c=s.getCamera(),{viewPlaneNormal:l,viewUp:f,position:u}=c,d=this.getReferencedImageId(s,o,l,f),h=s.getViewReference({points:[o]});return{highlighted:!0,invalidated:!0,metadata:{toolName:this.getToolName(),...h,referencedImageId:d,viewUp:f,cameraPosition:u},data:{cachedStats:{},handles:{points:[],activeHandleIndex:null,textBox:{hasMoved:!1,worldPosition:[0,0,0],worldBoundingBox:{topLeft:[0,0,0],topRight:[0,0,0],bottomLeft:[0,0,0],bottomRight:[0,0,0]}}}}}}getReferencedImageId(e,r,n,i){const o=this.getTargetId(e);let a=o.split(/^[a-zA-Z]+:/)[1];if(e instanceof Or){const s=Jc(o),c=Fe.getVolume(s);a=Vl(c,r,n)}return a}getStyle(e,r,n){return _h(e,r,QU(n),this.mode)}}vf.toolName="AnnotationDisplayTool";const{DefaultHistoryMemo:M2e}=lE,{PointsManager:P2e}=Vn;class pr extends vf{static createAnnotation(...e){let r={annotationUID:null,highlighted:!0,invalidated:!0,metadata:{toolName:this.toolName},data:{text:"",handles:{points:new Array,textBox:{hasMoved:!1,worldPosition:[0,0,0],worldBoundingBox:{topLeft:[0,0,0],topRight:[0,0,0],bottomLeft:[0,0,0],bottomRight:[0,0,0]}}},label:""}};for(const n of e)r=Wi(r,n);return r}static createAnnotationForViewport(e,...r){return this.createAnnotation({metadata:e.getViewReference()},...r)}static createAndAddAnnotation(e,...r){const n=this.createAnnotationForViewport(e,...r);ln(n,e.element),cn(n,e.element)}constructor(e,r){var n,i;super(e,r),this.mouseMoveCallback=(o,a)=>{if(!a)return!1;const{element:s,currentPoints:c}=o.detail,l=c.canvas;let f=!1;for(const u of a){if(mi(u.annotationUID)||!ii(u.annotationUID))continue;const{data:d}=u,h=d.handles?d.handles.activeHandleIndex:void 0,g=this._imagePointNearToolOrHandle(s,u,l,6),p=g&&!u.highlighted,v=!g&&u.highlighted;p||v?(u.highlighted=!u.highlighted,f=!0):d.handles&&d.handles.activeHandleIndex!==h&&(f=!0)}return f},this.isSuvScaled=pr.isSuvScaled,(n=e.configuration)!=null&&n.getTextLines&&(this.configuration.getTextLines=e.configuration.getTextLines),(i=e.configuration)!=null&&i.statsCalculator&&(this.configuration.statsCalculator=e.configuration.statsCalculator)}getHandleNearImagePoint(e,r,n,i){const o=Se(e),{viewport:a}=o,{data:s}=r,{isCanvasAnnotation:c}=s,{points:l,textBox:f}=s.handles;if(f){const{worldBoundingBox:u}=f;if(u){const d={topLeft:a.worldToCanvas(u.topLeft),topRight:a.worldToCanvas(u.topRight),bottomLeft:a.worldToCanvas(u.bottomLeft),bottomRight:a.worldToCanvas(u.bottomRight)};if(n[0]>=d.topLeft[0]&&n[0]<=d.bottomRight[0]&&n[1]>=d.topLeft[1]&&n[1]<=d.bottomRight[1])return s.handles.activeHandleIndex=null,f}}for(let u=0;u<(l==null?void 0:l.length);u++){const d=l[u],h=c?d.slice(0,2):a.worldToCanvas(d);if(Ir(n,h)this.getStyle(p,n,r),{annotationUID:o}=r,a=ii(o),s=mi(o),c=i("lineWidth"),l=i("lineDash"),f=i("angleArcLineDash"),u=i("color"),d=i("markerSize"),h=i("shadow"),g=this.getLinkedTextBoxStyle(n,r);return{visibility:a,locked:s,color:u,lineWidth:c,lineDash:l,lineOpacity:1,fillColor:u,fillOpacity:0,shadow:h,textbox:g,markerSize:d,angleArcLineDash:f}}_imagePointNearToolOrHandle(e,r,n,i){if(this.getHandleNearImagePoint(e,r,n,i)||this.isPointNearTool(e,r,n,i,"mouse"))return!0}static createAnnotationState(e,r){const{data:n,annotationUID:i}=e,o={...n,cachedStats:{}};delete o.contour,delete o.spline;const a={annotationUID:i,data:structuredClone(o),deleting:r},s=n.contour;return s&&(a.data.contour={...s,polyline:null,pointsManager:P2e.create3(s.polyline.length,s.polyline)}),a}static createAnnotationMemo(e,r,n){if(!r)return;const{newAnnotation:i,deleting:o=i?!1:void 0}=n||{},{annotationUID:a}=r,s=pr.createAnnotationState(r,o),c={restoreMemo:()=>{const l=pr.createAnnotationState(r,o),{viewport:f}=Se(e)||{};if(f==null||f.setViewReference(r.metadata),s.deleting===!0){if(s.deleting=!1,Object.assign(r.data,s.data),r.data.contour){const d=r.data;d.contour.polyline=s.data.contour.pointsManager.points,delete s.data.contour.pointsManager,d.segmentation&&Bl(r)}s.data=l.data,ln(r,e),ca(r.annotationUID,!0),f==null||f.render();return}if(s.deleting===!1){s.deleting=!0,s.data=l.data,ca(r.annotationUID),yn(r.annotationUID),f==null||f.render();return}const u=ri(a);if(!u){console.warn("No current annotation");return}Object.assign(u.data,s.data),u.data.contour&&(u.data.contour.polyline=s.data.contour.pointsManager.points),s.data=l.data,u.invalidated=!0,cn(u,e,Zt.History)},id:a,operationType:"annotation"};return M2e.push(c),c}createMemo(e,r,n){this.memo||(this.memo=pr.createAnnotationMemo(e,r,n))}static hydrateBase(e,r,n,i={}){if(!r)return null;const{viewport:o}=r,a=o.getFrameOfReferenceUID(),s=o.getCamera(),c=i.viewplaneNormal??s.viewPlaneNormal,l=i.viewUp??s.viewUp,f=i.toolInstance||new e;let u,d=c,h=l;if(i.referencedImageId)u=i.referencedImageId,d=void 0,h=void 0;else if(o instanceof mr){const g=uE(n[0],o);g!==void 0&&(u=o.getImageIds()[g])}else if(o instanceof Or)u=f.getReferencedImageId(o,n[0],c,l);else throw new Error("Unsupported viewport type");return{FrameOfReferenceUID:a,referencedImageId:u,viewPlaneNormal:d,viewUp:h,instance:f,viewport:o}}}pr.toolName="AnnotationTool";const{CalibrationTypes:Nf}=ts,kf="px",V2="voxels",eB=[1,2,3,4],R2e=["3,3","4,7"],L2e=["4,3","4,7"],zS={0:"px",1:"percent",2:"dB",3:"cm",4:"seconds",5:"hertz",6:"dB/seconds",7:"cm/sec",8:"cm²",9:"cm²/s",12:"degrees"},A2e=.001,Og="²",La=(t,e)=>{const{calibration:r,hasPixelSpacing:n}=t;let i=n?"mm":kf;const o=n?"mm³":V2;let a=i+Og,s=1,c="";if(!r||!r.type&&!r.sequenceOfUltrasoundRegions)return{unit:i,areaUnit:a,scale:s,volumeUnit:o};if(r.type===Nf.UNCALIBRATED)return{unit:kf,areaUnit:kf+Og,scale:s,volumeUnit:V2};if(r.sequenceOfUltrasoundRegions){let f,u;if(Array.isArray(e)&&e.length===2)[f,u]=e;else if(typeof e=="function"){const y=e();f=y[0],u=y[1]}let d=r.sequenceOfUltrasoundRegions.filter(y=>f[0]>=y.regionLocationMinX0&&f[0]<=y.regionLocationMaxX1&&f[1]>=y.regionLocationMinY0&&f[1]<=y.regionLocationMaxY1&&u[0]>=y.regionLocationMinX0&&u[0]<=y.regionLocationMaxX1&&u[1]>=y.regionLocationMinY0&&u[1]<=y.regionLocationMaxY1);if(!(d!=null&&d.length))return{unit:i,areaUnit:a,scale:s,volumeUnit:o};if(d=d.filter(y=>eB.includes(y.regionDataType)&&R2e.includes(`${y.physicalUnitsXDirection},${y.physicalUnitsYDirection}`)),!d.length)return{unit:kf,areaUnit:kf+Og,scale:s,volumeUnit:V2};const h=d[0],g=Math.abs(h.physicalDeltaX),p=Math.abs(h.physicalDeltaY);if(Yt(g,p,A2e))s=1/g,c="US Region",i=zS[h.physicalUnitsXDirection]||"unknown",a=i+Og;else return{unit:kf,areaUnit:kf+Og,scale:s,volumeUnit:V2}}else r.scale&&(s=r.scale);return[Nf.ERMF,Nf.USER,Nf.ERROR,Nf.PROJECTION,Nf.CALIBRATED,Nf.UNKNOWN].includes(r==null?void 0:r.type)&&(c=r.type),{unit:i+(c?` ${c}`:""),areaUnit:a+(c?` ${c}`:""),scale:s,volumeUnit:o+(c?` ${c}`:"")}},d5=(t,e)=>{const[r]=e,{calibration:n}=t;let i=["raw"],o=[null],a="";if(!n||!n.type&&!n.sequenceOfUltrasoundRegions)return{units:i,values:o};if(n.sequenceOfUltrasoundRegions){const s=n.sequenceOfUltrasoundRegions.filter(p=>eB.includes(p.regionDataType)&&L2e.includes(`${p.physicalUnitsXDirection},${p.physicalUnitsYDirection}`));if(!(s!=null&&s.length))return{units:i,values:o};const c=s.find(p=>r[0]>=p.regionLocationMinX0&&r[0]<=p.regionLocationMaxX1&&r[1]>=p.regionLocationMinY0&&r[1]<=p.regionLocationMaxY1);if(!c)return{units:i,values:o};const{referencePixelX0:l=0,referencePixelY0:f=0}=c,{physicalDeltaX:u,physicalDeltaY:d}=c,h=(r[1]-c.regionLocationMinY0-f)*d,g=(r[0]-c.regionLocationMinX0-l)*u;a="US Region",o=[g,h],i=[zS[c.physicalUnitsXDirection],zS[c.physicalUnitsYDirection]]}return{units:i,values:o,calibrationType:a}},a8=t=>{var e;return((e=t.calibration)==null?void 0:e.aspect)||1};function Bw(t,e,r,n){const i=Ge();Wn(i,e,t);const o=At(...r),a=At(...n),s=Ge();Qn(s,o,a);const c=sa(s);if(c<1e-4)return{worldWidth:0,worldHeight:0};const l=Pt(s,i)/(c*sa(i)),u=Math.sqrt(1-l*l)*c,d=l*c;return{worldWidth:u,worldHeight:d}}function Yh(t,e,r,n){const i=Ge();Wn(i,e,t);const o=At(...r),a=At(...n),s=Ge();Qn(s,o,a);const c=sa(s);if(c<1e-4)return{worldWidth:0,worldHeight:0};const l=Pt(s,i)/(c*sa(i)),u=Math.sqrt(1-l*l)*c,d=l*c;return{worldWidth:u,worldHeight:d}}function s8(t,e,r,n,i=.25){const o=c8(t,e,{targetVolumeId:r,stepSize:i});let a;for(const s of o){const c=t.getIntensityFromWorld(s),l=n(c,s);l&&(a=l)}return a}function c8(t,e,{targetVolumeId:r,stepSize:n}){const i=t.getCamera(),{viewPlaneNormal:o}=i,{spacingInNormalDirection:a}=zh(t,i,r),s=a*n||1,c=t.getBounds(),l=[];let f=[...e];for(;bI(f,c);)l.push([...f]),f[0]+=o[0]*s,f[1]+=o[1]*s,f[2]+=o[2]*s;for(f=[...e];bI(f,c);)l.push([...f]),f[0]-=o[0]*s,f[1]-=o[1]*s,f[2]-=o[2]*s;return l}const bI=function(t,e){const[r,n,i,o,a,s]=e,c=10;return t[0]>r+c&&t[0]i+c&&t[1]a+c&&t[2]{const c=[At(r,n,i),At(o,n,i),At(r,a,i),At(o,a,i),At(r,n,s),At(o,n,s),At(r,a,s),At(o,a,s)],l=At(e[0],e[1],e[2]),f=At(t[0],t[1],t[2]),u=-Pt(l,f);let d=null;for(const h of c){const g=Pt(l,h)+u;if(d===null)d=Math.sign(g);else if(Math.sign(g)!==d)return!0}return!1},{EPSILON:N2e}=df,k2e=1-N2e;function Gw(t,e){const{viewPlaneNormal:r}=e,n=t.filter(i=>{let o=i.metadata.viewPlaneNormal;if(!o){const{referencedImageId:s}=i.metadata,{imageOrientationPatient:c}=vt("imagePlaneModule",s),l=At(c[0],c[1],c[2]),f=At(c[3],c[4],c[5]);o=Ge(),Wn(o,l,f),i.metadata.viewPlaneNormal=o}const a=Math.abs(Pt(r,o))>k2e;return o&&a});return n.length?n:[]}const V2e={filterAnnotationsWithinSlice:o8,getWorldWidthAndHeightFromCorners:Bw,getWorldWidthAndHeightFromTwoPoints:Yh,filterAnnotationsForDisplay:Em,getPointInLineOfSightWithCriteria:s8,isPlaneIntersectingAABB:tB,filterAnnotationsWithinSamePlane:Gw,getPointsInLineOfSight:c8},F2e=Object.freeze(Object.defineProperty({__proto__:null,default:V2e,filterAnnotationsForDisplay:Em,filterAnnotationsWithinSamePlane:Gw,filterAnnotationsWithinSlice:o8,getPointInLineOfSightWithCriteria:s8,getPointsInLineOfSight:c8,getWorldWidthAndHeightFromCorners:Bw,getWorldWidthAndHeightFromTwoPoints:Yh,isPlaneIntersectingAABB:tB},Symbol.toStringTag,{value:"Module"}));function qo(t,e,r){let n=!0,i=!0;if(typeof t!="function")throw new TypeError("Expected a function");return NE(r)&&(n="leading"in r?!!r.leading:n,i="trailing"in r?!!r.trailing:i),qh(t,e,{leading:n,trailing:i,maxWait:e})}function U2e(t){var e;return((e=t[0])==null?void 0:e.length)===3}function B2e(t,e){if(!e||e.length===0||e.length===t.length)return t;const r=e[e.length-1]-e[0]+1,n=u3(e.map(o=>t[o][0])),i=u3(e.map(o=>t[o][1]));if(U2e(t)){const o=u3(e.map(a=>t[a][2]));return y9(bg(n,r),bg(i,r),bg(o,r))}else return y9(bg(n,r),bg(i,r))}function G2e(t,e){const r=[],[n,i]=e,o=i-n+1,a=Math.floor(o/t);let s=0,c=Math.round((o-1)/(a-1)*s)+n;for(;c<=i;)r.push(c),s++,c=Math.round((o-1)/(a-1)*s)+n;return r}function $S(t,e,r,n){const i=r-e+1,o=Math.floor(n/100*i)??1,a=Math.floor(i/o)??1;if(isNaN(i)||!i||!a||i/a<2)return t;const s=Math.max(0,e),c=Math.min(t.length-1,r),l=t.slice(0,s),f=t.slice(c+1,t.length),u=G2e(a,[s,c]),d=B2e(t,u);return[...l,...d,...f]}function Ww(t,e){var n,i;return e!=null&&e.autoGenerated?!1:((n=t==null?void 0:t.smoothing)==null?void 0:n.smoothOnAdd)===!0||((i=t==null?void 0:t.smoothing)==null?void 0:i.smoothOnEdit)===!0}function W2e(t,e){return Wo(t,e)<.001}function z2e(t,e){return Wo(t,e)===0}function $2e(t,e){for(let r=0;rW2e(c,l)===!1,[o,a]=DI([_0(r,t.length,1),r,t],[_0(n,e.length,1),n,e],i,1),[s]=DI([_0(o,t.length,-1),o,t],[_0(a,e.length,-1),a,e],i,-1);return[o,s]}function zw(t,e,r){const{interpolation:n,smoothing:i}=t,o=e;if(n){const{knotsRatioPercentageOnAdd:a,knotsRatioPercentageOnEdit:s,smoothOnAdd:c=!1,smoothOnEdit:l=!1}=i,f=r?s:a;if(r?l:c){const[d,h]=r?j2e(e,r):[0,e.length-1];return!e[d]||!e[h]?e:$S(e,d,h,f)}}return o}const Jh=t=>{if(t.shiftKey)return t.ctrlKey?Yi.ShiftCtrl:t.altKey?Yi.ShiftAlt:t.metaKey?Yi.ShiftMeta:Yi.Shift;if(t.ctrlKey)return t.altKey?Yi.CtrlAlt:t.metaKey?Yi.CtrlMeta:Yi.Ctrl;if(t.altKey)return t.metaKey&&Yi.AltMeta||Yi.Alt;if(t.metaKey)return Yi.Meta};function l8(t,e){const r=t[0],n=t[t.length-1],i=nn();vs(i,n[0]-r[0],n[1]-r[1]),Tl(i,i);const o=nn(),a=nn();vs(o,-i[1],i[0]),vs(a,i[1],-i[0]);const s=[(r[0]+n[0])/2,(r[1]+n[1])/2],c={dist:0,index:null};for(let u=0;uc.dist&&(c.dist=h,c.index=u)}return[t[c.index],s].map(e.canvasToWorld)}function H2e(t,e){const{viewport:r}=t,n=e.data.contour.polyline.map(r.worldToCanvas);return l8(n,r)}const{addCanvasPointsToArray:u8,pointsAreWithinCloseContourProximity:nB,getFirstLineSegmentIntersectionIndexes:rB,getSubPixelSpacingAndXYDirections:K2e}=pf;function q2e(t,e,r){this.isDrawing=!0;const n=t.detail,{currentPoints:i,element:o}=n,a=i.canvas,s=Se(o),{viewport:c}=s,l=Jh(t.detail.event)===this.configuration.contourHoleAdditionModifierKey,{spacing:f,xDir:u,yDir:d}=K2e(c,this.configuration.subPixelResolution)||{};!f||!u||!d||(this.drawData={canvasPoints:[a],polylineIndex:0,contourHoleProcessingEnabled:l,newAnnotation:!0},this.commonData={annotation:e,viewportIdsToRender:r,spacing:f,xDir:u,yDir:d,movingTextBox:!1},He.isInteractingWithTool=!0,o.addEventListener(k.MOUSE_UP,this.mouseUpDrawCallback),o.addEventListener(k.MOUSE_DRAG,this.mouseDragDrawCallback),o.addEventListener(k.MOUSE_CLICK,this.mouseUpDrawCallback),o.addEventListener(k.TOUCH_END,this.mouseUpDrawCallback),o.addEventListener(k.TOUCH_DRAG,this.mouseDragDrawCallback),o.addEventListener(k.TOUCH_TAP,this.mouseUpDrawCallback),Ft(o))}function X2e(t){He.isInteractingWithTool=!1,t.removeEventListener(k.MOUSE_UP,this.mouseUpDrawCallback),t.removeEventListener(k.MOUSE_DRAG,this.mouseDragDrawCallback),t.removeEventListener(k.MOUSE_CLICK,this.mouseUpDrawCallback),t.removeEventListener(k.TOUCH_END,this.mouseUpDrawCallback),t.removeEventListener(k.TOUCH_DRAG,this.mouseDragDrawCallback),t.removeEventListener(k.TOUCH_TAP,this.mouseUpDrawCallback),Xt(t)}function Y2e(t){const e=t.detail,{currentPoints:r,element:n}=e,i=r.world,o=r.canvas,a=Se(n),{viewport:s}=a,{annotation:c,viewportIdsToRender:l,xDir:f,yDir:u,spacing:d,movingTextBox:h}=this.commonData,{polylineIndex:g,canvasPoints:p,newAnnotation:v}=this.drawData;this.createMemo(n,c,{newAnnotation:v});const y=p[p.length-1],m=s.canvasToWorld(y),w=Ge();Qn(w,i,m);const x=Math.abs(Pt(w,f)),C=Math.abs(Pt(w,u));if(!(x<=d[0]&&C<=d[1])){if(h){this.isDrawing=!1;const{deltaPoints:S}=e,T=S.world,{textBox:_}=c.data.handles,{worldPosition:E}=_;E[0]+=T[0],E[1]+=T[1],E[2]+=T[2],_.hasMoved=!0}else{const S=this.findCrossingIndexDuringCreate(t);if(S!==void 0)this.applyCreateOnCross(t,S);else{const T=u8(n,p,o,this.commonData);this.drawData.polylineIndex=g+T}c.invalidated=!0}Ne(l),c.invalidated&&cn(c,n,Zt.HandlesUpdated)}}function J2e(t){const{allowOpenContours:e}=this.configuration,{canvasPoints:r,contourHoleProcessingEnabled:n}=this.drawData,i=r[0],o=r[r.length-1],a=t.detail,{element:s}=a;this.doneEditMemo(),this.drawData.newAnnotation=!1,e&&!nB(i,o,this.configuration.closeContourProximity)?this.completeDrawOpenContour(s,{contourHoleProcessingEnabled:n}):this.completeDrawClosedContour(s,{contourHoleProcessingEnabled:n})}function Z2e(t,e){this.removeCrossedLinesOnCompleteDraw();const{canvasPoints:r}=this.drawData,{contourHoleProcessingEnabled:n,minPointsToSave:i}=e??{};if(i&&r.length=2)if(c.length>this.configuration.checkCanvasEditFallbackProximity){const u=c[0],d=[];for(let p=0;pp.distance-v.distance);const h=[d[0],d[1]],g=Math.min(h[0].index,h[1].index);this.editData.startCrossingIndex=g}else{const u=nn();ai(u,c[1],c[0]),Tl(u,u);const d=6,h=[c[0][0]-u[0]*d,c[0][1]-u[1]*d],g=Id(l,h,c[0],e);if(g){const p=[h];sve(n,p,c[0],this.commonData),c.unshift(...p),this.removePointsUpUntilFirstCrossing(e),this.editData.editIndex=c.length-1,this.editData.startCrossingIndex=g[0]}}}function lve(t){const{editCanvasPoints:e,prevCanvasPoints:r}=this.editData;let n=0;for(let i=0;i0;n--){const i=[r[n],r[n-1]],o=!!Id(e,i[0],i[1],t);if(r.pop(),o)break}}function dve(){const{editCanvasPoints:t,prevCanvasPoints:e,startCrossingIndex:r}=this.editData;if(r===void 0)return;const n=t[t.length-1],i=[];for(let a=0;aa.distance-s.distance);const o=t.slice(0,-1);for(let a=0;a1&&this.checkForFirstCrossing(t,!0),this.editData.snapIndex=this.findSnapIndex(),this.editData.snapIndex===-1){this.finishEditAndStartNewEdit(t);return}this.editData.fusedCanvasPoints=this.fuseEditPointsWithClosedContour(t),g!==void 0&&this.checkForSecondCrossing(t,!0)&&(this.removePointsAfterSecondCrossing(!0),this.finishEditAndStartNewEdit(t)),Ne(c)}function wve(t){const e=t.detail,{element:r}=e,n=Se(r),{viewport:i,renderingEngine:o}=n,{annotation:a,viewportIdsToRender:s}=this.commonData,{fusedCanvasPoints:c,editCanvasPoints:l}=this.editData;fc(a,{points:c,closed:!0,targetWindingDirection:la.Clockwise},i),a.autoGenerated&&(a.autoGenerated=!1),cn(a,r);const f=l.pop();this.editData={prevCanvasPoints:c,editCanvasPoints:[f],startCrossingIndex:void 0,editIndex:0,snapIndex:void 0,annotation:a},Ne(s)}function xve(t){const{prevCanvasPoints:e,editCanvasPoints:r,startCrossingIndex:n,snapIndex:i}=this.editData;if(n===void 0||i===void 0)return;const o=t.detail,{element:a}=o,s=[...r];iB(a,s,e[i],this.commonData),s.length>r.length&&s.pop();let c,l;n>i?(c=i,l=n):(c=n,l=i);const f=Ir(e[c],s[0]),u=Ir(e[c],s[s.length-1]),d=Ir(e[l],s[0]),h=Ir(e[l],s[s.length-1]),g=[];for(let C=0;C=0;C--){const S=s[C];g.push([S[0],S[1]])}for(let C=l;C=0;C--){const S=s[C];y.push([S[0],S[1]])}const m=II(g),w=II(y);return m>w?g:y}function Cve(t){const e=t.detail,{element:r}=e;this.completeClosedContourEdit(r)}function Sve(t){var s;const e=Se(t),{viewport:r}=e,{annotation:n,viewportIdsToRender:i}=this.commonData;this.doneEditMemo();const{fusedCanvasPoints:o,prevCanvasPoints:a}=this.editData;if(o){const c=Ww(this.configuration,n)?zw(this.configuration,o,a):o,l=((s=this.configuration)==null?void 0:s.decimate)||{};fc(n,{points:c,closed:!0,targetWindingDirection:la.Clockwise},r,{decimate:{enabled:!!l.enabled,epsilon:l.epsilon}}),n.autoGenerated&&(n.autoGenerated=!1),cn(n,t)}this.isEditingClosed=!1,this.editData=void 0,this.commonData=void 0,Ne(i),this.deactivateClosedContourEdit(t)}function Tve(t){this.completeClosedContourEdit(t)}function _ve(t){t.activateClosedContourEdit=mve.bind(t),t.deactivateClosedContourEdit=vve.bind(t),t.mouseDragClosedContourEditCallback=yve.bind(t),t.mouseUpClosedContourEditCallback=Cve.bind(t),t.finishEditAndStartNewEdit=wve.bind(t),t.fuseEditPointsWithClosedContour=xve.bind(t),t.cancelClosedContourEdit=Tve.bind(t),t.completeClosedContourEdit=Sve.bind(t)}const{addCanvasPointsToArray:oB,getSubPixelSpacingAndXYDirections:Eve}=pf;function bve(t,e,r){this.isEditingOpen=!0;const n=t.detail,{currentPoints:i,element:o}=n,a=i.canvas,s=Se(o),{viewport:c}=s;this.doneEditMemo();const l=e.data.contour.polyline.map(c.worldToCanvas),{spacing:f,xDir:u,yDir:d}=Eve(c,this.configuration.subPixelResolution);this.editData={prevCanvasPoints:l,editCanvasPoints:[a],startCrossingIndex:void 0,editIndex:0},this.commonData={annotation:e,viewportIdsToRender:r,spacing:f,xDir:u,yDir:d,movingTextBox:!1},He.isInteractingWithTool=!0,o.addEventListener(k.MOUSE_UP,this.mouseUpOpenContourEditCallback),o.addEventListener(k.MOUSE_DRAG,this.mouseDragOpenContourEditCallback),o.addEventListener(k.MOUSE_CLICK,this.mouseUpOpenContourEditCallback),o.addEventListener(k.TOUCH_END,this.mouseUpOpenContourEditCallback),o.addEventListener(k.TOUCH_DRAG,this.mouseDragOpenContourEditCallback),o.addEventListener(k.TOUCH_TAP,this.mouseUpOpenContourEditCallback),Ft(o)}function Dve(t){He.isInteractingWithTool=!1,t.removeEventListener(k.MOUSE_UP,this.mouseUpOpenContourEditCallback),t.removeEventListener(k.MOUSE_DRAG,this.mouseDragOpenContourEditCallback),t.removeEventListener(k.MOUSE_CLICK,this.mouseUpOpenContourEditCallback),t.removeEventListener(k.TOUCH_END,this.mouseUpOpenContourEditCallback),t.removeEventListener(k.TOUCH_DRAG,this.mouseDragOpenContourEditCallback),t.removeEventListener(k.TOUCH_TAP,this.mouseUpOpenContourEditCallback),Xt(t)}function Ive(t){const e=t.detail,{currentPoints:r,element:n}=e,i=r.world,o=r.canvas,a=Se(n),{viewport:s}=a,{viewportIdsToRender:c,xDir:l,yDir:f,spacing:u}=this.commonData,{editIndex:d,editCanvasPoints:h,startCrossingIndex:g}=this.editData,p=h[h.length-1],v=s.canvasToWorld(p),y=Ge();this.createMemo(n,this.commonData.annotation),Qn(y,i,v);const m=Math.abs(Pt(y,l)),w=Math.abs(Pt(y,f));if(m<=u[0]&&w<=u[1])return;g!==void 0&&this.checkAndRemoveCrossesOnEditLine(t);const x=oB(n,h,o,this.commonData),C=d+x;this.editData.editIndex=C,g===void 0&&h.length>1&&this.checkForFirstCrossing(t,!1),this.editData.snapIndex=this.findSnapIndex(),this.editData.fusedCanvasPoints=this.fuseEditPointsWithOpenContour(t),g!==void 0&&this.checkForSecondCrossing(t,!1)?(this.removePointsAfterSecondCrossing(!1),this.finishEditOpenOnSecondCrossing(t)):this.checkIfShouldOverwriteAnEnd(t)&&this.openContourEditOverwriteEnd(t),Ne(c)}function Ove(t){const e=t.detail,{element:r}=e,n=Se(r),{viewport:i}=n,{annotation:o,viewportIdsToRender:a}=this.commonData,s=this.fuseEditPointsForOpenContourEndEdit();fc(o,{points:s,closed:!1},i);const c=o.data.contour.polyline;o.data.handles.points=[c[0],c[c.length-1]],o.data.handles.activeHandleIndex=1,cn(o,r),this.isEditingOpen=!1,this.editData=void 0,this.commonData=void 0,this.doneEditMemo(),this.deactivateOpenContourEdit(r),this.activateOpenContourEndEdit(t,o,a,null)}function Mve(t){const e=t.detail,{currentPoints:r,lastPoints:n}=e,i=r.canvas,o=n.canvas,{snapIndex:a,prevCanvasPoints:s,startCrossingIndex:c}=this.editData;if(c===void 0||a===void 0)return!1;if(a===-1)return!0;if(a!==0&&a!==s.length-1)return!1;const l=i,f=o,u=s[a],d=nn(),h=nn();vs(d,l[0]-f[0],l[1]-f[1]),vs(h,l[0]-u[0],l[1]-u[1]);const g=i4(d,h),p=Math.sqrt(d[0]*d[0]+d[1]*d[1]),v=Math.sqrt(h[0]*h[0]+h[1]*h[1]);return Math.acos(g/(p*v))=n;s--){const c=e[s];i.push([c[0],c[1]])}else for(let s=0;s=0;s--){const c=r[s];i.push([c[0],c[1]])}return i}function Rve(t){const{prevCanvasPoints:e,editCanvasPoints:r,startCrossingIndex:n,snapIndex:i}=this.editData;if(n===void 0||i===void 0)return;const o=t.detail,{element:a}=o,s=[...r];oB(a,s,e[i],this.commonData),s.length>r.length&&s.pop();let c,l;n>i?(c=i,l=n):(c=n,l=i);const f=Ir(e[c],s[0]),u=Ir(e[c],s[s.length-1]),d=Ir(e[l],s[0]),h=Ir(e[l],s[s.length-1]),g=[];for(let y=0;y=0;y--){const m=s[y];g.push([m[0],m[1]])}for(let y=l;yri(r).data.contour.polyline)}function bm(t,e){const r=aB(t),n=[];return r.forEach(i=>{const o=i.length,a=new Array(o);for(let s=0;sn.worldToCanvas(l)),a=bm(r,n),s=[o,...a];Pl(e,r.annotationUID,"1",s,i)}function Hve(t,e,r){var c;const{viewport:n}=t,i=this._getRenderingOptions(t,r),o=r.data.contour.polyline.map(l=>n.worldToCanvas(l));ac(e,r.annotationUID,"1",o,i);const s=r.data.handles.activeHandleIndex;if(((c=this.configuration.alwaysRenderOpenContourHandles)==null?void 0:c.enabled)===!0){const l=this.configuration.alwaysRenderOpenContourHandles.radius,f="0",u=[o[0],o[o.length-1]];s===0?u.shift():s===1&&u.pop(),ur(e,r.annotationUID,f,u,{color:i.color,handleRadius:l})}if(s!==null){const l="1",f=s===0?0:o.length-1,u=o[f];ur(e,r.annotationUID,l,[u],{color:i.color})}}function Kve(t,e,r){const{viewport:n}=t,{openUShapeContourVectorToPeak:i}=r.data,{polyline:o}=r.data.contour;if(this.renderOpenContour(t,e,r),!i)return;const a=n.worldToCanvas(o[0]),s=n.worldToCanvas(o[o.length-1]),c=[n.worldToCanvas(i[0]),n.worldToCanvas(i[1])],l=this._getRenderingOptions(t,r);ac(e,r.annotationUID,"first-to-last",[a,s],{color:l.color,width:l.width,closePath:!1,lineDash:"2,2"}),ac(e,r.annotationUID,"midpoint-to-open-contour",[c[0],c[1]],{color:l.color,width:l.width,closePath:!1,lineDash:"2,2"})}function qve(t,e,r){const n=this._getRenderingOptions(t,r),{allowOpenContours:i}=this.configuration,{canvasPoints:o}=this.drawData;if(n.closePath=!1,ac(e,r.annotationUID,"1",o,n),i){const a=o[0],s=o[o.length-1];Gve(a,s,this.configuration.closeContourProximity)?ac(e,r.annotationUID,"2",[s,a],n):ur(e,r.annotationUID,"0",[a],{color:n.color,handleRadius:2})}}function Xve(t,e,r){const{viewport:n}=t,{fusedCanvasPoints:i}=this.editData;if(i===void 0){this.renderClosedContour(t,e,r);return}const o=bm(r,n),a=[i,...o],s=this._getRenderingOptions(t,r),c="preview-1";r.parentAnnotationUID&&s.fillOpacity&&(s.fillOpacity=0),Pl(e,r.annotationUID,c,a,s)}function Yve(t,e,r){const{fusedCanvasPoints:n}=this.editData;if(n===void 0){this.renderOpenContour(t,e,r);return}const i=this._getRenderingOptions(t,r);ac(e,r.annotationUID,"preview-1",n,i)}function Jve(t,e,r){if(r.parentAnnotationUID)return;const{viewport:n}=t,i=this._getRenderingOptions(t,r),o=r.data.contour.polyline.map(g=>n.worldToCanvas(g)),a=bm(r,n),s="1",c=o[0],l=6,f=100,u=[];for(let g=0;g0}else if(t instanceof mr){const{preScale:r}=t.getImageData()||{};return!!(r!=null&&r.scaled)}else return!1}function jS(t,e){let r=0;for(let n=0;nthis.moveAnnotation(i,r))}updateContourPolyline(e,r,n,i){var a;const o=((a=this.configuration)==null?void 0:a.decimate)||{};fc(e,r,n,{decimate:{enabled:!!o.enabled,epsilon:o.epsilon},updateWindingDirection:i==null?void 0:i.updateWindingDirection})}getPolylinePoints(e){var r;return((r=e.data.contour)==null?void 0:r.polyline)??e.data.polyline}renderAnnotationInstance(e){const{enabledElement:r,annotationStyle:n,svgDrawingHelper:i}=e,o=e.annotation;if(o.parentAnnotationUID)return;const{annotationUID:a}=o,{viewport:s}=r,{worldToCanvas:c}=s,l=this.getPolylinePoints(o).map(y=>c(y)),{lineWidth:f,lineDash:u,color:d,fillColor:h,fillOpacity:g}=n,p=bm(o,s),v=[l,...p];return Pl(i,a,"contourPolyline",v,{color:d,lineDash:u,lineWidth:Math.max(.1,f),fillColor:h,fillOpacity:g}),!0}}class nye{constructor(){this.annotationUIDs=new Set,this._isVisible=!0,this.visibleFilter=this.unboundVisibleFilter.bind(this)}unboundVisibleFilter(e){return!this._isVisible||!this.annotationUIDs.has(e)}has(e){return this.annotationUIDs.has(e)}setVisible(e=!0,r,n){this._isVisible!==e&&(this._isVisible=e,this.annotationUIDs.forEach(i=>{const o=ri(i);if(!o){this.annotationUIDs.delete(i);return}if(o.isVisible===e||!e&&(n==null?void 0:n(i))===!1)return;o.isVisible=e;const a={...r,annotation:o};it(Je,k.ANNOTATION_MODIFIED,a)}))}get isVisible(){return this._isVisible}findNearby(e,r){const n=[...this.annotationUIDs];if(n.length===0)return null;if(!e)return n[r===1?0:n.length-1];const i=n.indexOf(e);return i===-1||i+r<0||i+r>=n.length?null:n[i+r]}add(...e){e.forEach(r=>this.annotationUIDs.add(r))}remove(...e){e.forEach(r=>this.annotationUIDs.delete(r))}clear(){this.annotationUIDs.clear()}}const Zr={...lpe,...ope,resetAnnotationManager:V1e},rye=Object.freeze(Object.defineProperty({__proto__:null,AnnotationGroup:nye,FrameOfReferenceSpecificAnnotationManager:cU,config:O2e,locking:b1e,selection:M1e,state:Zr,visibility:N1e},Symbol.toStringTag,{value:"Module"})),OI="PlanarFreehandContourSegmentationTool";function f8(t,e=[]){const{viewport:r,sliceData:n,annotation:i}=t,o=new Map,{toolName:a,originalToolName:s}=i.metadata,c=s||a,l=(pn(c,r.element)||[]).filter(f=>!f.metadata.originalToolName||f.metadata.originalToolName===c);if(c!==OI){const f=pn(OI,r.element);f!=null&&f.length&&f.forEach(u=>{const{metadata:d}=u;d.originalToolName===c&&d.originalToolName!==d.toolName&&l.push(u)})}if(!(l!=null&&l.length))return o;for(let f=0;fh.metadata.sliceIndex===f);if(!(u!=null&&u.length))continue;const d=u.filter(h=>e.every(g=>{const p=g.parentKey?g.parentKey(h):h,v=p==null?void 0:p[g.key];return Array.isArray(v)?v.every((y,m)=>y===g.value[m]):v===g.value}));d.length&&o.set(f,d)}return o}function iye(t,e){const r=f8(t,e),n=[];if(!(r!=null&&r.size))return n;for(const i of r.values())i.forEach(o=>{n.push(o)});return n}function sB(t,e,r){const n=Wi({data:{},metadata:{}},r);return Object.assign(n,{highlighted:!1,invalidated:!0,autoGenerated:!0,annotationUID:void 0,cachedStats:{},childAnnotationUIDs:[],parentAnnotationUID:void 0}),Object.assign(n.data,{handles:{points:e.points||e||[],interpolationSources:e.sources,activeHandleIndex:null,textBox:{hasMoved:!1,worldPosition:[0,0,0],worldBoundingBox:{topLeft:[0,0,0],topRight:[0,0,0],bottomLeft:[0,0,0],bottomRight:[0,0,0]}}},contour:{...r.data.contour,polyline:t}}),n}function oye(t,e){const r=f8(e,[{key:"interpolationUID",value:e.interpolationUID}]),n=aye(r);if(!n){console.warn("No annotations found to interpolate",r);return}const i=sye(r,t.annotationUID),o=[];for(let a=n[0]+1;a=e[0];o--){const a=r.get(o);if(a!=null&&a.length){if(a[0].autoGenerated)continue;a.length>1&&(i=!1),n.push(o);break}}if(!(!i||!n.length)){for(let o=t+1;o<=e[1];o++){const a=r.get(o);if(a!=null&&a.length){if(a[0].autoGenerated)continue;a.length>1&&(i=!1),n.push(o);break}}if(!(!i||n.length<2))return n}}const{PointsManager:MI}=Vn;function fye(t,e=12){const r=MI.create3(e);r.sources=[];const{sources:n}=r,{length:i,sources:o=[]}=t,a=5;if(in.push(MI.create3(e)));const c=dye(t,a),l=hye(c,e),f=[];if((l==null?void 0:l.length)>2){let u=-1;const d=s/3;l.forEach(p=>{const[v,,y]=p,m=Math.ceil((v+y)/2);y-u2*d?(r0(f,u,v,s,i),u=r0(f,v,m,s,i)):u=r0(f,u,m,s,i),y-u>d&&(u=r0(f,u,y,s,i)))});const h=f[0];HS(h+i-u,i)>2*d&&r0(f,u,h-d,s,i)}else{const u=Math.floor(i/e);r0(f,-1,i-u,u,i)}return f.forEach(u=>{const d=t.getPointArray(u);r.push(d),o.forEach((h,g)=>n[g].push(h.getPoint(u)))}),r}function dye(t,e=6){const{length:r}=t,n=Ge(),i=Ge(),o=new Float32Array(r);for(let a=0;a{try{e&&(r.isInterpolationUpdate=!0,r.autoGenerated=!1),mye(t)}finally{e&&(r.autoGenerated=!0)}})}function mye(t){const{annotation:e}=t;pye(e);const{interpolationData:r,interpolationList:n}=oye(e,t)||{};if(!r||!n)return;const i={toolName:e.metadata.toolName,toolType:e.metadata.toolName,viewport:t.viewport};for(let l=0;ls.x.length,n)})}function yye(t,e,r,n,i,o,a){const[s,c]=n,l=(r-s)/(c-s),f=i.get(s)[0],u=i.get(c)[0],d=Cye(t,e,l,o),h=l>.5?u:f,g=fye(d);i.has(r)?xye(d,g,r,h,a):wye(d,g,r,h,a)}function wye(t,e,r,n,i){var f;const o=t.points,{viewport:a}=i,s=sB(o,e,n),c=a.getViewReference({sliceIndex:r});if(!c)throw new Error(`Can't find slice ${r}`);Object.assign(s.metadata,c),Zr.addAnnotation(s,a.element),(f=n.onInterpolationComplete)==null||f.call(n,s,n);const{parentAnnotationUID:l}=n;if(l){const u=Zr.getAnnotation(l),d=cB(u,r,i);Vw(a,d,s)}}function cB(t,e,r){const{viewport:n}=r,i=Zr.getAnnotations(t.metadata.toolName,n.element);for(let o=0;o!f.autoGenerated)||(s=o||s===n||c.forEach(l=>{l.autoGenerated&&(Zr.removeAnnotation(l.annotationUID),a.push(l))});if(a.length){const s={annotations:a,element:t.viewport.element,viewportId:t.viewport.id,renderingEngineId:t.viewport.getRenderingEngine().id};it(t.viewport.element,k.INTERPOLATED_ANNOTATIONS_REMOVED,s)}if(i>=0&&o{var h;const r=e.detail.annotation;if(!(r!=null&&r.metadata))return;const{toolName:n,originalToolName:i}=r.metadata;if(!ds.toolNames.includes(n)&&!ds.toolNames.includes(i))return;const o=kv(r);if(!o){console.warn("Unable to find viewport for",r);return}const a=b3(o),s={viewport:o,sliceData:a,annotation:r,interpolationUID:r.interpolationUID},c=!!r.interpolationUID;if(r.autoGenerated=!1,c){UI(s),Nv(s);return}const l=[{key:"segmentIndex",value:r.data.segmentation.segmentIndex,parentKey:g=>g.data.segmentation},{key:"viewPlaneNormal",value:r.metadata.viewPlaneNormal,parentKey:g=>g.metadata},{key:"viewUp",value:r.metadata.viewUp,parentKey:g=>g.metadata}];let f=iye(s,l);const{sliceIndex:u}=r.metadata,d=new Set;f.forEach(g=>{if(g.interpolationCompleted||g.metadata.sliceIndex===u){const{interpolationUID:p}=g;d.add(p)}}),f=f.filter(g=>!d.has(g.interpolationUID)),r.interpolationUID=((h=f[0])==null?void 0:h.interpolationUID)||Eye(),s.interpolationUID=r.interpolationUID,Nv(s)},ds.handleAnnotationUpdate=e=>{const r=e.detail.annotation,{changeType:n=Zt.HandlesUpdated}=e.detail;if(!(r!=null&&r.metadata))return;const{toolName:i,originalToolName:o}=r.metadata;if(!ds.toolNames.includes(i)&&!ds.toolNames.includes(o)||!bye.includes(n))return;const a=kv(r);if(!a){console.warn("Unable to find matching viewport for annotation interpolation",r);return}r.autoGenerated&&(Bl(r),r.autoGenerated=!1);const s=b3(a),c={viewport:a,sliceData:s,annotation:r,interpolationUID:r.interpolationUID,isInterpolationUpdate:n===Zt.InterpolationUpdated};Nv(c)},ds.handleAnnotationDelete=e=>{const r=e.detail.annotation;if(!(r!=null&&r.metadata))return;const{toolName:n}=r.metadata;if(!ds.toolNames.includes(n)||r.autoGenerated)return;const i=kv(r);if(!i){console.warn("No viewport, can't delete interpolated results",r);return}const o=b3(i),a={viewport:i,sliceData:o,annotation:r,interpolationUID:r.interpolationUID};r.autoGenerated=!1,UI(a)};let Vc=ds;function b3(t){return{numberOfSlices:t.getNumberOfSlices(),imageIndex:t.getCurrentImageIdIndex()}}function lB(t){t.forEach(e=>{const r=fi(e);if(!r){console.warn(`ToolGroup not available for ${e}`);return}r.getViewportsInfo().forEach(i=>{const{renderingEngineId:o,viewportId:a}=i,s=ni(o);if(!s){console.warn(`RenderingEngine not available for ${o}`);return}const c=s.getViewport(a);Xh(c.element)})})}function Zh(t){const n=sr.getState().viewportSegRepresentations;return Object.entries(n).filter(([,o])=>o.some(a=>a.segmentationId===t)).map(([o])=>o)}function Dye(t,e){const r=zn(t);if(!r)throw new Error(`No segmentation state found for ${t}`);const{segments:n}=r;return n[e].locked}function Iye(t,e,r=!0){const n=zn(t);if(!n)throw new Error(`No segmentation state found for ${t}`);const{segments:i}=n;i[e].locked=r,ns(t)}function Gd(t){const e=zn(t);if(!e)throw new Error(`No segmentation state found for ${t}`);const{segments:r}=e;return Object.keys(r).filter(i=>r[i].locked).map(i=>parseInt(i))}const Oye=Object.freeze(Object.defineProperty({__proto__:null,getLockedSegmentIndices:Gd,isSegmentIndexLocked:Dye,setSegmentIndexLocked:Iye},Symbol.toStringTag,{value:"Module"}));function uB(){return sr.getNextColorLUTIndex()}const h5=[[0,0,0,0],[221,84,84,255],[77,228,121,255],[166,70,235,255],[189,180,116,255],[109,182,196,255],[204,101,157,255],[123,211,94,255],[93,87,218,255],[225,128,80,255],[73,232,172,255],[181,119,186,255],[176,193,112,255],[105,153,200,255],[208,97,120,255],[90,215,101,255],[135,83,222,255],[229,178,76,255],[122,183,181,255],[190,115,171,255],[149,197,108,255],[100,118,205,255],[212,108,93,255],[86,219,141,255],[183,79,226,255],[233,233,72,255],[118,167,187,255],[194,111,146,255],[116,201,104,255],[115,96,209,255],[216,147,89,255],[82,223,188,255],[230,75,224,255],[163,184,121,255],[114,143,191,255],[198,107,114,255],[99,206,122,255],[153,92,213,255],[220,192,85,255],[78,215,227,255],[234,71,173,255],[141,188,117,255],[110,113,195,255],[202,128,103,255],[95,210,157,255],[195,88,217,255],[206,224,81,255],[74,166,231,255],[185,120,139,255],[113,192,113,255],[133,106,199,255],[207,162,98,255],[91,214,198,255],[221,84,198,255],[159,228,77,255],[70,111,235,255],[189,119,116,255],[109,196,138,255],[165,101,204,255],[211,201,94,255],[87,191,218,255],[225,80,153,255],[106,232,73,255],[124,119,186,255],[193,142,112,255],[105,200,168,255],[203,97,208,255],[184,215,90,255],[83,147,222,255],[229,76,101,255],[122,183,130,255],[146,115,190,255],[197,171,108,255],[100,205,205,255],[212,93,177,255],[141,219,86,255],[79,97,226,255],[233,99,72,255],[118,187,150,255],[173,111,194,255],[197,201,104,255],[96,171,209,255],[216,89,137,255],[94,223,82,255],[107,75,230,255],[184,153,121,255],[114,191,175,255],[198,107,191,255],[166,206,99,255],[92,132,213,255],[220,85,91,255],[78,227,115,255],[159,71,234,255],[188,176,117,255],[110,185,195,255],[202,103,161,255],[129,210,95,255],[88,88,217,255],[224,123,81,255],[74,231,166,255],[177,120,185,255],[179,192,113,255],[106,156,199,255],[207,98,125,255],[91,214,96,255],[130,84,221,255],[228,171,77,255],[70,235,221,255],[189,116,174,255],[153,196,109,255],[101,123,204,255],[211,104,94,255],[87,218,136,255],[177,80,225,255],[232,225,73,255],[119,169,186,255],[193,112,149,255],[121,200,105,255],[111,97,208,255],[215,142,90,255],[83,222,181,255],[229,76,229,255],[165,183,122,255],[115,146,190,255],[197,108,119,255],[100,205,118,255],[148,93,212,255],[219,186,86,255],[79,220,226,255],[233,72,179,255],[144,187,118,255],[111,118,194,255],[201,124,104,255],[96,209,153,255],[189,89,216,255],[211,223,82,255],[75,172,230,255],[184,121,142,255],[117,191,114,255],[130,107,198,255],[206,157,99,255],[92,213,193,255],[220,85,203,255],[165,227,78,255],[71,118,234,255],[188,117,117,255],[110,195,135,255],[161,103,202,255],[210,195,95,255],[88,195,217,255],[224,81,158,255],[113,231,74,255],[123,120,185,255],[192,139,113,255],[106,199,164,255],[198,98,207,255],[188,214,91,255],[84,153,221,255],[228,77,108,255],[70,235,84,255],[143,116,189,255],[196,167,109,255],[101,204,199,255],[211,94,182,255],[147,218,87,255],[80,104,225,255],[232,93,73,255],[119,186,147,255],[170,112,193,255],[200,200,105,255],[97,175,208,255],[215,90,142,255],[100,222,83,255],[101,76,229,255],[183,150,122,255],[115,190,171,255],[197,108,194,255],[170,205,100,255],[93,138,212,255],[219,86,97,255],[79,226,110,255],[153,72,233,255],[187,173,118,255],[111,187,194,255],[201,104,165,255],[134,209,96,255],[89,95,216,255],[223,117,82,255],[75,230,159,255],[174,121,184,255],[182,191,114,255],[107,160,198,255],[206,99,130,255],[92,213,92,255],[124,85,220,255],[227,165,78,255],[71,234,214,255],[188,117,176,255],[156,195,110,255],[103,128,202,255],[210,100,95,255],[88,217,131,255],[170,81,224,255],[231,218,74,255],[120,172,185,255],[192,113,153,255],[125,199,106,255],[107,98,207,255],[214,137,91,255],[84,221,175,255],[222,77,228,255],[194,235,70,255],[116,149,189,255],[196,109,123,255],[101,204,114,255],[143,94,211,255],[218,180,87,255],[80,225,225,255],[232,73,186,255],[147,186,119,255],[112,122,193,255],[200,121,105,255],[97,208,148,255],[184,90,215,255],[216,222,83,255],[76,178,229,255],[183,122,145,255],[121,190,115,255],[126,108,197,255],[205,153,100,255],[93,212,187,255],[219,86,208,255],[171,226,79,255],[72,126,233,255],[187,118,121,255],[111,194,132,255],[157,104,201,255],[209,190,96,255],[89,200,216,255],[223,82,164,255],[120,230,75,255],[121,121,184,255],[191,136,114,255],[107,198,160,255],[192,99,206,255],[193,213,92,255],[85,158,220,255],[227,78,115,255],[71,234,78,255],[141,117,188,255],[195,163,110,255],[103,202,194,255],[210,95,186,255],[153,217,88,255],[81,111,224,255]];function Tp(t,e){const r=sr,n=e??uB();let i=[...t];if(Yt(i[0],[0,0,0,0])||(console.warn("addColorLUT: [0, 0, 0, 0] color is not provided for the background color (segmentIndex =0), automatically adding it"),i=[[0,0,0,0],...i]),i=i.map(o=>o.length===3?[o[0],o[1],o[2],255]:o),i.length<255){const o=h5.slice(i.length);i=[...i,...o]}return r.addColorLUT(i,n),n}function Mye(t,e){if(!t)throw new Error("addColorLUT: colorLUT is required");return Tp(t,e)}function Pye(t,e,r){if(!ym(r))throw new Error(`setColorLUT: could not find colorLUT with index ${r}`);const n=Ma(t,{segmentationId:e});if(!n)throw new Error(`viewport specific state for viewport ${t} does not exist`);n.forEach(i=>{i.colorLUTIndex=r}),bc(t,e)}function zl(t,e,r){const n=Ma(t,{segmentationId:e});if(!n||n.length===0)return null;const i=n[0],{colorLUTIndex:o}=i,a=ym(o);let s=a[r];if(!s){if(typeof r!="number")return console.warn(`Can't create colour for LUT index ${r}`),null;s=a[r]=[0,0,0,0]}return s}function fB(t,e,r,n){const i=zl(t,e,r);for(let o=0;oFr(c).id);lB(s)}return i}_getContourSegmentationStyle(e){const r=e.annotation,{segmentationId:n,segmentIndex:i}=r.data.segmentation,{viewportId:o}=e.styleSpecifier,a=Ma(o,{segmentationId:n});if(!(a!=null&&a.length))return{};a.length>1?a.find(v=>v.segmentationId===n&&v.type===Lt.Contour):a[0];const{autoGenerated:s}=r,l=Gd(n).includes(i),{color:f,fillColor:u,lineWidth:d,fillOpacity:h,lineDash:g,visibility:p}=hB({segmentationId:n,segmentIndex:i,viewportId:o,autoGenerated:s});return{color:f,fillColor:u,lineWidth:d,fillOpacity:h,lineDash:g,textbox:{color:f},visibility:p,locked:l}}};J8.PreviewSegmentIndex=255;let P1=J8;function gB(t,e){const r=vt("generalSeriesModule",t);return Xl(r.modality,t,e)}function Xl(t,e,r){return t==="CT"?"HU":t==="PT"?Lye(e,r):""}function Lye(t,e){if(!e.isPreScaled)return"raw";if(e.isSuvScaled)return"SUV";const r=vt("generalSeriesModule",t);if((r==null?void 0:r.modality)==="PT"){const n=vt("petSeriesModule",t);return(n==null?void 0:n.units)||"unitless"}return"unknown"}const{pointCanProjectOnLine:BI}=pf,{EPSILON:Aye}=df,Nye=1-Aye,Z8=class Z8 extends P1{constructor(e={},r={supportedInteractionTypes:["Mouse","Touch"],configuration:{storePointData:!1,shadow:!0,preventHandleOutsideImage:!1,contourHoleAdditionModifierKey:Yi.Shift,alwaysRenderOpenContourHandles:{enabled:!1,radius:2},allowOpenContours:!0,closeContourProximity:10,checkCanvasEditFallbackProximity:6,makeClockWise:!0,subPixelResolution:4,smoothing:{smoothOnAdd:!1,smoothOnEdit:!1,knotsRatioPercentageOnAdd:40,knotsRatioPercentageOnEdit:40},interpolation:{enabled:!1,onInterpolationComplete:null},decimate:{enabled:!1,epsilon:.1},displayOnePointAsCrosshairs:!1,calculateStats:!0,getTextLines:kye,statsCalculator:jc}}){super(e,r),this.isDrawing=!1,this.isEditingClosed=!1,this.isEditingOpen=!1,this.addNewAnnotation=n=>{const i=n.detail,{element:o}=i,a=this.createAnnotation(n);this.addAnnotation(a,o);const s=Ot(o,this.getToolName());return this.activateDraw(n,a,s),n.preventDefault(),Ne(s),a},this.handleSelectedCallback=(n,i,o)=>{const a=n.detail,{element:s}=a,c=Ot(s,this.getToolName());this.activateOpenContourEndEdit(n,i,c,o)},this.toolSelectedCallback=(n,i)=>{const o=n.detail,{element:a}=o,s=Ot(a,this.getToolName());i.data.contour.closed?this.activateClosedContourEdit(n,i,s):this.activateOpenContourEdit(n,i,s),n.preventDefault()},this.isPointNearTool=(n,i,o,a)=>{const s=Se(n),{viewport:c}=s,{polyline:l}=i.data.contour;let f=c.worldToCanvas(l[0]);for(let h=1;h{const i=this.isDrawing,o=this.isEditingOpen,a=this.isEditingClosed;i?this.cancelDrawing(n):o?this.cancelOpenContourEdit(n):a&&this.cancelClosedContourEdit(n)},this._calculateCachedStats=(n,i,o,a)=>{const{data:s}=n,{cachedStats:c}=s,{polyline:l,closed:f}=s.contour,u=Object.keys(c);for(let h=0;hi.worldToCanvas(I)),w={isPreScaled:ql(i,g),isSuvScaled:this.isSuvScaled(i,g,n.metadata.referencedImageId)},x=Xl(y.Modality,n.metadata.referencedImageId,w),C=La(p,()=>{const I=s.contour.polyline,P=I.length,O=new Array(P);for(let te=0;te{const{data:s}=n,c=this.getTargetId(i),l={toolGroupId:this.toolGroupId,toolName:this.getToolName(),viewportId:o.viewport.id,annotationUID:n.annotationUID},f=this.getLinkedTextBoxStyle(l,n);if(!f.visibility)return;const u=this.configuration.getTextLines(s,c);if(!u||u.length===0)return;const d=s.contour.polyline.map(x=>i.worldToCanvas(x));if(!s.handles.textBox.hasMoved){const x=Aa(d);s.handles.textBox.worldPosition=i.canvasToWorld(x)}const h=i.worldToCanvas(s.handles.textBox.worldPosition),p=uo(a,n.annotationUID??"","1",u,h,d,{},f),{x:v,y,width:m,height:w}=p;s.handles.textBox.worldBoundingBox={topLeft:i.canvasToWorld([v,y]),topRight:i.canvasToWorld([v+m,y]),bottomLeft:i.canvasToWorld([v,y+w]),bottomRight:i.canvasToWorld([v+m,y+w])}},ave(this),gve(this),_ve(this),Vve(this),Bve(this),Zve(this),this._throttledCalculateCachedStats=qo(this._calculateCachedStats,100,{trailing:!0})}filterInteractableAnnotationsForElement(e,r){if(!r||!r.length)return;const n=Se(e),{viewport:i}=n;let o;if(i instanceof vr){const a=i.getCamera(),{spacingInNormalDirection:s}=zh(i,a);o=this.filterAnnotationsWithinSlice(r,a,s)}else o=Em(i,r);return o}filterAnnotationsWithinSlice(e,r,n){const{viewPlaneNormal:i}=r,o=e.filter(l=>{let f=l.metadata.viewPlaneNormal;if(!l.metadata.referencedImageId&&!f&&l.metadata.FrameOfReferenceUID){for(const d of l.data.contour.polyline){const h=Nn(Ge(),d,r.focalPoint),g=Pt(h,r.viewPlaneNormal);if(!Yt(g,0))return!1}return l.metadata.viewPlaneNormal=r.viewPlaneNormal,l.metadata.cameraFocalPoint=r.focalPoint,!0}if(!f){const{referencedImageId:d}=l.metadata,{imageOrientationPatient:h}=vt("imagePlaneModule",d),g=At(h[0],h[1],h[2]),p=At(h[3],h[4],h[5]);f=Ge(),Wn(f,g,p),l.metadata.viewPlaneNormal=f}const u=Math.abs(Pt(i,f))>Nye;return f&&u});if(!o.length)return[];const a=n/2,{focalPoint:s}=r,c=[];for(const l of o){const u=l.data.contour.polyline[0];if(!l.isVisible)continue;const d=Ge();Nn(d,s,u);const h=Pt(d,i);Math.abs(h){a.data.handles.points.length=0};return Wi(n,{data:{contour:{polyline:[[...r]]},label:"",cachedStats:{}},onInterpolationComplete:i})}getAnnotationStyle(e){return super.getAnnotationStyle(e)}renderAnnotationInstance(e){const{enabledElement:r,targetId:n,svgDrawingHelper:i}=e,o=e.annotation;let a=!1;const{viewport:s,renderingEngine:c}=r,l=this.isDrawing,f=this.isEditingOpen,u=this.isEditingClosed;if(!(l||f||u))this.configuration.displayOnePointAsCrosshairs&&o.data.contour.polyline.length===1?this.renderPointContourWithMarker(r,i,o):this.renderContour(r,i,o);else{const d=this.commonData.annotation.annotationUID;if(o.annotationUID===d)if(l)this.renderContourBeingDrawn(r,i,o);else if(u)this.renderClosedContourBeingEdited(r,i,o);else if(f)this.renderOpenContourBeingEdited(r,i,o);else throw new Error(`Unknown ${this.getToolName()} annotation rendering state`);else this.configuration.displayOnePointAsCrosshairs&&o.data.contour.polyline.length===1?this.renderPointContourWithMarker(r,i,o):this.renderContour(r,i,o);a=!0}if(this.configuration.calculateStats)return this._calculateStatsIfActive(o,n,s,c,r),this._renderStats(o,s,r,i),a}_calculateStatsIfActive(e,r,n,i,o){var s,c,l,f;const a=(s=this.commonData)==null?void 0:s.annotation.annotationUID;if(!(e.annotationUID===a&&!((c=this.commonData)!=null&&c.movingTextBox))&&!((l=this.commonData)!=null&&l.movingTextBox)){const{data:u}=e;(f=u.cachedStats[r])!=null&&f.unit?e.invalidated&&this._throttledCalculateCachedStats(e,n,i,o):(u.cachedStats[r]={Modality:null,area:null,max:null,mean:null,stdDev:null,areaUnit:null,unit:null},this._calculateCachedStats(e,n,i,o))}}updateClosedCachedStats({viewport:e,points:r,imageData:n,metadata:i,cachedStats:o,targetId:a,modalityUnit:s,canvasCoordinates:c,calibratedScale:l,deltaInX:f,deltaInY:u}){var j,X,te,fe;const{scale:d,areaUnit:h,unit:g}=l,{voxelManager:p}=e.getImageData(),v=ei(n,r[0]);v[0]=Math.floor(v[0]),v[1]=Math.floor(v[1]),v[2]=Math.floor(v[2]);let y=v[0],m=v[0],w=v[1],x=v[1],C=v[2],S=v[2];for(let le=1;le{let Ie=!0;const Me=e.worldToCanvas(le);return Me[1]!=V&&(R=0,V=Me[1],G=LU(c,Me,[A[0],Me[1]]),G.sort(function(_e){return function(B,M){return B[_e]===M[_e]?0:B[_e]G[0][0]&&(G.shift(),R++),R%2===0&&(Ie=!1),Ie},boundsIJK:P,returnPoints:this.configuration.storePointData}));const F=this.configuration.statsCalculator.getStatistics();o[a]={Modality:i.Modality,area:_,perimeter:E,mean:(j=F.mean)==null?void 0:j.value,max:(X=F.max)==null?void 0:X.value,min:(te=F.min)==null?void 0:te.value,stdDev:(fe=F.stdDev)==null?void 0:fe.value,statsArray:F.array,pointsInShape:N,areaUnit:h,modalityUnit:s,unit:g}}updateOpenCachedStats({targetId:e,metadata:r,canvasCoordinates:n,cachedStats:i,modalityUnit:o,calibratedScale:a,deltaInX:s,deltaInY:c}){const{scale:l,unit:f}=a;let u=jS(n,closed)/l;u*=Math.sqrt(Math.pow(s,2)+Math.pow(c,2)),i[e]={Modality:r.Modality,length:u,modalityUnit:o,unit:f}}};Z8.toolName="PlanarFreehandROI";let af=Z8;function kye(t,e){const r=t.cachedStats[e],{area:n,mean:i,stdDev:o,length:a,perimeter:s,max:c,min:l,isEmptyArea:f,unit:u,areaUnit:d,modalityUnit:h}=r||{},g=[];if(Gr(n)){const p=f?"Area: Oblique not supported":`Area: ${dn(n)} ${d}`;g.push(p)}return Gr(i)&&g.push(`Mean: ${dn(i)} ${h}`),Gr(c)&&g.push(`Max: ${dn(c)} ${h}`),Gr(l)&&g.push(`Min: ${dn(l)} ${h}`),Gr(o)&&g.push(`Std Dev: ${dn(o)} ${h}`),Gr(s)&&g.push(`Perimeter: ${dn(s)} ${u}`),Gr(a)&&g.push(`${dn(a)} ${u}`),g}const Q8=class Q8 extends af{constructor(e){const r=Wi({configuration:{calculateStats:!1,allowOpenContours:!1}},e);super(r)}isContourSegmentationTool(){return!0}renderAnnotationInstance(e){const r=e.annotation,{invalidated:n}=r,i=super.renderAnnotationInstance(e);if(n){const{segmentationId:o}=r.data.segmentation;bo(o)}return i}};Q8.toolName="PlanarFreehandContourSegmentationTool";let Hc=Q8;const Vye={[Lt.Labelmap]:ZU,[Lt.Contour]:YU,[Lt.Surface]:aU},U2=Hc.toolName;class Fye{constructor(){this._needsRender=new Set,this._animationFrameSet=!1,this._animationFrameHandle=null,this._getAllViewports=()=>Ho().flatMap(r=>r.getViewports()),this._renderFlaggedSegmentations=()=>{this._throwIfDestroyed(),Array.from(this._needsRender).forEach(r=>{this._triggerRender(r)}),this._needsRender.clear(),this._animationFrameSet=!1,this._animationFrameHandle=null}}renderSegmentationsForViewport(e){const r=e?[e]:this._getViewportIdsForSegmentation();this._setViewportsToBeRenderedNextFrame(r)}renderSegmentation(e){const r=this._getViewportIdsForSegmentation(e);this._setViewportsToBeRenderedNextFrame(r)}_getViewportIdsForSegmentation(e){const r=this._getAllViewports(),n=[];for(const i of r){const o=i.id;if(e){const a=Ma(o,{segmentationId:e});(a==null?void 0:a.length)>0&&n.push(o)}else{const a=Ma(o);(a==null?void 0:a.length)>0&&n.push(o)}}return n}_throwIfDestroyed(){if(this.hasBeenDestroyed)throw new Error("this.destroy() has been manually called to free up memory, can not longer use this instance. Instead make a new one.")}_setViewportsToBeRenderedNextFrame(e){e.forEach(r=>{this._needsRender.add(r)}),this._render()}_render(){this._needsRender.size>0&&this._animationFrameSet===!1&&(this._animationFrameHandle=window.requestAnimationFrame(this._renderFlaggedSegmentations),this._animationFrameSet=!0)}_triggerRender(e){const r=Ma(e);if(!(r!=null&&r.length))return;const{viewport:n}=qn(e)||{};if(!n)return;const i=[],o=r.map(a=>{a.type===Lt.Contour&&this._addPlanarFreeHandToolIfAbsent(n);const s=Vye[a.type];try{const c=s.render(n,a);i.push(c)}catch(c){console.error(c)}return Promise.resolve({segmentationId:a.segmentationId,type:a.type})});Promise.allSettled(o).then(a=>{const s=a.filter(f=>f.status==="fulfilled").map(f=>f.value);function c(f){const{element:u,viewportId:d}=f.detail;u.removeEventListener(Ze.IMAGE_RENDERED,c),s.forEach(h=>{const g={viewportId:d,segmentationId:h.segmentationId,type:h.type};it(Je,k.SEGMENTATION_RENDERED,{...g})})}n.element.addEventListener(Ze.IMAGE_RENDERED,c),n.render()})}_addPlanarFreeHandToolIfAbsent(e){U2 in He.tools||Ui(Hc);const r=Fr(e.id);r.hasTool(U2)||(r.addTool(U2),r.setToolPassive(U2))}}function Qh(t){pB.renderSegmentationsForViewport(t)}function $w(t){pB.renderSegmentation(t)}const pB=new Fye;function Uye({modifiedSlicesToUse:t,representationData:e,type:r}){const n=Fe.getVolume(e[r].volumeId);if(!n){console.warn("segmentation not found in cache");return}const{imageData:i,vtkOpenGLTexture:o}=n;let a;if((t==null?void 0:t.length)>0)a=t;else{const s=i.getDimensions()[2];a=[...Array(s).keys()]}a.forEach(s=>{o.setUpdatedFrame(s)}),i.modified()}function Bye({viewportIds:t,segmentationId:e}){t.forEach(r=>{let n=Ma(r,{segmentationId:e});n=n.filter(i=>i.type===Lt.Labelmap),n.forEach(i=>{if(i.segmentationId!==e)return;const o=qn(r);if(!o)return;const{viewport:a}=o;if(a instanceof vr)return;const s=Cp(r,e);s!=null&&s.length&&s.forEach((c,l)=>{const f=c.actor.getMapper().getInputData(),u=Wl(r,e),d=Fe.getImage(u[l]);f.modified(),mw(f,d)})})})}const Gye=function(t){const{segmentationId:e,modifiedSlicesToUse:r}=t.detail,{representationData:n}=zn(e),i=Zh(e),o=i.some(c=>{const{viewport:l}=qn(c);return l instanceof vr}),a=i.some(c=>{const{viewport:l}=qn(c);return l instanceof mr}),s=o&&a;i.forEach(c=>{const{viewport:l}=qn(c);l instanceof vr&&Uye({modifiedSlicesToUse:s?[]:r,representationData:n,type:Lt.Labelmap}),l instanceof mr&&Bye({viewportIds:i,segmentationId:e})})},mB=function(t){const{segmentationId:e}=t.detail,{representationData:r}=zn(e);r.Labelmap&&Gye(t),$w(e)},vB=function(t){const{segmentationId:e}=t.detail;$w(e)};function yB(t,e){return sr.updateLabelmapSegmentationImageReferences(t,e)}const Wye=function(t){if(!t)return;const e=Se(t);if(!e)return;const{viewport:r}=e;r instanceof Or||(t.addEventListener(Ze.STACK_NEW_IMAGE,R1),t.addEventListener(Ze.IMAGE_RENDERED,R1))},zye=function(t){t.removeEventListener(Ze.STACK_NEW_IMAGE,R1),t.removeEventListener(Ze.IMAGE_RENDERED,R1)};function R1(t){const e=t.detail,{viewportId:r,renderingEngineId:n}=e,{viewport:i}=Ii(r,n),o=Ma(r);if(!(o!=null&&o.length))return;const a=o.filter(l=>l.type===Lt.Labelmap),s=i.getActors();a.forEach(l=>{const{segmentationId:f}=l;yB(r,f)});const c=a.flatMap(l=>Cp(r,l.segmentationId)).filter(l=>l!==void 0);c.length&&(c.forEach(l=>{a.find(u=>{const d=Wl(r,u.segmentationId);return d==null?void 0:d.includes(l.referencedId)})||i.removeActors([l.uid])}),a.forEach(l=>{const{segmentationId:f}=l,u=i.getCurrentImageId(),d=Wl(r,f);if(!d)return;const h=g=>{const p=Fe.getImage(g);if(!p){console.warn("No derived image found in the cache for segmentation representation",l);return}const v=s.find(y=>y.referencedId===g);if(v){const y=v.actor.getMapper().getInputData();y.setDerivedImage?y.setDerivedImage(p):mw(y,p)}else{const{dimensions:y,spacing:m,direction:w}=i.getImageDataMetadata(p),x=Fe.getImage(u)||{imageId:u},{origin:C}=i.getImageDataMetadata(x),S=C,T=p.voxelManager.getConstructor(),_=p.voxelManager.getScalarData(),E=Vt.newInstance({name:"Pixels",numberOfComponents:1,values:new T(_)}),b=Q1.newInstance();b.setDimensions(y[0],y[1],1),b.setSpacing(m),b.setDirection(w),b.setOrigin(S),b.getPointData().setScalars(E),b.modified(),i.addImages([{imageId:g,representationUID:`${f}-${Lt.Labelmap}-${p.imageId}`,callback:({imageActor:D})=>{D.getMapper().setInputData(b)}}]),Qh(r);return}};d.forEach(h),i.render(),t.type===Ze.IMAGE_RENDERED&&i.element.removeEventListener(Ze.IMAGE_RENDERED,R1)}))}const wB={enable:Wye,disable:zye};async function $ye(t){const e=t.detail.annotation;if(!_m(e))return;const r=Hye(e),n=Kye(r,e);if(!n.length){it(Je,k.ANNOTATION_CUT_MERGE_PROCESS_COMPLETED,{element:r.element,sourceAnnotation:e});return}const i=of(e.data.contour.polyline,r),o=HU(r,i,n);if(!o.length){it(Je,k.ANNOTATION_CUT_MERGE_PROCESS_COMPLETED,{element:r.element,sourceAnnotation:e});return}if(o.length>1){KU(r,e,i,o);return}const{targetAnnotation:a,targetPolyline:s,isContourHole:c}=o[0];if(c){const{contourHoleProcessingEnabled:l=!1}=t.detail;if(!l)return;Vw(r,a,e)}else t8(r,a,s,e,i)}function jye(t,e=!1){const r="PlanarFreehandContourSegmentationTool",n=Fr(t.id,t.renderingEngineId);let i;return n?n.hasTool(r)?n.getToolOptions(r)||(i=`Tool ${r} must be in active/passive state in ${n.id} toolGroup`):i=`Tool ${r} not added to ${n.id} toolGroup`:i=`ToolGroup not found for viewport ${t.id}`,i&&!e&&console.warn(i),!i}function Hye(t){const e=i8(t);return e.find(n=>jye(n,!0))??e[0]}function Kye(t,e){const{annotationUID:r}=e;return gm().filter(i=>i.annotationUID&&i.annotationUID!==r&&_m(i)&&sU(i,e)&&t.isReferenceViewable(i.metadata))}function qye(t){const e=t.detail.annotation;Ul(e)}function xB(t){const e=t.detail.annotation;_m(e)&&$ye(t)}function g5(t){if(!t.detail.removed.length)return;Ho().forEach(n=>{const o=n.getViewports().map(a=>a.id);Ne(o)})}function CB(t){const{viewportId:e}=t.detail;Ne([e])}function Xye(t){const e=t.detail.annotation;_m(e)&&qye(t)}const SB=function(t){Xh(t.detail.element)},Yye=function(t){t.addEventListener(Ze.IMAGE_RENDERED,SB)},Jye=function(t){t.removeEventListener(Ze.IMAGE_RENDERED,SB)},TB={enable:Yye,disable:Jye},{Active:Zye}=$n;function eg(t,e,r){if(He.isInteractingWithTool)return!1;const{renderingEngineId:n,viewportId:i}=r.detail,o=Fr(i,n);if(!o)return!1;let a;const s=Object.keys(o.toolOptions);for(let c=0;c{for(const c of s){if(c.isLocked||!c.isVisible)continue;const l=a.getHandleNearImagePoint(t,c,r,i);if(l){o.push({tool:a,annotation:c,handle:l});break}}}),o}function Dm(t,e){const r=[];for(let n=0;n0&&r.push({tool:i,annotations:o}))}return r}function d8(t,e,r,n="mouse"){const i=n==="touch"?36:6,o=[];return e.forEach(({tool:a,annotations:s})=>{for(const c of s){if(c.isLocked||!c.isVisible)continue;if(a.isPointNearTool(t,c,r,i,n)){o.push({tool:a,annotation:c});break}}}),o}const{Active:Qye}=$n;function jw(t){const{renderingEngineId:e,viewportId:r,event:n}=t.detail,i=Jh(n)||Kh.getModifierKey(),o=Fr(r,e);if(!o)return null;const a=Object.keys(o.toolOptions),s=o.getDefaultMousePrimary(),c=t.detail.buttons??(n==null?void 0:n.buttons)??s;for(let l=0;lh.mouseButton===c&&h.modifierKey===i);if(u.mode===Qye&&d)return o.getToolInstance(f)}}function bh(t,e,r){const{renderingEngineId:n,viewportId:i}=t.detail,o=Fr(i,n);if(!o)return[];const a=[],s=Object.keys(o.toolOptions);for(let c=0;cd.mouseButton===r);if(e.includes(f.mode)&&(!r||u)){const d=o.getToolInstance(l);a.push(d)}}return a}function e5e(t,e){var u;const r=new Map,{renderingEngineId:n,viewportId:i}=t.detail,o=Fr(i,n);if(!o)return r;const a=Object.keys(o.toolOptions),s=o.getDefaultMousePrimary(),c=t.detail.event,l=(c==null?void 0:c.buttons)??s,f=Jh(c)||Kh.getModifierKey();for(let d=0;d{var w;return((w=m.bindings)==null?void 0:w.length)&&m.bindings.some(x=>x.mouseButton===l&&x.modifierKey===f)});y&&r.set(g,y)}return r}const{Active:t5e,Passive:n5e}=$n;function r5e(t){if(He.isInteractingWithTool)return!1;const e=t.detail,{element:r}=e,n=Se(r),{canvas:i}=e.currentPoints;if(!n)return!1;const o=e5e(t,[t5e,n5e]),a=Array.from(o.keys()),s=Dm(r,a),c=d8(r,s,i);if(c.length>0){const{tool:l,annotation:f}=c[0],u=o.get(l);return(typeof u.method=="string"?l[u.method]:u.method).call(l,t,f),!0}return!1}const{Active:i5e,Passive:o5e}=$n;function DB(t){if(He.isInteractingWithTool)return;const e=jw(t);if(e&&typeof e.preMouseDownCallback=="function"&&e.preMouseDownCallback(t))return;const r=t.detail.event.buttons===1,n=bh(t,[i5e],t.detail.event.buttons),i=r?bh(t,[o5e]):void 0,o=[...n||[],...i||[]];if(r5e(t))return;const s=t.detail,{element:c}=s,l=Dm(c,o),f=s.currentPoints.canvas,u=bB(c,l,f,"mouse"),d=!!t.detail.event.shiftKey;if(u.length>0){const{tool:g,annotation:p,handle:v}=GI(u);WI(p.annotationUID,d),g.handleSelectedCallback(t,p,v,"Mouse");return}const h=d8(c,l,f,"mouse");if(h.length>0){const{tool:g,annotation:p}=GI(h);WI(p.annotationUID,d),g.toolSelectedCallback(t,p,"Mouse",f);return}e&&typeof e.postMouseDownCallback=="function"&&e.postMouseDownCallback(t)}function GI(t){if(t.length>1){const e=t.find(r=>{const n=!mi(r.annotation.annotationUID),i=ii(r.annotation.annotationUID);return n&&i});if(e)return e}return t[0]}function WI(t,e=!1){e?wm(t)?ca(t,!1):ca(t,!0,!0):ca(t,!0,!1)}function IB(t){if(He.isInteractingWithTool)return;const e=jw(t);if(e&&!He.isMultiPartToolActive&&e.addNewAnnotation){const r=e.addNewAnnotation(t,"mouse");ca(r.annotationUID)}}function OB(t){if(He.isInteractingWithTool)return;const e=jw(t);!e||typeof e.mouseDragCallback!="function"||e.mouseDragCallback(t)}const{Active:a5e,Passive:s5e}=$n;function MB(t){if(He.isInteractingWithTool||He.isMultiPartToolActive)return;const e=bh(t,[a5e,s5e]),r=t.detail,{element:n}=r,i=Dm(n,e),o=e.filter(s=>!i.some(l=>l.tool.getToolName()===s.getToolName()));let a=!1;for(const{tool:s,annotations:c}of i)typeof s.mouseMoveCallback=="function"&&(a=s.mouseMoveCallback(t,c)||a);o.forEach(s=>{typeof s.mouseMoveCallback=="function"&&s.mouseMoveCallback(t)}),a===!0&&Xh(n)}const PB=eg.bind(null,"Mouse","mouseUpCallback");function RB(t){if(He.isInteractingWithTool)return;t.detail.buttons=$c.Wheel|(t.detail.event.buttons||0);const e=jw(t);if(e)return e.mouseWheelCallback(t)}const c5e=function(t){t.addEventListener(k.MOUSE_CLICK,_B),t.addEventListener(k.MOUSE_DOWN,DB),t.addEventListener(k.MOUSE_DOWN_ACTIVATE,IB),t.addEventListener(k.MOUSE_DOUBLE_CLICK,EB),t.addEventListener(k.MOUSE_DRAG,OB),t.addEventListener(k.MOUSE_MOVE,MB),t.addEventListener(k.MOUSE_UP,PB),t.addEventListener(k.MOUSE_WHEEL,RB)},l5e=function(t){t.removeEventListener(k.MOUSE_CLICK,_B),t.removeEventListener(k.MOUSE_DOWN,DB),t.removeEventListener(k.MOUSE_DOWN_ACTIVATE,IB),t.removeEventListener(k.MOUSE_DOUBLE_CLICK,EB),t.removeEventListener(k.MOUSE_DRAG,OB),t.removeEventListener(k.MOUSE_MOVE,MB),t.removeEventListener(k.MOUSE_UP,PB),t.removeEventListener(k.MOUSE_WHEEL,RB)},LB={enable:c5e,disable:l5e},{Active:u5e}=$n;function AB(t){const{renderingEngineId:e,viewportId:r}=t.detail,n=_pe(),i=Kh.getModifierKey(),o=Fr(r,e);if(!o)return null;const a=Object.keys(o.toolOptions),s=o.getDefaultMousePrimary();for(let c=0;cd.mouseButton===(n??s)&&d.modifierKey===i))return o.getToolInstance(l)}}function f5e(t,e){var c;const r=new Map,{renderingEngineId:n,viewportId:i}=t.detail,o=Fr(i,n);if(!o)return r;const a=Object.keys(o.toolOptions),s=t.detail.key;for(let l=0;l{var v;return(v=p.bindings)==null?void 0:v.some(y=>y.key===s)});g&&r.set(u,g)}return r}function NB(t){const e=AB(t);if(e){const{renderingEngineId:n,viewportId:i}=t.detail,o=Fr(i,n),a=e.getToolName();Object.keys(o.toolOptions).includes(a)&&o.setViewportsCursorByToolName(a)}const r=f5e(t,[$n.Active]);if(r!=null&&r.size){const{element:n}=t.detail;for(const[i,o]of[...r.entries()])(typeof o.method=="function"?o.method:i[o.method]).call(i,n,o,t)}}function kB(t){const e=AB(t);if(!e)return;const{renderingEngineId:r,viewportId:n}=t.detail,i=Fr(n,r);JF();const o=e.getToolName();Object.keys(i.toolOptions).includes(o)&&i.setViewportsCursorByToolName(o)}const d5e=function(t){t.addEventListener(k.KEY_DOWN,NB),t.addEventListener(k.KEY_UP,kB)},h5e=function(t){t.removeEventListener(k.KEY_DOWN,NB),t.removeEventListener(k.KEY_UP,kB)},VB={enable:d5e,disable:h5e},{Active:g5e,Passive:p5e,Enabled:m5e}=$n,FB=function(t){bh(t,[g5e,p5e,m5e]).forEach(r=>{r.onCameraModified&&r.onCameraModified(t)})},v5e=function(t){t.addEventListener(Ze.CAMERA_MODIFIED,FB)},y5e=function(t){t.removeEventListener(Ze.CAMERA_MODIFIED,FB)},UB={enable:v5e,disable:y5e},{Active:w5e,Passive:x5e,Enabled:C5e}=$n,BB=function(t){bh(t,[w5e,x5e,C5e]).forEach(r=>{r.onImageSpacingCalibrated&&r.onImageSpacingCalibrated(t)})},S5e=function(t){t.addEventListener(Ze.IMAGE_SPACING_CALIBRATED,BB)},T5e=function(t){t.removeEventListener(Ze.IMAGE_SPACING_CALIBRATED,BB)},GB={enable:S5e,disable:T5e},{Active:_5e}=$n;function h8(t){const{renderingEngineId:e,viewportId:r}=t.detail,n=t.detail.event,i=Fr(r,e);if(!i)return null;const o=Object.keys(i.toolOptions),a=Object.keys(n.touches).length,s=Jh(n)||Kh.getModifierKey(),c=i.getDefaultMousePrimary();for(let l=0;l(h.numTouchPoints===a||a===1&&h.mouseButton===c)&&h.modifierKey===s);if(u.mode===_5e&&d)return i.getToolInstance(f)}}function zI(t,e,r){const{renderingEngineId:n,viewportId:i}=t.detail,o=Fr(i,n);if(!o)return[];const a=[],s=Object.keys(o.toolOptions);for(let c=0;cd.numTouchPoints===r);if(e.includes(f.mode)&&(!r||u)){const d=o.getToolInstance(l);a.push(d)}}return a}const{Active:E5e,Passive:b5e}=$n;function WB(t){if(He.isInteractingWithTool)return;const e=h8(t);if(e&&typeof e.preTouchStartCallback=="function"&&e.preTouchStartCallback(t))return;const r=Object.keys(t.detail.event.touches).length===1,n=zI(t,[E5e],Object.keys(t.detail.event.touches).length),i=r?zI(t,[b5e]):void 0,o=[...n||[],...i||[],e],a=t.detail,{element:s}=a,c=Dm(s,o),l=a.currentPoints.canvas,f=bB(s,c,l,"touch"),u=!1;if(f.length>0){const{tool:h,annotation:g,handle:p}=$I(f);jI(g.annotationUID,u),h.handleSelectedCallback(t,g,p,"Touch");return}const d=d8(s,c,l,"touch");if(d.length>0){const{tool:h,annotation:g}=$I(d);jI(g.annotationUID,u),h.toolSelectedCallback(t,g,"Touch",l);return}e&&typeof e.postTouchStartCallback=="function"&&e.postTouchStartCallback(t)}function $I(t){return t.length>1&&t.find(e=>!mi(e.annotation.annotationUID)&&ii(e.annotation.annotationUID))||t[0]}function jI(t,e=!1){e?wm(t)?ca(t,!1):ca(t,!0,!0):ca(t,!0,!1)}function zB(t){if(He.isInteractingWithTool)return;const e=h8(t);if(e&&!He.isMultiPartToolActive&&e.addNewAnnotation){const r=e.addNewAnnotation(t,"touch");ca(r.annotationUID)}}function $B(t){if(He.isInteractingWithTool)return;const e=h8(t);!e||typeof e.touchDragCallback!="function"||e.touchDragCallback(t)}const jB=eg.bind(null,"Touch","touchEndCallback"),D5e=eg.bind(null,"Touch","touchTapCallback"),HB=eg.bind(null,"Touch","touchPressCallback"),I5e=function(t){t.addEventListener(k.TOUCH_START,WB),t.addEventListener(k.TOUCH_START_ACTIVATE,zB),t.addEventListener(k.TOUCH_DRAG,$B),t.addEventListener(k.TOUCH_END,jB),t.addEventListener(k.TOUCH_TAP,D5e),t.addEventListener(k.TOUCH_PRESS,HB)},O5e=function(t){t.removeEventListener(k.TOUCH_START,WB),t.removeEventListener(k.TOUCH_START_ACTIVATE,zB),t.removeEventListener(k.TOUCH_DRAG,$B),t.removeEventListener(k.TOUCH_END,jB),t.removeEventListener(k.TOUCH_PRESS,HB)},KB={enable:I5e,disable:O5e},M5e=function(){Je.addEventListener(k.ANNOTATION_COMPLETED,Vc.handleAnnotationCompleted),Je.addEventListener(k.ANNOTATION_MODIFIED,Vc.handleAnnotationUpdate),Je.addEventListener(k.ANNOTATION_REMOVED,Vc.handleAnnotationDelete)},P5e=function(){Je.removeEventListener(k.ANNOTATION_COMPLETED,Vc.handleAnnotationCompleted),Je.removeEventListener(k.ANNOTATION_MODIFIED,Vc.handleAnnotationUpdate),Je.removeEventListener(k.ANNOTATION_REMOVED,Vc.handleAnnotationDelete)},qB={enable:M5e,disable:P5e},{Active:R5e,Passive:L5e,Enabled:A5e}=$n,XB=function(t){bh(t,[R5e,L5e,A5e]).forEach(r=>{r.onResetCamera&&r.onResetCamera(t)})},N5e=function(t){t.addEventListener(Ze.CAMERA_RESET,XB)},k5e=function(t){t.removeEventListener(Ze.CAMERA_RESET,XB)},YB={enable:N5e,disable:k5e};function g8(t){const{element:e,viewportId:r}=t.detail,n=V5e(r);F5e(e),U5e(n,e),QE.addViewportElement(r,e),MF.enable(e),XF.enable(e),HF.enable(e),Kh.enable(e),wB.enable(e),TB.enable(e),UB.enable(e),GB.enable(e),YB.enable(e),LB.enable(e),VB.enable(e),KB.enable(e),He.enabledElements.push(e)}function V5e(t){const e="http://www.w3.org/2000/svg",r=document.createElementNS(e,"svg"),n=`svg-layer-${t}`;r.classList.add("svg-layer"),r.setAttribute("id",n),r.setAttribute("xmlns","http://www.w3.org/2000/svg"),r.style.width="100%",r.style.height="100%",r.style.pointerEvents="none",r.style.position="absolute";const i=document.createElementNS(e,"defs"),o=document.createElementNS(e,"filter"),a=document.createElementNS(e,"feOffset"),s=document.createElementNS(e,"feColorMatrix"),c=document.createElementNS(e,"feBlend");return o.setAttribute("id",`shadow-${n}`),o.setAttribute("filterUnits","userSpaceOnUse"),a.setAttribute("result","offOut"),a.setAttribute("in","SourceGraphic"),a.setAttribute("dx","0.5"),a.setAttribute("dy","0.5"),s.setAttribute("result","matrixOut"),s.setAttribute("in","offOut"),s.setAttribute("in2","matrix"),s.setAttribute("values","0.2 0 0 0 0 0 0.2 0 0 0 0 0 0.2 0 0 0 0 0 1 0"),c.setAttribute("in","SourceGraphic"),c.setAttribute("in2","matrixOut"),c.setAttribute("mode","normal"),o.appendChild(a),o.appendChild(s),o.appendChild(c),i.appendChild(o),r.appendChild(i),r}function F5e(t){const{viewportUid:e,renderingEngineUid:r}=t.dataset,n=`${e}:${r}`;He.svgNodeCache[n]={}}function U5e(t,e){e.querySelector("div.viewport-element").appendChild(t)}function JB(t,e){const r=[];if(!e&&!t)throw new Error("At least one of renderingEngineId or viewportId should be given");for(let n=0;n{const e=Se(t);if(!e)return;JB(e.viewportId,e.renderingEngineId).forEach(n=>{n.remove(e)})},W5e=t=>{const e=Se(t);if(!e)return;const{renderingEngineId:r,viewportId:n}=e,i=Fr(n,r);i&&i.removeViewports(r,n)};function z5e(t){const{viewportUid:e,renderingEngineUid:r}=t.dataset,n=`${e}:${r}`;delete He.svgNodeCache[n]}function $5e(t){const e=t.querySelector(`div.${B5e}`),r=e.querySelector("svg");r&&e.removeChild(r)}const j5e=function(t){const e=He.enabledElements.findIndex(r=>r===t);e>-1&&He.enabledElements.splice(e,1)};function ZB(t){const e=UU(t,[$n.Active,$n.Passive]),r=Dm(t,e);for(const{tool:n}of r){const i=n.cancel(t);if(i)return i}}class m8{constructor(e,r,n,i){this._viewportOptions={},this._onEvent=o=>{var l;if(this._ignoreFiredEvents===!0||!this._targetViewports.length)return;const a=this._eventSource==="element"?Se(o.currentTarget):qn((l=o.detail)==null?void 0:l.viewportId);if(!a)return;const{renderingEngineId:s,viewportId:c}=a;this._sourceViewports.find(f=>f.viewportId===c)&&this.fireEvent({renderingEngineId:s,viewportId:c},o)},this._enabled=!0,this._eventName=r,this._eventHandler=n,this._ignoreFiredEvents=!1,this._sourceViewports=[],this._targetViewports=[],this._options=i||{},this._eventSource=this._options.eventSource||"element",this._auxiliaryEvents=this._options.auxiliaryEvents||[],this.id=e}isDisabled(){return!this._enabled||!this._hasSourceElements()}setOptions(e,r={}){this._viewportOptions[e]=r}setEnabled(e){this._enabled=e}getOptions(e){return this._viewportOptions[e]}add(e){this.addTarget(e),this.addSource(e)}addSource(e){if(B2(this._sourceViewports,e))return;const{renderingEngineId:r,viewportId:n}=e,i=ni(r).getViewport(n);if(!i){console.warn(`Synchronizer.addSource: No viewport for ${r} ${n}`);return}(this._eventSource==="element"?i.element:Je).addEventListener(this._eventName,this._onEvent.bind(this)),this._auxiliaryEvents.forEach(({name:a,source:s})=>{(s==="element"?i.element:Je).addEventListener(a,this._onEvent.bind(this))}),this._updateDisableHandlers(),this._sourceViewports.push(e)}addTarget(e){B2(this._targetViewports,e)||(this._targetViewports.push(e),this._updateDisableHandlers())}getSourceViewports(){return this._sourceViewports}getTargetViewports(){return this._targetViewports}destroy(){this._sourceViewports.forEach(e=>this.removeSource(e)),this._targetViewports.forEach(e=>this.removeTarget(e))}remove(e){this.removeTarget(e),this.removeSource(e)}removeSource(e){const r=HI(this._sourceViewports,e);if(r===-1)return;const n=this._eventSource==="element"?this.getViewportElement(e):Je;this._sourceViewports.splice(r,1),n.removeEventListener(this._eventName,this._eventHandler),this._auxiliaryEvents.forEach(({name:i,source:o})=>{(o==="element"?this.getViewportElement(e):Je).removeEventListener(i,this._eventHandler)}),this._updateDisableHandlers()}removeTarget(e){const r=HI(this._targetViewports,e);r!==-1&&(this._targetViewports.splice(r,1),this._updateDisableHandlers())}hasSourceViewport(e,r){return B2(this._sourceViewports,{renderingEngineId:e,viewportId:r})}hasTargetViewport(e,r){return B2(this._targetViewports,{renderingEngineId:e,viewportId:r})}fireEvent(e,r){if(this.isDisabled()||this._ignoreFiredEvents)return;this._ignoreFiredEvents=!0;const n=[];try{for(let i=0;i{this._ignoreFiredEvents=!1}):this._ignoreFiredEvents=!1}}_hasSourceElements(){return this._sourceViewports.length!==0}_updateDisableHandlers(){const e=H5e(this._sourceViewports,this._targetViewports),r=this.remove.bind(this),n=i=>{r(i.detail.element)};e.forEach(i=>{const o=this.getEventSource(i);o&&(o.removeEventListener(Ze.ELEMENT_DISABLED,n),o.addEventListener(Ze.ELEMENT_DISABLED,n))})}getEventSource(e){return this._eventSource==="element"?this.getViewportElement(e):Je}getViewportElement(e){const{renderingEngineId:r,viewportId:n}=e,i=ni(r);if(!i)return null;const o=i.getViewport(n);return o?o.element:null}}function H5e(t,e){const r=[],n=t.concat(e);for(let i=0;io.renderingEngineId===a.renderingEngineId&&o.viewportId===a.viewportId)||r.push(o)}return r}function HI(t,e){return t.findIndex(r=>e.renderingEngineId===r.renderingEngineId&&e.viewportId===r.viewportId)}function B2(t,e){return t.some(r=>r.renderingEngineId===e.renderingEngineId&&r.viewportId===e.viewportId)}function Wd(t,e,r,n){if(He.synchronizers.some(a=>a.id===t))throw new Error(`Synchronizer with id '${t}' already exists.`);const o=new m8(t,e,r,n);return He.synchronizers.push(o),o}function K5e(){for(;He.synchronizers.length>0;)He.synchronizers.pop().destroy()}function q5e(t){return He.synchronizers.find(e=>e.id===t)}function X5e(){return He.synchronizers}function Y5e(t){const e=He.synchronizers.findIndex(r=>r.id===t);e>-1&&(He.synchronizers[e].destroy(),He.synchronizers.splice(e,1))}const QB=Object.freeze(Object.defineProperty({__proto__:null,createSynchronizer:Wd,destroy:K5e,destroySynchronizer:Y5e,getAllSynchronizers:X5e,getSynchronizer:q5e,getSynchronizersForViewport:JB},Symbol.toStringTag,{value:"Module"})),J5e=Object.freeze(Object.defineProperty({__proto__:null,Synchronizer:m8,SynchronizerManager:QB,ToolGroupManager:hF,addEnabledElement:g8,addTool:Ui,cancelActiveManipulations:ZB,hasTool:upe,removeEnabledElement:p8,removeTool:xF,get state(){return He},svgNodeCache:xw},Symbol.toStringTag,{value:"Module"})),p5=function(t){const{viewportId:e}=t.detail;Qh(e)};let KS=!1;function eG(t={}){KS||(u1e(t),Q5e(),ewe(),KS=!0)}function Z5e(){tG(),nG(),fF(),Vhe();const t=uc(),e=sr;t.restoreAnnotations({}),e.resetState(),KS=!1}function Q5e(){tG();const t=Ze.ELEMENT_ENABLED,e=Ze.ELEMENT_DISABLED;Je.addEventListener(t,g8),Je.addEventListener(e,p8),qB.enable()}function tG(){const t=Ze.ELEMENT_ENABLED,e=Ze.ELEMENT_DISABLED;Je.removeEventListener(t,g8),Je.removeEventListener(e,p8),qB.disable()}function ewe(){nG(),Je.addEventListener(k.ANNOTATION_COMPLETED,xB),Je.addEventListener(k.ANNOTATION_MODIFIED,CB),Je.addEventListener(k.ANNOTATION_SELECTION_CHANGE,g5),Je.addEventListener(k.ANNOTATION_SELECTION_CHANGE,g5),Je.addEventListener(k.ANNOTATION_REMOVED,Xye),Je.addEventListener(k.SEGMENTATION_MODIFIED,vB),Je.addEventListener(k.SEGMENTATION_DATA_MODIFIED,mB),Je.addEventListener(k.SEGMENTATION_REPRESENTATION_MODIFIED,p5),Je.addEventListener(k.SEGMENTATION_REPRESENTATION_ADDED,p5)}function nG(){Je.removeEventListener(k.ANNOTATION_COMPLETED,xB),Je.removeEventListener(k.ANNOTATION_MODIFIED,CB),Je.removeEventListener(k.ANNOTATION_SELECTION_CHANGE,g5),Je.removeEventListener(k.ANNOTATION_SELECTION_CHANGE,g5),Je.removeEventListener(k.SEGMENTATION_MODIFIED,vB),Je.removeEventListener(k.SEGMENTATION_DATA_MODIFIED,mB),Je.removeEventListener(k.SEGMENTATION_REPRESENTATION_MODIFIED,p5),Je.removeEventListener(k.SEGMENTATION_REPRESENTATION_ADDED,p5)}const twe=Object.freeze(Object.defineProperty({__proto__:null,COLOR_LUT:h5},Symbol.toStringTag,{value:"Module"})),nwe="3.20.0";function rwe(t,e,r,n){const{camera:i}=n.detail,o=ni(r.renderingEngineId);if(!o)throw new Error(`No RenderingEngine for Id: ${r.renderingEngineId}`);const a=o.getViewport(r.viewportId);a.setCamera(i),a.render()}const{CAMERA_MODIFIED:iwe}=Ze;function owe(t){return Wd(t,iwe,rwe)}function awe(t,e,r,n,i){const o=ni(r.renderingEngineId);if(!o)throw new Error(`No RenderingEngine for Id: ${r.renderingEngineId}`);const a=o.getViewport(r.viewportId),c=o.getViewport(e.viewportId).getViewPresentation(i);a.setViewPresentation(c),a.render()}const{CAMERA_MODIFIED:swe}=Ze;function cwe(t,e){return Wd(t,swe,awe,{viewPresentation:e})}function lwe(t,e,r,n,i){const o=n.detail,{volumeId:a,range:s,invertStateChanged:c,invert:l,colormap:f}=o,u=ni(r.renderingEngineId);if(!u)throw new Error(`Rendering Engine does not exist: ${r.renderingEngineId}`);const d=u.getViewport(r.viewportId),h={voiRange:s};if(i!=null&&i.syncInvertState&&c&&(h.invert=l),i!=null&&i.syncColormap&&f&&(h.colormap=f),d instanceof Or)d._actors&&d._actors.size>1?d.setProperties(h,a):d.setProperties(h);else if(d instanceof mr)d.setProperties(h);else throw new Error("Viewport type not supported.");d.render()}function uwe(t,e){return e=Object.assign({syncInvertState:!0,syncColormap:!0},e),Wd(t,Ze.VOI_MODIFIED,lwe,{auxiliaryEvents:[{name:Ze.COLORMAP_MODIFIED}],...e})}function fwe(t,e,r){const n=ni(r.renderingEngineId);if(!n)throw new Error(`No RenderingEngine for Id: ${r.renderingEngineId}`);const i=t.getOptions(r.viewportId),o=n.getViewport(r.viewportId),a=n.getViewport(e.viewportId);if((i==null?void 0:i.syncZoom)!==!1){const s=a.getZoom();o.setZoom(s)}if((i==null?void 0:i.syncPan)!==!1){const s=a.getPan();o.setPan(s)}o.render()}const{CAMERA_MODIFIED:dwe}=Ze;function hwe(t){return Wd(t,dwe,fwe)}function gwe(t,e){const{viewPlaneNormal:r}=t.getCamera(),{viewPlaneNormal:n}=e.getCamera(),i=Pt(r,n);return Math.abs(i)>.9}const KI=(t,e)=>x1.get("spatialRegistrationModule",t,e);async function pwe(t,e,r){const n=ni(r.renderingEngineId);if(!n)throw new Error(`No RenderingEngine for Id: ${r.renderingEngineId}`);const i=n.getViewport(e.viewportId),o=t.getOptions(r.viewportId);if(o!=null&&o.disabled)return;const a=n.getViewport(r.viewportId),s=i.getCurrentImageId(),l=vt("imagePlaneModule",s).imagePositionPatient,f=a.getImageIds();if(!gwe(i,a))return;let u=KI(r.viewportId,e.viewportId);if(!u){const p=i.getFrameOfReferenceUID(),v=a.getFrameOfReferenceUID();if(p===v&&(o==null?void 0:o.useInitialPosition)!==!1?u=Ut(Pa()):(mV(i,a),u=KI(r.viewportId,e.viewportId)),!u)return}const d=Ht(Ge(),l,u),h=mwe(d,f);let g=h.index;a instanceof vr&&(g=f.length-h.index-1),h.index!==-1&&a.getCurrentImageIdIndex()!==h.index&&await hs(a.element,{imageIndex:g})}function mwe(t,e){return e.reduce((r,n,i)=>{const{imagePositionPatient:o}=vt("imagePlaneModule",n),a=no(o,t);return a{i.getImageIds().includes(t)&&i.calibrateSpacing(t)})}function oG(t,e){const r=t.findIndex(([n,i])=>n===i);if(r===-1)throw new Error("3D bounding boxes not supported in an oblique plane");return t[r][0]-=e,t[r][1]+=e,t}const Dwe=Object.freeze(Object.defineProperty({__proto__:null,extend2DBoundingBoxInViewAxis:oG,getBoundingBoxAroundShape:ef,getBoundingBoxAroundShapeIJK:ef,getBoundingBoxAroundShapeWorld:eU},Symbol.toStringTag,{value:"Module"})),{transformWorldToIndex:D3}=Vn;function aG(t,e,r){const[n,i]=t,o=At((n[0]+i[0])/2,(n[1]+i[1])/2,(n[2]+i[2])/2),a=no(n,i)/2,{boundsIJK:s,topLeftWorld:c,bottomRightWorld:l}=Owe(e,r,t,o,a);return{boundsIJK:s,centerWorld:o,radiusWorld:a,topLeftWorld:c,bottomRightWorld:l}}function sG(t,e){const r=e.getDirection(),n=At(r[0],r[1],r[2]),i=At(r[3],r[4],r[5]),o=At(r[6],r[7],r[8]),a=Rc(Ge(),o);return aG(t,e,{row:n,column:i,normal:a})}function Iwe(t,e,r){if(!r)throw new Error("viewport is required in order to calculate the sphere bounds");const n=r.getCamera(),i=At(n.viewUp[0],n.viewUp[1],n.viewUp[2]),o=At(n.viewPlaneNormal[0],n.viewPlaneNormal[1],n.viewPlaneNormal[2]),a=Ge();Wn(a,i,o);const s={row:a,normal:o,column:Rc(Ge(),i)};return aG(t,e,s)}function Owe(t,e,r,n,i){const o=t.getDimensions(),{row:a,column:s,normal:c}=e,l=Ge(),f=Ge();An(l,n,c,i),An(f,n,c,-i),An(l,l,s,-i),An(f,f,s,i),An(l,l,a,-i),An(f,f,a,i);const u=D3(t,l),d=D3(t,f),h=r.map(p=>D3(t,p));return{boundsIJK:ef([u,d,...h],o),topLeftWorld:l,bottomRightWorld:f}}function cG(t,e=5){return parseFloat(t[0]).toFixed(e)+","+parseFloat(t[1]).toFixed(e)+","+parseFloat(t[2]).toFixed(e)+","}class Mwe{static setStartRange(e,r,n=e.getCurrentImageIdIndex()){this.setRange(e,r,n)}static setEndRange(e,r,n=e.getCurrentImageIdIndex()){this.setRange(e,r,void 0,n)}static setRange(e,r,n,i){var c;const{metadata:o}=r;n===void 0&&(n=o.sliceIndex=n?a:e.getNumberOfSlices()-1),i=Math.max(n,i),o.sliceIndex=Math.min(n,i),o.referencedImageId=e.getCurrentImageId(o.sliceIndex),o.referencedImageURI=void 0,i===o.sliceIndex?o.multiSliceReference=void 0:i!==((c=o.multiSliceReference)==null?void 0:c.sliceIndex)&&(o.multiSliceReference={referencedImageId:e.getCurrentImageId(i),sliceIndex:i});const s={viewportId:e.id,renderingEngineId:e.renderingEngineId,changeType:Zt.MetadataReferenceModified,annotation:r};it(Je,k.ANNOTATION_MODIFIED,s),this.setViewportFrameRange(e,o)}static setSingle(e,r,n=e.getCurrentImageIdIndex()){this.setRange(e,r,n,n)}static getFrameRange(e){const{metadata:r}=e,{sliceIndex:n,multiSliceReference:i}=r,o=i==null?void 0:i.sliceIndex;return o?[n+1,o+1]:n+1}static getFrameRangeStr(e){const r=this.getFrameRange(e);return Array.isArray(r)?`${r[0]}-${r[1]}`:String(r)}static setViewportFrameRange(e,r){var n;e.setFrameRange&&((n=r.multiSliceReference)!=null&&n.sliceIndex)&&e.setFrameRange(r.sliceIndex+1,r.multiSliceReference.sliceIndex+1)}}function Pwe(t,e){const{viewPlaneNormal:r}=t.metadata,{viewPlaneNormal:n}=e.metadata,i=Pt(r,n);if(!Ju(1,Math.abs(i)))return!1;const{polyline:a}=t.data.contour,{polyline:s}=e.data.contour,c=Pt(r,a[0]),l=Pt(r,s[0]);return Ju(c,l)}function lG(t,e,r){let n=-1;if(e.forEach((i,o)=>{n>=0||i.a==t.b&&(n=o)}),n>=0){const i=e[n];return e.splice(n,1),r.push(i.b),r[0]==i.b?{remainingLines:e,contourPoints:r,type:"CLOSED_PLANAR"}:lG(i,e,r)}return{remainingLines:e,contourPoints:r,type:"OPEN_PLANAR"}}function v8(t){if(t.length==0)return[];const e=[],r=t.shift();e.push(r.a),e.push(r.b);const n=lG(r,t,e);if(n.remainingLines.length==0)return[{type:n.type,contourPoints:n.contourPoints}];{const i=v8(n.remainingLines);return i.push({type:n.type,contourPoints:n.contourPoints}),i}}function Rwe(t){return v8(t)}const Lwe={findContours:v8,findContoursFromReducedSet:Rwe};function Awe(t,e=!1){const r=t.getPoints(),n=t.getLines(),i=new Array(r.getNumberOfPoints()).fill(0).map((c,l)=>r.getPoint(l).slice()),o=new Array(n.getNumberOfCells()).fill(0).map((c,l)=>{const f=n.getCell(l*3).slice();return{a:f[0],b:f[1]}});if(e)return{points:i,lines:o};const a=[];for(const[c,l]of i.entries()){const f=a.findIndex(u=>u[0]===l[0]&&u[1]===l[1]&&u[2]===l[2]);if(f>=0)o.map(u=>(u.a===c&&(u.a=f),u.b===c&&(u.b=f),u));else{const u=a.length;a.push(l),o.map(d=>(d.a===c&&(d.a=u),d.b===c&&(d.b=u),d))}}const s=o.filter(c=>c.a!==c.b);return{points:a,lines:s}}const Nwe=(t,e)=>{const r=t[0],n=t[1];let i=!1;for(let o=0,a=e.length-1;on!=f>n&&r<(l-s)*(n-c)/(f-c)+s&&(i=!i)}return i};function kwe(t,e,r){const n=[];t.contourPoints.forEach(o=>{n.push([r[o][0],r[o][1]])});let i=0;return e.contourPoints.forEach(o=>{Nwe([r[o][0],r[o][1]],n)||i++}),i===0}function Vwe(t,e,r=!0){const n=t.filter(s=>s.type!=="CLOSED_PLANAR"),i=t.filter(s=>s.type==="CLOSED_PLANAR"),o=[];let a=[];return i.forEach((s,c)=>{const l=[];i.forEach((f,u)=>{c!=u&&kwe(s,f,e)&&l.push(u)}),l.length>0?o.push({contour:s,holes:l}):a.push(c)}),r&&(o.forEach(s=>{s.contour.type="CLOSEDPLANAR_XOR",n.push(s.contour),s.holes.forEach(c=>{i[c].type="CLOSEDPLANAR_XOR",n.push(i[c]),a=a.filter(l=>l!==c)})}),a.forEach(s=>{n.push(i[s])})),n}const Fwe={processContourHoles:Vwe};let qI=!1;function Hw(){if(qI)return;qI=!0;const t=()=>new Worker(new URL("/static/dv3d/assets/computeWorker-FOqOvCDJ.js",import.meta.url),{name:"compute",type:"module"}),e=Yc(),n=l1e().computeWorker,i={maxWorkerInstances:1,autoTerminateOnIdle:(n==null?void 0:n.autoTerminateOnIdle)??{enabled:!0,idleTimeThreshold:2e3}};e.registerWorker("compute",t,i)}function Kw(){return sr.getState().segmentations}function Uwe(t){const{segmentationId:e,representation:r,config:n}=t,{type:i,data:o}=r,a=o?{...o}:{};if(!a)throw new Error("Segmentation representation data may not be undefined");i===Lt.Contour&&Bwe(a);const s=Gwe(n==null?void 0:n.segments,i,a);return n==null||delete n.segments,{segmentationId:e,label:(n==null?void 0:n.label)??null,cachedStats:(n==null?void 0:n.cachedStats)??{},segments:s,representationData:{[i]:{...a}}}}function Bwe(t){t.geometryIds=t.geometryIds??[],t.annotationUIDsMap=t.annotationUIDsMap??new Map}function Gwe(t,e,r){const n={};return t?Object.entries(t).forEach(([i,o])=>{const{label:a,locked:s,cachedStats:c,active:l,...f}=o,u={segmentIndex:Number(i),label:a??`Segment ${i}`,locked:s??!1,cachedStats:c??{},active:l??!1,...f};n[i]=u}):e===Lt.Surface?Wwe(n,r):n[1]=zwe(),n}function Wwe(t,e){const{geometryIds:r}=e;r==null||r.forEach(n=>{const i=Fe.getGeometry(n);if(i!=null&&i.data){const{segmentIndex:o}=i.data;t[o]={segmentIndex:o}}})}function zwe(){return{segmentIndex:1,label:"Segment 1",locked:!1,cachedStats:{},active:!0}}function uG(t,e){const r=sr;t.forEach(n=>{const i=Uwe(n);r.addSegmentation(i),e||ns(i.segmentationId)})}function tg(t,e,r){return dG(t,e,r)}function fG(t,e,r){return dG(t,e,r)}function dG(t,e,r){const{segmentationId:n,type:i}=e;return $we(t,n,i,r),sr.removeSegmentationRepresentations(t,{segmentationId:n,type:i})}function hG(){sr.getAllViewportSegmentationRepresentations().forEach(({viewportId:e,representations:r})=>{r.forEach(({segmentationId:n,type:i})=>{tg(e,{segmentationId:n,type:i})})}),sr.resetState()}function gG(t,e,r){tg(t,{segmentationId:e,type:Lt.Labelmap},r)}function pG(t,e,r){tg(t,{segmentationId:e,type:Lt.Contour},r)}function mG(t,e,r){tg(t,{segmentationId:e,type:Lt.Surface},r)}function $we(t,e,r,n){Ma(t,{segmentationId:e,type:r}).forEach(a=>{a.type===Lt.Labelmap?ZU.removeRepresentation(t,a.segmentationId,n):a.type===Lt.Contour?YU.removeRepresentation(t,a.segmentationId,n):a.type===Lt.Surface&&aU.removeRepresentation(t,a.segmentationId,n)});const{viewport:o}=qn(t)||{};o&&o.render()}function y8(t){const e=sr;e.getAllViewportSegmentationRepresentations().filter(({representations:n})=>n.some(i=>i.segmentationId===t)).map(({viewportId:n})=>n).forEach(n=>{fG(n,{segmentationId:t})}),e.removeSegmentation(t),RE(t)}function vG(){const t=sr;t.getState().segmentations.map(n=>n.segmentationId).forEach(n=>{y8(n)}),t.resetState()}function jwe(t){sr.removeColorLUT(t)}function yG(t,e){return wG(t).map(o=>(e&&o.type===e,zn(o.segmentationId))).filter(o=>o!==void 0)}function wG(t){return sr.getState().viewportSegRepresentations[t]}function Hwe(t,e){return sr.getStackSegmentationImageIdsForViewport(t,e)}function Kwe(){sr.resetState()}const qwe=Object.freeze(Object.defineProperty({__proto__:null,addColorLUT:Tp,addSegmentations:uG,destroy:Kwe,getColorLUT:ym,getCurrentLabelmapImageIdForViewport:mf,getCurrentLabelmapImageIdsForViewport:Wl,getNextColorLUTIndex:uB,getSegmentation:zn,getSegmentationRepresentation:LE,getSegmentationRepresentations:Ma,getSegmentationRepresentationsBySegmentationId:rU,getSegmentations:Kw,getStackSegmentationImageIdsForViewport:Hwe,getViewportIdsWithSegmentation:Zh,getViewportSegmentationRepresentations:wG,getViewportSegmentations:yG,removeAllSegmentationRepresentations:hG,removeAllSegmentations:vG,removeColorLUT:jwe,removeContourRepresentation:pG,removeLabelmapRepresentation:gG,removeSegmentation:y8,removeSegmentationRepresentation:tg,removeSurfaceRepresentation:mG,updateLabelmapSegmentationImageReferences:yB},Symbol.toStringTag,{value:"Module"}));function xG(t){if("volumeId"in t){if(t=t,!Fe.getVolume(t.volumeId))throw new Error(`volumeId of ${t.volumeId} not found in cache, you should load and cache volume before adding segmentation`)}else if("imageIds"in t){if(t=t,!t.imageIds)throw new Error("The segmentationInput.representationData.imageIds is undefined, please provide a valid representationData.imageIds for stack data")}else throw new Error("The segmentationInput.representationData is undefined, please provide a valid representationData")}function Xwe(t){if(!t.representation.data)throw new Error("The segmentationInput.representationData.data is undefined, please provide a valid representationData.data");const e=t.representation.data;xG(e)}function Ywe(t){xG(t)}const Jwe=Object.freeze(Object.defineProperty({__proto__:null,validate:Ywe,validatePublic:Xwe},Symbol.toStringTag,{value:"Module"}));function CG(t){const e=Fe.getVolume(t);if(!e)return null;const r=e.referencedVolumeId;let n;if(r)n=Fe.getVolume(r);else{const i=e.imageIds,a=Fe.getImage(i[0]).referencedImageId,s=Fe.getVolumeContainingImageId(a);n=s==null?void 0:s.volume}return n}function Zwe({operationData:t}){const{volumeId:e}=t;if(!e){const c=new CustomEvent(Ze.ERROR_EVENT,{detail:{type:"Segmentation",message:"No volume id found for the segmentation"},cancelable:!0});return Je.dispatchEvent(c),null}const r=Fe.getVolume(e),n=CG(e);if(!r||!n)return null;const{imageData:i}=r,{voxelManager:o}=r,{voxelManager:a,imageData:s}=n;return{segmentationImageData:i,segmentationVoxelManager:o,segmentationScalarData:null,imageScalarData:null,imageVoxelManager:a,imageData:s}}function Qwe({operationData:t,viewport:e,strategy:r}){var f;const{segmentationId:n}=t;let i,o,a,s,c,l;if(r.ensureSegmentationVolumeFor3DManipulation)r.ensureSegmentationVolumeFor3DManipulation({operationData:t,viewport:e}),o=t.segmentationVoxelManager,i=t.segmentationImageData,a=null;else{const u=mf(e.id,n);if(!u)return null;const d=Pw(e.id,n);if(!d)return null;const h=Fe.getImage(u);i=d.actor.getMapper().getInputData(),o=h.voxelManager;const g=t.imageId,p=Fe.getImage(g);if(!p)return null;a=(f=p.getPixelData)==null?void 0:f.call(p)}if(r.ensureImageVolumeFor3DManipulation)r.ensureImageVolumeFor3DManipulation({operationData:t,viewport:e}),c=t.imageVoxelManager,s=t.imageScalarData,l=t.imageData;else{const u=e.getCurrentImageId();if(!u)return null;const d=Fe.getImage(u);l=d?null:e.getImageData(),s=(d==null?void 0:d.getPixelData())||l.getScalarData(),c=d==null?void 0:d.voxelManager}return{segmentationImageData:i,segmentationScalarData:a,imageScalarData:s,segmentationVoxelManager:o,imageVoxelManager:c,imageData:l}}function w8({operationData:t,viewport:e,strategy:r}){return t?"volumeId"in t&&t.volumeId!=null||"referencedVolumeId"in t&&t.referencedVolumeId!=null?Zwe({operationData:t}):Qwe({operationData:t,viewport:e,strategy:r}):null}function ng(t){const{representationData:e}=zn(t);let{volumeId:r}=e.Labelmap,n;if(r&&(n=Fe.getVolume(r),n))return n;const{imageIds:i}=e.Labelmap;if(r=Fe.generateVolumeId(i),!(!i||i.length===1||!gf(i)))return n=am(r,i),n}const SG={[It.EnsureSegmentationVolumeFor3DManipulation]:t=>{const{operationData:e,viewport:r}=t,{segmentationId:n,imageIds:i}=e,o=r?r.getImageIds():i.map(c=>Fe.getImage(c).referencedImageId);if(!gf(o))throw new Error("Volume is not reconstructable for sphere manipulation");const s=ng(n);s&&(e.segmentationVoxelManager=s.voxelManager,e.segmentationImageData=s.imageData)}};function qw(t){if(!t||t.length<=1||!gf(t))return;const r=Fe.generateVolumeId(t);let n=Fe.getVolume(r);return n||(n=am(r,t),n)}const TG={[It.EnsureImageVolumeFor3DManipulation]:t=>{const{operationData:e,viewport:r}=t;let n;if(r){if(n=r.getImageIds(),!gf(n))throw new Error("Volume is not reconstructable for sphere manipulation")}else n=zn(e.segmentationId).representationData.Labelmap.imageIds.map(s=>Fe.getImage(s).referencedImageId);const i=qw(n);if(!i)throw new Error("Failed to create or get image volume");e.imageVoxelManager=i.voxelManager,e.imageData=i.imageData}},Kc=(t,e)=>{it(Je,Ze.WEB_WORKER_PROGRESS,{progress:e,type:t})},_G=(t,e)=>{const r=zn(t),{representationData:n}=r,{Labelmap:i}=n;if(!i)return console.debug("No labelmap found for segmentation",t),null;const o=i.volumeId,a=i.imageIds,s={segmentationId:t,volumeId:o,imageIds:a};let c=!1;if(a){const f=a.map(u=>Fe.getImage(u).referencedImageId);c=gf(f)}let l=e;return l?Array.isArray(l)||(l=[l,255]):l=[Ra(t)],{operationData:s,segVolumeId:o,segImageIds:a,reconstructableVolume:c,indices:l}},EG=t=>w8({operationData:t,strategy:{ensureSegmentationVolumeFor3DManipulation:SG.ensureSegmentationVolumeFor3DManipulation,ensureImageVolumeFor3DManipulation:TG.ensureImageVolumeFor3DManipulation}}),bG=t=>{const e=[],r=[];for(const n of t){const i=Fe.getImage(n),o=i.getPixelData(),{origin:a,direction:s,spacing:c,dimensions:l}=pw(i);e.push({scalarData:o,dimensions:l,spacing:c,origin:a,direction:s});const f=i.referencedImageId;if(f){const u=Fe.getImage(f);if(!u)continue;const d=u.getPixelData(),h=u.voxelManager,g=[u.rowPixelSpacing,u.columnPixelSpacing];r.push({scalarData:d,dimensions:h?h.dimensions:[u.columns,u.rows,1],spacing:g})}}return{segmentationInfo:e,imageInfo:r}},exe=(t,e)=>{var a;let r;if(t){const c=Fe.getVolume(t).imageIds,l=Fe.getImage(c[0]);l&&(r=l.referencedImageId)}else e!=null&&e.length&&(r=Fe.getImage(e[0]).referencedImageId);const n=Fe.getImage(r),i=vt("scalingModule",r),o={isPreScaled:!!((a=n==null?void 0:n.preScale)!=null&&a.scaled),isSuvScaled:typeof(i==null?void 0:i.suvbw)=="number"};return{refImageId:r,modalityUnitOptions:o}},{Labelmap:txe}=Lt;async function DG({segmentations:t}){Hw(),Kc(Ja.GENERATE_CONTOUR_SETS,0);const{representationData:e,segments:r=[0,1],segmentationId:n}=t;let{volumeId:i}=e[txe];if(!i){const g=ng(n);g&&(i=g.volumeId)}const o=Fe.getVolume(i);if(!o){console.warn(`No volume found for ${i}`);return}const c={scalarData:o.voxelManager.getCompleteScalarDataArray(),dimensions:o.dimensions,spacing:o.imageData.getSpacing(),origin:o.imageData.getOrigin(),direction:o.imageData.getDirection()},l=Array.isArray(r)?r.filter(g=>g!==null).map(g=>g.segmentIndex||g):Object.values(r).filter(g=>g!==null).map(g=>g.segmentIndex||g),f=await Yc().executeTask("compute","generateContourSetsFromLabelmapVolume",{segmentation:c,indices:l,mode:"individual"}),u=o.imageIds.map(g=>{var v;const p=(v=Fe.getImage(g))==null?void 0:v.referencedImageId;return p?Fe.getImage(p):void 0}),d=u.map(g=>pw(g)),h=f.map(g=>{const p=r[g.segment.segmentIndex]||{};if(!g.sliceContours.length)return null;const v=g.sliceContours[0].polyData.points[0];let y;if(v){const m=d.findIndex(w=>{const{scanAxisNormal:x,origin:C}=w,S=Ac(x,C);return mk(v,S)});m!==-1&&(y=u[m].imageId)}return{label:p.label,color:p.color,metadata:{FrameOfReferenceUID:o.metadata.FrameOfReferenceUID,referencedImageId:y},sliceContours:g.sliceContours.map(m=>({contours:m.contours,polyData:m.polyData,FrameNumber:m.sliceIndex+1,sliceIndex:m.sliceIndex,FrameOfReferenceUID:o.metadata.FrameOfReferenceUID,referencedImageId:y}))}}).filter(g=>g!==null);return Kc(Ja.GENERATE_CONTOUR_SETS,100),h}class IG{constructor(){}static getContourSequence(e,r){const{data:n}=e,{projectionPoints:i,projectionPointsImageIds:o}=n.cachedStats;return i.map((a,s)=>{const c=nxe(a),l=rxe(o[s],r);return{NumberOfContourPoints:c.length/3,ContourImageSequence:l,ContourGeometricType:"CLOSED_PLANAR",ContourData:c}})}}IG.toolName="RectangleROIStartEndThreshold";function nxe(t){return[...t[0],...t[1],...t[3],...t[2]].flat().map(i=>i.toFixed(2))}function rxe(t,e){const r=e.get("sopCommonModule",t);return{ReferencedSOPClassUID:r.sopClassUID,ReferencedSOPInstanceUID:r.sopInstanceUID}}function ixe(t){if(!(t!=null&&t.data))throw new Error("Tool data is empty");if(!t.metadata||t.metadata.referencedImageId)throw new Error("Tool data is not associated with any imageId")}const Rp=class Rp{constructor(){}static convert(e,r,n){ixe(e);const{toolName:i}=e.metadata,o=Rp.TOOL_NAMES[i];if(!o)throw new Error(`Unknown tool type: ${i}, cannot convert to RTSSReport`);const a=o.getContourSequence(e,n),s=[Math.floor(Math.random()*255),Math.floor(Math.random()*255),Math.floor(Math.random()*255)];return{ReferencedROINumber:r+1,ROIDisplayColor:s,ContourSequence:a}}static register(e){Rp.TOOL_NAMES[e.toolName]=e}};Rp.TOOL_NAMES={};let m5=Rp;m5.register(IG);function oxe(t,e){Vc.acceptAutoGenerated(t,e)}const{isEqual:axe}=Vn;function qS(t,e){const{polyline:r}=t.data.contour,{points:n}=t.data.handles,{length:i}=n;if(e===i)return r.length;if(e<0&&(e=(e+i)%i),e===0)return 0;const o=n[e],a=r.findIndex(c=>axe(o,c));if(a!==-1)return a;let s=1/0;return r.reduce((c,l,f)=>{const u=NR(l,o);return u{const S=({value:O})=>{h=h+1,O>=g.lower&&O<=g.upper&&(d=d+1)},{imageData:T,dimensions:_,lower:E,upper:b}=w,D=ME(T,_,x,C);h=0,d=0,g={lower:E,upper:b};let I=!1;const{voxelManager:P}=T.get("voxelManager");return P.forEach(S,{imageData:T,boundsIJK:D}),s===0?I=d>0:s==1&&(I=d===h),I},v=(w,x)=>{const{imageData:C,lower:S,upper:T}=w,_=C.get("voxelManager").voxelManager,E=_.toIndex(x),b=_.getAtIndex(E);return!(b<=S||b>=T)},y=({index:w,pointIJK:x,pointLPS:C})=>{let S=u.length>0;for(let T=0;T{const i=n.detail,{currentPoints:o,element:a}=i,s=o.world,c=Se(a),{viewport:l}=c;this.isDrawing=!0;const f=this.constructor.createAnnotationForViewport(l,{data:{handles:{points:[[...s],[...s],[...s],[...s]],textBox:{hasMoved:!1,worldPosition:[0,0,0],worldBoundingBox:{topLeft:[0,0,0],topRight:[0,0,0],bottomLeft:[0,0,0],bottomRight:[0,0,0]}}},cachedStats:{}}});ln(f,a);const u=Ot(a,this.getToolName());return this.editData={annotation:f,viewportIdsToRender:u,handleIndex:3,movingTextBox:!1,newAnnotation:!0,hasMoved:!1},this._activateDraw(a),Ft(a),n.preventDefault(),Ne(u),f},this.isPointNearTool=(n,i,o,a)=>{const s=Se(n),{viewport:c}=s,{data:l}=i,{points:f}=l.handles,u=c.worldToCanvas(f[0]),d=c.worldToCanvas(f[3]),h=this._getRectangleImageCoordinates([u,d]),g=[o[0],o[1]],{left:p,top:v,width:y,height:m}=h;return YE([p,v,y,m],g)<=a},this.toolSelectedCallback=(n,i)=>{const o=n.detail,{element:a}=o;i.highlighted=!0;const s=Ot(a,this.getToolName());this.editData={annotation:i,viewportIdsToRender:s,movingTextBox:!1},this._activateModify(a),Ft(a);const c=Se(a),{renderingEngine:l}=c;Ne(s),n.preventDefault()},this.handleSelectedCallback=(n,i,o)=>{const a=n.detail,{element:s}=a,{data:c}=i;i.highlighted=!0;let l=!1,f;o.worldPosition?l=!0:f=c.handles.points.findIndex(g=>g===o);const u=Ot(s,this.getToolName());this.editData={annotation:i,viewportIdsToRender:u,handleIndex:f,movingTextBox:l},this._activateModify(s),Ft(s);const d=Se(s),{renderingEngine:h}=d;Ne(u),n.preventDefault()},this._endCallback=n=>{const i=n.detail,{element:o}=i,{annotation:a,viewportIdsToRender:s,newAnnotation:c,hasMoved:l}=this.editData,{data:f}=a;c&&!l||(f.handles.activeHandleIndex=null,this._deactivateModify(o),this._deactivateDraw(o),Xt(o),this.doneEditMemo(),this.editData=null,this.isDrawing=!1,this.isHandleOutsideImage&&this.configuration.preventHandleOutsideImage&&yn(a.annotationUID),Ne(s),c&&jn(a))},this._dragCallback=n=>{this.isDrawing=!0;const i=n.detail,{element:o}=i,{annotation:a,viewportIdsToRender:s,handleIndex:c,movingTextBox:l,newAnnotation:f}=this.editData;this.createMemo(o,a,{newAnnotation:f});const{data:u}=a;if(l){const{deltaPoints:d}=i,h=d.world,{textBox:g}=u.handles,{worldPosition:p}=g;p[0]+=h[0],p[1]+=h[1],p[2]+=h[2],g.hasMoved=!0}else if(c===void 0){const{deltaPoints:d}=i,h=d.world,{points:g}=u.handles;g.forEach(p=>{p[0]+=h[0],p[1]+=h[1],p[2]+=h[2]}),a.invalidated=!0}else{const{currentPoints:d}=i,h=Se(o),{worldToCanvas:g,canvasToWorld:p}=h.viewport,v=d.world,{points:y}=u.handles;y[c]=[...v];let m,w,x,C,S,T,_,E;switch(c){case 0:case 3:m=g(y[0]),C=g(y[3]),w=[C[0],m[1]],x=[m[0],C[1]],T=p(w),_=p(x),y[1]=T,y[2]=_;break;case 1:case 2:w=g(y[1]),x=g(y[2]),m=[x[0],w[1]],C=[w[0],x[1]],S=p(m),E=p(C),y[0]=S,y[3]=E;break}a.invalidated=!0}this.editData.hasMoved=!0,Se(o),Ne(s),a.invalidated&&cn(a,o,Zt.HandlesUpdated)},this.cancel=n=>{if(this.isDrawing){this.isDrawing=!1,this._deactivateDraw(n),this._deactivateModify(n),Xt(n);const{annotation:i,viewportIdsToRender:o,newAnnotation:a}=this.editData,{data:s}=i;return i.highlighted=!1,s.handles.activeHandleIndex=null,Ne(o),a&&jn(i),this.editData=null,i.annotationUID}},this._activateDraw=n=>{He.isInteractingWithTool=!0,n.addEventListener(k.MOUSE_UP,this._endCallback),n.addEventListener(k.MOUSE_DRAG,this._dragCallback),n.addEventListener(k.MOUSE_MOVE,this._dragCallback),n.addEventListener(k.MOUSE_CLICK,this._endCallback),n.addEventListener(k.TOUCH_END,this._endCallback),n.addEventListener(k.TOUCH_DRAG,this._dragCallback),n.addEventListener(k.TOUCH_TAP,this._endCallback)},this._deactivateDraw=n=>{He.isInteractingWithTool=!1,n.removeEventListener(k.MOUSE_UP,this._endCallback),n.removeEventListener(k.MOUSE_DRAG,this._dragCallback),n.removeEventListener(k.MOUSE_MOVE,this._dragCallback),n.removeEventListener(k.MOUSE_CLICK,this._endCallback),n.removeEventListener(k.TOUCH_END,this._endCallback),n.removeEventListener(k.TOUCH_DRAG,this._dragCallback),n.removeEventListener(k.TOUCH_TAP,this._endCallback)},this._activateModify=n=>{He.isInteractingWithTool=!0,n.addEventListener(k.MOUSE_UP,this._endCallback),n.addEventListener(k.MOUSE_DRAG,this._dragCallback),n.addEventListener(k.MOUSE_CLICK,this._endCallback),n.addEventListener(k.TOUCH_END,this._endCallback),n.addEventListener(k.TOUCH_DRAG,this._dragCallback),n.addEventListener(k.TOUCH_TAP,this._endCallback)},this._deactivateModify=n=>{He.isInteractingWithTool=!1,n.removeEventListener(k.MOUSE_UP,this._endCallback),n.removeEventListener(k.MOUSE_DRAG,this._dragCallback),n.removeEventListener(k.MOUSE_CLICK,this._endCallback),n.removeEventListener(k.TOUCH_END,this._endCallback),n.removeEventListener(k.TOUCH_DRAG,this._dragCallback),n.removeEventListener(k.TOUCH_TAP,this._endCallback)},this.renderAnnotation=(n,i)=>{let o=!1;const{viewport:a}=n,{element:s}=a;let c=pn(this.getToolName(),s);if(!(c!=null&&c.length)||(c=this.filterInteractableAnnotationsForElement(s,c),!(c!=null&&c.length)))return o;const l=this.getTargetId(a),f=a.getRenderingEngine(),u={toolGroupId:this.toolGroupId,toolName:this.getToolName(),viewportId:n.viewport.id};for(let d=0;da.worldToCanvas(F));u.annotationUID=g;const{color:w,lineWidth:x,lineDash:C}=this.getAnnotationStyle({annotation:h,styleSpecifier:u}),{viewPlaneNormal:S,viewUp:T}=a.getCamera();if(!p.cachedStats[l]||p.cachedStats[l].areaUnit==null)p.cachedStats[l]={Modality:null,area:null,max:null,mean:null,stdDev:null,areaUnit:null},this._calculateCachedStats(h,S,T,f,n);else if(h.invalidated&&(this._throttledCalculateCachedStats(h,S,T,f,n),a instanceof vr)){const{referencedImageId:F}=h.metadata;for(const j in p.cachedStats)j.startsWith("imageId")&&f.getStackViewports().find(fe=>{const le=Hr(F),de=fe.hasImageURI(le),Ie=Hr(fe.getCurrentImageId());return de&&Ie!==le})&&delete p.cachedStats[j]}if(!a.getRenderingEngine())return console.warn("Rendering Engine has been destroyed"),o;let _;if(!ii(g))continue;!mi(g)&&!this.editData&&y!==null&&(_=[m[y]]),_&&ur(i,g,"0",_,{color:w});const E=`${g}-rect`;ZE(i,g,"0",m,{color:w,lineDash:C,lineWidth:x},E),o=!0;const D=this.getLinkedTextBoxStyle(u,h);if(!D.visibility){p.handles.textBox={hasMoved:!1,worldPosition:[0,0,0],worldBoundingBox:{topLeft:[0,0,0],topRight:[0,0,0],bottomLeft:[0,0,0],bottomRight:[0,0,0]}};continue}const I=this.configuration.getTextLines(p,l);if(!I||I.length===0)continue;if(!p.handles.textBox.hasMoved){const F=Aa(m);p.handles.textBox.worldPosition=a.canvasToWorld(F)}const P=a.worldToCanvas(p.handles.textBox.worldPosition),A=uo(i,g,"1",I,P,m,{},D),{x:V,y:G,width:R,height:N}=A;p.handles.textBox.worldBoundingBox={topLeft:a.canvasToWorld([V,G]),topRight:a.canvasToWorld([V+R,G]),bottomLeft:a.canvasToWorld([V,G+N]),bottomRight:a.canvasToWorld([V+R,G+N])}}return o},this._getRectangleImageCoordinates=n=>{const[i,o]=n;return{left:Math.min(i[0],o[0]),top:Math.min(i[1],o[1]),width:Math.abs(i[0]-o[0]),height:Math.abs(i[1]-o[1])}},this._calculateCachedStats=(n,i,o,a,s)=>{var v,y,m,w;if(!this.configuration.calculateStats)return;const{data:c}=n,{viewport:l}=s,{element:f}=l,u=c.handles.points[0],d=c.handles.points[3],{cachedStats:h}=c,g=Object.keys(h);for(let x=0;xxr(n,o)&&xr(i,o),this._throttledCalculateCachedStats=qo(this._calculateCachedStats,100,{trailing:!0})}};M0.toolName="RectangleROI",M0.hydrate=(e,r,n)=>{const i=qn(e);if(!i)return;const{FrameOfReferenceUID:o,referencedImageId:a,viewPlaneNormal:s,instance:c,viewport:l}=M0.hydrateBase(M0,i,r,n),{toolInstance:f,...u}=n||{},d={annotationUID:(n==null?void 0:n.annotationUID)||kn(),data:{handles:{points:r,activeHandleIndex:null},label:"",cachedStats:{}},highlighted:!1,autoGenerated:!1,invalidated:!1,isLocked:!1,isVisible:!0,metadata:{toolName:c.getToolName(),viewPlaneNormal:s,FrameOfReferenceUID:o,referencedImageId:a,...u}};ln(d,l.element),Ne([l.id])};let $l=M0;function cxe(t,e){const r=t.cachedStats[e],{area:n,mean:i,max:o,stdDev:a,areaUnit:s,modalityUnit:c,min:l}=r;if(i==null)return;const f=[];return Gr(n)&&f.push(`Area: ${dn(n)} ${s}`),Gr(i)&&f.push(`Mean: ${dn(i)} ${c}`),Gr(o)&&f.push(`Max: ${dn(o)} ${c}`),Gr(l)&&f.push(`Max: ${dn(l)} ${c}`),Gr(a)&&f.push(`Std Dev: ${dn(a)} ${c}`),f}const{transformWorldToIndex:Pg}=Vn;class x8 extends $l{constructor(e={},r={configuration:{storePointData:!1,numSlicesToPropagate:10,calculatePointsInsideVolume:!0,getTextLines:lxe,statsCalculator:jc,showTextBox:!1,throttleTimeout:100}}){super(e,r),this.addNewAnnotation=n=>{const i=n.detail,{currentPoints:o,element:a}=i,s=o.world,c=Se(a),{viewport:l,renderingEngine:f}=c;this.isDrawing=!0;const u=l.getCamera(),{viewPlaneNormal:d,viewUp:h}=u;let g,p,v;if(l instanceof mr)throw new Error("Stack Viewport Not implemented");{const T=this.getTargetId(l);v=Jc(T),p=Fe.getVolume(v),g=Vl(p,s,d)}const y=hf(p,d),m=this._getStartCoordinate(s,d),w=this._getEndCoordinate(s,y,d),x=l.getFrameOfReferenceUID(),C={highlighted:!0,invalidated:!0,metadata:{viewPlaneNormal:[...d],enabledElement:c,viewUp:[...h],FrameOfReferenceUID:x,referencedImageId:g,toolName:this.getToolName(),volumeId:v,spacingInNormal:y},data:{label:"",startCoordinate:m,endCoordinate:w,cachedStats:{pointsInVolume:[],projectionPoints:[],projectionPointsImageIds:[g],statistics:[]},handles:{textBox:{hasMoved:!1,worldPosition:[0,0,0],worldBoundingBox:{topLeft:[0,0,0],topRight:[0,0,0],bottomLeft:[0,0,0],bottomRight:[0,0,0]}},points:[[...s],[...s],[...s],[...s]],activeHandleIndex:null},labelmapUID:null}};this._computeProjectionPoints(C,p),ln(C,a);const S=Ot(a,this.getToolName());return this.editData={annotation:C,viewportIdsToRender:S,handleIndex:3,newAnnotation:!0,hasMoved:!1},this._activateDraw(a),Ft(a),n.preventDefault(),Ne(S),C},this._endCallback=n=>{const i=n.detail,{element:o}=i,{annotation:a,viewportIdsToRender:s,newAnnotation:c,hasMoved:l}=this.editData,{data:f}=a;if(c&&!l)return;f.handles.activeHandleIndex=null,this._deactivateModify(o),this._deactivateDraw(o),Xt(o);const u=Se(o);this.editData=null,this.isDrawing=!1,this.isHandleOutsideImage&&this.configuration.preventHandleOutsideImage&&yn(a.annotationUID);const d=this.getTargetId(u.viewport),h=Fe.getVolume(d.split(/volumeId:|\?/)[1]);this._computePointsInsideVolume(a,d,h,u),Ne(s),c?jn(a):cn(a,o)},this.renderAnnotation=(n,i)=>{let o=!1;const{viewport:a}=n;let s=pn(this.getToolName(),a.element);if(!(s!=null&&s.length))return o;s=Gw(s,a.getCamera());const c={toolGroupId:this.toolGroupId,toolName:this.getToolName(),viewportId:n.viewport.id};for(let l=0;la.worldToCanvas(R));c.annotationUID=u;const w=this.getStyle("lineWidth",c,f),x=this.getStyle("lineDash",c,f),C=this.getStyle("color",c,f),S=a.getCamera().focalPoint,T=a.getCamera().viewPlaneNormal;let _=g,E=p;if(Array.isArray(g)){_=this._getCoordinateForViewplaneNormal(_,T);const R=this._getIndexOfCoordinatesForViewplaneNormal(T);d.handles.points.forEach(N=>{N[R]=_}),d.startCoordinate=_}Array.isArray(p)&&(E=this._getCoordinateForViewplaneNormal(E,T),d.endCoordinate=E,d.endCoordinate=E);const b=Lu(_),D=Lu(E),I=this._getCoordinateForViewplaneNormal(S,T),P=Lu(I);if(PMath.max(b,D))continue;f.invalidated&&this._throttledCalculateCachedStats(f,n);let O=!1;if((P===b||P===D)&&(O=!0),!a.getRenderingEngine())return console.warn("Rendering Engine has been destroyed"),o;let A;if(!ii(u))continue;!mi(u)&&!this.editData&&y!==null&&O&&(A=[m[y]]),A&&ur(i,u,"0",A,{color:C});let V=x;if(O||(V=2),Tm(i,u,"0",m[0],m[3],{color:C,lineDash:V,lineWidth:w}),o=!0,this.configuration.showTextBox){const R=this.getLinkedTextBoxStyle(c,f);if(!R.visibility){d.handles.textBox={hasMoved:!1,worldPosition:[0,0,0],worldBoundingBox:{topLeft:[0,0,0],topRight:[0,0,0],bottomLeft:[0,0,0],bottomRight:[0,0,0]}};continue}const N=this.configuration.getTextLines(d,{metadata:h});if(!N||N.length===0)continue;if(!d.handles.textBox.hasMoved){const Ie=Aa(m);d.handles.textBox.worldPosition=a.canvasToWorld(Ie)}const F=a.worldToCanvas(d.handles.textBox.worldPosition),X=uo(i,u,"1",N,F,m,{},R),{x:te,y:fe,width:le,height:de}=X;d.handles.textBox.worldBoundingBox={topLeft:a.canvasToWorld([te,fe]),topRight:a.canvasToWorld([te+le,fe]),bottomLeft:a.canvasToWorld([te,fe+de]),bottomRight:a.canvasToWorld([te+le,fe+de])}}}return o},this.configuration.calculatePointsInsideVolume?this._throttledCalculateCachedStats=qo(this._calculateCachedStatsTool,this.configuration.throttleTimeout,{trailing:!0}):this._throttledCalculateCachedStats=qh(this._calculateCachedStatsTool,this.configuration.throttleTimeout)}_computeProjectionPoints(e,r){const{data:n,metadata:i}=e,{viewPlaneNormal:o,spacingInNormal:a}=i,{imageData:s}=r,{startCoordinate:c,endCoordinate:l}=n,{points:f}=n.handles,u=Pg(s,f[0]),d=Pg(s,f[0]),h=Ge();s.indexToWorldVec3(u,h);const g=Ge();s.indexToWorldVec3(d,g),this._getIndexOfCoordinatesForViewplaneNormal(o)==2?(h[2]=c,g[2]=l):this._getIndexOfCoordinatesForViewplaneNormal(o)==0?(h[0]=c,g[0]=l):this._getIndexOfCoordinatesForViewplaneNormal(o)==1&&(h[1]=c,g[1]=l);const p=no(h,g),v=[];for(let y=0;y{const w=Ge();return An(w,m,o,y),Array.from(w)}));n.cachedStats.projectionPoints=v}_computePointsInsideVolume(e,r,n,i){var S,T,_;const{data:o,metadata:a}=e,{viewPlaneNormal:s,viewUp:c}=a,{viewport:l}=i,f=o.cachedStats.projectionPoints,u=[[]],d=this.getTargetImageData(r),h=o.handles.points[0],g=o.handles.points[3],{worldWidth:p,worldHeight:v}=Bw(s,c,h,g),y=La(d,o.habdles),m=Math.abs(p*v)/(y.scale*y.scale),w={isPreScaled:ql(l,r),isSuvScaled:this.isSuvScaled(l,r,e.metadata.referencedImageId)},x=Xl(a.Modality,e.metadata.referencedImageId,w);for(let E=0;E{const i=n.detail,{currentPoints:o,element:a}=i,s=o.world,c=Se(a),{viewport:l,renderingEngine:f}=c;this.isDrawing=!0;const u=l.getCamera(),{viewPlaneNormal:d,viewUp:h}=u,g=this.getTargetId(l);let p,v;if(l instanceof mr)p=g.split("imageId:")[1];else{v=Jc(g);const x=Fe.getVolume(v);p=Vl(x,s,d)}const y=l.getFrameOfReferenceUID(),m={highlighted:!0,invalidated:!0,metadata:{viewPlaneNormal:[...d],enabledElement:c,viewUp:[...h],FrameOfReferenceUID:y,referencedImageId:p,toolName:this.getToolName(),volumeId:v},data:{label:"",handles:{textBox:{hasMoved:!1,worldPosition:null,worldBoundingBox:null},points:[[...s],[...s],[...s],[...s]],activeHandleIndex:null},segmentationId:null}};ln(m,a);const w=Ot(a,this.getToolName());return this.editData={annotation:m,viewportIdsToRender:w,handleIndex:3,newAnnotation:!0,hasMoved:!1},this._activateDraw(a),Ft(a),n.preventDefault(),Ne(w),m},this.renderAnnotation=(n,i)=>{let o=!1;const{viewport:a}=n,{element:s}=a;let c=pn(this.getToolName(),s);if(!(c!=null&&c.length)||(c=this.filterInteractableAnnotationsForElement(s,c),!(c!=null&&c.length)))return o;const l={toolGroupId:this.toolGroupId,toolName:this.getToolName(),viewportId:n.viewport.id};for(let f=0;fa.worldToCanvas(S));l.annotationUID=d;const y=this.getStyle("lineWidth",l,u),m=this.getStyle("lineDash",l,u),w=this.getStyle("color",l,u);if(!a.getRenderingEngine())return console.warn("Rendering Engine has been destroyed"),o;cn(u,s);let x;if(!ii(d))continue;!mi(d)&&!this.editData&&p!==null&&(x=[v[p]]),x&&ur(i,d,"0",x,{color:w}),Tm(i,d,"0",v[0],v[3],{color:w,lineDash:m,lineWidth:y}),o=!0}return o}}}C8.toolName="RectangleROIThreshold";function MG(t,e,r={}){const n=[];return t.forEach(o=>{var h,g;const{data:a}=o,{points:s}=a.handles,{imageData:c,dimensions:l}=e;let f=s;if((h=a.cachedStats)!=null&&h.projectionPoints){const{projectionPoints:p}=a.cachedStats;f=[].concat(...p)}const u=f.map(p=>ei(c,p));let d=ef(u,l);r.numSlicesToProject&&!((g=a.cachedStats)!=null&&g.projectionPoints)&&(d=oG(d,r.numSlicesToProject)),n.push(d)}),n.length===1?n[0]:n.reduce((o,a)=>({iMin:Math.min(o.iMin,a.iMin),jMin:Math.min(o.jMin,a.jMin),kMin:Math.min(o.kMin,a.kMin),iMax:Math.max(o.iMax,a.iMax),jMax:Math.max(o.jMax,a.jMax),kMax:Math.max(o.kMax,a.kMax)}),{iMin:1/0,jMin:1/0,kMin:1/0,iMax:-1/0,jMax:-1/0,kMax:-1/0})}function uxe(t,e,r,n){const i=t.map(s=>Zr.getAnnotation(s));fxe(i);let o;for(let s=0;s{if(!Yt(f,t[0].dimensions)||!Yt(l,t[0].direction)||!Yt(d,t[0].spacing)||!Yt(u,t[0].origin))throw new Error("labelmaps must have the same size and shape")});const n=t[0],i=n.voxelManager.getConstructor(),o=new i(n.voxelManager.getScalarDataLength());t.forEach(l=>{const f=l.voxelManager,u=f.getScalarDataLength();for(let d=0;d0;)g(f.pop());return{flooded:u};function g(_){const E=_.currentArgs,b=_.previousArgs;p(E)||(v(E),y(E)?(m(E),x(E)):w(b))}function p(_){const[E,b,D=0]=_,I=E+32768+65536*(b+32768+65536*(D+32768));return d.has(I)}function v(_){const[E,b,D=0]=_,I=E+32768+65536*(b+32768+65536*(D+32768));d.add(I)}function y(_){const E=C(_);return o?o(E,c):E===c}function m(_){u.push(_),n&&n(..._)}function w(_){const[E,b,D=0]=_,I=E+32768+65536*(b+32768+65536*(D+32768));h==null||h.set(I,_),i&&i(..._)}function x(_){for(let E=0;E{const{segmentIndex:e,previewSegmentIndex:r,segmentationVoxelManager:n,centerIJK:i,viewPlaneNormal:o,segmentationImageData:a,configuration:s}=t;if(!(s!=null&&s.useCenterSegmentIndex))return;let c=!1,l=!1;const f=[...n.getBoundsIJK()];Math.abs(o[0])>.8?f[0]=[i[0],i[0]]:Math.abs(o[1])>.8?f[1]=[i[1],i[1]]:Math.abs(o[2])>.8&&(f[2]=[i[2],i[2]]);const u=({value:h})=>{c||(c=h===e),l||(l=h===r)};if(n.forEach(u,{imageData:a,isInObject:t.isInObject,boundsIJK:f}),!c&&!l){t.centerSegmentIndexInfo.segmentIndex=null;return}const d=n.getAtIJKPoint(i);t.centerSegmentIndexInfo.segmentIndex=d,t.centerSegmentIndexInfo.hasSegmentIndex=c,t.centerSegmentIndexInfo.hasPreviewIndex=l}},mxe={[It.Initialize]:t=>{var y;const{operationName:e,centerIJK:r,segmentationVoxelManager:n,imageVoxelManager:i,configuration:o,segmentIndex:a,viewport:s}=t;if(!((y=o==null?void 0:o.threshold)!=null&&y.isDynamic)||!r||!a||e===It.RejectPreview||e===It.OnInteractionEnd)return;const c=n.getBoundsIJK(),{range:l,dynamicRadius:f=0}=o.threshold,u=l?0:f,{viewPlaneNormal:d}=s.getCamera(),h=c.map((m,w)=>{const[x,C]=m;return[Math.max(x,r[w]-u),Math.min(C,r[w]+u)]});Math.abs(d[0])>.8?h[0]=[r[0],r[0]]:Math.abs(d[1])>.8?h[1]=[r[1],r[1]]:Math.abs(d[2])>.8&&(h[2]=[r[2],r[2]]);const g=l||[1/0,-1/0],p=u*u,v=({value:m,pointIJK:w})=>{if(oS(r,w)>p)return;const C=Array.isArray(m)?mh(m):m;g[0]=Math.min(C,g[0]),g[1]=Math.max(C,g[1])};i.forEach(v,{boundsIJK:h}),o.threshold.range=g},[It.OnInteractionStart]:t=>{var r;const{configuration:e}=t;(r=e==null?void 0:e.threshold)!=null&&r.isDynamic&&(e.threshold.range=null)},[It.ComputeInnerCircleRadius]:t=>{const{configuration:e,viewport:r}=t,{dynamicRadius:n=0,isDynamic:i}=e.threshold;if(!i){e.threshold.dynamicRadiusInCanvas=0;return}if(n===0)return;const o=r.getImageData();if(!o)return;const{spacing:a}=o,s=[r.element.clientWidth/2,r.element.clientHeight/2],c=n*a[0],f=r.canvasToWorld(s).map(h=>h+c),u=r.worldToCanvas(f),d=Math.abs(s[0]-u[0]);e.threshold.dynamicRadiusInCanvas||(e.threshold.dynamicRadiusInCanvas=0),e.threshold.dynamicRadiusInCanvas=3+d}},vxe={[It.Initialize]:t=>{t.segmentIndex=0}},{isEqual:I3}=Vn,YI={toIJK:t=>t,fromIJK:t=>t,type:"acquistion"},yxe={toIJK:([t,e,r])=>[r,t,e],fromIJK:([t,e,r])=>[e,r,t],type:"jk"},wxe={toIJK:([t,e,r])=>[t,r,e],fromIJK:([t,e,r])=>[t,r,e],type:"ik"};function RG(t,e){if(!(t instanceof Or))return{...YI,boundsIJKPrime:e};const{viewPlaneNormal:r}=t.getCamera(),n=I3(Math.abs(r[0]),1)&&yxe||I3(Math.abs(r[1]),1)&&wxe||I3(Math.abs(r[2]),1)&&YI;return n?{...n,boundsIJKPrime:n.fromIJK(e)}:{toIJK:null,boundsIJKPrime:null,fromIJK:null,error:`Only mappings orthogonal to acquisition plane are permitted, but requested ${r}`}}const{RLEVoxelMap:xxe,VoxelManager:Cxe}=Vn,Sxe=65535;var yo;(function(t){t[t.SEGMENT=-1]="SEGMENT",t[t.ISLAND=-2]="ISLAND",t[t.INTERIOR=-3]="INTERIOR",t[t.EXTERIOR=-4]="EXTERIOR",t[t.INTERIOR_SMALL=-5]="INTERIOR_SMALL",t[t.INTERIOR_TEST=-6]="INTERIOR_TEST"})(yo||(yo={}));class Od{constructor(e){this.fillInternalEdge=!1,this.maxInternalRemove=128,this.maxInternalRemove=(e==null?void 0:e.maxInternalRemove)??this.maxInternalRemove,this.fillInternalEdge=(e==null?void 0:e.fillInternalEdge)??this.fillInternalEdge}initialize(e,r,n){const i=!!r.sourceVoxelManager,o=i?r.sourceVoxelManager:r,a=i?r:Cxe.createRLEHistoryVoxelManager(o),{segmentIndex:s=1,previewSegmentIndex:c=1}=n,l=n.points||o.getPoints();if(!(l!=null&&l.length))return;const f=o.getBoundsIJK().map((x,C)=>[Math.min(x[0],...l.map(S=>S[C])),Math.max(x[1],...l.map(S=>S[C]))]);if(f.find(x=>x[0]<0||x[1]>Sxe))return;const{toIJK:u,fromIJK:d,boundsIJKPrime:h,error:g}=RG(e,f);if(g){console.warn("Not performing island removal for planes not orthogonal to acquisition plane",g);return}const[p,v,y]=d(o.dimensions),m=new xxe(p,v,y),w=(x,C,S)=>{const T=o.toIndex(u([x,C,S])),_=o.getAtIndex(T);if(_===c||_===s)return yo.SEGMENT};return m.fillFrom(w,h),m.normalizer={toIJK:u,fromIJK:d,boundsIJKPrime:h},this.segmentSet=m,this.previewVoxelManager=a,this.segmentIndex=s,this.previewSegmentIndex=c??s,this.selectedPoints=l,!0}floodFillSegmentIsland(){const{selectedPoints:e,segmentSet:r}=this;let n=0;const{fromIJK:i}=r.normalizer;return e.forEach(o=>{const a=i(o),s=r.toIndex(a),[c,l,f]=a;r.get(s)===yo.SEGMENT&&(n+=r.floodFill(c,l,f,yo.ISLAND))}),n}removeExternalIslands(){const{previewVoxelManager:e,segmentSet:r}=this,{toIJK:n}=r.normalizer,i=(o,a)=>{const[,s,c]=r.toIJK(o);if(a.value!==yo.ISLAND)for(let l=a.start;l{let f;for(const u of[...l])if(u.value===yo.ISLAND){if(!f){if(this.fillInternalEdge&&u.start>0)for(let d=0;d{if(l.value!==yo.INTERIOR)return;const[,f,u]=e.toIJK(c),d=f>0?e.getRun(f-1,u):null,h=f+12&&(!v||!y)&&e.floodFill(l.start,f,u,yo.EXTERIOR,{singlePlane:!0})}),e.forEach((c,l)=>{if(l.value!==yo.INTERIOR)return;const[,f,u]=e.toIJK(c),g=e.floodFill(l.start,f,u,yo.INTERIOR_TEST)>this.maxInternalRemove?yo.EXTERIOR:yo.INTERIOR_SMALL;e.floodFill(l.start,f,u,g)}),e.forEach((c,l)=>{if(l.value===yo.INTERIOR_SMALL)for(let f=l.start;f=o.start&&n=i))return!0;return!1}}const Txe={[It.OnInteractionEnd]:t=>{const{previewSegmentIndex:e,segmentIndex:r,viewport:n,segmentationVoxelManager:i,activeStrategy:o,memo:a}=t;if(o!=="THRESHOLD_INSIDE_SPHERE_WITH_ISLAND_REMOVAL"||r===null)return;const s=new Od,c=(a==null?void 0:a.voxelManager)||i;if(!s.initialize(n,c,{previewSegmentIndex:e,segmentIndex:r}))return;s.floodFillSegmentIsland(),s.removeExternalIslands(),s.removeInternalIslands();const l=c.getArrayOfModifiedSlices();l&&bo(t.segmentationId,l,e)}},_xe={[It.Preview]:function(t){var o,a;const{previewSegmentIndex:e,configuration:r,enabledElement:n}=t;if(!e||!r)return;(o=this.onInteractionStart)==null||o.call(this,n,t);const i=this.fill(n,t);return i&&((a=this.onInteractionEnd)==null||a.call(this,n,t)),i},[It.Initialize]:t=>{const{segmentIndex:e,previewColor:r,previewSegmentIndex:n}=t;if(n==null||e==null)return;const i=Zh(t.segmentationId);i==null||i.forEach(o=>{fB(o,t.segmentationId,n,r)})},[It.AcceptPreview]:t=>{const{previewSegmentIndex:e,segmentationVoxelManager:r,memo:n,segmentIndex:i,centerSegmentIndexInfo:o}=t||{},{changedIndices:a}=o||{},s=n,c=({index:l})=>{const f=r.getAtIndex(l);(a==null?void 0:a.length)>0?a.includes(l)&&s.voxelManager.setAtIndex(l,0):f===e&&s.voxelManager.setAtIndex(l,i)};r.forEach(c),bo(t.segmentationId,r.getArrayOfModifiedSlices(),i),t.centerSegmentIndexInfo.changedIndices=[]},[It.RejectPreview]:t=>{t&&gV.undoIf(e=>{const r=e;if(!(r!=null&&r.voxelManager))return!1;const{segmentationVoxelManager:n}=r;let i=!1;const o=({value:a})=>{a===t.previewSegmentIndex&&(i=!0)};return n.forEach(o),i})}},Exe={[It.Fill]:t=>{var l;const{segmentsLocked:e,segmentationImageData:r,segmentationVoxelManager:n,brushStrategy:i,centerIJK:o}=t,a=(l=i.createIsInThreshold)==null?void 0:l.call(i,t),{setValue:s}=i,c=a?f=>{const{value:u,index:d}=f;e.includes(u)||!a(d)||s(t,f)}:f=>s(t,f);n.forEach(c,{imageData:r,isInObject:t.isInObject,boundsIJK:t.isInObjectBoundsIJK}),n.addPoint(o)}};function bxe({operationData:t,existingValue:e,index:r}){const{previewSegmentIndex:n,memo:i,centerSegmentIndexInfo:o,previewOnHover:a,segmentIndex:s}=t,{hasPreviewIndex:c,hasSegmentIndex:l,segmentIndex:f}=o;if(f===0&&l&&c){if(e===s||a)return;if(e===n){i.voxelManager.setAtIndex(r,0);return}return}if(f===0&&l&&!c){if(e===0||e!==s)return;i.voxelManager.setAtIndex(r,n),o.changedIndices.push(r);return}if(f===0&&!l&&c){if(e===s||a)return;if(e===n){i.voxelManager.setAtIndex(r,0);return}return}if(f===0&&!l&&!c){if(e===s)return;if(e===n){i.voxelManager.setAtIndex(r,n);return}return}if(f===n&&l&&c){if(e===s)return;i.voxelManager.setAtIndex(r,n);return}if(f===n&&!l&&c){if(e===s)return;i.voxelManager.setAtIndex(r,n);return}if(f===s&&l&&c){if(e===s)return;i.voxelManager.setAtIndex(r,n);return}if(f===s&&l&&!c){if(e===s)return;i.voxelManager.setAtIndex(r,n);return}}const Dxe={[It.INTERNAL_setValue]:(t,{value:e,index:r})=>{const{segmentsLocked:n,previewSegmentIndex:i,memo:o,segmentationVoxelManager:a,centerSegmentIndexInfo:s,segmentIndex:c}=t,l=a.getAtIndex(r);if(!n.includes(e)&&!(!s&&l===c)&&!((s==null?void 0:s.segmentIndex)!==0&&l===c)){if((s==null?void 0:s.segmentIndex)===null){o.voxelManager.setAtIndex(r,i??c);return}if(!i){let f=c;s&&(f=s.segmentIndex),o.voxelManager.setAtIndex(r,f);return}bxe({operationData:t,existingValue:l,index:r})}}},Ixe={[It.CreateIsInThreshold]:t=>{const{imageVoxelManager:e,segmentIndex:r,configuration:n}=t;if(!(!n||!r))return i=>{var c;const o=e.getAtIndex(i),a=Array.isArray(o)?sa(o):o,{threshold:s}=n||{};return(c=s==null?void 0:s.range)!=null&&c.length?s.range[0]<=a&&a<=s.range[1]:!0}}},JI=10;function v5(){return{maxIJKs:[]}}function LG(t,e){const{value:r}=e,{maxIJKs:n}=t,i=n.length;if(typeof r!="number"||i>=JI&&r=n[i-1].value)n.push(o);else for(let a=0;a=JI&&n.splice(0,1)}function AG(t,e,r){const{spacing:n,calibration:i}=r,{volumeUnit:o}=La({calibration:i,hasPixelSpacing:!0},[]),a=n?n[0]*n[1]*n[2]:1;return e.volume={value:Array.isArray(e.count.value)?e.count.value.map(s=>s*a):e.count.value*a,unit:o,name:"volume",label:"Volume"},e.maxIJKs=t.maxIJKs.filter(s=>s.pointIJK!==void 0),e.array.push(e.volume),t.maxIJKs=[],e}const eb=class eb extends jc{static statsInit(e){super.statsInit(e),this.volumetricState=v5()}static statsCallback(e){super.statsCallback(e),LG(this.volumetricState,e)}static getStatistics(e){const r={...e,unit:(e==null?void 0:e.unit)||"none",calibration:e==null?void 0:e.calibration,hasPixelSpacing:e==null?void 0:e.hasPixelSpacing},n=super.getStatistics(r);return AG(this.volumetricState,n,r)}};eb.volumetricState=v5();let fd=eb;class ZI extends DU{constructor(e){super(e),this.volumetricState=v5()}statsInit(e){super.statsInit(e),this.volumetricState=v5()}statsCallback(e){super.statsCallback(e),LG(this.volumetricState,e)}getStatistics(e){const r={...e,unit:(e==null?void 0:e.unit)||"none",calibration:e==null?void 0:e.calibration,hasPixelSpacing:e==null?void 0:e.hasPixelSpacing},n=super.getStatistics(r);return AG(this.volumetricState,n,r)}}const Oxe=Math.pow(3*1e3/(4*Math.PI),1/3);async function NG({segmentationId:t,segmentIndices:e,mode:r="collective"}){Hw(),Kc(Ja.COMPUTE_STATISTICS,0);const n=_G(t,e);if(!n)return;const{operationData:i,segVolumeId:o,segImageIds:a,reconstructableVolume:s,indices:c}=n,{refImageId:l,modalityUnitOptions:f}=exe(o,a),u=gB(l,f);return s?await Mxe({operationData:i,indices:c,unit:u,mode:r}):await Pxe({segImageIds:a,indices:c,unit:u,mode:r})}async function Mxe({operationData:t,indices:e,unit:r,mode:n}){var p;const i=EG(t),{segmentationVoxelManager:o,imageVoxelManager:a,segmentationImageData:s,imageData:c}=i;if(!o||!s)return;const l=s.getSpacing(),{boundsIJK:f}=o;if(!f)return fd.getStatistics({spacing:l});const d={scalarData:o.getCompleteScalarDataArray(),dimensions:s.getDimensions(),spacing:s.getSpacing(),origin:s.getOrigin(),direction:s.getDirection()},h={scalarData:a.getCompleteScalarDataArray(),dimensions:c.getDimensions(),spacing:c.getSpacing(),origin:c.getOrigin(),direction:c.getDirection()};if(!((p=h.scalarData)!=null&&p.length))return;const g=await Yc().executeTask("compute","calculateSegmentsStatisticsVolume",{segmentationInfo:d,imageInfo:h,indices:e,unit:r,mode:n});if(Kc(Ja.COMPUTE_STATISTICS,100),n==="collective")return y5({stats:g,unit:r,spacing:l,segmentationImageData:s,imageVoxelManager:a});{const v={};return Object.entries(g).forEach(([y,m])=>{v[y]=y5({stats:m,unit:r,spacing:l,segmentationImageData:s,imageVoxelManager:a})}),v}}const O3=(t,e)=>{if(!t.array)return;const r=t.array.findIndex(n=>n.name===e.name);r!==-1?t.array[r]=e:t.array.push(e)},y5=({stats:t,unit:e,spacing:r,segmentationImageData:n,imageVoxelManager:i})=>{if(t.mean.unit=e,t.max.unit=e,t.min.unit=e,e!=="SUV")return t;const o=r.map(a=>Math.max(1,Math.round(1.1*Oxe/a)));for(const a of t.maxIJKs){const s=Rxe(a,o,n,i,r);if(!s)continue;const{mean:c}=s;(!t.peakValue||t.peakValue.value<=c.value)&&(t.peakValue={name:"peakValue",label:"Peak Value",value:c.value,unit:e},t.peakPoint={name:"peakLPS",label:"Peak SUV Point",value:a.pointLPS?[...a.pointLPS]:null,unit:null},O3(t,t.peakValue),O3(t,t.peakPoint))}if(t.volume&&t.mean){const a=t.volume.value,s=t.mean.value;t.lesionGlycolysis={name:"lesionGlycolysis",label:"Lesion Glycolysis",value:a*s,unit:`${t.volume.unit}·${e}`},O3(t,t.lesionGlycolysis)}return t};async function Pxe({segImageIds:t,indices:e,unit:r,mode:n}){Kc(Ja.COMPUTE_STATISTICS,0);const{segmentationInfo:i,imageInfo:o}=bG(t),a=await Yc().executeTask("compute","calculateSegmentsStatisticsStack",{segmentationInfo:i,imageInfo:o,indices:e,mode:n});Kc(Ja.COMPUTE_STATISTICS,100);const s=i[0].spacing,c=i[0],l=o[0].voxelManager;if(n==="collective")return y5({stats:a,unit:r,spacing:s,segmentationImageData:c,imageVoxelManager:l});{const f={};return Object.entries(a).forEach(([u,d])=>{f[u]=y5({stats:d,unit:r,spacing:s,segmentationImageData:c,imageVoxelManager:l})}),f}}function Rxe(t,e,r,n,i){const{pointIJK:o,pointLPS:a}=t;if(!o)return;const s=o.map((f,u)=>[f-e[u],f+e[u]]),c=(f,u)=>{const d=(u[0]-o[0])/e[0],h=(u[1]-o[1])/e[1],g=(u[2]-o[2])/e[2];return d*d+h*h+g*g<=1},l=({pointIJK:f,pointLPS:u})=>{const d=n.getAtIJKPoint(f);d!==void 0&&fd.statsCallback({value:d,pointLPS:u,pointIJK:f})};return fd.statsInit({storePointData:!1}),G4(r,{pointInShapeFn:c,callback:l,boundsIJK:s}),fd.getStatistics({spacing:i})}const Lxe={[It.GetStatistics]:function(t,e,r){const{indices:n}=r,{segmentationId:i,viewport:o}=e;NG({segmentationId:i,segmentIndices:n})}},Sn={determineSegmentIndex:pxe,dynamicThreshold:mxe,erase:vxe,islandRemoval:Txe,preview:_xe,regionFill:Exe,setValue:Dxe,threshold:Ixe,labelmapStatistics:Lxe,ensureSegmentationVolumeFor3DManipulation:SG,ensureImageVolumeFor3DManipulation:TG},Yf=class Yf{constructor(e,...r){this._initialize=[],this._fill=[],this._onInteractionStart=[],this.fill=(n,i)=>{const o=this.initialize(n,i,It.Fill);if(!o)return;this._fill.forEach(c=>c(o));const{segmentationVoxelManager:a,segmentIndex:s}=o;return bo(o.segmentationId,a.getArrayOfModifiedSlices(),s),o},this.onInteractionStart=(n,i)=>{const o=this.initialize(n,i);o&&this._onInteractionStart.forEach(a=>a.call(this,o))},this.addPreview=(n,i)=>{const o=this.initialize(n,i,It.AddPreview);if(o)return o},this.configurationName=e,this.compositions=r,r.forEach(n=>{const i=typeof n=="function"?n():n;if(i)for(const o in i){if(!Yf.childFunctions[o])throw new Error(`Didn't find ${o} as a brush strategy`);Yf.childFunctions[o](this,i[o])}}),this.strategyFunction=(n,i)=>this.fill(n,i);for(const n of Object.keys(Yf.childFunctions))this.strategyFunction[n]=this[n]}initialize(e,r,n){const{viewport:i}=e,o=w8({operationData:r,viewport:i,strategy:this});if(!o)return null;const{imageVoxelManager:a,segmentationVoxelManager:s,segmentationImageData:c}=o,l=r.createMemo(r.segmentationId,s),f={operationName:n,...r,segmentIndex:r.segmentIndex,enabledElement:e,imageVoxelManager:a,segmentationVoxelManager:s,segmentationImageData:c,viewport:i,centerWorld:null,isInObject:null,isInObjectBoundsIJK:null,brushStrategy:this,memo:l};return this._initialize.forEach(u=>u(f)),f}};Yf.COMPOSITIONS=Sn,Yf.childFunctions={[It.OnInteractionStart]:ks(It.OnInteractionStart,It.Initialize),[It.OnInteractionEnd]:ks(It.OnInteractionEnd,It.Initialize),[It.Fill]:ks(It.Fill),[It.Initialize]:ks(It.Initialize),[It.CreateIsInThreshold]:G2(It.CreateIsInThreshold),[It.Interpolate]:ks(It.Interpolate,It.Initialize),[It.AcceptPreview]:ks(It.AcceptPreview,It.Initialize),[It.RejectPreview]:ks(It.RejectPreview,It.Initialize),[It.INTERNAL_setValue]:G2(It.INTERNAL_setValue),[It.Preview]:G2(It.Preview,!1),[It.ComputeInnerCircleRadius]:ks(It.ComputeInnerCircleRadius),[It.EnsureSegmentationVolumeFor3DManipulation]:ks(It.EnsureSegmentationVolumeFor3DManipulation),[It.EnsureImageVolumeFor3DManipulation]:ks(It.EnsureImageVolumeFor3DManipulation),[It.AddPreview]:ks(It.AddPreview),[It.GetStatistics]:G2(It.GetStatistics),compositions:null};let sc=Yf;function ks(t,e){const r=`_${t}`;return(n,i)=>{n[r]||(n[r]=[]),n[r].push(i),n[t]||(n[t]=e?(o,a,...s)=>{const c=n[e](o,a,t);let l;return n[r].forEach(f=>{const u=f.call(n,c,...s);l||(l=u)}),l}:(o,...a)=>{n[r].forEach(s=>s.call(n,o,...a))})}}function G2(t,e=!0){return(r,n)=>{if(r[t])throw new Error(`The singleton method ${t} already exists`);r[t]=e?n:(i,o,...a)=>(o.enabledElement=i,n.call(r,o,...a))}}function kG(t,e){const{center:r,radius:n}=t,i=t.radius2||n*n;return(e[0]-r[0])*(e[0]-r[0])+(e[1]-r[1])*(e[1]-r[1])+(e[2]-r[2])*(e[2]-r[2])<=i}const{transformWorldToIndex:QI,isEqual:M3}=Vn,VG={[It.Initialize]:t=>{const{points:e,viewport:r,segmentationImageData:n}=t;if(!e)return;const i=At(0,0,0);e.forEach(d=>{di(i,i,d)}),Nr(i,i,1/e.length),t.centerWorld=i,t.centerIJK=QI(n,i);const o=e.map(d=>r.worldToCanvas(d)),[a,s]=i5(o),c=r.canvasToWorld(a),l=r.canvasToWorld(s),f=e.map(d=>QI(n,d)),u=ef(f,n.getDimensions());t.isInObject=FG({topLeftWorld:c,bottomRightWorld:l,center:i}),t.isInObjectBoundsIJK=u}};function FG(t){const{topLeftWorld:e,bottomRightWorld:r,center:n}=t,i=Math.abs(e[0]-r[0])/2,o=Math.abs(e[1]-r[1])/2,a=Math.abs(e[2]-r[2])/2,s=Math.max(i,o,a);if(M3(i,s)&&M3(o,s)&&M3(a,s)){const f={center:n,radius:s,radius2:s*s};return u=>kG(f,u)}const c={center:n,xRadius:i,yRadius:o,zRadius:a},{precalculated:l}=zE(c,{});return l}const UG=new sc("Circle",Sn.regionFill,Sn.setValue,VG,Sn.determineSegmentIndex,Sn.preview,Sn.labelmapStatistics),Axe=new sc("CircleThreshold",Sn.regionFill,Sn.setValue,VG,Sn.determineSegmentIndex,Sn.dynamicThreshold,Sn.threshold,Sn.preview,Sn.islandRemoval,Sn.labelmapStatistics),Xw=UG.strategyFunction,Nxe=Axe.strategyFunction;function kxe(){throw new Error("Not yet implemented")}const{transformWorldToIndex:Vxe}=Vn,Fxe={[It.Initialize]:t=>{const{points:e,viewport:r,segmentationImageData:n}=t;if(!e)return;const i=At(0,0,0);e.forEach(c=>{di(i,i,c)}),Nr(i,i,1/e.length),t.centerWorld=i,t.centerIJK=Vxe(n,i);const{boundsIJK:o,topLeftWorld:a,bottomRightWorld:s}=Iwe(e.slice(0,2),n,r);t.isInObjectBoundsIJK=o,t.isInObject=FG({topLeftWorld:a,bottomRightWorld:s,center:i})}},Yw=new sc("Sphere",Sn.regionFill,Sn.setValue,Fxe,Sn.determineSegmentIndex,Sn.preview,Sn.labelmapStatistics,Sn.ensureSegmentationVolumeFor3DManipulation),BG=Yw.strategyFunction,Uxe=new sc("SphereThreshold",...Yw.compositions,Sn.dynamicThreshold,Sn.threshold,Sn.ensureSegmentationVolumeFor3DManipulation,Sn.ensureImageVolumeFor3DManipulation),Bxe=new sc("SphereThreshold",...Yw.compositions,Sn.dynamicThreshold,Sn.threshold,Sn.islandRemoval,Sn.ensureSegmentationVolumeFor3DManipulation,Sn.ensureImageVolumeFor3DManipulation),Gxe=Uxe.strategyFunction,Wxe=Bxe.strategyFunction,zxe=new sc("EraseSphere",Sn.erase,...Yw.compositions),GG=zxe.strategyFunction,$xe=new sc("EraseCircle",Sn.erase,...UG.compositions),WG=$xe.strategyFunction,{VoxelManager:XS,RLEVoxelMap:jxe}=Vn;function YS(t,e){return $G(t,e)}function zG(t){const{segmentationVoxelManager:e,undoVoxelManager:r,redoVoxelManager:n}=this,i=t===!1?n:r;i.forEach(({value:a,pointIJK:s})=>{e.setAtIJKPoint(s,a)});const o=i.getArrayOfModifiedSlices();bo(this.segmentationId,o)}function $G(t,e){const r=XS.createRLEHistoryVoxelManager(e);return{segmentationId:t,restoreMemo:zG,commitMemo:Hxe,segmentationVoxelManager:e,voxelManager:r,id:kn(),operationType:"labelmap"}}function Hxe(){if(this.redoVoxelManager)return!0;if(!this.voxelManager.modifiedSlices.size)return!1;const{segmentationVoxelManager:t}=this,e=XS.createRLEHistoryVoxelManager(t);jxe.copyMap(e.map,this.voxelManager.map);for(const n of this.voxelManager.modifiedSlices.keys())e.modifiedSlices.add(n);this.undoVoxelManager=e;const r=XS.createRLEVolumeVoxelManager({dimensions:this.segmentationVoxelManager.dimensions});return this.redoVoxelManager=r,e.forEach(({index:n,pointIJK:i,value:o})=>{const a=t.getAtIJKPoint(i);a!==o&&r.setAtIndex(n,a)}),!0}const Kxe=Object.freeze(Object.defineProperty({__proto__:null,createLabelmapMemo:YS,createRleMemo:$G,restoreMemo:zG},Symbol.toStringTag,{value:"Module"})),{isEqual:W2}=Vn,qxe=At(1,0,0),Xxe=At(0,1,0),Yxe=At(0,0,1),e7=[qxe,Xxe,Yxe];function jG(t){const e=Qn(Ge(),t[0],t[1]),r=Qn(Ge(),t[0],t[2]),n=t7(e,e7),i=t7(r,e7);return[...n,...i].every(a=>W2(a,0)||W2(a,90)||W2(a,180)||W2(a,270))}function t7(t,e){return e.map(r=>r4(t,r)*180/Math.PI)}const{transformWorldToIndex:HG}=Vn,KG={[It.Initialize]:t=>{const{points:e,imageVoxelManager:r,viewport:n,segmentationImageData:i,segmentationVoxelManager:o}=t;if(!e)return;const a=At(0,0,0);e.forEach(l=>{di(a,a,l)}),Nr(a,a,1/e.length),t.centerWorld=a,t.centerIJK=HG(i,a);const{boundsIJK:s,pointInShapeFn:c}=Jxe(n,e,i);t.isInObject=c,t.isInObjectBoundsIJK=s}};function Jxe(t,e,r){let n=e.map(w=>HG(r,w));n=n.map(w=>w.map(x=>Math.round(x)));const i=ef(n,r.getDimensions()),a=t instanceof mr||jG(n),s=r.getDirection(),c=r.getSpacing(),{viewPlaneNormal:l}=t.getCamera(),f=hf({direction:s,spacing:c},l),u=eU(e);let[[d,h],[g,p],[v,y]]=u;return d-=f,h+=f,g-=f,p+=f,v-=f,y+=f,{boundsIJK:i,pointInShapeFn:a?()=>!0:w=>{const[x,C,S]=w,T=x>=d&&x<=h,_=C>=g&&C<=p,E=S>=v&&S<=y;return T&&_&&E}}}const Zxe=new sc("Rectangle",Sn.regionFill,Sn.setValue,KG,Sn.determineSegmentIndex,Sn.preview,Sn.labelmapStatistics),Qxe=new sc("RectangleThreshold",Sn.regionFill,Sn.setValue,KG,Sn.determineSegmentIndex,Sn.dynamicThreshold,Sn.threshold,Sn.preview,Sn.islandRemoval,Sn.labelmapStatistics),T8=Zxe.strategyFunction,e3e=Qxe.strategyFunction,t3e=Object.freeze(Object.defineProperty({__proto__:null,fillInsideCircle:Xw,fillInsideRectangle:T8,fillOutsideCircle:kxe,thresholdInsideRectangle:e3e},Symbol.toStringTag,{value:"Module"})),Lp=class Lp extends Ci{constructor(e,r){super(e,r),this.memoMap=new Map,this.acceptedMemoIds=new Map,this.centerSegmentIndexInfo={segmentIndex:null,hasSegmentIndex:!1,hasPreviewIndex:!1,changedIndices:[]}}_historyRedoHandler(e){const{id:r,operationType:n}=e.detail;if(n==="labelmap"){if(this.acceptedMemoIds.has(r)){this._hoverData=null;const i=this.acceptedMemoIds.get(r),o=i==null?void 0:i.element,a=this.getOperationData(o);a.segmentIndex=i==null?void 0:i.segmentIndex,o&&this.applyActiveStrategyCallback(Se(o),a,It.AcceptPreview)}this._previewData.isDrag=!0}}get _previewData(){return Lp.previewData}createMemo(e,r){const n=r.id;if(this.memo&&this.memo.segmentationVoxelManager===r)return this.memo;let i=this.memoMap.get(n);return i?i.redoVoxelManager&&(i=YS(e,r),this.memoMap.set(n,i)):(i=YS(e,r),this.memoMap.set(n,i)),this.memo=i,i}createEditData(e){const r=Se(e),{viewport:n}=r,i=Dd(n.id);if(!i){const l=new CustomEvent(Ze.ERROR_EVENT,{detail:{type:"Segmentation",message:"No active segmentation detected, create a segmentation representation before using the brush tool"},cancelable:!0});return Je.dispatchEvent(l),null}const{segmentationId:o}=i,a=Gd(o),{representationData:s}=zn(o);return this.getEditData({viewport:n,representationData:s,segmentsLocked:a,segmentationId:o})}getEditData({viewport:e,representationData:r,segmentsLocked:n,segmentationId:i}){var o,a,s;if(e instanceof Or){const{volumeId:c}=r[Lt.Labelmap],l=e.getActors();if(e instanceof mr){const g=new CustomEvent(Ze.ERROR_EVENT,{detail:{type:"Segmentation",message:"Cannot perform brush operation on the selected viewport"},cancelable:!0});return Je.dispatchEvent(g),null}const u=l.map(g=>Fe.getVolume(g.referencedId)),d=Fe.getVolume(c),h=((o=u.find(g=>Yt(g.dimensions,d.dimensions)))==null?void 0:o.volumeId)||((a=u[0])==null?void 0:a.volumeId);return{volumeId:c,referencedVolumeId:((s=this.configuration.threshold)==null?void 0:s.volumeId)??h,segmentsLocked:n}}else{const c=mf(e.id,i);return c?{imageId:c,segmentsLocked:n}:void 0}}createHoverData(e,r){const n=Se(e),{viewport:i}=n,o=i.getCamera(),{viewPlaneNormal:a,viewUp:s}=o,c=[i.id],{segmentIndex:l,segmentationId:f,segmentColor:u}=this.getActiveSegmentationData(i)||{};return{brushCursor:{metadata:{viewPlaneNormal:[...a],viewUp:[...s],FrameOfReferenceUID:i.getFrameOfReferenceUID(),referencedImageId:"",toolName:this.getToolName(),segmentColor:u},data:{}},centerCanvas:r,segmentIndex:l,viewport:i,segmentationId:f,segmentColor:u,viewportIdsToRender:c}}getActiveSegmentationData(e){const r=e.id,n=Dd(r);if(!n)return;const{segmentationId:i}=n,o=Ra(i);if(!o)return;const a=zl(r,i,o);return{segmentIndex:o,segmentationId:i,segmentColor:a}}getOperationData(e){var v,y,m,w;const r=this._editData||this.createEditData(e),{segmentIndex:n,segmentationId:i,brushCursor:o}=this._hoverData||this.createHoverData(e),{data:a,metadata:s={}}=o||{},{viewPlaneNormal:c,viewUp:l}=s,f=(y=(v=this.configuration.preview)==null?void 0:v.previewColors)==null?void 0:y[n],{viewport:u}=Se(e),d=zl(u.id,i,n);if(!f&&!d)return;let h=null,g=null;return(m=this.configuration.preview)!=null&&m.enabled&&(h=f||n3e(...d),g=255),{...r,points:(w=a==null?void 0:a.handles)==null?void 0:w.points,segmentIndex:n,viewPlaneNormal:c,previewOnHover:!this._previewData.isDrag,toolGroupId:this.toolGroupId,segmentationId:i,viewUp:l,centerSegmentIndexInfo:this.centerSegmentIndexInfo,activeStrategy:this.configuration.activeStrategy,configuration:this.configuration,previewColor:h,previewSegmentIndex:g,createMemo:this.createMemo.bind(this)}}addPreview(e=this._previewData.element,r){const{_previewData:n}=this,i=r==null?void 0:r.acceptReject;i===!0?this.acceptPreview(e):i===!1&&this.rejectPreview(e);const o=Se(e),a=this.applyActiveStrategyCallback(o,this.getOperationData(e),It.AddPreview);return n.isDrag=!0,a}rejectPreview(e=this._previewData.element){if(!e)return;this.doneEditMemo();const r=Se(e);this.applyActiveStrategyCallback(r,this.getOperationData(e),It.RejectPreview),this._previewData.preview=null,this._previewData.isDrag=!1}acceptPreview(e=this._previewData.element){if(!e)return;const r=this.getOperationData(e);this.memo&&this.memo.id&&this.acceptedMemoIds.set(this.memo.id,{element:e,segmentIndex:r.segmentIndex});const n=Se(e);this.applyActiveStrategyCallback(n,r,It.AcceptPreview),this.doneEditMemo(),this._previewData.preview=null,this._previewData.isDrag=!1}static viewportContoursToLabelmap(e,r){var v;const n=(r==null?void 0:r.removeContours)??!0,i=gm(),o=Em(e,i);if(!(o!=null&&o.length))return;const a=o.filter(y=>{var m,w;return(w=(m=y.data.contour)==null?void 0:m.polyline)==null?void 0:w.length});if(!a.length)return;const c=new Lp({},{configuration:{strategies:{FILL_INSIDE_CIRCLE:Xw},activeStrategy:"FILL_INSIDE_CIRCLE"}}).addPreview(e.element),{memo:l,segmentationId:f}=c,u=l==null?void 0:l.voxelManager,d=u.sourceVoxelManager||u,{dimensions:h}=u,g=e.getDefaultActor().actor.getMapper().getInputData();for(const y of a){const m=[[1/0,-1/0],[1/0,-1/0],[1/0,-1/0]],{polyline:w}=y.data.contour;for(const I of w)g.worldToIndex(I).forEach((O,A)=>{m[A][0]=Math.min(m[A][0],O),m[A][1]=Math.max(m[A][1],O)});m.forEach((I,P)=>{I[0]=Math.round(Math.max(0,I[0])),I[1]=Math.round(Math.min(h[P]-1,I[1]))});const x=Ra(f),C=((v=y.data.handles)==null?void 0:v[0])||w[0],S=g.worldToIndex(C).map(Math.round),T=d.getAtIJKPoint(S)||0;let _=!1,E=!1;for(const I of w){const P=g.worldToIndex(I).map(Math.round),O=d.getAtIJKPoint(P);O===T?_=!0:O>=0&&(E=!0)}const D=_&&E?T:T===0?x:0;for(let I=m[0][0];I<=m[0][1];I++)for(let P=m[1][0];P<=m[1][1];P++)for(let O=m[2][0];O<=m[2][1];O++){const A=g.indexToWorld([I,P,O]);XE(A,w)&&u.setAtIJK(I,P,O,D)}n&&yn(y.annotationUID)}const p=u.getArrayOfModifiedSlices();bo(f,p)}};Lp.previewData={preview:null,element:null,timerStart:0,timer:null,startPoint:[NaN,NaN],isDrag:!1};let Md=Lp;function n3e(t,e,r,n,i=.4){return[Math.round(t+(255-t)*i),Math.round(e+(255-e)*i),Math.round(r+(255-r)*i),n]}class Jw extends Md{constructor(e={},r={supportedInteractionTypes:["Mouse","Touch"],configuration:{strategies:{FILL_INSIDE_CIRCLE:Xw,ERASE_INSIDE_CIRCLE:WG,FILL_INSIDE_SPHERE:BG,ERASE_INSIDE_SPHERE:GG,THRESHOLD_INSIDE_CIRCLE:Nxe,THRESHOLD_INSIDE_SPHERE:Gxe,THRESHOLD_INSIDE_SPHERE_WITH_ISLAND_REMOVAL:Wxe},defaultStrategy:"FILL_INSIDE_CIRCLE",activeStrategy:"FILL_INSIDE_CIRCLE",brushSize:25,useCenterSegmentIndex:!1,preview:{enabled:!1,previewColors:{0:[255,255,255,128]},previewTimeMs:250,previewMoveDistance:8,dragMoveDistance:4,dragTimeMs:500},actions:{[It.AcceptPreview]:{method:It.AcceptPreview,bindings:[{key:"Enter"}]},[It.RejectPreview]:{method:It.RejectPreview,bindings:[{key:"Escape"}]},[It.Interpolate]:{method:It.Interpolate,bindings:[{key:"i"}],configuration:{useBallStructuringElement:!0,noUseDistanceTransform:!0,noUseExtrapolation:!0}},interpolateExtrapolation:{method:It.Interpolate,bindings:[{key:"e"}],configuration:{}}}}}){super(e,r),this.onSetToolPassive=n=>{this.disableCursor()},this.onSetToolEnabled=()=>{this.disableCursor()},this.onSetToolDisabled=n=>{this.disableCursor()},this.preMouseDownCallback=n=>{const i=n.detail,{element:o}=i,a=Se(o);this._editData=this.createEditData(o),this._activateDraw(o),Ft(o),n.preventDefault(),this._previewData.isDrag=!1,this._previewData.timerStart=Date.now();const s=this._hoverData||this.createHoverData(o);Ne(s.viewportIdsToRender);const c=this.getOperationData(o);return this.applyActiveStrategyCallback(a,c,It.OnInteractionStart),!0},this.mouseMoveCallback=n=>{if(this.mode===$n.Active){if(this.updateCursor(n),!this.configuration.preview.enabled)return;const{previewTimeMs:i,previewMoveDistance:o,dragMoveDistance:a}=this.configuration.preview,{currentPoints:s,element:c}=n.detail,{canvas:l}=s,{startPoint:f,timer:u,timerStart:d,isDrag:h}=this._previewData;if(h)return;const g=Ir(l,f),p=Date.now()-d;if((g>o||p>i&&g>a)&&(u&&(window.clearTimeout(u),this._previewData.timer=null),h||this.rejectPreview(c)),!this._previewData.timer){const v=window.setTimeout(this.previewCallback,250);Object.assign(this._previewData,{timerStart:Date.now(),timer:v,startPoint:l,element:c})}}},this.previewCallback=()=>{if(this._previewData.isDrag){this._previewData.timer=null;return}this._previewData.timer=null;const n=this.getOperationData(this._previewData.element),i=Se(this._previewData.element);if(!i)return;const{viewport:o}=i,a=this.configuration.activeStrategy,s=w8({operationData:n,viewport:o,strategy:a});if(!n)return;const c=this.createMemo(n.segmentationId,s.segmentationVoxelManager);this._previewData.preview=this.applyActiveStrategyCallback(Se(this._previewData.element),{...n,...s,memo:c},It.Preview)},this._dragCallback=n=>{const i=n.detail,{element:o,currentPoints:a}=i,s=Se(o);this.updateCursor(n);const{viewportIdsToRender:c}=this._hoverData;Ne(c);const l=Ir(a.canvas,this._previewData.startPoint),{dragTimeMs:f,dragMoveDistance:u}=this.configuration.preview;!this._previewData.isDrag&&Date.now()-this._previewData.timerStart{const i=n.detail,{element:o}=i,a=Se(o),s=this.getOperationData(o);!this._previewData.preview&&!this._previewData.isDrag&&this.applyActiveStrategy(a,s),this.doneEditMemo(),this._deactivateDraw(o),Xt(o),this.updateCursor(n),this._editData=null,this.applyActiveStrategyCallback(a,s,It.OnInteractionEnd),this._previewData.isDrag||this.acceptPreview(o)},this._activateDraw=n=>{n.addEventListener(k.MOUSE_UP,this._endCallback),n.addEventListener(k.MOUSE_DRAG,this._dragCallback),n.addEventListener(k.MOUSE_CLICK,this._endCallback)},this._deactivateDraw=n=>{n.removeEventListener(k.MOUSE_UP,this._endCallback),n.removeEventListener(k.MOUSE_DRAG,this._dragCallback),n.removeEventListener(k.MOUSE_CLICK,this._endCallback)}}disableCursor(){this._hoverData=void 0,this.rejectPreview()}updateCursor(e){const r=e.detail,{element:n}=r,{currentPoints:i}=r,o=i.canvas;this._hoverData=this.createHoverData(n,o),this._calculateCursor(n,o),this._hoverData&&Ne(this._hoverData.viewportIdsToRender)}_calculateCursor(e,r){const n=Se(e),{viewport:i}=n,{canvasToWorld:o}=i,a=i.getCamera(),{brushSize:s}=this.configuration,c=At(a.viewUp[0],a.viewUp[1],a.viewUp[2]),l=At(a.viewPlaneNormal[0],a.viewPlaneNormal[1],a.viewPlaneNormal[2]),f=Ge();Wn(f,c,l);const u=o([r[0],r[1]]),d=Ge(),h=Ge(),g=Ge(),p=Ge();for(let x=0;x<=2;x++)d[x]=u[x]-c[x]*s,h[x]=u[x]+c[x]*s,g[x]=u[x]-f[x]*s,p[x]=u[x]+f[x]*s;if(!this._hoverData)return;const{brushCursor:v}=this._hoverData,{data:y}=v;y.handles===void 0&&(y.handles={}),y.handles.points=[d,h,g,p];const m=this.configuration.activeStrategy,w=this.configuration.strategies[m];typeof(w==null?void 0:w.computeInnerCircleRadius)=="function"&&w.computeInnerCircleRadius({configuration:this.configuration,viewport:i}),y.invalidated=!1}getStatistics(e,r){if(!e)return;const n=Se(e);return this.applyActiveStrategyCallback(n,this.getOperationData(e),It.GetStatistics,r)}rejectPreview(e=this._previewData.element){if(!e)return;this.doneEditMemo();const r=Se(e);r&&(this.applyActiveStrategyCallback(r,this.getOperationData(e),It.RejectPreview),this._previewData.preview=null,this._previewData.isDrag=!1)}acceptPreview(e=this._previewData.element){e&&super.acceptPreview(e)}interpolate(e,r){if(!e)return;const n=Se(e);this._previewData.preview=this.applyActiveStrategyCallback(n,this.getOperationData(e),It.Interpolate,r.configuration),this._previewData.isDrag=!0}invalidateBrushCursor(){if(this._hoverData===void 0)return;const{data:e}=this._hoverData.brushCursor,{viewport:r}=this._hoverData;e.invalidated=!0;const{segmentColor:n}=this.getActiveSegmentationData(r)||{};this._hoverData.brushCursor.metadata.segmentColor=n}renderAnnotation(e,r){var m,w;if(!this._hoverData)return;const{viewport:n}=e;if(!this._hoverData.viewportIdsToRender.includes(n.id))return;const o=this._hoverData.brushCursor;if(o.data.invalidated===!0){const{centerCanvas:x}=this._hoverData,{element:C}=n;this._calculateCursor(C,x)}const a=o.metadata;if(!a)return;const s=a.brushCursorUID,c=o.data,{points:l}=c.handles,f=l.map(x=>n.worldToCanvas(x)),u=f[0],d=f[1],h=[Math.floor((u[0]+d[0])/2),Math.floor((u[1]+d[1])/2)],g=Math.abs(u[1]-Math.floor((u[1]+d[1])/2)),p=`rgb(${((m=a.segmentColor)==null?void 0:m.slice(0,3))||[0,0,0]})`;if(!n.getRenderingEngine()){console.warn("Rendering Engine has been destroyed");return}ua(r,s,"0",h,g,{color:p,lineDash:this.centerSegmentIndexInfo.segmentIndex===0?[1,2]:null});const{dynamicRadiusInCanvas:y}=((w=this.configuration)==null?void 0:w.threshold)||{dynamicRadiusInCanvas:0};y&&ua(r,s,"1",h,y,{color:p})}}Jw.toolName="Brush";function rg(t,e){const r=fi(t);if(r===void 0)return;const n=r._toolInstances;return Object.keys(n).length?e&&n[e]?[n[e]]:Object.values(n).filter(o=>o instanceof Jw):void 0}function r3e(t,e,r){const n=fi(t);if(n===void 0)return;rg(t,r).forEach(l=>{l.configuration.brushSize=e,l.invalidateBrushCursor()});const o=n.getViewportsInfo(),a=Object.keys(o).map(l=>o[l]);if(!a.length)return;const{renderingEngineId:s}=a[0],c=n.getViewportIds();ni(s),Ne(c)}function i3e(t,e){const r=fi(t);if(r===void 0)return;const n=r._toolInstances;if(!Object.keys(n).length)return;const o=rg(t,e)[0];if(o)return o.configuration.brushSize}function o3e(t,e){const r=fi(t);if(r===void 0||(rg(t).forEach(a=>{a.configuration.activeStrategy.toLowerCase().includes("threshold")&&(a.configuration={...a.configuration,threshold:{...a.configuration.threshold,...e}})}),!r.getViewportsInfo().length))return;const o=r.getViewportIds();Ne(o)}function a3e(t){const e=fi(t);if(e===void 0)return;const r=e._toolInstances;if(!Object.keys(r).length)return;const i=rg(t)[0];if(i)return i.configuration.threshold.range}const Ap=class Ap{static statsInit(e){const{storePointData:r,indices:n,mode:i}=e;this.mode=i,this.indices=n,this.calculators.clear(),this.mode==="individual"?n.forEach(o=>{this.calculators.set(o,new ZI({storePointData:r}))}):this.calculators.set(n,new ZI({storePointData:r}))}static statsCallback(e){const{segmentIndex:r,...n}=e;if(!r)throw new Error("Segment index is required for stats calculation");const i=this.mode==="individual"?this.calculators.get(r):this.calculators.get(this.indices);if(!i)throw new Error(`No calculator found for segment ${r}`);i.statsCallback(n)}static getStatistics(e){if(this.mode==="individual"){const n={};return this.calculators.forEach((i,o)=>{n[o]=i.getStatistics(e)}),n}return this.calculators.get(this.indices).getStatistics(e)}};Ap.calculators=new Map,Ap.indices=[],Ap.mode="collective";let JS=Ap;function s3e(t,e,r,n,i){if(!i)throw new Error("Segmentation ID is required to be passed inside thresholdSegmentationByRange");const{baseVolumeIdx:o,volumeInfoList:a}=tU(t,r),{voxelManager:s}=a[o],c=s,l=t.voxelManager.getScalarDataLength(),f=t.voxelManager;return a.forEach(u=>{const{volumeSize:d}=u;d===l?l3e(f,c,e,u):c3e(f,c,e,u,a,o,n)}),bo(i),t}function c3e(t,e,r,n,i,o,a){const{imageData:s,lower:c,upper:l,dimensions:f}=n;let u,d,h;const g=t.getScalarDataLength();for(let p=0;p{u=u+1,w>=h.lower&&w<=h.upper&&(d=d+1)};u=0,d=0,h={lower:c,upper:l};let m=!1;t.forEach(y,{imageData:s,boundsIJK:v}),m=a===0?d>0:d===u,t.setAtIndex(p,m?r:0)}return{total:u,range:h,overlaps:d}}function l3e(t,e,r,n){const{lower:i,upper:o}=n,a=t.getScalarDataLength();for(let s=0;s=i&&c<=o?r:0)}}function n7(t,e,r){const n=r.toIJK(t),i=r.toIJK(e),o=Ge(),{testIJK:a}=r,s=Nn(Ge(),n,i),c=Math.round(Math.max(...s.map(Math.abs)));if(c<2)return!0;const l=Nr(Ge(),s,1/c);for(let f=1;f{const l=di(Ge(),s,c).map(v=>v/2),f=e.worldToIndex(l).map(Math.round),[u,d,h]=f,g=u+d*o+h*a,p=r.getAtIndex(g);return p===n||(i==null?void 0:i.has(p))},toIJK:s=>e.worldToIndex(s),testIJK:s=>{const[c,l,f]=s,u=Math.round(c)+Math.round(l)*o+Math.round(f)*a,d=r.getAtIndex(u);return d===n||(i==null?void 0:i.has(d))}}}function f3e(t,e,r){const n=Fe.getVolume(t);if(!n){console.warn(`No volume found for ${t}`);return}return u3e({dimensions:n.dimensions,imageData:n.imageData,voxelManager:n.voxelManager,segmentIndex:e,containedSegmentIndices:r})}const Rg=.01;function d3e(t,e,r){const{sliceContours:n}=t,{segmentIndex:i,containedSegmentIndices:o}=r;let a;const s=f3e(e,i,o);for(const c of n){const l=h3e(c,s,a);l&&(a=l)}return a&&Object.assign(a,r),a}function h3e(t,e,r={maxMajor:0,maxMinor:0}){const{points:n}=t.polyData,{maxMinor:i,maxMajor:o}=r;let a=o*o,s=i*i,c;for(let v=0;vRg||e.testCenter(m,w)&&n7(m,w,e)&&(s=x,d=[v,y])}if(!d)return;s=Math.sqrt(s);const h=n[d[0]],g=n[d[1]];return{majorAxis:[l,f],minorAxis:[h,g],maxMajor:a,maxMinor:s,...t}}async function qG(t){const e=await DG({segmentations:t});if(!(e!=null&&e.length)||!e[0].sliceContours.length)return;const{segments:r=[null,{label:"Unspecified",color:null,containedSegmentIndices:null}]}=t,n=ng(t.segmentationId);if(!n)return;const i=r.findIndex(o=>!!o);if(i!==-1)return r[i].segmentIndex=i,d3e(e[0],n.volumeId,r[i])}function XG(t,e){const{majorAxis:r,minorAxis:n,label:i="",sliceIndex:o}=t,[a,s]=r,[c,l]=n,f=[a,s,c,l];return{highlighted:!0,invalidated:!0,metadata:{toolName:"Bidirectional",...e.getViewReference({sliceIndex:o})},data:{handles:{points:f,textBox:{hasMoved:!1,worldPosition:[0,0,0],worldBoundingBox:{topLeft:[0,0,0],topRight:[0,0,0],bottomLeft:[0,0,0],bottomRight:[0,0,0]}},activeHandleIndex:null},label:i,cachedStats:{}},isLocked:!1,isVisible:!0}}const{transformWorldToIndex:z2}=Vn,P0=class P0 extends pr{constructor(e={},r={supportedInteractionTypes:["Mouse","Touch"],configuration:{preventHandleOutsideImage:!1,getTextLines:g3e}}){super(e,r),this.isPointNearTool=(n,i,o,a)=>{const s=Se(n),{viewport:c}=s,{data:l}=i,{points:f}=l.handles;let u=c.worldToCanvas(f[0]),d=c.worldToCanvas(f[1]),h={start:{x:u[0],y:u[1]},end:{x:d[0],y:d[1]}},g=Di([h.start.x,h.start.y],[h.end.x,h.end.y],[o[0],o[1]]);return g<=a||(u=c.worldToCanvas(f[2]),d=c.worldToCanvas(f[3]),h={start:{x:u[0],y:u[1]},end:{x:d[0],y:d[1]}},g=Di([h.start.x,h.start.y],[h.end.x,h.end.y],[o[0],o[1]]),g<=a)},this.toolSelectedCallback=(n,i)=>{const o=n.detail,{element:a}=o;i.highlighted=!0;const s=Ot(a,this.getToolName());this.editData={annotation:i,viewportIdsToRender:s,movingTextBox:!1},this._activateModify(a);const c=Se(a),{renderingEngine:l}=c;Ne(s),Ft(a),n.preventDefault()},this.handleSelectedCallback=(n,i,o)=>{const a=n.detail,{element:s}=a,c=i.data;i.highlighted=!0;let l=!1,f;o.worldPosition?l=!0:f=c.handles.points.findIndex(g=>g===o);const u=Ot(s,this.getToolName());Ft(s),this.editData={annotation:i,viewportIdsToRender:u,handleIndex:f,movingTextBox:l},this._activateModify(s);const d=Se(s),{renderingEngine:h}=d;Ne(u),n.preventDefault()},this._endCallback=n=>{const i=n.detail,{element:o}=i,{annotation:a,viewportIdsToRender:s,newAnnotation:c,hasMoved:l}=this.editData,{data:f}=a;if(c&&!l)return;this.doneEditMemo(),f.handles.activeHandleIndex=null,this._deactivateModify(o),this._deactivateDraw(o),Xt(o);const{renderingEngine:u}=Se(o);if(this.editData.handleIndex!==void 0){const{points:d}=f.handles,h=no(d[0],d[1]);if(no(d[2],d[3])>h){const p=[[...d[2]],[...d[3]]],v=[...d[0]],y=[...d[1]],m=nn();vs(m,p[1][0]-p[0][0],p[1][1]-p[1][0]);const w=nn();vs(w,-m[1],m[0]);const x=nn();vs(x,y[0]-v[0],y[1]-v[0]);let C;i4(x,w)>0?C=[v,y]:C=[y,v],f.handles.points=[p[0],p[1],C[0],C[1]]}}this.isHandleOutsideImage&&this.configuration.preventHandleOutsideImage&&yn(a.annotationUID),Ne(s),c&&jn(a),this.editData=null,this.isDrawing=!1},this._dragDrawCallback=n=>{this.isDrawing=!0;const i=n.detail,{currentPoints:o,element:a}=i,s=Se(a),{viewport:c}=s,{worldToCanvas:l}=c,{annotation:f,viewportIdsToRender:u,handleIndex:d,newAnnotation:h}=this.editData;this.createMemo(a,f,{newAnnotation:h});const{data:g}=f,p=o.world;g.handles.points[d]=[...p];const v=g.handles.points.map(l),y={longLineSegment:{start:{x:v[0][0],y:v[0][1]},end:{x:v[1][0],y:v[1][1]}},shortLineSegment:{start:{x:v[2][0],y:v[2][1]},end:{x:v[3][0],y:v[3][1]}}},w=Ir(v[0],v[1])/3,x=y.longLineSegment.start.x-y.longLineSegment.end.x,C=y.longLineSegment.start.y-y.longLineSegment.end.y,S=Math.sqrt(x*x+C*C),T=x/S,_=C/S,E=(y.longLineSegment.start.x+y.longLineSegment.end.x)/2,b=(y.longLineSegment.start.y+y.longLineSegment.end.y)/2,D=E+w*_,I=b-w*T,P=E-w*_,O=b+w*T;g.handles.points[2]=c.canvasToWorld([D,I]),g.handles.points[3]=c.canvasToWorld([P,O]),f.invalidated=!0,Ne(u),cn(f,a,Zt.HandlesUpdated),this.editData.hasMoved=!0},this._dragModifyCallback=n=>{this.isDrawing=!0;const i=n.detail,{element:o}=i,{annotation:a,viewportIdsToRender:s,handleIndex:c,movingTextBox:l,newAnnotation:f}=this.editData;this.createMemo(o,a,{newAnnotation:f});const{data:u}=a;if(l){const{deltaPoints:d}=i,h=d.world,{textBox:g}=u.handles,{worldPosition:p}=g;p[0]+=h[0],p[1]+=h[1],p[2]+=h[2],g.hasMoved=!0}else if(c===void 0){const{deltaPoints:d}=i,h=d.world;u.handles.points.forEach(p=>{p[0]+=h[0],p[1]+=h[1],p[2]+=h[2]}),a.invalidated=!0}else this._dragModifyHandle(n),a.invalidated=!0;Ne(s),a.invalidated&&cn(a,o,Zt.HandlesUpdated)},this._dragModifyHandle=n=>{const i=n.detail,{currentPoints:o,element:a}=i,s=Se(a),{viewport:c}=s,{annotation:l,handleIndex:f}=this.editData,{data:u}=l,d=o.world,h=[c.worldToCanvas(u.handles.points[0]),c.worldToCanvas(u.handles.points[1]),c.worldToCanvas(u.handles.points[2]),c.worldToCanvas(u.handles.points[3])],g={start:{x:h[0][0],y:h[0][1]},end:{x:h[1][0],y:h[1][1]}},p={start:{x:h[2][0],y:h[2][1]},end:{x:h[3][0],y:h[3][1]}},v=[...d],y=c.worldToCanvas(v);if(f===0||f===1){const w=h[f===0?1:0],x=vs(nn(),y[0]-w[0],y[1]-w[1]),C=vs(nn(),h[f][0]-w[0],h[f][1]-w[1]);Tl(x,x),Tl(C,C);const S={start:{x:w[0],y:w[1]},end:{x:y[0],y:y[1]}};if(this._movingLongAxisWouldPutItThroughShortAxis(S,p))return;const T=w,_=this._getSignedAngle(C,x);let E=h[2][0],b=h[2][1],D=h[3][0],I=h[3][1];E-=T[0],b-=T[1],D-=T[0],I-=T[1];const P=E*Math.cos(_)-b*Math.sin(_),O=E*Math.sin(_)+b*Math.cos(_),A=D*Math.cos(_)-I*Math.sin(_),V=D*Math.sin(_)+I*Math.cos(_);E=P+T[0],b=O+T[1],D=A+T[0],I=V+T[1];const G=c.canvasToWorld([E,b]),R=c.canvasToWorld([D,I]);u.handles.points[f]=v,u.handles.points[2]=G,u.handles.points[3]=R}else{const m=f===2?3:2,w={longLineSegment:{start:g.start,end:g.end},shortLineSegment:{start:p.start,end:p.end}},x=ai(nn(),[w.longLineSegment.end.x,w.longLineSegment.end.y],[w.longLineSegment.start.x,w.longLineSegment.start.y]),C=Tl(nn(),x),S=ai(nn(),[y[0],y[1]],[h[f][0],h[f][1]]),T=wy(S),_=this._getSignedAngle(C,S),E=Math.cos(_)*T,b=UY(nn(),[h[m][0],h[m][1]],C,E);if(this._movingLongAxisWouldPutItThroughShortAxis({start:{x:y[0],y:y[1]},end:{x:b[0],y:b[1]}},{start:{x:w.longLineSegment.start.x,y:w.longLineSegment.start.y},end:{x:w.longLineSegment.end.x,y:w.longLineSegment.end.y}})||!a5([y[0],y[1]],[b[0],b[1]],[g.start.x,g.start.y],[g.end.x,g.end.y]))return;u.handles.points[m]=c.canvasToWorld(b),u.handles.points[f]=v}},this.cancel=n=>{if(this.isDrawing){this.isDrawing=!1,this._deactivateDraw(n),this._deactivateModify(n),Xt(n);const{annotation:i,viewportIdsToRender:o,newAnnotation:a}=this.editData,{data:s}=i;return i.highlighted=!1,s.handles.activeHandleIndex=null,Ne(o),a&&jn(i),this.editData=null,i.annotationUID}},this._activateDraw=n=>{He.isInteractingWithTool=!0,n.addEventListener(k.MOUSE_UP,this._endCallback),n.addEventListener(k.MOUSE_DRAG,this._dragDrawCallback),n.addEventListener(k.MOUSE_MOVE,this._dragDrawCallback),n.addEventListener(k.MOUSE_CLICK,this._endCallback),n.addEventListener(k.TOUCH_TAP,this._endCallback),n.addEventListener(k.TOUCH_END,this._endCallback),n.addEventListener(k.TOUCH_DRAG,this._dragDrawCallback)},this._deactivateDraw=n=>{He.isInteractingWithTool=!1,n.removeEventListener(k.MOUSE_UP,this._endCallback),n.removeEventListener(k.MOUSE_DRAG,this._dragDrawCallback),n.removeEventListener(k.MOUSE_MOVE,this._dragDrawCallback),n.removeEventListener(k.MOUSE_CLICK,this._endCallback),n.removeEventListener(k.TOUCH_TAP,this._endCallback),n.removeEventListener(k.TOUCH_END,this._endCallback),n.removeEventListener(k.TOUCH_DRAG,this._dragDrawCallback)},this._activateModify=n=>{He.isInteractingWithTool=!0,n.addEventListener(k.MOUSE_UP,this._endCallback),n.addEventListener(k.MOUSE_DRAG,this._dragModifyCallback),n.addEventListener(k.MOUSE_CLICK,this._endCallback),n.addEventListener(k.TOUCH_END,this._endCallback),n.addEventListener(k.TOUCH_DRAG,this._dragModifyCallback),n.addEventListener(k.TOUCH_TAP,this._endCallback)},this._deactivateModify=n=>{He.isInteractingWithTool=!1,n.removeEventListener(k.MOUSE_UP,this._endCallback),n.removeEventListener(k.MOUSE_DRAG,this._dragModifyCallback),n.removeEventListener(k.MOUSE_CLICK,this._endCallback),n.removeEventListener(k.TOUCH_END,this._endCallback),n.removeEventListener(k.TOUCH_DRAG,this._dragModifyCallback),n.removeEventListener(k.TOUCH_TAP,this._endCallback)},this.renderAnnotation=(n,i)=>{let o=!0;const{viewport:a}=n,{element:s}=a;let c=pn(this.getToolName(),s);if(!(c!=null&&c.length)||(c=this.filterInteractableAnnotationsForElement(s,c),!(c!=null&&c.length)))return o;const l=this.getTargetId(a),f=a.getRenderingEngine(),u={toolGroupId:this.toolGroupId,toolName:this.getToolName(),viewportId:n.viewport.id};for(let d=0;da.worldToCanvas(X));u.annotationUID=g;const{color:w,lineWidth:x,lineDash:C,shadow:S}=this.getAnnotationStyle({annotation:h,styleSpecifier:u});if(!p.cachedStats[l]||p.cachedStats[l].unit==null?(p.cachedStats[l]={length:null,width:null,unit:null},this._calculateCachedStats(h,f,n)):h.invalidated&&this._throttledCalculateCachedStats(h,f,n),!a.getRenderingEngine())return console.warn("Rendering Engine has been destroyed"),o;let T;if(!ii(g))continue;!mi(g)&&!this.editData&&y!==null&&(T=[m[y]]),T&&ur(i,g,"0",T,{color:w});const _=`${g}-line-1`,E=`${g}-line-2`;Tn(i,g,"0",m[0],m[1],{color:w,lineDash:C,lineWidth:x,shadow:S},_),Tn(i,g,"1",m[2],m[3],{color:w,lineDash:C,lineWidth:x,shadow:S},E),o=!0;const I=this.getLinkedTextBoxStyle(u,h);if(!I.visibility){p.handles.textBox={hasMoved:!1,worldPosition:[0,0,0],worldBoundingBox:{topLeft:[0,0,0],topRight:[0,0,0],bottomLeft:[0,0,0],bottomRight:[0,0,0]}};continue}const P=this.configuration.getTextLines(p,l);if(!P||P.length===0)continue;let O;p.handles.textBox.hasMoved||(O=Aa(m),p.handles.textBox.worldPosition=a.canvasToWorld(O));const A=a.worldToCanvas(p.handles.textBox.worldPosition),G=uo(i,g,"1",P,A,m,{},I),{x:R,y:N,width:F,height:j}=G;p.handles.textBox.worldBoundingBox={topLeft:a.canvasToWorld([R,N]),topRight:a.canvasToWorld([R+F,N]),bottomLeft:a.canvasToWorld([R,N+j]),bottomRight:a.canvasToWorld([R+F,N+j])}}return o},this._movingLongAxisWouldPutItThroughShortAxis=(n,i)=>{const o=nn();vs(o,i.end.x-i.start.x,i.end.y-i.start.y),Tl(o,o);const a={start:{x:i.start.x-o[0]*10,y:i.start.y-o[1]*10},end:{x:i.end.x+o[0]*10,y:i.end.y+o[1]*10}};return!a5([a.start.x,a.start.y],[a.end.x,a.end.y],[n.start.x,n.start.y],[n.end.x,n.end.y])},this._calculateCachedStats=(n,i,o)=>{const{data:a}=n,{element:s}=o.viewport,c=a.handles.points[0],l=a.handles.points[1],f=a.handles.points[2],u=a.handles.points[3],{cachedStats:d}=a,h=Object.keys(d);for(let p=0;pA?O:A,G=O>A?A:O,R=O>A?D:P,N=O>A?P:D;this._isInsideVolume(x,C,S,T,w)?this.isHandleOutsideImage=!1:this.isHandleOutsideImage=!0,d[v]={length:V,width:G,unit:R,widthUnit:N}}const g=n.invalidated;return n.invalidated=!1,g&&cn(n,s,Zt.StatsUpdated),d},this._isInsideVolume=(n,i,o,a,s)=>xr(n,s)&&xr(i,s)&&xr(o,s)&&xr(a,s),this._getSignedAngle=(n,i)=>Math.atan2(n[0]*i[1]-n[1]*i[0],n[0]*i[0]+n[1]*i[1]),this._throttledCalculateCachedStats=qo(this._calculateCachedStats,100,{trailing:!0})}addNewAnnotation(e){const r=e.detail,{currentPoints:n,element:i}=r,o=n.world,a=Se(i),{viewport:s,renderingEngine:c}=a;this.isDrawing=!0;const l=s.getCamera(),{viewPlaneNormal:f,viewUp:u}=l,d=this.getReferencedImageId(s,o,f,u),h=s.getFrameOfReferenceUID(),g={highlighted:!0,invalidated:!0,metadata:{toolName:this.getToolName(),viewPlaneNormal:[...f],viewUp:[...u],FrameOfReferenceUID:h,referencedImageId:d,...s.getViewReference({points:[o]})},data:{handles:{points:[[...o],[...o],[...o],[...o]],textBox:{hasMoved:!1,worldPosition:[0,0,0],worldBoundingBox:{topLeft:[0,0,0],topRight:[0,0,0],bottomLeft:[0,0,0],bottomRight:[0,0,0]}},activeHandleIndex:null},label:"",cachedStats:{}}};ln(g,i);const p=Ot(i,this.getToolName());return this.editData={annotation:g,viewportIdsToRender:p,handleIndex:1,movingTextBox:!1,newAnnotation:!0,hasMoved:!1},this._activateDraw(i),Ft(i),e.preventDefault(),Ne(p),g}_calculateLength(e,r){const n=e[0]-r[0],i=e[1]-r[1],o=e[2]-r[2];return Math.sqrt(n*n+i*i+o*o)}};P0.toolName="Bidirectional",P0.hydrate=(e,r,n)=>{const i=qn(e);if(!i)return;const{FrameOfReferenceUID:o,referencedImageId:a,viewPlaneNormal:s,instance:c,viewport:l}=P0.hydrateBase(P0,i,r[0],n),[f,u]=r,[d,h]=f,[g,p]=u,v=[d,h,g,p],{toolInstance:y,...m}=n||{},w={annotationUID:(n==null?void 0:n.annotationUID)||kn(),data:{handles:{points:v,activeHandleIndex:null,textBox:{hasMoved:!1,worldPosition:[0,0,0],worldBoundingBox:{topLeft:[0,0,0],topRight:[0,0,0],bottomLeft:[0,0,0],bottomRight:[0,0,0]}}},cachedStats:{}},highlighted:!1,autoGenerated:!1,invalidated:!1,isLocked:!1,isVisible:!0,metadata:{toolName:c.getToolName(),viewPlaneNormal:s,FrameOfReferenceUID:o,referencedImageId:a,...m}};return ln(w,l.element),Ne([l.id]),w};let L1=P0;function g3e(t,e){const{cachedStats:r,label:n}=t,{length:i,width:o,unit:a}=r[e],s=[];return n&&s.push(n),i===void 0||s.push(`L: ${dn(i)} ${a||a}`,`W: ${dn(o)} ${a}`),s}async function p3e(t,e){console.warn("Deprecation Alert: There is a new getSegmentLargestBidirectional function that handles volume, stack and individual segment cases properly. This function is deprecated and will be removed in a future version.");const{data:r}=e,n=Se(t),i=(r.getSegment||m3e)(n,r);if(!i)return;const o=n.viewport.getFrameOfReferenceUID(),a=Kw(),{segmentIndex:s,segmentationId:c}=i,l=Zr.getAnnotations(this.toolName||L1.toolName,o);let f=!1;const u=l.filter(h=>{const g=h.data.segment;return g?(g.segmentationId===c&&g.segmentIndex===s&&(f=!0,h.data.segment=g),!0):!1});f||u.push({data:{segment:i}});let d;if(u.forEach(async h=>{const g=[],p=h.data.segment,{segmentIndex:v,segmentationId:y}=p;g[v]=p,Zr.removeAnnotation(h.annotationUID);const m=await qG({...a.find(C=>C.segmentationId===y),segments:g});if(!m)return;const w=XG(m,n.viewport);w.annotationUID=h.annotationUID,w.data.segment=p;const x=Zr.addAnnotation(w,o);if(p.segmentIndex===i.segmentIndex&&p.segmentationId===i.segmentationId){d=m;const{style:C}=i;C&&_E.setAnnotationStyles(x,C)}}),d){const{sliceIndex:h}=d,g=n.viewport.getImageIds();hs(t,{imageIndex:g.length-1-h}),n.viewport.render()}else console.warn("No bidirectional found");return d}function m3e(t,e){var a;const r=Kw();if(!r.length)return;const n=e.segmentationId||r[0].segmentationId,i=e.segmentIndex??Ra(n);if(!i)return;const o=(a=e.segmentData)==null?void 0:a.get(i);return{label:`Segment ${i}`,segmentIndex:i,segmentationId:n,...o}}function YG(t){const e=fi(t);if(e===void 0)return;rg(t).forEach(a=>{a.invalidateBrushCursor()});const n=e.getViewportsInfo();if(!Object.keys(n).map(a=>n[a]).length)return;const o=e.getViewportIds();Ne(o)}function _8(t,e,r={}){const n=zn(t),i=n.representationData,o=(r==null?void 0:r.representationType)??Object.keys(i)[0];if(!o)throw new Error(`Segmentation ${t} does not have any representations`);switch(o){case Lt.Labelmap:return v3e(n,e,r);case Lt.Contour:return y3e(n,e,r);default:return}}function v3e(t,e,{viewport:r}){const n=t.representationData.Labelmap;if(r instanceof Or){const{volumeId:h}=n,g=Fe.getVolume(h);return g?g.imageData.getScalarValueFromWorld(e):void 0}const i=Wl(r.id,t.segmentationId);if(i.length>1){console.warn("Segment selection for labelmaps with multiple imageIds in stack viewports is not supported yet.");return}const o=i[0];if(!Fe.getImage(o))return;const s=Pw(r.id,t.segmentationId),c=s==null?void 0:s.actor.getMapper().getInputData(),l=ei(c,e),f=c.getDimensions();return(c.voxelManager||oc.createScalarVolumeVoxelManager({dimensions:f,scalarData:c.getPointData().getScalars().getData()})).getAtIJKPoint(l)}function y3e(t,e,{viewport:r}){const n=t.representationData.Contour,i=Array.from(n.annotationUIDsMap.keys()),{viewPlaneNormal:o}=r.getCamera();for(const a of i){const s=n.annotationUIDsMap.get(a);if(s)for(const c of s){const l=ri(c);if(!l)continue;const{polyline:f}=l.data.contour;if(Yt(o,l.metadata.viewPlaneNormal)&&XE(e,f))return Number(a)}}}function JG(t,e,{viewport:r,searchRadius:n}){const o=zn(t).representationData.Labelmap;if(r instanceof Or){const{volumeId:p}=o,v=Fe.getVolume(p);if(!v)return;const y=v.voxelManager,m=v.imageData,w=ei(m,e),x=y.getAtIJK(w[0],w[1],w[2]),C=r.worldToCanvas(e);return x3e(C,x,r,m,n)?x:void 0}const a=mf(r.id,t);if(!Fe.getImage(a))return;const c=Pw(r.id,t),l=c==null?void 0:c.actor.getMapper().getInputData(),f=ei(l,e),u=l.getDimensions(),d=l.voxelManager||oc.createScalarVolumeVoxelManager({dimensions:u,scalarData:l.getPointData().getScalars().getData()}),h=d.getAtIJKPoint(f);return w3e(f,u,d,h)?h:void 0}function ZG(t,e,r=1){const n=Array.from({length:2*r+1},(i,o)=>o-r);for(const i of n)for(const o of n)for(const a of n){if(i===0&&o===0&&a===0)continue;const s=t(i,o,a);if(s!==void 0&&e!==s)return!0}return!1}function w3e(t,e,r,n,i){return ZG((a,s,c)=>{const l=[t[0]+a,t[1]+s,t[2]+c];return r.getAtIJK(l[0],l[1],l[2])},n,i)}function x3e(t,e,r,n,i){return ZG((a,s)=>{const c=[t[0]+a,t[1]+s],l=r.canvasToWorld(c),f=n.get("voxelManager").voxelManager,u=ei(n,l);return f.getAtIJK(u[0],u[1],u[2])},e,i)}function QG(t){const e=zn(t),{annotationUIDsMap:r}=e.representationData.Contour;for(const[n,i]of r.entries())if(Array.from(i).find(a=>ri(a).highlighted))return n}const C3e=` const MAX_STRENGTH = 65535f; // Workgroup size - X*Y*Z must be multiple of 32 for better performance @@ -4284,4 +4284,4 @@ throwBindingError('function `+z+" called with ' + arguments.length + ' arguments `,Mt.push(gn+"_dtor"),mn.push(H[De].destructorFunction))}Pe&&(mt+=`var ret = retType.fromWireType(rv); return ret; `),mt+=`} -`,Mt.push(mt);var ir=ze(Function,Mt).apply(null,mn);return ir}function $e(z,H,L,U,Y,ue){_(H>0);var me=ke(H,L);Y=Ee(U,Y),$i([],[z],function(we){we=we[0];var De="constructor "+we.name;if(we.registeredClass.constructor_body===void 0&&(we.registeredClass.constructor_body=[]),we.registeredClass.constructor_body[H-1]!==void 0)throw new Io("Cannot register multiple constructors with identical number of parameters ("+(H-1)+") for class '"+we.name+"'! Overload resolution is currently only performed using the parameter count, not actual type info!");return we.registeredClass.constructor_body[H-1]=()=>{ge("Cannot construct "+we.name+" due to unbound types",me)},$i([],me,function(Pe){return Pe.splice(1,0,null),we.registeredClass.constructor_body[H-1]=Ve(De,Pe,null,Y,ue),[]}),[]})}function St(z,H,L,U,Y,ue,me,we){var De=ke(L,U);H=Sr(H),ue=Ee(Y,ue),$i([],[z],function(Pe){Pe=Pe[0];var Be=Pe.name+"."+H;H.startsWith("@@")&&(H=Symbol[H.substring(2)]),we&&Pe.registeredClass.pureVirtualFunctions.push(H);function rt(){ge("Cannot call "+Be+" due to unbound types",De)}var mt=Pe.registeredClass.instancePrototype,Bt=mt[H];return Bt===void 0||Bt.overloadTable===void 0&&Bt.className!==Pe.name&&Bt.argCount===L-2?(rt.argCount=L-2,rt.className=Pe.name,mt[H]=rt):(Li(mt,H,Be),mt[H].overloadTable[L-2]=rt),$i([],De,function(Mt){var mn=Ve(Be,Mt,Pe,ue,me);return mt[H].overloadTable===void 0?(mn.argCount=L-2,mt[H]=mn):mt[H].overloadTable[L-2]=mn,[]}),[]})}var wt=[],Tt=[{},{value:void 0},{value:null},{value:!0},{value:!1}];function jt(z){z>4&&--Tt[z].refcount===0&&(Tt[z]=void 0,wt.push(z))}function Dt(){for(var z=0,H=5;H(z||_n("Cannot use deleted val. handle = "+z),Tt[z].value),toHandle:z=>{switch(z){case void 0:return 1;case null:return 2;case!0:return 3;case!1:return 4;default:{var H=wt.length?wt.pop():Tt.length;return Tt[H]={refcount:1,value:z},H}}}};function dr(z,H){H=Sr(H),Xr(z,{name:H,fromWireType:function(L){var U=Gn.toValue(L);return jt(L),U},toWireType:function(L,U){return Gn.toHandle(U)},argPackAdvance:8,readValueFromPointer:qr,destructorFunction:null})}function Pr(z){if(z===null)return"null";var H=typeof z;return H==="object"||H==="array"||H==="function"?z.toString():""+z}function Ki(z,H){switch(H){case 2:return function(L){return this.fromWireType(X[L>>2])};case 3:return function(L){return this.fromWireType(te[L>>3])};default:throw new TypeError("Unknown float type: "+z)}}function Po(z,H,L){var U=Xo(L);H=Sr(H),Xr(z,{name:H,fromWireType:function(Y){return Y},toWireType:function(Y,ue){return ue},argPackAdvance:8,readValueFromPointer:Ki(H,U),destructorFunction:null})}function Ur(z,H,L,U,Y,ue){var me=ke(H,L);z=Sr(z),Y=Ee(U,Y),Si(z,function(){ge("Cannot call "+z+" due to unbound types",me)},H-1),$i([],me,function(we){var De=[we[0],null].concat(we.slice(1));return ya(z,Ve(z,De,null,Y,ue),H-1),[]})}function an(z,H,L){switch(H){case 0:return L?function(Y){return V[Y]}:function(Y){return G[Y]};case 1:return L?function(Y){return R[Y>>1]}:function(Y){return N[Y>>1]};case 2:return L?function(Y){return F[Y>>2]}:function(Y){return j[Y>>2]};default:throw new TypeError("Unknown integer type: "+z)}}function Ln(z,H,L,U,Y){H=Sr(H);var ue=Xo(L),me=rt=>rt;if(U===0){var we=32-8*L;me=rt=>rt<>>we}var De=H.includes("unsigned"),Pe=(rt,mt)=>{},Be;De?Be=function(rt,mt){return Pe(mt,this.name),mt>>>0}:Be=function(rt,mt){return Pe(mt,this.name),mt},Xr(z,{name:H,fromWireType:me,toWireType:Be,argPackAdvance:8,readValueFromPointer:an(H,ue,U!==0),destructorFunction:null})}function Ro(z,H,L){var U=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array],Y=U[H];function ue(me){me=me>>2;var we=j,De=we[me],Pe=we[me+1];return new Y(A,Pe,De)}L=Sr(L),Xr(z,{name:L,fromWireType:ue,argPackAdvance:8,readValueFromPointer:ue},{ignoreDuplicateRegistrations:!0})}function Nt(z,H){H=Sr(H);var L=H==="std::string";Xr(z,{name:H,fromWireType:function(U){var Y=j[U>>2],ue=U+4,me;if(L)for(var we=ue,De=0;De<=Y;++De){var Pe=ue+De;if(De==Y||G[Pe]==0){var Be=Pe-we,rt=D(we,Be);me===void 0?me=rt:(me+="\0",me+=rt),we=Pe+1}}else{for(var mt=new Array(Y),De=0;De>2]=ue,L&&me)P(Y,De,ue+1);else if(me)for(var Pe=0;Pe255&&(ye(De),_n("String has UTF-16 code units that do not fit in 8 bits")),G[De+Pe]=Be}else for(var Pe=0;Pe>1,Y=U+H/2;!(U>=Y)&&N[U];)++U;if(L=U<<1,L-z>32&&er)return er.decode(G.subarray(z,L));for(var ue="",me=0;!(me>=H/2);++me){var we=R[z+me*2>>1];if(we==0)break;ue+=String.fromCharCode(we)}return ue}function Er(z,H,L){if(L===void 0&&(L=2147483647),L<2)return 0;L-=2;for(var U=H,Y=L>1]=me,H+=2}return R[H>>1]=0,H-U}function Rr(z){return z.length*2}function as(z,H){for(var L=0,U="";!(L>=H/4);){var Y=F[z+L*4>>2];if(Y==0)break;if(++L,Y>=65536){var ue=Y-65536;U+=String.fromCharCode(55296|ue>>10,56320|ue&1023)}else U+=String.fromCharCode(Y)}return U}function vo(z,H,L){if(L===void 0&&(L=2147483647),L<4)return 0;for(var U=H,Y=U+L-4,ue=0;ue=55296&&me<=57343){var we=z.charCodeAt(++ue);me=65536+((me&1023)<<10)|we&1023}if(F[H>>2]=me,H+=4,H+4>Y)break}return F[H>>2]=0,H-U}function Yl(z){for(var H=0,L=0;L=55296&&U<=57343&&++L,H+=4}return H}function Jl(z,H,L){L=Sr(L);var U,Y,ue,me,we;H===2?(U=bn,Y=Er,me=Rr,ue=()=>N,we=1):H===4&&(U=as,Y=vo,me=Yl,ue=()=>j,we=2),Xr(z,{name:L,fromWireType:function(De){for(var Pe=j[De>>2],Be=ue(),rt,mt=De+4,Bt=0;Bt<=Pe;++Bt){var Mt=De+4+Bt*H;if(Bt==Pe||Be[Mt>>we]==0){var mn=Mt-mt,gn=U(mt,mn);rt===void 0?rt=gn:(rt+="\0",rt+=gn),mt=Mt+H}}return ye(De),rt},toWireType:function(De,Pe){typeof Pe!="string"&&_n("Cannot pass non-string to C++ string type "+L);var Be=me(Pe),rt=ne(4+Be+H);return j[rt>>2]=Be>>we,Y(Pe,rt+4,Be+H),De!==null&&De.push(ye,rt),rt},argPackAdvance:8,readValueFromPointer:qr,destructorFunction:function(De){ye(De)}})}function rl(z,H,L,U,Y,ue){Pn[z]={name:Sr(H),rawConstructor:Ee(L,U),rawDestructor:Ee(Y,ue),fields:[]}}function yf(z,H,L,U,Y,ue,me,we,De,Pe){Pn[z].fields.push({fieldName:Sr(H),getterReturnType:L,getter:Ee(U,Y),getterContext:ue,setterArgumentType:me,setter:Ee(we,De),setterContext:Pe})}function Zl(z,H){H=Sr(H),Xr(z,{isVoid:!0,name:H,argPackAdvance:0,fromWireType:function(){},toWireType:function(L,U){}})}function wf(z){z>4&&(Tt[z].refcount+=1)}function Ql(z,H){var L=ht[z];return L===void 0&&_n(H+" has unknown type "+pe(z)),L}function xf(z,H){z=Ql(z,"_emval_take_value");var L=z.readValueFromPointer(H);return Gn.toHandle(L)}function Cf(){We("")}function Sf(z,H,L){G.copyWithin(z,H,H+L)}function Tf(){return 2147483648}function il(z){try{return S.grow(z-A.byteLength+65535>>>16),fe(S.buffer),1}catch{}}function ol(z){var H=G.length;z=z>>>0;var L=Tf();if(z>L)return!1;let U=(De,Pe)=>De+(Pe-De%Pe)%Pe;for(var Y=1;Y<=4;Y*=2){var ue=H*(1+.2/Y);ue=Math.min(ue,z+100663296);var me=Math.min(L,U(Math.max(z,ue),65536)),we=il(me);if(we)return!0}return!1}function Va(z){return 52}function ss(z,H,L,U,Y){return 70}var ea=[null,[],[]];function eu(z,H){var L=ea[z];H===0||H===10?((z===1?w:x)(b(L,0)),L.length=0):L.push(H)}function tu(z,H,L,U){for(var Y=0,ue=0;ue>2],we=j[H+4>>2];H+=8;for(var De=0;De>2]=Y,0}function al(z){return z}function nu(z){var H=o["_"+z];return H}function hc(z,H){V.set(z,H)}function ru(z,H,L,U,Y){var ue={string:Mt=>{var mn=0;if(Mt!=null&&Mt!==0){var gn=(Mt.length<<2)+1;mn=ft(gn),P(Mt,mn,gn)}return mn},array:Mt=>{var mn=ft(Mt.length);return hc(Mt,mn),mn}};function me(Mt){return H==="string"?D(Mt):H==="boolean"?!!Mt:Mt}var we=nu(z),De=[],Pe=0;if(U)for(var Be=0;Be0||(_e(),Q>0))return;function H(){st||(st=!0,o.calledRun=!0,!T&&(B(),a(o),o.onRuntimeInitialized&&o.onRuntimeInitialized(),M()))}o.setStatus?(o.setStatus("Running..."),setTimeout(function(){setTimeout(function(){o.setStatus("")},1),H()},1)):H()}if(o.preInit)for(typeof o.preInit=="function"&&(o.preInit=[o.preInit]);o.preInit.length>0;)o.preInit.pop()();return nt(),o.ready}})();t.exports=r})(o$);var MEe=o$.exports;const PEe=qc(MEe),REe=new URL("/static/dv3d/openjphjs.wasm",import.meta.url),np={codec:void 0,decoder:void 0,decodeConfig:{}};function LEe(t,e,r){const n={width:e,height:r};for(;t>0;)n.width=Math.ceil(n.width/2),n.height=Math.ceil(n.height/2),t--;return n}function AEe(t){if(np.decodeConfig=t,np.codec)return Promise.resolve();const e=PEe({locateFile:r=>r.endsWith(".wasm")?REe.toString():r});return new Promise((r,n)=>{e.then(i=>{np.codec=i,np.decoder=new i.HTJ2KDecoder,r()},n)})}async function NEe(t,e){await AEe();const r=new np.codec.HTJ2KDecoder,n=r.getEncodedBuffer(t.length);n.set(t);const i=e.decodeLevel||0;r.decodeSubResolution(i);const o=r.getFrameInfo();if(e.decodeLevel>0){const{width:E,height:b}=LEe(e.decodeLevel,o.width,o.height);o.width=E,o.height=b}const a=r.getDecodedBuffer();new Uint8Array(a.length).set(a);const c=`x: ${r.getImageOffset().x}, y: ${r.getImageOffset().y}`,l=r.getNumDecompositions(),f=r.getNumLayers(),u=["unknown","LRCP","RLCP","RPCL","PCRL","CPRL"][r.getProgressionOrder()+1],d=r.getIsReversible(),h=`${r.getBlockDimensions().width} x ${r.getBlockDimensions().height}`,g=`${r.getTileSize().width} x ${r.getTileSize().height}`,p=`${r.getTileOffset().x}, ${r.getTileOffset().y}`,v=`${a.length.toLocaleString()} bytes`,y=`${(a.length/n.length).toFixed(2)}:1`,m={columns:o.width,rows:o.height,bitsPerPixel:o.bitsPerSample,signed:o.isSigned,bytesPerPixel:e.bytesPerPixel,componentsPerPixel:o.componentCount};let w=kEe(o,a);const{buffer:x,byteOffset:C,byteLength:S}=w,T=x.slice(C,C+S);w=new w.constructor(T);const _={imageOffset:c,numDecompositions:l,numLayers:f,progessionOrder:u,reversible:d,blockDimensions:h,tileSize:g,tileOffset:p,decodedSize:v,compressionRatio:y};return{...e,pixelData:w,imageInfo:m,encodeOptions:_,..._,...m}}function kEe(t,e){return t.bitsPerSample>8?t.isSigned?new Int16Array(e.buffer,e.byteOffset,e.byteLength/2):new Uint16Array(e.buffer,e.byteOffset,e.byteLength/2):t.isSigned?new Int8Array(e.buffer,e.byteOffset,e.byteLength):new Uint8Array(e.buffer,e.byteOffset,e.byteLength)}function VEe(t,e){const r=t.length,{rescaleSlope:n,rescaleIntercept:i,suvbw:o,doseGridScaling:a}=e;if(e.modality==="PT"&&typeof o=="number"&&!isNaN(o))for(let s=0;s>o;let a=t.pixelData;t.pixelDataLength=t.pixelData.length;const{min:s,max:c}=rx(t.pixelData),l=typeof e.allowFloatRendering<"u"?e.allowFloatRendering:!0;let f=$8(t.photometricInterpretation)&&((m=e.targetBuffer)==null?void 0:m.offset)===void 0;const d=((w=e.preScale)==null?void 0:w.enabled)&&Object.values(e.preScale.scalingParameters).some(C=>typeof C=="number"&&!Number.isInteger(C)),h=!e.preScale.enabled||!l&&d,g=(x=e.targetBuffer)==null?void 0:x.type;if(g&&e.preScale.enabled&&!h){const C=e.preScale.scalingParameters,S=DT(s,c,C);f=!v4e(S.min,S.max,B7[g])}g&&!f?a=GEe(e,t,B7,a):e.preScale.enabled&&!h?a=WEe(e,s,c,t):a=a$(s,c,t);let p=s,v=c;if(e.preScale.enabled&&!h){const C=e.preScale.scalingParameters;if(s$(C),BEe(C)){VEe(a,C),t.preScale={...e.preScale,scaled:!0};const T=DT(s,c,C);p=T.min,v=T.max}}else h&&(t.preScale={enabled:!0,scaled:!1},p=s,v=c);t.pixelData=a,t.smallestPixelValue=p,t.largestPixelValue=v;const y=new Date().getTime();return t.decodeTimeInMS=y-r,t}function BEe(t){const{rescaleSlope:e,rescaleIntercept:r,modality:n,doseGridScaling:i,suvbw:o}=t;return typeof e=="number"&&typeof r=="number"||n==="RTDOSE"&&typeof i=="number"||n==="PT"&&typeof o=="number"}function GEe(t,e,r,n){const{arrayBuffer:i,type:o,offset:a=0,length:s,rows:c}=t.targetBuffer,l=r[o];if(!l)throw new Error(`target array ${o} is not supported, or doesn't exist.`);c&&c!=e.rows&&$Ee(e,t.targetBuffer,l);const f=e.pixelDataLength,u=a,d=s??f-u,h=e.pixelData;if(d!==h.length)throw new Error(`target array for image does not have the same length (${d}) as the decoded image length (${h.length}).`);const g=i?new l(i,u,d):new l(d);return g.set(h,0),n=g,n}function WEe(t,e,r,n){const i=t.preScale.scalingParameters;s$(i);const o=DT(e,r,i);return a$(o.min,o.max,n)}function a$(t,e,r){const n=j8(t,e),i=new n(r.pixelData.length);return i.set(r.pixelData,0),i}function DT(t,e,r){const{rescaleSlope:n,rescaleIntercept:i,modality:o,doseGridScaling:a,suvbw:s}=r;return o==="PT"&&typeof s=="number"&&!isNaN(s)?{min:s*(t*n+i),max:s*(e*n+i)}:o==="RTDOSE"&&typeof a=="number"&&!isNaN(a)?{min:t*a,max:e*a}:typeof n=="number"&&typeof i=="number"?{min:n*t+i,max:n*e+i}:{min:t,max:e}}function s$(t){if(!t)throw new Error("options.preScale.scalingParameters must be defined if preScale.enabled is true, and scalingParameters cannot be derived from the metadata providers.")}function zEe(t,e,r){const{samplesPerPixel:n}=t,{rows:i,columns:o}=e,a=i*o*n,s=new r(a),c=s.byteLength/a;return{pixelData:s,rows:i,columns:o,frameInfo:{...t.frameInfo,rows:i,columns:o},imageInfo:{...t.imageInfo,rows:i,columns:o,bytesPerPixel:c}}}function $Ee(t,e,r){const n=zEe(t,e,r),{scalingType:i="replicate"}=e;return FEe[i](t,n),Object.assign(t,n),t.pixelDataLength=t.pixelData.length,t}async function c$(t,e,r,n,i,o){const a=new Date().getTime();let s=null,c;switch(e){case"1.2.840.10008.1.2":case"1.2.840.10008.1.2.1":s=N7(t,r);break;case"1.2.840.10008.1.2.2":s=rEe(t,r);break;case"1.2.840.10008.1.2.1.99":s=N7(t,r);break;case"1.2.840.10008.1.2.5":s=iEe(t,r);break;case"1.2.840.10008.1.2.4.50":c={...t},s=dEe(r,c);break;case"1.2.840.10008.1.2.4.51":s=vEe(t,r);break;case"1.2.840.10008.1.2.4.57":s=V7(t,r);break;case"1.2.840.10008.1.2.4.70":s=V7(t,r);break;case"1.2.840.10008.1.2.4.80":c={signed:t.pixelRepresentation===1,bytesPerPixel:t.bitsAllocated<=8?1:2,...t},s=F7(r,c);break;case"1.2.840.10008.1.2.4.81":c={signed:t.pixelRepresentation===1,bytesPerPixel:t.bitsAllocated<=8?1:2,...t},s=F7(r,c);break;case"1.2.840.10008.1.2.4.90":c={...t},s=U7(r,c);break;case"1.2.840.10008.1.2.4.91":c={...t},s=U7(r,c);break;case"3.2.840.10008.1.2.4.96":case"1.2.840.10008.1.2.4.201":case"1.2.840.10008.1.2.4.202":case"1.2.840.10008.1.2.4.203":c={...t},s=NEe(r,c);break;default:throw new Error(`no decoder for transfer syntax ${e}`)}if(!s)throw new Error("decodePromise not defined");const l=await s,f=UEe(l,i,a);return o==null||o(f),f}const jEe={decodeTask({imageFrame:t,transferSyntax:e,decodeConfig:r,options:n,pixelData:i,callbackFn:o}){return c$(t,e,i,r,n,o)}};_4(jEe);const IT={constants:Q4e,convertRGBColorByPixel:vz,convertRGBColorByPlane:yz,convertYBRFullByPixel:wz,convertYBRFullByPlane:xz,convertPALETTECOLOR:Cz,wadouri:S4e,wadors:K4e,init:e$,convertColorSpace:Bz,createImage:ix,decodeJPEGBaseline8BitColor:Gz,getImageFrame:Wz,getPixelData:X8,getMinMax:rx,isColorImage:$8,isJPEGBaseline8BitColor:J4e,internal:V_e,decodeImageFrame:c$};class Rh extends cf{}pb(Rh,"toolName","NoLabelArrowAnnotate");function G7(t,e){const r=vt("imagePlaneModule",t);if(!r)return;const{rowCosines:n,columnCosines:i,imagePositionPatient:o,rowPixelSpacing:a,columnPixelSpacing:s}=r;if(!n||!i||!o)return;const c=s||1,l=a||1,f=n,u=i,d=o;return[d[0]+e.x*u[0]*c+e.y*f[0]*l,d[1]+e.x*u[1]*c+e.y*f[1]*l,d[2]+e.x*u[2]*c+e.y*f[2]*l]}window.cornerstone3dTools=mz;window.cornerstone3d=Nhe;window.cornerstoneDICOMImageLoader=IT;const{MouseBindings:Ng,KeyboardBindings:W7}=ZV,{IMAGE_RENDERED:kg}=Ze,HEe=[{name:"Soft Tissue",center:40,width:400},{name:"Lung",center:-600,width:1500},{name:"Bone",center:300,width:1500},{name:"Brain",center:40,width:80},{name:"Abdomen",center:60,width:400}],a0=[{label:"Window/Level",value:Dh.toolName,icon:"🌓"},{label:"Pan",value:Hu.toolName,icon:"✋"},{label:"Zoom",value:bl.toolName,icon:"🔍"},{label:"Stack Scroll",value:Pd.toolName,icon:"📚"},{label:"Rotate",value:Ih.toolName,icon:"↺"},{label:"Length",value:sf.toolName,icon:"📏"},{label:"Probe",value:jl.toolName,icon:"🔎"},{label:"Arrow (No Label)",value:Rh.toolName,icon:"➡️"},{label:"Arrow Annotate",value:cf.toolName,icon:"✈️"},{label:"Rectangle ROI",value:$l.toolName,icon:"▭"},{label:"Ellipse ROI",value:Rd.toolName,icon:"◯"},{label:"Freehand ROI",value:af.toolName,icon:"✏️"},{label:"Freehand Contour Segmentation",value:Hc.toolName,icon:"🖊️"},{label:"Sculptor",value:Oh.toolName,icon:"🔧"},{label:"Reference Cursors",value:Wa.toolName,icon:"⦿"}];function KEe(t){if(!t)return"🔖";const e=a0.find(r=>r.value===t||r.label===t);return(e==null?void 0:e.icon)||"🔖"}const z7=[{label:"Left",value:"Primary"},{label:"Middle",value:"Auxiliary"},{label:"Right",value:"Secondary"}],J2=[{label:"Left",value:"Primary",mask:1},{label:"Middle",value:"Auxiliary",mask:4},{label:"Right",value:"Secondary",mask:2},{label:"Left + Right",value:"Primary_and_Secondary",mask:3},{label:"Left + Middle",value:"Primary_and_Auxiliary",mask:5},{label:"Right + Middle",value:"Secondary_and_Auxiliary",mask:6},{label:"Left + Right + Middle",value:"Primary_and_Secondary_and_Auxiliary",mask:7},{label:"Fourth Button",value:"Fourth_Button",mask:8},{label:"Fifth Button",value:"Fifth_Button",mask:16},{label:"Mouse Wheel",value:"Wheel",mask:524288},{label:"Mouse Wheel + Left",value:"Wheel_Primary",mask:524289}];function $7({container_id:t,imageStacks:e,autoCacheStack:r,annotationJson:n,viewerState:i,...o}){var Mr,Ps,Ai,oi,os,Qo,Ni,ya,Rs,Ls;const a=Et.useRef(null),s=Et.useRef(null),c=Et.useRef(!1),l="dv3d_mouseToolBindings",f="dv3d_ctrlMouseToolBindings",[u,d]=Et.useState(!1),[h,g]=Et.useState(!1),[p,v]=Et.useState(!1),[y,m]=Et.useState(!1),[w,x]=Et.useState(320),C=Et.useRef({resizing:!1,startX:0,startWidth:320}),S=240,T=720,_=220,E=40,b=14,[D,I]=Et.useState(null),[P,O]=Et.useState(null),A=9,V="renderingEngine_"+t,G="TOOL_GROUP_"+t,R=Et.useRef(null),N=Et.useRef(!1),[F,j]=Et.useState(!0),[X,te]=Et.useState([]),[fe,le]=Et.useState(0),[de,Ie]=Et.useState(()=>Array(A).fill([])),Me=ce=>{typeof ce=="function"?Ie(Ee=>{const Ce=ce(Ee);return console.log("setViewportImageIds (fn):",Ce),Ce}):(console.log("setViewportImageIds:",ce),Ie(ce))},[_e,B]=Et.useState(()=>Array(A).fill(0)),[M,$]=Et.useState({}),W=Et.useRef({});function q(ce){if(!ce)return null;try{if(ce.tagName&&ce.tagName.toLowerCase()==="canvas")return ce}catch{}try{const Ee=ce.querySelector&&ce.querySelector("canvas");if(Ee)return Ee}catch{}try{const Ee=ce.children||[];for(let Ce=0;CeMath.min(bn,Math.max(er,Nt)),Tt=()=>{Ee.style.transform=`translate(${ke}px, ${ze}px) scale(${be})`};let jt=!0,Dt=!0;const Jt=Nt=>{if(!Dt)return;Nt.preventDefault();const er=Ee.getBoundingClientRect(),bn=Nt.clientX-er.left,Er=Nt.clientY-er.top,Rr=-Nt.deltaY,as=1+(Rr>0?.1:-.1)*Math.min(4,Math.abs(Rr)/100),vo=wt(be*as,.1,10);ke=(ke-bn)*(vo/be)+bn,ze=(ze-Er)*(vo/be)+Er,be=vo,Tt()},En=Nt=>{Nt.button===0&&jt&&(Ve=!0,$e=Nt.clientX,St=Nt.clientY,Ee.style.cursor="grabbing",Nt.preventDefault())},Gn=Nt=>{if(!Ve)return;const er=Nt.clientX-$e,bn=Nt.clientY-St;ke+=er,ze+=bn,$e=Nt.clientX,St=Nt.clientY,Tt()},dr=Nt=>{Ve&&(Ve=!1,Ee.style.cursor="grab")},Pr=Nt=>{be=1,ke=0,ze=0,Tt()};let Ki=0;const Po=(Nt,er)=>Math.hypot(er.clientX-Nt.clientX,er.clientY-Nt.clientY),Ur=Nt=>{Nt.touches.length===1?jt&&(Ve=!0,$e=Nt.touches[0].clientX,St=Nt.touches[0].clientY):Nt.touches.length===2&&(Ki=Po(Nt.touches[0],Nt.touches[1]))},an=Nt=>{if(Nt.touches.length===1&&Ve){const er=Nt.touches[0].clientX-$e,bn=Nt.touches[0].clientY-St;ke+=er,ze+=bn,$e=Nt.touches[0].clientX,St=Nt.touches[0].clientY,Tt()}else if(Nt.touches.length===2&&Dt){const er=Po(Nt.touches[0],Nt.touches[1]);if(Ki>0){const bn=er/Ki,Er=Ee.getBoundingClientRect(),Rr=(Nt.touches[0].clientX+Nt.touches[1].clientX)/2-Er.left,as=(Nt.touches[0].clientY+Nt.touches[1].clientY)/2-Er.top,vo=wt(be*bn,.1,10);ke=(ke-Rr)*(vo/be)+Rr,ze=(ze-as)*(vo/be)+as,be=vo,Tt()}Ki=er}Nt.preventDefault()},Ln=Nt=>{Nt.touches.length===0&&(Ve=!1,Ki=0)};return ce.addEventListener("wheel",Jt,{passive:!1}),ce.addEventListener("mousedown",En),window.addEventListener("mousemove",Gn),window.addEventListener("mouseup",dr),Ee.addEventListener("dblclick",Pr),ce.addEventListener("touchstart",Ur,{passive:!1}),ce.addEventListener("touchmove",an,{passive:!1}),ce.addEventListener("touchend",Ln),{cleanup:()=>{ce.removeEventListener("wheel",Jt),ce.removeEventListener("mousedown",En),window.removeEventListener("mousemove",Gn),window.removeEventListener("mouseup",dr),Ee.removeEventListener("dblclick",Pr),ce.removeEventListener("touchstart",Ur),ce.removeEventListener("touchmove",an),ce.removeEventListener("touchend",Ln),Ee.style.transform="",Ee.style.cursor="",Ee.style.willChange=""},setAllowPan:Nt=>{jt=Nt},setAllowZoom:Nt=>{Dt=Nt}}}const[Te,Oe]=Et.useState(!1),[We,qe]=Et.useState(null),[ie,oe]=Et.useState(!1),[xe,se]=Et.useState(null);Et.useEffect(()=>{const ce=Ce=>{try{const pe=Ce&&Ce.message?String(Ce.message):"";(pe.includes("releaseGraphicsResources")||pe.includes("openGLTexture")||pe.includes("getDefaultActor")||pe.includes("setColormapGPU")||pe.includes(`can't access property "actor"`)||pe.toLowerCase().includes("webgl")||pe.toLowerCase().includes("colormap"))&&(console.error("Detected graphics/rendering error:",Ce),se(pe||null),oe(!0))}catch{}},Ee=Ce=>{try{const pe=Ce&&Ce.reason||"",ge=typeof pe=="string"?pe:pe&&pe.message?pe.message:String(pe);(ge.includes("releaseGraphicsResources")||ge.includes("openGLTexture")||ge.includes("getDefaultActor")||ge.includes("setColormapGPU")||ge.includes(`can't access property "actor"`)||ge.toLowerCase().includes("webgl")||ge.toLowerCase().includes("colormap"))&&(console.error("Detected graphics/rendering rejection:",Ce),se(ge||null),oe(!0))}catch{}};return window.addEventListener("error",ce),window.addEventListener("unhandledrejection",Ee),()=>{window.removeEventListener("error",ce),window.removeEventListener("unhandledrejection",Ee)}},[]),Et.useEffect(()=>{let ce=!1;if(n||i){qe(n?"annotations":"viewerState");const Ee=setTimeout(()=>{if(ce)return;const Ce=t||"default";if(n)try{const pe=window[`importAnnotations_${Ce}`]||window.importAnnotations;typeof pe=="function"&&pe(n)}catch(pe){console.error("Failed to import annotations from prop:",pe)}if(i)try{const pe=window[`importViewerState_${Ce}`]||window.importViewerState;typeof pe=="function"&&pe(i)}catch(pe){console.error("Failed to import viewer state from prop:",pe)}qe(null)},2e3);return()=>{ce=!0,clearTimeout(Ee),qe(null)}}},[n,i,t]),Et.useEffect(()=>{let ce=!0;return e().then(async Ee=>{if(!ce)return;const Ce=Array.isArray(Ee)?Ee:[],pe=await Promise.all(Ce.map(async ge=>{if(Array.isArray(ge))return{imageIds:ge};const be=Array.isArray(ge.imageIds)?ge.imageIds:Array.isArray(ge.i)?ge.i:[];let ke=ge.studyInstanceUID;if(!ke&&be.length>0)try{const ze=be[0];if(typeof fetch=="function"&&typeof window.dicomParser<"u"&&ze.startsWith("wadouri:")){const Ve=ze.slice(7),St=await(await fetch(Ve)).arrayBuffer();ke=window.dicomParser.parseDicom(new Uint8Array(St)).string("x0020000d")}}catch{}return{imageIds:be,studyInstanceUID:ke,studyId:ge.studyId,name:ge.name,caseId:ge.caseId}}));te(pe),pe[0]?(await Rt(pe[0].imageIds),Me(Array(A).fill(pe[0].imageIds||[]))):Me(Array(A).fill([]))}).catch(Ee=>{console.error("Failed to load imageStacks:",Ee),te([]),Me(Array(A).fill([]))}),()=>{ce=!1}},[]);const ve=async(ce,Ee)=>{const Ce=X[Ee];if(!Ce)return;const pe=Ce.imageIds;Rn(ge=>{const be=[...ge];return be[ce]="stack",be}),Me(ge=>{const be=[...ge];return be[ce]=pe,be}),B(ge=>{const be=[...ge];return be[ce]=Ee,be}),await Rt(pe)},[Ye,ae]=Et.useState(!1),[pt,_t]=Et.useState(!0),[yt,Le]=Et.useState(!1),[Qe,ct]=Et.useState(!1),lt=()=>{console.log("Sorting viewport imageIds by slice location"),Me(ce=>{const Ee=ce.map((Ce,pe)=>{if(!Ce||Ce.length===0)return Ce;const ke=[...Ce.map(ze=>{const Ve=vt("imagePlaneModule",ze);let $e=null;return Ve&&(Ve.sliceLocation!==void 0?$e=Number(Ve.sliceLocation):Ve.imagePositionPatient&&Array.isArray(Ve.imagePositionPatient)&&Ve.imagePositionPatient.length===3&&($e=Number(Ve.imagePositionPatient[2]))),{imageId:ze,sortKey:$e}})].sort((ze,Ve)=>ze.sortKey!==null&&Ve.sortKey!==null?ze.sortKey-Ve.sortKey:ze.imageId.localeCompare(Ve.imageId)).map(ze=>ze.imageId);return JSON.stringify(ke)===JSON.stringify(Ce)?Ce:ke});return Oe(!0),Ee})},gt=Et.useCallback(async(ce,Ee)=>{if(!Ee){console.warn("generateThumbnail: no chosenImageId for stack",ce);return}if(M[ce]){console.debug("generateThumbnail: thumbnail already exists for",ce);return}if(W.current[ce]){console.debug("generateThumbnail: already requested for",ce);return}if(Q(Ee)){try{const be=new Image;be.crossOrigin="anonymous";const ke=Ee.replace(/^external:/,"");be.src=ke,await new Promise((St,wt)=>{be.onload=()=>St(!0),be.onerror=Tt=>wt(Tt)});const ze=document.createElement("canvas"),Ve=160;ze.width=Ve,ze.height=Ve;const $e=ze.getContext("2d");if($e){const St=Math.min(Ve/be.width,Ve/be.height),wt=be.width*St,Tt=be.height*St,jt=(Ve-wt)/2,Dt=(Ve-Tt)/2;$e.fillStyle="#000",$e.fillRect(0,0,Ve,Ve),$e.drawImage(be,jt,Dt,wt,Tt);const Jt=ze.toDataURL("image/png");$(En=>({...En,[ce]:Jt}))}else $(St=>({...St,[ce]:"BROKEN"}))}catch(be){console.warn("generateThumbnail: failed to generate thumbnail for external image",be),$(ke=>({...ke,[ce]:"BROKEN"}))}return}const Ce=R.current;if(!Ce){console.warn("generateThumbnail: no renderingEngine yet for",ce);return}W.current[ce]=!0,console.debug("generateThumbnail: starting for",ce,Ee);const pe=`THUMB_${t||"main"}_${ce}`,ge=document.createElement("div");ge.style.width="160px",ge.style.height="160px",ge.style.position="absolute",ge.style.left="-9999px",ge.style.top="0",document.body.appendChild(ge);try{Ce.enableElement({viewportId:pe,type:Tr.STACK,element:ge});const be=Ce.getViewport(pe);if(!be){console.warn("generateThumbnail: no viewport returned after enableElement for",pe);return}try{be.setStack([Ee])}catch(Ve){console.warn("generateThumbnail: vp.setStack failed",Ve)}const ke=await new Promise(Ve=>{let $e=!1;const St=setTimeout(()=>{$e||($e=!0,console.warn("generateThumbnail: IMAGE_RENDERED timeout for",pe),Ve(!1))},2e3),wt=()=>{$e||($e=!0,clearTimeout(St),console.debug("generateThumbnail: IMAGE_RENDERED received for",pe),Ve(!0))};try{if(be&&be.element)try{be.element.addEventListener(kg,wt,{once:!0})}catch(Tt){console.warn("generateThumbnail: failed to add IMAGE_RENDERED listener",Tt)}if(typeof be.render=="function")try{const Tt=be.render();Tt&&typeof Tt.then=="function"&&Tt.catch(()=>{})}catch{}}catch(Tt){clearTimeout(St),console.warn("generateThumbnail: error while waiting for render",Tt),Ve(!1)}});let ze=q(ge)||(be&&be.element?q(be.element):null);if(ze||(console.debug("generateThumbnail: no canvas found immediately, waiting briefly and retrying for",pe,"canvasReady=",ke),await new Promise(Ve=>setTimeout(Ve,150)),ze=q(ge)||(be&&be.element?q(be.element):null)),ze)try{const Ve=ze.toDataURL("image/png");$($e=>({...$e,[ce]:Ve})),console.debug("generateThumbnail: thumbnail captured for stack",ce)}catch(Ve){console.warn("generateThumbnail: toDataURL failed",Ve),$($e=>({...$e,[ce]:"BROKEN"}))}else console.warn("generateThumbnail: no canvas found after render for",pe,"canvasReady=",ke,"vp.element=",!!(be&&be.element)),$(Ve=>({...Ve,[ce]:"BROKEN"}))}catch(be){console.warn("Thumbnail generation failed for",Ee,be);try{$(ke=>({...ke,[ce]:"BROKEN"}))}catch{}}finally{try{Ce.disableElement(pe)}catch(be){console.warn("Failed to disable thumbnail element:",be)}ge&&ge.parentNode&&ge.parentNode.removeChild(ge)}},[t,M]);Et.useEffect(()=>{!X||X.length===0||!R.current||X.forEach((Ee,Ce)=>{const pe=Array.isArray(Ee.imageIds)?Ee.imageIds:[],ge=Math.floor(pe.length/2),be=pe[ge]||pe[0]||null;!M[Ce]&&!W.current[Ce]&>(Ce,be)})},[X,gt,M]);const Rt=async(ce,Ee)=>{console.log("Setting loaded imageIds:",ce),console.log("autoCacheStack:",r);const Ce=[];if(!!(r||Ee!=null&&Ee.force)){for(const ge of ce)if(ge.startsWith("wadouri:"))try{const be=ge.slice(8);if(IT.wadouri.dataSetCacheManager){const ke=IT.wadouri.dataSetCacheManager.load(be);ke&&typeof ke.then=="function"&&Ce.push(ke)}else console.warn("MetaDataManager not found. Unable to cache metadata.")}catch(be){console.warn(`Failed to cache metadata for ${ge}:`,be)}await Promise.all(Ce),Mi&&(console.log("Sorting viewport imageIds by slice location"),lt())}},[ut,Wt]=Et.useState({rows:1,cols:1}),[Qt,Bn]=Et.useState(!1),Mn=Et.useRef([]),hn=Et.useRef({}),Pn=Et.useRef({}),[Mi,qr]=Et.useState(!1),[je,ht]=Et.useState(!0),Kt=[];for(let ce=1;ce<=3;ce++)for(let Ee=1;Ee<=3;Ee++)Kt.push({rows:ce,cols:Ee});const[un,Pi]=Et.useState(()=>Array(ut.rows*ut.cols).fill({index:0,total:0,windowCenter:"",windowWidth:"",slicePosition:0})),[bt,Rn]=Et.useState(()=>Array(A).fill("stack")),[fn,rn]=Et.useState(()=>Array(ut.rows*ut.cols).fill(!1)),[fr,$i]=Et.useState({Primary:Pd.toolName,Auxiliary:Hu.toolName,Secondary:Dh.toolName,Primary_and_Secondary:bl.toolName,Fourth_Button:Ih.toolName,Wheel:Pd.toolName}),[fo,ha]=Et.useState({Primary:sf.toolName,Auxiliary:jl.toolName,Secondary:Rh.toolName}),[Xo,ga]=Et.useState(!1);Et.useEffect(()=>{const ce=Ce=>{Ce.ctrlKey&&ga(!0)},Ee=Ce=>{Ce.ctrlKey||ga(!1)};return window.addEventListener("keydown",ce),window.addEventListener("keyup",Ee),()=>{window.removeEventListener("keydown",ce),window.removeEventListener("keyup",Ee)}},[]);const[rs,Sr]=Et.useState(!1),[Io,_n]=Et.useState(null),Xr=(ce,Ee)=>{ca&&ca(Ee),Ms(Ce=>{const pe=[...Ce];return pe[ce]=Ee,pe})},bs=(ce,Ee,Ce)=>{const pe=Zr.getAllAnnotations()||[];pe.forEach(be=>{be.annotationUID===Ee&&(be.isSelected=!1)}),Zr.removeAnnotation(Ee),R.current.render();const ge=Ce.filter(be=>be.annotationUID!==Ee);Ms(be=>{const ke=[...be],ze=ge.length>0?ge[0].annotationUID:null;return ke[ce]=ze,pe.forEach(Ve=>{Ve.isSelected=Ve.annotationUID===ze}),ca(ze),R.current.render(),ke})},ho=()=>{const ce=de.findIndex(ge=>ge&&ge.length>0);if(ce===-1){_n("No images loaded."),Sr(!0);return}const Ee=de[ce][0],Ce=["imagePlaneModule","generalSeriesModule","generalStudyModule","patientModule","imagePixelModule","voiLutModule","modalityLutModule","sopCommonModule","petIsotopeModule","multiframeModule","cineModule","overlayPlaneModule","generalImageModule","stackModule","voiLutModule","modalityLutModule","petSeriesModule","petImageModule","petIsotopeModule","petSeriesModule","petImageModule","petIsotopeModule","petSeriesModule","petImageModule","petIsotopeModule","petSeriesModule","petImageModule","petIsotopeModule"],pe={};Ce.forEach(ge=>{const be=vt(ge,Ee);be!==void 0&&(pe[ge]=be)}),_n(Ke.jsx("pre",{style:{maxHeight:600,overflow:"auto",fontSize:13,color:"#fff"},children:JSON.stringify(pe,null,2)})),Sr(!0)};Et.useEffect(()=>{try{const ce=localStorage.getItem(l),Ee=localStorage.getItem(f);ce&&$i(JSON.parse(ce)),Ee&&ha(JSON.parse(Ee))}catch{}},[]),Et.useEffect(()=>{try{localStorage.setItem(l,JSON.stringify(fr))}catch{}},[fr]),Et.useEffect(()=>{try{localStorage.setItem(f,JSON.stringify(fo))}catch{}},[fo]),Et.useEffect(()=>(window.loadDicomStackFromFiles=ce=>{const Ee=Array.from(ce);Yr({target:{files:Ee}})},()=>{window.loadDicomStackFromFiles=void 0}),[]);const[Oo,ji]=Et.useState(!1),[Ri,is]=Et.useState(!1);Et.useEffect(()=>{const ce=fi(G);ce&&["ArrowAnnotate","NoLabelArrowAnnotate","Length","RectangleROI","EllipticalROI","PlanarFreehandROI","PlanarFreehandContourSegmentation"].forEach(Ee=>{ce.setToolConfiguration(Ee,{color:"#00e676",selectedColor:"#ffeb3b"})})},[G]),Et.useEffect(()=>{const ce=pe=>{pe.altKey&&ji(!0),pe.shiftKey&&is(!0)},Ee=pe=>{pe.altKey||ji(!1),pe.shiftKey||is(!1)},Ce=()=>{ji(!1),is(!1)};return window.addEventListener("keydown",ce),window.addEventListener("keyup",Ee),window.addEventListener("blur",Ce),()=>{window.removeEventListener("keydown",ce),window.removeEventListener("keyup",Ee),window.removeEventListener("blur",Ce)}},[]),Et.useEffect(()=>{const ce=fi(G);if(!ce)return;if(Ri||je&&Oo){const Ce=ut.rows*ut.cols;de.slice(0,Ce).filter((ge,be)=>bt[be]==="stack"&&Array.isArray(ge)&&ge.length>0).forEach(ge=>{Rt(ge,{force:!0}).catch(be=>{console.warn("Reference cursor metadata warm-up failed:",be)})}),ce.hasTool(Wa.toolName)||ce.addTool(Wa.toolName),ce.setToolEnabled(Wa.toolName),ce.setToolActive(Wa.toolName)}else ce.hasTool(Wa.toolName)&&ce.setToolDisabled(Wa.toolName)},[Oo,Ri,je,ut.rows,ut.cols,de,bt,Rt]);const Yo=Et.useCallback(()=>{[fi(G)].forEach(Ee=>{if(Ee){a0.forEach(pe=>{Ee.setToolPassive(pe.value,{removeAllBindings:!0})}),Ee.setToolDisabled(Wa.toolName);const Ce={};Object.entries(fr).forEach(([pe,ge])=>{Ce[ge]||(Ce[ge]=[]);const be=J2.find(ke=>ke.value===pe);be?Ce[ge].push({mouseButton:be.mask}):Ng[pe]&&Ce[ge].push({mouseButton:Ng[pe]})}),Object.entries(fo).forEach(([pe,ge])=>{if(!ge)return;Ce[ge]||(Ce[ge]=[]);const be=J2.find(ke=>ke.value===pe);be?Ce[ge].push({mouseButton:be.mask,modifierKey:W7.Ctrl}):Ng[pe]&&Ce[ge].push({mouseButton:Ng[pe],modifierKey:W7.Ctrl})}),Object.entries(Ce).forEach(([pe,ge])=>{Ee.setToolActive(pe,{bindings:ge})});try{const pe=fr.Primary,ge=fr.Wheel,be=fr.Auxiliary,ke=pe===Hu.toolName||be===Hu.toolName,ze=pe===bl.toolName||ge===bl.toolName||fr.Primary_and_Secondary===bl.toolName;Mn.current.forEach(Ve=>{if(!Ve)return;const $e=Ve._externalPanZoom;$e&&(typeof $e.setAllowPan=="function"&&$e.setAllowPan(!!ke),typeof $e.setAllowZoom=="function"&&$e.setAllowZoom(!!ze))})}catch{}}})},[fr,fo]),[ro,Ds]=Et.useState(!1),[Hi,Na]=Et.useState("add"),io=Et.useRef(null),go=Et.useCallback(ce=>{p&&(ce.preventDefault(),ce.stopPropagation(),C.current={resizing:!0,startX:ce.clientX,startWidth:w},document.body.style.cursor="col-resize",document.body.style.userSelect="none")},[p,w]);Et.useEffect(()=>{const ce=Ce=>{if(!C.current.resizing)return;const pe=C.current.startX-Ce.clientX,ge=Math.max(S,Math.min(T,C.current.startWidth+pe));x(ge)},Ee=()=>{C.current.resizing&&(C.current.resizing=!1,document.body.style.cursor="",document.body.style.userSelect="")};return window.addEventListener("mousemove",ce),window.addEventListener("mouseup",Ee),()=>{window.removeEventListener("mousemove",ce),window.removeEventListener("mouseup",Ee),document.body.style.cursor="",document.body.style.userSelect=""}},[]);const Is=ro?_-E/2:-E+b;Et.useEffect(()=>{try{io.current&&(io.current.setAttribute("webkitdirectory","true"),io.current.setAttribute("directory",""),io.current.setAttribute("mozdirectory",""))}catch{}},[]);async function pa(ce,Ee=""){const Ce=[],pe=ce.entries?ce.entries():ce.values();for await(const ge of pe)try{let be,ke;if(Array.isArray(ge)&&ge.length>=2?(ke=ge[0],be=ge[1]):(be=ge,ke=be.name),!be)continue;if(be.kind==="file"){const ze=await be.getFile();try{Object.defineProperty(ze,"webkitRelativePath",{value:Ee+(ke||be.name),configurable:!0})}catch{}Ce.push(ze)}else if(be.kind==="directory"){const ze=await pa(be,Ee+(ke||be.name)+"/");Ce.push(...ze)}}catch(be){console.debug("collectFilesFromDirectoryHandle: skipping entry due to error",be)}return Ce}const Mo=async()=>{var ce;if(window.showDirectoryPicker)try{const Ee=await window.showDirectoryPicker(),Ce=await pa(Ee);Ce&&Ce.length>0?await Yr({target:{files:Ce}}):alert("No files found in selected folder.");return}catch(Ee){console.warn("showDirectoryPicker failed or cancelled",Ee)}(ce=io.current)==null||ce.click()},ka=Et.useRef(null),Yr=async ce=>{const Ee=ce.target.files;if(!Ee||Ee.length===0)return;qr(!1);const Ce=Array.from(Ee).sort((ke,ze)=>ke.name.localeCompare(ze.name)),pe=await Promise.all(Ce.map(async ke=>{const ze=ke.type&&ke.type.startsWith("image/");let Ve,$e,St,wt,Tt=!1;if(!ze)try{const Dt=await ke.arrayBuffer(),Jt=Wr.parseDicom(new Uint8Array(Dt));Ve=Jt.string("x0020000d"),$e=Jt.string("x0020000e");const En=Jt.string("x00200013");En!=null&&En!==""&&(St=parseInt(En,10));const Gn=Jt.string("x00201041")||Jt.string("x00201040");Gn!=null&&Gn!==""&&(wt=parseFloat(Gn)),Tt=!0}catch{Tt=!1}const jt=ze?`external:${URL.createObjectURL(ke)}`:`wadouri:${URL.createObjectURL(ke)}`;return{file:ke,imageId:jt,studyInstanceUID:Ve,seriesInstanceUID:$e,instanceNumber:St,sliceLocation:wt,isImage:ze,parsedSuccessfully:Tt}})),ge=new Map;for(const ke of pe){if(!ke.isImage&&!ke.parsedSuccessfully){console.debug("Skipping non-DICOM/non-image file:",ke.file.name);continue}const ze=ke.seriesInstanceUID||ke.studyInstanceUID||(ke.file.webkitRelativePath?ke.file.webkitRelativePath.split("/")[0]:ke.file.name);ge.has(ze)||ge.set(ze,{entries:[],studyInstanceUID:ke.studyInstanceUID,seriesInstanceUID:ke.seriesInstanceUID}),ge.get(ze).entries.push(ke)}const be=[];for(const[ke,ze]of ge.entries()){const Ve=ze.entries;Ve.sort((St,wt)=>Mi&&St.sliceLocation!==void 0&&wt.sliceLocation!==void 0?St.sliceLocation-wt.sliceLocation:St.instanceNumber!==void 0&&wt.instanceNumber!==void 0?St.instanceNumber-wt.instanceNumber:(St.file.webkitRelativePath||St.file.name).localeCompare(wt.file.webkitRelativePath||wt.file.name));const $e=Ve.map(St=>St.imageId);be.push({imageIds:$e,studyInstanceUID:ze.studyInstanceUID,seriesInstanceUID:ze.seriesInstanceUID})}if(be.length!==0)if(Hi==="replace"){try{const ke=R.current;if(ke)for(let ze=0;ze{const ke=Array(A).fill([]);for(let ze=0;ze{const ze=[...ke,...be];Me(Ve=>{const $e=[...Ve];return $e[0]=be[be.length-1].imageIds,$e}),B(Ve=>{const $e=[...Ve];return $e[0]=ze.length-1,$e});for(const Ve of be)Rt(Ve.imageIds);return ze})},cr=Et.useCallback((ce,Ee)=>{if(!Ee)return;let Ce=0,pe=0,ge="",be="",ke="";if(bt[ce]==="stack"){if(Ce=typeof Ee.getCurrentImageIdIndex=="function"?Ee.getCurrentImageIdIndex():0,pe=(typeof Ee.getImageIds=="function"?Ee.getImageIds():[]).length,typeof Ee.getProperties=="function"){const Ve=Ee.getProperties();if(Ve.voiRange){const{lower:$e,upper:St}=Ve.voiRange;ge=((St+$e)/2).toFixed(0),be=(St-$e).toFixed(0)}}}else if(bt[ce]==="volume"){if(typeof Ee.getSliceIndex=="function"&&(Ce=Ee.getSliceIndex()),typeof Ee.getNumberOfSlices=="function"&&(pe=Ee.getNumberOfSlices()),typeof Ee.getProperties=="function"){let ze;if(Ee.volumeIds&&Ee.volumeIds.size>0){const Ve=Array.from(Ee.volumeIds)[0];ze=Ee.getProperties(Ve)}else ze=Ee.getProperties();if(ze&&ze.voiRange){const{lower:Ve,upper:$e}=ze.voiRange;ge=(($e+Ve)/2).toFixed(0),be=($e-Ve).toFixed(0)}}if(typeof Ee.getSlicePlaneCoordinates=="function"){const ze=Ee.getSlicePlaneCoordinates();ze&&typeof ze.position=="number"&&(ke=ze.position.toFixed(2)+" mm")}}Pi(ze=>{const Ve=[...ze];return Ve[ce]={index:Ce+1,total:pe,windowCenter:ge,windowWidth:be,slicePosition:ke},Ve})},[bt]),[Jo,oo]=Et.useState(!1);function Os(){for(let ce=0;ce{const ce=async()=>{var be;if(console.log("setup"),!c.current){c.current=!0,await PA(),await eG(),e$();try{sd("external",ke=>({promise:(async()=>{const Ve=ke.replace(/^external:/,""),$e=new Image;$e.crossOrigin="anonymous",$e.src=Ve,await new Promise((En,Gn)=>{$e.onload=()=>En(!0),$e.onerror=dr=>Gn(dr)});const St=$e.naturalWidth||$e.width,wt=$e.naturalHeight||$e.height,Tt=document.createElement("canvas");Tt.width=St,Tt.height=wt;const jt=Tt.getContext("2d");if(!jt)throw new Error("Unable to create canvas context");jt.drawImage($e,0,0,St,wt);const Dt=jt.getImageData(0,0,St,wt);return{imageId:ke,minPixelValue:0,maxPixelValue:255,slope:1,intercept:0,rows:wt,columns:St,height:wt,width:St,color:!0,rgba:!0,sizeInBytes:Dt.data.length,getPixelData:()=>Dt.data,getImageData:()=>Dt,getCanvas:()=>Tt}})()}))}catch(ke){console.warn("Failed to register external image loader",ke)}}let Ce=R.current;if(!Ce){Ce=new nE(V),R.current=Ce;try{X&&X.length>0&&X.forEach((ke,ze)=>{const Ve=Array.isArray(ke.imageIds)?ke.imageIds:[],$e=Math.floor(Ve.length/2),St=Ve[$e]||Ve[0]||null;St&&!M[ze]&&!W.current[ze]&>(ze,St)})}catch{}}let pe=fi(G);pe||(pe=qEe(G)),bt.slice(0,ut.rows*ut.cols).filter(ke=>ke==="volume").length,dc(pe);for(let ke=0;ke{if($e.offsetWidth>0&&$e.offsetHeight>0){Ce.resize();const Dt=Ce.getViewport(Ve);Dt&&typeof Dt.resize=="function"&&Dt.resize(),Dt&&typeof Dt.render=="function"&&Dt.render()}});jt.observe($e),$e._resizeObserver=jt}if(bt[ke]==="stack"){if(ze&&ze.length>0){const jt=ze[0];if(Q(jt))try{try{const En=$e._externalPanZoom;En&&typeof En.cleanup=="function"&&En.cleanup()}catch{}$e.innerHTML="";const Dt=document.createElement("img");Dt.style.width="100%",Dt.style.height="100%",Dt.style.objectFit="contain",Dt.style.display="block",Dt.src=jt.replace(/^external:/,""),Dt.setAttribute("draggable","false"),$e.appendChild(Dt);const Jt=re($e,Dt);$e._externalPanZoom=Jt,pe.removeViewports(V,Ve)}catch(Dt){console.warn("Failed to render external image in viewport",Dt)}else try{wt.setStack(ze)}catch(Dt){console.warn("viewport.setStack failed",Dt)}}Ye?pe.removeViewports(V,Ve):pe.addViewport(Ve,V)}else if(bt[ke]==="volume"){pe.addViewport(Ve,V);const jt=`myVolumeId_${ke}`;(await h1(jt,{imageIds:ze})).load(),wt.setVolumes([{volumeId:jt}]),wt.render(),$e._overlayListener&&wt.element.removeEventListener(kg,$e._overlayListener);const Jt=()=>cr(ke,wt);wt.element.addEventListener(kg,Jt),$e._overlayListener=Jt,cr(ke,wt);continue}if(wt.render(),!N.current){Pn.current[ke]!==void 0&&typeof wt.setImageIdIndex=="function"&&hs(wt.element,{imageIndex:Pn.current[ke]});const jt=hn.current[ke];if(jt&&typeof wt.setProperties=="function"){const{voiRange:Dt,invert:Jt,interpolationType:En,VOILUTFunction:Gn,colormap:dr}=jt,Pr={};Dt&&Dt.lower!==void 0&&Dt.upper!==void 0&&(Pr.voiRange=Dt),Jt!==void 0&&(Pr.invert=Jt),En!==void 0&&(Pr.interpolationType=En),Gn&&(Pr.VOILUTFunction=Gn),dr!=null&&(typeof dr=="string"||typeof dr=="object"&&!("actor"in dr))&&(Pr.colormap=dr),setTimeout(()=>{console.log("Restoring properties (timeout) for viewport",ke,Pr),wt.setProperties(Pr),wt.render()},100)}}$e._overlayListener&&wt.element.removeEventListener(kg,$e._overlayListener);const Tt=()=>cr(ke,wt);wt.element.addEventListener(kg,Tt),$e._overlayListener=Tt,cr(ke,wt)}for(let ke=0;ke=2?(pe.hasTool(Tc.toolName)||pe.addTool(Tc.toolName),pe.setToolEnabled(Tc.toolName),pe.setToolConfiguration(Tc.toolName,{}),pe.setToolActive(Tc.toolName,{bindings:[{mouseButton:Ng.Primary}]})):pe.hasTool(Tc.toolName)&&pe.setToolDisabled(Tc.toolName)),Yo()},Ee=requestAnimationFrame(()=>{ce()});return()=>{Mn.current.forEach(Ce=>{Ce&&Ce._resizeObserver&&(Ce._resizeObserver.disconnect(),delete Ce._resizeObserver)}),cancelAnimationFrame(Ee)}},[s,cr,ut,bt,de]);const Zo=Et.useCallback(ce=>{const Ee=`CT_${ce}`,pe=R.current.getViewport(Ee);pe&&typeof pe.resetCamera=="function"&&(pe.resetCamera(),console.log("Restoring viewport properties for viewport",ce),pe.resetProperties(),pe.render())},[]),el=Et.useCallback((ce,Ee,Ce)=>{const pe=`CT_${ce}`;try{const ge=R.current;if(ge){const be=ge.getViewport(pe);be&&typeof be.setProperties=="function"&&(console.log(`Applying preset to viewport ${ce}: center=${Ee}, width=${Ce}`),be.setProperties({voiRange:{lower:Ee-Ce/2,upper:Ee+Ce/2}}),be.render(),cr(ce,be))}}catch{}},[cr]);Et.useEffect(()=>{Pi(Array(ut.rows*ut.cols).fill({index:0,total:0,windowCenter:"",windowWidth:""})),rn(Array(ut.rows*ut.cols).fill(!1))},[ut]),Et.useEffect(()=>{Yo()},[fr,fo,Xo,Yo]),Et.useEffect(()=>{if(!u)return;const ce=Ee=>{const Ce=document.querySelector(".preset-menu");Ce&&!Ce.contains(Ee.target)&&d(!1)};return document.addEventListener("mousedown",ce),()=>document.removeEventListener("mousedown",ce)},[u]),Et.useEffect(()=>{const ce=Ee=>{if(Ee.button===3||Ee.button===4)return Ee.preventDefault(),!1};return window.addEventListener("mousedown",ce,!0),window.addEventListener("mouseup",ce,!0),window.addEventListener("auxclick",ce,!0),()=>{window.removeEventListener("mousedown",ce,!0),window.removeEventListener("mouseup",ce,!0),window.removeEventListener("auxclick",ce,!0)}},[]),Et.useEffect(()=>{const ce=a.current;if(!ce)return;const Ee=Ce=>{Ce.preventDefault()};return ce.addEventListener("contextmenu",Ee),()=>{ce.removeEventListener("contextmenu",Ee)}},[]),Et.useEffect(()=>{if(!pt)return;const ce=fi(G);dc(ce)},[fe,pt]),Et.useEffect(()=>{ka.current&&(ka.current.setAttribute("webkitdirectory","true"),ka.current.setAttribute("directory","true"))},[]),Et.useEffect(()=>(window.loadDicomStackFromWadouriList=async ce=>{if(!ce||ce.length===0)return;let Ee;try{const Ce=ce[0];if(Ce&&Ce.startsWith("wadouri:")){const pe=Ce.slice(8),be=await(await fetch(pe)).arrayBuffer();Ee=Wr.parseDicom(new Uint8Array(be)).string("x0020000d")}}catch{}te(Ce=>{const pe=[...Ce,{imageIds:ce,studyInstanceUID:Ee}];return Me(ge=>{const be=[...ge];return be[0]=ce,be}),B(ge=>{const be=[...ge];return be[0]=pe.length-1,be}),Rt(ce),pe})},()=>{window.loadDicomStackFromWadouriList=void 0}),[te,Me,B,Rt]),Et.useEffect(()=>{!Mi||!de.every(Ee=>!Ee||Ee.length===0||Ee.every(Ce=>!!vt("imagePlaneModule",Ce)))||Me(Ee=>{let Ce=!1;const pe=Ee.map(ge=>{if(!ge||ge.length===0)return ge;const ze=[...ge.map(Ve=>({imageId:Ve,sliceLoc:(()=>{const $e=vt("imagePlaneModule",Ve);return $e&&$e.sliceLocation!==void 0?Number($e.sliceLocation):null})()}))].sort((Ve,$e)=>Ve.sliceLoc!==null&&$e.sliceLoc!==null?Ve.sliceLoc-$e.sliceLoc:Ve.imageId.localeCompare($e.imageId)).map(Ve=>Ve.imageId);return JSON.stringify(ze)!==JSON.stringify(ge)?(Ce=!0,ze):ge});return Ce&&Oe(!0),pe})},[Mi,X]);function dc(ce){if(!ce)return;const Ee=`CT_${fe}`;pt?(ce.setToolEnabled(hd.toolName),ce.setToolConfiguration(hd.toolName,{sourceViewportId:Ee})):ce.setToolDisabled(hd.toolName)}function tl(){var Ee,Ce,pe;const ce=R.current;if(ce)for(let ge=0;ge=pe.length||ce>=Ee)return alert("Invalid truncation bounds."),!1;const ge=pe.slice(ce,Ee+1);te([{...Ce,imageIds:ge}]),Me([ge]),B([0]);const be=R.current;if(be){const Ve=be.getViewport("CT_0");Ve&&typeof Ve.setStack=="function"&&(Ve.setStack(ge),(ke=Ve.setImageIdIndex)==null||ke.call(Ve,0),(ze=Ve.render)==null||ze.call(Ve))}return!0}function po(ce=0){const Ee=R.current;if(!Ee)return null;const Ce=Ee.getViewport(`CT_${ce}`);return!Ce||typeof Ce.getCurrentImageIdIndex!="function"?null:Ce.getCurrentImageIdIndex()}Et.useEffect(()=>{const ce=t||"default";function Ee(pe,ge){const be=R.current;if(!be)return;const ke=be.getViewport(`CT_${pe}`);if(!ke||typeof ke.getImageIds!="function")return;const Ve=ke.getImageIds().map(wt=>wt.replace(/^wadouri:/,"")),$e=ge.replace(/^wadouri:/,""),St=Ve.indexOf($e);St!==-1&&typeof ke.setImageIdIndex=="function"&&(hs(ke.element,{imageIndex:St}),cr(pe,ke))}window[`getViewport_${ce}`]=pe=>{const ge=R.current;if(ge)return ge.getViewport(`CT_${pe}`)},window[`getAllViewports_${ce}`]=()=>{const pe=R.current;return pe?Array.from({length:A},(ge,be)=>pe.getViewport(`CT_${be}`)).filter(Boolean):[]},window[`jumpToSliceByImageId_${ce}`]=Ee,window[`resetViewer_${ce}`]=tl,window[`truncateStack_${ce}`]=nl,window[`getCurrentStackPosition_${ce}`]=po,window[`loadAdditionalStack_${ce}`]=async(pe,ge)=>{var ke;if(!Array.isArray(pe)||pe.length===0)return;let be=ge;if(!be&&((ke=pe[0])!=null&&ke.startsWith("wadouri:")))try{const ze=pe[0].slice(8),$e=await(await fetch(ze)).arrayBuffer();be=Wr.parseDicom(new Uint8Array($e)).string("x0020000d")}catch{}te(ze=>[...ze,{imageIds:pe,studyInstanceUID:be}]),Me(ze=>{const Ve=[...ze],$e=Ve.findIndex(St=>!St||St.length===0);return $e!==-1&&(Ve[$e]=pe),Ve}),Rt(pe)},window[`exportViewerState_${ce}`]=()=>{var Dt;const pe=ut.rows*ut.cols,ge=bt.slice(0,pe),be=_e.slice(0,pe),ke=X.map(Jt=>({i:Jt.imageIds,u:Jt.studyInstanceUID}));console.log("Exporting viewer state with",pe,"active viewports"),console.log("modes",ge);const ze=R.current,Ve=[],$e=[],St=[],wt=[],Tt=[];for(let Jt=0;Jt{try{N.current=!0;const ge=typeof pe=="string"?JSON.parse(pe):pe;if(ge.grid&&Wt(ge.grid),ge.modes&&Rn(ge.modes),ge.stacks&&te(ge.stacks.map(Ve=>({imageIds:Ve.i,studyInstanceUID:Ve.u}))),ge.stackIdx&&ge.stacks){const Ve=ge.stackIdx.map($e=>{var St;return((St=ge.stacks[$e])==null?void 0:St.i)||[]});Me(Ve),B(ge.stackIdx)}const be=30;let ke=0;async function ze(){var Tt,jt,Dt,Jt,En,Gn,dr,Pr,Ki,Po,Ur;const Ve=R.current;if(!Ve){N.current=!1;return}const $e=((Tt=ge.grid)==null?void 0:Tt.rows)*((jt=ge.grid)==null?void 0:jt.cols)||1;let St=!0;for(let an=0;an<$e;an++){console.log("Checking viewport",an);const Ln=Ve.getViewport(`CT_${an}`);if(!Ln){St=!1;break}const Ro=(Dt=ge.stackIdx)==null?void 0:Dt[an],Nt=(Jt=ge.stacks)==null?void 0:Jt[Ro],er=(Nt==null?void 0:Nt.i)||[];if(er.length)try{const bn=((En=Ln.getImageIds)==null?void 0:En.call(Ln))||[];if(bn.length!==er.length||!bn.every((Er,Rr)=>Er===er[Rr])){console.warn(`Viewport ${an}: importedImageIds do not match viewportImageIds`,{importedImageIds:er,viewportImageIds:bn}),St=!1;break}}catch{St=!1}}if(!St&&ke{ze()},500);return}for(let an=0;an<$e;an++){console.log("Setting stack/volume for viewport",an);const Ln=Ve.getViewport(`CT_${an}`);if(!Ln)continue;const Ro=(Gn=ge.stackIdx)==null?void 0:Gn[an],Nt=(dr=ge.stacks)==null?void 0:dr[Ro],er=(Nt==null?void 0:Nt.i)||[];if(er.length)if(console.log("mode",(Pr=ge.modes)==null?void 0:Pr[an]),((Ki=ge.modes)==null?void 0:Ki[an])==="volume"){try{const bn=`myVolumeId_${an}`;(await h1(bn,{imageIds:er})).load(),Ln.setVolumes([{volumeId:bn}]),Ln.render()}catch(bn){console.warn("Failed to create/load volume for viewport",an,bn)}if(ge.orientations&&ge.orientations[an]&&typeof Ln.setOrientation=="function")try{Ln.setOrientation(ge.orientations[an]),Ln.render()}catch{}ge.volumeSliceIndices&&setTimeout(()=>{try{hs(Ln.element,{imageIndex:ge.volumeSliceIndices[an]})}catch{}},100)}else{try{Ln.setStack&&(Ln.setStack(er),Ln.render())}catch(bn){console.warn("Failed to set stack for viewport",an,bn)}if(ge.stackPos&&typeof ge.stackPos[an]=="number"&&typeof Ln.setImageIdIndex=="function")try{Vn&&hs?hs(Ln.element,{imageIndex:ge.stackPos[an]}):Ln.setImageIdIndex(ge.stackPos[an])}catch{}}}const wt=1500;console.log(`Waiting ${wt}ms before applying properties/camera to viewports`),await new Promise(an=>setTimeout(an,wt));for(let an=0;an<$e;an++){console.log("Applying props/camera for viewport",an);const Ln=Ve.getViewport(`CT_${an}`);if(!Ln)continue;const Ro=(Po=ge.stackIdx)==null?void 0:Po[an],Nt=(Ur=ge.stacks)==null?void 0:Ur[Ro];if(((Nt==null?void 0:Nt.i)||[]).length){if(ge.props&&ge.props[an]&&typeof Ln.setProperties=="function"){console.log("Restoring properties for viewport",an,ge.props[an]);const bn={...ge.props[an]};if(bn.colormap!==void 0&&bn.colormap!==null){const Er=bn.colormap;if(typeof Er!="string")if(typeof Er=="object"){const Rr={};typeof Er.name=="string"&&(Rr.name=Er.name),Er.opacity!==void 0&&typeof Er.opacity=="number"&&(Rr.opacity=Er.opacity),Object.keys(Rr).length===0?delete bn.colormap:bn.colormap=Rr}else delete bn.colormap}try{Ln.setProperties(bn),Ln.render()}catch(Er){console.warn("viewport.setProperties failed, retrying without colormap",Er);try{const Rr={...bn};delete Rr.colormap,Ln.setProperties(Rr),Ln.render()}catch(Rr){console.error("Retrying viewport.setProperties without colormap also failed",Rr)}}}if(ge.cam&&ge.cam[an]&&typeof Ln.setCamera=="function")try{Ln.setCamera(ge.cam[an]),Ln.render()}catch{}}}N.current=!1}setTimeout(()=>{ze()},100)}catch(ge){N.current=!1,alert("Failed to import viewer state: "+ge)}},window[`exportAnnotations_${ce}`]=()=>{try{let pe=Zr.getAllAnnotations();if(console.log("Exporting annotations:",pe),Array.isArray(pe)){const ge=[sf.toolName,Rh.toolName,cf.toolName,$l.toolName,Rd.toolName,af.toolName,Hc.toolName,jl.toolName,Oh.toolName];pe=pe.filter(be=>ge.includes(be.metadata.toolName))}else return"{}";return JSON.stringify(pe,null,2)}catch(pe){return alert("Failed to export annotations: "+pe),"{}"}},window.__pendingImportAnnotations=window.__pendingImportAnnotations||{};const Ce=pe=>{try{const ge=window.__pendingImportAnnotations&&window.__pendingImportAnnotations[pe];if(!ge||!ge.length)return;const be=Zr;if(!be||typeof be.addAnnotation!="function")return;for(;(window.__pendingImportAnnotations[pe]||[]).length;){const ke=(window.__pendingImportAnnotations[pe]||[]).shift();ke&&Array.isArray(ke)&&ke.forEach(ze=>{try{be.addAnnotation(ze,ze.annotationUID)}catch(Ve){console.error("Failed to add queued annotation",Ve,ze)}})}R.current&&R.current.render()}catch(ge){console.error("Error flushing pending annotations:",ge)}};return window[`importAnnotations_${ce}`]=pe=>{try{const ge=typeof pe=="string"?JSON.parse(pe):pe,be=Zr;if(!be||typeof be.addAnnotation!="function"){window.__pendingImportAnnotations[ce]=window.__pendingImportAnnotations[ce]||[],window.__pendingImportAnnotations[ce].push(ge),console.warn("importAnnotations: annotation state not ready, queued import",ce),setTimeout(()=>Ce(ce),500);return}if(be.removeAllAnnotations)try{be.removeAllAnnotations()}catch(ke){console.warn("removeAllAnnotations failed",ke)}Array.isArray(ge)&&ge.forEach(ke=>{try{be.addAnnotation(ke,ke.annotationUID)}catch(ze){console.error("Failed to add annotation",ze,ke)}}),R.current&&R.current.render()}catch(ge){console.error("Failed to import annotations:",ge,{apiKey:ce,cornerstoneTools:!!mz,renderingEngine:!!R.current});try{alert("Failed to import annotations: "+ge)}catch{}}try{Ce(ce)}catch{}},window[`importLegacyAnnotations_${ce}`]=pe=>{Zr.removeAllAnnotations&&Zr.removeAllAnnotations();let ge;try{ge=typeof pe=="string"?JSON.parse(pe):pe}catch{alert("Invalid legacy annotation JSON");return}const be={ArrowAnnotate:"ArrowAnnotate"};Object.entries(ge).forEach(([ke,ze])=>{console.log("Importing legacy annotations for imageId:",ke),Object.entries(ze).forEach(([Ve,$e])=>{const St=be[Ve]||Ve;$e.data&&Array.isArray($e.data)&&$e.data.forEach(wt=>{const Tt=G7(ke,{x:wt.handles.start.y,y:wt.handles.start.x}),jt=G7(ke,{x:wt.handles.end.y,y:wt.handles.end.x});console.log("Importing legacy annotation:"),console.log(" Image ID:",ke),console.log(" Start World:",Tt),console.log(" End World:",jt);const Dt=vt("imagePlaneModule",ke);console.log(M4);let Jt=vt("frameOfReferenceUID",ke);!Jt&&Dt&&Dt.frameOfReferenceUID&&(Jt=Dt.frameOfReferenceUID);const En=Dt!=null&&Dt.rowCosines&&(Dt!=null&&Dt.columnCosines)?[Dt.rowCosines[1]*Dt.columnCosines[2]-Dt.rowCosines[2]*Dt.columnCosines[1],Dt.rowCosines[2]*Dt.columnCosines[0]-Dt.rowCosines[0]*Dt.columnCosines[2],Dt.rowCosines[0]*Dt.columnCosines[1]-Dt.rowCosines[1]*Dt.columnCosines[0]]:void 0;Array.isArray(En)&&En.length,typeof wt.rotation=="number"&&wt.rotation;const Gn={annotationUID:wt.uuid,metadata:{toolName:St,referencedImageId:ke,FrameOfReferenceUID:Jt,viewPlaneNormal:En},data:{handles:{points:[Tt,jt],textBox:wt.handles.textBox},text:wt.text||""},visibility:wt.visible!==!1,active:wt.active||!1};Zr.addAnnotation(Gn,Gn.annotationUID)})})}),R.current&&R.current.render()},window[`importLegacyViewport_${ce}`]=pe=>{let ge;try{ge=typeof pe=="string"?JSON.parse(pe):pe}catch{alert("Invalid legacy viewport JSON");return}const be=R.current;if(!be)return;const ke=`CT_${fe??0}`,ze=be.getViewport(ke);if(!ze)return;const Ve={};if(ge.voi&&(Ve.voiRange={lower:ge.voi.windowCenter-ge.voi.windowWidth/2,upper:ge.voi.windowCenter+ge.voi.windowWidth/2}),typeof ge.invert=="boolean"&&(Ve.invert=ge.invert),typeof ge.pixelReplication=="boolean"&&(Ve.interpolationType=ge.pixelReplication?0:1),typeof ge.hflip=="boolean"&&(Ve.hflip=ge.hflip),typeof ge.vflip=="boolean"&&(Ve.vflip=ge.vflip),typeof ze.setProperties=="function"&&ze.setProperties(Ve),ge.translation||ge.scale){const $e=ze.getCamera?ze.getCamera():{};ge.translation&&($e.translation={...$e.translation,...ge.translation}),ge.scale&&($e.parallelScale=200/ge.scale),console.log("Applying legacy camera properties:",$e),typeof ze.setCamera=="function"&&ze.setCamera($e)}typeof ge.rotation=="number"&&ze.setRotation(ge.rotation),ze.render(),cr(fe??0,ze)},()=>{window[`exportViewerState_${ce}`]=void 0,window[`importViewerState_${ce}`]=void 0,window[`exportAnnotations_${ce}`]=void 0,window[`importAnnotations_${ce}`]=void 0,window[`importLegacyAnnotations_${ce}`]=void 0,window[`importLegacyViewport_${ce}`]=void 0,window[`jumpToSliceByImageId_${ce}`]=void 0,window[`resetViewer_${ce}`]=void 0,window[`truncateStack_${ce}`]=void 0,window[`getCurrentStackPosition_${ce}`]=void 0,window[`loadAdditionalStack_${ce}`]=void 0,window[`getViewport_${ce}`]=void 0,window[`getAllViewports_${ce}`]=void 0}},[ut,bt,_e,X,de,Wt,Rn,B,te,Me,te,Me,Rt]),Et.useEffect(()=>{const ce=a.current;if(!ce)return;function Ee(Ce){if(console.log("Handling arrow key navigation",Ce.key),console.log("activeViewport",fe),fe===null)return;const pe=R.current;if(!pe)return;const ge=pe.getViewport(`CT_${fe}`);if(ge){if(console.log(ge),bt[fe]==="stack"){if(typeof ge.getCurrentImageIdIndex!="function"||typeof ge.setImageIdIndex!="function")return;const be=de[fe];if(!be||be.length===0)return;Ce.key==="ArrowUp"||Ce.key==="ArrowRight"?(Qs(ge,{delta:-1}),Ce.preventDefault()):(Ce.key==="ArrowDown"||Ce.key==="ArrowLeft")&&(Qs(ge,{delta:1}),Ce.preventDefault())}bt[fe]==="volume"&&typeof ge.getSliceIndex=="function"&&typeof ge.getNumberOfSlices=="function"&&ge.getNumberOfSlices()>1&&(Ce.key==="ArrowUp"||Ce.key==="ArrowRight"?(Qs(ge,{delta:-1}),Ce.preventDefault()):(Ce.key==="ArrowDown"||Ce.key==="ArrowLeft")&&(Qs(ge,{delta:1}),Ce.preventDefault()))}}return ce.addEventListener("keydown",Ee),()=>{ce.removeEventListener("keydown",Ee)}},[fe,bt,de,cr]);const mo=fe!==null?_e[fe]:0,Li=X[mo];Li==null||Li.studyInstanceUID;const[Si,Ms]=Et.useState(()=>Array(A).fill(null)),ma=ut.rows*ut.cols,va=[];for(let ce=0;ceMn.current[ce]=Ce,style:{flex:1,border:Ee?"1px solid #222":"none",background:"#000",minWidth:0,minHeight:0,position:"relative",overflow:"hidden",flexDirection:"column",gridRow:Math.floor(ce/ut.cols)+1,gridColumn:ce%ut.cols+1,height:"100%",boxShadow:fe===ce?"0 0 0 4px #1976d2, 0 0 16px 4px #1976d2cc":void 0,zIndex:fe===ce?10:1},onClick:()=>{le(ce),Bn(!1)},onDoubleClick:()=>Zo(ce),onDragOver:Ce=>{Ce.preventDefault(),Ce.dataTransfer.dropEffect="copy"},onDrop:Ce=>{Ce.preventDefault();const pe=Ce.dataTransfer.getData("text/stack-idx"),ge=parseInt(pe,10);isNaN(ge)||ve(ce,ge)},children:[Ke.jsx("button",{style:{position:"absolute",top:8,left:8,zIndex:20,background:"#333",color:"#fff",border:"none",borderRadius:"4px",padding:"4px 8px",cursor:"pointer",fontSize:"12px",opacity:.85},onClick:()=>{Rn(Ce=>{const pe=[...Ce];return pe[ce]=Ce[ce]==="stack"?"volume":"stack",pe})},children:bt[ce]==="stack"?"Volume":"Stack"}),bt[ce]==="volume"&&Ke.jsxs("div",{style:{position:"absolute",top:8,left:70,zIndex:21,display:"flex",gap:"6px",background:"rgba(34,34,34,0.85)",borderRadius:"4px",padding:"2px 6px",alignItems:"center"},children:[Ke.jsx("button",{style:{background:"#444",color:"#fff",border:"none",borderRadius:"3px",padding:"2px 8px",cursor:"pointer",fontSize:"12px",marginRight:"2px"},onClick:()=>{const Ce=R.current,pe=Ce==null?void 0:Ce.getViewport(`CT_${ce}`);pe&&pe.setOrientation&&(pe.setOrientation("axial"),pe.render())},children:"Axial"}),Ke.jsx("button",{style:{background:"#444",color:"#fff",border:"none",borderRadius:"3px",padding:"2px 8px",cursor:"pointer",fontSize:"12px",marginRight:"2px"},onClick:()=>{const Ce=R.current,pe=Ce==null?void 0:Ce.getViewport(`CT_${ce}`);pe&&pe.setOrientation&&(pe.setOrientation("sagittal"),pe.render())},children:"Sagittal"}),Ke.jsx("button",{style:{background:"#444",color:"#fff",border:"none",borderRadius:"3px",padding:"2px 8px",cursor:"pointer",fontSize:"12px"},onClick:()=>{const Ce=R.current,pe=Ce==null?void 0:Ce.getViewport(`CT_${ce}`);pe&&pe.setOrientation&&(pe.setOrientation("coronal"),pe.render())},children:"Coronal"})]}),Ke.jsxs("button",{style:{position:"absolute",top:40,left:8,zIndex:20,background:"#111",color:"#fff",border:"none",borderRadius:"4px",padding:"4px 8px",cursor:"pointer",fontSize:"13px",opacity:.85,marginTop:"4px",display:"flex",alignItems:"center",gap:"6px"},title:"Toggle Fullscreen",onClick:Ce=>{Ce.stopPropagation();const pe=Mn.current[ce];document.fullscreenElement===pe?document.exitFullscreen():pe!=null&&pe.requestFullscreen?pe.requestFullscreen():pe!=null&&pe.webkitRequestFullscreen?pe.webkitRequestFullscreen():pe!=null&&pe.msRequestFullscreen&&pe.msRequestFullscreen()},onMouseEnter:()=>I(ce),onMouseLeave:()=>I(null),children:[Ke.jsx("span",{style:{fontSize:"18px",lineHeight:1},children:"⛶"}),D===ce&&Ke.jsx("span",{style:{marginLeft:6},children:document.fullscreenElement===Mn.current[ce]?"Exit Fullscreen":"Fullscreen"})]}),bt[ce]==="stack"&&F&&(()=>{var wt;const Ce=de[ce],ge=(Zr.getAllAnnotations()||[]).filter(Tt=>Tt.metadata&&Tt.metadata.referencedImageId&&Ce.includes(Tt.metadata.referencedImageId)&&Tt.metadata.toolName!==Wa.toolName);if(!ge.length)return null;const be=R.current,ke=be==null?void 0:be.getViewport(`CT_${ce}`),ze=((wt=ke==null?void 0:ke.getCurrentImageIdIndex)==null?void 0:wt.call(ke))??0,Ve=Ce[ze],$e=ge.filter(Tt=>Tt.metadata.referencedImageId===Ve),St=Si[ce];return Ke.jsxs("div",{style:{position:"absolute",left:"50%",bottom:60,transform:"translateX(-50%)",zIndex:30,display:"flex",gap:4,pointerEvents:"auto",alignItems:"center"},children:[Ke.jsx("button",{style:{background:"rgba(30,30,30,0.7)",color:"#fff",border:"none",borderRadius:"50%",width:28,height:28,fontSize:"16px",fontWeight:"bold",cursor:"pointer",opacity:.7,display:"flex",alignItems:"center",justifyContent:"center",boxShadow:"0 1px 4px rgba(0,0,0,0.18)",transition:"opacity 0.2s"},title:"Previous Annotation","aria-label":"Previous Annotation",onClick:()=>{const Tt=R.current,jt=Tt==null?void 0:Tt.getViewport(`CT_${ce}`);if(!jt||typeof jt.getCurrentImageIdIndex!="function")return;const Dt=jt.getCurrentImageIdIndex(),Jt=j7(Dt,Ce,ge,-1);if(Jt!==null&&typeof jt.setImageIdIndex=="function"){hs(jt.element,{imageIndex:Jt}),cr(ce,jt);const En=Ce[Jt],Gn=ge.filter(dr=>dr.metadata.referencedImageId===En);Xr(ce,Gn.length>0?Gn[0].annotationUID:null)}},children:Ke.jsx("span",{"aria-hidden":"true",children:"◀"})}),Ke.jsx("button",{style:{background:"rgba(30,30,30,0.7)",color:"#fff",border:"none",borderRadius:"50%",width:28,height:28,fontSize:"16px",fontWeight:"bold",cursor:"pointer",opacity:.7,display:"flex",alignItems:"center",justifyContent:"center",boxShadow:"0 1px 4px rgba(0,0,0,0.18)",transition:"opacity 0.2s"},title:"Next Annotation","aria-label":"Next Annotation",onClick:()=>{const Tt=R.current,jt=Tt==null?void 0:Tt.getViewport(`CT_${ce}`);if(!jt||typeof jt.getCurrentImageIdIndex!="function")return;const Dt=jt.getCurrentImageIdIndex(),Jt=j7(Dt,Ce,ge,1);if(Jt!==null&&typeof jt.setImageIdIndex=="function"){hs(jt.element,{imageIndex:Jt}),cr(ce,jt);const En=Ce[Jt],Gn=ge.filter(dr=>dr.metadata.referencedImageId===En);Xr(ce,Gn.length>0?Gn[0].annotationUID:null)}},children:Ke.jsx("span",{"aria-hidden":"true",children:"▶"})}),$e.length>0&&Ke.jsx("div",{style:{display:"flex",gap:2,alignItems:"center"},children:$e.map(Tt=>Ke.jsxs("div",{style:{display:"flex",alignItems:"center",background:St===Tt.annotationUID?"rgb(4, 225, 0)":"#444",color:St===Tt.annotationUID?"#222":"#fff",borderRadius:"4px",padding:"2px 6px",marginRight:2,cursor:"pointer",border:St===Tt.annotationUID?"2px solid #1976d2":"none",fontWeight:St===Tt.annotationUID?"bold":"normal"},onClick:()=>Xr(ce,Tt.annotationUID),children:[Ke.jsxs("span",{style:{marginRight:4},title:Tt.metadata.toolName||"Annotation",children:[St===Tt.annotationUID?"★ ":"",Ke.jsx("span",{style:{fontSize:14,lineHeight:1},children:KEe(Tt.metadata.toolName)})]}),Ke.jsx("button",{style:{background:"transparent",color:"#f44336",border:"1px solid #f44336",borderRadius:3,width:16,height:16,fontSize:10,lineHeight:1,cursor:"pointer",marginLeft:4,display:"flex",alignItems:"center",justifyContent:"center",opacity:.95,padding:0},title:"Delete this annotation","aria-label":"Delete annotation",onClick:jt=>{jt.stopPropagation(),bs(ce,Tt.annotationUID,$e)},children:Ke.jsx("span",{"aria-hidden":"true",children:"✖"})})]},Tt.annotationUID))})]})})(),Ke.jsx("div",{style:{position:"absolute",left:8,bottom:8,background:"rgba(0,0,0,0.7)",color:"#fff",padding:"6px 12px",borderRadius:"4px",fontSize:"14px",zIndex:10,pointerEvents:"none",minWidth:"120px",userSelect:"none"},children:bt[ce]==="stack"?Ke.jsxs(Ke.Fragment,{children:[Ke.jsxs("div",{children:["Image: ",(Mr=un[ce])==null?void 0:Mr.index," / ",(Ps=un[ce])==null?void 0:Ps.total]}),Ke.jsxs("div",{children:["WC: ",(Ai=un[ce])==null?void 0:Ai.windowCenter,"   WW: ",(oi=un[ce])==null?void 0:oi.windowWidth]})]}):Ke.jsxs("div",{children:["Slice: ",(os=un[ce])==null?void 0:os.index," / ",(Qo=un[ce])==null?void 0:Qo.total,((Ni=un[ce])==null?void 0:Ni.slicePosition)&&Ke.jsxs("span",{children:["   (",(ya=un[ce])==null?void 0:ya.slicePosition,")"]}),Ke.jsx("br",{}),"WC: ",(Rs=un[ce])==null?void 0:Rs.windowCenter,"   WW: ",(Ls=un[ce])==null?void 0:Ls.windowWidth]})}),Ke.jsx("div",{style:{position:"absolute",right:8,bottom:8,zIndex:110,pointerEvents:"auto"},children:Ke.jsxs("div",{className:"preset-menu",style:{background:"rgba(0,0,0,0.7)",color:"#fff",borderRadius:"4px",fontSize:"14px",minWidth:"120px",overflow:"hidden",cursor:"pointer",position:"relative",boxShadow:fn[ce]?"0 2px 8px rgba(0,0,0,0.3)":void 0,pointerEvents:"auto"},onClick:Ce=>Ce.stopPropagation(),children:[Ke.jsxs("div",{style:{padding:"6px 12px",fontWeight:"bold",userSelect:"none"},onClick:Ce=>{Ce.stopPropagation(),rn(pe=>{const ge=[...pe];return ge[ce]=!ge[ce],ge})},children:["Presets",Ke.jsx("span",{style:{float:"right",fontWeight:"normal"},children:fn[ce]?"▲":"▼"})]}),fn[ce]&&Ke.jsxs("div",{className:"preset-menu-content",style:{background:"rgba(0,0,0,0.95)",borderRadius:"0 0 4px 4px",padding:"6px 0 6px 0",display:"flex",flexDirection:"column",zIndex:111,pointerEvents:"auto"},onClick:Ce=>Ce.stopPropagation(),children:[Ke.jsx("button",{style:{display:"block",width:"100%",margin:"2px 0 8px 0",background:"#444",color:"#fff",border:"none",borderRadius:"3px",cursor:"pointer",padding:"6px 0",fontSize:"13px",fontWeight:"600"},onClick:Ce=>{Ce.stopPropagation();try{const pe=`CT_${ce}`,ge=R.current,be=ge==null?void 0:ge.getViewport(pe);be&&(typeof be.resetProperties=="function"&&be.resetProperties(),typeof be.resetCamera=="function"&&be.resetCamera(),typeof be.render=="function"&&be.render(),cr(ce,be))}catch(pe){console.warn("Failed to reset viewport properties",pe)}rn(pe=>{const ge=[...pe];return ge[ce]=!1,ge})},children:"Reset to default"}),HEe.map(Ce=>Ke.jsx("button",{style:{display:"block",width:"100%",margin:"2px 0",background:"#333",color:"#fff",border:"none",borderRadius:"3px",cursor:"pointer",padding:"4px 0",fontSize:"13px",opacity:.9},onClick:pe=>{pe.stopPropagation(),el(ce,Ce.center,Ce.width),rn(ge=>{const be=[...ge];return be[ce]=!1,be})},children:Ce.name},Ce.name))]})]})}),bt[ce]==="stack"&&de[ce]&&Ke.jsx("div",{style:{position:"absolute",top:"10%",right:8,width:"12px",height:"80%",maxHeight:"100%",minHeight:0,zIndex:30,display:de[ce].length>0?"flex":"none",alignItems:"flex-start",justifyContent:"center",pointerEvents:"none",flexDirection:"column",padding:0},children:Ke.jsx("div",{style:{width:"8px",height:"100%",maxHeight:"100%",minHeight:0,borderRadius:"6px",background:"#222",position:"relative",display:"flex",flexDirection:"column",justifyContent:"flex-start",boxShadow:"0 0 8px #2196f3cc",overflow:"hidden"},children:de[ce].map((Ce,pe)=>{const ge=!!vt("imagePlaneModule",Ce),be=R.current;let ke=-1;if(be&&typeof be.getViewport=="function"){const Ve=be.getViewport(`CT_${ce}`);Ve&&typeof Ve.getCurrentImageIdIndex=="function"&&(ke=Ve.getCurrentImageIdIndex())}const ze=pe===ke;return Ke.jsx("div",{style:{width:"100%",height:`${100/de[ce].length}%`,background:ze?"linear-gradient(to right, #ffeb3b 60%, #ff9800 100%)":ge?"linear-gradient(to right, #4caf50 60%, #2196f3 100%)":"#444",opacity:ge?.95:.4,transition:"background 0.3s, opacity 0.3s",borderBottom:pe{const Ve=R.current,$e=Ve==null?void 0:Ve.getViewport(`CT_${ce}`);$e&&typeof $e.setImageIdIndex=="function"&&bt[ce]==="stack"&&(hs($e.element,{imageIndex:pe}),cr(ce,$e))}},Ce)})})}),bt[ce]==="volume"&&(()=>{const Ce=R.current,pe=Ce==null?void 0:Ce.getViewport(`CT_${ce}`);let ge=0,be=0;return pe&&typeof pe.getNumberOfSlices=="function"&&typeof pe.getSliceIndex=="function"&&(ge=pe.getNumberOfSlices(),be=pe.getSliceIndex()),ge>1?Ke.jsx("div",{style:{position:"absolute",top:"10%",right:8,width:"12px",height:"80%",maxHeight:"100%",minHeight:0,zIndex:30,display:"flex",alignItems:"flex-start",justifyContent:"center",pointerEvents:"auto",flexDirection:"column",padding:0},children:Ke.jsx("div",{style:{width:"8px",height:"100%",maxHeight:"100%",minHeight:0,borderRadius:"6px",background:"#222",position:"relative",display:"flex",flexDirection:"column",justifyContent:"flex-start",boxShadow:"0 0 8px #2196f3cc",overflow:"hidden",cursor:"pointer"},onClick:ke=>{const Ve=ke.currentTarget.getBoundingClientRect(),$e=ke.clientY-Ve.top,St=Math.floor($e/Ve.height*ge),wt=R.current,Tt=wt==null?void 0:wt.getViewport(`CT_${ce}`);Tt&&(hs(Tt.element,{imageIndex:St}),Tt.render(),cr(ce,Tt))},children:Array.from({length:ge}).map((ke,ze)=>{const Ve=ze===be;return Ke.jsx("div",{style:{width:"100%",height:`${100/ge}%`,minHeight:Ve?1:0,background:Ve?"linear-gradient(to right, #ffeb3b 60%, #ff9800 100%)":"#444",opacity:Ve?.95:.4,transition:"background 0.3s, opacity 0.3s",borderBottom:ze1||!de[ce]||de[ce].length===0)&&Ke.jsx("div",{style:{position:"absolute",left:0,right:0,bottom:8,zIndex:20,display:"flex",alignItems:"center",justifyContent:"center",pointerEvents:"auto",width:"100%",background:"none",borderRadius:"0",padding:0},children:Ke.jsxs("div",{style:{position:"relative"},children:[Ke.jsxs("button",{onClick:Ce=>{Ce.stopPropagation(),O(pe=>pe===ce?null:ce)},style:{padding:"6px 12px",background:"#333",color:"#fff",border:"1px solid #444",borderRadius:"4px",cursor:"pointer",pointerEvents:"auto",fontSize:13},title:"Choose stack",children:[(()=>{const Ce=Array.isArray(_e)?_e[ce]:void 0,pe=typeof Ce=="number"&&X[Ce]?X[Ce]:void 0,ge=pe&&Array.isArray(pe.imageIds)?pe.imageIds:[],be=pe?pe.name||(pe.caseId?`Case: ${pe.caseId}`:void 0):void 0;if(be)return be;if(ge.length>0)return`Stack ${typeof Ce=="number"?Ce+1:"1"}`;const ke=de[ce]||[];return ke.length>0?`Stack (${ke.length} images)`:"No stack"})(),Ke.jsx("span",{style:{marginLeft:8,opacity:.8},children:P===ce?"▲":"▼"})]}),P===ce&&Ke.jsx("div",{ref:Ce=>{Ce&&Ce.focus()},tabIndex:0,style:{position:"absolute",left:0,bottom:"110%",background:"#222",border:"1px solid #444",borderRadius:"4px",boxShadow:"0 2px 8px rgba(0,0,0,0.3)",zIndex:100,minWidth:220,maxHeight:260,overflowY:"auto",overscrollBehavior:"contain",scrollbarWidth:"thin",padding:6},role:"listbox",onMouseDown:Ce=>Ce.stopPropagation(),onWheel:Ce=>{var ge;try{Ce.stopPropagation()}catch{}try{Ce.preventDefault()}catch{}const pe=Ce.currentTarget;if(pe){const be=Ce.deltaY??((ge=Ce.nativeEvent)==null?void 0:ge.deltaY)??0;pe.scrollTop+=be}},onBlur:Ce=>{setTimeout(()=>{Ce.currentTarget.contains(document.activeElement)||O(null)},0)},children:(()=>{const Ce={};return X.forEach((pe,ge)=>{const be=pe.studyId||pe.studyInstanceUID||"Unspecified";Ce[be]||(Ce[be]=[]),Ce[be].push({idx:ge,stack:pe})}),Object.keys(Ce).map(pe=>Ke.jsxs("div",{style:{marginBottom:6},children:[Ke.jsx("div",{style:{fontSize:12,color:"#aaa",padding:"4px 8px",fontWeight:700},children:pe==="Unspecified"?"Unspecified study":`Study: ${pe}`}),Ke.jsx("div",{children:Ce[pe].map(({idx:ge,stack:be})=>{const ke=Array.isArray(be.imageIds)?be.imageIds:[],ze=be&&(be.name||be.caseId)?be.name||`Case: ${be.caseId}`:`Stack ${ge+1}`,Ve=ke.length,$e=!Array.isArray(ke)||Ve===0;return Ke.jsxs("button",{role:"option","aria-selected":!1,title:$e?"Invalid stack descriptor":`${ze} — ${Ve} image${Ve===1?"":"s"}${be!=null&&be.caseId?` — case ${be.caseId}`:""}`,style:{display:"flex",flexDirection:"column",alignItems:"flex-start",width:"100%",padding:"8px 12px",background:"transparent",color:"#fff",border:"none",textAlign:"left",cursor:$e?"not-allowed":"pointer"},onClick:St=>{if(St.stopPropagation(),$e){console.warn(`Attempted to select invalid stack at index ${ge}`,be);return}ve(ce,ge).catch(wt=>console.error("Failed to load stack:",wt)),O(null)},children:[Ke.jsx("div",{style:{fontWeight:"600",fontSize:13},children:ze}),Ke.jsxs("div",{style:{fontSize:12,opacity:.7},children:[Ve," image",Ve===1?"":"s",be!=null&&be.caseId?` • case ${be.caseId}`:""]})]},ge)})})]},pe))})()})]})})]},ce))}return Ke.jsxs("div",{ref:a,style:{position:"relative",inset:0,width:"100%",height:"100%",boxSizing:"border-box",background:"#222",padding:"12px",overflow:"hidden"},children:[We&&Ke.jsx("div",{style:{position:"absolute",zIndex:3e3,top:0,left:0,width:"100%",height:"100%",background:"rgba(0,0,0,0.7)",color:"#fff",display:"flex",alignItems:"center",justifyContent:"center",fontSize:28,fontWeight:"bold",letterSpacing:1},children:We==="annotations"?"Loading Annotations...":"Loading Viewer State..."}),ie&&Ke.jsxs("div",{style:{position:"fixed",top:12,left:12,right:12,zIndex:1e4,background:"#fff3cd",color:"#856404",border:"1px solid #ffeeba",padding:"10px 14px",borderRadius:6,display:"flex",alignItems:"center",justifyContent:"space-between",gap:12},children:[Ke.jsxs("div",{style:{flex:1,fontSize:14},children:[Ke.jsx("strong",{children:"Graphics error:"})," The viewer encountered a WebGL/graphics error and may be unstable. Please reload the page.",xe?Ke.jsx("div",{style:{marginTop:6,fontSize:12,color:"#6b4f00"},children:xe}):null]}),Ke.jsxs("div",{style:{display:"flex",gap:8,alignItems:"center"},children:[Ke.jsx("button",{onClick:()=>window.location.reload(),style:{padding:"6px 10px"},children:"Reload"}),Ke.jsx("button",{onClick:()=>oe(!1),style:{padding:"6px 10px"},children:"Dismiss"})]})]}),Ke.jsx("div",{onMouseEnter:()=>{p||m(!0)},onMouseLeave:()=>{p||m(!1)},style:{position:"absolute",right:0,top:0,height:"100%",width:56,zIndex:2400,pointerEvents:p?"none":"auto"}}),y&&!p&&Ke.jsx("button",{onClick:()=>v(!0),onMouseEnter:()=>m(!0),onMouseLeave:()=>m(!1),"aria-pressed":!1,title:"Open stacks",style:{position:"absolute",right:14,top:"50%",transform:"translateY(-50%)",zIndex:2700,width:28,height:48,background:"#1976d2",color:"#fff",border:"none",borderRadius:6,cursor:"pointer",display:"flex",alignItems:"center",justifyContent:"center",boxShadow:"0 2px 8px rgba(0,0,0,0.3)",pointerEvents:"auto"},children:"▶"}),Ke.jsxs("div",{children:[Ke.jsx("button",{style:{position:"absolute",top:"50%",transform:"translateY(-50%)",left:Is,zIndex:200,width:E,height:E,background:"#222",color:"#fff",border:"none",borderRadius:"50%",fontWeight:"bold",cursor:"pointer",fontSize:"22px",boxShadow:"0 2px 8px rgba(0,0,0,0.2)",transition:"left 0.25s cubic-bezier(.4,2,.6,1), background 0.2s"},onClick:()=>Ds(ce=>!ce),"aria-label":"Open menu",children:"☰"}),ro&&Ke.jsx("div",{style:{position:"absolute",top:0,left:0,width:_,height:"100%",background:"#222",color:"#fff",zIndex:199,boxShadow:"2px 0 12px rgba(0,0,0,0.3)",flexDirection:"column",padding:"24px 16px 16px 16px",display:"flex",overflow:"hidden"},children:Ke.jsxs("div",{style:{flex:1,minHeight:0,overflowY:"auto",display:"flex",flexDirection:"column"},children:[Ke.jsxs("div",{style:{fontWeight:"bold",fontSize:18,marginBottom:24},children:["Menu",Ke.jsx("button",{style:{float:"right",background:"transparent",color:"#fff",border:"none",fontSize:"22px",cursor:"pointer"},onClick:()=>Ds(!1),"aria-label":"Close menu",children:"×"})]}),Ke.jsxs("div",{style:{display:"flex",gap:8,alignItems:"center",marginBottom:8},children:[Ke.jsxs("label",{style:{fontSize:13},children:[Ke.jsx("input",{type:"radio",name:"folderLoadMode",value:"add",checked:Hi==="add",onChange:()=>Na("add")})," Add (append)"]}),Ke.jsxs("label",{style:{fontSize:13},children:[Ke.jsx("input",{type:"radio",name:"folderLoadMode",value:"replace",checked:Hi==="replace",onChange:()=>Na("replace")})," Replace all"]})]}),Ke.jsx("button",{style:{padding:"10px 18px",background:"#333",color:"#fff",border:"none",borderRadius:"4px",fontWeight:"bold",cursor:"pointer",fontSize:"15px",marginBottom:"18px",width:"100%"},onClick:Mo,children:"Load DICOM Folder"}),Ke.jsx("input",{ref:io,type:"file",style:{display:"none"},multiple:!0,onChange:Yr}),Ke.jsx("input",{ref:ka,type:"file",style:{display:"none"},multiple:!0,onChange:Yr,accept:".dcm,application/dicom"}),Ke.jsxs("div",{style:{marginBottom:"18px",display:"flex",alignItems:"center",gap:"8px"},children:[Ke.jsx("input",{type:"checkbox",id:"orderBySliceLocation",checked:Mi,onChange:ce=>qr(ce.target.checked),style:{accentColor:"#666"}}),Ke.jsx("label",{htmlFor:"orderBySliceLocation",style:{fontSize:"15px",cursor:"pointer"},children:"Order by Slice Location"})]}),Ke.jsx("button",{style:{padding:"10px 18px",background:"#333",color:"#fff",border:"none",borderRadius:"4px",fontWeight:"bold",cursor:"pointer",fontSize:"15px",marginBottom:"18px",width:"100%"},onClick:ho,children:"Show DICOM Metadata"}),Ke.jsxs("button",{style:{padding:"10px 18px",background:Ye?"#1976d2":"#333",color:"#fff",border:"none",borderRadius:"4px",fontWeight:"bold",cursor:"pointer",fontSize:"15px",marginBottom:"18px",width:"100%"},onClick:()=>ae(ce=>!ce),children:[Ye?"Disable":"Enable"," Cross Reference Lines"]}),Ke.jsxs("button",{style:{padding:"10px 18px",background:pt?"#1976d2":"#333",color:"#fff",border:"none",borderRadius:"4px",fontWeight:"bold",cursor:"pointer",fontSize:"15px",marginBottom:"18px",width:"100%"},onClick:()=>_t(ce=>!ce),children:[pt?"Disable":"Enable"," Reference Lines"]}),Ke.jsx("button",{onClick:lt,style:{margin:8,padding:8},children:"Sort All Viewports by Slice Location"}),Ke.jsx("button",{style:{padding:"10px 18px",background:je?"#1976d2":"#333",color:"#fff",border:"none",borderRadius:"4px",fontWeight:"bold",cursor:"pointer",fontSize:"15px",marginBottom:"18px",width:"100%"},onClick:()=>ht(ce=>!ce),children:je?"Disable Alt Key for Reference Cursors (Shift always works)":"Enable Alt Key for Reference Cursors (Shift always works)"}),Ke.jsxs("button",{style:{padding:"10px 18px",background:F?"#1976d2":"#333",color:"#fff",border:"none",borderRadius:"4px",fontWeight:"bold",cursor:"pointer",fontSize:"15px",marginBottom:"18px",width:"100%"},onClick:()=>j(ce=>!ce),children:[F?"Hide":"Show"," Annotation Navigation"]})]})})]}),Ke.jsxs("div",{className:"grid-menu-hover-container",style:{position:"absolute",top:0,left:"50%",transform:"translateX(-50%)",zIndex:100,display:"flex",flexDirection:"column",alignItems:"center",width:"auto",height:"48px",pointerEvents:"none"},children:[Ke.jsx("div",{style:{position:"absolute",top:0,left:"50%",transform:"translateX(-50%)",width:80,height:14,zIndex:1,pointerEvents:"auto",background:"transparent"},onMouseEnter:()=>oo(!0),onFocus:()=>oo(!0),tabIndex:-1}),Ke.jsx("button",{style:{position:"relative",top:Jo?"0":"-43px",opacity:Jo?1:.5,transition:"top 0.25s cubic-bezier(.4,2,.6,1), opacity 0.2s",padding:"6px 16px",background:"#222",color:"#fff",border:"none",borderRadius:"4px",fontWeight:"bold",cursor:"pointer",fontSize:"15px",marginLeft:"4px",marginRight:"8px",boxShadow:"0 2px 8px rgba(0,0,0,0.2)",pointerEvents:"auto",zIndex:2,display:"block"},title:"Toggle Fullscreen",onMouseEnter:()=>oo(!0),onMouseLeave:()=>oo(!1),onClick:()=>{const ce=a.current;ce&&(document.fullscreenElement===ce?document.exitFullscreen():ce.requestFullscreen?ce.requestFullscreen():ce.webkitRequestFullscreen?ce.webkitRequestFullscreen():ce.msRequestFullscreen&&ce.msRequestFullscreen())},children:"⛶ Fullscreen"}),Ke.jsxs("button",{className:"grid-menu-btn",style:{position:"relative",top:Jo?"0":"-43px",opacity:Jo?1:.5,transition:"top 0.25s cubic-bezier(.4,2,.6,1), opacity 0.2s",padding:"6px 16px",background:"#222",color:"#fff",border:"none",borderRadius:"4px",fontWeight:"bold",cursor:"pointer",fontSize:"15px",marginRight:"8px",boxShadow:"0 2px 8px rgba(0,0,0,0.2)",pointerEvents:"auto",zIndex:2,display:"block"},onMouseEnter:()=>oo(!0),onMouseLeave:()=>oo(!1),onBlur:()=>oo(!1),onClick:()=>Bn(ce=>!ce),tabIndex:0,children:["Grid: ",ut.rows,"x",ut.cols," ▼"]}),Qt&&Ke.jsx("div",{style:{position:"absolute",top:"110%",left:"50%",transform:"translateX(-50%)",background:"#222",color:"#fff",borderRadius:"6px",boxShadow:"0 2px 12px rgba(0,0,0,0.4)",padding:"12px",display:"grid",gridTemplateColumns:"repeat(3, 40px)",gap:"8px",zIndex:200,pointerEvents:"auto"},children:Kt.map(ce=>Ke.jsxs("button",{style:{width:"40px",height:"40px",background:ce.rows===ut.rows&&ce.cols===ut.cols?"#444":"#333",color:"#fff",border:"none",borderRadius:"4px",fontWeight:"bold",cursor:"pointer",fontSize:"15px"},onClick:()=>{Os(),Wt({rows:ce.rows,cols:ce.cols}),Bn(!1)},children:[ce.rows,"x",ce.cols]},`${ce.rows}x${ce.cols}`))})]}),Ke.jsxs("div",{style:{display:"flex",flexDirection:"row",height:"calc(100% - 48px)",gap:8},children:[Ke.jsxs("div",{style:{flex:1,display:"grid",margin:3,gridTemplateRows:`repeat(${ut.rows}, 1fr)`,gridTemplateColumns:`repeat(${ut.cols}, 1fr)`,gap:"5px",minHeight:0,minWidth:0,zIndex:1,position:"relative"},children:[va,Ke.jsx("button",{style:{position:"absolute",top:8,right:8,zIndex:2600,padding:"6px 12px",background:"#222",color:"#fff",border:"none",borderRadius:"4px",cursor:"pointer",opacity:.85,userSelect:"none"},onClick:()=>g(!0),children:"Settings"})]}),Ke.jsxs("div",{style:{width:p?w:0,transition:"width 220ms ease",display:"flex",flexDirection:"column",pointerEvents:p?"auto":"none",overflow:"hidden",position:"relative"},children:[p&&Ke.jsx("div",{onMouseDown:go,title:"Resize stacks panel",style:{position:"absolute",left:0,top:0,width:8,height:"100%",cursor:"col-resize",zIndex:2800,background:"linear-gradient(to right, rgba(100,181,246,0.25), rgba(100,181,246,0))"}}),Ke.jsx("div",{style:{pointerEvents:"auto",width:"100%",height:"100%"},children:Ke.jsxs("div",{style:{height:"100%",width:"100%",background:"#1f2428",color:"#fff",boxShadow:"0 2px 14px rgba(0,0,0,0.45)",borderLeft:"1px solid #2f3336",transform:"translateX(0)",transition:"transform 220ms ease",display:"flex",flexDirection:"column",overflow:"hidden"},children:[Ke.jsxs("div",{style:{display:"flex",alignItems:"center",justifyContent:"space-between",padding:"8px 12px",borderBottom:"1px solid #2b2f31"},children:[Ke.jsx("div",{style:{fontWeight:700},children:"Stacks"}),Ke.jsxs("div",{style:{fontSize:12,color:"#9bb4c8"},children:["Active VP: ",fe!==null?fe+1:"-"]}),Ke.jsx("div",{style:{display:"flex",gap:8,alignItems:"center"},children:Ke.jsx("button",{title:"Close",onClick:()=>{v(!1)},style:{background:"transparent",color:"#fff",border:"none",cursor:"pointer",fontSize:16},children:"×"})})]}),Ke.jsx("div",{style:{overflowY:"auto",padding:8,flex:1},children:X.length===0?Ke.jsx("div",{style:{color:"#999",padding:12},children:"No stacks available"}):Ke.jsx("div",{style:{display:"flex",flexDirection:"column",gap:6},children:X.map((ce,Ee)=>{const Ce=Array.isArray(ce.imageIds)?ce.imageIds:[],pe=ce.name||(ce.caseId?`Case: ${ce.caseId}`:`Stack ${Ee+1}`),ge=Ce.length,be=!Array.isArray(Ce)||ge===0,ke=_e.includes(Ee),ze=fe!==null&&_e[fe]===Ee,Ve=Math.floor(Ce.length/2),$e=Ce[Ve]||Ce[0],St=$e?$e.replace(/^wadouri:/,""):null;return Ke.jsxs("div",{draggable:!be,onDragStart:wt=>{be||(wt.dataTransfer.setData("text/stack-idx",String(Ee)),wt.dataTransfer.effectAllowed="copy")},onClick:()=>{if(be)return;ve(fe??0,Ee)},style:{display:"flex",alignItems:"center",justifyContent:"space-between",padding:"8px 10px",background:ze?"#0d47a1":ke?"#1976d2":"transparent",color:ke?"#fff":"#ddd",border:ze?"1px solid #64b5f6":"1px solid transparent",borderRadius:6,cursor:be?"not-allowed":"pointer"},children:[Ke.jsxs("div",{style:{display:"flex",alignItems:"center",gap:8},children:[(()=>{const wt=M[Ee],jt=(wt&&wt!=="BROKEN"?wt:null)||St||null;return jt?Ke.jsx("img",{src:jt,alt:pe,style:{width:56,height:56,objectFit:"cover",borderRadius:4,background:"#111"},onError:Dt=>{console.warn("Thumbnail failed to load for stack",Ee,jt),$(Jt=>({...Jt,[Ee]:"BROKEN"}))}}):Ke.jsx("div",{style:{width:56,height:56,borderRadius:4,background:"#111",display:"flex",alignItems:"center",justifyContent:"center",color:"#777"},children:"No Img"})})(),Ke.jsxs("div",{style:{display:"flex",flexDirection:"column"},children:[Ke.jsx("div",{style:{fontWeight:600},children:pe}),Ke.jsxs("div",{style:{fontSize:12,opacity:.7},children:[ge," img",ge===1?"":"s"]})]})]}),Ke.jsxs("div",{style:{display:"flex",flexDirection:"column",alignItems:"flex-end",gap:4},children:[Ke.jsx("div",{style:{fontSize:12,opacity:.8},children:ce.studyId||""}),ze&&Ke.jsx("div",{style:{fontSize:11,color:"#bbdefb",fontWeight:700},children:"ACTIVE"})]})]},Ee)})})})]})})]})]}),h&&Ke.jsx("div",{style:{position:"absolute",top:0,left:0,width:"100%",height:"100%",background:"rgba(0,0,0,0.4)",zIndex:1e3,display:"flex",alignItems:"center",justifyContent:"center"},onClick:()=>g(!1),children:Ke.jsxs("div",{style:{background:"#222",color:"#fff",borderRadius:"8px",minWidth:"320px",minHeight:"180px",padding:"24px",boxShadow:"0 4px 24px rgba(0,0,0,0.4)",position:"relative"},onClick:ce=>ce.stopPropagation(),children:[Ke.jsx("div",{style:{fontSize:"20px",marginBottom:"16px"},children:"Settings"}),Ke.jsxs("div",{style:{marginBottom:"24px"},children:[Ke.jsx("div",{style:{marginBottom:12,fontWeight:"bold"},children:"Mouse Button Tool Bindings"}),z7.map(ce=>Ke.jsxs("div",{style:{marginBottom:10},children:[Ke.jsxs("label",{style:{marginRight:8},children:[ce.label," Button:"]}),Ke.jsx("select",{value:fr[ce.value],onChange:Ee=>$i(Ce=>({...Ce,[ce.value]:Ee.target.value})),style:{background:"#333",color:"#fff",border:"1px solid #444",borderRadius:"4px",padding:"4px 8px",fontSize:"14px"},children:a0.map(Ee=>Ke.jsx("option",{value:Ee.value,title:Ee.label,children:`${Ee.icon?`${Ee.icon} `:""}${Ee.label}`},Ee.value))})]},ce.value)),Ke.jsxs("div",{style:{margin:"12px 0"},children:[Ke.jsxs("button",{style:{background:"#333",color:"#fff",border:"none",borderRadius:"4px",padding:"4px 12px",cursor:"pointer",fontSize:"14px",marginBottom:"8px"},onClick:()=>Le(ce=>!ce),children:[yt?"Hide":"Show"," Advanced Mouse Bindings"]}),yt&&Ke.jsx("div",{style:{marginTop:8},children:J2.slice(3).map(ce=>Ke.jsxs("div",{style:{marginBottom:10},children:[Ke.jsxs("label",{style:{marginRight:8},children:[ce.label,":"]}),Ke.jsxs("select",{value:fr[ce.value]||"",onChange:Ee=>$i(Ce=>({...Ce,[ce.value]:Ee.target.value})),style:{background:"#333",color:"#fff",border:"1px solid #444",borderRadius:"4px",padding:"4px 8px",fontSize:"14px"},children:[Ke.jsx("option",{value:"",children:"(None)"}),a0.map(Ee=>Ke.jsx("option",{value:Ee.value,title:Ee.label,children:`${Ee.icon?`${Ee.icon} `:""}${Ee.label}`},Ee.value))]})]},ce.value))})]}),Ke.jsx("div",{style:{margin:"18px 0 8px 0",fontWeight:"bold"},children:"Ctrl + Mouse Button Tool Bindings"}),z7.map(ce=>Ke.jsxs("div",{style:{marginBottom:10},children:[Ke.jsxs("label",{style:{marginRight:8},children:[ce.label," + Ctrl:"]}),Ke.jsxs("select",{value:fo[ce.value]||"",onChange:Ee=>ha(Ce=>({...Ce,[ce.value]:Ee.target.value})),style:{background:"#333",color:"#fff",border:"1px solid #444",borderRadius:"4px",padding:"4px 8px",fontSize:"14px"},children:[Ke.jsx("option",{value:"",children:"(None)"}),a0.map(Ee=>Ke.jsx("option",{value:Ee.value,title:Ee.label,children:`${Ee.icon?`${Ee.icon} `:""}${Ee.label}`},Ee.value))]})]},ce.value+"_ctrl")),Ke.jsxs("div",{style:{margin:"12px 0"},children:[Ke.jsxs("button",{style:{background:"#333",color:"#fff",border:"none",borderRadius:"4px",padding:"4px 12px",cursor:"pointer",fontSize:"14px",marginBottom:"8px"},onClick:()=>ct(ce=>!ce),children:[Qe?"Hide":"Show"," Advanced Ctrl + Mouse Bindings"]}),Qe&&Ke.jsx("div",{style:{marginTop:8},children:J2.slice(3).map(ce=>Ke.jsxs("div",{style:{marginBottom:10},children:[Ke.jsxs("label",{style:{marginRight:8},children:[ce.label," + Ctrl:"]}),Ke.jsxs("select",{value:fo[ce.value]||"",onChange:Ee=>ha(Ce=>({...Ce,[ce.value]:Ee.target.value})),style:{background:"#333",color:"#fff",border:"1px solid #444",borderRadius:"4px",padding:"4px 8px",fontSize:"14px"},children:[Ke.jsx("option",{value:"",children:"(None)"}),a0.map(Ee=>Ke.jsx("option",{value:Ee.value,title:Ee.label,children:`${Ee.icon?`${Ee.icon} `:""}${Ee.label}`},Ee.value))]})]},ce.value+"_ctrl"))})]})]}),Ke.jsx("button",{style:{position:"absolute",top:12,right:12,background:"transparent",color:"#fff",border:"none",fontSize:"20px",cursor:"pointer"},onClick:()=>g(!1),"aria-label":"Close",children:"×"})]})}),rs&&Ke.jsx("div",{style:{position:"fixed",top:0,left:0,width:"100vw",height:"100vh",background:"rgba(0,0,0,0.5)",zIndex:2e3,display:"flex",alignItems:"center",justifyContent:"center"},onClick:()=>Sr(!1),children:Ke.jsxs("div",{style:{background:"#222",color:"#fff",borderRadius:"8px",minWidth:"320px",maxWidth:"80vw",maxHeight:"80vh",padding:"24px",boxShadow:"0 4px 24px rgba(0,0,0,0.4)",position:"relative",overflow:"auto"},onClick:ce=>ce.stopPropagation(),children:[Ke.jsx("div",{style:{fontSize:"20px",marginBottom:"16px"},children:"DICOM Metadata"}),Io,Ke.jsx("button",{style:{position:"absolute",top:12,right:12,background:"transparent",color:"#fff",border:"none",fontSize:"20px",cursor:"pointer"},onClick:()=>Sr(!1),"aria-label":"Close",children:"×"})]})})]})}function qEe(t){console.log("Setting up tools...",t),Ui(Hu),Ui(Dh),Ui(Pd),Ui(bl),Ui(Ih),Ui(sf),Ui(jl),Ui(cf),Ui($l),Ui(Rd),Ui(af),Ui(Hc),Ui(Oh),Ui(Wa),Ui(Tc),Ui(hd),Ui(Rh);let e=fi(t);return e||(e=lF(t),e.addTool(Dh.toolName),e.addTool(Hu.toolName),e.addTool(bl.toolName),e.addTool(Pd.toolName,{loop:!1}),e.addTool(Ih.toolName),e.addTool(sf.toolName),e.addTool(Rh.toolName,{getTextCallback:()=>""}),e.addTool(cf.toolName),e.addTool(jl.toolName,{statsCalculator:()=>null}),e.addTool($l.toolName,{calculateStats:!1,getTextCallback:()=>""}),e.addTool(Rd.toolName,{getTextCallback:()=>""}),e.addTool(af.toolName,{calculateStats:!1}),e.addTool(Hc.toolName,{}),e.addTool(Oh.toolName,{}),e.addTool(hd.toolName),e.addTool(Wa.toolName)),e}function j7(t,e,r,n){if(!r.length||!e.length)return null;const i=r.map(o=>e.findIndex(a=>a===o.metadata.referencedImageId)).filter(o=>o!==-1).sort((o,a)=>o-a);if(!i.length)return null;if(n===1){for(let o of i)if(o>t)return o;return i[0]}else{for(let o=i.length-1;o>=0;o--)if(i[o]`wadouri:/test_images/stack2/IMG${r+1}.dcm`),Array.from({length:25},(e,r)=>`wadouri:/test_images/stack5/IMG${r+1}.dcm`),Array.from({length:26},(e,r)=>`wadouri:/test_images/stack3/IMG${r+1}.dcm`)]}const rp=t=>t.map(e=>e.startsWith("wadouri:")?e:`wadouri:${e}`),H7=t=>t?{imageIds:rp(t)}:{imageIds:[]};function l$(){document.querySelectorAll(".dicom-viewer-test-root").forEach(r=>{const n=r.id||"",i=()=>XEe();zC(r).render(Ke.jsx($7,{container_id:n,imageStacks:i}))}),document.querySelectorAll(".dicom-viewer-root").forEach(r=>{const n=r.id||"";let i;const o=r.getAttribute("data-empty")==="true",a=r.getAttribute("data-named-stacks"),s=r.getAttribute("data-images"),c=h=>{if(!h)return[];if(Array.isArray(h)&&h.length>0&&typeof h[0]=="string")return[H7(h)];if(Array.isArray(h)){const g=[];return h.forEach((p,v)=>{if(p&&typeof p=="object"&&Array.isArray(p.stacks)){const y=p.caseId||p.caseUID||p.case||void 0,m=p.studyId||p.studyUID||p.studyInstanceUID||void 0;p.stacks.forEach((w,x)=>{let C=[];if(Array.isArray(w)?C=w:Array.isArray(w.imageIds)?C=w.imageIds:Array.isArray(w.i)&&(C=w.i),!Array.isArray(C)||C.length===0||!C.every(S=>typeof S=="string")){console.warn(`data-named-stacks: skipping invalid nested stack at parsed[${v}].stacks[${x}]`,w);return}g.push({imageIds:rp(C),name:w.name||w.label||void 0,caseId:y,studyId:w.studyId||m})});return}if(p&&typeof p=="object"&&(Array.isArray(p.imageIds)||Array.isArray(p.i))){const y=Array.isArray(p.imageIds)?p.imageIds:p.i;if(!Array.isArray(y)||y.length===0||!y.every(m=>typeof m=="string")){console.warn(`data-named-stacks: skipping invalid stack object at parsed[${v}]`,p);return}g.push({imageIds:rp(y),name:p.name||p.label||void 0,caseId:p.caseId||p.caseUID||void 0,studyId:p.studyId||p.studyUID||p.studyInstanceUID||void 0});return}if(Array.isArray(p)&&p.length>0&&typeof p[0]=="string"){g.push(H7(p));return}console.warn(`data-named-stacks: unknown or invalid entry at parsed[${v}] — skipping`,p)}),g}return[]};if(o)i=()=>Promise.resolve([]);else if(a){let h;try{h=JSON.parse(a)}catch(p){console.error("Invalid data-named-stacks JSON:",p),h=[]}const g=c(h);i=()=>Promise.resolve(g)}else if(s){let h;try{h=JSON.parse(s)}catch(g){console.error("Invalid data-images JSON:",g),h=[]}Array.isArray(h)&&h.length>0&&typeof h[0]=="string"?i=()=>Promise.resolve([rp(h)]):Array.isArray(h)?i=()=>Promise.resolve(h.map(g=>Array.isArray(g)?rp(g):[])):i=()=>Promise.resolve([[]])}else i=()=>Promise.resolve([]);const l=r.getAttribute("data-auto-cache-stack"),f=l==="true"||l==="1",u=r.getAttribute("data-annotationjson"),d=r.getAttribute("data-viewerstate");console.log("Mounting DICOM viewer:"),console.log(d,u,f),zC(r).render(Ke.jsx($7,{container_id:n,imageStacks:i,autoCacheStack:f,annotationJson:u||void 0,viewerState:d||void 0}))})}l$();window.mountDicomViewers=l$; +`,Mt.push(mt);var ir=ze(Function,Mt).apply(null,mn);return ir}function $e(z,H,L,U,Y,ue){_(H>0);var me=ke(H,L);Y=Ee(U,Y),$i([],[z],function(we){we=we[0];var De="constructor "+we.name;if(we.registeredClass.constructor_body===void 0&&(we.registeredClass.constructor_body=[]),we.registeredClass.constructor_body[H-1]!==void 0)throw new Io("Cannot register multiple constructors with identical number of parameters ("+(H-1)+") for class '"+we.name+"'! Overload resolution is currently only performed using the parameter count, not actual type info!");return we.registeredClass.constructor_body[H-1]=()=>{ge("Cannot construct "+we.name+" due to unbound types",me)},$i([],me,function(Pe){return Pe.splice(1,0,null),we.registeredClass.constructor_body[H-1]=Ve(De,Pe,null,Y,ue),[]}),[]})}function St(z,H,L,U,Y,ue,me,we){var De=ke(L,U);H=Sr(H),ue=Ee(Y,ue),$i([],[z],function(Pe){Pe=Pe[0];var Be=Pe.name+"."+H;H.startsWith("@@")&&(H=Symbol[H.substring(2)]),we&&Pe.registeredClass.pureVirtualFunctions.push(H);function rt(){ge("Cannot call "+Be+" due to unbound types",De)}var mt=Pe.registeredClass.instancePrototype,Bt=mt[H];return Bt===void 0||Bt.overloadTable===void 0&&Bt.className!==Pe.name&&Bt.argCount===L-2?(rt.argCount=L-2,rt.className=Pe.name,mt[H]=rt):(Li(mt,H,Be),mt[H].overloadTable[L-2]=rt),$i([],De,function(Mt){var mn=Ve(Be,Mt,Pe,ue,me);return mt[H].overloadTable===void 0?(mn.argCount=L-2,mt[H]=mn):mt[H].overloadTable[L-2]=mn,[]}),[]})}var wt=[],Tt=[{},{value:void 0},{value:null},{value:!0},{value:!1}];function jt(z){z>4&&--Tt[z].refcount===0&&(Tt[z]=void 0,wt.push(z))}function Dt(){for(var z=0,H=5;H(z||_n("Cannot use deleted val. handle = "+z),Tt[z].value),toHandle:z=>{switch(z){case void 0:return 1;case null:return 2;case!0:return 3;case!1:return 4;default:{var H=wt.length?wt.pop():Tt.length;return Tt[H]={refcount:1,value:z},H}}}};function dr(z,H){H=Sr(H),Xr(z,{name:H,fromWireType:function(L){var U=Gn.toValue(L);return jt(L),U},toWireType:function(L,U){return Gn.toHandle(U)},argPackAdvance:8,readValueFromPointer:qr,destructorFunction:null})}function Pr(z){if(z===null)return"null";var H=typeof z;return H==="object"||H==="array"||H==="function"?z.toString():""+z}function Ki(z,H){switch(H){case 2:return function(L){return this.fromWireType(X[L>>2])};case 3:return function(L){return this.fromWireType(te[L>>3])};default:throw new TypeError("Unknown float type: "+z)}}function Po(z,H,L){var U=Xo(L);H=Sr(H),Xr(z,{name:H,fromWireType:function(Y){return Y},toWireType:function(Y,ue){return ue},argPackAdvance:8,readValueFromPointer:Ki(H,U),destructorFunction:null})}function Ur(z,H,L,U,Y,ue){var me=ke(H,L);z=Sr(z),Y=Ee(U,Y),Si(z,function(){ge("Cannot call "+z+" due to unbound types",me)},H-1),$i([],me,function(we){var De=[we[0],null].concat(we.slice(1));return ya(z,Ve(z,De,null,Y,ue),H-1),[]})}function an(z,H,L){switch(H){case 0:return L?function(Y){return V[Y]}:function(Y){return G[Y]};case 1:return L?function(Y){return R[Y>>1]}:function(Y){return N[Y>>1]};case 2:return L?function(Y){return F[Y>>2]}:function(Y){return j[Y>>2]};default:throw new TypeError("Unknown integer type: "+z)}}function Ln(z,H,L,U,Y){H=Sr(H);var ue=Xo(L),me=rt=>rt;if(U===0){var we=32-8*L;me=rt=>rt<>>we}var De=H.includes("unsigned"),Pe=(rt,mt)=>{},Be;De?Be=function(rt,mt){return Pe(mt,this.name),mt>>>0}:Be=function(rt,mt){return Pe(mt,this.name),mt},Xr(z,{name:H,fromWireType:me,toWireType:Be,argPackAdvance:8,readValueFromPointer:an(H,ue,U!==0),destructorFunction:null})}function Ro(z,H,L){var U=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array],Y=U[H];function ue(me){me=me>>2;var we=j,De=we[me],Pe=we[me+1];return new Y(A,Pe,De)}L=Sr(L),Xr(z,{name:L,fromWireType:ue,argPackAdvance:8,readValueFromPointer:ue},{ignoreDuplicateRegistrations:!0})}function Nt(z,H){H=Sr(H);var L=H==="std::string";Xr(z,{name:H,fromWireType:function(U){var Y=j[U>>2],ue=U+4,me;if(L)for(var we=ue,De=0;De<=Y;++De){var Pe=ue+De;if(De==Y||G[Pe]==0){var Be=Pe-we,rt=D(we,Be);me===void 0?me=rt:(me+="\0",me+=rt),we=Pe+1}}else{for(var mt=new Array(Y),De=0;De>2]=ue,L&&me)P(Y,De,ue+1);else if(me)for(var Pe=0;Pe255&&(ye(De),_n("String has UTF-16 code units that do not fit in 8 bits")),G[De+Pe]=Be}else for(var Pe=0;Pe>1,Y=U+H/2;!(U>=Y)&&N[U];)++U;if(L=U<<1,L-z>32&&er)return er.decode(G.subarray(z,L));for(var ue="",me=0;!(me>=H/2);++me){var we=R[z+me*2>>1];if(we==0)break;ue+=String.fromCharCode(we)}return ue}function Er(z,H,L){if(L===void 0&&(L=2147483647),L<2)return 0;L-=2;for(var U=H,Y=L>1]=me,H+=2}return R[H>>1]=0,H-U}function Rr(z){return z.length*2}function as(z,H){for(var L=0,U="";!(L>=H/4);){var Y=F[z+L*4>>2];if(Y==0)break;if(++L,Y>=65536){var ue=Y-65536;U+=String.fromCharCode(55296|ue>>10,56320|ue&1023)}else U+=String.fromCharCode(Y)}return U}function vo(z,H,L){if(L===void 0&&(L=2147483647),L<4)return 0;for(var U=H,Y=U+L-4,ue=0;ue=55296&&me<=57343){var we=z.charCodeAt(++ue);me=65536+((me&1023)<<10)|we&1023}if(F[H>>2]=me,H+=4,H+4>Y)break}return F[H>>2]=0,H-U}function Yl(z){for(var H=0,L=0;L=55296&&U<=57343&&++L,H+=4}return H}function Jl(z,H,L){L=Sr(L);var U,Y,ue,me,we;H===2?(U=bn,Y=Er,me=Rr,ue=()=>N,we=1):H===4&&(U=as,Y=vo,me=Yl,ue=()=>j,we=2),Xr(z,{name:L,fromWireType:function(De){for(var Pe=j[De>>2],Be=ue(),rt,mt=De+4,Bt=0;Bt<=Pe;++Bt){var Mt=De+4+Bt*H;if(Bt==Pe||Be[Mt>>we]==0){var mn=Mt-mt,gn=U(mt,mn);rt===void 0?rt=gn:(rt+="\0",rt+=gn),mt=Mt+H}}return ye(De),rt},toWireType:function(De,Pe){typeof Pe!="string"&&_n("Cannot pass non-string to C++ string type "+L);var Be=me(Pe),rt=ne(4+Be+H);return j[rt>>2]=Be>>we,Y(Pe,rt+4,Be+H),De!==null&&De.push(ye,rt),rt},argPackAdvance:8,readValueFromPointer:qr,destructorFunction:function(De){ye(De)}})}function rl(z,H,L,U,Y,ue){Pn[z]={name:Sr(H),rawConstructor:Ee(L,U),rawDestructor:Ee(Y,ue),fields:[]}}function yf(z,H,L,U,Y,ue,me,we,De,Pe){Pn[z].fields.push({fieldName:Sr(H),getterReturnType:L,getter:Ee(U,Y),getterContext:ue,setterArgumentType:me,setter:Ee(we,De),setterContext:Pe})}function Zl(z,H){H=Sr(H),Xr(z,{isVoid:!0,name:H,argPackAdvance:0,fromWireType:function(){},toWireType:function(L,U){}})}function wf(z){z>4&&(Tt[z].refcount+=1)}function Ql(z,H){var L=ht[z];return L===void 0&&_n(H+" has unknown type "+pe(z)),L}function xf(z,H){z=Ql(z,"_emval_take_value");var L=z.readValueFromPointer(H);return Gn.toHandle(L)}function Cf(){We("")}function Sf(z,H,L){G.copyWithin(z,H,H+L)}function Tf(){return 2147483648}function il(z){try{return S.grow(z-A.byteLength+65535>>>16),fe(S.buffer),1}catch{}}function ol(z){var H=G.length;z=z>>>0;var L=Tf();if(z>L)return!1;let U=(De,Pe)=>De+(Pe-De%Pe)%Pe;for(var Y=1;Y<=4;Y*=2){var ue=H*(1+.2/Y);ue=Math.min(ue,z+100663296);var me=Math.min(L,U(Math.max(z,ue),65536)),we=il(me);if(we)return!0}return!1}function Va(z){return 52}function ss(z,H,L,U,Y){return 70}var ea=[null,[],[]];function eu(z,H){var L=ea[z];H===0||H===10?((z===1?w:x)(b(L,0)),L.length=0):L.push(H)}function tu(z,H,L,U){for(var Y=0,ue=0;ue>2],we=j[H+4>>2];H+=8;for(var De=0;De>2]=Y,0}function al(z){return z}function nu(z){var H=o["_"+z];return H}function hc(z,H){V.set(z,H)}function ru(z,H,L,U,Y){var ue={string:Mt=>{var mn=0;if(Mt!=null&&Mt!==0){var gn=(Mt.length<<2)+1;mn=ft(gn),P(Mt,mn,gn)}return mn},array:Mt=>{var mn=ft(Mt.length);return hc(Mt,mn),mn}};function me(Mt){return H==="string"?D(Mt):H==="boolean"?!!Mt:Mt}var we=nu(z),De=[],Pe=0;if(U)for(var Be=0;Be0||(_e(),Q>0))return;function H(){st||(st=!0,o.calledRun=!0,!T&&(B(),a(o),o.onRuntimeInitialized&&o.onRuntimeInitialized(),M()))}o.setStatus?(o.setStatus("Running..."),setTimeout(function(){setTimeout(function(){o.setStatus("")},1),H()},1)):H()}if(o.preInit)for(typeof o.preInit=="function"&&(o.preInit=[o.preInit]);o.preInit.length>0;)o.preInit.pop()();return nt(),o.ready}})();t.exports=r})(o$);var MEe=o$.exports;const PEe=qc(MEe),REe=new URL("/static/dv3d/openjphjs.wasm",import.meta.url),np={codec:void 0,decoder:void 0,decodeConfig:{}};function LEe(t,e,r){const n={width:e,height:r};for(;t>0;)n.width=Math.ceil(n.width/2),n.height=Math.ceil(n.height/2),t--;return n}function AEe(t){if(np.decodeConfig=t,np.codec)return Promise.resolve();const e=PEe({locateFile:r=>r.endsWith(".wasm")?REe.toString():r});return new Promise((r,n)=>{e.then(i=>{np.codec=i,np.decoder=new i.HTJ2KDecoder,r()},n)})}async function NEe(t,e){await AEe();const r=new np.codec.HTJ2KDecoder,n=r.getEncodedBuffer(t.length);n.set(t);const i=e.decodeLevel||0;r.decodeSubResolution(i);const o=r.getFrameInfo();if(e.decodeLevel>0){const{width:E,height:b}=LEe(e.decodeLevel,o.width,o.height);o.width=E,o.height=b}const a=r.getDecodedBuffer();new Uint8Array(a.length).set(a);const c=`x: ${r.getImageOffset().x}, y: ${r.getImageOffset().y}`,l=r.getNumDecompositions(),f=r.getNumLayers(),u=["unknown","LRCP","RLCP","RPCL","PCRL","CPRL"][r.getProgressionOrder()+1],d=r.getIsReversible(),h=`${r.getBlockDimensions().width} x ${r.getBlockDimensions().height}`,g=`${r.getTileSize().width} x ${r.getTileSize().height}`,p=`${r.getTileOffset().x}, ${r.getTileOffset().y}`,v=`${a.length.toLocaleString()} bytes`,y=`${(a.length/n.length).toFixed(2)}:1`,m={columns:o.width,rows:o.height,bitsPerPixel:o.bitsPerSample,signed:o.isSigned,bytesPerPixel:e.bytesPerPixel,componentsPerPixel:o.componentCount};let w=kEe(o,a);const{buffer:x,byteOffset:C,byteLength:S}=w,T=x.slice(C,C+S);w=new w.constructor(T);const _={imageOffset:c,numDecompositions:l,numLayers:f,progessionOrder:u,reversible:d,blockDimensions:h,tileSize:g,tileOffset:p,decodedSize:v,compressionRatio:y};return{...e,pixelData:w,imageInfo:m,encodeOptions:_,..._,...m}}function kEe(t,e){return t.bitsPerSample>8?t.isSigned?new Int16Array(e.buffer,e.byteOffset,e.byteLength/2):new Uint16Array(e.buffer,e.byteOffset,e.byteLength/2):t.isSigned?new Int8Array(e.buffer,e.byteOffset,e.byteLength):new Uint8Array(e.buffer,e.byteOffset,e.byteLength)}function VEe(t,e){const r=t.length,{rescaleSlope:n,rescaleIntercept:i,suvbw:o,doseGridScaling:a}=e;if(e.modality==="PT"&&typeof o=="number"&&!isNaN(o))for(let s=0;s>o;let a=t.pixelData;t.pixelDataLength=t.pixelData.length;const{min:s,max:c}=rx(t.pixelData),l=typeof e.allowFloatRendering<"u"?e.allowFloatRendering:!0;let f=$8(t.photometricInterpretation)&&((m=e.targetBuffer)==null?void 0:m.offset)===void 0;const d=((w=e.preScale)==null?void 0:w.enabled)&&Object.values(e.preScale.scalingParameters).some(C=>typeof C=="number"&&!Number.isInteger(C)),h=!e.preScale.enabled||!l&&d,g=(x=e.targetBuffer)==null?void 0:x.type;if(g&&e.preScale.enabled&&!h){const C=e.preScale.scalingParameters,S=DT(s,c,C);f=!v4e(S.min,S.max,B7[g])}g&&!f?a=GEe(e,t,B7,a):e.preScale.enabled&&!h?a=WEe(e,s,c,t):a=a$(s,c,t);let p=s,v=c;if(e.preScale.enabled&&!h){const C=e.preScale.scalingParameters;if(s$(C),BEe(C)){VEe(a,C),t.preScale={...e.preScale,scaled:!0};const T=DT(s,c,C);p=T.min,v=T.max}}else h&&(t.preScale={enabled:!0,scaled:!1},p=s,v=c);t.pixelData=a,t.smallestPixelValue=p,t.largestPixelValue=v;const y=new Date().getTime();return t.decodeTimeInMS=y-r,t}function BEe(t){const{rescaleSlope:e,rescaleIntercept:r,modality:n,doseGridScaling:i,suvbw:o}=t;return typeof e=="number"&&typeof r=="number"||n==="RTDOSE"&&typeof i=="number"||n==="PT"&&typeof o=="number"}function GEe(t,e,r,n){const{arrayBuffer:i,type:o,offset:a=0,length:s,rows:c}=t.targetBuffer,l=r[o];if(!l)throw new Error(`target array ${o} is not supported, or doesn't exist.`);c&&c!=e.rows&&$Ee(e,t.targetBuffer,l);const f=e.pixelDataLength,u=a,d=s??f-u,h=e.pixelData;if(d!==h.length)throw new Error(`target array for image does not have the same length (${d}) as the decoded image length (${h.length}).`);const g=i?new l(i,u,d):new l(d);return g.set(h,0),n=g,n}function WEe(t,e,r,n){const i=t.preScale.scalingParameters;s$(i);const o=DT(e,r,i);return a$(o.min,o.max,n)}function a$(t,e,r){const n=j8(t,e),i=new n(r.pixelData.length);return i.set(r.pixelData,0),i}function DT(t,e,r){const{rescaleSlope:n,rescaleIntercept:i,modality:o,doseGridScaling:a,suvbw:s}=r;return o==="PT"&&typeof s=="number"&&!isNaN(s)?{min:s*(t*n+i),max:s*(e*n+i)}:o==="RTDOSE"&&typeof a=="number"&&!isNaN(a)?{min:t*a,max:e*a}:typeof n=="number"&&typeof i=="number"?{min:n*t+i,max:n*e+i}:{min:t,max:e}}function s$(t){if(!t)throw new Error("options.preScale.scalingParameters must be defined if preScale.enabled is true, and scalingParameters cannot be derived from the metadata providers.")}function zEe(t,e,r){const{samplesPerPixel:n}=t,{rows:i,columns:o}=e,a=i*o*n,s=new r(a),c=s.byteLength/a;return{pixelData:s,rows:i,columns:o,frameInfo:{...t.frameInfo,rows:i,columns:o},imageInfo:{...t.imageInfo,rows:i,columns:o,bytesPerPixel:c}}}function $Ee(t,e,r){const n=zEe(t,e,r),{scalingType:i="replicate"}=e;return FEe[i](t,n),Object.assign(t,n),t.pixelDataLength=t.pixelData.length,t}async function c$(t,e,r,n,i,o){const a=new Date().getTime();let s=null,c;switch(e){case"1.2.840.10008.1.2":case"1.2.840.10008.1.2.1":s=N7(t,r);break;case"1.2.840.10008.1.2.2":s=rEe(t,r);break;case"1.2.840.10008.1.2.1.99":s=N7(t,r);break;case"1.2.840.10008.1.2.5":s=iEe(t,r);break;case"1.2.840.10008.1.2.4.50":c={...t},s=dEe(r,c);break;case"1.2.840.10008.1.2.4.51":s=vEe(t,r);break;case"1.2.840.10008.1.2.4.57":s=V7(t,r);break;case"1.2.840.10008.1.2.4.70":s=V7(t,r);break;case"1.2.840.10008.1.2.4.80":c={signed:t.pixelRepresentation===1,bytesPerPixel:t.bitsAllocated<=8?1:2,...t},s=F7(r,c);break;case"1.2.840.10008.1.2.4.81":c={signed:t.pixelRepresentation===1,bytesPerPixel:t.bitsAllocated<=8?1:2,...t},s=F7(r,c);break;case"1.2.840.10008.1.2.4.90":c={...t},s=U7(r,c);break;case"1.2.840.10008.1.2.4.91":c={...t},s=U7(r,c);break;case"3.2.840.10008.1.2.4.96":case"1.2.840.10008.1.2.4.201":case"1.2.840.10008.1.2.4.202":case"1.2.840.10008.1.2.4.203":c={...t},s=NEe(r,c);break;default:throw new Error(`no decoder for transfer syntax ${e}`)}if(!s)throw new Error("decodePromise not defined");const l=await s,f=UEe(l,i,a);return o==null||o(f),f}const jEe={decodeTask({imageFrame:t,transferSyntax:e,decodeConfig:r,options:n,pixelData:i,callbackFn:o}){return c$(t,e,i,r,n,o)}};_4(jEe);const IT={constants:Q4e,convertRGBColorByPixel:vz,convertRGBColorByPlane:yz,convertYBRFullByPixel:wz,convertYBRFullByPlane:xz,convertPALETTECOLOR:Cz,wadouri:S4e,wadors:K4e,init:e$,convertColorSpace:Bz,createImage:ix,decodeJPEGBaseline8BitColor:Gz,getImageFrame:Wz,getPixelData:X8,getMinMax:rx,isColorImage:$8,isJPEGBaseline8BitColor:J4e,internal:V_e,decodeImageFrame:c$};class Rh extends cf{}pb(Rh,"toolName","NoLabelArrowAnnotate");function G7(t,e){const r=vt("imagePlaneModule",t);if(!r)return;const{rowCosines:n,columnCosines:i,imagePositionPatient:o,rowPixelSpacing:a,columnPixelSpacing:s}=r;if(!n||!i||!o)return;const c=s||1,l=a||1,f=n,u=i,d=o;return[d[0]+e.x*u[0]*c+e.y*f[0]*l,d[1]+e.x*u[1]*c+e.y*f[1]*l,d[2]+e.x*u[2]*c+e.y*f[2]*l]}window.cornerstone3dTools=mz;window.cornerstone3d=Nhe;window.cornerstoneDICOMImageLoader=IT;const{MouseBindings:Ng,KeyboardBindings:W7}=ZV,{IMAGE_RENDERED:kg}=Ze,HEe=[{name:"Soft Tissue",center:40,width:400},{name:"Lung",center:-600,width:1500},{name:"Bone",center:300,width:1500},{name:"Brain",center:40,width:80},{name:"Abdomen",center:60,width:400}],a0=[{label:"Window/Level",value:Dh.toolName,icon:"🌓"},{label:"Pan",value:Hu.toolName,icon:"✋"},{label:"Zoom",value:bl.toolName,icon:"🔍"},{label:"Stack Scroll",value:Pd.toolName,icon:"📚"},{label:"Rotate",value:Ih.toolName,icon:"↺"},{label:"Length",value:sf.toolName,icon:"📏"},{label:"Probe",value:jl.toolName,icon:"🔎"},{label:"Arrow (No Label)",value:Rh.toolName,icon:"➡️"},{label:"Arrow Annotate",value:cf.toolName,icon:"✈️"},{label:"Rectangle ROI",value:$l.toolName,icon:"▭"},{label:"Ellipse ROI",value:Rd.toolName,icon:"◯"},{label:"Freehand ROI",value:af.toolName,icon:"✏️"},{label:"Freehand Contour Segmentation",value:Hc.toolName,icon:"🖊️"},{label:"Sculptor",value:Oh.toolName,icon:"🔧"},{label:"Reference Cursors",value:Wa.toolName,icon:"⦿"}];function KEe(t){if(!t)return"🔖";const e=a0.find(r=>r.value===t||r.label===t);return(e==null?void 0:e.icon)||"🔖"}const z7=[{label:"Left",value:"Primary"},{label:"Middle",value:"Auxiliary"},{label:"Right",value:"Secondary"}],J2=[{label:"Left",value:"Primary",mask:1},{label:"Middle",value:"Auxiliary",mask:4},{label:"Right",value:"Secondary",mask:2},{label:"Left + Right",value:"Primary_and_Secondary",mask:3},{label:"Left + Middle",value:"Primary_and_Auxiliary",mask:5},{label:"Right + Middle",value:"Secondary_and_Auxiliary",mask:6},{label:"Left + Right + Middle",value:"Primary_and_Secondary_and_Auxiliary",mask:7},{label:"Fourth Button",value:"Fourth_Button",mask:8},{label:"Fifth Button",value:"Fifth_Button",mask:16},{label:"Mouse Wheel",value:"Wheel",mask:524288},{label:"Mouse Wheel + Left",value:"Wheel_Primary",mask:524289}];function $7({container_id:t,imageStacks:e,autoCacheStack:r,annotationJson:n,viewerState:i,...o}){var Mr,Ps,Ai,oi,os,Qo,Ni,ya,Rs,Ls;const a=Et.useRef(null),s=Et.useRef(null),c=Et.useRef(!1),l="dv3d_mouseToolBindings",f="dv3d_ctrlMouseToolBindings",[u,d]=Et.useState(!1),[h,g]=Et.useState(!1),[p,v]=Et.useState(!1),[y,m]=Et.useState(!1),[w,x]=Et.useState(320),C=Et.useRef({resizing:!1,startX:0,startWidth:320}),S=240,T=720,_=220,E=40,b=14,[D,I]=Et.useState(null),[P,O]=Et.useState(null),A=9,V="renderingEngine_"+t,G="TOOL_GROUP_"+t,R=Et.useRef(null),N=Et.useRef(!1),[F,j]=Et.useState(!0),[X,te]=Et.useState([]),[fe,le]=Et.useState(0),[de,Ie]=Et.useState(()=>Array(A).fill([])),Me=ce=>{typeof ce=="function"?Ie(Ee=>{const Ce=ce(Ee);return console.log("setViewportImageIds (fn):",Ce),Ce}):(console.log("setViewportImageIds:",ce),Ie(ce))},[_e,B]=Et.useState(()=>Array(A).fill(0)),[M,$]=Et.useState({}),W=Et.useRef({});function q(ce){if(!ce)return null;try{if(ce.tagName&&ce.tagName.toLowerCase()==="canvas")return ce}catch{}try{const Ee=ce.querySelector&&ce.querySelector("canvas");if(Ee)return Ee}catch{}try{const Ee=ce.children||[];for(let Ce=0;CeMath.min(bn,Math.max(er,Nt)),Tt=()=>{Ee.style.transform=`translate(${ke}px, ${ze}px) scale(${be})`};let jt=!0,Dt=!0;const Jt=Nt=>{if(!Dt)return;Nt.preventDefault();const er=Ee.getBoundingClientRect(),bn=Nt.clientX-er.left,Er=Nt.clientY-er.top,Rr=-Nt.deltaY,as=1+(Rr>0?.1:-.1)*Math.min(4,Math.abs(Rr)/100),vo=wt(be*as,.1,10);ke=(ke-bn)*(vo/be)+bn,ze=(ze-Er)*(vo/be)+Er,be=vo,Tt()},En=Nt=>{Nt.button===0&&jt&&(Ve=!0,$e=Nt.clientX,St=Nt.clientY,Ee.style.cursor="grabbing",Nt.preventDefault())},Gn=Nt=>{if(!Ve)return;const er=Nt.clientX-$e,bn=Nt.clientY-St;ke+=er,ze+=bn,$e=Nt.clientX,St=Nt.clientY,Tt()},dr=Nt=>{Ve&&(Ve=!1,Ee.style.cursor="grab")},Pr=Nt=>{be=1,ke=0,ze=0,Tt()};let Ki=0;const Po=(Nt,er)=>Math.hypot(er.clientX-Nt.clientX,er.clientY-Nt.clientY),Ur=Nt=>{Nt.touches.length===1?jt&&(Ve=!0,$e=Nt.touches[0].clientX,St=Nt.touches[0].clientY):Nt.touches.length===2&&(Ki=Po(Nt.touches[0],Nt.touches[1]))},an=Nt=>{if(Nt.touches.length===1&&Ve){const er=Nt.touches[0].clientX-$e,bn=Nt.touches[0].clientY-St;ke+=er,ze+=bn,$e=Nt.touches[0].clientX,St=Nt.touches[0].clientY,Tt()}else if(Nt.touches.length===2&&Dt){const er=Po(Nt.touches[0],Nt.touches[1]);if(Ki>0){const bn=er/Ki,Er=Ee.getBoundingClientRect(),Rr=(Nt.touches[0].clientX+Nt.touches[1].clientX)/2-Er.left,as=(Nt.touches[0].clientY+Nt.touches[1].clientY)/2-Er.top,vo=wt(be*bn,.1,10);ke=(ke-Rr)*(vo/be)+Rr,ze=(ze-as)*(vo/be)+as,be=vo,Tt()}Ki=er}Nt.preventDefault()},Ln=Nt=>{Nt.touches.length===0&&(Ve=!1,Ki=0)};return ce.addEventListener("wheel",Jt,{passive:!1}),ce.addEventListener("mousedown",En),window.addEventListener("mousemove",Gn),window.addEventListener("mouseup",dr),Ee.addEventListener("dblclick",Pr),ce.addEventListener("touchstart",Ur,{passive:!1}),ce.addEventListener("touchmove",an,{passive:!1}),ce.addEventListener("touchend",Ln),{cleanup:()=>{ce.removeEventListener("wheel",Jt),ce.removeEventListener("mousedown",En),window.removeEventListener("mousemove",Gn),window.removeEventListener("mouseup",dr),Ee.removeEventListener("dblclick",Pr),ce.removeEventListener("touchstart",Ur),ce.removeEventListener("touchmove",an),ce.removeEventListener("touchend",Ln),Ee.style.transform="",Ee.style.cursor="",Ee.style.willChange=""},setAllowPan:Nt=>{jt=Nt},setAllowZoom:Nt=>{Dt=Nt}}}const[Te,Oe]=Et.useState(!1),[We,qe]=Et.useState(null),[ie,oe]=Et.useState(!1),[xe,se]=Et.useState(null);Et.useEffect(()=>{const ce=Ce=>{try{const pe=Ce&&Ce.message?String(Ce.message):"";(pe.includes("releaseGraphicsResources")||pe.includes("openGLTexture")||pe.includes("getDefaultActor")||pe.includes("setColormapGPU")||pe.includes(`can't access property "actor"`)||pe.toLowerCase().includes("webgl")||pe.toLowerCase().includes("colormap"))&&(console.error("Detected graphics/rendering error:",Ce),se(pe||null),oe(!0))}catch{}},Ee=Ce=>{try{const pe=Ce&&Ce.reason||"",ge=typeof pe=="string"?pe:pe&&pe.message?pe.message:String(pe);(ge.includes("releaseGraphicsResources")||ge.includes("openGLTexture")||ge.includes("getDefaultActor")||ge.includes("setColormapGPU")||ge.includes(`can't access property "actor"`)||ge.toLowerCase().includes("webgl")||ge.toLowerCase().includes("colormap"))&&(console.error("Detected graphics/rendering rejection:",Ce),se(ge||null),oe(!0))}catch{}};return window.addEventListener("error",ce),window.addEventListener("unhandledrejection",Ee),()=>{window.removeEventListener("error",ce),window.removeEventListener("unhandledrejection",Ee)}},[]),Et.useEffect(()=>{let ce=!1;if(n||i){qe(n?"annotations":"viewerState");const Ee=setTimeout(()=>{if(ce)return;const Ce=t||"default";if(n)try{const pe=window[`importAnnotations_${Ce}`]||window.importAnnotations;typeof pe=="function"&&pe(n)}catch(pe){console.error("Failed to import annotations from prop:",pe)}if(i)try{const pe=window[`importViewerState_${Ce}`]||window.importViewerState;typeof pe=="function"&&pe(i)}catch(pe){console.error("Failed to import viewer state from prop:",pe)}qe(null)},2e3);return()=>{ce=!0,clearTimeout(Ee),qe(null)}}},[n,i,t]),Et.useEffect(()=>{let ce=!0;return e().then(async Ee=>{if(!ce)return;const Ce=Array.isArray(Ee)?Ee:[],pe=await Promise.all(Ce.map(async ge=>{if(Array.isArray(ge))return{imageIds:ge};const be=Array.isArray(ge.imageIds)?ge.imageIds:Array.isArray(ge.i)?ge.i:[];let ke=ge.studyInstanceUID;if(!ke&&be.length>0)try{const ze=be[0];if(typeof fetch=="function"&&typeof window.dicomParser<"u"&&ze.startsWith("wadouri:")){const Ve=ze.slice(7),St=await(await fetch(Ve)).arrayBuffer();ke=window.dicomParser.parseDicom(new Uint8Array(St)).string("x0020000d")}}catch{}return{imageIds:be,studyInstanceUID:ke,studyId:ge.studyId,name:ge.name,caseId:ge.caseId}}));te(pe),pe[0]?(await Rt(pe[0].imageIds),Me(Array(A).fill(pe[0].imageIds||[]))):Me(Array(A).fill([]))}).catch(Ee=>{console.error("Failed to load imageStacks:",Ee),te([]),Me(Array(A).fill([]))}),()=>{ce=!1}},[]);const ve=async(ce,Ee)=>{const Ce=X[Ee];if(!Ce)return;const pe=Ce.imageIds;Rn(ge=>{const be=[...ge];return be[ce]="stack",be}),Me(ge=>{const be=[...ge];return be[ce]=pe,be}),B(ge=>{const be=[...ge];return be[ce]=Ee,be}),await Rt(pe)},[Ye,ae]=Et.useState(!1),[pt,_t]=Et.useState(!0),[yt,Le]=Et.useState(!1),[Qe,ct]=Et.useState(!1),lt=()=>{console.log("Sorting viewport imageIds by slice location"),Me(ce=>{const Ee=ce.map((Ce,pe)=>{if(!Ce||Ce.length===0)return Ce;const ke=[...Ce.map(ze=>{const Ve=vt("imagePlaneModule",ze);let $e=null;return Ve&&(Ve.sliceLocation!==void 0?$e=Number(Ve.sliceLocation):Ve.imagePositionPatient&&Array.isArray(Ve.imagePositionPatient)&&Ve.imagePositionPatient.length===3&&($e=Number(Ve.imagePositionPatient[2]))),{imageId:ze,sortKey:$e}})].sort((ze,Ve)=>ze.sortKey!==null&&Ve.sortKey!==null?ze.sortKey-Ve.sortKey:ze.imageId.localeCompare(Ve.imageId)).map(ze=>ze.imageId);return JSON.stringify(ke)===JSON.stringify(Ce)?Ce:ke});return Oe(!0),Ee})},gt=Et.useCallback(async(ce,Ee)=>{if(!Ee){console.warn("generateThumbnail: no chosenImageId for stack",ce);return}if(M[ce]){console.debug("generateThumbnail: thumbnail already exists for",ce);return}if(W.current[ce]){console.debug("generateThumbnail: already requested for",ce);return}if(Q(Ee)){try{const be=new Image;be.crossOrigin="anonymous";const ke=Ee.replace(/^external:/,"");be.src=ke,await new Promise((St,wt)=>{be.onload=()=>St(!0),be.onerror=Tt=>wt(Tt)});const ze=document.createElement("canvas"),Ve=160;ze.width=Ve,ze.height=Ve;const $e=ze.getContext("2d");if($e){const St=Math.min(Ve/be.width,Ve/be.height),wt=be.width*St,Tt=be.height*St,jt=(Ve-wt)/2,Dt=(Ve-Tt)/2;$e.fillStyle="#000",$e.fillRect(0,0,Ve,Ve),$e.drawImage(be,jt,Dt,wt,Tt);const Jt=ze.toDataURL("image/png");$(En=>({...En,[ce]:Jt}))}else $(St=>({...St,[ce]:"BROKEN"}))}catch(be){console.warn("generateThumbnail: failed to generate thumbnail for external image",be),$(ke=>({...ke,[ce]:"BROKEN"}))}return}const Ce=R.current;if(!Ce){console.warn("generateThumbnail: no renderingEngine yet for",ce);return}W.current[ce]=!0,console.debug("generateThumbnail: starting for",ce,Ee);const pe=`THUMB_${t||"main"}_${ce}`,ge=document.createElement("div");ge.style.width="160px",ge.style.height="160px",ge.style.position="absolute",ge.style.left="-9999px",ge.style.top="0",document.body.appendChild(ge);try{Ce.enableElement({viewportId:pe,type:Tr.STACK,element:ge});const be=Ce.getViewport(pe);if(!be){console.warn("generateThumbnail: no viewport returned after enableElement for",pe);return}try{be.setStack([Ee])}catch(Ve){console.warn("generateThumbnail: vp.setStack failed",Ve)}const ke=await new Promise(Ve=>{let $e=!1;const St=setTimeout(()=>{$e||($e=!0,console.warn("generateThumbnail: IMAGE_RENDERED timeout for",pe),Ve(!1))},2e3),wt=()=>{$e||($e=!0,clearTimeout(St),console.debug("generateThumbnail: IMAGE_RENDERED received for",pe),Ve(!0))};try{if(be&&be.element)try{be.element.addEventListener(kg,wt,{once:!0})}catch(Tt){console.warn("generateThumbnail: failed to add IMAGE_RENDERED listener",Tt)}if(typeof be.render=="function")try{const Tt=be.render();Tt&&typeof Tt.then=="function"&&Tt.catch(()=>{})}catch{}}catch(Tt){clearTimeout(St),console.warn("generateThumbnail: error while waiting for render",Tt),Ve(!1)}});let ze=q(ge)||(be&&be.element?q(be.element):null);if(ze||(console.debug("generateThumbnail: no canvas found immediately, waiting briefly and retrying for",pe,"canvasReady=",ke),await new Promise(Ve=>setTimeout(Ve,150)),ze=q(ge)||(be&&be.element?q(be.element):null)),ze)try{const Ve=ze.toDataURL("image/png");$($e=>({...$e,[ce]:Ve})),console.debug("generateThumbnail: thumbnail captured for stack",ce)}catch(Ve){console.warn("generateThumbnail: toDataURL failed",Ve),$($e=>({...$e,[ce]:"BROKEN"}))}else console.warn("generateThumbnail: no canvas found after render for",pe,"canvasReady=",ke,"vp.element=",!!(be&&be.element)),$(Ve=>({...Ve,[ce]:"BROKEN"}))}catch(be){console.warn("Thumbnail generation failed for",Ee,be);try{$(ke=>({...ke,[ce]:"BROKEN"}))}catch{}}finally{try{Ce.disableElement(pe)}catch(be){console.warn("Failed to disable thumbnail element:",be)}ge&&ge.parentNode&&ge.parentNode.removeChild(ge)}},[t,M]);Et.useEffect(()=>{!X||X.length===0||!R.current||X.forEach((Ee,Ce)=>{const pe=Array.isArray(Ee.imageIds)?Ee.imageIds:[],ge=Math.floor(pe.length/2),be=pe[ge]||pe[0]||null;!M[Ce]&&!W.current[Ce]&>(Ce,be)})},[X,gt,M]);const Rt=async(ce,Ee)=>{console.log("Setting loaded imageIds:",ce),console.log("autoCacheStack:",r);const Ce=[];if(!!(r||Ee!=null&&Ee.force)){for(const ge of ce)if(ge.startsWith("wadouri:"))try{const be=ge.slice(8);if(IT.wadouri.dataSetCacheManager){const ke=IT.wadouri.dataSetCacheManager.load(be);ke&&typeof ke.then=="function"&&Ce.push(ke)}else console.warn("MetaDataManager not found. Unable to cache metadata.")}catch(be){console.warn(`Failed to cache metadata for ${ge}:`,be)}await Promise.all(Ce),Mi&&(console.log("Sorting viewport imageIds by slice location"),lt())}},[ut,Wt]=Et.useState({rows:1,cols:1}),[Qt,Bn]=Et.useState(!1),Mn=Et.useRef([]),hn=Et.useRef({}),Pn=Et.useRef({}),[Mi,qr]=Et.useState(!1),[je,ht]=Et.useState(!0),Kt=[];for(let ce=1;ce<=3;ce++)for(let Ee=1;Ee<=3;Ee++)Kt.push({rows:ce,cols:Ee});const[un,Pi]=Et.useState(()=>Array(ut.rows*ut.cols).fill({index:0,total:0,windowCenter:"",windowWidth:"",slicePosition:0})),[bt,Rn]=Et.useState(()=>Array(A).fill("stack")),[fn,rn]=Et.useState(()=>Array(ut.rows*ut.cols).fill(!1)),[fr,$i]=Et.useState({Primary:Pd.toolName,Auxiliary:Hu.toolName,Secondary:Dh.toolName,Primary_and_Secondary:bl.toolName,Fourth_Button:Ih.toolName,Wheel:Pd.toolName}),[fo,ha]=Et.useState({Primary:sf.toolName,Auxiliary:jl.toolName,Secondary:Rh.toolName}),[Xo,ga]=Et.useState(!1);Et.useEffect(()=>{const ce=Ce=>{Ce.ctrlKey&&ga(!0)},Ee=Ce=>{Ce.ctrlKey||ga(!1)};return window.addEventListener("keydown",ce),window.addEventListener("keyup",Ee),()=>{window.removeEventListener("keydown",ce),window.removeEventListener("keyup",Ee)}},[]);const[rs,Sr]=Et.useState(!1),[Io,_n]=Et.useState(null),Xr=(ce,Ee)=>{ca&&ca(Ee),Ms(Ce=>{const pe=[...Ce];return pe[ce]=Ee,pe})},bs=(ce,Ee,Ce)=>{const pe=Zr.getAllAnnotations()||[];pe.forEach(be=>{be.annotationUID===Ee&&(be.isSelected=!1)}),Zr.removeAnnotation(Ee),R.current.render();const ge=Ce.filter(be=>be.annotationUID!==Ee);Ms(be=>{const ke=[...be],ze=ge.length>0?ge[0].annotationUID:null;return ke[ce]=ze,pe.forEach(Ve=>{Ve.isSelected=Ve.annotationUID===ze}),ca(ze),R.current.render(),ke})},ho=()=>{const ce=de.findIndex(ge=>ge&&ge.length>0);if(ce===-1){_n("No images loaded."),Sr(!0);return}const Ee=de[ce][0],Ce=["imagePlaneModule","generalSeriesModule","generalStudyModule","patientModule","imagePixelModule","voiLutModule","modalityLutModule","sopCommonModule","petIsotopeModule","multiframeModule","cineModule","overlayPlaneModule","generalImageModule","stackModule","voiLutModule","modalityLutModule","petSeriesModule","petImageModule","petIsotopeModule","petSeriesModule","petImageModule","petIsotopeModule","petSeriesModule","petImageModule","petIsotopeModule","petSeriesModule","petImageModule","petIsotopeModule"],pe={};Ce.forEach(ge=>{const be=vt(ge,Ee);be!==void 0&&(pe[ge]=be)}),_n(Ke.jsx("pre",{style:{maxHeight:600,overflow:"auto",fontSize:13,color:"#fff"},children:JSON.stringify(pe,null,2)})),Sr(!0)};Et.useEffect(()=>{try{const ce=localStorage.getItem(l),Ee=localStorage.getItem(f);ce&&$i(JSON.parse(ce)),Ee&&ha(JSON.parse(Ee))}catch{}},[]),Et.useEffect(()=>{try{localStorage.setItem(l,JSON.stringify(fr))}catch{}},[fr]),Et.useEffect(()=>{try{localStorage.setItem(f,JSON.stringify(fo))}catch{}},[fo]),Et.useEffect(()=>(window.loadDicomStackFromFiles=ce=>{const Ee=Array.from(ce);Yr({target:{files:Ee}})},()=>{window.loadDicomStackFromFiles=void 0}),[]);const[Oo,ji]=Et.useState(!1),[Ri,is]=Et.useState(!1);Et.useEffect(()=>{const ce=fi(G);ce&&["ArrowAnnotate","NoLabelArrowAnnotate","Length","RectangleROI","EllipticalROI","PlanarFreehandROI","PlanarFreehandContourSegmentation"].forEach(Ee=>{ce.setToolConfiguration(Ee,{color:"#00e676",selectedColor:"#ffeb3b"})})},[G]),Et.useEffect(()=>{const ce=pe=>{pe.altKey&&ji(!0),pe.shiftKey&&is(!0)},Ee=pe=>{pe.altKey||ji(!1),pe.shiftKey||is(!1)},Ce=()=>{ji(!1),is(!1)};return window.addEventListener("keydown",ce),window.addEventListener("keyup",Ee),window.addEventListener("blur",Ce),()=>{window.removeEventListener("keydown",ce),window.removeEventListener("keyup",Ee),window.removeEventListener("blur",Ce)}},[]),Et.useEffect(()=>{const ce=fi(G);if(!ce)return;if(Ri||je&&Oo){const Ce=ut.rows*ut.cols;de.slice(0,Ce).filter((ge,be)=>bt[be]==="stack"&&Array.isArray(ge)&&ge.length>0).forEach(ge=>{Rt(ge,{force:!0}).catch(be=>{console.warn("Reference cursor metadata warm-up failed:",be)})}),ce.hasTool(Wa.toolName)||ce.addTool(Wa.toolName),ce.setToolEnabled(Wa.toolName),ce.setToolActive(Wa.toolName)}else ce.hasTool(Wa.toolName)&&ce.setToolDisabled(Wa.toolName)},[Oo,Ri,je,ut.rows,ut.cols,de,bt,Rt]);const Yo=Et.useCallback(()=>{[fi(G)].forEach(Ee=>{if(Ee){a0.forEach(pe=>{Ee.setToolPassive(pe.value,{removeAllBindings:!0})}),Ee.setToolDisabled(Wa.toolName);const Ce={};Object.entries(fr).forEach(([pe,ge])=>{Ce[ge]||(Ce[ge]=[]);const be=J2.find(ke=>ke.value===pe);be?Ce[ge].push({mouseButton:be.mask}):Ng[pe]&&Ce[ge].push({mouseButton:Ng[pe]})}),Object.entries(fo).forEach(([pe,ge])=>{if(!ge)return;Ce[ge]||(Ce[ge]=[]);const be=J2.find(ke=>ke.value===pe);be?Ce[ge].push({mouseButton:be.mask,modifierKey:W7.Ctrl}):Ng[pe]&&Ce[ge].push({mouseButton:Ng[pe],modifierKey:W7.Ctrl})}),Object.entries(Ce).forEach(([pe,ge])=>{Ee.setToolActive(pe,{bindings:ge})});try{const pe=fr.Primary,ge=fr.Wheel,be=fr.Auxiliary,ke=pe===Hu.toolName||be===Hu.toolName,ze=pe===bl.toolName||ge===bl.toolName||fr.Primary_and_Secondary===bl.toolName;Mn.current.forEach(Ve=>{if(!Ve)return;const $e=Ve._externalPanZoom;$e&&(typeof $e.setAllowPan=="function"&&$e.setAllowPan(!!ke),typeof $e.setAllowZoom=="function"&&$e.setAllowZoom(!!ze))})}catch{}}})},[fr,fo]),[ro,Ds]=Et.useState(!1),[Hi,Na]=Et.useState("add"),io=Et.useRef(null),go=Et.useCallback(ce=>{p&&(ce.preventDefault(),ce.stopPropagation(),C.current={resizing:!0,startX:ce.clientX,startWidth:w},document.body.style.cursor="col-resize",document.body.style.userSelect="none")},[p,w]);Et.useEffect(()=>{const ce=Ce=>{if(!C.current.resizing)return;const pe=C.current.startX-Ce.clientX,ge=Math.max(S,Math.min(T,C.current.startWidth+pe));x(ge)},Ee=()=>{C.current.resizing&&(C.current.resizing=!1,document.body.style.cursor="",document.body.style.userSelect="")};return window.addEventListener("mousemove",ce),window.addEventListener("mouseup",Ee),()=>{window.removeEventListener("mousemove",ce),window.removeEventListener("mouseup",Ee),document.body.style.cursor="",document.body.style.userSelect=""}},[]);const Is=ro?_-E/2:-E+b;Et.useEffect(()=>{try{io.current&&(io.current.setAttribute("webkitdirectory","true"),io.current.setAttribute("directory",""),io.current.setAttribute("mozdirectory",""))}catch{}},[]);async function pa(ce,Ee=""){const Ce=[],pe=ce.entries?ce.entries():ce.values();for await(const ge of pe)try{let be,ke;if(Array.isArray(ge)&&ge.length>=2?(ke=ge[0],be=ge[1]):(be=ge,ke=be.name),!be)continue;if(be.kind==="file"){const ze=await be.getFile();try{Object.defineProperty(ze,"webkitRelativePath",{value:Ee+(ke||be.name),configurable:!0})}catch{}Ce.push(ze)}else if(be.kind==="directory"){const ze=await pa(be,Ee+(ke||be.name)+"/");Ce.push(...ze)}}catch(be){console.debug("collectFilesFromDirectoryHandle: skipping entry due to error",be)}return Ce}const Mo=async()=>{var ce;if(window.showDirectoryPicker)try{const Ee=await window.showDirectoryPicker(),Ce=await pa(Ee);Ce&&Ce.length>0?await Yr({target:{files:Ce}}):alert("No files found in selected folder.");return}catch(Ee){console.warn("showDirectoryPicker failed or cancelled",Ee)}(ce=io.current)==null||ce.click()},ka=Et.useRef(null),Yr=async ce=>{const Ee=ce.target.files;if(!Ee||Ee.length===0)return;qr(!1);const Ce=Array.from(Ee).sort((ke,ze)=>ke.name.localeCompare(ze.name)),pe=await Promise.all(Ce.map(async ke=>{const ze=ke.type&&ke.type.startsWith("image/");let Ve,$e,St,wt,Tt=!1;if(!ze)try{const Dt=await ke.arrayBuffer(),Jt=Wr.parseDicom(new Uint8Array(Dt));Ve=Jt.string("x0020000d"),$e=Jt.string("x0020000e");const En=Jt.string("x00200013");En!=null&&En!==""&&(St=parseInt(En,10));const Gn=Jt.string("x00201041")||Jt.string("x00201040");Gn!=null&&Gn!==""&&(wt=parseFloat(Gn)),Tt=!0}catch{Tt=!1}const jt=ze?`external:${URL.createObjectURL(ke)}`:`wadouri:${URL.createObjectURL(ke)}`;return{file:ke,imageId:jt,studyInstanceUID:Ve,seriesInstanceUID:$e,instanceNumber:St,sliceLocation:wt,isImage:ze,parsedSuccessfully:Tt}})),ge=new Map;for(const ke of pe){if(!ke.isImage&&!ke.parsedSuccessfully){console.debug("Skipping non-DICOM/non-image file:",ke.file.name);continue}const ze=ke.seriesInstanceUID||ke.studyInstanceUID||(ke.file.webkitRelativePath?ke.file.webkitRelativePath.split("/")[0]:ke.file.name);ge.has(ze)||ge.set(ze,{entries:[],studyInstanceUID:ke.studyInstanceUID,seriesInstanceUID:ke.seriesInstanceUID}),ge.get(ze).entries.push(ke)}const be=[];for(const[ke,ze]of ge.entries()){const Ve=ze.entries;Ve.sort((St,wt)=>Mi&&St.sliceLocation!==void 0&&wt.sliceLocation!==void 0?St.sliceLocation-wt.sliceLocation:St.instanceNumber!==void 0&&wt.instanceNumber!==void 0?St.instanceNumber-wt.instanceNumber:(St.file.webkitRelativePath||St.file.name).localeCompare(wt.file.webkitRelativePath||wt.file.name));const $e=Ve.map(St=>St.imageId);be.push({imageIds:$e,studyInstanceUID:ze.studyInstanceUID,seriesInstanceUID:ze.seriesInstanceUID})}if(be.length!==0)if(Hi==="replace"){try{const ke=R.current;if(ke)for(let ze=0;ze{const ke=Array(A).fill([]);for(let ze=0;ze{const ze=[...ke,...be];Me(Ve=>{const $e=[...Ve];return $e[0]=be[be.length-1].imageIds,$e}),B(Ve=>{const $e=[...Ve];return $e[0]=ze.length-1,$e});for(const Ve of be)Rt(Ve.imageIds);return ze})},cr=Et.useCallback((ce,Ee)=>{if(!Ee)return;let Ce=0,pe=0,ge="",be="",ke="";if(bt[ce]==="stack"){if(Ce=typeof Ee.getCurrentImageIdIndex=="function"?Ee.getCurrentImageIdIndex():0,pe=(typeof Ee.getImageIds=="function"?Ee.getImageIds():[]).length,typeof Ee.getProperties=="function"){const Ve=Ee.getProperties();if(Ve.voiRange){const{lower:$e,upper:St}=Ve.voiRange;ge=((St+$e)/2).toFixed(0),be=(St-$e).toFixed(0)}}}else if(bt[ce]==="volume"){if(typeof Ee.getSliceIndex=="function"&&(Ce=Ee.getSliceIndex()),typeof Ee.getNumberOfSlices=="function"&&(pe=Ee.getNumberOfSlices()),typeof Ee.getProperties=="function"){let ze;if(Ee.volumeIds&&Ee.volumeIds.size>0){const Ve=Array.from(Ee.volumeIds)[0];ze=Ee.getProperties(Ve)}else ze=Ee.getProperties();if(ze&&ze.voiRange){const{lower:Ve,upper:$e}=ze.voiRange;ge=(($e+Ve)/2).toFixed(0),be=($e-Ve).toFixed(0)}}if(typeof Ee.getSlicePlaneCoordinates=="function"){const ze=Ee.getSlicePlaneCoordinates();ze&&typeof ze.position=="number"&&(ke=ze.position.toFixed(2)+" mm")}}Pi(ze=>{const Ve=[...ze];return Ve[ce]={index:Ce+1,total:pe,windowCenter:ge,windowWidth:be,slicePosition:ke},Ve})},[bt]),[Jo,oo]=Et.useState(!1);function Os(){for(let ce=0;ce{const ce=async()=>{var be;if(console.log("setup"),!c.current){c.current=!0,await PA(),await eG(),e$();try{sd("external",ke=>({promise:(async()=>{const Ve=ke.replace(/^external:/,""),$e=new Image;$e.crossOrigin="anonymous",$e.src=Ve,await new Promise((En,Gn)=>{$e.onload=()=>En(!0),$e.onerror=dr=>Gn(dr)});const St=$e.naturalWidth||$e.width,wt=$e.naturalHeight||$e.height,Tt=document.createElement("canvas");Tt.width=St,Tt.height=wt;const jt=Tt.getContext("2d");if(!jt)throw new Error("Unable to create canvas context");jt.drawImage($e,0,0,St,wt);const Dt=jt.getImageData(0,0,St,wt);return{imageId:ke,minPixelValue:0,maxPixelValue:255,slope:1,intercept:0,rows:wt,columns:St,height:wt,width:St,color:!0,rgba:!0,sizeInBytes:Dt.data.length,getPixelData:()=>Dt.data,getImageData:()=>Dt,getCanvas:()=>Tt}})()}))}catch(ke){console.warn("Failed to register external image loader",ke)}}let Ce=R.current;if(!Ce){Ce=new nE(V),R.current=Ce;try{X&&X.length>0&&X.forEach((ke,ze)=>{const Ve=Array.isArray(ke.imageIds)?ke.imageIds:[],$e=Math.floor(Ve.length/2),St=Ve[$e]||Ve[0]||null;St&&!M[ze]&&!W.current[ze]&>(ze,St)})}catch{}}let pe=fi(G);pe||(pe=qEe(G)),bt.slice(0,ut.rows*ut.cols).filter(ke=>ke==="volume").length,dc(pe);for(let ke=0;ke{if($e.offsetWidth>0&&$e.offsetHeight>0){Ce.resize();const Dt=Ce.getViewport(Ve);Dt&&typeof Dt.resize=="function"&&Dt.resize(),Dt&&typeof Dt.render=="function"&&Dt.render()}});jt.observe($e),$e._resizeObserver=jt}if(bt[ke]==="stack"){if(ze&&ze.length>0){const jt=ze[0];if(Q(jt))try{try{const En=$e._externalPanZoom;En&&typeof En.cleanup=="function"&&En.cleanup()}catch{}$e.innerHTML="";const Dt=document.createElement("img");Dt.style.width="100%",Dt.style.height="100%",Dt.style.objectFit="contain",Dt.style.display="block",Dt.src=jt.replace(/^external:/,""),Dt.setAttribute("draggable","false"),$e.appendChild(Dt);const Jt=re($e,Dt);$e._externalPanZoom=Jt,pe.removeViewports(V,Ve)}catch(Dt){console.warn("Failed to render external image in viewport",Dt)}else try{wt.setStack(ze)}catch(Dt){console.warn("viewport.setStack failed",Dt)}}Ye?pe.removeViewports(V,Ve):pe.addViewport(Ve,V)}else if(bt[ke]==="volume"){pe.addViewport(Ve,V);const jt=`myVolumeId_${ke}`;(await h1(jt,{imageIds:ze})).load(),wt.setVolumes([{volumeId:jt}]),wt.render(),$e._overlayListener&&wt.element.removeEventListener(kg,$e._overlayListener);const Jt=()=>cr(ke,wt);wt.element.addEventListener(kg,Jt),$e._overlayListener=Jt,cr(ke,wt);continue}if(wt.render(),!N.current){Pn.current[ke]!==void 0&&typeof wt.setImageIdIndex=="function"&&hs(wt.element,{imageIndex:Pn.current[ke]});const jt=hn.current[ke];if(jt&&typeof wt.setProperties=="function"){const{voiRange:Dt,invert:Jt,interpolationType:En,VOILUTFunction:Gn,colormap:dr}=jt,Pr={};Dt&&Dt.lower!==void 0&&Dt.upper!==void 0&&(Pr.voiRange=Dt),Jt!==void 0&&(Pr.invert=Jt),En!==void 0&&(Pr.interpolationType=En),Gn&&(Pr.VOILUTFunction=Gn),dr!=null&&(typeof dr=="string"||typeof dr=="object"&&!("actor"in dr))&&(Pr.colormap=dr),setTimeout(()=>{console.log("Restoring properties (timeout) for viewport",ke,Pr),wt.setProperties(Pr),wt.render()},100)}}$e._overlayListener&&wt.element.removeEventListener(kg,$e._overlayListener);const Tt=()=>cr(ke,wt);wt.element.addEventListener(kg,Tt),$e._overlayListener=Tt,cr(ke,wt)}for(let ke=0;ke=2?(pe.hasTool(Tc.toolName)||pe.addTool(Tc.toolName),pe.setToolEnabled(Tc.toolName),pe.setToolConfiguration(Tc.toolName,{}),pe.setToolActive(Tc.toolName,{bindings:[{mouseButton:Ng.Primary}]})):pe.hasTool(Tc.toolName)&&pe.setToolDisabled(Tc.toolName)),Yo()},Ee=requestAnimationFrame(()=>{ce()});return()=>{Mn.current.forEach(Ce=>{Ce&&Ce._resizeObserver&&(Ce._resizeObserver.disconnect(),delete Ce._resizeObserver)}),cancelAnimationFrame(Ee)}},[s,cr,ut,bt,de]);const Zo=Et.useCallback(ce=>{const Ee=`CT_${ce}`,pe=R.current.getViewport(Ee);pe&&typeof pe.resetCamera=="function"&&(pe.resetCamera(),console.log("Restoring viewport properties for viewport",ce),pe.resetProperties(),pe.render())},[]),el=Et.useCallback((ce,Ee,Ce)=>{const pe=`CT_${ce}`;try{const ge=R.current;if(ge){const be=ge.getViewport(pe);be&&typeof be.setProperties=="function"&&(console.log(`Applying preset to viewport ${ce}: center=${Ee}, width=${Ce}`),be.setProperties({voiRange:{lower:Ee-Ce/2,upper:Ee+Ce/2}}),be.render(),cr(ce,be))}}catch{}},[cr]);Et.useEffect(()=>{Pi(Array(ut.rows*ut.cols).fill({index:0,total:0,windowCenter:"",windowWidth:""})),rn(Array(ut.rows*ut.cols).fill(!1))},[ut]),Et.useEffect(()=>{Yo()},[fr,fo,Xo,Yo]),Et.useEffect(()=>{if(!u)return;const ce=Ee=>{const Ce=document.querySelector(".preset-menu");Ce&&!Ce.contains(Ee.target)&&d(!1)};return document.addEventListener("mousedown",ce),()=>document.removeEventListener("mousedown",ce)},[u]),Et.useEffect(()=>{const ce=Ee=>{if(Ee.button===3||Ee.button===4)return Ee.preventDefault(),!1};return window.addEventListener("mousedown",ce,!0),window.addEventListener("mouseup",ce,!0),window.addEventListener("auxclick",ce,!0),()=>{window.removeEventListener("mousedown",ce,!0),window.removeEventListener("mouseup",ce,!0),window.removeEventListener("auxclick",ce,!0)}},[]),Et.useEffect(()=>{const ce=a.current;if(!ce)return;const Ee=Ce=>{Ce.preventDefault()};return ce.addEventListener("contextmenu",Ee),()=>{ce.removeEventListener("contextmenu",Ee)}},[]),Et.useEffect(()=>{if(!pt)return;const ce=fi(G);dc(ce)},[fe,pt]),Et.useEffect(()=>{ka.current&&(ka.current.setAttribute("webkitdirectory","true"),ka.current.setAttribute("directory","true"))},[]),Et.useEffect(()=>(window.loadDicomStackFromWadouriList=async ce=>{if(!ce||ce.length===0)return;let Ee;try{const Ce=ce[0];if(Ce&&Ce.startsWith("wadouri:")){const pe=Ce.slice(8),be=await(await fetch(pe)).arrayBuffer();Ee=Wr.parseDicom(new Uint8Array(be)).string("x0020000d")}}catch{}te(Ce=>{const pe=[...Ce,{imageIds:ce,studyInstanceUID:Ee}];return Me(ge=>{const be=[...ge];return be[0]=ce,be}),B(ge=>{const be=[...ge];return be[0]=pe.length-1,be}),Rt(ce),pe})},()=>{window.loadDicomStackFromWadouriList=void 0}),[te,Me,B,Rt]),Et.useEffect(()=>{!Mi||!de.every(Ee=>!Ee||Ee.length===0||Ee.every(Ce=>!!vt("imagePlaneModule",Ce)))||Me(Ee=>{let Ce=!1;const pe=Ee.map(ge=>{if(!ge||ge.length===0)return ge;const ze=[...ge.map(Ve=>({imageId:Ve,sliceLoc:(()=>{const $e=vt("imagePlaneModule",Ve);return $e&&$e.sliceLocation!==void 0?Number($e.sliceLocation):null})()}))].sort((Ve,$e)=>Ve.sliceLoc!==null&&$e.sliceLoc!==null?Ve.sliceLoc-$e.sliceLoc:Ve.imageId.localeCompare($e.imageId)).map(Ve=>Ve.imageId);return JSON.stringify(ze)!==JSON.stringify(ge)?(Ce=!0,ze):ge});return Ce&&Oe(!0),pe})},[Mi,X]);function dc(ce){if(!ce)return;const Ee=`CT_${fe}`;pt?(ce.setToolEnabled(hd.toolName),ce.setToolConfiguration(hd.toolName,{sourceViewportId:Ee})):ce.setToolDisabled(hd.toolName)}function tl(){var Ee,Ce,pe;const ce=R.current;if(ce)for(let ge=0;ge=pe.length||ce>=Ee)return alert("Invalid truncation bounds."),!1;const ge=pe.slice(ce,Ee+1);te([{...Ce,imageIds:ge}]),Me([ge]),B([0]);const be=R.current;if(be){const Ve=be.getViewport("CT_0");Ve&&typeof Ve.setStack=="function"&&(Ve.setStack(ge),(ke=Ve.setImageIdIndex)==null||ke.call(Ve,0),(ze=Ve.render)==null||ze.call(Ve))}return!0}function po(ce=0){const Ee=R.current;if(!Ee)return null;const Ce=Ee.getViewport(`CT_${ce}`);return!Ce||typeof Ce.getCurrentImageIdIndex!="function"?null:Ce.getCurrentImageIdIndex()}Et.useEffect(()=>{const ce=t||"default";function Ee(pe,ge){const be=R.current;if(!be)return;const ke=be.getViewport(`CT_${pe}`);if(!ke||typeof ke.getImageIds!="function")return;const Ve=ke.getImageIds().map(wt=>wt.replace(/^wadouri:/,"")),$e=ge.replace(/^wadouri:/,""),St=Ve.indexOf($e);St!==-1&&typeof ke.setImageIdIndex=="function"&&(hs(ke.element,{imageIndex:St}),cr(pe,ke))}window[`getViewport_${ce}`]=pe=>{const ge=R.current;if(ge)return ge.getViewport(`CT_${pe}`)},window[`getAllViewports_${ce}`]=()=>{const pe=R.current;return pe?Array.from({length:A},(ge,be)=>pe.getViewport(`CT_${be}`)).filter(Boolean):[]},window[`jumpToSliceByImageId_${ce}`]=Ee,window[`resetViewer_${ce}`]=tl,window[`truncateStack_${ce}`]=nl,window[`getCurrentStackPosition_${ce}`]=po,window[`loadAdditionalStack_${ce}`]=async(pe,ge)=>{var ke;if(!Array.isArray(pe)||pe.length===0)return;let be=ge;if(!be&&((ke=pe[0])!=null&&ke.startsWith("wadouri:")))try{const ze=pe[0].slice(8),$e=await(await fetch(ze)).arrayBuffer();be=Wr.parseDicom(new Uint8Array($e)).string("x0020000d")}catch{}te(ze=>[...ze,{imageIds:pe,studyInstanceUID:be}]),Me(ze=>{const Ve=[...ze],$e=Ve.findIndex(St=>!St||St.length===0);return $e!==-1&&(Ve[$e]=pe),Ve}),Rt(pe)},window[`exportViewerState_${ce}`]=()=>{var Dt;const pe=ut.rows*ut.cols,ge=bt.slice(0,pe),be=_e.slice(0,pe),ke=X.map(Jt=>({i:Jt.imageIds,u:Jt.studyInstanceUID}));console.log("Exporting viewer state with",pe,"active viewports"),console.log("modes",ge);const ze=R.current,Ve=[],$e=[],St=[],wt=[],Tt=[];for(let Jt=0;Jt{try{N.current=!0;const ge=typeof pe=="string"?JSON.parse(pe):pe;if(ge.grid&&Wt(ge.grid),ge.modes&&Rn(ge.modes),ge.stacks&&te(ge.stacks.map(Ve=>({imageIds:Ve.i,studyInstanceUID:Ve.u}))),ge.stackIdx&&ge.stacks){const Ve=ge.stackIdx.map($e=>{var St;return((St=ge.stacks[$e])==null?void 0:St.i)||[]});Me(Ve),B(ge.stackIdx)}const be=30;let ke=0;async function ze(){var Tt,jt,Dt,Jt,En,Gn,dr,Pr,Ki,Po,Ur;const Ve=R.current;if(!Ve){N.current=!1;return}const $e=((Tt=ge.grid)==null?void 0:Tt.rows)*((jt=ge.grid)==null?void 0:jt.cols)||1;let St=!0;for(let an=0;an<$e;an++){console.log("Checking viewport",an);const Ln=Ve.getViewport(`CT_${an}`);if(!Ln){St=!1;break}const Ro=(Dt=ge.stackIdx)==null?void 0:Dt[an],Nt=(Jt=ge.stacks)==null?void 0:Jt[Ro],er=(Nt==null?void 0:Nt.i)||[];if(er.length)try{const bn=((En=Ln.getImageIds)==null?void 0:En.call(Ln))||[];if(bn.length!==er.length||!bn.every((Er,Rr)=>Er===er[Rr])){console.warn(`Viewport ${an}: importedImageIds do not match viewportImageIds`,{importedImageIds:er,viewportImageIds:bn}),St=!1;break}}catch{St=!1}}if(!St&&ke{ze()},500);return}for(let an=0;an<$e;an++){console.log("Setting stack/volume for viewport",an);const Ln=Ve.getViewport(`CT_${an}`);if(!Ln)continue;const Ro=(Gn=ge.stackIdx)==null?void 0:Gn[an],Nt=(dr=ge.stacks)==null?void 0:dr[Ro],er=(Nt==null?void 0:Nt.i)||[];if(er.length)if(console.log("mode",(Pr=ge.modes)==null?void 0:Pr[an]),((Ki=ge.modes)==null?void 0:Ki[an])==="volume"){try{const bn=`myVolumeId_${an}`;(await h1(bn,{imageIds:er})).load(),Ln.setVolumes([{volumeId:bn}]),Ln.render()}catch(bn){console.warn("Failed to create/load volume for viewport",an,bn)}if(ge.orientations&&ge.orientations[an]&&typeof Ln.setOrientation=="function")try{Ln.setOrientation(ge.orientations[an]),Ln.render()}catch{}ge.volumeSliceIndices&&setTimeout(()=>{try{hs(Ln.element,{imageIndex:ge.volumeSliceIndices[an]})}catch{}},100)}else{try{Ln.setStack&&(Ln.setStack(er),Ln.render())}catch(bn){console.warn("Failed to set stack for viewport",an,bn)}if(ge.stackPos&&typeof ge.stackPos[an]=="number"&&typeof Ln.setImageIdIndex=="function")try{Vn&&hs?hs(Ln.element,{imageIndex:ge.stackPos[an]}):Ln.setImageIdIndex(ge.stackPos[an])}catch{}}}const wt=1500;console.log(`Waiting ${wt}ms before applying properties/camera to viewports`),await new Promise(an=>setTimeout(an,wt));for(let an=0;an<$e;an++){console.log("Applying props/camera for viewport",an);const Ln=Ve.getViewport(`CT_${an}`);if(!Ln)continue;const Ro=(Po=ge.stackIdx)==null?void 0:Po[an],Nt=(Ur=ge.stacks)==null?void 0:Ur[Ro];if(((Nt==null?void 0:Nt.i)||[]).length){if(ge.props&&ge.props[an]&&typeof Ln.setProperties=="function"){console.log("Restoring properties for viewport",an,ge.props[an]);const bn={...ge.props[an]};if(bn.colormap!==void 0&&bn.colormap!==null){const Er=bn.colormap;if(typeof Er!="string")if(typeof Er=="object"){const Rr={};typeof Er.name=="string"&&(Rr.name=Er.name),Er.opacity!==void 0&&typeof Er.opacity=="number"&&(Rr.opacity=Er.opacity),Object.keys(Rr).length===0?delete bn.colormap:bn.colormap=Rr}else delete bn.colormap}try{Ln.setProperties(bn),Ln.render()}catch(Er){console.warn("viewport.setProperties failed, retrying without colormap",Er);try{const Rr={...bn};delete Rr.colormap,Ln.setProperties(Rr),Ln.render()}catch(Rr){console.error("Retrying viewport.setProperties without colormap also failed",Rr)}}}if(ge.cam&&ge.cam[an]&&typeof Ln.setCamera=="function")try{Ln.setCamera(ge.cam[an]),Ln.render()}catch{}}}N.current=!1}setTimeout(()=>{ze()},100)}catch(ge){N.current=!1,alert("Failed to import viewer state: "+ge)}},window[`exportAnnotations_${ce}`]=()=>{try{let pe=Zr.getAllAnnotations();if(console.log("Exporting annotations:",pe),Array.isArray(pe)){const ge=[sf.toolName,Rh.toolName,cf.toolName,$l.toolName,Rd.toolName,af.toolName,Hc.toolName,jl.toolName,Oh.toolName];pe=pe.filter(be=>ge.includes(be.metadata.toolName))}else return"{}";return JSON.stringify(pe,null,2)}catch(pe){return alert("Failed to export annotations: "+pe),"{}"}},window.__pendingImportAnnotations=window.__pendingImportAnnotations||{};const Ce=pe=>{try{const ge=window.__pendingImportAnnotations&&window.__pendingImportAnnotations[pe];if(!ge||!ge.length)return;const be=Zr;if(!be||typeof be.addAnnotation!="function")return;for(;(window.__pendingImportAnnotations[pe]||[]).length;){const ke=(window.__pendingImportAnnotations[pe]||[]).shift();ke&&Array.isArray(ke)&&ke.forEach(ze=>{try{be.addAnnotation(ze,ze.annotationUID)}catch(Ve){console.error("Failed to add queued annotation",Ve,ze)}})}R.current&&R.current.render()}catch(ge){console.error("Error flushing pending annotations:",ge)}};return window[`importAnnotations_${ce}`]=pe=>{try{const ge=typeof pe=="string"?JSON.parse(pe):pe,be=Zr;if(!be||typeof be.addAnnotation!="function"){window.__pendingImportAnnotations[ce]=window.__pendingImportAnnotations[ce]||[],window.__pendingImportAnnotations[ce].push(ge),console.warn("importAnnotations: annotation state not ready, queued import",ce),setTimeout(()=>Ce(ce),500);return}if(be.removeAllAnnotations)try{be.removeAllAnnotations()}catch(ke){console.warn("removeAllAnnotations failed",ke)}Array.isArray(ge)&&ge.forEach(ke=>{try{be.addAnnotation(ke,ke.annotationUID)}catch(ze){console.error("Failed to add annotation",ze,ke)}}),R.current&&R.current.render()}catch(ge){console.error("Failed to import annotations:",ge,{apiKey:ce,cornerstoneTools:!!mz,renderingEngine:!!R.current});try{alert("Failed to import annotations: "+ge)}catch{}}try{Ce(ce)}catch{}},window[`importLegacyAnnotations_${ce}`]=pe=>{Zr.removeAllAnnotations&&Zr.removeAllAnnotations();let ge;try{ge=typeof pe=="string"?JSON.parse(pe):pe}catch{alert("Invalid legacy annotation JSON");return}const be={ArrowAnnotate:"ArrowAnnotate"};Object.entries(ge).forEach(([ke,ze])=>{console.log("Importing legacy annotations for imageId:",ke),Object.entries(ze).forEach(([Ve,$e])=>{const St=be[Ve]||Ve;$e.data&&Array.isArray($e.data)&&$e.data.forEach(wt=>{const Tt=G7(ke,{x:wt.handles.start.y,y:wt.handles.start.x}),jt=G7(ke,{x:wt.handles.end.y,y:wt.handles.end.x});console.log("Importing legacy annotation:"),console.log(" Image ID:",ke),console.log(" Start World:",Tt),console.log(" End World:",jt);const Dt=vt("imagePlaneModule",ke);console.log(M4);let Jt=vt("frameOfReferenceUID",ke);!Jt&&Dt&&Dt.frameOfReferenceUID&&(Jt=Dt.frameOfReferenceUID);const En=Dt!=null&&Dt.rowCosines&&(Dt!=null&&Dt.columnCosines)?[Dt.rowCosines[1]*Dt.columnCosines[2]-Dt.rowCosines[2]*Dt.columnCosines[1],Dt.rowCosines[2]*Dt.columnCosines[0]-Dt.rowCosines[0]*Dt.columnCosines[2],Dt.rowCosines[0]*Dt.columnCosines[1]-Dt.rowCosines[1]*Dt.columnCosines[0]]:void 0;Array.isArray(En)&&En.length,typeof wt.rotation=="number"&&wt.rotation;const Gn={annotationUID:wt.uuid,metadata:{toolName:St,referencedImageId:ke,FrameOfReferenceUID:Jt,viewPlaneNormal:En},data:{handles:{points:[Tt,jt],textBox:wt.handles.textBox},text:wt.text||""},visibility:wt.visible!==!1,active:wt.active||!1};Zr.addAnnotation(Gn,Gn.annotationUID)})})}),R.current&&R.current.render()},window[`importLegacyViewport_${ce}`]=pe=>{let ge;try{ge=typeof pe=="string"?JSON.parse(pe):pe}catch{alert("Invalid legacy viewport JSON");return}const be=R.current;if(!be)return;const ke=`CT_${fe??0}`,ze=be.getViewport(ke);if(!ze)return;const Ve={};if(ge.voi&&(Ve.voiRange={lower:ge.voi.windowCenter-ge.voi.windowWidth/2,upper:ge.voi.windowCenter+ge.voi.windowWidth/2}),typeof ge.invert=="boolean"&&(Ve.invert=ge.invert),typeof ge.pixelReplication=="boolean"&&(Ve.interpolationType=ge.pixelReplication?0:1),typeof ge.hflip=="boolean"&&(Ve.hflip=ge.hflip),typeof ge.vflip=="boolean"&&(Ve.vflip=ge.vflip),typeof ze.setProperties=="function"&&ze.setProperties(Ve),ge.translation||ge.scale){const $e=ze.getCamera?ze.getCamera():{};ge.translation&&($e.translation={...$e.translation,...ge.translation}),ge.scale&&($e.parallelScale=200/ge.scale),console.log("Applying legacy camera properties:",$e),typeof ze.setCamera=="function"&&ze.setCamera($e)}typeof ge.rotation=="number"&&ze.setRotation(ge.rotation),ze.render(),cr(fe??0,ze)},()=>{window[`exportViewerState_${ce}`]=void 0,window[`importViewerState_${ce}`]=void 0,window[`exportAnnotations_${ce}`]=void 0,window[`importAnnotations_${ce}`]=void 0,window[`importLegacyAnnotations_${ce}`]=void 0,window[`importLegacyViewport_${ce}`]=void 0,window[`jumpToSliceByImageId_${ce}`]=void 0,window[`resetViewer_${ce}`]=void 0,window[`truncateStack_${ce}`]=void 0,window[`getCurrentStackPosition_${ce}`]=void 0,window[`loadAdditionalStack_${ce}`]=void 0,window[`getViewport_${ce}`]=void 0,window[`getAllViewports_${ce}`]=void 0}},[ut,bt,_e,X,de,Wt,Rn,B,te,Me,te,Me,Rt]),Et.useEffect(()=>{const ce=a.current;if(!ce)return;function Ee(Ce){if(console.log("Handling arrow key navigation",Ce.key),console.log("activeViewport",fe),fe===null)return;const pe=R.current;if(!pe)return;const ge=pe.getViewport(`CT_${fe}`);if(ge){if(console.log(ge),bt[fe]==="stack"){if(typeof ge.getCurrentImageIdIndex!="function"||typeof ge.setImageIdIndex!="function")return;const be=de[fe];if(!be||be.length===0)return;Ce.key==="ArrowUp"||Ce.key==="ArrowRight"?(Qs(ge,{delta:-1}),Ce.preventDefault()):(Ce.key==="ArrowDown"||Ce.key==="ArrowLeft")&&(Qs(ge,{delta:1}),Ce.preventDefault())}bt[fe]==="volume"&&typeof ge.getSliceIndex=="function"&&typeof ge.getNumberOfSlices=="function"&&ge.getNumberOfSlices()>1&&(Ce.key==="ArrowUp"||Ce.key==="ArrowRight"?(Qs(ge,{delta:-1}),Ce.preventDefault()):(Ce.key==="ArrowDown"||Ce.key==="ArrowLeft")&&(Qs(ge,{delta:1}),Ce.preventDefault()))}}return ce.addEventListener("keydown",Ee),()=>{ce.removeEventListener("keydown",Ee)}},[fe,bt,de,cr]);const mo=fe!==null?_e[fe]:0,Li=X[mo];Li==null||Li.studyInstanceUID;const[Si,Ms]=Et.useState(()=>Array(A).fill(null)),ma=ut.rows*ut.cols,va=[];for(let ce=0;ceMn.current[ce]=Ce,style:{flex:1,border:Ee?"1px solid #222":"none",background:"#000",minWidth:0,minHeight:0,position:"relative",overflow:"hidden",flexDirection:"column",gridRow:Math.floor(ce/ut.cols)+1,gridColumn:ce%ut.cols+1,height:"100%",boxShadow:fe===ce?"0 0 0 4px #1976d2, 0 0 16px 4px #1976d2cc":void 0,zIndex:fe===ce?10:1},onClick:()=>{le(ce),Bn(!1)},onDoubleClick:()=>Zo(ce),onDragOver:Ce=>{Ce.preventDefault(),Ce.dataTransfer.dropEffect="copy"},onDrop:Ce=>{Ce.preventDefault();const pe=Ce.dataTransfer.getData("text/stack-idx"),ge=parseInt(pe,10);isNaN(ge)||ve(ce,ge)},children:[Ke.jsx("button",{style:{position:"absolute",top:8,left:8,zIndex:20,background:"#333",color:"#fff",border:"none",borderRadius:"4px",padding:"4px 8px",cursor:"pointer",fontSize:"12px",opacity:.85},onClick:()=>{Rn(Ce=>{const pe=[...Ce];return pe[ce]=Ce[ce]==="stack"?"volume":"stack",pe})},children:bt[ce]==="stack"?"Volume":"Stack"}),bt[ce]==="volume"&&Ke.jsxs("div",{style:{position:"absolute",top:8,left:70,zIndex:21,display:"flex",gap:"6px",background:"rgba(34,34,34,0.85)",borderRadius:"4px",padding:"2px 6px",alignItems:"center"},children:[Ke.jsx("button",{style:{background:"#444",color:"#fff",border:"none",borderRadius:"3px",padding:"2px 8px",cursor:"pointer",fontSize:"12px",marginRight:"2px"},onClick:()=>{const Ce=R.current,pe=Ce==null?void 0:Ce.getViewport(`CT_${ce}`);pe&&pe.setOrientation&&(pe.setOrientation("axial"),pe.render())},children:"Axial"}),Ke.jsx("button",{style:{background:"#444",color:"#fff",border:"none",borderRadius:"3px",padding:"2px 8px",cursor:"pointer",fontSize:"12px",marginRight:"2px"},onClick:()=>{const Ce=R.current,pe=Ce==null?void 0:Ce.getViewport(`CT_${ce}`);pe&&pe.setOrientation&&(pe.setOrientation("sagittal"),pe.render())},children:"Sagittal"}),Ke.jsx("button",{style:{background:"#444",color:"#fff",border:"none",borderRadius:"3px",padding:"2px 8px",cursor:"pointer",fontSize:"12px"},onClick:()=>{const Ce=R.current,pe=Ce==null?void 0:Ce.getViewport(`CT_${ce}`);pe&&pe.setOrientation&&(pe.setOrientation("coronal"),pe.render())},children:"Coronal"})]}),Ke.jsxs("button",{style:{position:"absolute",top:40,left:8,zIndex:20,background:"#111",color:"#fff",border:"none",borderRadius:"4px",padding:"4px 8px",cursor:"pointer",fontSize:"13px",opacity:.85,marginTop:"4px",display:"flex",alignItems:"center",gap:"6px"},title:"Toggle Fullscreen",onClick:Ce=>{Ce.stopPropagation();const pe=Mn.current[ce];document.fullscreenElement===pe?document.exitFullscreen():pe!=null&&pe.requestFullscreen?pe.requestFullscreen():pe!=null&&pe.webkitRequestFullscreen?pe.webkitRequestFullscreen():pe!=null&&pe.msRequestFullscreen&&pe.msRequestFullscreen()},onMouseEnter:()=>I(ce),onMouseLeave:()=>I(null),children:[Ke.jsx("span",{style:{fontSize:"18px",lineHeight:1},children:"⛶"}),D===ce&&Ke.jsx("span",{style:{marginLeft:6},children:document.fullscreenElement===Mn.current[ce]?"Exit Fullscreen":"Fullscreen"})]}),bt[ce]==="stack"&&F&&(()=>{var wt;const Ce=de[ce],ge=(Zr.getAllAnnotations()||[]).filter(Tt=>Tt.metadata&&Tt.metadata.referencedImageId&&Ce.includes(Tt.metadata.referencedImageId)&&Tt.metadata.toolName!==Wa.toolName);if(!ge.length)return null;const be=R.current,ke=be==null?void 0:be.getViewport(`CT_${ce}`),ze=((wt=ke==null?void 0:ke.getCurrentImageIdIndex)==null?void 0:wt.call(ke))??0,Ve=Ce[ze],$e=ge.filter(Tt=>Tt.metadata.referencedImageId===Ve),St=Si[ce];return Ke.jsxs("div",{style:{position:"absolute",left:"50%",bottom:60,transform:"translateX(-50%)",zIndex:30,display:"flex",gap:4,pointerEvents:"auto",alignItems:"center"},children:[Ke.jsx("button",{style:{background:"rgba(30,30,30,0.7)",color:"#fff",border:"none",borderRadius:"50%",width:28,height:28,fontSize:"16px",fontWeight:"bold",cursor:"pointer",opacity:.7,display:"flex",alignItems:"center",justifyContent:"center",boxShadow:"0 1px 4px rgba(0,0,0,0.18)",transition:"opacity 0.2s"},title:"Previous Annotation","aria-label":"Previous Annotation",onClick:()=>{const Tt=R.current,jt=Tt==null?void 0:Tt.getViewport(`CT_${ce}`);if(!jt||typeof jt.getCurrentImageIdIndex!="function")return;const Dt=jt.getCurrentImageIdIndex(),Jt=j7(Dt,Ce,ge,-1);if(Jt!==null&&typeof jt.setImageIdIndex=="function"){hs(jt.element,{imageIndex:Jt}),cr(ce,jt);const En=Ce[Jt],Gn=ge.filter(dr=>dr.metadata.referencedImageId===En);Xr(ce,Gn.length>0?Gn[0].annotationUID:null)}},children:Ke.jsx("span",{"aria-hidden":"true",children:"◀"})}),Ke.jsx("button",{style:{background:"rgba(30,30,30,0.7)",color:"#fff",border:"none",borderRadius:"50%",width:28,height:28,fontSize:"16px",fontWeight:"bold",cursor:"pointer",opacity:.7,display:"flex",alignItems:"center",justifyContent:"center",boxShadow:"0 1px 4px rgba(0,0,0,0.18)",transition:"opacity 0.2s"},title:"Next Annotation","aria-label":"Next Annotation",onClick:()=>{const Tt=R.current,jt=Tt==null?void 0:Tt.getViewport(`CT_${ce}`);if(!jt||typeof jt.getCurrentImageIdIndex!="function")return;const Dt=jt.getCurrentImageIdIndex(),Jt=j7(Dt,Ce,ge,1);if(Jt!==null&&typeof jt.setImageIdIndex=="function"){hs(jt.element,{imageIndex:Jt}),cr(ce,jt);const En=Ce[Jt],Gn=ge.filter(dr=>dr.metadata.referencedImageId===En);Xr(ce,Gn.length>0?Gn[0].annotationUID:null)}},children:Ke.jsx("span",{"aria-hidden":"true",children:"▶"})}),$e.length>0&&Ke.jsx("div",{style:{display:"flex",gap:2,alignItems:"center"},children:$e.map(Tt=>Ke.jsxs("div",{style:{display:"flex",alignItems:"center",background:St===Tt.annotationUID?"rgb(4, 225, 0)":"#444",color:St===Tt.annotationUID?"#222":"#fff",borderRadius:"4px",padding:"2px 6px",marginRight:2,cursor:"pointer",border:St===Tt.annotationUID?"2px solid #1976d2":"none",fontWeight:St===Tt.annotationUID?"bold":"normal"},onClick:()=>Xr(ce,Tt.annotationUID),children:[Ke.jsxs("span",{style:{marginRight:4},title:Tt.metadata.toolName||"Annotation",children:[St===Tt.annotationUID?"★ ":"",Ke.jsx("span",{style:{fontSize:14,lineHeight:1},children:KEe(Tt.metadata.toolName)})]}),Ke.jsx("button",{style:{background:"transparent",color:"#f44336",border:"1px solid #f44336",borderRadius:3,width:16,height:16,fontSize:10,lineHeight:1,cursor:"pointer",marginLeft:4,display:"flex",alignItems:"center",justifyContent:"center",opacity:.95,padding:0},title:"Delete this annotation","aria-label":"Delete annotation",onClick:jt=>{jt.stopPropagation(),bs(ce,Tt.annotationUID,$e)},children:Ke.jsx("span",{"aria-hidden":"true",children:"✖"})})]},Tt.annotationUID))})]})})(),Ke.jsx("div",{style:{position:"absolute",left:8,bottom:8,background:"rgba(0,0,0,0.7)",color:"#fff",padding:"6px 12px",borderRadius:"4px",fontSize:"14px",zIndex:10,pointerEvents:"none",minWidth:"120px",userSelect:"none"},children:bt[ce]==="stack"?Ke.jsxs(Ke.Fragment,{children:[Ke.jsxs("div",{children:["Image: ",(Mr=un[ce])==null?void 0:Mr.index," / ",(Ps=un[ce])==null?void 0:Ps.total]}),Ke.jsxs("div",{children:["WC: ",(Ai=un[ce])==null?void 0:Ai.windowCenter,"   WW: ",(oi=un[ce])==null?void 0:oi.windowWidth]})]}):Ke.jsxs("div",{children:["Slice: ",(os=un[ce])==null?void 0:os.index," / ",(Qo=un[ce])==null?void 0:Qo.total,((Ni=un[ce])==null?void 0:Ni.slicePosition)&&Ke.jsxs("span",{children:["   (",(ya=un[ce])==null?void 0:ya.slicePosition,")"]}),Ke.jsx("br",{}),"WC: ",(Rs=un[ce])==null?void 0:Rs.windowCenter,"   WW: ",(Ls=un[ce])==null?void 0:Ls.windowWidth]})}),Ke.jsx("div",{style:{position:"absolute",right:8,bottom:8,zIndex:110,pointerEvents:"auto"},children:Ke.jsxs("div",{className:"preset-menu",style:{background:"rgba(0,0,0,0.7)",color:"#fff",borderRadius:"4px",fontSize:"14px",minWidth:"120px",overflow:"hidden",cursor:"pointer",position:"relative",boxShadow:fn[ce]?"0 2px 8px rgba(0,0,0,0.3)":void 0,pointerEvents:"auto"},onClick:Ce=>Ce.stopPropagation(),children:[Ke.jsxs("div",{style:{padding:"6px 12px",fontWeight:"bold",userSelect:"none"},onClick:Ce=>{Ce.stopPropagation(),rn(pe=>{const ge=[...pe];return ge[ce]=!ge[ce],ge})},children:["Presets",Ke.jsx("span",{style:{float:"right",fontWeight:"normal"},children:fn[ce]?"▲":"▼"})]}),fn[ce]&&Ke.jsxs("div",{className:"preset-menu-content",style:{background:"rgba(0,0,0,0.95)",borderRadius:"0 0 4px 4px",padding:"6px 0 6px 0",display:"flex",flexDirection:"column",zIndex:111,pointerEvents:"auto"},onClick:Ce=>Ce.stopPropagation(),children:[Ke.jsx("button",{style:{display:"block",width:"100%",margin:"2px 0 8px 0",background:"#444",color:"#fff",border:"none",borderRadius:"3px",cursor:"pointer",padding:"6px 0",fontSize:"13px",fontWeight:"600"},onClick:Ce=>{Ce.stopPropagation();try{const pe=`CT_${ce}`,ge=R.current,be=ge==null?void 0:ge.getViewport(pe);be&&(typeof be.resetProperties=="function"&&be.resetProperties(),typeof be.resetCamera=="function"&&be.resetCamera(),typeof be.render=="function"&&be.render(),cr(ce,be))}catch(pe){console.warn("Failed to reset viewport properties",pe)}rn(pe=>{const ge=[...pe];return ge[ce]=!1,ge})},children:"Reset to default"}),HEe.map(Ce=>Ke.jsx("button",{style:{display:"block",width:"100%",margin:"2px 0",background:"#333",color:"#fff",border:"none",borderRadius:"3px",cursor:"pointer",padding:"4px 0",fontSize:"13px",opacity:.9},onClick:pe=>{pe.stopPropagation(),el(ce,Ce.center,Ce.width),rn(ge=>{const be=[...ge];return be[ce]=!1,be})},children:Ce.name},Ce.name))]})]})}),bt[ce]==="stack"&&de[ce]&&Ke.jsx("div",{style:{position:"absolute",top:"10%",right:8,width:"12px",height:"80%",maxHeight:"100%",minHeight:0,zIndex:30,display:de[ce].length>0?"flex":"none",alignItems:"flex-start",justifyContent:"center",pointerEvents:"none",flexDirection:"column",padding:0},children:Ke.jsx("div",{style:{width:"8px",height:"100%",maxHeight:"100%",minHeight:0,borderRadius:"6px",background:"#222",position:"relative",display:"flex",flexDirection:"column",justifyContent:"flex-start",boxShadow:"0 0 8px #2196f3cc",overflow:"hidden"},children:de[ce].map((Ce,pe)=>{const ge=!!vt("imagePlaneModule",Ce),be=R.current;let ke=-1;if(be&&typeof be.getViewport=="function"){const Ve=be.getViewport(`CT_${ce}`);Ve&&typeof Ve.getCurrentImageIdIndex=="function"&&(ke=Ve.getCurrentImageIdIndex())}const ze=pe===ke;return Ke.jsx("div",{style:{width:"100%",height:`${100/de[ce].length}%`,background:ze?"linear-gradient(to right, #ffeb3b 60%, #ff9800 100%)":ge?"linear-gradient(to right, #4caf50 60%, #2196f3 100%)":"#444",opacity:ge?.95:.4,transition:"background 0.3s, opacity 0.3s",borderBottom:pe{const Ve=R.current,$e=Ve==null?void 0:Ve.getViewport(`CT_${ce}`);$e&&typeof $e.setImageIdIndex=="function"&&bt[ce]==="stack"&&(hs($e.element,{imageIndex:pe}),cr(ce,$e))}},Ce)})})}),bt[ce]==="volume"&&(()=>{const Ce=R.current,pe=Ce==null?void 0:Ce.getViewport(`CT_${ce}`);let ge=0,be=0;return pe&&typeof pe.getNumberOfSlices=="function"&&typeof pe.getSliceIndex=="function"&&(ge=pe.getNumberOfSlices(),be=pe.getSliceIndex()),ge>1?Ke.jsx("div",{style:{position:"absolute",top:"10%",right:8,width:"12px",height:"80%",maxHeight:"100%",minHeight:0,zIndex:30,display:"flex",alignItems:"flex-start",justifyContent:"center",pointerEvents:"auto",flexDirection:"column",padding:0},children:Ke.jsx("div",{style:{width:"8px",height:"100%",maxHeight:"100%",minHeight:0,borderRadius:"6px",background:"#222",position:"relative",display:"flex",flexDirection:"column",justifyContent:"flex-start",boxShadow:"0 0 8px #2196f3cc",overflow:"hidden",cursor:"pointer"},onClick:ke=>{const Ve=ke.currentTarget.getBoundingClientRect(),$e=ke.clientY-Ve.top,St=Math.floor($e/Ve.height*ge),wt=R.current,Tt=wt==null?void 0:wt.getViewport(`CT_${ce}`);Tt&&(hs(Tt.element,{imageIndex:St}),Tt.render(),cr(ce,Tt))},children:Array.from({length:ge}).map((ke,ze)=>{const Ve=ze===be;return Ke.jsx("div",{style:{width:"100%",height:`${100/ge}%`,minHeight:Ve?1:0,background:Ve?"linear-gradient(to right, #ffeb3b 60%, #ff9800 100%)":"#444",opacity:Ve?.95:.4,transition:"background 0.3s, opacity 0.3s",borderBottom:ze1||!de[ce]||de[ce].length===0)&&Ke.jsx("div",{style:{position:"absolute",left:0,right:0,bottom:8,zIndex:20,display:"flex",alignItems:"center",justifyContent:"center",pointerEvents:"auto",width:"100%",background:"none",borderRadius:"0",padding:0},children:Ke.jsxs("div",{style:{position:"relative"},children:[Ke.jsxs("button",{onClick:Ce=>{Ce.stopPropagation(),O(pe=>pe===ce?null:ce)},style:{padding:"6px 12px",background:"#333",color:"#fff",border:"1px solid #444",borderRadius:"4px",cursor:"pointer",pointerEvents:"auto",fontSize:13},title:"Choose stack",children:[(()=>{const Ce=Array.isArray(_e)?_e[ce]:void 0,pe=typeof Ce=="number"&&X[Ce]?X[Ce]:void 0,ge=pe&&Array.isArray(pe.imageIds)?pe.imageIds:[],be=pe?pe.name||(pe.caseId?`Case: ${pe.caseId}`:void 0):void 0;if(be)return be;if(ge.length>0)return`Stack ${typeof Ce=="number"?Ce+1:"1"}`;const ke=de[ce]||[];return ke.length>0?`Stack (${ke.length} images)`:"No stack"})(),Ke.jsx("span",{style:{marginLeft:8,opacity:.8},children:P===ce?"▲":"▼"})]}),P===ce&&Ke.jsx("div",{ref:Ce=>{Ce&&Ce.focus()},tabIndex:0,style:{position:"absolute",left:0,bottom:"110%",background:"#222",border:"1px solid #444",borderRadius:"4px",boxShadow:"0 2px 8px rgba(0,0,0,0.3)",zIndex:100,minWidth:220,maxHeight:260,overflowY:"auto",overscrollBehavior:"contain",scrollbarWidth:"thin",padding:6},role:"listbox",onMouseDown:Ce=>Ce.stopPropagation(),onWheel:Ce=>{var ge;try{Ce.stopPropagation()}catch{}try{Ce.preventDefault()}catch{}const pe=Ce.currentTarget;if(pe){const be=Ce.deltaY??((ge=Ce.nativeEvent)==null?void 0:ge.deltaY)??0;pe.scrollTop+=be}},onBlur:Ce=>{setTimeout(()=>{Ce.currentTarget.contains(document.activeElement)||O(null)},0)},children:(()=>{const Ce={};return X.forEach((pe,ge)=>{const be=pe.studyId||pe.studyInstanceUID||"Unspecified";Ce[be]||(Ce[be]=[]),Ce[be].push({idx:ge,stack:pe})}),Object.keys(Ce).map(pe=>Ke.jsxs("div",{style:{marginBottom:6},children:[Ke.jsx("div",{style:{fontSize:12,color:"#aaa",padding:"4px 8px",fontWeight:700},children:pe==="Unspecified"?"Unspecified study":`Study: ${pe}`}),Ke.jsx("div",{children:Ce[pe].map(({idx:ge,stack:be})=>{const ke=Array.isArray(be.imageIds)?be.imageIds:[],ze=be&&(be.name||be.caseId)?be.name||`Case: ${be.caseId}`:`Stack ${ge+1}`,Ve=ke.length,$e=!Array.isArray(ke)||Ve===0;return Ke.jsxs("button",{role:"option","aria-selected":!1,title:$e?"Invalid stack descriptor":`${ze} — ${Ve} image${Ve===1?"":"s"}${be!=null&&be.caseId?` — case ${be.caseId}`:""}`,style:{display:"flex",flexDirection:"column",alignItems:"flex-start",width:"100%",padding:"8px 12px",background:"transparent",color:"#fff",border:"none",textAlign:"left",cursor:$e?"not-allowed":"pointer"},onClick:St=>{if(St.stopPropagation(),$e){console.warn(`Attempted to select invalid stack at index ${ge}`,be);return}ve(ce,ge).catch(wt=>console.error("Failed to load stack:",wt)),O(null)},children:[Ke.jsx("div",{style:{fontWeight:"600",fontSize:13},children:ze}),Ke.jsxs("div",{style:{fontSize:12,opacity:.7},children:[Ve," image",Ve===1?"":"s",be!=null&&be.caseId?` • case ${be.caseId}`:""]})]},ge)})})]},pe))})()})]})})]},ce))}return Ke.jsxs("div",{ref:a,style:{position:"relative",inset:0,width:"100%",height:"100%",boxSizing:"border-box",background:"#222",padding:"12px",overflow:"hidden"},children:[We&&Ke.jsx("div",{style:{position:"absolute",zIndex:3e3,top:0,left:0,width:"100%",height:"100%",background:"rgba(0,0,0,0.7)",color:"#fff",display:"flex",alignItems:"center",justifyContent:"center",fontSize:28,fontWeight:"bold",letterSpacing:1},children:We==="annotations"?"Loading Annotations...":"Loading Viewer State..."}),ie&&Ke.jsxs("div",{style:{position:"fixed",top:12,left:12,right:12,zIndex:1e4,background:"#fff3cd",color:"#856404",border:"1px solid #ffeeba",padding:"10px 14px",borderRadius:6,display:"flex",alignItems:"center",justifyContent:"space-between",gap:12},children:[Ke.jsxs("div",{style:{flex:1,fontSize:14},children:[Ke.jsx("strong",{children:"Graphics error:"})," The viewer encountered a WebGL/graphics error and may be unstable. Please reload the page.",xe?Ke.jsx("div",{style:{marginTop:6,fontSize:12,color:"#6b4f00"},children:xe}):null]}),Ke.jsxs("div",{style:{display:"flex",gap:8,alignItems:"center"},children:[Ke.jsx("button",{onClick:()=>window.location.reload(),style:{padding:"6px 10px"},children:"Reload"}),Ke.jsx("button",{onClick:()=>oe(!1),style:{padding:"6px 10px"},children:"Dismiss"})]})]}),Ke.jsx("div",{onMouseEnter:()=>{p||m(!0)},onMouseLeave:()=>{p||m(!1)},style:{position:"absolute",right:0,top:0,height:"100%",width:56,zIndex:2400,pointerEvents:p?"none":"auto"}}),y&&!p&&Ke.jsx("button",{onClick:()=>v(!0),onMouseEnter:()=>m(!0),onMouseLeave:()=>m(!1),"aria-pressed":!1,title:"Open stacks",style:{position:"absolute",right:14,top:"50%",transform:"translateY(-50%)",zIndex:2700,width:28,height:48,background:"#1976d2",color:"#fff",border:"none",borderRadius:6,cursor:"pointer",display:"flex",alignItems:"center",justifyContent:"center",boxShadow:"0 2px 8px rgba(0,0,0,0.3)",pointerEvents:"auto"},children:"▶"}),Ke.jsxs("div",{children:[Ke.jsx("button",{style:{position:"absolute",top:"50%",transform:"translateY(-50%)",left:Is,zIndex:200,width:E,height:E,background:"#222",color:"#fff",border:"none",borderRadius:"50%",fontWeight:"bold",cursor:"pointer",fontSize:"22px",boxShadow:"0 2px 8px rgba(0,0,0,0.2)",transition:"left 0.25s cubic-bezier(.4,2,.6,1), background 0.2s"},onClick:()=>Ds(ce=>!ce),"aria-label":"Open menu",children:"☰"}),ro&&Ke.jsx("div",{style:{position:"absolute",top:0,left:0,width:_,height:"100%",background:"#222",color:"#fff",zIndex:199,boxShadow:"2px 0 12px rgba(0,0,0,0.3)",flexDirection:"column",padding:"24px 16px 16px 16px",display:"flex",overflow:"hidden"},children:Ke.jsxs("div",{style:{flex:1,minHeight:0,overflowY:"auto",display:"flex",flexDirection:"column"},children:[Ke.jsxs("div",{style:{fontWeight:"bold",fontSize:18,marginBottom:24},children:["Menu",Ke.jsx("button",{style:{float:"right",background:"transparent",color:"#fff",border:"none",fontSize:"22px",cursor:"pointer"},onClick:()=>Ds(!1),"aria-label":"Close menu",children:"×"})]}),Ke.jsxs("div",{style:{display:"flex",gap:8,alignItems:"center",marginBottom:8},children:[Ke.jsxs("label",{style:{fontSize:13},children:[Ke.jsx("input",{type:"radio",name:"folderLoadMode",value:"add",checked:Hi==="add",onChange:()=>Na("add")})," Add (append)"]}),Ke.jsxs("label",{style:{fontSize:13},children:[Ke.jsx("input",{type:"radio",name:"folderLoadMode",value:"replace",checked:Hi==="replace",onChange:()=>Na("replace")})," Replace all"]})]}),Ke.jsx("button",{style:{padding:"10px 18px",background:"#333",color:"#fff",border:"none",borderRadius:"4px",fontWeight:"bold",cursor:"pointer",fontSize:"15px",marginBottom:"18px",width:"100%"},onClick:Mo,children:"Load DICOM Folder"}),Ke.jsx("input",{ref:io,type:"file",style:{display:"none"},multiple:!0,onChange:Yr}),Ke.jsx("input",{ref:ka,type:"file",style:{display:"none"},multiple:!0,onChange:Yr,accept:".dcm,application/dicom"}),Ke.jsxs("div",{style:{marginBottom:"18px",display:"flex",alignItems:"center",gap:"8px"},children:[Ke.jsx("input",{type:"checkbox",id:"orderBySliceLocation",checked:Mi,onChange:ce=>qr(ce.target.checked),style:{accentColor:"#666"}}),Ke.jsx("label",{htmlFor:"orderBySliceLocation",style:{fontSize:"15px",cursor:"pointer"},children:"Order by Slice Location"})]}),Ke.jsx("button",{style:{padding:"10px 18px",background:"#333",color:"#fff",border:"none",borderRadius:"4px",fontWeight:"bold",cursor:"pointer",fontSize:"15px",marginBottom:"18px",width:"100%"},onClick:ho,children:"Show DICOM Metadata"}),Ke.jsxs("button",{style:{padding:"10px 18px",background:Ye?"#1976d2":"#333",color:"#fff",border:"none",borderRadius:"4px",fontWeight:"bold",cursor:"pointer",fontSize:"15px",marginBottom:"18px",width:"100%"},onClick:()=>ae(ce=>!ce),children:[Ye?"Disable":"Enable"," Cross Reference Lines"]}),Ke.jsxs("button",{style:{padding:"10px 18px",background:pt?"#1976d2":"#333",color:"#fff",border:"none",borderRadius:"4px",fontWeight:"bold",cursor:"pointer",fontSize:"15px",marginBottom:"18px",width:"100%"},onClick:()=>_t(ce=>!ce),children:[pt?"Disable":"Enable"," Reference Lines"]}),Ke.jsx("button",{onClick:lt,style:{margin:8,padding:8},children:"Sort All Viewports by Slice Location"}),Ke.jsx("button",{style:{padding:"10px 18px",background:je?"#1976d2":"#333",color:"#fff",border:"none",borderRadius:"4px",fontWeight:"bold",cursor:"pointer",fontSize:"15px",marginBottom:"18px",width:"100%"},onClick:()=>ht(ce=>!ce),children:je?"Disable Alt Key for Reference Cursors (Shift always works)":"Enable Alt Key for Reference Cursors (Shift always works)"}),Ke.jsxs("button",{style:{padding:"10px 18px",background:F?"#1976d2":"#333",color:"#fff",border:"none",borderRadius:"4px",fontWeight:"bold",cursor:"pointer",fontSize:"15px",marginBottom:"18px",width:"100%"},onClick:()=>j(ce=>!ce),children:[F?"Hide":"Show"," Annotation Navigation"]})]})})]}),Ke.jsxs("div",{className:"grid-menu-hover-container",style:{position:"absolute",top:0,left:"50%",transform:"translateX(-50%)",zIndex:100,display:"flex",flexDirection:"column",alignItems:"center",width:"auto",height:"48px",pointerEvents:"none"},children:[Ke.jsx("div",{style:{position:"absolute",top:0,left:"50%",transform:"translateX(-50%)",width:80,height:14,zIndex:1,pointerEvents:"auto",background:"transparent"},onMouseEnter:()=>oo(!0),onFocus:()=>oo(!0),tabIndex:-1}),Ke.jsx("button",{style:{position:"relative",top:Jo?"0":"-43px",opacity:Jo?1:.5,transition:"top 0.25s cubic-bezier(.4,2,.6,1), opacity 0.2s",padding:"6px 16px",background:"#222",color:"#fff",border:"none",borderRadius:"4px",fontWeight:"bold",cursor:"pointer",fontSize:"15px",marginLeft:"4px",marginRight:"8px",boxShadow:"0 2px 8px rgba(0,0,0,0.2)",pointerEvents:"auto",zIndex:2,display:"block"},title:"Toggle Fullscreen",onMouseEnter:()=>oo(!0),onMouseLeave:()=>oo(!1),onClick:()=>{const ce=a.current;ce&&(document.fullscreenElement===ce?document.exitFullscreen():ce.requestFullscreen?ce.requestFullscreen():ce.webkitRequestFullscreen?ce.webkitRequestFullscreen():ce.msRequestFullscreen&&ce.msRequestFullscreen())},children:"⛶ Fullscreen"}),Ke.jsxs("button",{className:"grid-menu-btn",style:{position:"relative",top:Jo?"0":"-43px",opacity:Jo?1:.5,transition:"top 0.25s cubic-bezier(.4,2,.6,1), opacity 0.2s",padding:"6px 16px",background:"#222",color:"#fff",border:"none",borderRadius:"4px",fontWeight:"bold",cursor:"pointer",fontSize:"15px",marginRight:"8px",boxShadow:"0 2px 8px rgba(0,0,0,0.2)",pointerEvents:"auto",zIndex:2,display:"block"},onMouseEnter:()=>oo(!0),onMouseLeave:()=>oo(!1),onBlur:()=>oo(!1),onClick:()=>Bn(ce=>!ce),tabIndex:0,children:["Grid: ",ut.rows,"x",ut.cols," ▼"]}),Qt&&Ke.jsx("div",{style:{position:"absolute",top:"110%",left:"50%",transform:"translateX(-50%)",background:"#222",color:"#fff",borderRadius:"6px",boxShadow:"0 2px 12px rgba(0,0,0,0.4)",padding:"12px",display:"grid",gridTemplateColumns:"repeat(3, 40px)",gap:"8px",zIndex:200,pointerEvents:"auto"},children:Kt.map(ce=>Ke.jsxs("button",{style:{width:"40px",height:"40px",background:ce.rows===ut.rows&&ce.cols===ut.cols?"#444":"#333",color:"#fff",border:"none",borderRadius:"4px",fontWeight:"bold",cursor:"pointer",fontSize:"15px"},onClick:()=>{Os(),Wt({rows:ce.rows,cols:ce.cols}),Bn(!1)},children:[ce.rows,"x",ce.cols]},`${ce.rows}x${ce.cols}`))})]}),Ke.jsxs("div",{style:{display:"flex",flexDirection:"row",height:"calc(100% - 48px)",gap:8},children:[Ke.jsxs("div",{style:{flex:1,display:"grid",margin:3,gridTemplateRows:`repeat(${ut.rows}, 1fr)`,gridTemplateColumns:`repeat(${ut.cols}, 1fr)`,gap:"5px",minHeight:0,minWidth:0,zIndex:1,position:"relative"},children:[va,Ke.jsx("button",{style:{position:"absolute",top:8,right:8,zIndex:2600,padding:"6px 12px",background:"#222",color:"#fff",border:"none",borderRadius:"4px",cursor:"pointer",opacity:.85,userSelect:"none"},onClick:()=>g(!0),children:"Settings"})]}),Ke.jsxs("div",{style:{width:p?w:0,transition:"width 220ms ease",display:"flex",flexDirection:"column",pointerEvents:p?"auto":"none",overflow:"hidden",position:"relative"},children:[p&&Ke.jsx("div",{onMouseDown:go,title:"Resize stacks panel",style:{position:"absolute",left:0,top:0,width:8,height:"100%",cursor:"col-resize",zIndex:2800,background:"linear-gradient(to right, rgba(100,181,246,0.25), rgba(100,181,246,0))"}}),Ke.jsx("div",{style:{pointerEvents:"auto",width:"100%",height:"100%"},children:Ke.jsxs("div",{style:{height:"100%",width:"100%",background:"#1f2428",color:"#fff",boxShadow:"0 2px 14px rgba(0,0,0,0.45)",borderLeft:"1px solid #2f3336",transform:"translateX(0)",transition:"transform 220ms ease",display:"flex",flexDirection:"column",overflow:"hidden"},children:[Ke.jsxs("div",{style:{display:"flex",alignItems:"center",justifyContent:"space-between",padding:"8px 12px",borderBottom:"1px solid #2b2f31"},children:[Ke.jsx("div",{style:{fontWeight:700},children:"Stacks"}),Ke.jsxs("div",{style:{fontSize:12,color:"#9bb4c8"},children:["Active VP: ",fe!==null?fe+1:"-"]}),Ke.jsx("div",{style:{display:"flex",gap:8,alignItems:"center"},children:Ke.jsx("button",{title:"Close",onClick:()=>{v(!1)},style:{background:"transparent",color:"#fff",border:"none",cursor:"pointer",fontSize:16},children:"×"})})]}),Ke.jsx("div",{style:{overflowY:"auto",padding:8,flex:1},children:X.length===0?Ke.jsx("div",{style:{color:"#999",padding:12},children:"No stacks available"}):Ke.jsx("div",{style:{display:"flex",flexDirection:"column",gap:6},children:X.map((ce,Ee)=>{const Ce=Array.isArray(ce.imageIds)?ce.imageIds:[],pe=ce.name||(ce.caseId?`Case: ${ce.caseId}`:`Stack ${Ee+1}`),ge=Ce.length,be=!Array.isArray(Ce)||ge===0,ke=_e.includes(Ee),ze=fe!==null&&_e[fe]===Ee,Ve=Math.floor(Ce.length/2),$e=Ce[Ve]||Ce[0],St=$e?$e.replace(/^wadouri:/,""):null;return Ke.jsxs("div",{draggable:!be,onDragStart:wt=>{be||(wt.dataTransfer.setData("text/stack-idx",String(Ee)),wt.dataTransfer.effectAllowed="copy")},onClick:()=>{if(be)return;ve(fe??0,Ee)},style:{display:"flex",alignItems:"center",justifyContent:"space-between",padding:"8px 10px",background:ze?"#0d47a1":ke?"#1976d2":"transparent",color:ke?"#fff":"#ddd",border:ze?"1px solid #64b5f6":"1px solid transparent",borderRadius:6,cursor:be?"not-allowed":"pointer"},children:[Ke.jsxs("div",{style:{display:"flex",alignItems:"center",gap:8},children:[(()=>{const wt=M[Ee],jt=(wt&&wt!=="BROKEN"?wt:null)||St||null;return jt?Ke.jsx("img",{src:jt,alt:pe,style:{width:56,height:56,objectFit:"cover",borderRadius:4,background:"#111"},onError:Dt=>{console.warn("Thumbnail failed to load for stack",Ee,jt),$(Jt=>({...Jt,[Ee]:"BROKEN"}))}}):Ke.jsx("div",{style:{width:56,height:56,borderRadius:4,background:"#111",display:"flex",alignItems:"center",justifyContent:"center",color:"#777"},children:"No Img"})})(),Ke.jsxs("div",{style:{display:"flex",flexDirection:"column"},children:[Ke.jsx("div",{style:{fontWeight:600},children:pe}),Ke.jsxs("div",{style:{fontSize:12,opacity:.7},children:[ge," img",ge===1?"":"s"]})]})]}),Ke.jsxs("div",{style:{display:"flex",flexDirection:"column",alignItems:"flex-end",gap:4},children:[Ke.jsx("div",{style:{fontSize:12,opacity:.8},children:ce.studyId||""}),ze&&Ke.jsx("div",{style:{fontSize:11,color:"#bbdefb",fontWeight:700},children:"ACTIVE"})]})]},Ee)})})})]})})]})]}),h&&Ke.jsx("div",{style:{position:"absolute",top:0,left:0,width:"100%",height:"100%",background:"rgba(0,0,0,0.4)",zIndex:1e3,display:"flex",alignItems:"center",justifyContent:"center"},onClick:()=>g(!1),children:Ke.jsxs("div",{style:{background:"#222",color:"#fff",borderRadius:"8px",minWidth:"320px",minHeight:"180px",padding:"24px",boxShadow:"0 4px 24px rgba(0,0,0,0.4)",position:"relative"},onClick:ce=>ce.stopPropagation(),children:[Ke.jsx("div",{style:{fontSize:"20px",marginBottom:"16px"},children:"Settings"}),Ke.jsxs("div",{style:{marginBottom:"24px"},children:[Ke.jsx("div",{style:{marginBottom:12,fontWeight:"bold"},children:"Mouse Button Tool Bindings"}),z7.map(ce=>Ke.jsxs("div",{style:{marginBottom:10},children:[Ke.jsxs("label",{style:{marginRight:8},children:[ce.label," Button:"]}),Ke.jsx("select",{value:fr[ce.value],onChange:Ee=>$i(Ce=>({...Ce,[ce.value]:Ee.target.value})),style:{background:"#333",color:"#fff",border:"1px solid #444",borderRadius:"4px",padding:"4px 8px",fontSize:"14px"},children:a0.map(Ee=>Ke.jsx("option",{value:Ee.value,title:Ee.label,children:`${Ee.icon?`${Ee.icon} `:""}${Ee.label}`},Ee.value))})]},ce.value)),Ke.jsxs("div",{style:{margin:"12px 0"},children:[Ke.jsxs("button",{style:{background:"#333",color:"#fff",border:"none",borderRadius:"4px",padding:"4px 12px",cursor:"pointer",fontSize:"14px",marginBottom:"8px"},onClick:()=>Le(ce=>!ce),children:[yt?"Hide":"Show"," Advanced Mouse Bindings"]}),yt&&Ke.jsx("div",{style:{marginTop:8},children:J2.slice(3).map(ce=>Ke.jsxs("div",{style:{marginBottom:10},children:[Ke.jsxs("label",{style:{marginRight:8},children:[ce.label,":"]}),Ke.jsxs("select",{value:fr[ce.value]||"",onChange:Ee=>$i(Ce=>({...Ce,[ce.value]:Ee.target.value})),style:{background:"#333",color:"#fff",border:"1px solid #444",borderRadius:"4px",padding:"4px 8px",fontSize:"14px"},children:[Ke.jsx("option",{value:"",children:"(None)"}),a0.map(Ee=>Ke.jsx("option",{value:Ee.value,title:Ee.label,children:`${Ee.icon?`${Ee.icon} `:""}${Ee.label}`},Ee.value))]})]},ce.value))})]}),Ke.jsx("div",{style:{margin:"18px 0 8px 0",fontWeight:"bold"},children:"Ctrl + Mouse Button Tool Bindings"}),z7.map(ce=>Ke.jsxs("div",{style:{marginBottom:10},children:[Ke.jsxs("label",{style:{marginRight:8},children:[ce.label," + Ctrl:"]}),Ke.jsxs("select",{value:fo[ce.value]||"",onChange:Ee=>ha(Ce=>({...Ce,[ce.value]:Ee.target.value})),style:{background:"#333",color:"#fff",border:"1px solid #444",borderRadius:"4px",padding:"4px 8px",fontSize:"14px"},children:[Ke.jsx("option",{value:"",children:"(None)"}),a0.map(Ee=>Ke.jsx("option",{value:Ee.value,title:Ee.label,children:`${Ee.icon?`${Ee.icon} `:""}${Ee.label}`},Ee.value))]})]},ce.value+"_ctrl")),Ke.jsxs("div",{style:{margin:"12px 0"},children:[Ke.jsxs("button",{style:{background:"#333",color:"#fff",border:"none",borderRadius:"4px",padding:"4px 12px",cursor:"pointer",fontSize:"14px",marginBottom:"8px"},onClick:()=>ct(ce=>!ce),children:[Qe?"Hide":"Show"," Advanced Ctrl + Mouse Bindings"]}),Qe&&Ke.jsx("div",{style:{marginTop:8},children:J2.slice(3).map(ce=>Ke.jsxs("div",{style:{marginBottom:10},children:[Ke.jsxs("label",{style:{marginRight:8},children:[ce.label," + Ctrl:"]}),Ke.jsxs("select",{value:fo[ce.value]||"",onChange:Ee=>ha(Ce=>({...Ce,[ce.value]:Ee.target.value})),style:{background:"#333",color:"#fff",border:"1px solid #444",borderRadius:"4px",padding:"4px 8px",fontSize:"14px"},children:[Ke.jsx("option",{value:"",children:"(None)"}),a0.map(Ee=>Ke.jsx("option",{value:Ee.value,title:Ee.label,children:`${Ee.icon?`${Ee.icon} `:""}${Ee.label}`},Ee.value))]})]},ce.value+"_ctrl"))})]})]}),Ke.jsx("button",{style:{position:"absolute",top:12,right:12,background:"transparent",color:"#fff",border:"none",fontSize:"20px",cursor:"pointer"},onClick:()=>g(!1),"aria-label":"Close",children:"×"})]})}),rs&&Ke.jsx("div",{style:{position:"fixed",top:0,left:0,width:"100vw",height:"100vh",background:"rgba(0,0,0,0.5)",zIndex:2e3,display:"flex",alignItems:"center",justifyContent:"center"},onClick:()=>Sr(!1),children:Ke.jsxs("div",{style:{background:"#222",color:"#fff",borderRadius:"8px",minWidth:"320px",maxWidth:"80vw",maxHeight:"80vh",padding:"24px",boxShadow:"0 4px 24px rgba(0,0,0,0.4)",position:"relative",overflow:"auto"},onClick:ce=>ce.stopPropagation(),children:[Ke.jsx("div",{style:{fontSize:"20px",marginBottom:"16px"},children:"DICOM Metadata"}),Io,Ke.jsx("button",{style:{position:"absolute",top:12,right:12,background:"transparent",color:"#fff",border:"none",fontSize:"20px",cursor:"pointer"},onClick:()=>Sr(!1),"aria-label":"Close",children:"×"})]})})]})}function qEe(t){console.log("Setting up tools...",t),Ui(Hu),Ui(Dh),Ui(Pd),Ui(bl),Ui(Ih),Ui(sf),Ui(jl),Ui(cf),Ui($l),Ui(Rd),Ui(af),Ui(Hc),Ui(Oh),Ui(Wa),Ui(Tc),Ui(hd),Ui(Rh);let e=fi(t);return e||(e=lF(t),e.addTool(Dh.toolName),e.addTool(Hu.toolName),e.addTool(bl.toolName),e.addTool(Pd.toolName,{loop:!1}),e.addTool(Ih.toolName),e.addTool(sf.toolName),e.addTool(Rh.toolName,{getTextCallback:()=>""}),e.addTool(cf.toolName),e.addTool(jl.toolName,{statsCalculator:()=>null}),e.addTool($l.toolName,{calculateStats:!1,getTextCallback:()=>""}),e.addTool(Rd.toolName,{getTextCallback:()=>""}),e.addTool(af.toolName,{calculateStats:!1}),e.addTool(Hc.toolName,{}),e.addTool(Oh.toolName,{}),e.addTool(hd.toolName),e.addTool(Wa.toolName)),e}function j7(t,e,r,n){if(!r.length||!e.length)return null;const i=r.map(o=>e.findIndex(a=>a===o.metadata.referencedImageId)).filter(o=>o!==-1).sort((o,a)=>o-a);if(!i.length)return null;if(n===1){for(let o of i)if(o>t)return o;return i[0]}else{for(let o=i.length-1;o>=0;o--)if(i[o]`wadouri:/test_images/stack2/IMG${r+1}.dcm`),Array.from({length:25},(e,r)=>`wadouri:/test_images/stack5/IMG${r+1}.dcm`),Array.from({length:26},(e,r)=>`wadouri:/test_images/stack3/IMG${r+1}.dcm`)]}const YEe=t=>{const e=t.trim();return!e||e.startsWith("external:")||e.startsWith("wadors:")?e:e.startsWith("wadouri:")?`wadouri:${e.slice(8).replace(/^:+/,"")}`:`wadouri:${e.replace(/^:+/,"")}`},rp=t=>t.map(YEe),H7=t=>t?{imageIds:rp(t)}:{imageIds:[]};function l$(){document.querySelectorAll(".dicom-viewer-test-root").forEach(r=>{const n=r.id||"",i=()=>XEe();zC(r).render(Ke.jsx($7,{container_id:n,imageStacks:i}))}),document.querySelectorAll(".dicom-viewer-root").forEach(r=>{const n=r.id||"";let i;const o=r.getAttribute("data-empty")==="true",a=r.getAttribute("data-named-stacks"),s=r.getAttribute("data-images"),c=h=>{if(!h)return[];if(Array.isArray(h)&&h.length>0&&typeof h[0]=="string")return[H7(h)];if(Array.isArray(h)){const g=[];return h.forEach((p,v)=>{if(p&&typeof p=="object"&&Array.isArray(p.stacks)){const y=p.caseId||p.caseUID||p.case||void 0,m=p.studyId||p.studyUID||p.studyInstanceUID||void 0;p.stacks.forEach((w,x)=>{let C=[];if(Array.isArray(w)?C=w:Array.isArray(w.imageIds)?C=w.imageIds:Array.isArray(w.i)&&(C=w.i),!Array.isArray(C)||C.length===0||!C.every(S=>typeof S=="string")){console.warn(`data-named-stacks: skipping invalid nested stack at parsed[${v}].stacks[${x}]`,w);return}g.push({imageIds:rp(C),name:w.name||w.label||void 0,caseId:y,studyId:w.studyId||m})});return}if(p&&typeof p=="object"&&(Array.isArray(p.imageIds)||Array.isArray(p.i))){const y=Array.isArray(p.imageIds)?p.imageIds:p.i;if(!Array.isArray(y)||y.length===0||!y.every(m=>typeof m=="string")){console.warn(`data-named-stacks: skipping invalid stack object at parsed[${v}]`,p);return}g.push({imageIds:rp(y),name:p.name||p.label||void 0,caseId:p.caseId||p.caseUID||void 0,studyId:p.studyId||p.studyUID||p.studyInstanceUID||void 0});return}if(Array.isArray(p)&&p.length>0&&typeof p[0]=="string"){g.push(H7(p));return}console.warn(`data-named-stacks: unknown or invalid entry at parsed[${v}] — skipping`,p)}),g}return[]};if(o)i=()=>Promise.resolve([]);else if(a){let h;try{h=JSON.parse(a)}catch(p){console.error("Invalid data-named-stacks JSON:",p),h=[]}const g=c(h);i=()=>Promise.resolve(g)}else if(s){let h;try{h=JSON.parse(s)}catch(g){console.error("Invalid data-images JSON:",g),h=[]}Array.isArray(h)&&h.length>0&&typeof h[0]=="string"?i=()=>Promise.resolve([rp(h)]):Array.isArray(h)?i=()=>Promise.resolve(h.map(g=>Array.isArray(g)?rp(g):[])):i=()=>Promise.resolve([[]])}else i=()=>Promise.resolve([]);const l=r.getAttribute("data-auto-cache-stack"),f=l==="true"||l==="1",u=r.getAttribute("data-annotationjson"),d=r.getAttribute("data-viewerstate");console.log("Mounting DICOM viewer:"),console.log(d,u,f),zC(r).render(Ke.jsx($7,{container_id:n,imageStacks:i,autoCacheStack:f,annotationJson:u||void 0,viewerState:d||void 0}))})}l$();window.mountDicomViewers=l$;