larvitar 2.0.6 → 2.0.8

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.
package/README.md CHANGED
@@ -8,8 +8,8 @@
8
8
 
9
9
  ## Dicom Image Toolkit for CornerstoneJS
10
10
 
11
- ### Current version: 2.0.6
12
- ### Latest Published Release: 2.0.6
11
+ ### Current version: 2.0.8
12
+ ### Latest Published Release: 2.0.8
13
13
 
14
14
  This library provides common DICOM functionalities to be used in web-applications: it's wrapper that simplifies the use of cornerstone-js environment.
15
15
 
@@ -3,7 +3,7 @@
3
3
  * rendering images in html canvas using cornerstone
4
4
  */
5
5
  import cornerstone from "cornerstone-core";
6
- import { Image, Series, StoreViewportOptions, Viewport } from "./types";
6
+ import { Image, Series, StoreViewport, StoreViewportOptions, Viewport } from "./types";
7
7
  /**
8
8
  * Purge the cornestone internal cache
9
9
  * If seriesId is passed as argument only imageIds of the series are purged from internal cache
@@ -174,65 +174,5 @@ export declare const rotateImageRight: (elementId: string | HTMLElement) => void
174
174
  * @param {Object} defaultProps - Optional default properties
175
175
  * @return {Object} data - A data dictionary with parsed tags' values
176
176
  */
177
- declare const getSeriesData: (series: Series, defaultProps: StoreViewportOptions) => {
178
- loading: number;
179
- ready: boolean;
180
- minSliceId: number;
181
- maxSliceId: number;
182
- sliceId: number;
183
- pendingSliceId?: number | undefined;
184
- minTimeId: number;
185
- maxTimeId: number;
186
- timeId: number;
187
- timestamp: number;
188
- timestamps: number[];
189
- timeIds: number[];
190
- rows: number;
191
- cols: number;
192
- spacing_x: number;
193
- spacing_y: number;
194
- thickness: number;
195
- minPixelValue: number;
196
- maxPixelValue: number;
197
- isColor: boolean;
198
- isMultiframe: boolean;
199
- isTimeserie: boolean;
200
- isPDF: boolean;
201
- viewport: {
202
- scale: number;
203
- rotation: number;
204
- translation: {
205
- x: number;
206
- y: number;
207
- };
208
- voi: {
209
- windowCenter: number;
210
- windowWidth: number;
211
- };
212
- rows: number;
213
- cols: number;
214
- spacing_x: number;
215
- spacing_y: number;
216
- thickness: number;
217
- };
218
- default: {
219
- scale: number;
220
- rotation: number;
221
- translation: {
222
- x: number;
223
- y: number;
224
- };
225
- voi: {
226
- windowCenter: number;
227
- windowWidth: number;
228
- invert: boolean;
229
- };
230
- };
231
- } & {
232
- imageIndex: number;
233
- imageId: string;
234
- numberOfSlices: number;
235
- numberOfTemporalPositions: number;
236
- timeIndex?: number | undefined;
237
- };
177
+ declare const getSeriesData: (series: Series, defaultProps: StoreViewportOptions) => StoreViewport;
238
178
  export {};
@@ -2,6 +2,7 @@
2
2
  * @desc This file provides functionalities
3
3
  * for data config store.
4
4
  */
5
+ import type { StoreViewport } from "./types.d";
5
6
  type StoreSeries = {
6
7
  imageIds: string[];
7
8
  progress: number;
@@ -15,12 +16,12 @@ type Store = {
15
16
  [seriesUID: string]: StoreSeries;
16
17
  };
17
18
  viewports: {
18
- [key: string]: typeof DEFAULT_VIEWPORT;
19
+ [key: string]: StoreViewport;
19
20
  };
20
21
  [key: string]: any;
21
22
  };
22
23
  type SetPayload = ["errorLog" | "leftActiveTool" | "rightActiveTool", string] | [
23
- "isColor" | "isMultiframe" | "isPDF" | "isTimeserie" | "ready",
24
+ ("isColor" | "isMultiframe" | "isPDF" | "waveform" | "isTimeserie" | "ready"),
24
25
  string,
25
26
  boolean
26
27
  ] | [
@@ -43,62 +44,6 @@ type SetPayload = ["errorLog" | "leftActiveTool" | "rightActiveTool", string] |
43
44
  number,
44
45
  boolean
45
46
  ];
46
- export declare const DEFAULT_VIEWPORT: {
47
- loading: number;
48
- ready: boolean;
49
- minSliceId: number;
50
- maxSliceId: number;
51
- sliceId: number;
52
- pendingSliceId?: number;
53
- minTimeId: number;
54
- maxTimeId: number;
55
- timeId: number;
56
- timestamp: number;
57
- timestamps: number[];
58
- timeIds: number[];
59
- rows: number;
60
- cols: number;
61
- spacing_x: number;
62
- spacing_y: number;
63
- thickness: number;
64
- minPixelValue: number;
65
- maxPixelValue: number;
66
- isColor: boolean;
67
- isMultiframe: boolean;
68
- isTimeserie: boolean;
69
- isPDF: boolean;
70
- viewport: {
71
- scale: number;
72
- rotation: number;
73
- translation: {
74
- x: number;
75
- y: number;
76
- };
77
- voi: {
78
- windowCenter: number;
79
- windowWidth: number;
80
- };
81
- rows: number;
82
- cols: number;
83
- spacing_x: number;
84
- spacing_y: number;
85
- thickness: number;
86
- };
87
- default: {
88
- scale: number;
89
- rotation: number;
90
- translation: {
91
- x: number;
92
- y: number;
93
- };
94
- voi: {
95
- windowCenter: number;
96
- windowWidth: number;
97
- invert: boolean;
98
- };
99
- };
100
- };
101
- export type Viewport = typeof DEFAULT_VIEWPORT;
102
47
  export declare const set: (payload: SetPayload) => void;
103
48
  declare const _default: {
104
49
  initialize: () => void;
@@ -110,10 +55,11 @@ declare const _default: {
110
55
  setSliceId: (elementId: string, imageIndex: number) => void;
111
56
  setPendingSliceId: (elementId: string, imageIndex: number) => void;
112
57
  setMaxSliceId: (elementId: string, imageIndex: number) => void;
58
+ setTimeId: (elementId: string, timeIndex: number) => void;
113
59
  get: (props: string | string[]) => any;
114
60
  addStoreListener: (listener: (data: Store) => {}) => (data: Store) => {};
115
61
  removeStoreListener: () => undefined;
116
- addViewportListener: (elementId: string, listener: (data: typeof DEFAULT_VIEWPORT) => {}) => void;
62
+ addViewportListener: (elementId: string, listener: (data: StoreViewport) => {}) => void;
117
63
  removeViewportListener: (elementId: string) => void;
118
64
  addSeriesListener: (seriesId: string, listener: (data: StoreSeries) => {}) => void;
119
65
  removeSeriesListener: (seriesId: string) => void;
@@ -13,7 +13,7 @@ import type { ImageObject, MetaData, Series } from "../types";
13
13
  * @param {number} sliceIndex - Optional custom index to overwrite slice index as default one
14
14
  */
15
15
  export declare const updateLarvitarManager: (imageObject: ImageObject, customId?: string, sliceIndex?: number) => {
16
- [key: string]: Series | import("./nrrdLoader").NrrdSeries;
16
+ [key: string]: Series | import("../types").NrrdSeries;
17
17
  };
18
18
  /**
19
19
  * This function can be called in order to populate the Larvitar manager
@@ -24,7 +24,7 @@ export declare const updateLarvitarManager: (imageObject: ImageObject, customId?
24
24
  * @returns {manager} the Larvitar manager
25
25
  */
26
26
  export declare const populateLarvitarManager: (seriesId: string, seriesData: Series) => {
27
- [key: string]: Series | import("./nrrdLoader").NrrdSeries;
27
+ [key: string]: Series | import("../types").NrrdSeries;
28
28
  };
29
29
  /**
30
30
  * Return the common data loader manager
@@ -33,7 +33,7 @@ export declare const populateLarvitarManager: (seriesId: string, seriesData: Ser
33
33
  * @returns {Object} the loader manager
34
34
  */
35
35
  export declare const getLarvitarManager: () => {
36
- [key: string]: Series | import("./nrrdLoader").NrrdSeries;
36
+ [key: string]: Series | import("../types").NrrdSeries;
37
37
  };
38
38
  /**
39
39
  * Return the common image tracker
@@ -64,7 +64,7 @@ export declare const removeSeriesFromLarvitarManager: (seriesId: string) => void
64
64
  * @param {String} seriesId The Id of the series
65
65
  * @return {Object} larvitar manager data
66
66
  */
67
- export declare const getSeriesDataFromLarvitarManager: (seriesId: string) => Series | import("./nrrdLoader").NrrdSeries | null;
67
+ export declare const getSeriesDataFromLarvitarManager: (seriesId: string) => Series | import("../types").NrrdSeries | null;
68
68
  /**
69
69
  * Compute and return image frame
70
70
  * @instance
@@ -3,56 +3,7 @@
3
3
  * custom NRRD Loader
4
4
  */
5
5
  import { ImageLoader } from "cornerstone-core";
6
- import type { Instance, Volume, MetaData } from "../types";
7
- import { DataSet } from "dicom-parser";
8
- type NrrdInputVolume = {
9
- header: {
10
- sizes: number[];
11
- "space directions": number[][];
12
- "space origin": [number, number];
13
- kinds: string[];
14
- type: string;
15
- };
16
- data: Uint16Array;
17
- };
18
- export type NrrdSeries = {
19
- currentImageIdIndex: number;
20
- imageIds: string[];
21
- instances: {
22
- [key: string]: Instance;
23
- };
24
- instanceUIDs: {
25
- [key: string]: string;
26
- };
27
- numberOfImages: number;
28
- seriesDescription: string;
29
- seriesUID: string;
30
- customLoader: string;
31
- nrrdHeader: NrrdHeader;
32
- bytes: number;
33
- dataSet?: DataSet;
34
- metadata?: MetaData;
35
- ecgData?: number[];
36
- };
37
- type NrrdHeader = {
38
- volume: Volume;
39
- intercept: number;
40
- slope: number;
41
- repr: string;
42
- phase: string;
43
- study_description: string;
44
- series_description: string;
45
- acquisition_date: string;
46
- [imageId: string]: string | number | Volume | NrrdInstance;
47
- };
48
- type NrrdInstance = {
49
- instanceUID: string;
50
- seriesDescription: string;
51
- seriesModality: string;
52
- patientName: string;
53
- bitsAllocated: number;
54
- pixelRepresentation: string;
55
- };
6
+ import type { NrrdHeader, NrrdInputVolume, NrrdSeries } from "../types";
56
7
  /**
57
8
  * Build the data structure for the provided image orientation
58
9
  * @instance
@@ -110,4 +61,3 @@ export declare const getNrrdSerieDimensions: () => {
110
61
  coronal: number[];
111
62
  sagittal: number[];
112
63
  };
113
- export {};
package/dist/larvitar.js CHANGED
@@ -81931,18 +81931,24 @@ const storeViewportData = function (image, elementId, viewport, data) {
81931
81931
  (0, imageStore_1.set)(["maxPixelValue", elementId, image.maxPixelValue]);
81932
81932
  // slice id from 0 to n - 1
81933
81933
  (0, imageStore_1.set)(["minSliceId", elementId, 0]);
81934
- (0, imageStore_1.set)(["sliceId", elementId, data.imageIndex]);
81934
+ if (data.imageIndex) {
81935
+ (0, imageStore_1.set)(["sliceId", elementId, data.imageIndex]);
81936
+ }
81935
81937
  const pendingSliceId = imageStore_1.default.get(["viewports", elementId, "pendingSliceId"]);
81936
81938
  if (data.imageIndex == pendingSliceId) {
81937
81939
  (0, imageStore_1.set)(["pendingSliceId", elementId, undefined]);
81938
81940
  }
81939
- (0, imageStore_1.set)(["maxSliceId", elementId, data.numberOfSlices - 1]);
81941
+ if (data.numberOfSlices) {
81942
+ (0, imageStore_1.set)(["maxSliceId", elementId, data.numberOfSlices - 1]);
81943
+ }
81940
81944
  if (data.isTimeserie) {
81941
81945
  (0, imageStore_1.set)(["minTimeId", elementId, 0]);
81942
81946
  (0, imageStore_1.set)(["timeId", elementId, data.timeIndex || 0]);
81943
- (0, imageStore_1.set)(["maxTimeId", elementId, data.numberOfTemporalPositions - 1]);
81944
- let maxSliceId = data.numberOfSlices * data.numberOfTemporalPositions - 1;
81945
- (0, imageStore_1.set)(["maxSliceId", elementId, maxSliceId]);
81947
+ if (data.numberOfSlices && data.numberOfTemporalPositions) {
81948
+ (0, imageStore_1.set)(["maxTimeId", elementId, data.numberOfTemporalPositions - 1]);
81949
+ let maxSliceId = data.numberOfSlices * data.numberOfTemporalPositions - 1;
81950
+ (0, imageStore_1.set)(["maxSliceId", elementId, maxSliceId]);
81951
+ }
81946
81952
  (0, imageStore_1.set)(["timestamp", elementId, data.timestamp]);
81947
81953
  (0, imageStore_1.set)(["timestamps", elementId, data.timestamps]);
81948
81954
  (0, imageStore_1.set)(["timeIds", elementId, data.timeIds]);
@@ -81984,6 +81990,7 @@ const storeViewportData = function (image, elementId, viewport, data) {
81984
81990
  (0, imageStore_1.set)(["isMultiframe", elementId, data.isMultiframe]);
81985
81991
  (0, imageStore_1.set)(["isTimeserie", elementId, data.isTimeserie]);
81986
81992
  (0, imageStore_1.set)(["isPDF", elementId, false]);
81993
+ (0, imageStore_1.set)(["waveform", elementId, data.waveform]);
81987
81994
  };
81988
81995
  exports.storeViewportData = storeViewportData;
81989
81996
  /**
@@ -82150,6 +82157,7 @@ const getSeriesData = function (series, defaultProps) {
82150
82157
  : null;
82151
82158
  data.isColor = series.color;
82152
82159
  data.isPDF = series.isPDF;
82160
+ data.waveform = series.waveform;
82153
82161
  if (instance) {
82154
82162
  data.rows = instance.metadata.x00280010;
82155
82163
  data.cols = instance.metadata.x00280011;
@@ -82277,7 +82285,7 @@ exports.resliceSeries = resliceSeries;
82277
82285
  * for data config store.
82278
82286
  */
82279
82287
  Object.defineProperty(exports, "__esModule", ({ value: true }));
82280
- exports.set = exports.DEFAULT_VIEWPORT = void 0;
82288
+ exports.set = void 0;
82281
82289
  // external libraries
82282
82290
  const lodash_1 = __webpack_require__(6486);
82283
82291
  // Larvitar store object
@@ -82296,7 +82304,7 @@ const INITIAL_STORE_DATA = {
82296
82304
  viewports: {}
82297
82305
  };
82298
82306
  // default viewport object
82299
- exports.DEFAULT_VIEWPORT = {
82307
+ const DEFAULT_VIEWPORT = {
82300
82308
  loading: 0,
82301
82309
  ready: false,
82302
82310
  minSliceId: 0,
@@ -82320,6 +82328,7 @@ exports.DEFAULT_VIEWPORT = {
82320
82328
  isMultiframe: false,
82321
82329
  isTimeserie: false,
82322
82330
  isPDF: false,
82331
+ waveform: false,
82323
82332
  viewport: {
82324
82333
  scale: 0.0,
82325
82334
  rotation: 0.0,
@@ -82386,6 +82395,7 @@ const setValue = (store, data) => {
82386
82395
  case "isColor":
82387
82396
  case "isMultiframe":
82388
82397
  case "isPDF":
82398
+ case "waveform":
82389
82399
  case "isTimeserie":
82390
82400
  case "ready":
82391
82401
  if (!viewport) {
@@ -82547,7 +82557,7 @@ exports["default"] = {
82547
82557
  // add/remove viewports
82548
82558
  addViewport: (name) => {
82549
82559
  validateStore();
82550
- STORE.viewports[name] = (0, lodash_1.cloneDeep)(exports.DEFAULT_VIEWPORT);
82560
+ STORE.viewports[name] = (0, lodash_1.cloneDeep)(DEFAULT_VIEWPORT);
82551
82561
  },
82552
82562
  deleteViewport: (name) => {
82553
82563
  validateStore();
@@ -82580,6 +82590,9 @@ exports["default"] = {
82580
82590
  setMaxSliceId: (elementId, imageIndex) => {
82581
82591
  (0, exports.set)(["maxSliceId", elementId, imageIndex]);
82582
82592
  },
82593
+ setTimeId: (elementId, timeIndex) => {
82594
+ (0, exports.set)(["timeId", elementId, timeIndex]);
82595
+ },
82583
82596
  // get
82584
82597
  get: (props) => {
82585
82598
  validateStore();
@@ -84918,6 +84931,15 @@ const imageUtils_1 = __webpack_require__(8345);
84918
84931
  const commonLoader_1 = __webpack_require__(326);
84919
84932
  // global module variables
84920
84933
  let customImageLoaderCounter = 0;
84934
+ /*
84935
+ * This module provides the following functions to be exported:
84936
+ * buildNrrdImage(volume, seriesId, custom_header)
84937
+ * getNrrdImageId(customLoaderName)
84938
+ * loadNrrdImage(imageId)
84939
+ * getImageIdFromSlice(sliceNumber, orientation)
84940
+ * getSliceNumberFromImageId(imageId, orientation)
84941
+ * getNrrdSerieDimensions()
84942
+ */
84921
84943
  // TODO-ts: why it's different from cornerstone type ?
84922
84944
  // type Image = {
84923
84945
  // imageId: string;
@@ -86799,6 +86821,9 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
86799
86821
  };
86800
86822
  Object.defineProperty(exports, "__esModule", ({ value: true }));
86801
86823
  exports.generateCSV = exports.exportAnnotations = exports.saveAnnotations = exports.loadAnnotations = void 0;
86824
+ // deprecated file, to be removed
86825
+ // TODO-ts remove this file @mronzoni
86826
+ // @ts-nocheck
86802
86827
  // external libraries
86803
86828
  const cornerstone_core_1 = __importDefault(__webpack_require__(7371));
86804
86829
  const cornerstone_tools_1 = __importDefault(__webpack_require__(4030));
@@ -88911,7 +88936,7 @@ module.exports = JSON.parse('{"x00000000":{"tag":"x00000000","vr":"UL","vm":"1",
88911
88936
  /***/ ((module) => {
88912
88937
 
88913
88938
  "use strict";
88914
- module.exports = JSON.parse('{"name":"larvitar","keywords":["DICOM","imaging","medical","cornerstone"],"version":"2.0.6","description":"typescript library for parsing, loading, rendering and interacting with DICOM images","repository":{"url":"https://github.com/dvisionlab/Larvitar.git","type":"git"},"main":"dist/larvitar.js","types":"dist/index.d.ts","files":["dist"],"scripts":{"coverage":"typescript-coverage-report","generate-docs":"node_modules/.bin/jsdoc -c jsdoc.json","build":"webpack --config ./bundler/webpack.prod.js && cp ./dist/larvitar.js ./docs/examples/larvitar.js","dev":"webpack --progress --config ./bundler/webpack.dev.js && cp ./dist/larvitar.js ./docs/examples/larvitar.js","dev-wip":"webpack serve --config ./bundler/webpack.dev-wip.js"},"author":"Simone Manini <simone.manini@dvisionlab.com> (https://www.dvisionlab.com)","contributors":["Mattia Ronzoni <mattia.ronzoni@dvisionlab.com> (https://www.dvisionlab.com)","Sara Zanchi <sara.zanchi@dvisionlab.com> (https://www.dvisionlab.com)","Ale Re <ale.re@dvisionlab.com> (https://www.dvisionlab.com)","Laura Borghesi Re <laura.borghesi@dvisionlab.com> (https://www.dvisionlab.com)"],"license":"MIT","dependencies":{"@rollup/plugin-commonjs":"^17.1.0","cornerstone-core":"^2.6.1","cornerstone-file-image-loader":"^0.3.0","cornerstone-tools":"^6.0.7","cornerstone-wado-image-loader":"^4.13.2","cornerstone-web-image-loader":"^2.1.1","crypto-js":"^4.1.1","dicom-character-set":"^1.0.3","dicom-parser":"^1.8.13","docdash":"^1.2.0","hammerjs":"^2.0.8","jpeg-lossless-decoder-js":"^2.0.7","keycode-js":"^3.1.0","lodash":"^4.17.15","pako":"^1.0.10","papaparse":"^5.3.0","plotly.js-dist-min":"^2.27.1","uuid":"^8.3.2"},"devDependencies":{"@babel/core":"^7.21.8","@types/cornerstone-core":"^2.3.0","@types/crypto-js":"^4.1.1","@types/hammerjs":"^2.0.41","@types/lodash":"^4.14.192","@types/papaparse":"^5.3.7","@types/plotly.js":"^2.12.30","@types/plotly.js-dist-min":"^2.3.4","@types/uuid":"^9.0.1","babel-loader":"^9.1.2","clean-webpack-plugin":"^4.0.0","copy-webpack-plugin":"^11.0.0","fs":"^0.0.1-security","html-loader":"^4.2.0","html-webpack-plugin":"^5.5.0","ip":"^1.1.8","jsdoc":"^3.6.4","portfinder-sync":"^0.0.2","ts-loader":"^9.4.2","typescript":"^5.0.2","typescript-coverage-report":"^0.7.0","webpack":"^5.76.3","webpack-bundle-analyzer":"^4.8.0","webpack-cli":"^5.0.1","webpack-dev-server":"^4.13.1"}}');
88939
+ module.exports = JSON.parse('{"name":"larvitar","keywords":["DICOM","imaging","medical","cornerstone"],"version":"2.0.8","description":"typescript library for parsing, loading, rendering and interacting with DICOM images","repository":{"url":"https://github.com/dvisionlab/Larvitar.git","type":"git"},"main":"dist/larvitar.js","types":"dist/index.d.ts","files":["dist","imaging/**/*.d.ts"],"scripts":{"coverage":"typescript-coverage-report","generate-docs":"node_modules/.bin/jsdoc -c jsdoc.json","build":"webpack --config ./bundler/webpack.prod.js && cp ./dist/larvitar.js ./docs/examples/larvitar.js","dev":"webpack --progress --config ./bundler/webpack.dev.js && cp ./dist/larvitar.js ./docs/examples/larvitar.js","dev-wip":"webpack serve --config ./bundler/webpack.dev-wip.js"},"author":"Simone Manini <simone.manini@dvisionlab.com> (https://www.dvisionlab.com)","contributors":["Mattia Ronzoni <mattia.ronzoni@dvisionlab.com> (https://www.dvisionlab.com)","Sara Zanchi <sara.zanchi@dvisionlab.com> (https://www.dvisionlab.com)","Ale Re <ale.re@dvisionlab.com> (https://www.dvisionlab.com)","Laura Borghesi Re <laura.borghesi@dvisionlab.com> (https://www.dvisionlab.com)"],"license":"MIT","dependencies":{"@rollup/plugin-commonjs":"^17.1.0","cornerstone-core":"^2.6.1","cornerstone-file-image-loader":"^0.3.0","cornerstone-tools":"^6.0.7","cornerstone-wado-image-loader":"^4.13.2","cornerstone-web-image-loader":"^2.1.1","crypto-js":"^4.1.1","dicom-character-set":"^1.0.3","dicom-parser":"^1.8.13","docdash":"^1.2.0","hammerjs":"^2.0.8","jpeg-lossless-decoder-js":"^2.0.7","keycode-js":"^3.1.0","lodash":"^4.17.15","pako":"^1.0.10","papaparse":"^5.3.0","plotly.js-dist-min":"^2.27.1","uuid":"^8.3.2"},"devDependencies":{"@babel/core":"^7.21.8","@types/cornerstone-core":"^2.3.0","@types/crypto-js":"^4.1.1","@types/hammerjs":"^2.0.41","@types/lodash":"^4.14.192","@types/papaparse":"^5.3.7","@types/plotly.js":"^2.12.30","@types/plotly.js-dist-min":"^2.3.4","@types/uuid":"^9.0.1","babel-loader":"^9.1.2","clean-webpack-plugin":"^4.0.0","copy-webpack-plugin":"^11.0.0","fs":"^0.0.1-security","html-loader":"^4.2.0","html-webpack-plugin":"^5.5.0","ip":"^1.1.8","jsdoc":"^3.6.4","portfinder-sync":"^0.0.2","ts-loader":"^9.4.2","typescript":"^5.0.2","typescript-coverage-report":"^0.7.0","webpack":"^5.76.3","webpack-bundle-analyzer":"^4.8.0","webpack-cli":"^5.0.1","webpack-dev-server":"^4.13.1"}}');
88915
88940
 
88916
88941
  /***/ })
88917
88942