@ohif/extension-cornerstone-dicom-sr 3.9.0-beta.64 → 3.9.0-beta.65

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,2 +1,2 @@
1
1
  /*! For license information please see ohif-extension-cornerstone-dicom-sr.umd.js.LICENSE.txt */
2
- !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("@ohif/core"),require("gl-matrix"),require("@cornerstonejs/tools"),require("@cornerstonejs/core"),require("@cornerstonejs/adapters"),require("dcmjs"),require("@ohif/ui")):"function"==typeof define&&define.amd?define(["@ohif/core","gl-matrix","@cornerstonejs/tools","@cornerstonejs/core","@cornerstonejs/adapters","dcmjs","@ohif/ui"],t):"object"==typeof exports?exports["ohif-extension-cornerstone-dicom-sr"]=t(require("@ohif/core"),require("gl-matrix"),require("@cornerstonejs/tools"),require("@cornerstonejs/core"),require("@cornerstonejs/adapters"),require("dcmjs"),require("@ohif/ui")):e["ohif-extension-cornerstone-dicom-sr"]=t(e["@ohif/core"],e["gl-matrix"],e["@cornerstonejs/tools"],e["@cornerstonejs/core"],e["@cornerstonejs/adapters"],e.dcmjs,e["@ohif/ui"])}(globalThis,((e,t,n,r,o,a,i)=>(()=>{var s,c,l={873:(e,t,n)=>{"use strict";n.d(t,{Z:()=>s});var r=n(762);const o=r.classes.ImageSet,a=(e,t)=>{const{displaySetInstanceUID:n,ReferencedSOPInstanceUID:r}=e,o=t.getDisplaySetByUID(n);if(o.images)return o.images.find((e=>e.SOPInstanceUID===r))},i=(e,t)=>{const n=[],r={};for(const o of t.measurements){const{imageId:t}=o;if(!t)continue;if(r[t])continue;const i=a(o,e);i?(r[t]=i,n.push(i)):console.log("Measurement",o,"had no instances found")}return n},s=(e,t)=>{const n=i(e,t),r=new o(n),a=n[0];return r.setAttributes({displaySetInstanceUID:r.uid,SeriesDate:a.SeriesDate,SeriesTime:a.SeriesTime,SeriesInstanceUID:r.uid,StudyInstanceUID:a.StudyInstanceUID,SeriesNumber:a.SeriesNumber||0,SOPClassUID:a.SOPClassUID,SeriesDescription:`${t.SeriesDescription} KO ${t.instance.SeriesNumber}`,Modality:"KO",isMultiFrame:!1,numImageFrames:n.length,SOPClassHandlerId:"@ohif/extension-default.sopClassHandlerModule.stack",isReconstructable:!1,isCompositeStack:!0,madeInClient:!0,excludeFromThumbnailBrowser:!0,updateInstances:function(){this.images.splice(0,this.images.length,...i(e,t)),this.numImageFrames=this.images.length}}),e.addDisplaySets(r),r}},759:(e,t,n)=>{"use strict";n.d(t,{Z:()=>y});var r=n(464),o=n(762),a=n.n(o);var i=n(32),s=n(867);const{locking:c}=s.annotation,{guid:l}=a().utils,{MeasurementReport:u,CORNERSTONE_3D_TAG:d}=i.adaptersSR.Cornerstone3D,f="Cornerstone3DTools",p="0.1",m=["cornerstoneTools@^4.0.0"],g=(e,t)=>{if(!t||"CORNERSTONEJS"===t.CodingSchemeDesignator)return;const n=`${t.CodingSchemeDesignator}:${t.CodeValue}`;return{...e[n],ref:n,...t,text:t.CodeMeaning}},S=(e,t)=>{if(!t||!t.length)return;const n=[];for(let r=0;r<t.length;r++){const o=g(e,t[r][0]||t[r]);o&&n.push(o)}return n.length&&n||void 0};function y({servicesManager:e,extensionManager:t,appConfig:n},a){const i=s.annotation.state.getAnnotationManager(),y=n?.disableEditing,v=t.getActiveDataSource()[0],{measurementService:b,displaySetService:C,customizationService:R}=e.services,O=R.getCustomization("codingValues",{}),E=C.getDisplaySetByUID(a),D=b.getSourceMappings(f,p);if(!D||!D.length)throw new Error("Attempting to hydrate measurements service when no mappings present. This shouldn't be reached.");const T=o.DicomMetadataStore.getInstance(E.StudyInstanceUID,E.SeriesInstanceUID,E.SOPInstanceUID),w={},U={};E.measurements.forEach((e=>{const{ReferencedSOPInstanceUID:t,imageId:n,frameNumber:r}=e;w[t]||(w[t]=n,U[t]=[]),U[t][r]||(U[t][r]=n)}));const N=function(e){const t="Imaging Measurements",n="Measurement Group",r="Tracking Identifier",o=h(e.ContentSequence).find(I(t)),a=h(o.ContentSequence).filter(I(n)),i={},s=u.CORNERSTONE_TOOL_CLASSES_BY_UTILITY_TYPE,c=[];return Object.keys(s).forEach((e=>{c.push(s[e]),i[e]=[]})),a.forEach(((e,t)=>{const n=h(e.ContentSequence).find((e=>e.ConceptNameCodeSequence.CodeMeaning===r)),o=n.TextValue;let[a,i]=o.split(":");m.includes(a)&&(a=d);const s=`${a}:${i}`;n.TextValue=s})),e}(T);let M=u.generateToolState(N,w,r.utilities.imageToWorldCoords,r.metaData);const P=R.getModeCustomization("onBeforeSRHydration")?.value;"function"==typeof P&&(M=P({storedMeasurementByAnnotationType:M,displaySet:E}));const x=D.map((e=>e.annotationType)),k={};Object.keys(M).forEach((e=>{x.includes(e)&&(k[e]=M[e])}));const A=[];let q;Object.keys(k).forEach((e=>{k[e].forEach((e=>{const t=e.annotation.data&&e.annotation.data.frameNumber||1,n=U[e.sopInstanceUid][t]||w[e.sopInstanceUid];A.includes(n)||A.push(n)}))}));const L=[];for(let e=0;e<A.length;e++){const t=A[e],{SeriesInstanceUID:n,StudyInstanceUID:o}=r.metaData.get("instance",t);L.includes(n)||L.push(n),q?q!==o&&console.warn("NO SUPPORT FOR SRs THAT HAVE MEASUREMENTS FROM MULTIPLE STUDIES."):q=o}return Object.keys(k).forEach((e=>{k[e].forEach((t=>{const n=t.annotation.data&&t.annotation.data.frameNumber||1,o=U[t.sopInstanceUid][n]||w[t.sopInstanceUid];t.uid=l();const a=r.metaData.get("instance",o),{FrameOfReferenceUID:s}=a,u={annotationUID:t.annotation.annotationUID,data:t.annotation.data,metadata:{toolName:e,referencedImageId:o,FrameOfReferenceUID:s}},d=b.getSource(f,p);u.data.label=function(e){const{findingSites:t=[],finding:n}=e;let r=t.find((e=>"CORNERSTONEFREETEXT"===e.CodeValue));return r?r.CodeMeaning:n&&"CORNERSTONEFREETEXT"===n.CodeValue?n.CodeMeaning:void 0}(t),u.data.finding=g(O,t.finding?.[0]),u.data.findingSites=S(O,t.findingSites),u.data.site=u.data.findingSites?.[0];const m=D.find((t=>t.annotationType===e)),h=b.addRawMeasurement(d,e,{annotation:u},m.toMeasurementSchema,v);if(y){const e=i.getAnnotation(h);c.setAnnotationLocked(e,!0)}A.includes(o)||A.push(o)}))})),E.isHydrated=!0,{StudyInstanceUID:q,SeriesInstanceUIDs:L}}const h=function(e){return Array.isArray(e)?e:[e]},I=e=>t=>t.ConceptNameCodeSequence.CodeMeaning===e},311:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>V});var r=n(827),o=n.n(r),a=n(1);n(165);Object.create(null);function i(){if(console&&console.warn){for(var e,t=arguments.length,n=new Array(t),r=0;r<t;r++)n[r]=arguments[r];"string"==typeof n[0]&&(n[0]="react-i18next:: ".concat(n[0])),(e=console).warn.apply(e,n)}}var s={};function c(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];"string"==typeof t[0]&&s[t[0]]||("string"==typeof t[0]&&(s[t[0]]=new Date),i.apply(void 0,t))}var l=function(e,t){return function(){if(e.isInitialized)t();else{e.on("initialized",(function n(){setTimeout((function(){e.off("initialized",n)}),0),t()}))}}};function u(e,t,n){e.loadNamespaces(t,l(e,n))}function d(e,t,n,r){"string"==typeof n&&(n=[n]),n.forEach((function(t){e.options.ns.indexOf(t)<0&&e.options.ns.push(t)})),e.loadLanguages(t,l(e,r))}function f(e){return f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},f(e)}function p(e){var t=function(e,t){if("object"!=f(e)||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,t||"default");if("object"!=f(r))return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==f(t)?t:t+""}function m(e,t,n){return(t=p(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var g=/&(?:amp|#38|lt|#60|gt|#62|apos|#39|quot|#34|nbsp|#160|copy|#169|reg|#174|hellip|#8230|#x2F|#47);/g,S={"&amp;":"&","&#38;":"&","&lt;":"<","&#60;":"<","&gt;":">","&#62;":">","&apos;":"'","&#39;":"'","&quot;":'"',"&#34;":'"',"&nbsp;":" ","&#160;":" ","&copy;":"©","&#169;":"©","&reg;":"®","&#174;":"®","&hellip;":"…","&#8230;":"…","&#x2F;":"/","&#47;":"/"},y=function(e){return S[e]};var h={bindI18n:"languageChanged",bindI18nStore:"",transEmptyNodeValue:"",transSupportBasicHtmlNodes:!0,transWrapTextNodes:"",transKeepBasicHtmlNodesFor:["br","strong","i","p"],useSuspense:!0,unescape:function(e){return e.replace(g,y)}};var I;function v(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,p(r.key),r)}}var b=(0,a.createContext)(),C=function(){function e(){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this.usedNamespaces={}}return function(e,t,n){t&&v(e.prototype,t),n&&v(e,n),Object.defineProperty(e,"prototype",{writable:!1})}(e,[{key:"addUsedNamespaces",value:function(e){var t=this;e.forEach((function(e){t.usedNamespaces[e]||(t.usedNamespaces[e]=!0)}))}},{key:"getUsedNamespaces",value:function(){return Object.keys(this.usedNamespaces)}}]),e}();function R(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function O(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,o,a,i,s=[],c=!0,l=!1;try{if(a=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;c=!1}else for(;!(c=(r=a.call(n)).done)&&(s.push(r.value),s.length!==t);c=!0);}catch(e){l=!0,o=e}finally{try{if(!c&&null!=n.return&&(i=n.return(),Object(i)!==i))return}finally{if(l)throw o}}return s}}(e,t)||function(e,t){if(e){if("string"==typeof e)return R(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?R(e,t):void 0}}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function E(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function D(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?E(Object(n),!0).forEach((function(t){m(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):E(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}var T=function(e,t){var n=(0,a.useRef)();return(0,a.useEffect)((function(){n.current=t?n.current:e}),[e,t]),n.current};function w(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.i18n,r=(0,a.useContext)(b)||{},o=r.i18n,i=r.defaultNS,s=n||o||I;if(s&&!s.reportNamespaces&&(s.reportNamespaces=new C),!s){c("You will need to pass in an i18next instance by using initReactI18next");var l=function(e,t){return"string"==typeof t?t:t&&"object"===f(t)&&"string"==typeof t.defaultValue?t.defaultValue:Array.isArray(e)?e[e.length-1]:e},p=[l,{},!1];return p.t=l,p.i18n={},p.ready=!1,p}s.options.react&&void 0!==s.options.react.wait&&c("It seems you are still using the old wait option, you may migrate to the new useSuspense behaviour.");var m=D(D(D({},h),s.options.react),t),g=m.useSuspense,S=m.keyPrefix,y=e||i||s.options&&s.options.defaultNS;y="string"==typeof y?[y]:y||["translation"],s.reportNamespaces.addUsedNamespaces&&s.reportNamespaces.addUsedNamespaces(y);var v=(s.isInitialized||s.initializedStoreOnce)&&y.every((function(e){return function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return t.languages&&t.languages.length?void 0!==t.options.ignoreJSONStructure?t.hasLoadedNamespace(e,{lng:n.lng,precheck:function(t,r){if(n.bindI18n&&n.bindI18n.indexOf("languageChanging")>-1&&t.services.backendConnector.backend&&t.isLanguageChangingTo&&!r(t.isLanguageChangingTo,e))return!1}}):function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=t.languages[0],o=!!t.options&&t.options.fallbackLng,a=t.languages[t.languages.length-1];if("cimode"===r.toLowerCase())return!0;var i=function(e,n){var r=t.services.backendConnector.state["".concat(e,"|").concat(n)];return-1===r||2===r};return!(n.bindI18n&&n.bindI18n.indexOf("languageChanging")>-1&&t.services.backendConnector.backend&&t.isLanguageChangingTo&&!i(t.isLanguageChangingTo,e)||!t.hasResourceBundle(r,e)&&t.services.backendConnector.backend&&(!t.options.resources||t.options.partialBundledLanguages)&&(!i(r,e)||o&&!i(a,e)))}(e,t,n):(c("i18n.languages were undefined or empty",t.languages),!0)}(e,s,m)}));function R(){return s.getFixedT(t.lng||null,"fallback"===m.nsMode?y:y[0],S)}var E=O((0,a.useState)(R),2),w=E[0],U=E[1],N=y.join();t.lng&&(N="".concat(t.lng).concat(N));var M=T(N),P=(0,a.useRef)(!0);(0,a.useEffect)((function(){var e=m.bindI18n,n=m.bindI18nStore;function r(){P.current&&U(R)}return P.current=!0,v||g||(t.lng?d(s,t.lng,y,(function(){P.current&&U(R)})):u(s,y,(function(){P.current&&U(R)}))),v&&M&&M!==N&&P.current&&U(R),e&&s&&s.on(e,r),n&&s&&s.store.on(n,r),function(){P.current=!1,e&&s&&e.split(" ").forEach((function(e){return s.off(e,r)})),n&&s&&n.split(" ").forEach((function(e){return s.store.off(e,r)}))}}),[s,N]);var x=(0,a.useRef)(!0);(0,a.useEffect)((function(){P.current&&!x.current&&U(R),x.current=!1}),[s,S]);var k=[w,s,v];if(k.t=w,k.i18n=s,k.ready=v,v)return k;if(!v&&!g)return k;throw new Promise((function(e){t.lng?d(s,t.lng,y,(function(){return e()})):u(s,y,(function(){return e()}))}))}var U=n(762),N=n(726),M=n(369),P=n(759);const x=(0,a.createContext)(null),{Provider:k}=x;function A({children:e,value:t}){const[n,r]=(0,a.useState)(t);return a.createElement(k,{value:[n]},e)}A.propTypes={children:o().any,value:o().any};var q=n(873);function L(){return L=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)({}).hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},L.apply(null,arguments)}function j(e){const{children:t,dataSource:n,displaySets:r,viewportOptions:o,servicesManager:i,extensionManager:s}=e,[c]=(0,a.useContext)(x),{displaySetService:l,cornerstoneViewportService:u,measurementService:d,viewportActionCornersService:f}=i.services,p=o.viewportId;if(r.length>1)throw new Error("SR viewport should only have a single display set");const m=r[0],[g,S]=(0,M.useViewportGrid)(),[y,h]=(0,a.useState)(0),[I,v]=(0,a.useState)(1),[b,C]=(0,a.useState)(null),[R,O]=(0,a.useState)(null),[E,D]=(0,a.useState)(null),{viewports:T,activeViewportId:U}=g,{t:k}=w("Common");let A,j;if(s.registeredExtensionIds.includes("@ohif/extension-measurement-tracking")){const e=s.getModuleEntry("@ohif/extension-measurement-tracking.contextModule.TrackedMeasurementsContext"),t=(0,a.useContext)(e.context);A=t?.[0],j=t?.[1]}j||(A=null,j=(e,{displaySetInstanceUID:t})=>{d.clearMeasurements();const{SeriesInstanceUIDs:n}=(0,P.Z)({servicesManager:i,extensionManager:s,appConfig:c},t),r=l.getDisplaySetsForSeries(n[0]);r.length&&S.setDisplaySetsForViewports([{viewportId:U,displaySetInstanceUIDs:[r[0].displaySetInstanceUID]}])});const V=(0,a.useCallback)((e=>{const{measurements:t}=m;(0,N.l2)(E,t.map((e=>e.TrackingUniqueIdentifier)),e)}),[E,y,m]),F=(0,a.useCallback)((e=>{const{StudyInstanceUID:t,displaySetInstanceUID:n,sopClassUids:r}=m;t&&n&&(r&&r.length>1&&console.warn("More than one SOPClassUID in the same series is not yet supported."),async function(e,t,n){const{measurements:r}=e,o=r[t],{displaySetInstanceUID:a}=o;e.keyImageDisplaySet||(e.keyImageDisplaySet=(0,q.Z)(n,e));const i=n.getDisplaySetByUID(a),s=i.images[0],c={PatientID:s.PatientID,PatientName:s.PatientName,PatientSex:s.PatientSex,PatientAge:s.PatientAge,SliceThickness:s.SliceThickness,StudyDate:s.StudyDate,SeriesDescription:s.SeriesDescription,SeriesInstanceUID:s.SeriesInstanceUID,SeriesNumber:s.SeriesNumber,ManufacturerModelName:s.ManufacturerModelName,SpacingBetweenSlices:s.SpacingBetweenSlices};return{referencedDisplaySetMetadata:c,referencedDisplaySet:i}}(m,e,l).then((({referencedDisplaySet:t,referencedDisplaySetMetadata:n})=>{if(h(e),C(t),O(n),t.displaySetInstanceUID===b?.displaySetInstanceUID){const{measurements:t}=m,n=u.getCornerstoneViewport(p),r=n.getImageIds().indexOf(t[e].imageId);-1!==r&&n.setImageIdIndex(r)}})))}),[n,m,b,p]),$=(0,a.useCallback)((()=>{if(!b)return null;const{component:t}=s.getModuleEntry("@ohif/extension-cornerstone.viewportModule.cornerstone"),{measurements:n}=m,r=n[y];if(!r)return null;const i=b.images.findIndex((e=>e.imageId===r.imageId));return a.createElement(t,L({},e,{displaySets:[b],viewportOptions:{...o,toolGroupId:"SRToolGroup",viewportType:"stack",positionIds:null},onElementEnabled:t=>{e.onElementEnabled?.(t),(e=>{D(e.detail.element)})(t)},initialImageIndex:i,isJumpToMeasurementDisabled:!0}))}),[b,p,y]),B=(0,a.useCallback)((e=>{let t=y;t+=e,t>=I?t=0:t<0&&(t=I-1),V(t),F(t)}),[y,I,F,V]);(0,a.useEffect)((()=>{const e=l.subscribe(l.EVENTS.DISPLAY_SETS_REMOVED,(({displaySetInstanceUIDs:e})=>{const t=T.get(U);e.includes(t.displaySetInstanceUID)&&S.setDisplaySetsForViewport({viewportId:U,displaySetInstanceUIDs:[]})}));return()=>{e.unsubscribe()}}),[]),(0,a.useEffect)((()=>{(async()=>{m.isLoaded||await m.load();const e=m.measurements.length;v(e),F(y)})()}),[m]),(0,a.useEffect)((()=>{(async()=>{m.isLoaded||await m.load(),E&&m.isLoaded&&V(y)})()}),[y,E,V,m]);const[G,H]=(0,a.useState)(A?.context?.trackedSeries?.length>0);(0,a.useEffect)((()=>{H(A?.context?.trackedSeries?.length>0)}),[A]),(0,a.useEffect)((()=>{f.setComponents([{viewportId:p,id:"viewportStatusComponent",component:_({srDisplaySet:m,viewportId:p,isRehydratable:m.isRehydratable,isLocked:G,sendTrackedMeasurementsEvent:j,t:k}),indexPriority:-100,location:f.LOCATIONS.topLeft},{viewportId:p,id:"viewportActionArrowsComponent",index:0,component:a.createElement(M.ViewportActionArrows,{key:"actionArrows",onArrowsClick:B}),indexPriority:0,location:f.LOCATIONS.topRight}])}),[G,B,j,m,k,f,p]);let W=null;return b&&R?(t&&t.length&&(W=t.map(((e,t)=>e&&a.cloneElement(e,{viewportId:p,key:t})))),a.createElement(a.Fragment,null,a.createElement("div",{className:"relative flex h-full w-full flex-row overflow-hidden"},$(),W))):null}function _({srDisplaySet:e,viewportId:t,isRehydratable:n,isLocked:r,sendTrackedMeasurementsEvent:o,t:i}){const s=()=>{o("HYDRATE_SR",{displaySetInstanceUID:e.displaySetInstanceUID,viewportId:t})},c=i("LOAD"),l=n&&!r?3:n&&r?2:1;let u=null,d=null;switch(l){case 1:d=()=>a.createElement(M.Icon,{name:"status-alert"}),u=()=>a.createElement("div",null,"This structured report is not compatible",a.createElement("br",null),"with this application.");break;case 2:d=()=>a.createElement(M.Icon,{name:"status-locked"}),u=()=>a.createElement("div",null,"This structured report is currently read-only",a.createElement("br",null),"because you are tracking measurements in",a.createElement("br",null),"another viewport.");break;case 3:d=()=>a.createElement(M.Icon,{className:"text-aqua-pale",name:"status-untracked"}),u=()=>a.createElement("div",null,`Click ${c} to restore measurements.`)}const f=()=>a.createElement("div",{className:"flex h-6 cursor-default text-sm leading-6 text-white"},a.createElement("div",{className:"bg-customgray-100 flex min-w-[45px] items-center rounded-l-xl rounded-r p-1"},a.createElement(d,null),a.createElement("span",{className:"ml-1"},"SR")),3===l&&a.createElement("div",{className:"bg-primary-main hover:bg-primary-light ml-1 cursor-pointer rounded px-1.5 hover:text-black",onMouseUp:s},c));return a.createElement(a.Fragment,null,u&&a.createElement(M.Tooltip,{content:a.createElement(u,null),position:"bottom-left"},a.createElement(f,null)),!u&&a.createElement(f,null))}j.propTypes={displaySets:o().arrayOf(o().object),viewportId:o().string.isRequired,dataSource:o().object,children:o().node,viewportLabel:o().string,viewportOptions:o().object,servicesManager:o().object.isRequired,extensionManager:o().instanceOf(U.ExtensionManager).isRequired};const V=j},726:(e,t,n)=>{"use strict";n.d(t,{l2:()=>a,yR:()=>i});var r=n(464);const o={TrackingUniqueIdentifier:null,trackingIdentifiersByViewportId:{}};function a(e,t,n=0){const a=(0,r.getEnabledElement)(e),{viewport:i}=a;o.trackingIdentifiersByViewportId[i.id]={trackingUniqueIdentifiers:t,activeIndex:n}}function i(e){const t=(0,r.getEnabledElement)(e),{viewport:n}=t;return o.trackingIdentifiersByViewportId[n.id]?o.trackingIdentifiersByViewportId[n.id]:{trackingUniqueIdentifiers:[]}}},337:(e,t,n)=>{"use strict";var r=n(287);function o(){}function a(){}a.resetWarningCache=o,e.exports=function(){function e(e,t,n,o,a,i){if(i!==r){var s=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw s.name="Invariant Violation",s}}function t(){return e}e.isRequired=e;var n={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:a,resetWarningCache:o};return n.PropTypes=n,n}},827:(e,t,n)=>{e.exports=n(337)()},287:e=>{"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},977:(e,t)=>{"use strict";var n=Symbol.for("react.element"),r=Symbol.for("react.portal"),o=Symbol.for("react.fragment"),a=Symbol.for("react.strict_mode"),i=Symbol.for("react.profiler"),s=Symbol.for("react.provider"),c=Symbol.for("react.context"),l=Symbol.for("react.forward_ref"),u=Symbol.for("react.suspense"),d=Symbol.for("react.memo"),f=Symbol.for("react.lazy"),p=Symbol.iterator;var m={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},g=Object.assign,S={};function y(e,t,n){this.props=e,this.context=t,this.refs=S,this.updater=n||m}function h(){}function I(e,t,n){this.props=e,this.context=t,this.refs=S,this.updater=n||m}y.prototype.isReactComponent={},y.prototype.setState=function(e,t){if("object"!=typeof e&&"function"!=typeof e&&null!=e)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,e,t,"setState")},y.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")},h.prototype=y.prototype;var v=I.prototype=new h;v.constructor=I,g(v,y.prototype),v.isPureReactComponent=!0;var b=Array.isArray,C=Object.prototype.hasOwnProperty,R={current:null},O={key:!0,ref:!0,__self:!0,__source:!0};function E(e,t,r){var o,a={},i=null,s=null;if(null!=t)for(o in void 0!==t.ref&&(s=t.ref),void 0!==t.key&&(i=""+t.key),t)C.call(t,o)&&!O.hasOwnProperty(o)&&(a[o]=t[o]);var c=arguments.length-2;if(1===c)a.children=r;else if(1<c){for(var l=Array(c),u=0;u<c;u++)l[u]=arguments[u+2];a.children=l}if(e&&e.defaultProps)for(o in c=e.defaultProps)void 0===a[o]&&(a[o]=c[o]);return{$$typeof:n,type:e,key:i,ref:s,props:a,_owner:R.current}}function D(e){return"object"==typeof e&&null!==e&&e.$$typeof===n}var T=/\/+/g;function w(e,t){return"object"==typeof e&&null!==e&&null!=e.key?function(e){var t={"=":"=0",":":"=2"};return"$"+e.replace(/[=:]/g,(function(e){return t[e]}))}(""+e.key):t.toString(36)}function U(e,t,o,a,i){var s=typeof e;"undefined"!==s&&"boolean"!==s||(e=null);var c=!1;if(null===e)c=!0;else switch(s){case"string":case"number":c=!0;break;case"object":switch(e.$$typeof){case n:case r:c=!0}}if(c)return i=i(c=e),e=""===a?"."+w(c,0):a,b(i)?(o="",null!=e&&(o=e.replace(T,"$&/")+"/"),U(i,t,o,"",(function(e){return e}))):null!=i&&(D(i)&&(i=function(e,t){return{$$typeof:n,type:e.type,key:t,ref:e.ref,props:e.props,_owner:e._owner}}(i,o+(!i.key||c&&c.key===i.key?"":(""+i.key).replace(T,"$&/")+"/")+e)),t.push(i)),1;if(c=0,a=""===a?".":a+":",b(e))for(var l=0;l<e.length;l++){var u=a+w(s=e[l],l);c+=U(s,t,o,u,i)}else if(u=function(e){return null===e||"object"!=typeof e?null:"function"==typeof(e=p&&e[p]||e["@@iterator"])?e:null}(e),"function"==typeof u)for(e=u.call(e),l=0;!(s=e.next()).done;)c+=U(s=s.value,t,o,u=a+w(s,l++),i);else if("object"===s)throw t=String(e),Error("Objects are not valid as a React child (found: "+("[object Object]"===t?"object with keys {"+Object.keys(e).join(", ")+"}":t)+"). If you meant to render a collection of children, use an array instead.");return c}function N(e,t,n){if(null==e)return e;var r=[],o=0;return U(e,r,"","",(function(e){return t.call(n,e,o++)})),r}function M(e){if(-1===e._status){var t=e._result;(t=t()).then((function(t){0!==e._status&&-1!==e._status||(e._status=1,e._result=t)}),(function(t){0!==e._status&&-1!==e._status||(e._status=2,e._result=t)})),-1===e._status&&(e._status=0,e._result=t)}if(1===e._status)return e._result.default;throw e._result}var P={current:null},x={transition:null},k={ReactCurrentDispatcher:P,ReactCurrentBatchConfig:x,ReactCurrentOwner:R};function A(){throw Error("act(...) is not supported in production builds of React.")}t.Children={map:N,forEach:function(e,t,n){N(e,(function(){t.apply(this,arguments)}),n)},count:function(e){var t=0;return N(e,(function(){t++})),t},toArray:function(e){return N(e,(function(e){return e}))||[]},only:function(e){if(!D(e))throw Error("React.Children.only expected to receive a single React element child.");return e}},t.Component=y,t.Fragment=o,t.Profiler=i,t.PureComponent=I,t.StrictMode=a,t.Suspense=u,t.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=k,t.act=A,t.cloneElement=function(e,t,r){if(null==e)throw Error("React.cloneElement(...): The argument must be a React element, but you passed "+e+".");var o=g({},e.props),a=e.key,i=e.ref,s=e._owner;if(null!=t){if(void 0!==t.ref&&(i=t.ref,s=R.current),void 0!==t.key&&(a=""+t.key),e.type&&e.type.defaultProps)var c=e.type.defaultProps;for(l in t)C.call(t,l)&&!O.hasOwnProperty(l)&&(o[l]=void 0===t[l]&&void 0!==c?c[l]:t[l])}var l=arguments.length-2;if(1===l)o.children=r;else if(1<l){c=Array(l);for(var u=0;u<l;u++)c[u]=arguments[u+2];o.children=c}return{$$typeof:n,type:e.type,key:a,ref:i,props:o,_owner:s}},t.createContext=function(e){return(e={$$typeof:c,_currentValue:e,_currentValue2:e,_threadCount:0,Provider:null,Consumer:null,_defaultValue:null,_globalName:null}).Provider={$$typeof:s,_context:e},e.Consumer=e},t.createElement=E,t.createFactory=function(e){var t=E.bind(null,e);return t.type=e,t},t.createRef=function(){return{current:null}},t.forwardRef=function(e){return{$$typeof:l,render:e}},t.isValidElement=D,t.lazy=function(e){return{$$typeof:f,_payload:{_status:-1,_result:e},_init:M}},t.memo=function(e,t){return{$$typeof:d,type:e,compare:void 0===t?null:t}},t.startTransition=function(e){var t=x.transition;x.transition={};try{e()}finally{x.transition=t}},t.unstable_act=A,t.useCallback=function(e,t){return P.current.useCallback(e,t)},t.useContext=function(e){return P.current.useContext(e)},t.useDebugValue=function(){},t.useDeferredValue=function(e){return P.current.useDeferredValue(e)},t.useEffect=function(e,t){return P.current.useEffect(e,t)},t.useId=function(){return P.current.useId()},t.useImperativeHandle=function(e,t,n){return P.current.useImperativeHandle(e,t,n)},t.useInsertionEffect=function(e,t){return P.current.useInsertionEffect(e,t)},t.useLayoutEffect=function(e,t){return P.current.useLayoutEffect(e,t)},t.useMemo=function(e,t){return P.current.useMemo(e,t)},t.useReducer=function(e,t,n){return P.current.useReducer(e,t,n)},t.useRef=function(e){return P.current.useRef(e)},t.useState=function(e){return P.current.useState(e)},t.useSyncExternalStore=function(e,t,n){return P.current.useSyncExternalStore(e,t,n)},t.useTransition=function(){return P.current.useTransition()},t.version="18.3.1"},1:(e,t,n)=>{"use strict";e.exports=n(977)},165:e=>{e.exports={area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0}},32:e=>{"use strict";e.exports=o},464:e=>{"use strict";e.exports=r},867:e=>{"use strict";e.exports=n},762:t=>{"use strict";t.exports=e},369:e=>{"use strict";e.exports=i},836:e=>{"use strict";e.exports=a},845:e=>{"use strict";e.exports=t}},u={};function d(e){var t=u[e];if(void 0!==t)return t.exports;var n=u[e]={exports:{}};return l[e](n,n.exports,d),n.exports}d.m=l,s=[],d.O=(e,t,n,r)=>{if(!t){var o=1/0;for(l=0;l<s.length;l++){for(var[t,n,r]=s[l],a=!0,i=0;i<t.length;i++)(!1&r||o>=r)&&Object.keys(d.O).every((e=>d.O[e](t[i])))?t.splice(i--,1):(a=!1,r<o&&(o=r));if(a){s.splice(l--,1);var c=n();void 0!==c&&(e=c)}}return e}r=r||0;for(var l=s.length;l>0&&s[l-1][2]>r;l--)s[l]=s[l-1];s[l]=[t,n,r]},d.F={},d.E=e=>{Object.keys(d.F).map((t=>{d.F[t](e)}))},d.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return d.d(t,{a:t}),t},d.d=(e,t)=>{for(var n in t)d.o(t,n)&&!d.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},d.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),d.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},c={143:0},d.F.j=e=>{if(!d.o(c,e)||void 0===c[e]){c[e]=null;var t=document.createElement("link");d.nc&&t.setAttribute("nonce",d.nc),t.rel="prefetch",t.as="script",t.href=d.p+d.u(e),document.head.appendChild(t)}},d.O.j=e=>0===c[e],d.O(0,[143],(()=>{d.E(143)}),5);var f={};return(()=>{"use strict";d.r(f),d.d(f,{createReferencedImageDisplaySet:()=>K.Z,default:()=>ne,hydrateStructuredReport:()=>Z.Z,srProtocol:()=>$});var e=d(1);const t=JSON.parse('{"u2":"@ohif/extension-cornerstone-dicom-sr"}').u2,n="dicom-sr",r=`${t}.sopClassHandlerModule.${n}`;var o=d(762),a=d.n(o),i=d(845),s=d(867),c=d(464),l=d(726);const u={POINT:"POINT",MULTIPOINT:"MULTIPOINT",POLYLINE:"POLYLINE",CIRCLE:"CIRCLE",ELLIPSE:"ELLIPSE"};class p extends s.AnnotationTool{constructor(e={},t={configuration:{}}){super(e,t),this.isPointNearTool=()=>null,this.getHandleNearImagePoint=()=>null,this.renderAnnotation=(e,t)=>{const{viewport:n}=e,{element:r}=n;let o=s.annotation.state.getAnnotations(this.getToolName(),r);if(!o?.length)return;if(o=this.filterInteractableAnnotationsForElement(r,o),!o?.length)return;const a=(0,l.yR)(r),{activeIndex:i,trackingUniqueIdentifiers:c}=a,d=c[i],f=o.filter((e=>c.includes(e.data?.TrackingUniqueIdentifier)));if(!n._actors?.size)return;const p={toolGroupId:this.toolGroupId,toolName:this.getToolName(),viewportId:e.viewport.id},{style:m}=s.annotation.config;for(let e=0;e<f.length;e++){const r=f[e],o=r.annotationUID,{renderableData:a,TrackingUniqueIdentifier:i}=r.data,{referencedImageId:c}=r.metadata;p.annotationUID=o;const l=m.getToolGroupToolStyles(this.toolGroupId)[this.getToolName()],g=this.getStyle("lineWidth",p,r),S=this.getStyle("lineDash",p,r),y={color:i===d?"rgb(0, 255, 0)":this.getStyle("color",p,r),lineDash:S,lineWidth:g,...l};Object.keys(a).forEach((e=>{const i=a[e];let l,d;switch(e){case u.POINT:l=this.renderPoint;break;case u.MULTIPOINT:l=this.renderMultipoint;break;case u.POLYLINE:l=this.renderPolyLine;break;case u.CIRCLE:l=this.renderEllipse;break;case u.ELLIPSE:l=this.renderEllipse,d=s.utilities.math.ellipse.getCanvasEllipseCorners;break;default:throw new Error(`Unsupported GraphicType: ${e}`)}const f=l(t,n,i,o,c,y);this.renderTextBox(t,n,f,d,r,p,y)}))}}}_getTextBoxLinesFromLabels(e){const t=Math.min(e.length,5),n=[];for(let r=0;r<t;r++){const t=e[r];n.push(`${g(t.label)}: ${t.value}`)}return n}renderPolyLine(e,t,n,r,o,a){const i={color:a.color,width:a.lineWidth,lineDash:a.lineDash};let c=[];return n.map(((n,o)=>{const a=n.map((e=>t.worldToCanvas(e))),l=`${o}`;2===a.length?s.drawing.drawLine(e,r,l,a[0],a[1],i):s.drawing.drawPolyline(e,r,l,a,i),c=c.concat(a)})),c}renderMultipoint(e,t,n,r,o,a){let i;n.map(((n,o)=>{i=n.map((e=>t.worldToCanvas(e)));s.drawing.drawHandles(e,r,"0",i,{color:a.color})}))}renderPoint(e,t,n,r,o,a){const i=[];return n.map(((n,l)=>{const u=n[0];i.push(t.worldToCanvas(u));const d=c.metaData.get("imagePixelModule",o);let f=10,p=10;if(d){const{columns:e,rows:t}=d;f=e/10,p=t/10}const m=c.utilities.worldToImageCoords(o,u),g=c.utilities.imageToWorldCoords(o,[m[0]+f,m[1]+p]);i.push(t.worldToCanvas(g));const S=`${l}`;s.drawing.drawArrow(e,r,S,i[1],i[0],{color:a.color,width:a.lineWidth})})),i}renderEllipse(e,t,n,r,o,a){let i;return n.map(((n,o)=>{if(0===n.length)return;const c=n,l=t.getRotation();let u;i=c.map((e=>t.worldToCanvas(e))),u=90==l||270==l?s.utilities.math.ellipse.getCanvasEllipseCorners([i[2],i[3],i[0],i[1]]):s.utilities.math.ellipse.getCanvasEllipseCorners(i);const d=`${o}`;s.drawing.drawEllipse(e,r,d,u[0],u[1],{color:a.color,width:a.lineWidth,lineDash:a.lineDash})})),i}renderTextBox(e,t,n,r,o,a,i={}){if(!n||!o)return;const{annotationUID:c,data:l={}}=o,{label:u}=l,{color:d}=i;let f=n;"function"==typeof r&&(f=r(n));const p=this._getTextBoxLinesFromLabels(u),m=s.utilities.drawing.getTextBoxCoordsCanvas(f);o.data?.handles?.textBox?.worldPosition||(o.data.handles.textBox.worldPosition=t.canvasToWorld(m));const g=t.worldToCanvas(o.data.handles.textBox.worldPosition),S=this.getLinkedTextBoxStyle(a,o),y=s.drawing.drawLinkedTextBox(e,c,"1",p,g,n,{},{...S,color:d}),{x:h,y:I,width:v,height:b}=y;o.data.handles.textBox.worldBoundingBox={topLeft:t.canvasToWorld([h,I]),topRight:t.canvasToWorld([h+v,I]),bottomLeft:t.canvasToWorld([h,I+b]),bottomRight:t.canvasToWorld([h+v,I+b])}}}p.toolName="DICOMSRDisplay";const m={"Short Axis":"W: ","Long Axis":"L: ",AREA:"Area: ",Length:"",CORNERSTONEFREETEXT:""};function g(e){const t=m[e];return void 0!==t?t:e}const S={DICOMSRDisplay:p.toolName,SRLength:"SRLength",SRBidirectional:"SRBidirectional",SREllipticalROI:"SREllipticalROI",SRCircleROI:"SRCircleROI",SRArrowAnnotate:"SRArrowAnnotate",SRAngle:"SRAngle",SRCobbAngle:"SRCobbAngle",SRRectangleROI:"SRRectangleROI",SRPlanarFreehandROI:"SRPlanarFreehandROI"},y=1e-4;function h(e,t,n){const r=S.DICOMSRDisplay,o={TrackingUniqueIdentifier:e.TrackingUniqueIdentifier,renderableData:{},labels:e.labels,imageId:t};e.coords.forEach((e=>{const{GraphicType:n,GraphicData:r}=e;void 0===o.renderableData[n]&&(o.renderableData[n]=[]),o.renderableData[n].push(function(e,t,n){let r;switch(e){case u.POINT:case u.MULTIPOINT:case u.POLYLINE:r=[];for(let e=0;e<t.length;e+=2){const o=c.utilities.imageToWorldCoords(n,[t[e],t[e+1]]);r.push(o)}break;case u.CIRCLE:{const e=[];for(let r=0;r<t.length;r+=2){const o=c.utilities.imageToWorldCoords(n,[t[r],t[r+1]]);e.push(o)}const o=e[0],a=e[1],s=i.vec3.distance(o,a),l=c.metaData.get("imagePlaneModule",n);if(!l)throw new Error("No imagePlaneModule found");const{columnCosines:u,rowCosines:d}=l,f=i.vec3.create();i.vec3.scaleAndAdd(f,o,u,s);const p=i.vec3.create();i.vec3.scaleAndAdd(p,o,u,-s);const m=i.vec3.create();i.vec3.scaleAndAdd(m,o,d,s);const g=i.vec3.create();i.vec3.scaleAndAdd(g,o,d,-s),r=[f,p,m,g];break}case u.ELLIPSE:{const e=[];for(let r=0;r<t.length;r+=2){const o=c.utilities.imageToWorldCoords(n,[t[r],t[r+1]]);e.push(o)}const o=i.vec3.fromValues(...e[0]),a=i.vec3.fromValues(...e[1]),s=i.vec3.fromValues(...e[2]),l=i.vec3.fromValues(...e[3]),u=i.vec3.create();i.vec3.sub(u,a,o),i.vec3.normalize(u,u);const d=i.vec3.create();i.vec3.sub(d,l,s),i.vec3.normalize(d,d);const f=c.metaData.get("imagePlaneModule",n);if(!f)throw new Error("imageId does not have imagePlaneModule metadata");const{columnCosines:p}=f,m=i.vec3.fromValues(...p),g=Math.abs(i.vec3.dot(m,u)),S=Math.abs(i.vec3.dot(m,d)),h=Math.abs(g),I=Math.abs(S);r=[],Math.abs(h-1)<y?r=[e[0],e[1],e[2],e[3]]:Math.abs(I-1)<y?r=[e[2],e[3],e[0],e[1]]:console.warn("OBLIQUE ELLIPSE NOT YET SUPPORTED");break}default:console.warn("Unsupported GraphicType:",e)}return r}(n,r,t))}));const a=c.metaData.get("imagePlaneModule",t),l={annotationUID:e.TrackingUniqueIdentifier,highlighted:!1,isLocked:!1,invalidated:!1,metadata:{toolName:r,FrameOfReferenceUID:a.frameOfReferenceUID,referencedImageId:t},data:{label:e.labels,handles:{textBox:e.textBox??{}},cachedStats:{},TrackingUniqueIdentifier:o.TrackingUniqueIdentifier,renderableData:o.renderableData,frameNumber:n}};s.annotation.state.getAnnotationManager().addAnnotation(l)}var I=d(32);const v=I.adaptersSR.Cornerstone3D.MeasurementReport.CORNERSTONE_TOOL_CLASSES_BY_UTILITY_TYPE,b=["cornerstoneTools@^4.0.0"],C=v.CORNERSTONE_3D_TAG;const{CodeScheme:R}=I.adaptersSR.Cornerstone3D,{ImageSet:O,MetadataProvider:E}=o.classes,D=["1.2.840.10008.5.1.4.1.1.88.11","1.2.840.10008.5.1.4.1.1.88.22","1.2.840.10008.5.1.4.1.1.88.33","1.2.840.10008.5.1.4.1.1.88.34"],T="Cornerstone3DTools",w="0.1",U=(e,t)=>{t.forEach((t=>{if(t.StudyInstanceUID!==e)throw console.warn("Not all instances have the same UID",e,t),new Error(`Instances ${t.SOPInstanceUID} does not belong to ${e}`)}))},N={ImagingMeasurementReport:"126000",ImageLibrary:"111028",ImagingMeasurements:"126010",MeasurementGroup:"125007",ImageLibraryGroup:"126200",TrackingUniqueIdentifier:"112040",TrackingIdentifier:"112039",Finding:"121071",FindingSite:"G-C0E3",CornerstoneFreeText:R.codeValues.CORNERSTONEFREETEXT},M={SRT:"SRT",CornerstoneCodeSchemes:[R.CodingSchemeDesignator,"CST4"]},P={INFERRED_FROM:"INFERRED FROM",CONTAINS:"CONTAINS"},x="CORNERSTONEFREETEXT";function k(e,t){return this.instances.push(...e),o.utils.sortStudyInstances(this.instances),this.instance=this.instances[this.instances.length-1],this.isLoaded=!1,this}function A(e,t,n){if(!e||!e.length)throw new Error("No instances were provided");o.utils.sortStudyInstances(e);const a=e[e.length-1],{StudyInstanceUID:i,SeriesInstanceUID:s,SOPInstanceUID:c,SeriesDescription:l,SeriesNumber:u,SeriesDate:d,ConceptNameCodeSequence:f,SOPClassUID:p}=a;if(U(a.StudyInstanceUID,e),!f||f.CodeValue!==N.ImagingMeasurementReport)return t.services.uiNotificationService.show({title:"DICOM SR",message:"OHIF only supports TID1500 Imaging Measurement Report Structured Reports. The SR you’re trying to view is not supported.",type:"warning",duration:6e3}),[];const m={Modality:"SR",displaySetInstanceUID:o.utils.guid(),SeriesDescription:l,SeriesNumber:u,SeriesDate:d,SOPInstanceUID:c,SeriesInstanceUID:s,StudyInstanceUID:i,SOPClassHandlerId:r,SOPClassUID:p,instances:e,referencedImages:null,measurements:null,isDerivedDisplaySet:!0,isLoaded:!1,sopClassUids:D,instance:a,addInstances:k};return m.load=()=>async function(e,t,n){const{displaySetService:r,measurementService:o}=t.services,a=n.getDataSources(),i=a[0],{ContentSequence:s}=e.instance;async function c(t,n=null,r=null){for(const o in t)if("object"==typeof t[o]&&null!==t[o])await c(t[o],t,o);else if(Array.isArray(t[o]))await Promise.all(t[o].map((e=>c(e,t,o))));else if("BulkDataURI"===o){const a=await i.retrieve.bulkDataURI({BulkDataURI:t[o],StudyInstanceUID:e.instance.StudyInstanceUID,SeriesInstanceUID:e.instance.SeriesInstanceUID,SOPInstanceUID:e.instance.SOPInstanceUID});n&&r&&(n[r]=new Float32Array(a))}}!0!==e.isLoaded&&await c(s);e.referencedImages=function(e){const t=V(e.find((e=>e.ConceptNameCodeSequence.CodeValue===N.ImageLibrary)).ContentSequence).find((e=>e.ConceptNameCodeSequence.CodeValue===N.ImageLibraryGroup)),n=[];return V(t.ContentSequence).forEach((e=>{const{ReferencedSOPSequence:t}=e;if(t)for(const e of V(t))if(e.ReferencedSOPClassUID){const{ReferencedSOPClassUID:t,ReferencedSOPInstanceUID:r}=e;n.push({ReferencedSOPClassUID:t,ReferencedSOPInstanceUID:r})}})),n}(s),e.measurements=function(e){const t=e.find((e=>e.ConceptNameCodeSequence.CodeValue===N.ImagingMeasurements)),n=function(e){const t={};return e.forEach((e=>{const n=V(e.ContentSequence),r=n.find((e=>e.ConceptNameCodeSequence.CodeValue===N.TrackingUniqueIdentifier));r||console.warn("No Tracking Unique Identifier, skipping ambiguous measurement.");const o=r.UID;void 0===t[o]?t[o]=[...n]:n.forEach((e=>{e.ConceptNameCodeSequence.CodeValue!==N.TrackingUniqueIdentifier&&t[o].push(e)}))})),t}(V(t.ContentSequence).filter((e=>e.ConceptNameCodeSequence.CodeValue===N.MeasurementGroup))),r=[];return Object.keys(n).forEach((e=>{const t=function(e){if(e.some((e=>"SCOORD"===e.ValueType||"SCOORD3D"===e.ValueType)))return function(e){const t=e.find((e=>"SCOORD"===e.ValueType)),n=e.find((e=>"UIDREF"===e.ValueType)),r=e.find((e=>e.ConceptNameCodeSequence.CodeValue===N.TrackingIdentifier));if(!t)return void console.warn(`graphic ValueType ${t.ValueType} not currently supported, skipping annotation.`);const o=e.filter((e=>"NUM"===e.ValueType)),a={loaded:!1,labels:[],coords:[j(t)],TrackingUniqueIdentifier:n.UID,TrackingIdentifier:r.TextValue};return o.forEach((e=>{const{ConceptNameCodeSequence:t,MeasuredValueSequence:n}=e;n&&a.labels.push(_(t,n))})),a}(e);return function(e){const t=e.filter((e=>"NUM"===e.ValueType)),n=e.find((e=>"UIDREF"===e.ValueType)),r=e.find((e=>e.ConceptNameCodeSequence.CodeValue===N.TrackingIdentifier)),o=e.find((e=>e.ConceptNameCodeSequence.CodeValue===N.Finding)),a=e.filter((e=>e.ConceptNameCodeSequence.CodingSchemeDesignator===M.SRT&&e.ConceptNameCodeSequence.CodeValue===N.FindingSite)),i={loaded:!1,labels:[],coords:[],TrackingUniqueIdentifier:n.UID,TrackingIdentifier:r.TextValue};o&&M.CornerstoneCodeSchemes.includes(o.ConceptCodeSequence.CodingSchemeDesignator)&&o.ConceptCodeSequence.CodeValue===N.CornerstoneFreeText&&i.labels.push({label:x,value:o.ConceptCodeSequence.CodeMeaning});if(a.length){const e=a.find((e=>M.CornerstoneCodeSchemes.includes(e.ConceptCodeSequence.CodingSchemeDesignator)&&e.ConceptCodeSequence.CodeValue===N.CornerstoneFreeText));e&&i.labels.push({label:x,value:e.ConceptCodeSequence.CodeMeaning})}return t.forEach((e=>{const{ConceptNameCodeSequence:t,ContentSequence:n,MeasuredValueSequence:r}=e,{ValueType:o}=n;if("SCOORD"===!o)return void console.warn(`Graphic ${o} not currently supported, skipping annotation.`);const a=j(n);a&&i.coords.push(a),r&&i.labels.push(_(t,r))})),i}(e)}(n[e]);t&&r.push(t)})),r}(s);const l=o.getSourceMappings(T,w);e.isHydrated=!1,e.isRehydratable=function(e,t){if(!t||!t.length)return!1;const n=t.map((e=>e.annotationType)),{measurements:r}=e,o=Object.keys(v).filter((e=>"function"==typeof v[e].isValidCornerstoneTrackingIdentifier)),a=[];o.forEach((e=>{n.includes(e)&&a.push(v[e])}));for(let e=0;e<r.length;e++){const{TrackingIdentifier:t}=r[e]||{};if(a.some((e=>{let[n,r]=t.split(":");b.includes(n)&&(n=C);const o=`${n}:${r}`;return e.isValidCornerstoneTrackingIdentifier(o)})))return!0;console.log("Measurement is not rehydratable",t,r[e])}return console.log("No measurements found which were rehydratable"),!1}(e,l),e.isLoaded=!0,r.activeDisplaySets.forEach((n=>{q(e,n,i,t)})),r.subscribe(r.EVENTS.DISPLAY_SETS_ADDED,(n=>{const{displaySetsAdded:r}=n;r.forEach((n=>{q(e,n,i,t)}))}))}(m,t,n),[m]}function q(e,t,n,r){const{customizationService:o}=r.services;let a=e.measurements.filter((e=>!1===e.loaded));if(0===a.length)return;if(!t instanceof O)return;if(t.unsupported)return;const{sopClassUids:i}=t;if(a=a.filter((e=>e.coords.some((e=>i.includes(e.ReferencedSOPSequence.ReferencedSOPClassUID))))),0===a.length)return;const s=[];a.forEach((e=>{const{coords:t}=e;t.forEach((e=>{const t=e.ReferencedSOPSequence.ReferencedSOPInstanceUID;s.includes(t)||s.push(t)}))}));const c=n.getImageIdsForDisplaySet(t);for(const n of c){if(!a.length)return;const{SOPInstanceUID:r,frameNumber:i}=E.getUIDsFromImageID(n);if(s.includes(r))for(let s=a.length-1;s>=0;s--){let c=a[s];const l=o.getModeCustomization("onBeforeSRAddMeasurement")?.value;if("function"==typeof l&&(c=l({measurement:c,StudyInstanceUID:e.StudyInstanceUID,SeriesInstanceUID:e.SeriesInstanceUID})),L(c,r,i)){const e=c.coords[0].ReferencedSOPSequence&&c.coords[0].ReferencedSOPSequence?.ReferencedFrameNumber||1;h(c,n,e),c.loaded=!0,c.imageId=n,c.displaySetInstanceUID=t.displaySetInstanceUID,c.ReferencedSOPInstanceUID=c.coords[0].ReferencedSOPSequence.ReferencedSOPInstanceUID,c.frameNumber=e,delete c.coords,a.splice(s,1)}}}}function L(e,t,n){const{coords:r}=e,o=e.coords[0].ReferencedSOPSequence&&e.coords[0].ReferencedSOPSequence?.ReferencedFrameNumber||1;if(n&&Number(n)!==Number(o))return!1;for(let e=0;e<r.length;e++){const n=r[e],{ReferencedSOPInstanceUID:o}=n.ReferencedSOPSequence;if(o===t)return!0}}function j(e){const{ValueType:t,RelationshipType:n,GraphicType:r,GraphicData:o}=e;if(n!=P.INFERRED_FROM&&n!=P.CONTAINS)return void console.warn(`Relationshiptype === ${n}. Cannot deal with NON TID-1400 SCOORD group with RelationshipType !== "INFERRED FROM" or "CONTAINS"`);const a={ValueType:t,GraphicType:r,GraphicData:o};if("SCOORD"===t){const{ReferencedSOPSequence:t}=e.ContentSequence;a.ReferencedSOPSequence=t}else if("SCOORD3D"===t){const{ReferencedFrameOfReferenceSequence:t}=e.ContentSequence;a.ReferencedFrameOfReferenceSequence=t}return a}function _(e,t){const{CodeMeaning:n}=e,{NumericValue:r,MeasurementUnitsCodeSequence:o}=t,{CodeValue:a}=o;return{label:n,value:`${r?Number(r).toFixed(2):""} ${a}`}}function V(e){return e?Array.isArray(e)?e:[e]:[]}const F=function({servicesManager:e,extensionManager:t}){return[{name:n,sopClassUids:D,getDisplaySetsFromSeries:n=>A(n,e,t)}]},$={id:"@ohif/sr",name:"SR Key Images",protocolMatchingRules:[],toolGroupIds:["default"],numberOfPriorsReferenced:0,defaultViewport:{viewportOptions:{viewportType:"stack",toolGroupId:"default",allowUnmatchedView:!0},displaySets:[{id:"srDisplaySetId",matchedDisplaySetsIndex:-1}]},displaySetSelectors:{srDisplaySetId:{seriesMatchingRules:[{attribute:"Modality",constraint:{equals:"SR"}}]}},stages:[{name:"SR Key Images",viewportStructure:{layoutType:"grid",properties:{rows:1,columns:1}},viewports:[{viewportOptions:{allowUnmatchedView:!0},displaySets:[{id:"srDisplaySetId"}]}]}]};var B=d(836),G=d.n(B);const{log:H}=a();const W=function(e,t){const n={};function r(r,o){if(!r.metadata?.referencedImageId)return void H.warn(`[DICOMSR] No referencedImageId found for ${o} ${r.id}`);const a=r.metadata.referencedImageId;n[a]||(n[a]={});const i=n[a];i[o]||(i[o]={data:[]});const s=e.find((e=>e.uid===r.annotationUID)),c=i[o].data;let{finding:l}=s;const u=[];s.label&&(t.includes(o)?l={CodeValue:"CORNERSTONEFREETEXT",CodingSchemeDesignator:"CORNERSTONEJS",CodeMeaning:s.label}:u.push({CodeValue:"CORNERSTONEFREETEXT",CodingSchemeDesignator:"CORNERSTONEJS",CodeMeaning:s.label})),s.findingSites&&u.push(...s.findingSites);const d=Object.assign({},r,{finding:l,findingSites:u});c.push(d)}const o=e.map((e=>e.uid)).slice(),a=s.annotation.state.getAnnotationManager(),i=a.getFramesOfReference();for(let e=0;e<i.length;e++){const t=i[e],s=a.getAnnotations(t),c=Object.keys(s);for(let e=0;e<c.length;e++){const t=c[e],a=s[t];if(a)for(let e=0;e<a.length;e++){const i=a[e],s=o.findIndex((e=>e===i.annotationUID));if(-1!==s&&(r(i,t),o.splice(s,1),!o.length))return n}}}return n},{MeasurementReport:z}=I.adaptersSR.Cornerstone3D,{log:Y}=a(),X=e=>{const{servicesManager:t}=e,{customizationService:n}=t.services,r={downloadReport:({measurementData:e,additionalFindingTypes:t,options:n={}})=>{const o=r.generateReport(e,t,n),a=G().data.datasetToBlob(o),i=URL.createObjectURL(a);window.location.assign(i)},storeMeasurements:async({measurementData:e,dataSource:t,additionalFindingTypes:r,options:a={}})=>{if(Y.info("[DICOMSR] storeMeasurements"),!t||!t.store||!t.store.dicom)return Y.error("[DICOMSR] datasource has no dataSource.store.dicom endpoint!"),Promise.reject({});try{const i=((e,t,n={})=>{const r=W(e,t),o=z.generateReport(r,c.metaData,c.utilities.worldToImageCoords,n),{dataset:a}=o;return void 0===a.SpecificCharacterSet&&(a.SpecificCharacterSet="ISO_IR 192"),a})(e,r,a),{StudyInstanceUID:s,ContentSequence:l}=i;if(!l?.[4].ContentSequence?.length)throw console.log("naturalizedReport missing imaging content",i),new Error("Invalid report, no content");const u=n.getModeCustomization("onBeforeDicomStore")?.value;let d;return"function"==typeof u&&(d=u({measurementData:e,naturalizedReport:i})),await t.store.dicom(i,null,d),s&&t.deleteStudyMetadataPromise(s),o.DicomMetadataStore.addInstances([i],!0),i}catch(e){throw console.warn(e),Y.error(`[DICOMSR] Error while saving the measurements: ${e.message}`),new Error(e.message||"Error while saving the measurements.")}}},a={downloadReport:{commandFn:r.downloadReport},storeMeasurements:{commandFn:r.storeMeasurements}};return{actions:r,definitions:a,defaultContext:"CORNERSTONE_STRUCTURED_REPORT"}};function J(e,t,n){class r extends t{}r.toolName=e,(0,s.addTool)(r)}var Z=d(759),K=d(873);function Q(){return Q=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)({}).hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},Q.apply(null,arguments)}const ee=e.lazy((()=>Promise.resolve().then(d.bind(d,311)))),te=t=>e.createElement(e.Suspense,{fallback:e.createElement("div",null,"Loading...")},e.createElement(ee,t)),ne={id:t,onModeEnter:function({servicesManager:e}){const{displaySetService:t}=e.services;[...t.getDisplaySetCache().values()].filter((e=>e.SOPClassHandlerId===r)).forEach((e=>{e.isHydrated=!1}))},preRegistration:function({configuration:e={}}){J(S.DICOMSRDisplay,p),J(S.SRLength,s.LengthTool),J(S.SRBidirectional,s.BidirectionalTool),J(S.SREllipticalROI,s.EllipticalROITool),J(S.SRCircleROI,s.CircleROITool),J(S.SRArrowAnnotate,s.ArrowAnnotateTool),J(S.SRAngle,s.AngleTool),J(S.SRPlanarFreehandROI,s.PlanarFreehandROITool),J(S.SRRectangleROI,s.RectangleROITool),J(S.SRCobbAngle,s.CobbAngleTool);const t={lineDash:"4,4"};s.annotation.config.style.setToolGroupToolStyles("SRToolGroup",{[S.DICOMSRDisplay]:t,SRLength:t,SRBidirectional:t,SREllipticalROI:t,SRCircleROI:t,SRArrowAnnotate:t,SRCobbAngle:t,SRAngle:t,SRPlanarFreehandROI:t,SRRectangleROI:t,global:{}})},getViewportModule:({servicesManager:t,extensionManager:n})=>[{name:"dicom-sr",component:r=>e.createElement(te,Q({servicesManager:t,extensionManager:n},r))}],getCommandsModule:X,getSopClassHandlerModule:F,getUtilityModule:({servicesManager:e})=>[{name:"tools",exports:{toolNames:S}}]}})(),f=d.O(f)})()));
2
+ !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("@ohif/core"),require("gl-matrix"),require("@cornerstonejs/tools"),require("@cornerstonejs/core"),require("@cornerstonejs/adapters"),require("dcmjs"),require("@ohif/ui")):"function"==typeof define&&define.amd?define(["@ohif/core","gl-matrix","@cornerstonejs/tools","@cornerstonejs/core","@cornerstonejs/adapters","dcmjs","@ohif/ui"],t):"object"==typeof exports?exports["ohif-extension-cornerstone-dicom-sr"]=t(require("@ohif/core"),require("gl-matrix"),require("@cornerstonejs/tools"),require("@cornerstonejs/core"),require("@cornerstonejs/adapters"),require("dcmjs"),require("@ohif/ui")):e["ohif-extension-cornerstone-dicom-sr"]=t(e["@ohif/core"],e["gl-matrix"],e["@cornerstonejs/tools"],e["@cornerstonejs/core"],e["@cornerstonejs/adapters"],e.dcmjs,e["@ohif/ui"])}(globalThis,((e,t,n,r,o,a,i)=>(()=>{var s,c,l={380:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>X});var r=n(827),o=n.n(r),a=n(1),i=n(762);n(165);Object.create(null);function s(){if(console&&console.warn){for(var e,t=arguments.length,n=new Array(t),r=0;r<t;r++)n[r]=arguments[r];"string"==typeof n[0]&&(n[0]="react-i18next:: ".concat(n[0])),(e=console).warn.apply(e,n)}}var c={};function l(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];"string"==typeof t[0]&&c[t[0]]||("string"==typeof t[0]&&(c[t[0]]=new Date),s.apply(void 0,t))}var u=function(e,t){return function(){if(e.isInitialized)t();else{e.on("initialized",(function n(){setTimeout((function(){e.off("initialized",n)}),0),t()}))}}};function d(e,t,n){e.loadNamespaces(t,u(e,n))}function f(e,t,n,r){"string"==typeof n&&(n=[n]),n.forEach((function(t){e.options.ns.indexOf(t)<0&&e.options.ns.push(t)})),e.loadLanguages(t,u(e,r))}function p(e){return p="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},p(e)}function m(e){var t=function(e,t){if("object"!=p(e)||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,t||"default");if("object"!=p(r))return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==p(t)?t:t+""}function g(e,t,n){return(t=m(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var S=/&(?:amp|#38|lt|#60|gt|#62|apos|#39|quot|#34|nbsp|#160|copy|#169|reg|#174|hellip|#8230|#x2F|#47);/g,y={"&amp;":"&","&#38;":"&","&lt;":"<","&#60;":"<","&gt;":">","&#62;":">","&apos;":"'","&#39;":"'","&quot;":'"',"&#34;":'"',"&nbsp;":" ","&#160;":" ","&copy;":"©","&#169;":"©","&reg;":"®","&#174;":"®","&hellip;":"…","&#8230;":"…","&#x2F;":"/","&#47;":"/"},I=function(e){return y[e]};var h={bindI18n:"languageChanged",bindI18nStore:"",transEmptyNodeValue:"",transSupportBasicHtmlNodes:!0,transWrapTextNodes:"",transKeepBasicHtmlNodesFor:["br","strong","i","p"],useSuspense:!0,unescape:function(e){return e.replace(S,I)}};var v;function b(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,m(r.key),r)}}var C=(0,a.createContext)(),R=function(){function e(){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this.usedNamespaces={}}return function(e,t,n){t&&b(e.prototype,t),n&&b(e,n),Object.defineProperty(e,"prototype",{writable:!1})}(e,[{key:"addUsedNamespaces",value:function(e){var t=this;e.forEach((function(e){t.usedNamespaces[e]||(t.usedNamespaces[e]=!0)}))}},{key:"getUsedNamespaces",value:function(){return Object.keys(this.usedNamespaces)}}]),e}();function E(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function O(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,o,a,i,s=[],c=!0,l=!1;try{if(a=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;c=!1}else for(;!(c=(r=a.call(n)).done)&&(s.push(r.value),s.length!==t);c=!0);}catch(e){l=!0,o=e}finally{try{if(!c&&null!=n.return&&(i=n.return(),Object(i)!==i))return}finally{if(l)throw o}}return s}}(e,t)||function(e,t){if(e){if("string"==typeof e)return E(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?E(e,t):void 0}}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function T(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function D(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?T(Object(n),!0).forEach((function(t){g(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):T(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}var w=function(e,t){var n=(0,a.useRef)();return(0,a.useEffect)((function(){n.current=t?n.current:e}),[e,t]),n.current};function N(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.i18n,r=(0,a.useContext)(C)||{},o=r.i18n,i=r.defaultNS,s=n||o||v;if(s&&!s.reportNamespaces&&(s.reportNamespaces=new R),!s){l("You will need to pass in an i18next instance by using initReactI18next");var c=function(e,t){return"string"==typeof t?t:t&&"object"===p(t)&&"string"==typeof t.defaultValue?t.defaultValue:Array.isArray(e)?e[e.length-1]:e},u=[c,{},!1];return u.t=c,u.i18n={},u.ready=!1,u}s.options.react&&void 0!==s.options.react.wait&&l("It seems you are still using the old wait option, you may migrate to the new useSuspense behaviour.");var m=D(D(D({},h),s.options.react),t),g=m.useSuspense,S=m.keyPrefix,y=e||i||s.options&&s.options.defaultNS;y="string"==typeof y?[y]:y||["translation"],s.reportNamespaces.addUsedNamespaces&&s.reportNamespaces.addUsedNamespaces(y);var I=(s.isInitialized||s.initializedStoreOnce)&&y.every((function(e){return function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return t.languages&&t.languages.length?void 0!==t.options.ignoreJSONStructure?t.hasLoadedNamespace(e,{lng:n.lng,precheck:function(t,r){if(n.bindI18n&&n.bindI18n.indexOf("languageChanging")>-1&&t.services.backendConnector.backend&&t.isLanguageChangingTo&&!r(t.isLanguageChangingTo,e))return!1}}):function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=t.languages[0],o=!!t.options&&t.options.fallbackLng,a=t.languages[t.languages.length-1];if("cimode"===r.toLowerCase())return!0;var i=function(e,n){var r=t.services.backendConnector.state["".concat(e,"|").concat(n)];return-1===r||2===r};return!(n.bindI18n&&n.bindI18n.indexOf("languageChanging")>-1&&t.services.backendConnector.backend&&t.isLanguageChangingTo&&!i(t.isLanguageChangingTo,e)||!t.hasResourceBundle(r,e)&&t.services.backendConnector.backend&&(!t.options.resources||t.options.partialBundledLanguages)&&(!i(r,e)||o&&!i(a,e)))}(e,t,n):(l("i18n.languages were undefined or empty",t.languages),!0)}(e,s,m)}));function b(){return s.getFixedT(t.lng||null,"fallback"===m.nsMode?y:y[0],S)}var E=O((0,a.useState)(b),2),T=E[0],N=E[1],U=y.join();t.lng&&(U="".concat(t.lng).concat(U));var M=w(U),x=(0,a.useRef)(!0);(0,a.useEffect)((function(){var e=m.bindI18n,n=m.bindI18nStore;function r(){x.current&&N(b)}return x.current=!0,I||g||(t.lng?f(s,t.lng,y,(function(){x.current&&N(b)})):d(s,y,(function(){x.current&&N(b)}))),I&&M&&M!==U&&x.current&&N(b),e&&s&&s.on(e,r),n&&s&&s.store.on(n,r),function(){x.current=!1,e&&s&&e.split(" ").forEach((function(e){return s.off(e,r)})),n&&s&&n.split(" ").forEach((function(e){return s.store.off(e,r)}))}}),[s,U]);var P=(0,a.useRef)(!0);(0,a.useEffect)((function(){x.current&&!P.current&&N(b),P.current=!1}),[s,S]);var k=[T,s,I];if(k.t=T,k.i18n=s,k.ready=I,I)return k;if(!I&&!g)return k;throw new Promise((function(e){t.lng?f(s,t.lng,y,(function(){return e()})):d(s,y,(function(){return e()}))}))}var U=n(726),M=n(369),x=n(759);const P=(0,a.createContext)(null),{Provider:k}=P;function A({children:e,value:t}){const[n,r]=(0,a.useState)(t);return a.createElement(k,{value:[n]},e)}A.propTypes={children:o().any,value:o().any};var q=n(873);function j(){return j=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)({}).hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},j.apply(null,arguments)}function L(e){const{children:t,dataSource:n,displaySets:r,viewportOptions:o,servicesManager:i,extensionManager:s}=e,[c]=(0,a.useContext)(P),{displaySetService:l,cornerstoneViewportService:u,measurementService:d,viewportActionCornersService:f}=i.services,p=o.viewportId;if(r.length>1)throw new Error("SR viewport should only have a single display set");const m=r[0],[g,S]=(0,M.useViewportGrid)(),[y,I]=(0,a.useState)(0),[h,v]=(0,a.useState)(1),[b,C]=(0,a.useState)(null),[R,E]=(0,a.useState)(null),[O,T]=(0,a.useState)(null),{viewports:D,activeViewportId:w}=g,{t:k}=N("Common");let A,L;if(s.registeredExtensionIds.includes("@ohif/extension-measurement-tracking")){const e=s.getModuleEntry("@ohif/extension-measurement-tracking.contextModule.TrackedMeasurementsContext"),t=(0,a.useContext)(e.context);A=t?.[0],L=t?.[1]}L||(A=null,L=(e,{displaySetInstanceUID:t})=>{d.clearMeasurements();const{SeriesInstanceUIDs:n}=(0,x.Z)({servicesManager:i,extensionManager:s,appConfig:c},t),r=l.getDisplaySetsForSeries(n[0]);r.length&&S.setDisplaySetsForViewports([{viewportId:w,displaySetInstanceUIDs:[r[0].displaySetInstanceUID]}])});const V=(0,a.useCallback)((e=>{const{measurements:t}=m;(0,U.l2)(O,t.map((e=>e.TrackingUniqueIdentifier)),e)}),[O,y,m]),F=(0,a.useCallback)((e=>{const{StudyInstanceUID:t,displaySetInstanceUID:n,sopClassUids:r}=m;t&&n&&(r&&r.length>1&&console.warn("More than one SOPClassUID in the same series is not yet supported."),async function(e,t,n){const{measurements:r}=e,o=r[t],{displaySetInstanceUID:a}=o;e.keyImageDisplaySet||(e.keyImageDisplaySet=(0,q.Z)(n,e));const i=n.getDisplaySetByUID(a),s=i.images[0],c={PatientID:s.PatientID,PatientName:s.PatientName,PatientSex:s.PatientSex,PatientAge:s.PatientAge,SliceThickness:s.SliceThickness,StudyDate:s.StudyDate,SeriesDescription:s.SeriesDescription,SeriesInstanceUID:s.SeriesInstanceUID,SeriesNumber:s.SeriesNumber,ManufacturerModelName:s.ManufacturerModelName,SpacingBetweenSlices:s.SpacingBetweenSlices};return{referencedDisplaySetMetadata:c,referencedDisplaySet:i}}(m,e,l).then((({referencedDisplaySet:t,referencedDisplaySetMetadata:n})=>{if(I(e),C(t),E(n),t.displaySetInstanceUID===b?.displaySetInstanceUID){const{measurements:t}=m,n=u.getCornerstoneViewport(p),r=n.getImageIds().indexOf(t[e].imageId);-1!==r&&n.setImageIdIndex(r)}})))}),[n,m,b,p]),$=(0,a.useCallback)((()=>{if(!b)return null;const{component:t}=s.getModuleEntry("@ohif/extension-cornerstone.viewportModule.cornerstone"),{measurements:n}=m,r=n[y];if(!r)return null;const i=b.images.findIndex((e=>e.imageId===r.imageId));return a.createElement(t,j({},e,{displaySets:[b],viewportOptions:{...o,toolGroupId:"SRToolGroup",viewportType:"stack",positionIds:null},onElementEnabled:t=>{e.onElementEnabled?.(t),(e=>{T(e.detail.element)})(t)},initialImageIndex:i,isJumpToMeasurementDisabled:!0}))}),[b,p,y]),B=(0,a.useCallback)((e=>{let t=y;t+=e,t>=h?t=0:t<0&&(t=h-1),V(t),F(t)}),[y,h,F,V]);(0,a.useEffect)((()=>{const e=l.subscribe(l.EVENTS.DISPLAY_SETS_REMOVED,(({displaySetInstanceUIDs:e})=>{const t=D.get(w);e.includes(t.displaySetInstanceUID)&&S.setDisplaySetsForViewport({viewportId:w,displaySetInstanceUIDs:[]})}));return()=>{e.unsubscribe()}}),[]),(0,a.useEffect)((()=>{(async()=>{m.isLoaded||await m.load();const e=m.measurements.length;v(e),F(y)})()}),[m]),(0,a.useEffect)((()=>{(async()=>{m.isLoaded||await m.load(),O&&m.isLoaded&&V(y)})()}),[y,O,V,m]);const[G,Z]=(0,a.useState)(A?.context?.trackedSeries?.length>0);(0,a.useEffect)((()=>{Z(A?.context?.trackedSeries?.length>0)}),[A]),(0,a.useEffect)((()=>{f.setComponents([{viewportId:p,id:"viewportStatusComponent",component:_({srDisplaySet:m,viewportId:p,isRehydratable:m.isRehydratable,isLocked:G,sendTrackedMeasurementsEvent:L,t:k}),indexPriority:-100,location:f.LOCATIONS.topLeft},{viewportId:p,id:"viewportActionArrowsComponent",index:0,component:a.createElement(M.ViewportActionArrows,{key:"actionArrows",onArrowsClick:B}),indexPriority:0,location:f.LOCATIONS.topRight}])}),[G,B,L,m,k,f,p]);let z=null;return b&&R?(t&&t.length&&(z=t.map(((e,t)=>e&&a.cloneElement(e,{viewportId:p,key:t})))),a.createElement(a.Fragment,null,a.createElement("div",{className:"relative flex h-full w-full flex-row overflow-hidden"},$(),z))):null}function _({srDisplaySet:e,viewportId:t,isRehydratable:n,isLocked:r,sendTrackedMeasurementsEvent:o,t:i}){const s=()=>{o("HYDRATE_SR",{displaySetInstanceUID:e.displaySetInstanceUID,viewportId:t})},c=i("LOAD"),l=n&&!r?3:n&&r?2:1;let u=null,d=null;switch(l){case 1:d=()=>a.createElement(M.Icon,{name:"status-alert"}),u=()=>a.createElement("div",null,"This structured report is not compatible",a.createElement("br",null),"with this application.");break;case 2:d=()=>a.createElement(M.Icon,{name:"status-locked"}),u=()=>a.createElement("div",null,"This structured report is currently read-only",a.createElement("br",null),"because you are tracking measurements in",a.createElement("br",null),"another viewport.");break;case 3:d=()=>a.createElement(M.Icon,{className:"text-aqua-pale",name:"status-untracked"}),u=()=>a.createElement("div",null,`Click ${c} to restore measurements.`)}const f=()=>a.createElement("div",{className:"flex h-6 cursor-default text-sm leading-6 text-white"},a.createElement("div",{className:"bg-customgray-100 flex min-w-[45px] items-center rounded-l-xl rounded-r p-1"},a.createElement(d,null),a.createElement("span",{className:"ml-1"},"SR")),3===l&&a.createElement("div",{className:"bg-primary-main hover:bg-primary-light ml-1 cursor-pointer rounded px-1.5 hover:text-black",onMouseUp:s},c));return a.createElement(a.Fragment,null,u&&a.createElement(M.Tooltip,{content:a.createElement(u,null),position:"bottom-left"},a.createElement(f,null)),!u&&a.createElement(f,null))}L.propTypes={displaySets:o().arrayOf(o().object),viewportId:o().string.isRequired,dataSource:o().object,children:o().node,viewportLabel:o().string,viewportOptions:o().object,servicesManager:o().object.isRequired,extensionManager:o().instanceOf(i.ExtensionManager).isRequired};const V=L;var F=n(660);const $={TEXT:e=>e.TextValue,CODE:e=>e.ConceptCodeSequence?.[0]?.CodeMeaning,UIDREF:e=>e.UID,NUM:e=>{const t=e.MeasuredValueSequence?.[0];if(!t)return;const{NumericValue:n,MeasurementUnitsCodeSequence:r}=t,{CodeValue:o}=r;return`${n} ${o}`},PNAME:e=>{const t=e.PersonName?.[0]?.Alphabetic;return t?i.utils.formatPN(t):void 0},DATE:e=>{const{Date:t}=e;return t?i.utils.formatDate(t):void 0},TIME:e=>{const{Time:t}=e;return t?i.utils.formatTime(t):void 0},DATETIME:e=>{const{DateTime:t}=e;if("string"!=typeof t)return;if(t.length<14)return t;const n=t.substring(0,8),r=t.substring(8,14);return`${i.utils.formatDate(n)} ${i.utils.formatTime(r)}`}};const B="[empty]";function G(e){const{contentItem:t,nodeIndexesTree:n,continuityOfContent:r}=e,{ConceptNameCodeSequence:o}=t,{CodeValue:i,CodeMeaning:s}=o,c=0===n[n.length-1],l=function(e){const{ValueType:t}=e,n=$[t];return n?n(e):`[${t} is not supported]`}(t)??B,u="CONTINUOUS"===r,d=i===F.Z.Finding,f=u&&!c&&/^[a-zA-Z0-9]/.test(l?.[0]);let p="whitespace-pre-line";return i===F.Z.Finding&&(p="whitespace-pre-wrap"),u?a.createElement(a.Fragment,null,a.createElement("span",{className:p,title:s},f?" ":"",l)):a.createElement(a.Fragment,null,a.createElement("div",{className:"mb-2"},a.createElement("span",{className:"font-bold"},s,": "),d?a.createElement("pre",null,l):a.createElement("span",{className:p},l)))}function Z(){return Z=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)({}).hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},Z.apply(null,arguments)}function z(e){const{container:t,nodeIndexesTree:n=[0],containerNumberedTree:r=[1]}=e,{ContinuityOfContent:o,ConceptNameCodeSequence:i}=t,{CodeMeaning:s}=i??{};let c=1;const l=t.ContentSequence?.map(((e,t)=>{const{ValueType:i}=e,s=[...n,t],l=s.join(".");let u,d;if("CONTAINER"===i){u=z,d={container:e,nodeIndexesTree:s,containerNumberedTree:[...r,c++]}}else u=G,d={contentItem:e,nodeIndexesTree:s,continuityOfContent:o};return a.createElement(u,Z({key:l},d))}));return a.createElement("div",null,a.createElement("div",{className:"font-bold"},r.join("."),". ",s),a.createElement("div",{className:"ml-4 mb-2"},l))}function W(e){const{displaySets:t}=e,n=t[0].instances[0];return a.createElement("div",{className:"relative flex h-full w-full flex-col overflow-auto p-4 text-white"},a.createElement("div",null,a.createElement(z,{container:n})))}G.propTypes={contentItem:o().object,nodeIndexesTree:o().arrayOf(o().number),continuityOfContent:o().string},z.propTypes={container:o().object,nodeIndexesTree:o().arrayOf(o().number),containerNumberedTree:o().arrayOf(o().number)},W.propTypes={displaySets:o().arrayOf(o().object),viewportId:o().string.isRequired,dataSource:o().object,children:o().node,viewportLabel:o().string,viewportOptions:o().object,servicesManager:o().object.isRequired,extensionManager:o().instanceOf(i.ExtensionManager).isRequired};const H=W;function Y(e){const{displaySets:t}=e,{isImagingMeasurementReport:n}=t[0];return n?a.createElement(V,e):a.createElement(H,e)}Y.propTypes={displaySets:o().arrayOf(o().object),viewportId:o().string.isRequired,dataSource:o().object,children:o().node,viewportLabel:o().string,viewportOptions:o().object,servicesManager:o().object.isRequired,extensionManager:o().instanceOf(i.ExtensionManager).isRequired};const X=Y},660:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});var r=n(32);const{CodeScheme:o}=r.adaptersSR.Cornerstone3D,a={ImagingMeasurementReport:"126000",ImageLibrary:"111028",ImagingMeasurements:"126010",MeasurementGroup:"125007",ImageLibraryGroup:"126200",TrackingUniqueIdentifier:"112040",TrackingIdentifier:"112039",Finding:"121071",FindingSite:"G-C0E3",CornerstoneFreeText:o.codeValues.CORNERSTONEFREETEXT}},873:(e,t,n)=>{"use strict";n.d(t,{Z:()=>s});var r=n(762);const o=r.classes.ImageSet,a=(e,t)=>{const{displaySetInstanceUID:n,ReferencedSOPInstanceUID:r}=e,o=t.getDisplaySetByUID(n);if(o.images)return o.images.find((e=>e.SOPInstanceUID===r))},i=(e,t)=>{const n=[],r={};for(const o of t.measurements){const{imageId:t}=o;if(!t)continue;if(r[t])continue;const i=a(o,e);i?(r[t]=i,n.push(i)):console.log("Measurement",o,"had no instances found")}return n},s=(e,t)=>{const n=i(e,t),r=new o(n),a=n[0];return r.setAttributes({displaySetInstanceUID:r.uid,SeriesDate:a.SeriesDate,SeriesTime:a.SeriesTime,SeriesInstanceUID:r.uid,StudyInstanceUID:a.StudyInstanceUID,SeriesNumber:a.SeriesNumber||0,SOPClassUID:a.SOPClassUID,SeriesDescription:`${t.SeriesDescription} KO ${t.instance.SeriesNumber}`,Modality:"KO",isMultiFrame:!1,numImageFrames:n.length,SOPClassHandlerId:"@ohif/extension-default.sopClassHandlerModule.stack",isReconstructable:!1,isCompositeStack:!0,madeInClient:!0,excludeFromThumbnailBrowser:!0,updateInstances:function(){this.images.splice(0,this.images.length,...i(e,t)),this.numImageFrames=this.images.length}}),e.addDisplaySets(r),r}},759:(e,t,n)=>{"use strict";n.d(t,{Z:()=>y});var r=n(464),o=n(762),a=n.n(o);var i=n(32),s=n(867);const{locking:c}=s.annotation,{guid:l}=a().utils,{MeasurementReport:u,CORNERSTONE_3D_TAG:d}=i.adaptersSR.Cornerstone3D,f="Cornerstone3DTools",p="0.1",m=["cornerstoneTools@^4.0.0"],g=(e,t)=>{if(!t||"CORNERSTONEJS"===t.CodingSchemeDesignator)return;const n=`${t.CodingSchemeDesignator}:${t.CodeValue}`;return{...e[n],ref:n,...t,text:t.CodeMeaning}},S=(e,t)=>{if(!t||!t.length)return;const n=[];for(let r=0;r<t.length;r++){const o=g(e,t[r][0]||t[r]);o&&n.push(o)}return n.length&&n||void 0};function y({servicesManager:e,extensionManager:t,appConfig:n},a){const i=s.annotation.state.getAnnotationManager(),y=n?.disableEditing,v=t.getActiveDataSource()[0],{measurementService:b,displaySetService:C,customizationService:R}=e.services,E=R.getCustomization("codingValues",{}),O=C.getDisplaySetByUID(a),T=b.getSourceMappings(f,p);if(!T||!T.length)throw new Error("Attempting to hydrate measurements service when no mappings present. This shouldn't be reached.");const D=o.DicomMetadataStore.getInstance(O.StudyInstanceUID,O.SeriesInstanceUID,O.SOPInstanceUID),w={},N={};O.measurements.forEach((e=>{const{ReferencedSOPInstanceUID:t,imageId:n,frameNumber:r}=e;w[t]||(w[t]=n,N[t]=[]),N[t][r]||(N[t][r]=n)}));const U=function(e){const t="Imaging Measurements",n="Measurement Group",r="Tracking Identifier",o=I(e.ContentSequence).find(h(t)),a=I(o.ContentSequence).filter(h(n)),i={},s=u.CORNERSTONE_TOOL_CLASSES_BY_UTILITY_TYPE,c=[];return Object.keys(s).forEach((e=>{c.push(s[e]),i[e]=[]})),a.forEach(((e,t)=>{const n=I(e.ContentSequence).find((e=>e.ConceptNameCodeSequence.CodeMeaning===r)),o=n.TextValue;let[a,i]=o.split(":");m.includes(a)&&(a=d);const s=`${a}:${i}`;n.TextValue=s})),e}(D);let M=u.generateToolState(U,w,r.utilities.imageToWorldCoords,r.metaData);const x=R.getModeCustomization("onBeforeSRHydration")?.value;"function"==typeof x&&(M=x({storedMeasurementByAnnotationType:M,displaySet:O}));const P=T.map((e=>e.annotationType)),k={};Object.keys(M).forEach((e=>{P.includes(e)&&(k[e]=M[e])}));const A=[];let q;Object.keys(k).forEach((e=>{k[e].forEach((e=>{const t=e.annotation.data&&e.annotation.data.frameNumber||1,n=N[e.sopInstanceUid][t]||w[e.sopInstanceUid];A.includes(n)||A.push(n)}))}));const j=[];for(let e=0;e<A.length;e++){const t=A[e],{SeriesInstanceUID:n,StudyInstanceUID:o}=r.metaData.get("instance",t);j.includes(n)||j.push(n),q?q!==o&&console.warn("NO SUPPORT FOR SRs THAT HAVE MEASUREMENTS FROM MULTIPLE STUDIES."):q=o}return Object.keys(k).forEach((e=>{k[e].forEach((t=>{const n=t.annotation.data&&t.annotation.data.frameNumber||1,o=N[t.sopInstanceUid][n]||w[t.sopInstanceUid];t.uid=l();const a=r.metaData.get("instance",o),{FrameOfReferenceUID:s}=a,u={annotationUID:t.annotation.annotationUID,data:t.annotation.data,metadata:{toolName:e,referencedImageId:o,FrameOfReferenceUID:s}},d=b.getSource(f,p);u.data.label=function(e){const{findingSites:t=[],finding:n}=e;let r=t.find((e=>"CORNERSTONEFREETEXT"===e.CodeValue));return r?r.CodeMeaning:n&&"CORNERSTONEFREETEXT"===n.CodeValue?n.CodeMeaning:void 0}(t),u.data.finding=g(E,t.finding?.[0]),u.data.findingSites=S(E,t.findingSites),u.data.site=u.data.findingSites?.[0];const m=T.find((t=>t.annotationType===e)),I=b.addRawMeasurement(d,e,{annotation:u},m.toMeasurementSchema,v);if(y){const e=i.getAnnotation(I);c.setAnnotationLocked(e,!0)}A.includes(o)||A.push(o)}))})),O.isHydrated=!0,{StudyInstanceUID:q,SeriesInstanceUIDs:j}}const I=function(e){return Array.isArray(e)?e:[e]},h=e=>t=>t.ConceptNameCodeSequence.CodeMeaning===e},726:(e,t,n)=>{"use strict";n.d(t,{l2:()=>a,yR:()=>i});var r=n(464);const o={TrackingUniqueIdentifier:null,trackingIdentifiersByViewportId:{}};function a(e,t,n=0){const a=(0,r.getEnabledElement)(e),{viewport:i}=a;o.trackingIdentifiersByViewportId[i.id]={trackingUniqueIdentifiers:t,activeIndex:n}}function i(e){const t=(0,r.getEnabledElement)(e),{viewport:n}=t;return o.trackingIdentifiersByViewportId[n.id]?o.trackingIdentifiersByViewportId[n.id]:{trackingUniqueIdentifiers:[]}}},337:(e,t,n)=>{"use strict";var r=n(287);function o(){}function a(){}a.resetWarningCache=o,e.exports=function(){function e(e,t,n,o,a,i){if(i!==r){var s=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw s.name="Invariant Violation",s}}function t(){return e}e.isRequired=e;var n={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:a,resetWarningCache:o};return n.PropTypes=n,n}},827:(e,t,n)=>{e.exports=n(337)()},287:e=>{"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},977:(e,t)=>{"use strict";var n=Symbol.for("react.element"),r=Symbol.for("react.portal"),o=Symbol.for("react.fragment"),a=Symbol.for("react.strict_mode"),i=Symbol.for("react.profiler"),s=Symbol.for("react.provider"),c=Symbol.for("react.context"),l=Symbol.for("react.forward_ref"),u=Symbol.for("react.suspense"),d=Symbol.for("react.memo"),f=Symbol.for("react.lazy"),p=Symbol.iterator;var m={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},g=Object.assign,S={};function y(e,t,n){this.props=e,this.context=t,this.refs=S,this.updater=n||m}function I(){}function h(e,t,n){this.props=e,this.context=t,this.refs=S,this.updater=n||m}y.prototype.isReactComponent={},y.prototype.setState=function(e,t){if("object"!=typeof e&&"function"!=typeof e&&null!=e)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,e,t,"setState")},y.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")},I.prototype=y.prototype;var v=h.prototype=new I;v.constructor=h,g(v,y.prototype),v.isPureReactComponent=!0;var b=Array.isArray,C=Object.prototype.hasOwnProperty,R={current:null},E={key:!0,ref:!0,__self:!0,__source:!0};function O(e,t,r){var o,a={},i=null,s=null;if(null!=t)for(o in void 0!==t.ref&&(s=t.ref),void 0!==t.key&&(i=""+t.key),t)C.call(t,o)&&!E.hasOwnProperty(o)&&(a[o]=t[o]);var c=arguments.length-2;if(1===c)a.children=r;else if(1<c){for(var l=Array(c),u=0;u<c;u++)l[u]=arguments[u+2];a.children=l}if(e&&e.defaultProps)for(o in c=e.defaultProps)void 0===a[o]&&(a[o]=c[o]);return{$$typeof:n,type:e,key:i,ref:s,props:a,_owner:R.current}}function T(e){return"object"==typeof e&&null!==e&&e.$$typeof===n}var D=/\/+/g;function w(e,t){return"object"==typeof e&&null!==e&&null!=e.key?function(e){var t={"=":"=0",":":"=2"};return"$"+e.replace(/[=:]/g,(function(e){return t[e]}))}(""+e.key):t.toString(36)}function N(e,t,o,a,i){var s=typeof e;"undefined"!==s&&"boolean"!==s||(e=null);var c=!1;if(null===e)c=!0;else switch(s){case"string":case"number":c=!0;break;case"object":switch(e.$$typeof){case n:case r:c=!0}}if(c)return i=i(c=e),e=""===a?"."+w(c,0):a,b(i)?(o="",null!=e&&(o=e.replace(D,"$&/")+"/"),N(i,t,o,"",(function(e){return e}))):null!=i&&(T(i)&&(i=function(e,t){return{$$typeof:n,type:e.type,key:t,ref:e.ref,props:e.props,_owner:e._owner}}(i,o+(!i.key||c&&c.key===i.key?"":(""+i.key).replace(D,"$&/")+"/")+e)),t.push(i)),1;if(c=0,a=""===a?".":a+":",b(e))for(var l=0;l<e.length;l++){var u=a+w(s=e[l],l);c+=N(s,t,o,u,i)}else if(u=function(e){return null===e||"object"!=typeof e?null:"function"==typeof(e=p&&e[p]||e["@@iterator"])?e:null}(e),"function"==typeof u)for(e=u.call(e),l=0;!(s=e.next()).done;)c+=N(s=s.value,t,o,u=a+w(s,l++),i);else if("object"===s)throw t=String(e),Error("Objects are not valid as a React child (found: "+("[object Object]"===t?"object with keys {"+Object.keys(e).join(", ")+"}":t)+"). If you meant to render a collection of children, use an array instead.");return c}function U(e,t,n){if(null==e)return e;var r=[],o=0;return N(e,r,"","",(function(e){return t.call(n,e,o++)})),r}function M(e){if(-1===e._status){var t=e._result;(t=t()).then((function(t){0!==e._status&&-1!==e._status||(e._status=1,e._result=t)}),(function(t){0!==e._status&&-1!==e._status||(e._status=2,e._result=t)})),-1===e._status&&(e._status=0,e._result=t)}if(1===e._status)return e._result.default;throw e._result}var x={current:null},P={transition:null},k={ReactCurrentDispatcher:x,ReactCurrentBatchConfig:P,ReactCurrentOwner:R};function A(){throw Error("act(...) is not supported in production builds of React.")}t.Children={map:U,forEach:function(e,t,n){U(e,(function(){t.apply(this,arguments)}),n)},count:function(e){var t=0;return U(e,(function(){t++})),t},toArray:function(e){return U(e,(function(e){return e}))||[]},only:function(e){if(!T(e))throw Error("React.Children.only expected to receive a single React element child.");return e}},t.Component=y,t.Fragment=o,t.Profiler=i,t.PureComponent=h,t.StrictMode=a,t.Suspense=u,t.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=k,t.act=A,t.cloneElement=function(e,t,r){if(null==e)throw Error("React.cloneElement(...): The argument must be a React element, but you passed "+e+".");var o=g({},e.props),a=e.key,i=e.ref,s=e._owner;if(null!=t){if(void 0!==t.ref&&(i=t.ref,s=R.current),void 0!==t.key&&(a=""+t.key),e.type&&e.type.defaultProps)var c=e.type.defaultProps;for(l in t)C.call(t,l)&&!E.hasOwnProperty(l)&&(o[l]=void 0===t[l]&&void 0!==c?c[l]:t[l])}var l=arguments.length-2;if(1===l)o.children=r;else if(1<l){c=Array(l);for(var u=0;u<l;u++)c[u]=arguments[u+2];o.children=c}return{$$typeof:n,type:e.type,key:a,ref:i,props:o,_owner:s}},t.createContext=function(e){return(e={$$typeof:c,_currentValue:e,_currentValue2:e,_threadCount:0,Provider:null,Consumer:null,_defaultValue:null,_globalName:null}).Provider={$$typeof:s,_context:e},e.Consumer=e},t.createElement=O,t.createFactory=function(e){var t=O.bind(null,e);return t.type=e,t},t.createRef=function(){return{current:null}},t.forwardRef=function(e){return{$$typeof:l,render:e}},t.isValidElement=T,t.lazy=function(e){return{$$typeof:f,_payload:{_status:-1,_result:e},_init:M}},t.memo=function(e,t){return{$$typeof:d,type:e,compare:void 0===t?null:t}},t.startTransition=function(e){var t=P.transition;P.transition={};try{e()}finally{P.transition=t}},t.unstable_act=A,t.useCallback=function(e,t){return x.current.useCallback(e,t)},t.useContext=function(e){return x.current.useContext(e)},t.useDebugValue=function(){},t.useDeferredValue=function(e){return x.current.useDeferredValue(e)},t.useEffect=function(e,t){return x.current.useEffect(e,t)},t.useId=function(){return x.current.useId()},t.useImperativeHandle=function(e,t,n){return x.current.useImperativeHandle(e,t,n)},t.useInsertionEffect=function(e,t){return x.current.useInsertionEffect(e,t)},t.useLayoutEffect=function(e,t){return x.current.useLayoutEffect(e,t)},t.useMemo=function(e,t){return x.current.useMemo(e,t)},t.useReducer=function(e,t,n){return x.current.useReducer(e,t,n)},t.useRef=function(e){return x.current.useRef(e)},t.useState=function(e){return x.current.useState(e)},t.useSyncExternalStore=function(e,t,n){return x.current.useSyncExternalStore(e,t,n)},t.useTransition=function(){return x.current.useTransition()},t.version="18.3.1"},1:(e,t,n)=>{"use strict";e.exports=n(977)},165:e=>{e.exports={area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0}},32:e=>{"use strict";e.exports=o},464:e=>{"use strict";e.exports=r},867:e=>{"use strict";e.exports=n},762:t=>{"use strict";t.exports=e},369:e=>{"use strict";e.exports=i},836:e=>{"use strict";e.exports=a},845:e=>{"use strict";e.exports=t}},u={};function d(e){var t=u[e];if(void 0!==t)return t.exports;var n=u[e]={exports:{}};return l[e](n,n.exports,d),n.exports}d.m=l,s=[],d.O=(e,t,n,r)=>{if(!t){var o=1/0;for(l=0;l<s.length;l++){for(var[t,n,r]=s[l],a=!0,i=0;i<t.length;i++)(!1&r||o>=r)&&Object.keys(d.O).every((e=>d.O[e](t[i])))?t.splice(i--,1):(a=!1,r<o&&(o=r));if(a){s.splice(l--,1);var c=n();void 0!==c&&(e=c)}}return e}r=r||0;for(var l=s.length;l>0&&s[l-1][2]>r;l--)s[l]=s[l-1];s[l]=[t,n,r]},d.F={},d.E=e=>{Object.keys(d.F).map((t=>{d.F[t](e)}))},d.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return d.d(t,{a:t}),t},d.d=(e,t)=>{for(var n in t)d.o(t,n)&&!d.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},d.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),d.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},c={143:0},d.F.j=e=>{if(!d.o(c,e)||void 0===c[e]){c[e]=null;var t=document.createElement("link");d.nc&&t.setAttribute("nonce",d.nc),t.rel="prefetch",t.as="script",t.href=d.p+d.u(e),document.head.appendChild(t)}},d.O.j=e=>0===c[e],d.O(0,[143],(()=>{d.E(143)}),5);var f={};return(()=>{"use strict";d.r(f),d.d(f,{createReferencedImageDisplaySet:()=>K.Z,default:()=>ne,hydrateStructuredReport:()=>J.Z,srProtocol:()=>$});var e=d(1);const t=JSON.parse('{"u2":"@ohif/extension-cornerstone-dicom-sr"}').u2,n="dicom-sr",r=`${t}.sopClassHandlerModule.${n}`;var o=d(762),a=d.n(o),i=d(845),s=d(867),c=d(464),l=d(726);const u={POINT:"POINT",MULTIPOINT:"MULTIPOINT",POLYLINE:"POLYLINE",CIRCLE:"CIRCLE",ELLIPSE:"ELLIPSE"};class p extends s.AnnotationTool{constructor(e={},t={configuration:{}}){super(e,t),this.isPointNearTool=()=>null,this.getHandleNearImagePoint=()=>null,this.renderAnnotation=(e,t)=>{const{viewport:n}=e,{element:r}=n;let o=s.annotation.state.getAnnotations(this.getToolName(),r);if(!o?.length)return;if(o=this.filterInteractableAnnotationsForElement(r,o),!o?.length)return;const a=(0,l.yR)(r),{activeIndex:i,trackingUniqueIdentifiers:c}=a,d=c[i],f=o.filter((e=>c.includes(e.data?.TrackingUniqueIdentifier)));if(!n._actors?.size)return;const p={toolGroupId:this.toolGroupId,toolName:this.getToolName(),viewportId:e.viewport.id},{style:m}=s.annotation.config;for(let e=0;e<f.length;e++){const r=f[e],o=r.annotationUID,{renderableData:a,TrackingUniqueIdentifier:i}=r.data,{referencedImageId:c}=r.metadata;p.annotationUID=o;const l=m.getToolGroupToolStyles(this.toolGroupId)[this.getToolName()],g=this.getStyle("lineWidth",p,r),S=this.getStyle("lineDash",p,r),y={color:i===d?"rgb(0, 255, 0)":this.getStyle("color",p,r),lineDash:S,lineWidth:g,...l};Object.keys(a).forEach((e=>{const i=a[e];let l,d;switch(e){case u.POINT:l=this.renderPoint;break;case u.MULTIPOINT:l=this.renderMultipoint;break;case u.POLYLINE:l=this.renderPolyLine;break;case u.CIRCLE:l=this.renderEllipse;break;case u.ELLIPSE:l=this.renderEllipse,d=s.utilities.math.ellipse.getCanvasEllipseCorners;break;default:throw new Error(`Unsupported GraphicType: ${e}`)}const f=l(t,n,i,o,c,y);this.renderTextBox(t,n,f,d,r,p,y)}))}}}_getTextBoxLinesFromLabels(e){const t=Math.min(e.length,5),n=[];for(let r=0;r<t;r++){const t=e[r];n.push(`${g(t.label)}: ${t.value}`)}return n}renderPolyLine(e,t,n,r,o,a){const i={color:a.color,width:a.lineWidth,lineDash:a.lineDash};let c=[];return n.map(((n,o)=>{const a=n.map((e=>t.worldToCanvas(e))),l=`${o}`;2===a.length?s.drawing.drawLine(e,r,l,a[0],a[1],i):s.drawing.drawPolyline(e,r,l,a,i),c=c.concat(a)})),c}renderMultipoint(e,t,n,r,o,a){let i;n.map(((n,o)=>{i=n.map((e=>t.worldToCanvas(e)));s.drawing.drawHandles(e,r,"0",i,{color:a.color})}))}renderPoint(e,t,n,r,o,a){const i=[];return n.map(((n,l)=>{const u=n[0];i.push(t.worldToCanvas(u));const d=c.metaData.get("imagePixelModule",o);let f=10,p=10;if(d){const{columns:e,rows:t}=d;f=e/10,p=t/10}const m=c.utilities.worldToImageCoords(o,u),g=c.utilities.imageToWorldCoords(o,[m[0]+f,m[1]+p]);i.push(t.worldToCanvas(g));const S=`${l}`;s.drawing.drawArrow(e,r,S,i[1],i[0],{color:a.color,width:a.lineWidth})})),i}renderEllipse(e,t,n,r,o,a){let i;return n.map(((n,o)=>{if(0===n.length)return;const c=n,l=t.getRotation();let u;i=c.map((e=>t.worldToCanvas(e))),u=90==l||270==l?s.utilities.math.ellipse.getCanvasEllipseCorners([i[2],i[3],i[0],i[1]]):s.utilities.math.ellipse.getCanvasEllipseCorners(i);const d=`${o}`;s.drawing.drawEllipse(e,r,d,u[0],u[1],{color:a.color,width:a.lineWidth,lineDash:a.lineDash})})),i}renderTextBox(e,t,n,r,o,a,i={}){if(!n||!o)return;const{annotationUID:c,data:l={}}=o,{label:u}=l,{color:d}=i;let f=n;"function"==typeof r&&(f=r(n));const p=this._getTextBoxLinesFromLabels(u),m=s.utilities.drawing.getTextBoxCoordsCanvas(f);o.data?.handles?.textBox?.worldPosition||(o.data.handles.textBox.worldPosition=t.canvasToWorld(m));const g=t.worldToCanvas(o.data.handles.textBox.worldPosition),S=this.getLinkedTextBoxStyle(a,o),y=s.drawing.drawLinkedTextBox(e,c,"1",p,g,n,{},{...S,color:d}),{x:I,y:h,width:v,height:b}=y;o.data.handles.textBox.worldBoundingBox={topLeft:t.canvasToWorld([I,h]),topRight:t.canvasToWorld([I+v,h]),bottomLeft:t.canvasToWorld([I,h+b]),bottomRight:t.canvasToWorld([I+v,h+b])}}}p.toolName="DICOMSRDisplay";const m={"Short Axis":"W: ","Long Axis":"L: ",AREA:"Area: ",Length:"",CORNERSTONEFREETEXT:""};function g(e){const t=m[e];return void 0!==t?t:e}const S={DICOMSRDisplay:p.toolName,SRLength:"SRLength",SRBidirectional:"SRBidirectional",SREllipticalROI:"SREllipticalROI",SRCircleROI:"SRCircleROI",SRArrowAnnotate:"SRArrowAnnotate",SRAngle:"SRAngle",SRCobbAngle:"SRCobbAngle",SRRectangleROI:"SRRectangleROI",SRPlanarFreehandROI:"SRPlanarFreehandROI"},y=1e-4;function I(e,t,n){const r=S.DICOMSRDisplay,o={TrackingUniqueIdentifier:e.TrackingUniqueIdentifier,renderableData:{},labels:e.labels,imageId:t};e.coords.forEach((e=>{const{GraphicType:n,GraphicData:r}=e;void 0===o.renderableData[n]&&(o.renderableData[n]=[]),o.renderableData[n].push(function(e,t,n){let r;switch(e){case u.POINT:case u.MULTIPOINT:case u.POLYLINE:r=[];for(let e=0;e<t.length;e+=2){const o=c.utilities.imageToWorldCoords(n,[t[e],t[e+1]]);r.push(o)}break;case u.CIRCLE:{const e=[];for(let r=0;r<t.length;r+=2){const o=c.utilities.imageToWorldCoords(n,[t[r],t[r+1]]);e.push(o)}const o=e[0],a=e[1],s=i.vec3.distance(o,a),l=c.metaData.get("imagePlaneModule",n);if(!l)throw new Error("No imagePlaneModule found");const{columnCosines:u,rowCosines:d}=l,f=i.vec3.create();i.vec3.scaleAndAdd(f,o,u,s);const p=i.vec3.create();i.vec3.scaleAndAdd(p,o,u,-s);const m=i.vec3.create();i.vec3.scaleAndAdd(m,o,d,s);const g=i.vec3.create();i.vec3.scaleAndAdd(g,o,d,-s),r=[f,p,m,g];break}case u.ELLIPSE:{const e=[];for(let r=0;r<t.length;r+=2){const o=c.utilities.imageToWorldCoords(n,[t[r],t[r+1]]);e.push(o)}const o=i.vec3.fromValues(...e[0]),a=i.vec3.fromValues(...e[1]),s=i.vec3.fromValues(...e[2]),l=i.vec3.fromValues(...e[3]),u=i.vec3.create();i.vec3.sub(u,a,o),i.vec3.normalize(u,u);const d=i.vec3.create();i.vec3.sub(d,l,s),i.vec3.normalize(d,d);const f=c.metaData.get("imagePlaneModule",n);if(!f)throw new Error("imageId does not have imagePlaneModule metadata");const{columnCosines:p}=f,m=i.vec3.fromValues(...p),g=Math.abs(i.vec3.dot(m,u)),S=Math.abs(i.vec3.dot(m,d)),I=Math.abs(g),h=Math.abs(S);r=[],Math.abs(I-1)<y?r=[e[0],e[1],e[2],e[3]]:Math.abs(h-1)<y?r=[e[2],e[3],e[0],e[1]]:console.warn("OBLIQUE ELLIPSE NOT YET SUPPORTED");break}default:console.warn("Unsupported GraphicType:",e)}return r}(n,r,t))}));const a=c.metaData.get("imagePlaneModule",t),l={annotationUID:e.TrackingUniqueIdentifier,highlighted:!1,isLocked:!1,invalidated:!1,metadata:{toolName:r,FrameOfReferenceUID:a.frameOfReferenceUID,referencedImageId:t},data:{label:e.labels,handles:{textBox:e.textBox??{}},cachedStats:{},TrackingUniqueIdentifier:o.TrackingUniqueIdentifier,renderableData:o.renderableData,frameNumber:n}};s.annotation.state.getAnnotationManager().addAnnotation(l)}var h=d(32);const v=h.adaptersSR.Cornerstone3D.MeasurementReport.CORNERSTONE_TOOL_CLASSES_BY_UTILITY_TYPE,b=["cornerstoneTools@^4.0.0"],C=v.CORNERSTONE_3D_TAG;var R=d(660);const{CodeScheme:E}=h.adaptersSR.Cornerstone3D,{ImageSet:O,MetadataProvider:T}=o.classes,D=["1.2.840.10008.5.1.4.1.1.88.11","1.2.840.10008.5.1.4.1.1.88.22","1.2.840.10008.5.1.4.1.1.88.33","1.2.840.10008.5.1.4.1.1.88.34"],w="Cornerstone3DTools",N="0.1",U=(e,t)=>{t.forEach((t=>{if(t.StudyInstanceUID!==e)throw console.warn("Not all instances have the same UID",e,t),new Error(`Instances ${t.SOPInstanceUID} does not belong to ${e}`)}))},M={SRT:"SRT",CornerstoneCodeSchemes:[E.CodingSchemeDesignator,"CST4"]},x={INFERRED_FROM:"INFERRED FROM",CONTAINS:"CONTAINS"},P="CORNERSTONEFREETEXT";function k(e,t){return this.instances.push(...e),o.utils.sortStudyInstances(this.instances),this.instance=this.instances[this.instances.length-1],this.isLoaded=!1,this}function A(e,t,n){if(!e||!e.length)throw new Error("No instances were provided");o.utils.sortStudyInstances(e);const a=e[e.length-1],{StudyInstanceUID:i,SeriesInstanceUID:s,SOPInstanceUID:c,SeriesDescription:l,SeriesNumber:u,SeriesDate:d,ConceptNameCodeSequence:f,SOPClassUID:p}=a;U(a.StudyInstanceUID,e);const m=f?.CodeValue===R.Z.ImagingMeasurementReport,g={Modality:"SR",displaySetInstanceUID:o.utils.guid(),SeriesDescription:l,SeriesNumber:u,SeriesDate:d,SOPInstanceUID:c,SeriesInstanceUID:s,StudyInstanceUID:i,SOPClassHandlerId:r,SOPClassUID:p,instances:e,referencedImages:null,measurements:null,isDerivedDisplaySet:!0,isLoaded:!1,isImagingMeasurementReport:m,sopClassUids:D,instance:a,addInstances:k};return g.load=()=>async function(e,t,n){const{displaySetService:r,measurementService:o}=t.services,a=n.getDataSources(),i=a[0],{ContentSequence:s}=e.instance;async function c(t,n=null,r=null){for(const o in t)if("object"==typeof t[o]&&null!==t[o])await c(t[o],t,o);else if(Array.isArray(t[o]))await Promise.all(t[o].map((e=>c(e,t,o))));else if("BulkDataURI"===o){const a=await i.retrieve.bulkDataURI({BulkDataURI:t[o],StudyInstanceUID:e.instance.StudyInstanceUID,SeriesInstanceUID:e.instance.SeriesInstanceUID,SOPInstanceUID:e.instance.SOPInstanceUID});n&&r&&(n[r]=new Float32Array(a))}}!0!==e.isLoaded&&await c(s);e.isImagingMeasurementReport?(e.referencedImages=function(e){const t=e.find((e=>e.ConceptNameCodeSequence.CodeValue===R.Z.ImageLibrary));if(!t)return[];const n=V(t.ContentSequence).find((e=>e.ConceptNameCodeSequence.CodeValue===R.Z.ImageLibraryGroup)),r=[];return V(n.ContentSequence).forEach((e=>{const{ReferencedSOPSequence:t}=e;if(t)for(const e of V(t))if(e.ReferencedSOPClassUID){const{ReferencedSOPClassUID:t,ReferencedSOPInstanceUID:n}=e;r.push({ReferencedSOPClassUID:t,ReferencedSOPInstanceUID:n})}})),r}(s),e.measurements=function(e){const t=e.find((e=>e.ConceptNameCodeSequence.CodeValue===R.Z.ImagingMeasurements));if(!t)return[];const n=function(e){const t={};return e.forEach((e=>{const n=V(e.ContentSequence),r=n.find((e=>e.ConceptNameCodeSequence.CodeValue===R.Z.TrackingUniqueIdentifier));r||console.warn("No Tracking Unique Identifier, skipping ambiguous measurement.");const o=r.UID;void 0===t[o]?t[o]=[...n]:n.forEach((e=>{e.ConceptNameCodeSequence.CodeValue!==R.Z.TrackingUniqueIdentifier&&t[o].push(e)}))})),t}(V(t.ContentSequence).filter((e=>e.ConceptNameCodeSequence.CodeValue===R.Z.MeasurementGroup))),r=[];return Object.keys(n).forEach((e=>{const t=function(e){if(e.some((e=>"SCOORD"===e.ValueType||"SCOORD3D"===e.ValueType)))return function(e){const t=e.find((e=>"SCOORD"===e.ValueType)),n=e.find((e=>"UIDREF"===e.ValueType)),r=e.find((e=>e.ConceptNameCodeSequence.CodeValue===R.Z.TrackingIdentifier));if(!t)return void console.warn(`graphic ValueType ${t.ValueType} not currently supported, skipping annotation.`);const o=e.filter((e=>"NUM"===e.ValueType)),a={loaded:!1,labels:[],coords:[L(t)],TrackingUniqueIdentifier:n.UID,TrackingIdentifier:r.TextValue};return o.forEach((e=>{const{ConceptNameCodeSequence:t,MeasuredValueSequence:n}=e;n&&a.labels.push(_(t,n))})),a}(e);return function(e){const t=e.filter((e=>"NUM"===e.ValueType)),n=e.find((e=>"UIDREF"===e.ValueType)),r=e.find((e=>e.ConceptNameCodeSequence.CodeValue===R.Z.TrackingIdentifier)),o=e.find((e=>e.ConceptNameCodeSequence.CodeValue===R.Z.Finding)),a=e.filter((e=>e.ConceptNameCodeSequence.CodingSchemeDesignator===M.SRT&&e.ConceptNameCodeSequence.CodeValue===R.Z.FindingSite)),i={loaded:!1,labels:[],coords:[],TrackingUniqueIdentifier:n.UID,TrackingIdentifier:r.TextValue};o&&M.CornerstoneCodeSchemes.includes(o.ConceptCodeSequence.CodingSchemeDesignator)&&o.ConceptCodeSequence.CodeValue===R.Z.CornerstoneFreeText&&i.labels.push({label:P,value:o.ConceptCodeSequence.CodeMeaning});if(a.length){const e=a.find((e=>M.CornerstoneCodeSchemes.includes(e.ConceptCodeSequence.CodingSchemeDesignator)&&e.ConceptCodeSequence.CodeValue===R.Z.CornerstoneFreeText));e&&i.labels.push({label:P,value:e.ConceptCodeSequence.CodeMeaning})}return t.forEach((e=>{const{ConceptNameCodeSequence:t,ContentSequence:n,MeasuredValueSequence:r}=e,{ValueType:o}=n;if("SCOORD"===!o)return void console.warn(`Graphic ${o} not currently supported, skipping annotation.`);const a=L(n);a&&i.coords.push(a),r&&i.labels.push(_(t,r))})),i}(e)}(n[e]);t&&r.push(t)})),r}(s)):(e.referencedImages=[],e.measurements=[]);const l=o.getSourceMappings(w,N);e.isHydrated=!1,e.isRehydratable=function(e,t){if(!t||!t.length)return!1;const n=t.map((e=>e.annotationType)),{measurements:r}=e,o=Object.keys(v).filter((e=>"function"==typeof v[e].isValidCornerstoneTrackingIdentifier)),a=[];o.forEach((e=>{n.includes(e)&&a.push(v[e])}));for(let e=0;e<r.length;e++){const{TrackingIdentifier:t}=r[e]||{};if(a.some((e=>{let[n,r]=t.split(":");b.includes(n)&&(n=C);const o=`${n}:${r}`;return e.isValidCornerstoneTrackingIdentifier(o)})))return!0;console.log("Measurement is not rehydratable",t,r[e])}return console.log("No measurements found which were rehydratable"),!1}(e,l),e.isLoaded=!0,r.activeDisplaySets.forEach((n=>{q(e,n,i,t)})),r.subscribe(r.EVENTS.DISPLAY_SETS_ADDED,(n=>{const{displaySetsAdded:r}=n;r.forEach((n=>{q(e,n,i,t)}))}))}(g,t,n),[g]}function q(e,t,n,r){const{customizationService:o}=r.services;let a=e.measurements.filter((e=>!1===e.loaded));if(0===a.length)return;if(!t instanceof O)return;if(t.unsupported)return;const{sopClassUids:i}=t;if(a=a.filter((e=>e.coords.some((e=>i.includes(e.ReferencedSOPSequence.ReferencedSOPClassUID))))),0===a.length)return;const s=[];a.forEach((e=>{const{coords:t}=e;t.forEach((e=>{const t=e.ReferencedSOPSequence.ReferencedSOPInstanceUID;s.includes(t)||s.push(t)}))}));const c=n.getImageIdsForDisplaySet(t);for(const n of c){if(!a.length)return;const{SOPInstanceUID:r,frameNumber:i}=T.getUIDsFromImageID(n);if(s.includes(r))for(let s=a.length-1;s>=0;s--){let c=a[s];const l=o.getModeCustomization("onBeforeSRAddMeasurement")?.value;if("function"==typeof l&&(c=l({measurement:c,StudyInstanceUID:e.StudyInstanceUID,SeriesInstanceUID:e.SeriesInstanceUID})),j(c,r,i)){const e=c.coords[0].ReferencedSOPSequence&&c.coords[0].ReferencedSOPSequence?.ReferencedFrameNumber||1;I(c,n,e),c.loaded=!0,c.imageId=n,c.displaySetInstanceUID=t.displaySetInstanceUID,c.ReferencedSOPInstanceUID=c.coords[0].ReferencedSOPSequence.ReferencedSOPInstanceUID,c.frameNumber=e,delete c.coords,a.splice(s,1)}}}}function j(e,t,n){const{coords:r}=e,o=e.coords[0].ReferencedSOPSequence&&e.coords[0].ReferencedSOPSequence?.ReferencedFrameNumber||1;if(n&&Number(n)!==Number(o))return!1;for(let e=0;e<r.length;e++){const n=r[e],{ReferencedSOPInstanceUID:o}=n.ReferencedSOPSequence;if(o===t)return!0}}function L(e){const{ValueType:t,RelationshipType:n,GraphicType:r,GraphicData:o}=e;if(n!=x.INFERRED_FROM&&n!=x.CONTAINS)return void console.warn(`Relationshiptype === ${n}. Cannot deal with NON TID-1400 SCOORD group with RelationshipType !== "INFERRED FROM" or "CONTAINS"`);const a={ValueType:t,GraphicType:r,GraphicData:o};if("SCOORD"===t){const{ReferencedSOPSequence:t}=e.ContentSequence;a.ReferencedSOPSequence=t}else if("SCOORD3D"===t){const{ReferencedFrameOfReferenceSequence:t}=e.ContentSequence;a.ReferencedFrameOfReferenceSequence=t}return a}function _(e,t){const{CodeMeaning:n}=e,{NumericValue:r,MeasurementUnitsCodeSequence:o}=t,{CodeValue:a}=o;return{label:n,value:`${r?Number(r).toFixed(2):""} ${a}`}}function V(e){return e?Array.isArray(e)?e:[e]:[]}const F=function({servicesManager:e,extensionManager:t}){return[{name:n,sopClassUids:D,getDisplaySetsFromSeries:n=>A(n,e,t)}]},$={id:"@ohif/sr",name:"SR Key Images",protocolMatchingRules:[],toolGroupIds:["default"],numberOfPriorsReferenced:0,defaultViewport:{viewportOptions:{viewportType:"stack",toolGroupId:"default",allowUnmatchedView:!0},displaySets:[{id:"srDisplaySetId",matchedDisplaySetsIndex:-1}]},displaySetSelectors:{srDisplaySetId:{seriesMatchingRules:[{attribute:"Modality",constraint:{equals:"SR"}}]}},stages:[{name:"SR Key Images",viewportStructure:{layoutType:"grid",properties:{rows:1,columns:1}},viewports:[{viewportOptions:{allowUnmatchedView:!0},displaySets:[{id:"srDisplaySetId"}]}]}]};var B=d(836),G=d.n(B);const{log:Z}=a();const z=function(e,t){const n={};function r(r,o){if(!r.metadata?.referencedImageId)return void Z.warn(`[DICOMSR] No referencedImageId found for ${o} ${r.id}`);const a=r.metadata.referencedImageId;n[a]||(n[a]={});const i=n[a];i[o]||(i[o]={data:[]});const s=e.find((e=>e.uid===r.annotationUID)),c=i[o].data;let{finding:l}=s;const u=[];s.label&&(t.includes(o)?l={CodeValue:"CORNERSTONEFREETEXT",CodingSchemeDesignator:"CORNERSTONEJS",CodeMeaning:s.label}:u.push({CodeValue:"CORNERSTONEFREETEXT",CodingSchemeDesignator:"CORNERSTONEJS",CodeMeaning:s.label})),s.findingSites&&u.push(...s.findingSites);const d=Object.assign({},r,{finding:l,findingSites:u});c.push(d)}const o=e.map((e=>e.uid)).slice(),a=s.annotation.state.getAnnotationManager(),i=a.getFramesOfReference();for(let e=0;e<i.length;e++){const t=i[e],s=a.getAnnotations(t),c=Object.keys(s);for(let e=0;e<c.length;e++){const t=c[e],a=s[t];if(a)for(let e=0;e<a.length;e++){const i=a[e],s=o.findIndex((e=>e===i.annotationUID));if(-1!==s&&(r(i,t),o.splice(s,1),!o.length))return n}}}return n},{MeasurementReport:W}=h.adaptersSR.Cornerstone3D,{log:H}=a(),Y=e=>{const{servicesManager:t}=e,{customizationService:n}=t.services,r={downloadReport:({measurementData:e,additionalFindingTypes:t,options:n={}})=>{const o=r.generateReport(e,t,n),a=G().data.datasetToBlob(o),i=URL.createObjectURL(a);window.location.assign(i)},storeMeasurements:async({measurementData:e,dataSource:t,additionalFindingTypes:r,options:a={}})=>{if(H.info("[DICOMSR] storeMeasurements"),!t||!t.store||!t.store.dicom)return H.error("[DICOMSR] datasource has no dataSource.store.dicom endpoint!"),Promise.reject({});try{const i=((e,t,n={})=>{const r=z(e,t),o=W.generateReport(r,c.metaData,c.utilities.worldToImageCoords,n),{dataset:a}=o;return void 0===a.SpecificCharacterSet&&(a.SpecificCharacterSet="ISO_IR 192"),a})(e,r,a),{StudyInstanceUID:s,ContentSequence:l}=i;if(!l?.[4].ContentSequence?.length)throw console.log("naturalizedReport missing imaging content",i),new Error("Invalid report, no content");const u=n.getModeCustomization("onBeforeDicomStore")?.value;let d;return"function"==typeof u&&(d=u({measurementData:e,naturalizedReport:i})),await t.store.dicom(i,null,d),s&&t.deleteStudyMetadataPromise(s),o.DicomMetadataStore.addInstances([i],!0),i}catch(e){throw console.warn(e),H.error(`[DICOMSR] Error while saving the measurements: ${e.message}`),new Error(e.message||"Error while saving the measurements.")}}},a={downloadReport:{commandFn:r.downloadReport},storeMeasurements:{commandFn:r.storeMeasurements}};return{actions:r,definitions:a,defaultContext:"CORNERSTONE_STRUCTURED_REPORT"}};function X(e,t,n){class r extends t{}r.toolName=e,(0,s.addTool)(r)}var J=d(759),K=d(873);function Q(){return Q=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)({}).hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},Q.apply(null,arguments)}const ee=e.lazy((()=>Promise.resolve().then(d.bind(d,380)))),te=t=>e.createElement(e.Suspense,{fallback:e.createElement("div",null,"Loading...")},e.createElement(ee,t)),ne={id:t,onModeEnter:function({servicesManager:e}){const{displaySetService:t}=e.services;[...t.getDisplaySetCache().values()].filter((e=>e.SOPClassHandlerId===r)).forEach((e=>{e.isHydrated=!1}))},preRegistration:function({configuration:e={}}){X(S.DICOMSRDisplay,p),X(S.SRLength,s.LengthTool),X(S.SRBidirectional,s.BidirectionalTool),X(S.SREllipticalROI,s.EllipticalROITool),X(S.SRCircleROI,s.CircleROITool),X(S.SRArrowAnnotate,s.ArrowAnnotateTool),X(S.SRAngle,s.AngleTool),X(S.SRPlanarFreehandROI,s.PlanarFreehandROITool),X(S.SRRectangleROI,s.RectangleROITool),X(S.SRCobbAngle,s.CobbAngleTool);const t={lineDash:"4,4"};s.annotation.config.style.setToolGroupToolStyles("SRToolGroup",{[S.DICOMSRDisplay]:t,SRLength:t,SRBidirectional:t,SREllipticalROI:t,SRCircleROI:t,SRArrowAnnotate:t,SRCobbAngle:t,SRAngle:t,SRPlanarFreehandROI:t,SRRectangleROI:t,global:{}})},getViewportModule:({servicesManager:t,extensionManager:n})=>[{name:"dicom-sr",component:r=>e.createElement(te,Q({servicesManager:t,extensionManager:n},r))}],getCommandsModule:Y,getSopClassHandlerModule:F,getUtilityModule:({servicesManager:e})=>[{name:"tools",exports:{toolNames:S}}]}})(),f=d.O(f)})()));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ohif/extension-cornerstone-dicom-sr",
3
- "version": "3.9.0-beta.64",
3
+ "version": "3.9.0-beta.65",
4
4
  "description": "OHIF extension for an SR Cornerstone Viewport",
5
5
  "author": "OHIF",
6
6
  "license": "MIT",
@@ -34,10 +34,10 @@
34
34
  "test:unit:ci": "jest --ci --runInBand --collectCoverage --passWithNoTests"
35
35
  },
36
36
  "peerDependencies": {
37
- "@ohif/core": "3.9.0-beta.64",
38
- "@ohif/extension-cornerstone": "3.9.0-beta.64",
39
- "@ohif/extension-measurement-tracking": "3.9.0-beta.64",
40
- "@ohif/ui": "3.9.0-beta.64",
37
+ "@ohif/core": "3.9.0-beta.65",
38
+ "@ohif/extension-cornerstone": "3.9.0-beta.65",
39
+ "@ohif/extension-measurement-tracking": "3.9.0-beta.65",
40
+ "@ohif/ui": "3.9.0-beta.65",
41
41
  "dcmjs": "*",
42
42
  "dicom-parser": "^1.8.9",
43
43
  "hammerjs": "^2.0.8",