UNPKG

dicomweb-pacs

Version:

A self contained easy to use PACS with DICOMWEB and DIMSE service support

2 lines 532 kB
(self.webpackChunk=self.webpackChunk||[]).push([[6066,9977],{5057:(e,t,n)=>{"use strict";n.d(t,{A:()=>r});var i=n(53586),a=n(48080),o=n(92885),s=n(71209);function r(e,t){const n=e.image;if(!e.canvas||!e.image)return;const r=(0,i.A)();if(n.stats={lastGetPixelDataTime:-1,lastStoredPixelDataToCanvasImageDataTime:-1,lastPutImageDataTime:-1,lastRenderTime:-1,lastLutGenerateTime:-1},n){let i=n.render;i||(i=e.viewport.colormap?s.l:n.color?a.f:o.j),i(e,t)}const l=(0,i.A)()-r;n.stats.lastRenderTime=l,e.invalid=!1,e.needsRedraw=!1}},7808:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});var i=n(45354);function a(e,t){const n=new i.d;if(!e.viewport.displayedArea)return n;n.translate(e.canvas.width/2,e.canvas.height/2);const a=e.viewport.rotation;0!==a&&n.rotate(a*Math.PI/180);let o=e.viewport.scale,s=e.viewport.scale;const r=e.viewport.displayedArea.brhc.x-(e.viewport.displayedArea.tlhc.x-1),l=e.viewport.displayedArea.brhc.y-(e.viewport.displayedArea.tlhc.y-1);if("NONE"===e.viewport.displayedArea.presentationSizeMode)e.image.rowPixelSpacing<e.image.columnPixelSpacing?o*=e.image.columnPixelSpacing/e.image.rowPixelSpacing:e.image.columnPixelSpacing<e.image.rowPixelSpacing&&(s*=e.image.rowPixelSpacing/e.image.columnPixelSpacing);else if(o=e.viewport.displayedArea.columnPixelSpacing,s=e.viewport.displayedArea.rowPixelSpacing,"SCALE TO FIT"===e.viewport.displayedArea.presentationSizeMode){const t=e.canvas.height/(l*s),n=e.canvas.width/(r*o);o=s=Math.min(n,t),e.viewport.displayedArea.rowPixelSpacing<e.viewport.displayedArea.columnPixelSpacing?o*=e.viewport.displayedArea.columnPixelSpacing/e.viewport.displayedArea.rowPixelSpacing:e.viewport.displayedArea.columnPixelSpacing<e.viewport.displayedArea.rowPixelSpacing&&(s*=e.viewport.displayedArea.rowPixelSpacing/e.viewport.displayedArea.columnPixelSpacing)}return n.scale(o,s),0!==a&&n.rotate(-a*Math.PI/180),n.translate(e.viewport.translation.x,e.viewport.translation.y),0!==a&&n.rotate(a*Math.PI/180),void 0!==t&&n.scale(t,t),e.viewport.hflip&&n.scale(-1,1),e.viewport.vflip&&n.scale(1,-1),n.translate(-r/2,-l/2),n}},36931:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var i=n(12132),a=n(57162);function o(e,t,n,o){if(void 0===e)throw new Error("getDefaultViewport: parameter canvas must not be undefined");if(void 0===t)return(0,i.A)();const s=(0,a.A)(e,t,0).scaleFactor;let r;return"PT"===n&&t.isPreScaled?r={windowWidth:5,windowCenter:2.5}:void 0!==t.windowWidth&&void 0!==t.windowCenter&&(r={windowWidth:Array.isArray(t.windowWidth)?t.windowWidth[0]:t.windowWidth,windowCenter:Array.isArray(t.windowCenter)?t.windowCenter[0]:t.windowCenter}),{scale:s,translation:{x:0,y:0},voi:r,invert:t.invert,pixelReplication:!1,rotation:0,hflip:!1,vflip:!1,modalityLUT:t.modalityLUT,modality:n,voiLUT:t.voiLUT,colormap:void 0!==o?o:t.colormap,displayedArea:{tlhc:{x:1,y:1},brhc:{x:t.columns,y:t.rows},rowPixelSpacing:void 0===t.rowPixelSpacing?1:t.rowPixelSpacing,columnPixelSpacing:void 0===t.columnPixelSpacing?1:t.columnPixelSpacing,presentationSizeMode:"NONE"}}}},50584:(e,t,n)=>{"use strict";n.d(t,{QV:()=>i.A});n(49038);var i=n(86252);n(90808),n(29625),n(50180),n(1271)},71851:(e,t,n)=>{"use strict";n.d(t,{BlendModes:()=>l.A,CalibrationTypes:()=>u.A,Events:()=>a.A,GenerateImageType:()=>i,GeometryType:()=>c.A,ImageQualityStatus:()=>v.A,InterpolationType:()=>r.A,MeshType:()=>h.A,MetadataModules:()=>f.A,OrientationAxis:()=>d.A,RequestType:()=>o.A,VOILUTFunctionType:()=>g.A,VideoEnums:()=>p,ViewportStatus:()=>m.A,ViewportType:()=>s.A});var i,a=n(32643),o=n(43213),s=n(41864),r=n(29310),l=n(63591),d=n(18735),c=n(91346),h=(n(86066),n(32731)),g=n(82501),u=(n(91369),n(38059)),m=n(1814),v=n(77474),p=n(13545),f=n(69850);!function(e){e.SUM="SUM",e.SUBTRACT="SUBTRACT",e.AVERAGE="AVERAGE"}(i||(i={}));n(6796)},15327:(e,t,n)=>{"use strict";n.d(t,{BaseVolumeViewport:()=>d.A,CONSTANTS:()=>a,EPSILON:()=>r.p8,Enums:()=>i,ImageVolume:()=>u.QV,Settings:()=>_,StackViewport:()=>c.A,VolumeViewport:()=>l.A,addImageSlicesToViewports:()=>R.ge,addVolumesToViewports:()=>R.x,cache:()=>m.Ay,convertMapperToNotSharedMapper:()=>s.h,createVolumeActor:()=>o.A,eventTarget:()=>h.A,getEnabledElement:()=>p.Ay,getEnabledElementByIds:()=>p.b1,getEnabledElementByViewportId:()=>p.yj,getEnabledElements:()=>p.zb,getRenderingEngine:()=>g.lD,getRenderingEngines:()=>g.qO,getWebWorkerManager:()=>w.G_,imageLoadPoolManager:()=>v.A,imageLoader:()=>y,metaData:()=>f,triggerEvent:()=>P.A,utilities:()=>x,volumeLoader:()=>M});var i=n(71851),a=n(19325),o=(n(56706),n(61640)),s=n(92099),r=n(30135),l=n(94155),d=(n(40893),n(46347)),c=n(58165),h=(n(32501),n(81466),n(10056),n(10364)),g=n(39536),u=n(50584),m=n(49038),v=(n(91073),n(51159)),p=n(86846),f=n(74876),w=n(26896);const E=Symbol("DefaultSettings"),I=Symbol("RuntimeSettings"),C=Symbol("ObjectSettingsMap"),b=Symbol("Dictionary");class _{constructor(e){const t=Object.create(e instanceof _&&b in e?e[b]:null);Object.seal(Object.defineProperty(this,b,{value:t}))}set(e,t){return S(this[b],e,t,null)}get(e){return function(e,t){return e[t]}(this[b],e)}unset(e){return function(e,t){if(t.endsWith(".")){let n=0;const i=t,a=i.slice(0,-1),o=0===a.length;for(const t in e)Object.prototype.hasOwnProperty.call(e,t)&&(o||t.startsWith(i)||t===a)&&(delete e[t],++n);return n>0}return delete e[t]}(this[b],e+"")}forEach(e){T(this[b],e)}extend(){return new _(this)}import(e){D(e)&&Object.keys(e).forEach((t=>{S(this[b],t,e[t],null)}))}dump(){const e={};return T(this[b],((t,n)=>{void 0!==n&&A(e,t,n)})),e}static assert(e){return e instanceof _?e:_.getRuntimeSettings()}static getDefaultSettings(e=null){let t=_[E];if(t instanceof _||(t=new _,_[E]=t),e){const n={};return t.forEach((i=>{if(i.startsWith(e)){const a=i.split(`${e}.`)[1];n[a]=t.get(i)}})),n}return t}static getRuntimeSettings(){let e=_[I];return e instanceof _||(e=new _(_.getDefaultSettings()),_[I]=e),e}static getObjectSettings(e,t){let n=null;if(e instanceof _)n=e;else if("object"==typeof e&&null!==e){let i=_[C];i instanceof WeakMap||(i=new WeakMap,_[C]=i),n=i.get(e),n instanceof _||(n=new _(_.assert(_.getObjectSettings(t))),i.set(e,n))}return n}static extendRuntimeSettings(){return _.getRuntimeSettings().extend()}}function T(e,t){for(const n in e)t(n,e[n])}function S(e,t,n,i){return!!function(e){let t,n,i;if("string"!=typeof e||(t=e.length-1)<0)return!1;i=-1;for(;(n=e.indexOf(".",i+1))>=0;){if(n-i<2||n===t)return!1;i=n}return!0}(t)&&(D(n)?function(e,t,n,i){let a;if(i.has(n))return S(e,t,null,i);i.add(n),a=0;for(const o in n)Object.prototype.hasOwnProperty.call(n,o)&&(S(e,0===o.length?t:`${t}.${o}`,n[o],i)||++a);return i.delete(n),0===a}(e,t,n,i instanceof WeakSet?i:new WeakSet):(e[t]=n,!0))}function D(e){if("object"==typeof e&&null!==e){const t=Object.getPrototypeOf(e);if(t===Object.prototype||null===t)return!0}return!1}function A(e,t,n){const i=t.indexOf(".");if(i>=0){const a=t.slice(0,i);let o=e[a];if("object"!=typeof o||null===o){const t=o;o={},void 0!==t&&(o[""]=t),e[a]=o}A(o,t.slice(i+1,t.length),n)}else e[t]=n}_.getDefaultSettings().set("useCursors",!0);var M=n(87142),y=n(80068),x=(n(89926),n(36822),n(10297)),P=n(69372),R=(n(55500),n(55509),n(56074),n(40661))},80068:(e,t,n)=>{"use strict";n.r(t),n.d(t,{cancelLoadAll:()=>D,cancelLoadImage:()=>T,cancelLoadImages:()=>S,createAndCacheDerivedImage:()=>C,createAndCacheDerivedImages:()=>b,createAndCacheDerivedLabelmapImage:()=>P,createAndCacheDerivedLabelmapImages:()=>x,createAndCacheLocalImage:()=>_,loadAndCacheImage:()=>E,loadAndCacheImages:()=>I,loadImage:()=>w,registerImageLoader:()=>A,registerUnknownImageLoader:()=>M,unregisterAllImageLoaders:()=>y});var i=n(49038),a=n(32643),o=n(10364),s=n(27119),r=n(99576),l=n(69372),d=n(80221),c=n(24623),h=n(51159),g=n(74876),u=n(6796);const m={};let v;function p(e,t){const n=i.Ay.getImageLoadObject(e);if(n)return f(n.promise,e),n;const a=e.split(":")[0],o=m[a]||v;if(!o)throw new Error(`loadImageFromImageLoader: No image loader found for scheme '${a}'`);const s=o(e,t);return f(s.promise,e),s}function f(e,t){Promise.resolve(e).then((e=>{!function(e){if(!e.voxelManager){const{width:t,height:n,numberOfComponents:i}=e,a=c.A.createImageVoxelManager({scalarData:e.getPixelData(),width:t,height:n,numberOfComponents:i});e.voxelManager=a,e.getPixelData=()=>a.getScalarData(),delete e.imageFrame.pixelData}}(e),(0,l.A)(o.A,a.A.IMAGE_LOADED,{image:e})})).catch((e=>{const n={imageId:t,error:e};(0,l.A)(o.A,a.A.IMAGE_LOAD_FAILED,n)}))}function w(e,t={priority:0,requestType:"prefetch"}){if(void 0===e)throw new Error("loadImage: parameter imageId must not be undefined");return p(e,t).promise}function E(e,t={priority:0,requestType:"prefetch"}){if(void 0===e)throw new Error("loadAndCacheImage: parameter imageId must not be undefined");const n=p(e,t);return i.Ay.getImageLoadObject(e)||i.Ay.putImageLoadObject(e,n),n.promise}function I(e,t={priority:0,requestType:"prefetch"}){if(!e||0===e.length)throw new Error("loadAndCacheImages: parameter imageIds must be list of image Ids");return e.map((e=>E(e,t)))}function C(e,t={}){if(void 0===e)throw new Error("createAndCacheDerivedImage: parameter imageId must not be undefined");void 0===t.imageId&&(t.imageId=`derived:${(0,d.A)()}`);const{imageId:n,skipCreateBuffer:a,onCacheAdd:o,voxelRepresentation:l}=t,c=g.get("imagePlaneModule",e),h=c.rows*c.columns,{TypedArrayConstructor:u}=(0,r.h)(t.targetBuffer?.type,h),m=new u(a?1:h),v=n,p=g.get("imagePlaneModule",e);s.A.add(v,{type:"imagePlaneModule",metadata:p});const f=g.get("generalSeriesModule",e);s.A.add(v,{type:"generalSeriesModule",metadata:f}),s.A.add(v,{type:"generalImageModule",metadata:{instanceNumber:t.instanceNumber}});const w=g.get("imagePixelModule",e);s.A.add(v,{type:"imagePixelModule",metadata:{...w,bitsAllocated:8,bitsStored:8,highBit:7,samplesPerPixel:1,pixelRepresentation:0}});const E=_(n,{scalarData:m,onCacheAdd:o,skipCreateBuffer:a,targetBuffer:{type:m.constructor.name},voxelRepresentation:l,dimensions:[c.columns,c.rows],spacing:[c.columnPixelSpacing,c.rowPixelSpacing],origin:c.imagePositionPatient,direction:c.imageOrientationPatient,frameOfReferenceUID:c.frameOfReferenceUID,referencedImageId:e});return E.referencedImageId=e,i.Ay.getImageLoadObject(n)||i.Ay.putImageSync(n,E),E}function b(e,t={}){if(0===e.length)throw new Error("createAndCacheDerivedImages: parameter imageIds must be list of image Ids");const n=[];return e.map(((e,i)=>{const a={imageId:t?.getDerivedImageId?.(e)||`derived:${(0,d.A)()}`,...t};return n.push(a.imageId),C(e,{...a,instanceNumber:i+1})}))}function _(e,t){const{scalarData:n,origin:a,direction:o,targetBuffer:l,skipCreateBuffer:d,onCacheAdd:h,frameOfReferenceUID:g,voxelRepresentation:m,referencedImageId:v}=t,p=t.dimensions,f=t.spacing;if(!p||!f)throw new Error("createAndCacheLocalImage: dimensions and spacing are required");const w=p[0],E=p[1],I=f[0],C=f[1],b={frameOfReferenceUID:g,rows:E,columns:w,imageOrientationPatient:o??[1,0,0,0,1,0],rowCosines:o?o.slice(0,3):[1,0,0],columnCosines:o?o.slice(3,6):[0,1,0],imagePositionPatient:a??[0,0,0],pixelSpacing:[C,I],rowPixelSpacing:C,columnPixelSpacing:I},_=w*E,T=n.length/_;let S,D,A,M;if(n){if(!(n instanceof Uint8Array||n instanceof Float32Array||n instanceof Uint16Array||n instanceof Int16Array))throw new Error("createAndCacheLocalImage: scalarData must be of type Uint8Array, Uint16Array, Int16Array or Float32Array");S=n}else if(!d){const{TypedArrayConstructor:e}=(0,r.h)(l?.type,_);S=new e(_)}if(S instanceof Uint8Array)D=8,A=8,M=7;else if(S instanceof Uint16Array)D=16,A=16,M=15;else if(S instanceof Int16Array)D=16,A=16,M=15;else{if(!(S instanceof Float32Array))throw new Error("Unsupported scalarData type");D=32,A=32,M=31}const y={samplesPerPixel:1,photometricInterpretation:S.length>p[0]*p[1]?"RGB":"MONOCHROME2",rows:E,columns:w,bitsAllocated:D,bitsStored:A,highBit:M},x={imagePlaneModule:b,imagePixelModule:y};["imagePlaneModule","imagePixelModule"].forEach((t=>{s.A.add(e,{type:t,metadata:x[t]||{}})}));const P=e,R=m===u.A.RLE&&c.A.createRLEImageVoxelManager({dimensions:p,id:P})||c.A.createImageVoxelManager({height:E,width:w,numberOfComponents:T,scalarData:S,id:P});let L=S[0],U=S[0];for(let e=1;e<S.length;e++)S[e]<L&&(L=S[e]),S[e]>U&&(U=S[e]);const O={imageId:e,intercept:0,windowCenter:0,windowWidth:0,color:"RGB"===y.photometricInterpretation,numberOfComponents:y.samplesPerPixel,dataType:l?.type,slope:1,minPixelValue:L,maxPixelValue:U,rows:y.rows,columns:y.columns,getCanvas:void 0,height:y.rows,width:y.columns,rgba:void 0,columnPixelSpacing:b.columnPixelSpacing,rowPixelSpacing:b.rowPixelSpacing,FrameOfReferenceUID:b.frameOfReferenceUID,invert:!1,getPixelData:()=>R.getScalarData(),voxelManager:R,sizeInBytes:n.byteLength,referencedImageId:v};return h?.(O),i.Ay.putImageSync(O.imageId,O),O}function T(e){h.A.filterRequests((({additionalDetails:t})=>!t.imageId||t.imageId!==e));const t=i.Ay.getImageLoadObject(e);t&&t.cancelFn()}function S(e){e.forEach((e=>{T(e)}))}function D(){const e=h.A.getRequestPool();Object.keys(e).forEach((t=>{const n=e[t];Object.keys(n).forEach((e=>{const t=n[e].pop();if(!t)return;const a=t.additionalDetails,{imageId:o,volumeId:s}=a;let r;o?r=i.Ay.getImageLoadObject(o):s&&(r=i.Ay.getVolumeLoadObject(s)),r&&r.cancel()})),h.A.clearRequestStack(t)}))}function A(e,t){m[e]=t}function M(e){const t=v;return v=e,t}function y(){Object.keys(m).forEach((e=>delete m[e])),v=void 0}function x(e,t={}){return b(e,{...t,targetBuffer:{type:"Uint8Array"}})}function P(e,t={}){return C(e,{...t,targetBuffer:{type:"Uint8Array"}})}},56750:(e,t,n)=>{"use strict";n.d(t,{A:()=>i});class i{static{this.frameRangeExtractor=/(\/frames\/|[&?]frameNumber=)([^/&?]*)/i}static imageIdToFrames(e){const t=e.match(this.frameRangeExtractor);if(!t||!t[2])return null;const n=t[2].split("-").map((e=>Number(e)));return 1===n.length?n[0]:n}static imageIdToFrameEnd(e){const t=this.imageIdToFrames(e);return Array.isArray(t)?t[1]:t}static imageIdToFrameStart(e){const t=this.imageIdToFrames(e);return Array.isArray(t)?t[0]:t}static framesToString(e){return Array.isArray(e)?`${e[0]}-${e[1]}`:String(e)}static framesToImageId(e,t){const n=e.match(this.frameRangeExtractor);if(!n||!n[2])return null;const i=this.framesToString(t);return e.replace(this.frameRangeExtractor,`${n[1]}${i}`)}}},13876:(e,t,n)=>{"use strict";n.d(t,{A:()=>i});class i{constructor(e={}){this._dimensions=3,this._length=0,this._byteSize=4,this.growSize=128;const{initialSize:t=1024,dimensions:n=3,growSize:i=128}=e,a=t*n;this.growSize=i,this.array=new ArrayBuffer(a*this._byteSize),this.data=new Float32Array(this.array),this._dimensions=n}forEach(e){for(let t=0;t<this._length;t++)e(this.getPoint(t),t)}get length(){return this._length}get dimensions(){return this._dimensions}get dimensionLength(){return this._length*this._dimensions}getPoint(e){if(e<0&&(e+=this._length),e<0||e>=this._length)return;const t=this._dimensions*e;return this.data.subarray(t,t+this._dimensions)}getPointArray(e){const t=[];if(e<0&&(e+=this._length),e<0||e>=this._length)return;const n=this._dimensions*e;for(let e=0;e<this._dimensions;e++)t.push(this.data[e+n]);return t}grow(e=1,t=this.growSize){if(this.dimensionLength+e*this._dimensions<=this.data.length)return;const n=this.data.length+t,i=new ArrayBuffer(n*this._dimensions*this._byteSize),a=new Float32Array(i);a.set(this.data),this.data=a,this.array=i}reverse(){const e=Math.floor(this._length/2);for(let t=0;t<e;t++){const e=t*this._dimensions,n=(this._length-1-t)*this._dimensions;for(let t=0;t<this._dimensions;t++){const i=this.data[e+t];this.data[e+t]=this.data[n+t],this.data[n+t]=i}}}getTypedArray(){return this.data}push(e){this.grow(1);const t=this.length*this._dimensions;for(let n=0;n<this._dimensions;n++)this.data[n+t]=e[n];this._length++}map(e){const t=[];for(let n=0;n<this._length;n++)t.push(e(this.getPoint(n),n));return t}get points(){return this.map((e=>e))}toXYZ(){const e={x:[],y:[]};this._dimensions>=3&&(e.z=[]);const{x:t,y:n,z:i}=e;return this.forEach((e=>{t.push(e[0]),n.push(e[1]),i&&i.push(e[2])})),e}static fromXYZ({x:e,y:t,z:n}){const a=i.create3(e.length);let o=0;for(let i=0;i<e.length;i++)a.data[o++]=e[i],a.data[o++]=t[i],a.data[o++]=n?n[i]:0;return a._length=e.length,a}subselect(e=10,t=0){const n=new i({initialSize:e,dimensions:this._dimensions});for(let i=0;i<e;i++){const a=(t+Math.floor(this.length*i/e))%this.length;n.push(this.getPoint(a))}return n}static create3(e=128,t){e=Math.max(e,t?.length||0);const n=new i({initialSize:e,dimensions:3});return t&&t.forEach((e=>n.push(e))),n}static create2(e=128){return new i({initialSize:e,dimensions:2})}}},22191:(e,t,n)=>{"use strict";n.d(t,{A:()=>i});class i{constructor(e){this.name=e||"unknown"}static as(e){if(e.iterator)return e.iterator;const t=new i("as iterator");return e.then((e=>{try{t.add(e,!0)}catch(e){t.reject(e)}}),(e=>{t.reject(e)})),t}add(e,t=!1){this.nextValue=e,this.done||=t,this.waiting&&(this.waiting.resolve(e),this.waiting=void 0)}resolve(){this.done=!0,this.waiting&&(this.waiting.resolve(this.nextValue),this.waiting=void 0)}reject(e){this.rejectReason=e,this.waiting?.reject(e)}getRecent(){if(this.rejectReason)throw this.rejectReason;return this.nextValue}async*[Symbol.asyncIterator](){for(;!this.done;){if(this.rejectReason)throw this.rejectReason;if(void 0!==this.nextValue&&(yield this.nextValue,this.done))break;this.waiting||(this.waiting={},this.waiting.promise=new Promise(((e,t)=>{this.waiting.resolve=e,this.waiting.reject=t}))),await this.waiting.promise}yield this.nextValue}async forEach(e,t){let n=0;try{for await(const i of this){const{done:a}=this;try{await e(i,a,n),n++}catch(e){if(!a){console.warn("Caught exception in intermediate value",e);continue}if(!t)throw e;t(e,a)}}}catch(e){if(!t)throw e;t(e,!0)}}generate(e,t){return e(this,this.reject.bind(this)).then((()=>{this.done||this.resolve()}),(e=>{this.reject(e),t?t(e):console.warn("Couldn't process because",e)}))}async nextPromise(){for await(const e of this)if(e)return e;return this.nextValue}async donePromise(){for await(const e of this);return this.nextValue}getNextPromise(){const e=this.nextPromise();return e.iterator=this,e}getDonePromise(){const e=this.donePromise();return e.iterator=this,e}}},67645:(e,t,n)=>{"use strict";n.d(t,{A:()=>r});const i=[[0,-1,0],[0,1,0],[0,0,-1],[0,0,1]],a=[[0,-1,0],[0,1,0]],o=[[0,-1,0],[0,1,0],[0,0,-1]],s=[[0,-1,0],[0,1,0],[0,0,1]];class r{static copyMap(e,t){for(const[n,i]of t.rows)e.rows.set(n,structuredClone(i))}constructor(e,t,n=1){this.rows=new Map,this.height=1,this.width=1,this.depth=1,this.jMultiple=1,this.kMultiple=1,this.numComps=1,this.pixelDataConstructor=Uint8Array,this.updateScalarData=function(e){e.fill(0);this.forEach(((t,n,i)=>{const{start:a,end:o,value:s}=n;for(let n=a;n<o;n++)e[t+n]=s}))},this.get=e=>{const t=e%this.jMultiple,n=(e-t)/this.jMultiple,i=this.getRLE(t,n);return i?.value??this.defaultValue},this.getRun=(e,t)=>{const n=e+t*this.height;return this.rows.get(n)},this.set=(e,t)=>{if(void 0===t)return;const n=e%this.width,i=(e-n)/this.width,a=this.rows.get(i);if(!a)return void this.rows.set(i,[{start:n,end:n+1,value:t}]);const o=this.findIndex(a,n),s=a[o],r=a[o-1];if(!s)return r&&r.value===t&&r.end===n?void r.end++:void(a[o]={start:n,end:n+1,value:t});const{start:l,end:d,value:c}=s;if(t===c&&n>=l)return;const h={start:n,end:n+1,value:t},g=n>l,u=g?o+1:o,m=g?s:r;let v=g?a[o+1]:s;if(m?.value===t&&m?.end===n)return m.end++,void(v?.value===t&&v.start===n+1?(m.end=v.end,a.splice(o,1)):v?.start===n&&(v.start++,v.start===v.end&&(a.splice(o,1),v=a[o],v?.start===n+1&&v.value===t&&(m.end=v.end,a.splice(o,1)))));if(v?.value===t&&v.start===n+1)return v.start--,void(m?.end>n&&(m.end=n,m.end===m.start&&a.splice(o,1)));if(v?.start!==n||v.end!==n+1)n===v?.start&&v.start++,g&&d>n+1?a.splice(u,0,h,{start:n+1,end:m.end,value:m.value}):a.splice(u,0,h),m?.end>n&&(m.end=n);else{v.value=t;const e=a[o+1];e?.start==n+1&&e.value===t&&(a.splice(o+1,1),v.end=e.end)}},this.width=e,this.height=t,this.depth=n,this.jMultiple=e,this.kMultiple=this.jMultiple*t}static{this.getScalarData=function(e=Uint8ClampedArray){const t=new e(this.frameSize);return this.map.updateScalarData(t),t}}toIJK(e){const t=e%this.jMultiple;return[t,(e-t)/this.jMultiple%this.height,Math.floor(e/this.kMultiple)]}toIndex([e,t,n]){return e+n*this.kMultiple+t*this.jMultiple}getRLE(e,t,n=0){const i=this.rows.get(t+n*this.height);if(!i)return;const a=i[this.findIndex(i,e)];return e>=a?.start?a:void 0}has(e){const t=e%this.jMultiple,n=(e-t)/this.jMultiple,i=this.getRLE(t,n);return void 0!==i?.value}delete(e){const t=e%this.width,n=(e-t)/this.width,i=this.rows.get(n);if(!i)return;const a=this.findIndex(i,t),o=i[a];if(!o||o.start>t)return;if(o.end===t+1)return o.end--,void(o.start>=o.end&&(i.splice(a,1),i.length||this.rows.delete(n)));if(o.start===t)return void o.start++;const s={value:o.value,start:t+1,end:o.end};o.end=t,i.splice(a+1,0,s)}findIndex(e,t){for(let n=0;n<e.length;n++){const{end:i}=e[n];if(t<i)return n}return e.length}forEach(e,t){const n=t?.rowModified;for(const[t,i]of this.rows){const a=n?[...i]:i;for(const n of a)e(t*this.width,n,i)}}forEachRow(e){for(const[t,n]of this.rows)e(t*this.width,n)}clear(){this.rows.clear()}keys(){return[...this.rows.keys()]}getPixelData(e=0,t){t?t.fill(0):t=new this.pixelDataConstructor(this.width*this.height*this.numComps);const{width:n,height:i,numComps:a}=this;for(let o=0;o<i;o++){const i=this.getRun(o,e);if(i)if(1===a)for(const e of i){const i=o*n,{start:a,end:s,value:r}=e;for(let e=a;e<s;e++)t[i+e]=r}else for(const e of i){const i=o*n*a,{start:s,end:r,value:l}=e;for(let e=s;e<r;e+=a)for(let n=0;n<a;n++)t[i+e+n]=l[n]}}return t}floodFill(e,t,n,i,a){const o=this.getRLE(e,t,n);if(!o)throw new Error(`Initial point ${e},${t},${n} isn't in the RLE`);const s=[[o,t,n]],r=o.value;if(r===i)throw new Error(`source (${r}) and destination (${i}) are identical`);return this.flood(s,r,i,a)}flood(e,t,n,i){let a=0;const{planar:o=!0,diagonals:s=!0,singlePlane:r=!1}=i||{},l={planar:o,diagonals:s,singlePlane:r};for(;e.length;){const i=e.pop(),[o]=i;if(o.value!==t)continue;o.value=n,a+=o.end-o.start;const s=this.findAdjacents(i,l).filter((e=>e&&e[0].value===t));e.push(...s)}return a}fillFrom(e,t){for(let n=t[2][0];n<=t[2][1];n++)for(let i=t[1][0];i<=t[1][1];i++){let a,o;for(let s=t[0][0];s<=t[0][1];s++){const t=e(s,i,n);void 0!==t?(o||(o=[],this.rows.set(i+n*this.height,o)),a&&a.value!==t&&(a=void 0),a||(a={start:s,end:s,value:t},o.push(a)),a.end++):a=void 0}}}findAdjacents(e,{diagonals:t=!0,planar:n=!0,singlePlane:r=!1}){const[l,d,c,h]=e,{start:g,end:u}=l,m=g>0&&this.getRLE(g-1,d,c),v=u<this.width&&this.getRLE(u,d,c),p=t?[g>0?g-1:g,u<this.width?u+1:u]:[g,u],f=[];m&&f.push([m,d,c]),v&&f.push([v,d,c]);for(const e of h||(r?a:i)){const[,t,l]=e,g=t+d,u=l+c;if(g<0||g>=this.height)continue;if(u<0||u>=this.depth)continue;const m=this.getRun(g,u);if(m)for(const e of m){const t=h||r&&a||n&&l>0&&s||n&&l<0&&o||i;e.end<=p[0]||e.start>=p[1]||f.push([e,g,u,t])}}return f}}},98039:(e,t,n)=>{"use strict";function i(e){return a(e,"vtkVolume")||a(e,"vtkImageSlice")}function a(e,t){const n="isA"in e?e:e.actor;return!!n&&!!n.isA(t)}n.d(t,{N:()=>a,e:()=>i})},96833:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var i=n(33739),a=n(99341);function o(e,t){const n=t.colorTransfer.split(" ").splice(1).map(parseFloat),{shiftRange:o}=function(e){let t=1/0,n=-1/0;for(let i=0;i<e.length;i+=4)t=Math.min(t,e[i]),n=Math.max(n,e[i]);const i=(n-t)/2;return{shiftRange:[-i,i],min:t,max:n}}(n),s=o[0],r=o[1]-o[0],l=i.Ay.newInstance(),d=[];for(let e=0;e<n.length;e+=4){let t=n[e];const i=n[e+1],a=n[e+2],o=n[e+3];t=(t-s)/r,d.push([t,i,a,o])}!function(e,t,n){const i=t[1]-t[0],a=e.map((([e,n,a,o])=>[e*i+t[0],n,a,o]));n.removeAllPoints(),a.forEach((([e,t,i,a])=>n.addRGBPoint(e,t,i,a)))}(d,o,l),e.getProperty().setRGBTransferFunction(0,l);const c=t.scalarOpacity.split(" ").splice(1).map(parseFloat),h=a.Ay.newInstance(),g=[];for(let e=0;e<c.length;e+=2){let t=c[e];const n=c[e+1];t=(t-s)/r,g.push([t,n])}!function(e,t,n){const i=t[1]-t[0],a=e.map((([e,n])=>[e*i+t[0],n]));n.removeAllPoints(),a.forEach((([e,t])=>n.addPoint(e,t)))}(g,o,h);const u=e.getProperty();u.setScalarOpacity(0,h);const[m,v,p,f]=t.gradientOpacity.split(" ").splice(1).map(parseFloat);u.setUseGradientOpacity(0,!0),u.setGradientOpacityMinimumValue(0,m),u.setGradientOpacityMinimumOpacity(0,v),u.setGradientOpacityMaximumValue(0,p),u.setGradientOpacityMaximumOpacity(0,f),"1"===t.interpolation&&u.setInterpolationTypeToFastLinear(),u.setShade("1"===t.shade);const w=parseFloat(t.ambient),E=parseFloat(t.diffuse),I=parseFloat(t.specular),C=parseFloat(t.specularPower);u.setAmbient(w),u.setDiffuse(E),u.setSpecular(I),u.setSpecularPower(C)}},91979:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var i=n(39536),a=n(24724);const o=e=>{const t=function(e){const t=(0,i.qO)(),n=[];return t.forEach((t=>{const i=(0,a.A)(e);i.length&&n.push({renderingEngine:t,viewportIds:i.map((e=>e.id))})})),n}(e);t?.length&&t.forEach((({renderingEngine:e,viewportIds:t})=>{e.hasBeenDestroyed||e.renderViewports(t)}))}},89131:(e,t,n)=>{"use strict";n.d(t,{KP:()=>s,SJ:()=>o});var i=n(74876),a=n(71851);function o(e){const t={...i.get(a.MetadataModules.IMAGE_PLANE,e)};return t.columnPixelSpacing||(t.columnPixelSpacing=1),t.rowPixelSpacing||(t.rowPixelSpacing=1),t.columnCosines||(t.columnCosines=[0,1,0]),t.rowCosines||(t.rowCosines=[1,0,0]),t.imagePositionPatient||(t.imagePositionPatient=[0,0,0]),t.imageOrientationPatient||(t.imageOrientationPatient=new Float32Array([1,0,0,0,1,0])),t}function s(e){const t=e.imageId,{pixelRepresentation:n,bitsAllocated:s,bitsStored:r,highBit:l,photometricInterpretation:d,samplesPerPixel:c}=i.get("imagePixelModule",t),{windowWidth:h,windowCenter:g,voiLUTFunction:u}=e,{modality:m}=i.get("generalSeriesModule",t),v=i.get("scalingModule",t),p=i.get(a.MetadataModules.CALIBRATION,t),f=function(e){return Object.values(a.VOILUTFunctionType).includes(e)?e:a.VOILUTFunctionType.LINEAR}(u);return{calibration:p,scalingFactor:v,voiLUTFunction:f,modality:m,imagePlaneModule:o(t),imagePixelModule:{bitsAllocated:s,bitsStored:r,samplesPerPixel:c,highBit:l,photometricInterpretation:d,pixelRepresentation:n,windowWidth:h,windowCenter:g,modality:m,voiLUTFunction:f}}}},42384:(e,t,n)=>{"use strict";n.d(t,{A:()=>s});var i=n(3823),a=n(74876),o=n(26896);function s(e){const{imagePositionPatient:t,imageOrientationPatient:n}=a.get("imagePlaneModule",e[0]),s=i.eR.fromValues(n[0],n[1],n[2]),r=i.eR.fromValues(n[3],n[4],n[5]),l=i.eR.create();i.eR.cross(l,s,r);const d=i.eR.fromValues(t[0],t[1],t[2]);let c;function h(e){const{imagePositionPatient:t}=a.get("imagePlaneModule",e),n=i.eR.create(),o=i.eR.fromValues(t[0],t[1],t[2]);return i.eR.sub(n,d,o),i.eR.dot(n,l)}if("wadouri"===e[0].split(":")[0]){const t=[e[0],e[Math.floor(e.length/2)]],n=(h(t[0]),h(t[1]),a.get("imagePlaneModule",t[1]));if(!n)throw new Error("Incomplete metadata required for volume construction.");const o=i.eR.create(),s=i.eR.fromValues(n.imagePositionPatient[0],n.imagePositionPatient[1],n.imagePositionPatient[2]);i.eR.sub(o,d,s);const r=i.eR.dot(o,l);c=Math.abs(r)/Math.floor(e.length/2)}else{const t=e.map((e=>({distance:h(e),imageId:e})));t.sort(((e,t)=>t.distance-e.distance));const n=t.length;c=Math.abs(t[n-1].distance-t[0].distance)/(n-1)}const{sliceThickness:g,spacingBetweenSlices:u}=a.get("imagePlaneModule",e[0]),{strictZSpacingForVolumeViewport:m}=(0,o.D0)().rendering;return 0!==c&&!isNaN(c)||m||(u?(console.debug("Could not calculate spacing. Using spacingBetweenSlices"),c=u):g?(console.debug("Could not calculate spacing and no spacingBetweenSlices. Using sliceThickness"),c=g):(console.debug("Could not calculate spacing. The VolumeViewport visualization is compromised. Setting spacing to 1 to render"),c=1)),c}},84061:(e,t,n)=>{"use strict";function i(e,t,n){return Math.max(t,Math.min(n,e))}n.d(t,{A:()=>i,q:()=>i})},13859:(e,t,n)=>{"use strict";n.r(t),n.d(t,{findMatchingColormap:()=>c,getColormap:()=>l,getColormapNames:()=>d,registerColormap:()=>r});var i=n(660),a=n(74638),o=n(98039);const s=new Map;function r(e){e.name=e.name||e.Name,s.set(e.name,e)}function l(e){return s.get(e)}function d(){return Array.from(s.keys())}function c(e,t){const n=i.A.rgbPresetNames.map((e=>i.A.getPresetByName(e))),s=d().map((e=>l(e))),r=n.concat(s).find((t=>{const{RGBPoints:n}=t;if(n.length!==e.length)return!1;for(let t=0;t<n.length;t+=4)if(!(0,a.Ay)(n.slice(t+1,t+4),e.slice(t+1,t+4)))return!1;return!0}));if(!r)return null;const c=[];if((0,o.N)(t,"vtkVolume")){const e=t.getProperty().getScalarOpacity(0).getDataPointer();if(!e)return{name:r.Name};for(let t=0;t<e.length;t+=2)c.push({value:e[t],opacity:e[t+1]})}return{name:r.Name,opacity:c}}},74657:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});var i=n(33739);function a(e){const t=i.Ay.newInstance();let n=0,a=1024;return void 0!==e.lower&&void 0!==e.upper&&(n=e.lower,a=e.upper),t.addRGBPoint(n,0,0,0),t.addRGBPoint(a,1,1,1),t}},40256:(e,t,n)=>{"use strict";n.d(t,{A:()=>r});var i=n(33739),a=n(42008),o=n(68136),s=n(58977);function r(e,t=1024){const{windowWidth:n,windowCenter:r}=o.toWindowLevel(e.lower,e.upper),l=Array.from({length:t},((e,n)=>(n+1)/(t+2))).flatMap((e=>[(0,s.i)(e,r,n),e,e,e,.5,0])),d=i.Ay.newInstance();return d.buildFunctionFromArray(a.Ay.newInstance({values:l,numberOfComponents:6})),d}},63470:(e,t,n)=>{"use strict";function i(e,t,n=0){const i=[];for(let a=n;a<e.length;a+=t)i.push(a);return i}n.d(t,{A:()=>i})},99949:(e,t,n)=>{"use strict";function i(e){if(null===e||"object"!=typeof e)return e;if("function"==typeof e)return e;if("function"==typeof structuredClone)return e;if(Array.isArray(e))return e.map(i);{const t={};for(const n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=i(e[n]));return t}}n.d(t,{G:()=>i})},20286:(e,t,n)=>{"use strict";function i(e){let t=2166136261;for(let n=0;n<e.length;n++)t^=e.charCodeAt(n),t+=(t<<1)+(t<<4)+(t<<7)+(t<<8)+(t<<24);return(t>>>0).toString(36)}n.d(t,{A:()=>i})},88619:(e,t,n)=>{"use strict";n.d(t,{A:()=>r});var i=n(3823),a=n(74876),o=n(85008),s=n(19325);function r(e,t,n,r){const{direction:l,spacing:d,imageIds:c}=e,{ignoreSpacing:h=!1}=r||{};if(!c?.length)return;const g=l.slice(6,9),u=i.eR.dot(g,n);if(Math.abs(u)<1-s.EPSILON)return void console.debug("View plane normal is not parallel to the image scan axis. Unable to find closest imageId.");let m,v;if(!h){m=(0,o.A)({direction:l,spacing:d},n)/2}let p=1/0;for(let e=0;e<c.length;e++){const o=c[e],s=a.get("imagePlaneModule",o);if(!s?.imagePositionPatient){console.warn(`Missing imagePositionPatient for imageId: ${o}`);continue}const{imagePositionPatient:r}=s,l=i.eR.create();i.eR.sub(l,t,r);const d=Math.abs(i.eR.dot(l,n));h?d<p&&(p=d,v=o):d<m&&d<p&&(p=d,v=o)}return void 0===v&&console.debug("No imageId found within the specified criteria (half spacing or absolute closest)."),v}},53932:(e,t,n)=>{"use strict";n.d(t,{T:()=>s});var i=n(3823),a=n(19325),o=n(89131);function s(e){const{imagePlaneModule:t,imagePixelModule:n,voiLUTFunction:s,modality:r,scalingFactor:l,calibration:d}=(0,o.KP)(e);let{rowCosines:c,columnCosines:h}=t;null!=c&&null!=h||(c=[1,0,0],h=[0,1,0]);const g=i.eR.fromValues(c[0],c[1],c[2]),u=i.eR.fromValues(h[0],h[1],h[2]),m=i.eR.create();i.eR.cross(m,g,u);let v=t.imagePositionPatient;null==v&&(v=[0,0,0]);const p=t.columnPixelSpacing||e.columnPixelSpacing,f=t.rowPixelSpacing||e.rowPixelSpacing,w=e.columns,E=e.rows,I=a.EPSILON;return{numberOfComponents:e.numberOfComponents||function(e){let t=1;("RGB"===e||e.includes("YBR")||"PALETTE COLOR"===e)&&(t=3);return t}(n.photometricInterpretation),origin:v,direction:[...g,...u,...m],dimensions:[w,E,1],spacing:[p,f,I],numVoxels:w*E*1,imagePlaneModule:t,imagePixelModule:n,bitsAllocated:n.bitsAllocated,voiLUTFunction:s,modality:r,scalingFactor:l,calibration:d,scanAxisNormal:m}}},47476:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var i=n(20537),a=n(65292);const o=function(e){const t=e.getCamera(),{spacingInNormalDirection:n,imageVolume:o}=(0,a.A)(e,t);if(!o)return;const{viewPlaneNormal:s,focalPoint:r}=t,l=e.getActors().find((e=>e.referencedId===o.volumeId||e.uid===o.volumeId));l||console.warn("No actor found for with actorUID of",o.volumeId);const d=l.actor,c=(0,i.A)(d,s,r),{min:h,max:g,current:u}=c,m=Math.round((g-h)/n)+1;let v=(u-h)/(g-h)*m;return v=Math.floor(v),v>m-1?v=m-1:v<0&&(v=0),{numberOfSlices:m,imageIndex:v}}},32173:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});var i=n(74876);function a(e){const t=i.get("modalityLutModule",e)||{},n=i.get("generalSeriesModule",e)||{},{modality:a}=n,o={rescaleSlope:t.rescaleSlope||1,rescaleIntercept:t.rescaleIntercept??0,modality:a},s=i.get("scalingModule",e)||{};return{...o,..."PT"===a&&{suvbw:s.suvbw,suvbsa:s.suvbsa,suvlbm:s.suvlbm}}}},20537:(e,t,n)=>{"use strict";n.d(t,{A:()=>c});var i=n(89265),a=n(15105),o=n(19325);const s=o.EPSILON*o.EPSILON,r=e=>Math.abs(Math.abs(e)-1)<s,l=(e,t)=>r(e[t])||r(e[t+1])||r(e[t+2]),d=e=>l(e,0)&&l(e,3)&&l(e,6);function c(e,t,n){const o=e.getMapper().getInputData();let s;const r=o.getDirection();if(d(r))s=(0,a.A)(e);else{const[e,t,n]=o.getDimensions();s=[[0,0,0],[e-1,0,0],[0,t-1,0],[e-1,t-1,0],[0,0,n-1],[e-1,0,n-1],[0,t-1,n-1],[e-1,t-1,n-1]].map((e=>o.indexToWorld(e)))}const l=i.A.buildFromDegree().identity().rotateFromDirections(t,[1,0,0]);s.forEach((e=>l.apply(e)));const c=[...n];l.apply(c);const h=c[0];let g=1/0,u=-1/0;for(let e=0;e<8;e++){const t=s[e][0];t>u&&(u=t),t<g&&(g=t)}return{min:g,max:u,current:h,actor:e,viewPlaneNormal:t,focalPoint:n}}},85008:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});var i=n(3823);function a(e,t){const{direction:n,spacing:a}=e,o=n.slice(0,3),s=n.slice(3,6),r=n.slice(6,9),l=[i.eR.dot(o,t),i.eR.dot(s,t),i.eR.dot(r,t)],d=i.eR.create();i.eR.set(d,l[0]*a[0],l[1]*a[1],l[2]*a[2]);return i.eR.length(d)}},65292:(e,t,n)=>{"use strict";n.d(t,{A:()=>c});var i=n(49038),a=n(19325),o=n(85008),s=n(87142),r=n(12437);const l=1+a.EPSILON,d=e=>!!(0,s.getVolumeLoaderSchemes)().find((t=>{return n=e.volumeId,(i=t)===n.substring(0,Math.min(n.length,i.length));var n,i}));function c(e,t,n,a=!1){const{viewPlaneNormal:o}=t,s=e.getActors();if(!s.length)return{spacingInNormalDirection:null,imageVolume:null,actorUID:null};const c=s.map((e=>{const t=e.referencedId??e.uid;return i.Ay.getVolume(t)})).filter((e=>!!e));if(n){const t=(0,r.A)(n),i=c.findIndex((e=>t.includes(e.volumeId))),l=c[i],{uid:d}=s[i];return{imageVolume:l,spacingInNormalDirection:h(l,o,e,a),actorUID:d}}if(!c.length)return{spacingInNormalDirection:null,imageVolume:null,actorUID:null};const g={spacingInNormalDirection:1/0,imageVolume:null,actorUID:null},u=c.find(d);for(let t=0;t<c.length;t++){const n=c[t];if(u&&!d(n))continue;const i=h(n,o,e);i*l<g.spacingInNormalDirection&&(g.spacingInNormalDirection=i,g.imageVolume=n,g.actorUID=s[t].uid)}return g}function h(e,t,n,i=!1){const{slabThickness:a}=n.getProperties();let s=a;return a&&i||(s=(0,o.A)(e,t)),s}},24724:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});var i=n(39536);const a=function(e){const t=(0,i.qO)(),n=[];return t.forEach((t=>{const i=t.getVolumeViewports().filter((t=>t.hasVolumeId(e)));n.push(...i)})),n}},70210:(e,t,n)=>{"use strict";function i(e){let t=[];const[n,i]=e.getRange();e.getTable(n,i,1024,t),t=t.filter(((e,t)=>t%3==0));const a=[...Array(1024).keys()].map(((e,t)=>n+(i-n)/1023*t)),o=t[256],s=Math.log((1-o)/o),r=a[256],l=t[768],d=Math.log((1-l)/l),c=a[768],h=Math.round(4*(c-r)/(s-d)),g=Math.round(r+h*s/4);return[Math.round(g-h/2),Math.round(g+h/2)]}n.d(t,{A:()=>i})},15105:(e,t,n)=>{"use strict";function i(e){const t=e.getMapper().getInputData(),n=t.extentToBounds(t.getExtent());return[[n[0],n[2],n[4]],[n[0],n[2],n[5]],[n[0],n[3],n[4]],[n[0],n[3],n[5]],[n[1],n[2],n[4]],[n[1],n[2],n[5]],[n[1],n[3],n[4]],[n[1],n[3],n[5]]]}n.d(t,{A:()=>i})},12437:(e,t,n)=>{"use strict";n.d(t,{A:()=>i});const i=e=>{const t="volumeId:",n=e.includes(t)?e.substring(9):e,i=n.indexOf("sliceIndex=");return-1===i?n:n.substring(0,i-1)}},4031:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var i=n(20537),a=n(65292);const o=function(e,t,n=!1){const o=e.getCamera(),{focalPoint:s,viewPlaneNormal:r}=o,{spacingInNormalDirection:l,actorUID:d}=(0,a.A)(e,o,t,n);if(!d)throw new Error(`Could not find image volume with id ${t} in the viewport`);const c=e.getActor(d);if(!c)return console.warn("No actor found for with actorUID of",d),null;const h=c.actor;return{sliceRange:(0,i.A)(h,r,s),spacingInNormalDirection:l,camera:o}}},61375:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});var i=n(4031);const a=function(e,t,n=!1){const{sliceRange:a,spacingInNormalDirection:o,camera:s}=(0,i.A)(e,t,n),{min:r,max:l,current:d}=a,c=Math.round((l-r)/o),h=(d-r)/(l-r)*c;return{numScrollSteps:c,currentStepIndex:Math.round(h),sliceRangeInfo:{sliceRange:a,spacingInNormalDirection:o,camera:s}}}},30169:(e,t,n)=>{"use strict";n.d(t,{a:()=>i});const i=e=>Object.values(e).some((e=>"number"==typeof e&&!Number.isInteger(e)))},38883:(e,t,n)=>{"use strict";function i(e){return Array.isArray(e)?e.some((e=>Number.isNaN(e))):Number.isNaN(e)}n.d(t,{A:()=>i})},39537:(e,t,n)=>{"use strict";function i(e){const t=e.indexOf(":");return e.substring(t+1)}n.d(t,{A:()=>i})},17791:(e,t,n)=>{"use strict";n.d(t,{A:()=>r});var i=n(74876);const a=new Map,o="imageRetrieveConfiguration",s={IMAGE_RETRIEVE_CONFIGURATION:o,clear:()=>{a.clear()},add:(e,t)=>{a.set(e,t)},clone:()=>new Map(a),restore:e=>{a.clear(),e.forEach(((e,t)=>{a.set(t,e)}))},get:(e,...t)=>{if(e===o)return t.map((e=>a.get(e))).find((e=>void 0!==e))}};(0,i.addProvider)(s.get.bind(s));const r=s},10297:(e,t,n)=>{"use strict";n.r(t),n.d(t,{FrameRange:()=>ut.A,HistoryMemo:()=>a,PointsManager:()=>Se.A,ProgressiveIterator:()=>ke.A,RLEVoxelMap:()=>Ze.A,VoxelManager:()=>Ke.A,actorIsA:()=>he.N,applyPreset:()=>Te.A,autoLoad:()=>At.A,buildMetadata:()=>pt.KP,calculateNeighborhoodStats:()=>Vt,calculateSpacingBetweenImageIds:()=>kt.A,calculateViewportsSpatialRegistration:()=>Ie,calibratedPixelSpacingMetadataProvider:()=>T,clamp:()=>S.A,clip:()=>Pt,color:()=>s,colormap:()=>rt,convertStackToVolumeViewport:()=>$e,convertToGrayscale:()=>Qe,convertVolumeToStackViewport:()=>qe,createLinearRGBTransferFunction:()=>g.A,createSigmoidRGBTransferFunction:()=>c.A,createSubVolume:()=>Ut,decimate:()=>Ne.A,deepClone:()=>yt.G,deepEqual:()=>gt,deepMerge:()=>De.A,eventListener:()=>i,fnv1aHash:()=>mt.A,generateVolumePropsFromImageIds:()=>Fe.D,genericMetadataProvider:()=>Le.A,getBufferConfiguration:()=>He.h,getClosestImageId:()=>M.A,getClosestStackImageIndexForPoint:()=>me,getCurrentVolumeViewportSlice:()=>pe,getDynamicVolumeInfo:()=>Dt,getImageDataMetadata:()=>vt.T,getImageLegacy:()=>xe,getImageSliceDataForVolumeViewport:()=>ce.A,getMinMax:()=>p,getPixelSpacingInformation:()=>Bt,getRandomSampleFromArray:()=>tt,getRuntimeId:()=>C,getScalingParameters:()=>Ae.A,getSliceRange:()=>le.A,getSpacingInNormalDirection:()=>y.A,getTargetVolumeAndSpacingInNormalDir:()=>x.A,getViewportImageCornersInWorld:()=>Ce,getViewportImageIds:()=>et,getViewportModality:()=>Ht,getViewportsWithImageURI:()=>ge,getViewportsWithVolumeId:()=>O.A,getVoiFromSigmoidRGBTransferFunction:()=>h.A,getVolumeActorCorners:()=>P.A,getVolumeDirectionVectors:()=>Ot,getVolumeId:()=>it.A,getVolumeSliceRangeInfo:()=>se.A,getVolumeViewportScrollInfo:()=>re.A,getVolumeViewportsContainingSameVolumes:()=>U,hasFloatScalingParameters:()=>at.a,hasNaNValues:()=>_e.A,imageIdToURI:()=>b.A,imageRetrieveMetadataProvider:()=>Ve.A,imageToWorldCoords:()=>oe,indexWithinDimensions:()=>R,invertRgbTransferFunction:()=>d.A,isEqual:()=>D.n4,isEqualAbs:()=>D.Ph,isEqualNegative:()=>D.WC,isImageActor:()=>he.e,isOpposite:()=>A,isPTPrescaledWithSUV:()=>$,isValidVolume:()=>Ue,isVideoTransferSyntax:()=>Be,jumpToSlice:()=>Lt,loadImageToCanvas:()=>J,logger:()=>Nt,makeVolumeMetadata:()=>Re.A,planar:()=>ue,pointInShapeCallback:()=>ot.ii,renderToCanvasCPU:()=>Y,renderToCanvasGPU:()=>j,roundNumber:()=>Je,roundToPrecision:()=>Xe,scaleArray:()=>Mt,scaleRgbTransferFunction:()=>u,scroll:()=>Rt,snapFocalPointToSlice:()=>de.A,sortImageIdsAndGetSpacing:()=>Pe.A,spatialRegistrationMetadataProvider:()=>Ee,splitImageIdsBy4DTags:()=>St,transferFunctionUtils:()=>lt,transformIndexToWorld:()=>N.A,transformWorldToIndex:()=>k.A,transformWorldToIndexContinuous:()=>k.p,triggerEvent:()=>m.A,updateVTKImageDataWithCornerstoneImage:()=>Oe.J,uuidv4:()=>v.A,windowLevel:()=>st,worldToImageCoords:()=>ae});var i={};n.r(i),n.d(i,{MultiTargetEventListenerManager:()=>l,TargetEventListeners:()=>r});var a={};n.r(a),n.d(a,{DefaultHistoryMemo:()=>ie,HistoryMemo:()=>ne});var o,s={};n.r(s),n.d(s,{hexToRgb:()=>ht,rgbToHex:()=>ct}),function(e){e[e.None=0]="None",e[e.Capture=1]="Capture",e[e.Bubble=2]="Bubble"}(o||(o={}));class r{constructor(e){this._eventListeners=new Map,this._children=new Map,this._target=e}get isEmpty(){return 0===this._eventListeners.size&&0===this._children.size}addEventListener(e,t,n){const i=e.indexOf(".");if(-1!==i){const a=e.substring(0,i);let o=this._children.get(a);o||(o=new r(this._target),this._children.set(a,o)),e=e.substring(i+1),o.addEventListener(e,t,n)}else this._addEventListener(e,t,n)}removeEventListener(e,t,n){const i=e.indexOf(".");if(-1!==i){const a=e.substring(0,i),o=this._children.get(a);if(!o)return;e=e.substring(i+1),o.removeEventListener(e,t,n),o.isEmpty&&this._children.delete(a)}else this._removeEventListener(e,t,n)}reset(){Array.from(this._children.entries()).forEach((([e,t])=>{if(t.reset(),!t.isEmpty)throw new Error("Child is not empty and cannot be removed");this._children.delete(e)})),this._unregisterAllEvents()}_addEventListener(e,t,n){let i=this._eventListeners.get(e);i||(i=new Map,this._eventListeners.set(e,i));const a=n?.capture??!1?o.Capture:o.Bubble,s=i.get(t)??o.None;s&a?console.warn("A listener is already registered for this phase"):(i.set(t,s|a),this._target.addEventListener(e,t,n))}_removeEventListener(e,t,n){const i=n?.capture??!1?o.Capture:o.Bubble,a=this._eventListeners.get(e);if(!a)return;(t?[t]:Array.from(a.keys())).forEach((t=>{const s=a.get(t)??o.None;if(!!!(s&i))return;this._target.removeEventListener(e,t,n);const r=s^i;r===o.None?a.delete(t):a.set(t,r)})),a.size||this._eventListeners.delete(e)}_unregisterAllListeners(e,t){Array.from(t.entries()).forEach((([t,n])=>{for(let i=o.Capture;n;i<<=1){if(!(n&i))continue;const a=i===o.Capture;this.removeEventListener(e,t,{capture:a}),n^=i}}))}_unregisterAllEvents(){Array.from(this._eventListeners.entries()).forEach((([e,t])=>{this._unregisterAllListeners(e,t)}))}}class l{constructor(){this._targetsEventListeners=new Map}addEventListener(e,t,n,i){let a=this._targetsEventListeners.get(e);a||(a=new r(e),this._targetsEventListeners.set(e,a)),a.addEventListener(t,n,i)}removeEventListener(e,t,n,i){const a=this._targetsEventListeners.get(e);a&&(a.removeEventListener(t,n,i),a.isEmpty&&this._targetsEventListeners.delete(e))}reset(){Array.from(this._targetsEventListeners.entries()).forEach((([e,t])=>{t.reset(),this._targetsEventListeners.delete(e)}))}}var d=n(50134),c=n(40256),h=n(70210),g=n(74657);function u(e,t){const n=e.getSize();for(let i=0;i<n;i++){const n=[];e.getNodeValue(i,n),n[1]=n[1]*t,n[2]=n[2]*t,n[3]=n[3]*t,e.setNodeValue(i,n)}}var m=n(69372),v=n(80221);function p(e){let t,n=e[0],i=e[0];const a=e.length;for(let o=1;o<a;o++)t=e[o],n=Math.min(n,t),i=Math.max(i,t);return{min:n,max:i}}const f=Symbol("LastRuntimeId"),w={},E=4294967295,I="-";function C(e,t,n){return function(e,t,n){let i=e[t];i instanceof Array||(i=[0],Object.defineProperty(e,t,{value:i}));for(let e=!0,t=0;e&&t<i.length;++t){let a=0|i[t];a<n?(e=!1,a+=1):(a=0,t+1===i.length&&i.push(0)),i[t]=a}return i}(null!==e&&"object"==typeof e?e:w,f,("number"==typeof n&&n>0?n:E)>>>0).join("string"==typeof t?t:I)}var b=n(39537);const _={},T={add:(e,t)=>{const n=(0,b.A)(e);_[n]=t},get:(e,t)=>{if("calibratedPixelSpacing"===e){const e=(0,b.A)(t);return _[e]}}};var S=n(84061),D=n(74638);function A(e,t,n=1e-5){return Math.abs(e[0]+t[0])<n&&Math.abs(e[1]+t[1])<n&&Math.abs(e[2]+t[2])<n}var M=n(88619),y=n(85008),x=n(65292),P=n(15105);function R(e,t){return!(e[0]<0||e[0]>=t[0]||e[1]<0||e[1]>=t[1]||e[2]<0||e[2]>=t[2])}var L=n(39536);const U=function(e,t){let n;n=t?[(0,L.lD)(t)]:(0,L.qO)();const i=[];return n.forEach((t=>{const n=e.getActors(),a=t.getVolumeViewports();for(const e of a){const t=e.getActors();if(t.length!==n.length)continue;n.every((({uid:e})=>t.find((t=>e===t.uid))))&&i.push(e)}})),i};var O=n(24724),k=n(38669),N=n(94741),V=n(80068),W=n(74876),B=n(71851),H=n(51159),F=n(3823),G=n(30135),z=n(56706);const $=e=>e.preScale.scaled&&e.preScale.scalingParameters.suvbw;function j(e,t,n=void 0,i="_thumbnails",a={displayArea:{imageArea:[1,1]}}){if(!(e&&e instanceof HTMLCanvasElement))throw new Error("canvas element is required");const o=!t.imageId,s=!o&&t,r=o&&t,l=`renderGPUViewport-${s.imageId||r.volumeId}`,d=document.createElement("div"),c=window.devicePixelRatio||1;a.displayArea||(a.displayArea={imageArea:[1,1]});const h=e.width,g=e.height;d.style.width=`${h/c+G.p8}px`,d.style.height=`${g/c+G.p8}px`,d.style.visibility="hidden",d.style.position="absolute",document.body.appendChild(d);const u=l.split(":").join("-");d.setAttribute("viewport-id-for-remove",u);const m=(0,G.Ay)(d),v=(0,L.lD)(i)||new z.Ay(i);let p=v.getViewport(l);if(!p){const e={viewportId:l,type:o?B.ViewportType.ORTHOGRAPHIC:B.ViewportType.STACK,element:d,defaultOptions:{...a,suppressEvents:!0}};v.enableElement(e),p=v.getViewport(l)}return new Promise((i=>{let h=!1,{viewReference:g}=a;const f=t=>{if(h)return;if(g){const e=g;return g=null,p.setViewReference(e),void p.render()}e.getContext("2d").drawImage(m,0,0,m.width,m.height,0,0,e.width,e.height);const n=p.canvasToWorld([0,0]),a=p.canvasToWorld([m.width/c,0]),o=p.canvasToWorld([0,m.height/c]),s=F.eR.sub([0,0,0],p.canvasToWorld([1/c,0]),n),r=F.eR.sub([0,0,0],p.canvasToWorld([0,1/c]),n);h=!0,d.removeEventListener(B.Events.IMAGE_RENDERED,f),setTimeout((()=>{v.disableElement(l);document.querySelectorAll(`[viewport-id-for-remove="${u}"]`).forEach((e=>{e.remove()}))}),0),i({origin:n,bottomLeft:o,topRight:a,thicknessMm:1,rightVector:s,downVector:r})};d.addEventListener(B.Events.IMAGE_RENDERED,f),o?p.setVolumes([r],!1,!0):p.renderImageObject(t),p.resetCamera(),"PT"!==n||$(s)||p.setProperties({voiRange:{lower:s.minPixelValue,upper:s.maxPixelValue}}),p.render()}))}var q=n(36931),K=n(7808),Z=n(5057);function Y(e,t,n,i,a){if(t.volumeId)throw new Error("Unsupported volume rendering for CPU");const o=t,s={canvas:e,viewport:(0,q.A)(e,o,n),image:o,renderingTools:{}};s.transform=(0,K.A)(s);return new Promise(((e,t)=>{(0,Z.A)(s,true),e(null)}))}var X=n(49038);function J(e){const{canvas:t,imageId:n,viewReference:i,requestType:a=B.RequestType.Thumbnail,priority:o=-5,renderingEngineId:s="_thumbnails",useCPURendering:r=!1,thumbnail:l=!1,imageAspect:d=!1,viewportOptions:c}=e,h=i?.volumeId,g=h&&!n,u=i&&c?{...c,viewReference:i}:c,m=r?Y:j;return new Promise(((e,i)=>{function c(n,a){const{modality:o}=W.get("generalSeriesModule",a)||{},c=!g&&n,h=g&&n;c&&(c.isPreScaled=c.isPreScaled||c.preScale?.scaled),l&&(t.height=256,t.width=256),d&&c&&(t.width=c&&t.height*c.width/c.height),t.style.width=t.width/devicePixelRatio+"px",t.style.height=t.height/devicePixelRatio+"px",h&&r&&i(new Error("CPU rendering of volume not supported")),m(t,n,o,s,u).then(e)}function v(e,t){console.error(e,t),i(e)}const p={useRGBA:!!r,requestType:a};if(h){const e=X.Ay.getVolume(h);e||i(new Error(`Volume id ${h} not found in cache`));c(e,e.imageIds[0])}else H.A.addRequest(function(e,t,n){return(0,V.loadAndCacheImage)(e,n).then((t=>{c.call(this,t,e)}),(t=>{v.call(this,t,e)}))}.bind(null,n,null,p),a,{imageId:n},o)}))}var Q=n(10364);const ee="CORNERSTONE_TOOLS_HISTORY_UNDO",te="CORNERSTONE_TOOLS_HISTORY_REDO";class ne{constructor(e="Tools",t=50){this.position=-1,this.redoAvailable=0,this.undoAvailable=0,this.ring=new Array,this.label=e,this._size=t}get size(){return this._size}set size(e){this.ring=new Array(e),this._size=e,this.position=-1,this.redoAvailable=0,this.undoAvailable=0}undo(e=1){for(;e>0&&this.undoAvailable>0;){const t=this.ring[this.position];t.restoreMemo(!0),t.id&&Q.A.dispatchEvent(new CustomEvent(ee,{detail:{isUndo:!0,id:t.id,operationType:t.operationType||"annotation",memo:t}})),e--,this.redoAvailable++,this.undoAvailable--,this.position=(this.position-1+this.size)%this.size}}undoIf(e){return!!(this.undoAvailable>0&&e(this.ring[this.position]))&&(this.undo(),!0)}redo(e=1){for(;e>0&&this.redoAvailable>0;){const t=(this.position+1)%this.size,n=this.ring[t];n.restoreMemo(!1),n.id&&Q.A.dispatchEvent(new CustomEvent(te,{detail:{isUndo:!1,id:n.id,operationType:n.operationType||"annotation",memo:n}})),e--,this.position=t,this.undoAvailable++,this.redoAvailable--}}push(e){if(!e)return;const t=e.restoreMemo?e:e.createMemo?.();return t?(this.redoAvailable=0,this.undoAvailable<this._size&&this.undoAvailable++,this.position=(this.position+1)%this._size,this.ring[this.position]=t,t):void 0}}const ie=new ne;const ae=function(e,t){const n=(0,W.get)("imagePlaneModule",e);if(!n)throw new Error(`No imagePlaneModule found for imageId: ${e}`);const{columnCosines:i,rowCosines:a,imagePositionPatient:o}=n;let{columnPixelSpacing:s,rowPixelSpacing:r}=n;s||=1,r||=1;const l=F.eR.create();F.eR.scaleAndAdd(l,o,i,-s/2),F.eR.scaleAndAdd(l,l,a,-r/2);const d=F.eR.create();return F.eR.sub(d,t,l),[F.eR.dot(d,a)/r,F.eR.dot(d,i)/s]};function oe(e,t){const n=(0,W.get)("imagePlaneModule",e);if(!n)throw new Error(`No imagePlaneModule found for imageId: ${e}`);const{columnCosines:i,rowCosines:a,imagePositionPatient:o}=n;let{columnPixelSpacing:s,rowPixelSpacing:r}=n;s||=1,r||=1;const l=F.eR.create();return F.eR.scaleAndAdd(l,o,a,r*(t[0]-.5)),F.eR.scaleAndAdd(l,l,i,s*(t[1]-.5)),Array.from(l)}var se=n(4031),re=n(61375),le=n(20537),de=n(80500),ce=n(47476),he=n(98039);function ge(e){const t=(0,L.qO)(),n=[];return t.forEach((t=>{t.getViewports().forEach((t=>{t.hasImageURI(e)&&n.push(t)}))})),n}var ue=n(52268);function me(e,t){const n=function(e,t){const n=t.getImageIds(),i=t.getCurrentImageIdIndex();if(0===n.length)return null;const a=t=>{const n=function(e){const t=W.get("imagePlaneModule",e);if(!(t&&t.rowCosines instanceof Array&&3===t.rowCosines.length&&t.columnCosines instanceof Array&&3===t.columnCosines.length&&t.imagePositionPatient instanceof Array&&3===t.imagePositionPatient.length))return null;const{rowCosines:n,columnCosines:i,imagePositionPatient:a}=t,o=F.eR.set(F.eR.create(),...n),s=F.eR.set(F.eR.create(),...i),r=F.eR.cross(F.eR.create(),o,s);return{rowCosines:n,columnCosines:i,imagePositionPatient:a,planeNormal:r}}(t);if(!n)return null;const i=ue.planeEquation(n.planeNormal,n.imagePositionPatient);return ue.planeDistanceToPoint(i,e)},o={distance:a(n[i])??1/0,index:i},s=n.slice(i+1);for(let e=0;e<s.length;e++){const t=a(s[e]);if(null!==t){if(!(t<=o.distance))break;o.distance=t,o.index=e+i+1}}const r=n.slice(0,i);for(let e=r.length-1;e>=0;e--){const t=a(r[e]);if(null!==t&&t!==o.distance){if(!(t<o.distance))break;o.distance=t,o.index=e}}return o.distance===1/0?null:o}(e,t);return n?n.index:null}var ve=n(51919);function pe(e){const{width:t,height:n}=e.getCanvas(),{sliceToIndexMatrix:i,indexToSliceMatrix:a}=e.getSliceViewInfo(),o=(0,ve.e)(e,[0,0]),s=(0,ve.e)(e,[t-1,0]),r=(0,ve.e)(e,[0,n-1]),l=F.eR.sub(F.eR.create(),s,o),d=F.eR.sub(F.eR.create(),r,o),c=F.eR.cross(F.eR.create(),l,d);F.eR.normalize(l,l),F.eR.normalize(d,d),F.eR.normalize(c,c);const h=Math.max(Math.abs(l[0]),Math.abs(l[1]),Math.abs(l[2])),g=Math.max(Math.abs(d[0]),Math.abs(d[1]),Math.abs(d[2]));if(!F.Fd.equals(1,h)||!F.Fd.equals(1,g))throw new Error("Livewire is not available for rotate/oblique viewports");const{voxelManager:u}=e.getImageData(),m=e.getSliceViewInfo(),v=u.getSliceData(m);return{width:m.width,height:m.height,scalarData:v,sliceToIndexMatrix:i,indexToSliceMatrix:a}}const fe={},we={add:(e,t)=>{const[n,i]=e,a=`${n}_${i}`;fe[a]||(fe[a]={}),fe[a]=t},get:(e,t,n)=>{if("spatialRegistrationModule"!==e)return;const i=`${t}_${n}`;if(fe[i])return fe[i];const a=`${n}_${t}`;return fe[a]?F.pB.invert(F.pB.create(),fe[a]):void 0}};(0,W.addProvider)(we.get.bind(we));const Ee=we;const Ie=function(e,t){const n=e.getSliceIndex(),i=t.getSliceIndex(),a=(0,W.get)("imagePlaneModule",n.toString()),o=(0,W.get)("imagePlaneModule",i.toString());if(!a||!o)return void console.log("Viewport spatial registration requires image plane module");const{imageOrientationPatient:s}=o;if(!a.imageOrientationPatient.every(((e,t)=>Math.abs(e-s[t])<.05)))return void console.log("Viewport spatial registration only supported for same orientation (hence translation only) for now",a?.imageOrientationPatient,o?.imageOrientationPatient);const r=a.imagePositionPatient,l=o.imagePositionPatient,d=F.eR.subtract(F.eR.create(),r,l),c=F.pB.fromTranslation(F.pB.create(),d);Ee.add([e.id,t.id],c)};function Ce(e){const{imageData:t,dimensions:n}=e.getImageData()||{};if(!t||!n)return[];const{canvas:i}=e,a=window.devicePixelRatio,o=[i.width/a,0],s=[i.width/a,i.height/a],r=[0,i.height/a],l=e.canvasToWorld([0,0]),d=e.canvasToWorld(o),c=e.canvasToWorld(s),h=e.canvasToWorld(r),g=t.worldToIndex(l),u=t.worldToIndex(d),m=t.worldToIndex(c),v=t.worldToIndex(h);return function({dimensions:e,imageData:t,topLeftImage:n,topRightImage:i,bottomRightImage:a,bottomLeftImage:o,topLeftWorld:s,topRightWorld:r,bottomRightWorld:l,bottomLeftWorld:d}){const c=be(n,e)?s:t.indexToWorld([0,0,0]),h=be(i,e)?r:t.indexToWorld([e[0]-1,0,0]),g=be(a,e)?l:t.indexToWorld([e[0]-1,e[1]-1,0]),u=be(o,e)?d:t.indexToWorld([0,e[1]-1,0]);return[c,h,u,g]}({dimensions:n,imageData:t,topLeftImage:g,topRightImage:u,bottomRightImage:m,bottomLeftImage:v,topLeftWorld:l,topRightWorld:d,bottomRightWorld:c,bottomLeftWorld:h})}function be(e,t){return e[0]>0||e[0]<t[0]-1||e[1]>0||e[1]<t[1]-1||e[2]>0||e[2]<t[2]-1}var _e=n(38883),Te=n(96833),Se=n(13876),De=n(74268),Ae=n(32173),Me=n(58165),ye=n(86846);const xe=function(e){const t=(0,ye.Ay)(e);if(!t)return;const{viewport:n}=t;if(!(n instanceof Me.A))throw new Error(`An image can only be fetched for a stack viewport and not for a viewport of type: ${n.type}`);return n.getCornerstoneImage()};var Pe=n(90537),Re=n(1865),Le=n(27119);function Ue(e){if(e.length<=1)return!1;const t=e[0],{modality:n,seriesInstanceUID:i}=W.get("generalSeriesModule",t),{imageOrientationPatient:a,pixelSpacing:o,frameOfReferenceUID:s,columns:r,rows:l,usingDefaultValues:d}=W.get("imagePlaneModule",t);if(d)return!1;const c={modality:n,imageOrientationPatient:a,pixelSpacing:o,frameOfReferenceUID:s,columns:r,rows:l,seriesInstanceUID:i};let h=!0;for(let t=0;t<e.length;t++){const n=e[t],{modality:i,seriesInstanceUID:a}=W.get("generalSeriesModule",n),{imageOrientationPatient:o,pixelSpacing:s,columns:r,rows:l}=W.get("imagePlaneModule",n);if(a!==c.seriesInstanceUID){h=!1;break}if(i!==c.modality){h=!1;break}if(r!==c.columns){h=!1;break}if(l!==c.rows){h=!1;break}if(!(0,D.Ay)(o,c.imageOrientationPatient)){h=!1;break}if(!(0,D.Ay)(s,c.pixelSpacing)){h=!1;break}}return h}var Oe=n(45278),ke=n(22191),Ne=n(63470),Ve=n(17791);const We=new Set(["1.2.840.10008.1.2.4.100","1.2.840.10008.1.2.4.100.1","1.2.840.10008.1.2.4.101","1.2.840.10008.1.2.4.101.1","1.2.840.10008.1.2.4.102","1.2.840.10008.1.2.4.102.1","1.2.840.10008.1.2.4.103","1.2.840.10008.1.2.4.103.1","1.2.840.10008.1.2.4.104","1.2.840.10008.1.2.4.104.1","1.2.840.10008.1.2.4.105","1.2.840.10008.1.2.4.105.1","1.2.840.10008.1.2.4.106","1.2.840.10008.1.2.4.106.1","1.2.840.10008.1.2.4.107","1.2.840.10008.1.2.4.108"]);function Be(e){if(!e)return!1;return(Array.isArray(e)?e:[e]).find((e=>We.has(e)))}var He=n(99576),Fe=n(9734),Ge=n(40661),ze=n(87142);async function $e({viewport:e,options:t={}}){const n=e.getRenderingEngine();let i=t.volumeId||`${(0,v.A)()}`;if(0===i.split(":").length){i=`${(0,ze.getUnknownVolumeLoaderSchema)()}:${i}`}const{id:a,element:o}=e,s=t.viewportId||a,r=e.getImageIds(),l=e.getViewPresentation(),d=e.getViewReference();n.enableElement({viewportId:s,type:B.ViewportType.ORTHOGRAPHIC,element:o,defaultOptions:{background:t.background,orientation:t.orientation}});(await(0,ze.createAndCacheVolume)(i,{imageIds:r})).load();const c=n.getViewport(s);await(0,Ge.A7)(n,[{volumeId:i}],[s]);const h=()=>{c.render(),o.removeEventListener(B.Events.VOLUME_VIEWPORT_NEW_VOLUME,h)};return o.addEventListener(B.Events.VOLUME_VIEWPORT_NEW_VOLUME,h),c.setViewPresentation(l),c.setViewReference(d),c.render(),c}var je=n(86252);async function qe({viewport:e,options:t}){const n=e,{id:i,element:a}=n,o=e.getRenderingEngine(),{background:s}=t,r=t.viewportId||i,l=X.Ay.getVolume(n.getVolumeId());if(!(l instanceof je.Q))throw new Error("Currently, you cannot decache a volume that is not an ImageVolume. So, unfortunately, volumes such as nifti  (which are basic Volume, without imageIds) cannot be decached.");const d={viewportId:r,type:B.ViewportType.STACK,element:a,defaultOptions:{background:s}},c=n.getViewReference();o.enableElement(d);const h=o.getViewport(r);return await h.setStack(l.imageIds),h.setViewReference(c),h.render(),h}var Ke=n(24623),Ze=n(67645),Ye=n(19325);function Xe(e){return Math.round(e/Ye.EPSILON)*Ye.EPSILON}const Je=function e(t,n=2){if(Array.isArray(t))return t.map((t=>e(t,n))).join(", ");if(null==t||""===t)return"NaN";t=Number(t);const i=Math.abs(t);if(i<1e-4)return`${t}`;const a=i>=100?n-2:i>=10?n-1:i>=1?n:i>=.1?n+1:i>=.01?n+2:i>=.001?n+3:n+4;return t.toFixed(a)};function Qe(e,t,n){const i=e.length===t*n*4,a=e.length===t*n*3;if(i||a){const a=new Float32Array(t*n);let o=0,s=0;const r=i?4:3;for(let i=0;i<t;i++)for(let t=0;t<n;t++){const t=e[o],n=e[o+1],i=e[o+2];a[s]=(t+n+i)/3,o+=r,s++}return a}return e}const et=function(e){if(e instanceof z.PX){return X.Ay.getVolume(e.getVolumeId()).imageIds}if(e.getImageIds)return e.getImageIds()};function tt(e,t){const n=[...e];return t>=n.length?(nt(n),n):(nt(n),n.slice(0,t))}function nt(e){for(let t=e.length-1;t>0;t--){const n=Math.floor(Math.random()*(t+1));[e[t],e[n]]=[e[n],e[t]]}}var it=n(12437),at=n(30169),ot=n(56577),st=n(68136),rt=n(13859),lt=n(85745);function dt(e){const t=e.toString(16);return 1==t.length?"0"+t:t}function ct(e,t,n){return"#"+dt(e)+dt(t)+dt(n)}function ht(e){const t=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(e);return t?{r:parseInt(t[1],16),g:parseInt(t[2],16),b:parseInt(t[3],16)}:null}function gt(e,t){if(e===t)return!0;if(null==e||null==t)return!1;try{return JSON.stringify(e)===JSON.stringify(t)}catch(n){return console.debug("Error in JSON.stringify during deep comparison:",n),e===t}}var ut=n(56750),mt=n(20286),vt=n(53932),pt=n(89131);const ft=(e,t)=>e.reduce(((e,n)=>((e[n[t]]=e[n[t]]||[]).push(n),e)),{});function wt(e,t){const n={};let i=[];const a=Object.keys(e);for(let o=0;o<a.length;o++){const s=new Set,r=e[a[o]];for(let e=0;e<r.length;e++){const i=t(r[e].imageId)||0;if(n[i]=n[i]||[],n[i].push({imageId:r[e].imageId}),s.add(i),s.size-1<e)return}if(0==o)i=Array.from(s);else if(!_t(i,s))return}return n}function Et(e,t){const n=W.get(t,e);try{return parseFloat(n)}catch{return}}function It(e){const t=W.get("20011003",e);try{const{InlineBinary:e}=t;if(e){const t=atob(e),n=new ArrayBuffer(t.length),i=new DataView(n);for(let e=0;e<t.length;e++)i.setUint8(e,t.charCodeAt(e));return new Float32Array(n)[0]}return parseFloat(t)}catch{return}}function Ct(e){let t=W.get("0019100c",e)||W.get("0019100C",e);try{const{InlineBinary:e}=t;return e&&(t=atob(e)),parseFloat(t)}catch{return}}function bt(e){let t=W.get("00431039",e);try{const{InlineBinary:e}=t;return e&&(t=atob(e).split("//")),parseFloat(t[0])%1e5}catch{return}}function _t(e,t){if(e.length!=t.size)return!1;for(let n=0;n<e.length;n++)if(!t.has(e[n]))return!1;return!0}function Tt(e){const t=W.get("petImageModule",e);return t?t.frameReferenceTime:0}const St=function(e){const t=function(e){const t=e.map((e=>{const{imagePositionPatient:t}=W.get("imagePlaneModule",e)||{};return{imageId:e,imagePositionPatient:t}}));if(!t.every((e=>e.imagePositionPatient)))return null;const n=ft(t,"imagePositionPatient"),i=Object.keys(n),a=n[i[0]].length;return 1===a?null:i.every((e=>n[e].length===a))?n:null}(e);if(!t)return{imageIdGroups:[e],splittingTag:null};const n=["TemporalPositionIdentifier","DiffusionBValue","TriggerTime","EchoTime","EchoNumber","PhilipsPrivateBValue","SiemensPrivateBValue","GEPrivateBValue","PetFrameReferenceTime"],i=[e=>Et(e,n[0]),e=>Et(e,n[1]),e=>Et(e,n[2]),e=>Et(e,n[3]),e=>Et(e,n[4]),It,Ct,bt,Tt];for(let e=0;e<i.length;e++){const a=wt(t,i[e]);if(a){return{imageIdGroups:Object.keys(a).map(Number.parseFloat).sort(((e,t)=>e-t)).map((e=>a[e].map((e=>e.imageId)))),splittingTag:n[e]}}}return{imageIdGroups:[e],splittingTag:null}};const Dt=function(e){const{imageIdGroups:t,splittingTag:n}=St(e);return{isDynamicVolume:t.length>1,timePoints:t,splittingTag:n}};var At=n(91979);function Mt(e,t){const n=e.length,{rescaleSlope:i,rescaleIntercept:a,suvbw:o}=t;if("PT"===t.modality&&"number"==typeof o)for(let t=0;t<n;t++)e[t]=o*(e[t]*i+a);else for(let t=0;t<n;t++)e[t]=e[t]*i+a;return e}var yt=n(99949);function xt(e,t,n){return Math.min(Math.max(t,e),n)}const Pt=xt;function Rt(e,t){if(!(0,ye.Ay)(e.element))throw new Error("Scroll::Viewport is not enabled (it might be disabled)");if(e instanceof z.hS&&0===e.getImageIds().length)throw new Error("Scroll::Stack Viewport has no images");const{volumeId:n,delta:i,scrollSlabs:a}=t;if(e instanceof z.PX)!function(e,t,n,i=!1){const a=i,{numScrollSteps:o,currentStepIndex:s,sliceRangeInfo:r}=(0,re.A)(e,t,a);if(!r)return;const{sliceRange:l,spacingInNormalDirection:d,camera:c}=r,{focalPoint:h,viewPlaneNormal:g,position:u}=c,{newFocalPoint:v,newPosition:p}=(0,de.A)(h,u,l,g,d,n);e.setCamera({focalPoint:v,position:p}),e.render();const f=s+n,w={volumeId:t,viewport:e,delta:n,desiredStepIndex:f,currentStepIndex:s,numScrollSteps:o,currentImageId:e.getCurrentImageId()};(f>o||f<0)&&e.getCurrentImageId()?(0,m.A)(Q.A,B.Events.VOLUME_VIEWPORT_SCROLL_OUT_OF_BOUNDS,w):(0,m.A)(Q.A,B.Events.VOLUME_VIEWPORT_SCROLL,w)}(e,n,i,a);else{const n=e.getCurrentImageIdIndex();if(n+i>e.getImageIds().length-1||n+i<0){const e={imageIdIndex:n,direction:i};(0,m.A)(Q.A,B.Events.STACK_SCROLL_OUT_OF_BOUNDS,e)}e.scroll(i,t.debounceLoading,t.loop)}}async function Lt(e,t={}){const{imageIndex:n,debounceLoading:i,volumeId:a}=t,o=(0,ye.Ay)(e);if(!o)throw new Error("Element has been disabled");const{viewport:s}=o,{imageIndex:r,numberOfSlices:l}=function(e,t){if(e instanceof Me.A)return{numberOfSlices:e.getImageIds().length,imageIndex:t?e.getTargetImageIdIndex():e.getCurrentImageIdIndex()};return{numberOfSlices:e.getNumberOfSlices(),imageIndex:e.getSliceIndex()}}(s,i),d=function(e,t){const n=e-1;return Pt(t,0,n)}(l,n);Rt(s,{delta:d-r,debounceLoading:i,volumeId:a})}function Ut(e,t,n={}){const i=X.Ay.getVolume(e);if(!i)throw new Error(`Referenced volume with id ${e} does not exist.`);const{metadata:a,spacing:o,direction:s,dimensions:r}=i,{minX:l,maxX:d,minY:c,maxY:h,minZ:g,maxZ:u}=t,m=[Math.min(l,d),Math.min(c,h),Math.min(g,u)],p=(0,N.A)(i.imageData,m),f=[Math.abs(d-l)+1,Math.abs(h-c)+1,Math.abs(u-g)+1],{targetBuffer:w}=n,E={metadata:a,dimensions:f,spacing:o,origin:p,direction:s,targetBuffer:w,scalarData:"Float32Array"===w?.type?new Float32Array(f[0]*f[1]*f[2]):void 0},I=(0,ze.createLocalVolume)((0,v.A)(),E),C=I.voxelManager.getCompleteScalarDataArray(),b=f[0]*f[1],_=r[0]*r[1],T=i.voxelManager.getCompleteScalarDataArray();for(let e=0;e<f[2];e++)for(let t=0;t<f[1];t++){const n=(0,N.A)(I.imageData,[0,t,e]),a=(0,k.A)(i.imageData,n),o=a[2]*_+a[1]*r[0]+a[0],s=T.slice(o,o+f[0]),l=e*b+t*f[0];C.set(s,l)}return I.voxelManager.setCompleteScalarDataArray(C),I}function Ot(e,t){const{viewUp:n,viewPlaneNormal:i}=t,a=(0,k.p)(e,[0,0,0]),o=F.eR.negate(F.eR.create(),n),s=F.eR.negate(F.eR.create(),i),r=F.eR.cross(F.eR.create(),o,s),l=F.eR.sub(F.eR.create(),(0,k.p)(e,o),a),d=F.eR.sub(F.eR.create(),(0,k.p)(e,s),a);F.eR.normalize(l,l),F.eR.normalize(d,d);return{worldVecRowDir:r,worldVecColDir:o,worldVecSliceDir:s,ijkVecRowDir:F.eR.cross(F.eR.create(),l,d),ijkVecColDir:l,ijkVecSliceDir:d}}var kt=n(42384),Nt=n(7608);function Vt(e,t,n,i){const[a,o,s]=t,r=a*o;let l=0,d=0,c=0;const[h,g,u]=n.map(Math.round);for(let t=u-i;t<=u+i;t++)if(!(t<0||t>=s))for(let n=g-i;n<=g+i;n++)if(!(n<0||n>=o))for(let o=h-i;o<=h+i;o++){if(o<0||o>=a)continue;const i=e[t*r+n*a+o];l+=i,d+=i*i,c++}if(0===c){const t=u*r+g*a+h;if(t>=0&&t<e.length){return{mean:e[t],stdDev:0,count:1}}return{mean:0,stdDev:0,count:0}}const m=l/c,v=d/c-m*m;return{mean:m,stdDev:Math.sqrt(Math.max(0,v)),count:c}}const Wt=new Set(["1.2.840.10008.5.1.4.1.1.1","1.2.840.10008.5.1.4.1.1.1.1","1.2.840.10008.5.1.4.1.1.1.1.1","1.2.840.10008.5.1.4.1.1.1.2","1.2.840.10008.5.1.4.1.1.1.2.1","1.2.840.10008.5.1.4.1.1.1.3","1.2.840.10008.5.1.4.1.1.1.3.1","1.2.840.10008.5.1.4.1.1.12.1","1.2.840.10008.5.1.4.1.1.12.1.1","1.2.840.10008.5.1.4.1.1.12.2","1.2.840.10008.5.1.4.1.1.12.2.1","1.2.840.10008.5.1.4.1.1.12.3"]);function Bt(e){const{PixelSpacing:t,SOPClassUID:n,SequenceOfUltrasoundRegions:i}=e;if(i)return function(e){const{SequenceOfUltrasoundRegions:t}=e,n=Array.isArray(t);if(n&&t.length>1)return void console.warn("Sequence of Ultrasound Regions > one entry. This is not yet implemented, all measurements will be shown in pixels.");const{PhysicalDeltaX:i,PhysicalDeltaY:a}=n?t[0]:t;return{PixelSpacing:[10*i,10*a]}}(e);return Wt.has(n)?function(e){const{PixelSpacing:t,ImagerPixelSpacing:n,EstimatedRadiographicMagnificationFactor:i,PixelSpacingCalibrationType:a,PixelSpacingCalibrationDescription:o}=e,s=!0;if(!n)return{PixelSpacing:t,type:B.CalibrationTypes.UNKNOWN,isProjection:s};if(!t)return i?{PixelSpacing:n.map((e=>e/i)),type:B.CalibrationTypes.ERMF,isProjection:s}:(console.warn("EstimatedRadiographicMagnificationFactor was not present. Unable to correct ImagerPixelSpacing."),{PixelSpacing:n,type:B.CalibrationTypes.PROJECTION,isProjection:s});return(0,D.n4)(t,n)?{PixelSpacing:t,type:B.CalibrationTypes.PROJECTION,isProjection:s}:a||o?{PixelSpacing:t,type:B.CalibrationTypes.CALIBRATED,isProjection:s,PixelSpacingCalibrationType:a,PixelSpacingCalibrationDescription:o}:{PixelSpacing:t,type:B.CalibrationTypes.UNKNOWN,isProjection:s}}(e):{PixelSpacing:t,type:B.CalibrationTypes.NOT_APPLICABLE,isProjection:!1}}const Ht=(e,t)=>function(e,t,n){if(!n)throw new Error("getVolume is required, use the utilities export instead ");if(e.modality)return e.modality;if(e.setVolumes){if(!(t=t??e.getVolumeId())||!n)return;return n(t).metadata.Modality}throw new Error("Invalid viewport type")}(e,t,X.Ay.getVolume)},50134:(e,t,n)=>{"use strict";function i(e){if(!e)return;const t=e.getSize();for(let n=0;n<t;n++){const t=[];e.getNodeValue(n,t),t[1]=1-t[1],t[2]=1-t[2],t[3]=1-t[3],e.setNodeValue(n,t)}}n.d(t,{A:()=>i})},74638:(e,t,n)=>{"use strict";function i(e,t,n){return Math.abs(e-t)<=n}function a(e){return"number"==typeof e}function o(e){return e&&"object"==typeof e&&"length"in e&&"number"==typeof e.length&&e.length>0&&"number"==typeof e[0]}function s(e,t,n=1e-5){return typeof e==typeof t&&null!==e&&null!==t&&(a(e)&&a(t)?i(e,t,n):!(!o(e)||!o(t))&&function(e,t,n=1e-5){if(e.length!==t.length)return!1;for(let a=0;a<e.length;a++)if(!i(e[a],t[a],n))return!1;return!0}(e,t,n))}n.d(t,{Ay:()=>s,Ph:()=>c,WC:()=>d,n4:()=>s});const r=e=>"number"==typeof e?-e:e?.map?e.map(r):!e,l=e=>"number"==typeof e?Math.abs(e):e?.map?e.map(l):e,d=(e,t,n=void 0)=>s(e,r(t),n),c=(e,t,n=void 0)=>s(l(e),l(t),n)},7608:(e,t,n)=>{"use strict";n.r(t),n.d(t,{aiLog:()=>h,coreLog:()=>l,cs3dLog:()=>r,dicomConsistencyLog:()=>u,examplesLog:()=>g,getLogger:()=>s,getRootLogger:()=>o,imageConsistencyLog:()=>m,loaderLog:()=>c,toolsLog:()=>d});var i=n(4367);const a=n.n(i)().noConflict();function o(e){const t=a.getLogger(e[0]);return t.getLogger=(...t)=>o(`${e}.${t.join(".")}`),t}function s(...e){return o(e.join("."))}"undefined"!=typeof window&&(window.log=a);const r=o("cs3d"),l=r.getLogger("core"),d=r.getLogger("tools"),c=r.getLogger("dicomImageLoader"),h=r.getLogger("ai"),g=r.getLogger("examples"),u=s("consistency","dicom"),m=s("consistency","image")},1865:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});var i=n(74876);function a(e){const t=e[0],{pixelRepresentation:n,bitsAllocated:a,bitsStored:o,highBit:s,photometricInterpretation:r,samplesPerPixel:l}=(0,i.get)("imagePixelModule",t),d=[],c=(0,i.get)("voiLutModule",t);let h;if(c){const{windowWidth:e,windowCenter:t}=c;if(h=c?.voiLUTFunction,Array.isArray(e))for(let n=0;n<e.length;n++)d.push({windowWidth:e[n],windowCenter:t[n]});else d.push({windowWidth:e,windowCenter:t})}else d.push({windowWidth:void 0,windowCenter:void 0});const{modality:g,seriesInstanceUID:u}=(0,i.get)("generalSeriesModule",t),{imageOrientationPatient:m,pixelSpacing:v,frameOfReferenceUID:p,columns:f,rows:w}=(0,i.get)("imagePlaneModule",t);return{BitsAllocated:a,BitsStored:o,SamplesPerPixel:l,HighBit:s,PhotometricInterpretation:r,PixelRepresentation:n,Modality:g,ImageOrientationPatient:m,PixelSpacing:v,FrameOfReferenceUID:p,Columns:f,Rows:w,voiLut:d,VOILUTFunction:h,SeriesInstanceUID:u}}},52268:(e,t,n)=>{"use strict";n.r(t),n.d(t,{isPointOnPlane:()=>d,linePlaneIntersection:()=>o,planeDistanceToPoint:()=>l,planeEquation:()=>s,threePlaneIntersection:()=>r});var i=n(3823),a=n(19325);function o(e,t,n){const[i,a,o]=e,[s,r,l]=t,[d,c,h,g]=n,u=s-i,m=r-a,v=l-o,p=-1*(d*i+c*a+h*o-g)/(d*u+c*m+h*v);return[u*p+i,m*p+a,v*p+o]}function s(e,t,n=!1){const[i,a,o]=e,s=i*t[0]+a*t[1]+o*t[2];if(n){const e=Math.sqrt(i*i+a*a+o*o);return[i/e,a/e,o/e,s/e]}return[i,a,o,s]}function r(e,t,n){const[a,o,s,r]=e,[l,d,c,h]=t,[g,u,m,v]=n,p=i.w0.fromValues(a,l,g,o,d,u,s,c,m),f=i.w0.fromValues(r,h,v,o,d,u,s,c,m),w=i.w0.fromValues(a,l,g,r,h,v,s,c,m),E=i.w0.fromValues(a,l,g,o,d,u,r,h,v);return[i.w0.determinant(f)/i.w0.determinant(p),i.w0.determinant(w)/i.w0.determinant(p),i.w0.determinant(E)/i.w0.determinant(p)]}function l(e,t,n=!1){const[i,a,o,s]=e,[r,l,d]=t,c=i*r+a*l+o*d-s,h=Math.abs(c)/Math.sqrt(i*i+a*a+o*o);return(n?Math.sign(c):1)*h}function d(e,t,n=a.EPSILON){return l(t,e)<n}},56577:(e,t,n)=>{"use strict";n.d(t,{X6:()=>o,ii:()=>a});var i=n(87784);function a(e,t){const{pointInShapeFn:n,callback:a,boundsIJK:o,returnPoints:s=!1}=t;let r;if(e.getScalarData)r=e.getScalarData();else{const t=e.getPointData().getScalars();if(t)r=t.getData();else{const{voxelManager:t}=e.get("voxelManager")||{};t&&(r=t.getCompleteScalarDataArray())}}const l=e.getDimensions(),d=[[0,l[0]],[0,l[1]],[0,l[2]]],c=function({imageData:e,bounds:t,scalarData:n,pointInShapeFn:a,callback:o}){const[[s,r],[l,d],[c,h]]=t,{numComps:g}=e,u=e.getDimensions(),m=(0,i.P)(e),v=[0,0,0],p=g||n.length/u[2]/u[1]/u[0],f=u[0]*p,w=u[1]*f,E=[];for(let e=c;e<=h;e++){v[2]=e;const t=e*w;for(let e=l;e<=d;e++){v[1]=e;const i=t+e*f;for(let e=s;e<=r;e++){v[0]=e;const t=m(v);if(a(t,v)){const a=i+e*p;let s;s=p>2?[n[a],n[a+1],n[a+2]]:n[a],E.push({value:s,index:a,pointIJK:v,pointLPS:t.slice()}),o({value:s,index:a,pointIJK:v,pointLPS:t})}}}}return E}({imageData:e,bounds:o||d,scalarData:r,pointInShapeFn:n,callback:a});return s?c:void 0}function o({voxelManager:e,bounds:t,imageData:n,pointInShapeFn:a,callback:o,returnPoints:s}){const[[r,l],[d,c],[h,g]]=t,u=(0,i.P)(n),m=[0,0,0],v=[];for(let t=h;t<=g;t++){m[2]=t;for(let t=d;t<=c;t++){m[1]=t;for(let t=r;t<=l;t++){m[0]=t;const n=u(m);if(a(n,m)){const t=e.toIndex(m),i=e.getAtIndex(t);s&&v.push({value:i,index:t,pointIJK:[...m],pointLPS:n.slice()}),o?.({value:i,index:t,pointIJK:m,pointLPS:n})}}}}return v}},80500:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});var i=n(3823);function a(e,t,n,a,o,s){const{min:r,max:l,current:d}=n,c=i.eR.create();i.eR.sub(c,t,e);const h=Math.round((l-r)/o),g=(d-r)/(l-r)*h;let u=Math.round(g),m=[e[0]-a[0]*g*o,e[1]-a[1]*g*o,e[2]-a[2]*g*o];u+=s,u>h?u=h:u<0&&(u=0);const v=u*o;m=[m[0]+a[0]*v,m[1]+a[1]*v,m[2]+a[2]*v];return{newFocalPoint:m,newPosition:[m[0]+c[0],m[1]+c[1],m[2]+c[2]]}}},90537:(e,t,n)=>{"use strict";n.d(t,{A:()=>s});var i=n(3823),a=n(74876),o=n(42384);function s(e,t){const{imagePositionPatient:n,imageOrientationPatient:s}=a.get("imagePlaneModule",e[0]);if(!t){const e=i.eR.fromValues(s[0],s[1],s[2]),n=i.eR.fromValues(s[3],s[4],s[5]);t=i.eR.create(),i.eR.cross(t,e,n)}const r="wadouri"===e[0].split(":")[0],l=(0,o.A)(e);let d;function c(e){const{imagePositionPatient:o}=a.get("imagePlaneModule",e),s=i.eR.create();return i.eR.sub(s,n,o),i.eR.dot(s,t)}if(r){const t=[e[0],e[Math.floor(e.length/2)]];d=e;c(t[0])-c(t[1])<0&&d.reverse()}else{const t=e.map((e=>({distance:c(e),imageId:e})));t.sort(((e,t)=>t.distance-e.distance)),d=t.map((e=>e.imageId))}const{imagePositionPatient:h}=a.get("imagePlaneModule",d[0]);return{zSpacing:l,origin:h,sortedImageIds:d}}},85745:(e,t,n)=>{"use strict";function i(e){const t=e.getSize(),n=[];for(let i=0;i<t;i++){const t=[];e.getNodeValue(i,t),n.push(t)}return n}function a(e,t){t?.length&&(e.removeAllPoints(),t.forEach((t=>{e.addRGBPoint(...t)})))}n.r(t),n.d(t,{getTransferFunctionNodes:()=>i,setTransferFunctionNodes:()=>a})},51919:(e,t,n)=>{"use strict";n.d(t,{e:()=>a});var i=n(38669);function a(e,t){const{imageData:n}=e.getImageData(),a=e.canvasToWorld(t);return(0,i.A)(n,a)}},94741:(e,t,n)=>{"use strict";function i(e,t){return e.indexToWorld(t)}n.d(t,{A:()=>i})},38669:(e,t,n)=>{"use strict";function i(e,t){return e.worldToIndex(t).map(Math.round)}function a(e,t){return e.worldToIndex(t)}n.d(t,{A:()=>i,p:()=>a})},45278:(e,t,n)=>{"use strict";function i(e,t){const n=t.voxelManager.getScalarData();if(!e.getPointData)return;const i=e.getPointData().getScalars().getData();if(t.color&&t.rgba){const e=new Uint8Array(t.columns*t.rows*3);for(let i=0;i<t.columns*t.rows;i++)e[3*i]=n[4*i],e[3*i+1]=n[4*i+1],e[3*i+2]=n[4*i+2];t.rgba=!1,t.getPixelData=()=>e,i.set(e)}else i.set(n);e.modified()}n.d(t,{J:()=>i})},68136:(e,t,n)=>{"use strict";n.r(t),n.d(t,{toLowHighRange:()=>s,toWindowLevel:()=>o});var i=n(82501),a=n(58977);function o(e,t){return{windowWidth:Math.abs(t-e)+1,windowCenter:(e+t+1)/2}}function s(e,t,n=i.A.LINEAR){if(n===i.A.LINEAR)return{lower:t-.5-(e-1)/2,upper:t-.5+(e-1)/2};if(n===i.A.LINEAR_EXACT)return{lower:t-e/2,upper:t+e/2};if(n===i.A.SAMPLED_SIGMOID){return{lower:(0,a.i)(.01,t,e),upper:(0,a.i)(.99,t,e)}}throw new Error("Invalid VOI LUT function")}},8644:(e,t,n)=>{"use strict";var i={};n.r(i),n.d(i,{getPoint:()=>z,getPolyDataPointIndexes:()=>$,getPolyDataPoints:()=>j});var a={};n.r(a),n.d(a,{boundingBox:()=>F,geometricSurfaceUtils:()=>Q,getCalibratedLengthUnitsAndScale:()=>R.Op,math:()=>N,planar:()=>V,polyDataUtils:()=>i,setAnnotationLabel:()=>te,throttle:()=>x.A,triggerAnnotationRenderForViewportIds:()=>L.A});var o=n(99178),s=n(15327),r=n(82056),l=n(99737);n(68040),n(83638),n(56069);n(94021),n(40100);n(74690);n(70333);const{Active:d,Passive:c,Enabled:h}=l.ToolModes,{Active:g,Passive:u,Enabled:m}=l.ToolModes;n(84971);n(27740);const{Active:v,Passive:p,Enabled:f}=l.ToolModes;var w=n(85204);n(39011);n(57725),n(39848);var E=n(6802);n(65136);n(48145);var I=n(77609);n(59475),n(24917);n(36625);n(93952);const{CAMERA_MODIFIED:C}=s.Enums.Events;const{CAMERA_MODIFIED:b}=s.Enums.Events;const{CAMERA_MODIFIED:_}=s.Enums.Events;var T=n(3823);const{STACK_NEW_IMAGE:S,VOLUME_NEW_IMAGE:D}=s.Enums.Events;const{CAMERA_MODIFIED:A}=s.Enums.Events;var M=n(17328);var y=n(52905),x=n(27730);n(45217);const{calibratedPixelSpacingMetadataProvider:P}=s.utilities;var R=n(4096),L=n(58640);n(94779),n(4296);n(40133),n(64485),n(54889);var U,O=n(93759),k=n(473),N=n(95527),V=n(13165),W=n(60810);!function(e){e.CLIP_STOPPED="CORNERSTONE_CINE_TOOL_STOPPED",e.CLIP_STARTED="CORNERSTONE_CINE_TOOL_STARTED"}(U||(U={}));const{ViewportStatus:B}=s.Enums,{triggerEvent:H}=s.utilities;new Map;var F=n(72282);n(61587).A;n(37162),n(26384),n(30045),n(94762);n(19027),n(76260),n(64063);function G(e,t){const n=e.getScalarDataLength(),i=new Float32Array(n);for(const a of t){const t=e.getDimensionGroupScalarData(a);for(let e=0;e<n;e++)i[e]+=t[e]}return i}s.Enums.GenerateImageType.SUM,s.Enums.GenerateImageType.AVERAGE,s.Enums.GenerateImageType.SUBTRACT;function z(e,t){const n=3*t;if(n<e.length)return T.eR.fromValues(e[n],e[n+1],e[n+2])}function $(e){const t=e.getLines().getData();let n=0;const i=new Map;for(;n<t.length;){const e=t[n++],a=[];for(let i=0;i<e;i++)a.push(t[n+i]);i.set(a[0],a),n+=e}const a=[],o=e=>{for(const[t,n]of e.entries())if(void 0!==n)return t;return-1};let s=o(i);for(;-1!==s;){const e=[s];for(;i.has(s);){const t=i.get(s)[1];i.has(t)&&e.push(t),i.delete(s),s=t}a.push(e),s=o(i)}return a.length?a:void 0}function j(e){const t=$(e);if(!t)return;const n=e.getPoints().getData();return t.map((e=>e.map((e=>z(n,e)))))}n(51807),n(57227);var q=n(20646),K=(n(33517),n(62184),n(79457),n(44845));q.U.Right;K.A;n(22658);const{Events:Z}=s.Enums;function Y(e){if(e instanceof s.VolumeViewport)return function(e){const{scalarData:t,width:n,height:i}=s.utilities.getCurrentVolumeViewportSlice(e),{min:a,max:o}=s.utilities.getMinMax(t);return{scalarData:t,minPixelValue:a,maxPixelValue:o,width:n,height:i,rows:n,columns:i}}(e);if(e instanceof s.StackViewport)return function(e){const t=e.getImageData(),{scalarData:n}=t,{min:i,max:a}=s.utilities.getMinMax(n),o=t.dimensions[0],r=t.dimensions[1],{rows:l,columns:d,color:c}=e.getCornerstoneImage();return{scalarData:n,width:o,height:r,minPixelValue:i,maxPixelValue:a,rows:l,columns:d,color:c}}(e);throw new Error("Viewport not supported")}n(64843),n(62783);const{transformWorldToIndex:X}=s.utilities;n(27963),n(67912);var J=n(40634),Q=n(5565),ee=n(44049);function te(e,t,n){e.data.label=n,(0,ee.triggerAnnotationModified)(e,t,l.ChangeTypes.LabelChange)}n(9175);n(83075);s.utilities.roundNumber;n(79475),n(13369),n(47807);var ne=n(44595);class ie{constructor(e){this._controlPoints=[],this._invalidated=!1,this._length=0,this._controlPoints=[],this._resolution=e?.resolution??20,this._fixedResolution=e?.fixedResolution??!1,this._closed=e?.closed??!1,this._invalidated=!0}get controlPoints(){return this._controlPoints}get numControlPoints(){return this._controlPoints.length}get resolution(){return this._resolution}set resolution(e){this._fixedResolution||this._resolution===e||(this._resolution=e,this.invalidated=!0)}get fixedResolution(){return this._fixedResolution}get closed(){return this._closed}set closed(e){this._closed!==e&&(this._closed=e,this.invalidated=!0)}get aabb(){return this._update(),this._aabb}get length(){return this._update(),this._length}get invalidated(){return this._invalidated}set invalidated(e){this._invalidated=e}hasTangentPoints(){return!1}addControlPoint(e){this._controlPoints.push([e[0],e[1]]),this.invalidated=!0}addControlPoints(e){e.forEach((e=>this.addControlPoint(e)))}addControlPointAtU(e){const t=this._getLineSegmentAt(e),{start:n,end:i}=t.points,a=Math.floor(e),o=this._curveSegments[a],s=e-Math.floor(a),r=[n[0]+s*(i[0]-n[0]),n[1]+s*(i[1]-n[1])],l=this._controlPoints.indexOf(o.controlPoints.p1)+1;return this._controlPoints.splice(l,0,r),this.invalidated=!0,{index:l,point:r}}deleteControlPointByIndex(e){const t=this._closed?3:1;return e>=0&&e<this._controlPoints.length&&this._controlPoints.length>t&&(this._controlPoints.splice(e,1),this.invalidated=!0,!0)}clearControlPoints(){this._controlPoints=[],this.invalidated=!0}setControlPoints(e){this.clearControlPoints(),this.addControlPoints(e)}updateControlPoint(e,t){if(e<0||e>=this._controlPoints.length)throw new Error("Index out of bounds");this._controlPoints[e]=[...t],this.invalidated=!0}getControlPoints(){return this._controlPoints.map((e=>[e[0],e[1]]))}getClosestControlPoint(e){const t=this._controlPoints;let n=1/0,i=-1;for(let a=0,o=t.length;a<o;a++){const o=t[a],s=e[0]-o[0],r=e[1]-o[1],l=s*s+r*r;l<n&&(n=l,i=a)}return{index:i,point:-1===i?void 0:[...t[i]],distance:Math.sqrt(n)}}getClosestControlPointWithinDistance(e,t){const n=this.getClosestControlPoint(e);return n.distance<=t?n:void 0}getClosestPoint(e){this._update();const t=this._getCurveSegmmentsDistanceSquaredInfo(e);if(!t.length)return;let n;t.sort(((e,t)=>e.distanceSquared-t.distanceSquared));let i,a,o=-1,s=1/0;for(let r=0;r<t.length;r++){const l=t[r];if(l.distanceSquared>s)continue;const{curveSegmentIndex:d,curveSegment:c}=l,{lineSegments:h}=c;for(let t=0;t<h.length;t++){const r=h[t],{point:c,distanceSquared:g}=N.lineSegment.distanceToPointSquaredInfo(r.points.start,r.points.end,e);g<s&&(a=r,o=d,i=l.curveSegment,n=c,s=g)}}return{point:n,uValue:o+(a.previousLineSegmentsLength+N.point.distanceToPoint(a.points.start,n))/i.length,distance:Math.sqrt(s)}}getClosestPointOnControlPointLines(e){const t=[...this._controlPoints];if(this._closed&&t.push(this._controlPoints[0]),!t.length)return;let n,i=1/0,a=t[0];for(let o=1,s=t.length;o<s;o++){const s=t[o],{point:r,distanceSquared:l}=N.lineSegment.distanceToPointSquaredInfo(a,s,e);l<i&&(n=r,i=l),a=s}return{point:n,distance:Math.sqrt(i)}}getPolylinePoints(){return this._update(),this._convertCurveSegmentsToPolyline(this._curveSegments)}getPreviewPolylinePoints(e,t){if(this._closed)return[];this._update();const n=this.getClosestControlPointWithinDistance(e,t),i=0===n?.index,a=this.getPreviewCurveSegments(e,i);return a?.length?this._convertCurveSegmentsToPolyline(a):[]}isPointNearCurve(e,t){this._update();const n=this._getCurveSegmmentsWithinDistance(e,t),i=t*t;for(let t=0;t<n.length;t++){const{lineSegments:a}=n[t];for(let t=0;t<a.length;t++){const n=a[t];if(N.lineSegment.distanceToPointSquared(n.points.start,n.points.end,e)<=i)return!0}}return!1}containsPoint(e){this._update();if(this._controlPoints.length<3)return!1;const t=[...this._curveSegments],n=this._getClosingCurveSegmentWithStraightLineSegment();n&&t.push(n);let i=0;for(let n=0;n<t.length;n++){const a=t[n],{aabb:o}=a;if(!(e[0]<=o.maxX&&e[1]>=o.minY&&e[1]<o.maxY))continue;const{lineSegments:s}=a;for(let t=0;t<s.length;t++){const n=s[t],{aabb:a}=n;if(e[0]<=a.maxX&&e[1]>=a.minY&&e[1]<a.maxY){const{start:t,end:a}=n.points,o=t[0]===a[0],s=(e[1]-t[1])*(a[0]-t[0])/(a[1]-t[1])+t[0];i+=o||e[0]<=s?1:0}}}return i%2==1}_update(){if(!this._invalidated)return;const e=this.getSplineCurves();let t=0,n=1/0,i=1/0,a=-1/0,o=-1/0;for(let s=0,r=e.length;s<r;s++){const{aabb:r,length:l}=e[s];n=n<=r.minX?n:r.minX,i=i<=r.minY?i:r.minY,a=a>=r.maxX?a:r.maxX,o=o>=r.maxY?o:r.maxY,t+=l}this._curveSegments=e,this._aabb={minX:n,minY:i,maxX:a,maxY:o},this._length=t,this._invalidated=!1}_convertCurveSegmentsToPolyline(e){this._update();const t=[];return e.forEach((({lineSegments:e},n)=>{e.forEach(((e,i)=>{0===n&&0===i&&t.push([...e.points.start]),t.push([...e.points.end])}))})),t}_getCurveSegmmentsDistanceSquaredInfo(e){this._update();const t=[],{_curveSegments:n}=this;for(let i=0;i<n.length;i++){const a=n[i],o=N.aabb.distanceToPointSquared(a.aabb,e);t.push({curveSegmentIndex:i,curveSegment:a,distanceSquared:o})}return t}_getCurveSegmmentsWithinDistance(e,t){this._update();const n=t*t;if(N.aabb.distanceToPointSquared(this.aabb,e)>n)return[];const i=this._getCurveSegmmentsDistanceSquaredInfo(e),a=[];for(let e=0,t=i.length;e<t;e++){const{curveSegment:t,distanceSquared:o}=i[e];o<=n&&a.push(t)}return a}_getLineSegmentAt(e){this._update();const t=Math.floor(e),n=e-t,i=this._curveSegments[t],{lineSegments:a}=i,o=i.length*n;for(let e=0;e<a.length;e++){const t=a[e],n=t.previousLineSegmentsLength+t.length;if(o>=t.previousLineSegmentsLength&&o<=n)return t}}_getClosingCurveSegmentWithStraightLineSegment(){if(this.closed)return;const e=this._controlPoints,t=e[0],n=e[e.length-1],i={points:{start:[...t],end:[...n]},aabb:{minX:Math.min(t[0],n[0]),minY:Math.min(t[1],n[1]),maxX:Math.max(t[0],n[0]),maxY:Math.max(t[1],n[1])}};return{aabb:{minX:i.aabb.minX,minY:i.aabb.minY,maxX:i.aabb.maxX,maxY:i.aabb.maxY},lineSegments:[i]}}}class ae extends ie{getPreviewCurveSegments(e,t){const n=this._getNumCurveSegments()+1,i=Math.max(0,n-2),a=t?n:n-1,o=this.getTransformMatrix(),s=[...this.controlPoints],r=[];t||s.push(e);for(let e=i;e<=a;e++){const n=this._getCurveSegment(e,o,s,t);r.push(n)}return r}getSplineCurves(){const e=this._getNumCurveSegments(),t=new Array(e);if(e<=0)return[];const n=this.getTransformMatrix();let i=0;for(let a=0;a<e;a++){const e=this._getCurveSegment(a,n);e.previousCurveSegmentsLength=i,t[a]=e,i+=e.length}return t}_getNumCurveSegments(e=this.controlPoints,t=this.closed){return t?e.length:Math.max(0,e.length-1)}_getPoint(e,t,n=this.controlPoints,i=this.closed){const a=this._getNumCurveSegments(n,i),o=Math.floor(e);let s=o%a;const r=e-o;if(s<0||s>=a){if(!this.closed)return;s=(a+s)%a}const{p0:l,p1:d,p2:c,p3:h}=this._getCurveSegmentPoints(s,n,i),g=r*r,u=g*r,m=T.ln.fromValues(1,r,g,u),v=T.ln.transformMat4(T.ln.create(),m,t);return[T.ln.dot(v,T.ln.fromValues(l[0],d[0],c[0],h[0])),T.ln.dot(v,T.ln.fromValues(l[1],d[1],c[1],h[1]))]}_getCurveSegmentPoints(e,t=this.controlPoints,n=this.closed){const i=this._getNumCurveSegments(t,n),a=e-1,o=n?(e+1)%i:e+1,s=o+1,r=t[e],l=t[o];let d,c;return d=a>=0?t[a]:n?t[t.length-1]:N.point.mirror(l,r),c=s<t.length?t[s]:n?t[0]:N.point.mirror(r,l),{p0:d,p1:r,p2:l,p3:c}}_getLineSegments(e,t,n=this.controlPoints,i=this.closed){const a=this._getNumCurveSegments(n,i),o=this.resolution+1,s=1/o;let r=e+1;i||e!==a-1||(r-=1e-8);const l=[];let d,c,h=0;for(let a=0,g=e;a<=o;a++,g+=s){g=g>r?r:g;const e=this._getPoint(g,t,n,i);if(!a){d=e;continue}c=e;const o=c[0]-d[0],s=c[1]-d[1],u=Math.sqrt(o**2+s**2),m={minX:d[0]<=c[0]?d[0]:c[0],maxX:d[0]>=c[0]?d[0]:c[0],minY:d[1]<=c[1]?d[1]:c[1],maxY:d[1]>=c[1]?d[1]:c[1]};l.push({points:{start:d,end:c},aabb:m,length:u,previousLineSegmentsLength:h}),d=c,h+=u}return l}_getCurveSegment(e,t=this.getTransformMatrix(),n=this.controlPoints,i=this.closed){const{p0:a,p1:o,p2:s,p3:r}=this._getCurveSegmentPoints(e,n,i),l=this._getLineSegments(e,t,n,i);let d=0,c=1/0,h=1/0,g=-1/0,u=-1/0;return l.forEach((({aabb:e,length:t})=>{c=Math.min(c,e.minX),h=Math.min(h,e.minY),g=Math.max(g,e.maxX),u=Math.max(u,e.maxY),d+=t})),{controlPoints:{p0:a,p1:o,p2:s,p3:r},aabb:{minX:c,minY:h,maxX:g,maxY:u},length:d,previousCurveSegmentsLength:0,lineSegments:l}}}const oe=T.pB.multiplyScalar(T.pB.create(),T.pB.fromValues(1,4,1,0,-3,0,3,0,3,-6,3,0,-1,3,-3,1),1/6);class se extends ae{getTransformMatrix(){return oe}}class re extends ae{constructor(e){super(e),this._scale=e?.scale??.5,this._fixedScale=e?.fixedScale??!1}get scale(){return this._scale}set scale(e){this._fixedScale||this._scale===e||(this._scale=e,this.invalidated=!0)}get fixedScale(){return this._fixedScale}getTransformMatrix(){const{scale:e}=this,t=2*e;return[0,1,0,0,-e,0,e,0,t,e-3,3-t,-e,-e,2-e,e-2,e]}}class le extends re{constructor(){super({scale:.5,fixedScale:!0})}}class de extends re{constructor(){super({resolution:0,fixedResolution:!0,scale:0,fixedScale:!0})}}var ce=n(85817);class he extends ce.oS{constructor(e={},t={supportedInteractionTypes:["Mouse","Touch"]}){super(e,t)}touchDragCallback(e){this._dragCallback(e)}mouseDragCallback(e){this._dragCallback(e)}_dragCallback(e){const{element:t,deltaPoints:n}=e.detail,i=(0,s.getEnabledElement)(t),a=n.world;if(0===a[0]&&0===a[1]&&0===a[2])return;const o=i.viewport.getCamera(),{focalPoint:r,position:l}=o,d=[l[0]-a[0],l[1]-a[1],l[2]-a[2]],c=[r[0]-a[0],r[1]-a[1],r[2]-a[2]];i.viewport.setCamera({focalPoint:c,position:d}),i.viewport.render()}}he.toolName="Pan";var ge=n(84607);class ue extends ce.oS{constructor(e={},t={supportedInteractionTypes:["Mouse","Touch"],configuration:{rotateIncrementDegrees:2}}){super(e,t),this._resizeObservers=new Map,this._hasResolutionChanged=!1,this.preMouseDownCallback=e=>{const t=e.detail,{element:n}=t,i=(0,s.getEnabledElement)(n),{viewport:a}=i,o=a.getDefaultActor().actor.getMapper();if(!("getSampleDistance"in o||"getCurrentSampleDistance"in o))return!0;const r=o.getSampleDistance();return this._hasResolutionChanged||(o.setSampleDistance(2*r),this._hasResolutionChanged=!0,null!==this.cleanUp&&document.removeEventListener("mouseup",this.cleanUp),this.cleanUp=()=>{o.setSampleDistance(r),a.render(),this._hasResolutionChanged=!1},document.addEventListener("mouseup",this.cleanUp,{once:!0})),!0},this._getViewportsInfo=()=>(0,I.getToolGroup)(this.toolGroupId).viewportsInfo,this.onSetToolActive=()=>{const e=()=>{this._getViewportsInfo().forEach((({viewportId:e,renderingEngineId:t})=>{if(!this._resizeObservers.has(e)){const{viewport:n}=(0,s.getEnabledElementByIds)(e,t)||{viewport:null};if(!n)return;const{element:i}=n,a=new ResizeObserver((()=>{const n=(0,s.getEnabledElementByIds)(e,t);if(!n)return;const{viewport:i}=n,a=i.getViewPresentation();i.resetCamera(),i.setViewPresentation(a),i.render()}));a.observe(i),this._resizeObservers.set(e,a)}}))};e(),this._viewportAddedListener=t=>{t.detail.toolGroupId===this.toolGroupId&&e()},s.eventTarget.addEventListener(l.Events.TOOLGROUP_VIEWPORT_ADDED,this._viewportAddedListener)},this.onSetToolDisabled=()=>{this._resizeObservers.forEach(((e,t)=>{e.disconnect(),this._resizeObservers.delete(t)})),this._viewportAddedListener&&(s.eventTarget.removeEventListener(l.Events.TOOLGROUP_VIEWPORT_ADDED,this._viewportAddedListener),this._viewportAddedListener=null)},this.rotateCamera=(e,t,n,i)=>{const a=e.getVtkActiveCamera(),o=a.getViewUp(),s=a.getFocalPoint(),r=a.getPosition(),l=[0,0,0],d=[0,0,0],c=[0,0,0],h=T.pB.identity(new Float32Array(16));T.pB.translate(h,h,t),T.pB.rotate(h,h,i,n),T.pB.translate(h,h,[-t[0],-t[1],-t[2]]),T.eR.transformMat4(l,r,h),T.eR.transformMat4(d,s,h),T.pB.identity(h),T.pB.rotate(h,h,i,n),T.eR.transformMat4(c,o,h),e.setCamera({position:l,viewUp:c,focalPoint:d})},this.touchDragCallback=this._dragCallback.bind(this),this.mouseDragCallback=this._dragCallback.bind(this)}_dragCallback(e){const{element:t,currentPoints:n,lastPoints:i}=e.detail,a=n.canvas,o=i.canvas,{rotateIncrementDegrees:r}=this.configuration,l=(0,s.getEnabledElement)(t),{viewport:d}=l,c=d.getCamera(),h=t.clientWidth,g=t.clientHeight,u=[a[0]/h,a[1]/g],m=[o[0]/h,o[1]/g],v=[.5*h,.5*g],p=d.canvasToWorld(v),f=(1+Math.abs(.5))**2,w=[m[0],0,0],E=[u[0],0,0],I=w[0]**2,C=E[0]**2,b=I>f?0:Math.sqrt(f-I),_=C>f?0:Math.sqrt(f-C),T=[w[0],0,b];ge.Ay.normalize(T);const S=[E[0],0,_];ge.Ay.normalize(S);const D=ge.Ay.dot(T,S);if(Math.abs(D)>1e-4){const e=-2*Math.acos(ge.Ay.clampValue(D,-1,1))*Math.sign(u[0]-m[0])*r,t=c.viewUp,n=c.viewPlaneNormal,i=[0,0,0],a=[0,0,0];ge.Ay.cross(t,n,i),ge.Ay.normalize(i),ge.Ay.cross(n,i,a),ge.Ay.normalize(a),ge.Ay.normalize(t),this.rotateCamera(d,p,a,e);const o=(m[1]-u[1])*r;this.rotateCamera(d,p,i,o),d.render()}}}ue.toolName="TrackballRotate";class me extends ce.oS{constructor(e={},t={supportedInteractionTypes:["Mouse","Touch"]}){super(e,t),this._getImageDynamicRangeFromMiddleSlice=(e,t)=>{const n=Math.floor(t[2]/2),i=t[0]*t[1];let a,o;e instanceof Float32Array?(a=4,o=Float32Array):e instanceof Uint8Array?(a=1,o=Uint8Array):e instanceof Uint16Array?(a=2,o=Uint16Array):e instanceof Int16Array&&(a=2,o=Int16Array);const s=new o(e.buffer,n*i*a,i),{max:r,min:l}=this._getMinMax(s,i);return r-l}}touchDragCallback(e){this.mouseDragCallback(e)}mouseDragCallback(e){const{element:t,deltaPoints:n}=e.detail,i=(0,s.getEnabledElement)(t),{viewport:a}=i;let o,r,l,d,c,h,g=!1;const u=a.getProperties();if(a instanceof s.VolumeViewport){o=a.getVolumeId(),h=s.utilities.getViewportsWithVolumeId(o),({lower:r,upper:l}=u.voiRange);const e=s.cache.getVolume(o);if(!e)throw new Error("Volume not found "+o);d=e.metadata.Modality,g=e.scaling&&Object.keys(e.scaling).length>0}else{if(!u.voiRange)throw new Error("Viewport is not a valid type");{d=a.modality,({lower:r,upper:l}=u.voiRange);const{preScale:e={scaled:!1}}=a.getImageData?.()||{};g=e.scaled&&void 0!==e.scalingParameters?.suvbw}}c="PT"===d&&g?this.getPTScaledNewRange({deltaPointsCanvas:n.canvas,lower:r,upper:l,clientHeight:t.clientHeight,isPreScaled:g,viewport:a,volumeId:o}):this.getNewRange({viewport:a,deltaPointsCanvas:n.canvas,volumeId:o,lower:r,upper:l}),c.lower>=c.upper||(a.setProperties({voiRange:c}),a.render(),a instanceof s.VolumeViewport&&h.forEach((e=>{a!==e&&e.render()})))}getPTScaledNewRange({deltaPointsCanvas:e,lower:t,upper:n,clientHeight:i,viewport:a,volumeId:o,isPreScaled:s}){let r=4;r=s?5/i:this._getMultiplierFromDynamicRange(a,o)||4;return n-=e[1]*r,{lower:t,upper:n=s?Math.max(n,.1):n}}getNewRange({viewport:e,deltaPointsCanvas:t,volumeId:n,lower:i,upper:a}){const o=this._getMultiplierFromDynamicRange(e,n)||4,r=t[0]*o,l=t[1]*o;let{windowWidth:d,windowCenter:c}=s.utilities.windowLevel.toWindowLevel(i,a);d+=r,c+=l,d=Math.max(d,1);const h=e.getProperties().VOILUTFunction;return s.utilities.windowLevel.toLowHighRange(d,c,h)}_getMultiplierFromDynamicRange(e,t){let n;if(t){const i=s.cache.getVolume(t),{voxelManager:a}=e.getImageData(),o=a.getMiddleSliceData().reduce(((e,t)=>[Math.min(e[0],t),Math.max(e[1],t)]),[1/0,-1/0]),r=i?.metadata?.BitsStored,l=r?2**r:1/0;n=Math.min(o,l)}else n=this._getImageDynamicRangeFromViewport(e);const i=n/1024;return i>1?Math.round(i):i}_getImageDynamicRangeFromViewport(e){const{imageData:t,voxelManager:n}=e.getImageData();if(n?.getRange){const e=n.getRange();return e[1]-e[0]}const i=t.getDimensions();if(t.getRange){const e=t.getRange();return e[1]-e[0]}let a,o;if(a=t.getScalarData?t.getScalarData():t.getPointData().getScalars().getData(),1!==i[2])return this._getImageDynamicRangeFromMiddleSlice(a,i);if(a.getRange)o=a.getRange();else{const{min:e,max:t}=this._getMinMax(a,a.length);o=[e,t]}return o[1]-o[0]}_getMinMax(e,t){let n=1/0,i=-1/0;for(let a=0;a<t;a++){const t=e[a];t<n&&(n=t),t>i&&(i=t)}return{max:i,min:n}}}me.toolName="WindowLevel";var ve=n(7001);class pe extends ce.EC{constructor(e={},t={supportedInteractionTypes:["Mouse","Touch"],configuration:{minWindowWidth:10}}){super(e,t),this.addNewAnnotation=e=>{const t=e.detail,{currentPoints:n,element:i}=t,a=n.world,o=(0,s.getEnabledElement)(i),{viewport:r}=o;this.isDrawing=!0;const l=r.getCamera(),{viewPlaneNormal:d,viewUp:c}=l,h=this.getReferencedImageId(r,a,d,c),g=r.getFrameOfReferenceUID(),u={invalidated:!0,highlighted:!0,metadata:{toolName:this.getToolName(),viewPlaneNormal:[...d],viewUp:[...c],FrameOfReferenceUID:g,referencedImageId:h},data:{handles:{points:[[...a],[...a],[...a],[...a]]},cachedStats:{}}};(0,E.lC)(u,i);const m=(0,W.getViewportIdsWithToolToRender)(i,this.getToolName());return this.editData={annotation:u,viewportIdsToRender:m},this._activateDraw(i),(0,ve.hideElementCursor)(i),e.preventDefault(),(0,L.A)(m),u},this._endCallback=e=>{const t=e.detail,{element:n}=t,{annotation:i,viewportIdsToRender:a}=this.editData;this._deactivateDraw(n),(0,ve.resetElementCursor)(n),this.editData=null,this.isDrawing=!1,(0,E.O8)(i.annotationUID),(0,L.A)(a),(0,ee.triggerAnnotationCompleted)(i),this.applyWindowLevelRegion(i,n)},this._dragCallback=e=>{this.isDrawing=!0;const t=e.detail,{element:n}=t,{annotation:i,viewportIdsToRender:a}=this.editData,{data:o}=i,{currentPoints:r}=t,l=(0,s.getEnabledElement)(n),{worldToCanvas:d,canvasToWorld:c}=l.viewport,h=r.world,{points:g}=o.handles;g[3]=[...h];const u=d(g[0]),m=d(g[3]),v=[m[0],u[1]],p=[u[0],m[1]],f=c(v),w=c(p);g[1]=f,g[2]=w,i.invalidated=!0,(0,L.A)(a)},this._activateDraw=e=>{w.wk.isInteractingWithTool=!0,e.addEventListener(l.Events.MOUSE_UP,this._endCallback),e.addEventListener(l.Events.MOUSE_DRAG,this._dragCallback),e.addEventListener(l.Events.MOUSE_MOVE,this._dragCallback),e.addEventListener(l.Events.MOUSE_CLICK,this._endCallback),e.addEventListener(l.Events.TOUCH_END,this._endCallback),e.addEventListener(l.Events.TOUCH_DRAG,this._dragCallback),e.addEventListener(l.Events.TOUCH_TAP,this._endCallback)},this._deactivateDraw=e=>{w.wk.isInteractingWithTool=!1,e.removeEventListener(l.Events.MOUSE_UP,this._endCallback),e.removeEventListener(l.Events.MOUSE_DRAG,this._dragCallback),e.removeEventListener(l.Events.MOUSE_MOVE,this._dragCallback),e.removeEventListener(l.Events.MOUSE_CLICK,this._endCallback),e.removeEventListener(l.Events.TOUCH_END,this._endCallback),e.removeEventListener(l.Events.TOUCH_DRAG,this._dragCallback),e.removeEventListener(l.Events.TOUCH_TAP,this._endCallback)},this.renderAnnotation=(e,t)=>{let n=!1;const{viewport:i}=e,{element:a}=i;let o=(0,E.Rh)(this.getToolName(),a);if(!o?.length)return n;if(o=this.filterInteractableAnnotationsForElement(a,o),!o?.length)return n;const s={toolGroupId:this.toolGroupId,toolName:this.getToolName(),viewportId:e.viewport.id};for(let e=0;e<o.length;e++){const a=o[e],{annotationUID:r,data:l}=a,{points:d}=l.handles,c=d.map((e=>i.worldToCanvas(e)));s.annotationUID=r;const{color:h,lineWidth:g,lineDash:u}=this.getAnnotationStyle({annotation:a,styleSpecifier:s});if(!i.getRenderingEngine())return console.warn("Rendering Engine has been destroyed"),n;const m=`${r}-rect`,v="0";(0,M.drawRect)(t,r,v,c[0],c[3],{color:h,lineDash:u,lineWidth:g},m),n=!0}return n},this.applyWindowLevelRegion=(e,t)=>{const n=(0,s.getEnabledElement)(t),{viewport:i}=n,a=Y(i),{data:o}=e,{points:r}=o.handles,l=r.map((e=>i.worldToCanvas(e))),d=l[0],c=l[3];let h=Math.min(d[0],c[0]),g=Math.min(d[1],c[1]),u=Math.abs(d[0]-c[0]),m=Math.abs(d[1]-c[1]);h=s.utilities.clip(h,0,a.width),g=s.utilities.clip(g,0,a.height),u=Math.floor(Math.min(u,Math.abs(a.width-h))),m=Math.floor(Math.min(m,Math.abs(a.height-g)));const v=function(e,t,n,i,a){const o=[];let s=0;const r=e.scalarData;let l,d,c;if(e.color)for(d=0;d<a;d++)for(c=0;c<i;c++){l=4*((d+n)*e.columns+(c+t));const i=r[l],a=r[l+1],h=r[l+2];o[s++]=.2126*i+.7152*a+.0722*h}else for(d=0;d<a;d++)for(c=0;c<i;c++)l=(d+n)*e.columns+(c+t),o[s++]=r[l];return o}(a,Math.round(h),Math.round(g),u,m),p=function(e,t,n){const i=e.length;let a=n,o=t,s=0;if(i<2)return{min:a,max:o,mean:(t+n)/2};for(let t=0;t<i;t++){const n=e[t];a=Math.min(a,n),o=Math.max(o,n),s+=n}return{min:a,max:o,mean:s/i}}(v,a.minPixelValue,a.maxPixelValue);void 0===this.configuration.minWindowWidth&&(this.configuration.minWindowWidth=10);const f=Math.max(Math.abs(p.max-p.min),this.configuration.minWindowWidth),w=p.mean,E=i.getProperties().VOILUTFunction,I=s.utilities.windowLevel.toLowHighRange(f,w,E);i.setProperties({voiRange:I}),i.render()},this.cancel=()=>null,this.isPointNearTool=()=>null,this.toolSelectedCallback=()=>null,this.handleSelectedCallback=()=>null,this._activateModify=()=>null,this._deactivateModify=()=>null}}pe.toolName="WindowLevelRegion";class fe extends ce.oS{constructor(e={},t={supportedInteractionTypes:["Mouse","Touch"],configuration:{invert:!1,debounceIfNotLoaded:!0,loop:!1}}){super(e,t),this.deltaY=1}mouseWheelCallback(e){this._scroll(e)}mouseDragCallback(e){this._dragCallback(e)}touchDragCallback(e){this._dragCallback(e)}_dragCallback(e){this._scrollDrag(e)}_scrollDrag(e){const{deltaPoints:t,viewportId:n,renderingEngineId:i}=e.detail,{viewport:a}=(0,s.getEnabledElementByIds)(n,i),{debounceIfNotLoaded:o,invert:r,loop:l}=this.configuration,d=t.canvas[1];let c;a instanceof s.VolumeViewport&&(c=a.getVolumeId());const h=this._getPixelPerImage(a),g=d+this.deltaY;if(h)if(Math.abs(g)>=h){const e=Math.round(g/h);s.utilities.scroll(a,{delta:r?-e:e,volumeId:c,debounceLoading:o,loop:l}),this.deltaY=g%h}else this.deltaY=g}_scroll(e){const{wheel:t,element:n}=e.detail,{direction:i}=t,{invert:a}=this.configuration,{viewport:o}=(0,s.getEnabledElement)(n),r=i*(a?-1:1);s.utilities.scroll(o,{delta:r,debounceLoading:this.configuration.debounceIfNotLoaded,loop:this.configuration.loop,volumeId:o instanceof s.BaseVolumeViewport?o.getVolumeId():void 0,scrollSlabs:this.configuration.scrollSlabs})}_getPixelPerImage(e){const{element:t}=e,n=e.getNumberOfSlices();return Math.max(2,t.offsetHeight/Math.max(n,8))}}fe.toolName="StackScroll";var we=n(25963);class Ee extends ce.oS{constructor(e={},t={supportedInteractionTypes:["Mouse","Touch"]}){super(e,t),this.mouseWheelCallback=e=>{const{element:t,wheel:n}=e.detail,i=(0,s.getEnabledElement)(t),{viewport:a}=i,{invert:o}=this.configuration,r=10*n.direction*(o?-1:1);this.setAngle(a,r)},this.touchDragCallback=this._dragCallback.bind(this),this.mouseDragCallback=this._dragCallback.bind(this)}_dragCallback(e){const{element:t,currentPoints:n,startPoints:i}=e.detail,a=n.world,o=i.world,r=(0,s.getEnabledElement)(t),{viewport:l}=r,d=l.getCamera(),c=[.5*t.clientWidth,.5*t.clientHeight],h=l.canvasToWorld(c);let g=(0,we.A)([o,h],[h,a]);const{viewPlaneNormal:u}=d,m=T.eR.sub(T.eR.create(),h,o),v=T.eR.sub(T.eR.create(),h,a),p=T.eR.cross(T.eR.create(),m,v);T.eR.dot(u,p)>0&&(g=-g),Number.isNaN(g)||this.setAngle(l,g)}setAngle(e,t){const{viewPlaneNormal:n,viewUp:i}=e.getCamera();if(e instanceof s.BaseVolumeViewport){const a=(t+360)%360*Math.PI/180,o=T.pB.identity(new Float32Array(16));T.pB.rotate(o,o,a,n);const s=T.eR.transformMat4(T.eR.create(),i,o);e.setCamera({viewUp:s})}else{const{rotation:n}=e.getViewPresentation();e.setViewPresentation({rotation:(n+t+360)%360})}e.render()}}Ee.toolName="PlanarRotate";class Ie extends ce.oS{constructor(e={},t={supportedInteractionTypes:["Mouse","Touch"],configuration:{zoomToCenter:!1,minZoomScale:.001,maxZoomScale:3e3,pinchToZoom:!0,pan:!0,invert:!1}}){super(e,t),this.preMouseDownCallback=e=>{const t=e.detail,{element:n,currentPoints:i}=t,a=i.world,o=(0,s.getEnabledElement)(n).viewport.getCamera(),{focalPoint:r}=o;this.initialMousePosWorld=a;let l=T.eR.fromValues(r[0]-a[0],r[1]-a[1],r[2]-a[2]);return l=T.eR.normalize(T.eR.create(),l),this.dirVec=l,!1},this.preTouchStartCallback=e=>{if(!this.configuration.pinchToZoom)return this.preMouseDownCallback(e)},this._dragParallelProjection=(e,t,n,i=!1)=>{const{element:a,deltaPoints:o}=e.detail,s=i?e.detail.deltaDistance.canvas:o.canvas[1],r=[a.clientWidth,a.clientHeight],{parallelScale:l,focalPoint:d,position:c}=n,h=s*(5/r[1])*(this.configuration.invert?-1:1),g=(1-h)*l;let u=d,m=c;if(!this.configuration.zoomToCenter){const e=T.eR.distance(d,this.initialMousePosWorld);m=T.eR.scaleAndAdd(T.eR.create(),c,this.dirVec,-e*h),u=T.eR.scaleAndAdd(T.eR.create(),d,this.dirVec,-e*h)}const v=t.getImageData();let p=[1,1,1];v&&(p=v.spacing);const{minZoomScale:f,maxZoomScale:w}=this.configuration,E=a.clientHeight*p[1]*.5,I=E/g;let C=g,b=!1;v&&(I<f?(C=E/f,b=!0):I>=w&&(C=E/w,b=!0)),t.setCamera({parallelScale:C,focalPoint:b?d:u,position:b?c:m})},this._dragPerspectiveProjection=(e,t,n,i=!1)=>{const{element:a,deltaPoints:o}=e.detail,s=i?e.detail.deltaDistance.canvas:o.canvas[1],r=[a.clientWidth,a.clientHeight],{position:l,focalPoint:d,viewPlaneNormal:c}=n,h=ge.Ay.distance2BetweenPoints(l,d),g=Math.sqrt(h)/r[1],u=[-c[0],-c[1],-c[2]],m=this.configuration.invert?s/g:s*g;let v=m*u[0];l[0]+=v,d[0]+=v,v=m*u[1],l[1]+=v,d[1]+=v,v=m*u[2],l[2]+=v,d[2]+=v,t.setCamera({position:l,focalPoint:d})},this.initialMousePosWorld=[0,0,0],this.dirVec=[0,0,0],this.configuration.pinchToZoom?this.touchDragCallback=this._pinchCallback.bind(this):this.touchDragCallback=this._dragCallback.bind(this),this.mouseDragCallback=this._dragCallback.bind(this)}_pinchCallback(e){if(e.detail.currentPointsList.length>1){const{element:t,currentPoints:n}=e.detail,i=(0,s.getEnabledElement)(t),{viewport:a}=i,o=a.getCamera(),r=n.world,{focalPoint:l}=o;this.initialMousePosWorld=r;let d=T.eR.fromValues(l[0]-r[0],l[1]-r[1],l[2]-r[2]);d=T.eR.normalize(T.eR.create(),d),this.dirVec=d,o.parallelProjection?this._dragParallelProjection(e,a,o,!0):this._dragPerspectiveProjection(e,a,o,!0),a.render()}this.configuration.pan&&this._panCallback(e)}_dragCallback(e){const{element:t}=e.detail,n=(0,s.getEnabledElement)(t),{viewport:i}=n,a=i.getCamera();a.parallelProjection?this._dragParallelProjection(e,i,a):this._dragPerspectiveProjection(e,i,a),i.render()}_panCallback(e){const{element:t,deltaPoints:n}=e.detail,i=(0,s.getEnabledElement)(t),a=n.world,o=i.viewport.getCamera(),{focalPoint:r,position:l}=o,d=[l[0]-a[0],l[1]-a[1],l[2]-a[2]],c=[r[0]-a[0],r[1]-a[1],r[2]-a[2]];i.viewport.setCamera({focalPoint:c,position:d}),i.viewport.render()}}Ie.toolName="Zoom";class Ce extends ce.oS{constructor(e={},t={supportedInteractionTypes:["Mouse","Touch"],configuration:{targetViewportIds:[]}}){super(e,t)}mouseClickCallback(e){const{element:t,currentPoints:n}=e.detail,i=(0,s.getEnabledElement)(t),{viewport:a,renderingEngine:o}=i,r=a.getVolumeId();if(!r)throw new Error("MIPJumpToClickTool: targetId is not a volumeId, you should only use MIPJumpToClickTool with a volumeId as the targetId");let l=-1/0;const d=(0,V.getPointInLineOfSightWithCriteria)(a,n.world,r,((e,t)=>{if(e>l)return l=e,t}));if(!d||!d.length)return;const{targetViewportIds:c,toolGroupId:h}=this.configuration;o.getViewports().filter((e=>{if(c?.indexOf(e.id)>=0)return!0;const t=(0,I.getToolGroupForViewport)(e.id,o.id);return!(!h||h!==t?.id)})).forEach((e=>{e instanceof s.VolumeViewport?e.jumpToWorld(d):console.warn("Cannot jump to specified world coordinates for a viewport that is not a VolumeViewport")}))}}Ce.toolName="MIPJumpToClickTool";var be=n(89265),_e=n(35381),Te=n(15305),Se=n(2076);const{RENDERING_DEFAULTS:De}=s.CONSTANTS;function Ae(){return"rgb(0, 200, 0)"}function Me(){return!0}function ye(){return!0}function xe(){return!0}const Pe=1,Re=2,Le=3;class Ue extends ce.EC{constructor(e={},t={supportedInteractionTypes:["Mouse"],configuration:{shadow:!0,viewportIndicators:!1,viewportIndicatorsConfig:{radius:5,x:null,y:null},autoPan:{enabled:!1,panSize:10},handleRadius:3,enableHDPIHandles:!1,referenceLinesCenterGapRadius:20,filterActorUIDsToSetSlabThickness:[],slabThicknessBlendMode:s.Enums.BlendModes.MAXIMUM_INTENSITY_BLEND,mobile:{enabled:!1,opacity:.8,handleRadius:9}}}){super(e,t),this.toolCenter=[0,0,0],this.initializeViewport=({renderingEngineId:e,viewportId:t})=>{const n=(0,s.getEnabledElementByIds)(t,e);if(!n)return;const{FrameOfReferenceUID:i,viewport:a}=n,{element:o}=a,{position:l,focalPoint:d,viewPlaneNormal:c}=a.getCamera();let h=this._getAnnotations(n);h=this.filterInteractableAnnotationsForElement(o,h),h?.length&&(0,r.removeAnnotation)(h[0].annotationUID);const g={highlighted:!1,metadata:{cameraPosition:[...l],cameraFocalPoint:[...d],FrameOfReferenceUID:i,toolName:this.getToolName()},data:{handles:{rotationPoints:[],slabThicknessPoints:[],toolCenter:this.toolCenter},activeOperation:null,activeViewportIds:[],viewportId:t}};return(0,r.addAnnotation)(g,o),{normal:c,point:a.canvasToWorld([a.canvas.clientWidth/2,a.canvas.clientHeight/2])}},this._getViewportsInfo=()=>(0,I.getToolGroup)(this.toolGroupId).viewportsInfo,this.resetCrosshairs=()=>{const e=this._getViewportsInfo();for(const t of e){const{viewportId:e,renderingEngineId:n}=t,i=(0,s.getEnabledElementByIds)(e,n),a=i.viewport,o=!0,l=!0,d=!0,c=!0,h=!0;a.resetCamera({resetPan:o,resetZoom:l,resetToCenter:d,resetRotation:c,suppressEvents:h}),a.resetSlabThickness();const{element:g}=a;let u=this._getAnnotations(i);u=this.filterInteractableAnnotationsForElement(g,u),u.length&&(0,r.removeAnnotation)(u[0].annotationUID),a.render()}this._computeToolCenter(e)},this.computeToolCenter=()=>{const e=this._getViewportsInfo();this._computeToolCenter(e)},this._computeToolCenter=e=>{if(!e.length||1===e.length)return void console.warn("For crosshairs to operate, at least two viewports must be given.");const[t,n,i]=e,{normal:a,point:o}=this.initializeViewport(t),{normal:r,point:l}=this.initializeViewport(n);let d=[0,0,0],c=T.eR.create();i?({normal:d,point:c}=this.initializeViewport(i)):(T.eR.add(c,o,l),T.eR.scale(c,c,.5),T.eR.cross(d,a,r));const h=s.utilities.planar.planeEquation(a,o),g=s.utilities.planar.planeEquation(r,l),u=s.utilities.planar.planeEquation(d,c),m=s.utilities.planar.threePlaneIntersection(h,g,u);this.setToolCenter(m)},this.addNewAnnotation=e=>{const t=e.detail,{element:n}=t,{currentPoints:i}=t,a=i.world,o=(0,s.getEnabledElement)(n),{viewport:r}=o;this._jump(o,a);const l=this._getAnnotations(o),d=this.filterInteractableAnnotationsForElement(r.element,l),{data:c}=d[0],{rotationPoints:h}=c.handles,g=[];for(let e=0;e<h.length-1;++e){const t=h[e][1],n=this._getReferenceLineControllable(t.id),i=this._getReferenceLineDraggableRotatable(t.id);n&&i&&(g.push(t.id),e++)}return c.activeViewportIds=[...g],c.handles.activeOperation=Pe,e.preventDefault(),(0,ve.hideElementCursor)(n),this._activateModify(n),d[0]},this.cancel=()=>{console.log("Not implemented yet")},this.handleSelectedCallback=(e,t)=>{const n=e.detail,{element:i}=n;t.highlighted=!0,this._activateModify(i),(0,ve.hideElementCursor)(i),e.preventDefault()},this.isPointNearTool=(e,t,n,i)=>!!this._pointNearTool(e,t,n,6),this.toolSelectedCallback=(e,t,n)=>{const i=e.detail,{element:a}=i;t.highlighted=!0,this._activateModify(a),(0,ve.hideElementCursor)(a),e.preventDefault()},this.onCameraModified=e=>{const t=e.detail,{element:n}=t,i=(0,s.getEnabledElement)(n),{renderingEngine:a}=i,o=i.viewport,r=this._getAnnotations(i),d=this.filterInteractableAnnotationsForElement(n,r)[0];if(!d)return;const c=o.getCamera(),h=d.metadata.cameraPosition,g=[0,0,0];ge.Ay.subtract(c.position,h,g);const u=d.metadata.cameraFocalPoint,m=[0,0,0];ge.Ay.subtract(c.focalPoint,u,m),d.metadata.cameraPosition=[...c.position],d.metadata.cameraFocalPoint=[...c.focalPoint];const v=this._getReferenceLineControllable(o.id),p=this._getReferenceLineDraggableRotatable(o.id);if(!s.utilities.isEqual(c.position,h,.001)&&v&&p){let e=!1;s.utilities.isEqual(g,m,.001)||(e=!0);const t=Math.abs(ge.Ay.dot(g,c.viewPlaneNormal))<.01;e||t||(this.toolCenter[0]+=g[0],this.toolCenter[1]+=g[1],this.toolCenter[2]+=g[2],(0,s.triggerEvent)(s.eventTarget,l.Events.CROSSHAIR_TOOL_CENTER_CHANGED,{toolGroupId:this.toolGroupId,toolCenter:this.toolCenter}))}if(this.configuration.autoPan?.enabled){(0,I.getToolGroupForViewport)(o.id,a.id).getViewportIds().filter((e=>e!==o.id)).forEach((e=>{this._autoPanViewportIfNecessary(e,a)}))}const f=(0,W.getViewportIdsWithToolToRender)(n,this.getToolName(),!1);(0,L.A)(f)},this.onResetCamera=e=>{this.resetCrosshairs()},this.mouseMoveCallback=(e,t)=>{const{element:n,currentPoints:i}=e.detail,a=i.canvas;let o=!1;for(let e=0;e<t.length;e++){const i=t[e];if((0,Se.isAnnotationLocked)(i.annotationUID))continue;const{data:s,highlighted:r}=i;if(!s.handles)continue;const l=s.handles.activeOperation,d=s.activeViewportIds&&s.activeViewportIds.length>0?[...s.activeViewportIds]:[];s.activeViewportIds=[],s.handles.activeOperation=null;let c=!1;c=!!this.getHandleNearImagePoint(n,i,a,6)||this._pointNearTool(n,i,a,6);c&&!r||!c&&r?(i.highlighted=!r,o=!0):s.handles.activeOperation===l&&this._areViewportIdArraysEqual(s.activeViewportIds,d)||(o=!0)}return o},this.filterInteractableAnnotationsForElement=(e,t)=>{if(!t||!t.length)return[];const n=(0,s.getEnabledElement)(e),{viewportId:i}=n,a=t.filter((e=>e.data.viewportId===i));return a},this.renderAnnotation=(e,t)=>{let n=!1;const{viewport:i,renderingEngine:a}=e,{element:o}=i,s=this._getAnnotations(e),r=i.getCamera(),l=this.filterInteractableAnnotationsForElement(o,s)[0];if(!s?.length||!l?.data)return n;const d=l.annotationUID,{clientWidth:c,clientHeight:h}=i.canvas,g=Math.sqrt(c*c+h*h),u=Math.min(c,h),m=l.data,v=i.worldToCanvas(this.toolCenter),p=this._filterAnnotationsByUniqueViewportOrientations(e,s),f=[],w=[0,0,c,h];p.forEach((e=>{const{data:t}=e;t.handles.toolCenter=this.toolCenter;const n=a.getViewport(t.viewportId),o=n.getCamera(),s=this._getReferenceLineControllable(n.id),l=this._getReferenceLineDraggableRotatable(n.id),d=this._getReferenceLineSlabThicknessControlsOn(n.id),{clientWidth:c,clientHeight:h}=n.canvas,m=Math.sqrt(c*c+h*h),E=[.5*c,.5*h],I=n.canvasToWorld(E),C=[0,0,0];ge.Ay.cross(r.viewPlaneNormal,o.viewPlaneNormal,C),ge.Ay.normalize(C),ge.Ay.multiplyScalar(C,m);const b=[0,0,0];ge.Ay.add(I,C,b);const _=[0,0,0];ge.Ay.subtract(I,C,_);const S=i.worldToCanvas(b),D=i.worldToCanvas(I),A=T.Zc.create();T.Zc.subtract(A,S,D),T.Zc.normalize(A,A);const M=T.Zc.create();T.Zc.scale(M,A,100*g);const y=T.Zc.create();T.Zc.scale(y,A,.4*u);const x=T.Zc.create();T.Zc.scale(x,A,.2*u);const P=T.Zc.create(),R=this.configuration.referenceLinesCenterGapRadius;T.Zc.scale(P,A,2===p.length?R:0);const L=T.Zc.create(),U=T.Zc.create(),O=T.Zc.create(),k=T.Zc.create();let N=T.Zc.clone(v);l&&s||(N=T.Zc.clone(D)),T.Zc.add(L,N,P),T.Zc.add(U,N,M),T.Zc.subtract(O,N,P),T.Zc.subtract(k,N,M),(0,_e.A)(L,U,w),(0,_e.A)(O,k,w);const V=T.Zc.create();T.Zc.subtract(V,v,y);const W=T.Zc.create();T.Zc.add(W,v,y);let B=T.Zc.clone(v);!l&&d&&(B=T.Zc.clone(D));let H=[...this.toolCenter];!l&&d&&(H=[...I]);const F=[0,0,0];ge.Ay.subtract(b,_,F),ge.Ay.normalize(F);const{viewPlaneNormal:G}=r,{matrix:z}=be.A.buildFromDegree().rotate(90,G),$=[0,0,0];T.eR.transformMat4($,F,z);const j=n.getSlabThickness(),q=[...$];ge.Ay.multiplyScalar(q,j);const K=[0,0,0];ge.Ay.add(H,q,K);const Z=i.worldToCanvas(K),Y=T.Zc.create();T.Zc.subtract(Y,B,Z);const X=T.Zc.create();T.Zc.subtract(X,B,M),T.Zc.add(X,X,Y);const J=T.Zc.create();T.Zc.add(J,B,M),T.Zc.add(J,J,Y),(0,_e.A)(X,J,w);const Q=T.Zc.create();T.Zc.add(Q,B,M),T.Zc.subtract(Q,Q,Y);const ee=T.Zc.create();T.Zc.subtract(ee,B,M),T.Zc.subtract(ee,ee,Y),(0,_e.A)(Q,ee,w);const te=T.Zc.create(),ne=T.Zc.create(),ie=T.Zc.create(),ae=T.Zc.create();T.Zc.subtract(te,B,x),T.Zc.add(te,te,Y),T.Zc.add(ne,B,x),T.Zc.add(ne,ne,Y),T.Zc.subtract(ie,B,x),T.Zc.subtract(ie,ie,Y),T.Zc.add(ae,B,x),T.Zc.subtract(ae,ae,Y),f.push([n,L,U,O,k,X,J,Q,ee,V,W,te,ne,ie,ae])}));const E=[],I=[],C=this._getReferenceLineColor(i.id),b=void 0!==C?C:"rgb(200, 200, 200)";if(f.forEach(((e,n)=>{const a=e[0],o=this._getReferenceLineColor(a.id),s=this._getReferenceLineControllable(a.id),r=this._getReferenceLineDraggableRotatable(a.id)||this.configuration.mobile?.enabled,l=this._getReferenceLineSlabThicknessControlsOn(a.id)||this.configuration.mobile?.enabled,c=m.activeViewportIds.find((e=>e===a.id));let h=void 0!==o?o:"rgb(200, 200, 200)",g=1;const u=null!==m.handles.activeOperation&&m.handles.activeOperation===Pe&&c;u&&(g=2.5);let v=`${n}`;if(s&&r?(v=`${n}One`,(0,M.drawLine)(t,d,v,e[1],e[2],{color:h,lineWidth:g}),v=`${n}Two`,(0,M.drawLine)(t,d,v,e[3],e[4],{color:h,lineWidth:g})):(0,M.drawLine)(t,d,v,e[2],e[4],{color:h,lineWidth:g}),s){h=void 0!==o?o:"rgb(200, 200, 200)";const s=m.handles.activeOperation===Re,g=[e[9],e[10]],p=[i.canvasToWorld(e[9]),a,e[1],e[2]],f=[i.canvasToWorld(e[10]),a,e[3],e[4]];E.push(p,f);const w=m.handles.activeOperation===Le,C=[e[11],e[12],e[13],e[14]],b=[i.canvasToWorld(e[11]),a,e[5],e[6]],_=[i.canvasToWorld(e[12]),a,e[5],e[6]],T=[i.canvasToWorld(e[13]),a,e[7],e[8]],S=[i.canvasToWorld(e[14]),a,e[7],e[8]];I.push(b,_,T,S);let D=this.configuration.handleRadius*(this.configuration.enableHDPIHandles?window.devicePixelRatio:1),A=1;if(this.configuration.mobile?.enabled&&(D=this.configuration.mobile.handleRadius,A=this.configuration.mobile.opacity),(u||this.configuration.mobile?.enabled)&&!s&&!w&&r&&l){let e=`${n}One`;(0,M.drawHandles)(t,d,e,g,{color:h,handleRadius:D,opacity:A,type:"circle"}),e=`${n}Two`,(0,M.drawHandles)(t,d,e,C,{color:h,handleRadius:D,opacity:A,type:"rect"})}else if(u&&!s&&!w&&r){const e=`${n}`;(0,M.drawHandles)(t,d,e,g,{color:h,handleRadius:D,opacity:A,type:"circle"})}else if(c&&!s&&!w&&l){const e=`${n}`;(0,M.drawHandles)(t,d,e,C,{color:h,handleRadius:D,opacity:A,type:"rect"})}else if(s&&r){const e=`${n}`,i=this.configuration.handleRadius*(this.configuration.enableHDPIHandles?window.devicePixelRatio:1);(0,M.drawHandles)(t,d,e,g,{color:h,handleRadius:i,fill:h,type:"circle"})}else if(w&&c&&l){const e=this.configuration.handleRadius*(this.configuration.enableHDPIHandles?window.devicePixelRatio:1);(0,M.drawHandles)(t,d,v,C,{color:h,handleRadius:e,fill:h,type:"rect"})}a.getSlabThickness()>.5&&l&&(v=`${n}STOne`,(0,M.drawLine)(t,d,v,e[5],e[6],{color:h,width:1,lineDash:[2,3]}),v=`${n}STTwo`,(0,M.drawLine)(t,d,v,e[7],e[8],{color:h,width:e,lineDash:[2,3]}))}})),n=!0,m.handles.rotationPoints=E,m.handles.slabThicknessPoints=I,this.configuration.viewportIndicators){const{viewportIndicatorsConfig:e}=this.configuration,n=[c*(e?.xOffset||.95),h*(e?.yOffset||.05)],i=e?.circleRadius||.01*g,a="0";(0,M.drawCircle)(t,d,a,n,i,{color:b,fill:b})}return n},this._getAnnotations=e=>{const{viewport:t}=e,n=(0,r.getAnnotations)(this.getToolName(),t.element)||[],i=this._getViewportsInfo().map((({viewportId:e})=>e)),a=n.filter((e=>{const{data:t}=e;return i.includes(t.viewportId)}));return a},this._onNewVolume=()=>{const e=this._getViewportsInfo();this._computeToolCenter(e)},this._areViewportIdArraysEqual=(e,t)=>e.length===t.length&&(e.forEach((e=>{let n=!1;for(let i=0;i<t.length;++i)if(e===t[i]){n=!0;break}if(!1===n)return!1})),!0),this._getAnnotationsForViewportsWithDifferentCameras=(e,t)=>{const{viewportId:n,renderingEngine:i,viewport:a}=e,o=t.filter((e=>e.data.viewportId!==n));if(!o||!o.length)return[];const r=a.getCamera(),{viewPlaneNormal:l,position:d}=r,c=o.filter((e=>{const{viewportId:t}=e.data,n=i.getViewport(t).getCamera();return!(s.utilities.isEqual(n.viewPlaneNormal,l,.01)&&s.utilities.isEqual(n.position,d,1))}));return c},this._filterViewportWithSameOrientation=(e,t,n)=>{const{renderingEngine:i}=e,{data:a}=t,o=i.getViewport(a.viewportId),r=n.filter((e=>{const{data:t}=e,n=i.getViewport(t.viewportId);return!0===this._getReferenceLineControllable(n.id)}));if(!r||!r.length)return[];const l=o.getCamera(),d=l.viewPlaneNormal;ge.Ay.normalize(d);const c=r.filter((e=>{const{viewportId:t}=e.data,n=i.getViewport(t).getCamera(),a=n.viewPlaneNormal;return ge.Ay.normalize(a),s.utilities.isEqual(d,a,.01)&&s.utilities.isEqual(l.viewUp,n.viewUp,.01)}));return c},this._filterAnnotationsByUniqueViewportOrientations=(e,t)=>{const{renderingEngine:n,viewport:i}=e,a=i.getCamera().viewPlaneNormal;ge.Ay.normalize(a);const o=t.filter((e=>{const{data:t}=e,a=n.getViewport(t.viewportId),o=this._getReferenceLineControllable(a.id);return i!==a&&!0===o})),r=[];for(let e=0;e<o.length;++e){const t=o[e],{viewportId:i}=t.data,l=n.getViewport(i).getCamera(),d=l.viewPlaneNormal;if(ge.Ay.normalize(d),s.utilities.isEqual(a,d,.01)||s.utilities.isOpposite(a,d,.01))continue;let c=!1;for(let e=0;e<r.length;++e){const t=r[e],{viewportId:i}=t.data,a=n.getViewport(i).getCamera();s.utilities.isEqual(a.viewPlaneNormal,l.viewPlaneNormal,.01)&&s.utilities.isEqual(a.position,l.position,1)&&(c=!0)}c||r.push(t)}const l=t.filter((e=>{const{data:t}=e,a=n.getViewport(t.viewportId),o=this._getReferenceLineControllable(a.id);return i!==a&&!0!==o}));for(let e=0;e<l.length;++e){const t=l[e],{viewportId:i}=t.data,o=n.getViewport(i).getCamera(),d=o.viewPlaneNormal;if(ge.Ay.normalize(d),s.utilities.isEqual(a,d,.01)||s.utilities.isOpposite(a,d,.01))continue;let c=!1;for(let e=0;e<r.length;++e){const t=r[e],{viewportId:i}=t.data,a=n.getViewport(i).getCamera();s.utilities.isEqual(a.viewPlaneNormal,o.viewPlaneNormal,.01)&&s.utilities.isEqual(a.position,o.position,1)&&(c=!0)}c||r.push(t)}const d=this._getAnnotationsForViewportsWithDifferentCameras(e,t);for(let e=0;e<d.length;++e){const t=d[e];if(r.some((e=>e===t)))continue;const{viewportId:i}=t.data,o=n.getViewport(i).getCamera(),l=o.viewPlaneNormal;if(ge.Ay.normalize(l),s.utilities.isEqual(a,l,.01)||s.utilities.isOpposite(a,l,.01))continue;let c=!1;for(let e=0;e<r.length;++e){const t=r[e],{viewportId:i}=t.data,a=n.getViewport(i).getCamera();s.utilities.isEqual(a.viewPlaneNormal,o.viewPlaneNormal,.01)&&s.utilities.isEqual(a.position,o.position,1)&&(c=!0)}c||r.push(t)}return r},this._checkIfViewportsRenderingSameScene=(e,t)=>{const n=e.getAllVolumeIds(),i=t.getAllVolumeIds();return n.length===i.length&&n.every((e=>i.includes(e)))},this._jump=(e,t)=>{w.wk.isInteractingWithTool=!0;const{viewport:n,renderingEngine:i}=e,a=this._getAnnotations(e),o=[0,0,0];ge.Ay.subtract(t,this.toolCenter,o);const s=this._getAnnotationsForViewportsWithDifferentCameras(e,a).filter((e=>{const{data:t}=e,a=i.getViewport(t.viewportId),o=this._checkIfViewportsRenderingSameScene(n,a);return this._getReferenceLineControllable(a.id)&&this._getReferenceLineDraggableRotatable(a.id)&&o}));return 0===s.length?(w.wk.isInteractingWithTool=!1,!1):(this._applyDeltaShiftToSelectedViewportCameras(i,s,o),w.wk.isInteractingWithTool=!1,!0)},this._activateModify=e=>{w.wk.isInteractingWithTool=!this.configuration.mobile?.enabled,e.addEventListener(l.Events.MOUSE_UP,this._endCallback),e.addEventListener(l.Events.MOUSE_DRAG,this._dragCallback),e.addEventListener(l.Events.MOUSE_CLICK,this._endCallback),e.addEventListener(l.Events.TOUCH_END,this._endCallback),e.addEventListener(l.Events.TOUCH_DRAG,this._dragCallback),e.addEventListener(l.Events.TOUCH_TAP,this._endCallback)},this._deactivateModify=e=>{w.wk.isInteractingWithTool=!1,e.removeEventListener(l.Events.MOUSE_UP,this._endCallback),e.removeEventListener(l.Events.MOUSE_DRAG,this._dragCallback),e.removeEventListener(l.Events.MOUSE_CLICK,this._endCallback),e.removeEventListener(l.Events.TOUCH_END,this._endCallback),e.removeEventListener(l.Events.TOUCH_DRAG,this._dragCallback),e.removeEventListener(l.Events.TOUCH_TAP,this._endCallback)},this._endCallback=e=>{const t=e.detail,{element:n}=t;this.editData.annotation.data.handles.activeOperation=null,this.editData.annotation.data.activeViewportIds=[],this._deactivateModify(n),(0,ve.resetElementCursor)(n),this.editData=null;const i=(0,W.getViewportIdsWithToolToRender)(n,this.getToolName(),!1);(0,L.A)(i)},this._dragCallback=e=>{const t=e.detail,n=t.deltaPoints.world;if(Math.abs(n[0])<.001&&Math.abs(n[1])<.001&&Math.abs(n[2])<.001)return;const{element:i}=t,a=(0,s.getEnabledElement)(i),{renderingEngine:o,viewport:r}=a,l=this._getAnnotations(a),d=this.filterInteractableAnnotationsForElement(i,l)[0];if(!d)return;const{handles:c}=d.data,{currentPoints:h}=e.detail,g=h.canvas;if(c.activeOperation===Pe){const e=this._getAnnotationsForViewportsWithDifferentCameras(a,l).filter((e=>{const{data:t}=e,n=o.getViewport(t.viewportId),i=this._getReferenceLineControllable(n.id),a=this._getReferenceLineDraggableRotatable(n.id);return!0===i&&!0===a&&d.data.activeViewportIds.find((e=>e===n.id))}));this._applyDeltaShiftToSelectedViewportCameras(o,e,n)}else if(c.activeOperation===Re){const e=this._getAnnotationsForViewportsWithDifferentCameras(a,l).filter((e=>{const{data:t}=e,n=o.getViewport(t.viewportId),i=this._getReferenceLineControllable(n.id),a=this._getReferenceLineDraggableRotatable(n.id);return!0===i&&!0===a})),n=T.Zc.create(),i=T.Zc.create(),s=[this.toolCenter[0],this.toolCenter[1],this.toolCenter[2]],d=r.worldToCanvas(s),c=t.currentPoints.canvas,h=T.Zc.create();T.Zc.sub(h,c,t.deltaPoints.canvas),T.Zc.sub(n,h,d),T.Zc.sub(i,c,d);let g=T.Zc.angle(n,i);this._isClockWise(d,h,c)&&(g*=-1),g=Math.round(100*g)/100;const u=r.getCamera().viewPlaneNormal,{matrix:m}=be.A.buildFromRadian().translate(s[0],s[1],s[2]).rotate(g,u).translate(-s[0],-s[1],-s[2]),v=[];e.forEach((e=>{const{data:t}=e;t.handles.toolCenter=s;const n=o.getViewport(t.viewportId),i=n.getCamera(),{viewUp:a,position:r,focalPoint:l}=i;a[0]+=r[0],a[1]+=r[1],a[2]+=r[2],T.eR.transformMat4(l,l,m),T.eR.transformMat4(r,r,m),T.eR.transformMat4(a,a,m),a[0]-=r[0],a[1]-=r[1],a[2]-=r[2],n.setCamera({position:r,viewUp:a,focalPoint:l}),v.push(n.id)})),o.renderViewports(v)}else if(c.activeOperation===Le){const e=this._getAnnotationsForViewportsWithDifferentCameras(a,l).filter((e=>{const{data:t}=e,n=o.getViewport(t.viewportId),i=this._getReferenceLineControllable(n.id),a=this._getReferenceLineSlabThicknessControlsOn(n.id);return!0===i&&!0===a&&d.data.activeViewportIds.find((e=>e===n.id))}));if(0===e.length)return;const i=this._filterViewportWithSameOrientation(a,e[0],l),c=[];c.push(r.id),i.forEach((e=>{const{data:i}=e,a=o.getViewport(i.viewportId),l=a.getCamera().viewPlaneNormal,h=ge.Ay.dot(n,l),u=[...l];if(ge.Ay.multiplyScalar(u,h),Math.abs(u[0])>.001||Math.abs(u[1])>.001||Math.abs(u[2])>.001){const e=Math.sqrt(u[0]*u[0]+u[1]*u[1]+u[2]*u[2]),n=t.lastPoints.world,i=[0,0,0],h=[this.toolCenter[0],this.toolCenter[1],this.toolCenter[2]];if(!this._getReferenceLineDraggableRotatable(a.id)){const{rotationPoints:e}=this.editData.annotation.data.handles,t=e.filter((e=>e[1].uid===a.id));if(2===t.length){const e=r.canvasToWorld(t[0][3]),n=r.canvasToWorld(t[1][3]);ge.Ay.add(e,n,h),ge.Ay.multiplyScalar(h,.5)}}ge.Ay.subtract(n,h,i);const m=ge.Ay.dot(i,l),v=[...l];ge.Ay.multiplyScalar(v,m);const p=[v[0],v[1],v[2]];T.eR.normalize(p,p);const f=[u[0],u[1],u[2]];T.eR.normalize(f,f);let w=a.getSlabThickness();s.utilities.isOpposite(p,f,.001)?w-=e:w+=e,w=Math.abs(w),w=Math.max(De.MINIMUM_SLAB_THICKNESS,w);this._pointNearReferenceLine(d,g,6,a)&&(w=De.MINIMUM_SLAB_THICKNESS);(0,I.getToolGroupForViewport)(a.id,o.id).getToolInstance(this.getToolName()).setSlabThickness(a,w),c.push(a.id)}})),o.renderViewports(c)}},this._pointNearReferenceLine=(e,t,n,i)=>{const{data:a}=e,{rotationPoints:o}=a.handles;for(let e=0;e<o.length-1;++e){const a=o[e][1];if(a.id!==i.id)continue;if(!this._getReferenceLineControllable(a.id))continue;const s={start:{x:o[e][2][0],y:o[e][2][1]},end:{x:o[e][3][0],y:o[e][3][1]}},r=Te.distanceToPoint([s.start.x,s.start.y],[s.end.x,s.end.y],[t[0],t[1]]),l={start:{x:o[e+1][2][0],y:o[e+1][2][1]},end:{x:o[e+1][3][0],y:o[e+1][3][1]}},d=Te.distanceToPoint([l.start.x,l.start.y],[l.end.x,l.end.y],[t[0],t[1]]);if(r<=n||d<=n)return!0;e++}return!1},this._getReferenceLineColor=e.configuration?.getReferenceLineColor||Ae,this._getReferenceLineControllable=e.configuration?.getReferenceLineControllable||Me,this._getReferenceLineDraggableRotatable=e.configuration?.getReferenceLineDraggableRotatable||ye,this._getReferenceLineSlabThicknessControlsOn=e.configuration?.getReferenceLineSlabThicknessControlsOn||xe}onSetToolActive(){const e=this._getViewportsInfo();this._unsubscribeToViewportNewVolumeSet(e),this._subscribeToViewportNewVolumeSet(e),this._computeToolCenter(e)}onSetToolPassive(){const e=this._getViewportsInfo();this._computeToolCenter(e)}onSetToolEnabled(){const e=this._getViewportsInfo();this._computeToolCenter(e)}onSetToolDisabled(){const e=this._getViewportsInfo();this._unsubscribeToViewportNewVolumeSet(e),e.forEach((({renderingEngineId:e,viewportId:t})=>{const n=(0,s.getEnabledElementByIds)(t,e);if(!n)return;const i=this._getAnnotations(n);i?.length&&i.forEach((e=>{(0,r.removeAnnotation)(e.annotationUID)}))}))}setToolCenter(e,t=!1){this.toolCenter=e;const n=this._getViewportsInfo();(0,L.A)(n.map((({viewportId:e})=>e))),t||(0,s.triggerEvent)(s.eventTarget,l.Events.CROSSHAIR_TOOL_CENTER_CHANGED,{toolGroupId:this.toolGroupId,toolCenter:this.toolCenter})}getHandleNearImagePoint(e,t,n,i){const a=(0,s.getEnabledElement)(e),{viewport:o}=a;let r=this._getRotationHandleNearImagePoint(o,t,n,i);return null!==r?r:(r=this._getSlabThicknessHandleNearImagePoint(o,t,n,i),null!==r?r:void 0)}_unsubscribeToViewportNewVolumeSet(e){e.forEach((({viewportId:e,renderingEngineId:t})=>{const{viewport:n}=(0,s.getEnabledElementByIds)(e,t),{element:i}=n;i.removeEventListener(s.Enums.Events.VOLUME_VIEWPORT_NEW_VOLUME,this._onNewVolume)}))}_subscribeToViewportNewVolumeSet(e){e.forEach((({viewportId:e,renderingEngineId:t})=>{const{viewport:n}=(0,s.getEnabledElementByIds)(e,t),{element:i}=n;i.addEventListener(s.Enums.Events.VOLUME_VIEWPORT_NEW_VOLUME,this._onNewVolume)}))}_autoPanViewportIfNecessary(e,t){const n=t.getViewport(e),{clientWidth:i,clientHeight:a}=n.canvas,o=n.worldToCanvas(this.toolCenter),s=this.configuration.autoPan.panSize,r=[o[0],o[1]];if(o[0]<0?r[0]=s:o[0]>i&&(r[0]=i-s),o[1]<0?r[1]=s:o[1]>a&&(r[1]=a-s),r[0]===o[0]&&r[1]===o[1])return;const l=n.canvasToWorld(r),d=[l[0]-this.toolCenter[0],l[1]-this.toolCenter[1],l[2]-this.toolCenter[2]],c=n.getCamera(),{focalPoint:h,position:g}=c,u=[g[0]-d[0],g[1]-d[1],g[2]-d[2]],m=[h[0]-d[0],h[1]-d[1],h[2]-d[2]];n.setCamera({focalPoint:m,position:u}),n.render()}setSlabThickness(e,t){let n;const{filterActorUIDsToSetSlabThickness:i}=this.configuration;i&&i.length>0&&(n=i);let a=this.configuration.slabThicknessBlendMode;t===De.MINIMUM_SLAB_THICKNESS&&(a=s.Enums.BlendModes.COMPOSITE);e.setBlendMode(a,n,!1),e.setSlabThickness(t,n)}_isClockWise(e,t,n){return(t[0]-e[0])*(n[1]-e[1])-(t[1]-e[1])*(n[0]-e[0])>0}_applyDeltaShiftToSelectedViewportCameras(e,t,n){t.forEach((t=>{this._applyDeltaShiftToViewportCamera(e,t,n)}))}_applyDeltaShiftToViewportCamera(e,t,n){const{data:i}=t,a=e.getViewport(i.viewportId),o=a.getCamera(),s=o.viewPlaneNormal,r=ge.Ay.dot(n,s),l=[...s];if(ge.Ay.multiplyScalar(l,r),Math.abs(l[0])>.001||Math.abs(l[1])>.001||Math.abs(l[2])>.001){const e=[0,0,0],t=[0,0,0];ge.Ay.add(o.focalPoint,l,e),ge.Ay.add(o.position,l,t),a.setCamera({focalPoint:e,position:t}),a.render()}}_getRotationHandleNearImagePoint(e,t,n,i){const{data:a}=t,{rotationPoints:o}=a.handles;for(let s=0;s<o.length;s++){const r=o[s][0],l=o[s][1];if(!this._getReferenceLineControllable(l.id))continue;if(!this._getReferenceLineDraggableRotatable(l.id))continue;const d=e.worldToCanvas(r);if(T.Zc.distance(n,d)<i)return a.handles.activeOperation=Re,this.editData={annotation:t},r}return null}_getSlabThicknessHandleNearImagePoint(e,t,n,i){const{data:a}=t,{slabThicknessPoints:o}=a.handles;for(let s=0;s<o.length;s++){const r=o[s][0],l=o[s][1];if(!this._getReferenceLineControllable(l.id))continue;if(!this._getReferenceLineSlabThicknessControlsOn(l.id))continue;const d=e.worldToCanvas(r);if(T.Zc.distance(n,d)<i)return a.handles.activeOperation=Le,a.activeViewportIds=[l.id],this.editData={annotation:t},r}return null}_pointNearTool(e,t,n,i){const a=(0,s.getEnabledElement)(e),{viewport:o}=a,{clientWidth:r,clientHeight:l}=o.canvas,d=Math.sqrt(r*r+l*l),{data:c}=t,{rotationPoints:h}=c.handles,{slabThicknessPoints:g}=c.handles,u=[];for(let e=0;e<h.length-1;++e){const t=h[e][1],a=this._getReferenceLineControllable(t.id),o=this._getReferenceLineDraggableRotatable(t.id);if(!a||!o)continue;const s={start:{x:h[e][2][0],y:h[e][2][1]},end:{x:h[e][3][0],y:h[e][3][1]}},r=Te.distanceToPoint([s.start.x,s.start.y],[s.end.x,s.end.y],[n[0],n[1]]),l={start:{x:h[e+1][2][0],y:h[e+1][2][1]},end:{x:h[e+1][3][0],y:h[e+1][3][1]}},d=Te.distanceToPoint([l.start.x,l.start.y],[l.end.x,l.end.y],[n[0],n[1]]);(r<=i||d<=i)&&(u.push(t.id),c.handles.activeOperation=Pe),e++}for(let e=0;e<g.length-1;++e){const t=g[e][1];if(u.find((e=>e===t.id)))continue;const a=this._getReferenceLineControllable(t.id),o=this._getReferenceLineSlabThicknessControlsOn(t.id);if(!a||!o)continue;const s=g[e][2],r=g[e][3],l=T.Zc.create();T.Zc.add(l,s,r),T.Zc.scale(l,l,.5);const h=T.Zc.create();T.Zc.subtract(h,s,l),T.Zc.normalize(h,h);const m=T.Zc.create();T.Zc.scale(m,h,.05*d);const v=T.Zc.create(),p=T.Zc.create();T.Zc.add(v,l,m),T.Zc.subtract(p,l,m);const f={start:{x:v[0],y:v[1]},end:{x:s[0],y:s[1]}},w=Te.distanceToPoint([f.start.x,f.start.y],[f.end.x,f.end.y],[n[0],n[1]]),E={start:{x:p[0],y:p[1]},end:{x:r[0],y:r[1]}},I=Te.distanceToPoint([E.start.x,E.start.y],[E.end.x,E.end.y],[n[0],n[1]]);(w<=i||I<=i)&&(u.push(t.id),c.handles.activeOperation=null),e++}return c.activeViewportIds=[...u],this.editData={annotation:t},c.handles.activeOperation===Pe}}Ue.toolName="Crosshairs";const Oe="magnify-viewport";class ke extends ce.oS{constructor(e={},t={supportedInteractionTypes:["Mouse","Touch"],configuration:{magnifySize:10,magnifyWidth:250,magnifyHeight:250}}){super(e,t),this._hasBeenRemoved=!1,this.preMouseDownCallback=e=>{const t=e.detail,{element:n,currentPoints:i}=t,a=(0,s.getEnabledElement)(n),{viewport:o,renderingEngine:r}=a;if(!(o instanceof s.StackViewport))throw new Error("MagnifyTool only works on StackViewports");const l=this._getReferencedImageId(o);if(!l)throw new Error("MagnifyTool: No referenced image id found, reconstructed planes not supported yet");const d=(0,W.getViewportIdsWithToolToRender)(n,this.getToolName());return this.editData={referencedImageId:l,viewportIdsToRender:d,enabledElement:a,renderingEngine:r,currentPoints:i},this._createMagnificationViewport(),this._activateDraw(n),(0,ve.hideElementCursor)(n),e.preventDefault(),(0,L.A)(d),!0},this.preTouchStartCallback=e=>{this.preMouseDownCallback(e)},this._createMagnificationViewport=()=>{const{enabledElement:e,referencedImageId:t,viewportIdsToRender:n,renderingEngine:i,currentPoints:a}=this.editData,{viewport:o}=e,{element:r}=o,l=o.getProperties(),{rotation:d}=o.getViewPresentation(),{canvas:c,world:h}=a;let g;if(g=r.querySelector(".magnifyTool"),null===g){const e=document.createElement("div");e.classList.add("magnifyTool"),e.style.display="block",e.style.width=`${this.configuration.magnifyWidth}px`,e.style.height=`${this.configuration.magnifyHeight}px`,e.style.position="absolute",g=e;r.querySelector(".viewport-element").appendChild(e);const t={viewportId:Oe,type:s.Enums.ViewportType.STACK,element:g};i.enableElement(t)}g.style.top=c[1]-this.configuration.magnifyHeight/2+"px",g.style.left=c[0]-this.configuration.magnifyWidth/2+"px";const u=i.getViewport(Oe);u.setStack([t]).then((()=>{if(this._hasBeenRemoved)return;u.setProperties(l),u.setViewPresentation({rotation:d});const{parallelScale:e}=o.getCamera(),{focalPoint:t,position:n,viewPlaneNormal:i}=u.getCamera(),a=Math.sqrt(Math.pow(t[0]-n[0],2)+Math.pow(t[1]-n[1],2)+Math.pow(t[2]-n[2],2)),s=[h[0],h[1],h[2]],r=[s[0]+a*i[0],s[1]+a*i[1],s[2]+a*i[2]];u.setCamera({parallelScale:e*(1/this.configuration.magnifySize),focalPoint:s,position:r}),u.render()})),g.style.display="block",(0,L.A)(n)},this._dragCallback=e=>{const t=e.detail,{deltaPoints:n,element:i,currentPoints:a}=t,o=n.world,r=a.canvas,l=(0,s.getEnabledElement)(i),{renderingEngine:d}=l,c=d.getViewport(Oe),h=i.querySelector(".magnifyTool");if(!h)return;h.style.top=r[1]-this.configuration.magnifyHeight/2+"px",h.style.left=r[0]-this.configuration.magnifyWidth/2+"px";const{focalPoint:g,position:u}=c.getCamera(),m=[u[0]+o[0],u[1]+o[1],u[2]+o[2]],v=[g[0]+o[0],g[1]+o[1],g[2]+o[2]];c.setCamera({focalPoint:v,position:m}),c.render()},this._dragEndCallback=e=>{const{element:t}=e.detail,n=(0,s.getEnabledElement)(t),{renderingEngine:i}=n;i.disableElement(Oe);const a=t.querySelector(".viewport-element"),o=a.querySelector(".magnifyTool");a.removeChild(o),this._deactivateDraw(t),(0,ve.resetElementCursor)(t),this._hasBeenRemoved=!0},this._activateDraw=e=>{w.wk.isInteractingWithTool=!0,this._hasBeenRemoved=!1,e.addEventListener(l.Events.MOUSE_UP,this._dragEndCallback),e.addEventListener(l.Events.MOUSE_DRAG,this._dragCallback),e.addEventListener(l.Events.MOUSE_CLICK,this._dragEndCallback),e.addEventListener(l.Events.TOUCH_END,this._dragEndCallback),e.addEventListener(l.Events.TOUCH_DRAG,this._dragCallback)},this._deactivateDraw=e=>{w.wk.isInteractingWithTool=!1,e.removeEventListener(l.Events.MOUSE_UP,this._dragEndCallback),e.removeEventListener(l.Events.MOUSE_DRAG,this._dragCallback),e.removeEventListener(l.Events.MOUSE_CLICK,this._dragEndCallback),e.removeEventListener(l.Events.TOUCH_END,this._dragEndCallback),e.removeEventListener(l.Events.TOUCH_DRAG,this._dragCallback)}}_getReferencedImageId(e){const t=this.getTargetId(e);let n;return e instanceof s.StackViewport&&(n=t.split("imageId:")[1]),n}}ke.toolName="Magnify";var Ne=n(29601),Ve=n(77081),We=n(82216);const{Events:Be}=s.Enums,He=e=>e.uid!==e.referencedId;var Fe;!function(e){e.ShowZoomFactorsList="showZoomFactorsList"}(Fe||(Fe={}));const Ge=1-s.CONSTANTS.EPSILON;class ze extends ce.EC{static{this.Actions=Fe}constructor(e={},t={supportedInteractionTypes:["Mouse","Touch"],configuration:{shadow:!0,magnifyingGlass:{radius:125,zoomFactor:3,zoomFactorList:[1.5,2,2.5,3,3.5,4,4.5,5],autoPan:{enabled:!0,padding:10}},actions:{showZoomFactorsList:{method:"showZoomFactorsList",bindings:[{mouseButton:l.MouseBindings.Secondary,modifierKey:l.KeyboardBindings.Shift}]}}}}){super(e,t),this.addNewAnnotation=e=>{const t=e.detail,{currentPoints:n,element:i}=t,a=(0,s.getEnabledElement)(i),{viewport:o,renderingEngine:l}=a,d=n.world,c=n.canvas,{magnifyingGlass:h}=this.configuration,{radius:g,zoomFactor:u,autoPan:m}=h,v=this._getCanvasHandlePoints(c,g),p=o.getCamera(),{viewPlaneNormal:f,viewUp:w}=p,E=this.getReferencedImageId(o,d,f,w),I=s.utilities.uuidv4(),C=s.utilities.uuidv4(),b=o.getFrameOfReferenceUID(),_={annotationUID:I,highlighted:!0,invalidated:!0,metadata:{toolName:this.getToolName(),viewPlaneNormal:[...f],viewUp:[...w],FrameOfReferenceUID:b,referencedImageId:E},data:{sourceViewportId:o.id,magnifyViewportId:C,zoomFactor:u,isCanvasAnnotation:!0,handles:{points:v,activeHandleIndex:null}}};this.magnifyViewportManager.createViewport(_,{magnifyViewportId:C,sourceEnabledElement:a,position:c,radius:g,zoomFactor:u,autoPan:{enabled:m.enabled,padding:m.padding,callback:e=>{const t=_.data.handles.points,{canvas:n}=e.delta;for(let e=0,i=t.length;e<i;e++){const i=t[e];i[0]+=n[0],i[1]+=n[1],_.invalidated=!0}}}}),(0,r.addAnnotation)(_,i);const T=(0,W.getViewportIdsWithToolToRender)(i,this.getToolName());return e.preventDefault(),(0,L.A)(T),_},this.onSetToolDisabled=()=>{this.magnifyViewportManager.dispose();(0,r.getAllAnnotations)().forEach((e=>{e.metadata.toolName===this.getToolName()&&(0,r.removeAnnotation)(e.annotationUID)}))},this.isPointNearTool=(e,t,n,i)=>{const{data:a}=t,{points:o}=a.handles,s=o,r=s[0],l=s[2],d=s[3],c=.5*Math.abs(l[1]-r[1]),h=[d[0]+c,r[1]+c],g=(0,Ve.getCanvasCircleRadius)([h,n]);return Math.abs(g-c)<2*i},this.toolSelectedCallback=(e,t)=>{const n=e.detail,{element:i}=n;t.highlighted=!0;const a=(0,W.getViewportIdsWithToolToRender)(i,this.getToolName());this.editData={annotation:t,viewportIdsToRender:a},(0,ve.hideElementCursor)(i),this._activateModify(i),(0,L.A)(a),e.preventDefault()},this.handleSelectedCallback=(e,t,n)=>{const i=e.detail,{element:a}=i,{data:o}=t;t.highlighted=!0;const{points:s}=o.handles,r=s.findIndex((e=>e===n)),l=(0,W.getViewportIdsWithToolToRender)(a,this.getToolName());this.editData={annotation:t,viewportIdsToRender:l,handleIndex:r},this._activateModify(a),(0,ve.hideElementCursor)(a),(0,L.A)(l),e.preventDefault()},this._endCallback=e=>{const t=e.detail,{element:n}=t,{annotation:i,viewportIdsToRender:a,newAnnotation:o}=this.editData,{data:s}=i;s.handles.activeHandleIndex=null,this._deactivateModify(n),(0,ve.resetElementCursor)(n),this.editData=null,this.isDrawing=!1,(0,L.A)(a),o&&(0,ee.triggerAnnotationCompleted)(i)},this._dragDrawCallback=e=>{this.isDrawing=!0;const t=e.detail,{deltaPoints:n}=t,i=n?.canvas??[0,0,0],{annotation:a,viewportIdsToRender:o}=this.editData,{points:s}=a.data.handles;s.forEach((e=>{e[0]+=i[0],e[1]+=i[1]})),a.invalidated=!0,this.editData.hasMoved=!0,(0,L.A)(o)},this._dragModifyCallback=e=>{this.isDrawing=!0;const t=e.detail,{element:n}=t,{annotation:i,viewportIdsToRender:a,handleIndex:o}=this.editData,{data:s}=i;if(void 0===o){const{deltaPoints:e}=t,n=e.canvas;s.handles.points.forEach((e=>{e[0]+=n[0],e[1]+=n[1]})),i.invalidated=!0}else this._dragHandle(e),i.invalidated=!0;(0,L.A)(a)},this._dragHandle=e=>{const t=e.detail,{annotation:n}=this.editData,{data:i}=n,{points:a}=i.handles,o=a,s=o[0],r=o[2],l=o[3],d=.5*Math.abs(r[1]-s[1]),c=[l[0]+d,s[1]+d],{currentPoints:h}=t,g=h.canvas,u=(0,Ve.getCanvasCircleRadius)([c,g]),m=this._getCanvasHandlePoints(c,u);a[0]=m[0],a[1]=m[1],a[2]=m[2],a[3]=m[3]},this.cancel=e=>{if(!this.isDrawing)return;this.isDrawing=!1,this._deactivateModify(e),(0,ve.resetElementCursor)(e);const{annotation:t,viewportIdsToRender:n,newAnnotation:i}=this.editData,{data:a}=t;return t.highlighted=!1,a.handles.activeHandleIndex=null,(0,L.A)(n),i&&(0,ee.triggerAnnotationCompleted)(t),this.editData=null,t.annotationUID},this._activateModify=e=>{w.wk.isInteractingWithTool=!0,e.addEventListener(l.Events.MOUSE_UP,this._endCallback),e.addEventListener(l.Events.MOUSE_DRAG,this._dragModifyCallback),e.addEventListener(l.Events.MOUSE_CLICK,this._endCallback),e.addEventListener(l.Events.TOUCH_END,this._endCallback),e.addEventListener(l.Events.TOUCH_DRAG,this._dragModifyCallback),e.addEventListener(l.Events.TOUCH_TAP,this._endCallback)},this._deactivateModify=e=>{w.wk.isInteractingWithTool=!1,e.removeEventListener(l.Events.MOUSE_UP,this._endCallback),e.removeEventListener(l.Events.MOUSE_DRAG,this._dragModifyCallback),e.removeEventListener(l.Events.MOUSE_CLICK,this._endCallback),e.removeEventListener(l.Events.TOUCH_END,this._endCallback),e.removeEventListener(l.Events.TOUCH_DRAG,this._dragModifyCallback),e.removeEventListener(l.Events.TOUCH_TAP,this._endCallback)},this.renderAnnotation=(e,t)=>{let n=!1;const{viewport:i}=e,{element:a}=i;let o=(0,r.getAnnotations)(this.getToolName(),a);if(!o?.length)return n;o=o?.filter((e=>e.data.sourceViewportId===i.id));const s=this.filterInteractableAnnotationsForElement(a,o);if(!s?.length)return n;const l={toolGroupId:this.toolGroupId,toolName:this.getToolName(),viewportId:e.viewport.id};for(let e=0;e<s.length;e++){const a=s[e],{annotationUID:o,data:r}=a,{magnifyViewportId:d,zoomFactor:c,handles:h}=r,{points:g,activeHandleIndex:u}=h;l.annotationUID=o;this.getStyle("lineWidth",l,a),this.getStyle("lineDash",l,a);const m=this.getStyle("color",l,a),v=g,p=v[0],f=v[2],w=v[3],E=.5*Math.abs(f[1]-p[1]),I=[w[0]+E,p[1]+E];if(!i.getRenderingEngine())return console.warn("Rendering Engine has been destroyed"),n;let C;if(!(0,Ne.isAnnotationVisible)(o))continue;if((0,Se.isAnnotationLocked)(o)||this.editData||null===u||(C=[v[u]]),C){const e="0";(0,M.drawHandles)(t,o,e,C,{color:m})}const b=`${o}-advancedMagnify`,_="0";(0,M.drawCircle)(t,o,_,I,E,{color:m,lineWidth:5},b);const T=this.magnifyViewportManager.getViewport(d);T.position=I,T.radius=E,T.zoomFactor=c,T.update(),n=!0}return n},this._getCanvasHandlePoints=(e,t)=>[[e[0],e[1]-t,0],[e[0]+t,e[1],0],[e[0],e[1]+t,0],[e[0]-t,e[1],0]],this.magnifyViewportManager=$e.getInstance()}showZoomFactorsList(e,t){const{element:n,currentPoints:i}=e.detail,a=(0,s.getEnabledElement)(n),{viewport:o}=a,{canvas:r}=i,l=n.querySelector(":scope .viewport-element"),d=t.data.zoomFactor,c=this._getZoomFactorsListDropdown(d,(e=>{void 0!==e&&(t.data.zoomFactor=Number.parseFloat(e),t.invalidated=!0),c.parentElement.removeChild(c),o.render()}));Object.assign(c.style,{left:`${r[0]}px`,top:`${r[1]}px`}),l.appendChild(c),c.focus()}_getZoomFactorsListDropdown(e,t){const{zoomFactorList:n}=this.configuration.magnifyingGlass,i=document.createElement("select");return i.size=5,Object.assign(i.style,{width:"50px",position:"absolute"}),["mousedown","mouseup","mousemove","click"].forEach((e=>{i.addEventListener(e,(e=>e.stopPropagation()))})),i.addEventListener("change",(e=>{e.stopPropagation(),t(i.value)})),i.addEventListener("keydown",(e=>{((e.keyCode??27===e.which)||"escape"===e.key?.toLowerCase())&&(e.stopPropagation(),t())})),n.forEach((t=>{const n=document.createElement("option");n.label=t,n.title=`Zoom factor ${t.toFixed(1)}`,n.value=t,n.defaultSelected=t===e,i.add(n)})),i}}class $e{constructor(){this.createViewport=(e,t)=>{const{magnifyViewportId:n,sourceEnabledElement:i,position:a,radius:o,zoomFactor:s,autoPan:r}=t,{viewport:l}=i,{element:d}=l,c=new je({magnifyViewportId:n,sourceEnabledElement:i,radius:o,position:a,zoomFactor:s,autoPan:r});return this._addSourceElementEventListener(d),this._magnifyViewportsMap.set(c.viewportId,{annotation:e,magnifyViewport:c,magnifyViewportInfo:t}),c},this._annotationRemovedCallback=e=>{const{annotation:t}=e.detail;"AdvancedMagnify"===t.metadata.toolName&&this.destroyViewport(t.data.magnifyViewportId)},this._newStackImageCallback=e=>{const{viewportId:t,imageId:n}=e.detail,i=this._getMagnifyViewportsMapEntriesBySourceViewportId(t),{viewport:a}=(0,s.getEnabledElementByViewportId)(t);a.stackActorReInitialized&&this._reset(t),i.forEach((({annotation:e})=>{e.metadata.referencedImageId=n,e.invalidated=!0}))},this._newVolumeImageCallback=e=>{const{renderingEngineId:t,viewportId:n}=e.detail,i=(0,s.getRenderingEngine)(t).getViewport(n),{viewPlaneNormal:a}=i.getCamera();this._getMagnifyViewportsMapEntriesBySourceViewportId(n).forEach((({annotation:e})=>{const{viewPlaneNormal:t}=e.metadata;if(!(Math.abs(T.eR.dot(t,a))>Ge))return;const{handles:n}=e.data,o=i.canvasToWorld([0,0]),s=T.eR.sub(T.eR.create(),o,n.points[0]),r=T.eR.dot(s,a),l=T.eR.scale(T.eR.create(),a,r);for(let e=0,t=n.points.length;e<t;e++){const t=n.points[e];t[0]+=l[0],t[1]+=l[1],t[2]+=l[2]}e.invalidated=!0}))},this._magnifyViewportsMap=new Map,this._initialize()}static getInstance(){return $e._singleton=$e._singleton??new $e,$e._singleton}getViewport(e){return this._magnifyViewportsMap.get(e)?.magnifyViewport}dispose(){this._removeEventListeners(),this._destroyViewports()}destroyViewport(e){const t=this._magnifyViewportsMap.get(e);if(t){const{magnifyViewport:n}=t,{viewport:i}=n.sourceEnabledElement,{element:a}=i;this._removeSourceElementEventListener(a),n.dispose(),this._magnifyViewportsMap.delete(e)}}_destroyViewports(){Array.from(this._magnifyViewportsMap.keys()).forEach((e=>this.destroyViewport(e)))}_getMagnifyViewportsMapEntriesBySourceViewportId(e){return Array.from(this._magnifyViewportsMap.values()).filter((({magnifyViewport:t})=>{const{viewport:n}=t.sourceEnabledElement;return n.id===e}))}_reset(e){this._getMagnifyViewportsMapEntriesBySourceViewportId(e).forEach((({magnifyViewport:t,annotation:n,magnifyViewportInfo:i})=>{this.destroyViewport(t.viewportId);const a=(0,s.getEnabledElementByViewportId)(e);this.createViewport(n,{...i,sourceEnabledElement:{...a}})}))}_addEventListeners(){s.eventTarget.addEventListener(l.Events.ANNOTATION_REMOVED,this._annotationRemovedCallback)}_removeEventListeners(){s.eventTarget.removeEventListener(l.Events.ANNOTATION_REMOVED,this._annotationRemovedCallback)}_addSourceElementEventListener(e){e.addEventListener(Be.STACK_NEW_IMAGE,this._newStackImageCallback);const t=e=>{const{viewportId:t}=e.detail;this._reset(t)};e.addEventListener(Be.VIEWPORT_NEW_IMAGE_SET,t);const n=e=>{const{viewportId:t}=e.detail;this._reset(t)};e.addEventListener(Be.VOLUME_VIEWPORT_NEW_VOLUME,n),e.addEventListener(Be.VOLUME_NEW_IMAGE,this._newVolumeImageCallback),e.newStackHandler=t,e.newVolumeHandler=n}_removeSourceElementEventListener(e){e.removeEventListener(Be.STACK_NEW_IMAGE,this._newStackImageCallback),e.removeEventListener(Be.VOLUME_NEW_IMAGE,this._newVolumeImageCallback),e.removeEventListener(Be.VIEWPORT_NEW_IMAGE_SET,e.newStackHandler),e.removeEventListener(Be.VOLUME_VIEWPORT_NEW_VOLUME,e.newVolumeHandler),delete e.newStackHandler,delete e.newVolumeHandler}_initialize(){this._addEventListeners()}}class je{constructor({magnifyViewportId:e,sourceEnabledElement:t,radius:n=125,position:i=[0,0],zoomFactor:a,autoPan:o}){this._enabledElement=null,this._sourceToolGroup=null,this._magnifyToolGroup=null,this._isViewportReady=!1,this._radius=0,this._resized=!1,this._canAutoPan=!1,this._viewportId=e??s.utilities.uuidv4(),this._sourceEnabledElement=t,this._autoPan=o,this.radius=n,this.position=i,this.zoomFactor=a,this.visible=!0,this._browserMouseDownCallback=this._browserMouseDownCallback.bind(this),this._browserMouseUpCallback=this._browserMouseUpCallback.bind(this),this._handleToolModeChanged=this._handleToolModeChanged.bind(this),this._mouseDragCallback=this._mouseDragCallback.bind(this),this._resizeViewportAsync=(0,y.A)(this._resizeViewport.bind(this),1),this._initialize()}get sourceEnabledElement(){return this._sourceEnabledElement}get viewportId(){return this._viewportId}get radius(){return this._radius}set radius(e){Math.abs(this._radius-e)>1e-5&&(this._radius=e,this._resized=!0)}update(){const{radius:e,position:t,visible:n}=this,{viewport:i}=this._enabledElement,{element:a}=i,o=2*e,[s,r]=t;this._resized&&(this._resizeViewportAsync(),this._resized=!1),Object.assign(a.style,{display:n?"block":"hidden",width:`${o}px`,height:`${o}px`,left:-e+"px",top:-e+"px",transform:`translate(${s}px, ${r}px)`}),this._isViewportReady&&(this._syncViewports(),i.render())}dispose(){const{viewport:e}=this._enabledElement,{element:t}=e,n=e.getRenderingEngine();this._removeEventListeners(t),n.disableElement(e.id),t.parentNode&&t.parentNode.removeChild(t)}_handleToolModeChanged(e){const{_magnifyToolGroup:t}=this,{toolGroupId:n,toolName:i,mode:a,toolBindingsOptions:o}=e.detail;if(this._sourceToolGroup?.id===n)switch(a){case l.ToolModes.Active:t.setToolActive(i,o);break;case l.ToolModes.Passive:t.setToolPassive(i);break;case l.ToolModes.Enabled:t.setToolEnabled(i);break;case l.ToolModes.Disabled:t.setToolDisabled(i);break;default:throw new Error(`Unknow tool mode (${a})`)}}_inheritBorderRadius(e){const t=e.querySelector(".viewport-element"),n=e.querySelector(".cornerstone-canvas");t.style.borderRadius="inherit",n.style.borderRadius="inherit"}_createViewportNode(){const e=document.createElement("div"),{radius:t}=this,n=2*t;return e.classList.add("advancedMagnifyTool"),Object.assign(e.style,{display:"block",width:`${n}px`,height:`${n}px`,position:"absolute",overflow:"hidden",borderRadius:"50%",boxSizing:"border-box",left:-t+"px",top:-t+"px",transform:"translate(-1000px, -1000px)"}),e}_convertZoomFactorToParallelScale(e,t,n){const{parallelScale:i}=e.getCamera();return i*(1/n)*(t.canvas.offsetWidth/e.canvas.offsetWidth)}_isStackViewport(e){return"setStack"in e}_isVolumeViewport(e){return"addVolumes"in e}_cloneToolGroups(e,t){const n=e.getActors(),i=`${t.id}-toolGroup`,a=(0,I.getToolGroupForViewport)(e.id,e.renderingEngineId),o=a.clone(i,(e=>{const t=a.getToolInstance(e);return t instanceof ce.EC&&!(t instanceof ze)}));return o.addViewport(t.id,t.renderingEngineId),n.filter(He).forEach((e=>{(0,ne.addSegmentationRepresentations)(this.viewportId,[{segmentationId:e.referencedId,type:l.SegmentationRepresentations.Labelmap}])})),{sourceToolGroup:a,magnifyToolGroup:o}}_cloneStack(e,t){const n=e.getImageIds();t.setStack(n).then((()=>{this._isViewportReady=!0,this.update()}))}_cloneVolumes(e,t){const n=e.getActors().filter((e=>!He(e))).map((e=>({volumeId:e.uid})));return t.setVolumes(n).then((()=>{this._isViewportReady=!0,this.update()})),t}_cloneViewport(e,t){const{viewportId:n}=this,i=e.getRenderingEngine(),{options:a}=e,o={element:t,viewportId:n,type:e.type,defaultOptions:{...a}};i.enableElement(o);const s=i.getViewport(n);this._isStackViewport(e)?this._cloneStack(e,s):this._isVolumeViewport(e)&&this._cloneVolumes(e,s),this._inheritBorderRadius(t);const r=this._cloneToolGroups(e,s);this._sourceToolGroup=r.sourceToolGroup,this._magnifyToolGroup=r.magnifyToolGroup}_cancelMouseEventCallback(e){e.stopPropagation(),e.preventDefault()}_browserMouseUpCallback(e){const{element:t}=this._enabledElement.viewport;document.removeEventListener("mouseup",this._browserMouseUpCallback),t.addEventListener("mouseup",this._cancelMouseEventCallback),t.addEventListener("mousemove",this._cancelMouseEventCallback)}_browserMouseDownCallback(e){const{element:t}=this._enabledElement.viewport;this._canAutoPan=!!e.target?.closest(".advancedMagnifyTool"),document.addEventListener("mouseup",this._browserMouseUpCallback),t.removeEventListener("mouseup",this._cancelMouseEventCallback),t.removeEventListener("mousemove",this._cancelMouseEventCallback)}_mouseDragCallback(e){if(!w.wk.isInteractingWithTool)return;const{_autoPan:t}=this;if(!t.enabled||!this._canAutoPan)return;const{currentPoints:n}=e.detail,{viewport:i}=this._enabledElement,{canvasToWorld:a}=i,{canvas:o}=n,{radius:s}=this,r=[s,s],l=(0,We.distanceToPoint)(r,o),d=s-t.padding;if(l<=d)return;const c=l-d,h=T.Zc.sub(T.Zc.create(),o,r);T.Zc.normalize(h,h),T.Zc.scale(h,h,c);const g=T.Zc.add(T.Zc.create(),this.position,h),u=a(this.position),m=a(g),v=T.eR.sub(T.eR.create(),m,u),p={points:{currentPosition:{canvas:this.position,world:u},newPosition:{canvas:g,world:m}},delta:{canvas:h,world:v}};t.callback(p)}_addBrowserEventListeners(e){document.addEventListener("mousedown",this._browserMouseDownCallback,!0),e.addEventListener("mousedown",this._cancelMouseEventCallback),e.addEventListener("mouseup",this._cancelMouseEventCallback),e.addEventListener("mousemove",this._cancelMouseEventCallback),e.addEventListener("dblclick",this._cancelMouseEventCallback)}_removeBrowserEventListeners(e){document.removeEventListener("mousedown",this._browserMouseDownCallback,!0),document.removeEventListener("mouseup",this._browserMouseUpCallback),e.removeEventListener("mousedown",this._cancelMouseEventCallback),e.removeEventListener("mouseup",this._cancelMouseEventCallback),e.removeEventListener("mousemove",this._cancelMouseEventCallback),e.removeEventListener("dblclick",this._cancelMouseEventCallback)}_addEventListeners(e){s.eventTarget.addEventListener(l.Events.TOOL_MODE_CHANGED,this._handleToolModeChanged),e.addEventListener(l.Events.MOUSE_MOVE,this._mouseDragCallback),e.addEventListener(l.Events.MOUSE_DRAG,this._mouseDragCallback),this._addBrowserEventListeners(e)}_removeEventListeners(e){s.eventTarget.removeEventListener(l.Events.TOOL_MODE_CHANGED,this._handleToolModeChanged),e.addEventListener(l.Events.MOUSE_MOVE,this._mouseDragCallback),e.addEventListener(l.Events.MOUSE_DRAG,this._mouseDragCallback),this._removeBrowserEventListeners(e)}_initialize(){const{_sourceEnabledElement:e}=this,{viewport:t}=e,{canvas:n}=t,i=this._createViewportNode();n.parentNode.appendChild(i),this._addEventListeners(i),this._cloneViewport(t,i),this._enabledElement=(0,s.getEnabledElement)(i)}_syncViewportsCameras(e,t){const n=e.canvasToWorld(this.position),i=this._convertZoomFactorToParallelScale(e,t,this.zoomFactor),{focalPoint:a,position:o,viewPlaneNormal:s}=t.getCamera(),r=Math.sqrt(Math.pow(a[0]-o[0],2)+Math.pow(a[1]-o[1],2)+Math.pow(a[2]-o[2],2)),l=[n[0],n[1],n[2]],d=[l[0]+r*s[0],l[1]+r*s[1],l[2]+r*s[2]];t.setCamera({parallelScale:i,focalPoint:l,position:d})}_syncStackViewports(e,t){t.setImageIdIndex(e.getCurrentImageIdIndex())}_syncViewports(){const{viewport:e}=this._sourceEnabledElement,{viewport:t}=this._enabledElement,n=e.getProperties();t.getImageData()&&(t.setProperties(n),this._syncViewportsCameras(e,t),this._isStackViewport(e)&&this._syncStackViewports(e,t),this._syncViewportsCameras(e,t),t.render())}_resizeViewport(){const{viewport:e}=this._enabledElement;e.getRenderingEngine().resize()}}ze.toolName="AdvancedMagnify";var qe=n(6030);const{EPSILON:Ke}=s.CONSTANTS;class Ze extends qe.A{constructor(e={},t={supportedInteractionTypes:["Mouse","Touch"],configuration:{sourceViewportId:"",enforceSameFrameOfReference:!0,showFullDimension:!1}}){super(e,t),this.editData=null,this._init=()=>{const e=(0,s.getRenderingEngines)()[0];if(!e)return;let t=e.getViewports();t=(0,W.filterViewportsWithToolEnabled)(t,this.getToolName());const n=e.getViewport(this.configuration.sourceViewportId);if(!n?.getImageData())return;const{element:i}=n,{viewUp:a,viewPlaneNormal:o}=n.getCamera(),l=s.utilities.getViewportImageCornersInWorld(n);let d=this.editData?.annotation;const c=n.getFrameOfReferenceUID();if(d)this.editData.annotation.data.handles.points=l;else{const e={highlighted:!0,invalidated:!0,metadata:{toolName:this.getToolName(),viewPlaneNormal:[...o],viewUp:[...a],FrameOfReferenceUID:c,referencedImageId:null},data:{handles:{points:l}}};(0,r.addAnnotation)(e,i),d=e}this.editData={sourceViewportId:n.id,renderingEngine:e,annotation:d},(0,L.A)(t.filter((e=>e.id!==n.id)).map((e=>e.id)))},this.onSetToolEnabled=()=>{this._init()},this.onSetToolConfiguration=()=>{this._init()},this.onCameraModified=e=>{this._init()},this.renderAnnotation=(e,t)=>{const{viewport:n}=e;if(!this.editData)return!1;const{annotation:i,sourceViewportId:a}=this.editData;let o=!1;const{viewport:r}=(0,s.getEnabledElementByViewportId)(a)||{};if(!r)return o;if(r.id===n.id)return o;if(!i||!i?.data?.handles?.points)return o;if(this.configuration.enforceSameFrameOfReference&&r.getFrameOfReferenceUID()!==n.getFrameOfReferenceUID())return o;const l={toolGroupId:this.toolGroupId,toolName:this.getToolName(),viewportId:e.viewport.id},d=i.data.handles.points[0],c=i.data.handles.points[1],h=i.data.handles.points[2],g=i.data.handles.points[3],{focalPoint:u,viewPlaneNormal:m,viewUp:v}=n.getCamera(),{viewPlaneNormal:p}=r.getCamera();if(this.isParallel(m,p))return o;const f=s.utilities.planar.planeEquation(m,u),w=[d,h,c,g],E=[d,c,h,g];let I=w,C=T.eR.subtract(T.eR.create(),w[0],w[1]);C=T.eR.normalize(T.eR.create(),C);let b=T.eR.subtract(T.eR.create(),w[2],w[0]);b=T.eR.normalize(T.eR.create(),b);const _=T.eR.cross(T.eR.create(),C,b);if(this.isParallel(_,m))return o;this.isPerpendicular(C,m)&&(I=E);const S=s.utilities.planar.linePlaneIntersection(I[0],I[1],f),D=s.utilities.planar.linePlaneIntersection(I[2],I[3],f),{annotationUID:A}=i;l.annotationUID=A;const y=this.getStyle("lineWidth",l,i),x=this.getStyle("lineDash",l,i),P=this.getStyle("color",l,i),R=this.getStyle("shadow",l,i);let L=[S,D].map((e=>n.worldToCanvas(e)));if(this.configuration.showFullDimension&&(L=this.handleFullDimension(n,S,m,v,D,L)),L.length<2)return o;const U=`${A}-line`;return(0,M.drawLine)(t,A,"1",L[0],L[1],{color:P,width:y,lineDash:x,shadow:R},U),o=!0,o},this.isPerpendicular=(e,t)=>{const n=T.eR.dot(e,t);return Math.abs(n)<Ke}}handleFullDimension(e,t,n,i,a,o){e.getRenderingEngine();const r=this.getTargetId(e),l=this.getTargetImageData(r),d=this.getReferencedImageId(e,t,n,i);if(d&&l)try{const{imageData:n,dimensions:i}=l,[r,c,h,g]=[n.indexToWorld([0,0,0]),n.indexToWorld([i[0]-1,0,0]),n.indexToWorld([i[0]-1,i[1]-1,0]),n.indexToWorld([0,i[1]-1,0])].map((e=>s.utilities.worldToImageCoords(d,e))),[u,m]=[t,a].map((e=>s.utilities.worldToImageCoords(d,e)));o=[[r,c],[c,h],[g,h],[r,g]].map((([e,t])=>this.intersectInfiniteLines(e,t,u,m))).filter((e=>e&&this.isInBound(e,i))).map((t=>{const n=s.utilities.imageToWorldCoords(d,t);return e.worldToCanvas(n)}))}catch(e){console.log(e)}return o}intersectInfiniteLines(e,t,n,i){const[a,o]=e,[s,r]=t,[l,d]=n,[c,h]=i,g=r-o,u=a-s,m=s*o-a*r,v=h-d,p=l-c,f=c*d-l*h;if(Math.abs(g*p-v*u)<Ke)return;return[(u*f-p*m)/(g*p-v*u),(v*m-g*f)/(g*p-v*u)]}isParallel(e,t){return Math.abs(T.eR.dot(e,t))>1-Ke}isInBound(e,t){return e[0]>=0&&e[0]<=t[0]&&e[1]>=0&&e[1]<=t[1]}}Ze.toolName="ReferenceLines";const{EPSILON:Ye}=s.CONSTANTS;class Xe extends qe.A{constructor(e={},t={supportedInteractionTypes:["Mouse","Touch"],configuration:{sourceImageIds:[]}}){super(e,t),this.onSetToolEnabled=()=>{this._init()},this.onSetToolActive=()=>{this._init()},this._init=()=>{const e=this.configuration.sourceImageIds;if(!e?.length)return void console.warn("OverlayGridTool: No sourceImageIds provided in configuration");const t=s.metaData.get("imagePlaneModule",e[0]);if(!t)return void console.warn("OverlayGridTool: No imagePlaneModule found for sourceImageIds");const{frameOfReferenceUID:n}=t,i=(0,I.getToolGroup)(this.toolGroupId).viewportsInfo;if(!i?.length)return void console.warn("OverlayGridTool: No viewports found");const a=(0,r.getAnnotations)(this.getToolName(),n);if(!a?.length){const t=e.map((e=>this.calculateImageIdPointSets(e))),i={highlighted:!0,invalidated:!0,metadata:{toolName:this.getToolName(),FrameOfReferenceUID:n,referencedImageId:null},data:{viewportData:new Map,pointSets:t}};(0,r.addAnnotation)(i,n)}(0,L.A)(i.map((({viewportId:e})=>e)))},this.calculateImageIdPointSets=e=>{const{imagePositionPatient:t,rows:n,columns:i,rowCosines:a,columnCosines:o,rowPixelSpacing:r,columnPixelSpacing:l}=s.metaData.get("imagePlaneModule",e),d=[...t],c=[...t],h=[...t],g=[...t];T.eR.scaleAndAdd(c,t,o,i*l),T.eR.scaleAndAdd(h,t,a,n*r),T.eR.scaleAndAdd(g,h,o,i*l);return{pointSet1:[d,h,c,g],pointSet2:[d,c,h,g]}},this.renderAnnotation=(e,t)=>{const n=this.configuration.sourceImageIds;let i=!1;if(!n?.length)return i;const{viewport:a,FrameOfReferenceUID:o}=e;if(a.getImageIds().length<2)return i;const l=(0,r.getAnnotations)(this.getToolName(),o);if(!l?.length)return i;const d=l[0],{annotationUID:c}=d,{focalPoint:h,viewPlaneNormal:g}=a.getCamera(),u={toolGroupId:this.toolGroupId,toolName:this.getToolName(),viewportId:e.viewport.id},m=this.getImageIdNormal(n[0]);if(this.isParallel(g,m))return i;const v=s.utilities.planar.planeEquation(g,h),p=d.data.pointSets,f=d.data.viewportData;for(let e=0;e<n.length;e++){const{pointSet1:n,pointSet2:i}=p[e],o=f.get(a.id)||this.initializeViewportData(f,a.id);if(!o.pointSetsToUse[e]){let t=n,a=T.eR.subtract(T.eR.create(),n[0],n[1]);a=T.eR.normalize(T.eR.create(),a),this.isPerpendicular(a,g)&&(t=i),o.pointSetsToUse[e]=t,o.lineStartsWorld[e]=s.utilities.planar.linePlaneIntersection(t[0],t[1],v),o.lineEndsWorld[e]=s.utilities.planar.linePlaneIntersection(t[2],t[3],v)}const r=o.lineStartsWorld[e],l=o.lineEndsWorld[e];u.annotationUID=c;const h=this.getStyle("lineWidth",u,d),m=this.getStyle("lineDash",u,d),w=this.getStyle("color",u,d),E=this.getStyle("shadow",u,d),I=[r,l].map((e=>a.worldToCanvas(e))),C=`${c}-line`,b=`${e}`;(0,M.drawLine)(t,c,b,I[0],I[1],{color:w,width:h,lineDash:m,shadow:E},C)}return i=!0,i},this.initializeViewportData=(e,t)=>(e.set(t,{pointSetsToUse:[],lineStartsWorld:[],lineEndsWorld:[]}),e.get(t)),this.isPerpendicular=(e,t)=>{const n=T.eR.dot(e,t);return Math.abs(n)<Ye}}isParallel(e,t){return Math.abs(T.eR.dot(e,t))>1-Ye}getImageIdNormal(e){const{imageOrientationPatient:t}=s.metaData.get("imagePlaneModule",e),n=T.eR.fromValues(t[0],t[1],t[2]),i=T.eR.fromValues(t[3],t[4],t[5]);return T.eR.cross(T.eR.create(),n,i)}}Xe.toolName="OverlayGrid";class Je extends qe.A{constructor(e={},t={configuration:{opacity:.5}}){super(e,t),this._init=()=>{const e=(0,I.getToolGroup)(this.toolGroupId).viewportsInfo;if(!e?.length)return void console.warn(this.getToolName()+"Tool: No viewports found");const t=(0,s.getRenderingEngine)(e[0].renderingEngineId)?.getViewport(e[0].viewportId);if(!t)return;const n=t.getFrameOfReferenceUID(),i=(0,r.getAnnotations)(this.getToolName(),n);if(!i?.length){const t=new Map;!function(e,t){t.forEach((({viewportId:t,renderingEngineId:n})=>{const i=(0,s.getRenderingEngine)(n)?.getViewport(t);Qe(e,i)}))}(t,e);const i={highlighted:!0,invalidated:!0,metadata:{toolName:this.getToolName(),FrameOfReferenceUID:n,referencedImageId:null},data:{actorsWorldPointsMap:t}};(0,r.addAnnotation)(i,n)}(0,L.A)(e.map((({viewportId:e})=>e)))},this.onSetToolEnabled=()=>{this._init()},this.onCameraModified=e=>{this._init()},this.renderAnnotation=(e,t)=>{const{viewport:n,FrameOfReferenceUID:i}=e;let a=!1;const o=(0,r.getAnnotations)(this.getToolName(),i);if(!o?.length)return a;const s=o[0],{annotationUID:l}=s,d=s.data.actorsWorldPointsMap;Qe(d,n);const c=n.getActors(),h=et(n);return c.forEach((e=>{if(!e?.clippingFilter)return;const i=d.get(e.uid);if(!i)return;if(!i.get(h))return;let a=1;const{worldPointsSet:o,color:s}=i.get(h);for(let i=0;i<o.length;i++){const r=o[i].map((e=>n.worldToCanvas(e))),d={color:s,fillColor:s,fillOpacity:this.configuration.opacity,closePath:!0,lineWidth:2},c=e.uid+"#"+a;(0,M.drawPath)(t,l,c,r,d),a++}})),a=!0,a}}}function Qe(e,t){const n=t.getActors(),i=et(t);n.forEach((t=>{if(!t?.clippingFilter)return;let n=e.get(t.uid);if(n||(n=new Map,e.set(t.uid,n)),!n.get(i)){const e=j(t.clippingFilter.getOutputData());if(!e)return;const a=function(e){function t(e){let t=Math.floor(255*e).toString(16);return 1===t.length&&(t="0"+t),t}return"#"+t(e[0])+t(e[1])+t(e[2])}(t.actor.getProperty().getColor());n.set(i,{worldPointsSet:e,color:a})}}))}function et(e){const{viewPlaneNormal:t}=e.getCamera(),n=e.getCurrentImageIdIndex();return`${e.id}-${function(e,t=5){return parseFloat(e[0]).toFixed(t)+","+parseFloat(e[1]).toFixed(t)+","+parseFloat(e[2]).toFixed(t)+","}(t)}-${n}`}Je.toolName="SegmentationIntersection";class tt extends qe.A{constructor(e={},t={supportedInteractionTypes:["Mouse","Touch"],configuration:{shadow:!0,preventHandleOutsideImage:!1,displayThreshold:5,positionSync:!0,disableCursor:!1}}){super(e,t),this.isDrawing=!1,this.isHandleOutsideImage=!1,this._elementWithCursor=null,this._currentCursorWorldPosition=null,this._currentCanvasPosition=null,this._disableCursorEnabled=!1,this.mouseMoveCallback=e=>{const{detail:t}=e,{element:n,currentPoints:i}=t;this._currentCursorWorldPosition=i.world,this._currentCanvasPosition=i.canvas,this._elementWithCursor=n;const a=this.getActiveAnnotation(n);return null===a?(this.createInitialAnnotation(i.world,n),!1):(this.updateAnnotationPosition(n,a),!1)},this.createInitialAnnotation=(e,t)=>{const n=(0,s.getEnabledElement)(t);if(!n)throw new Error("No enabled element found");const{viewport:i,renderingEngine:a}=n;this.isDrawing=!0;const o=i.getCamera(),{viewPlaneNormal:l,viewUp:d}=o;if(!l||!d)throw new Error("Camera not found");const c=this.getReferencedImageId(i,e,l,d),h=i.getFrameOfReferenceUID(),g={highlighted:!0,invalidated:!0,metadata:{toolName:this.getToolName(),viewPlaneNormal:[...l],viewUp:[...d],FrameOfReferenceUID:h,referencedImageId:c},data:{label:"",handles:{points:[[...e]],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]}}}}};if((0,r.getAnnotations)(this.getToolName(),t).length>0)return null;if(null===(0,r.addAnnotation)(g,t))return;const u=(0,W.getViewportIdsWithToolToRender)(t,this.getToolName(),!1);(0,L.A)(u)},this.onCameraModified=e=>{const t=e.detail,{element:n,previousCamera:i,camera:a}=t,o=(0,s.getEnabledElement)(n).viewport;if(n!==this._elementWithCursor)return;const r=i.focalPoint,l=a.viewPlaneNormal,d=a.focalPoint,c=[0,0,0];if(ge.Ay.subtract(d,r,c),0===c.reduce(((e,t)=>e+t),0))return;const h=ge.Ay.dot(c,l);if(Math.abs(h)<.01)return;if(!this._currentCanvasPosition)return;const g=o.canvasToWorld(this._currentCanvasPosition);this._currentCursorWorldPosition=g,this.updateAnnotationPosition(n,this.getActiveAnnotation(n))},this.renderAnnotation=(e,t)=>{let n=!1;const{viewport:i,FrameOfReferenceUID:a}=e,o=this._elementWithCursor===i.element;this.configuration.positionSync&&!o&&this.updateViewportImage(i);const{element:s}=i;let l=(0,r.getAnnotations)(this.getToolName(),s);if(!l?.length)return n;if(l=this.filterInteractableAnnotationsForElement(s,l),!l?.length)return n;const d={toolGroupId:this.toolGroupId,toolName:this.getToolName(),viewportId:e.viewport.id};for(let e=0;e<l.length;e++){const a=l[e],{annotationUID:s,data:r}=a,{handles:c}=r,{points:h}=c;if(!s)return n;d.annotationUID=s;const g=parseFloat(this.getStyle("lineWidth",d,a)),u=g,m=this.getStyle("lineDash",d,a),v=this.getStyle("color",d,a);if(h[0].some((e=>isNaN(e))))return n;const p=h.map((e=>i.worldToCanvas(e)));if(!i.getRenderingEngine())return console.warn("Rendering Engine has been destroyed"),n;if(!(0,Ne.isAnnotationVisible)(s))continue;const f={upper:"upper",right:"right",lower:"lower",left:"left"},[w,E]=p[0],I=o?20:7,C=o?5:7;(0,M.drawLine)(t,s,f.upper,[w,E-(I/2+C)],[w,E-I/2],{color:v,lineDash:m,lineWidth:u}),(0,M.drawLine)(t,s,f.lower,[w,E+(I/2+C)],[w,E+I/2],{color:v,lineDash:m,lineWidth:u}),(0,M.drawLine)(t,s,f.right,[w+(I/2+C),E],[w+I/2,E],{color:v,lineDash:m,lineWidth:u}),(0,M.drawLine)(t,s,f.left,[w-(I/2+C),E],[w-I/2,E],{color:v,lineDash:m,lineWidth:u}),n=!0}return n},this._disableCursorEnabled=this.configuration.disableCursor}onSetToolActive(){if(this._disableCursorEnabled=this.configuration.disableCursor,!this._disableCursorEnabled)return;const e=(0,I.getToolGroup)(this.toolGroupId).viewportsInfo;if(!e)return;e.map((e=>(0,s.getEnabledElementByIds)(e.viewportId,e.renderingEngineId))).forEach((e=>{e&&(0,ve.hideElementCursor)(e.viewport.element)}))}onSetToolDisabled(){if(!this._disableCursorEnabled)return;const e=(0,I.getToolGroup)(this.toolGroupId).viewportsInfo;if(!e)return;e.map((e=>(0,s.getEnabledElementByIds)(e.viewportId,e.renderingEngineId))).forEach((e=>{e&&(0,ve.resetElementCursor)(e.viewport.element)}))}getActiveAnnotation(e){const t=(0,r.getAnnotations)(this.getToolName(),e);if(!t.length)return null;return t[0]}updateAnnotationPosition(e,t){const n=this._currentCursorWorldPosition;if(!n)return;if(!t.data?.handles?.points)return;t.data.handles.points=[[...n]],t.invalidated=!0;const i=(0,W.getViewportIdsWithToolToRender)(e,this.getToolName(),!1);(0,s.getEnabledElement)(e)&&(0,L.A)(i)}filterInteractableAnnotationsForElement(e,t){if(!(t instanceof Array)||0===t.length)return[];const n=t[0],i=(0,s.getEnabledElement)(e)?.viewport;if(!i)return[];const a=i.getCamera(),{viewPlaneNormal:o,focalPoint:r}=a;if(!o||!r)return[];const l=n.data?.handles?.points;if(!(l instanceof Array)||1!==l.length)return[];const d=l[0],c=s.utilities.planar.planeEquation(o,r);return s.utilities.planar.planeDistanceToPoint(c,d)<this.configuration.displayThreshold?[n]:[]}updateViewportImage(e){const t=this._currentCursorWorldPosition;if(t&&!t.some((e=>isNaN(e))))if(e instanceof s.StackViewport){const n=s.utilities.getClosestStackImageIndexForPoint(t,e);if(null===n)return;n!==e.getCurrentImageIdIndex()&&e.setImageIdIndex(n)}else if(e instanceof s.VolumeViewport){const{focalPoint:n,viewPlaneNormal:i}=e.getCamera();if(!n||!i)return;const a=s.utilities.planar.planeEquation(i,n),o=s.utilities.planar.planeDistanceToPoint(a,t,!0);if(Math.abs(o)<.5)return;const r=T.eR.normalize(T.eR.create(),T.eR.fromValues(...i)),l=T.eR.scale(T.eR.create(),r,o),d=T.eR.add(T.eR.create(),T.eR.fromValues(...n),l);if(!0){e.setCamera({focalPoint:d});const t=e.getRenderingEngine();t&&t.renderViewport(e.id)}}}}tt.toolName="ReferenceCursors";const nt=[];class it extends qe.A{constructor(e={},t={configuration:{viewportId:"",scaleLocation:"bottom"}}){super(e,t),this.editData=null,this._init=()=>{const e=(0,s.getRenderingEngines)()[0];if(!e)return;const t=(0,I.getToolGroup)(this.toolGroupId).viewportsInfo;if(!t)return;const n=t.map((e=>(0,s.getEnabledElementByIds)(e.viewportId,e.renderingEngineId)));let{viewport:i}=n[0];const{FrameOfReferenceUID:a}=n[0];if(this.configuration.viewportId&&n.forEach((e=>{e.viewport.id==this.configuration.viewportId&&(i=e.viewport)})),!i)return;const{viewUp:o,viewPlaneNormal:l}=i.getCamera(),d=s.utilities.getViewportImageCornersInWorld(i);let c=this.editData?.annotation;const h=(0,r.getAnnotations)(this.getToolName(),i.element);h.length&&(c=h.filter((e=>e.data.viewportId==i.id))[0]),n.forEach((e=>{const{viewport:t}=e;if(!nt.includes(t.id)){const e={metadata:{toolName:this.getToolName(),viewPlaneNormal:[...l],viewUp:[...o],FrameOfReferenceUID:a,referencedImageId:null},data:{handles:{points:s.utilities.getViewportImageCornersInWorld(t)},viewportId:t.id}};nt.push(t.id),(0,r.addAnnotation)(e,t.element),c=e}})),this.editData?.annotation&&this.editData.annotation.data.viewportId==i.id&&(this.editData.annotation.data.handles.points=d,this.editData.annotation.data.viewportId=i.id),this.editData={viewport:i,renderingEngine:e,annotation:c}},this.onSetToolEnabled=()=>{this._init()},this.onCameraModified=e=>{this.configuration.viewportId=e.detail.viewportId,this._init()},this.computeScaleSize=(e,t,n)=>{const i=[16e3,8e3,4e3,2e3,1e3,500,250,100,50,25,10,5,2];let a;return a="top"==n||"bottom"==n?i.filter((t=>t<.6*e&&t>.2*e)):i.filter((e=>e<.6*t&&e>.2*t)),a[0]},this.computeEndScaleTicks=(e,t)=>{const n={bottom:[[0,-10],[0,-10]],top:[[0,10],[0,10]],left:[[0,0],[10,0]],right:[[0,0],[-10,0]]};return{endTick1:[[e[1][0]+n[t][0][0],e[1][1]+n[t][0][0]],[e[1][0]+n[t][1][0],e[1][1]+n[t][1][1]]],endTick2:[[e[0][0]+n[t][0][0],e[0][1]+n[t][0][0]],[e[0][0]+n[t][1][0],e[0][1]+n[t][1][1]]]}},this.computeInnerScaleTicks=(e,t,n,i,a)=>{let o;"bottom"==t||"top"==t?o=a[0][0]-i[0][0]:"left"!=t&&"right"!=t||(o=a[0][1]-i[0][1]);const s=[],r=[],l=[];let d=e;e>=50&&(d=e/10);const c=o/d;for(let e=0;e<d-1;e++){const a={bottom:[[c*(e+1),0],[c*(e+1),5]],top:[[c*(e+1),0],[c*(e+1),-5]],left:[[0,c*(e+1)],[-5,c*(e+1)]],right:[[0,c*(e+1)],[5,c*(e+1)]]};s.push(`${n}-tick${e}`),r.push(`tick${e}`),(e+1)%5==0?l.push([[i[0][0]+a[t][0][0],i[0][1]+a[t][0][1]],[i[1][0]+a[t][0][0],i[1][1]+a[t][0][1]]]):l.push([[i[0][0]+a[t][0][0],i[0][1]+a[t][0][1]],[i[1][0]+a[t][1][0],i[1][1]+a[t][1][1]]])}return{tickIds:s,tickUIDs:r,tickCoordinates:l}},this.computeWorldScaleCoordinates=(e,t,n)=>{let i,a=T.eR.subtract(T.eR.create(),n[0],n[1]);a=T.eR.normalize(T.eR.create(),a);let o=T.eR.subtract(T.eR.create(),n[2],n[0]);o=T.eR.normalize(T.eR.create(),o);const s={bottom:[n[1],n[2]],top:[n[0],n[3]],right:[n[2],n[3]],left:[n[0],n[1]]},r=T.eR.add(T.eR.create(),s[t][0],s[t][0]).map((e=>e/2)),l=e/2/Math.sqrt(Math.pow(a[0],2)+Math.pow(a[1],2)+Math.pow(a[2],2));return"top"==t||"bottom"==t?i=[T.eR.subtract(T.eR.create(),r,o.map((e=>e*l))),T.eR.add(T.eR.create(),r,o.map((e=>e*l)))]:"left"!=t&&"right"!=t||(i=[T.eR.add(T.eR.create(),r,a.map((e=>e*l))),T.eR.subtract(T.eR.create(),r,a.map((e=>e*l)))]),i},this.computeCanvasScaleCoordinates=(e,t,n,i,a)=>{let o;if("top"==a||"bottom"==a){const i=t[0][0]-t[1][0];o=[[e.width/2-i/2,n.height],[e.width/2+i/2,n.height]]}else if("left"==a||"right"==a){const n=t[0][1]-t[1][1];o=[[i.width,e.height/2-n/2],[i.width,e.height/2+n/2]]}return o},this.computeScaleBounds=(e,t,n,i)=>{const a=t*Math.min(1e3,e.width),o=n*Math.min(1e3,e.height),s={bottom:[-o,-a],top:[o,a],left:[o,a],right:[-o,-a]},r={bottom:[e.height,e.width],top:[0,e.width],left:[e.height,0],right:[e.height,e.width]};return{height:r[i][0]+s[i][0],width:r[i][1]+s[i][1]}}}renderAnnotation(e,t){if(!this.editData||!this.editData.viewport)return;const n=this.configuration.scaleLocation,{viewport:i}=e,a=(0,r.getAnnotations)(this.getToolName(),i.element).filter((e=>e.data.viewportId==i.id))[0],o=e.viewport.canvas,s=!1;if(!i)return s;const l={toolGroupId:this.toolGroupId,toolName:this.getToolName(),viewportId:e.viewport.id},d={width:o.width/window.devicePixelRatio||1,height:o.height/window.devicePixelRatio||1},c=a.data.handles.points[0],h=a.data.handles.points[1],g=a.data.handles.points[2],u=a.data.handles.points[3],m=[c,g,h,u],v=T.eR.distance(g,u),p=T.eR.distance(c,g),f=this.computeScaleBounds(d,.05,.05,n),w=this.computeScaleBounds(d,.05,.05,n),E=this.computeScaleSize(v,p,n),I=this.computeWorldScaleCoordinates(E,n,m).map((e=>i.worldToCanvas(e))),C=this.computeCanvasScaleCoordinates(d,I,w,f,n),b=this.computeEndScaleTicks(C,n),{annotationUID:_}=a;l.annotationUID=_;const S=this.getStyle("lineWidth",l,a),D=this.getStyle("lineDash",l,a),A=this.getStyle("color",l,a),y=this.getStyle("shadow",l,a),x=`${_}-scaleline`;(0,M.drawLine)(t,_,"1",C[0],C[1],{color:A,width:S,lineDash:D,shadow:y},x);const P=`${_}-left`;(0,M.drawLine)(t,_,"2",b.endTick1[0],b.endTick1[1],{color:A,width:S,lineDash:D,shadow:y},P);const R=`${_}-right`;(0,M.drawLine)(t,_,"3",b.endTick2[0],b.endTick2[1],{color:A,width:S,lineDash:D,shadow:y},R);const L={bottom:[-10,-42],top:[-12,-35],left:[-40,-20],right:[-50,-20]},U=[C[0][0]+L[n][0],C[0][1]+L[n][1]],O=this._getTextLines(E),{tickIds:k,tickUIDs:N,tickCoordinates:V}=this.computeInnerScaleTicks(E,n,_,b.endTick1,b.endTick2);for(let e=0;e<N.length;e++)(0,M.drawLine)(t,_,N[e],V[e][0],V[e][1],{color:A,width:S,lineDash:D,shadow:y},k[e]);return(0,M.drawTextBox)(t,_,"text0",O,[U[0],U[1]],{fontFamily:"Helvetica Neue, Helvetica, Arial, sans-serif",fontSize:"14px",lineDash:"2,3",lineWidth:"1",shadow:!0,color:A}),s}_getTextLines(e){let t,n;e>=50?(t=e/10,n=" cm"):(t=e,n=" mm");return[t.toString().concat(n)]}}it.toolName="ScaleOverlay";var at=n(76712),ot=n(16175),st=n(13271);class rt extends ce.oS{constructor(e={},t={supportedInteractionTypes:["Mouse","Touch"],configuration:{minSpacing:1,referencedToolNames:["PlanarFreehandROI","PlanarFreehandContourSegmentationTool"],toolShape:"circle",referencedToolName:"PlanarFreehandROI"}}){super(e,t),this.registeredShapes=new Map,this.isActive=!1,this.commonData={activeAnnotationUID:null,viewportIdsToRender:[],isEditingOpenContour:!1,canvasLocation:void 0},this.preMouseDownCallback=e=>{const t=e.detail,n=t.element;if(this.configureToolSize(e),this.selectFreehandTool(t),null!==this.commonData.activeAnnotationUID)return this.isActive=!0,(0,ve.hideElementCursor)(n),this.activateModify(n),!0},this.mouseMoveCallback=e=>{this.mode===l.ToolModes.Active?(this.configureToolSize(e),this.updateCursor(e)):this.commonData.canvasLocation=void 0},this.endCallback=e=>{const t=e.detail,{element:n}=t,i=this.configuration,a=(0,s.getEnabledElement)(n);this.isActive=!1,this.deactivateModify(n),(0,ve.resetElementCursor)(n);const{renderingEngineId:o,viewportId:r}=a,d=(0,I.getToolGroupForViewport)(r,o).getToolInstance(i.referencedToolName),c=this.filterSculptableAnnotationsForElement(n).find((e=>e.annotationUID===this.commonData.activeAnnotationUID));d.configuration.calculateStats&&(c.invalidated=!0),(0,ee.triggerAnnotationModified)(c,n,l.ChangeTypes.HandlesUpdated)},this.dragCallback=e=>{const t=e.detail,n=t.element;this.updateCursor(e);const i=this.filterSculptableAnnotationsForElement(n),a=i.find((e=>e.annotationUID===this.commonData.activeAnnotationUID));if(!i?.length||!this.isActive)return;const o=a.data.contour.polyline;this.sculpt(t,o)},this.registerShapes(ot.A.shapeName,ot.A),this.setToolShape(this.configuration.toolShape)}registerShapes(e,t){const n=new t;this.registeredShapes.set(e,n)}sculpt(e,t){const n=this.configuration,i=e.element,a=(0,s.getEnabledElement)(i),{viewport:o}=a,r=this.registeredShapes.get(this.selectedShape);this.sculptData={mousePoint:e.currentPoints.world,mouseCanvasPoint:e.currentPoints.canvas,points:t,maxSpacing:r.getMaxSpacing(n.minSpacing),element:i};const l=r.pushHandles(o,this.sculptData);void 0!==l.first&&this.insertNewHandles(l)}interpolatePointsWithinMaxSpacing(e,t,n,i){const{element:a}=this.sculptData,o=(0,s.getEnabledElement)(a),{viewport:r}=o,l=lt(e+1,t.length),d=r.worldToCanvas(t[e]),c=r.worldToCanvas(t[l]);N.point.distanceToPoint(d,c)>i&&n.push(e)}updateCursor(e){const t=e.detail,n=t.element,i=(0,s.getEnabledElement)(n),{renderingEngine:a,viewport:o}=i;this.commonData.viewportIdsToRender=[o.id];const r=this.filterSculptableAnnotationsForElement(n);if(!r?.length)return;const l=r.find((e=>e.annotationUID===this.commonData.activeAnnotationUID));if(this.commonData.canvasLocation=t.currentPoints.canvas,this.isActive)l.highlighted=!0;else{const e=this.registeredShapes.get(this.selectedShape),n=t.currentPoints.canvas;e.updateToolSize(n,o,l)}(0,L.t)(this.commonData.viewportIdsToRender)}filterSculptableAnnotationsForElement(e){const t=this.configuration,n=(0,s.getEnabledElement)(e),{renderingEngineId:i,viewportId:a}=n,o=[],r=(0,I.getToolGroupForViewport)(a,i).getToolInstance(t.referencedToolName);return t.referencedToolNames.forEach((t=>{const n=(0,E.Rh)(t,e);n&&o.push(...n)})),r.filterInteractableAnnotationsForElement(e,o)}configureToolSize(e){this.registeredShapes.get(this.selectedShape).configureToolSize(e)}insertNewHandles(e){const t=this.findNewHandleIndices(e);let n=0;for(let e=0;e<t?.length;e++){const i=t[e]+1+n;this.insertHandleRadially(i),n++}}findNewHandleIndices(e){const{points:t,maxSpacing:n}=this.sculptData,i=[];for(let a=e.first;a<=e.last;a++)this.interpolatePointsWithinMaxSpacing(a,t,i,n);return i}insertHandleRadially(e){const{points:t}=this.sculptData;if(e>t.length-1&&this.commonData.isEditingOpenContour)return;const n=this.registeredShapes.get(this.selectedShape),i=e-1,a=lt(e,t.length),o=n.getInsertPosition(i,a,this.sculptData);t.splice(e,0,o)}selectFreehandTool(e){const t=this.getClosestFreehandToolOnElement(e);void 0!==t&&(this.commonData.activeAnnotationUID=t)}getClosestFreehandToolOnElement(e){const{element:t}=e,n=(0,s.getEnabledElement)(t),{viewport:i}=n,a=this.configuration,o=this.filterSculptableAnnotationsForElement(t);if(!o?.length)return;const r=e.currentPoints.canvas,l={distance:1/0,toolIndex:void 0,annotationUID:void 0};for(let e=0;e<o?.length;e++){if(o[e].isLocked||!o[e].isVisible)continue;const t=(0,st.X)(i,o[e],r);-1!==t&&(t<l.distance&&(l.distance=t,l.toolIndex=e,l.annotationUID=o[e].annotationUID))}return this.commonData.isEditingOpenContour=!o[l.toolIndex].data.contour.closed,a.referencedToolName=o[l.toolIndex].metadata.toolName,l.annotationUID}activateModify(e){e.addEventListener(l.Events.MOUSE_UP,this.endCallback),e.addEventListener(l.Events.MOUSE_CLICK,this.endCallback),e.addEventListener(l.Events.MOUSE_DRAG,this.dragCallback),e.addEventListener(l.Events.TOUCH_TAP,this.endCallback),e.addEventListener(l.Events.TOUCH_END,this.endCallback),e.addEventListener(l.Events.TOUCH_DRAG,this.dragCallback)}deactivateModify(e){e.removeEventListener(l.Events.MOUSE_UP,this.endCallback),e.removeEventListener(l.Events.MOUSE_CLICK,this.endCallback),e.removeEventListener(l.Events.MOUSE_DRAG,this.dragCallback),e.removeEventListener(l.Events.TOUCH_TAP,this.endCallback),e.removeEventListener(l.Events.TOUCH_END,this.endCallback),e.removeEventListener(l.Events.TOUCH_DRAG,this.dragCallback)}setToolShape(e){this.selectedShape=this.registeredShapes.get(e)??ot.A.shapeName}renderAnnotation(e,t){const{viewport:n}=e,{element:i}=n,a=this.commonData.viewportIdsToRender;if(!this.commonData.canvasLocation||this.mode!==l.ToolModes.Active||!a.includes(n.id))return;const o=this.filterSculptableAnnotationsForElement(i);if(!o?.length)return;const s={toolGroupId:this.toolGroupId,toolName:this.getToolName(),viewportId:e.viewport.id};let r=(0,at.h)("color",s,l.AnnotationStyleStates.Default,this.mode);this.isActive&&(r=(0,at.h)("color",s,l.AnnotationStyleStates.Highlighted,this.mode));this.registeredShapes.get(this.selectedShape).renderShape(t,this.commonData.canvasLocation,{color:r})}}const lt=(e,t)=>(e+t)%t;rt.toolName="SculptorTool";const dt=[0,0,1];class ct extends ce.oS{constructor(e={},t={supportedInteractionTypes:["Mouse","Touch"],configuration:{direction:dt,rotateIncrementDegrees:30}}){super(e,t)}mouseWheelCallback(e){const{element:t,wheel:n}=e.detail,i=(0,s.getEnabledElement)(t),{viewport:a}=i,{direction:o,rotateIncrementDegrees:r}=this.configuration,l=a.getCamera(),{viewUp:d,position:c,focalPoint:h}=l,{direction:g}=n,[u,m,v]=h,[p,f,w]=o,E=g*(r*Math.PI)/180,I=[0,0,0],C=[0,0,0],b=[0,0,0],_=T.pB.identity(new Float32Array(16));T.pB.translate(_,_,[u,m,v]),T.pB.rotate(_,_,E,[p,f,w]),T.pB.translate(_,_,[-u,-m,-v]),T.eR.transformMat4(I,c,_),T.eR.transformMat4(C,h,_),T.pB.identity(_),T.pB.rotate(_,_,E,[p,f,w]),T.eR.transformMat4(b,d,_),a.setCamera({position:I,viewUp:b,focalPoint:C}),a.render()}}ct.toolName="VolumeRotateMouseWheel";var ht=n(25072);class gt extends ce.EC{static{this.toolName="Label"}constructor(e={},t={supportedInteractionTypes:["Mouse","Touch"],configuration:{shadow:!0,getTextCallback:ut,changeTextCallback:mt,preventHandleOutsideImage:!1}}){super(e,t),this.isPointNearTool=(e,t,n,i)=>{const a=(0,s.getEnabledElement)(e),{viewport:o}=a,{annotationUID:r}=t,l=t.data.handles.points[0],d=o.worldToCanvas(l);if(T.Zc.distance(n,d)<i)return!0;const c=e.querySelector("svg");if(!c)return!1;const h=c.querySelector(`g[data-annotation-uid="${r}"]`);if(!h)return!1;const g=h,u=g.getBBox(),m=g.getAttribute("transform");let v=0,p=0;if(m){const e=m.match(/translate\(([-\d.]+)\s+([-\d.]+)\)/);e&&(v=parseFloat(e[1]),p=parseFloat(e[2]))}const f=u.x+v,w=u.y+p;return n[0]>=f&&n[0]<=f+u.width&&n[1]>=w&&n[1]<=w+u.height},this.addNewAnnotation=e=>{const t=e.detail,{currentPoints:n,element:i}=t,a=n.world,o=(0,s.getEnabledElement)(i),{viewport:l}=o;(0,ve.hideElementCursor)(i),this.isDrawing=!0;const d=l.getCamera(),{viewPlaneNormal:c,viewUp:h}=d,g=this.getReferencedImageId(l,a,c,h),u=l.getFrameOfReferenceUID(),m={annotationUID:null,highlighted:!0,invalidated:!0,metadata:{toolName:this.getToolName(),viewPlaneNormal:[...c],viewUp:[...h],FrameOfReferenceUID:u,referencedImageId:g,...l.getViewReference({points:[a]})},data:{text:"",handles:{points:[[...a],[...a]]},label:""}};(0,r.addAnnotation)(m,i);const v=(0,W.getViewportIdsWithToolToRender)(i,this.getToolName());return this.editData={annotation:m,newAnnotation:!0,viewportIdsToRender:v,offset:[0,0,0]},e.preventDefault(),(0,L.A)(v),this.configuration.getTextCallback((e=>{if(!e)return(0,r.removeAnnotation)(m.annotationUID),(0,L.A)(v),void(this.isDrawing=!1);(0,ve.resetElementCursor)(i),m.data.text=e,(0,ee.triggerAnnotationCompleted)(m),(0,L.A)(v)})),this.createMemo(i,m,{newAnnotation:!0}),m},this.toolSelectedCallback=(e,t)=>{const n=e.detail,{element:i,currentPoints:a}=n;t.highlighted=!0;const o=(0,W.getViewportIdsWithToolToRender)(i,this.getToolName());let s=[0,0,0];if(a&&a.world){const e=a.world,n=t.data.handles.points[0];s=[n[0]-e[0],n[1]-e[1],n[2]-e[2]]}this.editData={annotation:t,viewportIdsToRender:o,offset:s},this._activateModify(i),(0,ve.hideElementCursor)(i),(0,L.A)(o),e.preventDefault()},this._endCallback=e=>{const t=e.detail,{element:n}=t,{annotation:i,viewportIdsToRender:a,newAnnotation:o}=this.editData;this._deactivateDraw(n),this._deactivateModify(n),(0,ve.resetElementCursor)(n),o&&this.createMemo(n,i,{newAnnotation:o}),this.editData=null,this.isDrawing=!1,this.doneEditMemo(),this.isHandleOutsideImage&&this.configuration.preventHandleOutsideImage&&(0,r.removeAnnotation)(i.annotationUID),(0,L.A)(a),o&&(0,ee.triggerAnnotationCompleted)(i)},this._dragCallback=e=>{const t=e.detail,{currentPoints:n,element:i}=t,a=n.world,{annotation:o,viewportIdsToRender:s,offset:r}=this.editData;o.data.handles.points[0]=r?[a[0]+r[0],a[1]+r[1],a[2]+r[2]]:[...a],o.invalidated=!0,(0,L.A)(s),(0,ee.triggerAnnotationModified)(o,i,l.ChangeTypes.LabelChange)},this.cancel=e=>{if(this.isDrawing){this.isDrawing=!1,this._deactivateModify(e),(0,ve.resetElementCursor)(e);const{annotation:t,viewportIdsToRender:n,newAnnotation:i}=this.editData,{data:a}=t;return t.highlighted=!1,a.handles.activeHandleIndex=null,(0,L.A)(n),i&&(0,ee.triggerAnnotationCompleted)(t),this.editData=null,t.annotationUID}},this._activateModify=e=>{w.wk.isInteractingWithTool=!0,e.addEventListener(l.Events.MOUSE_UP,this._endCallback),e.addEventListener(l.Events.MOUSE_DRAG,this._dragCallback),e.addEventListener(l.Events.MOUSE_CLICK,this._endCallback),e.addEventListener(l.Events.TOUCH_TAP,this._endCallback),e.addEventListener(l.Events.TOUCH_END,this._endCallback),e.addEventListener(l.Events.TOUCH_DRAG,this._dragCallback)},this._deactivateModify=e=>{w.wk.isInteractingWithTool=!1,e.removeEventListener(l.Events.MOUSE_UP,this._endCallback),e.removeEventListener(l.Events.MOUSE_DRAG,this._dragCallback),e.removeEventListener(l.Events.MOUSE_CLICK,this._endCallback),e.removeEventListener(l.Events.TOUCH_TAP,this._endCallback),e.removeEventListener(l.Events.TOUCH_DRAG,this._dragCallback),e.removeEventListener(l.Events.TOUCH_END,this._endCallback)},this._activateDraw=e=>{w.wk.isInteractingWithTool=!0,e.addEventListener(l.Events.MOUSE_UP,this._endCallback),e.addEventListener(l.Events.MOUSE_DRAG,this._dragCallback),e.addEventListener(l.Events.MOUSE_MOVE,this._dragCallback),e.addEventListener(l.Events.MOUSE_CLICK,this._endCallback),e.addEventListener(l.Events.TOUCH_TAP,this._endCallback),e.addEventListener(l.Events.TOUCH_END,this._endCallback),e.addEventListener(l.Events.TOUCH_DRAG,this._dragCallback)},this._deactivateDraw=e=>{w.wk.isInteractingWithTool=!1,e.removeEventListener(l.Events.MOUSE_UP,this._endCallback),e.removeEventListener(l.Events.MOUSE_DRAG,this._dragCallback),e.removeEventListener(l.Events.MOUSE_MOVE,this._dragCallback),e.removeEventListener(l.Events.MOUSE_CLICK,this._endCallback),e.removeEventListener(l.Events.TOUCH_TAP,this._endCallback),e.removeEventListener(l.Events.TOUCH_END,this._endCallback),e.removeEventListener(l.Events.TOUCH_DRAG,this._dragCallback)},this.renderAnnotation=(e,t)=>{let n=!1;const{viewport:i}=e,{element:a}=i;let o=(0,r.getAnnotations)(this.getToolName(),a);if(!o?.length)return n;o=this.filterInteractableAnnotationsForElement(a,o);const s={toolGroupId:this.toolGroupId,toolName:this.getToolName(),viewportId:e.viewport.id};for(let e=0;e<o.length;e++){const a=o[e],{annotationUID:r,data:l}=a,d=l.handles.points[0];s.annotationUID=r;const c=i.worldToCanvas(d);if(n=!0,!i.getRenderingEngine())return console.warn("Rendering Engine has been destroyed"),n;if(!(0,Ne.isAnnotationVisible)(r))continue;if(!l.text)continue;const h=this.getLinkedTextBoxStyle(s,a),g="1";(0,M.drawTextBox)(t,r,g,[l.text],c,{...h,padding:0})}return n}}static{this.hydrate=(e,t,n,i)=>{const a=(0,s.getEnabledElementByViewportId)(e);if(!a)return;const{viewport:o}=a,l=o.getFrameOfReferenceUID(),{viewPlaneNormal:d,viewUp:c}=o.getCamera(),h=new this,g=h.getReferencedImageId(o,t,d,c),u={annotationUID:i?.annotationUID||s.utilities.uuidv4(),data:{text:n,handles:{points:[t]}},highlighted:!1,autoGenerated:!1,invalidated:!1,isLocked:!1,isVisible:!0,metadata:{toolName:h.getToolName(),viewPlaneNormal:d,FrameOfReferenceUID:l,referencedImageId:g,...i}};(0,r.addAnnotation)(u,o.element),(0,L.A)([o.id])}}handleSelectedCallback(e,t,n,i){}_doneChangingTextCallback(e,t,n){t.data.text=n;const i=(0,W.getViewportIdsWithToolToRender)(e,this.getToolName());(0,L.A)(i),(0,ee.triggerAnnotationModified)(t,e)}_isInsideVolume(e,t,n){return s.utilities.indexWithinDimensions(e,n)&&s.utilities.indexWithinDimensions(t,n)}}function ut(e){return e(prompt("Enter your annotation:"))}function mt(e,t,n){return n(prompt("Enter your annotation:"))}gt.toolName="Label";const{transformWorldToIndex:vt}=s.utilities;class pt extends ce.EC{static{this.toolName="Length"}constructor(e={},t={supportedInteractionTypes:["Mouse","Touch"],configuration:{preventHandleOutsideImage:!1,getTextLines:ft,actions:{undo:{method:"undo",bindings:[{key:"z"}]},redo:{method:"redo",bindings:[{key:"y"}]}}}}){super(e,t),this.addNewAnnotation=e=>{const t=e.detail,{currentPoints:n,element:i}=t,a=n.world,o=(0,s.getEnabledElement)(i),{viewport:l}=o;(0,ve.hideElementCursor)(i),this.isDrawing=!0;const{viewPlaneNormal:d,viewUp:c,position:h}=l.getCamera(),g=this.getReferencedImageId(l,a,d,c),u={highlighted:!0,invalidated:!0,metadata:{...l.getViewReference({points:[a]}),toolName:this.getToolName(),referencedImageId:g,viewUp:c,cameraPosition:h},data:{handles:{points:[[...a],[...a]],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]}}},label:"",cachedStats:{}}};(0,r.addAnnotation)(u,i);const m=(0,W.getViewportIdsWithToolToRender)(i,this.getToolName());return this.editData={annotation:u,viewportIdsToRender:m,handleIndex:1,movingTextBox:!1,newAnnotation:!0,hasMoved:!1},this._activateDraw(i),e.preventDefault(),(0,L.A)(m),u},this.isPointNearTool=(e,t,n,i)=>{const a=(0,s.getEnabledElement)(e),{viewport:o}=a,{data:r}=t,[l,d]=r.handles.points,c=o.worldToCanvas(l),h=o.worldToCanvas(d),g={start:{x:c[0],y:c[1]},end:{x:h[0],y:h[1]}};return Te.distanceToPoint([g.start.x,g.start.y],[g.end.x,g.end.y],[n[0],n[1]])<=i},this.toolSelectedCallback=(e,t)=>{const n=e.detail,{element:i}=n;t.highlighted=!0;const a=(0,W.getViewportIdsWithToolToRender)(i,this.getToolName());this.editData={annotation:t,viewportIdsToRender:a,movingTextBox:!1},this._activateModify(i),(0,ve.hideElementCursor)(i),(0,L.A)(a),e.preventDefault()},this._endCallback=e=>{const t=e.detail,{element:n}=t,{annotation:i,viewportIdsToRender:a,newAnnotation:o,hasMoved:s}=this.editData,{data:l}=i;o&&!s||(l.handles.activeHandleIndex=null,this._deactivateModify(n),this._deactivateDraw(n),(0,ve.resetElementCursor)(n),this.isHandleOutsideImage&&this.configuration.preventHandleOutsideImage&&(0,r.removeAnnotation)(i.annotationUID),(0,L.A)(a),this.doneEditMemo(),o&&(0,ee.triggerAnnotationCompleted)(i),this.editData=null,this.isDrawing=!1)},this._dragCallback=e=>{this.isDrawing=!0;const t=e.detail,{element:n}=t,{annotation:i,viewportIdsToRender:a,handleIndex:o,movingTextBox:s,newAnnotation:r}=this.editData,{data:d}=i;if(this.createMemo(n,i,{newAnnotation:r}),s){const{deltaPoints:e}=t,n=e.world,{textBox:i}=d.handles,{worldPosition:a}=i;a[0]+=n[0],a[1]+=n[1],a[2]+=n[2],i.hasMoved=!0}else if(void 0===o){const{deltaPoints:e}=t,n=e.world;d.handles.points.forEach((e=>{e[0]+=n[0],e[1]+=n[1],e[2]+=n[2]})),i.invalidated=!0}else{const{currentPoints:e}=t,n=e.world;d.handles.points[o]=[...n],i.invalidated=!0}this.editData.hasMoved=!0,(0,L.A)(a),i.invalidated&&(0,ee.triggerAnnotationModified)(i,n,l.ChangeTypes.HandlesUpdated)},this.cancel=e=>{if(this.isDrawing){this.isDrawing=!1,this._deactivateDraw(e),this._deactivateModify(e),(0,ve.resetElementCursor)(e);const{annotation:t,viewportIdsToRender:n,newAnnotation:i}=this.editData,{data:a}=t;return t.highlighted=!1,a.handles.activeHandleIndex=null,(0,L.A)(n),i&&(0,ee.triggerAnnotationCompleted)(t),this.editData=null,t.annotationUID}},this._activateModify=e=>{w.wk.isInteractingWithTool=!0,e.addEventListener(l.Events.MOUSE_UP,this._endCallback),e.addEventListener(l.Events.MOUSE_DRAG,this._dragCallback),e.addEventListener(l.Events.MOUSE_CLICK,this._endCallback),e.addEventListener(l.Events.TOUCH_END,this._endCallback),e.addEventListener(l.Events.TOUCH_DRAG,this._dragCallback),e.addEventListener(l.Events.TOUCH_TAP,this._endCallback)},this._deactivateModify=e=>{w.wk.isInteractingWithTool=!1,e.removeEventListener(l.Events.MOUSE_UP,this._endCallback),e.removeEventListener(l.Events.MOUSE_DRAG,this._dragCallback),e.removeEventListener(l.Events.MOUSE_CLICK,this._endCallback),e.removeEventListener(l.Events.TOUCH_END,this._endCallback),e.removeEventListener(l.Events.TOUCH_DRAG,this._dragCallback),e.removeEventListener(l.Events.TOUCH_TAP,this._endCallback)},this._activateDraw=e=>{w.wk.isInteractingWithTool=!0,e.addEventListener(l.Events.MOUSE_UP,this._endCallback),e.addEventListener(l.Events.MOUSE_DRAG,this._dragCallback),e.addEventListener(l.Events.MOUSE_MOVE,this._dragCallback),e.addEventListener(l.Events.MOUSE_CLICK,this._endCallback),e.addEventListener(l.Events.TOUCH_END,this._endCallback),e.addEventListener(l.Events.TOUCH_DRAG,this._dragCallback),e.addEventListener(l.Events.TOUCH_TAP,this._endCallback)},this._deactivateDraw=e=>{w.wk.isInteractingWithTool=!1,e.removeEventListener(l.Events.MOUSE_UP,this._endCallback),e.removeEventListener(l.Events.MOUSE_DRAG,this._dragCallback),e.removeEventListener(l.Events.MOUSE_MOVE,this._dragCallback),e.removeEventListener(l.Events.MOUSE_CLICK,this._endCallback),e.removeEventListener(l.Events.TOUCH_END,this._endCallback),e.removeEventListener(l.Events.TOUCH_DRAG,this._dragCallback),e.removeEventListener(l.Events.TOUCH_TAP,this._endCallback)},this.renderAnnotation=(e,t)=>{let n=!1;const{viewport:i}=e,{element:a}=i;let o=(0,r.getAnnotations)(this.getToolName(),a);if(!o?.length)return n;if(o=this.filterInteractableAnnotationsForElement(a,o),!o?.length)return n;const s=this.getTargetId(i),l=i.getRenderingEngine(),d={toolGroupId:this.toolGroupId,toolName:this.getToolName(),viewportId:e.viewport.id};for(let a=0;a<o.length;a++){const r=o[a],{annotationUID:c,data:h}=r,{points:g,activeHandleIndex:u}=h.handles;d.annotationUID=c;const{color:m,lineWidth:v,lineDash:p,shadow:f}=this.getAnnotationStyle({annotation:r,styleSpecifier:d}),w=g.map((e=>i.worldToCanvas(e)));if(h.cachedStats[s]&&null!=h.cachedStats[s].unit?r.invalidated&&this._throttledCalculateCachedStats(r,l,e):(h.cachedStats[s]={length:null,unit:null},this._calculateCachedStats(r,l,e)),!i.getRenderingEngine())return console.warn("Rendering Engine has been destroyed"),n;let E;if(!(0,Ne.isAnnotationVisible)(c))continue;if((0,Se.isAnnotationLocked)(c)||this.editData||null===u||(E=[w[u]]),E){const e="0";(0,M.drawHandles)(t,c,e,w,{color:m,lineDash:p,lineWidth:v})}const I=`${c}-line`,C="1";if((0,M.drawLine)(t,c,C,w[0],w[1],{color:m,width:v,lineDash:p,shadow:f},I),n=!0,!i.getRenderingEngine())return console.warn("Rendering Engine has been destroyed"),n;const b=this.getLinkedTextBoxStyle(d,r);if(!b.visibility){h.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 _=this.configuration.getTextLines(h,s);if(!h.handles.textBox.hasMoved){const e=(0,k.getTextBoxCoordsCanvas)(w);h.handles.textBox.worldPosition=i.canvasToWorld(e)}const T=i.worldToCanvas(h.handles.textBox.worldPosition),S="1",D=(0,M.drawLinkedTextBox)(t,c,S,_,T,w,{},b),{x:A,y,width:x,height:P}=D;h.handles.textBox.worldBoundingBox={topLeft:i.canvasToWorld([A,y]),topRight:i.canvasToWorld([A+x,y]),bottomLeft:i.canvasToWorld([A,y+P]),bottomRight:i.canvasToWorld([A+x,y+P])}}return n},this._throttledCalculateCachedStats=(0,x.A)(this._calculateCachedStats,100,{trailing:!0})}static{this.hydrate=(e,t,n)=>{const i=(0,s.getEnabledElementByViewportId)(e);if(!i)return;const{FrameOfReferenceUID:a,referencedImageId:o,viewPlaneNormal:l,instance:d,viewport:c}=this.hydrateBase(pt,i,t,n),h={annotationUID:n?.annotationUID||s.utilities.uuidv4(),data:{handles:{points:t}},highlighted:!1,autoGenerated:!1,invalidated:!1,isLocked:!1,isVisible:!0,metadata:{toolName:d.getToolName(),viewPlaneNormal:l,FrameOfReferenceUID:a,referencedImageId:o,...n}};(0,r.addAnnotation)(h,c.element),(0,L.A)([c.id])}}handleSelectedCallback(e,t,n){const i=e.detail,{element:a}=i,{data:o}=t;t.highlighted=!0;let s,r=!1;n.worldPosition?r=!0:s=o.handles.points.findIndex((e=>e===n));const l=(0,W.getViewportIdsWithToolToRender)(a,this.getToolName());this.editData={annotation:t,viewportIdsToRender:l,handleIndex:s,movingTextBox:r},this._activateModify(a),(0,ve.hideElementCursor)(a),(0,L.A)(l),e.preventDefault()}_calculateLength(e,t){const n=e[0]-t[0],i=e[1]-t[1],a=e[2]-t[2];return Math.sqrt(n*n+i*i+a*a)}_calculateCachedStats(e,t,n){const i=e.data,{element:a}=n.viewport,o=i.handles.points[0],s=i.handles.points[1],{cachedStats:r}=i,d=Object.keys(r);for(let e=0;e<d.length;e++){const t=d[e],n=this.getTargetImageData(t);if(!n)continue;const{imageData:i,dimensions:a}=n,l=vt(i,o),c=vt(i,s),h=[l,c],{scale:g,unit:u}=(0,R.Op)(n,h),m=this._calculateLength(o,s)/g;this._isInsideVolume(l,c,a)?this.isHandleOutsideImage=!1:this.isHandleOutsideImage=!0,r[t]={length:m,unit:u}}const c=e.invalidated;return e.invalidated=!1,c&&(0,ee.triggerAnnotationModified)(e,a,l.ChangeTypes.StatsUpdated),r}_isInsideVolume(e,t,n){return s.utilities.indexWithinDimensions(e,n)&&s.utilities.indexWithinDimensions(t,n)}}function ft(e,t){const n=e.cachedStats[t],{length:i,unit:a}=n;if(null==i||isNaN(i))return;return[`${s.utilities.roundNumber(i)} ${a}`]}const{transformWorldToIndex:wt}=s.utilities;class Et extends ce.EC{static{this.toolName="Height"}constructor(e={},t={supportedInteractionTypes:["Mouse","Touch"],configuration:{preventHandleOutsideImage:!1,getTextLines:It}}){super(e,t),this.addNewAnnotation=e=>{const t=e.detail,{currentPoints:n,element:i}=t,a=n.world,o=(0,s.getEnabledElement)(i),{viewport:l,renderingEngine:d}=o;(0,ve.hideElementCursor)(i),this.isDrawing=!0;const{viewPlaneNormal:c,viewUp:h,position:g}=l.getCamera(),u=this.getReferencedImageId(l,a,c,h),m={highlighted:!0,invalidated:!0,metadata:{...l.getViewReference({points:[a]}),toolName:this.getToolName(),referencedImageId:u,viewUp:h,cameraPosition:g},data:{handles:{points:[[...a],[...a]],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]}}},label:"",cachedStats:{}}};(0,r.addAnnotation)(m,i);const v=(0,W.getViewportIdsWithToolToRender)(i,this.getToolName());return this.editData={annotation:m,viewportIdsToRender:v,handleIndex:1,movingTextBox:!1,newAnnotation:!0,hasMoved:!1},this._activateDraw(i),e.preventDefault(),(0,L.A)(v),m},this.isPointNearTool=(e,t,n,i)=>{const a=(0,s.getEnabledElement)(e),{viewport:o}=a,{data:r}=t,[l,d]=r.handles.points,c=o.worldToCanvas(l),h=o.worldToCanvas(d),g={start:{x:c[0],y:c[1]},end:{x:h[0],y:h[1]}};return Te.distanceToPoint([g.start.x,g.start.y],[g.end.x,g.end.y],[n[0],n[1]])<=i},this.toolSelectedCallback=(e,t)=>{const n=e.detail,{element:i}=n;t.highlighted=!0;const a=(0,W.getViewportIdsWithToolToRender)(i,this.getToolName());this.editData={annotation:t,viewportIdsToRender:a,movingTextBox:!1},this._activateModify(i),(0,ve.hideElementCursor)(i);(0,s.getEnabledElement)(i);(0,L.A)(a),e.preventDefault()},this._endCallback=e=>{const t=e.detail,{element:n}=t,{annotation:i,viewportIdsToRender:a,newAnnotation:o,hasMoved:l}=this.editData,{data:d}=i;if(o&&!l)return;d.handles.activeHandleIndex=null,this._deactivateModify(n),this._deactivateDraw(n),(0,ve.resetElementCursor)(n);const c=(0,s.getEnabledElement)(n),{renderingEngine:h}=c;this.isHandleOutsideImage&&this.configuration.preventHandleOutsideImage&&(0,r.removeAnnotation)(i.annotationUID),(0,L.A)(a),o&&(0,ee.triggerAnnotationCompleted)(i),this.editData=null,this.isDrawing=!1},this._dragCallback=e=>{this.isDrawing=!0;const t=e.detail,{element:n}=t,{annotation:i,viewportIdsToRender:a,handleIndex:o,movingTextBox:r}=this.editData,{data:l}=i;if(r){const{deltaPoints:e}=t,n=e.world,{textBox:i}=l.handles,{worldPosition:a}=i;a[0]+=n[0],a[1]+=n[1],a[2]+=n[2],i.hasMoved=!0}else if(void 0===o){const{deltaPoints:e}=t,n=e.world;l.handles.points.forEach((e=>{e[0]+=n[0],e[1]+=n[1],e[2]+=n[2]})),i.invalidated=!0}else{const{currentPoints:e}=t,n=e.world;l.handles.points[o]=[...n],i.invalidated=!0}this.editData.hasMoved=!0;const d=(0,s.getEnabledElement)(n),{renderingEngine:c}=d;(0,L.A)(a)},this.cancel=e=>{if(this.isDrawing){this.isDrawing=!1,this._deactivateDraw(e),this._deactivateModify(e),(0,ve.resetElementCursor)(e);const{annotation:t,viewportIdsToRender:n,newAnnotation:i}=this.editData,{data:a}=t;t.highlighted=!1,a.handles.activeHandleIndex=null;(0,s.getEnabledElement)(e);return(0,L.A)(n),i&&(0,ee.triggerAnnotationCompleted)(t),this.editData=null,t.annotationUID}},this._activateModify=e=>{w.wk.isInteractingWithTool=!0,e.addEventListener(l.Events.MOUSE_UP,this._endCallback),e.addEventListener(l.Events.MOUSE_DRAG,this._dragCallback),e.addEventListener(l.Events.MOUSE_CLICK,this._endCallback),e.addEventListener(l.Events.TOUCH_END,this._endCallback),e.addEventListener(l.Events.TOUCH_DRAG,this._dragCallback),e.addEventListener(l.Events.TOUCH_TAP,this._endCallback)},this._deactivateModify=e=>{w.wk.isInteractingWithTool=!1,e.removeEventListener(l.Events.MOUSE_UP,this._endCallback),e.removeEventListener(l.Events.MOUSE_DRAG,this._dragCallback),e.removeEventListener(l.Events.MOUSE_CLICK,this._endCallback),e.removeEventListener(l.Events.TOUCH_END,this._endCallback),e.removeEventListener(l.Events.TOUCH_DRAG,this._dragCallback),e.removeEventListener(l.Events.TOUCH_TAP,this._endCallback)},this._activateDraw=e=>{w.wk.isInteractingWithTool=!0,e.addEventListener(l.Events.MOUSE_UP,this._endCallback),e.addEventListener(l.Events.MOUSE_DRAG,this._dragCallback),e.addEventListener(l.Events.MOUSE_MOVE,this._dragCallback),e.addEventListener(l.Events.MOUSE_CLICK,this._endCallback),e.addEventListener(l.Events.TOUCH_END,this._endCallback),e.addEventListener(l.Events.TOUCH_DRAG,this._dragCallback),e.addEventListener(l.Events.TOUCH_TAP,this._endCallback)},this._deactivateDraw=e=>{w.wk.isInteractingWithTool=!1,e.removeEventListener(l.Events.MOUSE_UP,this._endCallback),e.removeEventListener(l.Events.MOUSE_DRAG,this._dragCallback),e.removeEventListener(l.Events.MOUSE_MOVE,this._dragCallback),e.removeEventListener(l.Events.MOUSE_CLICK,this._endCallback),e.removeEventListener(l.Events.TOUCH_END,this._endCallback),e.removeEventListener(l.Events.TOUCH_DRAG,this._dragCallback),e.removeEventListener(l.Events.TOUCH_TAP,this._endCallback)},this.renderAnnotation=(e,t)=>{let n=!1;const{viewport:i}=e,{element:a}=i;let o=(0,r.getAnnotations)(this.getToolName(),a);if(!o?.length)return n;if(o=this.filterInteractableAnnotationsForElement(a,o),!o?.length)return n;const s=this.getTargetId(i),l=i.getRenderingEngine(),d={toolGroupId:this.toolGroupId,toolName:this.getToolName(),viewportId:e.viewport.id};for(let a=0;a<o.length;a++){const r=o[a],{annotationUID:c,data:h}=r,{points:g,activeHandleIndex:u}=h.handles;d.annotationUID=c;const{color:m,lineWidth:v,lineDash:p,shadow:f}=this.getAnnotationStyle({annotation:r,styleSpecifier:d}),w=g.map((e=>i.worldToCanvas(e)));let E;if(h.cachedStats[s]&&null!=h.cachedStats[s].unit?r.invalidated&&this._throttledCalculateCachedStats(r,l,e):(h.cachedStats[s]={length:null,unit:null},this._calculateCachedStats(r,l,e)),!(0,Ne.isAnnotationVisible)(c))continue;if((0,Se.isAnnotationLocked)(c)||this.editData||null===u||(E=[w[u]]),E){const e="0";(0,M.drawHandles)(t,c,e,w,{color:m,lineDash:p,lineWidth:v})}const I="0";if((0,M.drawHeight)(t,c,I,w[0],w[1],{color:m,width:v,lineDash:p}),n=!0,!i.getRenderingEngine())return console.warn("Rendering Engine has been destroyed"),n;const C=this.getLinkedTextBoxStyle(d,r);if(!C.visibility){h.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 b=this.configuration.getTextLines(h,s);if(!h.handles.textBox.hasMoved){const e=(0,k.getTextBoxCoordsCanvas)(w);h.handles.textBox.worldPosition=i.canvasToWorld(e)}const _=i.worldToCanvas(h.handles.textBox.worldPosition),T="1",S=(0,M.drawLinkedTextBox)(t,c,T,b,_,w,{},C),{x:D,y:A,width:y,height:x}=S;h.handles.textBox.worldBoundingBox={topLeft:i.canvasToWorld([D,A]),topRight:i.canvasToWorld([D+y,A]),bottomLeft:i.canvasToWorld([D,A+x]),bottomRight:i.canvasToWorld([D+y,A+x])}}return n},this._throttledCalculateCachedStats=(0,x.A)(this._calculateCachedStats,100,{trailing:!0})}handleSelectedCallback(e,t,n){const i=e.detail,{element:a}=i,{data:o}=t;t.highlighted=!0;let r,l=!1;n.worldPosition?l=!0:r=o.handles.points.findIndex((e=>e===n));const d=(0,W.getViewportIdsWithToolToRender)(a,this.getToolName());this.editData={annotation:t,viewportIdsToRender:d,handleIndex:r,movingTextBox:l},this._activateModify(a),(0,ve.hideElementCursor)(a);const c=(0,s.getEnabledElement)(a),{renderingEngine:h}=c;(0,L.A)(d),e.preventDefault()}_calculateHeight(e,t){const n=t[0]-e[0],i=t[1]-e[1],a=t[2]-e[2];return 0==n?0!=i?Math.abs(a):0:0==i?Math.abs(a):0==a?Math.abs(i):void 0}_calculateCachedStats(e,t,n){const i=e.data,{element:a}=n.viewport,o=i.handles.points[0],s=i.handles.points[1],{cachedStats:r}=i,d=Object.keys(r);for(let e=0;e<d.length;e++){const t=d[e],n=this.getTargetImageData(t);if(!n)continue;const{imageData:i,dimensions:a}=n,l=wt(i,o),c=wt(i,s),h=[l,c],{scale:g,unit:u}=(0,R.Op)(n,h),m=this._calculateHeight(o,s)/g,v=this._isInsideVolume(l,c,a);this.isHandleOutsideImage=v,r[t]={height:m,unit:u}}const c=e.invalidated;return e.invalidated=!1,c&&(0,ee.triggerAnnotationModified)(e,a,l.ChangeTypes.StatsUpdated),r}_isInsideVolume(e,t,n){return s.utilities.indexWithinDimensions(e,n)&&s.utilities.indexWithinDimensions(t,n)}}function It(e,t){const n=e.cachedStats[t],{height:i,unit:a}=n;if(null==i||isNaN(i))return;return[`${s.utilities.roundNumber(i)} ${a}`]}var Ct=n(18990);const{transformWorldToIndex:bt}=s.utilities;class _t extends ce.EC{static{this.toolName="Probe"}static{this.probeDefaults={supportedInteractionTypes:["Mouse","Touch"],configuration:{shadow:!0,preventHandleOutsideImage:!1,getTextLines:Tt,handleRadius:"6"}}}constructor(e={},t){super(e,ce.EC.mergeDefaultProps(_t.probeDefaults,t)),this.addNewAnnotation=e=>{const t=e.detail,{currentPoints:n,element:i}=t,a=n.world,o=(0,s.getEnabledElement)(i),{viewport:l}=o;this.isDrawing=!0;const d=this.constructor.createAnnotationForViewport(l,{data:{handles:{points:[[...a]]}}});(0,r.addAnnotation)(d,i);const c=(0,W.getViewportIdsWithToolToRender)(i,this.getToolName());return this.editData={annotation:d,newAnnotation:!0,viewportIdsToRender:c},this._activateModify(i),(0,ve.hideElementCursor)(i),e.preventDefault(),(0,L.A)(c),d},this._endCallback=e=>{const t=e.detail,{element:n}=t,{annotation:i,viewportIdsToRender:a,newAnnotation:o}=this.editData,{viewportId:l,renderingEngine:d}=(0,s.getEnabledElement)(n);this.eventDispatchDetail={viewportId:l,renderingEngineId:d.id},this._deactivateModify(n),(0,ve.resetElementCursor)(n),o&&this.createMemo(n,i,{newAnnotation:o}),this.editData=null,this.isDrawing=!1,this.doneEditMemo(),this.isHandleOutsideImage&&this.configuration.preventHandleOutsideImage&&(0,r.removeAnnotation)(i.annotationUID),(0,L.A)(a),o&&(0,ee.triggerAnnotationCompleted)(i)},this._dragCallback=e=>{this.isDrawing=!0;const t=e.detail,{currentPoints:n,element:i}=t,a=n.world,{annotation:o,viewportIdsToRender:s,newAnnotation:r}=this.editData,{data:l}=o;this.createMemo(i,o,{newAnnotation:r}),l.handles.points[0]=[...a],o.invalidated=!0,(0,L.A)(s)},this.cancel=e=>{if(this.isDrawing){this.isDrawing=!1,this._deactivateModify(e),(0,ve.resetElementCursor)(e);const{annotation:t,viewportIdsToRender:n,newAnnotation:i}=this.editData,{data:a}=t;return t.highlighted=!1,a.handles.activeHandleIndex=null,(0,L.A)(n),i&&(0,ee.triggerAnnotationCompleted)(t),this.editData=null,t.annotationUID}},this._activateModify=e=>{w.wk.isInteractingWithTool=!0,e.addEventListener(l.Events.MOUSE_UP,this._endCallback),e.addEventListener(l.Events.MOUSE_DRAG,this._dragCallback),e.addEventListener(l.Events.MOUSE_CLICK,this._endCallback),e.addEventListener(l.Events.TOUCH_END,this._endCallback),e.addEventListener(l.Events.TOUCH_DRAG,this._dragCallback),e.addEventListener(l.Events.TOUCH_TAP,this._endCallback)},this._deactivateModify=e=>{w.wk.isInteractingWithTool=!1,e.removeEventListener(l.Events.MOUSE_UP,this._endCallback),e.removeEventListener(l.Events.MOUSE_DRAG,this._dragCallback),e.removeEventListener(l.Events.MOUSE_CLICK,this._endCallback),e.removeEventListener(l.Events.TOUCH_END,this._endCallback),e.removeEventListener(l.Events.TOUCH_DRAG,this._dragCallback),e.removeEventListener(l.Events.TOUCH_TAP,this._endCallback)},this.renderAnnotation=(e,t)=>{let n=!1;const{viewport:i}=e,{element:a}=i;let o=(0,r.getAnnotations)(this.getToolName(),a);if(!o?.length)return n;if(o=this.filterInteractableAnnotationsForElement(a,o),!o?.length)return n;const d=this.getTargetId(i),c=i.getRenderingEngine(),h={toolGroupId:this.toolGroupId,toolName:this.getToolName(),viewportId:e.viewport.id};for(let a=0;a<o.length;a++){const r=o[a],g=r.annotationUID,u=r.data,m=u.handles.points[0],v=i.worldToCanvas(m);h.annotationUID=g;const{color:p,lineWidth:f}=this.getAnnotationStyle({annotation:r,styleSpecifier:h});if(u.cachedStats||(u.cachedStats={}),u.cachedStats[d]&&null!==u.cachedStats[d].value){if(r.invalidated&&(this._calculateCachedStats(r,c,e),i instanceof s.VolumeViewport)){const{referencedImageId:e}=r.metadata;for(const t in u.cachedStats)if(t.startsWith("imageId")){c.getStackViewports().find((t=>{const n=s.utilities.imageIdToURI(e),i=t.hasImageURI(n),a=s.utilities.imageIdToURI(t.getCurrentImageId());return i&&a!==n}))&&delete u.cachedStats[t]}}}else u.cachedStats[d]={Modality:null,index:null,value:null},this._calculateCachedStats(r,c,e,l.ChangeTypes.StatsUpdated);if(!i.getRenderingEngine())return console.warn("Rendering Engine has been destroyed"),n;const w="0";(0,M.drawHandles)(t,g,w,[v],{color:p,lineWidth:f,handleRadius:this.configuration.handleRadius}),n=!0;const E=this.getLinkedTextBoxStyle(h,r);if(!E.visibility)continue;const I=this.configuration.getTextLines(u,d);if(I){const e=[v[0]+6,v[1]-6],n="0";(0,M.drawTextBox)(t,g,n,I,[e[0],e[1]],E)}}return n}}isPointNearTool(e,t,n,i){const a=(0,s.getEnabledElement)(e),{viewport:o}=a,{data:r}=t,l=r.handles.points[0],d=o.worldToCanvas(l);return T.Zc.distance(n,d)<i}toolSelectedCallback(){}static{this.hydrate=(e,t,n)=>{const i=(0,s.getEnabledElementByViewportId)(e);if(!i)return;const{FrameOfReferenceUID:a,referencedImageId:o,viewPlaneNormal:l,viewUp:d,instance:c,viewport:h}=this.hydrateBase(_t,i,t,n),g={annotationUID:n?.annotationUID||s.utilities.uuidv4(),data:{handles:{points:t}},highlighted:!1,autoGenerated:!1,invalidated:!1,isLocked:!1,isVisible:!0,metadata:{toolName:c.getToolName(),viewPlaneNormal:l,FrameOfReferenceUID:a,referencedImageId:o,...n}};(0,r.addAnnotation)(g,h.element),(0,L.A)([h.id])}}getHandleNearImagePoint(e,t,n,i){const a=(0,s.getEnabledElement)(e),{viewport:o}=a,{data:r}=t,l=r.handles.points[0],d=o.worldToCanvas(l);if(!0===T.Zc.distance(n,d)<i)return l}handleSelectedCallback(e,t){const n=e.detail,{element:i}=n;t.highlighted=!0;const a=(0,W.getViewportIdsWithToolToRender)(i,this.getToolName());this.editData={annotation:t,viewportIdsToRender:a},this._activateModify(i),(0,ve.hideElementCursor)(i),(0,L.A)(a),e.preventDefault()}_calculateCachedStats(e,t,n,i=l.ChangeTypes.StatsUpdated){const a=e.data,{renderingEngineId:o,viewport:r}=n,{element:d}=r,c=a.handles.points[0],{cachedStats:h}=a,g=Object.keys(h);for(let t=0;t<g.length;t++){const n=g[t],i={isPreScaled:(0,Ct.u)(r,n),isSuvScaled:this.isSuvScaled(r,n,e.metadata.referencedImageId)},a=this.getTargetImageData(n);if(!a)continue;const{dimensions:o,imageData:l,metadata:d,voxelManager:u}=a,m=d.Modality;let v=bt(l,c);if(v=T.eR.round(v,v),s.utilities.indexWithinDimensions(v,o)){this.isHandleOutsideImage=!1;let t,o=u.getAtIJKPoint(v);if(n.startsWith("imageId:")){const e=n.split("imageId:")[1],t=s.utilities.imageIdToURI(e),i=s.utilities.getViewportsWithImageURI(t)[0];v[2]=i.getCurrentImageIdIndex()}if("US"===m){const e=(0,R.Xw)(a,[v]),n=e.values.every((e=>null!==e));o=n?e.values:o,t=n?e.units:"raw"}else t=(0,J.j)(m,e.metadata.referencedImageId,i);h[n]={index:v,value:o,Modality:m,modalityUnit:t}}else this.isHandleOutsideImage=!0,h[n]={index:v,Modality:m}}const u=e.invalidated;return e.invalidated=!1,u&&(0,ee.triggerAnnotationModified)(e,d,i),h}}function Tt(e,t){const n=e.cachedStats[t],{index:i,value:a,modalityUnit:o}=n;if(void 0===a||!i)return;const r=[];if(r.push(`(${i[0]}, ${i[1]}, ${i[2]})`),a instanceof Array&&o instanceof Array)for(let e=0;e<a.length;e++)r.push(`${s.utilities.roundNumber(a[e])} ${o[e]}`);else r.push(`${s.utilities.roundNumber(a)} ${o}`);return r}const St=_t;class Dt extends St{static{this.toolName="DragProbe"}constructor(e={},t={supportedInteractionTypes:["Mouse","Touch"],configuration:{shadow:!0,preventHandleOutsideImage:!1,getTextLines:At}}){super(e,t),this.postMouseDownCallback=e=>{const t=e.detail,{currentPoints:n,element:i}=t,a=n.world,o=(0,s.getEnabledElement)(i),{viewport:r,renderingEngine:l}=o;this.isDrawing=!0;const d=r.getCamera(),{viewPlaneNormal:c,viewUp:h}=d,g=this.getReferencedImageId(r,a,c,h),u={invalidated:!0,highlighted:!0,isVisible:!0,metadata:{toolName:this.getToolName(),viewPlaneNormal:[...c],viewUp:[...h],FrameOfReferenceUID:r.getFrameOfReferenceUID(),referencedImageId:g},data:{label:"",handles:{points:[[...a]]},cachedStats:{}}},m=(0,W.getViewportIdsWithToolToRender)(i,this.getToolName());return this.editData={annotation:u,newAnnotation:!0,viewportIdsToRender:m},this._activateModify(i),(0,ve.hideElementCursor)(i),e.preventDefault(),(0,L.A)(m),u},this.postTouchStartCallback=e=>this.postMouseDownCallback(e),this.renderAnnotation=(e,t)=>{let n=!1;const{viewport:i}=e;if(!this.editData)return n;const a=this.filterInteractableAnnotationsForElement(i.element,[this.editData.annotation]);if(!a?.length)return n;const o=this.getTargetId(i),s=i.getRenderingEngine(),r={toolGroupId:this.toolGroupId,toolName:this.getToolName(),viewportId:e.viewport.id},l=this.editData.annotation,d=l.annotationUID,c=l.data,h=c.handles.points[0],g=i.worldToCanvas(h);r.annotationUID=d;const{color:u}=this.getAnnotationStyle({annotation:l,styleSpecifier:r});if(c.cachedStats[o]&&null!==c.cachedStats[o].value?l.invalidated&&this._calculateCachedStats(l,s,e):(c.cachedStats[o]={Modality:null,index:null,value:null},this._calculateCachedStats(l,s,e)),!i.getRenderingEngine())return console.warn("Rendering Engine has been destroyed"),n;(0,M.drawHandles)(t,d,"0",[g],{color:u}),n=!0;const m=this.configuration.getTextLines(c,o);if(m){const e=[g[0]+6,g[1]-6],n="0";(0,M.drawTextBox)(t,d,n,m,[e[0],e[1]],this.getLinkedTextBoxStyle(r,l))}return n}}}function At(e,t){const n=e.cachedStats[t],{index:i,value:a,modalityUnit:o}=n;if(void 0===a)return;const s=[];return s.push(`(${i[0]}, ${i[1]}, ${i[2]})`),s.push(`${a.toFixed(2)} ${o}`),s}n(4010);var Mt=n(62514),yt=n(11683),xt=n(73262);const{transformWorldToIndex:Pt}=s.utilities;class Rt extends ce.EC{static{this.toolName="EllipticalROI"}constructor(e={},t={supportedInteractionTypes:["Mouse","Touch"],configuration:{shadow:!0,preventHandleOutsideImage:!1,storePointData:!1,centerPointRadius:0,calculateStats:!0,getTextLines:Lt,statsCalculator:xt.BasicStatsCalculator}}){super(e,t),this.isHandleOutsideImage=!1,this.addNewAnnotation=e=>{const t=e.detail,{currentPoints:n,element:i}=t,a=n.world,o=(n.canvas,(0,s.getEnabledElement)(i)),{viewport:l,renderingEngine:d}=o;this.isDrawing=!0;const c=l.getCamera(),{viewPlaneNormal:h,viewUp:g}=c,u=this.getReferencedImageId(l,a,h,g),m=l.getFrameOfReferenceUID(),v={highlighted:!0,invalidated:!0,metadata:{toolName:this.getToolName(),viewPlaneNormal:[...h],viewUp:[...g],FrameOfReferenceUID:m,referencedImageId:u,...l.getViewReference({points:[a]})},data:{label:"",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:[[...a],[...a],[...a],[...a]],activeHandleIndex:null},cachedStats:{},initialRotation:l.getRotation()}};(0,r.addAnnotation)(v,i);const p=(0,W.getViewportIdsWithToolToRender)(i,this.getToolName());return this.editData={annotation:v,viewportIdsToRender:p,centerWorld:a,newAnnotation:!0,hasMoved:!1},this._activateDraw(i),(0,ve.hideElementCursor)(i),e.preventDefault(),(0,L.A)(p),v},this.isPointNearTool=(e,t,n,i)=>{const a=(0,s.getEnabledElement)(e),{viewport:o}=a,{data:r}=t,{points:l}=r.handles,d=l.map((e=>o.worldToCanvas(e))),c=(0,yt.getCanvasEllipseCorners)(d),[h,g]=c,u={left:Math.min(h[0],g[0])+i/2,top:Math.min(h[1],g[1])+i/2,width:Math.abs(h[0]-g[0])-i,height:Math.abs(h[1]-g[1])-i},m={left:Math.min(h[0],g[0])-i/2,top:Math.min(h[1],g[1])-i/2,width:Math.abs(h[0]-g[0])+i,height:Math.abs(h[1]-g[1])+i},v=this._pointInEllipseCanvas(u,n);return!(!this._pointInEllipseCanvas(m,n)||v)},this.toolSelectedCallback=(e,t)=>{const n=e.detail,{element:i}=n;t.highlighted=!0;const a=(0,W.getViewportIdsWithToolToRender)(i,this.getToolName());this.editData={annotation:t,viewportIdsToRender:a,movingTextBox:!1},(0,ve.hideElementCursor)(i),this._activateModify(i);const o=(0,s.getEnabledElement)(i),{renderingEngine:r}=o;(0,L.A)(a),e.preventDefault()},this.handleSelectedCallback=(e,t,n)=>{const i=e.detail,{element:a}=i,{data:o}=t;t.highlighted=!0;let r,l,d,c,h,g,u=!1;if(n.worldPosition)u=!0;else{const{points:e}=o.handles,{viewport:t}=(0,s.getEnabledElement)(a),{worldToCanvas:i,canvasToWorld:u}=t;r=e.findIndex((e=>e===n));const m=e.map(i);g=m[r],c=Math.abs(m[2][0]-m[3][0]),h=Math.abs(m[0][1]-m[1][1]),l=[(m[2][0]+m[3][0])/2,(m[0][1]+m[1][1])/2],d=u(l)}const m=(0,W.getViewportIdsWithToolToRender)(a,this.getToolName());this.editData={annotation:t,viewportIdsToRender:m,handleIndex:r,canvasWidth:c,canvasHeight:h,centerWorld:d,originalHandleCanvas:g,movingTextBox:u},this._activateModify(a),(0,ve.hideElementCursor)(a),(0,L.A)(m),e.preventDefault()},this._endCallback=e=>{const t=e.detail,{element:n}=t,{annotation:i,viewportIdsToRender:a,newAnnotation:o,hasMoved:s}=this.editData,{data:l}=i;o&&!s||(this.doneEditMemo(),i.highlighted=!1,l.handles.activeHandleIndex=null,this._deactivateModify(n),this._deactivateDraw(n),(0,ve.resetElementCursor)(n),this.editData=null,this.isDrawing=!1,this.isHandleOutsideImage&&this.configuration.preventHandleOutsideImage&&(0,r.removeAnnotation)(i.annotationUID),(0,L.A)(a),o&&(0,ee.triggerAnnotationCompleted)(i))},this._dragDrawCallback=e=>{this.isDrawing=!0;const t=e.detail,{element:n}=t,{currentPoints:i}=t,a=i.canvas,o=(0,s.getEnabledElement)(n),{viewport:r}=o,{canvasToWorld:d}=r,{annotation:c,viewportIdsToRender:h,centerWorld:g,newAnnotation:u}=this.editData;this.createMemo(n,c,{newAnnotation:u});const m=r.worldToCanvas(g),{data:v}=c,p=Math.abs(a[0]-m[0]),f=Math.abs(a[1]-m[1]),w=[m[0],m[1]-f],E=[m[0],m[1]+f],I=[m[0]-p,m[1]],C=[m[0]+p,m[1]];v.handles.points=[d(w),d(E),d(I),d(C)],c.invalidated=!0,this.editData.hasMoved=!0,(0,L.A)(h),(0,ee.triggerAnnotationModified)(c,n,l.ChangeTypes.HandlesUpdated)},this._dragModifyCallback=e=>{this.isDrawing=!0;const t=e.detail,{element:n}=t,{annotation:i,viewportIdsToRender:a,handleIndex:o,movingTextBox:r,newAnnotation:d}=this.editData;this.createMemo(n,i,{newAnnotation:d});const{data:c}=i;if(r){const{deltaPoints:e}=t,n=e.world,{textBox:i}=c.handles,{worldPosition:a}=i;a[0]+=n[0],a[1]+=n[1],a[2]+=n[2],i.hasMoved=!0}else if(void 0===o){const{deltaPoints:e}=t,n=e.world;c.handles.points.forEach((e=>{e[0]+=n[0],e[1]+=n[1],e[2]+=n[2]})),i.invalidated=!0}else this._dragHandle(e),i.invalidated=!0;const h=(0,s.getEnabledElement)(n),{renderingEngine:g}=h;(0,L.A)(a),i.invalidated&&(0,ee.triggerAnnotationModified)(i,n,l.ChangeTypes.HandlesUpdated)},this._dragHandle=e=>{const t=e.detail,{element:n}=t,{viewport:i}=(0,s.getEnabledElement)(n),{canvasToWorld:a,worldToCanvas:o}=i,{annotation:r,canvasWidth:l,canvasHeight:d,handleIndex:c,centerWorld:h,originalHandleCanvas:g}=this.editData,u=i.worldToCanvas(h),{data:m}=r,{points:v}=m.handles,{currentPoints:p}=t,f=p.canvas;if(0===c||1===c){const e=Math.abs(f[1]-u[1]),t=[u[0],u[1]-e],n=[u[0],u[1]+e];v[0]=a(t),v[1]=a(n);const i=l/2+(f[0]-g[0]),o=[u[0]-i,u[1]],s=[u[0]+i,u[1]];v[2]=a(o),v[3]=a(s)}else{const e=Math.abs(f[0]-u[0]),t=[u[0]-e,u[1]],n=[u[0]+e,u[1]];v[2]=a(t),v[3]=a(n);const i=d/2+(f[1]-g[1]),o=[u[0],u[1]-i],s=[u[0],u[1]+i];v[0]=a(o),v[1]=a(s)}},this.cancel=e=>{if(this.isDrawing){this.isDrawing=!1,this._deactivateDraw(e),this._deactivateModify(e),(0,ve.resetElementCursor)(e);const{annotation:t,viewportIdsToRender:n,newAnnotation:i}=this.editData,{data:a}=t;return t.highlighted=!1,a.handles.activeHandleIndex=null,(0,L.A)(n),i&&(0,ee.triggerAnnotationCompleted)(t),this.editData=null,t.annotationUID}},this._activateModify=e=>{w.wk.isInteractingWithTool=!0,e.addEventListener(l.Events.MOUSE_UP,this._endCallback),e.addEventListener(l.Events.MOUSE_DRAG,this._dragModifyCallback),e.addEventListener(l.Events.MOUSE_CLICK,this._endCallback),e.addEventListener(l.Events.TOUCH_END,this._endCallback),e.addEventListener(l.Events.TOUCH_DRAG,this._dragModifyCallback),e.addEventListener(l.Events.TOUCH_TAP,this._endCallback)},this._deactivateModify=e=>{w.wk.isInteractingWithTool=!1,e.removeEventListener(l.Events.MOUSE_UP,this._endCallback),e.removeEventListener(l.Events.MOUSE_DRAG,this._dragModifyCallback),e.removeEventListener(l.Events.MOUSE_CLICK,this._endCallback),e.removeEventListener(l.Events.TOUCH_END,this._endCallback),e.removeEventListener(l.Events.TOUCH_DRAG,this._dragModifyCallback),e.removeEventListener(l.Events.TOUCH_TAP,this._endCallback)},this._activateDraw=e=>{w.wk.isInteractingWithTool=!0,e.addEventListener(l.Events.MOUSE_UP,this._endCallback),e.addEventListener(l.Events.MOUSE_DRAG,this._dragDrawCallback),e.addEventListener(l.Events.MOUSE_MOVE,this._dragDrawCallback),e.addEventListener(l.Events.MOUSE_CLICK,this._endCallback),e.addEventListener(l.Events.TOUCH_END,this._endCallback),e.addEventListener(l.Events.TOUCH_DRAG,this._dragDrawCallback),e.addEventListener(l.Events.TOUCH_TAP,this._endCallback)},this._deactivateDraw=e=>{w.wk.isInteractingWithTool=!1,e.removeEventListener(l.Events.MOUSE_UP,this._endCallback),e.removeEventListener(l.Events.MOUSE_DRAG,this._dragDrawCallback),e.removeEventListener(l.Events.MOUSE_MOVE,this._dragDrawCallback),e.removeEventListener(l.Events.MOUSE_CLICK,this._endCallback),e.removeEventListener(l.Events.TOUCH_END,this._endCallback),e.removeEventListener(l.Events.TOUCH_DRAG,this._dragDrawCallback),e.removeEventListener(l.Events.TOUCH_TAP,this._endCallback)},this.renderAnnotation=(e,t)=>{let n=!1;const{viewport:i}=e,{element:a}=i;let o=(0,r.getAnnotations)(this.getToolName(),a);if(!o?.length)return n;if(o=this.filterInteractableAnnotationsForElement(a,o),!o?.length)return n;const l=this.getTargetId(i),d=i.getRenderingEngine(),c={toolGroupId:this.toolGroupId,toolName:this.getToolName(),viewportId:e.viewport.id};for(let a=0;a<o.length;a++){const r=o[a],{annotationUID:h,data:g}=r,{handles:u}=g,{points:m,activeHandleIndex:v}=u;c.annotationUID=h;const{color:p,lineWidth:f,lineDash:w}=this.getAnnotationStyle({annotation:r,styleSpecifier:c}),E=m.map((e=>i.worldToCanvas(e))),I=(0,yt.getCanvasEllipseCorners)(E),{centerPointRadius:C}=this.configuration;if(g.cachedStats[l]&&null!=g.cachedStats[l].areaUnit){if(r.invalidated&&(this._throttledCalculateCachedStats(r,i,d,e),i instanceof s.VolumeViewport)){const{referencedImageId:e}=r.metadata;for(const t in g.cachedStats)if(t.startsWith("imageId")){d.getStackViewports().find((t=>{const n=s.utilities.imageIdToURI(e),i=t.hasImageURI(n),a=s.utilities.imageIdToURI(t.getCurrentImageId());return i&&a!==n}))&&delete g.cachedStats[t]}}}else g.cachedStats[l]={Modality:null,area:null,max:null,mean:null,stdDev:null,areaUnit:null},this._calculateCachedStats(r,i,d);if(!i.getRenderingEngine())return console.warn("Rendering Engine has been destroyed"),n;let b;if(!(0,Ne.isAnnotationVisible)(h))continue;if((0,Se.isAnnotationLocked)(h)||this.editData||null===v||(b=[E[v]]),b){const e="0";(0,M.drawHandles)(t,h,e,b,{color:p})}const _=`${h}-ellipse`,T="0";if((0,M.drawEllipseByCoordinates)(t,h,T,E,{color:p,lineDash:w,lineWidth:f},_),C>0){if(Math.min(Math.abs(I[0][0]-I[1][0])/2,Math.abs(I[0][1]-I[1][1])/2)>3*C){const e=this._getCanvasEllipseCenter(E);(0,M.drawCircle)(t,h,`${T}-center`,e,C,{color:p,lineDash:w,lineWidth:f})}}n=!0;const S=this.getLinkedTextBoxStyle(c,r);if(!S.visibility){g.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 D=this.configuration.getTextLines(g,l);if(!D||0===D.length)continue;let A;g.handles.textBox.hasMoved||(A=(0,k.getTextBoxCoordsCanvas)(I),g.handles.textBox.worldPosition=i.canvasToWorld(A));const y=i.worldToCanvas(g.handles.textBox.worldPosition),x="1",P=(0,M.drawLinkedTextBox)(t,h,x,D,y,E,{},S),{x:R,y:L,width:U,height:O}=P;g.handles.textBox.worldBoundingBox={topLeft:i.canvasToWorld([R,L]),topRight:i.canvasToWorld([R+U,L]),bottomLeft:i.canvasToWorld([R,L+O]),bottomRight:i.canvasToWorld([R+U,L+O])}}return n},this._calculateCachedStats=(e,t,n)=>{if(!this.configuration.calculateStats)return;const i=e.data,{element:a}=t,{points:o}=i.handles,s=o.map((e=>t.worldToCanvas(e))),{viewPlaneNormal:r,viewUp:d}=t.getCamera(),[c,h]=(0,yt.getCanvasEllipseCorners)(s),g=t.canvasToWorld(c),u=t.canvasToWorld(h),{cachedStats:m}=i,v=Object.keys(m),p=g,f=u;for(let n=0;n<v.length;n++){const i=v[n],a=this.getTargetImageData(i);if(!a)continue;const{dimensions:o,imageData:s,metadata:l,voxelManager:c}=a,h=Pt(s,p);h[0]=Math.floor(h[0]),h[1]=Math.floor(h[1]),h[2]=Math.floor(h[2]);const w=Pt(s,f);w[0]=Math.floor(w[0]),w[1]=Math.floor(w[1]),w[2]=Math.floor(w[2]),this.isHandleOutsideImage=!this._isInsideVolume(h,w,o);const E=[[Math.min(h[0],w[0]),Math.max(h[0],w[0])],[Math.min(h[1],w[1]),Math.max(h[1],w[1])],[Math.min(h[2],w[2]),Math.max(h[2],w[2])]],I={center:[(g[0]+u[0])/2,(g[1]+u[1])/2,(g[2]+u[2])/2],xRadius:Math.abs(g[0]-u[0])/2,yRadius:Math.abs(g[1]-u[1])/2,zRadius:Math.abs(g[2]-u[2])/2},{worldWidth:C,worldHeight:b}=(0,Mt.A)(r,d,p,f),_=0===C&&0===b,T=[h,w],{scale:S,areaUnit:D}=(0,R.Op)(a,T),A=Math.abs(Math.PI*(C/2)*(b/2))/S/S,M={isPreScaled:(0,Ct.u)(t,i),isSuvScaled:this.isSuvScaled(t,i,e.metadata.referencedImageId)},y=(0,J.j)(l.Modality,e.metadata.referencedImageId,M),x=c.forEach(this.configuration.statsCalculator.statsCallback,{boundsIJK:E,imageData:s,isInObject:e=>(0,yt.pointInEllipse)(I,e,{fast:!0}),returnPoints:this.configuration.storePointData}),P=this.configuration.statsCalculator.getStatistics();m[i]={Modality:l.Modality,area:A,mean:P.mean?.value,max:P.max?.value,stdDev:P.stdDev?.value,statsArray:P.array,pointsInShape:x,isEmptyArea:_,areaUnit:D,modalityUnit:y}}const w=e.invalidated;return e.invalidated=!1,w&&(0,ee.triggerAnnotationModified)(e,a,l.ChangeTypes.StatsUpdated),m},this._isInsideVolume=(e,t,n)=>s.utilities.indexWithinDimensions(e,n)&&s.utilities.indexWithinDimensions(t,n),this._throttledCalculateCachedStats=(0,x.A)(this._calculateCachedStats,100,{trailing:!0})}static{this.hydrate=(e,t,n)=>{const i=(0,s.getEnabledElementByViewportId)(e);if(!i)return;const{FrameOfReferenceUID:a,referencedImageId:o,viewPlaneNormal:l,instance:d,viewport:c}=this.hydrateBase(Rt,i,t,n),h={annotationUID:n?.annotationUID||s.utilities.uuidv4(),data:{handles:{points:t,activeHandleIndex:null},label:"",cachedStats:{}},highlighted:!1,autoGenerated:!1,invalidated:!1,isLocked:!1,isVisible:!0,metadata:{toolName:d.getToolName(),viewPlaneNormal:l,FrameOfReferenceUID:a,referencedImageId:o,...n}};(0,r.addAnnotation)(h,c.element),(0,L.A)([c.id])}}_pointInEllipseCanvas(e,t){const n=e.width/2,i=e.height/2;if(n<=0||i<=0)return!1;const a=[e.left+n,e.top+i],o=[t[0]-a[0],t[1]-a[1]];return o[0]*o[0]/(n*n)+o[1]*o[1]/(i*i)<=1}_getCanvasEllipseCenter(e){const[t,n,i,a]=e,o=[i[0],n[1]],s=[a[0],t[1]];return[(o[0]+s[0])/2,(o[1]+s[1])/2]}}function Lt(e,t){const n=e.cachedStats[t],{area:i,mean:a,stdDev:o,max:r,isEmptyArea:l,areaUnit:d,modalityUnit:c}=n,h=[];if(i){const e=l?"Area: Oblique not supported":`Area: ${s.utilities.roundNumber(i)} ${d}`;h.push(e)}return a&&h.push(`Mean: ${s.utilities.roundNumber(a)} ${c}`),r&&h.push(`Max: ${s.utilities.roundNumber(r)} ${c}`),o&&h.push(`Std Dev: ${s.utilities.roundNumber(o)} ${c}`),h}const{transformWorldToIndex:Ut}=s.utilities;class Ot extends ce.EC{static{this.toolName="CircleROI"}constructor(e={},t={supportedInteractionTypes:["Mouse","Touch"],configuration:{shadow:!0,preventHandleOutsideImage:!1,storePointData:!1,centerPointRadius:0,calculateStats:!0,getTextLines:kt,statsCalculator:xt.BasicStatsCalculator}}){super(e,t),this.isHandleOutsideImage=!1,this.addNewAnnotation=e=>{const t=e.detail,{currentPoints:n,element:i}=t,a=n.world,o=(0,s.getEnabledElement)(i),{viewport:l,renderingEngine:d}=o;this.isDrawing=!0;const c=l.getCamera(),{viewPlaneNormal:h,viewUp:g}=c,u=this.getReferencedImageId(l,a,h,g),m=l.getFrameOfReferenceUID(),v={highlighted:!0,invalidated:!0,metadata:{toolName:this.getToolName(),viewPlaneNormal:[...h],viewUp:[...g],FrameOfReferenceUID:m,referencedImageId:u,...l.getViewReference({points:[a]})},data:{label:"",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:[[...a],[...a]],activeHandleIndex:null},cachedStats:{}}};(0,r.addAnnotation)(v,i);const p=(0,W.getViewportIdsWithToolToRender)(i,this.getToolName());return this.editData={annotation:v,viewportIdsToRender:p,newAnnotation:!0,hasMoved:!1},this._activateDraw(i),(0,ve.hideElementCursor)(i),e.preventDefault(),(0,L.A)(p),v},this.isPointNearTool=(e,t,n,i)=>{const a=(0,s.getEnabledElement)(e),{viewport:o}=a,{data:r}=t,{points:l}=r.handles,d=l.map((e=>o.worldToCanvas(e))),c=(0,Ve.getCanvasCircleRadius)(d),h=(0,Ve.getCanvasCircleRadius)([d[0],n]);return Math.abs(h-c)<i/2},this.toolSelectedCallback=(e,t)=>{const n=e.detail,{element:i}=n;t.highlighted=!0;const a=(0,W.getViewportIdsWithToolToRender)(i,this.getToolName());this.editData={annotation:t,viewportIdsToRender:a,movingTextBox:!1},(0,ve.hideElementCursor)(i),this._activateModify(i);const o=(0,s.getEnabledElement)(i),{renderingEngine:r}=o;(0,L.A)(a),e.preventDefault()},this.handleSelectedCallback=(e,t,n)=>{const i=e.detail,{element:a}=i,{data:o}=t;t.highlighted=!0;let r,l=!1;if(n.worldPosition)l=!0;else{const{points:e}=o.handles;r=e.findIndex((e=>e===n))}const d=(0,W.getViewportIdsWithToolToRender)(a,this.getToolName());this.editData={annotation:t,viewportIdsToRender:d,handleIndex:r,movingTextBox:l},this._activateModify(a),(0,ve.hideElementCursor)(a);const c=(0,s.getEnabledElement)(a),{renderingEngine:h}=c;(0,L.A)(d),e.preventDefault()},this._endCallback=e=>{const t=e.detail,{element:n}=t,{annotation:i,viewportIdsToRender:a,newAnnotation:o,hasMoved:l}=this.editData,{data:d}=i;if(o&&!l)return;this.doneEditMemo(),i.highlighted=!1,d.handles.activeHandleIndex=null,this._deactivateModify(n),this._deactivateDraw(n),(0,ve.resetElementCursor)(n);const{renderingEngine:c}=(0,s.getEnabledElement)(n);this.editData=null,this.isDrawing=!1,this.isHandleOutsideImage&&this.configuration.preventHandleOutsideImage&&(0,r.removeAnnotation)(i.annotationUID),(0,L.A)(a),o&&(0,ee.triggerAnnotationCompleted)(i)},this._dragDrawCallback=e=>{this.isDrawing=!0;const t=e.detail,{element:n}=t,{currentPoints:i}=t,a=i.canvas,o=(0,s.getEnabledElement)(n),{viewport:r}=o,{canvasToWorld:d}=r,{annotation:c,viewportIdsToRender:h,newAnnotation:g}=this.editData;this.createMemo(n,c,{newAnnotation:g});const{data:u}=c;u.handles.points=[u.handles.points[0],d(a)],c.invalidated=!0,this.editData.hasMoved=!0,(0,L.A)(h),(0,ee.triggerAnnotationModified)(c,n,l.ChangeTypes.HandlesUpdated)},this._dragModifyCallback=e=>{this.isDrawing=!0;const t=e.detail,{element:n}=t,{annotation:i,viewportIdsToRender:a,handleIndex:o,movingTextBox:r,newAnnotation:d}=this.editData;this.createMemo(n,i,{newAnnotation:d});const{data:c}=i;if(r){const{deltaPoints:e}=t,n=e.world,{textBox:i}=c.handles,{worldPosition:a}=i;a[0]+=n[0],a[1]+=n[1],a[2]+=n[2],i.hasMoved=!0}else if(void 0===o){const{deltaPoints:e}=t,n=e.world;c.handles.points.forEach((e=>{e[0]+=n[0],e[1]+=n[1],e[2]+=n[2]})),i.invalidated=!0}else this._dragHandle(e),i.invalidated=!0;const h=(0,s.getEnabledElement)(n),{renderingEngine:g}=h;(0,L.A)(a),i.invalidated&&(0,ee.triggerAnnotationModified)(i,n,l.ChangeTypes.HandlesUpdated)},this._dragHandle=e=>{const t=e.detail,{element:n}=t,i=(0,s.getEnabledElement)(n),{canvasToWorld:a,worldToCanvas:o}=i.viewport,{annotation:r,handleIndex:l}=this.editData,{data:d}=r,{points:c}=d.handles,h=c.map((e=>o(e))),{currentPoints:g}=t,u=g.canvas;if(0===l){const e=u[0]-h[0][0],t=u[1]-h[0][1],n=u,i=[h[1][0]+e,h[1][1]+t];c[0]=a(n),c[1]=a(i)}else c[1]=a(u)},this.cancel=e=>{if(this.isDrawing){this.isDrawing=!1,this._deactivateDraw(e),this._deactivateModify(e),(0,ve.resetElementCursor)(e);const{annotation:t,viewportIdsToRender:n,newAnnotation:i}=this.editData,{data:a}=t;return t.highlighted=!1,a.handles.activeHandleIndex=null,(0,L.A)(n),i&&(0,ee.triggerAnnotationCompleted)(t),this.editData=null,t.annotationUID}},this._activateModify=e=>{w.wk.isInteractingWithTool=!0,e.addEventListener(l.Events.MOUSE_UP,this._endCallback),e.addEventListener(l.Events.MOUSE_DRAG,this._dragModifyCallback),e.addEventListener(l.Events.MOUSE_CLICK,this._endCallback),e.addEventListener(l.Events.TOUCH_END,this._endCallback),e.addEventListener(l.Events.TOUCH_DRAG,this._dragModifyCallback),e.addEventListener(l.Events.TOUCH_TAP,this._endCallback)},this._deactivateModify=e=>{w.wk.isInteractingWithTool=!1,e.removeEventListener(l.Events.MOUSE_UP,this._endCallback),e.removeEventListener(l.Events.MOUSE_DRAG,this._dragModifyCallback),e.removeEventListener(l.Events.MOUSE_CLICK,this._endCallback),e.removeEventListener(l.Events.TOUCH_END,this._endCallback),e.removeEventListener(l.Events.TOUCH_DRAG,this._dragModifyCallback),e.removeEventListener(l.Events.TOUCH_TAP,this._endCallback)},this._activateDraw=e=>{w.wk.isInteractingWithTool=!0,e.addEventListener(l.Events.MOUSE_UP,this._endCallback),e.addEventListener(l.Events.MOUSE_DRAG,this._dragDrawCallback),e.addEventListener(l.Events.MOUSE_MOVE,this._dragDrawCallback),e.addEventListener(l.Events.MOUSE_CLICK,this._endCallback),e.addEventListener(l.Events.TOUCH_END,this._endCallback),e.addEventListener(l.Events.TOUCH_DRAG,this._dragDrawCallback),e.addEventListener(l.Events.TOUCH_TAP,this._endCallback)},this._deactivateDraw=e=>{w.wk.isInteractingWithTool=!1,e.removeEventListener(l.Events.MOUSE_UP,this._endCallback),e.removeEventListener(l.Events.MOUSE_DRAG,this._dragDrawCallback),e.removeEventListener(l.Events.MOUSE_MOVE,this._dragDrawCallback),e.removeEventListener(l.Events.MOUSE_CLICK,this._endCallback),e.removeEventListener(l.Events.TOUCH_END,this._endCallback),e.removeEventListener(l.Events.TOUCH_DRAG,this._dragDrawCallback),e.removeEventListener(l.Events.TOUCH_TAP,this._endCallback)},this.renderAnnotation=(e,t)=>{let n=!1;const{viewport:i}=e,{element:a}=i;let o=(0,r.getAnnotations)(this.getToolName(),a);if(!o?.length)return n;if(o=this.filterInteractableAnnotationsForElement(a,o),!o?.length)return n;const l=this.getTargetId(i),d=i.getRenderingEngine(),c={toolGroupId:this.toolGroupId,toolName:this.getToolName(),viewportId:e.viewport.id};for(let a=0;a<o.length;a++){const r=o[a],{annotationUID:h,data:g}=r,{handles:u}=g,{points:m,activeHandleIndex:v}=u;c.annotationUID=h;const{color:p,lineWidth:f,lineDash:w}=this.getAnnotationStyle({annotation:r,styleSpecifier:c}),E=m.map((e=>i.worldToCanvas(e))),I=E[0],C=(0,Ve.getCanvasCircleRadius)(E),b=(0,Ve.getCanvasCircleCorners)(E),{centerPointRadius:_}=this.configuration;if(g.cachedStats[l]&&null!=g.cachedStats[l].areaUnit){if(r.invalidated&&(this._throttledCalculateCachedStats(r,i,d,e),i instanceof s.VolumeViewport)){const{referencedImageId:e}=r.metadata;for(const t in g.cachedStats)if(t.startsWith("imageId")){d.getStackViewports().find((t=>{const n=s.utilities.imageIdToURI(e),i=t.hasImageURI(n),a=s.utilities.imageIdToURI(t.getCurrentImageId());return i&&a!==n}))&&delete g.cachedStats[t]}}}else g.cachedStats[l]={Modality:null,area:null,max:null,mean:null,stdDev:null,areaUnit:null,radius:null,radiusUnit:null,perimeter:null},this._calculateCachedStats(r,i,d,e);if(!i.getRenderingEngine())return console.warn("Rendering Engine has been destroyed"),n;let T;if(!(0,Ne.isAnnotationVisible)(h))continue;if((0,Se.isAnnotationLocked)(h)||this.editData||null===v||(T=[E[v]]),T){const e="0";(0,M.drawHandles)(t,h,e,T,{color:p})}const S=`${h}-circle`,D="0";(0,M.drawCircle)(t,h,D,I,C,{color:p,lineDash:w,lineWidth:f},S),_>0&&C>3*_&&(0,M.drawCircle)(t,h,`${D}-center`,I,_,{color:p,lineDash:w,lineWidth:f}),n=!0;const A=this.getLinkedTextBoxStyle(c,r);if(!A.visibility){g.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 y=this.configuration.getTextLines(g,l);if(!y||0===y.length)continue;let x;g.handles.textBox.hasMoved||(x=(0,k.getTextBoxCoordsCanvas)(b),g.handles.textBox.worldPosition=i.canvasToWorld(x));const P=i.worldToCanvas(g.handles.textBox.worldPosition),R="1",L=(0,M.drawLinkedTextBox)(t,h,R,y,P,E,{},A),{x:U,y:O,width:N,height:V}=L;g.handles.textBox.worldBoundingBox={topLeft:i.canvasToWorld([U,O]),topRight:i.canvasToWorld([U+N,O]),bottomLeft:i.canvasToWorld([U,O+V]),bottomRight:i.canvasToWorld([U+N,O+V])}}return n},this._calculateCachedStats=(e,t,n,i)=>{if(!this.configuration.calculateStats)return;const a=e.data,{element:o}=t,r=e.invalidated,{points:d}=a.handles,c=d.map((e=>t.worldToCanvas(e))),{viewPlaneNormal:h,viewUp:g}=t.getCamera(),[u,m]=(0,Ve.getCanvasCircleCorners)(c),v=t.canvasToWorld(u),p=t.canvasToWorld(m),{cachedStats:f}=a,w=Object.keys(f),E=v,I=p;for(let n=0;n<w.length;n++){const i=w[n],a=this.getTargetImageData(i);if(!a)continue;const{dimensions:o,imageData:r,metadata:l,voxelManager:d}=a,c=Ut(r,E);c[0]=Math.floor(c[0]),c[1]=Math.floor(c[1]),c[2]=Math.floor(c[2]);const u=Ut(r,I);if(u[0]=Math.floor(u[0]),u[1]=Math.floor(u[1]),u[2]=Math.floor(u[2]),this._isInsideVolume(c,u,o)){const n=[[Math.min(c[0],u[0]),Math.max(c[0],u[0])],[Math.min(c[1],u[1]),Math.max(c[1],u[1])],[Math.min(c[2],u[2]),Math.max(c[2],u[2])]],o=[(v[0]+p[0])/2,(v[1]+p[1])/2,(v[2]+p[2])/2],m=Math.abs(v[0]-p[0])/2,w=Math.abs(v[1]-p[1])/2,C=Math.abs(v[2]-p[2])/2,b={center:o,xRadius:m<s.EPSILON/2?0:m,yRadius:w<s.EPSILON/2?0:w,zRadius:C<s.EPSILON/2?0:C},{worldWidth:_,worldHeight:T}=(0,Mt.A)(h,g,E,I),S=0===_&&0===T,D=[c,u],{scale:A,unit:M,areaUnit:y}=(0,R.Op)(a,D),x=(0,R.CQ)(a),P=Math.abs(Math.PI*(_/A/2)*(T/x/A/2)),L={isPreScaled:(0,Ct.u)(t,i),isSuvScaled:this.isSuvScaled(t,i,e.metadata.referencedImageId)},U=(0,J.j)(l.Modality,e.metadata.referencedImageId,L),O=d.forEach(this.configuration.statsCalculator.statsCallback,{isInObject:e=>(0,yt.pointInEllipse)(b,e,{fast:!0}),boundsIJK:n,imageData:r,returnPoints:this.configuration.storePointData}),k=this.configuration.statsCalculator.getStatistics();f[i]={Modality:l.Modality,area:P,mean:k.mean?.value,max:k.max?.value,pointsInShape:O,stdDev:k.stdDev?.value,statsArray:k.array,isEmptyArea:S,areaUnit:y,radius:_/2/A,radiusUnit:M,perimeter:2*Math.PI*(_/2)/A,modalityUnit:U}}else this.isHandleOutsideImage=!0,f[i]={Modality:l.Modality}}return e.invalidated=!1,r&&(0,ee.triggerAnnotationModified)(e,o,l.ChangeTypes.StatsUpdated),f},this._isInsideVolume=(e,t,n)=>s.utilities.indexWithinDimensions(e,n)&&s.utilities.indexWithinDimensions(t,n),this._throttledCalculateCachedStats=(0,x.A)(this._calculateCachedStats,100,{trailing:!0})}static{this.hydrate=(e,t,n)=>{const i=(0,s.getEnabledElementByViewportId)(e);if(!i)return;const{FrameOfReferenceUID:a,referencedImageId:o,viewPlaneNormal:l,instance:d,viewport:c}=this.hydrateBase(Ot,i,t,n),h={annotationUID:n?.annotationUID||s.utilities.uuidv4(),data:{handles:{points:t,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:{}},highlighted:!1,autoGenerated:!1,invalidated:!1,isLocked:!1,isVisible:!0,metadata:{toolName:d.getToolName(),viewPlaneNormal:l,FrameOfReferenceUID:a,referencedImageId:o,...n}};(0,r.addAnnotation)(h,c.element),(0,L.A)([c.id])}}}function kt(e,t){const n=e.cachedStats[t],{radius:i,radiusUnit:a,area:o,mean:r,stdDev:l,max:d,isEmptyArea:c,areaUnit:h,modalityUnit:g}=n,u=[];if(i){const e=c?"Radius: Oblique not supported":`Radius: ${s.utilities.roundNumber(i)} ${a}`;u.push(e)}if(o){const e=c?"Area: Oblique not supported":`Area: ${s.utilities.roundNumber(o)} ${h}`;u.push(e)}return r&&u.push(`Mean: ${s.utilities.roundNumber(r)} ${g}`),d&&u.push(`Max: ${s.utilities.roundNumber(d)} ${g}`),l&&u.push(`Std Dev: ${s.utilities.roundNumber(l)} ${g}`),u}const Nt=Ot;class Vt extends ce.EC{static{this.toolName="ETDRSGrid"}constructor(e={},t={supportedInteractionTypes:["Mouse","Touch"],configuration:{shadow:!0,preventHandleOutsideImage:!1,degrees:[45,135,225,315],diameters:[10,30,60]}}){super(e,t),this.isHandleOutsideImage=!1,this.addNewAnnotation=e=>{const t=e.detail,{currentPoints:n,element:i}=t,a=n.world,o=(0,s.getEnabledElement)(i),{viewport:l,renderingEngine:d}=o;this.isDrawing=!0;const c=l.getCamera(),{viewPlaneNormal:h,viewUp:g}=c,u=this.getReferencedImageId(l,a,h,g),m=l.getFrameOfReferenceUID(),v={highlighted:!0,invalidated:!0,metadata:{toolName:this.getToolName(),viewPlaneNormal:[...h],viewUp:[...g],FrameOfReferenceUID:m,referencedImageId:u,...l.getViewReference({points:[a]})},data:{label:"",handles:{points:[[...a]]}}};(0,r.addAnnotation)(v,i);const p=(0,W.getViewportIdsWithToolToRender)(i,this.getToolName());return this.editData={annotation:v,viewportIdsToRender:p,newAnnotation:!0},this._activateDraw(i),(0,ve.hideElementCursor)(i),e.preventDefault(),(0,L.A)(p),v},this.isPointNearTool=(e,t,n,i)=>{const a=(0,s.getEnabledElement)(e),{viewport:o}=a,{data:r}=t,{points:l}=r.handles,d=o.worldToCanvas(l[0]),c=(0,Ve.getCanvasCircleRadius)([d,n]);return Math.abs(c)<i},this.toolSelectedCallback=(e,t)=>{const n=e.detail,{element:i}=n;t.highlighted=!0;const a=(0,W.getViewportIdsWithToolToRender)(i,this.getToolName());this.editData={annotation:t,viewportIdsToRender:a},(0,ve.hideElementCursor)(i),this._activateModify(i);const o=(0,s.getEnabledElement)(i),{renderingEngine:r}=o;(0,L.A)(a),e.preventDefault()},this.handleSelectedCallback=(e,t)=>{const n=e.detail,{element:i}=n;t.highlighted=!0;const a=(0,W.getViewportIdsWithToolToRender)(i,this.getToolName());this.editData={annotation:t,viewportIdsToRender:a},this._activateModify(i),(0,ve.hideElementCursor)(i);const o=(0,s.getEnabledElement)(i),{renderingEngine:r}=o;(0,L.A)(a),e.preventDefault()},this._endCallback=e=>{const t=e.detail,{element:n}=t,{annotation:i,viewportIdsToRender:a,newAnnotation:o,hasMoved:l}=this.editData,{data:d}=i;if(o&&!l)return;i.highlighted=!1,d.handles.activeHandleIndex=null,this._deactivateModify(n),this._deactivateDraw(n),(0,ve.resetElementCursor)(n);const{renderingEngine:c}=(0,s.getEnabledElement)(n);this.editData=null,this.isDrawing=!1,this.isHandleOutsideImage&&this.configuration.preventHandleOutsideImage&&(0,r.removeAnnotation)(i.annotationUID),(0,L.A)(a),o&&(0,ee.triggerAnnotationCompleted)(i)},this._dragDrawCallback=e=>{this.isDrawing=!0;const t=e.detail,{element:n}=t,{currentPoints:i}=t,a=i.canvas,o=(0,s.getEnabledElement)(n),{renderingEngine:r,viewport:l}=o,{canvasToWorld:d}=l,{annotation:c,viewportIdsToRender:h}=this.editData,{data:g}=c;g.handles.points=[d(a),d(a)],c.invalidated=!0,this.editData.hasMoved=!0,(0,L.A)(h)},this._dragModifyCallback=e=>{this.isDrawing=!0;const t=e.detail,{element:n}=t,{annotation:i,viewportIdsToRender:a}=this.editData,{data:o}=i,{deltaPoints:r}=t,l=r.world;o.handles.points.forEach((e=>{e[0]+=l[0],e[1]+=l[1],e[2]+=l[2]})),i.invalidated=!0;const d=(0,s.getEnabledElement)(n),{renderingEngine:c}=d;(0,L.A)(a)},this._dragHandle=e=>{const t=e.detail,{element:n}=t,i=(0,s.getEnabledElement)(n),{canvasToWorld:a,worldToCanvas:o}=i.viewport,{annotation:r}=this.editData,{data:l}=r,{points:d}=l.handles,c=d.map((e=>o(e))),{currentPoints:h}=t,g=h.canvas,u=g[0]-c[0][0],m=g[1]-c[0][1],v=g,p=[c[1][0]+u,c[1][1]+m];d[0]=a(v),d[1]=a(p)},this.cancel=e=>{if(this.isDrawing){this.isDrawing=!1,this._deactivateDraw(e),this._deactivateModify(e),(0,ve.resetElementCursor)(e);const{annotation:t,viewportIdsToRender:n,newAnnotation:i}=this.editData,{data:a}=t;t.highlighted=!1,a.handles.activeHandleIndex=null;const{renderingEngine:o}=(0,s.getEnabledElement)(e);return(0,L.A)(n),i&&(0,ee.triggerAnnotationCompleted)(t),this.editData=null,t.annotationUID}},this._activateModify=e=>{w.wk.isInteractingWithTool=!0,e.addEventListener(l.Events.MOUSE_UP,this._endCallback),e.addEventListener(l.Events.MOUSE_DRAG,this._dragModifyCallback),e.addEventListener(l.Events.MOUSE_CLICK,this._endCallback),e.addEventListener(l.Events.TOUCH_END,this._endCallback),e.addEventListener(l.Events.TOUCH_DRAG,this._dragModifyCallback),e.addEventListener(l.Events.TOUCH_TAP,this._endCallback)},this._deactivateModify=e=>{w.wk.isInteractingWithTool=!1,e.removeEventListener(l.Events.MOUSE_UP,this._endCallback),e.removeEventListener(l.Events.MOUSE_DRAG,this._dragModifyCallback),e.removeEventListener(l.Events.MOUSE_CLICK,this._endCallback),e.removeEventListener(l.Events.TOUCH_END,this._endCallback),e.removeEventListener(l.Events.TOUCH_DRAG,this._dragModifyCallback),e.removeEventListener(l.Events.TOUCH_TAP,this._endCallback)},this._activateDraw=e=>{w.wk.isInteractingWithTool=!0,e.addEventListener(l.Events.MOUSE_UP,this._endCallback),e.addEventListener(l.Events.MOUSE_DRAG,this._dragDrawCallback),e.addEventListener(l.Events.MOUSE_MOVE,this._dragDrawCallback),e.addEventListener(l.Events.MOUSE_CLICK,this._endCallback),e.addEventListener(l.Events.TOUCH_END,this._endCallback),e.addEventListener(l.Events.TOUCH_DRAG,this._dragDrawCallback),e.addEventListener(l.Events.TOUCH_TAP,this._endCallback)},this._deactivateDraw=e=>{w.wk.isInteractingWithTool=!1,e.removeEventListener(l.Events.MOUSE_UP,this._endCallback),e.removeEventListener(l.Events.MOUSE_DRAG,this._dragDrawCallback),e.removeEventListener(l.Events.MOUSE_MOVE,this._dragDrawCallback),e.removeEventListener(l.Events.MOUSE_CLICK,this._endCallback),e.removeEventListener(l.Events.TOUCH_END,this._endCallback),e.removeEventListener(l.Events.TOUCH_DRAG,this._dragDrawCallback),e.removeEventListener(l.Events.TOUCH_TAP,this._endCallback)},this.renderAnnotation=(e,t)=>{let n=!1;const{viewport:i}=e,{element:a}=i;let o=(0,r.getAnnotations)(this.getToolName(),a);if(!o?.length)return n;if(o=this.filterInteractableAnnotationsForElement(a,o),!o?.length)return n;const s={toolGroupId:this.toolGroupId,toolName:this.getToolName(),viewportId:e.viewport.id};for(let e=0;e<o.length;e++){const a=o[e],{annotationUID:r,data:l}=a,{handles:d}=l,{points:c}=d;s.annotationUID=r;const{color:h,lineWidth:g,lineDash:u}=this.getAnnotationStyle({annotation:a,styleSpecifier:s}),m=c.map((e=>i.worldToCanvas(e)))[0];if(!i.getRenderingEngine())return console.warn("Rendering Engine has been destroyed"),n;if(!(0,Ne.isAnnotationVisible)(r))continue;let v=`${r}-crosshair-vertical`,p=[m[0],m[1]+5],f=[m[0],m[1]-5];(0,M.drawLine)(t,r,v,p,f,{color:h,lineDash:u,lineWidth:g}),v=`${r}-crosshair-horizontal`,p=[m[0]+5,m[1]],f=[m[0]-5,m[1]],(0,M.drawLine)(t,r,v,p,f,{color:h,lineDash:u,lineWidth:g});const w=this.configuration.diameters.map((e=>this.worldMeasureToCanvas(e,i)));for(let e=0;e<w.length;e++){const n=`${r}-circle-${e}`,i=`${r}-circle-${e}`;(0,M.drawCircle)(t,r,i,m,w[e]/2,{color:h,lineDash:u,lineWidth:g},n)}const E=e=>e*Math.PI/180,I=this.configuration.degrees.map((e=>E(e)));for(let e=0;e<I.length;e++){const n=`${r}-line-${e}`,i=[Math.cos(I[e])*w[0]/2+m[0],Math.sin(I[e])*w[0]/2+m[1]],a=[Math.cos(I[e])*w[2]/2+m[0],Math.sin(I[e])*w[2]/2+m[1]];(0,M.drawLine)(t,r,n,i,a,{color:h,lineDash:u,lineWidth:g})}n=!0}return n}}worldMeasureToCanvas(e,t){const n=t.canvasToWorld([t.canvas.width/2,t.canvas.height/2]),{viewUp:i}=t.getCamera(),a=T.eR.scaleAndAdd(T.eR.create(),n,i,e),o=t.worldToCanvas(n),s=t.worldToCanvas(a);return Math.sqrt(Math.pow(s[0]-o[0],2)+Math.pow(s[1]-o[1],2))}}var Wt=n(76910),Bt=n(93126),Ht=n(36320);const Ft={resolution:20,controlPointAdditionDistance:6,controlPointDeletionDistance:6,showControlPointsConnectors:!1,controlPointAdditionEnabled:!0,controlPointDeletionEnabled:!0};var Gt,zt;!function(e){e.Cardinal="CARDINAL",e.Linear="LINEAR",e.CatmullRom="CATMULLROM",e.BSpline="BSPLINE"}(Gt||(Gt={})),function(e){e.AddControlPoint="addControlPoint",e.DeleteControlPoint="deleteControlPoint"}(zt||(zt={}));class $t extends Ht.A{static{this.toolName="SplineROI"}static{this.SplineTypes=Gt}static{this.Actions=zt}constructor(e={},t={supportedInteractionTypes:["Mouse","Touch"],configuration:{preventHandleOutsideImage:!1,calculateStats:!0,getTextLines:jt,contourHoleAdditionModifierKey:l.KeyboardBindings.Shift,decimate:{enabled:!1,epsilon:.1},spline:{configuration:{[Gt.Cardinal]:{Class:re,scale:.5},[Gt.CatmullRom]:{Class:le},[Gt.Linear]:{Class:de},[Gt.BSpline]:{Class:se,controlPointAdditionEnabled:!1,controlPointDeletionEnabled:!1,showControlPointsConnectors:!0}},type:Gt.CatmullRom,drawPreviewEnabled:!0,lastControlPointDeletionKeys:["Backspace","Delete"]},actions:{[zt.AddControlPoint]:{method:"addControlPointCallback",bindings:[{mouseButton:l.MouseBindings.Primary,modifierKey:l.KeyboardBindings.Shift}]},[zt.DeleteControlPoint]:{method:"deleteControlPointCallback",bindings:[{mouseButton:l.MouseBindings.Primary,modifierKey:l.KeyboardBindings.Ctrl}]}}}}){super(e,t),this.isHandleOutsideImage=!1,this.fireChangeOnUpdate=null,this.isPointNearTool=(e,t,n,i)=>{const{instance:a}=t.data.spline;return a.isPointNearCurve(n,i)},this.toolSelectedCallback=(e,t)=>{const n=e.detail,{element:i}=n;t.highlighted=!0;const a=(0,W.getViewportIdsWithToolToRender)(i,this.getToolName());this.editData={annotation:t,viewportIdsToRender:a,movingTextBox:!1},this._activateModify(i),(0,L.A)(a),e.preventDefault()},this.handleSelectedCallback=(e,t,n)=>{const i=e.detail,{element:a}=i,{data:o}=t;t.highlighted=!0;let s,r=!1;if(n.worldPosition)r=!0;else{const{points:e}=o.handles;s=e.findIndex((e=>e===n))}const l=(0,W.getViewportIdsWithToolToRender)(a,this.getToolName());this.editData={annotation:t,viewportIdsToRender:l,handleIndex:s,movingTextBox:r},this._activateModify(a),(0,L.A)(l),e.preventDefault()},this._endCallback=e=>{const t=e.detail,{element:n}=t,{annotation:i,viewportIdsToRender:a,newAnnotation:o,contourHoleProcessingEnabled:d}=this.editData,{data:c}=i;i.autoGenerated=!1,c.handles.activeHandleIndex=null,this._deactivateModify(n),this._deactivateDraw(n),(0,ve.resetElementCursor)(n);const h=(0,s.getEnabledElement)(n),g=this.getTargetImageData(this.getTargetId(h.viewport)),{imageData:u,dimensions:m}=g;this.isHandleOutsideImage=c.handles.points.map((e=>s.utilities.transformWorldToIndex(u,e))).some((e=>!s.utilities.indexWithinDimensions(e,m))),this.isHandleOutsideImage&&this.configuration.preventHandleOutsideImage&&(0,r.removeAnnotation)(i.annotationUID);const v=o?l.ChangeTypes.Completed:l.ChangeTypes.HandlesUpdated;this.fireChangeOnUpdate?(this.fireChangeOnUpdate.annotationUID=i.annotationUID,this.fireChangeOnUpdate.changeType=v):this.fireChangeOnUpdate={annotationUID:i.annotationUID,changeType:v,contourHoleProcessingEnabled:d},(0,L.A)(a),this.doneEditMemo(),this.editData=null,this.isDrawing=!1},this._keyDownCallback=e=>{const t=e.detail,{element:n}=t,i=t.key??"",{lastControlPointDeletionKeys:a}=this.configuration.spline;if(!a.includes(i))return;const{annotation:o}=this.editData,{data:s}=o;if(3!==s.handles.points.length){{const e=s.handles.points.length-1;this._deleteControlPointByIndex(n,o,e)}e.preventDefault()}else this.cancel(n)},this._mouseMoveCallback=e=>{const{drawPreviewEnabled:t}=this.configuration.spline;if(!t)return;const{element:n}=e.detail,{renderingEngine:i}=(0,s.getEnabledElement)(n),a=(0,W.getViewportIdsWithToolToRender)(n,this.getToolName());this.editData.lastCanvasPoint=e.detail.currentPoints.canvas,(0,L.A)(a),e.preventDefault()},this._mouseDownCallback=e=>{const t=e.type===l.Events.MOUSE_DOUBLE_CLICK,{annotation:n,viewportIdsToRender:i}=this.editData,{data:a}=n;if(a.contour.closed)return;this.doneEditMemo();const o=e.detail,{currentPoints:s,element:r}=o,{canvas:d,world:c}=s;let h=a.handles.points.length>=2&&t,g=!0;if(a.handles.points.length&&this.createMemo(r,n,{newAnnotation:1===a.handles.points.length}),a.handles.points.length>=3){this.createMemo(r,n);const{instance:e}=a.spline,t=e.getClosestControlPointWithinDistance(d,10);0===t?.index&&(g=!1,h=!0)}g&&a.handles.points.push(c),a.contour.closed=a.contour.closed||h,n.invalidated=!0,(0,L.A)(i),a.contour.closed&&this._endCallback(e),e.preventDefault()},this._dragCallback=e=>{this.isDrawing=!0;const t=e.detail,{element:n}=t,{annotation:i,viewportIdsToRender:a,handleIndex:o,movingTextBox:r,newAnnotation:l}=this.editData,{data:d}=i;if(this.createMemo(n,i,{newAnnotation:l}),r){const{deltaPoints:e}=t,n=e.world,{textBox:i}=d.handles,{worldPosition:a}=i;a[0]+=n[0],a[1]+=n[1],a[2]+=n[2],i.hasMoved=!0}else if(void 0===o){const{deltaPoints:e}=t,n=e.world;this.moveAnnotation(i,n)}else{const{currentPoints:e}=t,n=e.world;d.handles.points[o]=[...n],i.invalidated=!0}this.editData.hasMoved=!0;const c=(0,s.getEnabledElement)(n),{renderingEngine:h}=c;(0,L.A)(a)},this.triggerAnnotationCompleted=(e,t)=>{const n=l.Events.ANNOTATION_COMPLETED,i={annotation:e,changeType:l.ChangeTypes.Completed,contourHoleProcessingEnabled:t};(0,s.triggerEvent)(s.eventTarget,n,i)},this.triggerAnnotationModified=(e,t,n=l.ChangeTypes.StatsUpdated)=>{const{viewportId:i,renderingEngineId:a}=t,o=l.Events.ANNOTATION_MODIFIED,r={annotation:e,viewportId:i,renderingEngineId:a,changeType:n};(0,s.triggerEvent)(s.eventTarget,o,r)},this.triggerChangeEvent=(e,t,n=l.ChangeTypes.StatsUpdated,i)=>{n===l.ChangeTypes.Completed?this.triggerAnnotationCompleted(e,i):this.triggerAnnotationModified(e,t,n)},this._activateModify=e=>{w.wk.isInteractingWithTool=!0,e.addEventListener(l.Events.MOUSE_UP,this._endCallback),e.addEventListener(l.Events.MOUSE_DRAG,this._dragCallback),e.addEventListener(l.Events.MOUSE_CLICK,this._endCallback),e.addEventListener(l.Events.TOUCH_END,this._endCallback),e.addEventListener(l.Events.TOUCH_DRAG,this._dragCallback),e.addEventListener(l.Events.TOUCH_TAP,this._endCallback)},this._deactivateModify=e=>{w.wk.isInteractingWithTool=!1,e.removeEventListener(l.Events.MOUSE_UP,this._endCallback),e.removeEventListener(l.Events.MOUSE_DRAG,this._dragCallback),e.removeEventListener(l.Events.MOUSE_CLICK,this._endCallback),e.removeEventListener(l.Events.TOUCH_END,this._endCallback),e.removeEventListener(l.Events.TOUCH_DRAG,this._dragCallback),e.removeEventListener(l.Events.TOUCH_TAP,this._endCallback)},this._activateDraw=e=>{w.wk.isInteractingWithTool=!0,e.addEventListener(l.Events.KEY_DOWN,this._keyDownCallback),e.addEventListener(l.Events.MOUSE_MOVE,this._mouseMoveCallback),e.addEventListener(l.Events.MOUSE_DOWN,this._mouseDownCallback),e.addEventListener(l.Events.MOUSE_DOUBLE_CLICK,this._mouseDownCallback),e.addEventListener(l.Events.TOUCH_TAP,this._mouseDownCallback)},this._deactivateDraw=e=>{w.wk.isInteractingWithTool=!1,e.removeEventListener(l.Events.KEY_DOWN,this._keyDownCallback),e.removeEventListener(l.Events.MOUSE_MOVE,this._mouseMoveCallback),e.removeEventListener(l.Events.MOUSE_DOWN,this._mouseDownCallback),e.removeEventListener(l.Events.MOUSE_DOUBLE_CLICK,this._mouseDownCallback),e.removeEventListener(l.Events.TOUCH_TAP,this._mouseDownCallback)},this._renderStats=(e,t,n,i)=>{const a=e.data,o=this.getTargetId(t);if(!a.spline.instance.closed||!i.visibility)return;const s=this.configuration.getTextLines(a,o);if(!s||0===s.length)return;const r=a.handles.points.map((e=>t.worldToCanvas(e)));if(!a.handles.textBox.hasMoved){const e=(0,k.getTextBoxCoordsCanvas)(r);a.handles.textBox.worldPosition=t.canvasToWorld(e)}const l=t.worldToCanvas(a.handles.textBox.worldPosition),d=(0,M.drawLinkedTextBox)(n,e.annotationUID??"","textBox",s,l,r,{},i),{x:c,y:h,width:g,height:u}=d;a.handles.textBox.worldBoundingBox={topLeft:t.canvasToWorld([c,h]),topRight:t.canvasToWorld([c+g,h]),bottomLeft:t.canvasToWorld([c,h+u]),bottomRight:t.canvasToWorld([c+g,h+u])}},this.addControlPointCallback=(e,t)=>{const{data:n}=t,i=n.spline.type,a=this._getSplineConfig(i),o=a.controlPointAdditionDistance;if(!1===a.controlPointAdditionEnabled)return;const r=e.detail,{element:l}=r,d=(0,s.getEnabledElement)(l),{renderingEngine:c,viewport:h}=d,{canvasToWorld:g}=h,{instance:u}=n.spline,m=e.detail.currentPoints.canvas,v=u.getClosestPoint(m);if(v.distance>o)return;const{index:p,point:f}=u.addControlPointAtU(v.uValue);n.handles.points.splice(p,0,g(f)),t.invalidated=!0;const w=(0,W.getViewportIdsWithToolToRender)(l,this.getToolName());(0,L.A)(w)},this.deleteControlPointCallback=(e,t)=>{const n=t.data.spline.type,i=this._getSplineConfig(n),a=i.controlPointDeletionDistance;if(!1===i.controlPointDeletionEnabled)return;const o=e.detail,{element:s,currentPoints:r}=o,{canvas:l}=r,{instance:d}=t.data.spline,c=d.getClosestControlPointWithinDistance(l,a);c&&this._deleteControlPointByIndex(s,t,c.index)},this._calculateCachedStats=(e,t)=>{if(!this.configuration.calculateStats)return;const n=e.data;if(!n.contour.closed)return;const i=(0,s.getEnabledElement)(t);if(!i)return;const{viewport:a}=i,{cachedStats:o}=n,{polyline:r}=n.contour,d=Object.keys(o);for(let e=0;e<d.length;e++){const t=d[e],n=this.getTargetImageData(t);if(!n)continue;const{metadata:i}=n,l=r.map((e=>a.worldToCanvas(e))),c=l[0],h=a.canvasToWorld(c),g=a.canvasToWorld([c[0]+1,c[1]]),u=a.canvasToWorld([c[0],c[1]+1]),m=T.eR.distance(h,g),v=T.eR.distance(h,u),{imageData:p}=n,{scale:f,areaUnit:w}=(0,R.Op)(n,(()=>{const{maxX:e,maxY:t,minX:n,minY:i}=N.polyline.getAABB(l),o=a.canvasToWorld([n,i]),r=s.utilities.transformWorldToIndex(p,o),d=a.canvasToWorld([e,t]);return[r,s.utilities.transformWorldToIndex(p,d)]}));let E=N.polyline.getArea(l)/f/f;E*=m*v,o[t]={Modality:i.Modality,area:E,areaUnit:w}}const c=e.invalidated;return e.invalidated=!1,c&&this.triggerAnnotationModified(e,i,l.ChangeTypes.StatsUpdated),o},this._throttledCalculateCachedStats=(0,x.A)(this._calculateCachedStats,100,{trailing:!0})}addNewAnnotation(e){const t=e.detail,{currentPoints:n,element:i}=t,{canvas:a}=n,o=(0,Wt.A)(e.detail.event)===this.configuration.contourHoleAdditionModifierKey,r=(0,s.getEnabledElement)(i),{renderingEngine:l}=r,d=this.createAnnotation(e);this.isDrawing=!0,this.addAnnotation(d,i);const c=(0,W.getViewportIdsWithToolToRender)(i,this.getToolName());return this.editData={annotation:d,viewportIdsToRender:c,movingTextBox:!1,newAnnotation:!0,hasMoved:!1,lastCanvasPoint:a,contourHoleProcessingEnabled:o},this._activateDraw(i),e.preventDefault(),(0,L.A)(c),d}cancel(e){if(!this.isDrawing)return;this.isDrawing=!1,this._deactivateDraw(e),this._deactivateModify(e),(0,ve.resetElementCursor)(e);const{annotation:t,viewportIdsToRender:n,newAnnotation:i}=this.editData;i&&(0,r.removeAnnotation)(t.annotationUID),super.cancelAnnotation(t);const a=(0,s.getEnabledElement)(e),{renderingEngine:o}=a;return(0,L.A)(n),this.editData=null,t.annotationUID}isContourSegmentationTool(){return!1}renderAnnotationInstance(e){const{enabledElement:t,targetId:n,svgDrawingHelper:i,annotationStyle:a}=e,{viewport:o}=t,{worldToCanvas:s}=o,{element:l}=o,d=e.annotation,{annotationUID:c,data:h,highlighted:g}=d,{handles:u}=h,{points:m,activeHandleIndex:v}=u,p=this.editData?.newAnnotation,{lineWidth:f,lineDash:w,color:E,locked:I}=a,C=m.map((e=>s(e))),{drawPreviewEnabled:b}=this.configuration.spline,_=d.data.spline.type,T=this._getSplineConfig(_),S=d.data.spline.instance,D=(0,r.getChildAnnotations)(d);if(-1!==D.findIndex((e=>!e)))throw new Error(`Can't find annotation for child ${d.childAnnotationUIDs.join()}`);let A;if([d,...D].filter((e=>this._isSplineROIAnnotation(e))).forEach((e=>{const t=this._updateSplineInstance(l,e).getPolylinePoints();this.updateContourPolyline(e,{points:t,closed:h.contour.closed,targetWindingDirection:Bt.W.Clockwise},o,{updateWindingDirection:h.contour.closed})})),super.renderAnnotationInstance(e),h.cachedStats[n]&&null!=h.cachedStats[n].areaUnit?d.invalidated&&this._throttledCalculateCachedStats(d,l):(h.cachedStats[n]={Modality:null,area:null,areaUnit:null},this._calculateCachedStats(d,l)),I||this.editData||null===v||(A=[C[v]]),A||p||g){const e="0";(0,M.drawHandles)(i,c,e,C,{color:E,lineWidth:f,handleRadius:"3"})}if(b&&S.numControlPoints>1&&this.editData?.lastCanvasPoint&&!S.closed){const{lastCanvasPoint:e}=this.editData,t=S.getPreviewPolylinePoints(e,10);(0,M.drawPolyline)(i,c,"previewSplineChange",t,{color:"#9EA0CA",lineDash:w,lineWidth:1})}if(T.showControlPointsConnectors){const e=[...C];S.closed&&e.push(C[0]),(0,M.drawPolyline)(i,c,"controlPointsConnectors",e,{color:"rgba(255, 255, 255, 0.5)",lineWidth:1})}return this._renderStats(d,o,i,a.textbox),this.fireChangeOnUpdate?.annotationUID===c&&(this.triggerChangeEvent(d,t,this.fireChangeOnUpdate.changeType,this.fireChangeOnUpdate.contourHoleProcessingEnabled),this.fireChangeOnUpdate=null),d.invalidated=!1,!0}createInterpolatedSplineControl(e){if(e.data.handles.points?.length)return;const{polyline:t}=e.data.contour;if(!t||!t.length)return;e.data.handles.points=[];const{points:n}=e.data.handles,i=Math.max(10,Math.floor(t.length/20));for(let e=0;e<t.length-i;e+=i)n.push(t[e]);n.push(t[t.length-1])}createAnnotation(e){const t=super.createAnnotation(e),{world:n}=e.detail.currentPoints,{type:i}=this.configuration.spline,a=this._getSplineConfig(i),o=new a.Class,r=()=>({type:a.type,instance:o,resolution:a.resolution});let l;return this.configuration.interpolation?.enabled&&(l=e=>{e.data.spline||=r(),this.createInterpolatedSplineControl(e)}),s.utilities.deepMerge(t,{data:{handles:{points:[[...n]]},spline:r(),cachedStats:{}},onInterpolationComplete:l})}_deleteControlPointByIndex(e,t,n){const i=(0,s.getEnabledElement)(e),{points:a}=t.data.handles;3===a.length?(0,r.removeAnnotation)(t.annotationUID):a.splice(n,1);const{renderingEngine:o}=i,l=(0,W.getViewportIdsWithToolToRender)(e,this.getToolName());t.invalidated=!0,(0,L.A)(l)}_isSplineROIAnnotation(e){return!!e.data?.spline}_getSplineConfig(e){const{configuration:t}=this,n=t.spline.configuration;return Object.assign({type:e},Ft,n[e])}_updateSplineInstance(e,t){const n=(0,s.getEnabledElement)(e),{viewport:i}=n,{worldToCanvas:a}=i,{data:o}=t,{type:r,instance:l}=t.data.spline,d=this._getSplineConfig(r),c=o.handles.points.map(a),h=void 0!==d.resolution?parseInt(d.resolution):void 0,g=void 0!==d.scale?parseFloat(d.scale):void 0;return l.setControlPoints(c),l.closed=!!o.contour.closed,l.fixedResolution||void 0===h||l.resolution===h||(l.resolution=h,t.invalidated=!0),l instanceof re&&!l.fixedScale&&void 0!==g&&l.scale!==g&&(l.scale=g,t.invalidated=!0),l}static{this.hydrate=(e,t,n)=>{const i=(0,s.getEnabledElementByViewportId)(e);if(!i)return;if(t.length<3)return void console.warn("Spline requires at least 3 control points");const{FrameOfReferenceUID:a,referencedImageId:o,viewPlaneNormal:l,viewUp:d,instance:c,viewport:h}=this.hydrateBase($t,i,t,n),g=n?.splineType||Gt.CatmullRom,u=new(0,c._getSplineConfig(g).Class),m={annotationUID:n?.annotationUID||s.utilities.uuidv4(),data:{handles:{points:t},label:"",cachedStats:{},spline:{type:g,instance:u},contour:{closed:!0}},highlighted:!1,autoGenerated:!1,invalidated:!0,isLocked:!1,isVisible:!0,metadata:{toolName:c.getToolName(),viewPlaneNormal:l,FrameOfReferenceUID:a,referencedImageId:o,...n}};(0,r.addAnnotation)(m,h.element),(0,L.A)([h.id])}}}function jt(e,t){const n=e.cachedStats[t],{area:i,isEmptyArea:a,areaUnit:o}=n,r=[];if(i){const e=a?"Area: Oblique not supported":`Area: ${s.utilities.roundNumber(i)} ${o}`;r.push(e)}return r}const qt=$t;class Kt extends qt{static{this.toolName="SplineContourSegmentationTool"}constructor(e){super(s.utilities.deepMerge({configuration:{calculateStats:!1}},e))}isContourSegmentationTool(){return!0}}n(28220),n(37590);var Zt=n(98013),Yt=n(78044),Xt=n(38776);class Jt extends Ht.A{static{this.toolName="LivewireContour"}constructor(e={},t={supportedInteractionTypes:["Mouse","Touch"],configuration:{getTextLines:en,calculateStats:!0,preventHandleOutsideImage:!1,contourHoleAdditionModifierKey:l.KeyboardBindings.Shift,snapHandleNearby:2,interpolation:{enabled:!1,nearestEdge:2,showInterpolationPolyline:!1},decimate:{enabled:!1,epsilon:.1},actions:{cancelInProgress:{method:"cancelInProgress",bindings:[{key:"Escape"}]}}}}){super(e,t),this.isHandleOutsideImage=!1,this.isPointNearTool=(e,t,n,i)=>{const a=(0,s.getEnabledElement)(e),{viewport:o}=a,r=i*i,l=t.data.contour.polyline.map((e=>o.worldToCanvas(e)));let d=l[l.length-1];for(let e=0;e<l.length;e++){const t=l[e];if(N.lineSegment.distanceToPointSquared(d,t,n)<=r)return!0;d=t}return!1},this.toolSelectedCallback=(e,t)=>{const n=e.detail,{element:i}=n;t.highlighted=!0;const a=(0,W.getViewportIdsWithToolToRender)(i,this.getToolName());this.editData={annotation:t,viewportIdsToRender:a,movingTextBox:!1};const o=(0,s.getEnabledElement)(i),{renderingEngine:r}=o;this._activateModify(i),(0,L.A)(a),e.preventDefault()},this.handleSelectedCallback=(e,t,n)=>{const i=e.detail,{element:a}=i,{data:o}=t;t.highlighted=!0;let r,l=!1;if(n.worldPosition)l=!0;else{const{points:e}=o.handles;r=e.findIndex((e=>e===n))}const d=(0,W.getViewportIdsWithToolToRender)(a,this.getToolName());this.editData={annotation:t,viewportIdsToRender:d,handleIndex:r,movingTextBox:l},this._activateModify(a);const c=(0,s.getEnabledElement)(a),{renderingEngine:h}=c;(0,L.A)(d),e.preventDefault()},this._endCallback=(e,t=!1)=>{const n=e.detail,{element:i}=n,{annotation:a,viewportIdsToRender:o,newAnnotation:d,contourHoleProcessingEnabled:c}=this.editData,{data:h}=a;this.doneEditMemo(),h.handles.activeHandleIndex=null,this._deactivateModify(i),this._deactivateDraw(i),(0,ve.resetElementCursor)(i);const g=(0,s.getEnabledElement)(i);if(this.isHandleOutsideImage&&this.configuration.preventHandleOutsideImage||t)return(0,r.removeAnnotation)(a.annotationUID),this.clearEditData(),void(0,L.A)(o);(0,L.A)(o);const u=d?l.ChangeTypes.Completed:l.ChangeTypes.HandlesUpdated;this.triggerChangeEvent(a,g,u,c),this.clearEditData()},this.triggerChangeEvent=(e,t,n=l.ChangeTypes.StatsUpdated,i=!1)=>{n===l.ChangeTypes.Completed?(0,ee.triggerContourAnnotationCompleted)(e,i):(0,ee.triggerAnnotationModified)(e,t.viewport.element,n)},this._mouseDownCallback=e=>{const t=e.type===l.Events.MOUSE_DOUBLE_CLICK,{annotation:n,viewportIdsToRender:i,worldToSlice:a,sliceToWorld:o,newAnnotation:r}=this.editData;if(this.editData.closed)return;const d=e.detail,{element:c}=d,{currentPoints:h}=d,{canvas:g,world:u}=h;let m=u;const v=(0,s.getEnabledElement)(c),{viewport:p,renderingEngine:f}=v,w=this.editData.currentPath.getControlPoints();let E=w.length>=2&&t;if(this.doneEditMemo(),this.createMemo(c,n,{newAnnotation:r&&1===w.length}),w.length>=2){const e={index:-1,distSquared:1/0};for(let t=0,n=w.length;t<n;t++){const n=o(w[t]),i=p.worldToCanvas(n),a=N.point.distanceToPointSquared(g,i);a<=100&&a<e.distSquared&&(e.distSquared=a,e.index=t)}0===e.index&&(E=!0)}const{snapHandleNearby:I}=this.configuration;if(I&&!this.editData.closed){const e=new Xt.j,t=this.scissors.findMinNearby(a(u),1),n=this.scissors.findPathToPoint(t);e.addPoints(n),e.prependPath(this.editData.confirmedPath),m=o(t),this.editData.currentPath=e}this.editData.closed=this.editData.closed||E,this.editData.confirmedPath=this.editData.currentPath;const C=this.editData.currentPath.getLastPoint();this.editData.confirmedPath.addControlPoint(C),n.data.handles.points.push(o(C)),this.scissors.startSearch(a(m)),n.invalidated=!0,(0,L.A)(i),this.editData.closed&&(this.updateAnnotation(this.editData.confirmedPath),this._endCallback(e)),e.preventDefault()},this._mouseMoveCallback=e=>{const{element:t,currentPoints:n}=e.detail,{world:i,canvas:a}=n,{renderingEngine:o}=(0,s.getEnabledElement)(t),r=(0,W.getViewportIdsWithToolToRender)(t,this.getToolName());this.editData.lastCanvasPoint=a;const{width:l,height:d}=this.scissors,{worldToSlice:c}=this.editData,h=c(i);if(h[0]<0||h[1]<0||h[0]>=l||h[1]>=d)return;const g=this.scissors.findPathToPoint(h),u=new Xt.j;u.addPoints(g),u.prependPath(this.editData.confirmedPath),this.editData.currentPath=u,(0,L.A)(r),e.preventDefault()},this._dragCallback=e=>{this.isDrawing=!0;const t=e.detail,{element:n}=t,{annotation:i,viewportIdsToRender:a,movingTextBox:o,handleIndex:r,newAnnotation:l}=this.editData;this.createMemo(n,i,{newAnnotation:l});const{data:d}=i;if(o){const{deltaPoints:e}=t,n=e.world,{textBox:i}=d.handles,{worldPosition:a}=i;a[0]+=n[0],a[1]+=n[1],a[2]+=n[2],i.hasMoved=!0}else if(void 0===r)console.warn("Drag annotation not implemented");else{const{currentPoints:e}=t,a=e.world;this.editHandle(a,n,i,r)}this.editData.hasMoved=!0;const c=(0,s.getEnabledElement)(n),{renderingEngine:h}=c;(0,L.A)(a)},this.cancel=e=>{if(!this.isDrawing)return;this.isDrawing=!1,this._deactivateDraw(e),this._deactivateModify(e),(0,ve.resetElementCursor)(e);const{annotation:t,viewportIdsToRender:n,newAnnotation:i}=this.editData;return i&&(0,r.removeAnnotation)(t.annotationUID),(0,L.A)(n),this.doneEditMemo(),this.scissors=null,t.annotationUID},this._activateModify=e=>{w.wk.isInteractingWithTool=!0,e.addEventListener(l.Events.MOUSE_UP,this._endCallback),e.addEventListener(l.Events.MOUSE_DRAG,this._dragCallback),e.addEventListener(l.Events.MOUSE_CLICK,this._endCallback),e.addEventListener(l.Events.TOUCH_END,this._endCallback),e.addEventListener(l.Events.TOUCH_DRAG,this._dragCallback),e.addEventListener(l.Events.TOUCH_TAP,this._endCallback)},this._deactivateModify=e=>{w.wk.isInteractingWithTool=!1,e.removeEventListener(l.Events.MOUSE_UP,this._endCallback),e.removeEventListener(l.Events.MOUSE_DRAG,this._dragCallback),e.removeEventListener(l.Events.MOUSE_CLICK,this._endCallback),e.removeEventListener(l.Events.TOUCH_END,this._endCallback),e.removeEventListener(l.Events.TOUCH_DRAG,this._dragCallback),e.removeEventListener(l.Events.TOUCH_TAP,this._endCallback)},this._activateDraw=e=>{w.wk.isInteractingWithTool=!0,e.addEventListener(l.Events.MOUSE_MOVE,this._mouseMoveCallback),e.addEventListener(l.Events.MOUSE_DOWN,this._mouseDownCallback),e.addEventListener(l.Events.MOUSE_DOUBLE_CLICK,this._mouseDownCallback),e.addEventListener(l.Events.TOUCH_TAP,this._mouseDownCallback)},this._deactivateDraw=e=>{w.wk.isInteractingWithTool=!1,e.removeEventListener(l.Events.MOUSE_MOVE,this._mouseMoveCallback),e.removeEventListener(l.Events.MOUSE_DOWN,this._mouseDownCallback),e.removeEventListener(l.Events.MOUSE_DOUBLE_CLICK,this._mouseDownCallback),e.removeEventListener(l.Events.TOUCH_TAP,this._mouseDownCallback)},this._calculateCachedStats=(e,t)=>{if(!this.configuration.calculateStats)return;const n=e.data;if(!n.contour.closed)return;const i=(0,s.getEnabledElement)(t),{viewport:a,renderingEngine:o}=i,{cachedStats:r}=n,{polyline:d}=n.contour,c=Object.keys(r);for(let e=0;e<c.length;e++){const t=c[e],n=this.getTargetImageData(t);if(!n)continue;const{metadata:i}=n,o=d.map((e=>a.worldToCanvas(e))),l=o[0],h=a.canvasToWorld(l),g=a.canvasToWorld([l[0]+1,l[1]]),u=a.canvasToWorld([l[0],l[1]+1]),m=T.eR.distance(h,g),v=T.eR.distance(h,u),{imageData:p}=n,{scale:f,areaUnit:w}=(0,R.Op)(n,(()=>{const{maxX:e,maxY:t,minX:n,minY:i}=N.polyline.getAABB(o),r=a.canvasToWorld([n,i]),l=s.utilities.transformWorldToIndex(p,r),d=a.canvasToWorld([e,t]);return[l,s.utilities.transformWorldToIndex(p,d)]}));let E=N.polyline.getArea(o)/f/f;E*=m*v,r[t]={Modality:i.Modality,area:E,areaUnit:w}}const h=e.invalidated;return e.invalidated=!1,h&&this.triggerAnnotationModified(e,i,l.ChangeTypes.StatsUpdated),r},this._renderStats=(e,t,n,i)=>{const a=e.data,o=this.getTargetId(t);if(!a.contour.closed||!i.visibility)return;const s=this.configuration.getTextLines(a,o);if(!s||0===s.length)return;const r=a.handles.points.map((e=>t.worldToCanvas(e)));if(!a.handles.textBox.hasMoved){const e=(0,k.getTextBoxCoordsCanvas)(r);a.handles.textBox.worldPosition=t.canvasToWorld(e)}const l=t.worldToCanvas(a.handles.textBox.worldPosition),d=(0,M.drawLinkedTextBox)(n,e.annotationUID??"","textBox",s,l,r,{},i),{x:c,y:h,width:g,height:u}=d;a.handles.textBox.worldBoundingBox={topLeft:t.canvasToWorld([c,h]),topRight:t.canvasToWorld([c+g,h]),bottomLeft:t.canvasToWorld([c,h+u]),bottomRight:t.canvasToWorld([c+g,h+u])}},this.triggerAnnotationModified=(e,t,n=l.ChangeTypes.StatsUpdated)=>{const{viewportId:i,renderingEngineId:a}=t,o=l.Events.ANNOTATION_MODIFIED,r={annotation:e,viewportId:i,renderingEngineId:a,changeType:n};(0,s.triggerEvent)(s.eventTarget,o,r)},this._throttledCalculateCachedStats=(0,x.A)(this._calculateCachedStats,100,{trailing:!0})}setupBaseEditData(e,t,n,i,a){const o=(0,s.getEnabledElement)(t),{viewport:r}=o;this.isDrawing=!0;const l=r.getImageData(),{imageData:d}=l;let c,h,g,u,m;if(r instanceof s.VolumeViewport){if(!(r instanceof s.VolumeViewport))throw new Error("Viewport not supported");{const e=s.utilities.getCurrentVolumeViewportSlice(r),{sliceToIndexMatrix:t,indexToSliceMatrix:n}=e;c=e=>{const t=s.utilities.transformWorldToIndex(d,e),i=T.eR.transformMat4([0,0,0],t,n);return[i[0],i[1]]},h=e=>{const n=T.eR.transformMat4([0,0,0],[e[0],e[1],0],t);return s.utilities.transformIndexToWorld(d,n)},m=e.scalarData,g=e.width,u=e.height}}else g=l.dimensions[0],u=l.dimensions[1],c=e=>{const t=s.utilities.transformWorldToIndex(d,e);return[t[0],t[1]]},h=e=>s.utilities.transformIndexToWorld(d,[e[0],e[1],0]),m=l.scalarData;m=s.utilities.convertToGrayscale(m,g,u);const{voiRange:v}=r.getProperties(),p=c(e);this.scissors=Yt.f.createInstanceFromRawPixelData(m,g,u,v),i&&(this.scissorsNext=Yt.f.createInstanceFromRawPixelData(m,g,u,v),this.scissorsNext.startSearch(c(i))),this.scissors.startSearch(p);const f=!i,w=new Xt.j,E=new Xt.j,I=f?void 0:new Xt.j;w.addPoint(p),w.addControlPoint(p);const C=(0,W.getViewportIdsWithToolToRender)(t,this.getToolName()),b=r.worldToCanvas(e);this.editData={annotation:n,viewportIdsToRender:C,newAnnotation:f,hasMoved:!1,lastCanvasPoint:b,confirmedPath:w,currentPath:E,confirmedPathNext:I,closed:!1,handleIndex:this.editData?.handleIndex??n.handles?.activeHandleIndex,worldToSlice:c,sliceToWorld:h,contourHoleProcessingEnabled:a}}addNewAnnotation(e){const t=e.detail,{currentPoints:n,element:i}=t,{world:a}=n,o=this.createAnnotation(e),s=(0,Wt.A)(e.detail.event)===this.configuration.contourHoleAdditionModifierKey;return this.setupBaseEditData(a,i,o,void 0,s),this.addAnnotation(o,i),this._activateDraw(i),e.preventDefault(),(0,L.A)(this.editData.viewportIdsToRender),o}clearEditData(){this.editData=null,this.scissors=null,this.scissorsNext=null,this.isDrawing=!1}editHandle(e,t,n,i){const{data:a}=n,{points:o}=a.handles,{length:s}=o,r=o[(i-1+s)%s],l=o[(i+1)%s];if(!this.editData?.confirmedPathNext){this.setupBaseEditData(r,t,n,l);const{polyline:e}=a.contour,o=new Xt.j,s=new Xt.j,{worldToSlice:d}=this.editData,c=(0,Zt.A)(n,i-1),h=(0,Zt.A)(n,i+1);if(-1===h||-1===c)throw new Error(`Can't find handle index ${-1===h&&l} ${-1===c&&r}`);0===i?s.addPoints(e.slice(h+1,c).map(d)):(o.addPoints(e.slice(0,c+1).map(d)),s.addPoints(e.slice(h,e.length).map(d))),this.editData.confirmedPath=o,this.editData.confirmedPathNext=s}const{editData:d,scissors:c}=this,{worldToSlice:h,sliceToWorld:g}=d,{activeHandleIndex:u}=a.handles;if(null==u)a.handles.activeHandleIndex=i;else if(u!==i)throw new Error(`Trying to edit a different handle than the one currently being edited ${i}!==${a.handles.activeHandleIndex}`);const m=h(e);if(m[0]<0||m[0]>=c.width||m[1]<0||m[1]>=c.height)return;o[i]=g(m);const v=c.findPathToPoint(m),p=this.scissorsNext.findPathToPoint(m),f=new Xt.j;f.prependPath(d.confirmedPath),0!==i&&f.addPoints(v),f.addPoints(p.reverse()),f.appendPath(d.confirmedPathNext),0===i&&f.addPoints(v),d.currentPath=f,n.invalidated=!0,d.hasMoved=!0,d.closed=!0}renderAnnotation(e,t){return this.updateAnnotation(this.editData?.currentPath),super.renderAnnotation(e,t)}isContourSegmentationTool(){return!1}createAnnotation(e){const t=super.createAnnotation(e),{world:n}=e.detail.currentPoints;return s.utilities.deepMerge(t,{data:{handles:{points:[[...n]]}}})}cancelInProgress(e,t,n){this.editData?this._endCallback(n,!0):this.undo()}renderAnnotationInstance(e){const{annotation:t,enabledElement:n,svgDrawingHelper:i,annotationStyle:a,targetId:o}=e,{viewport:s}=n,{element:r}=s,{worldToCanvas:l}=s,{annotationUID:d,data:c,highlighted:h}=t,{handles:g}=c,u=this.editData?.newAnnotation,{lineWidth:m,lineDash:v,color:p}=a;if(h||u&&t.annotationUID===this.editData?.annotation?.annotationUID){const e="0",t=g.points.map(l);(0,M.drawHandles)(i,d,e,t,{color:p,lineDash:v,lineWidth:m})}return super.renderAnnotationInstance(e),c.cachedStats[o]&&null!==c.cachedStats[o]?.areaUnit?t.invalidated&&this._throttledCalculateCachedStats(t,r):(c.cachedStats[o]={Modality:null,area:null,areaUnit:null},this._calculateCachedStats(t,r)),this._renderStats(t,s,i,a.textbox),!0}updateAnnotation(e){if(!this.editData||!e)return;const{annotation:t,sliceToWorld:n,worldToSlice:i,closed:a,newAnnotation:o}=this.editData;let{pointArray:s}=e;s.length>1&&(s=[...s,s[0]]);const r=o&&a?Bt.W.Clockwise:void 0;this.updateContourPolyline(t,{points:s,closed:a,targetWindingDirection:r},{canvasToWorld:n,worldToCanvas:i})}}const Qt=Jt;function en(e,t){const n=e.cachedStats[t],{area:i,areaUnit:a}=n,o=[];if(i){const e=`Area: ${s.utilities.roundNumber(i)} ${a}`;o.push(e)}return o}class tn extends Qt{static{this.toolName="LivewireContourSegmentationTool"}updateInterpolatedAnnotation(e,t){!this.editData&&e.invalidated&&e.data.handles.interpolationSources&&(e.data.contour.originalPolyline=e.data.contour.polyline,queueMicrotask((()=>{if(!e.data.handles.interpolationSources)return;const{points:n}=e.data.handles,{element:i}=t.viewport;this.setupBaseEditData(n[0],i,e);const{length:a}=n,{scissors:o}=this,{nearestEdge:r,repeatInterpolation:d}=this.configuration.interpolation;e.data.handles.originalPoints=n;const{worldToSlice:c,sliceToWorld:h}=this.editData,g=[];if(r){let e=c(n[n.length-1]);n.forEach(((t,i)=>{const a=c(t);e=a,g.push(a),o.startSearch(e),o.findPathToPoint(a),o.findPathToPoint(c(n[(i+3)%n.length]));const l=o.findMinNearby(a,r);s.utilities.isEqual(a,l)||(g[i]=l,e=l,n[i]=h(l))}))}const u=new Xt.j;for(let e=0;e<a;e++){o.startSearch(c(n[e]));const t=o.findPathToPoint(c(n[(e+1)%a]));u.addPoints(t)}this.updateAnnotation(u),this.scissors=null,this.scissorsNext=null,this.editData=null,e.data.handles.interpolationSources=null,d&&(0,ee.triggerAnnotationModified)(e,t.viewport.element,l.ChangeTypes.InterpolationUpdated)})))}renderAnnotationInstance(e){const{enabledElement:t,svgDrawingHelper:n}=e,i=e.annotation,{annotationUID:a}=i,{viewport:o}=t,{worldToCanvas:s}=o,{showInterpolationPolyline:r}=this.configuration.interpolation||{};this.updateInterpolatedAnnotation?.(i,t);const{originalPolyline:l}=i.data.contour,d=super.renderAnnotationInstance(e);if(r&&l&&i.autoGenerated){const e=l.map(s);e.push(e[0]),(0,M.drawPolyline)(n,a,"interpolationContour-0",e,{color:"#70ffff",lineWidth:1,fillOpacity:0})}return d}isContourSegmentationTool(){return!0}}class nn extends ce.EC{static{this.toolName="ArrowAnnotate"}constructor(e={},t={supportedInteractionTypes:["Mouse","Touch"],configuration:{shadow:!0,getTextCallback:an,changeTextCallback:on,preventHandleOutsideImage:!1,arrowFirst:!0,arrowHeadStyle:"legacy"}}){super(e,t),this.addNewAnnotation=e=>{const t=e.detail,{currentPoints:n,element:i}=t,a=n.world,o=(0,s.getEnabledElement)(i),{viewport:l,renderingEngine:d}=o;(0,ve.hideElementCursor)(i),this.isDrawing=!0;const c=l.getCamera(),{viewPlaneNormal:h,viewUp:g}=c,u=this.getReferencedImageId(l,a,h,g),{arrowFirst:m}=this.configuration,v=l.getFrameOfReferenceUID(),p={highlighted:!0,invalidated:!0,metadata:{toolName:this.getToolName(),viewPlaneNormal:[...h],viewUp:[...g],FrameOfReferenceUID:v,referencedImageId:u,...l.getViewReference({points:[a]})},data:{text:"",handles:{points:[[...a],[...a]],activeHandleIndex:null,arrowFirst:m,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:""}};(0,r.addAnnotation)(p,i);const f=(0,W.getViewportIdsWithToolToRender)(i,this.getToolName());return this.editData={annotation:p,viewportIdsToRender:f,handleIndex:1,movingTextBox:!1,newAnnotation:!0,hasMoved:!1},this._activateDraw(i),e.preventDefault(),(0,L.A)(f),p},this.isPointNearTool=(e,t,n,i)=>{const a=(0,s.getEnabledElement)(e),{viewport:o}=a,{data:r}=t,[l,d]=r.handles.points,c=o.worldToCanvas(l),h=o.worldToCanvas(d),g={start:{x:c[0],y:c[1]},end:{x:h[0],y:h[1]}};return Te.distanceToPoint([g.start.x,g.start.y],[g.end.x,g.end.y],[n[0],n[1]])<=i},this.toolSelectedCallback=(e,t)=>{const n=e.detail,{element:i}=n;t.highlighted=!0;const a=(0,W.getViewportIdsWithToolToRender)(i,this.getToolName());this.editData={annotation:t,viewportIdsToRender:a,movingTextBox:!1},this._activateModify(i),(0,ve.hideElementCursor)(i);const o=(0,s.getEnabledElement)(i),{renderingEngine:r}=o;(0,L.A)(a),e.preventDefault()},this._endCallback=e=>{const t=e.detail,{element:n}=t,{annotation:i,viewportIdsToRender:a,newAnnotation:o,hasMoved:s,movingTextBox:d}=this.editData,{data:c}=i;o&&!s||(c.handles.activeHandleIndex=null,this._deactivateModify(n),this._deactivateDraw(n),(0,ve.resetElementCursor)(n),this.isHandleOutsideImage&&this.configuration.preventHandleOutsideImage&&(0,r.removeAnnotation)(i.annotationUID),o?this.configuration.getTextCallback((e=>{if(!e)return(0,r.removeAnnotation)(i.annotationUID),(0,L.A)(a),this.editData=null,void(this.isDrawing=!1);i.data.text=e,(0,ee.triggerAnnotationModified)(i,n,l.ChangeTypes.HandlesUpdated),(0,ee.triggerAnnotationCompleted)(i),this.createMemo(n,i,{newAnnotation:!!this.memo}),te(i,n,e),(0,L.A)(a)})):d||(0,ee.triggerAnnotationModified)(i,n,l.ChangeTypes.HandlesUpdated),this.doneEditMemo(),this.editData=null,this.isDrawing=!1)},this._dragCallback=e=>{this.isDrawing=!0;const t=e.detail,{element:n}=t,{annotation:i,viewportIdsToRender:a,handleIndex:o,movingTextBox:s,newAnnotation:r}=this.editData;this.createMemo(n,i,{newAnnotation:r});const{data:d}=i;if(s){const{deltaPoints:e}=t,n=e.world,{textBox:i}=d.handles,{worldPosition:a}=i;a[0]+=n[0],a[1]+=n[1],a[2]+=n[2],i.hasMoved=!0}else if(void 0===o){const{deltaPoints:e}=t,n=e.world;d.handles.points.forEach((e=>{e[0]+=n[0],e[1]+=n[1],e[2]+=n[2]})),i.invalidated=!0}else{const{currentPoints:e}=t,n=e.world;d.handles.points[o]=[...n],i.invalidated=!0}this.editData.hasMoved=!0,(0,L.A)(a),i.invalidated&&(0,ee.triggerAnnotationModified)(i,n,l.ChangeTypes.HandlesUpdated)},this.touchTapCallback=e=>{2==e.detail.taps&&this.doubleClickCallback(e)},this.doubleClickCallback=e=>{const t=e.detail,{element:n}=t;let i=(0,r.getAnnotations)(this.getToolName(),n);if(i=this.filterInteractableAnnotationsForElement(n,i),!i?.length)return;const a=i.find((e=>this.isPointNearTool(n,e,t.currentPoints.canvas,6)));if(!a)return;const o=a;this.configuration.changeTextCallback(a,e.detail,this._doneChangingTextCallback.bind(this,n,o)),this.editData=null,this.isDrawing=!1,e.stopImmediatePropagation(),e.preventDefault()},this.cancel=e=>{if(this.isDrawing){this.isDrawing=!1,this._deactivateDraw(e),this._deactivateModify(e),(0,ve.resetElementCursor)(e);const{annotation:t,viewportIdsToRender:n,newAnnotation:i}=this.editData,{data:a}=t;return t.highlighted=!1,a.handles.activeHandleIndex=null,(0,L.A)(n),i&&(0,ee.triggerAnnotationCompleted)(t),this.editData=null,t.annotationUID}},this._activateModify=e=>{w.wk.isInteractingWithTool=!0,e.addEventListener(l.Events.MOUSE_UP,this._endCallback),e.addEventListener(l.Events.MOUSE_DRAG,this._dragCallback),e.addEventListener(l.Events.MOUSE_CLICK,this._endCallback),e.addEventListener(l.Events.TOUCH_TAP,this._endCallback),e.addEventListener(l.Events.TOUCH_END,this._endCallback),e.addEventListener(l.Events.TOUCH_DRAG,this._dragCallback)},this._deactivateModify=e=>{w.wk.isInteractingWithTool=!1,e.removeEventListener(l.Events.MOUSE_UP,this._endCallback),e.removeEventListener(l.Events.MOUSE_DRAG,this._dragCallback),e.removeEventListener(l.Events.MOUSE_CLICK,this._endCallback),e.removeEventListener(l.Events.TOUCH_TAP,this._endCallback),e.removeEventListener(l.Events.TOUCH_DRAG,this._dragCallback),e.removeEventListener(l.Events.TOUCH_END,this._endCallback)},this._activateDraw=e=>{w.wk.isInteractingWithTool=!0,e.addEventListener(l.Events.MOUSE_UP,this._endCallback),e.addEventListener(l.Events.MOUSE_DRAG,this._dragCallback),e.addEventListener(l.Events.MOUSE_MOVE,this._dragCallback),e.addEventListener(l.Events.MOUSE_CLICK,this._endCallback),e.addEventListener(l.Events.TOUCH_TAP,this._endCallback),e.addEventListener(l.Events.TOUCH_END,this._endCallback),e.addEventListener(l.Events.TOUCH_DRAG,this._dragCallback)},this._deactivateDraw=e=>{w.wk.isInteractingWithTool=!1,e.removeEventListener(l.Events.MOUSE_UP,this._endCallback),e.removeEventListener(l.Events.MOUSE_DRAG,this._dragCallback),e.removeEventListener(l.Events.MOUSE_MOVE,this._dragCallback),e.removeEventListener(l.Events.MOUSE_CLICK,this._endCallback),e.removeEventListener(l.Events.TOUCH_TAP,this._endCallback),e.removeEventListener(l.Events.TOUCH_END,this._endCallback),e.removeEventListener(l.Events.TOUCH_DRAG,this._dragCallback)},this.renderAnnotation=(e,t)=>{let n=!1;const{viewport:i}=e,{element:a}=i;let o=(0,r.getAnnotations)(this.getToolName(),a);if(!o?.length)return n;if(o=this.filterInteractableAnnotationsForElement(a,o),!o?.length)return n;const s={toolGroupId:this.toolGroupId,toolName:this.getToolName(),viewportId:e.viewport.id};for(let e=0;e<o.length;e++){const a=o[e],{annotationUID:r,data:l}=a,{handles:d,text:c}=l,{points:h,activeHandleIndex:g}=d;s.annotationUID=r;const{color:u,lineWidth:m,lineDash:v,markerSize:p}=this.getAnnotationStyle({annotation:a,styleSpecifier:s}),f=h.map((e=>i.worldToCanvas(e)));let w;if((0,Se.isAnnotationLocked)(r)||this.editData||null===g||(w=[f[g]]),!i.getRenderingEngine())return console.warn("Rendering Engine has been destroyed"),n;if(!(0,Ne.isAnnotationVisible)(r))continue;if(w){const e="0";(0,M.drawHandles)(t,r,e,f,{color:u,lineWidth:m})}const E="1";if(this.configuration.arrowFirst?(0,M.drawArrow)(t,r,E,f[1],f[0],{color:u,width:m,lineDash:v,viaMarker:"legacy"!==this.configuration.arrowHeadStyle,markerSize:p}):(0,M.drawArrow)(t,r,E,f[0],f[1],{color:u,width:m,lineDash:v,viaMarker:"legacy"!==this.configuration.arrowHeadStyle,markerSize:p}),n=!0,!c)continue;const I=this.getLinkedTextBoxStyle(s,a);if(!I.visibility){l.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}if(!l.handles.textBox.hasMoved){const e=f[1];l.handles.textBox.worldPosition=i.canvasToWorld(e)}const C=i.worldToCanvas(l.handles.textBox.worldPosition),b="1",_=(0,M.drawLinkedTextBox)(t,r,b,[c],C,f,{},I),{x:T,y:S,width:D,height:A}=_;l.handles.textBox.worldBoundingBox={topLeft:i.canvasToWorld([T,S]),topRight:i.canvasToWorld([T+D,S]),bottomLeft:i.canvasToWorld([T,S+A]),bottomRight:i.canvasToWorld([T+D,S+A])}}return n}}static{this.hydrate=(e,t,n,i)=>{const a=(0,s.getEnabledElementByViewportId)(e);if(!a)return;const{FrameOfReferenceUID:o,referencedImageId:l,viewPlaneNormal:d,instance:c,viewport:h}=this.hydrateBase(nn,a,t,i),g={annotationUID:i?.annotationUID||s.utilities.uuidv4(),data:{text:n||"",handles:{points:t}},highlighted:!1,autoGenerated:!1,invalidated:!1,isLocked:!1,isVisible:!0,metadata:{toolName:c.getToolName(),viewPlaneNormal:d,FrameOfReferenceUID:o,referencedImageId:l,...i}};(0,r.addAnnotation)(g,h.element),(0,L.A)([h.id])}}handleSelectedCallback(e,t,n){const i=e.detail,{element:a}=i,{data:o}=t;t.highlighted=!0;let r,l=!1;n.worldPosition?l=!0:r=o.handles.points.findIndex((e=>e===n));const d=(0,W.getViewportIdsWithToolToRender)(a,this.getToolName());this.editData={annotation:t,viewportIdsToRender:d,handleIndex:r,movingTextBox:l},this._activateModify(a),(0,ve.hideElementCursor)(a);const c=(0,s.getEnabledElement)(a),{renderingEngine:h}=c;(0,L.A)(d),e.preventDefault()}_doneChangingTextCallback(e,t,n){t.data.text=n;(0,s.getEnabledElement)(e);const i=(0,W.getViewportIdsWithToolToRender)(e,this.getToolName());(0,L.A)(i),(0,ee.triggerAnnotationModified)(t,e)}_isInsideVolume(e,t,n){return s.utilities.indexWithinDimensions(e,n)&&s.utilities.indexWithinDimensions(t,n)}}function an(e){return e(prompt("Enter your annotation:"))}function on(e,t,n){return n(prompt("Enter your annotation:"))}class sn extends ce.EC{static{this.toolName="Angle"}constructor(e={},t={supportedInteractionTypes:["Mouse","Touch"],configuration:{shadow:!0,preventHandleOutsideImage:!1,getTextLines:rn}}){super(e,t),this.addNewAnnotation=e=>{if(this.angleStartedNotYetCompleted)return;this.angleStartedNotYetCompleted=!0;const t=e.detail,{currentPoints:n,element:i}=t,a=n.world,o=(0,s.getEnabledElement)(i),{viewport:l,renderingEngine:d}=o;(0,ve.hideElementCursor)(i),this.isDrawing=!0;const c=l.getCamera(),{viewPlaneNormal:h,viewUp:g}=c,u=this.getReferencedImageId(l,a,h,g),m=l.getFrameOfReferenceUID(),v={highlighted:!0,invalidated:!0,metadata:{toolName:this.getToolName(),viewPlaneNormal:[...h],viewUp:[...g],FrameOfReferenceUID:m,referencedImageId:u,...l.getViewReference({points:[a]})},data:{handles:{points:[[...a],[...a]],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]}}},label:"",cachedStats:{}}};(0,r.addAnnotation)(v,i);const p=(0,W.getViewportIdsWithToolToRender)(i,this.getToolName());return this.editData={annotation:v,viewportIdsToRender:p,handleIndex:1,movingTextBox:!1,newAnnotation:!0,hasMoved:!1},this._activateDraw(i),e.preventDefault(),(0,L.A)(p),v},this.isPointNearTool=(e,t,n,i)=>{const a=(0,s.getEnabledElement)(e),{viewport:o}=a,{data:r}=t,[l,d,c]=r.handles.points,h=o.worldToCanvas(l),g=o.worldToCanvas(d),u={start:{x:h[0],y:h[1]},end:{x:g[0],y:g[1]}};if(Te.distanceToPoint([u.start.x,u.start.y],[u.end.x,u.end.y],[n[0],n[1]])<=i)return!0;if(!c)return!1;const m=o.worldToCanvas(c),v={start:{x:g[0],y:g[1]},end:{x:m[0],y:m[1]}};return Te.distanceToPoint([v.start.x,v.start.y],[v.end.x,v.end.y],[n[0],n[1]])<=i},this.toolSelectedCallback=(e,t)=>{const n=e.detail,{element:i}=n;t.highlighted=!0;const a=(0,W.getViewportIdsWithToolToRender)(i,this.getToolName());this.editData={annotation:t,viewportIdsToRender:a,movingTextBox:!1},this._activateModify(i),(0,ve.hideElementCursor)(i);const o=(0,s.getEnabledElement)(i),{renderingEngine:r}=o;(0,L.A)(a),e.preventDefault()},this._endCallback=e=>{const t=e.detail,{element:n}=t,{annotation:i,viewportIdsToRender:a,newAnnotation:o,hasMoved:l}=this.editData,{data:d}=i;if(o&&!l)return;if(this.angleStartedNotYetCompleted&&2===d.handles.points.length)return void(this.editData.handleIndex=2);this.angleStartedNotYetCompleted=!1,d.handles.activeHandleIndex=null,this._deactivateModify(n),this._deactivateDraw(n),(0,ve.resetElementCursor)(n);const c=(0,s.getEnabledElement)(n),{renderingEngine:h}=c;this.isHandleOutsideImage&&this.configuration.preventHandleOutsideImage&&(0,r.removeAnnotation)(i.annotationUID),(0,L.A)(a),o&&(0,ee.triggerAnnotationCompleted)(i),this.editData=null,this.isDrawing=!1},this._dragCallback=e=>{this.isDrawing=!0;const t=e.detail,{element:n}=t,{annotation:i,viewportIdsToRender:a,handleIndex:o,movingTextBox:r}=this.editData,{data:d}=i;if(r){const{deltaPoints:e}=t,n=e.world,{textBox:i}=d.handles,{worldPosition:a}=i;a[0]+=n[0],a[1]+=n[1],a[2]+=n[2],i.hasMoved=!0}else if(void 0===o){const{deltaPoints:e}=t,n=e.world;d.handles.points.forEach((e=>{e[0]+=n[0],e[1]+=n[1],e[2]+=n[2]})),i.invalidated=!0}else{const{currentPoints:e}=t,n=e.world;d.handles.points[o]=[...n],i.invalidated=!0}this.editData.hasMoved=!0;const c=(0,s.getEnabledElement)(n),{renderingEngine:h}=c;(0,L.A)(a),i.invalidated&&(0,ee.triggerAnnotationModified)(i,n,l.ChangeTypes.HandlesUpdated)},this.cancel=e=>{if(this.isDrawing){this.isDrawing=!1,this._deactivateDraw(e),this._deactivateModify(e),(0,ve.resetElementCursor)(e);const{annotation:t,viewportIdsToRender:n,newAnnotation:i}=this.editData,{data:a}=t;return t.highlighted=!1,a.handles.activeHandleIndex=null,(0,L.A)(n),i&&(0,ee.triggerAnnotationCompleted)(t),this.editData=null,this.angleStartedNotYetCompleted=!1,t.annotationUID}},this._activateModify=e=>{w.wk.isInteractingWithTool=!0,e.addEventListener(l.Events.MOUSE_UP,this._endCallback),e.addEventListener(l.Events.MOUSE_DRAG,this._dragCallback),e.addEventListener(l.Events.MOUSE_CLICK,this._endCallback),e.addEventListener(l.Events.TOUCH_TAP,this._endCallback),e.addEventListener(l.Events.TOUCH_END,this._endCallback),e.addEventListener(l.Events.TOUCH_DRAG,this._dragCallback)},this._deactivateModify=e=>{w.wk.isInteractingWithTool=!1,e.removeEventListener(l.Events.MOUSE_UP,this._endCallback),e.removeEventListener(l.Events.MOUSE_DRAG,this._dragCallback),e.removeEventListener(l.Events.MOUSE_CLICK,this._endCallback),e.removeEventListener(l.Events.TOUCH_TAP,this._endCallback),e.removeEventListener(l.Events.TOUCH_END,this._endCallback),e.removeEventListener(l.Events.TOUCH_DRAG,this._dragCallback)},this._activateDraw=e=>{w.wk.isInteractingWithTool=!0,e.addEventListener(l.Events.MOUSE_UP,this._endCallback),e.addEventListener(l.Events.MOUSE_DRAG,this._dragCallback),e.addEventListener(l.Events.MOUSE_MOVE,this._dragCallback),e.addEventListener(l.Events.MOUSE_CLICK,this._endCallback),e.addEventListener(l.Events.TOUCH_TAP,this._endCallback),e.addEventListener(l.Events.TOUCH_END,this._endCallback),e.addEventListener(l.Events.TOUCH_DRAG,this._dragCallback)},this._deactivateDraw=e=>{w.wk.isInteractingWithTool=!1,e.removeEventListener(l.Events.MOUSE_UP,this._endCallback),e.removeEventListener(l.Events.MOUSE_DRAG,this._dragCallback),e.removeEventListener(l.Events.MOUSE_MOVE,this._dragCallback),e.removeEventListener(l.Events.MOUSE_CLICK,this._endCallback),e.removeEventListener(l.Events.TOUCH_TAP,this._endCallback),e.removeEventListener(l.Events.TOUCH_END,this._endCallback),e.removeEventListener(l.Events.TOUCH_DRAG,this._dragCallback)},this.renderAnnotation=(e,t)=>{let n=!1;const{viewport:i}=e,{element:a}=i;let o=(0,r.getAnnotations)(this.getToolName(),a);if(!o?.length)return n;if(o=this.filterInteractableAnnotationsForElement(a,o),!o?.length)return n;const s=this.getTargetId(i),l=i.getRenderingEngine(),d={toolGroupId:this.toolGroupId,toolName:this.getToolName(),viewportId:e.viewport.id};for(let a=0;a<o.length;a++){const r=o[a],{annotationUID:c,data:h}=r,{points:g,activeHandleIndex:u}=h.handles;d.annotationUID=c;const{color:m,lineWidth:v,lineDash:p}=this.getAnnotationStyle({annotation:r,styleSpecifier:d}),f=g.map((e=>i.worldToCanvas(e)));let w;if(h.cachedStats[s]&&null!=h.cachedStats[s].angle?r.invalidated&&this._throttledCalculateCachedStats(r,l,e):(h.cachedStats[s]={angle:null},this._calculateCachedStats(r,l,e)),(0,Se.isAnnotationLocked)(r.annotationUID)||this.editData||null===u||(w=[f[u]]),!i.getRenderingEngine())return console.warn("Rendering Engine has been destroyed"),n;if(!(0,Ne.isAnnotationVisible)(c))continue;if(w){const e="0";(0,M.drawHandles)(t,c,e,f,{color:m,lineDash:p,lineWidth:v})}let E="1";if((0,M.drawLine)(t,c,E,f[0],f[1],{color:m,width:v,lineDash:p}),n=!0,3!==f.length)return n;if(E="2",(0,M.drawLine)(t,c,E,f[1],f[2],{color:m,width:v,lineDash:p}),!h.cachedStats[s]?.angle)continue;const I=this.getLinkedTextBoxStyle(d,r);if(!I.visibility){h.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 C=this.configuration.getTextLines(h,s);if(!h.handles.textBox.hasMoved){const e=f[1];h.handles.textBox.worldPosition=i.canvasToWorld(e)}const b=i.worldToCanvas(h.handles.textBox.worldPosition),_="1",T=(0,M.drawLinkedTextBox)(t,c,_,C,b,f,{},I),{x:S,y:D,width:A,height:y}=T;h.handles.textBox.worldBoundingBox={topLeft:i.canvasToWorld([S,D]),topRight:i.canvasToWorld([S+A,D]),bottomLeft:i.canvasToWorld([S,D+y]),bottomRight:i.canvasToWorld([S+A,D+y])}}return n},this._throttledCalculateCachedStats=(0,x.A)(this._calculateCachedStats,100,{trailing:!0})}static{this.hydrate=(e,t,n)=>{const i=(0,s.getEnabledElementByViewportId)(e);if(!i)return;const{FrameOfReferenceUID:a,referencedImageId:o,viewPlaneNormal:l,instance:d,viewport:c}=this.hydrateBase(sn,i,t,n),h={annotationUID:n?.annotationUID||s.utilities.uuidv4(),data:{handles:{points:t}},highlighted:!1,autoGenerated:!1,invalidated:!1,isLocked:!1,isVisible:!0,metadata:{toolName:d.getToolName(),viewPlaneNormal:l,FrameOfReferenceUID:a,referencedImageId:o,...n}};(0,r.addAnnotation)(h,c.element),(0,L.A)([c.id])}}handleSelectedCallback(e,t,n){const i=e.detail,{element:a}=i,{data:o}=t;t.highlighted=!0;let r,l=!1;n.worldPosition?l=!0:r=o.handles.points.findIndex((e=>e===n));const d=(0,W.getViewportIdsWithToolToRender)(a,this.getToolName());this.editData={annotation:t,viewportIdsToRender:d,handleIndex:r,movingTextBox:l},this._activateModify(a),(0,ve.hideElementCursor)(a);const c=(0,s.getEnabledElement)(a),{renderingEngine:h}=c;(0,L.A)(d),e.preventDefault()}_calculateCachedStats(e,t,n){const i=e.data,{element:a}=n.viewport;if(3!==i.handles.points.length)return;const o=i.handles.points[0],r=i.handles.points[1],d=i.handles.points[2],{cachedStats:c}=i,h=Object.keys(c);for(let e=0;e<h.length;e++){const t=h[e],n=(0,we.A)([o,r],[r,d]),{dimensions:i,imageData:a}=this.getTargetImageData(t);this.isHandleOutsideImage=[o,r,d].map((e=>s.utilities.transformWorldToIndex(a,e))).some((e=>!s.utilities.indexWithinDimensions(e,i))),c[t]={angle:isNaN(n)?"Incomplete Angle":n}}const g=e.invalidated;return e.invalidated=!1,g&&(0,ee.triggerAnnotationModified)(e,a,l.ChangeTypes.StatsUpdated),c}}function rn(e,t){const n=e.cachedStats[t],{angle:i}=n;if(void 0===i)return;if(isNaN(i))return[`${i}`];return[`${s.utilities.roundNumber(i)} ${String.fromCharCode(176)}`]}var ln=n(82983);class dn extends ce.EC{static{this.toolName="CobbAngle"}constructor(e={},t={supportedInteractionTypes:["Mouse","Touch"],configuration:{shadow:!0,preventHandleOutsideImage:!1,getTextLines:cn,showArcLines:!1}}){super(e,t),this.addNewAnnotation=e=>{if(this.angleStartedNotYetCompleted)return;this.angleStartedNotYetCompleted=!0;const t=e.detail,{currentPoints:n,element:i}=t,a=n.world,o=(0,s.getEnabledElement)(i),{viewport:l,renderingEngine:d}=o;(0,ve.hideElementCursor)(i),this.isDrawing=!0;const c=l.getCamera(),{viewPlaneNormal:h,viewUp:g}=c,u=this.getReferencedImageId(l,a,h,g),m=l.getFrameOfReferenceUID(),v={highlighted:!0,invalidated:!0,metadata:{toolName:this.getToolName(),viewPlaneNormal:[...h],viewUp:[...g],FrameOfReferenceUID:m,referencedImageId:u,...l.getViewReference({points:[a]})},data:{handles:{points:[[...a],[...a]],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]}}},label:"",cachedStats:{}}};(0,r.addAnnotation)(v,i);const p=(0,W.getViewportIdsWithToolToRender)(i,this.getToolName());return this.editData={annotation:v,viewportIdsToRender:p,handleIndex:1,movingTextBox:!1,newAnnotation:!0,hasMoved:!1},this._activateDraw(i),e.preventDefault(),(0,L.A)(p),v},this.isPointNearTool=(e,t,n,i)=>{const a=(0,s.getEnabledElement)(e),{viewport:o}=a,{data:r}=t,{distanceToPoint:l,distanceToPoint2:d}=this.distanceToLines({viewport:o,points:r.handles.points,canvasCoords:n,proximity:i});return l<=i||d<=i},this.toolSelectedCallback=(e,t,n,i,a=6)=>{const o=e.detail,{element:r}=o;t.highlighted=!0;const l=(0,W.getViewportIdsWithToolToRender)(r,this.getToolName()),d=(0,s.getEnabledElement)(r),{renderingEngine:c,viewport:h}=d,{isNearFirstLine:g,isNearSecondLine:u}=this.distanceToLines({viewport:h,points:t.data.handles.points,canvasCoords:i,proximity:a});this.editData={annotation:t,viewportIdsToRender:l,movingTextBox:!1,isNearFirstLine:g,isNearSecondLine:u},this._activateModify(r),(0,ve.hideElementCursor)(r),(0,L.A)(l),e.preventDefault()},this._endCallback=e=>{const t=e.detail,{element:n}=t,{annotation:i,viewportIdsToRender:a,newAnnotation:o,hasMoved:l}=this.editData,{data:d}=i;if(o&&!l)return;if(this.doneEditMemo(),this.angleStartedNotYetCompleted&&d.handles.points.length<4)return(0,ve.resetElementCursor)(n),void(this.editData.handleIndex=d.handles.points.length);this.angleStartedNotYetCompleted=!1,d.handles.activeHandleIndex=null,this._deactivateModify(n),this._deactivateDraw(n),(0,ve.resetElementCursor)(n);const c=(0,s.getEnabledElement)(n),{renderingEngine:h}=c;this.isHandleOutsideImage&&this.configuration.preventHandleOutsideImage&&(0,r.removeAnnotation)(i.annotationUID),(0,L.A)(a),o&&(0,ee.triggerAnnotationCompleted)(i),this.editData=null,this.isDrawing=!1},this._mouseDownCallback=e=>{const{annotation:t,handleIndex:n}=this.editData,i=e.detail,{element:a,currentPoints:o}=i,s=o.world,{data:r}=t;return 1===n?(r.handles.points[1]=s,void(this.editData.hasMoved=r.handles.points[1][0]!==r.handles.points[0][0]||r.handles.points[1][1]!==r.handles.points[0][0])):3===n?(r.handles.points[3]=s,this.editData.hasMoved=r.handles.points[3][0]!==r.handles.points[2][0]||r.handles.points[3][1]!==r.handles.points[2][0],void(this.angleStartedNotYetCompleted=!1)):(this.editData.hasMoved=!1,(0,ve.hideElementCursor)(a),r.handles.points[2]=r.handles.points[3]=s,void(this.editData.handleIndex=r.handles.points.length-1))},this._dragCallback=e=>{this.isDrawing=!0;const t=e.detail,{element:n}=t,{annotation:i,viewportIdsToRender:a,handleIndex:o,movingTextBox:r,isNearFirstLine:d,isNearSecondLine:c,newAnnotation:h}=this.editData;this.createMemo(n,i,{newAnnotation:h});const{data:g}=i;if(r){const{deltaPoints:e}=t,n=e.world,{textBox:i}=g.handles,{worldPosition:a}=i;a[0]+=n[0],a[1]+=n[1],a[2]+=n[2],i.hasMoved=!0}else if(void 0===o&&(d||c)){const{deltaPoints:e}=t,n=e.world,a=g.handles.points;if(d){[a[0],a[1]].forEach((e=>{e[0]+=n[0],e[1]+=n[1],e[2]+=n[2]}))}else if(c){[a[2],a[3]].forEach((e=>{e[0]+=n[0],e[1]+=n[1],e[2]+=n[2]}))}i.invalidated=!0}else{const{currentPoints:e}=t,n=e.world;g.handles.points[o]=[...n],i.invalidated=!0}this.editData.hasMoved=!0;const u=(0,s.getEnabledElement)(n),{renderingEngine:m}=u;(0,L.A)(a),i.invalidated&&(0,ee.triggerAnnotationModified)(i,n,l.ChangeTypes.HandlesUpdated)},this.cancel=e=>{if(!this.isDrawing)return;this.isDrawing=!1,this._deactivateDraw(e),this._deactivateModify(e),(0,ve.resetElementCursor)(e);const{annotation:t,viewportIdsToRender:n,newAnnotation:i}=this.editData,{data:a}=t;a.handles.points.length<4&&(0,r.removeAnnotation)(t.annotationUID),t.highlighted=!1,a.handles.activeHandleIndex=null;const o=(0,s.getEnabledElement)(e),{renderingEngine:l}=o;return(0,L.A)(n),i&&(0,ee.triggerAnnotationCompleted)(t),this.editData=null,this.angleStartedNotYetCompleted=!1,t.annotationUID},this._activateModify=e=>{w.wk.isInteractingWithTool=!0,e.addEventListener(l.Events.MOUSE_UP,this._endCallback),e.addEventListener(l.Events.MOUSE_DRAG,this._dragCallback),e.addEventListener(l.Events.MOUSE_CLICK,this._endCallback),e.addEventListener(l.Events.TOUCH_END,this._endCallback),e.addEventListener(l.Events.TOUCH_DRAG,this._dragCallback),e.addEventListener(l.Events.TOUCH_START,this._mouseDownCallback),e.addEventListener(l.Events.TOUCH_TAP,this._endCallback)},this._deactivateModify=e=>{w.wk.isInteractingWithTool=!1,e.removeEventListener(l.Events.MOUSE_UP,this._endCallback),e.removeEventListener(l.Events.MOUSE_DRAG,this._dragCallback),e.removeEventListener(l.Events.MOUSE_CLICK,this._endCallback),e.removeEventListener(l.Events.TOUCH_END,this._endCallback),e.removeEventListener(l.Events.TOUCH_DRAG,this._dragCallback),e.removeEventListener(l.Events.TOUCH_START,this._mouseDownCallback),e.removeEventListener(l.Events.TOUCH_TAP,this._endCallback)},this._activateDraw=e=>{w.wk.isInteractingWithTool=!0,e.addEventListener(l.Events.MOUSE_UP,this._endCallback),e.addEventListener(l.Events.MOUSE_DRAG,this._dragCallback),e.addEventListener(l.Events.MOUSE_MOVE,this._dragCallback),e.addEventListener(l.Events.MOUSE_CLICK,this._endCallback),e.addEventListener(l.Events.MOUSE_DOWN,this._mouseDownCallback),e.addEventListener(l.Events.TOUCH_END,this._endCallback),e.addEventListener(l.Events.TOUCH_DRAG,this._dragCallback),e.addEventListener(l.Events.TOUCH_START,this._mouseDownCallback),e.addEventListener(l.Events.TOUCH_TAP,this._endCallback)},this._deactivateDraw=e=>{w.wk.isInteractingWithTool=!1,e.removeEventListener(l.Events.MOUSE_UP,this._endCallback),e.removeEventListener(l.Events.MOUSE_DRAG,this._dragCallback),e.removeEventListener(l.Events.MOUSE_MOVE,this._dragCallback),e.removeEventListener(l.Events.MOUSE_CLICK,this._endCallback),e.removeEventListener(l.Events.MOUSE_DOWN,this._mouseDownCallback),e.removeEventListener(l.Events.TOUCH_END,this._endCallback),e.removeEventListener(l.Events.TOUCH_DRAG,this._dragCallback),e.removeEventListener(l.Events.TOUCH_START,this._mouseDownCallback),e.removeEventListener(l.Events.TOUCH_TAP,this._endCallback)},this.renderAnnotation=(e,t)=>{let n=!1;const{viewport:i}=e,{element:a}=i;let o=(0,r.getAnnotations)(this.getToolName(),a);if(!o?.length)return n;if(o=this.filterInteractableAnnotationsForElement(a,o),!o?.length)return n;const s=this.getTargetId(i),l=i.getRenderingEngine(),d={toolGroupId:this.toolGroupId,toolName:this.getToolName(),viewportId:e.viewport.id};for(let a=0;a<o.length;a++){const r=o[a],{annotationUID:c,data:h}=r,{points:g,activeHandleIndex:u}=h.handles;d.annotationUID=c;const{color:m,lineWidth:v,lineDash:p}=this.getAnnotationStyle({annotation:r,styleSpecifier:d}),f=g.map((e=>i.worldToCanvas(e)));let w;if(h.cachedStats[s]&&null!=h.cachedStats[s].angle?r.invalidated&&this._throttledCalculateCachedStats(r,l,e):(h.cachedStats[s]={angle:null,arc1Angle:null,arc2Angle:null,points:{world:{arc1Start:null,arc1End:null,arc2Start:null,arc2End:null,arc1Angle:null,arc2Angle:null},canvas:{arc1Start:null,arc1End:null,arc2Start:null,arc2End:null,arc1Angle:null,arc2Angle:null}}},this._calculateCachedStats(r,l,e)),(0,Se.isAnnotationLocked)(c)||this.editData||null===u||(w=[f[u]]),!i.getRenderingEngine())return console.warn("Rendering Engine has been destroyed"),n;if(!(0,Ne.isAnnotationVisible)(c))continue;if(w){const e="0";(0,M.drawHandles)(t,c,e,f,{color:m,lineDash:p,lineWidth:v})}const E=[f[0],f[1]],I=[f[2],f[3]];let C="line1";if((0,M.drawLine)(t,c,C,E[0],E[1],{color:m,width:v,lineDash:p}),n=!0,f.length<4)return n;C="line2",(0,M.drawLine)(t,c,C,I[0],I[1],{color:m,width:v,lineDash:p}),C="linkLine";const b=(0,ln.f)(E[0],E[1]),_=(0,ln.f)(I[0],I[1]);(0,M.drawLine)(t,c,C,b,_,{color:m,lineWidth:"1",lineDash:"1,4"});const{arc1Start:T,arc1End:S,arc2End:D,arc2Start:A}=h.cachedStats[s].points.canvas,{arc1Angle:y,arc2Angle:x}=h.cachedStats[s];if(this.configuration.showArcLines&&(C="arc1",(0,M.drawLine)(t,c,C,T,S,{color:m,lineWidth:"1"}),C="arc2",(0,M.drawLine)(t,c,C,A,D,{color:m,lineWidth:"1"})),!h.cachedStats[s]?.angle)continue;const P=this.getLinkedTextBoxStyle(d,r);if(!P.visibility){h.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 R=this.configuration.getTextLines(h,s);if(!h.handles.textBox.hasMoved){const e=(0,k.getTextBoxCoordsCanvas)(f);h.handles.textBox.worldPosition=i.canvasToWorld(e)}const L=i.worldToCanvas(h.handles.textBox.worldPosition),U="cobbAngleText",O=(0,M.drawLinkedTextBox)(t,c,U,R,L,f,{},P),{x:N,y:V,width:W,height:B}=O;if(h.handles.textBox.worldBoundingBox={topLeft:i.canvasToWorld([N,V]),topRight:i.canvasToWorld([N+W,V]),bottomLeft:i.canvasToWorld([N,V+B]),bottomRight:i.canvasToWorld([N+W,V+B])},this.configuration.showArcLines){const e="arcAngle1",n=[`${y.toFixed(2)} ${String.fromCharCode(176)}`],i=(0,ln.f)(T,S);(0,M.drawTextBox)(t,c,e,n,i,{...P,padding:3});const a="arcAngle2",o=[`${x.toFixed(2)} ${String.fromCharCode(176)}`],s=(0,ln.f)(A,D);(0,M.drawTextBox)(t,c,a,o,s,{...P,padding:3})}}return n},this.distanceToLines=({viewport:e,points:t,canvasCoords:n,proximity:i})=>{const[a,o,s,r]=t,l=e.worldToCanvas(a),d=e.worldToCanvas(o),c=e.worldToCanvas(s),h=e.worldToCanvas(r),g={start:{x:l[0],y:l[1]},end:{x:d[0],y:d[1]}},u={start:{x:c[0],y:c[1]},end:{x:h[0],y:h[1]}},m=Te.distanceToPoint([g.start.x,g.start.y],[g.end.x,g.end.y],[n[0],n[1]]),v=Te.distanceToPoint([u.start.x,u.start.y],[u.end.x,u.end.y],[n[0],n[1]]);let p=!1,f=!1;return m<=i?p=!0:v<=i&&(f=!0),{distanceToPoint:m,distanceToPoint2:v,isNearFirstLine:p,isNearSecondLine:f}},this.getArcsStartEndPoints=({firstLine:e,secondLine:t,mid1:n,mid2:i})=>{const a=[n,i],o=(0,we.A)(e,a),s=(0,we.A)(t,a),r=o>90?1:0,l=s>90?0:1,d=(0,ln.f)(a[0],a[1]),c=Math.sqrt((a[1][0]-a[0][0])**2+(a[1][1]-a[0][1])**2),h=.1,g=(0,ln.f)(e[0],e[1]),u=(0,ln.f)(t[0],t[1]),m=[e[r][0]-g[0],e[r][1]-g[1]],v=Math.sqrt(m[0]**2+m[1]**2),p=[m[0]/v,m[1]/v],f=[g[0]+p[0]*c*h,g[1]+p[1]*c*h],w=[d[0]-n[0],d[1]-n[1]],E=Math.sqrt(w[0]**2+w[1]**2),I=[w[0]/E,w[1]/E],C=[n[0]+I[0]*c*h,n[1]+I[1]*c*h],b=[t[l][0]-u[0],t[l][1]-u[1]],_=Math.sqrt(b[0]**2+b[1]**2),T=[b[0]/_,b[1]/_],S=[u[0]+T[0]*c*h,u[1]+T[1]*c*h],D=[d[0]-i[0],d[1]-i[1]],A=Math.sqrt(D[0]**2+D[1]**2),M=[D[0]/A,D[1]/A];return{arc1Start:f,arc1End:C,arc2Start:S,arc2End:[i[0]+M[0]*c*h,i[1]+M[1]*c*h],arc1Angle:o>90?180-o:o,arc2Angle:s>90?180-s:s}},this._throttledCalculateCachedStats=(0,x.A)(this._calculateCachedStats,25,{trailing:!0})}handleSelectedCallback(e,t,n,i="mouse"){const a=e.detail,{element:o}=a,{data:s}=t;t.highlighted=!0;let r,l=!1;n.worldPosition?l=!0:r=s.handles.points.findIndex((e=>e===n));const d=(0,W.getViewportIdsWithToolToRender)(o,this.getToolName());this.editData={annotation:t,viewportIdsToRender:d,handleIndex:r,movingTextBox:l},this._activateModify(o),(0,ve.hideElementCursor)(o),(0,L.A)(d),e.preventDefault()}_calculateCachedStats(e,t,n){const i=e.data;if(4!==i.handles.points.length)return;const a=[null,null],o=[null,null];let s=Number.MAX_VALUE;for(let e=0;e<2;e+=1)for(let t=2;t<4;t+=1){const n=T.eR.distance(i.handles.points[e],i.handles.points[t]);n<s&&(s=n,a[1]=i.handles.points[e],a[0]=i.handles.points[(e+1)%2],o[0]=i.handles.points[t],o[1]=i.handles.points[2+(t-1)%2])}const{viewport:r}=n,{element:d}=r,c=i.handles.points.map((e=>r.worldToCanvas(e))),h=[c[0],c[1]],g=[c[2],c[3]],u=(0,ln.f)(h[0],h[1]),m=(0,ln.f)(g[0],g[1]),{arc1Start:v,arc1End:p,arc2End:f,arc2Start:w,arc1Angle:E,arc2Angle:I}=this.getArcsStartEndPoints({firstLine:h,secondLine:g,mid1:u,mid2:m}),{cachedStats:C}=i,b=Object.keys(C);for(let e=0;e<b.length;e++){C[b[e]]={angle:(0,we.A)(a,o),arc1Angle:E,arc2Angle:I,points:{canvas:{arc1Start:v,arc1End:p,arc2End:f,arc2Start:w},world:{arc1Start:r.canvasToWorld(v),arc1End:r.canvasToWorld(p),arc2End:r.canvasToWorld(f),arc2Start:r.canvasToWorld(w)}}}}const _=e.invalidated;return e.invalidated=!1,_&&(0,ee.triggerAnnotationModified)(e,d,l.ChangeTypes.StatsUpdated),C}}function cn(e,t){const n=e.cachedStats[t],{angle:i}=n;if(void 0===i)return;return[`${i.toFixed(2)} ${String.fromCharCode(176)}`]}const{transformWorldToIndex:hn}=s.utilities;class gn extends ce.EC{static{this.toolName="UltrasoundDirectionalTool"}constructor(e={},t={supportedInteractionTypes:["Mouse","Touch"],configuration:{shadow:!0,preventHandleOutsideImage:!1,getTextLines:un,displayBothAxesDistances:!1}}){super(e,t),this.addNewAnnotation=e=>{if(this.startedDrawing)return;this.startedDrawing=!0;const t=e.detail,{currentPoints:n,element:i}=t,a=n.world,o=(0,s.getEnabledElement)(i),{viewport:l,renderingEngine:d}=o;if(!(l instanceof s.StackViewport))throw new Error("UltrasoundDirectionalTool can only be used on a StackViewport");(0,ve.hideElementCursor)(i),this.isDrawing=!0;const c=l.getCamera(),{viewPlaneNormal:h,viewUp:g}=c,u=this.getReferencedImageId(l,a,h,g),m=l.getFrameOfReferenceUID(),v={highlighted:!0,invalidated:!0,metadata:{toolName:this.getToolName(),viewPlaneNormal:[...h],viewUp:[...g],FrameOfReferenceUID:m,referencedImageId:u},data:{handles:{points:[[...a],[...a]],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]}}},label:"",cachedStats:{}}};(0,r.addAnnotation)(v,i);const p=(0,W.getViewportIdsWithToolToRender)(i,this.getToolName());return this.editData={annotation:v,viewportIdsToRender:p,handleIndex:1,movingTextBox:!1,newAnnotation:!0,hasMoved:!1},this._activateDraw(i),e.preventDefault(),(0,L.A)(p),v},this.isPointNearTool=(e,t,n,i)=>{const a=(0,s.getEnabledElement)(e),{viewport:o}=a,{data:r}=t,[l,d]=r.handles.points,c=o.worldToCanvas(l),h=o.worldToCanvas(d),g={start:{x:c[0],y:c[1]},end:{x:h[0],y:h[1]}};return N.lineSegment.distanceToPoint([g.start.x,g.start.y],[g.end.x,g.end.y],[n[0],n[1]])<=i},this._endCallback=e=>{const t=e.detail,{element:n}=t,{annotation:i,viewportIdsToRender:a,newAnnotation:o,hasMoved:l}=this.editData,{data:d}=i;if(o&&!l)return;if(this.startedDrawing&&1===d.handles.points.length)return void(this.editData.handleIndex=1);this.startedDrawing=!1,d.handles.activeHandleIndex=null,this._deactivateModify(n),this._deactivateDraw(n),(0,ve.resetElementCursor)(n);const c=(0,s.getEnabledElement)(n),{renderingEngine:h}=c;this.isHandleOutsideImage&&this.configuration.preventHandleOutsideImage&&(0,r.removeAnnotation)(i.annotationUID),(0,L.A)(a),o&&(0,ee.triggerAnnotationCompleted)(i),this.editData=null,this.isDrawing=!1},this._dragCallback=e=>{this.isDrawing=!0;const t=e.detail,{element:n}=t,{annotation:i,viewportIdsToRender:a,handleIndex:o,movingTextBox:r}=this.editData,{data:l}=i;if(r){const{deltaPoints:e}=t,n=e.world,{textBox:i}=l.handles,{worldPosition:a}=i;a[0]+=n[0],a[1]+=n[1],a[2]+=n[2],i.hasMoved=!0}else if(void 0===o){const{deltaPoints:e}=t,n=e.world;l.handles.points.forEach((e=>{e[0]+=n[0],e[1]+=n[1],e[2]+=n[2]})),i.invalidated=!0}else{const{currentPoints:e}=t,n=e.world;l.handles.points[o]=[...n],i.invalidated=!0}this.editData.hasMoved=!0;const d=(0,s.getEnabledElement)(n),{renderingEngine:c}=d;(0,L.A)(a)},this.cancel=e=>{if(this.isDrawing){this.isDrawing=!1,this._deactivateDraw(e),this._deactivateModify(e),(0,ve.resetElementCursor)(e);const{annotation:t,viewportIdsToRender:n,newAnnotation:i}=this.editData,{data:a}=t;return t.highlighted=!1,a.handles.activeHandleIndex=null,(0,L.A)(n),i&&(0,ee.triggerAnnotationCompleted)(t),this.editData=null,this.startedDrawing=!1,t.annotationUID}},this._activateModify=e=>{w.wk.isInteractingWithTool=!0,e.addEventListener(l.Events.MOUSE_UP,this._endCallback),e.addEventListener(l.Events.MOUSE_DRAG,this._dragCallback),e.addEventListener(l.Events.MOUSE_CLICK,this._endCallback),e.addEventListener(l.Events.TOUCH_TAP,this._endCallback),e.addEventListener(l.Events.TOUCH_END,this._endCallback),e.addEventListener(l.Events.TOUCH_DRAG,this._dragCallback)},this._deactivateModify=e=>{w.wk.isInteractingWithTool=!1,e.removeEventListener(l.Events.MOUSE_UP,this._endCallback),e.removeEventListener(l.Events.MOUSE_DRAG,this._dragCallback),e.removeEventListener(l.Events.MOUSE_CLICK,this._endCallback),e.removeEventListener(l.Events.TOUCH_TAP,this._endCallback),e.removeEventListener(l.Events.TOUCH_END,this._endCallback),e.removeEventListener(l.Events.TOUCH_DRAG,this._dragCallback)},this._activateDraw=e=>{w.wk.isInteractingWithTool=!0,e.addEventListener(l.Events.MOUSE_UP,this._endCallback),e.addEventListener(l.Events.MOUSE_DRAG,this._dragCallback),e.addEventListener(l.Events.MOUSE_MOVE,this._dragCallback),e.addEventListener(l.Events.MOUSE_CLICK,this._endCallback),e.addEventListener(l.Events.TOUCH_TAP,this._endCallback),e.addEventListener(l.Events.TOUCH_END,this._endCallback),e.addEventListener(l.Events.TOUCH_DRAG,this._dragCallback)},this._deactivateDraw=e=>{w.wk.isInteractingWithTool=!1,e.removeEventListener(l.Events.MOUSE_UP,this._endCallback),e.removeEventListener(l.Events.MOUSE_DRAG,this._dragCallback),e.removeEventListener(l.Events.MOUSE_MOVE,this._dragCallback),e.removeEventListener(l.Events.MOUSE_CLICK,this._endCallback),e.removeEventListener(l.Events.TOUCH_TAP,this._endCallback),e.removeEventListener(l.Events.TOUCH_END,this._endCallback),e.removeEventListener(l.Events.TOUCH_DRAG,this._dragCallback)},this.renderAnnotation=(e,t)=>{let n=!1;const{viewport:i}=e,{element:a}=i;let o=(0,r.getAnnotations)(this.getToolName(),a);if(!o?.length)return n;if(o=this.filterInteractableAnnotationsForElement(a,o),!o?.length)return n;const s=this.getTargetId(i),l=i.getRenderingEngine(),d={toolGroupId:this.toolGroupId,toolName:this.getToolName(),viewportId:e.viewport.id};for(let a=0;a<o.length;a++){const r=o[a],{annotationUID:c,data:h}=r,{points:g}=h.handles;d.annotationUID=c;const u=this.getStyle("color",d,r),m=g.map((e=>i.worldToCanvas(e)));if(h.cachedStats[s]&&null!=h.cachedStats[s].xValues?r.invalidated&&this._throttledCalculateCachedStats(r,l,e):(h.cachedStats[s]={xValues:[0,0],yValues:[0,0],isHorizontal:!1,units:[""],isUnitless:!1},this._calculateCachedStats(r,l,e)),!i.getRenderingEngine())return console.warn("Rendering Engine has been destroyed"),n;let v="0";if((0,M.drawHandle)(t,c,v,m[0],{color:u},0),n=!0,2!==m.length)return n;v="1",(0,M.drawHandle)(t,c,v,m[1],{color:u},1);if(h.cachedStats[s].isUnitless){const e=`${c}-line-1`,n="1";(0,M.drawLine)(t,c,n,m[0],m[1],{color:u,width:1,shadow:this.configuration.shadow},e)}else{const e=m[0],n=m[1],i=n[1]-e[1],a=n[0]-e[0];let o=[0,0];o=h.cachedStats[s].isHorizontal?[e[0]+a,e[1]]:[e[0],e[1]+i];let r=`${c}-line-1`,l="1";(0,M.drawLine)(t,c,l,m[0],o,{color:u,width:1,shadow:this.configuration.shadow},r),r=`${c}-line-2`,l="2",(0,M.drawLine)(t,c,l,m[1],o,{color:u,width:1,lineDash:[1,1],shadow:this.configuration.shadow},r)}const p=this.getLinkedTextBoxStyle(d,r);if(!p.visibility){h.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 f=this.configuration.getTextLines(h,s,this.configuration);if(!h.handles.textBox.hasMoved){const e=m[1];h.handles.textBox.worldPosition=i.canvasToWorld(e)}const w=i.worldToCanvas(h.handles.textBox.worldPosition),E="1",I=(0,M.drawLinkedTextBox)(t,c,E,f,w,m,{},p),{x:C,y:b,width:_,height:T}=I;h.handles.textBox.worldBoundingBox={topLeft:i.canvasToWorld([C,b]),topRight:i.canvasToWorld([C+_,b]),bottomLeft:i.canvasToWorld([C,b+T]),bottomRight:i.canvasToWorld([C+_,b+T])}}return n},this._throttledCalculateCachedStats=(0,x.A)(this._calculateCachedStats,100,{trailing:!0})}toolSelectedCallback(e,t,n,i){}handleSelectedCallback(e,t,n){const i=e.detail,{element:a}=i,{data:o}=t;t.highlighted=!0;const r=(0,W.getViewportIdsWithToolToRender)(a,this.getToolName());let l,d=!1;n.worldPosition?d=!0:l=o.handles.points.findIndex((e=>e===n)),this.editData={handleIndex:l,annotation:t,viewportIdsToRender:r},this._activateModify(a),(0,ve.hideElementCursor)(a);const c=(0,s.getEnabledElement)(a),{renderingEngine:h}=c;(0,L.A)(r),e.preventDefault()}_calculateCachedStats(e,t,n){const i=e.data,{element:a}=n.viewport;if(2!==i.handles.points.length)return;const{cachedStats:o}=i,s=Object.keys(o);for(let e=0;e<s.length;e++){const t=s[e],a=this.getTargetImageData(t);if(!a)continue;const{imageData:r}=a,l=i.handles.points[0],d=i.handles.points[1],c=hn(r,l),h=hn(r,d),{values:g,units:u}=(0,R.Xw)(a,[c]),{values:m,units:v}=(0,R.Xw)(a,[h]);let p,f,w,E,I=!1;if(u[0]!==v[0]||u[1]!==v[1]||"raw"===u[0]&&"raw"===v[0]){const e=(0,We.distanceToPoint)(l,d);p=[e,0],f=[e,0],w=["px"],I=!0}else{const e=n.viewport.worldToCanvas(l),t=n.viewport.worldToCanvas(d),i=t[1]-e[1],a=t[0]-e[0];E=Math.abs(a)>Math.abs(i),p=[g[0],m[0]],f=[g[1],m[1]],w=[u[0],u[1]]}o[t]={xValues:p,yValues:f,isHorizontal:E,units:w,isUnitless:I}}const r=e.invalidated;return e.invalidated=!1,r&&(0,ee.triggerAnnotationModified)(e,a,l.ChangeTypes.StatsUpdated),o}}function un(e,t,n){const i=e.cachedStats[t],{xValues:a,yValues:o,units:r,isUnitless:l,isHorizontal:d}=i;if(l)return[`${s.utilities.roundNumber(a[0])} px`];if(n.displayBothAxesDistances){const e=Math.abs(a[1]-a[0]),t=Math.abs(o[1]-o[0]);return[`${s.utilities.roundNumber(e)} ${r[0]}`,`${s.utilities.roundNumber(t)} ${r[1]}`]}if(d){const e=Math.abs(a[1]-a[0]);return[`${s.utilities.roundNumber(e)} ${r[0]}`]}{const e=Math.abs(o[1]-o[0]);return[`${s.utilities.roundNumber(e)} ${r[1]}`]}}class mn extends ce.EC{static{this.toolName="KeyImage"}static{this.dataSeries={data:{seriesLevel:!0}}}static{this.dataPoint={data:{isPoint:!0}}}constructor(e={},t={supportedInteractionTypes:["Mouse","Touch"],configuration:{getTextCallback:vn,changeTextCallback:pn,canvasPosition:[10,10],canvasSize:10,handleRadius:"6",seriesLevel:!1,isPoint:!1}}){super(e,t),this.addNewAnnotation=e=>{const t=e.detail,{element:n,currentPoints:i}=t,a=(0,s.getEnabledElement)(n),{viewport:o}=a,l=i.world,d=this.constructor.createAnnotationForViewport(o,{data:{handles:{points:[[...l]]},seriesLevel:this.configuration.seriesLevel,isPoint:this.configuration.isPoint}});(0,r.addAnnotation)(d,n);const c=(0,W.getViewportIdsWithToolToRender)(n,this.getToolName());return e.preventDefault(),(0,L.A)(c),this.configuration.getTextCallback((e=>{if(!e)return(0,r.removeAnnotation)(d.annotationUID),(0,L.A)(c),void(this.isDrawing=!1);d.data.text=e,(0,ee.triggerAnnotationCompleted)(d),(0,L.A)(c)})),this.createMemo(n,d,{newAnnotation:!0}),d},this.isPointNearTool=(e,t,n,i)=>{const a=(0,s.getEnabledElement)(e),{viewport:o}=a,{data:r}=t;if(!r?.isPoint)return!1;const{canvasPosition:l,canvasSize:d}=this.configuration;return!!l?.length&&(Math.abs(n[0]-l[0]+d/2)<=d/2&&Math.abs(n[1]-l[1]+d/2)<=d/2)},this.toolSelectedCallback=(e,t)=>{t.highlighted=!0,e.preventDefault()},this._endCallback=e=>{const t=e.detail,{element:n}=t,{annotation:i,viewportIdsToRender:a,newAnnotation:o}=this.editData,{viewportId:l,renderingEngine:d}=(0,s.getEnabledElement)(n);this.eventDispatchDetail={viewportId:l,renderingEngineId:d.id},this._deactivateModify(n),(0,ve.resetElementCursor)(n),o&&this.createMemo(n,i,{newAnnotation:o}),this.editData=null,this.isDrawing=!1,this.doneEditMemo(),this.isHandleOutsideImage&&this.configuration.preventHandleOutsideImage&&(0,r.removeAnnotation)(i.annotationUID),(0,L.A)(a),o&&(0,ee.triggerAnnotationCompleted)(i)},this.doubleClickCallback=e=>{const t=e.detail,{element:n}=t;let i=(0,r.getAnnotations)(this.getToolName(),n);if(i=this.filterInteractableAnnotationsForElement(n,i),!i?.length)return;const a=i.find((e=>this.isPointNearTool(n,e,t.currentPoints.canvas,6)));if(!a)return;const o=a;this.createMemo(n,o),this.configuration.changeTextCallback(a,e.detail,this._doneChangingTextCallback.bind(this,n,o)),this.isDrawing=!1,this.doneEditMemo(),e.stopImmediatePropagation(),e.preventDefault()},this._dragCallback=e=>{this.isDrawing=!0;const t=e.detail,{currentPoints:n,element:i}=t,a=n.world,{annotation:o,viewportIdsToRender:s,newAnnotation:r}=this.editData,{data:l}=o;this.createMemo(i,o,{newAnnotation:r}),l.handles.points[0]=[...a],o.invalidated=!0,(0,L.A)(s)},this._activateModify=e=>{w.wk.isInteractingWithTool=!0,e.addEventListener(l.Events.MOUSE_UP,this._endCallback),e.addEventListener(l.Events.MOUSE_DRAG,this._dragCallback),e.addEventListener(l.Events.MOUSE_CLICK,this._endCallback),e.addEventListener(l.Events.TOUCH_END,this._endCallback),e.addEventListener(l.Events.TOUCH_DRAG,this._dragCallback),e.addEventListener(l.Events.TOUCH_TAP,this._endCallback)},this._deactivateModify=e=>{w.wk.isInteractingWithTool=!1,e.removeEventListener(l.Events.MOUSE_UP,this._endCallback),e.removeEventListener(l.Events.MOUSE_DRAG,this._dragCallback),e.removeEventListener(l.Events.MOUSE_CLICK,this._endCallback),e.removeEventListener(l.Events.TOUCH_END,this._endCallback),e.removeEventListener(l.Events.TOUCH_DRAG,this._dragCallback),e.removeEventListener(l.Events.TOUCH_TAP,this._endCallback)},this.renderAnnotation=(e,t)=>{let n=!1;const{viewport:i}=e,{element:a}=i;let o=(0,r.getAnnotations)(this.getToolName(),a);if(!o?.length)return n;if(o=this.filterInteractableAnnotationsForElement(a,o),!o?.length)return n;const s={toolGroupId:this.toolGroupId,toolName:this.getToolName(),viewportId:e.viewport.id};for(let e=0;e<o.length;e++){const a=o[e],{annotationUID:r,data:l}=a;s.annotationUID=r;const{color:d,lineWidth:c}=this.getAnnotationStyle({annotation:a,styleSpecifier:s}),{canvasPosition:h,canvasSize:g}=this.configuration,u="1";if(l?.isPoint){const e=l.handles.points[0],n=i.worldToCanvas(e);(0,M.drawHandles)(t,r,u,[n],{color:d,lineWidth:c,handleRadius:this.configuration.handleRadius})}else h?.length&&(0,M.drawArrow)(t,r,u,h.map((e=>e+g)),h,{color:d,width:1});if(n=!0,!i.getRenderingEngine())return console.warn("Rendering Engine has been destroyed"),n}return n}}handleSelectedCallback(e,t){const n=e.detail,{element:i}=n;t.highlighted=!0;const a=(0,W.getViewportIdsWithToolToRender)(i,this.getToolName());this.editData={annotation:t,viewportIdsToRender:a},this._activateModify(i),(0,ve.hideElementCursor)(i),(0,L.A)(a),e.preventDefault()}static setPoint(e,t=!e.data.isPoint,n){e.data.isPoint=t,(0,ee.triggerAnnotationModified)(e,n)}_doneChangingTextCallback(e,t,n){t.data.text=n;const i=(0,W.getViewportIdsWithToolToRender)(e,this.getToolName());(0,L.A)(i),(0,ee.triggerAnnotationModified)(t,e)}cancel(e){if(this.isDrawing){this.isDrawing=!1,this._deactivateModify(e),(0,ve.resetElementCursor)(e);const{annotation:t,viewportIdsToRender:n,newAnnotation:i}=this.editData,{data:a}=t;return t.highlighted=!1,a.handles.activeHandleIndex=null,(0,L.A)(n),i&&(0,ee.triggerAnnotationCompleted)(t),this.editData=null,t.annotationUID}}_isInsideVolume(e,t,n){return s.utilities.indexWithinDimensions(e,n)&&s.utilities.indexWithinDimensions(t,n)}}function vn(e){return e(prompt("Enter your annotation:"))}function pn(e,t,n){return n(prompt("Enter your annotation:"))}var fn=n(17343);class wn extends ce.oS{constructor(e={},t={supportedInteractionTypes:["Mouse","Touch"]}){super(e,t),this.preMouseDownCallback=e=>this._deleteNearbyAnnotations(e,"mouse"),this.preTouchStartCallback=e=>this._deleteNearbyAnnotations(e,"touch")}_deleteNearbyAnnotations(e,t){const{renderingEngineId:n,viewportId:i,element:a,currentPoints:o}=e.detail,s=(0,I.getToolGroupForViewport)(i,n);if(!s)return!1;const l=s._toolInstances,d=[];for(const e in l){const n=l[e];if("function"!=typeof n.isPointNearTool||"function"!=typeof n.filterInteractableAnnotationsForElement)continue;const i=(0,r.getAnnotations)(e,a),s=n.filterInteractableAnnotationsForElement(a,i);if(s)for(const e of s)n.isPointNearTool(a,e,o.canvas,10,t)&&d.push(e.annotationUID)}for(const e of d){(0,fn.setAnnotationSelected)(e);const t=(0,r.getAnnotation)(e);ce.EC.createAnnotationMemo(a,t,{deleting:!0}),(0,r.removeAnnotation)(e)}return e.preventDefault(),!0}}wn.toolName="Eraser";var En=n(10639);class In extends En.A{static{this.toolName="RegionSegment"}constructor(e={},t={supportedInteractionTypes:["Mouse","Touch"],configuration:{isPartialVolume:!0,positiveSeedVariance:.5,negativeSeedVariance:.9}}){super(e,t),this._dragCallback=e=>{const t=e.detail,{element:n,currentPoints:i}=t,{world:a}=i,o=(0,s.getEnabledElement)(n),{viewport:r}=o;this.growCutData.circleBorderPoint=a,(0,L.A)([r.id])},this._endCallback=async e=>{const t=e.detail,{element:n}=t,i=(0,s.getEnabledElement)(n),{viewport:a}=i;this.runGrowCut(),this._deactivateDraw(n),this.growCutData=null,(0,ve.resetElementCursor)(n),(0,L.A)([a.id])},this._deactivateDraw=e=>{e.removeEventListener(l.Events.MOUSE_UP,this._endCallback),e.removeEventListener(l.Events.MOUSE_DRAG,this._dragCallback),e.removeEventListener(l.Events.MOUSE_CLICK,this._endCallback)}}async preMouseDownCallback(e){const t=e.detail,{element:n,currentPoints:i}=t,{world:a}=i,o=(0,s.getEnabledElement)(n),{viewport:r,renderingEngine:l}=o;return await super.preMouseDownCallback(e),Object.assign(this.growCutData,{circleCenterPoint:a,circleBorderPoint:a}),this._activateDraw(n),(0,ve.hideElementCursor)(n),(0,L.A)([r.id]),!0}async getGrowCutLabelmap(e){const{segmentation:{referencedVolumeId:t},renderingEngineId:n,viewportId:i,circleCenterPoint:a,circleBorderPoint:o,options:r}=e,l=(0,s.getRenderingEngine)(n).getViewport(i),d={center:a,radius:T.eR.len(T.eR.sub(T.eR.create(),a,o))};return O.growCut.runGrowCutForSphere(t,d,l,r)}_activateDraw(e){e.addEventListener(l.Events.MOUSE_UP,this._endCallback),e.addEventListener(l.Events.MOUSE_DRAG,this._dragCallback),e.addEventListener(l.Events.MOUSE_CLICK,this._endCallback)}renderAnnotation(e,t){if(!this.growCutData)return;const{viewport:n}=e,{segmentation:i,circleCenterPoint:a,circleBorderPoint:o}=this.growCutData,r=n.worldToCanvas(a),l=n.worldToCanvas(o),d=T.Zc.sub(T.Zc.create(),l,r),c=T.Zc.len(d);if(s.utilities.isEqual(c,0))return;const{color:h}=this.getSegmentStyle({segmentationId:i.segmentationId,segmentIndex:i.segmentIndex,viewportId:n.id});(0,M.drawCircle)(t,"growcut","0",r,c,{color:h})}}var Cn=n(16171);class bn extends En.A{static{this.toolName="RegionSegmentPlus"}constructor(e={},t={supportedInteractionTypes:["Mouse","Touch"],configuration:{isPartialVolume:!1,positiveSeedVariance:.4,negativeSeedVariance:.9,subVolumePaddingPercentage:.1,islandRemoval:{enabled:!1}}}){super(e,t),this.mouseTimer=null,this.allowedToProceed=!1}mouseMoveCallback(e){if(this.mode!==l.ToolModes.Active)return;const t=e.detail,{currentPoints:n,element:i}=t,{world:a}=n;i.style.cursor="default",null!==this.mouseTimer&&(window.clearTimeout(this.mouseTimer),this.mouseTimer=null),this.mouseTimer=window.setTimeout((()=>{this.onMouseStable(e,a,i)}),this.configuration.mouseStabilityDelay||500)}async onMouseStable(e,t,n){await super.preMouseDownCallback(e);const i=s.cache.getVolume(this.growCutData.segmentation.referencedVolumeId),a=(0,Cn.sG)(i,t,{})||{positiveSeedIndices:new Set,negativeSeedIndices:new Set},{positiveSeedIndices:o,negativeSeedIndices:r}=a;let l;o.size/r.size>20||r.size<30?(l="not-allowed",this.allowedToProceed=!1):(l="copy",this.allowedToProceed=!0);const d=(0,s.getEnabledElement)(n);n&&(n.style.cursor=l,requestAnimationFrame((()=>{n.style.cursor!==l&&(n.style.cursor=l)}))),this.allowedToProceed&&(this.seeds=a),d&&d.viewport&&d.viewport.render()}async preMouseDownCallback(e){if(!this.allowedToProceed)return!1;const t=e.detail,{currentPoints:n,element:i}=t;(0,s.getEnabledElement)(i)&&(i.style.cursor="wait",requestAnimationFrame((()=>{"wait"!==i.style.cursor&&(i.style.cursor="wait")})));const{world:a}=n;return await super.preMouseDownCallback(e),this.growCutData=s.utilities.deepMerge(this.growCutData,{worldPoint:a,islandRemoval:{worldIslandPoints:[a]}}),this.growCutData.worldPoint=a,this.growCutData.islandRemoval={worldIslandPoints:[a]},await this.runGrowCut(),i&&(i.style.cursor="default"),!0}getRemoveIslandData(e){const{worldPoint:t}=e;return{worldIslandPoints:[t]}}async getGrowCutLabelmap(e){const{segmentation:{referencedVolumeId:t},worldPoint:n,options:i}=e,{subVolumePaddingPercentage:a}=this.configuration,o={...i,subVolumePaddingPercentage:a,seeds:this.seeds};return O.growCut.runOneClickGrowCut({referencedVolumeId:t,worldPosition:n,options:o})}}const _n=[-1/0,-995],Tn=[0,1900],Sn=[1e3,1900],{transformWorldToIndex:Dn,transformIndexToWorld:An}=s.utilities;class Mn extends En.A{constructor(e={},t={supportedInteractionTypes:["Mouse","Touch"],configuration:{isPartialVolume:!0,positivePixelRange:Tn,negativePixelRange:_n,islandRemoval:{enabled:!0,islandPixelRange:Sn}}}){super(e,t),this._dragCallback=e=>{const t=e.detail,{element:n,currentPoints:i}=t,{world:a}=i,o=(0,s.getEnabledElement)(n),{viewport:r}=o,l=this._getHorizontalLineWorldPoints(o,a);this.growCutData.horizontalLines[1]=l,(0,L.A)([r.id])},this._endCallback=async e=>{const t=e.detail,{element:n}=t,i=(0,s.getEnabledElement)(n),{viewport:a}=i;await this.runGrowCut(),this._deactivateDraw(n),this.growCutData=null,(0,ve.resetElementCursor)(n),(0,L.A)([a.id])},this._deactivateDraw=e=>{e.removeEventListener(l.Events.MOUSE_UP,this._endCallback),e.removeEventListener(l.Events.MOUSE_DRAG,this._dragCallback),e.removeEventListener(l.Events.MOUSE_CLICK,this._endCallback)}}async preMouseDownCallback(e){const t=e.detail,{element:n,currentPoints:i}=t,{world:a}=i,o=(0,s.getEnabledElement)(n),{viewport:r,renderingEngine:l}=o,d=this._getHorizontalLineWorldPoints(o,a);return await super.preMouseDownCallback(e),this.growCutData.horizontalLines=[d,d],this._activateDraw(n),(0,ve.hideElementCursor)(n),(0,L.A)([r.id]),!0}renderAnnotation(e,t){if(!this.growCutData)return;const{segmentation:n,horizontalLines:i}=this.growCutData;if(2!==i.length)return;const{viewport:a}=e,{segmentationId:o,segmentIndex:s}=n,[r,l]=i,[d,c]=r,[h,g]=l,u=[d,c,g,h].map((e=>a.worldToCanvas(e))),{color:m,fillColor:v,lineWidth:p,fillOpacity:f,lineDash:w}=this.getSegmentStyle({segmentationId:o,segmentIndex:s,viewportId:a.id});(0,M.drawPolyline)(t,"growCutRect","0",u,{color:m,fillColor:v,fillOpacity:f,lineWidth:p,lineDash:w,closePath:!0})}async getGrowCutLabelmap(e){const{segmentation:{segmentIndex:t,referencedVolumeId:n},renderingEngineId:i,viewportId:a,horizontalLines:o}=e,r=(0,s.getRenderingEngine)(i).getViewport(a),[l,d]=o,c=[l[0],l[1],d[1],d[0]],h=s.cache.getVolume(n),{topLeft:g,bottomRight:u}=this._getWorldBoundingBoxFromProjectedSquare(r,c),m={boundingBox:{ijkTopLeft:Dn(h.imageData,g),ijkBottomRight:Dn(h.imageData,u)}},v=this.configuration,p={positiveSeedValue:t,negativeSeedValue:255,negativePixelRange:v.negativePixelRange,positivePixelRange:v.positivePixelRange};return O.growCut.runGrowCutForBoundingBox(n,m,p)}getRemoveIslandData(){const{segmentation:{segmentIndex:e,referencedVolumeId:t,labelmapVolumeId:n}}=this.growCutData,i=s.cache.getVolume(t),a=s.cache.getVolume(n),o=i.voxelManager.getCompleteScalarDataArray(),r=a.voxelManager.getCompleteScalarDataArray(),{islandPixelRange:l}=this.configuration.islandRemoval,d=[];for(let t=0,n=r.length;t<n;t++){if(r[t]!==e)continue;const n=o[t];n>=l[0]&&n<=l[1]&&d.push(t)}return{islandPointIndexes:d}}_activateDraw(e){e.addEventListener(l.Events.MOUSE_UP,this._endCallback),e.addEventListener(l.Events.MOUSE_DRAG,this._dragCallback),e.addEventListener(l.Events.MOUSE_CLICK,this._endCallback)}_projectWorldPointAcrossSlices(e,t,n){const i=this._getViewportVolume(e),{dimensions:a}=i,o=Dn(i.imageData,t),r=n.findIndex((e=>s.utilities.isEqual(Math.abs(e),1)));if(-1===r)throw new Error("Non-orthogonal direction vector");const l=[...o],d=[...o];return l[r]=0,d[r]=a[r]-1,[l,d]}_getCuboidIJKEdgePointsFromProjectedWorldPoint(e,t){const{viewPlaneNormal:n}=e.getCamera();return this._projectWorldPointAcrossSlices(e,t,n)}_getWorldCuboidCornerPoints(e,t){const n=[],i=this._getViewportVolume(e);return t.forEach((t=>{const a=this._getCuboidIJKEdgePointsFromProjectedWorldPoint(e,t).map((e=>An(i.imageData,e)));n.push(...a)})),n}_getWorldBoundingBoxFromProjectedSquare(e,t){const n=this._getWorldCuboidCornerPoints(e,t),i=[...n[0]],a=[...n[0]];return n.forEach((e=>{T.eR.min(i,i,e),T.eR.max(a,a,e)})),{topLeft:i,bottomRight:a}}_getViewportVolume(e){if(!(e instanceof s.BaseVolumeViewport))throw new Error("Viewport is not a BaseVolumeViewport");const t=e.getAllVolumeIds()[0];return s.cache.getVolume(t)}_getHorizontalLineIJKPoints(e,t){const{viewport:n}=e,i=this._getViewportVolume(n),{dimensions:a}=i,o=Dn(i.imageData,t),{viewUp:r,viewPlaneNormal:l}=n.getCamera(),d=T.eR.cross(T.eR.create(),r,l).findIndex((e=>s.utilities.isEqual(Math.abs(e),1))),c=[...o],h=[...o];return c[d]=0,h[d]=a[d]-1,[c,h]}_getHorizontalLineWorldPoints(e,t){const{viewport:n}=e,i=this._getViewportVolume(n),[a,o]=this._getHorizontalLineIJKPoints(e,t);return[An(i.imageData,a),An(i.imageData,o)]}}Mn.toolName="WholeBodySegment";var yn=n(23631),xn=n(10088),Pn=n(47347),Rn=n(98870);class Ln extends yn.A{constructor(e={},t={supportedInteractionTypes:["Mouse","Touch"],configuration:{strategies:{FILL_INSIDE:xn.pY,ERASE_INSIDE:Pn.M},defaultStrategy:"FILL_INSIDE",activeStrategy:"FILL_INSIDE"}}){super(e,t),this.preMouseDownCallback=e=>{if(!0===this.isDrawing)return;const t=e.detail,{currentPoints:n,element:i}=t,a=n.world,o=(0,s.getEnabledElement)(i),{viewport:r}=o;this.isDrawing=!0;const d=r.getCamera(),{viewPlaneNormal:c,viewUp:h}=d,g=ne.activeSegmentation.getActiveSegmentation(r.id);if(!g)throw new Error("No active segmentation detected, create one before using scissors tool");const{segmentationId:u}=g,m=ne.segmentIndex.getActiveSegmentIndex(u),v=ne.segmentLocking.getLockedSegmentIndices(u),p=ne.config.color.getSegmentIndexColor(r.id,u,m),{representationData:f}=(0,Rn.getSegmentation)(u),w=f[l.SegmentationRepresentations.Labelmap],E={highlighted:!0,invalidated:!0,metadata:{viewPlaneNormal:[...c],viewUp:[...h],FrameOfReferenceUID:r.getFrameOfReferenceUID(),referencedImageId:"",toolName:this.getToolName(),segmentColor:p},data:{handles:{points:[[...a],[...a],[...a],[...a]],activeHandleIndex:null}}},I=(0,W.getViewportIdsWithToolToRender)(i,this.getToolName());if(this.editData={annotation:E,segmentIndex:m,segmentationId:u,segmentsLocked:v,segmentColor:p,viewportIdsToRender:I,handleIndex:3,movingTextBox:!1,newAnnotation:!0,hasMoved:!1,volumeId:null,referencedVolumeId:null,imageId:null},r instanceof s.BaseVolumeViewport){const{volumeId:e}=w,t=s.cache.getVolume(e);this.editData={...this.editData,volumeId:e,referencedVolumeId:t.referencedVolumeId}}else{const e=(0,Rn.getCurrentLabelmapImageIdForViewport)(r.id,u);this.editData={...this.editData,imageId:e}}return this._activateDraw(i),(0,ve.hideElementCursor)(i),e.preventDefault(),(0,L.A)(I),!0},this._dragCallback=e=>{this.isDrawing=!0;const t=e.detail,{element:n}=t,{annotation:i,viewportIdsToRender:a,handleIndex:o}=this.editData,{data:r}=i,{currentPoints:l}=t,d=(0,s.getEnabledElement)(n),{worldToCanvas:c,canvasToWorld:h}=d.viewport,g=l.world,{points:u}=r.handles;let m,v,p,f,w,E,I,C;switch(u[o]=[...g],o){case 0:case 3:m=c(u[0]),f=c(u[3]),v=[f[0],m[1]],p=[m[0],f[1]],E=h(v),I=h(p),u[1]=E,u[2]=I;break;case 1:case 2:v=c(u[1]),p=c(u[2]),m=[p[0],v[1]],f=[v[0],p[1]],w=h(m),C=h(f),u[0]=w,u[3]=C}i.invalidated=!0,this.editData.hasMoved=!0,(0,L.A)(a)},this._endCallback=e=>{const t=e.detail,{element:n}=t,{annotation:i,newAnnotation:a,hasMoved:o}=this.editData,{data:r}=i;if(a&&!o)return;r.handles.activeHandleIndex=null,this._deactivateDraw(n),(0,ve.resetElementCursor)(n);const l=(0,s.getEnabledElement)(n),d={...this.editData,points:r.handles.points,createMemo:this.createMemo.bind(this)};this.editData=null,this.isDrawing=!1,this.applyActiveStrategy(l,d),this.doneEditMemo()},this._activateDraw=e=>{e.addEventListener(l.Events.MOUSE_UP,this._endCallback),e.addEventListener(l.Events.MOUSE_DRAG,this._dragCallback),e.addEventListener(l.Events.MOUSE_MOVE,this._dragCallback),e.addEventListener(l.Events.MOUSE_CLICK,this._endCallback),e.addEventListener(l.Events.TOUCH_END,this._endCallback),e.addEventListener(l.Events.TOUCH_DRAG,this._dragCallback),e.addEventListener(l.Events.TOUCH_TAP,this._endCallback)},this._deactivateDraw=e=>{e.removeEventListener(l.Events.MOUSE_UP,this._endCallback),e.removeEventListener(l.Events.MOUSE_DRAG,this._dragCallback),e.removeEventListener(l.Events.MOUSE_MOVE,this._dragCallback),e.removeEventListener(l.Events.MOUSE_CLICK,this._endCallback),e.removeEventListener(l.Events.TOUCH_TAP,this._endCallback),e.removeEventListener(l.Events.TOUCH_END,this._endCallback),e.removeEventListener(l.Events.TOUCH_DRAG,this._dragCallback)},this.renderAnnotation=(e,t)=>{let n=!1;if(!this.editData)return n;const{viewport:i}=e,{annotation:a}=this.editData,o=a.metadata,s=a.annotationUID,r=a.data,{points:l}=r.handles,d=l.map((e=>i.worldToCanvas(e))),c=`rgb(${o.segmentColor.slice(0,3)})`;if(!i.getRenderingEngine())return console.warn("Rendering Engine has been destroyed"),n;return(0,M.drawRect)(t,s,"0",d[0],d[3],{color:c}),n=!0,n}}}Ln.toolName="RectangleScissor";var Un=n(56789),On=n(33852);class kn extends yn.A{constructor(e={},t={supportedInteractionTypes:["Mouse","Touch"],configuration:{strategies:{FILL_INSIDE:Un.kr,ERASE_INSIDE:On.r},defaultStrategy:"FILL_INSIDE",activeStrategy:"FILL_INSIDE"}}){super(e,t),this.preMouseDownCallback=e=>{if(!0===this.isDrawing)return;const t=e.detail,{currentPoints:n,element:i}=t,a=n.world,o=n.canvas,r=(0,s.getEnabledElement)(i),{viewport:l}=r;this.isDrawing=!0;const d=l.getCamera(),{viewPlaneNormal:c,viewUp:h}=d,g=ne.activeSegmentation.getActiveSegmentation(l.id);if(!g)throw new Error("No active segmentation detected, create one before using scissors tool");const{segmentationId:u}=g,m=ne.segmentIndex.getActiveSegmentIndex(u),v=ne.segmentLocking.getLockedSegmentIndices(u),p=ne.config.color.getSegmentIndexColor(l.id,u,m),{representationData:f}=(0,Rn.getSegmentation)(u),w=f.Labelmap;if(!w)throw new Error("No labelmap data found for the active segmentation, create one before using scissors tool");const E={invalidated:!0,highlighted:!0,metadata:{viewPlaneNormal:[...c],viewUp:[...h],FrameOfReferenceUID:l.getFrameOfReferenceUID(),referencedImageId:"",toolName:this.getToolName(),segmentColor:p},data:{handles:{points:[[...a],[...a],[...a],[...a]],activeHandleIndex:null},isDrawing:!0,cachedStats:{}}},I=[l.id];if(this.editData={annotation:E,centerCanvas:o,segmentIndex:m,segmentationId:u,segmentsLocked:v,segmentColor:p,viewportIdsToRender:I,handleIndex:3,movingTextBox:!1,newAnnotation:!0,hasMoved:!1,volumeId:null,referencedVolumeId:null,imageId:null},l instanceof s.BaseVolumeViewport){const{volumeId:e}=w,t=s.cache.getVolume(e);this.editData={...this.editData,volumeId:e,referencedVolumeId:t.referencedVolumeId}}else{const e=(0,Rn.getCurrentLabelmapImageIdForViewport)(l.id,u);this.editData={...this.editData,imageId:e}}return this._activateDraw(i),(0,ve.hideElementCursor)(i),e.preventDefault(),(0,L.A)(I),!0},this._dragCallback=e=>{this.isDrawing=!0;const t=e.detail,{element:n}=t,{currentPoints:i}=t,a=i.canvas,o=(0,s.getEnabledElement)(n),{renderingEngine:r,viewport:l}=o,{canvasToWorld:d}=l,{annotation:c,viewportIdsToRender:h,centerCanvas:g}=this.editData,{data:u}=c,m=Math.abs(a[0]-g[0]),v=Math.abs(a[1]-g[1]),p=Math.sqrt(m*m+v*v),f=[g[0],g[1]+p],w=[g[0],g[1]-p],E=[g[0]-p,g[1]],I=[g[0]+p,g[1]];u.handles.points=[d(f),d(w),d(E),d(I)],c.invalidated=!0,this.editData.hasMoved=!0,(0,L.A)(h)},this._endCallback=e=>{const t=e.detail,{element:n}=t,{annotation:i,newAnnotation:a,hasMoved:o}=this.editData,{data:r}=i,{viewPlaneNormal:l,viewUp:d}=i.metadata;if(a&&!o)return;r.handles.activeHandleIndex=null,this._deactivateDraw(n),(0,ve.resetElementCursor)(n);const c=(0,s.getEnabledElement)(n),h={...this.editData,points:r.handles.points,viewPlaneNormal:l,viewUp:d,createMemo:this.createMemo.bind(this)};this.editData=null,this.isDrawing=!1,this.applyActiveStrategy(c,h),this.doneEditMemo()},this._activateDraw=e=>{e.addEventListener(l.Events.MOUSE_UP,this._endCallback),e.addEventListener(l.Events.MOUSE_DRAG,this._dragCallback),e.addEventListener(l.Events.MOUSE_CLICK,this._endCallback),e.addEventListener(l.Events.MOUSE_MOVE,this._dragCallback),e.addEventListener(l.Events.TOUCH_TAP,this._endCallback),e.addEventListener(l.Events.TOUCH_DRAG,this._dragCallback),e.addEventListener(l.Events.TOUCH_END,this._endCallback)},this._deactivateDraw=e=>{e.removeEventListener(l.Events.MOUSE_UP,this._endCallback),e.removeEventListener(l.Events.MOUSE_DRAG,this._dragCallback),e.removeEventListener(l.Events.MOUSE_CLICK,this._endCallback),e.removeEventListener(l.Events.MOUSE_MOVE,this._dragCallback),e.removeEventListener(l.Events.TOUCH_END,this._endCallback),e.removeEventListener(l.Events.TOUCH_DRAG,this._dragCallback),e.removeEventListener(l.Events.TOUCH_TAP,this._endCallback)},this.renderAnnotation=(e,t)=>{let n=!1;if(!this.editData)return n;const{viewport:i}=e,{viewportIdsToRender:a}=this.editData;if(!a.includes(i.id))return n;const{annotation:o}=this.editData,s=o.metadata,r=o.annotationUID,l=o.data,{points:d}=l.handles,c=d.map((e=>i.worldToCanvas(e))),h=c[0],g=c[1],u=[Math.floor((h[0]+g[0])/2),Math.floor((h[1]+g[1])/2)],m=Math.abs(h[1]-Math.floor((h[1]+g[1])/2)),v=`rgb(${s.segmentColor.slice(0,3)})`;if(!i.getRenderingEngine())return console.warn("Rendering Engine has been destroyed"),n;return(0,M.drawCircle)(t,r,"0",u,m,{color:v}),n=!0,n}}}kn.toolName="CircleScissor";var Nn=n(17492),Vn=n(1989);class Wn extends yn.A{constructor(e={},t={supportedInteractionTypes:["Mouse","Touch"],configuration:{strategies:{FILL_INSIDE:Nn.Jq,ERASE_INSIDE:Vn._},defaultStrategy:"FILL_INSIDE",activeStrategy:"FILL_INSIDE"}}){super(e,t),this.preMouseDownCallback=e=>{if(!0===this.isDrawing)return;this.doneEditMemo();const t=e.detail,{currentPoints:n,element:i}=t,a=n.world,o=n.canvas,r=(0,s.getEnabledElement)(i),{viewport:l}=r;this.isDrawing=!0;const d=l.getCamera(),{viewPlaneNormal:c,viewUp:h}=d,g=ne.activeSegmentation.getActiveSegmentation(l.id);if(!g)throw new Error("No active segmentation detected, create one before using scissors tool");const{segmentationId:u}=g,m=ne.segmentIndex.getActiveSegmentIndex(u),v=ne.segmentLocking.getLockedSegmentIndices(u),p=ne.config.color.getSegmentIndexColor(l.id,u,m);this.isDrawing=!0;const f={metadata:{viewPlaneNormal:[...c],viewUp:[...h],FrameOfReferenceUID:l.getFrameOfReferenceUID(),referencedImageId:"",toolName:this.getToolName(),segmentColor:p},data:{invalidated:!0,handles:{points:[[...a],[...a],[...a],[...a]],activeHandleIndex:null},cachedStats:{},highlighted:!0}},w=[l.id];this.editData={annotation:f,centerCanvas:o,segmentIndex:m,segmentationId:u,segmentsLocked:v,segmentColor:p,toolGroupId:this.toolGroupId,viewportIdsToRender:w,handleIndex:3,movingTextBox:!1,newAnnotation:!0,hasMoved:!1,volumeId:null,referencedVolumeId:null,imageId:null};const{representationData:E}=(0,Rn.getSegmentation)(u),I=this.getEditData({viewport:l,representationData:E,segmentsLocked:v,segmentationId:u});return this.editData={...this.editData,...I},this._activateDraw(i),(0,ve.hideElementCursor)(i),e.preventDefault(),(0,L.A)(w),!0},this._dragCallback=e=>{this.isDrawing=!0;const t=e.detail,{element:n}=t,{currentPoints:i}=t,a=i.canvas,o=(0,s.getEnabledElement)(n),{renderingEngine:r,viewport:l}=o,{canvasToWorld:d}=l,{annotation:c,viewportIdsToRender:h,centerCanvas:g}=this.editData,{data:u}=c,m=Math.abs(a[0]-g[0]),v=Math.abs(a[1]-g[1]),p=Math.sqrt(m*m+v*v),f=[g[0],g[1]+p],w=[g[0],g[1]-p],E=[g[0]-p,g[1]],I=[g[0]+p,g[1]];u.handles.points=[d(f),d(w),d(E),d(I)],c.invalidated=!0,this.editData.hasMoved=!0,(0,L.A)(h)},this._endCallback=e=>{const t=e.detail,{element:n}=t,{annotation:i,newAnnotation:a,hasMoved:o,segmentIndex:r,segmentsLocked:l}=this.editData,{data:d}=i,{viewPlaneNormal:c,viewUp:h}=i.metadata;if(a&&!o)return;i.highlighted=!1,d.handles.activeHandleIndex=null,this._deactivateDraw(n),(0,ve.resetElementCursor)(n);const g=(0,s.getEnabledElement)(n),u={...this.editData,points:d.handles.points,segmentIndex:r,segmentsLocked:l,viewPlaneNormal:c,viewUp:h,createMemo:this.createMemo.bind(this)};this.editData=null,this.isDrawing=!1,this.applyActiveStrategy(g,u),this.doneEditMemo()},this._activateDraw=e=>{e.addEventListener(l.Events.MOUSE_UP,this._endCallback),e.addEventListener(l.Events.MOUSE_DRAG,this._dragCallback),e.addEventListener(l.Events.MOUSE_CLICK,this._endCallback),e.addEventListener(l.Events.MOUSE_MOVE,this._dragCallback),e.addEventListener(l.Events.TOUCH_END,this._endCallback),e.addEventListener(l.Events.TOUCH_TAP,this._endCallback),e.addEventListener(l.Events.TOUCH_DRAG,this._dragCallback)},this._deactivateDraw=e=>{e.removeEventListener(l.Events.MOUSE_UP,this._endCallback),e.removeEventListener(l.Events.MOUSE_DRAG,this._dragCallback),e.removeEventListener(l.Events.MOUSE_CLICK,this._endCallback),e.removeEventListener(l.Events.MOUSE_MOVE,this._dragCallback),e.removeEventListener(l.Events.TOUCH_END,this._endCallback),e.removeEventListener(l.Events.TOUCH_DRAG,this._dragCallback),e.removeEventListener(l.Events.TOUCH_TAP,this._endCallback)},this.renderAnnotation=(e,t)=>{let n=!1;if(!this.editData)return n;const{viewport:i}=e,{viewportIdsToRender:a}=this.editData;if(!a.includes(i.id))return n;const{annotation:o}=this.editData,s=o.metadata,r=o.annotationUID,l=o.data,{points:d}=l.handles,c=d.map((e=>i.worldToCanvas(e))),h=c[0],g=c[1],u=[Math.floor((h[0]+g[0])/2),Math.floor((h[1]+g[1])/2)],m=Math.abs(h[1]-Math.floor((h[1]+g[1])/2)),v=`rgb(${s.segmentColor.slice(0,3)})`;if(!i.getRenderingEngine())return console.warn("Rendering Engine has been destroyed"),n;return(0,M.drawCircle)(t,r,"0",u,m,{color:v}),n=!0,n}}}Wn.toolName="SphereScissor";n(40336),n(67847);const{transformWorldToIndex:Bn}=s.utilities;class Hn extends Nt{constructor(e={},t={supportedInteractionTypes:["Mouse","Touch"],configuration:{storePointData:!1,numSlicesToPropagate:10,calculatePointsInsideVolume:!1,getTextLines:Fn,statsCalculator:xt.BasicStatsCalculator,showTextBox:!1}}){super(e,t),this.isHandleOutsideImage=!1,this.addNewAnnotation=e=>{const t=e.detail,{currentPoints:n,element:i}=t,a=n.world,o=(0,s.getEnabledElement)(i),{viewport:l,renderingEngine:d}=o;this.isDrawing=!0;const c=l.getCamera(),{viewPlaneNormal:h,viewUp:g}=c;let u,m,v;if(l instanceof s.StackViewport)throw new Error("Stack Viewport Not implemented");{const e=this.getTargetId(l);v=s.utilities.getVolumeId(e),m=s.cache.getVolume(v),u=s.utilities.getClosestImageId(m,a,h)}const p=s.utilities.getSpacingInNormalDirection(m,h),f=this._getStartCoordinate(a,p,h),w=this._getEndCoordinate(a,p,h),E=l.getFrameOfReferenceUID(),I={highlighted:!0,invalidated:!0,metadata:{toolName:this.getToolName(),viewPlaneNormal:[...h],viewUp:[...g],FrameOfReferenceUID:E,referencedImageId:u,volumeId:v,spacingInNormal:p,enabledElement:o},data:{label:"",startCoordinate:f,endCoordinate:w,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:[[...a],[...a]],activeHandleIndex:null},cachedStats:{pointsInVolume:[],projectionPoints:[],statistics:[]},labelmapUID:null}};this._computeProjectionPoints(I,m),(0,r.addAnnotation)(I,i);const C=(0,W.getViewportIdsWithToolToRender)(i,this.getToolName());return this.editData={annotation:I,viewportIdsToRender:C,newAnnotation:!0,hasMoved:!1},this._activateDraw(i),(0,ve.hideElementCursor)(i),e.preventDefault(),(0,L.A)(C),I},this._endCallback=e=>{const t=e.detail,{element:n}=t,{annotation:i,viewportIdsToRender:a,newAnnotation:o,hasMoved:l}=this.editData,{data:d}=i;if(o&&!l)return;i.highlighted=!1,d.handles.activeHandleIndex=null,this._deactivateModify(n),this._deactivateDraw(n),(0,ve.resetElementCursor)(n);const c=(0,s.getEnabledElement)(n);this.editData=null,this.isDrawing=!1,this.isHandleOutsideImage&&this.configuration.preventHandleOutsideImage&&(0,r.removeAnnotation)(i.annotationUID);const h=this.getTargetId(c.viewport),g=s.cache.getVolume(h.split(/volumeId:|\?/)[1]);this.configuration.calculatePointsInsideVolume&&this._computePointsInsideVolume(i,g,h,c),(0,L.A)(a),o&&(0,ee.triggerAnnotationCompleted)(i)},this.renderAnnotation=(e,t)=>{let n=!1;const{viewport:i}=e;let a=(0,r.getAnnotations)(this.getToolName(),i.element);if(!a?.length)return n;a=(0,V.filterAnnotationsWithinSamePlane)(a,i.getCamera());const o={toolGroupId:this.toolGroupId,toolName:this.getToolName(),viewportId:e.viewport.id};for(let r=0;r<a.length;r++){const l=a[r],{annotationUID:d,data:c,metadata:h}=l,{startCoordinate:g,endCoordinate:u}=c,{points:m,activeHandleIndex:v}=c.handles;o.annotationUID=d;const p=this.getStyle("lineWidth",o,l),f=this.getStyle("lineDash",o,l),w=this.getStyle("color",o,l),E=m.map((e=>i.worldToCanvas(e))),I=E[0],C=(0,Ve.getCanvasCircleRadius)(E),{centerPointRadius:b}=this.configuration,_=(0,Ve.getCanvasCircleCorners)(E),T=i.getCamera().focalPoint,S=i.getCamera().viewPlaneNormal;let D=g,A=u;Array.isArray(g)&&(D=this._getCoordinateForViewplaneNormal(D,S),c.startCoordinate=D),Array.isArray(u)&&(A=this._getCoordinateForViewplaneNormal(A,S),c.endCoordinate=A);const y=s.utilities.roundToPrecision(c.startCoordinate),x=s.utilities.roundToPrecision(c.endCoordinate),P=this._getCoordinateForViewplaneNormal(T,S),R=s.utilities.roundToPrecision(P);if(R<Math.min(y,x)||R>Math.max(y,x))continue;const L=s.utilities.roundToPrecision((c.startCoordinate+c.endCoordinate)/2);let U,O=!1;if(R===L&&(O=!0),c.handles.points[0][this._getIndexOfCoordinatesForViewplaneNormal(S)]=L,l.invalidated&&this._throttledCalculateCachedStats(l,e),!i.getRenderingEngine())return console.warn("Rendering Engine has been destroyed"),n;if(!(0,Ne.isAnnotationVisible)(d))continue;if((0,Se.isAnnotationLocked)(d)||this.editData||null===v||!O||(U=[E[v]]),U){const e="0";(0,M.drawHandles)(t,d,e,U,{color:w})}let N=p,V=f;O?(N=p,V=[]):V=[5,5];const W="0";if((0,M.drawCircle)(t,d,W,I,C,{color:w,lineDash:V,lineWidth:N}),b>0&&C>3*b&&(0,M.drawCircle)(t,d,`${W}-center`,I,b,{color:w,lineDash:f,lineWidth:p}),n=!0,1==this.configuration.showTextBox&&1==this.configuration.calculatePointsInsideVolume){const e=this.getLinkedTextBoxStyle(o,l);if(!e.visibility){c.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(c,{metadata:h});if(!n||0===n.length)continue;let a;c.handles.textBox.hasMoved||(a=(0,k.getTextBoxCoordsCanvas)(_),c.handles.textBox.worldPosition=i.canvasToWorld(a));const s=i.worldToCanvas(c.handles.textBox.worldPosition),r="1",g=(0,M.drawLinkedTextBox)(t,d,r,n,s,E,{},e),{x:u,y:m,width:v,height:p}=g;c.handles.textBox.worldBoundingBox={topLeft:i.canvasToWorld([u,m]),topRight:i.canvasToWorld([u+v,m]),bottomLeft:i.canvasToWorld([u,m+p]),bottomRight:i.canvasToWorld([u+v,m+p])}}}return n},this._throttledCalculateCachedStats=(0,x.A)(this._calculateCachedStatsTool,100,{trailing:!0})}_computeProjectionPoints(e,t){const{data:n,metadata:i}=e,{viewPlaneNormal:a,spacingInNormal:o}=i,{imageData:r}=t,{startCoordinate:l,endCoordinate:d}=n,{points:c}=n.handles,h=Bn(r,c[0]),g=Bn(r,c[0]),u=s.utilities.deepClone(c),m=T.eR.create();r.indexToWorldVec3(h,m);const v=T.eR.create();r.indexToWorldVec3(g,v),2==this._getIndexOfCoordinatesForViewplaneNormal(a)?(m[2]=l,v[2]=d,u[0][2]=l,u[1][2]=l):0==this._getIndexOfCoordinatesForViewplaneNormal(a)?(m[0]=l,v[0]=d,u[0][0]=l,u[1][0]=l):1==this._getIndexOfCoordinatesForViewplaneNormal(a)&&(m[1]=l,v[1]=d,u[0][1]=l,u[1][1]=l);const p=T.eR.distance(m,v),f=[];for(let e=0;e<p;e+=o)f.push(u.map((t=>{const n=T.eR.create();return T.eR.scaleAndAdd(n,t,a,e),Array.from(n)})));n.cachedStats.projectionPoints=f}_computePointsInsideVolume(e,t,n,i){const{data:a,metadata:o}=e,{viewPlaneNormal:s,viewUp:r}=o,{viewport:l}=i,d=a.cachedStats.projectionPoints,c=[[]],h=this.getTargetImageData(n),g=a.handles.points.map((e=>l.worldToCanvas(e))),[u,m]=(0,Ve.getCanvasCircleCorners)(g),v=l.canvasToWorld(u),p=l.canvasToWorld(m),{worldWidth:f,worldHeight:w}=(0,Mt.A)(s,r,v,p),E=(0,R.Op)(h,a.handles),I=(0,R.CQ)(h),C=Math.abs(Math.PI*(f/E.scale/2)*(w/I/E.scale/2)),b={isPreScaled:(0,Ct.u)(l,n),isSuvScaled:this.isSuvScaled(l,n,e.metadata.referencedImageId)},_=(0,J.j)(o.Modality,e.metadata.referencedImageId,b);for(let e=0;e<d.length;e++){if(!t)continue;const n=d[e][0],i=d[e].map((e=>l.worldToCanvas(e))),[a,o]=(0,Ve.getCanvasCircleCorners)(i),r=l.canvasToWorld(a),h=l.canvasToWorld(o),g=r,u=h,{dimensions:m,imageData:v,voxelManager:p}=t,f=Bn(v,g),w=Bn(v,n),E=this._getIndexOfCoordinatesForViewplaneNormal(s);f[0]=Math.floor(f[0]),f[1]=Math.floor(f[1]),f[2]=Math.floor(f[2]),f[E]=w[E];const I=Bn(v,u);if(I[0]=Math.floor(I[0]),I[1]=Math.floor(I[1]),I[2]=Math.floor(I[2]),I[E]=w[E],this._isInsideVolume(f,I,m)){const e=[[Math.min(f[0],I[0]),Math.max(f[0],I[0])],[Math.min(f[1],I[1]),Math.max(f[1],I[1])],[Math.min(f[2],I[2]),Math.max(f[2],I[2])]],t={center:n,xRadius:Math.abs(r[0]-h[0])/2,yRadius:Math.abs(r[1]-h[1])/2,zRadius:Math.abs(r[2]-h[2])/2},i=p.forEach(this.configuration.statsCalculator.statsCallback,{isInObject:e=>(0,yt.pointInEllipse)(t,e),boundsIJK:e,imageData:v,returnPoints:this.configuration.storePointData});c.push(i)}}const T=this.configuration.statsCalculator.getStatistics();a.cachedStats.pointsInVolume=c,a.cachedStats.statistics={Modality:o.Modality,area:C,mean:T.mean?.value,stdDev:T.stdDev?.value,max:T.max?.value,statsArray:T.array,areaUnit:E.areaUnit,modalityUnit:_}}_calculateCachedStatsTool(e,t){const n=e.data,{viewport:i}=t,{cachedStats:a}=n,o=this.getTargetId(i),r=s.cache.getVolume(o.split(/volumeId:|\?/)[1]);return this._computeProjectionPoints(e,r),this.configuration.calculatePointsInsideVolume&&this._computePointsInsideVolume(e,r,o,t),e.invalidated=!1,(0,ee.triggerAnnotationModified)(e,i.element),a}_getStartCoordinate(e,t,n){const i=this.configuration.numSlicesToPropagate,a=Math.round(i/2),o=T.eR.create();T.eR.scaleAndAdd(o,e,n,a*-t);return this._getCoordinateForViewplaneNormal(o,n)}_getEndCoordinate(e,t,n){const i=this.configuration.numSlicesToPropagate,a=i-Math.round(i/2),o=T.eR.create();T.eR.scaleAndAdd(o,e,n,a*t);return this._getCoordinateForViewplaneNormal(o,n)}_getIndexOfCoordinatesForViewplaneNormal(e){const t=[Math.abs(e[0]),Math.abs(e[1]),Math.abs(e[2])];return t.indexOf(Math.max(...t))}_getCoordinateForViewplaneNormal(e,t){return e[this._getIndexOfCoordinatesForViewplaneNormal(t)]}}function Fn(e,t={}){const n=e.cachedStats.statistics,{area:i,mean:a,max:o,stdDev:r,areaUnit:l,modalityUnit:d}=n;if(void 0===a)return;const c=[];return c.push(`Area: ${s.utilities.roundNumber(i)} ${l}`),c.push(`Mean: ${s.utilities.roundNumber(a)} ${d}`),c.push(`Max: ${s.utilities.roundNumber(o)} ${d}`),c.push(`Std Dev: ${s.utilities.roundNumber(r)} ${d}`),c}Hn.toolName="CircleROIStartEndThreshold";n(48736);var Gn=n(49906),zn=n(84882);const{transformWorldToIndex:$n,isEqual:jn}=s.utilities;class qn extends ce.oS{constructor(e={},t={supportedInteractionTypes:["Mouse","Touch"]}){super(e,t),this.preMouseDownCallback=e=>{const t=e.detail,{currentPoints:n,element:i}=t,a=n.world,o=(0,s.getEnabledElement)(i),{viewport:r}=o,d=r.getCamera(),{viewPlaneNormal:c}=d,h=ne.activeSegmentation.getActiveSegmentation(r.id);if(!h)throw new Error("No active segmentation detected, create one before using scissors tool");const{segmentationId:g}=h,u=ne.segmentIndex.getActiveSegmentIndex(g),m=ne.segmentLocking.getLockedSegmentIndices(g),{representationData:v}=(0,Rn.getSegmentation)(g);let p,f,w,E;if(this.doneEditMemo(),r instanceof s.BaseVolumeViewport){const{volumeId:e}=v[l.SegmentationRepresentations.Labelmap],t=s.cache.getVolume(e);({dimensions:p,direction:f}=t),E=t.voxelManager,w=$n(t.imageData,a)}else{const e=(0,Rn.getCurrentLabelmapImageIdForViewport)(r.id,g);if(!e)throw new Error("No active segmentation imageId detected, create one before using scissors tool");const{imageData:t}=r.getImageData();p=t.getDimensions(),f=t.getDirection();const n=s.cache.getImage(e);E=n.voxelManager,w=$n(t,a)}const I=this.getFixedDimension(c,f);if(void 0===I)return void console.warn("Oblique paint fill not yet supported");const{floodFillGetter:C,getLabelValue:b,getScalarDataPositionFromPlane:_,inPlaneSeedPoint:T,fixedDimensionValue:S}=this.generateHelpers(E,p,w,I);if(w[0]<0||w[0]>=p[0]||w[1]<0||w[1]>=p[1]||w[2]<0||w[2]>=p[2])return;const D=b(w[0],w[1],w[2]);if(m.includes(D))return;const A=(0,zn.A)(C,T),{flooded:M}=A;M.forEach((e=>{const t=_(e[0],e[1]);E.setAtIndex(t,u)}));const y=this.getFramesModified(I,S,A);return(0,Gn.triggerSegmentationDataModified)(g,y),!0},this.getFramesModified=(e,t,n)=>{const{flooded:i}=n;if(2===e)return[t];let a=1/0,o=-1/0;for(let e=0;e<i.length;e++){const t=i[e][1];t<a&&(a=t),t>o&&(o=t)}const s=[];for(let e=a;e<=o;e++)s.push(e);return s},this.generateHelpers=(e,t,n,i=2)=>{let a,o;switch(i){case 0:a=n[0],o=[n[1],n[2]];break;case 1:a=n[1],o=[n[0],n[2]];break;case 2:a=n[2],o=[n[0],n[1]];break;default:throw new Error(`Invalid fixedDimension: ${i}`)}const s=(t,n,i)=>e.getAtIJK(t,n,i),r=this.generateFloodFillGetter(t,i,a,s);return{getScalarDataPositionFromPlane:this.generateGetScalarDataPositionFromPlane(((t,n,i)=>e.toIndex([t,n,i])),i,a),getLabelValue:s,floodFillGetter:r,inPlaneSeedPoint:o,fixedDimensionValue:a}},this.generateFloodFillGetter=(e,t,n,i)=>{let a;switch(t){case 0:a=(t,a)=>{if(!(t>=e[1]||t<0||a>=e[2]||a<0))return i(n,t,a)};break;case 1:a=(t,a)=>{if(!(t>=e[0]||t<0||a>=e[2]||a<0))return i(t,n,a)};break;case 2:a=(t,a)=>{if(!(t>=e[0]||t<0||a>=e[1]||a<0))return i(t,a,n)};break;default:throw new Error(`Invalid fixedDimension: ${t}`)}return a},this.generateGetScalarDataPositionFromPlane=(e,t,n)=>{let i;switch(t){case 0:i=(t,i)=>e(n,t,i);break;case 1:i=(t,i)=>e(t,n,i);break;case 2:i=(t,i)=>e(t,i,n);break;default:throw new Error(`Invalid fixedDimension: ${t}`)}return i}}getFixedDimension(e,t){const n=t.slice(0,3),i=t.slice(3,6),a=t.slice(6,9),o=[Math.abs(e[0]),Math.abs(e[1]),Math.abs(e[2])],s=[Math.abs(n[0]),Math.abs(n[1]),Math.abs(n[2])];if(jn(o,s))return 0;const r=[Math.abs(i[0]),Math.abs(i[1]),Math.abs(i[2])];if(jn(o,r))return 1;const l=[Math.abs(a[0]),Math.abs(a[1]),Math.abs(a[2])];return jn(o,l)?2:void 0}}qn.toolName="PaintFill";var Kn,Zn=n(25161),Yn=n(85825),Xn=n(45700),Jn=n(7019),Qn=n(82409),ei=n(94199),ti=n(87275);!function(e){e[e.ANNOTATED_CUBE=1]="ANNOTATED_CUBE",e[e.AXES=2]="AXES",e[e.CUSTOM=3]="CUSTOM"}(Kn||(Kn={}));class ni extends ce.oS{static{this.CUBE=1}static{this.AXIS=2}static{this.VTPFILE=3}static{this.OVERLAY_MARKER_TYPES=Kn}constructor(e={},t={configuration:{orientationWidget:{enabled:!0,viewportCorner:Zn.Ay.Corners.BOTTOM_RIGHT,viewportSize:.15,minPixelSize:100,maxPixelSize:300},overlayMarkerType:ni.OVERLAY_MARKER_TYPES.ANNOTATED_CUBE,overlayConfiguration:{[ni.OVERLAY_MARKER_TYPES.ANNOTATED_CUBE]:{faceProperties:{xPlus:{text:"L",faceColor:"#ffff00",faceRotation:90},xMinus:{text:"R",faceColor:"#ffff00",faceRotation:270},yPlus:{text:"P",faceColor:"#00ffff",fontColor:"white",faceRotation:180},yMinus:{text:"A",faceColor:"#00ffff",fontColor:"white"},zPlus:{text:"S"},zMinus:{text:"I"}},defaultStyle:{fontStyle:"bold",fontFamily:"Arial",fontColor:"black",fontSizeScale:e=>e/2,faceColor:"#0000ff",edgeThickness:.1,edgeColor:"black",resolution:400}},[ni.OVERLAY_MARKER_TYPES.AXES]:{},[ni.OVERLAY_MARKER_TYPES.CUSTOM]:{polyDataURL:"https://raw.githubusercontent.com/Slicer/Slicer/80ad0a04dacf134754459557bf2638c63f3d1d1b/Base/Logic/Resources/OrientationMarkers/Human.vtp"}}}}){super(e,t),this._resizeObservers=new Map,this.onSetToolEnabled=()=>{this.initViewports(),this._subscribeToViewportEvents()},this.onSetToolActive=()=>{this.initViewports(),this._subscribeToViewportEvents()},this.onSetToolDisabled=()=>{this.cleanUpData(),this._unsubscribeToViewportNewVolumeSet()},this._getViewportsInfo=()=>(0,I.getToolGroup)(this.toolGroupId).viewportsInfo,this.resize=e=>{const t=this.orientationMarkers[e];if(!t)return;const{orientationWidget:n}=t;n.updateViewport()},this.orientationMarkers={},this.updatingOrientationMarker={}}_unsubscribeToViewportNewVolumeSet(){const e=()=>{this._getViewportsInfo().forEach((({viewportId:e,renderingEngineId:t})=>{const{viewport:n}=(0,s.getEnabledElementByIds)(e,t),{element:i}=n;i.removeEventListener(s.Enums.Events.VOLUME_VIEWPORT_NEW_VOLUME,this.initViewports.bind(this));this._resizeObservers.get(e).unobserve(i)}))};s.eventTarget.removeEventListener(l.Events.TOOLGROUP_VIEWPORT_ADDED,(t=>{t.detail.toolGroupId===this.toolGroupId&&(e(),this.initViewports())}))}_subscribeToViewportEvents(){const e=()=>{this._getViewportsInfo().forEach((({viewportId:e,renderingEngineId:t})=>{const{viewport:n}=(0,s.getEnabledElementByIds)(e,t),{element:i}=n;this.initViewports(),i.addEventListener(s.Enums.Events.VOLUME_VIEWPORT_NEW_VOLUME,this.initViewports.bind(this));const a=new ResizeObserver((()=>{setTimeout((()=>{const n=(0,s.getEnabledElementByIds)(e,t);if(!n)return;const{viewport:i}=n;this.resize(e),i.render()}),100)}));a.observe(i),this._resizeObservers.set(e,a)}))};e(),s.eventTarget.addEventListener(l.Events.TOOLGROUP_VIEWPORT_ADDED,(t=>{t.detail.toolGroupId===this.toolGroupId&&(e(),this.initViewports())}))}cleanUpData(){(0,s.getRenderingEngines)()[0].getViewports().forEach((e=>{const t=this.orientationMarkers[e.id];if(!t)return;const{actor:n,orientationWidget:i}=t;i?.setEnabled(!1),i?.delete(),n?.delete();e.getRenderingEngine().offscreenMultiRenderWindow.getRenderWindow().render(),e.getRenderingEngine().render(),delete this.orientationMarkers[e.id]}))}initViewports(){const e=(0,s.getRenderingEngines)()[0];if(!e)return;let t=e.getViewports();t=(0,W.filterViewportsWithToolEnabled)(t,this.getToolName()),t.forEach((e=>{const t=e.getWidget(this.getToolName());t&&!t.isDeleted()||this.addAxisActorInViewport(e)}))}async addAxisActorInViewport(e){const t=e.id;if(!this.updatingOrientationMarker[t]){this.updatingOrientationMarker[t]=!0;const n=this.configuration.overlayMarkerType,i=this.configuration.overlayConfiguration[n];if(this.orientationMarkers[t]){const{actor:n,orientationWidget:i}=this.orientationMarkers[t];e.getRenderer().removeActor(n),i.setEnabled(!1)}let a;1===n?a=this.createAnnotationCube(i):2===n?a=Xn.Ay.newInstance():3===n&&(a=await this.createCustomActor());const o=e.getRenderer(),s=e.getRenderingEngine().offscreenMultiRenderWindow.getRenderWindow(),{enabled:r,viewportCorner:l,viewportSize:d,minPixelSize:c,maxPixelSize:h}=this.configuration.orientationWidget,g=Zn.Ay.newInstance({actor:a,interactor:s.getInteractor(),parentRenderer:o});g.setEnabled(r),g.setViewportCorner(l),g.setViewportSize(d),g.setMinPixelSize(c),g.setMaxPixelSize(h),g.updateMarkerOrientation(),this.orientationMarkers[t]={orientationWidget:g,actor:a},e.addWidget(this.getToolName(),g),s.render(),e.getRenderingEngine().render(),this.updatingOrientationMarker[t]=!1}}async createCustomActor(){const e=this.configuration.overlayConfiguration[Kn.CUSTOM].polyDataURL,t=await fetch(e),n=await t.arrayBuffer(),i=ei.Ay.newInstance();i.parseAsArrayBuffer(n),i.update();const a=ti.Ay.newInstance();a.shallowCopy(i.getOutputData()),a.getPointData().setActiveScalars("Color");const o=Qn.Ay.newInstance();o.setInputData(a),o.setColorModeToDirectScalars();const s=Jn.Ay.newInstance();return s.setMapper(o),s.rotateZ(180),s}createAnnotationCube(e){const t=Yn.Ay.newInstance();return t.setDefaultStyle({...e.defaultStyle}),t.setXPlusFaceProperty({...e.faceProperties.xPlus}),t.setXMinusFaceProperty({...e.faceProperties.xMinus}),t.setYPlusFaceProperty({...e.faceProperties.yPlus}),t.setYMinusFaceProperty({...e.faceProperties.yMinus}),t.setZPlusFaceProperty({...e.faceProperties.zPlus}),t.setZMinusFaceProperty({...e.faceProperties.zMinus}),t}async createAnnotatedCubeActor(){const e=Yn.Ay.newInstance(),{faceProperties:t,defaultStyle:n}=this.configuration.annotatedCube;return e.setDefaultStyle(n),Object.keys(t).forEach((n=>{const i=`set${n.charAt(0).toUpperCase()+n.slice(1)}FaceProperty`;e[i](t[n])})),e}}ni.toolName="OrientationMarker";var ii=n(26228),ai=n(70930);class oi extends ce.oS{static{this.SelectMode={Inside:"Inside",Border:"Border"}}constructor(e={},t={supportedInteractionTypes:["Mouse","Touch"],configuration:{hoverTimeout:100,mode:oi.SelectMode.Border,searchRadius:6}}){super(e,t),this.mouseMoveCallback=e=>{if(this.mode===l.ToolModes.Active)return this.hoverTimer&&clearTimeout(this.hoverTimer),this.hoverTimer=setTimeout((()=>{this._setActiveSegment(e),this.hoverTimer=null}),this.configuration.hoverTimeout),!0},this.onSetToolEnabled=()=>{this.onSetToolActive()},this.onSetToolActive=()=>{this.hoverTimer=null},this.onSetToolDisabled=()=>{this.hoverTimer=null},this.hoverTimer=null}_setActiveSegment(e={}){if(w.wk.isInteractingWithTool)return;const{element:t,currentPoints:n}=e.detail,i=n.world,a=(0,s.getEnabledElement)(t);if(!a)return;const{viewport:o}=a,r=(0,ii.getActiveSegmentation)(o.id);r&&this._setActiveSegmentForType(r,i,o)}_setActiveSegmentForType(e,t,n){if(!n.getImageData())return;const{segmentationId:i,representationData:a}=e;let o;if(this.configuration.mode===oi.SelectMode.Inside?o=(0,O.getSegmentIndexAtWorldPoint)(i,t,{viewport:n}):a.Labelmap?o=(0,O.getSegmentIndexAtLabelmapBorder)(i,t,{viewport:n,searchRadius:this.configuration.searchRadius}):a.Contour?o=(0,O.getHoveredContourSegmentationAnnotation)(i):a.Surface,!o||0===o)return;(0,ai.setActiveSegmentIndex)(i,o);const s=n.getRenderingEngine().getViewports().map((e=>e.id));(0,Gn.triggerSegmentationModified)(i),(0,L.A)(s)}}oi.toolName="SegmentSelectTool";var si=n(93733);class ri extends ht.A{static{this.toolName="SegmentBidirectional"}constructor(e={}){super(e),this.renderAnnotation=(e,t)=>{let n=!0;const{viewport:i}=e,{element:a}=i,o=i.id;let s=(0,r.getAnnotations)(this.getToolName(),a);if(!s?.length)return n;if(s=this.filterInteractableAnnotationsForElement(a,s),!s?.length)return n;const l=this.getTargetId(i),d=i.getRenderingEngine(),c={toolGroupId:this.toolGroupId,toolName:this.getToolName(),viewportId:e.viewport.id};for(let a=0;a<s.length;a++){const r=s[a],{annotationUID:h,data:g}=r,{points:u,activeHandleIndex:m}=g.handles,v=u.map((e=>i.worldToCanvas(e)));c.annotationUID=h;const{segmentIndex:p,segmentationId:f}=r.metadata,{lineWidth:w,lineDash:E,shadow:I}=this.getAnnotationStyle({annotation:r,styleSpecifier:c}),C=`rgb(${(0,si.getSegmentIndexColor)(o,f,p).slice(0,3).join(",")})`;if(g.cachedStats[l]&&null!=g.cachedStats[l].unit?r.invalidated&&this._throttledCalculateCachedStats(r,d,e):(g.cachedStats[l]={length:null,width:null,unit:null},this._calculateCachedStats(r,d,e)),!i.getRenderingEngine())return console.warn("Rendering Engine has been destroyed"),n;let b;if(!(0,Ne.isAnnotationVisible)(h))continue;if((0,Se.isAnnotationLocked)(h)||this.editData||null===m||(b=[v[m]]),b){const e="0";(0,M.drawHandles)(t,h,e,b,{color:C})}const _=`${h}-line-1`,T=`${h}-line-2`,S="0";(0,M.drawLine)(t,h,S,v[0],v[1],{color:C,lineWidth:w,lineDash:E,shadow:I},_);const D="1";(0,M.drawLine)(t,h,D,v[2],v[3],{color:C,lineWidth:w,lineDash:E,shadow:I},T),n=!0;const A=this.getLinkedTextBoxStyle(c,r);if(!A.visibility){g.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}A.color=C;const y=this.configuration.getTextLines(g,l);if(!y||0===y.length)continue;let x;g.handles.textBox.hasMoved||(x=(0,k.getTextBoxCoordsCanvas)(v),g.handles.textBox.worldPosition=i.canvasToWorld(x));const P=i.worldToCanvas(g.handles.textBox.worldPosition),R="1",L=(0,M.drawLinkedTextBox)(t,h,R,y,P,v,{},A),{x:U,y:O,width:N,height:V}=L;g.handles.textBox.worldBoundingBox={topLeft:i.canvasToWorld([U,O]),topRight:i.canvasToWorld([U+N,O]),bottomLeft:i.canvasToWorld([U,O+V]),bottomRight:i.canvasToWorld([U+N,O+V])}}return n}}addNewAnnotation(e){const t=e.detail,{currentPoints:n,element:i}=t,a=n.world,o=(0,s.getEnabledElement)(i),{viewport:l}=o;this.isDrawing=!0;const d=l.getCamera(),{viewPlaneNormal:c,viewUp:h}=d,g=this.getReferencedImageId(l,a,c,h),u=l.getFrameOfReferenceUID(),m={highlighted:!0,invalidated:!0,metadata:{toolName:this.getToolName(),viewPlaneNormal:[...c],viewUp:[...h],FrameOfReferenceUID:u,referencedImageId:g,...l.getViewReference({points:[a]})},data:{handles:{points:[[...a],[...a],[...a],[...a]],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:{}}};(0,r.addAnnotation)(m,i);const v=(0,W.getViewportIdsWithToolToRender)(i,this.getToolName());return this.editData={annotation:m,viewportIdsToRender:v,handleIndex:1,movingTextBox:!1,newAnnotation:!0,hasMoved:!1},this._activateDraw(i),(0,ve.hideElementCursor)(i),e.preventDefault(),(0,L.A)(v),m}static{this.hydrate=(e,t,n)=>{const i=(0,s.getEnabledElementByViewportId)(e);if(!i)return;const{viewport:a}=i,o=(0,r.getAllAnnotations)().filter((e=>"SegmentBidirectional"===e.metadata.toolName)),l=o.find((e=>{const{metadata:t}=e;return t.segmentIndex===n?.segmentIndex&&t.segmentationId===n?.segmentationId}));l&&(0,r.removeAnnotation)(l.annotationUID);const{FrameOfReferenceUID:d,referencedImageId:c,viewPlaneNormal:h,instance:g}=this.hydrateBase(ri,i,t[0],n),[u,m]=t,[v,p]=u,[f,w]=m,E=[v,p,f,w],I={annotationUID:n?.annotationUID||s.utilities.uuidv4(),data:{handles:{points:E,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:{segmentIndex:n?.segmentIndex,segmentationId:n?.segmentationId,toolName:g.getToolName(),viewPlaneNormal:h,FrameOfReferenceUID:d,referencedImageId:c,...n}};return(0,r.addAnnotation)(I,a.element),(0,L.A)([a.id]),I}}}n(99522);class li extends ce.oS{constructor(e={data:{handles:{textBox:{worldPosition:[0,0,0],worldBoundingBox:{topLeft:[0,0,0],topRight:[0,0,0],bottomLeft:[0,0,0],bottomRight:[0,0,0]}}}}},t={supportedInteractionTypes:["Mouse","Touch"],configuration:{hoverTimeout:100,searchRadius:6}}){super(e,t),this.mouseMoveCallback=e=>(this.hoverTimer&&clearTimeout(this.hoverTimer),this.hoverTimer=setTimeout((()=>{this._setHoveredSegment(e),this.hoverTimer=null}),this.configuration.hoverTimeout),!0),this.onSetToolEnabled=()=>{this.onSetToolActive()},this.onSetToolActive=()=>{this.hoverTimer=null},this.onSetToolDisabled=()=>{this.hoverTimer=null},this.data=e.data??{handles:{textBox:{worldPosition:[0,0,0],worldBoundingBox:{topLeft:[0,0,0],topRight:[0,0,0],bottomLeft:[0,0,0],bottomRight:[0,0,0]}}}},this.hoverTimer=null}_setHoveredSegment(e={}){if(w.wk.isInteractingWithTool)return;const{element:t,currentPoints:n}=e.detail,i=n.world,a=(0,s.getEnabledElement)(t);if(!a)return;const{viewport:o}=a,r=(0,ii.getActiveSegmentation)(o.id);r&&this._setHoveredSegmentForType(r,i,o)}_setHoveredSegmentForType(e,t,n){if(!n.getImageData())return;const{segmentationId:i}=e,a=(0,O.getSegmentIndexAtWorldPoint)(i,t,{viewport:n}),o=e.segments[a],s=o?.label,r=n.worldToCanvas(t);if(this._editData={hoveredSegmentIndex:a,hoveredSegmentLabel:s,canvasCoordinates:r,worldPoint:t},!a||0===a)return;const l=n.getRenderingEngine().getViewports().map((e=>e.id));(0,Gn.triggerSegmentationModified)(i),(0,L.A)(l)}renderAnnotation(e,t){if(!this._editData)return;const{viewport:n}=e,{hoveredSegmentIndex:i,hoveredSegmentLabel:a,canvasCoordinates:o,worldPoint:s}=this._editData;if(!i)return;const r=n.worldToCanvas(s),l=(0,M.drawLinkedTextBox)(t,"segmentSelectLabelAnnotation","segmentSelectLabelTextBox",[a||"(unnamed segment)"],r,[o],{},{}),d=o[0],c=o[1],{width:h,height:g}=l;this.data.handles.textBox.worldBoundingBox={topLeft:n.canvasToWorld([d,c]),topRight:n.canvasToWorld([d+h,c]),bottomLeft:n.canvasToWorld([d,c+g]),bottomRight:n.canvasToWorld([d+h,c+g])}}}li.toolName="SegmentLabelTool";var di=n(33657);class ci extends ce.EC{static{this.toolName="VideoRedaction"}constructor(e={}){super(e,{supportedInteractionTypes:["Mouse","Touch"],configuration:{shadow:!0,preventHandleOutsideImage:!1}}),this.addNewAnnotation=e=>{const t=e.detail,{currentPoints:n,element:i}=t,a=n.world,o=(0,s.getEnabledElement)(i),{viewport:r}=o;this.isDrawing=!0;const l=this.constructor.createAnnotationForViewport(r,{data:{handles:{points:[[...a],[...a],[...a],[...a]]}}});(0,E.lC)(l,i);const d=(0,W.getViewportIdsWithToolToRender)(i,this.getToolName(),!1);return this.editData={annotation:l,viewportUIDsToRender:d,handleIndex:3,newAnnotation:!0,hasMoved:!1},this._activateDraw(i),(0,ve.hideElementCursor)(i),e.preventDefault(),(0,L.A)(d),l},this.getHandleNearImagePoint=(e,t,n,i)=>{const a=(0,s.getEnabledElement)(e),{viewport:o}=a,{data:r}=t,{points:l}=r.handles;for(let e=0;e<l.length;e++){const t=l[e],a=o.worldToCanvas(t);if(!0===T.Zc.distance(n,a)<i)return r.handles.activeHandleIndex=e,t}r.handles.activeHandleIndex=null},this.isPointNearTool=(e,t,n,i)=>{const a=(0,s.getEnabledElement)(e),{viewport:o}=a,{data:r}=t,{points:l}=r.handles,d=o.worldToCanvas(l[0]),c=o.worldToCanvas(l[3]),h=this._getRectangleImageCoordinates([d,c]),g=[n[0],n[1]],{left:u,top:m,width:v,height:p}=h;if(di.distanceToPoint([u,m,v,p],g)<=i)return!0},this.toolSelectedCallback=(e,t,n="mouse")=>{const i=e.detail,{element:a}=i,{data:o}=t;o.active=!0;const s=(0,W.getViewportIdsWithToolToRender)(a,this.getToolName(),!1);this.editData={annotation:t,viewportUIDsToRender:s},this._activateModify(a),(0,ve.hideElementCursor)(a),(0,L.A)(s),e.preventDefault()},this.handleSelectedCallback=(e,t,n,i="mouse")=>{const a=e.detail,{element:o}=a,{data:s}=t;s.active=!0;let r,l=!1;n.worldPosition?l=!0:r=s.handles.points.findIndex((e=>e===n));const d=(0,W.getViewportIdsWithToolToRender)(o,this.getToolName(),!1);this.editData={annotation:t,viewportUIDsToRender:d,handleIndex:r},this._activateModify(o),(0,ve.hideElementCursor)(o),(0,L.A)(d),e.preventDefault()},this._endCallback=e=>{const t=e.detail,{element:n}=t,{annotation:i,viewportUIDsToRender:a,newAnnotation:o,hasMoved:s}=this.editData,{data:r}=i;o&&!s||(this.doneEditMemo(),r.active=!1,r.handles.activeHandleIndex=null,this._deactivateModify(n),this._deactivateDraw(n),(0,ve.resetElementCursor)(n),this.editData=null,this.isDrawing=!1,this.isHandleOutsideImage&&this.configuration.preventHandleOutsideImage&&(0,E.O8)(i.annotationUID),(0,L.A)(a))},this._dragCallback=e=>{this.isDrawing=!0;const t=e.detail,{element:n}=t,{annotation:i,viewportUIDsToRender:a,handleIndex:o,newAnnotation:r}=this.editData;this.createMemo(n,i,{newAnnotation:r});const{data:l}=i;if(void 0===o){const{deltaPoints:e}=t,n=e.world,{points:i}=l.handles;i.forEach((e=>{e[0]+=n[0],e[1]+=n[1],e[2]+=n[2]})),l.invalidated=!0}else{const{currentPoints:e}=t,i=(0,s.getEnabledElement)(n),{worldToCanvas:a,canvasToWorld:r}=i.viewport,d=e.world,{points:c}=l.handles;let h,g,u,m,v,p,f,w;switch(c[o]=[...d],o){case 0:case 3:h=a(c[0]),m=a(c[3]),g=[m[0],h[1]],u=[h[0],m[1]],p=r(g),f=r(u),c[1]=p,c[2]=f;break;case 1:case 2:g=a(c[1]),u=a(c[2]),h=[u[0],g[1]],m=[g[0],u[1]],v=r(h),w=r(m),c[0]=v,c[3]=w}l.invalidated=!0}this.editData.hasMoved=!0;(0,s.getEnabledElement)(n);(0,L.A)(a)},this._activateDraw=e=>{w.wk.isInteractingWithTool=!0,e.addEventListener(l.Events.MOUSE_UP,this._endCallback),e.addEventListener(l.Events.MOUSE_DRAG,this._dragCallback),e.addEventListener(l.Events.MOUSE_MOVE,this._dragCallback),e.addEventListener(l.Events.MOUSE_CLICK,this._endCallback),e.addEventListener(l.Events.TOUCH_END,this._endCallback),e.addEventListener(l.Events.TOUCH_DRAG,this._dragCallback)},this._deactivateDraw=e=>{w.wk.isInteractingWithTool=!1,e.removeEventListener(l.Events.MOUSE_UP,this._endCallback),e.removeEventListener(l.Events.MOUSE_DRAG,this._dragCallback),e.removeEventListener(l.Events.MOUSE_MOVE,this._dragCallback),e.removeEventListener(l.Events.MOUSE_CLICK,this._endCallback),e.removeEventListener(l.Events.TOUCH_END,this._endCallback),e.removeEventListener(l.Events.TOUCH_DRAG,this._dragCallback)},this._activateModify=e=>{w.wk.isInteractingWithTool=!0,e.addEventListener(l.Events.MOUSE_UP,this._endCallback),e.addEventListener(l.Events.MOUSE_DRAG,this._dragCallback),e.addEventListener(l.Events.MOUSE_CLICK,this._endCallback),e.addEventListener(l.Events.TOUCH_END,this._endCallback),e.addEventListener(l.Events.TOUCH_DRAG,this._dragCallback)},this._deactivateModify=e=>{w.wk.isInteractingWithTool=!1,e.removeEventListener(l.Events.MOUSE_UP,this._endCallback),e.removeEventListener(l.Events.MOUSE_DRAG,this._dragCallback),e.removeEventListener(l.Events.MOUSE_CLICK,this._endCallback),e.removeEventListener(l.Events.TOUCH_END,this._endCallback),e.removeEventListener(l.Events.TOUCH_DRAG,this._dragCallback)},this.renderAnnotation=(e,t)=>{const n=!1,{viewport:i}=e,{element:a}=i;let o=(0,E.Rh)(this.getToolName(),a);if(!o?.length)return n;if(o=this.filterInteractableAnnotationsForElement(a,o),!o?.length)return n;const s={toolGroupId:this.toolGroupId,toolName:this.getToolName(),viewportId:e.viewport.id};for(let e=0;e<o.length;e++){const n=o[e],{annotationUID:a}=n,r=n.data,{points:l,activeHandleIndex:d}=r.handles,c=l.map((e=>i.worldToCanvas(e))),h=this.getStyle("lineWidth",s,n),g=this.getStyle("lineDash",s,n),u=this.getStyle("color",s,n);if(!i.getRenderingEngine())return void console.warn("Rendering Engine has been destroyed");let m;if(this.editData||null===d||(m=[c[d]]),m){const e="0";(0,M.drawHandles)(t,a,e,m,{color:u})}const v="0";(0,M.drawRedactionRect)(t,a,v,c[0],c[3],{color:"black",lineDash:g,lineWidth:h})}},this._getRectangleImageCoordinates=e=>{const[t,n]=e;return{left:Math.min(t[0],n[0]),top:Math.min(t[1],n[1]),width:Math.abs(t[0]-n[0]),height:Math.abs(t[1]-n[1])}},this._calculateCachedStats=(e,t,n,i,a)=>{const{data:o}=e,{viewportUID:r,renderingEngineUID:d,sceneUID:c}=a,h=o.handles.points[0],g=o.handles.points[3],{cachedStats:u}=o,m=Object.keys(u);for(let e=0;e<m.length;e++){const a=m[e],{imageVolume:o}=this._getImageVolumeFromTargetUID(a,i),{dimensions:s,scalarData:r,vtkImageData:l,metadata:d}=o,c=T.eR.fromValues(0,0,0),v=T.eR.fromValues(0,0,0);if(l.worldToIndexVec3(h,c),c[0]=Math.floor(c[0]),c[1]=Math.floor(c[1]),c[2]=Math.floor(c[2]),l.worldToIndexVec3(g,v),v[0]=Math.floor(v[0]),v[1]=Math.floor(v[1]),v[2]=Math.floor(v[2]),this._isInsideVolume(c,v,s)){this.isHandleOutsideImage=!1;const e=Math.min(c[0],v[0]),i=Math.max(c[0],v[0]),o=Math.min(c[1],v[1]),l=Math.max(c[1],v[1]),m=Math.min(c[2],v[2]),p=Math.max(c[2],v[2]),{worldWidth:f,worldHeight:w}=(0,Mt.A)(t,n,h,g),E=f*w;let I=0,C=0,b=0;const _=s[0],T=s[0]*s[1];for(let t=m;t<=p;t++)for(let n=o;n<=l;n++)for(let a=e;a<=i;a++){I++,C+=r[t*T+n*_+a]}C/=I;for(let t=m;t<=p;t++)for(let n=o;n<=l;n++)for(let a=e;a<=i;a++){const e=r[t*T+n*_+a]-C;b+=e*e}b/=I,b=Math.sqrt(b),u[a]={Modality:d.Modality,area:E,mean:C,stdDev:b}}else this.isHandleOutsideImage=!0,u[a]={Modality:d.Modality}}const v=e.invalidated;if(e.invalidated=!1,v){const t=l.Events.ANNOTATION_MODIFIED,n={annotation:e,viewportUID:r,renderingEngineUID:d,sceneUID:c,changeType:l.ChangeTypes.StatsUpdated};(0,s.triggerEvent)(s.eventTarget,t,n)}return u},this._isInsideVolume=(e,t,n)=>s.utilities.indexWithinDimensions(e,n)&&s.utilities.indexWithinDimensions(t,n),this._getTargetVolumeUID=e=>{if(this.configuration.volumeUID)return this.configuration.volumeUID;const t=e.getVolumeActors();return t||t.length?t[0].uid:void 0},this._throttledCalculateCachedStats=(0,x.A)(this._calculateCachedStats,100,{trailing:!0})}cancel(e){if(!this.isDrawing)return;this.isDrawing=!1,this._deactivateDraw(e),this._deactivateModify(e),(0,ve.resetElementCursor)(e);const{annotation:t,viewportUIDsToRender:n}=this.editData,{data:i}=t;return i.active=!1,i.handles.activeHandleIndex=null,(0,L.A)(n),this.editData=null,t.metadata.annotationUID}_getImageVolumeFromTargetUID(e,t){let n;if(e.startsWith("stackTarget")){const i=e.indexOf(":"),a=e.substring(i+1);n=t.getViewport(a).getImageData()}else n=s.cache.getVolume(e);return{imageVolume:n,viewport:undefined}}_getTargetStackUID(e){return`stackTarget:${e.uid}`}}var hi=n(58498),gi=n(42008),ui=n(75127),mi=n(28906);const vi={Forward:1,Backward:-1},pi=new Set;const fi={};function wi(e,t){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,fi,n),mi.m.obj(e,t),mi.m.algo(e,t,1,1),function(e,t){e.requestData=(t,n)=>{const[i]=t;n[0]||(n[0]=ti.Ay.newInstance());const[a]=n;e.extractContours(i,a),a.modified()},e.traverseLoop=(e,t,n,i,a)=>{let o=n,s=i,r=!1,l=0;for(;!r;){const{cellPointIds:n}=e.getCellPoints(o);if(!n)continue;s=n[0]!==s?n[0]:n[1],l++;const d=t*l;a.push({t:d,ptId:s});const c=e.getPointCells(s);if(2!==c.length||s===i)return s;2===c.length?(o=c[0]!==o?c[0]:c[1],pi.add(o)):r=!0}return s},e.extractContours=(t,n)=>{const i=[];pi.clear();const a=t.getLines();n.getPoints().setData(Float32Array.from(t.getPoints().getData()));for(let n=0;n<a.getNumberOfCells();n++){if(pi.has(n))continue;const{cellPointIds:a}=t.getCellPoints(n);if(!a)continue;pi.add(n);const o=a[0],s=[];s.push({t:0,ptId:o}),o!==e.traverseLoop(t,vi.Forward,n,o,s)&&(e.traverseLoop(t,vi.Backward,n,o,s),s.sort(((e,t)=>e.t<t.t?-1:1)),s.length&&s[0].ptId!==s[s.length-1]?.ptId&&s.push({...s[s.length-1]})),s.length&&i.push(s)}const o=n.getLines();o.resize(0),i.forEach((e=>{o.insertNextCell(e.map((e=>e.ptId)))}))}}(e)}var Ei={newInstance:mi.m.newInstance(wi,"vtkContourLoopExtraction"),extend:wi},Ii=n(61088);const{math:{polyline:{containsPoint:Ci,getAABB:bi,projectTo2D:_i}},geometricSurfaceUtils:{checkStandardBasis:Ti,rotatePoints:Si},boundingBox:{getBoundingBoxAroundShapeWorld:Di},planar:{isPlaneIntersectingAABB:Ai}}=a;const Mi={polySeg:null,polySegInitializing:!1,polySegInitializingPromise:null,async initializePolySeg(e){let t;try{t=(await async function(e){try{if("@icr/polyseg-wasm"===e)return n.e(7758).then(n.bind(n,65745))}catch(e){return console.warn("Error importing module:",e),null}}("@icr/polyseg-wasm")).default}catch(e){return console.error(e),void console.debug("Warning: '@icr/polyseg-wasm' module not found. Please install it separately.")}this.polySegInitializing?await this.polySegInitializingPromise:this.polySeg?.instance||(this.polySegInitializing=!0,this.polySegInitializingPromise=new Promise((n=>{this.polySeg=new t,this.polySeg.initialize({updateProgress:e}).then((()=>{this.polySegInitializing=!1,n()}))})),await this.polySegInitializingPromise)},async convertContourToSurface(e,...t){const{polylines:n,numPointsArray:i}=e,[a]=t;await this.initializePolySeg(a);return await this.polySeg.instance.convertContourRoiToSurface(n,i)},async convertLabelmapToSurface(e,...t){const[n]=t;await this.initializePolySeg(n);const i=this.polySeg.instance.convertLabelmapToSurface(e.scalarData,e.dimensions,e.spacing,e.direction,e.origin,[e.segmentIndex]),a=Ti(e.direction);if(!a.isStandard){const t=Si(a.rotationMatrix,e.origin,i.points);i.points=[...t]}return i},async convertContourToVolumeLabelmap(e,...t){const[n]=t;await this.initializePolySeg(n);const{segmentIndices:i,scalarData:a,annotationUIDsInSegmentMap:o,dimensions:r,origin:l,direction:d,spacing:c}=e,h=s.utilities.VoxelManager.createScalarVolumeVoxelManager({dimensions:r,scalarData:a}),g=hi.Ay.newInstance();g.setDimensions(r),g.setOrigin(l),g.setDirection(d),g.setSpacing(c);const u=gi.Ay.newInstance({name:"Pixels",numberOfComponents:1,values:a});g.getPointData().setScalars(u),g.modified();for(const e of i){const t=o.get(e);for(const n of t){if(!n.polyline)continue;const{polyline:t,holesPolyline:i}=n,o=Di(t),[l,d,c]=s.utilities.transformWorldToIndex(g,[o[0][0],o[1][0],o[2][0]]),[u,m,v]=s.utilities.transformWorldToIndex(g,[o[0][1],o[1][1],o[2][1]]),{projectedPolyline:p,sharedDimensionIndex:f}=_i(t),w=i?.map((e=>{const{projectedPolyline:t}=_i(e);return t})),E=(f+1)%3,I=(f+2)%3;s.utilities.VoxelManager.createScalarVolumeVoxelManager({dimensions:r,scalarData:a}).forEach((({pointIJK:t})=>{h.setAtIJKPoint(t,e)}),{imageData:g,isInObject:e=>{const t=[e[E],e[I]];return Ci(p,t,{holes:w})},boundsIJK:[[l,u],[d,m],[c,v]]})}}return h.scalarData},async convertContourToStackLabelmap(e,...t){const[n]=t;await this.initializePolySeg(n);const{segmentationsInfo:i,annotationUIDsInSegmentMap:a,segmentIndices:o}=e,r=new Map;i.forEach(((e,t)=>{const{dimensions:n,scalarData:i,direction:a,spacing:o,origin:l}=e,d=s.utilities.VoxelManager.createScalarVolumeVoxelManager({dimensions:n,scalarData:i}),c=hi.Ay.newInstance();c.setDimensions(n),c.setOrigin(l),c.setDirection(a),c.setSpacing(o);const h=gi.Ay.newInstance({name:"Pixels",numberOfComponents:1,values:i});c.getPointData().setScalars(h),c.modified(),r.set(t,{manager:d,imageData:c})}));for(const e of o){const t=a.get(e);for(const n of t){if(!n.polyline)continue;const{polyline:t,holesPolyline:i,referencedImageId:a}=n,o=Di(t),{manager:l,imageData:d}=r.get(a),[c,h,g]=s.utilities.transformWorldToIndex(d,[o[0][0],o[1][0],o[2][0]]),[u,m,v]=s.utilities.transformWorldToIndex(d,[o[0][1],o[1][1],o[2][1]]),{projectedPolyline:p,sharedDimensionIndex:f}=_i(t),w=i?.map((e=>{const{projectedPolyline:t}=_i(e);return t})),E=(f+1)%3,I=(f+2)%3;s.utilities.VoxelManager.createImageVoxelManager({width:d.getDimensions()[0],height:d.getDimensions()[1],scalarData:d.getPointData().getScalars().getData()}).forEach((({pointIJK:t})=>{l.setAtIJKPoint(t,e)}),{imageData:d,isInObject:e=>{const t=[e[E],e[I]];return Ci(p,t,{holes:w})},boundsIJK:[[c,u],[h,m],[g,v]]})}}return i.forEach(((e,t)=>{const{manager:n}=r.get(t);e.scalarData=n.scalarData})),i},async convertSurfaceToVolumeLabelmap(e,...t){const[n]=t;await this.initializePolySeg(n);return this.polySeg.instance.convertSurfaceToLabelmap(e.points,e.polys,e.dimensions,e.spacing,e.direction,e.origin)},async convertSurfacesToVolumeLabelmap(e,...t){const[n]=t;await this.initializePolySeg(n);const{segmentsInfo:i}=e,a=Array.from(i.keys()).map((t=>{const{points:n,polys:a}=i.get(t);return{...this.polySeg.instance.convertSurfaceToLabelmap(n,a,e.dimensions,e.spacing,e.direction,e.origin),segmentIndex:t}})),o=await Promise.all(a),r=hi.Ay.newInstance();r.setDimensions(e.dimensions),r.setOrigin(e.origin),r.setSpacing(e.spacing),r.setDirection(e.direction);const l=e.dimensions[0]*e.dimensions[1]*e.dimensions[2],d=gi.Ay.newInstance({name:"Pixels",numberOfComponents:1,values:new Uint8Array(l)});r.getPointData().setScalars(d),r.modified();const{dimensions:c}=e,h=r.getPointData().getScalars().getData(),g=s.utilities.VoxelManager.createScalarVolumeVoxelManager({dimensions:c,scalarData:h}),u=o.map((e=>{const{data:t,dimensions:n,direction:i,origin:a,spacing:o}=e,r=hi.Ay.newInstance();r.setDimensions(n),r.setOrigin(a),r.setSpacing(o),r.setDirection(i);const l=gi.Ay.newInstance({name:"Pixels",numberOfComponents:1,values:t});r.getPointData().setScalars(l),r.modified();const d=s.utilities.VoxelManager.createScalarVolumeVoxelManager({dimensions:n,scalarData:t}),c=r.getExtent();return{volume:r,voxelManager:d,extent:c,scalarData:t,segmentIndex:e.segmentIndex}}));return s.utilities.VoxelManager.createScalarVolumeVoxelManager({dimensions:r.getDimensions(),scalarData:r.getPointData().getScalars().getData()}).forEach((({pointIJK:e,pointLPS:t})=>{try{for(const n of u){const{volume:i,extent:a,voxelManager:o,segmentIndex:s}=n,r=i.worldToIndex(t);if(r[0]<a[0]||r[0]>a[1]||r[1]<a[2]||r[1]>a[3]||r[2]<a[4]||r[2]>a[5])continue;const l=r.map(Math.round);if(o.getAtIJK(...l)>0){g.setAtIJKPoint(e,s);break}}}catch(e){}}),{imageData:r}),g.scalarData},getSurfacesAABBs({surfacesInfo:e}){const t=new Map;for(const{points:n,id:i}of e){const e=bi(n,{numDimensions:3});t.set(i,e)}return t},cutSurfacesIntoPlanes({planesInfo:e,surfacesInfo:t,surfacesAABB:n=new Map},i,a){const o=e.length,s=Ii.Ay.newInstance(),r=ui.Ay.newInstance();s.setCutFunction(r);const l=ti.Ay.newInstance();try{for(const[d,c]of e.entries()){const{sliceIndex:e,planes:h}=c,g=new Map;for(const e of t){const{points:t,polys:i,id:a,segmentIndex:o}=e,d=n.get(a)||bi(t,{numDimensions:3});n.has(a)||n.set(a,d);const{minX:c,minY:u,minZ:m,maxX:v,maxY:p,maxZ:f}=d,{origin:w,normal:E}=h[0];if(!Ai(w,E,c,u,m,v,p,f))continue;l.getPoints().setData(t,3),l.getPolys().setData(i,3),l.modified(),s.setInputData(l),r.setOrigin(w),r.setNormal(E);try{s.update()}catch(e){console.warn("Error during clipping",e);continue}const I=s.getOutputData(),C=I;C.buildLinks();const b=Ei.newInstance();b.setInputData(C);const _=b.getOutputData();I&&g.set(o,{points:_.getPoints().getData(),lines:_.getLines().getData(),numberOfCells:_.getLines().getNumberOfCells(),segmentIndex:o})}i({progress:(d+1)/o}),a({sliceIndex:e,polyDataResults:g})}}catch(e){console.warn("Error during processing",e)}finally{t=null,r.delete()}}};(0,o.p)(Mi)},93952:(e,t,n)=>{"use strict";n.d(t,{A:()=>i});const i=[[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]]},18262:(e,t,n)=>{"use strict";n.d(t,{A:()=>h});var i=n(85204),a=n(15327);const o="viewport-element";function s(e,t){if(i.wk.svgNodeCache[e])return i.wk.svgNodeCache[e][t]?i.wk.svgNodeCache[e][t].domRef:void 0}function r(e,t,n,a){if(!i.wk.svgNodeCache[t])return null;i.wk.svgNodeCache[t][a]={touched:!0,domRef:n},e.appendChild(n)}function l(e,t){i.wk.svgNodeCache[e]&&i.wk.svgNodeCache[e][t]&&(i.wk.svgNodeCache[e][t].touched=!0)}function d(e,t){i.wk.svgNodeCache[t]&&Object.keys(i.wk.svgNodeCache[t]).forEach((n=>{const a=i.wk.svgNodeCache[t][n];!a.touched&&a.domRef&&(e.removeChild(a.domRef),delete i.wk.svgNodeCache[t][n])}))}const c=function(e){const t=(0,a.getEnabledElement)(e),{viewportId:n,renderingEngineId:c}=t,h=`${n}:${c}`,g=function(e){const t=`.${o}`,n=e.querySelector(t),i=n?.querySelector(":scope > .svg-layer");return i}(e);return Object.keys(i.wk.svgNodeCache[h]).forEach((e=>{i.wk.svgNodeCache[h][e].touched=!1})),{svgLayerElement:g,svgNodeCacheForCanvas:i.wk.svgNodeCache,getSvgNode:s.bind(this,h),appendNode:r.bind(this,g,h),setNodeTouched:l.bind(this,h),clearUntouched:d.bind(this,g,h)}};const h=function(e,t){const n=c(e);t(n),n.clearUntouched()}},12004:(e,t,n)=>{"use strict";n.d(t,{A:()=>s});var i=n(97181),a=n(85899),o=n(56442);const s=function(e,t,n,s,r,l={},d=""){const{color:c,fill:h,width:g,lineWidth:u,lineDash:m,fillOpacity:v,strokeOpacity:p}=Object.assign({color:"rgb(0, 255, 0)",fill:"transparent",width:"2",lineDash:void 0,lineWidth:void 0,strokeOpacity:1,fillOpacity:1},l),f=u||g,w=(0,i.A)(t,"circle",n),E=e.getSvgNode(w),I={cx:`${s[0]}`,cy:`${s[1]}`,r:`${r}`,stroke:c,fill:h,"stroke-width":f,"stroke-dasharray":m,"fill-opacity":v,"stroke-opacity":p};if(E)(0,a.A)(I,E),e.setNodeTouched(w);else{const t=document.createElementNS("http://www.w3.org/2000/svg","circle");""!==d&&t.setAttribute("data-id",d),(0,o.A)(I,t),e.appendNode(t,w)}}},95074:(e,t,n)=>{"use strict";n.d(t,{A:()=>s});var i=n(97181),a=n(85899),o=n(56442);const s=function(e,t,n,s,r={},l=""){const{color:d,width:c,lineWidth:h,lineDash:g}=Object.assign({color:"rgb(0, 255, 0)",width:"2",lineWidth:void 0,lineDash:void 0},r),u=h||c,m=(0,i.A)(t,"ellipse",n),v=e.getSvgNode(m),[p,f,w,E]=s,I=Math.hypot(w[0]-E[0],w[1]-E[1]),C=Math.hypot(f[0]-p[0],f[1]-p[1]),b=180*Math.atan2(w[1]-E[1],w[0]-E[0])/Math.PI,_=[(w[0]+E[0])/2,(f[1]+p[1])/2],T={cx:`${_[0]}`,cy:`${_[1]}`,rx:`${I/2}`,ry:`${C/2}`,stroke:d,fill:"transparent",transform:`rotate(${b} ${_[0]} ${_[1]})`,"stroke-width":u,"stroke-dasharray":g};if(v)(0,a.A)(T,v),e.setNodeTouched(m);else{const t=document.createElementNS("http://www.w3.org/2000/svg","ellipse");""!==l&&t.setAttribute("data-id",l),(0,o.A)(T,t),e.appendNode(t,m)}}},56745:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});var i=n(94042);const a=function(e,t,n,a,o={}){a.forEach(((a,s)=>{(0,i.A)(e,t,n,a,o,s)}))}},1595:(e,t,n)=>{"use strict";n.d(t,{A:()=>r});var i=n(26290),a=n(92118),o=n(90554);const s=function(e,t,n,i,s,r,l={}){const d=i.length>0?(0,o.A)(i,s):s,c=function(e){const{x:t,y:n,height:i,width:a}=e,o=a/2,s=i/2;return[[t+o,n],[t,n+s],[t+o,n+i],[t+a,n+s]]}(r),h=(0,o.A)(c,d),g=Object.assign({color:"rgb(255, 255, 0)",lineWidth:"1",lineDash:"2,3"},l);(0,a.A)(e,t,`link-${n}`,d,h,g)};const r=function(e,t,n,a,o,r,l,d={}){const c=Object.assign({handleRadius:"6",centering:{x:!1,y:!0}},d),h=(0,i.A)(e,t,n,a,o,c);return s(e,t,n,r,o,h,c),h}},97530:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});n(97181);var i=n(75076);function a(e,t,n,a,o,s={},r=""){const l=[a[0],a[1]],d=[o[0],a[1]],c=[a[0],o[1]],h=[o[0],o[1]];(0,i.A)(e,t,n,[l,d,c,h],s,r)}},17328:(e,t,n)=>{"use strict";n.d(t,{draw:()=>i.A,drawArrow:()=>f,drawCircle:()=>a.A,drawEllipseByCoordinates:()=>o.A,drawHandle:()=>r.A,drawHandles:()=>s.A,drawHeight:()=>d,drawLine:()=>l.A,drawLinkedTextBox:()=>g.A,drawPath:()=>h.A,drawPolyline:()=>c.A,drawRect:()=>u.A,drawRectByCoordinates:()=>m.A,drawRedactionRect:()=>C,drawTextBox:()=>v.A});var i=n(18262),a=n(12004),o=(n(85856),n(95074)),s=n(56745),r=n(94042),l=n(92118);function d(e,t,n,i,a,o={}){if(isNaN(i[0])||isNaN(i[1])||isNaN(a[0])||isNaN(a[1]))return;const{color:s,width:r,lineWidth:d,lineDash:c}=Object.assign({color:"rgb(0, 255, 0)",width:"2",lineWidth:void 0,lineDash:void 0},o),h=a[0]+(i[0]-a[0])/2,g=[h,i[1]],u=[h,a[1]],m={start:i,end:g},v={start:g,end:u},p={start:u,end:a};(0,l.A)(e,t,"1",m.start,m.end,{color:s,width:r,lineWidth:d,lineDash:c}),(0,l.A)(e,t,"2",v.start,v.end,{color:s,width:r,lineWidth:d,lineDash:c}),(0,l.A)(e,t,"3",p.start,p.end,{color:s,width:r,lineWidth:d,lineDash:c})}var c=n(98812),h=n(17311),g=n(1595),u=n(97530),m=n(75076),v=n(26290);const p="http://www.w3.org/2000/svg";function f(e,t,n,i,a,o={}){if(isNaN(i[0])||isNaN(i[1])||isNaN(a[0])||isNaN(a[1]))return;const{viaMarker:s=!1,color:r="rgb(0, 255, 0)",markerSize:d=10}=o;if(!s)return void function(e,t,n,i,a,o={}){const{color:s="rgb(0, 255, 0)",width:r=2,lineWidth:d,lineDash:c}=o,h=10,g=Math.atan2(a[1]-i[1],a[0]-i[0]),u={start:[a[0]-h*Math.cos(g-Math.PI/7),a[1]-h*Math.sin(g-Math.PI/7)],end:a},m={start:[a[0]-h*Math.cos(g+Math.PI/7),a[1]-h*Math.sin(g+Math.PI/7)],end:a};(0,l.A)(e,t,n,i,a,{color:s,width:r,lineWidth:d,lineDash:c}),(0,l.A)(e,t,"2",u.start,u.end,{color:s,width:r,lineWidth:d,lineDash:c}),(0,l.A)(e,t,"3",m.start,m.end,{color:s,width:r,lineWidth:d,lineDash:c})}(e,t,n,i,a,o);const c=`${`arrow-${t}`}-${e.svgLayerElement.id}`,h=e.svgLayerElement.querySelector("defs");let g=h.querySelector(`#${c}`);if(g){g.setAttribute("markerWidth",`${d}`),g.setAttribute("markerHeight",`${d}`);const e=g.querySelector("path");e&&e.setAttribute("fill",r)}else{g=document.createElementNS(p,"marker"),g.setAttribute("id",c),g.setAttribute("viewBox","0 0 10 10"),g.setAttribute("refX","8"),g.setAttribute("refY","5"),g.setAttribute("markerWidth",`${d}`),g.setAttribute("markerHeight",`${d}`),g.setAttribute("orient","auto");const e=document.createElementNS(p,"path");e.setAttribute("d","M 0 0 L 10 5 L 0 10 z"),e.setAttribute("fill",r),g.appendChild(e),h.appendChild(g)}o.markerEndId=c,(0,l.A)(e,t,n,i,a,o)}var w=n(97181),E=n(85899),I=n(56442);function C(e,t,n,i,a,o={}){const{color:s,width:r,lineWidth:l,lineDash:d}=Object.assign({color:"rgb(0, 255, 0)",width:"2",lineWidth:void 0,lineDash:void 0},o),c=l||r,h=(0,w.A)(t,"rect",n),g=e.getSvgNode(h),u=[Math.min(i[0],a[0]),Math.min(i[1],a[1])],m=Math.abs(i[0]-a[0]),v=Math.abs(i[1]-a[1]),p={x:`${u[0]}`,y:`${u[1]}`,width:`${m}`,height:`${v}`,stroke:s,fill:"black","stroke-width":c,"stroke-dasharray":d};if(g)(0,E.A)(p,g),e.setNodeTouched(h);else{const t=document.createElementNS("http://www.w3.org/2000/svg","rect");(0,I.A)(p,t),e.appendNode(t,h)}}},75183:(e,t,n)=>{"use strict";var i;n.d(t,{A:()=>a}),function(e){e.Interaction="Interaction",e.HandlesUpdated="HandlesUpdated",e.StatsUpdated="StatsUpdated",e.InitialSetup="InitialSetup",e.Completed="Completed",e.InterpolationUpdated="InterpolationUpdated",e.History="History",e.MetadataReferenceModified="MetadataReferenceModified",e.LabelChange="LabelChange"}(i||(i={}));const a=i},10401:(e,t,n)=>{"use strict";var i;n.d(t,{H:()=>i}),function(e){e.UP="UP",e.DOWN="DOWN",e.LEFT="LEFT",e.RIGHT="RIGHT"}(i||(i={}))},50986:(e,t,n)=>{"use strict";n.d(t,{r:()=>c});n(15327),n(15295),n(95527);var i=n(58640),a=n(60810),o=n(82056),s=(n(93126),n(44049),n(72967)),r=n(64843);n(77609),n(68040);const l="PlanarFreehandContourSegmentationTool";function d(e,t){const n=e.length,i=new Array(n);for(let a=0;a<n;a++)i[a]=t.worldToCanvas(e[a]);return i}function c(e,t,n){const{windingDirection:c}=t.data.contour,{windingDirection:h}=n.data.contour;(0,o.addChildAnnotation)(t,n),(0,r.removeContourSegmentationAnnotation)(n);const{contour:g}=n.data,u=d(g.polyline,e);(0,s.A)(n,{points:u,closed:g.closed},e);const{element:m}=e,v=new Set([l,t.metadata.toolName,n.metadata.toolName]);for(const e of v.values()){const t=(0,a.getViewportIdsWithToolToRender)(m,e);(0,i.A)(t)}}},83638:(e,t,n)=>{"use strict";n.d(t,{kt:()=>i.A});n(91099),n(68014),n(41343);n(41666),n(82603);n(17806);var i=n(39595);n(24917),n(15327),n(99737);n(59452),n(93210),n(97577);n(33283),n(58859);n(42008),n(58498),n(78231);new Map;n(64843),n(50986);n(58640)},24917:(e,t,n)=>{"use strict";n.d(t,{h6:()=>p});var i=n(15327),a=n(99737),o=n(18682),s=n(93210),r=n(67014),l=n(25894),d=n(684),c=n(68040),h=n(85204),g=n(37590),u=n(77609);const m={[o.A.Labelmap]:d.Ay,[o.A.Contour]:l.A,[o.A.Surface]:r.Ay},v=g.A.toolName;function p(e){f.renderSegmentationsForViewport(e)}const f=new class{constructor(){this._needsRender=new Set,this._animationFrameSet=!1,this._animationFrameHandle=null,this._getAllViewports=()=>(0,i.getRenderingEngines)().flatMap((e=>e.getViewports())),this._renderFlaggedSegmentations=()=>{this._throwIfDestroyed();Array.from(this._needsRender).forEach((e=>{this._triggerRender(e)})),this._needsRender.clear(),this._animationFrameSet=!1,this._animationFrameHandle=null}}renderSegmentationsForViewport(e){const t=e?[e]:this._getViewportIdsForSegmentation();this._setViewportsToBeRenderedNextFrame(t)}renderSegmentation(e){const t=this._getViewportIdsForSegmentation(e);this._setViewportsToBeRenderedNextFrame(t)}_getViewportIdsForSegmentation(e){const t=this._getAllViewports(),n=[];for(const i of t){const t=i.id;if(e){const i=(0,s.r$)(t,{segmentationId:e});i?.length>0&&n.push(t)}else{const e=(0,s.r$)(t);e?.length>0&&n.push(t)}}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((e=>{this._needsRender.add(e)})),this._render()}_render(){this._needsRender.size>0&&!1===this._animationFrameSet&&(this._animationFrameHandle=window.requestAnimationFrame(this._renderFlaggedSegmentations),this._animationFrameSet=!0)}_triggerRender(e){const t=(0,s.r$)(e);if(!t?.length)return;const{viewport:n}=(0,i.getEnabledElementByViewportId)(e)||{};if(!n)return;const o=[],r=t.map((e=>{e.type===a.SegmentationRepresentations.Contour&&this._addPlanarFreeHandToolIfAbsent(n);const t=m[e.type];try{const i=t.render(n,e);o.push(i)}catch(e){console.error(e)}return Promise.resolve({segmentationId:e.segmentationId,type:e.type})}));Promise.allSettled(r).then((e=>{const t=e.filter((e=>"fulfilled"===e.status)).map((e=>e.value));n.element.addEventListener(i.Enums.Events.IMAGE_RENDERED,(function e(n){const{element:o,viewportId:s}=n.detail;o.removeEventListener(i.Enums.Events.IMAGE_RENDERED,e),t.forEach((e=>{const t={viewportId:s,segmentationId:e.segmentationId,type:e.type};(0,i.triggerEvent)(i.eventTarget,a.Events.SEGMENTATION_RENDERED,{...t})}))})),n.render()}))}_addPlanarFreeHandToolIfAbsent(e){v in h.wk.tools||(0,c.Gx)(g.A);const t=(0,u.getToolGroupForViewport)(e.id);t.hasTool(v)||(t.addTool(v),t.setToolPassive(v))}}},59475:(e,t,n)=>{"use strict";n.d(t,{Zm:()=>h,_6:()=>m,cC:()=>g});var i=n(15327),a=n(99737),o=n(33739),s=n(99341),r=n(49906),l=n(92686),d=n(75419);const c={colorLUT:[],segmentations:[],viewportSegRepresentations:{}};async function h({imageIds:e,options:t}){const n=e,a=t?.volumeId||i.utilities.uuidv4();return await i.volumeLoader.createAndCacheVolumeFromImages(a,n),{volumeId:a}}async function g({segmentationId:e,options:t}){const n=m.getSegmentation(e),i=n.representationData.Labelmap,{volumeId:a}=await h({imageIds:i.imageIds,options:t});n.representationData.Labelmap.volumeId=a}function u(e){const t=o.Ay.newInstance(),n=s.Ay.newInstance();return n.addPoint(0,0),e===a.SegmentationRepresentations.Labelmap?{cfun:t,ofun:n}:{}}const m=new class{constructor(e){this._stackLabelmapImageIdReferenceMap=new Map,this._labelmapImageIdReferenceMap=new Map,e||=i.utilities.uuidv4(),this.state=Object.freeze(i.utilities.deepClone(c)),this.uid=e}getState(){return this.state}updateState(e){const t=i.utilities.deepClone(this.state);e(t),this.state=Object.freeze(t)}getColorLUT(e){return this.state.colorLUT[e]}getNextColorLUTIndex(){return this.state.colorLUT.length}resetState(){this._stackLabelmapImageIdReferenceMap.clear(),this._labelmapImageIdReferenceMap.clear(),this.state=Object.freeze(i.utilities.deepClone(c))}getSegmentation(e){return this.state.segmentations.find((t=>t.segmentationId===e))}updateSegmentation(e,t){this.updateState((n=>{const i=n.segmentations.find((t=>t.segmentationId===e));i?Object.assign(i,t):console.warn(`Segmentation with id ${e} not found. Update aborted.`)})),(0,r.triggerSegmentationModified)(e)}addSegmentation(e){if(this.getSegmentation(e.segmentationId))throw new Error(`Segmentation with id ${e.segmentationId} already exists`);this.updateState((t=>{const n=i.utilities.deepClone(e);if(n.representationData.Labelmap&&"volumeId"in n.representationData.Labelmap&&!("imageIds"in n.representationData.Labelmap)){const e=this.getLabelmapImageIds(n.representationData);n.representationData.Labelmap.imageIds=e}t.segmentations.push(n)})),(0,d.R)(e.segmentationId)}removeSegmentation(e){this.updateState((t=>{const n=t.segmentations.filter((t=>t.segmentationId!==e));t.segmentations.splice(0,t.segmentations.length,...n)})),(0,r.triggerSegmentationRemoved)(e)}addSegmentationRepresentation(e,t,n,o){if(!(0,i.getEnabledElementByViewportId)(e))return;this.getSegmentationRepresentations(e,{type:n,segmentationId:t}).length>0?console.debug("A segmentation representation of type",n,"already exists in viewport",e,"for segmentation",t):(this.updateState((i=>{i.viewportSegRepresentations[e]||(i.viewportSegRepresentations[e]=[],l.Y.setRenderInactiveSegmentations(e,!0)),n!==a.SegmentationRepresentations.Labelmap?this.addDefaultSegmentationRepresentation(i,e,t,n,o):this.addLabelmapRepresentation(i,e,t,o)})),(0,r.triggerSegmentationRepresentationModified)(e,t,n))}addDefaultSegmentationRepresentation(e,t,n,i,a){const o=e.segmentations.find((e=>e.segmentationId===n));if(!o)return;const s={};Object.keys(o.segments).forEach((e=>{s[Number(e)]={visible:!0}})),e.viewportSegRepresentations[t].push({segmentationId:n,type:i,active:!0,visible:!0,colorLUTIndex:a?.colorLUTIndex||0,segments:s,config:{...u(i),...a}}),this._setActiveSegmentation(e,t,n)}addLabelmapRepresentation(e,t,n,o=u(a.SegmentationRepresentations.Labelmap)){if(!(0,i.getEnabledElementByViewportId)(t))return;const s=this.getSegmentation(n);if(!s)return;const{representationData:r}=s;if(!r.Labelmap)return this.addDefaultSegmentationRepresentation(e,t,n,a.SegmentationRepresentations.Labelmap,o);this.processLabelmapRepresentationAddition(t,n),this.addDefaultSegmentationRepresentation(e,t,n,a.SegmentationRepresentations.Labelmap,o)}async processLabelmapRepresentationAddition(e,t){const n=(0,i.getEnabledElementByViewportId)(e);if(!n)return;const a=this.getSegmentation(t);if(!a)return;const o=n.viewport instanceof i.BaseVolumeViewport,{representationData:s}=a,r="volumeId"in s.Labelmap;n.viewport;o||r||this.updateLabelmapSegmentationImageReferences(e,a.segmentationId)}_updateLabelmapSegmentationReferences(e,t,n,i){const a=t.getCurrentImageId();let o=!1;for(const i of n){t.isReferenceViewable({referencedImageId:i},{asOverlay:!0})&&(o=!0,this._stackLabelmapImageIdReferenceMap.get(e).set(a,i),this._updateLabelmapImageIdReferenceMap({segmentationId:e,referenceImageId:a,labelmapImageId:i}))}return i&&i(t,e,n),o?this._stackLabelmapImageIdReferenceMap.get(e).get(a):void 0}updateLabelmapSegmentationImageReferences(e,t){const n=this.getSegmentation(t);if(!n)return;this._stackLabelmapImageIdReferenceMap.has(t)||this._stackLabelmapImageIdReferenceMap.set(t,new Map);const{representationData:a}=n;if(!a.Labelmap)return;const o=this.getLabelmapImageIds(a),s=(0,i.getEnabledElementByViewportId)(e).viewport;return this._updateLabelmapSegmentationReferences(t,s,o,null)}_updateAllLabelmapSegmentationImageReferences(e,t){const n=this.getSegmentation(t);if(!n)return;this._stackLabelmapImageIdReferenceMap.has(t)||this._stackLabelmapImageIdReferenceMap.set(t,new Map);const{representationData:a}=n;if(!a.Labelmap)return;const o=this.getLabelmapImageIds(a),s=(0,i.getEnabledElementByViewportId)(e).viewport;this._updateLabelmapSegmentationReferences(t,s,o,((e,t,n)=>{e.getImageIds().forEach(((i,a)=>{for(const o of n){e.isReferenceViewable({referencedImageId:o,sliceIndex:a},{asOverlay:!0,withNavigation:!0})&&(this._stackLabelmapImageIdReferenceMap.get(t).set(i,o),this._updateLabelmapImageIdReferenceMap({segmentationId:t,referenceImageId:i,labelmapImageId:o}))}}))}))}getLabelmapImageIds(e){const t=e.Labelmap;let n;if(t.imageIds)n=t.imageIds;else if(!n&&t.volumeId){const e=t.volumeId;n=i.cache.getVolume(e).imageIds}return n}getLabelmapImageIdsForImageId(e,t){const n=this._generateMapKey({segmentationId:t,referenceImageId:e});return this._labelmapImageIdReferenceMap.get(n)}getCurrentLabelmapImageIdsForViewport(e,t){const n=(0,i.getEnabledElementByViewportId)(e);if(!n)return;const a=n.viewport.getCurrentImageId();return this.getLabelmapImageIdsForImageId(a,t)}getCurrentLabelmapImageIdForViewport(e,t){const n=(0,i.getEnabledElementByViewportId)(e);if(!n)return;if(!this._stackLabelmapImageIdReferenceMap.has(t))return;const a=n.viewport.getCurrentImageId();return this._stackLabelmapImageIdReferenceMap.get(t).get(a)}getStackSegmentationImageIdsForViewport(e,t){if(!this.getSegmentation(t))return[];this._updateAllLabelmapSegmentationImageReferences(e,t);const{viewport:n}=(0,i.getEnabledElementByViewportId)(e),a=n.getImageIds(),o=this._stackLabelmapImageIdReferenceMap.get(t);return a.map((e=>o.get(e)))}removeSegmentationRepresentationsInternal(e,t){const n=[];return this.updateState((i=>{if(!i.viewportSegRepresentations[e])return;const a=i.viewportSegRepresentations[e];let o=!1;if(!t||Object.values(t).every((e=>void 0===e)))n.push(...a),delete i.viewportSegRepresentations[e];else{const{segmentationId:s,type:r}=t;i.viewportSegRepresentations[e]=a.filter((e=>{const t=s&&r&&e.segmentationId===s&&e.type===r||s&&!r&&e.segmentationId===s||!s&&r&&e.type===r;return t&&(n.push(e),e.active&&(o=!0)),!t})),0===i.viewportSegRepresentations[e].length?delete i.viewportSegRepresentations[e]:o&&(i.viewportSegRepresentations[e][0].active=!0)}})),n}removeSegmentationRepresentations(e,t){const n=this.removeSegmentationRepresentationsInternal(e,t);n.forEach((t=>{(0,r.triggerSegmentationRepresentationRemoved)(e,t.segmentationId,t.type)}));const i=this.getSegmentationRepresentations(e);return i.length>0&&i[0].active&&(0,r.triggerSegmentationRepresentationModified)(e,i[0].segmentationId,i[0].type),n}removeSegmentationRepresentation(e,t,n){const i=this.removeSegmentationRepresentationsInternal(e,t);return n||i.forEach((({segmentationId:t,type:n})=>{(0,r.triggerSegmentationRepresentationRemoved)(e,t,n)})),i}_updateLabelmapImageIdReferenceMap({segmentationId:e,referenceImageId:t,labelmapImageId:n}){const i=this._generateMapKey({segmentationId:e,referenceImageId:t});if(!this._labelmapImageIdReferenceMap.has(i))return void this._labelmapImageIdReferenceMap.set(i,[n]);const a=this._labelmapImageIdReferenceMap.get(i),o=Array.from(new Set([...a,n]));this._labelmapImageIdReferenceMap.set(i,o)}_setActiveSegmentation(e,t,n){const i=e.viewportSegRepresentations[t];i&&i.forEach((e=>{e.active=e.segmentationId===n}))}setActiveSegmentation(e,t){this.updateState((n=>{const i=n.viewportSegRepresentations[e];i&&i.forEach((e=>{e.active=e.segmentationId===t}))})),(0,r.triggerSegmentationRepresentationModified)(e,t)}getActiveSegmentation(e){if(!this.state.viewportSegRepresentations[e])return;const t=this.state.viewportSegRepresentations[e].find((e=>e.active));return t?this.getSegmentation(t.segmentationId):void 0}getSegmentationRepresentations(e,t={}){const n=this.state.viewportSegRepresentations[e];return n?t.type||t.segmentationId?n.filter((e=>{const n=!t.type||e.type===t.type,i=!t.segmentationId||e.segmentationId===t.segmentationId;return n&&i})):n:[]}getSegmentationRepresentation(e,t){return this.getSegmentationRepresentations(e,t)[0]}getSegmentationRepresentationVisibility(e,t){const n=this.getSegmentationRepresentation(e,t);return n?.visible}setSegmentationRepresentationVisibility(e,t,n){this.updateState((i=>{const a=this.getSegmentationRepresentations(e,t);a&&a.forEach((e=>{e.visible=n,Object.entries(e.segments).forEach((([e,t])=>{t.visible=n}))}))})),(0,r.triggerSegmentationRepresentationModified)(e,t.segmentationId,t.type)}addColorLUT(e,t){this.updateState((n=>{n.colorLUT[t]&&console.warn("Color LUT table already exists, overwriting"),n.colorLUT[t]=i.utilities.deepClone(e)}))}removeColorLUT(e){this.updateState((t=>{delete t.colorLUT[e]}))}_getStackIdForImageIds(e){return e.map((e=>e.slice(-Math.round(.15*e.length)))).join("_")}getAllViewportSegmentationRepresentations(){return Object.entries(this.state.viewportSegRepresentations).map((([e,t])=>({viewportId:e,representations:t})))}getSegmentationRepresentationsBySegmentationId(e){const t=[];return Object.entries(this.state.viewportSegRepresentations).forEach((([n,i])=>{const a=i.filter((t=>t.segmentationId===e));a.length>0&&t.push({viewportId:n,representations:a})})),t}_generateMapKey({segmentationId:e,referenceImageId:t}){return`${e}-${t}`}}("DEFAULT")},92686:(e,t,n)=>{"use strict";n.d(t,{Y:()=>r});var i=n(67772),a=n(53486),o=n(99737),s=n(15327);const r=new class{constructor(){this.config={global:{},segmentations:{},viewportsStyle:{}}}setStyle(e,t){const{viewportId:n,segmentationId:i,type:a,segmentIndex:o}=e,s=this.getStyle(e);let r;if(r=n||i?this.copyActiveToInactiveIfNotProvided({...s,...t},a):{...s,...t},!a)throw new Error("Type is required to set a style");if(n){this.config.viewportsStyle[n]||(this.config.viewportsStyle[n]={renderInactiveSegmentations:!1,representations:{}});const e=this.config.viewportsStyle[n].representations;if(i){e[i]||(e[i]={}),e[i][a]||(e[i][a]={});const t=e[i][a];void 0!==o?(t.perSegment||(t.perSegment={}),t.perSegment[o]=r):t.allSegments=r}else{const t="__allSegmentations__";e[t]||(e[t]={}),e[t][a]||(e[t][a]={}),e[t][a].allSegments=r}}else if(i){this.config.segmentations[i]||(this.config.segmentations[i]={}),this.config.segmentations[i][a]||(this.config.segmentations[i][a]={});const e=this.config.segmentations[i][a];void 0!==o?(e.perSegment||(e.perSegment={}),e.perSegment[o]=r):e.allSegments=r}else this.config.global[a]=r}copyActiveToInactiveIfNotProvided(e,t){const n={...e};if(t===o.SegmentationRepresentations.Labelmap){const e=n;e.renderOutlineInactive??=e.renderOutline,e.outlineWidthInactive??=e.outlineWidth,e.renderFillInactive??=e.renderFill,e.fillAlphaInactive??=e.fillAlpha,e.outlineOpacityInactive??=e.outlineOpacity}else if(t===o.SegmentationRepresentations.Contour){const e=n;e.outlineWidthInactive??=e.outlineWidth,e.outlineOpacityInactive??=e.outlineOpacity,e.outlineDashInactive??=e.outlineDash,e.renderOutlineInactive??=e.renderOutline,e.renderFillInactive??=e.renderFill,e.fillAlphaInactive??=e.fillAlpha}return n}getStyle(e){const{viewportId:t,segmentationId:n,type:i,segmentIndex:a}=e;let o=this.getDefaultStyle(i),s=!1;if(this.config.global[i]&&(o={...o,...this.config.global[i]}),this.config.segmentations[n]?.[i]&&(o={...o,...this.config.segmentations[n][i].allSegments},void 0!==a&&this.config.segmentations[n][i].perSegment?.[a]&&(o={...o,...this.config.segmentations[n][i].perSegment[a]})),t&&this.config.viewportsStyle[t]){s=this.config.viewportsStyle[t].renderInactiveSegmentations;const e="__allSegmentations__";this.config.viewportsStyle[t].representations[e]?.[i]&&(o={...o,...this.config.viewportsStyle[t].representations[e][i].allSegments}),n&&this.config.viewportsStyle[t].representations[n]?.[i]&&(o={...o,...this.config.viewportsStyle[t].representations[n][i].allSegments},void 0!==a&&this.config.viewportsStyle[t].representations[n][i].perSegment?.[a]&&(o={...o,...this.config.viewportsStyle[t].representations[n][i].perSegment[a]}))}return o}getRenderInactiveSegmentations(e){return this.config.viewportsStyle[e]?.renderInactiveSegmentations}setRenderInactiveSegmentations(e,t){this.config.viewportsStyle[e]||(this.config.viewportsStyle[e]={renderInactiveSegmentations:!1,representations:{}}),this.config.viewportsStyle[e].renderInactiveSegmentations=t}getDefaultStyle(e){switch(e){case o.SegmentationRepresentations.Labelmap:return(0,a.A)();case o.SegmentationRepresentations.Contour:return(0,i.A)();case o.SegmentationRepresentations.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 t=this.config.viewportsStyle[e].renderInactiveSegmentations;this.config.viewportsStyle[e]={renderInactiveSegmentations:t,representations:{}}}}resetToGlobalStyle(){this.clearAllSegmentationStyles(),this.clearAllViewportStyles()}hasCustomStyle(e){const{type:t}=e,n=this.getStyle(e),i=this.getDefaultStyle(t);return!s.utilities.deepEqual(n,i)}}},26228:(e,t,n)=>{"use strict";n.r(t),n.d(t,{getActiveSegmentation:()=>o,setActiveSegmentation:()=>s});var i=n(67165),a=n(59475);function o(e){return(0,i.T)(e)}function s(e,t){!function(e,t){a._6.setActiveSegmentation(e,t)}(e,t)}},4714:(e,t,n)=>{"use strict";n.d(t,{u:()=>r});var i=n(15327),a=n(59475),o=n(70906),s=n(93952);function r(e,t){const n=a._6,r=t??(0,o.u)();let l=[...e];if(i.utilities.isEqual(l[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"),l=[[0,0,0,0],...l]),l=l.map((e=>3===e.length?[e[0],e[1],e[2],255]:e)),l.length<255){const e=s.A.slice(l.length);l=[...l,...e]}return n.addColorLUT(l,r),r}},74283:(e,t,n)=>{"use strict";n.d(t,{gR:()=>a});n(99737);var i=n(55894);function a(e,t){t.map((t=>(0,i.U)(e,t)))}},30935:(e,t,n)=>{"use strict";n.d(t,{d:()=>l});var i=n(59475),a=n(49906),o=n(99737),s=n(15327);const r=function(e){const{segmentationId:t,representation:n,config:i}=e,{type:a,data:r}=n,l=r?{...r}:{};if(!l)throw new Error("Segmentation representation data may not be undefined");var d;a===o.SegmentationRepresentations.Contour&&((d=l).geometryIds=d.geometryIds??[],d.annotationUIDsMap=d.annotationUIDsMap??new Map);const c=function(e,t,n){const i={};e?Object.entries(e).forEach((([e,t])=>{i[e]={segmentIndex:Number(e),label:t.label??`Segment ${e}`,locked:t.locked??!1,cachedStats:t.cachedStats??{},active:t.active??!1}})):t===o.SegmentationRepresentations.Surface?function(e,t){const{geometryIds:n}=t;n?.forEach((t=>{const n=s.cache.getGeometry(t);if(n?.data){const{segmentIndex:t}=n.data;e[t]={segmentIndex:t}}}))}(i,n):i[1]={segmentIndex:1,label:"Segment 1",locked:!1,cachedStats:{},active:!0};return i}(i?.segments,a,l);return delete i?.segments,{segmentationId:t,label:i?.label??null,cachedStats:i?.cachedStats??{},segments:c,representationData:{[a]:{...l}}}};function l(e,t){const n=i._6;e.forEach((e=>{const i=r(e);n.addSegmentation(i),t||(0,a.triggerSegmentationModified)(i.segmentationId)}))}},93733:(e,t,n)=>{"use strict";n.r(t),n.d(t,{addColorLUT:()=>r,getSegmentIndexColor:()=>d,setColorLUT:()=>l,setSegmentIndexColor:()=>c});var i=n(4714),a=n(50409),o=n(93210),s=n(49906);function r(e,t){if(!e)throw new Error("addColorLUT: colorLUT is required");return(0,i.u)(e,t)}function l(e,t,n){if(!(0,a.B)(n))throw new Error(`setColorLUT: could not find colorLUT with index ${n}`);const i=(0,o.r$)(e,{segmentationId:t});if(!i)throw new Error(`viewport specific state for viewport ${e} does not exist`);i.forEach((e=>{e.colorLUTIndex=n})),(0,s.triggerSegmentationRepresentationModified)(e,t)}function d(e,t,n){const i=(0,o.r$)(e,{segmentationId:t});if(!i||0===i.length)return null;const s=i[0],{colorLUTIndex:r}=s,l=(0,a.B)(r);let d=l[n];if(!d){if("number"!=typeof n)return console.warn(`Can't create colour for LUT index ${n}`),null;d=l[n]=[0,0,0,0]}return d}function c(e,t,n,i){const a=d(e,t,n);for(let e=0;e<i.length;e++)a[e]=i[e];(0,s.triggerSegmentationRepresentationModified)(e,t)}},98798:(e,t,n)=>{"use strict";n.d(t,{Q:()=>s});var i=n(15327),a=n(99737),o=n(64063);function s(e,t,n){const s={segmentationId:e,modifiedSlicesToUse:t,segmentIndex:n};(0,o.HM)(e),(0,i.triggerEvent)(i.eventTarget,a.Events.SEGMENTATION_DATA_MODIFIED,s)}},67165:(e,t,n)=>{"use strict";n.d(t,{T:()=>a});var i=n(59475);function a(e){return i._6.getActiveSegmentation(e)}},70906:(e,t,n)=>{"use strict";n.d(t,{u:()=>a});var i=n(59475);function a(){return i._6.getNextColorLUTIndex()}},93210:(e,t,n)=>{"use strict";n.d(t,{Ut:()=>o,ny:()=>s,r$:()=>a});var i=n(59475);function a(e,t={}){return i._6.getSegmentationRepresentations(e,t)}function o(e,t){const n=i._6;if(!t.segmentationId||!t.type)throw new Error("getSegmentationRepresentation: No segmentationId or type provided, you need to provide at least one of them");const a=n.getSegmentationRepresentations(e,t);return a?.[0]}function s(e){return i._6.getSegmentationRepresentationsBySegmentationId(e)}},33658:(e,t,n)=>{"use strict";n.d(t,{I:()=>a});var i=n(59475);function a(e,t){return i._6.getSegmentationRepresentationVisibility(e,t)}},70758:(e,t,n)=>{"use strict";n.d(t,{K:()=>a});var i=n(59475);function a(){return i._6.getState().segmentations}},42568:(e,t,n)=>{"use strict";n.d(t,{a:()=>o,z:()=>s});var i=n(33283),a=n(59475);function o(e,t){return s(e).map((e=>(t&&e.type,(0,i.T)(e.segmentationId)))).filter((e=>void 0!==e))}function s(e){return a._6.getState().viewportSegRepresentations[e]}},93690:(e,t,n)=>{"use strict";n.d(t,{f:()=>s});var i=n(15327),a=n(33283),o=n(98149);function s({segmentationId:e,options:t}){const n=(0,a.T)(e);if(!n)return;const{volumeId:s}=n.representationData.Labelmap,r=i.cache.getVolume(s);return(0,o.X)({segmentationId:e,viewportId:t.viewportId,imageIds:r.imageIds,options:t})}},6994:(e,t,n)=>{"use strict";n.d(t,{a:()=>a});var i=n(59475);async function a(e){return(0,i.Zm)(e)}},44595:(e,t,n)=>{"use strict";n.d(t,{activeSegmentation:()=>o,addSegmentationRepresentations:()=>a.gR,config:()=>i,segmentIndex:()=>d,segmentLocking:()=>s,state:()=>r});var i={};n.r(i),n.d(i,{color:()=>l});n(53662);var a=n(74283);n(30935),n(44188),n(59475),n(49906);var o=n(26228),s=n(26795),r=n(98870),l=n(93733);n(93210);n(33658),n(24917);n(70758),n(42568),n(92686);var d=n(70930),c=n(6273),h=n(6994);n(15327),n(33283);var g=n(93690);n(60740),n(58859);n(99522),n(63427),n(97577),n(67165);c.p,h.a,g.f},44188:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var i=n(33283),a=n(18682);const o=function({segmentationId:e,type:t,data:n}){const o=(0,i.T)(e);if(!o)throw new Error(`Segmentation ${e} not found`);switch(o.representationData[t]&&console.warn(`Representation data of type ${t} already exists for segmentation ${e}, overwriting it.`),t){case a.A.Labelmap:case a.A.Contour:case a.A.Surface:n&&(o.representationData[t]=n);break;default:throw new Error(`Invalid representation type ${t}`)}}},55894:(e,t,n)=>{"use strict";n.d(t,{U:()=>d});var i=n(93952),a=n(58640),o=n(99737),s=n(49906),r=n(4714),l=n(59475);function d(e,t){const{segmentationId:n,config:i}=t,r={colorLUTIndex:c(i),...i};l._6.addSegmentationRepresentation(e,n,t.type,r),t.type===o.SegmentationRepresentations.Contour&&(0,a.t)([e]),(0,s.triggerSegmentationModified)(n)}function c(e){const{colorLUTOrIndex:t}=e||{};if(void 0===t){return(0,r.u)(JSON.parse(JSON.stringify(i.A)))}if("number"==typeof t)return t;if(Array.isArray(t)&&t.every((e=>Array.isArray(e)&&4===e.length))){return(0,r.u)(t)}return(0,r.u)(JSON.parse(JSON.stringify(i.A)))}},63427:(e,t,n)=>{"use strict";n.d(t,{j:()=>r,z:()=>s});var i=n(59475),a=n(49906),o=n(53662);function s(e){const t=i._6;t.getAllViewportSegmentationRepresentations().filter((({representations:t})=>t.some((t=>t.segmentationId===e)))).map((({viewportId:e})=>e)).forEach((t=>{(0,o.nc)(t,{segmentationId:e})})),t.removeSegmentation(e),(0,a.triggerSegmentationRemoved)(e)}function r(){const e=i._6;e.getState().segmentations.map((e=>e.segmentationId)).forEach((e=>{s(e)})),e.resetState()}},53662:(e,t,n)=>{"use strict";n.d(t,{us:()=>u,OE:()=>v,kN:()=>m,E8:()=>c,nc:()=>h,JC:()=>p});var i=n(18682),a=n(684),o=n(25894),s=n(93210),r=n(15327),l=n(59475),d=n(67014);function c(e,t,n){return g(e,t,n)}function h(e,t,n){return g(e,t,n)}function g(e,t,n){const{segmentationId:c,type:h}=t;return function(e,t,n,l){const c=(0,s.r$)(e,{segmentationId:t,type:n});c.forEach((t=>{t.type===i.A.Labelmap?a.Ay.removeRepresentation(e,t.segmentationId,l):t.type===i.A.Contour?o.A.removeRepresentation(e,t.segmentationId,l):t.type===i.A.Surface&&d.Ay.removeRepresentation(e,t.segmentationId,l)}));const{viewport:h}=(0,r.getEnabledElementByViewportId)(e)||{};h&&h.render()}(e,c,h,n),l._6.removeSegmentationRepresentations(e,{segmentationId:c,type:h})}function u(){l._6.getAllViewportSegmentationRepresentations().forEach((({viewportId:e,representations:t})=>{t.forEach((({segmentationId:t,type:n})=>{c(e,{segmentationId:t,type:n})}))})),l._6.resetState()}function m(e,t,n){c(e,{segmentationId:t,type:i.A.Labelmap},n)}function v(e,t,n){c(e,{segmentationId:t,type:i.A.Contour},n)}function p(e,t,n){c(e,{segmentationId:t,type:i.A.Surface},n)}},70930:(e,t,n)=>{"use strict";n.r(t),n.d(t,{getActiveSegmentIndex:()=>l.Q,setActiveSegmentIndex:()=>c});var i=n(77609),a=n(35706),o=n(33283),s=n(58859),r=n(49906),l=n(60740),d=n(93210);function c(e,t){const n=(0,o.T)(e);"string"==typeof t&&(console.warn("segmentIndex is a string, converting to number"),t=Number(t)),Object.values(n.segments).forEach((e=>{e.active=!1})),n.segments[t]||(n.segments[t]={segmentIndex:t,label:"",locked:!1,cachedStats:{},active:!1}),!0!==n.segments[t].active&&(n.segments[t].active=!0,(0,r.triggerSegmentationModified)(e));const l=(0,s.P)(e);l.forEach((n=>{(0,d.r$)(n,{segmentationId:e}).forEach((e=>{e.segments[t]||(e.segments[t]={visible:!0})}))})),l.forEach((e=>{const t=(0,i.getToolGroupForViewport)(e);(0,a.E)(t.id)}))}},26795:(e,t,n)=>{"use strict";n.r(t),n.d(t,{getLockedSegmentIndices:()=>r,isSegmentIndexLocked:()=>o,setSegmentIndexLocked:()=>s});var i=n(33283),a=n(49906);function o(e,t){const n=(0,i.T)(e);if(!n)throw new Error(`No segmentation state found for ${e}`);const{segments:a}=n;return a[t].locked}function s(e,t,n=!0){const o=(0,i.T)(e);if(!o)throw new Error(`No segmentation state found for ${e}`);const{segments:s}=o;s[t].locked=n,(0,a.triggerSegmentationModified)(e)}function r(e){const t=(0,i.T)(e);if(!t)throw new Error(`No segmentation state found for ${e}`);const{segments:n}=t;return Object.keys(n).filter((e=>n[e].locked)).map((e=>parseInt(e)))}},98870:(e,t,n)=>{"use strict";n.r(t),n.d(t,{addColorLUT:()=>l.u,addSegmentations:()=>o.d,destroy:()=>E,getColorLUT:()=>d.B,getCurrentLabelmapImageIdForViewport:()=>v.vl,getCurrentLabelmapImageIdsForViewport:()=>v.aF,getNextColorLUTIndex:()=>c.u,getSegmentation:()=>i.T,getSegmentationRepresentation:()=>w.Ut,getSegmentationRepresentations:()=>w.r$,getSegmentationRepresentationsBySegmentationId:()=>w.ny,getSegmentations:()=>a.K,getStackSegmentationImageIdsForViewport:()=>f,getViewportIdsWithSegmentation:()=>m.P,getViewportSegmentationRepresentations:()=>u.z,getViewportSegmentations:()=>u.a,removeAllSegmentationRepresentations:()=>r.us,removeAllSegmentations:()=>s.j,removeColorLUT:()=>g,removeContourRepresentation:()=>r.OE,removeLabelmapRepresentation:()=>r.kN,removeSegmentation:()=>s.z,removeSegmentationRepresentation:()=>r.E8,removeSurfaceRepresentation:()=>r.JC,updateLabelmapSegmentationImageReferences:()=>p.t});var i=n(33283),a=n(70758),o=n(30935),s=n(63427),r=n(53662),l=n(4714),d=n(50409),c=n(70906),h=n(59475);function g(e){h._6.removeColorLUT(e)}var u=n(42568),m=n(58859),v=n(97577),p=n(78231);function f(e,t){return h._6.getStackSegmentationImageIdsForViewport(e,t)}var w=n(93210);function E(){h._6.resetState()}},78231:(e,t,n)=>{"use strict";n.d(t,{t:()=>a});var i=n(59475);function a(e,t){return i._6.updateLabelmapSegmentationImageReferences(e,t)}},65136:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var i=n(15327),a=n(85204);const o=function(e,t){t||(t=(0,i.getRenderingEngines)().find((t=>t.getViewports().find((t=>t.id===e))))?.id);const n=a.wk.toolGroups.filter((n=>n.viewportsInfo.some((n=>n.renderingEngineId===t&&(!n.viewportId||n.viewportId===e)))));if(n.length){if(n.length>1)throw new Error(`Multiple tool groups found for renderingEngineId: ${t} and viewportId: ${e}. You should only\n      have one tool group per viewport in a renderingEngine.`);return n[0]}}},48145:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});let i={};const a=i},25072:(e,t,n)=>{"use strict";n.d(t,{A:()=>_});var i=n(3823),a=n(15327),o=n(4096),s=n(85817),r=n(27730),l=n(82056),d=n(2076),c=n(29601),h=n(44049),g=n(17328),u=n(85204),m=n(99737),v=n(60810),p=n(15305),f=n(473),w=n(7001),E=n(58640);const{transformWorldToIndex:I}=a.utilities;class C extends s.EC{static{this.toolName="Bidirectional"}constructor(e={},t={supportedInteractionTypes:["Mouse","Touch"],configuration:{preventHandleOutsideImage:!1,getTextLines:b}}){super(e,t),this.isPointNearTool=(e,t,n,i)=>{const o=(0,a.getEnabledElement)(e),{viewport:s}=o,{data:r}=t,{points:l}=r.handles;let d=s.worldToCanvas(l[0]),c=s.worldToCanvas(l[1]),h={start:{x:d[0],y:d[1]},end:{x:c[0],y:c[1]}},g=p.distanceToPoint([h.start.x,h.start.y],[h.end.x,h.end.y],[n[0],n[1]]);return g<=i||(d=s.worldToCanvas(l[2]),c=s.worldToCanvas(l[3]),h={start:{x:d[0],y:d[1]},end:{x:c[0],y:c[1]}},g=p.distanceToPoint([h.start.x,h.start.y],[h.end.x,h.end.y],[n[0],n[1]]),g<=i)},this.toolSelectedCallback=(e,t)=>{const n=e.detail,{element:i}=n;t.highlighted=!0;const o=(0,v.getViewportIdsWithToolToRender)(i,this.getToolName());this.editData={annotation:t,viewportIdsToRender:o,movingTextBox:!1},this._activateModify(i);const s=(0,a.getEnabledElement)(i),{renderingEngine:r}=s;(0,E.A)(o),(0,w.hideElementCursor)(i),e.preventDefault()},this.handleSelectedCallback=(e,t,n)=>{const i=e.detail,{element:o}=i,s=t.data;t.highlighted=!0;let r,l=!1;n.worldPosition?l=!0:r=s.handles.points.findIndex((e=>e===n));const d=(0,v.getViewportIdsWithToolToRender)(o,this.getToolName());(0,w.hideElementCursor)(o),this.editData={annotation:t,viewportIdsToRender:d,handleIndex:r,movingTextBox:l},this._activateModify(o);const c=(0,a.getEnabledElement)(o),{renderingEngine:h}=c;(0,E.A)(d),e.preventDefault()},this._endCallback=e=>{const t=e.detail,{element:n}=t,{annotation:o,viewportIdsToRender:s,newAnnotation:r,hasMoved:d}=this.editData,{data:c}=o;if(r&&!d)return;this.doneEditMemo(),c.handles.activeHandleIndex=null,this._deactivateModify(n),this._deactivateDraw(n),(0,w.resetElementCursor)(n);const{renderingEngine:g}=(0,a.getEnabledElement)(n);if(void 0!==this.editData.handleIndex){const{points:e}=c.handles,t=i.eR.distance(e[0],e[1]);if(i.eR.distance(e[2],e[3])>t){const t=[[...e[2]],[...e[3]]],n=[...e[0]],a=[...e[1]],o=i.Zc.create();i.Zc.set(o,t[1][0]-t[0][0],t[1][1]-t[1][0]);const s=i.Zc.create();i.Zc.set(s,-o[1],o[0]);const r=i.Zc.create();let l;i.Zc.set(r,a[0]-n[0],a[1]-n[0]),l=i.Zc.dot(r,s)>0?[n,a]:[a,n],c.handles.points=[t[0],t[1],l[0],l[1]]}}this.isHandleOutsideImage&&this.configuration.preventHandleOutsideImage&&(0,l.removeAnnotation)(o.annotationUID),(0,E.A)(s),r&&(0,h.triggerAnnotationCompleted)(o),this.editData=null,this.isDrawing=!1},this._dragDrawCallback=e=>{this.isDrawing=!0;const t=e.detail,{currentPoints:n,element:o}=t,s=(0,a.getEnabledElement)(o),{viewport:r}=s,{worldToCanvas:l}=r,{annotation:d,viewportIdsToRender:c,handleIndex:g,newAnnotation:u}=this.editData;this.createMemo(o,d,{newAnnotation:u});const{data:v}=d,p=n.world;v.handles.points[g]=[...p];const f=v.handles.points.map(l),w={start:{x:f[0][0],y:f[0][1]},end:{x:f[1][0],y:f[1][1]}},I=(f[2][0],f[2][1],f[3][0],f[3][1],i.Zc.distance(f[0],f[1])/3),C=w.start.x-w.end.x,b=w.start.y-w.end.y,_=Math.sqrt(C*C+b*b),T=C/_,S=b/_,D=(w.start.x+w.end.x)/2,A=(w.start.y+w.end.y)/2,M=D+I*S,y=A-I*T,x=D-I*S,P=A+I*T;v.handles.points[2]=r.canvasToWorld([M,y]),v.handles.points[3]=r.canvasToWorld([x,P]),d.invalidated=!0,(0,E.A)(c),(0,h.triggerAnnotationModified)(d,o,m.ChangeTypes.HandlesUpdated),this.editData.hasMoved=!0},this._dragModifyCallback=e=>{this.isDrawing=!0;const t=e.detail,{element:n}=t,{annotation:i,viewportIdsToRender:a,handleIndex:o,movingTextBox:s,newAnnotation:r}=this.editData;this.createMemo(n,i,{newAnnotation:r});const{data:l}=i;if(s){const{deltaPoints:e}=t,n=e.world,{textBox:i}=l.handles,{worldPosition:a}=i;a[0]+=n[0],a[1]+=n[1],a[2]+=n[2],i.hasMoved=!0}else if(void 0===o){const{deltaPoints:e}=t,n=e.world;l.handles.points.forEach((e=>{e[0]+=n[0],e[1]+=n[1],e[2]+=n[2]})),i.invalidated=!0}else this._dragModifyHandle(e),i.invalidated=!0;(0,E.A)(a),i.invalidated&&(0,h.triggerAnnotationModified)(i,n,m.ChangeTypes.HandlesUpdated)},this._dragModifyHandle=e=>{const t=e.detail,{currentPoints:n,element:o}=t,s=(0,a.getEnabledElement)(o),{viewport:r}=s,{annotation:l,handleIndex:d}=this.editData,{data:c}=l,h=n.world,g=[r.worldToCanvas(c.handles.points[0]),r.worldToCanvas(c.handles.points[1]),r.worldToCanvas(c.handles.points[2]),r.worldToCanvas(c.handles.points[3])],u={start:{x:g[0][0],y:g[0][1]},end:{x:g[1][0],y:g[1][1]}},m={start:{x:g[2][0],y:g[2][1]},end:{x:g[3][0],y:g[3][1]}},v=[...h],f=r.worldToCanvas(v);if(0===d||1===d){const e=g[0===d?1:0],t=i.Zc.set(i.Zc.create(),f[0]-e[0],f[1]-e[1]),n=i.Zc.set(i.Zc.create(),g[d][0]-e[0],g[d][1]-e[1]);i.Zc.normalize(t,t),i.Zc.normalize(n,n);const a={start:{x:e[0],y:e[1]},end:{x:f[0],y:f[1]}};if(this._movingLongAxisWouldPutItThroughShortAxis(a,m))return;const o=e,s=this._getSignedAngle(n,t);let l=g[2][0],h=g[2][1],u=g[3][0],p=g[3][1];l-=o[0],h-=o[1],u-=o[0],p-=o[1];const w=l*Math.cos(s)-h*Math.sin(s),E=l*Math.sin(s)+h*Math.cos(s),I=u*Math.cos(s)-p*Math.sin(s),C=u*Math.sin(s)+p*Math.cos(s);l=w+o[0],h=E+o[1],u=I+o[0],p=C+o[1];const b=r.canvasToWorld([l,h]),_=r.canvasToWorld([u,p]);c.handles.points[d]=v,c.handles.points[2]=b,c.handles.points[3]=_}else{const e=2===d?3:2,t={longLineSegment:{start:u.start,end:u.end},shortLineSegment:{start:m.start,end:m.end}},n=i.Zc.subtract(i.Zc.create(),[t.longLineSegment.end.x,t.longLineSegment.end.y],[t.longLineSegment.start.x,t.longLineSegment.start.y]),a=i.Zc.normalize(i.Zc.create(),n),o=i.Zc.subtract(i.Zc.create(),[f[0],f[1]],[g[d][0],g[d][1]]),s=i.Zc.length(o),l=this._getSignedAngle(a,o),h=Math.cos(l)*s,w=i.Zc.scaleAndAdd(i.Zc.create(),[g[e][0],g[e][1]],a,h);if(this._movingLongAxisWouldPutItThroughShortAxis({start:{x:f[0],y:f[1]},end:{x:w[0],y:w[1]}},{start:{x:t.longLineSegment.start.x,y:t.longLineSegment.start.y},end:{x:t.longLineSegment.end.x,y:t.longLineSegment.end.y}}))return;if(!p.intersectLine([f[0],f[1]],[w[0],w[1]],[u.start.x,u.start.y],[u.end.x,u.end.y]))return;c.handles.points[e]=r.canvasToWorld(w),c.handles.points[d]=v}},this.cancel=e=>{if(this.isDrawing){this.isDrawing=!1,this._deactivateDraw(e),this._deactivateModify(e),(0,w.resetElementCursor)(e);const{annotation:t,viewportIdsToRender:n,newAnnotation:i}=this.editData,{data:a}=t;return t.highlighted=!1,a.handles.activeHandleIndex=null,(0,E.A)(n),i&&(0,h.triggerAnnotationCompleted)(t),this.editData=null,t.annotationUID}},this._activateDraw=e=>{u.wk.isInteractingWithTool=!0,e.addEventListener(m.Events.MOUSE_UP,this._endCallback),e.addEventListener(m.Events.MOUSE_DRAG,this._dragDrawCallback),e.addEventListener(m.Events.MOUSE_MOVE,this._dragDrawCallback),e.addEventListener(m.Events.MOUSE_CLICK,this._endCallback),e.addEventListener(m.Events.TOUCH_TAP,this._endCallback),e.addEventListener(m.Events.TOUCH_END,this._endCallback),e.addEventListener(m.Events.TOUCH_DRAG,this._dragDrawCallback)},this._deactivateDraw=e=>{u.wk.isInteractingWithTool=!1,e.removeEventListener(m.Events.MOUSE_UP,this._endCallback),e.removeEventListener(m.Events.MOUSE_DRAG,this._dragDrawCallback),e.removeEventListener(m.Events.MOUSE_MOVE,this._dragDrawCallback),e.removeEventListener(m.Events.MOUSE_CLICK,this._endCallback),e.removeEventListener(m.Events.TOUCH_TAP,this._endCallback),e.removeEventListener(m.Events.TOUCH_END,this._endCallback),e.removeEventListener(m.Events.TOUCH_DRAG,this._dragDrawCallback)},this._activateModify=e=>{u.wk.isInteractingWithTool=!0,e.addEventListener(m.Events.MOUSE_UP,this._endCallback),e.addEventListener(m.Events.MOUSE_DRAG,this._dragModifyCallback),e.addEventListener(m.Events.MOUSE_CLICK,this._endCallback),e.addEventListener(m.Events.TOUCH_END,this._endCallback),e.addEventListener(m.Events.TOUCH_DRAG,this._dragModifyCallback),e.addEventListener(m.Events.TOUCH_TAP,this._endCallback)},this._deactivateModify=e=>{u.wk.isInteractingWithTool=!1,e.removeEventListener(m.Events.MOUSE_UP,this._endCallback),e.removeEventListener(m.Events.MOUSE_DRAG,this._dragModifyCallback),e.removeEventListener(m.Events.MOUSE_CLICK,this._endCallback),e.removeEventListener(m.Events.TOUCH_END,this._endCallback),e.removeEventListener(m.Events.TOUCH_DRAG,this._dragModifyCallback),e.removeEventListener(m.Events.TOUCH_TAP,this._endCallback)},this.renderAnnotation=(e,t)=>{let n=!0;const{viewport:i}=e,{element:a}=i;let o=(0,l.getAnnotations)(this.getToolName(),a);if(!o?.length)return n;if(o=this.filterInteractableAnnotationsForElement(a,o),!o?.length)return n;const s=this.getTargetId(i),r=i.getRenderingEngine(),h={toolGroupId:this.toolGroupId,toolName:this.getToolName(),viewportId:e.viewport.id};for(let a=0;a<o.length;a++){const l=o[a],{annotationUID:u,data:m}=l,{points:v,activeHandleIndex:p}=m.handles,w=v.map((e=>i.worldToCanvas(e)));h.annotationUID=u;const{color:E,lineWidth:I,lineDash:C,shadow:b}=this.getAnnotationStyle({annotation:l,styleSpecifier:h});if(m.cachedStats[s]&&null!=m.cachedStats[s].unit?l.invalidated&&this._throttledCalculateCachedStats(l,r,e):(m.cachedStats[s]={length:null,width:null,unit:null},this._calculateCachedStats(l,r,e)),!i.getRenderingEngine())return console.warn("Rendering Engine has been destroyed"),n;let _;if(!(0,c.isAnnotationVisible)(u))continue;if((0,d.isAnnotationLocked)(u)||this.editData||null===p||(_=[w[p]]),_){const e="0";(0,g.drawHandles)(t,u,e,_,{color:E})}const T=`${u}-line-1`,S=`${u}-line-2`,D="0";(0,g.drawLine)(t,u,D,w[0],w[1],{color:E,lineDash:C,lineWidth:I,shadow:b},T);const A="1";(0,g.drawLine)(t,u,A,w[2],w[3],{color:E,lineDash:C,lineWidth:I,shadow:b},S),n=!0;const M=this.getLinkedTextBoxStyle(h,l);if(!M.visibility){m.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 y=this.configuration.getTextLines(m,s);if(!y||0===y.length)continue;let x;m.handles.textBox.hasMoved||(x=(0,f.getTextBoxCoordsCanvas)(w),m.handles.textBox.worldPosition=i.canvasToWorld(x));const P=i.worldToCanvas(m.handles.textBox.worldPosition),R="1",L=(0,g.drawLinkedTextBox)(t,u,R,y,P,w,{},M),{x:U,y:O,width:k,height:N}=L;m.handles.textBox.worldBoundingBox={topLeft:i.canvasToWorld([U,O]),topRight:i.canvasToWorld([U+k,O]),bottomLeft:i.canvasToWorld([U,O+N]),bottomRight:i.canvasToWorld([U+k,O+N])}}return n},this._movingLongAxisWouldPutItThroughShortAxis=(e,t)=>{const n=i.Zc.create();i.Zc.set(n,t.end.x-t.start.x,t.end.y-t.start.y),i.Zc.normalize(n,n);const a={start:{x:t.start.x-10*n[0],y:t.start.y-10*n[1]},end:{x:t.end.x+10*n[0],y:t.end.y+10*n[1]}};return!p.intersectLine([a.start.x,a.start.y],[a.end.x,a.end.y],[e.start.x,e.start.y],[e.end.x,e.end.y])},this._calculateCachedStats=(e,t,n)=>{const{data:i}=e,{element:a}=n.viewport,s=i.handles.points[0],r=i.handles.points[1],l=i.handles.points[2],d=i.handles.points[3],{cachedStats:c}=i,g=Object.keys(c);for(let e=0;e<g.length;e++){const t=g[e],n=this.getTargetImageData(t);if(!n)continue;const{imageData:i,dimensions:a}=n,h=I(i,s),u=I(i,r),m=I(i,l),v=I(i,d),p=[h,u],f=[m,v],{scale:w,unit:E}=(0,o.Op)(n,p),{scale:C,unit:b}=(0,o.Op)(n,f),_=this._calculateLength(s,r)/w,T=this._calculateLength(l,d)/C,S=_>T?_:T,D=_>T?T:_,A=_>T?E:b,M=_>T?b:E;this._isInsideVolume(h,u,m,v,a)?this.isHandleOutsideImage=!1:this.isHandleOutsideImage=!0,c[t]={length:S,width:D,unit:A,widthUnit:M}}const u=e.invalidated;return e.invalidated=!1,u&&(0,h.triggerAnnotationModified)(e,a,m.ChangeTypes.StatsUpdated),c},this._isInsideVolume=(e,t,n,i,o)=>a.utilities.indexWithinDimensions(e,o)&&a.utilities.indexWithinDimensions(t,o)&&a.utilities.indexWithinDimensions(n,o)&&a.utilities.indexWithinDimensions(i,o),this._getSignedAngle=(e,t)=>Math.atan2(e[0]*t[1]-e[1]*t[0],e[0]*t[0]+e[1]*t[1]),this._throttledCalculateCachedStats=(0,r.A)(this._calculateCachedStats,100,{trailing:!0})}addNewAnnotation(e){const t=e.detail,{currentPoints:n,element:i}=t,o=n.world,s=(0,a.getEnabledElement)(i),{viewport:r,renderingEngine:d}=s;this.isDrawing=!0;const c=r.getCamera(),{viewPlaneNormal:h,viewUp:g}=c,u=this.getReferencedImageId(r,o,h,g),m=r.getFrameOfReferenceUID(),p={highlighted:!0,invalidated:!0,metadata:{toolName:this.getToolName(),viewPlaneNormal:[...h],viewUp:[...g],FrameOfReferenceUID:m,referencedImageId:u,...r.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:{}}};(0,l.addAnnotation)(p,i);const f=(0,v.getViewportIdsWithToolToRender)(i,this.getToolName());return this.editData={annotation:p,viewportIdsToRender:f,handleIndex:1,movingTextBox:!1,newAnnotation:!0,hasMoved:!1},this._activateDraw(i),(0,w.hideElementCursor)(i),e.preventDefault(),(0,E.A)(f),p}static{this.hydrate=(e,t,n)=>{const i=(0,a.getEnabledElementByViewportId)(e);if(!i)return;const{FrameOfReferenceUID:o,referencedImageId:s,viewPlaneNormal:r,instance:d,viewport:c}=this.hydrateBase(C,i,[],n),[h,g]=t,[u,m]=h,[v,p]=g,f=[u,m,v,p],w={annotationUID:n?.annotationUID||a.utilities.uuidv4(),data:{handles:{points:f,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:d.getToolName(),viewPlaneNormal:r,FrameOfReferenceUID:o,referencedImageId:s,...n}};return(0,l.addAnnotation)(w,c.element),(0,E.A)([c.id]),w}}_calculateLength(e,t){const n=e[0]-t[0],i=e[1]-t[1],a=e[2]-t[2];return Math.sqrt(n*n+i*i+a*a)}}function b(e,t){const{cachedStats:n,label:i}=e,{length:o,width:s,unit:r}=n[t],l=[];return i&&l.push(i),void 0===o||l.push(`L: ${a.utilities.roundNumber(o)} ${r||r}`,`W: ${a.utilities.roundNumber(s)} ${r}`),l}const _=C},37590:(e,t,n)=>{"use strict";n.d(t,{A:()=>r});var i=n(15327),a=n(49906),o=n(28220);class s extends o.A{static{this.toolName="PlanarFreehandContourSegmentationTool"}constructor(e){super(i.utilities.deepMerge({configuration:{calculateStats:!1,allowOpenContours:!1}},e))}isContourSegmentationTool(){return!0}renderAnnotationInstance(e){const t=e.annotation,{invalidated:n}=t,i=super.renderAnnotationInstance(e);if(n){const{segmentationId:e}=t.data.segmentation;(0,a.triggerSegmentationDataModified)(e)}return i}}const r=s},28220:(e,t,n)=>{"use strict";n.d(t,{A:()=>R});var i=n(15327),a=n(3823),o=n(4096),s=n(95527),r=n(13165),l=n(27730),d=n(60810),c=n(58640),h=n(55927),g=n(92400),u=n(57999),m=n(69855),v=n(70734),p=n(58161),f=n(44049),w=n(17328),E=n(473),I=n(92984),C=n(18990),b=n(73262),_=n(93843),T=n(36320),S=n(99737),D=n(40634);const{pointCanProjectOnLine:A}=s.polyline,{EPSILON:M}=i.CONSTANTS,y=1-M;class x extends T.A{static{this.toolName="PlanarFreehandROI"}constructor(e={},t={supportedInteractionTypes:["Mouse","Touch"],configuration:{storePointData:!1,shadow:!0,preventHandleOutsideImage:!1,contourHoleAdditionModifierKey:S.KeyboardBindings.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:P,statsCalculator:b.BasicStatsCalculator}}){super(e,t),this.isDrawing=!1,this.isEditingClosed=!1,this.isEditingOpen=!1,this.addNewAnnotation=e=>{const t=e.detail,{element:n}=t,i=this.createAnnotation(e);this.addAnnotation(i,n);const a=(0,d.getViewportIdsWithToolToRender)(n,this.getToolName());return this.activateDraw(e,i,a),e.preventDefault(),(0,c.A)(a),i},this.handleSelectedCallback=(e,t,n)=>{const i=e.detail,{element:a}=i,o=(0,d.getViewportIdsWithToolToRender)(a,this.getToolName());this.activateOpenContourEndEdit(e,t,o,n)},this.toolSelectedCallback=(e,t)=>{const n=e.detail,{element:i}=n,a=(0,d.getViewportIdsWithToolToRender)(i,this.getToolName());t.data.contour.closed?this.activateClosedContourEdit(e,t,a):this.activateOpenContourEdit(e,t,a),e.preventDefault()},this.isPointNearTool=(e,t,n,a)=>{const o=(0,i.getEnabledElement)(e),{viewport:s}=o,{polyline:r}=t.data.contour;let l=s.worldToCanvas(r[0]);for(let e=1;e<r.length;e++){const t=l,i=s.worldToCanvas(r[e]);if(A(n,t,i,a))return!0;l=i}if(!t.data.contour.closed)return!1;const d=s.worldToCanvas(r[0]),c=s.worldToCanvas(r[r.length-1]);return A(n,d,c,a)},this.cancel=e=>{const t=this.isDrawing,n=this.isEditingOpen,i=this.isEditingClosed;t?this.cancelDrawing(e):n?this.cancelOpenContourEdit(e):i&&this.cancelClosedContourEdit(e)},this._calculateCachedStats=(e,t,n,a)=>{const{data:r}=e,{cachedStats:l}=r,{polyline:d,closed:c}=r.contour,h=Object.keys(l);for(let n=0;n<h.length;n++){const a=h[n],g=this.getTargetImageData(a);if(!g)continue;const{imageData:u,metadata:m}=g,v=d.map((e=>t.worldToCanvas(e))),p={isPreScaled:(0,C.u)(t,a),isSuvScaled:this.isSuvScaled(t,a,e.metadata.referencedImageId)},f=(0,D.j)(m.Modality,e.metadata.referencedImageId,p),w=(0,o.Op)(g,(()=>{const e=r.contour.polyline,n=e.length,a=new Array(n);for(let i=0;i<n;i++)a[i]=t.worldToCanvas(e[i]);const{maxX:o,maxY:l,minX:d,minY:c}=s.polyline.getAABB(a),h=t.canvasToWorld([d,c]),g=i.utilities.transformWorldToIndex(u,h),m=t.canvasToWorld([o,l]);return[g,i.utilities.transformWorldToIndex(u,m)]}));c?this.updateClosedCachedStats({targetId:a,viewport:t,canvasCoordinates:v,points:d,imageData:u,metadata:m,cachedStats:l,modalityUnit:f,calibratedScale:w}):this.updateOpenCachedStats({metadata:m,canvasCoordinates:v,targetId:a,cachedStats:l,modalityUnit:f,calibratedScale:w})}const g=e.invalidated;return e.invalidated=!1,g&&(0,f.triggerAnnotationModified)(e,a.viewport.element,S.ChangeTypes.StatsUpdated),l},this._renderStats=(e,t,n,i)=>{const{data:a}=e,o=this.getTargetId(t),s={toolGroupId:this.toolGroupId,toolName:this.getToolName(),viewportId:n.viewport.id},r=this.getLinkedTextBoxStyle(s,e);if(!r.visibility)return;const l=this.configuration.getTextLines(a,o);if(!l||0===l.length)return;const d=a.contour.polyline.map((e=>t.worldToCanvas(e)));if(!a.handles.textBox.hasMoved){const e=(0,E.getTextBoxCoordsCanvas)(d);a.handles.textBox.worldPosition=t.canvasToWorld(e)}const c=t.worldToCanvas(a.handles.textBox.worldPosition),h=(0,w.drawLinkedTextBox)(i,e.annotationUID??"","1",l,c,d,{},r),{x:g,y:u,width:m,height:v}=h;a.handles.textBox.worldBoundingBox={topLeft:t.canvasToWorld([g,u]),topRight:t.canvasToWorld([g+m,u]),bottomLeft:t.canvasToWorld([g,u+v]),bottomRight:t.canvasToWorld([g+m,u+v])}},(0,h.A)(this),(0,g.A)(this),(0,u.A)(this),(0,m.A)(this),(0,v.A)(this),(0,p.A)(this),this._throttledCalculateCachedStats=(0,l.A)(this._calculateCachedStats,100,{trailing:!0})}filterInteractableAnnotationsForElement(e,t){if(!t||!t.length)return;const n=(0,i.getEnabledElement)(e),{viewport:a}=n;let o;if(a instanceof i.VolumeViewport){const e=a.getCamera(),{spacingInNormalDirection:n}=i.utilities.getTargetVolumeAndSpacingInNormalDir(a,e);o=this.filterAnnotationsWithinSlice(t,e,n)}else o=(0,r.filterAnnotationsForDisplay)(a,t);return o}filterAnnotationsWithinSlice(e,t,n){const{viewPlaneNormal:i}=t,o=e.filter((e=>{const t=e.metadata.viewPlaneNormal,n=Math.abs(a.eR.dot(i,t))>y;return t&&n}));if(!o.length)return[];const s=n/2,{focalPoint:r}=t,l=[];for(const e of o){const t=e.data.contour.polyline[0];if(!e.isVisible)continue;const n=a.eR.create();a.eR.sub(n,r,t);const o=a.eR.dot(n,i);Math.abs(o)<s&&l.push(e)}return l}isContourSegmentationTool(){return!1}createAnnotation(e){const t=e.detail.currentPoints.world,n=super.createAnnotation(e);return i.utilities.deepMerge(n,{data:{contour:{polyline:[[...t]]},label:"",cachedStats:{}},onInterpolationComplete:e=>{e.data.handles.points.length=0}})}getAnnotationStyle(e){return super.getAnnotationStyle(e)}renderAnnotationInstance(e){const{enabledElement:t,targetId:n,svgDrawingHelper:i}=e,a=e.annotation;let o=!1;const{viewport:s,renderingEngine:r}=t,l=this.isDrawing,d=this.isEditingOpen,c=this.isEditingClosed;if(l||d||c){const e=this.commonData.annotation.annotationUID;if(a.annotationUID===e)if(l)this.renderContourBeingDrawn(t,i,a);else if(c)this.renderClosedContourBeingEdited(t,i,a);else{if(!d)throw new Error(`Unknown ${this.getToolName()} annotation rendering state`);this.renderOpenContourBeingEdited(t,i,a)}else this.configuration.displayOnePointAsCrosshairs&&1===a.data.contour.polyline.length?this.renderPointContourWithMarker(t,i,a):this.renderContour(t,i,a);o=!0}else this.configuration.displayOnePointAsCrosshairs&&1===a.data.contour.polyline.length?this.renderPointContourWithMarker(t,i,a):this.renderContour(t,i,a);if(this.configuration.calculateStats)return this._calculateStatsIfActive(a,n,s,r,t),this._renderStats(a,s,t,i),o}_calculateStatsIfActive(e,t,n,i,a){const o=this.commonData?.annotation.annotationUID;if((e.annotationUID!==o||this.commonData?.movingTextBox)&&!this.commonData?.movingTextBox){const{data:o}=e;o.cachedStats[t]?.unit?e.invalidated&&this._throttledCalculateCachedStats(e,n,i,a):(o.cachedStats[t]={Modality:null,area:null,max:null,mean:null,stdDev:null,areaUnit:null,unit:null},this._calculateCachedStats(e,n,i,a))}}updateClosedCachedStats({viewport:e,points:t,imageData:n,metadata:o,cachedStats:r,targetId:l,modalityUnit:d,canvasCoordinates:c,calibratedScale:h}){const{scale:g,areaUnit:u,unit:m}=h,{voxelManager:v}=e.getImageData(),p=c[0],f=e.canvasToWorld(p),w=e.canvasToWorld([p[0]+1,p[1]]),E=e.canvasToWorld([p[0],p[1]+1]),C=a.eR.distance(f,w),b=a.eR.distance(f,E),T=i.utilities.transformWorldToIndex(n,t[0]);T[0]=Math.floor(T[0]),T[1]=Math.floor(T[1]),T[2]=Math.floor(T[2]);let S=T[0],D=T[0],A=T[1],M=T[1],y=T[2],x=T[2];for(let e=1;e<t.length;e++){const a=i.utilities.transformWorldToIndex(n,t[e]);a[0]=Math.floor(a[0]),a[1]=Math.floor(a[1]),a[2]=Math.floor(a[2]),S=Math.min(S,a[0]),D=Math.max(D,a[0]),A=Math.min(A,a[1]),M=Math.max(M,a[1]),y=Math.min(y,a[2]),x=Math.max(x,a[2])}const P=i.utilities.transformWorldToIndex(n,t[1]);P[0]=Math.floor(P[0]),P[1]=Math.floor(P[1]),P[2]=Math.floor(P[2]);let R=s.polyline.getArea(c)/g/g;R*=C*b;const L=.01*(D-S),U=.01*(M-A),O=.01*(x-y);S=Math.floor(S-L),D=Math.ceil(D+L),A=Math.floor(A-U),M=Math.ceil(M+U),y=Math.floor(y-O),x=Math.ceil(x+O);const k=[[S,D],[A,M],[y,x]],N=n.indexToWorld([D,M,x]),V=e.worldToCanvas(N);let W=0,B=[],H=0;const F=v.forEach(this.configuration.statsCalculator.statsCallback,{imageData:n,isInObject:(t,n)=>{let i=!0;const a=e.worldToCanvas(t);return a[1]!=W&&(H=0,W=a[1],B=(0,I.getLineSegmentIntersectionsCoordinates)(c,a,[V[0],a[1]]),B.sort((function(e,t){return e[0]===t[0]?0:e[0]<t[0]?-1:1}))),B.length&&a[0]>B[0][0]&&(B.shift(),H++),H%2==0&&(i=!1),i},boundsIJK:k,returnPoints:this.configuration.storePointData}),G=this.configuration.statsCalculator.getStatistics();r[l]={Modality:o.Modality,area:R,perimeter:(0,_.A)(c,closed)/g,mean:G.mean?.value,max:G.max?.value,stdDev:G.stdDev?.value,statsArray:G.array,pointsInShape:F,areaUnit:u,modalityUnit:d,unit:m}}updateOpenCachedStats({targetId:e,metadata:t,canvasCoordinates:n,cachedStats:i,modalityUnit:a,calibratedScale:o}){const{scale:s,unit:r}=o;i[e]={Modality:t.Modality,length:(0,_.A)(n,!1)/s,modalityUnit:a,unit:r}}}function P(e,t){const n=e.cachedStats[t],{area:a,mean:o,stdDev:s,length:r,perimeter:l,max:d,isEmptyArea:c,unit:h,areaUnit:g,modalityUnit:u}=n||{},m=[];if(a){const e=c?"Area: Oblique not supported":`Area: ${i.utilities.roundNumber(a)} ${g}`;m.push(e)}return o&&m.push(`Mean: ${i.utilities.roundNumber(o)} ${u}`),Number.isFinite(d)&&m.push(`Max: ${i.utilities.roundNumber(d)} ${u}`),s&&m.push(`Std Dev: ${i.utilities.roundNumber(s)} ${u}`),l&&m.push(`Perimeter: ${i.utilities.roundNumber(l)} ${h}`),r&&m.push(`${i.utilities.roundNumber(r)} ${h}`),m}const R=x},4010:(e,t,n)=>{"use strict";n.d(t,{A:()=>D});var i=n(85817),a=n(15327),o=n(4096),s=n(27730),r=n(6802),l=n(2076),d=n(29601),c=n(44049),h=n(17328),g=n(85204),u=n(99737),m=n(60810),v=n(33657),p=n(473),f=n(35489),w=n(7001),E=n(58640),I=n(40634),C=n(18990),b=n(73262);const{transformWorldToIndex:_}=a.utilities;class T extends i.EC{static{this.toolName="RectangleROI"}constructor(e={},t={supportedInteractionTypes:["Mouse","Touch"],configuration:{storePointData:!1,shadow:!0,preventHandleOutsideImage:!1,calculateStats:!0,getTextLines:S,statsCalculator:b.BasicStatsCalculator}}){super(e,t),this.addNewAnnotation=e=>{const t=e.detail,{currentPoints:n,element:i}=t,o=n.world,s=(0,a.getEnabledElement)(i),{viewport:l}=s;this.isDrawing=!0;const d=this.constructor.createAnnotationForViewport(l,{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]}}},cachedStats:{}}});(0,r.lC)(d,i);const c=(0,m.getViewportIdsWithToolToRender)(i,this.getToolName());return this.editData={annotation:d,viewportIdsToRender:c,handleIndex:3,movingTextBox:!1,newAnnotation:!0,hasMoved:!1},this._activateDraw(i),(0,w.hideElementCursor)(i),e.preventDefault(),(0,E.A)(c),d},this.isPointNearTool=(e,t,n,i)=>{const o=(0,a.getEnabledElement)(e),{viewport:s}=o,{data:r}=t,{points:l}=r.handles,d=s.worldToCanvas(l[0]),c=s.worldToCanvas(l[3]),h=this._getRectangleImageCoordinates([d,c]),g=[n[0],n[1]],{left:u,top:m,width:p,height:f}=h;return v.distanceToPoint([u,m,p,f],g)<=i},this.toolSelectedCallback=(e,t)=>{const n=e.detail,{element:i}=n;t.highlighted=!0;const o=(0,m.getViewportIdsWithToolToRender)(i,this.getToolName());this.editData={annotation:t,viewportIdsToRender:o,movingTextBox:!1},this._activateModify(i),(0,w.hideElementCursor)(i);const s=(0,a.getEnabledElement)(i),{renderingEngine:r}=s;(0,E.A)(o),e.preventDefault()},this.handleSelectedCallback=(e,t,n)=>{const i=e.detail,{element:o}=i,{data:s}=t;t.highlighted=!0;let r,l=!1;n.worldPosition?l=!0:r=s.handles.points.findIndex((e=>e===n));const d=(0,m.getViewportIdsWithToolToRender)(o,this.getToolName());this.editData={annotation:t,viewportIdsToRender:d,handleIndex:r,movingTextBox:l},this._activateModify(o),(0,w.hideElementCursor)(o);const c=(0,a.getEnabledElement)(o),{renderingEngine:h}=c;(0,E.A)(d),e.preventDefault()},this._endCallback=e=>{const t=e.detail,{element:n}=t,{annotation:i,viewportIdsToRender:a,newAnnotation:o,hasMoved:s}=this.editData,{data:l}=i;o&&!s||(l.handles.activeHandleIndex=null,this._deactivateModify(n),this._deactivateDraw(n),(0,w.resetElementCursor)(n),this.doneEditMemo(),this.editData=null,this.isDrawing=!1,this.isHandleOutsideImage&&this.configuration.preventHandleOutsideImage&&(0,r.O8)(i.annotationUID),(0,E.A)(a),o&&(0,c.triggerAnnotationCompleted)(i))},this._dragCallback=e=>{this.isDrawing=!0;const t=e.detail,{element:n}=t,{annotation:i,viewportIdsToRender:o,handleIndex:s,movingTextBox:r,newAnnotation:l}=this.editData;this.createMemo(n,i,{newAnnotation:l});const{data:d}=i;if(r){const{deltaPoints:e}=t,n=e.world,{textBox:i}=d.handles,{worldPosition:a}=i;a[0]+=n[0],a[1]+=n[1],a[2]+=n[2],i.hasMoved=!0}else if(void 0===s){const{deltaPoints:e}=t,n=e.world,{points:a}=d.handles;a.forEach((e=>{e[0]+=n[0],e[1]+=n[1],e[2]+=n[2]})),i.invalidated=!0}else{const{currentPoints:e}=t,o=(0,a.getEnabledElement)(n),{worldToCanvas:r,canvasToWorld:l}=o.viewport,c=e.world,{points:h}=d.handles;let g,u,m,v,p,f,w,E;switch(h[s]=[...c],s){case 0:case 3:g=r(h[0]),v=r(h[3]),u=[v[0],g[1]],m=[g[0],v[1]],f=l(u),w=l(m),h[1]=f,h[2]=w;break;case 1:case 2:u=r(h[1]),m=r(h[2]),g=[m[0],u[1]],v=[u[0],m[1]],p=l(g),E=l(v),h[0]=p,h[3]=E}i.invalidated=!0}this.editData.hasMoved=!0;(0,a.getEnabledElement)(n);(0,E.A)(o),i.invalidated&&(0,c.triggerAnnotationModified)(i,n,u.ChangeTypes.HandlesUpdated)},this.cancel=e=>{if(this.isDrawing){this.isDrawing=!1,this._deactivateDraw(e),this._deactivateModify(e),(0,w.resetElementCursor)(e);const{annotation:t,viewportIdsToRender:n,newAnnotation:i}=this.editData,{data:a}=t;return t.highlighted=!1,a.handles.activeHandleIndex=null,(0,E.A)(n),i&&(0,c.triggerAnnotationCompleted)(t),this.editData=null,t.annotationUID}},this._activateDraw=e=>{g.wk.isInteractingWithTool=!0,e.addEventListener(u.Events.MOUSE_UP,this._endCallback),e.addEventListener(u.Events.MOUSE_DRAG,this._dragCallback),e.addEventListener(u.Events.MOUSE_MOVE,this._dragCallback),e.addEventListener(u.Events.MOUSE_CLICK,this._endCallback),e.addEventListener(u.Events.TOUCH_END,this._endCallback),e.addEventListener(u.Events.TOUCH_DRAG,this._dragCallback),e.addEventListener(u.Events.TOUCH_TAP,this._endCallback)},this._deactivateDraw=e=>{g.wk.isInteractingWithTool=!1,e.removeEventListener(u.Events.MOUSE_UP,this._endCallback),e.removeEventListener(u.Events.MOUSE_DRAG,this._dragCallback),e.removeEventListener(u.Events.MOUSE_MOVE,this._dragCallback),e.removeEventListener(u.Events.MOUSE_CLICK,this._endCallback),e.removeEventListener(u.Events.TOUCH_END,this._endCallback),e.removeEventListener(u.Events.TOUCH_DRAG,this._dragCallback),e.removeEventListener(u.Events.TOUCH_TAP,this._endCallback)},this._activateModify=e=>{g.wk.isInteractingWithTool=!0,e.addEventListener(u.Events.MOUSE_UP,this._endCallback),e.addEventListener(u.Events.MOUSE_DRAG,this._dragCallback),e.addEventListener(u.Events.MOUSE_CLICK,this._endCallback),e.addEventListener(u.Events.TOUCH_END,this._endCallback),e.addEventListener(u.Events.TOUCH_DRAG,this._dragCallback),e.addEventListener(u.Events.TOUCH_TAP,this._endCallback)},this._deactivateModify=e=>{g.wk.isInteractingWithTool=!1,e.removeEventListener(u.Events.MOUSE_UP,this._endCallback),e.removeEventListener(u.Events.MOUSE_DRAG,this._dragCallback),e.removeEventListener(u.Events.MOUSE_CLICK,this._endCallback),e.removeEventListener(u.Events.TOUCH_END,this._endCallback),e.removeEventListener(u.Events.TOUCH_DRAG,this._dragCallback),e.removeEventListener(u.Events.TOUCH_TAP,this._endCallback)},this.renderAnnotation=(e,t)=>{let n=!1;const{viewport:i}=e,{element:o}=i;let s=(0,r.Rh)(this.getToolName(),o);if(!s?.length)return n;if(s=this.filterInteractableAnnotationsForElement(o,s),!s?.length)return n;const c=this.getTargetId(i),g=i.getRenderingEngine(),u={toolGroupId:this.toolGroupId,toolName:this.getToolName(),viewportId:e.viewport.id};for(let o=0;o<s.length;o++){const r=s[o],{annotationUID:m,data:v}=r,{points:f,activeHandleIndex:w}=v.handles,E=f.map((e=>i.worldToCanvas(e)));u.annotationUID=m;const{color:I,lineWidth:C,lineDash:b}=this.getAnnotationStyle({annotation:r,styleSpecifier:u}),{viewPlaneNormal:_,viewUp:T}=i.getCamera();if(v.cachedStats[c]&&null!=v.cachedStats[c].areaUnit){if(r.invalidated&&(this._throttledCalculateCachedStats(r,_,T,g,e),i instanceof a.VolumeViewport)){const{referencedImageId:e}=r.metadata;for(const t in v.cachedStats)if(t.startsWith("imageId")){g.getStackViewports().find((t=>{const n=a.utilities.imageIdToURI(e),i=t.hasImageURI(n),o=a.utilities.imageIdToURI(t.getCurrentImageId());return i&&o!==n}))&&delete v.cachedStats[t]}}}else v.cachedStats[c]={Modality:null,area:null,max:null,mean:null,stdDev:null,areaUnit:null},this._calculateCachedStats(r,_,T,g,e);if(!i.getRenderingEngine())return console.warn("Rendering Engine has been destroyed"),n;let S;if(!(0,d.isAnnotationVisible)(m))continue;if((0,l.isAnnotationLocked)(m)||this.editData||null===w||(S=[E[w]]),S){const e="0";(0,h.drawHandles)(t,m,e,S,{color:I})}const D=`${m}-rect`,A="0";(0,h.drawRectByCoordinates)(t,m,A,E,{color:I,lineDash:b,lineWidth:C},D),n=!0;const M=this.getLinkedTextBoxStyle(u,r);if(!M.visibility){v.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 y=this.configuration.getTextLines(v,c);if(!y||0===y.length)continue;if(!v.handles.textBox.hasMoved){const e=(0,p.getTextBoxCoordsCanvas)(E);v.handles.textBox.worldPosition=i.canvasToWorld(e)}const x=i.worldToCanvas(v.handles.textBox.worldPosition),P="1",R=(0,h.drawLinkedTextBox)(t,m,P,y,x,E,{},M),{x:L,y:U,width:O,height:k}=R;v.handles.textBox.worldBoundingBox={topLeft:i.canvasToWorld([L,U]),topRight:i.canvasToWorld([L+O,U]),bottomLeft:i.canvasToWorld([L,U+k]),bottomRight:i.canvasToWorld([L+O,U+k])}}return n},this._getRectangleImageCoordinates=e=>{const[t,n]=e;return{left:Math.min(t[0],n[0]),top:Math.min(t[1],n[1]),width:Math.abs(t[0]-n[0]),height:Math.abs(t[1]-n[1])}},this._calculateCachedStats=(e,t,n,i,a)=>{if(!this.configuration.calculateStats)return;const{data:s}=e,{viewport:r}=a,{element:l}=r,d=s.handles.points[0],h=s.handles.points[3],{cachedStats:g}=s,m=Object.keys(g);for(let i=0;i<m.length;i++){const a=m[i],s=this.getTargetImageData(a);if(!s)continue;const{dimensions:l,imageData:c,metadata:u,voxelManager:v}=s,p=_(c,d);p[0]=Math.floor(p[0]),p[1]=Math.floor(p[1]),p[2]=Math.floor(p[2]);const w=_(c,h);if(w[0]=Math.floor(w[0]),w[1]=Math.floor(w[1]),w[2]=Math.floor(w[2]),this._isInsideVolume(p,w,l)){this.isHandleOutsideImage=!1;const i=[[Math.min(p[0],w[0]),Math.max(p[0],w[0])],[Math.min(p[1],w[1]),Math.max(p[1],w[1])],[Math.min(p[2],w[2]),Math.max(p[2],w[2])]],{worldWidth:l,worldHeight:m}=(0,f.A)(t,n,d,h),E=[p,w],{scale:b,areaUnit:_}=(0,o.Op)(s,E),T=Math.abs(l*m)/(b*b),S={isPreScaled:(0,C.u)(r,a),isSuvScaled:this.isSuvScaled(r,a,e.metadata.referencedImageId)},D=(0,I.j)(u.Modality,e.metadata.referencedImageId,S),A=v.forEach(this.configuration.statsCalculator.statsCallback,{boundsIJK:i,imageData:c,returnPoints:this.configuration.storePointData}),M=this.configuration.statsCalculator.getStatistics();g[a]={Modality:u.Modality,area:T,mean:M.mean?.value,stdDev:M.stdDev?.value,max:M.max?.value,statsArray:M.array,pointsInShape:A,areaUnit:_,modalityUnit:D}}else this.isHandleOutsideImage=!0,g[a]={Modality:u.Modality}}const v=e.invalidated;return e.invalidated=!1,v&&(0,c.triggerAnnotationModified)(e,l,u.ChangeTypes.StatsUpdated),g},this._isInsideVolume=(e,t,n)=>a.utilities.indexWithinDimensions(e,n)&&a.utilities.indexWithinDimensions(t,n),this._throttledCalculateCachedStats=(0,s.A)(this._calculateCachedStats,100,{trailing:!0})}static{this.hydrate=(e,t,n)=>{const i=(0,a.getEnabledElementByViewportId)(e);if(!i)return;const{FrameOfReferenceUID:o,referencedImageId:s,viewPlaneNormal:l,instance:d,viewport:c}=this.hydrateBase(T,i,t,n),h={annotationUID:n?.annotationUID||a.utilities.uuidv4(),data:{handles:{points:t,activeHandleIndex:null},label:"",cachedStats:{}},highlighted:!1,autoGenerated:!1,invalidated:!1,isLocked:!1,isVisible:!0,metadata:{toolName:d.getToolName(),viewPlaneNormal:l,FrameOfReferenceUID:o,referencedImageId:s,...n}};(0,r.lC)(h,c.element),(0,E.A)([c.id])}}}function S(e,t){const n=e.cachedStats[t],{area:i,mean:o,max:s,stdDev:r,areaUnit:l,modalityUnit:d}=n;if(null==o)return;const c=[];return c.push(`Area: ${a.utilities.roundNumber(i)} ${l}`),c.push(`Mean: ${a.utilities.roundNumber(o)} ${d}`),c.push(`Max: ${a.utilities.roundNumber(s)} ${d}`),c.push(`Std Dev: ${a.utilities.roundNumber(r)} ${d}`),c}const D=T},85817:(e,t,n)=>{"use strict";n.d(t,{EC:()=>a.A,oS:()=>i.A});var i=n(37234),a=n(91350);n(6030)},48736:(e,t,n)=>{"use strict";n.d(t,{A:()=>p});var i=n(15327),a=n(3823),o=n(99737),s=n(17492),r=n(1989),l=n(56789),d=n(33852),c=n(17328),h=n(7001),g=n(58640),u=n(23631),m=n(40905);class v extends u.A{constructor(e={},t={supportedInteractionTypes:["Mouse","Touch"],configuration:{strategies:{FILL_INSIDE_CIRCLE:l.kr,ERASE_INSIDE_CIRCLE:d.r,FILL_INSIDE_SPHERE:s.Jq,ERASE_INSIDE_SPHERE:r._,THRESHOLD_INSIDE_CIRCLE:l.q,THRESHOLD_INSIDE_SPHERE:s.rd,THRESHOLD_INSIDE_SPHERE_WITH_ISLAND_REMOVAL:s.Sw},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:{[o.StrategyCallbacks.AcceptPreview]:{method:o.StrategyCallbacks.AcceptPreview,bindings:[{key:"Enter"}]},[o.StrategyCallbacks.RejectPreview]:{method:o.StrategyCallbacks.RejectPreview,bindings:[{key:"Escape"}]},[o.StrategyCallbacks.Interpolate]:{method:o.StrategyCallbacks.Interpolate,bindings:[{key:"i"}],configuration:{useBallStructuringElement:!0,noUseDistanceTransform:!0,noUseExtrapolation:!0}},interpolateExtrapolation:{method:o.StrategyCallbacks.Interpolate,bindings:[{key:"e"}],configuration:{}}}}}){super(e,t),this.onSetToolPassive=e=>{this.disableCursor()},this.onSetToolEnabled=()=>{this.disableCursor()},this.onSetToolDisabled=e=>{this.disableCursor()},this.preMouseDownCallback=e=>{const t=e.detail,{element:n}=t,a=(0,i.getEnabledElement)(n);this._editData=this.createEditData(n),this._activateDraw(n),(0,h.hideElementCursor)(n),e.preventDefault(),this._previewData.isDrag=!1,this._previewData.timerStart=Date.now();const s=this._hoverData||this.createHoverData(n);(0,g.A)(s.viewportIdsToRender);const r=this.getOperationData(n);return this.applyActiveStrategyCallback(a,r,o.StrategyCallbacks.OnInteractionStart),!0},this.mouseMoveCallback=e=>{if(this.mode===o.ToolModes.Active){if(this.updateCursor(e),!this.configuration.preview.enabled)return;const{previewTimeMs:t,previewMoveDistance:n,dragMoveDistance:i}=this.configuration.preview,{currentPoints:o,element:s}=e.detail,{canvas:r}=o,{startPoint:l,timer:d,timerStart:c,isDrag:h}=this._previewData;if(h)return;const g=a.Zc.distance(r,l),u=Date.now()-c;if((g>n||u>t&&g>i)&&(d&&(window.clearTimeout(d),this._previewData.timer=null),h||this.rejectPreview(s)),!this._previewData.timer){const e=window.setTimeout(this.previewCallback,250);Object.assign(this._previewData,{timerStart:Date.now(),timer:e,startPoint:r,element:s})}}},this.previewCallback=()=>{if(this._previewData.isDrag)return void(this._previewData.timer=null);this._previewData.timer=null;const e=this.getOperationData(this._previewData.element),t=(0,i.getEnabledElement)(this._previewData.element);if(!t)return;const{viewport:n}=t,a=this.configuration.activeStrategy,s=(0,m.S)({operationData:e,viewport:n,strategy:a});if(!e)return;const r=this.createMemo(e.segmentationId,s.segmentationVoxelManager);this._previewData.preview=this.applyActiveStrategyCallback((0,i.getEnabledElement)(this._previewData.element),{...e,...s,memo:r},o.StrategyCallbacks.Preview)},this._dragCallback=e=>{const t=e.detail,{element:n,currentPoints:o}=t,s=(0,i.getEnabledElement)(n);this.updateCursor(e);const{viewportIdsToRender:r}=this._hoverData;(0,g.A)(r);const l=a.Zc.distance(o.canvas,this._previewData.startPoint),{dragTimeMs:d,dragMoveDistance:c}=this.configuration.preview;!this._previewData.isDrag&&Date.now()-this._previewData.timerStart<d&&l<c||(this._previewData.timer&&(window.clearTimeout(this._previewData.timer),this._previewData.timer=null),this._previewData.preview=this.applyActiveStrategy(s,this.getOperationData(n)),this._previewData.element=n,this._previewData.timerStart=Date.now()+d,this._previewData.isDrag=!0,this._previewData.startPoint=o.canvas)},this._endCallback=e=>{const t=e.detail,{element:n}=t,a=(0,i.getEnabledElement)(n),s=this.getOperationData(n);this._previewData.preview||this._previewData.isDrag||this.applyActiveStrategy(a,s),this.doneEditMemo(),this._deactivateDraw(n),(0,h.resetElementCursor)(n),this.updateCursor(e),this._editData=null,this.applyActiveStrategyCallback(a,s,o.StrategyCallbacks.OnInteractionEnd),this._previewData.isDrag||this.acceptPreview(n)},this._activateDraw=e=>{e.addEventListener(o.Events.MOUSE_UP,this._endCallback),e.addEventListener(o.Events.MOUSE_DRAG,this._dragCallback),e.addEventListener(o.Events.MOUSE_CLICK,this._endCallback)},this._deactivateDraw=e=>{e.removeEventListener(o.Events.MOUSE_UP,this._endCallback),e.removeEventListener(o.Events.MOUSE_DRAG,this._dragCallback),e.removeEventListener(o.Events.MOUSE_CLICK,this._endCallback)}}disableCursor(){this._hoverData=void 0,this.rejectPreview()}updateCursor(e){const t=e.detail,{element:n}=t,{currentPoints:i}=t,a=i.canvas;this._hoverData=this.createHoverData(n,a),this._calculateCursor(n,a),this._hoverData&&(0,g.A)(this._hoverData.viewportIdsToRender)}_calculateCursor(e,t){const n=(0,i.getEnabledElement)(e),{viewport:o}=n,{canvasToWorld:s}=o,r=o.getCamera(),{brushSize:l}=this.configuration,d=a.eR.fromValues(r.viewUp[0],r.viewUp[1],r.viewUp[2]),c=a.eR.fromValues(r.viewPlaneNormal[0],r.viewPlaneNormal[1],r.viewPlaneNormal[2]),h=a.eR.create();a.eR.cross(h,d,c);const g=s([t[0],t[1]]),u=a.eR.create(),m=a.eR.create(),v=a.eR.create(),p=a.eR.create();for(let e=0;e<=2;e++)u[e]=g[e]-d[e]*l,m[e]=g[e]+d[e]*l,v[e]=g[e]-h[e]*l,p[e]=g[e]+h[e]*l;if(!this._hoverData)return;const{brushCursor:f}=this._hoverData,{data:w}=f;void 0===w.handles&&(w.handles={}),w.handles.points=[u,m,v,p];const E=this.configuration.activeStrategy,I=this.configuration.strategies[E];"function"==typeof I?.computeInnerCircleRadius&&I.computeInnerCircleRadius({configuration:this.configuration,viewport:o}),w.invalidated=!1}getStatistics(e,t){if(!e)return;const n=(0,i.getEnabledElement)(e);return this.applyActiveStrategyCallback(n,this.getOperationData(e),o.StrategyCallbacks.GetStatistics,t)}rejectPreview(e=this._previewData.element){if(!e)return;this.doneEditMemo();const t=(0,i.getEnabledElement)(e);this.applyActiveStrategyCallback(t,this.getOperationData(e),o.StrategyCallbacks.RejectPreview),this._previewData.preview=null,this._previewData.isDrag=!1}acceptPreview(e=this._previewData.element){e&&super.acceptPreview(e)}interpolate(e,t){if(!e)return;const n=(0,i.getEnabledElement)(e);this._previewData.preview=this.applyActiveStrategyCallback(n,this.getOperationData(e),o.StrategyCallbacks.Interpolate,t.configuration),this._previewData.isDrag=!0}invalidateBrushCursor(){if(void 0===this._hoverData)return;const{data:e}=this._hoverData.brushCursor,{viewport:t}=this._hoverData;e.invalidated=!0;const{segmentColor:n}=this.getActiveSegmentationData(t)||{};this._hoverData.brushCursor.metadata.segmentColor=n}renderAnnotation(e,t){if(!this._hoverData)return;const{viewport:n}=e;if(!this._hoverData.viewportIdsToRender.includes(n.id))return;const i=this._hoverData.brushCursor;if(!0===i.data.invalidated){const{centerCanvas:e}=this._hoverData,{element:t}=n;this._calculateCursor(t,e)}const a=i.metadata;if(!a)return;const o=a.brushCursorUID,s=i.data,{points:r}=s.handles,l=r.map((e=>n.worldToCanvas(e))),d=l[0],h=l[1],g=[Math.floor((d[0]+h[0])/2),Math.floor((d[1]+h[1])/2)],u=Math.abs(d[1]-Math.floor((d[1]+h[1])/2)),m=`rgb(${a.segmentColor?.slice(0,3)||[0,0,0]})`;if(!n.getRenderingEngine())return void console.warn("Rendering Engine has been destroyed");(0,c.drawCircle)(t,o,"0",g,u,{color:m,lineDash:0===this.centerSegmentIndexInfo.segmentIndex?[1,2]:null});const{dynamicRadiusInCanvas:v}=this.configuration?.threshold||{dynamicRadiusInCanvas:0};if(v){const e="1";(0,c.drawCircle)(t,o,e,g,v,{color:m})}}}v.toolName="Brush";const p=v},23631:(e,t,n)=>{"use strict";n.d(t,{A:()=>I});var i=n(15327),a=n(85817),o=n(18682),s=n(67165),r=n(26795),l=n(33283),d=n(64485),c=n(97577),h=n(93733),g=n(60740),u=n(99737),m=n(2397),v=n(82056),p=n(13165),f=n(92984),w=n(49906),E=n(99522);class I extends a.oS{static{this.previewData={preview:null,element:null,timerStart:0,timer:null,startPoint:[NaN,NaN],isDrag:!1}}constructor(e,t){super(e,t),this.memoMap=new Map,this.acceptedMemoIds=new Map,this.centerSegmentIndexInfo={segmentIndex:null,hasSegmentIndex:!1,hasPreviewIndex:!1,changedIndices:[]}}_historyRedoHandler(e){const{id:t,operationType:n}=e.detail;if("labelmap"===n){if(this.acceptedMemoIds.has(t)){this._hoverData=null;const e=this.acceptedMemoIds.get(t),n=e?.element,a=this.getOperationData(n);a.segmentIndex=e?.segmentIndex,n&&this.applyActiveStrategyCallback((0,i.getEnabledElement)(n),a,u.StrategyCallbacks.AcceptPreview)}this._previewData.isDrag=!0}}get _previewData(){return I.previewData}createMemo(e,t){const n=t.id;if(this.memo&&this.memo.segmentationVoxelManager===t)return this.memo;let i=this.memoMap.get(n);return i?i.redoVoxelManager&&(i=m.createLabelmapMemo(e,t),this.memoMap.set(n,i)):(i=m.createLabelmapMemo(e,t),this.memoMap.set(n,i)),this.memo=i,i}createEditData(e){const t=(0,i.getEnabledElement)(e),{viewport:n}=t,a=(0,s.T)(n.id);if(!a){const e=new CustomEvent(i.Enums.Events.ERROR_EVENT,{detail:{type:"Segmentation",message:"No active segmentation detected, create a segmentation representation before using the brush tool"},cancelable:!0});return i.eventTarget.dispatchEvent(e),null}const{segmentationId:o}=a,d=(0,r.getLockedSegmentIndices)(o),{representationData:c}=(0,l.T)(o);return this.getEditData({viewport:n,representationData:c,segmentsLocked:d,segmentationId:o})}getEditData({viewport:e,representationData:t,segmentsLocked:n,segmentationId:a}){if(e instanceof i.BaseVolumeViewport){const{volumeId:a}=t[o.A.Labelmap],s=e.getActors();if(e instanceof d.x){const e=new CustomEvent(i.Enums.Events.ERROR_EVENT,{detail:{type:"Segmentation",message:"Cannot perform brush operation on the selected viewport"},cancelable:!0});return i.eventTarget.dispatchEvent(e),null}const r=s.map((e=>i.cache.getVolume(e.referencedId))),l=i.cache.getVolume(a),c=r.find((e=>i.utilities.isEqual(e.dimensions,l.dimensions)))?.volumeId||r[0]?.volumeId;return{volumeId:a,referencedVolumeId:this.configuration.threshold?.volumeId??c,segmentsLocked:n}}{const t=(0,c.vl)(e.id,a);if(!t)return;return{imageId:t,segmentsLocked:n}}}createHoverData(e,t){const n=(0,i.getEnabledElement)(e),{viewport:a}=n,o=a.getCamera(),{viewPlaneNormal:s,viewUp:r}=o,l=[a.id],{segmentIndex:d,segmentationId:c,segmentColor:h}=this.getActiveSegmentationData(a)||{};return{brushCursor:{metadata:{viewPlaneNormal:[...s],viewUp:[...r],FrameOfReferenceUID:a.getFrameOfReferenceUID(),referencedImageId:"",toolName:this.getToolName(),segmentColor:h},data:{}},centerCanvas:t,segmentIndex:d,viewport:a,segmentationId:c,segmentColor:h,viewportIdsToRender:l}}getActiveSegmentationData(e){const t=e.id,n=(0,s.T)(t);if(!n)return;const{segmentationId:i}=n,a=(0,g.Q)(i);if(!a)return;return{segmentIndex:a,segmentationId:i,segmentColor:(0,h.getSegmentIndexColor)(t,i,a)}}getOperationData(e){const t=this._editData||this.createEditData(e),{segmentIndex:n,segmentationId:a,brushCursor:o}=this._hoverData||this.createHoverData(e),{data:s,metadata:r={}}=o||{},{viewPlaneNormal:l,viewUp:d}=r,c=this.configuration.preview?.previewColors?.[n],{viewport:g}=(0,i.getEnabledElement)(e),u=(0,h.getSegmentIndexColor)(g.id,a,n);if(!c&&!u)return;let m=null,v=null;this.configuration.preview.enabled&&(m=c||function(e,t,n,i,a=.4){return[Math.round(e+(255-e)*a),Math.round(t+(255-t)*a),Math.round(n+(255-n)*a),i]}(...u),v=255);return{...t,points:s?.handles?.points,segmentIndex:n,viewPlaneNormal:l,previewOnHover:!this._previewData.isDrag,toolGroupId:this.toolGroupId,segmentationId:a,viewUp:d,centerSegmentIndexInfo:this.centerSegmentIndexInfo,activeStrategy:this.configuration.activeStrategy,configuration:this.configuration,previewColor:m,previewSegmentIndex:v,createMemo:this.createMemo.bind(this)}}addPreview(e=this._previewData.element,t){const{_previewData:n}=this,a=t?.acceptReject;!0===a?this.acceptPreview(e):!1===a&&this.rejectPreview(e);const o=(0,i.getEnabledElement)(e),s=this.applyActiveStrategyCallback(o,this.getOperationData(e),u.StrategyCallbacks.AddPreview);return n.isDrag=!0,s}rejectPreview(e=this._previewData.element){if(!e)return;this.doneEditMemo();const t=(0,i.getEnabledElement)(e);this.applyActiveStrategyCallback(t,this.getOperationData(e),u.StrategyCallbacks.RejectPreview),this._previewData.preview=null,this._previewData.isDrag=!1}acceptPreview(e=this._previewData.element){if(!e)return;const t=this.getOperationData(e);this.memo&&this.memo.id&&this.acceptedMemoIds.set(this.memo.id,{element:e,segmentIndex:t.segmentIndex});const n=(0,i.getEnabledElement)(e);this.applyActiveStrategyCallback(n,t,u.StrategyCallbacks.AcceptPreview),this.doneEditMemo(),this._previewData.preview=null,this._previewData.isDrag=!1}static viewportContoursToLabelmap(e,t){const n=t?.removeContours??!0,i=(0,v.getAllAnnotations)(),a=(0,p.filterAnnotationsForDisplay)(e,i);if(!a?.length)return;const o=a.filter((e=>e.data.contour?.polyline?.length));if(!o.length)return;const s=new I({},{configuration:{strategies:{FILL_INSIDE_CIRCLE:E.fillInsideCircle},activeStrategy:"FILL_INSIDE_CIRCLE"}}).addPreview(e.element),{memo:r,segmentationId:l}=s,d=r?.voxelManager,c=d.sourceVoxelManager||d,{dimensions:h}=d,u=e.getDefaultActor().actor.getMapper().getInputData();for(const e of o){const t=[[1/0,-1/0],[1/0,-1/0],[1/0,-1/0]],{polyline:i}=e.data.contour;for(const e of i){u.worldToIndex(e).forEach(((e,n)=>{t[n][0]=Math.min(t[n][0],e),t[n][1]=Math.max(t[n][1],e)}))}t.forEach(((e,t)=>{e[0]=Math.round(Math.max(0,e[0])),e[1]=Math.round(Math.min(h[t]-1,e[1]))}));const a=(0,g.Q)(l),o=e.data.handles?.[0]||i[0],s=u.worldToIndex(o).map(Math.round),r=c.getAtIJKPoint(s)||0;let m=!1,p=!1;for(const e of i){const t=u.worldToIndex(e).map(Math.round),n=c.getAtIJKPoint(t);n===r?m=!0:n>=0&&(p=!0)}const w=m&&p?r:0===r?a:0;for(let e=t[0][0];e<=t[0][1];e++)for(let n=t[1][0];n<=t[1][1];n++)for(let a=t[2][0];a<=t[2][1];a++){const t=u.indexToWorld([e,n,a]);(0,f.isPointInsidePolyline3D)(t,i)&&d.setAtIJK(e,n,a,w)}n&&(0,v.removeAnnotation)(e.annotationUID)}const m=d.getArrayOfModifiedSlices();(0,w.triggerSegmentationDataModified)(l,m)}}},56789:(e,t,n)=>{"use strict";n.d(t,{kr:()=>f,mu:()=>m,pB:()=>v,q:()=>w});var i=n(3823),a=n(15327),o=n(11683),s=n(72282),r=n(55887),l=n(99737),d=n(11990),c=n(62783);const{transformWorldToIndex:h,isEqual:g}=a.utilities,u={[l.StrategyCallbacks.Initialize]:e=>{const{points:t,viewport:n,segmentationImageData:a}=e;if(!t)return;const r=i.eR.fromValues(0,0,0);t.forEach((e=>{i.eR.add(r,r,e)})),i.eR.scale(r,r,1/t.length),e.centerWorld=r,e.centerIJK=h(a,r);const l=t.map((e=>n.worldToCanvas(e))),[d,c]=(0,o.getCanvasEllipseCorners)(l),g=n.canvasToWorld(d),u=n.canvasToWorld(c),v=t.map((e=>h(a,e))),p=(0,s.getBoundingBoxAroundShapeIJK)(v,a.getDimensions());e.isInObject=m({topLeftWorld:g,bottomRightWorld:u,center:r}),e.isInObjectBoundsIJK=p}};function m(e){const{topLeftWorld:t,bottomRightWorld:n,center:i}=e,a=Math.abs(t[0]-n[0])/2,s=Math.abs(t[1]-n[1])/2,r=Math.abs(t[2]-n[2])/2,l=Math.max(a,s,r);if(g(a,l)&&g(s,l)&&g(r,l)){const e={center:i,radius:l,radius2:l*l};return t=>(0,c.d)(e,t)}const d={center:i,xRadius:a,yRadius:s,zRadius:r},{precalculated:h}=(0,o.precalculatePointInEllipse)(d,{});return h}const v=new r.A("Circle",d.A.regionFill,d.A.setValue,u,d.A.determineSegmentIndex,d.A.preview,d.A.labelmapStatistics),p=new r.A("CircleThreshold",d.A.regionFill,d.A.setValue,u,d.A.determineSegmentIndex,d.A.dynamicThreshold,d.A.threshold,d.A.preview,d.A.islandRemoval,d.A.labelmapStatistics),f=v.strategyFunction,w=p.strategyFunction},10088:(e,t,n)=>{"use strict";n.d(t,{pY:()=>m});var i=n(3823),a=n(15327),o=n(72282),s=(n(49906),n(40905),n(26384)),r=n(55887),l=n(99737),d=n(11990);const{transformWorldToIndex:c}=a.utilities,h={[l.StrategyCallbacks.Initialize]:e=>{const{points:t,imageVoxelManager:n,viewport:r,segmentationImageData:l,segmentationVoxelManager:d}=e;if(!t)return;const h=i.eR.fromValues(0,0,0);t.forEach((e=>{i.eR.add(h,h,e)})),i.eR.scale(h,h,1/t.length),e.centerWorld=h,e.centerIJK=c(l,h);const{boundsIJK:g,pointInShapeFn:u}=function(e,t,n){let i=t.map((e=>c(n,e)));i=i.map((e=>e.map((e=>Math.round(e)))));const r=(0,o.getBoundingBoxAroundShapeIJK)(i,n.getDimensions()),l=e instanceof a.StackViewport,d=l||(0,s.l)(i),h=n.getDirection(),g=n.getSpacing(),{viewPlaneNormal:u}=e.getCamera(),m=a.utilities.getSpacingInNormalDirection({direction:h,spacing:g},u),v=(0,o.getBoundingBoxAroundShapeWorld)(t);let[[p,f],[w,E],[I,C]]=v;p-=m,f+=m,w-=m,E+=m,I-=m,C+=m;const b=d?()=>!0:e=>{const[t,n,i]=e;return t>=p&&t<=f&&(n>=w&&n<=E)&&(i>=I&&i<=C)};return{boundsIJK:r,pointInShapeFn:b}}(r,t,l);e.isInObject=u,e.isInObjectBoundsIJK=g}};const g=new r.A("Rectangle",d.A.regionFill,d.A.setValue,h,d.A.determineSegmentIndex,d.A.preview,d.A.labelmapStatistics),u=new r.A("RectangleThreshold",d.A.regionFill,d.A.setValue,h,d.A.determineSegmentIndex,d.A.dynamicThreshold,d.A.threshold,d.A.preview,d.A.islandRemoval,d.A.labelmapStatistics),m=g.strategyFunction;u.strategyFunction},99522:(e,t,n)=>{"use strict";n.d(t,{fillInsideCircle:()=>i.kr});n(10088);var i=n(56789)},13369:()=>{},64485:(e,t,n)=>{"use strict";n.d(t,{x:()=>o});var i=n(15327),a=(n(82056),n(3823));function o(e,t,n){const o=e.getImageIds();if(!o||!o.length)return;const s=o.map((e=>{const{imagePositionPatient:o}=i.metaData.get("imagePlaneModule",e),s=function(e,t,n){const i=a.eR.create();a.eR.sub(i,e,t);const o=a.eR.dot(i,n);return Math.abs(o)}(t,o,n);return{imageId:e,distance:s}}));return s.sort(((e,t)=>e.distance-t.distance)),s[0].imageId}},76802:(e,t,n)=>{"use strict";n.d(t,{A:()=>i});const i=function(e,t){const n=e.findIndex((([e,t])=>e===t));if(-1===n)throw new Error("3D bounding boxes not supported in an oblique plane");return e[n][0]-=t,e[n][1]+=t,e}},72282:(e,t,n)=>{"use strict";n.r(t),n.d(t,{extend2DBoundingBoxInViewAxis:()=>i.A,getBoundingBoxAroundShape:()=>a.g,getBoundingBoxAroundShapeIJK:()=>a.g,getBoundingBoxAroundShapeWorld:()=>a.C});var i=n(76802),a=n(87063)},85263:(e,t,n)=>{"use strict";n.d(t,{V:()=>a});var i=n(33283);function a(e){if(e.parentAnnotationUID)return;if(!e.data.segmentation)throw new Error("addContourSegmentationAnnotation: annotation does not have a segmentation data");const{segmentationId:t,segmentIndex:n}=e.data.segmentation,a=(0,i.T)(t);a.representationData.Contour||(a.representationData.Contour={annotationUIDsMap:new Map});let{annotationUIDsMap:o}=a.representationData.Contour;o||(o=new Map);let s=o?.get(n);s||(s=new Set,o.set(n,s)),o.set(n,s.add(e.annotationUID))}},64843:(e,t,n)=>{"use strict";n.d(t,{addContourSegmentationAnnotation:()=>i.V,removeContourSegmentationAnnotation:()=>a.M});n(62854),n(78130);var i=n(85263),a=n(37354)},46228:(e,t,n)=>{"use strict"},98013:(e,t,n)=>{"use strict";n.d(t,{A:()=>s});var i=n(15327),a=n(3823);const{isEqual:o}=i.utilities;function s(e,t){const{polyline:n}=e.data.contour,{points:i}=e.data.handles,{length:s}=i;if(t===s)return n.length;if(t<0&&(t=(t+s)%s),0===t)return 0;const r=i[t],l=n.findIndex((e=>o(r,e)));if(-1!==l)return l;let d=1/0;return n.reduce(((e,t,n)=>{const i=a.eR.squaredDistance(t,r);return i<d?(d=i,n):e}),-1)}},37546:(e,t,n)=>{"use strict"},52905:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});var i=n(45217);const a=function(e,t,n){let a,o,s,r,l,d,c=0,h=!1,g=!1,u=!0;const m=!t&&0!==t&&"function"==typeof window.requestAnimationFrame;if("function"!=typeof e)throw new TypeError("Expected a function");function v(t){const n=a,i=o;return a=o=void 0,c=t,r=e.apply(i,n),r}function p(e,t){return m?window.requestAnimationFrame(e):setTimeout(e,t)}function f(e){const n=e-d;return void 0===d||n>=t||n<0||g&&e-c>=s}function w(){const e=Date.now();if(f(e))return E(e);l=p(w,function(e){const n=e-c,i=t-(e-d);return g?Math.min(i,s-n):i}(e))}function E(e){return l=void 0,u&&a?v(e):(a=o=void 0,r)}function I(...e){const n=Date.now(),i=f(n);if(a=e,o=this,d=n,i){if(void 0===l)return function(e){return c=e,l=p(w,t),h?v(e):r}(d);if(g)return l=p(w,t),v(d)}return void 0===l&&(l=p(w,t)),r}return t=Number(t)||0,(0,i.A)(n)&&(h=Boolean(n.leading),g="maxWait"in n,s=g?Math.max(Number(n.maxWait)||0,t):s,u="trailing"in n?Boolean(n.trailing):u),I.cancel=function(){void 0!==l&&function(e){if(m)return window.cancelAnimationFrame(e);clearTimeout(e)}(l),c=0,a=d=o=l=void 0},I.flush=function(){return void 0===l?r:E(Date.now())},I.pending=function(){return void 0!==l},I}},1239:(e,t,n)=>{"use strict";function i(e){const t=function(e){const t=[e[0],e[1]].sort(s),n=[e[0],e[1]].sort(r),i=t[t.length-1],a=n[0],o=n[n.length-1];return{top:a,bottom:o,right:i};function s(e,t){return e[0]<t[0]?-1:1}function r(e,t){return e[1]<t[1]?-1:1}}(e),n=(t.top[1]+t.bottom[1])/2;return[t.right[0],n]}n.d(t,{A:()=>i})},473:(e,t,n)=>{"use strict";n.d(t,{getTextBoxCoordsCanvas:()=>i.A});var i=n(1239)},4096:(e,t,n)=>{"use strict";n.d(t,{CQ:()=>m,Op:()=>g,Xw:()=>u});var i=n(15327);const{CalibrationTypes:a}=i.Enums,o="px",s="voxels",r=[1,2,3,4],l=["3,3","4,7"],d=["4,3","4,7"],c={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"},h="²",g=(e,t)=>{const{calibration:n,hasPixelSpacing:d}=e;let g=d?"mm":o;const u=d?"mm³":s;let m=g+h,v=1,p="";if(!n||!n.type&&!n.sequenceOfUltrasoundRegions)return{unit:g,areaUnit:m,scale:v,volumeUnit:u};if(n.type===a.UNCALIBRATED)return{unit:o,areaUnit:o+h,scale:v,volumeUnit:s};if(n.sequenceOfUltrasoundRegions){let e,a;if(Array.isArray(t)&&2===t.length)[e,a]=t;else if("function"==typeof t){const n=t();e=n[0],a=n[1]}let d=n.sequenceOfUltrasoundRegions.filter((t=>e[0]>=t.regionLocationMinX0&&e[0]<=t.regionLocationMaxX1&&e[1]>=t.regionLocationMinY0&&e[1]<=t.regionLocationMaxY1&&a[0]>=t.regionLocationMinX0&&a[0]<=t.regionLocationMaxX1&&a[1]>=t.regionLocationMinY0&&a[1]<=t.regionLocationMaxY1));if(!d?.length)return{unit:g,areaUnit:m,scale:v,volumeUnit:u};if(d=d.filter((e=>r.includes(e.regionDataType)&&l.includes(`${e.physicalUnitsXDirection},${e.physicalUnitsYDirection}`))),!d.length)return{unit:o,areaUnit:o+h,scale:v,volumeUnit:s};const f=d[0],w=Math.abs(f.physicalDeltaX),E=Math.abs(f.physicalDeltaY);if(!i.utilities.isEqual(w,E,.001))return{unit:o,areaUnit:o+h,scale:v,volumeUnit:s};v=1/w,p="US Region",g=c[f.physicalUnitsXDirection]||"unknown",m=g+h}else n.scale&&(v=n.scale);return[a.ERMF,a.USER,a.ERROR,a.PROJECTION,a.CALIBRATED,a.UNKNOWN].includes(n?.type)&&(p=n.type),{unit:g+(p?` ${p}`:""),areaUnit:m+(p?` ${p}`:""),scale:v,volumeUnit:u+(p?` ${p}`:"")}},u=(e,t)=>{const[n]=t,{calibration:i}=e;let a=["raw"],o=[null],s="";if(!i||!i.type&&!i.sequenceOfUltrasoundRegions)return{units:a,values:o};if(i.sequenceOfUltrasoundRegions){const e=i.sequenceOfUltrasoundRegions.filter((e=>r.includes(e.regionDataType)&&d.includes(`${e.physicalUnitsXDirection},${e.physicalUnitsYDirection}`)));if(!e?.length)return{units:a,values:o};const t=e.find((e=>n[0]>=e.regionLocationMinX0&&n[0]<=e.regionLocationMaxX1&&n[1]>=e.regionLocationMinY0&&n[1]<=e.regionLocationMaxY1));if(!t)return{units:a,values:o};const{referencePixelX0:l=0,referencePixelY0:h=0}=t,{physicalDeltaX:g,physicalDeltaY:u}=t,m=(n[1]-t.regionLocationMinY0-h)*u;s="US Region",o=[(n[0]-t.regionLocationMinX0-l)*g,m],a=[c[t.physicalUnitsXDirection],c[t.physicalUnitsYDirection]]}return{units:a,values:o,calibrationType:s}},m=e=>e.calibration?.aspect||1},4296:(e,t,n)=>{"use strict";n.d(t,{R:()=>l,l:()=>d});var i=n(15327),a=n(3823),o=n(72282);const{transformWorldToIndex:s}=i.utilities;function r(e,t,n){const[i,r]=e,l=a.eR.fromValues((i[0]+r[0])/2,(i[1]+r[1])/2,(i[2]+r[2])/2),d=a.eR.distance(i,r)/2,{boundsIJK:c,topLeftWorld:h,bottomRightWorld:g}=function(e,t,n,i,r){const l=e.getDimensions(),{row:d,column:c,normal:h}=t,g=a.eR.create(),u=a.eR.create();a.eR.scaleAndAdd(g,i,h,r),a.eR.scaleAndAdd(u,i,h,-r),a.eR.scaleAndAdd(g,g,c,-r),a.eR.scaleAndAdd(u,u,c,r),a.eR.scaleAndAdd(g,g,d,-r),a.eR.scaleAndAdd(u,u,d,r);const m=s(e,g),v=s(e,u),p=n.map((t=>s(e,t))),f=(0,o.getBoundingBoxAroundShapeIJK)([m,v,...p],l);return{boundsIJK:f,topLeftWorld:g,bottomRightWorld:u}}(t,n,e,l,d);return{boundsIJK:c,centerWorld:l,radiusWorld:d,topLeftWorld:h,bottomRightWorld:g}}function l(e,t){const n=t.getDirection(),i=a.eR.fromValues(n[0],n[1],n[2]),o=a.eR.fromValues(n[3],n[4],n[5]),s=a.eR.fromValues(n[6],n[7],n[8]);return r(e,t,{row:i,column:o,normal:a.eR.negate(a.eR.create(),s)})}function d(e,t,n){if(!n)throw new Error("viewport is required in order to calculate the sphere bounds");const i=n.getCamera(),o=a.eR.fromValues(i.viewUp[0],i.viewUp[1],i.viewUp[2]),s=a.eR.fromValues(i.viewPlaneNormal[0],i.viewPlaneNormal[1],i.viewPlaneNormal[2]),l=a.eR.create();a.eR.cross(l,o,s);return r(e,t,{row:l,normal:s,column:a.eR.negate(a.eR.create(),o)})}},40133:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});var i=n(15295);function a(e){const t=(0,i.A)(e);return t.length?t[0]:void 0}},45217:(e,t,n)=>{"use strict";n.d(t,{A:()=>i});const i=function(e){const t=typeof e;return null!==e&&("object"===t||"function"===t)}},95527:(e,t,n)=>{"use strict";n.r(t),n.d(t,{BasicStatsCalculator:()=>a,aabb:()=>i,angle:()=>g,circle:()=>o,ellipse:()=>s,lineSegment:()=>r,point:()=>l,polyline:()=>d,rectangle:()=>c,vec2:()=>h});var i=n(88638),a=n(73262),o=n(77081),s=n(11683),r=n(15305),l=n(82216),d=n(92984),c=n(33657),h=n(23324),g=n(83923)},62783:(e,t,n)=>{"use strict";function i(e,t){const{center:n,radius:i}=e,a=e.radius2||i*i;return(t[0]-n[0])*(t[0]-n[0])+(t[1]-n[1])*(t[1]-n[1])+(t[2]-n[2])*(t[2]-n[2])<=a}n.d(t,{d:()=>i})},26384:(e,t,n)=>{"use strict";n.d(t,{l:()=>r});var i=n(3823),a=n(15327);const{isEqual:o}=a.utilities,s=[i.eR.fromValues(1,0,0),i.eR.fromValues(0,1,0),i.eR.fromValues(0,0,1)];function r(e){const t=i.eR.subtract(i.eR.create(),e[0],e[1]),n=i.eR.subtract(i.eR.create(),e[0],e[2]);return[...l(t,s),...l(n,s)].every((e=>o(e,0)||o(e,90)||o(e,180)||o(e,270)))}function l(e,t){return t.map((t=>180*i.eR.angle(e,t)/Math.PI))}},13179:(e,t,n)=>{"use strict";var i=n(68915);class a{static{this.calculators=new Map}static{this.indices=[]}static{this.mode="collective"}static statsInit(e){const{storePointData:t,indices:n,mode:a}=e;this.mode=a,this.indices=n,this.calculators.clear(),"individual"===this.mode?n.forEach((e=>{this.calculators.set(e,new i.C3({storePointData:t}))})):this.calculators.set(n,new i.C3({storePointData:t}))}static statsCallback(e){const{segmentIndex:t,...n}=e;if(!t)throw new Error("Segment index is required for stats calculation");const i="individual"===this.mode?this.calculators.get(t):this.calculators.get(this.indices);if(!i)throw new Error(`No calculator found for segment ${t}`);i.statsCallback(n)}static getStatistics(e){if("individual"===this.mode){const t={};return this.calculators.forEach(((n,i)=>{t[i]=n.getStatistics(e)})),t}return this.calculators.get(this.indices).getStatistics(e)}}},60199:(e,t,n)=>{"use strict";n(3823),n(82594)},84882:(e,t,n)=>{"use strict";function i(e,t,n){return(new Array(n+1).join(t)+e).slice(-n)}n.d(t,{A:()=>a});const a=function(e,t,n={}){const a=n.onFlood,o=n.onBoundary,s=n.equals,r=n.filter,l=n.diagonals||!1,d=f(t),c=function(){const e=function(e){const t=[],n=function(e){return e.split("").map((function(e){return parseInt(e,10)-1}))};for(let a=0;a<Math.pow(3,e);a+=1){const o=i(a.toString(3),"0",e);t.push(n(o))}return t}(t.length);return e.filter((function(e){const t=function(e){let t=0;for(let n=0;n<e.length;n+=1)0!==e[n]&&(t+=1);return t}(e);return 0!==t&&(1===t||l)}))}(),h=[],g=[],u=new Set,m=n.bounds;for(h.push({currentArgs:t});h.length>0;)v(h.pop());return{flooded:g};function v(e){const t=e.currentArgs,n=e.previousArgs;p(t)||(function(e){const[t,n,i=0]=e,a=t+32768+65536*(n+32768+65536*(i+32768));u.add(a)}(t),function(e){const t=f(e);return s?s(t,d):t===d}(t)?(function(e){g.push(e),a&&a(...e)}(t),function(e){for(let t=0;t<c.length;t+=1){const n=c[t],i=e.slice(0);for(let t=0;t<e.length;t+=1)i[t]+=n[t];!1!==r?.(i)&&(p(i)||h.push({currentArgs:i,previousArgs:e}))}}(t)):function(e){const[t,n,i=0]=e,a=t+32768+65536*(n+32768+65536*(i+32768));m?.set(a,e),o&&o(...e)}(n))}function p(e){const[t,n,i=0]=e,a=t+32768+65536*(n+32768+65536*(i+32768));return u.has(a)}function f(t){return e(...t)}}},14957:(e,t,n)=>{"use strict";n.d(t,{n:()=>o});var i=n(77609),a=n(48736);function o(e,t){const n=(0,i.getToolGroup)(e);if(void 0===n)return;const o=n._toolInstances;if(!Object.keys(o).length)return;if(t&&o[t])return[o[t]];return Object.values(o).filter((e=>e instanceof a.A))}},20527:(e,t,n)=>{"use strict";n.d(t,{L:()=>o});var i=n(6802),a=n(98870);function o(e){const t=(0,a.getSegmentation)(e),{annotationUIDsMap:n}=t.representationData.Contour;for(const[e,t]of n.entries()){if(Array.from(t).find((e=>(0,i.gw)(e).highlighted)))return e}}},46507:(e,t,n)=>{"use strict";n.d(t,{T:()=>s});var i=n(15327),a=n(98870),o=n(91963);function s(e,t,{viewport:n,searchRadius:s}){const l=(0,a.getSegmentation)(e).representationData.Labelmap;if(n instanceof i.BaseVolumeViewport){const{volumeId:e}=l,a=i.cache.getVolume(e);if(!a)return;const o=a.voxelManager,d=a.imageData,c=i.utilities.transformWorldToIndex(d,t),h=o.getAtIJK(c[0],c[1],c[2]),g=function(e,t,n,a,o){const s=(t,o)=>{const s=[e[0]+t,e[1]+o],r=n.canvasToWorld(s),l=a.get("voxelManager").voxelManager,d=i.utilities.transformWorldToIndex(a,r);return l.getAtIJK(d[0],d[1],d[2])};return r(s,t,o)}(n.worldToCanvas(t),h,n,d,s);return g?h:void 0}const d=(0,a.getCurrentLabelmapImageIdForViewport)(n.id,e);if(!i.cache.getImage(d))return;const c=(0,o.wV)(n.id,e),h=c?.actor.getMapper().getInputData(),g=i.utilities.transformWorldToIndex(h,t),u=h.getDimensions(),m=h.voxelManager||i.utilities.VoxelManager.createScalarVolumeVoxelManager({dimensions:u,scalarData:h.getPointData().getScalars().getData()}),v=m.getAtIJKPoint(g),p=function(e,t,n,i,a){const o=(t,i,a)=>{const o=[e[0]+t,e[1]+i,e[2]+a];return n.getAtIJK(o[0],o[1],o[2])};return r(o,i,a)}(g,0,m,v);return p?v:void 0}function r(e,t,n=1){const i=Array.from({length:2*n+1},((e,t)=>t-n));for(const n of i)for(const a of i)for(const o of i){if(0===n&&0===a&&0===o)continue;const i=e(n,a,o);if(void 0!==i&&t!==i)return!0}return!1}},71751:(e,t,n)=>{"use strict";n.d(t,{hX:()=>d});var i=n(15327),a=n(99737),o=n(98870),s=n(6802),r=n(92984),l=n(59452);function d(e,t,n={}){const d=(0,o.getSegmentation)(e),c=d.representationData,h=n?.representationType??Object.keys(c)[0];if(!h)throw new Error(`Segmentation ${e} does not have any representations`);switch(h){case a.SegmentationRepresentations.Labelmap:return function(e,t,{viewport:n}){const a=e.representationData.Labelmap;if(n instanceof i.BaseVolumeViewport){const{volumeId:e}=a,n=i.cache.getVolume(e);if(!n)return;return n.imageData.getScalarValueFromWorld(t)}const s=(0,o.getCurrentLabelmapImageIdsForViewport)(n.id,e.segmentationId);if(s.length>1)return void console.warn("Segment selection for labelmaps with multiple imageIds in stack viewports is not supported yet.");const r=s[0];if(!i.cache.getImage(r))return;const d=(0,l.wV)(n.id,e.segmentationId),c=d?.actor.getMapper().getInputData(),h=i.utilities.transformWorldToIndex(c,t),g=c.getDimensions(),u=c.voxelManager||i.utilities.VoxelManager.createScalarVolumeVoxelManager({dimensions:g,scalarData:c.getPointData().getScalars().getData()});return u.getAtIJKPoint(h)}(d,t,n);case a.SegmentationRepresentations.Contour:return function(e,t,{viewport:n}){const a=e.representationData.Contour,o=Array.from(a.annotationUIDsMap.keys()),{viewPlaneNormal:l}=n.getCamera();for(const e of o){const n=a.annotationUIDsMap.get(e);if(n)for(const a of n){const n=(0,s.gw)(a);if(!n)continue;const{polyline:o}=n.data.contour;if(i.utilities.isEqual(l,n.metadata.viewPlaneNormal)&&(0,r.isPointInsidePolyline3D)(t,o))return Number(e)}}}(d,t,n);default:return}}},2733:(e,t,n)=>{"use strict";n.d(t,{A:()=>i});const i="\nconst MAX_STRENGTH = 65535f;\n\n// Workgroup size - X*Y*Z must be multiple of 32 for better performance\noverride workGroupSizeX = 1u;\noverride workGroupSizeY = 1u;\noverride workGroupSizeZ = 1u;\n\n// Compare the current voxel to neighbors using a 9x9x9 window\noverride windowSize = 9i;\n\nstruct Params {\n  size: vec3u,\n  iteration: u32,\n}\n\n// New structure to track bounds of modified voxels\nstruct Bounds {\n  minX: atomic<i32>,\n  minY: atomic<i32>,\n  minZ: atomic<i32>,\n  maxX: atomic<i32>,\n  maxY: atomic<i32>,\n  maxZ: atomic<i32>,\n}\n\n@group(0) @binding(0) var<uniform> params: Params;\n@group(0) @binding(1) var<storage> volumePixelData: array<f32>;\n@group(0) @binding(2) var<storage, read_write> labelmap: array<u32>;\n@group(0) @binding(3) var<storage, read_write> strengthData: array<f32>;\n@group(0) @binding(4) var<storage> prevLabelmap: array<u32>;\n@group(0) @binding(5) var<storage> prevStrengthData: array<f32>;\n@group(0) @binding(6) var<storage, read_write> updatedVoxelsCounter: array<atomic<u32>>;\n@group(0) @binding(7) var<storage, read_write> modifiedBounds: Bounds;\n\nfn getPixelIndex(ijkPos: vec3u) -> u32 {\n  let numPixelsPerSlice = params.size.x * params.size.y;\n  return ijkPos.x + ijkPos.y * params.size.x + ijkPos.z * numPixelsPerSlice;\n}\n\nfn updateBounds(position: vec3i) {\n  // Atomically update min bounds (use min operation)\n  let oldMinX = atomicMin(&modifiedBounds.minX, position.x);\n  let oldMinY = atomicMin(&modifiedBounds.minY, position.y);\n  let oldMinZ = atomicMin(&modifiedBounds.minZ, position.z);\n\n  // Atomically update max bounds (use max operation)\n  let oldMaxX = atomicMax(&modifiedBounds.maxX, position.x);\n  let oldMaxY = atomicMax(&modifiedBounds.maxY, position.y);\n  let oldMaxZ = atomicMax(&modifiedBounds.maxZ, position.z);\n}\n\n@compute @workgroup_size(workGroupSizeX, workGroupSizeY, workGroupSizeZ)\nfn main(\n  @builtin(global_invocation_id) globalId: vec3u,\n) {\n  // Make sure it will not get out of bounds for volume with sizes that\n  // are not multiple of workGroupSize\n  if (\n    globalId.x >= params.size.x ||\n    globalId.y >= params.size.y ||\n    globalId.z >= params.size.z\n  ) {\n    return;\n  }\n\n  // Initialize bounds for the first iteration\n  if (params.iteration == 0 && globalId.x == 0 && globalId.y == 0 && globalId.z == 0) {\n    // Initialize to opposite extremes to ensure any update will improve the bounds\n    atomicStore(&modifiedBounds.minX, i32(params.size.x));\n    atomicStore(&modifiedBounds.minY, i32(params.size.y));\n    atomicStore(&modifiedBounds.minZ, i32(params.size.z));\n    atomicStore(&modifiedBounds.maxX, -1);\n    atomicStore(&modifiedBounds.maxY, -1);\n    atomicStore(&modifiedBounds.maxZ, -1);\n  }\n\n  let currentCoord = vec3i(globalId);\n  let currentPixelIndex = getPixelIndex(globalId);\n\n  let numPixels = arrayLength(&volumePixelData);\n  let currentPixelValue = volumePixelData[currentPixelIndex];\n\n  if (params.iteration == 0) {\n    // All non-zero initial labels are given maximum strength\n    strengthData[currentPixelIndex] = select(MAX_STRENGTH, 0., labelmap[currentPixelIndex] == 0);\n\n    // Update bounds for non-zero initial labels\n    if (labelmap[currentPixelIndex] != 0) {\n      updateBounds(currentCoord);\n    }\n    return;\n  }\n\n  // It should at least copy the values from previous state\n  var newLabel = prevLabelmap[currentPixelIndex];\n  var newStrength = prevStrengthData[currentPixelIndex];\n\n  let window = i32(ceil(f32(windowSize - 1) * .5));\n  let minWindow = -1i * window;\n  let maxWindow = 1i * window;\n\n  for (var k = minWindow; k <= maxWindow; k++) {\n    for (var j = minWindow; j <= maxWindow; j++) {\n      for (var i = minWindow; i <= maxWindow; i++) {\n        // Skip current voxel\n        if (i == 0 && j == 0 && k == 0) {\n          continue;\n        }\n\n        let neighborCoord = currentCoord + vec3i(i, j, k);\n\n        //  Boundary conditions. Do not grow outside of the volume\n        if (\n          neighborCoord.x < 0i || neighborCoord.x >= i32(params.size.x) ||\n          neighborCoord.y < 0i || neighborCoord.y >= i32(params.size.y) ||\n          neighborCoord.z < 0i || neighborCoord.z >= i32(params.size.z)\n        ) {\n          continue;\n        }\n\n        let neighborIndex = getPixelIndex(vec3u(neighborCoord));\n        let neighborPixelValue = volumePixelData[neighborIndex];\n        let prevNeighborStrength = prevStrengthData[neighborIndex];\n        let strengthCost = abs(neighborPixelValue - currentPixelValue);\n        let takeoverStrength = prevNeighborStrength - strengthCost;\n\n        if (takeoverStrength > newStrength) {\n          newLabel = prevLabelmap[neighborIndex];\n          newStrength = takeoverStrength;\n        }\n      }\n    }\n  }\n\n  if (labelmap[currentPixelIndex] != newLabel) {\n    atomicAdd(&updatedVoxelsCounter[params.iteration], 1u);\n\n    // Update bounds for modified voxels\n    updateBounds(currentCoord);\n  }\n\n  labelmap[currentPixelIndex] = newLabel;\n  strengthData[currentPixelIndex] = newStrength;\n}\n"},95373:(e,t,n)=>{"use strict";n.r(t),n.d(t,{run:()=>i.e,runGrowCutForBoundingBox:()=>o.z,runGrowCutForSphere:()=>a.n,runOneClickGrowCut:()=>s.HW});var i=n(66499),a=n(73569),o=n(20271),s=n(16171)},66499:(e,t,n)=>{"use strict";n.d(t,{e:()=>r});var i=n(15327),a=n(2733);const o=2136746229.76,s={windowSize:3,maxProcessingTime:3e4,inspection:{numCyclesInterval:5,numCyclesBelowThreshold:3,threshold:1e-4}};async function r(e,t,n=s){const r=[8,8,4],{windowSize:l,maxProcessingTime:d}=Object.assign({},s,n),c=Object.assign({},s.inspection,n.inspection),h=i.cache.getVolume(e),g=i.cache.getVolume(t),[u,m,v]=h.dimensions;if(g.dimensions[0]!==u||g.dimensions[1]!==m||g.dimensions[2]!==v)throw new Error("Volume and labelmap must have the same size");let p=Math.floor(Math.sqrt(m**2+u**2+v**2)/2);p=Math.min(p,500);const f=g.voxelManager.getCompleteScalarDataArray();let w=h.voxelManager.getCompleteScalarDataArray();w instanceof Float32Array||(w=new Float32Array(w));const E={maxStorageBufferBindingSize:o,maxBufferSize:o},I=await(navigator.gpu?.requestAdapter()),C=await I.requestDevice({requiredLimits:E}),b=w.byteLength,_=p*Uint32Array.BYTES_PER_ELEMENT,T=6*Int32Array.BYTES_PER_ELEMENT,S=C.createShaderModule({code:a.A}),D=new Uint32Array([u,m,v,0]),A=C.createBuffer({size:D.byteLength,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST}),M=C.createBuffer({size:b,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST});C.queue.writeBuffer(M,0,w);const y=[0,1].map((()=>C.createBuffer({size:b,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST})));C.queue.writeBuffer(y[0],0,new Uint32Array(f));const x=[0,1].map((()=>C.createBuffer({size:b,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST}))),P=C.createBuffer({size:_,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST}),R=C.createBuffer({size:T,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST}),L=new Int32Array([u,m,v,-1,-1,-1]);C.queue.writeBuffer(R,0,L);const U=C.createBindGroupLayout({entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}},{binding:3,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}},{binding:4,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:5,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:6,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}},{binding:7,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}]}),O=[0,1].map((e=>{const t=y[e],n=x[e],i=y[(e+1)%2],a=x[(e+1)%2];return C.createBindGroup({layout:U,entries:[{binding:0,resource:{buffer:A}},{binding:1,resource:{buffer:M}},{binding:2,resource:{buffer:t}},{binding:3,resource:{buffer:n}},{binding:4,resource:{buffer:i}},{binding:5,resource:{buffer:a}},{binding:6,resource:{buffer:P}},{binding:7,resource:{buffer:R}}]})})),k=C.createComputePipeline({layout:C.createPipelineLayout({bindGroupLayouts:[U]}),compute:{module:S,entryPoint:"main",constants:{workGroupSizeX:r[0],workGroupSizeY:r[1],workGroupSizeZ:r[2],windowSize:l}}}),N=[Math.ceil(u/r[0]),Math.ceil(m/r[1]),Math.ceil(v/r[2])],V=C.createBuffer({size:_,usage:GPUBufferUsage.MAP_READ|GPUBufferUsage.COPY_DST}),W=d?performance.now()+d:0;let B=c.numCyclesInterval,H=0;for(let e=0;e<p;e++){D[3]=e,C.queue.writeBuffer(A,0,D);const t=C.createCommandEncoder(),n=t.beginComputePass();n.setPipeline(k),n.setBindGroup(0,O[e%2]),n.dispatchWorkgroups(N[0],N[1],N[2]),n.end(),t.copyBufferToBuffer(P,e*Uint32Array.BYTES_PER_ELEMENT,V,e*Uint32Array.BYTES_PER_ELEMENT,Uint32Array.BYTES_PER_ELEMENT),C.queue.submit([t.finish()]);if(e>0&&!(e%B)){await V.mapAsync(GPUMapMode.READ,0,_);const t=V.getMappedRange(0,_),n=new Uint32Array(t.slice(0))[e]/w.length;if(V.unmap(),e>=1&&n<c.threshold){if(B=1,H++,H===c.numCyclesBelowThreshold)break}else B=c.numCyclesInterval}if(W&&performance.now()>W){console.warn(`Exceeded processing time limit (${d})ms`);break}}const F=C.createCommandEncoder(),G=(p+1)%2,z=C.createBuffer({size:b,usage:GPUBufferUsage.MAP_READ|GPUBufferUsage.COPY_DST}),$=C.createBuffer({size:T,usage:GPUBufferUsage.MAP_READ|GPUBufferUsage.COPY_DST});F.copyBufferToBuffer(y[G],0,z,0,b),F.copyBufferToBuffer(R,0,$,0,T),C.queue.submit([F.finish()]),await z.mapAsync(GPUMapMode.READ,0,b);const j=z.getMappedRange(0,b),q=new Uint32Array(j);f.set(q),z.unmap(),await $.mapAsync(GPUMapMode.READ,0,T);const K=$.getMappedRange(0,T),Z=new Int32Array(K.slice(0));$.unmap();const Y=Z[0],X=Z[1],J=Z[2],Q=Z[3],ee=Z[4],te=Z[5];g.voxelManager.setCompleteScalarDataArray(f),g.voxelManager.clearBounds(),g.voxelManager.setBounds([[Y,Q],[X,ee],[J,te]])}},20271:(e,t,n)=>{"use strict";n.d(t,{z:()=>c});var i=n(15327),a=n(66499);const o=254,s=255,r=[-1/0,-995],l=[0,1900];async function d(e,t){const n=i.volumeLoader.createAndCacheDerivedLabelmapVolume(e.volumeId);return function(e,t,n){const{positiveSeedValue:i=o,positivePixelRange:a=l}=n,s=e.voxelManager.getCompleteScalarDataArray(),[r,d,c]=(t.voxelManager.getCompleteScalarDataArray(),t.dimensions),h=Math.floor(c/2),g=Math.max(h-3,0),u=Math.max(g+5,c),m=r*d;for(let e=g;e<u;e++){const n=e*m;for(let e=0;e<d;e++){const o=e*r;for(let e=0;e<r;e++){const r=n+o+e,l=s[r];l>=a[0]&&l<=a[1]&&t.voxelManager.setAtIndex(r,i)}}}}(e,n,t),function(e,t,n){const{negativeSeedValue:i=s,negativePixelRange:a=r}=n,o=e.voxelManager.getCompleteScalarDataArray(),[l,d,c]=t.dimensions,h=Math.floor(c/2),g=new Array(l*d).fill(!1),u=h*l*d,m=(e,n)=>{const s=[[e,n]];for(;s.length;){const[e,n]=s.shift(),r=n*l+e;if(e<0||e>=l||n<0||n>=d||g[r])continue;g[r]=!0;const c=u+r,h=o[c];h<a[0]||h>a[1]||(t.voxelManager.setAtIndex(c,i),s.push([e-1,n]),s.push([e+1,n]),s.push([e,n-1]),s.push([e,n+1]))}},v=(e,t,n,i)=>{for(let s=e;s!==t;s+=n){const e=i*l+s,t=o[u+e];if(t<a[0]||t>a[1])break;g[e]||m(s,i)}};for(let e=0;e<d;e++)v(0,l-1,1,e),v(l-1,0,-1,e)}(e,n,t),n}async function c(e,t,n){const{boundingBox:o}=t,{ijkTopLeft:s,ijkBottomRight:r}=o,l={minX:s[0],maxX:r[0],minY:s[1],maxY:r[1],minZ:s[2],maxZ:r[2]},c=i.utilities.createSubVolume(e,l,{targetBuffer:{type:"Float32Array"}}),h=await d(c,n);return await(0,a.e)(c.volumeId,h.volumeId),h}},73569:(e,t,n)=>{"use strict";n.d(t,{n:()=>m});var i=n(3823),a=n(15327),o=n(66499),s=n(4296);const{transformWorldToIndex:r}=a.utilities,l=254,d=255,c=.1,h=.8;function g(e,t){const n=e.imageData.getDirection(),a=i.eR.fromValues(n[3],n[4],n[5]),{center:o,radius:l}=t,d=e.imageData,c=i.eR.scaleAndAdd(i.eR.create(),o,a,-l),h=i.eR.scaleAndAdd(i.eR.create(),o,a,l);return function(e,t){const{topLeftWorld:n,bottomRightWorld:i}=t,a=r(e.imageData,n),o=r(e.imageData,i);return{...t,topLeftIJK:a,bottomRightIJK:o}}(e,(0,s.R)([h,c],d))}async function u(e,t,n,o){const s=await a.volumeLoader.createAndCacheDerivedLabelmapVolume(e.volumeId);return function(e,t,n,i){const a=e.voxelManager.getCompleteScalarDataArray(),o=n.center,[s,d,h]=e.dimensions,g=s*d,u=r(e.imageData,o),m=a[u[2]*g+u[1]*s+u[0]],v=i.positiveSeedValue??l,p=i.positiveSeedVariance??c,f=Math.abs(m*p),w=m-f,E=m+f,I=[[-1,0,0],[1,0,0],[0,-1,0],[0,1,0],[0,0,-1],[0,0,1]],C=u[2]*g+u[1]*s+u[0];t.voxelManager.setAtIndex(C,v);const b=[u];for(;b.length;){const e=b.shift(),[n,i,o]=e;for(let e=0,r=I.length;e<r;e++){const r=I[e],l=n+r[0],c=i+r[1],u=o+r[2];if(l<0||l>=s||c<0||c>=d||u<0||u>=h)continue;const m=u*g+c*s+l,p=a[m];t.voxelManager.getAtIndex(m)===v||p<w||p>E||(t.voxelManager.setAtIndex(m,v),b.push([l,c,u]))}}}(e,s,t,o),function(e,t,n,o,s){const l=e.voxelManager.getCompleteScalarDataArray(),[c,g,u]=t.dimensions,m=c*g,{worldVecRowDir:v,worldVecSliceDir:p}=a.utilities.getVolumeDirectionVectors(t.imageData,o.getCamera()),f=r(e.imageData,n.center),w=l[f[2]*c*g+f[1]*c+f[0]],E=s.negativeSeedVariance??h,I=s?.negativeSeedValue??d,C=Math.abs(w*E),b=w-C,_=w+C,T=2*Math.PI/360,S=i.Yu.setAxisAngle(i.Yu.create(),p,T),D=i.eR.clone(v);for(let e=0;e<360;e++){const e=i.eR.scaleAndAdd(i.eR.create(),n.center,D,n.radius),a=r(t.imageData,e),[o,s,d]=a;if(i.eR.transformQuat(D,D,S),o<0||o>=c||s<0||s>=g||d<0||d>=u)continue;const h=o+s*c+d*m,v=l[h];(v<b||v>_)&&t.voxelManager.setAtIndex(h,I)}}(e,s,t,n,o),s}async function m(e,t,n,i){const s=function(e,t,n){const i=e.imageData,o=n.getCamera(),{ijkVecRowDir:s,ijkVecColDir:r}=a.utilities.getVolumeDirectionVectors(i,o);if([s,r].some((e=>!a.utilities.isEqual(Math.abs(e[0]),1)&&!a.utilities.isEqual(Math.abs(e[1]),1)&&!a.utilities.isEqual(Math.abs(e[2]),1))))return void console.warn("Oblique view is not supported!");const{boundsIJK:l}=g(e,t),d={minX:l[0][0],maxX:l[0][1]+1,minY:l[1][0],maxY:l[1][1]+1,minZ:l[2][0],maxZ:l[2][1]+1};return a.utilities.createSubVolume(e.volumeId,d,{targetBuffer:{type:"Float32Array"}})}(a.cache.getVolume(e),t,n),r=await u(s,t,n,i);return await(0,o.e)(s.volumeId,r.volumeId),r}},16171:(e,t,n)=>{"use strict";n.d(t,{HW:()=>d,sG:()=>l});var i=n(15327),a=n(66499),o=n(10564);const{transformWorldToIndex:s}=i.utilities,r=1e5;function l(e,t,n){const{dimensions:a,imageData:l}=e,[d,c,h]=a,g=e.voxelManager,u=g.getCompleteScalarDataArray(),m=d*c,v=n?.initialNeighborhoodRadius??o.Sp,p=n?.positiveStdDevMultiplier??o.ee,f=n?.negativeStdDevMultiplier??o.ag,w=n?.negativeSeedMargin??o.BX,E=n?.negativeSeedsTargetPatches??o.Zi,I=s(l,t).map(Math.round),C=g.toIndex(I);if(I[0]<0||I[0]>=d||I[1]<0||I[1]>=c||I[2]<0||I[2]>=h)return console.warn("Click position is outside volume bounds."),null;const b=i.utilities.calculateNeighborhoodStats(u,a,I,v);0===b.count&&(b.mean=u[C],b.stdDev=0);const _=b.mean-p*b.stdDev,T=b.mean+p*b.stdDev,S=[[-1,0,0],[1,0,0],[0,-1,0],[0,1,0],[0,0,-1],[0,0,1]];let D=1/0,A=1/0,M=1/0,y=-1/0,x=-1/0,P=-1/0;const R=new Set,L=[],U=u[C];if(!(U>=_&&U<=T))return console.warn("Clicked voxel intensity is outside the calculated positive range. No positive seeds generated."),{positiveSeedIndices:new Set,negativeSeedIndices:new Set};R.add(C),L.push(I),D=y=I[0],A=x=I[1],M=P=I[2];let O=0;for(;O<L.length&&R.size<r;){const[e,t,n]=L[O++];D=Math.min(e,D),A=Math.min(t,A),M=Math.min(n,M),y=Math.max(e,y),x=Math.max(t,x),P=Math.max(n,P);for(let i=0;i<S.length;i++){const[a,o,s]=S[i],l=e+a,g=t+o,v=n+s;if(l<0||l>=d||g<0||g>=c||v<0||v>=h)continue;const p=v*m+g*d+l;if(R.has(p))continue;const f=u[p];f>=_&&f<=T&&(R.add(p),R.size<r&&L.push([l,g,v]))}}if(R.size>=r&&console.debug(`Reached maximum number of positive seeds (${r}). Stopping BFS.`),0===R.size)return console.warn("No positive seeds found after BFS."),{positiveSeedIndices:new Set,negativeSeedIndices:new Set};let k=0,N=0;R.forEach((e=>{const t=u[e];k+=t,N+=t*t}));const V=R.size,W=k/V,B=N/V-W*W,H=f*Math.sqrt(Math.max(0,B)),F=Math.max(0,D-w),G=Math.max(0,A-w),z=Math.max(0,M-w),$=Math.min(d-1,y+w),j=Math.min(c-1,x+w),q=Math.min(h-1,P+w),K=new Set;let Z=0,Y=0;const X=E*o.gN;for(;Y<E&&Z<X;){Z++;const e=Math.floor(Math.random()*($-F+1)+F),t=Math.floor(Math.random()*(j-G+1)+G),n=Math.floor(Math.random()*(q-z+1)+z),i=n*m+t*d+e;if(R.has(i)||K.has(i))continue;const a=u[i];if(Math.abs(a-W)>H){let i=!1;for(let a=-1;a<=1;a++){const o=t+a;if(!(o<0||o>=c))for(let t=-1;t<=1;t++){const a=e+t;if(a<0||a>=d)continue;const s=n*m+o*d+a;R.has(s)||K.has(s)||(K.add(s),i=!0)}}i&&Y++}}return 0===K.size&&console.warn("Could not find any negative seeds. GrowCut might fail or produce poor results."),console.debug("positiveSeedIndices",R.size),console.debug("negativeSeedIndices",K.size),{positiveSeedIndices:R,negativeSeedIndices:K}}async function d({referencedVolumeId:e,worldPosition:t,options:n}){const s=i.cache.getVolume(e),d=i.volumeLoader.createAndCacheDerivedLabelmapVolume(e);d.voxelManager.forEach((({index:e,value:t})=>{0!==t&&d.voxelManager.setAtIndex(e,0)}));const c=n.seeds??l(s,t,n),h=n?.positiveSeedValue??o.VD,g=n?.negativeSeedValue??o.bs;if(!c)return null;const{positiveSeedIndices:u,negativeSeedIndices:m}=c;return u.size<10||u.size>r||m.size<10?(console.warn("Not enough seeds found. GrowCut might fail or produce poor results."),d):(u.forEach((e=>{d.voxelManager.setAtIndex(e,h)})),m.forEach((e=>{d.voxelManager.setAtIndex(e,g)})),await(0,a.e)(e,d.volumeId,n),d)}},93759:(e,t,n)=>{"use strict";n.d(t,{getHoveredContourSegmentationAnnotation:()=>o.L,getOrCreateSegmentationVolume:()=>r.A,getSegmentIndexAtLabelmapBorder:()=>a.T,getSegmentIndexAtWorldPoint:()=>i.hX,growCut:()=>s});n(8582),n(52323),n(4334),n(97492),n(24917),n(84882),n(17014),n(49492),n(68915),n(13179),n(73706),n(13276),n(14514),n(22592),n(35706),n(25758);var i=n(71751),a=n(46507),o=n(20527),s=(n(14957),n(95373)),r=(n(2397),n(67912),n(30722));n(83075),n(38440),n(21345),n(93690),n(6994),n(12853),n(78773),n(88274)},35706:(e,t,n)=>{"use strict";n.d(t,{E:()=>s});var i=n(77609),a=n(58640),o=n(14957);function s(e){const t=(0,i.getToolGroup)(e);if(void 0===t)return;(0,o.n)(e).forEach((e=>{e.invalidateBrushCursor()}));const n=t.getViewportsInfo();if(!Object.keys(n).map((e=>n[e])).length)return;const s=t.getViewportIds();(0,a.A)(s)}},82594:(e,t,n)=>{"use strict";n(15327),n(3823)},27730:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var i=n(52905),a=n(45217);const o=function(e,t,n){let o=!0,s=!0;if("function"!=typeof e)throw new TypeError("Expected a function");return(0,a.A)(n)&&(o="leading"in n?Boolean(n.leading):o,s="trailing"in n?Boolean(n.trailing):s),(0,i.A)(e,t,{leading:o,trailing:s,maxWait:t})}},76260:(e,t,n)=>{"use strict";function i(e,t){const n=l(e),i=l(t);return{page:c(n.page,i.page),client:c(n.client,i.client),canvas:c(n.canvas,i.canvas),world:(a=n.world,o=i.world,[a[0]-o[0],a[1]-o[1],a[2]-o[2]])};var a,o}function a(e,t){const n=l(e),i=l(t);return{page:g(n.page,i.page),client:g(n.client,i.client),canvas:g(n.canvas,i.canvas),world:u(n.world,i.world)}}function o(e,t){const n=h(e),i=h(t);return{page:n.page-i.page,client:n.client-i.client,canvas:n.canvas-i.canvas,world:n.world-i.world}}function s(e){return JSON.parse(JSON.stringify(e))}function r(e){return JSON.parse(JSON.stringify(e))}function l(e){return e.reduce(((t,n)=>({page:[t.page[0]+n.page[0]/e.length,t.page[1]+n.page[1]/e.length],client:[t.client[0]+n.client[0]/e.length,t.client[1]+n.client[1]/e.length],canvas:[t.canvas[0]+n.canvas[0]/e.length,t.canvas[1]+n.canvas[1]/e.length],world:[t.world[0]+n.world[0]/e.length,t.world[1]+n.world[1]/e.length,t.world[2]+n.world[2]/e.length]})),{page:[0,0],client:[0,0],canvas:[0,0],world:[0,0,0]})}function d(e){return e.reduce(((t,n)=>({page:[t.page[0]+n.page[0]/e.length,t.page[1]+n.page[1]/e.length],client:[t.client[0]+n.client[0]/e.length,t.client[1]+n.client[1]/e.length],canvas:[t.canvas[0]+n.canvas[0]/e.length,t.canvas[1]+n.canvas[1]/e.length],world:[t.world[0]+n.world[0]/e.length,t.world[1]+n.world[1]/e.length,t.world[2]+n.world[2]/e.length],touch:{identifier:null,radiusX:t.touch.radiusX+n.touch.radiusX/e.length,radiusY:t.touch.radiusY+n.touch.radiusY/e.length,force:t.touch.force+n.touch.force/e.length,rotationAngle:t.touch.rotationAngle+n.touch.rotationAngle/e.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 c(e,t){return[e[0]-t[0],e[1]-t[1]]}function h(e){const t=[];for(let n=0;n<e.length;n++)for(let i=0;i<e.length;i++)n<i&&t.push({page:g(e[n].page,e[i].page),client:g(e[n].client,e[i].client),canvas:g(e[n].canvas,e[i].canvas),world:u(e[n].world,e[i].world)});return t.reduce(((e,n)=>({page:e.page+n.page/t.length,client:e.client+n.client/t.length,canvas:e.canvas+n.canvas/t.length,world:e.world+n.world/t.length})),{page:0,client:0,canvas:0,world:0})}function g(e,t){return Math.sqrt(Math.pow(e[0]-t[0],2)+Math.pow(e[1]-t[1],2))}function u(e,t){return Math.sqrt(Math.pow(e[0]-t[0],2)+Math.pow(e[1]-t[1],2)+Math.pow(e[2]-t[2],2))}n.d(t,{copyPoints:()=>r,copyPointsList:()=>s,getDeltaDistance:()=>a,getDeltaDistanceBetweenIPoints:()=>o,getDeltaPoints:()=>i,getMeanTouchPoints:()=>d})},94779:(e,t,n)=>{"use strict";n.d(t,{_:()=>s});var i=n(15327),a=n(56069),o=n(77609);function s(e){e.forEach((e=>{const t=(0,o.getToolGroup)(e);if(!t)return void console.warn(`ToolGroup not available for ${e}`);t.getViewportsInfo().forEach((e=>{const{renderingEngineId:t,viewportId:n}=e,o=(0,i.getRenderingEngine)(t);if(!o)return void console.warn(`RenderingEngine not available for ${t}`);const s=o.getViewport(n);(0,a.A)(s.element)}))}))}},58640:(e,t,n)=>{"use strict";n.d(t,{A:()=>s,t:()=>o});var i=n(15327),a=n(56069);function o(e){e.length&&e.forEach((e=>{const t=(0,i.getEnabledElementByViewportId)(e);if(!t)return void console.warn(`Viewport not available for ${e}`);const{viewport:n}=t;if(!n)return void console.warn(`Viewport not available for ${e}`);const o=n.element;(0,a.A)(o)}))}const s=o},60810:(e,t,n)=>{"use strict";n.d(t,{filterViewportsWithToolEnabled:()=>i.A,getViewportIdsWithToolToRender:()=>a.A});n(3198);var i=n(9356),a=n(14543);n(67514)},19027:(e,t,n)=>{"use strict";n.d(t,{isViewportPreScaled:()=>i.u});var i=n(18990)},18990:(e,t,n)=>{"use strict";n.d(t,{u:()=>a});var i=n(15327);function a(e,t){if(e instanceof i.BaseVolumeViewport){const e=i.utilities.getVolumeId(t),n=i.cache.getVolume(e);return!!n?.scaling&&Object.keys(n.scaling).length>0}if(e instanceof i.StackViewport){const{preScale:t}=e.getImageData()||{};return!!t?.scaled}return!1}},20646:(e,t,n)=>{"use strict";var i;n.d(t,{U:()=>i}),function(e){e.Top="top",e.Left="left",e.Bottom="bottom",e.Right="right"}(i||(i={}))},51807:(e,t,n)=>{"use strict";n.d(t,{ColorbarRangeTextPosition:()=>i.U});var i=n(20646)},62612:(e,t,n)=>{"use strict";n.d(t,{Ay:()=>a,kP:()=>i});const i={DEFAULT:0,SINGLE:1,DOUBLE:2};var a={AttributeCopyOperations:{COPYTUPLE:0,INTERPOLATE:1,PASSDATA:2,ALLCOPY:3},AttributeLimitTypes:{MAX:0,EXACT:1,NOLIMIT:2},AttributeTypes:{SCALARS:0,VECTORS:1,NORMALS:2,TCOORDS:3,TENSORS:4,GLOBALIDS:5,PEDIGREEIDS:6,EDGEFLAG:7,NUM_ATTRIBUTES:8},CellGhostTypes:{DUPLICATECELL:1,HIGHCONNECTIVITYCELL:2,LOWCONNECTIVITYCELL:4,REFINEDCELL:8,EXTERIORCELL:16,HIDDENCELL:32},DesiredOutputPrecision:i,PointGhostTypes:{DUPLICATEPOINT:1,HIDDENPOINT:2},ghostArrayName:"vtkGhostType"}},58498:(e,t,n)=>{"use strict";n.d(t,{Ay:()=>u});var i=n(28906),a=n(16632),o=n(21734),s=n(69147),r=n(24964),l=n(85278),d=n(3823);const{vtkErrorMacro:c}=i.m;const h={direction:null,indexToWorld:null,worldToIndex:null,spacing:[1,1,1],origin:[0,0,0],extent:[0,-1,0,-1,0,-1],dataDescription:l.e.EMPTY};function g(e,t){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,h,n),s.Ay.extend(e,t,n),t.direction?Array.isArray(t.direction)&&(t.direction=new Float64Array(t.direction.slice(0,9))):t.direction=d.w0.identity(new Float64Array(9)),t.indexToWorld=new Float64Array(16),t.worldToIndex=new Float64Array(16),i.m.get(e,t,["indexToWorld","worldToIndex"]),i.m.setGetArray(e,t,["origin","spacing"],3),i.m.setGetArray(e,t,["direction"],9),i.m.getArray(e,t,["extent"],6),function(e,t){t.classHierarchy.push("vtkImageData"),e.setExtent=function(){if(t.deleted)return c("instance deleted - cannot call any method"),!1;for(var n=arguments.length,i=new Array(n),a=0;a<n;a++)i[a]=arguments[a];const o=1===i.length?i[0]:i;if(6!==o.length)return!1;const s=t.extent.some(((e,t)=>e!==o[t]));return s&&(t.extent=o.slice(),t.dataDescription=r.A.getDataDescriptionFromExtent(t.extent),e.modified()),s},e.setDimensions=function(){let n,i,a;if(t.deleted)c("instance deleted - cannot call any method");else{if(1===arguments.length){const e=arguments.length<=0?void 0:arguments[0];n=e[0],i=e[1],a=e[2]}else{if(3!==arguments.length)return void c("Bad dimension specification");n=arguments.length<=0?void 0:arguments[0],i=arguments.length<=1?void 0:arguments[1],a=arguments.length<=2?void 0:arguments[2]}e.setExtent(0,n-1,0,i-1,0,a-1)}},e.getDimensions=()=>[t.extent[1]-t.extent[0]+1,t.extent[3]-t.extent[2]+1,t.extent[5]-t.extent[4]+1],e.getNumberOfCells=()=>{const t=e.getDimensions();let n=1;for(let e=0;e<3;e++){if(0===t[e])return 0;t[e]>1&&(n*=t[e]-1)}return n},e.getNumberOfPoints=()=>{const t=e.getDimensions();return t[0]*t[1]*t[2]},e.getPoint=n=>{const i=e.getDimensions();if(0===i[0]||0===i[1]||0===i[2])return c("Requesting a point from an empty image."),null;const a=new Float64Array(3);switch(t.dataDescription){case l.e.EMPTY:return null;case l.e.SINGLE_POINT:break;case l.e.X_LINE:a[0]=n;break;case l.e.Y_LINE:a[1]=n;break;case l.e.Z_LINE:a[2]=n;break;case l.e.XY_PLANE:a[0]=n%i[0],a[1]=n/i[0];break;case l.e.YZ_PLANE:a[1]=n%i[1],a[2]=n/i[1];break;case l.e.XZ_PLANE:a[0]=n%i[0],a[2]=n/i[0];break;case l.e.XYZ_GRID:a[0]=n%i[0],a[1]=n/i[0]%i[1],a[2]=n/(i[0]*i[1]);break;default:c("Invalid dataDescription")}const o=[0,0,0];return e.indexToWorld(a,o),o},e.getBounds=()=>e.extentToBounds(e.getSpatialExtent()),e.extentToBounds=e=>o.Ay.transformBounds(e,t.indexToWorld),e.getSpatialExtent=()=>o.Ay.inflate([...t.extent],.5),e.computeTransforms=()=>{d.pB.fromTranslation(t.indexToWorld,t.origin),t.indexToWorld[0]=t.direction[0],t.indexToWorld[1]=t.direction[1],t.indexToWorld[2]=t.direction[2],t.indexToWorld[4]=t.direction[3],t.indexToWorld[5]=t.direction[4],t.indexToWorld[6]=t.direction[5],t.indexToWorld[8]=t.direction[6],t.indexToWorld[9]=t.direction[7],t.indexToWorld[10]=t.direction[8],d.pB.scale(t.indexToWorld,t.indexToWorld,t.spacing),d.pB.invert(t.worldToIndex,t.indexToWorld)},e.indexToWorld=function(e){let n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];return d.eR.transformMat4(n,e,t.indexToWorld),n},e.indexToWorldVec3=e.indexToWorld,e.worldToIndex=function(e){let n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];return d.eR.transformMat4(n,e,t.worldToIndex),n},e.worldToIndexVec3=e.worldToIndex,e.indexToWorldBounds=function(e){let n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];return o.Ay.transformBounds(e,t.indexToWorld,n)},e.worldToIndexBounds=function(e){let n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];return o.Ay.transformBounds(e,t.worldToIndex,n)},e.onModified(e.computeTransforms),e.computeTransforms(),e.getCenter=()=>o.Ay.getCenter(e.getBounds()),e.computeHistogram=function(t){let n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;const i=[0,0,0,0,0,0];e.worldToIndexBounds(t,i);const s=[0,0,0],r=[0,0,0];o.Ay.computeCornerPoints(i,s,r),(0,a.b)(s,s),(0,a.b)(r,r);const l=e.getDimensions();(0,a.c)(s,[0,0,0],[l[0]-1,l[1]-1,l[2]-1],s),(0,a.c)(r,[0,0,0],[l[0]-1,l[1]-1,l[2]-1],r);const d=l[0],c=l[0]*l[1],h=e.getPointData().getScalars().getData();let g=-1/0,u=1/0,m=0,v=0,p=0;for(let e=s[2];e<=r[2];e++)for(let t=s[1];t<=r[1];t++){let a=s[0]+t*d+e*c;for(let o=s[0];o<=r[0];o++){if(!n||n([o,t,e],i)){const e=h[a];e>g&&(g=e),e<u&&(u=e),m+=e*e,v+=e,p+=1}++a}}const f=p>0?v/p:0,w=p?Math.abs(m/p-f*f):0;return{minimum:u,maximum:g,average:f,variance:w,sigma:Math.sqrt(w),count:p}},e.computeIncrements=function(e){const t=[];let n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1;for(let i=0;i<3;++i)t[i]=n,n*=e[2*i+1]-e[2*i]+1;return t},e.computeOffsetIndex=t=>{let[n,i,a]=t;const o=e.getExtent(),s=e.getPointData().getScalars().getNumberOfComponents(),r=e.computeIncrements(o,s);return Math.floor((Math.round(n)-o[0])*r[0]+(Math.round(i)-o[2])*r[1]+(Math.round(a)-o[4])*r[2])},e.getOffsetIndexFromWorld=t=>{const n=e.getExtent(),i=e.worldToIndex(t);for(let e=0;e<3;++e)if(i[e]<n[2*e]||i[e]>n[2*e+1])return c(`GetScalarPointer: Pixel ${i} is not in memory. Current extent = ${n}`),NaN;return e.computeOffsetIndex(i)},e.getScalarValueFromWorld=function(t){let n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;const i=e.getPointData().getScalars().getNumberOfComponents();if(n<0||n>=i)return c(`GetScalarPointer: Scalar Component ${n} is not within bounds. Current Scalar numberOfComponents: ${i}`),NaN;const a=e.getOffsetIndexFromWorld(t);return Number.isNaN(a)?a:e.getPointData().getScalars().getComponent(a,n)}}(e,t)}var u={newInstance:i.m.newInstance(g,"vtkImageData"),extend:g}},9175:(e,t,n)=>{"use strict";n.r(t),n.d(t,{add:()=>c,angle:()=>W,bezier:()=>P,ceil:()=>m,clone:()=>o,copy:()=>l,create:()=>a,cross:()=>M,dist:()=>K,distance:()=>C,div:()=>q,divide:()=>u,dot:()=>A,equals:()=>G,exactEquals:()=>F,floor:()=>v,forEach:()=>J,fromValues:()=>r,hermite:()=>x,inverse:()=>S,len:()=>Y,length:()=>s,lerp:()=>y,max:()=>f,min:()=>p,mul:()=>j,multiply:()=>g,negate:()=>T,normalize:()=>D,random:()=>R,rotateX:()=>k,rotateY:()=>N,rotateZ:()=>V,round:()=>w,scale:()=>E,scaleAndAdd:()=>I,set:()=>d,sqrDist:()=>Z,sqrLen:()=>X,squaredDistance:()=>b,squaredLength:()=>_,str:()=>H,sub:()=>$,subtract:()=>h,transformMat3:()=>U,transformMat4:()=>L,transformQuat:()=>O,zero:()=>B});var i=n(24457);function a(){var e=new i.ARRAY_TYPE(3);return i.ARRAY_TYPE!=Float32Array&&(e[0]=0,e[1]=0,e[2]=0),e}function o(e){var t=new i.ARRAY_TYPE(3);return t[0]=e[0],t[1]=e[1],t[2]=e[2],t}function s(e){var t=e[0],n=e[1],i=e[2];return Math.hypot(t,n,i)}function r(e,t,n){var a=new i.ARRAY_TYPE(3);return a[0]=e,a[1]=t,a[2]=n,a}function l(e,t){return e[0]=t[0],e[1]=t[1],e[2]=t[2],e}function d(e,t,n,i){return e[0]=t,e[1]=n,e[2]=i,e}function c(e,t,n){return e[0]=t[0]+n[0],e[1]=t[1]+n[1],e[2]=t[2]+n[2],e}function h(e,t,n){return e[0]=t[0]-n[0],e[1]=t[1]-n[1],e[2]=t[2]-n[2],e}function g(e,t,n){return e[0]=t[0]*n[0],e[1]=t[1]*n[1],e[2]=t[2]*n[2],e}function u(e,t,n){return e[0]=t[0]/n[0],e[1]=t[1]/n[1],e[2]=t[2]/n[2],e}function m(e,t){return e[0]=Math.ceil(t[0]),e[1]=Math.ceil(t[1]),e[2]=Math.ceil(t[2]),e}function v(e,t){return e[0]=Math.floor(t[0]),e[1]=Math.floor(t[1]),e[2]=Math.floor(t[2]),e}function p(e,t,n){return e[0]=Math.min(t[0],n[0]),e[1]=Math.min(t[1],n[1]),e[2]=Math.min(t[2],n[2]),e}function f(e,t,n){return e[0]=Math.max(t[0],n[0]),e[1]=Math.max(t[1],n[1]),e[2]=Math.max(t[2],n[2]),e}function w(e,t){return e[0]=Math.round(t[0]),e[1]=Math.round(t[1]),e[2]=Math.round(t[2]),e}function E(e,t,n){return e[0]=t[0]*n,e[1]=t[1]*n,e[2]=t[2]*n,e}function I(e,t,n,i){return e[0]=t[0]+n[0]*i,e[1]=t[1]+n[1]*i,e[2]=t[2]+n[2]*i,e}function C(e,t){var n=t[0]-e[0],i=t[1]-e[1],a=t[2]-e[2];return Math.hypot(n,i,a)}function b(e,t){var n=t[0]-e[0],i=t[1]-e[1],a=t[2]-e[2];return n*n+i*i+a*a}function _(e){var t=e[0],n=e[1],i=e[2];return t*t+n*n+i*i}function T(e,t){return e[0]=-t[0],e[1]=-t[1],e[2]=-t[2],e}function S(e,t){return e[0]=1/t[0],e[1]=1/t[1],e[2]=1/t[2],e}function D(e,t){var n=t[0],i=t[1],a=t[2],o=n*n+i*i+a*a;return o>0&&(o=1/Math.sqrt(o)),e[0]=t[0]*o,e[1]=t[1]*o,e[2]=t[2]*o,e}function A(e,t){return e[0]*t[0]+e[1]*t[1]+e[2]*t[2]}function M(e,t,n){var i=t[0],a=t[1],o=t[2],s=n[0],r=n[1],l=n[2];return e[0]=a*l-o*r,e[1]=o*s-i*l,e[2]=i*r-a*s,e}function y(e,t,n,i){var a=t[0],o=t[1],s=t[2];return e[0]=a+i*(n[0]-a),e[1]=o+i*(n[1]-o),e[2]=s+i*(n[2]-s),e}function x(e,t,n,i,a,o){var s=o*o,r=s*(2*o-3)+1,l=s*(o-2)+o,d=s*(o-1),c=s*(3-2*o);return e[0]=t[0]*r+n[0]*l+i[0]*d+a[0]*c,e[1]=t[1]*r+n[1]*l+i[1]*d+a[1]*c,e[2]=t[2]*r+n[2]*l+i[2]*d+a[2]*c,e}function P(e,t,n,i,a,o){var s=1-o,r=s*s,l=o*o,d=r*s,c=3*o*r,h=3*l*s,g=l*o;return e[0]=t[0]*d+n[0]*c+i[0]*h+a[0]*g,e[1]=t[1]*d+n[1]*c+i[1]*h+a[1]*g,e[2]=t[2]*d+n[2]*c+i[2]*h+a[2]*g,e}function R(e,t){t=t||1;var n=2*i.RANDOM()*Math.PI,a=2*i.RANDOM()-1,o=Math.sqrt(1-a*a)*t;return e[0]=Math.cos(n)*o,e[1]=Math.sin(n)*o,e[2]=a*t,e}function L(e,t,n){var i=t[0],a=t[1],o=t[2],s=n[3]*i+n[7]*a+n[11]*o+n[15];return s=s||1,e[0]=(n[0]*i+n[4]*a+n[8]*o+n[12])/s,e[1]=(n[1]*i+n[5]*a+n[9]*o+n[13])/s,e[2]=(n[2]*i+n[6]*a+n[10]*o+n[14])/s,e}function U(e,t,n){var i=t[0],a=t[1],o=t[2];return e[0]=i*n[0]+a*n[3]+o*n[6],e[1]=i*n[1]+a*n[4]+o*n[7],e[2]=i*n[2]+a*n[5]+o*n[8],e}function O(e,t,n){var i=n[0],a=n[1],o=n[2],s=n[3],r=t[0],l=t[1],d=t[2],c=a*d-o*l,h=o*r-i*d,g=i*l-a*r,u=a*g-o*h,m=o*c-i*g,v=i*h-a*c,p=2*s;return c*=p,h*=p,g*=p,u*=2,m*=2,v*=2,e[0]=r+c+u,e[1]=l+h+m,e[2]=d+g+v,e}function k(e,t,n,i){var a=[],o=[];return a[0]=t[0]-n[0],a[1]=t[1]-n[1],a[2]=t[2]-n[2],o[0]=a[0],o[1]=a[1]*Math.cos(i)-a[2]*Math.sin(i),o[2]=a[1]*Math.sin(i)+a[2]*Math.cos(i),e[0]=o[0]+n[0],e[1]=o[1]+n[1],e[2]=o[2]+n[2],e}function N(e,t,n,i){var a=[],o=[];return a[0]=t[0]-n[0],a[1]=t[1]-n[1],a[2]=t[2]-n[2],o[0]=a[2]*Math.sin(i)+a[0]*Math.cos(i),o[1]=a[1],o[2]=a[2]*Math.cos(i)-a[0]*Math.sin(i),e[0]=o[0]+n[0],e[1]=o[1]+n[1],e[2]=o[2]+n[2],e}function V(e,t,n,i){var a=[],o=[];return a[0]=t[0]-n[0],a[1]=t[1]-n[1],a[2]=t[2]-n[2],o[0]=a[0]*Math.cos(i)-a[1]*Math.sin(i),o[1]=a[0]*Math.sin(i)+a[1]*Math.cos(i),o[2]=a[2],e[0]=o[0]+n[0],e[1]=o[1]+n[1],e[2]=o[2]+n[2],e}function W(e,t){var n=e[0],i=e[1],a=e[2],o=t[0],s=t[1],r=t[2],l=Math.sqrt(n*n+i*i+a*a)*Math.sqrt(o*o+s*s+r*r),d=l&&A(e,t)/l;return Math.acos(Math.min(Math.max(d,-1),1))}function B(e){return e[0]=0,e[1]=0,e[2]=0,e}function H(e){return"vec3("+e[0]+", "+e[1]+", "+e[2]+")"}function F(e,t){return e[0]===t[0]&&e[1]===t[1]&&e[2]===t[2]}function G(e,t){var n=e[0],a=e[1],o=e[2],s=t[0],r=t[1],l=t[2];return Math.abs(n-s)<=i.EPSILON*Math.max(1,Math.abs(n),Math.abs(s))&&Math.abs(a-r)<=i.EPSILON*Math.max(1,Math.abs(a),Math.abs(r))&&Math.abs(o-l)<=i.EPSILON*Math.max(1,Math.abs(o),Math.abs(l))}var z,$=h,j=g,q=u,K=C,Z=b,Y=s,X=_,J=(z=a(),function(e,t,n,i,a,o){var s,r;for(t||(t=3),n||(n=0),r=i?Math.min(i*t+n,e.length):e.length,s=n;s<r;s+=t)z[0]=e[s],z[1]=e[s+1],z[2]=e[s+2],a(z,z,o),e[s]=z[0],e[s+1]=z[1],e[s+2]=z[2];return e})},44779:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});var i=n(43183);function a(){return(0,i.A)(arguments)}},20919:(e,t,n)=>{"use strict";function i(e,t){for(var n=new Array(t),i=0;i<t;++i)n[i]=e(i/(t-1));return n}n.d(t,{A:()=>i})}}]);
//# sourceMappingURL=6066.bundle.2c3c31d4fa72546c9efd.js.map