@cornerstonejs/core 0.6.2 → 0.7.0

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.
Files changed (85) hide show
  1. package/dist/cjs/RenderingEngine/StackViewport.d.ts +6 -7
  2. package/dist/cjs/RenderingEngine/StackViewport.js +68 -36
  3. package/dist/cjs/RenderingEngine/StackViewport.js.map +1 -1
  4. package/dist/cjs/RenderingEngine/Viewport.d.ts +1 -0
  5. package/dist/cjs/RenderingEngine/Viewport.js +11 -2
  6. package/dist/cjs/RenderingEngine/Viewport.js.map +1 -1
  7. package/dist/cjs/RenderingEngine/VolumeViewport.d.ts +0 -1
  8. package/dist/cjs/RenderingEngine/VolumeViewport.js +0 -6
  9. package/dist/cjs/RenderingEngine/VolumeViewport.js.map +1 -1
  10. package/dist/cjs/RenderingEngine/helpers/cpuFallback/rendering/getDefaultViewport.js +7 -7
  11. package/dist/cjs/RenderingEngine/helpers/cpuFallback/rendering/getDefaultViewport.js.map +1 -1
  12. package/dist/cjs/RenderingEngine/helpers/cpuFallback/rendering/renderGrayscaleImage.js +1 -1
  13. package/dist/cjs/RenderingEngine/helpers/cpuFallback/rendering/renderGrayscaleImage.js.map +1 -1
  14. package/dist/cjs/enums/Events.d.ts +1 -0
  15. package/dist/cjs/enums/Events.js +1 -0
  16. package/dist/cjs/enums/Events.js.map +1 -1
  17. package/dist/cjs/requestPool/imageLoadPoolManager.js +1 -1
  18. package/dist/cjs/requestPool/imageLoadPoolManager.js.map +1 -1
  19. package/dist/cjs/requestPool/imageRetrievalPoolManager.js +1 -1
  20. package/dist/cjs/requestPool/imageRetrievalPoolManager.js.map +1 -1
  21. package/dist/cjs/requestPool/requestPoolManager.d.ts +5 -4
  22. package/dist/cjs/requestPool/requestPoolManager.js +42 -51
  23. package/dist/cjs/requestPool/requestPoolManager.js.map +1 -1
  24. package/dist/cjs/types/EventTypes.d.ts +10 -3
  25. package/dist/cjs/types/ICamera.d.ts +2 -0
  26. package/dist/cjs/types/IImage.d.ts +1 -0
  27. package/dist/cjs/types/IStackViewport.d.ts +2 -1
  28. package/dist/cjs/types/StackViewportProperties.d.ts +0 -2
  29. package/dist/cjs/utilities/imageToWorldCoords.d.ts +2 -0
  30. package/dist/cjs/utilities/imageToWorldCoords.js +17 -0
  31. package/dist/cjs/utilities/imageToWorldCoords.js.map +1 -0
  32. package/dist/cjs/utilities/index.d.ts +3 -1
  33. package/dist/cjs/utilities/index.js +5 -1
  34. package/dist/cjs/utilities/index.js.map +1 -1
  35. package/dist/cjs/utilities/loadImageToCanvas.js +17 -1
  36. package/dist/cjs/utilities/loadImageToCanvas.js.map +1 -1
  37. package/dist/cjs/utilities/prefetchStack.js +1 -0
  38. package/dist/cjs/utilities/prefetchStack.js.map +1 -1
  39. package/dist/cjs/utilities/worldToImageCoords.d.ts +3 -0
  40. package/dist/cjs/utilities/worldToImageCoords.js +31 -0
  41. package/dist/cjs/utilities/worldToImageCoords.js.map +1 -0
  42. package/dist/esm/RenderingEngine/StackViewport.d.ts +6 -7
  43. package/dist/esm/RenderingEngine/StackViewport.js +68 -36
  44. package/dist/esm/RenderingEngine/StackViewport.js.map +1 -1
  45. package/dist/esm/RenderingEngine/Viewport.d.ts +1 -0
  46. package/dist/esm/RenderingEngine/Viewport.js +11 -2
  47. package/dist/esm/RenderingEngine/Viewport.js.map +1 -1
  48. package/dist/esm/RenderingEngine/VolumeViewport.d.ts +0 -1
  49. package/dist/esm/RenderingEngine/VolumeViewport.js +0 -6
  50. package/dist/esm/RenderingEngine/VolumeViewport.js.map +1 -1
  51. package/dist/esm/RenderingEngine/helpers/cpuFallback/rendering/getDefaultViewport.js +7 -7
  52. package/dist/esm/RenderingEngine/helpers/cpuFallback/rendering/getDefaultViewport.js.map +1 -1
  53. package/dist/esm/RenderingEngine/helpers/cpuFallback/rendering/renderGrayscaleImage.js +1 -1
  54. package/dist/esm/RenderingEngine/helpers/cpuFallback/rendering/renderGrayscaleImage.js.map +1 -1
  55. package/dist/esm/enums/Events.d.ts +1 -0
  56. package/dist/esm/enums/Events.js +1 -0
  57. package/dist/esm/enums/Events.js.map +1 -1
  58. package/dist/esm/requestPool/imageLoadPoolManager.js +1 -1
  59. package/dist/esm/requestPool/imageLoadPoolManager.js.map +1 -1
  60. package/dist/esm/requestPool/imageRetrievalPoolManager.js +1 -1
  61. package/dist/esm/requestPool/imageRetrievalPoolManager.js.map +1 -1
  62. package/dist/esm/requestPool/requestPoolManager.d.ts +5 -4
  63. package/dist/esm/requestPool/requestPoolManager.js +39 -51
  64. package/dist/esm/requestPool/requestPoolManager.js.map +1 -1
  65. package/dist/esm/types/EventTypes.d.ts +10 -3
  66. package/dist/esm/types/ICamera.d.ts +2 -0
  67. package/dist/esm/types/IImage.d.ts +1 -0
  68. package/dist/esm/types/IStackViewport.d.ts +2 -1
  69. package/dist/esm/types/StackViewportProperties.d.ts +0 -2
  70. package/dist/esm/utilities/imageToWorldCoords.d.ts +2 -0
  71. package/dist/esm/utilities/imageToWorldCoords.js +14 -0
  72. package/dist/esm/utilities/imageToWorldCoords.js.map +1 -0
  73. package/dist/esm/utilities/index.d.ts +3 -1
  74. package/dist/esm/utilities/index.js +3 -1
  75. package/dist/esm/utilities/index.js.map +1 -1
  76. package/dist/esm/utilities/loadImageToCanvas.js +17 -1
  77. package/dist/esm/utilities/loadImageToCanvas.js.map +1 -1
  78. package/dist/esm/utilities/prefetchStack.js +1 -0
  79. package/dist/esm/utilities/prefetchStack.js.map +1 -1
  80. package/dist/esm/utilities/worldToImageCoords.d.ts +3 -0
  81. package/dist/esm/utilities/worldToImageCoords.js +29 -0
  82. package/dist/esm/utilities/worldToImageCoords.js.map +1 -0
  83. package/dist/umd/index.js +1 -1
  84. package/dist/umd/index.js.map +1 -1
  85. package/package.json +2 -2
@@ -1,17 +1,20 @@
1
+ import RequestType from '../enums/RequestType';
2
+ import { uuidv4 } from '../utilities';
1
3
  class RequestPoolManager {
2
- constructor() {
4
+ constructor(id) {
3
5
  this.numRequests = {
4
6
  interaction: 0,
5
7
  thumbnail: 0,
6
8
  prefetch: 0,
7
9
  };
10
+ this.id = id ? id : uuidv4();
8
11
  this.requestPool = {
9
12
  interaction: { 0: [] },
10
13
  thumbnail: { 0: [] },
11
14
  prefetch: { 0: [] },
12
15
  };
13
- this.awake = false;
14
16
  this.grabDelay = 5;
17
+ this.awake = false;
15
18
  this.numRequests = {
16
19
  interaction: 0,
17
20
  thumbnail: 0,
@@ -42,6 +45,9 @@ class RequestPoolManager {
42
45
  this.awake = true;
43
46
  this.startGrabbing();
44
47
  }
48
+ else if (type === RequestType.Interaction) {
49
+ this.startGrabbing();
50
+ }
45
51
  }
46
52
  filterRequests(filterFunction) {
47
53
  Object.keys(this.requestPool).forEach((type) => {
@@ -59,31 +65,42 @@ class RequestPoolManager {
59
65
  }
60
66
  this.requestPool[type] = { 0: [] };
61
67
  }
62
- sendRequest({ requestFn, type }) {
63
- this.numRequests[type]++;
64
- this.awake = true;
65
- requestFn().finally(() => {
66
- this.numRequests[type]--;
67
- this.startAgain();
68
- });
69
- }
70
- startGrabbing() {
71
- const maxRequests = this.maxNumRequests.interaction +
72
- this.maxNumRequests.thumbnail +
73
- this.maxNumRequests.prefetch;
74
- const currentRequests = this.numRequests.interaction +
75
- this.numRequests.thumbnail +
76
- this.numRequests.prefetch;
77
- const requestsToSend = maxRequests - currentRequests;
68
+ sendRequests(type) {
69
+ const requestsToSend = this.maxNumRequests[type] - this.numRequests[type];
78
70
  for (let i = 0; i < requestsToSend; i++) {
79
- const requestDetails = this.getNextRequest();
80
- if (requestDetails === false) {
81
- break;
71
+ const requestDetails = this.getNextRequest(type);
72
+ if (requestDetails === null) {
73
+ return false;
82
74
  }
83
75
  else if (requestDetails) {
84
- this.sendRequest(requestDetails);
76
+ this.numRequests[type]++;
77
+ this.awake = true;
78
+ requestDetails.requestFn().finally(() => {
79
+ this.numRequests[type]--;
80
+ this.startAgain();
81
+ });
82
+ }
83
+ }
84
+ return true;
85
+ }
86
+ getNextRequest(type) {
87
+ const interactionPriorities = this.getSortedPriorityGroups(type);
88
+ for (const priority of interactionPriorities) {
89
+ if (this.requestPool[type][priority].length) {
90
+ return this.requestPool[type][priority].shift();
85
91
  }
86
92
  }
93
+ return null;
94
+ }
95
+ startGrabbing() {
96
+ const hasRemainingInteractionRequests = this.sendRequests(RequestType.Interaction);
97
+ const hasRemainingThumbnailRequests = this.sendRequests(RequestType.Thumbnail);
98
+ const hasRemainingPrefetchRequests = this.sendRequests(RequestType.Prefetch);
99
+ if (!hasRemainingInteractionRequests &&
100
+ !hasRemainingThumbnailRequests &&
101
+ !hasRemainingPrefetchRequests) {
102
+ this.awake = false;
103
+ }
87
104
  }
88
105
  startAgain() {
89
106
  if (!this.awake) {
@@ -105,35 +122,6 @@ class RequestPoolManager {
105
122
  .sort();
106
123
  return priorities;
107
124
  }
108
- getNextRequest() {
109
- const interactionPriorities = this.getSortedPriorityGroups('interaction');
110
- for (const priority of interactionPriorities) {
111
- if (this.requestPool.interaction[priority].length &&
112
- this.numRequests.interaction < this.maxNumRequests.interaction) {
113
- return this.requestPool.interaction[priority].shift();
114
- }
115
- }
116
- const thumbnailPriorities = this.getSortedPriorityGroups('thumbnail');
117
- for (const priority of thumbnailPriorities) {
118
- if (this.requestPool.thumbnail[priority].length &&
119
- this.numRequests.thumbnail < this.maxNumRequests.thumbnail) {
120
- return this.requestPool.thumbnail[priority].shift();
121
- }
122
- }
123
- const prefetchPriorities = this.getSortedPriorityGroups('prefetch');
124
- for (const priority of prefetchPriorities) {
125
- if (this.requestPool.prefetch[priority].length &&
126
- this.numRequests.prefetch < this.maxNumRequests.prefetch) {
127
- return this.requestPool.prefetch[priority].shift();
128
- }
129
- }
130
- if (!interactionPriorities.length &&
131
- !thumbnailPriorities.length &&
132
- !prefetchPriorities.length) {
133
- this.awake = false;
134
- }
135
- return false;
136
- }
137
125
  getRequestPool() {
138
126
  return this.requestPool;
139
127
  }
@@ -1 +1 @@
1
- {"version":3,"file":"requestPoolManager.js","sourceRoot":"","sources":["../../../src/requestPool/requestPoolManager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"requestPoolManager.js","sourceRoot":"","sources":["../../../src/requestPool/requestPoolManager.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,5 @@
1
+ import type { mat4 } from 'gl-matrix';
2
+ import type { vtkImageData } from '@kitware/vtk.js/Common/DataModel/ImageData';
1
3
  import type CustomEventType from '../types/CustomEventType';
2
4
  import type ICachedImage from './ICachedImage';
3
5
  import type ICachedVolume from './ICachedVolume';
@@ -5,14 +7,13 @@ import type ICamera from './ICamera';
5
7
  import type IImage from './IImage';
6
8
  import type IImageVolume from './IImageVolume';
7
9
  import type { VOIRange } from './voi';
8
- import type { mat4 } from 'gl-matrix';
9
- import type { vtkImageData } from '@kitware/vtk.js/Common/DataModel/ImageData';
10
10
  declare type CameraModifiedEventDetail = {
11
11
  previousCamera: ICamera;
12
12
  camera: ICamera;
13
13
  element: HTMLDivElement;
14
14
  viewportId: string;
15
15
  renderingEngineId: string;
16
+ rotation?: number;
16
17
  };
17
18
  declare type VoiModifiedEventDetail = {
18
19
  viewportId: string;
@@ -65,6 +66,11 @@ declare type VolumeCacheVolumeRemovedEventDetail = {
65
66
  declare type VolumeCacheVolumeAddedEventDetail = {
66
67
  volume: ICachedVolume;
67
68
  };
69
+ declare type PreStackNewImageEventDetail = {
70
+ imageId: string;
71
+ viewportId: string;
72
+ renderingEngineId: string;
73
+ };
68
74
  declare type StackNewImageEventDetail = {
69
75
  image: IImage;
70
76
  imageId: string;
@@ -103,6 +109,7 @@ declare type ImageCacheImageRemovedEvent = CustomEventType<ImageCacheImageRemove
103
109
  declare type VolumeCacheVolumeAddedEvent = CustomEventType<VolumeCacheVolumeAddedEventDetail>;
104
110
  declare type VolumeCacheVolumeRemovedEvent = CustomEventType<VolumeCacheVolumeRemovedEventDetail>;
105
111
  declare type StackNewImageEvent = CustomEventType<StackNewImageEventDetail>;
112
+ declare type PreStackNewImageEvent = CustomEventType<PreStackNewImageEventDetail>;
106
113
  declare type ImageSpacingCalibratedEvent = CustomEventType<ImageSpacingCalibratedEventDetail>;
107
114
  declare type ImageLoadProgressEvent = CustomEventType<ImageLoadProgressEventDetail>;
108
- export type { CameraModifiedEventDetail, CameraModifiedEvent, VoiModifiedEvent, VoiModifiedEventDetail, ElementDisabledEvent, ElementDisabledEventDetail, ElementEnabledEvent, ElementEnabledEventDetail, ImageRenderedEventDetail, ImageRenderedEvent, ImageVolumeModifiedEvent, ImageVolumeModifiedEventDetail, ImageLoadedEvent, ImageLoadedEventDetail, ImageLoadedFailedEventDetail, ImageLoadedFailedEvent, VolumeLoadedEvent, VolumeLoadedEventDetail, VolumeLoadedFailedEvent, VolumeLoadedFailedEventDetail, ImageCacheImageAddedEvent, ImageCacheImageAddedEventDetail, ImageCacheImageRemovedEvent, ImageCacheImageRemovedEventDetail, VolumeCacheVolumeAddedEvent, VolumeCacheVolumeAddedEventDetail, VolumeCacheVolumeRemovedEvent, VolumeCacheVolumeRemovedEventDetail, StackNewImageEvent, StackNewImageEventDetail, ImageSpacingCalibratedEvent, ImageSpacingCalibratedEventDetail, ImageLoadProgressEvent, ImageLoadProgressEventDetail, };
115
+ export type { CameraModifiedEventDetail, CameraModifiedEvent, VoiModifiedEvent, VoiModifiedEventDetail, ElementDisabledEvent, ElementDisabledEventDetail, ElementEnabledEvent, ElementEnabledEventDetail, ImageRenderedEventDetail, ImageRenderedEvent, ImageVolumeModifiedEvent, ImageVolumeModifiedEventDetail, ImageLoadedEvent, ImageLoadedEventDetail, ImageLoadedFailedEventDetail, ImageLoadedFailedEvent, VolumeLoadedEvent, VolumeLoadedEventDetail, VolumeLoadedFailedEvent, VolumeLoadedFailedEventDetail, ImageCacheImageAddedEvent, ImageCacheImageAddedEventDetail, ImageCacheImageRemovedEvent, ImageCacheImageRemovedEventDetail, VolumeCacheVolumeAddedEvent, VolumeCacheVolumeAddedEventDetail, VolumeCacheVolumeRemovedEvent, VolumeCacheVolumeRemovedEventDetail, StackNewImageEvent, StackNewImageEventDetail, PreStackNewImageEvent, PreStackNewImageEventDetail, ImageSpacingCalibratedEvent, ImageSpacingCalibratedEventDetail, ImageLoadProgressEvent, ImageLoadProgressEventDetail, };
@@ -10,5 +10,7 @@ interface ICamera {
10
10
  viewPlaneNormal?: Point3;
11
11
  viewUp?: Point3;
12
12
  slabThickness?: number;
13
+ flipHorizontal?: boolean;
14
+ flipVertical?: boolean;
13
15
  }
14
16
  export default ICamera;
@@ -4,6 +4,7 @@ import CPUFallbackEnabledElement from './CPUFallbackEnabledElement';
4
4
  interface IImage {
5
5
  imageId: string;
6
6
  sharedCacheKey?: string;
7
+ isPreScaled?: boolean;
7
8
  minPixelValue: number;
8
9
  maxPixelValue: number;
9
10
  slope: number;
@@ -12,7 +12,7 @@ export default interface IStackViewport extends IViewport {
12
12
  scaling: Scaling;
13
13
  resize: () => void;
14
14
  getFrameOfReferenceUID: () => string;
15
- setProperties({ voiRange, invert, interpolationType, rotation, flipHorizontal, flipVertical, }: StackViewportProperties): void;
15
+ setProperties({ voiRange, invert, interpolationType, rotation, }: StackViewportProperties): void;
16
16
  getProperties: () => StackViewportProperties;
17
17
  canvasToWorld: (canvasPos: Point2) => Point3;
18
18
  worldToCanvas: (worldPos: Point3) => Point2;
@@ -38,4 +38,5 @@ export default interface IStackViewport extends IViewport {
38
38
  getRenderer(): any;
39
39
  setColormap(colormap: CPUFallbackColormapData): void;
40
40
  unsetColormap(): void;
41
+ isImagePreScaled(imageId: string): boolean;
41
42
  }
@@ -5,7 +5,5 @@ declare type StackViewportProperties = {
5
5
  invert?: boolean;
6
6
  interpolationType?: InterpolationType;
7
7
  rotation?: number;
8
- flipHorizontal?: boolean;
9
- flipVertical?: boolean;
10
8
  };
11
9
  export default StackViewportProperties;
@@ -0,0 +1,2 @@
1
+ import { Point2, Point3 } from '../types';
2
+ export default function imageToWorldCoords(imageId: string, imageCoords: Point2): Point3 | undefined;
@@ -0,0 +1,14 @@
1
+ import { vec3 } from 'gl-matrix';
2
+ import { metaData } from '..';
3
+ export default function imageToWorldCoords(imageId, imageCoords) {
4
+ const imagePlaneModule = metaData.get('imagePlaneModule', imageId);
5
+ if (!imagePlaneModule) {
6
+ throw new Error(`No imagePlaneModule found for imageId: ${imageId}`);
7
+ }
8
+ const { columnCosines, columnPixelSpacing, rowCosines, rowPixelSpacing, imagePositionPatient: origin, } = imagePlaneModule;
9
+ const imageCoordsInWorld = vec3.create();
10
+ vec3.scaleAndAdd(imageCoordsInWorld, origin, rowCosines, rowPixelSpacing * (imageCoords[0] - 0.5));
11
+ vec3.scaleAndAdd(imageCoordsInWorld, imageCoordsInWorld, columnCosines, columnPixelSpacing * (imageCoords[1] - 0.5));
12
+ return Array.from(imageCoordsInWorld);
13
+ }
14
+ //# sourceMappingURL=imageToWorldCoords.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"imageToWorldCoords.js","sourceRoot":"","sources":["../../../src/utilities/imageToWorldCoords.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC;AAY9B,MAAM,CAAC,OAAO,UAAU,kBAAkB,CACxC,OAAe,EACf,WAAmB;IAEnB,MAAM,gBAAgB,GAAG,QAAQ,CAAC,GAAG,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAC;IAEnE,IAAI,CAAC,gBAAgB,EAAE;QACrB,MAAM,IAAI,KAAK,CAAC,0CAA0C,OAAO,EAAE,CAAC,CAAC;KACtE;IAED,MAAM,EACJ,aAAa,EACb,kBAAkB,EAClB,UAAU,EACV,eAAe,EACf,oBAAoB,EAAE,MAAM,GAC7B,GAAG,gBAAgB,CAAC;IAGrB,MAAM,kBAAkB,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;IAIzC,IAAI,CAAC,WAAW,CACd,kBAAkB,EAClB,MAAM,EACN,UAAU,EAGV,eAAe,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CACzC,CAAC;IAEF,IAAI,CAAC,WAAW,CACd,kBAAkB,EAClB,kBAAkB,EAClB,aAAa,EACb,kBAAkB,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAC5C,CAAC;IAEF,OAAO,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAW,CAAC;AAClD,CAAC"}
@@ -21,6 +21,8 @@ import transformWorldToIndex from './transformWorldToIndex';
21
21
  import prefetchStack from './prefetchStack';
22
22
  import loadImageToCanvas from './loadImageToCanvas';
23
23
  import renderToCanvas from './renderToCanvas';
24
+ import worldToImageCoords from './worldToImageCoords';
25
+ import imageToWorldCoords from './imageToWorldCoords';
24
26
  import * as planar from './planar';
25
27
  import * as windowLevel from './windowLevel';
26
- export { invertRgbTransferFunction, scaleRgbTransferFunction, triggerEvent, imageIdToURI, calibratedPixelSpacingMetadataProvider, uuidv4, planar, getMinMax, getRuntimeId, isEqual, isOpposite, createFloat32SharedArray, createUint8SharedArray, windowLevel, getClosestImageId, getSpacingInNormalDirection, getTargetVolumeAndSpacingInNormalDir, getVolumeActorCorners, indexWithinDimensions, getVolumeViewportsContainingSameVolumes, getVolumeViewportsContainingVolumeId, transformWorldToIndex, prefetchStack, loadImageToCanvas, renderToCanvas, };
28
+ export { invertRgbTransferFunction, scaleRgbTransferFunction, triggerEvent, imageIdToURI, calibratedPixelSpacingMetadataProvider, uuidv4, planar, getMinMax, getRuntimeId, isEqual, isOpposite, createFloat32SharedArray, createUint8SharedArray, windowLevel, getClosestImageId, getSpacingInNormalDirection, getTargetVolumeAndSpacingInNormalDir, getVolumeActorCorners, indexWithinDimensions, getVolumeViewportsContainingSameVolumes, getVolumeViewportsContainingVolumeId, transformWorldToIndex, prefetchStack, loadImageToCanvas, renderToCanvas, worldToImageCoords, imageToWorldCoords, };
@@ -21,7 +21,9 @@ import transformWorldToIndex from './transformWorldToIndex';
21
21
  import prefetchStack from './prefetchStack';
22
22
  import loadImageToCanvas from './loadImageToCanvas';
23
23
  import renderToCanvas from './renderToCanvas';
24
+ import worldToImageCoords from './worldToImageCoords';
25
+ import imageToWorldCoords from './imageToWorldCoords';
24
26
  import * as planar from './planar';
25
27
  import * as windowLevel from './windowLevel';
26
- export { invertRgbTransferFunction, scaleRgbTransferFunction, triggerEvent, imageIdToURI, calibratedPixelSpacingMetadataProvider, uuidv4, planar, getMinMax, getRuntimeId, isEqual, isOpposite, createFloat32SharedArray, createUint8SharedArray, windowLevel, getClosestImageId, getSpacingInNormalDirection, getTargetVolumeAndSpacingInNormalDir, getVolumeActorCorners, indexWithinDimensions, getVolumeViewportsContainingSameVolumes, getVolumeViewportsContainingVolumeId, transformWorldToIndex, prefetchStack, loadImageToCanvas, renderToCanvas, };
28
+ export { invertRgbTransferFunction, scaleRgbTransferFunction, triggerEvent, imageIdToURI, calibratedPixelSpacingMetadataProvider, uuidv4, planar, getMinMax, getRuntimeId, isEqual, isOpposite, createFloat32SharedArray, createUint8SharedArray, windowLevel, getClosestImageId, getSpacingInNormalDirection, getTargetVolumeAndSpacingInNormalDir, getVolumeActorCorners, indexWithinDimensions, getVolumeViewportsContainingSameVolumes, getVolumeViewportsContainingVolumeId, transformWorldToIndex, prefetchStack, loadImageToCanvas, renderToCanvas, worldToImageCoords, imageToWorldCoords, };
27
29
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/utilities/index.ts"],"names":[],"mappings":"AAAA,OAAO,yBAAyB,MAAM,6BAA6B,CAAC;AACpE,OAAO,wBAAwB,MAAM,4BAA4B,CAAC;AAClE,OAAO,YAAY,MAAM,gBAAgB,CAAC;AAC1C,OAAO,MAAM,MAAM,UAAU,CAAC;AAC9B,OAAO,SAAS,MAAM,aAAa,CAAC;AACpC,OAAO,YAAY,MAAM,gBAAgB,CAAC;AAC1C,OAAO,YAAY,MAAM,gBAAgB,CAAC;AAC1C,OAAO,sCAAsC,MAAM,0CAA0C,CAAC;AAC9F,OAAO,OAAO,MAAM,WAAW,CAAC;AAChC,OAAO,UAAU,MAAM,cAAc,CAAC;AACtC,OAAO,sBAAsB,MAAM,0BAA0B,CAAC;AAC9D,OAAO,wBAAwB,MAAM,4BAA4B,CAAC;AAClE,OAAO,iBAAiB,MAAM,qBAAqB,CAAC;AACpD,OAAO,2BAA2B,MAAM,+BAA+B,CAAC;AACxE,OAAO,oCAAoC,MAAM,wCAAwC,CAAC;AAC1F,OAAO,qBAAqB,MAAM,yBAAyB,CAAC;AAC5D,OAAO,qBAAqB,MAAM,yBAAyB,CAAC;AAC5D,OAAO,uCAAuC,MAAM,2CAA2C,CAAC;AAChG,OAAO,oCAAoC,MAAM,wCAAwC,CAAC;AAC1F,OAAO,qBAAqB,MAAM,yBAAyB,CAAC;AAC5D,OAAO,aAAa,MAAM,iBAAiB,CAAC;AAC5C,OAAO,iBAAiB,MAAM,qBAAqB,CAAC;AACpD,OAAO,cAAc,MAAM,kBAAkB,CAAC;AAG9C,OAAO,KAAK,MAAM,MAAM,UAAU,CAAC;AACnC,OAAO,KAAK,WAAW,MAAM,eAAe,CAAC;AAE7C,OAAO,EACL,yBAAyB,EACzB,wBAAwB,EACxB,YAAY,EACZ,YAAY,EACZ,sCAAsC,EACtC,MAAM,EACN,MAAM,EACN,SAAS,EACT,YAAY,EACZ,OAAO,EACP,UAAU,EACV,wBAAwB,EACxB,sBAAsB,EACtB,WAAW,EACX,iBAAiB,EACjB,2BAA2B,EAC3B,oCAAoC,EACpC,qBAAqB,EACrB,qBAAqB,EACrB,uCAAuC,EACvC,oCAAoC,EACpC,qBAAqB,EACrB,aAAa,EACb,iBAAiB,EACjB,cAAc,GACf,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/utilities/index.ts"],"names":[],"mappings":"AAAA,OAAO,yBAAyB,MAAM,6BAA6B,CAAC;AACpE,OAAO,wBAAwB,MAAM,4BAA4B,CAAC;AAClE,OAAO,YAAY,MAAM,gBAAgB,CAAC;AAC1C,OAAO,MAAM,MAAM,UAAU,CAAC;AAC9B,OAAO,SAAS,MAAM,aAAa,CAAC;AACpC,OAAO,YAAY,MAAM,gBAAgB,CAAC;AAC1C,OAAO,YAAY,MAAM,gBAAgB,CAAC;AAC1C,OAAO,sCAAsC,MAAM,0CAA0C,CAAC;AAC9F,OAAO,OAAO,MAAM,WAAW,CAAC;AAChC,OAAO,UAAU,MAAM,cAAc,CAAC;AACtC,OAAO,sBAAsB,MAAM,0BAA0B,CAAC;AAC9D,OAAO,wBAAwB,MAAM,4BAA4B,CAAC;AAClE,OAAO,iBAAiB,MAAM,qBAAqB,CAAC;AACpD,OAAO,2BAA2B,MAAM,+BAA+B,CAAC;AACxE,OAAO,oCAAoC,MAAM,wCAAwC,CAAC;AAC1F,OAAO,qBAAqB,MAAM,yBAAyB,CAAC;AAC5D,OAAO,qBAAqB,MAAM,yBAAyB,CAAC;AAC5D,OAAO,uCAAuC,MAAM,2CAA2C,CAAC;AAChG,OAAO,oCAAoC,MAAM,wCAAwC,CAAC;AAC1F,OAAO,qBAAqB,MAAM,yBAAyB,CAAC;AAC5D,OAAO,aAAa,MAAM,iBAAiB,CAAC;AAC5C,OAAO,iBAAiB,MAAM,qBAAqB,CAAC;AACpD,OAAO,cAAc,MAAM,kBAAkB,CAAC;AAC9C,OAAO,kBAAkB,MAAM,sBAAsB,CAAC;AACtD,OAAO,kBAAkB,MAAM,sBAAsB,CAAC;AAGtD,OAAO,KAAK,MAAM,MAAM,UAAU,CAAC;AACnC,OAAO,KAAK,WAAW,MAAM,eAAe,CAAC;AAE7C,OAAO,EACL,yBAAyB,EACzB,wBAAwB,EACxB,YAAY,EACZ,YAAY,EACZ,sCAAsC,EACtC,MAAM,EACN,MAAM,EACN,SAAS,EACT,YAAY,EACZ,OAAO,EACP,UAAU,EACV,wBAAwB,EACxB,sBAAsB,EACtB,WAAW,EACX,iBAAiB,EACjB,2BAA2B,EAC3B,oCAAoC,EACpC,qBAAqB,EACrB,qBAAqB,EACrB,uCAAuC,EACvC,oCAAoC,EACpC,qBAAqB,EACrB,aAAa,EACb,iBAAiB,EACjB,cAAc,EACd,kBAAkB,EAClB,kBAAkB,GACnB,CAAC"}
@@ -3,10 +3,11 @@ import * as metaData from '../metaData';
3
3
  import { RequestType } from '../enums';
4
4
  import imageLoadPoolManager from '../requestPool/imageLoadPoolManager';
5
5
  import renderToCanvas from './renderToCanvas';
6
- export default function loadImageToCanvas(canvas, imageId, requestType = RequestType.Interaction, priority = -5) {
6
+ export default function loadImageToCanvas(canvas, imageId, requestType = RequestType.Thumbnail, priority = -5) {
7
7
  return new Promise((resolve, reject) => {
8
8
  function successCallback(image, imageId) {
9
9
  const { modality } = metaData.get('generalSeriesModule', imageId) || {};
10
+ image.isPreScaled = isImagePreScaled(image);
10
11
  renderToCanvas(canvas, image, modality);
11
12
  resolve(imageId);
12
13
  }
@@ -39,8 +40,23 @@ export default function loadImageToCanvas(canvas, imageId, requestType = Request
39
40
  preScale: {
40
41
  scalingParameters,
41
42
  },
43
+ requestType,
42
44
  };
43
45
  imageLoadPoolManager.addRequest(sendRequest.bind(null, imageId, null, options), requestType, { imageId }, priority);
44
46
  });
45
47
  }
48
+ function isImagePreScaled(image) {
49
+ const { imageId } = image;
50
+ const modalityLutModule = metaData.get('modalityLutModule', imageId) || {};
51
+ const suvFactor = metaData.get('scalingModule', imageId) || {};
52
+ const generalSeriesModule = metaData.get('generalSeriesModule', imageId) || {};
53
+ if (modalityLutModule.rescaleSlope !== undefined &&
54
+ modalityLutModule.rescaleIntercept !== undefined) {
55
+ if (generalSeriesModule.modality === 'PT') {
56
+ return suvFactor.suvbw !== undefined;
57
+ }
58
+ return true;
59
+ }
60
+ return false;
61
+ }
46
62
  //# sourceMappingURL=loadImageToCanvas.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"loadImageToCanvas.js","sourceRoot":"","sources":["../../../src/utilities/loadImageToCanvas.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,KAAK,QAAQ,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,oBAAoB,MAAM,qCAAqC,CAAC;AACvE,OAAO,cAAc,MAAM,kBAAkB,CAAC;AAoB9C,MAAM,CAAC,OAAO,UAAU,iBAAiB,CACvC,MAAyB,EACzB,OAAe,EACf,WAAW,GAAG,WAAW,CAAC,WAAW,EACrC,QAAQ,GAAG,CAAC,CAAC;IAEb,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,SAAS,eAAe,CAAC,KAAa,EAAE,OAAe;YACrD,MAAM,EAAE,QAAQ,EAAE,GAAG,QAAQ,CAAC,GAAG,CAAC,qBAAqB,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC;YACxE,cAAc,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;YACxC,OAAO,CAAC,OAAO,CAAC,CAAC;QACnB,CAAC;QAED,SAAS,aAAa,CAAC,KAAY,EAAE,OAAe;YAClD,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YAC9B,MAAM,CAAC,KAAK,CAAC,CAAC;QAChB,CAAC;QAED,SAAS,WAAW,CAAC,OAAO,EAAE,YAAY,EAAE,OAAO;YACjD,OAAO,iBAAiB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,IAAI,CAC7C,CAAC,KAAK,EAAE,EAAE;gBACR,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC;YAC3D,CAAC,EACD,CAAC,KAAK,EAAE,EAAE;gBACR,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;YAC3C,CAAC,CACF,CAAC;QACJ,CAAC;QAED,MAAM,iBAAiB,GAAG,QAAQ,CAAC,GAAG,CAAC,mBAAmB,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC;QAC3E,MAAM,SAAS,GAAG,QAAQ,CAAC,GAAG,CAAC,eAAe,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC;QAE/D,MAAM,mBAAmB,GACvB,QAAQ,CAAC,GAAG,CAAC,qBAAqB,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC;QAErD,MAAM,iBAAiB,GAAG;YACxB,YAAY,EAAE,iBAAiB,CAAC,YAAY;YAC5C,gBAAgB,EAAE,iBAAiB,CAAC,gBAAgB;YACpD,QAAQ,EAAE,mBAAmB,CAAC,QAAQ;YACtC,KAAK,EAAE,SAAS,CAAC,KAAK;SACvB,CAAC;QAEF,MAAM,OAAO,GAAG;YACd,YAAY,EAAE;gBACZ,IAAI,EAAE,cAAc;gBACpB,MAAM,EAAE,IAAI;gBACZ,MAAM,EAAE,IAAI;aACb;YACD,QAAQ,EAAE;gBACR,iBAAiB;aAClB;SACF,CAAC;QAEF,oBAAoB,CAAC,UAAU,CAC7B,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,EAC9C,WAAW,EACX,EAAE,OAAO,EAAE,EACX,QAAQ,CACT,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"loadImageToCanvas.js","sourceRoot":"","sources":["../../../src/utilities/loadImageToCanvas.ts"],"names":[],"mappings":"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"}
@@ -17,6 +17,7 @@ function prefetchStack(imageIds, requestType = RequestType.Prefetch, priority =
17
17
  offset: null,
18
18
  length: null,
19
19
  },
20
+ requestType,
20
21
  };
21
22
  imageIds.forEach((imageId, imageIdIndex) => {
22
23
  const modalityLutModule = metaData.get('modalityLutModule', imageId) || {};
@@ -1 +1 @@
1
- {"version":3,"file":"prefetchStack.js","sourceRoot":"","sources":["../../../src/utilities/prefetchStack.ts"],"names":[],"mappings":"AAAA,OAAO,oBAAoB,MAAM,qCAAqC,CAAC;AACvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC;AAW9B,SAAS,aAAa,CACpB,QAAkB,EAClB,WAAW,GAAG,WAAW,CAAC,QAAQ,EAClC,QAAQ,GAAG,CAAC;IAEZ,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE;QACzB,OAAO;KACR;IAED,SAAS,WAAW,CAAC,OAAO,EAAE,YAAY,EAAE,OAAO;QACjD,OAAO,iBAAiB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,IAAI,CAE7C,CAAC,KAAK,EAAE,EAAE,GAAE,CAAC,EACb,CAAC,KAAK,EAAE,EAAE;YACR,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC,CACF,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAG;QACd,YAAY,EAAE;YACZ,IAAI,EAAE,cAAc;YACpB,MAAM,EAAE,IAAI;YACZ,MAAM,EAAE,IAAI;SACb;KACF,CAAC;IAEF,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE;QACzC,MAAM,iBAAiB,GAAG,QAAQ,CAAC,GAAG,CAAC,mBAAmB,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC;QAC3E,MAAM,SAAS,GAAG,QAAQ,CAAC,GAAG,CAAC,eAAe,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC;QAE/D,MAAM,mBAAmB,GACvB,QAAQ,CAAC,GAAG,CAAC,qBAAqB,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC;QAErD,MAAM,iBAAiB,GAAG;YACxB,YAAY,EAAE,iBAAiB,CAAC,YAAY;YAC5C,gBAAgB,EAAE,iBAAiB,CAAC,gBAAgB;YACpD,QAAQ,EAAE,mBAAmB,CAAC,QAAQ;YACtC,KAAK,EAAE,SAAS,CAAC,KAAK;SACvB,CAAC;QAEF,MAAM,iBAAiB,GAAG,EAAE,OAAO,EAAE,CAAC;QACtC,MAAM,YAAY,GAAG;YACnB,GAAG,OAAO;YACV,QAAQ,EAAE;gBACR,iBAAiB;aAClB;SACF,CAAC;QAEF,oBAAoB,CAAC,UAAU,CAC7B,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,YAAY,EAAE,YAAY,CAAC,EAC3D,WAAW,EACX,iBAAiB,EACjB,QAAQ,CACT,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,eAAe,aAAa,CAAC"}
1
+ {"version":3,"file":"prefetchStack.js","sourceRoot":"","sources":["../../../src/utilities/prefetchStack.ts"],"names":[],"mappings":"AAAA,OAAO,oBAAoB,MAAM,qCAAqC,CAAC;AACvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC;AAW9B,SAAS,aAAa,CACpB,QAAkB,EAClB,WAAW,GAAG,WAAW,CAAC,QAAQ,EAClC,QAAQ,GAAG,CAAC;IAEZ,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE;QACzB,OAAO;KACR;IAED,SAAS,WAAW,CAAC,OAAO,EAAE,YAAY,EAAE,OAAO;QACjD,OAAO,iBAAiB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,IAAI,CAE7C,CAAC,KAAK,EAAE,EAAE,GAAE,CAAC,EACb,CAAC,KAAK,EAAE,EAAE;YACR,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC,CACF,CAAC;IACJ,CAAC;IAID,MAAM,OAAO,GAAG;QACd,YAAY,EAAE;YACZ,IAAI,EAAE,cAAc;YACpB,MAAM,EAAE,IAAI;YACZ,MAAM,EAAE,IAAI;SACb;QACD,WAAW;KACZ,CAAC;IAEF,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE;QACzC,MAAM,iBAAiB,GAAG,QAAQ,CAAC,GAAG,CAAC,mBAAmB,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC;QAC3E,MAAM,SAAS,GAAG,QAAQ,CAAC,GAAG,CAAC,eAAe,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC;QAE/D,MAAM,mBAAmB,GACvB,QAAQ,CAAC,GAAG,CAAC,qBAAqB,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC;QAErD,MAAM,iBAAiB,GAAG;YACxB,YAAY,EAAE,iBAAiB,CAAC,YAAY;YAC5C,gBAAgB,EAAE,iBAAiB,CAAC,gBAAgB;YACpD,QAAQ,EAAE,mBAAmB,CAAC,QAAQ;YACtC,KAAK,EAAE,SAAS,CAAC,KAAK;SACvB,CAAC;QAEF,MAAM,iBAAiB,GAAG,EAAE,OAAO,EAAE,CAAC;QACtC,MAAM,YAAY,GAAG;YACnB,GAAG,OAAO;YACV,QAAQ,EAAE;gBACR,iBAAiB;aAClB;SACF,CAAC;QAEF,oBAAoB,CAAC,UAAU,CAC7B,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,YAAY,EAAE,YAAY,CAAC,EAC3D,WAAW,EACX,iBAAiB,EACjB,QAAQ,CACT,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,eAAe,aAAa,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Point2, Point3 } from '../types';
2
+ declare function worldToImageCoords(imageId: string, worldCoords: Point3): Point2 | undefined;
3
+ export default worldToImageCoords;
@@ -0,0 +1,29 @@
1
+ import { vec3 } from 'gl-matrix';
2
+ import { metaData } from '..';
3
+ function worldToImageCoords(imageId, worldCoords) {
4
+ const imagePlaneModule = metaData.get('imagePlaneModule', imageId);
5
+ if (!imagePlaneModule) {
6
+ throw new Error(`No imagePlaneModule found for imageId: ${imageId}`);
7
+ }
8
+ const { columnCosines, columnPixelSpacing, rowCosines, rowPixelSpacing, imagePositionPatient: origin, rows, columns, } = imagePlaneModule;
9
+ const newOrigin = vec3.create();
10
+ vec3.scaleAndAdd(newOrigin, origin, columnCosines, -columnPixelSpacing / 2);
11
+ vec3.scaleAndAdd(newOrigin, newOrigin, rowCosines, -rowPixelSpacing / 2);
12
+ const sub = vec3.create();
13
+ vec3.sub(sub, worldCoords, newOrigin);
14
+ const rowDistance = vec3.dot(sub, rowCosines);
15
+ const columnDistance = vec3.dot(sub, columnCosines);
16
+ const imageCoords = [
17
+ rowDistance / rowPixelSpacing,
18
+ columnDistance / columnPixelSpacing,
19
+ ];
20
+ if (imageCoords[0] < 0 ||
21
+ imageCoords[0] >= columns ||
22
+ imageCoords[1] < 0 ||
23
+ imageCoords[1] >= rows) {
24
+ throw new Error(`The image coordinates are outside of the image, imageCoords: ${imageCoords}`);
25
+ }
26
+ return imageCoords;
27
+ }
28
+ export default worldToImageCoords;
29
+ //# sourceMappingURL=worldToImageCoords.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worldToImageCoords.js","sourceRoot":"","sources":["../../../src/utilities/worldToImageCoords.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC;AAa9B,SAAS,kBAAkB,CACzB,OAAe,EACf,WAAmB;IAEnB,MAAM,gBAAgB,GAAG,QAAQ,CAAC,GAAG,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAC;IAEnE,IAAI,CAAC,gBAAgB,EAAE;QACrB,MAAM,IAAI,KAAK,CAAC,0CAA0C,OAAO,EAAE,CAAC,CAAC;KACtE;IAKD,MAAM,EACJ,aAAa,EACb,kBAAkB,EAClB,UAAU,EACV,eAAe,EACf,oBAAoB,EAAE,MAAM,EAC5B,IAAI,EACJ,OAAO,GACR,GAAG,gBAAgB,CAAC;IAKrB,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;IAEhC,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC,kBAAkB,GAAG,CAAC,CAAC,CAAC;IAC5E,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC,eAAe,GAAG,CAAC,CAAC,CAAC;IAGzE,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;IAC1B,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;IAGtC,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;IAG9C,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;IAEpD,MAAM,WAAW,GAAG;QAClB,WAAW,GAAG,eAAe;QAC7B,cAAc,GAAG,kBAAkB;KACpC,CAAC;IAEF,IACE,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC;QAClB,WAAW,CAAC,CAAC,CAAC,IAAI,OAAO;QACzB,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC;QAClB,WAAW,CAAC,CAAC,CAAC,IAAI,IAAI,EACtB;QACA,MAAM,IAAI,KAAK,CACb,gEAAgE,WAAW,EAAE,CAC9E,CAAC;KACH;IAED,OAAO,WAAqB,CAAC;AAC/B,CAAC;AAED,eAAe,kBAAkB,CAAC"}