PageSourceSearch

https://rology.net/assets/viewer/lib/cornerstoneTools.js

js rology.net collected 2026-09-26 08:09:53 UTC 1,294,639 bytes, 30,778 lines download raw bytes

vendor: 5,696 bytes, lines 1-139
1/*! cornerstone-tools - 3.16.0 - 2019-07-18 | (c) 2017 Chris Hafey | https://github.com/cornerstonejs/cornerstoneTools */
2(function webpackUniversalModuleDefinition(root, factory) {
3	if(typeof exports === 'object' && typeof module === 'object')
4		module.exports = factory();
5	else if(typeof define === 'function' && define.amd)
6		define("cornerstone-tools", [], factory);
7	else if(typeof exports === 'object')
8		exports["cornerstone-tools"] = factory();
9	else
10		root["cornerstoneTools"] = factory();
11})(window, function() {
12return /******/ (function(modules) { // webpackBootstrap
13/******/ 	function hotDisposeChunk(chunkId) {
14/******/ 		delete installedChunks[chunkId];
15/******/ 	}
16/******/ 	var parentHotUpdateCallback = window["webpackHotUpdate"];
17/******/ 	window["webpackHotUpdate"] = // eslint-disable-next-line no-unused-vars
18/******/ 	function webpackHotUpdateCallback(chunkId, moreModules) {
19/******/ 		hotAddUpdateChunk(chunkId, moreModules);
20/******/ 		if (parentHotUpdateCallback) parentHotUpdateCallback(chunkId, moreModules);
21/******/ 	} ;
22/******/
23/******/ 	// eslint-disable-next-line no-unused-vars
24/******/ 	function hotDownloadUpdateChunk(chunkId) {
25/******/ 		var head = document.getElementsByTagName("head")[0];
26/******/ 		var script = document.createElement("script");
27/******/ 		script.charset = "utf-8";
28/******/ 		script.src = __webpack_require__.p + "" + chunkId + "." + hotCurrentHash + ".hot-update.js";
29/******/ 		;
30/******/ 		head.appendChild(script);
31/******/ 	}
32/******/
33/******/ 	// eslint-disable-next-line no-unused-vars
34/******/ 	function hotDownloadManifest(requestTimeout) {
35/******/ 		requestTimeout = requestTimeout || 10000;
36/******/ 		return new Promise(function(resolve, reject) {
37/******/ 			if (typeof XMLHttpRequest === "undefined")
38/******/ 				return reject(new Error("No browser support"));
39/******/ 			try {
40/******/ 				var request = new XMLHttpRequest();
41/******/ 				var requestPath = __webpack_require__.p + "" + hotCurrentHash + ".hot-update.json";
42/******/ 				request.open("GET", requestPath, true);
43/******/ 				request.timeout = requestTimeout;
44/******/ 				request.send(null);
45/******/ 			} catch (err) {
46/******/ 				return reject(err);
47/******/ 			}
48/******/ 			request.onreadystatechange = function() {
49/******/ 				if (request.readyState !== 4) return;
50/******/ 				if (request.status === 0) {
51/******/ 					// timeout
52/******/ 					reject(
53/******/ 						new Error("Manifest request to " + requestPath + " timed out.")
54/******/ 					);
55/******/ 				} else if (request.status === 404) {
56/******/ 					// no update available
57/******/ 					resolve();
58/******/ 				} else if (request.status !== 200 && request.status !== 304) {
59/******/ 					// other failure
60/******/ 					reject(new Error("Manifest request to " + requestPath + " failed."));
61/******/ 				} else {
62/******/ 					// success
63/******/ 					try {
64/******/ 						var update = JSON.parse(request.responseText);
65/******/ 					} catch (e) {
66/******/ 						reject(e);
67/******/ 						return;
68/******/ 					}
69/******/ 					resolve(update);
70/******/ 				}
71/******/ 			};
72/******/ 		});
73/******/ 	}
74/******/
75/******/ 	var hotApplyOnUpdate = true;
76/******/ 	var hotCurrentHash = "629cef98364aabf113b0"; // eslint-disable-line no-unused-vars
77/******/ 	var hotRequestTimeout = 10000;
78/******/ 	var hotCurrentModuleData = {};
79/******/ 	var hotCurrentChildModule; // eslint-disable-line no-unused-vars
80/******/ 	var hotCurrentParents = []; // eslint-disable-line no-unused-vars
81/******/ 	var hotCurrentParentsTemp = []; // eslint-disable-line no-unused-vars
82/******/
83/******/ 	// eslint-disable-next-line no-unused-vars
84/******/ 	function hotCreateRequire(moduleId) {
85/******/ 		var me = installedModules[moduleId];
86/******/ 		if (!me) return __webpack_require__;
87/******/ 		var fn = function(request) {
88/******/ 			if (me.hot.active) {
89/******/ 				if (installedModules[request]) {
90/******/ 					if (installedModules[request].parents.indexOf(moduleId) === -1)
91/******/ 						installedModules[request].parents.push(moduleId);
92/******/ 				} else {
93/******/ 					hotCurrentParents = [moduleId];
94/******/ 					hotCurrentChildModule = request;
95/******/ 				}
96/******/ 				if (me.children.indexOf(request) === -1) me.children.push(request);
97/******/ 			} else {
98/******/ 				console.warn(
99/******/ 					"[HMR] unexpected require(" +
100/******/ 						request +
101/******/ 						") from disposed module " +
102/******/ 						moduleId
103/******/ 				);
104/******/ 				hotCurrentParents = [];
105/******/ 			}
106/******/ 			return __webpack_require__(request);
107/******/ 		};
108/******/ 		var ObjectFactory = function ObjectFactory(name) {
109/******/ 			return {
110/******/ 				configurable: true,
111/******/ 				enumerable: true,
112/******/ 				get: function() {
113/******/ 					return __webpack_require__[name];
114/******/ 				},
115/******/ 				set: function(value) {
116/******/ 					__webpack_require__[name] = value;
117/******/ 				}
118/******/ 			};
119/******/ 		};
120/******/ 		for (var name in __webpack_require__) {
121/******/ 			if (
122/******/ 				Object.prototype.hasOwnProperty.call(__webpack_require__, name) &&
123/******/ 				name !== "e"
124/******/ 			) {
125/******/ 				Object.defineProperty(fn, name, ObjectFactory(name));
126/******/ 			}
127/******/ 		}
128/******/ 		fn.e = function(chunkId) {
129/******/ 			if (hotStatus === "ready") hotSetStatus("prepare");
130/******/ 			hotChunksLoading++;
131/******/ 			return __webpack_require__.e(chunkId).then(finishChunkLoading, function(err) {
132/******/ 				finishChunkLoading();
133/******/ 				throw err;
134/******/ 			});
135/******/
136/******/ 			function finishChunkLoading() {
137/******/ 				hotChunksLoading--;
138/******/ 				if (hotStatus === "prepare") {
139/******/ 					if (!hotWaitingFilesMap[chunkId]) {
vendor: 7,286 bytes, lines 140-349
140/******/ 						hotEnsureUpdateChunk(chunkId);
141/******/ 					}
142/******/ 					if (hotChunksLoading === 0 && hotWaitingFiles === 0) {
143/******/ 						hotUpdateDownloaded();
144/******/ 					}
145/******/ 				}
146/******/ 			}
147/******/ 		};
148/******/ 		return fn;
149/******/ 	}
150/******/
151/******/ 	// eslint-disable-next-line no-unused-vars
152/******/ 	function hotCreateModule(moduleId) {
153/******/ 		var hot = {
154/******/ 			// private stuff
155/******/ 			_acceptedDependencies: {},
156/******/ 			_declinedDependencies: {},
157/******/ 			_selfAccepted: false,
158/******/ 			_selfDeclined: false,
159/******/ 			_disposeHandlers: [],
160/******/ 			_main: hotCurrentChildModule !== moduleId,
161/******/
162/******/ 			// Module API
163/******/ 			active: true,
164/******/ 			accept: function(dep, callback) {
165/******/ 				if (typeof dep === "undefined") hot._selfAccepted = true;
166/******/ 				else if (typeof dep === "function") hot._selfAccepted = dep;
167/******/ 				else if (typeof dep === "object")
168/******/ 					for (var i = 0; i < dep.length; i++)
169/******/ 						hot._acceptedDependencies[dep[i]] = callback || function() {};
170/******/ 				else hot._acceptedDependencies[dep] = callback || function() {};
171/******/ 			},
172/******/ 			decline: function(dep) {
173/******/ 				if (typeof dep === "undefined") hot._selfDeclined = true;
174/******/ 				else if (typeof dep === "object")
175/******/ 					for (var i = 0; i < dep.length; i++)
176/******/ 						hot._declinedDependencies[dep[i]] = true;
177/******/ 				else hot._declinedDependencies[dep] = true;
178/******/ 			},
179/******/ 			dispose: function(callback) {
180/******/ 				hot._disposeHandlers.push(callback);
181/******/ 			},
182/******/ 			addDisposeHandler: function(callback) {
183/******/ 				hot._disposeHandlers.push(callback);
184/******/ 			},
185/******/ 			removeDisposeHandler: function(callback) {
186/******/ 				var idx = hot._disposeHandlers.indexOf(callback);
187/******/ 				if (idx >= 0) hot._disposeHandlers.splice(idx, 1);
188/******/ 			},
189/******/
190/******/ 			// Management API
191/******/ 			check: hotCheck,
192/******/ 			apply: hotApply,
193/******/ 			status: function(l) {
194/******/ 				if (!l) return hotStatus;
195/******/ 				hotStatusHandlers.push(l);
196/******/ 			},
197/******/ 			addStatusHandler: function(l) {
198/******/ 				hotStatusHandlers.push(l);
199/******/ 			},
200/******/ 			removeStatusHandler: function(l) {
201/******/ 				var idx = hotStatusHandlers.indexOf(l);
202/******/ 				if (idx >= 0) hotStatusHandlers.splice(idx, 1);
203/******/ 			},
204/******/
205/******/ 			//inherit from previous dispose call
206/******/ 			data: hotCurrentModuleData[moduleId]
207/******/ 		};
208/******/ 		hotCurrentChildModule = undefined;
209/******/ 		return hot;
210/******/ 	}
211/******/
212/******/ 	var hotStatusHandlers = [];
213/******/ 	var hotStatus = "idle";
214/******/
215/******/ 	function hotSetStatus(newStatus) {
216/******/ 		hotStatus = newStatus;
217/******/ 		for (var i = 0; i < hotStatusHandlers.length; i++)
218/******/ 			hotStatusHandlers[i].call(null, newStatus);
219/******/ 	}
220/******/
221/******/ 	// while downloading
222/******/ 	var hotWaitingFiles = 0;
223/******/ 	var hotChunksLoading = 0;
224/******/ 	var hotWaitingFilesMap = {};
225/******/ 	var hotRequestedFilesMap = {};
226/******/ 	var hotAvailableFilesMap = {};
227/******/ 	var hotDeferred;
228/******/
229/******/ 	// The update info
230/******/ 	var hotUpdate, hotUpdateNewHash;
231/******/
232/******/ 	function toModuleId(id) {
233/******/ 		var isNumber = +id + "" === id;
234/******/ 		return isNumber ? +id : id;
235/******/ 	}
236/******/
237/******/ 	function hotCheck(apply) {
238/******/ 		if (hotStatus !== "idle")
239/******/ 			throw new Error("check() is only allowed in idle status");
240/******/ 		hotApplyOnUpdate = apply;
241/******/ 		hotSetStatus("check");
242/******/ 		return hotDownloadManifest(hotRequestTimeout).then(function(update) {
243/******/ 			if (!update) {
244/******/ 				hotSetStatus("idle");
245/******/ 				return null;
246/******/ 			}
247/******/ 			hotRequestedFilesMap = {};
248/******/ 			hotWaitingFilesMap = {};
249/******/ 			hotAvailableFilesMap = update.c;
250/******/ 			hotUpdateNewHash = update.h;
251/******/
252/******/ 			hotSetStatus("prepare");
253/******/ 			var promise = new Promise(function(resolve, reject) {
254/******/ 				hotDeferred = {
255/******/ 					resolve: resolve,
256/******/ 					reject: reject
257/******/ 				};
258/******/ 			});
259/******/ 			hotUpdate = {};
260/******/ 			var chunkId = "cornerstoneTools";
261/******/ 			{
262/******/ 				// eslint-disable-line no-lone-blocks
263/******/ 				/*globals chunkId */
264/******/ 				hotEnsureUpdateChunk(chunkId);
265/******/ 			}
266/******/ 			if (
267/******/ 				hotStatus === "prepare" &&
268/******/ 				hotChunksLoading === 0 &&
269/******/ 				hotWaitingFiles === 0
270/******/ 			) {
271/******/ 				hotUpdateDownloaded();
272/******/ 			}
273/******/ 			return promise;
274/******/ 		});
275/******/ 	}
276/******/
277/******/ 	// eslint-disable-next-line no-unused-vars
278/******/ 	function hotAddUpdateChunk(chunkId, moreModules) {
279/******/ 		if (!hotAvailableFilesMap[chunkId] || !hotRequestedFilesMap[chunkId])
280/******/ 			return;
281/******/ 		hotRequestedFilesMap[chunkId] = false;
282/******/ 		for (var moduleId in moreModules) {
283/******/ 			if (Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {
284/******/ 				hotUpdate[moduleId] = moreModules[moduleId];
285/******/ 			}
286/******/ 		}
287/******/ 		if (--hotWaitingFiles === 0 && hotChunksLoading === 0) {
288/******/ 			hotUpdateDownloaded();
289/******/ 		}
290/******/ 	}
291/******/
292/******/ 	function hotEnsureUpdateChunk(chunkId) {
293/******/ 		if (!hotAvailableFilesMap[chunkId]) {
294/******/ 			hotWaitingFilesMap[chunkId] = true;
295/******/ 		} else {
296/******/ 			hotRequestedFilesMap[chunkId] = true;
297/******/ 			hotWaitingFiles++;
298/******/ 			hotDownloadUpdateChunk(chunkId);
299/******/ 		}
300/******/ 	}
301/******/
302/******/ 	function hotUpdateDownloaded() {
303/******/ 		hotSetStatus("ready");
304/******/ 		var deferred = hotDeferred;
305/******/ 		hotDeferred = null;
306/******/ 		if (!deferred) return;
307/******/ 		if (hotApplyOnUpdate) {
308/******/ 			// Wrap deferred object in Promise to mark it as a well-handled Promise to
309/******/ 			// avoid triggering uncaught exception warning in Chrome.
310/******/ 			// See https://bugs.chromium.org/p/chromium/issues/detail?id=465666
311/******/ 			Promise.resolve()
312/******/ 				.then(function() {
313/******/ 					return hotApply(hotApplyOnUpdate);
314/******/ 				})
315/******/ 				.then(
316/******/ 					function(result) {
317/******/ 						deferred.resolve(result);
318/******/ 					},
319/******/ 					function(err) {
320/******/ 						deferred.reject(err);
321/******/ 					}
322/******/ 				);
323/******/ 		} else {
324/******/ 			var outdatedModules = [];
325/******/ 			for (var id in hotUpdate) {
326/******/ 				if (Object.prototype.hasOwnProperty.call(hotUpdate, id)) {
327/******/ 					outdatedModules.push(toModuleId(id));
328/******/ 				}
329/******/ 			}
330/******/ 			deferred.resolve(outdatedModules);
331/******/ 		}
332/******/ 	}
333/******/
334/******/ 	function hotApply(options) {
335/******/ 		if (hotStatus !== "ready")
336/******/ 			throw new Error("apply() is only allowed in ready status");
337/******/ 		options = options || {};
338/******/
339/******/ 		var cb;
340/******/ 		var i;
341/******/ 		var j;
342/******/ 		var module;
343/******/ 		var moduleId;
344/******/
345/******/ 		function getAffectedStuff(updateModuleId) {
346/******/ 			var outdatedModules = [updateModuleId];
347/******/ 			var outdatedDependencies = {};
348/******/
349/******/ 			var queue = outdatedModules.slice()
vendor: 6,483 bytes, lines 349-526
349.map(function(id) {
350/******/ 				return {
351/******/ 					chain: [id],
352/******/ 					id: id
353/******/ 				};
354/******/ 			});
355/******/ 			while (queue.length > 0) {
356/******/ 				var queueItem = queue.pop();
357/******/ 				var moduleId = queueItem.id;
358/******/ 				var chain = queueItem.chain;
359/******/ 				module = installedModules[moduleId];
360/******/ 				if (!module || module.hot._selfAccepted) continue;
361/******/ 				if (module.hot._selfDeclined) {
362/******/ 					return {
363/******/ 						type: "self-declined",
364/******/ 						chain: chain,
365/******/ 						moduleId: moduleId
366/******/ 					};
367/******/ 				}
368/******/ 				if (module.hot._main) {
369/******/ 					return {
370/******/ 						type: "unaccepted",
371/******/ 						chain: chain,
372/******/ 						moduleId: moduleId
373/******/ 					};
374/******/ 				}
375/******/ 				for (var i = 0; i < module.parents.length; i++) {
376/******/ 					var parentId = module.parents[i];
377/******/ 					var parent = installedModules[parentId];
378/******/ 					if (!parent) continue;
379/******/ 					if (parent.hot._declinedDependencies[moduleId]) {
380/******/ 						return {
381/******/ 							type: "declined",
382/******/ 							chain: chain.concat([parentId]),
383/******/ 							moduleId: moduleId,
384/******/ 							parentId: parentId
385/******/ 						};
386/******/ 					}
387/******/ 					if (outdatedModules.indexOf(parentId) !== -1) continue;
388/******/ 					if (parent.hot._acceptedDependencies[moduleId]) {
389/******/ 						if (!outdatedDependencies[parentId])
390/******/ 							outdatedDependencies[parentId] = [];
391/******/ 						addAllToSet(outdatedDependencies[parentId], [moduleId]);
392/******/ 						continue;
393/******/ 					}
394/******/ 					delete outdatedDependencies[parentId];
395/******/ 					outdatedModules.push(parentId);
396/******/ 					queue.push({
397/******/ 						chain: chain.concat([parentId]),
398/******/ 						id: parentId
399/******/ 					});
400/******/ 				}
401/******/ 			}
402/******/
403/******/ 			return {
404/******/ 				type: "accepted",
405/******/ 				moduleId: updateModuleId,
406/******/ 				outdatedModules: outdatedModules,
407/******/ 				outdatedDependencies: outdatedDependencies
408/******/ 			};
409/******/ 		}
410/******/
411/******/ 		function addAllToSet(a, b) {
412/******/ 			for (var i = 0; i < b.length; i++) {
413/******/ 				var item = b[i];
414/******/ 				if (a.indexOf(item) === -1) a.push(item);
415/******/ 			}
416/******/ 		}
417/******/
418/******/ 		// at begin all updates modules are outdated
419/******/ 		// the "outdated" status can propagate to parents if they don't accept the children
420/******/ 		var outdatedDependencies = {};
421/******/ 		var outdatedModules = [];
422/******/ 		var appliedUpdate = {};
423/******/
424/******/ 		var warnUnexpectedRequire = function warnUnexpectedRequire() {
425/******/ 			console.warn(
426/******/ 				"[HMR] unexpected require(" + result.moduleId + ") to disposed module"
427/******/ 			);
428/******/ 		};
429/******/
430/******/ 		for (var id in hotUpdate) {
431/******/ 			if (Object.prototype.hasOwnProperty.call(hotUpdate, id)) {
432/******/ 				moduleId = toModuleId(id);
433/******/ 				/** @type {TODO} */
434/******/ 				var result;
435/******/ 				if (hotUpdate[id]) {
436/******/ 					result = getAffectedStuff(moduleId);
437/******/ 				} else {
438/******/ 					result = {
439/******/ 						type: "disposed",
440/******/ 						moduleId: id
441/******/ 					};
442/******/ 				}
443/******/ 				/** @type {Error|false} */
444/******/ 				var abortError = false;
445/******/ 				var doApply = false;
446/******/ 				var doDispose = false;
447/******/ 				var chainInfo = "";
448/******/ 				if (result.chain) {
449/******/ 					chainInfo = "\nUpdate propagation: " + result.chain.join(" -> ");
450/******/ 				}
451/******/ 				switch (result.type) {
452/******/ 					case "self-declined":
453/******/ 						if (options.onDeclined) options.onDeclined(result);
454/******/ 						if (!options.ignoreDeclined)
455/******/ 							abortError = new Error(
456/******/ 								"Aborted because of self decline: " +
457/******/ 									result.moduleId +
458/******/ 									chainInfo
459/******/ 							);
460/******/ 						break;
461/******/ 					case "declined":
462/******/ 						if (options.onDeclined) options.onDeclined(result);
463/******/ 						if (!options.ignoreDeclined)
464/******/ 							abortError = new Error(
465/******/ 								"Aborted because of declined dependency: " +
466/******/ 									result.moduleId +
467/******/ 									" in " +
468/******/ 									result.parentId +
469/******/ 									chainInfo
470/******/ 							);
471/******/ 						break;
472/******/ 					case "unaccepted":
473/******/ 						if (options.onUnaccepted) options.onUnaccepted(result);
474/******/ 						if (!options.ignoreUnaccepted)
475/******/ 							abortError = new Error(
476/******/ 								"Aborted because " + moduleId + " is not accepted" + chainInfo
477/******/ 							);
478/******/ 						break;
479/******/ 					case "accepted":
480/******/ 						if (options.onAccepted) options.onAccepted(result);
481/******/ 						doApply = true;
482/******/ 						break;
483/******/ 					case "disposed":
484/******/ 						if (options.onDisposed) options.onDisposed(result);
485/******/ 						doDispose = true;
486/******/ 						break;
487/******/ 					default:
488/******/ 						throw new Error("Unexception type " + result.type);
489/******/ 				}
490/******/ 				if (abortError) {
491/******/ 					hotSetStatus("abort");
492/******/ 					return Promise.reject(abortError);
493/******/ 				}
494/******/ 				if (doApply) {
495/******/ 					appliedUpdate[moduleId] = hotUpdate[moduleId];
496/******/ 					addAllToSet(outdatedModules, result.outdatedModules);
497/******/ 					for (moduleId in result.outdatedDependencies) {
498/******/ 						if (
499/******/ 							Object.prototype.hasOwnProperty.call(
500/******/ 								result.outdatedDependencies,
501/******/ 								moduleId
502/******/ 							)
503/******/ 						) {
504/******/ 							if (!outdatedDependencies[moduleId])
505/******/ 								outdatedDependencies[moduleId] = [];
506/******/ 							addAllToSet(
507/******/ 								outdatedDependencies[moduleId],
508/******/ 								result.outdatedDependencies[moduleId]
509/******/ 							);
510/******/ 						}
511/******/ 					}
512/******/ 				}
513/******/ 				if (doDispose) {
514/******/ 					addAllToSet(outdatedModules, [result.moduleId]);
515/******/ 					appliedUpdate[moduleId] = warnUnexpectedRequire;
516/******/ 				}
517/******/ 			}
518/******/ 		}
519/******/
520/******/ 		// Store self accepted outdated modules to require them later by the module system
521/******/ 		var outdatedSelfAcceptedModules = [];
522/******/ 		for (i = 0; i < outdatedModules.length; i++) {
523/******/ 			moduleId = outdatedModules[i];
524/******/ 			if (
525/******/ 				installedModules[moduleId] &&
526/******/ 				installedModules[moduleId].hot._selfAccepted
vendor: 6,962 bytes, lines 526-725
526
527/******/ 			)
528/******/ 				outdatedSelfAcceptedModules.push({
529/******/ 					module: moduleId,
530/******/ 					errorHandler: installedModules[moduleId].hot._selfAccepted
531/******/ 				});
532/******/ 		}
533/******/
534/******/ 		// Now in "dispose" phase
535/******/ 		hotSetStatus("dispose");
536/******/ 		Object.keys(hotAvailableFilesMap).forEach(function(chunkId) {
537/******/ 			if (hotAvailableFilesMap[chunkId] === false) {
538/******/ 				hotDisposeChunk(chunkId);
539/******/ 			}
540/******/ 		});
541/******/
542/******/ 		var idx;
543/******/ 		var queue = outdatedModules.slice();
544/******/ 		while (queue.length > 0) {
545/******/ 			moduleId = queue.pop();
546/******/ 			module = installedModules[moduleId];
547/******/ 			if (!module) continue;
548/******/
549/******/ 			var data = {};
550/******/
551/******/ 			// Call dispose handlers
552/******/ 			var disposeHandlers = module.hot._disposeHandlers;
553/******/ 			for (j = 0; j < disposeHandlers.length; j++) {
554/******/ 				cb = disposeHandlers[j];
555/******/ 				cb(data);
556/******/ 			}
557/******/ 			hotCurrentModuleData[moduleId] = data;
558/******/
559/******/ 			// disable module (this disables requires from this module)
560/******/ 			module.hot.active = false;
561/******/
562/******/ 			// remove module from cache
563/******/ 			delete installedModules[moduleId];
564/******/
565/******/ 			// when disposing there is no need to call dispose handler
566/******/ 			delete outdatedDependencies[moduleId];
567/******/
568/******/ 			// remove "parents" references from all children
569/******/ 			for (j = 0; j < module.children.length; j++) {
570/******/ 				var child = installedModules[module.children[j]];
571/******/ 				if (!child) continue;
572/******/ 				idx = child.parents.indexOf(moduleId);
573/******/ 				if (idx >= 0) {
574/******/ 					child.parents.splice(idx, 1);
575/******/ 				}
576/******/ 			}
577/******/ 		}
578/******/
579/******/ 		// remove outdated dependency from module children
580/******/ 		var dependency;
581/******/ 		var moduleOutdatedDependencies;
582/******/ 		for (moduleId in outdatedDependencies) {
583/******/ 			if (
584/******/ 				Object.prototype.hasOwnProperty.call(outdatedDependencies, moduleId)
585/******/ 			) {
586/******/ 				module = installedModules[moduleId];
587/******/ 				if (module) {
588/******/ 					moduleOutdatedDependencies = outdatedDependencies[moduleId];
589/******/ 					for (j = 0; j < moduleOutdatedDependencies.length; j++) {
590/******/ 						dependency = moduleOutdatedDependencies[j];
591/******/ 						idx = module.children.indexOf(dependency);
592/******/ 						if (idx >= 0) module.children.splice(idx, 1);
593/******/ 					}
594/******/ 				}
595/******/ 			}
596/******/ 		}
597/******/
598/******/ 		// Not in "apply" phase
599/******/ 		hotSetStatus("apply");
600/******/
601/******/ 		hotCurrentHash = hotUpdateNewHash;
602/******/
603/******/ 		// insert new code
604/******/ 		for (moduleId in appliedUpdate) {
605/******/ 			if (Object.prototype.hasOwnProperty.call(appliedUpdate, moduleId)) {
606/******/ 				modules[moduleId] = appliedUpdate[moduleId];
607/******/ 			}
608/******/ 		}
609/******/
610/******/ 		// call accept handlers
611/******/ 		var error = null;
612/******/ 		for (moduleId in outdatedDependencies) {
613/******/ 			if (
614/******/ 				Object.prototype.hasOwnProperty.call(outdatedDependencies, moduleId)
615/******/ 			) {
616/******/ 				module = installedModules[moduleId];
617/******/ 				if (module) {
618/******/ 					moduleOutdatedDependencies = outdatedDependencies[moduleId];
619/******/ 					var callbacks = [];
620/******/ 					for (i = 0; i < moduleOutdatedDependencies.length; i++) {
621/******/ 						dependency = moduleOutdatedDependencies[i];
622/******/ 						cb = module.hot._acceptedDependencies[dependency];
623/******/ 						if (cb) {
624/******/ 							if (callbacks.indexOf(cb) !== -1) continue;
625/******/ 							callbacks.push(cb);
626/******/ 						}
627/******/ 					}
628/******/ 					for (i = 0; i < callbacks.length; i++) {
629/******/ 						cb = callbacks[i];
630/******/ 						try {
631/******/ 							cb(moduleOutdatedDependencies);
632/******/ 						} catch (err) {
633/******/ 							if (options.onErrored) {
634/******/ 								options.onErrored({
635/******/ 									type: "accept-errored",
636/******/ 									moduleId: moduleId,
637/******/ 									dependencyId: moduleOutdatedDependencies[i],
638/******/ 									error: err
639/******/ 								});
640/******/ 							}
641/******/ 							if (!options.ignoreErrored) {
642/******/ 								if (!error) error = err;
643/******/ 							}
644/******/ 						}
645/******/ 					}
646/******/ 				}
647/******/ 			}
648/******/ 		}
649/******/
650/******/ 		// Load self accepted modules
651/******/ 		for (i = 0; i < outdatedSelfAcceptedModules.length; i++) {
652/******/ 			var item = outdatedSelfAcceptedModules[i];
653/******/ 			moduleId = item.module;
654/******/ 			hotCurrentParents = [moduleId];
655/******/ 			try {
656/******/ 				__webpack_require__(moduleId);
657/******/ 			} catch (err) {
658/******/ 				if (typeof item.errorHandler === "function") {
659/******/ 					try {
660/******/ 						item.errorHandler(err);
661/******/ 					} catch (err2) {
662/******/ 						if (options.onErrored) {
663/******/ 							options.onErrored({
664/******/ 								type: "self-accept-error-handler-errored",
665/******/ 								moduleId: moduleId,
666/******/ 								error: err2,
667/******/ 								originalError: err
668/******/ 							});
669/******/ 						}
670/******/ 						if (!options.ignoreErrored) {
671/******/ 							if (!error) error = err2;
672/******/ 						}
673/******/ 						if (!error) error = err;
674/******/ 					}
675/******/ 				} else {
676/******/ 					if (options.onErrored) {
677/******/ 						options.onErrored({
678/******/ 							type: "self-accept-errored",
679/******/ 							moduleId: moduleId,
680/******/ 							error: err
681/******/ 						});
682/******/ 					}
683/******/ 					if (!options.ignoreErrored) {
684/******/ 						if (!error) error = err;
685/******/ 					}
686/******/ 				}
687/******/ 			}
688/******/ 		}
689/******/
690/******/ 		// handle errors in accept handlers and self accepted module load
691/******/ 		if (error) {
692/******/ 			hotSetStatus("fail");
693/******/ 			return Promise.reject(error);
694/******/ 		}
695/******/
696/******/ 		hotSetStatus("idle");
697/******/ 		return new Promise(function(resolve) {
698/******/ 			resolve(outdatedModules);
699/******/ 		});
700/******/ 	}
701/******/
702/******/ 	// The module cache
703/******/ 	var installedModules = {};
704/******/
705/******/ 	// The require function
706/******/ 	function __webpack_require__(moduleId) {
707/******/
708/******/ 		// Check if module is in cache
709/******/ 		if(installedModules[moduleId]) {
710/******/ 			return installedModules[moduleId].exports;
711/******/ 		}
712/******/ 		// Create a new module (and put it into the cache)
713/******/ 		var module = installedModules[moduleId] = {
714/******/ 			i: moduleId,
715/******/ 			l: false,
716/******/ 			exports: {},
717/******/ 			hot: hotCreateModule(moduleId),
718/******/ 			parents: (hotCurrentParentsTemp = hotCurrentParents, hotCurrentParents = [], hotCurrentParentsTemp),
719/******/ 			children: []
720/******/ 		};
721/******/
722/******/ 		// Execute the module function
723/******/ 		modules[moduleId].call(module.exports, module, module.exports, hotCreateRequire(moduleId));
724/******/
725/******/ 		// Flag the module as loaded
vendor: 1,970 bytes, lines 726-779
726/******/ 		module.l = true;
727/******/
728/******/ 		// Return the exports of the module
729/******/ 		return module.exports;
730/******/ 	}
731/******/
732/******/
733/******/ 	// expose the modules object (__webpack_modules__)
734/******/ 	__webpack_require__.m = modules;
735/******/
736/******/ 	// expose the module cache
737/******/ 	__webpack_require__.c = installedModules;
738/******/
739/******/ 	// define getter function for harmony exports
740/******/ 	__webpack_require__.d = function(exports, name, getter) {
741/******/ 		if(!__webpack_require__.o(exports, name)) {
742/******/ 			Object.defineProperty(exports, name, {
743/******/ 				configurable: false,
744/******/ 				enumerable: true,
745/******/ 				get: getter
746/******/ 			});
747/******/ 		}
748/******/ 	};
749/******/
750/******/ 	// define __esModule on exports
751/******/ 	__webpack_require__.r = function(exports) {
752/******/ 		Object.defineProperty(exports, '__esModule', { value: true });
753/******/ 	};
754/******/
755/******/ 	// getDefaultExport function for compatibility with non-harmony modules
756/******/ 	__webpack_require__.n = function(module) {
757/******/ 		var getter = module && module.__esModule ?
758/******/ 			function getDefault() { return module['default']; } :
759/******/ 			function getModuleExports() { return module; };
760/******/ 		__webpack_require__.d(getter, 'a', getter);
761/******/ 		return getter;
762/******/ 	};
763/******/
764/******/ 	// Object.prototype.hasOwnProperty.call
765/******/ 	__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
766/******/
767/******/ 	// __webpack_public_path__
768/******/ 	__webpack_require__.p = "";
769/******/
770/******/ 	// __webpack_hash__
771/******/ 	__webpack_require__.h = function() { return hotCurrentHash; };
772/******/
773/******/
774/******/ 	// Load entry module and return exports
775/******/ 	return hotCreateRequire("./index.js")(__webpack_require__.s = "./index.js");
776/******/ })
777/************************************************************************/
778/******/ ({
779
vendor: 594 bytes, lines 780-800
780/***/ "../node_modules/@babel/runtime/helpers/arrayWithoutHoles.js":
781/*!*******************************************************************!*\
782  !*** ../node_modules/@babel/runtime/helpers/arrayWithoutHoles.js ***!
783  \*******************************************************************/
784/*! no static exports found */
785/***/ (function(module, exports) {
786
787function _arrayWithoutHoles(arr) {
788  if (Array.isArray(arr)) {
789    for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) {
790      arr2[i] = arr[i];
791    }
792
793    return arr2;
794  }
795}
796
797module.exports = _arrayWithoutHoles;
798
799/***/ }),
800
vendor: 602 bytes, lines 801-819
801/***/ "../node_modules/@babel/runtime/helpers/assertThisInitialized.js":
802/*!***********************************************************************!*\
803  !*** ../node_modules/@babel/runtime/helpers/assertThisInitialized.js ***!
804  \***********************************************************************/
805/*! no static exports found */
806/***/ (function(module, exports) {
807
808function _assertThisInitialized(self) {
809  if (self === void 0) {
810    throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
811  }
812
813  return self;
814}
815
816module.exports = _assertThisInitialized;
817
818/***/ }),
819
vendor: 1,172 bytes, lines 820-866
820/***/ "../node_modules/@babel/runtime/helpers/asyncToGenerator.js":
821/*!******************************************************************!*\
822  !*** ../node_modules/@babel/runtime/helpers/asyncToGenerator.js ***!
823  \******************************************************************/
824/*! no static exports found */
825/***/ (function(module, exports) {
826
827function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
828  try {
829    var info = gen[key](arg);
830    var value = info.value;
831  } catch (error) {
832    reject(error);
833    return;
834  }
835
836  if (info.done) {
837    resolve(value);
838  } else {
839    Promise.resolve(value).then(_next, _throw);
840  }
841}
842
843function _asyncToGenerator(fn) {
844  return function () {
845    var self = this,
846        args = arguments;
847    return new Promise(function (resolve, reject) {
848      var gen = fn.apply(self, args);
849
850      function _next(value) {
851        asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
852      }
853
854      function _throw(err) {
855        asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
856      }
857
858      _next(undefined);
859    });
860  };
861}
862
863module.exports = _asyncToGenerator;
864
865/***/ }),
866
vendor: 551 bytes, lines 867-883
867/***/ "../node_modules/@babel/runtime/helpers/classCallCheck.js":
868/*!****************************************************************!*\
869  !*** ../node_modules/@babel/runtime/helpers/classCallCheck.js ***!
870  \****************************************************************/
871/*! no static exports found */
872/***/ (function(module, exports) {
873
874function _classCallCheck(instance, Constructor) {
875  if (!(instance instanceof Constructor)) {
876    throw new TypeError("Cannot call a class as a function");
877  }
878}
879
880module.exports = _classCallCheck;
881
882/***/ }),
883
vendor: 939 bytes, lines 884-910
884/***/ "../node_modules/@babel/runtime/helpers/createClass.js":
885/*!*************************************************************!*\
886  !*** ../node_modules/@babel/runtime/helpers/createClass.js ***!
887  \*************************************************************/
888/*! no static exports found */
889/***/ (function(module, exports) {
890
891function _defineProperties(target, props) {
892  for (var i = 0; i < props.length; i++) {
893    var descriptor = props[i];
894    descriptor.enumerable = descriptor.enumerable || false;
895    descriptor.configurable = true;
896    if ("value" in descriptor) descriptor.writable = true;
897    Object.defineProperty(target, descriptor.key, descriptor);
898  }
899}
900
901function _createClass(Constructor, protoProps, staticProps) {
902  if (protoProps) _defineProperties(Constructor.prototype, protoProps);
903  if (staticProps) _defineProperties(Constructor, staticProps);
904  return Constructor;
905}
906
907module.exports = _createClass;
908
909/***/ }),
910
vendor: 622 bytes, lines 911-928
911/***/ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js":
912/*!****************************************************************!*\
913  !*** ../node_modules/@babel/runtime/helpers/getPrototypeOf.js ***!
914  \****************************************************************/
915/*! no static exports found */
916/***/ (function(module, exports) {
917
918function _getPrototypeOf(o) {
919  module.exports = _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {
920    return o.__proto__ || Object.getPrototypeOf(o);
921  };
922  return _getPrototypeOf(o);
923}
924
925module.exports = _getPrototypeOf;
926
927/***/ }),
928
vendor: 933 bytes, lines 929-956
929/***/ "../node_modules/@babel/runtime/helpers/inherits.js":
930/*!**********************************************************!*\
931  !*** ../node_modules/@babel/runtime/helpers/inherits.js ***!
932  \**********************************************************/
933/*! no static exports found */
934/***/ (function(module, exports, __webpack_require__) {
935
936var setPrototypeOf = __webpack_require__(/*! ./setPrototypeOf */ "../node_modules/@babel/runtime/helpers/setPrototypeOf.js");
937
938function _inherits(subClass, superClass) {
939  if (typeof superClass !== "function" && superClass !== null) {
940    throw new TypeError("Super expression must either be null or a function");
941  }
942
943  subClass.prototype = Object.create(superClass && superClass.prototype, {
944    constructor: {
945      value: subClass,
946      writable: true,
947      configurable: true
948    }
949  });
950  if (superClass) setPrototypeOf(subClass, superClass);
951}
952
953module.exports = _inherits;
954
955/***/ }),
956
vendor: 559 bytes, lines 957-971
957/***/ "../node_modules/@babel/runtime/helpers/iterableToArray.js":
958/*!*****************************************************************!*\
959  !*** ../node_modules/@babel/runtime/helpers/iterableToArray.js ***!
960  \*****************************************************************/
961/*! no static exports found */
962/***/ (function(module, exports) {
963
964function _iterableToArray(iter) {
965  if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter);
966}
967
968module.exports = _iterableToArray;
969
970/***/ }),
971
vendor: 512 bytes, lines 972-986
972/***/ "../node_modules/@babel/runtime/helpers/nonIterableSpread.js":
973/*!*******************************************************************!*\
974  !*** ../node_modules/@babel/runtime/helpers/nonIterableSpread.js ***!
975  \*******************************************************************/
976/*! no static exports found */
977/***/ (function(module, exports) {
978
979function _nonIterableSpread() {
980  throw new TypeError("Invalid attempt to spread non-iterable instance");
981}
982
983module.exports = _nonIterableSpread;
984
985/***/ }),
986
vendor: 914 bytes, lines 987-1009
987/***/ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js":
988/*!***************************************************************************!*\
989  !*** ../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js ***!
990  \***************************************************************************/
991/*! no static exports found */
992/***/ (function(module, exports, __webpack_require__) {
993
994var _typeof = __webpack_require__(/*! ../helpers/typeof */ "../node_modules/@babel/runtime/helpers/typeof.js");
995
996var assertThisInitialized = __webpack_require__(/*! ./assertThisInitialized */ "../node_modules/@babel/runtime/helpers/assertThisInitialized.js");
997
998function _possibleConstructorReturn(self, call) {
999  if (call && (_typeof(call) === "object" || typeof call === "function")) {
1000    return call;
1001  }
1002
1003  return assertThisInitialized(self);
1004}
1005
1006module.exports = _possibleConstructorReturn;
1007
1008/***/ }),
1009
vendor: 592 bytes, lines 1010-1029
1010/***/ "../node_modules/@babel/runtime/helpers/setPrototypeOf.js":
1011/*!****************************************************************!*\
1012  !*** ../node_modules/@babel/runtime/helpers/setPrototypeOf.js ***!
1013  \****************************************************************/
1014/*! no static exports found */
1015/***/ (function(module, exports) {
1016
1017function _setPrototypeOf(o, p) {
1018  module.exports = _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {
1019    o.__proto__ = p;
1020    return o;
1021  };
1022
1023  return _setPrototypeOf(o, p);
1024}
1025
1026module.exports = _setPrototypeOf;
1027
1028/***/ }),
1029
vendor: 944 bytes, lines 1030-1050
1030/***/ "../node_modules/@babel/runtime/helpers/toConsumableArray.js":
1031/*!*******************************************************************!*\
1032  !*** ../node_modules/@babel/runtime/helpers/toConsumableArray.js ***!
1033  \*******************************************************************/
1034/*! no static exports found */
1035/***/ (function(module, exports, __webpack_require__) {
1036
1037var arrayWithoutHoles = __webpack_require__(/*! ./arrayWithoutHoles */ "../node_modules/@babel/runtime/helpers/arrayWithoutHoles.js");
1038
1039var iterableToArray = __webpack_require__(/*! ./iterableToArray */ "../node_modules/@babel/runtime/helpers/iterableToArray.js");
1040
1041var nonIterableSpread = __webpack_require__(/*! ./nonIterableSpread */ "../node_modules/@babel/runtime/helpers/nonIterableSpread.js");
1042
1043function _toConsumableArray(arr) {
1044  return arrayWithoutHoles(arr) || iterableToArray(arr) || nonIterableSpread();
1045}
1046
1047module.exports = _toConsumableArray;
1048
1049/***/ }),
1050
vendor: 1,140 bytes, lines 1051-1077
1051/***/ "../node_modules/@babel/runtime/helpers/typeof.js":
1052/*!********************************************************!*\
1053  !*** ../node_modules/@babel/runtime/helpers/typeof.js ***!
1054  \********************************************************/
1055/*! no static exports found */
1056/***/ (function(module, exports) {
1057
1058function _typeof2(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof2 = function _typeof2(obj) { return typeof obj; }; } else { _typeof2 = function _typeof2(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof2(obj); }
1059
1060function _typeof(obj) {
1061  if (typeof Symbol === "function" && _typeof2(Symbol.iterator) === "symbol") {
1062    module.exports = _typeof = function _typeof(obj) {
1063      return _typeof2(obj);
1064    };
1065  } else {
1066    module.exports = _typeof = function _typeof(obj) {
1067      return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : _typeof2(obj);
1068    };
1069  }
1070
1071  return _typeof(obj);
1072}
1073
1074module.exports = _typeof;
1075
1076/***/ }),
1077
vendor: 478 bytes, lines 1078-1089
1078/***/ "../node_modules/@babel/runtime/regenerator/index.js":
1079/*!***********************************************************!*\
1080  !*** ../node_modules/@babel/runtime/regenerator/index.js ***!
1081  \***********************************************************/
1082/*! no static exports found */
1083/***/ (function(module, exports, __webpack_require__) {
1084
1085module.exports = __webpack_require__(/*! regenerator-runtime */ "../node_modules/regenerator-runtime/runtime-module.js");
1086
1087
1088/***/ }),
1089
vendor: 6,363 bytes, lines 1090-1365
1090/***/ "../node_modules/debug/src/browser.js":
1091/*!********************************************!*\
1092  !*** ../node_modules/debug/src/browser.js ***!
1093  \********************************************/
1094/*! no static exports found */
1095/***/ (function(module, exports, __webpack_require__) {
1096
1097/* WEBPACK VAR INJECTION */(function(process) {/* eslint-env browser */
1098
1099/**
1100 * This is the web browser implementation of `debug()`.
1101 */
1102
1103exports.log = log;
1104exports.formatArgs = formatArgs;
1105exports.save = save;
1106exports.load = load;
1107exports.useColors = useColors;
1108exports.storage = localstorage();
1109
1110/**
1111 * Colors.
1112 */
1113
1114exports.colors = [
1115	'#0000CC',
1116	'#0000FF',
1117	'#0033CC',
1118	'#0033FF',
1119	'#0066CC',
1120	'#0066FF',
1121	'#0099CC',
1122	'#0099FF',
1123	'#00CC00',
1124	'#00CC33',
1125	'#00CC66',
1126	'#00CC99',
1127	'#00CCCC',
1128	'#00CCFF',
1129	'#3300CC',
1130	'#3300FF',
1131	'#3333CC',
1132	'#3333FF',
1133	'#3366CC',
1134	'#3366FF',
1135	'#3399CC',
1136	'#3399FF',
1137	'#33CC00',
1138	'#33CC33',
1139	'#33CC66',
1140	'#33CC99',
1141	'#33CCCC',
1142	'#33CCFF',
1143	'#6600CC',
1144	'#6600FF',
1145	'#6633CC',
1146	'#6633FF',
1147	'#66CC00',
1148	'#66CC33',
1149	'#9900CC',
1150	'#9900FF',
1151	'#9933CC',
1152	'#9933FF',
1153	'#99CC00',
1154	'#99CC33',
1155	'#CC0000',
1156	'#CC0033',
1157	'#CC0066',
1158	'#CC0099',
1159	'#CC00CC',
1160	'#CC00FF',
1161	'#CC3300',
1162	'#CC3333',
1163	'#CC3366',
1164	'#CC3399',
1165	'#CC33CC',
1166	'#CC33FF',
1167	'#CC6600',
1168	'#CC6633',
1169	'#CC9900',
1170	'#CC9933',
1171	'#CCCC00',
1172	'#CCCC33',
1173	'#FF0000',
1174	'#FF0033',
1175	'#FF0066',
1176	'#FF0099',
1177	'#FF00CC',
1178	'#FF00FF',
1179	'#FF3300',
1180	'#FF3333',
1181	'#FF3366',
1182	'#FF3399',
1183	'#FF33CC',
1184	'#FF33FF',
1185	'#FF6600',
1186	'#FF6633',
1187	'#FF9900',
1188	'#FF9933',
1189	'#FFCC00',
1190	'#FFCC33'
1191];
1192
1193/**
1194 * Currently only WebKit-based Web Inspectors, Firefox >= v31,
1195 * and the Firebug extension (any Firefox version) are known
1196 * to support "%c" CSS customizations.
1197 *
1198 * TODO: add a `localStorage` variable to explicitly enable/disable colors
1199 */
1200
1201// eslint-disable-next-line complexity
1202function useColors() {
1203	// NB: In an Electron preload script, document will be defined but not fully
1204	// initialized. Since we know we're in Chrome, we'll just detect this case
1205	// explicitly
1206	if (typeof window !== 'undefined' && window.process && (window.process.type === 'renderer' || window.process.__nwjs)) {
1207		return true;
1208	}
1209
1210	// Internet Explorer and Edge do not support colors.
1211	if (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/)) {
1212		return false;
1213	}
1214
1215	// Is webkit? http://stackoverflow.com/a/16459606/376773
1216	// document is undefined in react-native: https://github.com/facebook/react-native/pull/1632
1217	return (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) ||
1218		// Is firebug? http://stackoverflow.com/a/398120/376773
1219		(typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) ||
1220		// Is firefox >= v31?
1221		// https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages
1222		(typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31) ||
1223		// Double check webkit in userAgent just in case we are in a worker
1224		(typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/));
1225}
1226
1227/**
1228 * Colorize log arguments if enabled.
1229 *
1230 * @api public
1231 */
1232
1233function formatArgs(args) {
1234	args[0] = (this.useColors ? '%c' : '') +
1235		this.namespace +
1236		(this.useColors ? ' %c' : ' ') +
1237		args[0] +
1238		(this.useColors ? '%c ' : ' ') +
1239		'+' + module.exports.humanize(this.diff);
1240
1241	if (!this.useColors) {
1242		return;
1243	}
1244
1245	const c = 'color: ' + this.color;
1246	args.splice(1, 0, c, 'color: inherit');
1247
1248	// The final "%c" is somewhat tricky, because there could be other
1249	// arguments passed either before or after the %c, so we need to
1250	// figure out the correct index to insert the CSS into
1251	let index = 0;
1252	let lastC = 0;
1253	args[0].replace(/%[a-zA-Z%]/g, match => {
1254		if (match === '%%') {
1255			return;
1256		}
1257		index++;
1258		if (match === '%c') {
1259			// We only are interested in the *last* %c
1260			// (the user may have provided their own)
1261			lastC = index;
1262		}
1263	});
1264
1265	args.splice(lastC, 0, c);
1266}
1267
1268/**
1269 * Invokes `console.log()` when available.
1270 * No-op when `console.log` is not a "function".
1271 *
1272 * @api public
1273 */
1274function log(...args) {
1275	// This hackery is required for IE8/9, where
1276	// the `console.log` function doesn't have 'apply'
1277	return typeof console === 'object' &&
1278		console.log &&
1279		console.log(...args);
1280}
1281
1282/**
1283 * Save `namespaces`.
1284 *
1285 * @param {String} namespaces
1286 * @api private
1287 */
1288function save(namespaces) {
1289	try {
1290		if (namespaces) {
1291			exports.storage.setItem('debug', namespaces);
1292		} else {
1293			exports.storage.removeItem('debug');
1294		}
1295	} catch (error) {
1296		// Swallow
1297		// XXX (@Qix-) should we be logging these?
1298	}
1299}
1300
1301/**
1302 * Load `namespaces`.
1303 *
1304 * @return {String} returns the previously persisted debug modes
1305 * @api private
1306 */
1307function load() {
1308	let r;
1309	try {
1310		r = exports.storage.getItem('debug');
1311	} catch (error) {
1312		// Swallow
1313		// XXX (@Qix-) should we be logging these?
1314	}
1315
1316	// If debug isn't set in LS, and we're in Electron, try to load $DEBUG
1317	if (!r && typeof process !== 'undefined' && 'env' in process) {
1318		r = process.env.DEBUG;
1319	}
1320
1321	return r;
1322}
1323
1324/**
1325 * Localstorage attempts to return the localstorage.
1326 *
1327 * This is necessary because safari throws
1328 * when a user disables cookies/localstorage
1329 * and you attempt to access it.
1330 *
1331 * @return {LocalStorage}
1332 * @api private
1333 */
1334
1335function localstorage() {
1336	try {
1337		// TVMLKit (Apple TV JS Runtime) does not have a window object, just localStorage in the global context
1338		// The Browser also has localStorage in the global context.
1339		return localStorage;
1340	} catch (error) {
1341		// Swallow
1342		// XXX (@Qix-) should we be logging these?
1343	}
1344}
1345
1346module.exports = __webpack_require__(/*! ./common */ "../node_modules/debug/src/common.js")(exports);
1347
1348const {formatters} = module.exports;
1349
1350/**
1351 * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.
1352 */
1353
1354formatters.j = function (v) {
1355	try {
1356		return JSON.stringify(v);
1357	} catch (error) {
1358		return '[UnexpectedJSONParseError]: ' + error.message;
1359	}
1360};
1361
1362/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../process/browser.js */ "../node_modules/process/browser.js")))
1363
1364/***/ }),
1365
vendor: 6,269 bytes, lines 1366-1642
1366/***/ "../node_modules/debug/src/common.js":
1367/*!*******************************************!*\
1368  !*** ../node_modules/debug/src/common.js ***!
1369  \*******************************************/
1370/*! no static exports found */
1371/***/ (function(module, exports, __webpack_require__) {
1372
1373
1374/**
1375 * This is the common logic for both the Node.js and web browser
1376 * implementations of `debug()`.
1377 */
1378
1379function setup(env) {
1380	createDebug.debug = createDebug;
1381	createDebug.default = createDebug;
1382	createDebug.coerce = coerce;
1383	createDebug.disable = disable;
1384	createDebug.enable = enable;
1385	createDebug.enabled = enabled;
1386	createDebug.humanize = __webpack_require__(/*! ms */ "../node_modules/ms/index.js");
1387
1388	Object.keys(env).forEach(key => {
1389		createDebug[key] = env[key];
1390	});
1391
1392	/**
1393	* Active `debug` instances.
1394	*/
1395	createDebug.instances = [];
1396
1397	/**
1398	* The currently active debug mode names, and names to skip.
1399	*/
1400
1401	createDebug.names = [];
1402	createDebug.skips = [];
1403
1404	/**
1405	* Map of special "%n" handling functions, for the debug "format" argument.
1406	*
1407	* Valid key names are a single, lower or upper-case letter, i.e. "n" and "N".
1408	*/
1409	createDebug.formatters = {};
1410
1411	/**
1412	* Selects a color for a debug namespace
1413	* @param {String} namespace The namespace string for the for the debug instance to be colored
1414	* @return {Number|String} An ANSI color code for the given namespace
1415	* @api private
1416	*/
1417	function selectColor(namespace) {
1418		let hash = 0;
1419
1420		for (let i = 0; i < namespace.length; i++) {
1421			hash = ((hash << 5) - hash) + namespace.charCodeAt(i);
1422			hash |= 0; // Convert to 32bit integer
1423		}
1424
1425		return createDebug.colors[Math.abs(hash) % createDebug.colors.length];
1426	}
1427	createDebug.selectColor = selectColor;
1428
1429	/**
1430	* Create a debugger with the given `namespace`.
1431	*
1432	* @param {String} namespace
1433	* @return {Function}
1434	* @api public
1435	*/
1436	function createDebug(namespace) {
1437		let prevTime;
1438
1439		function debug(...args) {
1440			// Disabled?
1441			if (!debug.enabled) {
1442				return;
1443			}
1444
1445			const self = debug;
1446
1447			// Set `diff` timestamp
1448			const curr = Number(new Date());
1449			const ms = curr - (prevTime || curr);
1450			self.diff = ms;
1451			self.prev = prevTime;
1452			self.curr = curr;
1453			prevTime = curr;
1454
1455			args[0] = createDebug.coerce(args[0]);
1456
1457			if (typeof args[0] !== 'string') {
1458				// Anything else let's inspect with %O
1459				args.unshift('%O');
1460			}
1461
1462			// Apply any `formatters` transformations
1463			let index = 0;
1464			args[0] = args[0].replace(/%([a-zA-Z%])/g, (match, format) => {
1465				// If we encounter an escaped % then don't increase the array index
1466				if (match === '%%') {
1467					return match;
1468				}
1469				index++;
1470				const formatter = createDebug.formatters[format];
1471				if (typeof formatter === 'function') {
1472					const val = args[index];
1473					match = formatter.call(self, val);
1474
1475					// Now we need to remove `args[index]` since it's inlined in the `format`
1476					args.splice(index, 1);
1477					index--;
1478				}
1479				return match;
1480			});
1481
1482			// Apply env-specific formatting (colors, etc.)
1483			createDebug.formatArgs.call(self, args);
1484
1485			const logFn = self.log || createDebug.log;
1486			logFn.apply(self, args);
1487		}
1488
1489		debug.namespace = namespace;
1490		debug.enabled = createDebug.enabled(namespace);
1491		debug.useColors = createDebug.useColors();
1492		debug.color = selectColor(namespace);
1493		debug.destroy = destroy;
1494		debug.extend = extend;
1495		// Debug.formatArgs = formatArgs;
1496		// debug.rawLog = rawLog;
1497
1498		// env-specific initialization logic for debug instances
1499		if (typeof createDebug.init === 'function') {
1500			createDebug.init(debug);
1501		}
1502
1503		createDebug.instances.push(debug);
1504
1505		return debug;
1506	}
1507
1508	function destroy() {
1509		const index = createDebug.instances.indexOf(this);
1510		if (index !== -1) {
1511			createDebug.instances.splice(index, 1);
1512			return true;
1513		}
1514		return false;
1515	}
1516
1517	function extend(namespace, delimiter) {
1518		const newDebug = createDebug(this.namespace + (typeof delimiter === 'undefined' ? ':' : delimiter) + namespace);
1519		newDebug.log = this.log;
1520		return newDebug;
1521	}
1522
1523	/**
1524	* Enables a debug mode by namespaces. This can include modes
1525	* separated by a colon and wildcards.
1526	*
1527	* @param {String} namespaces
1528	* @api public
1529	*/
1530	function enable(namespaces) {
1531		createDebug.save(namespaces);
1532
1533		createDebug.names = [];
1534		createDebug.skips = [];
1535
1536		let i;
1537		const split = (typeof namespaces === 'string' ? namespaces : '').split(/[\s,]+/);
1538		const len = split.length;
1539
1540		for (i = 0; i < len; i++) {
1541			if (!split[i]) {
1542				// ignore empty strings
1543				continue;
1544			}
1545
1546			namespaces = split[i].replace(/\*/g, '.*?');
1547
1548			if (namespaces[0] === '-') {
1549				createDebug.skips.push(new RegExp('^' + namespaces.substr(1) + '$'));
1550			} else {
1551				createDebug.names.push(new RegExp('^' + namespaces + '$'));
1552			}
1553		}
1554
1555		for (i = 0; i < createDebug.instances.length; i++) {
1556			const instance = createDebug.instances[i];
1557			instance.enabled = createDebug.enabled(instance.namespace);
1558		}
1559	}
1560
1561	/**
1562	* Disable debug output.
1563	*
1564	* @return {String} namespaces
1565	* @api public
1566	*/
1567	function disable() {
1568		const namespaces = [
1569			...createDebug.names.map(toNamespace),
1570			...createDebug.skips.map(toNamespace).map(namespace => '-' + namespace)
1571		].join(',');
1572		createDebug.enable('');
1573		return namespaces;
1574	}
1575
1576	/**
1577	* Returns true if the given mode name is enabled, false otherwise.
1578	*
1579	* @param {String} name
1580	* @return {Boolean}
1581	* @api public
1582	*/
1583	function enabled(name) {
1584		if (name[name.length - 1] === '*') {
1585			return true;
1586		}
1587
1588		let i;
1589		let len;
1590
1591		for (i = 0, len = createDebug.skips.length; i < len; i++) {
1592			if (createDebug.skips[i].test(name)) {
1593				return false;
1594			}
1595		}
1596
1597		for (i = 0, len = createDebug.names.length; i < len; i++) {
1598			if (createDebug.names[i].test(name)) {
1599				return true;
1600			}
1601		}
1602
1603		return false;
1604	}
1605
1606	/**
1607	* Convert regexp to namespace
1608	*
1609	* @param {RegExp} regxep
1610	* @return {String} namespace
1611	* @api private
1612	*/
1613	function toNamespace(regexp) {
1614		return regexp.toString()
1615			.substring(2, regexp.toString().length - 2)
1616			.replace(/\.\*\?$/, '*');
1617	}
1618
1619	/**
1620	* Coerce `val`.
1621	*
1622	* @param {Mixed} val
1623	* @return {Mixed}
1624	* @api private
1625	*/
1626	function coerce(val) {
1627		if (val instanceof Error) {
1628			return val.stack || val.message;
1629		}
1630		return val;
1631	}
1632
1633	createDebug.enable(createDebug.load());
1634
1635	return createDebug;
1636}
1637
1638module.exports = setup;
1639
1640
1641/***/ }),
1642
vendor: 3,273 bytes, lines 1643-1815
1643/***/ "../node_modules/ms/index.js":
1644/*!***********************************!*\
1645  !*** ../node_modules/ms/index.js ***!
1646  \***********************************/
1647/*! no static exports found */
1648/***/ (function(module, exports) {
1649
1650/**
1651 * Helpers.
1652 */
1653
1654var s = 1000;
1655var m = s * 60;
1656var h = m * 60;
1657var d = h * 24;
1658var w = d * 7;
1659var y = d * 365.25;
1660
1661/**
1662 * Parse or format the given `val`.
1663 *
1664 * Options:
1665 *
1666 *  - `long` verbose formatting [false]
1667 *
1668 * @param {String|Number} val
1669 * @param {Object} [options]
1670 * @throws {Error} throw an error if val is not a non-empty string or a number
1671 * @return {String|Number}
1672 * @api public
1673 */
1674
1675module.exports = function(val, options) {
1676  options = options || {};
1677  var type = typeof val;
1678  if (type === 'string' && val.length > 0) {
1679    return parse(val);
1680  } else if (type === 'number' && isNaN(val) === false) {
1681    return options.long ? fmtLong(val) : fmtShort(val);
1682  }
1683  throw new Error(
1684    'val is not a non-empty string or a valid number. val=' +
1685      JSON.stringify(val)
1686  );
1687};
1688
1689/**
1690 * Parse the given `str` and return milliseconds.
1691 *
1692 * @param {String} str
1693 * @return {Number}
1694 * @api private
1695 */
1696
1697function parse(str) {
1698  str = String(str);
1699  if (str.length > 100) {
1700    return;
1701  }
1702  var match = /^((?:\d+)?\-?\d?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(
1703    str
1704  );
1705  if (!match) {
1706    return;
1707  }
1708  var n = parseFloat(match[1]);
1709  var type = (match[2] || 'ms').toLowerCase();
1710  switch (type) {
1711    case 'years':
1712    case 'year':
1713    case 'yrs':
1714    case 'yr':
1715    case 'y':
1716      return n * y;
1717    case 'weeks':
1718    case 'week':
1719    case 'w':
1720      return n * w;
1721    case 'days':
1722    case 'day':
1723    case 'd':
1724      return n * d;
1725    case 'hours':
1726    case 'hour':
1727    case 'hrs':
1728    case 'hr':
1729    case 'h':
1730      return n * h;
1731    case 'minutes':
1732    case 'minute':
1733    case 'mins':
1734    case 'min':
1735    case 'm':
1736      return n * m;
1737    case 'seconds':
1738    case 'second':
1739    case 'secs':
1740    case 'sec':
1741    case 's':
1742      return n * s;
1743    case 'milliseconds':
1744    case 'millisecond':
1745    case 'msecs':
1746    case 'msec':
1747    case 'ms':
1748      return n;
1749    default:
1750      return undefined;
1751  }
1752}
1753
1754/**
1755 * Short format for `ms`.
1756 *
1757 * @param {Number} ms
1758 * @return {String}
1759 * @api private
1760 */
1761
1762function fmtShort(ms) {
1763  var msAbs = Math.abs(ms);
1764  if (msAbs >= d) {
1765    return Math.round(ms / d) + 'd';
1766  }
1767  if (msAbs >= h) {
1768    return Math.round(ms / h) + 'h';
1769  }
1770  if (msAbs >= m) {
1771    return Math.round(ms / m) + 'm';
1772  }
1773  if (msAbs >= s) {
1774    return Math.round(ms / s) + 's';
1775  }
1776  return ms + 'ms';
1777}
1778
1779/**
1780 * Long format for `ms`.
1781 *
1782 * @param {Number} ms
1783 * @return {String}
1784 * @api private
1785 */
1786
1787function fmtLong(ms) {
1788  var msAbs = Math.abs(ms);
1789  if (msAbs >= d) {
1790    return plural(ms, msAbs, d, 'day');
1791  }
1792  if (msAbs >= h) {
1793    return plural(ms, msAbs, h, 'hour');
1794  }
1795  if (msAbs >= m) {
1796    return plural(ms, msAbs, m, 'minute');
1797  }
1798  if (msAbs >= s) {
1799    return plural(ms, msAbs, s, 'second');
1800  }
1801  return ms + ' ms';
1802}
1803
1804/**
1805 * Pluralization helper.
1806 */
1807
1808function plural(ms, msAbs, n, name) {
1809  var isPlural = msAbs >= n * 1.5;
1810  return Math.round(ms / n) + ' ' + name + (isPlural ? 's' : '');
1811}
1812
1813
1814/***/ }),
1815
vendor: 5,685 bytes, lines 1816-2010
1816/***/ "../node_modules/process/browser.js":
1817/*!******************************************!*\
1818  !*** ../node_modules/process/browser.js ***!
1819  \******************************************/
1820/*! no static exports found */
1821/***/ (function(module, exports) {
1822
1823// shim for using process in browser
1824var process = module.exports = {};
1825
1826// cached from whatever global is present so that test runners that stub it
1827// don't break things.  But we need to wrap it in a try catch in case it is
1828// wrapped in strict mode code which doesn't define any globals.  It's inside a
1829// function because try/catches deoptimize in certain engines.
1830
1831var cachedSetTimeout;
1832var cachedClearTimeout;
1833
1834function defaultSetTimout() {
1835    throw new Error('setTimeout has not been defined');
1836}
1837function defaultClearTimeout () {
1838    throw new Error('clearTimeout has not been defined');
1839}
1840(function () {
1841    try {
1842        if (typeof setTimeout === 'function') {
1843            cachedSetTimeout = setTimeout;
1844        } else {
1845            cachedSetTimeout = defaultSetTimout;
1846        }
1847    } catch (e) {
1848        cachedSetTimeout = defaultSetTimout;
1849    }
1850    try {
1851        if (typeof clearTimeout === 'function') {
1852            cachedClearTimeout = clearTimeout;
1853        } else {
1854            cachedClearTimeout = defaultClearTimeout;
1855        }
1856    } catch (e) {
1857        cachedClearTimeout = defaultClearTimeout;
1858    }
1859} ())
1860function runTimeout(fun) {
1861    if (cachedSetTimeout === setTimeout) {
1862        //normal enviroments in sane situations
1863        return setTimeout(fun, 0);
1864    }
1865    // if setTimeout wasn't available but was latter defined
1866    if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {
1867        cachedSetTimeout = setTimeout;
1868        return setTimeout(fun, 0);
1869    }
1870    try {
1871        // when when somebody has screwed with setTimeout but no I.E. maddness
1872        return cachedSetTimeout(fun, 0);
1873    } catch(e){
1874        try {
1875            // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
1876            return cachedSetTimeout.call(null, fun, 0);
1877        } catch(e){
1878            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error
1879            return cachedSetTimeout.call(this, fun, 0);
1880        }
1881    }
1882
1883
1884}
1885function runClearTimeout(marker) {
1886    if (cachedClearTimeout === clearTimeout) {
1887        //normal enviroments in sane situations
1888        return clearTimeout(marker);
1889    }
1890    // if clearTimeout wasn't available but was latter defined
1891    if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {
1892        cachedClearTimeout = clearTimeout;
1893        return clearTimeout(marker);
1894    }
1895    try {
1896        // when when somebody has screwed with setTimeout but no I.E. maddness
1897        return cachedClearTimeout(marker);
1898    } catch (e){
1899        try {
1900            // When we are in I.E. but the script has been evaled so I.E. doesn't  trust the global object when called normally
1901            return cachedClearTimeout.call(null, marker);
1902        } catch (e){
1903            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.
1904            // Some versions of I.E. have different rules for clearTimeout vs setTimeout
1905            return cachedClearTimeout.call(this, marker);
1906        }
1907    }
1908
1909
1910
1911}
1912var queue = [];
1913var draining = false;
1914var currentQueue;
1915var queueIndex = -1;
1916
1917function cleanUpNextTick() {
1918    if (!draining || !currentQueue) {
1919        return;
1920    }
1921    draining = false;
1922    if (currentQueue.length) {
1923        queue = currentQueue.concat(queue);
1924    } else {
1925        queueIndex = -1;
1926    }
1927    if (queue.length) {
1928        drainQueue();
1929    }
1930}
1931
1932function drainQueue() {
1933    if (draining) {
1934        return;
1935    }
1936    var timeout = runTimeout(cleanUpNextTick);
1937    draining = true;
1938
1939    var len = queue.length;
1940    while(len) {
1941        currentQueue = queue;
1942        queue = [];
1943        while (++queueIndex < len) {
1944            if (currentQueue) {
1945                currentQueue[queueIndex].run();
1946            }
1947        }
1948        queueIndex = -1;
1949        len = queue.length;
1950    }
1951    currentQueue = null;
1952    draining = false;
1953    runClearTimeout(timeout);
1954}
1955
1956process.nextTick = function (fun) {
1957    var args = new Array(arguments.length - 1);
1958    if (arguments.length > 1) {
1959        for (var i = 1; i < arguments.length; i++) {
1960            args[i - 1] = arguments[i];
1961        }
1962    }
1963    queue.push(new Item(fun, args));
1964    if (queue.length === 1 && !draining) {
1965        runTimeout(drainQueue);
1966    }
1967};
1968
1969// v8 likes predictible objects
1970function Item(fun, array) {
1971    this.fun = fun;
1972    this.array = array;
1973}
1974Item.prototype.run = function () {
1975    this.fun.apply(null, this.array);
1976};
1977process.title = 'browser';
1978process.browser = true;
1979process.env = {};
1980process.argv = [];
1981process.version = ''; // empty string to avoid regexp issues
1982process.versions = {};
1983
1984function noop() {}
1985
1986process.on = noop;
1987process.addListener = noop;
1988process.once = noop;
1989process.off = noop;
1990process.removeListener = noop;
1991process.removeAllListeners = noop;
1992process.emit = noop;
1993process.prependListener = noop;
1994process.prependOnceListener = noop;
1995
1996process.listeners = function (name) { return [] }
1997
1998process.binding = function (name) {
1999    throw new Error('process.binding is not supported');
2000};
2001
2002process.cwd = function () { return '/' };
2003process.chdir = function (dir) {
2004    throw new Error('process.chdir is not supported');
2005};
2006process.umask = function() { return 0; };
2007
2008
2009/***/ }),
2010
vendor: 1,600 bytes, lines 2011-2058
2011/***/ "../node_modules/regenerator-runtime/runtime-module.js":
2012/*!*************************************************************!*\
2013  !*** ../node_modules/regenerator-runtime/runtime-module.js ***!
2014  \*************************************************************/
2015/*! no static exports found */
2016/***/ (function(module, exports, __webpack_require__) {
2017
2018/**
2019 * Copyright (c) 2014-present, Facebook, Inc.
2020 *
2021 * This source code is licensed under the MIT license found in the
2022 * LICENSE file in the root directory of this source tree.
2023 */
2024
2025// This method of obtaining a reference to the global object needs to be
2026// kept identical to the way it is obtained in runtime.js
2027var g = (function() {
2028  return this || (typeof self === "object" && self);
2029})() || Function("return this")();
2030
2031// Use `getOwnPropertyNames` because not all browsers support calling
2032// `hasOwnProperty` on the global `self` object in a worker. See #183.
2033var hadRuntime = g.regeneratorRuntime &&
2034  Object.getOwnPropertyNames(g).indexOf("regeneratorRuntime") >= 0;
2035
2036// Save the old regeneratorRuntime in case it needs to be restored later.
2037var oldRuntime = hadRuntime && g.regeneratorRuntime;
2038
2039// Force reevalutation of runtime.js.
2040g.regeneratorRuntime = undefined;
2041
2042module.exports = __webpack_require__(/*! ./runtime */ "../node_modules/regenerator-runtime/runtime.js");
2043
2044if (hadRuntime) {
2045  // Restore the original runtime.
2046  g.regeneratorRuntime = oldRuntime;
2047} else {
2048  // Remove the global property added by runtime.js.
2049  try {
2050    delete g.regeneratorRuntime;
2051  } catch(e) {
2052    g.regeneratorRuntime = undefined;
2053  }
2054}
2055
2056
2057/***/ }),
2058
vendor: 23,835 bytes, lines 2059-2790
2059/***/ "../node_modules/regenerator-runtime/runtime.js":
2060/*!******************************************************!*\
2061  !*** ../node_modules/regenerator-runtime/runtime.js ***!
2062  \******************************************************/
2063/*! no static exports found */
2064/***/ (function(module, exports) {
2065
2066/**
2067 * Copyright (c) 2014-present, Facebook, Inc.
2068 *
2069 * This source code is licensed under the MIT license found in the
2070 * LICENSE file in the root directory of this source tree.
2071 */
2072
2073!(function(global) {
2074  "use strict";
2075
2076  var Op = Object.prototype;
2077  var hasOwn = Op.hasOwnProperty;
2078  var undefined; // More compressible than void 0.
2079  var $Symbol = typeof Symbol === "function" ? Symbol : {};
2080  var iteratorSymbol = $Symbol.iterator || "@@iterator";
2081  var asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator";
2082  var toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag";
2083
2084  var inModule = typeof module === "object";
2085  var runtime = global.regeneratorRuntime;
2086  if (runtime) {
2087    if (inModule) {
2088      // If regeneratorRuntime is defined globally and we're in a module,
2089      // make the exports object identical to regeneratorRuntime.
2090      module.exports = runtime;
2091    }
2092    // Don't bother evaluating the rest of this file if the runtime was
2093    // already defined globally.
2094    return;
2095  }
2096
2097  // Define the runtime globally (as expected by generated code) as either
2098  // module.exports (if we're in a module) or a new, empty object.
2099  runtime = global.regeneratorRuntime = inModule ? module.exports : {};
2100
2101  function wrap(innerFn, outerFn, self, tryLocsList) {
2102    // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.
2103    var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;
2104    var generator = Object.create(protoGenerator.prototype);
2105    var context = new Context(tryLocsList || []);
2106
2107    // The ._invoke method unifies the implementations of the .next,
2108    // .throw, and .return methods.
2109    generator._invoke = makeInvokeMethod(innerFn, self, context);
2110
2111    return generator;
2112  }
2113  runtime.wrap = wrap;
2114
2115  // Try/catch helper to minimize deoptimizations. Returns a completion
2116  // record like context.tryEntries[i].completion. This interface could
2117  // have been (and was previously) designed to take a closure to be
2118  // invoked without arguments, but in all the cases we care about we
2119  // already have an existing method we want to call, so there's no need
2120  // to create a new function object. We can even get away with assuming
2121  // the method takes exactly one argument, since that happens to be true
2122  // in every case, so we don't have to touch the arguments object. The
2123  // only additional allocation required is the completion record, which
2124  // has a stable shape and so hopefully should be cheap to allocate.
2125  function tryCatch(fn, obj, arg) {
2126    try {
2127      return { type: "normal", arg: fn.call(obj, arg) };
2128    } catch (err) {
2129      return { type: "throw", arg: err };
2130    }
2131  }
2132
2133  var GenStateSuspendedStart = "suspendedStart";
2134  var GenStateSuspendedYield = "suspendedYield";
2135  var GenStateExecuting = "executing";
2136  var GenStateCompleted = "completed";
2137
2138  // Returning this object from the innerFn has the same effect as
2139  // breaking out of the dispatch switch statement.
2140  var ContinueSentinel = {};
2141
2142  // Dummy constructor functions that we use as the .constructor and
2143  // .constructor.prototype properties for functions that return Generator
2144  // objects. For full spec compliance, you may wish to configure your
2145  // minifier not to mangle the names of these two functions.
2146  function Generator() {}
2147  function GeneratorFunction() {}
2148  function GeneratorFunctionPrototype() {}
2149
2150  // This is a polyfill for %IteratorPrototype% for environments that
2151  // don't natively support it.
2152  var IteratorPrototype = {};
2153  IteratorPrototype[iteratorSymbol] = function () {
2154    return this;
2155  };
2156
2157  var getProto = Object.getPrototypeOf;
2158  var NativeIteratorPrototype = getProto && getProto(getProto(values([])));
2159  if (NativeIteratorPrototype &&
2160      NativeIteratorPrototype !== Op &&
2161      hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {
2162    // This environment has a native %IteratorPrototype%; use it instead
2163    // of the polyfill.
2164    IteratorPrototype = NativeIteratorPrototype;
2165  }
2166
2167  var Gp = GeneratorFunctionPrototype.prototype =
2168    Generator.prototype = Object.create(IteratorPrototype);
2169  GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;
2170  GeneratorFunctionPrototype.constructor = GeneratorFunction;
2171  GeneratorFunctionPrototype[toStringTagSymbol] =
2172    GeneratorFunction.displayName = "GeneratorFunction";
2173
2174  // Helper for defining the .next, .throw, and .return methods of the
2175  // Iterator interface in terms of a single ._invoke method.
2176  function defineIteratorMethods(prototype) {
2177    ["next", "throw", "return"].forEach(function(method) {
2178      prototype[method] = function(arg) {
2179        return this._invoke(method, arg);
2180      };
2181    });
2182  }
2183
2184  runtime.isGeneratorFunction = function(genFun) {
2185    var ctor = typeof genFun === "function" && genFun.constructor;
2186    return ctor
2187      ? ctor === GeneratorFunction ||
2188        // For the native GeneratorFunction constructor, the best we can
2189        // do is to check its .name property.
2190        (ctor.displayName || ctor.name) === "GeneratorFunction"
2191      : false;
2192  };
2193
2194  runtime.mark = function(genFun) {
2195    if (Object.setPrototypeOf) {
2196      Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);
2197    } else {
2198      genFun.__proto__ = GeneratorFunctionPrototype;
2199      if (!(toStringTagSymbol in genFun)) {
2200        genFun[toStringTagSymbol] = "GeneratorFunction";
2201      }
2202    }
2203    genFun.prototype = Object.create(Gp);
2204    return genFun;
2205  };
2206
2207  // Within the body of any async function, `await x` is transformed to
2208  // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test
2209  // `hasOwn.call(value, "__await")` to determine if the yielded value is
2210  // meant to be awaited.
2211  runtime.awrap = function(arg) {
2212    return { __await: arg };
2213  };
2214
2215  function AsyncIterator(generator) {
2216    function invoke(method, arg, resolve, reject) {
2217      var record = tryCatch(generator[method], generator, arg);
2218      if (record.type === "throw") {
2219        reject(record.arg);
2220      } else {
2221        var result = record.arg;
2222        var value = result.value;
2223        if (value &&
2224            typeof value === "object" &&
2225            hasOwn.call(value, "__await")) {
2226          return Promise.resolve(value.__await).then(function(value) {
2227            invoke("next", value, resolve, reject);
2228          }, function(err) {
2229            invoke("throw", err, resolve, reject);
2230          });
2231        }
2232
2233        return Promise.resolve(value).then(function(unwrapped) {
2234          // When a yielded Promise is resolved, its final value becomes
2235          // the .value of the Promise<{value,done}> result for the
2236          // current iteration.
2237          result.value = unwrapped;
2238          resolve(result);
2239        }, function(error) {
2240          // If a rejected Promise was yielded, throw the rejection back
2241          // into the async generator function so it can be handled there.
2242          return invoke("throw", error, resolve, reject);
2243        });
2244      }
2245    }
2246
2247    var previousPromise;
2248
2249    function enqueue(method, arg) {
2250      function callInvokeWithMethodAndArg() {
2251        return new Promise(function(resolve, reject) {
2252          invoke(method, arg, resolve, reject);
2253        });
2254      }
2255
2256      return previousPromise =
2257        // If enqueue has been called before, then we want to wait until
2258        // all previous Promises have been resolved before calling invoke,
2259        // so that results are always delivered in the correct order. If
2260        // enqueue has not been called before, then it is important to
2261        // call invoke immediately, without waiting on a callback to fire,
2262        // so that the async generator function has the opportunity to do
2263        // any necessary setup in a predictable way. This predictability
2264        // is why the Promise constructor synchronously invokes its
2265        // executor callback, and why async functions synchronously
2266        // execute code before the first await. Since we implement simple
2267        // async functions in terms of async generators, it is especially
2268        // important to get this right, even though it requires care.
2269        previousPromise ? previousPromise.then(
2270          callInvokeWithMethodAndArg,
2271          // Avoid propagating failures to Promises returned by later
2272          // invocations of the iterator.
2273          callInvokeWithMethodAndArg
2274        ) : callInvokeWithMethodAndArg();
2275    }
2276
2277    // Define the unified helper method that is used to implement .next,
2278    // .throw, and .return (see defineIteratorMethods).
2279    this._invoke = enqueue;
2280  }
2281
2282  defineIteratorMethods(AsyncIterator.prototype);
2283  AsyncIterator.prototype[asyncIteratorSymbol] = function () {
2284    return this;
2285  };
2286  runtime.AsyncIterator = AsyncIterator;
2287
2288  // Note that simple async functions are implemented on top of
2289  // AsyncIterator objects; they just return a Promise for the value of
2290  // the final result produced by the iterator.
2291  runtime.async = function(innerFn, outerFn, self, tryLocsList) {
2292    var iter = new AsyncIterator(
2293      wrap(innerFn, outerFn, self, tryLocsList)
2294    );
2295
2296    return runtime.isGeneratorFunction(outerFn)
2297      ? iter // If outerFn is a generator, return the full iterator.
2298      : iter.next().then(function(result) {
2299          return result.done ? result.value : iter.next();
2300        });
2301  };
2302
2303  function makeInvokeMethod(innerFn, self, context) {
2304    var state = GenStateSuspendedStart;
2305
2306    return function invoke(method, arg) {
2307      if (state === GenStateExecuting) {
2308        throw new Error("Generator is already running");
2309      }
2310
2311      if (state === GenStateCompleted) {
2312        if (method === "throw") {
2313          throw arg;
2314        }
2315
2316        // Be forgiving, per 25.3.3.3.3 of the spec:
2317        // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume
2318        return doneResult();
2319      }
2320
2321      context.method = method;
2322      context.arg = arg;
2323
2324      while (true) {
2325        var delegate = context.delegate;
2326        if (delegate) {
2327          var delegateResult = maybeInvokeDelegate(delegate, context);
2328          if (delegateResult) {
2329            if (delegateResult === ContinueSentinel) continue;
2330            return delegateResult;
2331          }
2332        }
2333
2334        if (context.method === "next") {
2335          // Setting context._sent for legacy support of Babel's
2336          // function.sent implementation.
2337          context.sent = context._sent = context.arg;
2338
2339        } else if (context.method === "throw") {
2340          if (state === GenStateSuspendedStart) {
2341            state = GenStateCompleted;
2342            throw context.arg;
2343          }
2344
2345          context.dispatchException(context.arg);
2346
2347        } else if (context.method === "return") {
2348          context.abrupt("return", context.arg);
2349        }
2350
2351        state = GenStateExecuting;
2352
2353        var record = tryCatch(innerFn, self, context);
2354        if (record.type === "normal") {
2355          // If an exception is thrown from innerFn, we leave state ===
2356          // GenStateExecuting and loop back for another invocation.
2357          state = context.done
2358            ? GenStateCompleted
2359            : GenStateSuspendedYield;
2360
2361          if (record.arg === ContinueSentinel) {
2362            continue;
2363          }
2364
2365          return {
2366            value: record.arg,
2367            done: context.done
2368          };
2369
2370        } else if (record.type === "throw") {
2371          state = GenStateCompleted;
2372          // Dispatch the exception by looping back around to the
2373          // context.dispatchException(context.arg) call above.
2374          context.method = "throw";
2375          context.arg = record.arg;
2376        }
2377      }
2378    };
2379  }
2380
2381  // Call delegate.iterator[context.method](context.arg) and handle the
2382  // result, either by returning a { value, done } result from the
2383  // delegate iterator, or by modifying context.method and context.arg,
2384  // setting context.delegate to null, and returning the ContinueSentinel.
2385  function maybeInvokeDelegate(delegate, context) {
2386    var method = delegate.iterator[context.method];
2387    if (method === undefined) {
2388      // A .throw or .return when the delegate iterator has no .throw
2389      // method always terminates the yield* loop.
2390      context.delegate = null;
2391
2392      if (context.method === "throw") {
2393        if (delegate.iterator.return) {
2394          // If the delegate iterator has a return method, give it a
2395          // chance to clean up.
2396          context.method = "return";
2397          context.arg = undefined;
2398          maybeInvokeDelegate(delegate, context);
2399
2400          if (context.method === "throw") {
2401            // If maybeInvokeDelegate(context) changed context.method from
2402            // "return" to "throw", let that override the TypeError below.
2403            return ContinueSentinel;
2404          }
2405        }
2406
2407        context.method = "throw";
2408        context.arg = new TypeError(
2409          "The iterator does not provide a 'throw' method");
2410      }
2411
2412      return ContinueSentinel;
2413    }
2414
2415    var record = tryCatch(method, delegate.iterator, context.arg);
2416
2417    if (record.type === "throw") {
2418      context.method = "throw";
2419      context.arg = record.arg;
2420      context.delegate = null;
2421      return ContinueSentinel;
2422    }
2423
2424    var info = record.arg;
2425
2426    if (! info) {
2427      context.method = "throw";
2428      context.arg = new TypeError("iterator result is not an object");
2429      context.delegate = null;
2430      return ContinueSentinel;
2431    }
2432
2433    if (info.done) {
2434      // Assign the result of the finished delegate to the temporary
2435      // variable specified by delegate.resultName (see delegateYield).
2436      context[delegate.resultName] = info.value;
2437
2438      // Resume execution at the desired location (see delegateYield).
2439      context.next = delegate.nextLoc;
2440
2441      // If context.method was "throw" but the delegate handled the
2442      // exception, let the outer generator proceed normally. If
2443      // context.method was "next", forget context.arg since it has been
2444      // "consumed" by the delegate iterator. If context.method was
2445      // "return", allow the original .return call to continue in the
2446      // outer generator.
2447      if (context.method !== "return") {
2448        context.method = "next";
2449        context.arg = undefined;
2450      }
2451
2452    } else {
2453      // Re-yield the result returned by the delegate method.
2454      return info;
2455    }
2456
2457    // The delegate iterator is finished, so forget it and continue with
2458    // the outer generator.
2459    context.delegate = null;
2460    return ContinueSentinel;
2461  }
2462
2463  // Define Generator.prototype.{next,throw,return} in terms of the
2464  // unified ._invoke helper method.
2465  defineIteratorMethods(Gp);
2466
2467  Gp[toStringTagSymbol] = "Generator";
2468
2469  // A Generator should always return itself as the iterator object when the
2470  // @@iterator function is called on it. Some browsers' implementations of the
2471  // iterator prototype chain incorrectly implement this, causing the Generator
2472  // object to not be returned from this call. This ensures that doesn't happen.
2473  // See https://github.com/facebook/regenerator/issues/274 for more details.
2474  Gp[iteratorSymbol] = function() {
2475    return this;
2476  };
2477
2478  Gp.toString = function() {
2479    return "[object Generator]";
2480  };
2481
2482  function pushTryEntry(locs) {
2483    var entry = { tryLoc: locs[0] };
2484
2485    if (1 in locs) {
2486      entry.catchLoc = locs[1];
2487    }
2488
2489    if (2 in locs) {
2490      entry.finallyLoc = locs[2];
2491      entry.afterLoc = locs[3];
2492    }
2493
2494    this.tryEntries.push(entry);
2495  }
2496
2497  function resetTryEntry(entry) {
2498    var record = entry.completion || {};
2499    record.type = "normal";
2500    delete record.arg;
2501    entry.completion = record;
2502  }
2503
2504  function Context(tryLocsList) {
2505    // The root entry object (effectively a try statement without a catch
2506    // or a finally block) gives us a place to store values thrown from
2507    // locations where there is no enclosing try statement.
2508    this.tryEntries = [{ tryLoc: "root" }];
2509    tryLocsList.forEach(pushTryEntry, this);
2510    this.reset(true);
2511  }
2512
2513  runtime.keys = function(object) {
2514    var keys = [];
2515    for (var key in object) {
2516      keys.push(key);
2517    }
2518    keys.reverse();
2519
2520    // Rather than returning an object with a next method, we keep
2521    // things simple and return the next function itself.
2522    return function next() {
2523      while (keys.length) {
2524        var key = keys.pop();
2525        if (key in object) {
2526          next.value = key;
2527          next.done = false;
2528          return next;
2529        }
2530      }
2531
2532      // To avoid creating an additional object, we just hang the .value
2533      // and .done properties off the next function object itself. This
2534      // also ensures that the minifier will not anonymize the function.
2535      next.done = true;
2536      return next;
2537    };
2538  };
2539
2540  function values(iterable) {
2541    if (iterable) {
2542      var iteratorMethod = iterable[iteratorSymbol];
2543      if (iteratorMethod) {
2544        return iteratorMethod.call(iterable);
2545      }
2546
2547      if (typeof iterable.next === "function") {
2548        return iterable;
2549      }
2550
2551      if (!isNaN(iterable.length)) {
2552        var i = -1, next = function next() {
2553          while (++i < iterable.length) {
2554            if (hasOwn.call(iterable, i)) {
2555              next.value = iterable[i];
2556              next.done = false;
2557              return next;
2558            }
2559          }
2560
2561          next.value = undefined;
2562          next.done = true;
2563
2564          return next;
2565        };
2566
2567        return next.next = next;
2568      }
2569    }
2570
2571    // Return an iterator with no values.
2572    return { next: doneResult };
2573  }
2574  runtime.values = values;
2575
2576  function doneResult() {
2577    return { value: undefined, done: true };
2578  }
2579
2580  Context.prototype = {
2581    constructor: Context,
2582
2583    reset: function(skipTempReset) {
2584      this.prev = 0;
2585      this.next = 0;
2586      // Resetting context._sent for legacy support of Babel's
2587      // function.sent implementation.
2588      this.sent = this._sent = undefined;
2589      this.done = false;
2590      this.delegate = null;
2591
2592      this.method = "next";
2593      this.arg = undefined;
2594
2595      this.tryEntries.forEach(resetTryEntry);
2596
2597      if (!skipTempReset) {
2598        for (var name in this) {
2599          // Not sure about the optimal order of these conditions:
2600          if (name.charAt(0) === "t" &&
2601              hasOwn.call(this, name) &&
2602              !isNaN(+name.slice(1))) {
2603            this[name] = undefined;
2604          }
2605        }
2606      }
2607    },
2608
2609    stop: function() {
2610      this.done = true;
2611
2612      var rootEntry = this.tryEntries[0];
2613      var rootRecord = rootEntry.completion;
2614      if (rootRecord.type === "throw") {
2615        throw rootRecord.arg;
2616      }
2617
2618      return this.rval;
2619    },
2620
2621    dispatchException: function(exception) {
2622      if (this.done) {
2623        throw exception;
2624      }
2625
2626      var context = this;
2627      function handle(loc, caught) {
2628        record.type = "throw";
2629        record.arg = exception;
2630        context.next = loc;
2631
2632        if (caught) {
2633          // If the dispatched exception was caught by a catch block,
2634          // then let that catch block handle the exception normally.
2635          context.method = "next";
2636          context.arg = undefined;
2637        }
2638
2639        return !! caught;
2640      }
2641
2642      for (var i = this.tryEntries.length - 1; i >= 0; --i) {
2643        var entry = this.tryEntries[i];
2644        var record = entry.completion;
2645
2646        if (entry.tryLoc === "root") {
2647          // Exception thrown outside of any try block that could handle
2648          // it, so set the completion value of the entire function to
2649          // throw the exception.
2650          return handle("end");
2651        }
2652
2653        if (entry.tryLoc <= this.prev) {
2654          var hasCatch = hasOwn.call(entry, "catchLoc");
2655          var hasFinally = hasOwn.call(entry, "finallyLoc");
2656
2657          if (hasCatch && hasFinally) {
2658            if (this.prev < entry.catchLoc) {
2659              return handle(entry.catchLoc, true);
2660            } else if (this.prev < entry.finallyLoc) {
2661              return handle(entry.finallyLoc);
2662            }
2663
2664          } else if (hasCatch) {
2665            if (this.prev < entry.catchLoc) {
2666              return handle(entry.catchLoc, true);
2667            }
2668
2669          } else if (hasFinally) {
2670            if (this.prev < entry.finallyLoc) {
2671              return handle(entry.finallyLoc);
2672            }
2673
2674          } else {
2675            throw new Error("try statement without catch or finally");
2676          }
2677        }
2678      }
2679    },
2680
2681    abrupt: function(type, arg) {
2682      for (var i = this.tryEntries.length - 1; i >= 0; --i) {
2683        var entry = this.tryEntries[i];
2684        if (entry.tryLoc <= this.prev &&
2685            hasOwn.call(entry, "finallyLoc") &&
2686            this.prev < entry.finallyLoc) {
2687          var finallyEntry = entry;
2688          break;
2689        }
2690      }
2691
2692      if (finallyEntry &&
2693          (type === "break" ||
2694           type === "continue") &&
2695          finallyEntry.tryLoc <= arg &&
2696          arg <= finallyEntry.finallyLoc) {
2697        // Ignore the finally entry if control is not jumping to a
2698        // location outside the try/catch block.
2699        finallyEntry = null;
2700      }
2701
2702      var record = finallyEntry ? finallyEntry.completion : {};
2703      record.type = type;
2704      record.arg = arg;
2705
2706      if (finallyEntry) {
2707        this.method = "next";
2708        this.next = finallyEntry.finallyLoc;
2709        return ContinueSentinel;
2710      }
2711
2712      return this.complete(record);
2713    },
2714
2715    complete: function(record, afterLoc) {
2716      if (record.type === "throw") {
2717        throw record.arg;
2718      }
2719
2720      if (record.type === "break" ||
2721          record.type === "continue") {
2722        this.next = record.arg;
2723      } else if (record.type === "return") {
2724        this.rval = this.arg = record.arg;
2725        this.method = "return";
2726        this.next = "end";
2727      } else if (record.type === "normal" && afterLoc) {
2728        this.next = afterLoc;
2729      }
2730
2731      return ContinueSentinel;
2732    },
2733
2734    finish: function(finallyLoc) {
2735      for (var i = this.tryEntries.length - 1; i >= 0; --i) {
2736        var entry = this.tryEntries[i];
2737        if (entry.finallyLoc === finallyLoc) {
2738          this.complete(entry.completion, entry.afterLoc);
2739          resetTryEntry(entry);
2740          return ContinueSentinel;
2741        }
2742      }
2743    },
2744
2745    "catch": function(tryLoc) {
2746      for (var i = this.tryEntries.length - 1; i >= 0; --i) {
2747        var entry = this.tryEntries[i];
2748        if (entry.tryLoc === tryLoc) {
2749          var record = entry.completion;
2750          if (record.type === "throw") {
2751            var thrown = record.arg;
2752            resetTryEntry(entry);
2753          }
2754          return thrown;
2755        }
2756      }
2757
2758      // The context.catch method must only be called with a location
2759      // argument that corresponds to a known catch block.
2760      throw new Error("illegal catch attempt");
2761    },
2762
2763    delegateYield: function(iterable, resultName, nextLoc) {
2764      this.delegate = {
2765        iterator: values(iterable),
2766        resultName: resultName,
2767        nextLoc: nextLoc
2768      };
2769
2770      if (this.method === "next") {
2771        // Deliberately forget the last sent value so that we don't
2772        // accidentally pass it on to the delegate.
2773        this.arg = undefined;
2774      }
2775
2776      return ContinueSentinel;
2777    }
2778  };
2779})(
2780  // In sloppy mode, unbound `this` refers to the global object, fallback to
2781  // Function constructor if we're in global strict mode. That is sadly a form
2782  // of indirect eval which violates Content Security Policy.
2783  (function() {
2784    return this || (typeof self === "object" && self);
2785  })() || Function("return this")()
2786);
2787
2788
2789/***/ }),
2790
2791/***/ "./drawing/draw.js":
2792/*!*************************!*\
2793  !*** ./drawing/draw.js ***!
2794  \*************************/
2795/*! exports provided: default */
2796/***/ (function(module, __webpack_exports__, __webpack_require__) {
2797
2798"use strict";
2799__webpack_require__.r(__webpack_exports__);
2800/**
2801 * This function manages the {@link https://www.w3.org/TR/2dcontext/#the-canvas-state|save/restore}
2802 * pattern for working in a new context state stack. The parameter `fn` is passed the `context` and can
2803 * execute any API calls in a clean stack.
2804 * @public
2805 * @method draw
2806 * @memberof Drawing
2807 *
2808 * @param {CanvasRenderingContext2D} context - Target Canvas
2809 * @param {ContextFn} fn - A function which performs drawing operations within the given context.
2810 * @returns {undefined}
2811 */
2812/* harmony default export */ __webpack_exports__["default"] = (function (context, fn) {
2813  context.save();
2814  fn(context);
2815  context.restore();
2816});
2817
2818/***/ }),
2819
2820/***/ "./drawing/drawArrow.js":
2821/*!******************************!*\
2822  !*** ./drawing/drawArrow.js ***!
2823  \******************************/
2824/*! exports provided: default */
2825/***/ (function(module, __webpack_exports__, __webpack_require__) {
2826
2827"use strict";
2828__webpack_require__.r(__webpack_exports__);
2829/* harmony import */ var _drawLine_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./drawLine.js */ "./drawing/drawLine.js");
2830/* harmony import */ var _drawJoinedLines_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./drawJoinedLines.js */ "./drawing/drawJoinedLines.js");
2831
2832
2833/**
2834 * Draw an arrow using the drawing API.
2835 * @public
2836 * @method drawArrow
2837 * @memberof Drawing
2838 *
2839 * @param  {Object} context   The canvas context.
2840 * @param  {Object} start     The start position.
2841 * @param  {Object} end       The end position.
2842 * @param  {string} color     The color of the arrow.
2843 * @param  {number} lineWidth The width of the arrow line.
2844 * @returns {undefined}
2845 */
2846
2847/* harmony default export */ __webpack_exports__["default"] = (function (context, start, end, color, lineWidth) {
2848  // Variables to be used when creating the arrow
2849  var headLength = 10;
2850  var angle = Math.atan2(end.y - start.y, end.x - start.x); // Starting path of the arrow from the start square to the end square and drawing the stroke
2851
2852  var options = {
2853    color: color,
2854    lineWidth: lineWidth
2855  };
2856  Object(_drawLine_js__WEBPACK_IMPORTED_MODULE_0__["default"])(context, undefined, start, end, options, 'canvas');
2857  options = {
2858    color: color,
2859    lineWidth: lineWidth,
2860    fillStyle: color
2861  };
2862  var points = [{
2863    x: end.x - headLength * Math.cos(angle - Math.PI / 7),
2864    y: end.y - headLength * Math.sin(angle - Math.PI / 7)
2865  }, {
2866    x: end.x - headLength * Math.cos(angle + Math.PI / 7),
2867    y: end.y - headLength * Math.sin(angle + Math.PI / 7)
2868  }, end];
2869  Object(_drawJoinedLines_js__WEBPACK_IMPORTED_MODULE_1__["default"])(context, undefined, end, points, options, 'canvas');
2870});
2871
2872/***/ }),
2873
2874/***/ "./drawing/drawCircle.js":
2875/*!*******************************!*\
2876  !*** ./drawing/drawCircle.js ***!
2877  \*******************************/
2878/*! exports provided: default */
2879/***/ (function(module, __webpack_exports__, __webpack_require__) {
2880
2881"use strict";
2882__webpack_require__.r(__webpack_exports__);
2883/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../externalModules.js */ "./externalModules.js");
2884/* harmony import */ var _path_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./path.js */ "./drawing/path.js");
2885
2886
2887/**
2888 * Draw a circle with given `center` and `radius`.
2889 * @public
2890 * @method drawCircle
2891 * @memberof Drawing
2892 *
2893 * @param {CanvasRenderingContext2D} context - Target context
2894 * @param {HTMLElement} element - The DOM Element to draw on
2895 * @param {Object} center - `{ x, y }` in either pixel or canvas coordinates.
2896 * @param {number} radius - The circle's radius in canvas units.
2897 * @param {Object} options - See {@link path}
2898 * @param {String} [coordSystem='pixel'] - Can be "pixel" (default) or "canvas". The coordinate
2899 *     system of the points passed in to the function. If "pixel" then cornerstone.pixelToCanvas
2900 *     is used to transform the points from pixel to canvas coordinates.
2901 * @returns {undefined}
2902 */
2903
2904/* harmony default export */ __webpack_exports__["default"] = (function (context, element, center, radius, options) {
2905  var coordSystem = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 'pixel';
2906
2907  if (coordSystem === 'pixel') {
2908    center = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.pixelToCanvas(element, center);
2909  }
2910
2911  Object(_path_js__WEBPACK_IMPORTED_MODULE_1__["default"])(context, options, function (context) {
2912    context.arc(center.x, center.y, radius, 0, 2 * Math.PI);
2913  });
2914});
2915
2916/***/ }),
2917
2918/***/ "./drawing/drawEllipse.js":
2919/*!********************************!*\
2920  !*** ./drawing/drawEllipse.js ***!
2921  \********************************/
2922/*! exports provided: default */
2923/***/ (function(module, __webpack_exports__, __webpack_require__) {
2924
2925"use strict";
2926__webpack_require__.r(__webpack_exports__);
2927/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../externalModules.js */ "./externalModules.js");
2928/* harmony import */ var _path_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./path.js */ "./drawing/path.js");
2929/* harmony import */ var _util_pointProjector_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../util/pointProjector.js */ "./util/pointProjector.js");
2930
2931
2932
2933/**
2934 * Draw an ellipse within the bounding box defined by `corner1` and `corner2`.
2935 * @public
2936 * @method drawEllipse
2937 * @memberof Drawing
2938 *
2939 * @param {CanvasRenderingContext2D} context - Target context
2940 * @param {HTMLElement} element - The DOM Element to draw on
2941 * @param {Object} corner1 - `{ x, y }` in either pixel or canvas coordinates.
2942 * @param {Object} corner2 - `{ x, y }` in either pixel or canvas coordinates.
2943 * @param {Object} options - See {@link path}
2944 * @param {String} [coordSystem='pixel'] - Can be "pixel" (default) or "canvas". The coordinate
2945 *     system of the points passed in to the function. If "pixel" then cornerstone.pixelToCanvas
2946 *     is used to transform the points from pixel to canvas coordinates.
2947 * @param {Number} initialRotation - Ellipse initial rotation
2948 * @returns {undefined}
2949 */
2950
2951/* harmony default export */ __webpack_exports__["default"] = (function (context, element, corner1, corner2, options) {
2952  var coordSystem = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 'pixel';
2953  var initialRotation = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : 0.0;
2954
2955  if (coordSystem === 'pixel') {
2956    corner1 = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.pixelToCanvas(element, corner1);
2957    corner2 = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.pixelToCanvas(element, corner2);
2958  }
2959
2960  var viewport = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.getViewport(element); // Calculate the center of the image
2961
2962  var width = element.clientWidth,
2963      height = element.clientHeight;
2964  var scale = viewport.scale,
2965      translation = viewport.translation;
2966  var rotation = viewport.rotation - initialRotation;
2967  var centerPoint = {
2968    x: width / 2 + translation.x * scale,
2969    y: height / 2 + translation.y * scale
2970  };
2971
2972  if (Math.abs(rotation) > 0.05) {
2973    corner1 = Object(_util_pointProjector_js__WEBPACK_IMPORTED_MODULE_2__["rotatePoint"])(corner1, centerPoint, -rotation);
2974    corner2 = Object(_util_pointProjector_js__WEBPACK_IMPORTED_MODULE_2__["rotatePoint"])(corner2, centerPoint, -rotation);
2975  }
2976
2977  var w = Math.abs(corner1.x - corner2.x);
2978  var h = Math.abs(corner1.y - corner2.y);
2979  var xMin = Math.min(corner1.x, corner2.x);
2980  var yMin = Math.min(corner1.y, corner2.y);
2981  var center = {
2982    x: xMin + w / 2,
2983    y: yMin + h / 2
2984  };
2985
2986  if (Math.abs(rotation) > 0.05) {
2987    center = Object(_util_pointProjector_js__WEBPACK_IMPORTED_MODULE_2__["rotatePoint"])(center, centerPoint, rotation);
2988  }
2989
2990  var angle = rotation * Math.PI / 180;
2991  Object(_path_js__WEBPACK_IMPORTED_MODULE_1__["default"])(context, options, function (context) {
2992    context.ellipse(center.x, center.y, w / 2, h / 2, angle, 0, 2 * Math.PI);
2993    context.closePath();
2994  });
2995});
2996
2997/***/ }),
2998
2999/***/ "./drawing/drawHandles.js":
3000/*!********************************!*\
3001  !*** ./drawing/drawHandles.js ***!
3002  \********************************/
3003/*! exports provided: default */
3004/***/ (function(module, __webpack_exports__, __webpack_require__) {
3005
3006"use strict";
3007__webpack_require__.r(__webpack_exports__);
3008/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../externalModules.js */ "./externalModules.js");
3009/* harmony import */ var _stateManagement_toolStyle_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./../stateManagement/toolStyle.js */ "./stateManagement/toolStyle.js");
3010/* harmony import */ var _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./../stateManagement/toolColors.js */ "./stateManagement/toolColors.js");
3011/* harmony import */ var _path_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./path.js */ "./drawing/path.js");
3012/* harmony import */ var _store_index_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./../store/index.js */ "./store/index.js");
3013
3014
3015
3016
3017
3018/**
3019 * Draws proivded handles to the provided context
3020 * @public
3021 * @method drawHandles
3022 * @memberof Drawing
3023 *
3024 * @param {CanvasRenderingContext2D} context - Target context
3025 * @param {*} evtDetail - Cornerstone's 'cornerstoneimagerendered' event's `detail`
3026 * @param {Object[]|Object} handles - An array of handle objects, or an object w/ named handle objects
3027 * @param {Object} [options={}] - Options object
3028 * @param {string} [options.color]
3029 * @param {Boolean} [options.drawHandlesIfActive=false] - Whether the handles should only be drawn if Active (hovered/selected)
3030 * @param {string} [options.fill]
3031 * @param {Number} [options.handleRadius=6]
3032 * @returns {undefined}
3033 */
3034
3035/* harmony default export */ __webpack_exports__["default"] = (function (context, evtDetail, handles) {
3036  var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
3037  var element = evtDetail.element;
3038  var defaultColor = _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_2__["default"].getToolColor();
3039  context.strokeStyle = options.color || defaultColor;
3040  var handleKeys = Object.keys(handles);
3041
3042  var _loop = function _loop(i) {
3043    var handleKey = handleKeys[i];
3044    var handle = handles[handleKey];
3045
3046    if (handle.drawnIndependently === true) {
3047      return "continue";
3048    }
3049
3050    if (options.drawHandlesIfActive === true && !handle.active) {
3051      return "continue";
3052    }
3053
3054    var lineWidth = options.lineWidth? options.lineWidth : handle.active ? _stateManagement_toolStyle_js__WEBPACK_IMPORTED_MODULE_1__["default"].getActiveWidth() : _stateManagement_toolStyle_js__WEBPACK_IMPORTED_MODULE_1__["default"].getToolW
3054idth();
3055    var fillStyle = options.fill;
3056    Object(_path_js__WEBPACK_IMPORTED_MODULE_3__["default"])(context, {
3057      lineWidth: lineWidth,
3058      fillStyle: fillStyle
3059    }, function (context) {
3060      var handleCanvasCoords = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.pixelToCanvas(element, handle); // Handle's radisu, then tool's radius, then default radius
3061
3062      var handleRadius = handle.radius || options.handleRadius || _store_index_js__WEBPACK_IMPORTED_MODULE_4__["state"].handleRadius;
3063      context.arc(handleCanvasCoords.x, handleCanvasCoords.y, handleRadius, 0, 2 * Math.PI);
3064    });
3065  };
3066
3067  for (var i = 0; i < handleKeys.length; i++) {
3068    var _ret = _loop(i);
3069
3070    if (_ret === "continue") continue;
3071  }
3072});
3073
3074/***/ }),
3075
3076/***/ "./drawing/drawJoinedLines.js":
3077/*!************************************!*\
3078  !*** ./drawing/drawJoinedLines.js ***!
3079  \************************************/
3080/*! exports provided: default */
3081/***/ (function(module, __webpack_exports__, __webpack_require__) {
3082
3083"use strict";
3084__webpack_require__.r(__webpack_exports__);
3085/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../externalModules.js */ "./externalModules.js");
3086/* harmony import */ var _path_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./path.js */ "./drawing/path.js");
3087
3088
3089/**
3090 * Draw a series of joined lines, starting at `start` and then going to each point in `points`.
3091 * @public
3092 * @method drawJoinedLines
3093 * @memberof Drawing
3094 *
3095 * @param {CanvasRenderingContext2D} context - Target context
3096 * @param {HTMLElement} element - The DOM Element to draw on
3097 * @param {Object} start - `{ x, y }` in either pixel or canvas coordinates.
3098 * @param {Object[]} points - `[{ x, y }]` An array of points in either pixel or canvas coordinates.
3099 * @param {Object} options - See {@link path}
3100 * @param {String} [coordSystem='pixel'] - Can be "pixel" (default) or "canvas". The coordinate
3101 *     system of the points passed in to the function. If "pixel" then cornerstone.pixelToCanvas
3102 *     is used to transform the points from pixel to canvas coordinates.
3103 * @returns {undefined}
3104 */
3105
3106/* harmony default export */ __webpack_exports__["default"] = (function (context, element, start, points, options) {
3107  var coordSystem = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 'pixel';
3108  Object(_path_js__WEBPACK_IMPORTED_MODULE_1__["default"])(context, options, function (context) {
3109    if (coordSystem === 'pixel') {
3110      start = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.pixelToCanvas(element, start);
3111      points = points.map(function (p) {
3112        return _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.pixelToCanvas(element, p);
3113      });
3114    }
3115
3116    context.moveTo(start.x, start.y);
3117    points.forEach(function (_ref) {
3118      var x = _ref.x,
3119          y = _ref.y;
3120      context.lineTo(x, y);
3121    });
3122  });
3123});
3124
3125/***/ }),
3126
3127/***/ "./drawing/drawLine.js":
3128/*!*****************************!*\
3129  !*** ./drawing/drawLine.js ***!
3130  \*****************************/
3131/*! exports provided: default */
3132/***/ (function(module, __webpack_exports__, __webpack_require__) {
3133
3134"use strict";
3135__webpack_require__.r(__webpack_exports__);
3136/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return drawLine; });
3137/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../externalModules.js */ "./externalModules.js");
3138/* harmony import */ var _path_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./path.js */ "./drawing/path.js");
3139
3140
3141/**
3142 * Draw a line between `start` and `end`.
3143 *
3144 * @public
3145 * @method drawLine
3146 * @memberof Drawing
3147 *
3148 * @param {CanvasRenderingContext2D} context
3149 * @param {HTMLElement} element - The DOM Element to draw on
3150 * @param {Object} start - `{ x, y } in either pixel or canvas coordinates.
3151 * @param {Object} end - `{ x, y }` in either pixel or canvas coordinates.
3152 * @param {Object} options - See {@link path}
3153 * @param {String} [coordSystem='pixel'] - Can be "pixel" (default) or "canvas". The coordinate
3154 *     system of the points passed in to the function. If "pixel" then cornerstone.pixelToCanvas
3155 *     is used to transform the points from pixel to canvas coordinates.
3156 * @returns {undefined}
3157 */
3158
3159function drawLine(context, element, start, end, options) {
3160  var coordSystem = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 'pixel';
3161  Object(_path_js__WEBPACK_IMPORTED_MODULE_1__["default"])(context, options, function (context) {
3162    if (coordSystem === 'pixel') {
3163      start = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.pixelToCanvas(element, start);
3164      end = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.pixelToCanvas(element, end);
3165    }
3166
3167    context.moveTo(start.x, start.y);
3168    context.lineTo(end.x, end.y);
3169  });
3170}
3171
3172/***/ }),
3173
3174/***/ "./drawing/drawLines.js":
3175/*!******************************!*\
3176  !*** ./drawing/drawLines.js ***!
3177  \******************************/
3178/*! exports provided: default */
3179/***/ (function(module, __webpack_exports__, __webpack_require__) {
3180
3181"use strict";
3182__webpack_require__.r(__webpack_exports__);
3183/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../externalModules.js */ "./externalModules.js");
3184/* harmony import */ var _path_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./path.js */ "./drawing/path.js");
3185
3186
3187/**
3188 * Draw multiple lines.
3189 * @public
3190 * @method drawJoinedLines
3191 * @memberof Drawing
3192 *
3193 * @param {CanvasRenderingContext2D} context - Target context
3194 * @param {HTMLElement} element - The DOM Element to draw on
3195 * @param {Object[]} lines - `[{ start: {x, y}, end: { x, y }]` An array of `start`, `end` pairs.
3196 *     Each point is `{ x, y }` in either pixel or canvas coordinates.
3197 * @param {Object} options - See {@link path}
3198 * @param {String} [coordSystem='pixel'] - Can be "pixel" (default) or "canvas". The coordinate
3199 *     system of the points passed in to the function. If "pixel" then cornerstone.pixelToCanvas
3200 *     is used to transform the points from pixel to canvas coordinates.
3201 * @returns {undefined}
3202 */
3203
3204/* harmony default export */ __webpack_exports__["default"] = (function (context, element, lines, options) {
3205  var coordSystem = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 'pixel';
3206  Object(_path_js__WEBPACK_IMPORTED_MODULE_1__["default"])(context, options, function (context) {
3207    lines.forEach(function (line) {
3208      var start = line.start;
3209      var end = line.end;
3210
3211      if (coordSystem === 'pixel') {
3212        var cornerstone = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone;
3213        start = cornerstone.pixelToCanvas(element, start);
3214        end = cornerstone.pixelToCanvas(element, end);
3215      }
3216
3217      context.moveTo(start.x, start.y);
3218      context.lineTo(end.x, end.y);
3219    });
3220  });
3221});
3222
3223/***/ }),
3224
3225/***/ "./drawing/drawLink.js":
3226/*!*****************************!*\
3227  !*** ./drawing/drawLink.js ***!
3228  \*****************************/
3229/*! exports provided: default */
3230/***/ (function(module, __webpack_exports__, __webpack_require__) {
3231
3232"use strict";
3233__webpack_require__.r(__webpack_exports__);
3234/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js");
3235/* harmony import */ var _drawLine_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./drawLine.js */ "./drawing/drawLine.js");
3236
3237
3238/**
3239 * Draw a link between an annotation to a box.
3240 * @public
3241 * @method drawLink
3242 * @memberof Drawing
3243 *
3244 * @param  {Object[]} linkAnchorPoints An array of possible anchor points.
3245 * @param  {Object} refPoint         A reference point to select the anchor point.
3246 * @param  {Object} boundingBox    The bounding box to link.
3247 * @param  {Object} context          The canvas context.
3248 * @param  {string} color            The link color.
3249 * @param  {number} lineWidth        The line width of the link.
3250 * @returns {undefined}
3251 */
3252
3253/* harmony default export */ __webpack_exports__["default"] = (function (linkAnchorPoints, refPoint, boundingBox, context, color, lineWidth) {
3254  // Draw a link from "the closest anchor point to refPoint" to "the nearest midpoint on the bounding box".
3255  // Find the closest anchor point to RefPoint
3256  var start = linkAnchorPoints.length > 0 ? _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstoneMath.point.findClosestPoint(linkAnchorPoints, refPoint) : refPoint; // Calculate the midpoints of the bounding box
3257
3258  var boundingBoxPoints = [{
3259    x: boundingBox.left + boundingBox.width / 2,
3260    y: boundingBox.top
3261  }, {
3262    x: boundingBox.left,
3263    y: boundingBox.top + boundingBox.height / 2
3264  }, {
3265    x: boundingBox.left + boundingBox.width / 2,
3266    y: boundingBox.top + boundingBox.height
3267  }, {
3268    x: boundingBox.left + boundingBox.width,
3269    y: boundingBox.top + boundingBox.height / 2
3270  }]; // Calculate the link endpoint by identifying which midpoint of the bounding box
3271  // Is closest to the start point.
3272
3273  var end = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstoneMath.point.findClosestPoint(boundingBoxPoints, start); // Finally we draw the dashed linking line
3274
3275  var options = {
3276    color: color,
3277    lineWidth: lineWidth,
3278    lineDash: [2, 3]
3279  };
3280  Object(_drawLine_js__WEBPACK_IMPORTED_MODULE_1__["default"])(context, undefined, start, end, options, 'canvas');
3281});
3282
3283/***/ }),
3284
3285/***/ "./drawing/drawLinkedTextBox.js":
3286/*!**************************************!*\
3287  !*** ./drawing/drawLinkedTextBox.js ***!
3288  \**************************************/
3289/*! exports provided: default */
3290/***/ (function(module, __webpack_exports__, __webpack_require__) {
3291
3292"use strict";
3293__webpack_require__.r(__webpack_exports__);
3294/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js");
3295/* harmony import */ var _drawTextBox_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./drawTextBox.js */ "./drawing/drawTextBox.js");
3296/* harmony import */ var _drawLink_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./drawLink.js */ "./drawing/drawLink.js");
3297
3298
3299
3300/**
3301 * Draw a link between an annotation to a textBox.
3302 * @public
3303 * @method drawLinkedTextBox
3304 * @memberof Drawing
3305 *
3306 * @param {Object} context - The canvas context.
3307 * @param {HTMLElement} element - The element on which to draw the link.
3308 * @param {Object} textBox - The textBox to link.
3309 * @param {Object} text - The text to display in the textbox.
3310 * @param {Object[]} handles - The handles of the annotation.
3311 * @param {Object[]} textBoxAnchorPoints - An array of possible anchor points on the textBox.
3312 * @param {string} color - The link color.
3313 * @param {number} lineWidth - The line width of the link.
3314 * @param {number} xOffset - The x offset of the textbox.
3315 * @param {boolean} yCenter - Vertically centers the text if true.
3316 * @returns {undefined}
3317 */
3318
3319/* harmony default export */ __webpack_exports__["default"] = (function (context, element, textBox, text, handles, textBoxAnchorPoints, color, lineWidth, xOffset, yCenter) {
3320  var cornerstone = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone; // Convert the textbox Image coordinates into Canvas coordinates
3321
3322  var textCoords = cornerstone.pixelToCanvas(element, textBox);
3323
3324  if (xOffset) {
3325    textCoords.x += xOffset;
3326  }
3327
3328  var options = {
3329    centering: {
3330      x: false,
3331      y: yCenter
3332    }
3333  }; // Draw the text box
3334
3335  textBox.boundingBox = Object(_drawTextBox_js__WEBPACK_IMPORTED_MODULE_1__["default"])(context, text, textCoords.x, textCoords.y, color, options);
3336
3337  if (textBox.hasMoved) {
3338    // Identify the possible anchor points for the tool -> text line
3339    var linkAnchorPoints = textBoxAnchorPoints(handles).map(function (h) {
3340      return cornerstone.pixelToCanvas(element, h);
3341    }); // Draw dashed link line between tool and text
3342
3343    Object(_drawLink_js__WEBPACK_IMPORTED_MODULE_2__["default"])(linkAnchorPoints, textCoords, textBox.boundingBox, context, color, lineWidth);
3344  }
3345});
3346
3347/***/ }),
3348
3349/***/ "./drawing/drawRect.js":
3350/*!*****************************!*\
3351  !*** ./drawing/drawRect.js ***!
3352  \*****************************/
3353/*! exports provided: default */
3354/***/ (function(module, __webpack_exports__, __webpack_require__) {
3355
3356"use strict";
3357__webpack_require__.r(__webpack_exports__);
3358/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../externalModules.js */ "./externalModules.js");
3359/* harmony import */ var _path_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./path.js */ "./drawing/path.js");
3360/* harmony import */ var _util_pointProjector_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../util/pointProjector.js */ "./util/pointProjector.js");
3361
3362
3363
3364/**
3365 * Draw a rectangle defined by `corner1` and `corner2`.
3366 * @public
3367 * @method drawRect
3368 * @memberof Drawing
3369 *
3370 * @param {CanvasRenderingContext2D} context - Target context
3371 * @param {HTMLElement} element - The DOM Element to draw on
3372 * @param {Object} corner1 - `{ x, y }` in either pixel or canvas coordinates.
3373 * @param {Object} corner2 - `{ x, y }` in either pixel or canvas coordinates.
3374 * @param {Object} options - See {@link path}
3375 * @param {String} [coordSystem='pixel'] - Can be "pixel" (default) or "canvas". The coordinate
3376 *     system of the points passed in to the function. If "pixel" then cornerstone.pixelToCanvas
3377 *     is used to transform the points from pixel to canvas coordinates.
3378 * @param {Number} initialRotation - Rectangle initial rotation
3379 * @returns {undefined}
3380 */
3381
3382/* harmony default export */ __webpack_exports__["default"] = (function (context, element, corner1, corner2, options) {
3383  var coordSystem = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 'pixel';
3384  var initialRotation = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : 0.0;
3385
3386  if (coordSystem === 'pixel') {
3387    var cornerstone = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone;
3388    corner1 = cornerstone.pixelToCanvas(element, corner1);
3389    corner2 = cornerstone.pixelToCanvas(element, corner2);
3390  }
3391
3392  var viewport = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.getViewport(element); // Calculate the center of the image
3393
3394  var width = element.clientWidth,
3395      height = element.clientHeight;
3396  var scale = viewport.scale,
3397      translation = viewport.translation;
3398  var rotation = viewport.rotation - initialRotation;
3399  var centerPoint = {
3400    x: width / 2 + translation.x * scale,
3401    y: height / 2 + translation.y * scale
3402  };
3403
3404  if (Math.abs(rotation) > 0.05) {
3405    corner1 = Object(_util_pointProjector_js__WEBPACK_IMPORTED_MODULE_2__["rotatePoint"])(corner1, centerPoint, -rotation);
3406    corner2 = Object(_util_pointProjector_js__WEBPACK_IMPORTED_MODULE_2__["rotatePoint"])(corner2, centerPoint, -rotation);
3407  }
3408
3409  var w = Math.abs(corner1.x - corner2.x);
3410  var h = Math.abs(corner1.y - corner2.y);
3411  corner1 = {
3412    x: Math.min(corner1.x, corner2.x),
3413    y: Math.min(corner1.y, corner2.y)
3414  };
3415  corner2 = {
3416    x: corner1.x + w,
3417    y: corner1.y + h
3418  };
3419  var corner3 = {
3420    x: corner1.x + w,
3421    y: corner1.y
3422  };
3423  var corner4 = {
3424    x: corner1.x,
3425    y: corner1.y + h
3426  };
3427
3428  if (Math.abs(rotation) > 0.05) {
3429    corner1 = Object(_util_pointProjector_js__WEBPACK_IMPORTED_MODULE_2__["rotatePoint"])(corner1, centerPoint, rotation);
3430    corner2 = Object(_util_pointProjector_js__WEBPACK_IMPORTED_MODULE_2__["rotatePoint"])(corner2, centerPoint, rotation);
3431    corner3 = Object(_util_pointProjector_js__WEBPACK_IMPORTED_MODULE_2__["rotatePoint"])(corner3, centerPoint, rotation);
3432    corner4 = Object(_util_pointProjector_js__WEBPACK_IMPORTED_MODULE_2__["rotatePoint"])(corner4, centerPoint, rotation);
3433  }
3434
3435  Object(_path_js__WEBPACK_IMPORTED_MODULE_1__["default"])(context, options, function (context) {
3436    context.moveTo(corner1.x, corner1.y);
3437    context.lineTo(corner3.x, corner3.y);
3438    context.moveTo(corner3.x, corner3.y);
3439    context.lineTo(corner2.x, corner2.y);
3440    context.moveTo(corner2.x, corner2.y);
3441    context.lineTo(corner4.x, corner4.y);
3442    context.moveTo(corner4.x, corner4.y);
3443    context.lineTo(corner1.x, corner1.y);
3444  });
3445});
3446
3447/***/ }),
3448
3449/***/ "./drawing/drawTextBox.js":
3450/*!********************************!*\
3451  !*** ./drawing/drawTextBox.js ***!
3452  \********************************/
3453/*! exports provided: textBoxWidth, default */
3454/***/ (function(module, __webpack_exports__, __webpack_require__) {
3455
3456"use strict";
3457__webpack_require__.r(__webpack_exports__);
3458/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "textBoxWidth", function() { return textBoxWidth; });
3459/* harmony import */ var _stateManagement_textStyle_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../stateManagement/textStyle.js */ "./stateManagement/textStyle.js");
3460/* harmony import */ var _draw_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./draw.js */ "./drawing/draw.js");
3461/* harmony import */ var _fillTextLines_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./fillTextLines.js */ "./drawing/fillTextLines.js");
3462/* harmony import */ var _fillBox_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./fillBox.js */ "./drawing/fillBox.js");
3463
3464
3465
3466
3467/**
3468 * Compute the width of the box required to display the given `text` with a given `padding`.
3469 * @public
3470 * @function textBoxWidth
3471 * @memberof Drawing
3472 *
3473 * @param {CanvasRenderingContext2D} context - Target context
3474 * @param {String} text - The text to find the width of.
3475 * @param {Number} padding - The padding to apply on either end of the text.
3476 * @returns {Number} computed text box width
3477 */
3478
3479function textBoxWidth(context, text, padding) {
3480  var font = _stateManagement_textStyle_js__WEBPACK_IMPORTED_MODULE_0__["default"].getFont();
3481  var origFont = context.font;
3482
3483  if (font && font !== origFont) {
3484    context.font = font;
3485  }
3486
3487  var width = context.measureText(text).width;
3488
3489  if (font && font !== origFont) {
3490    context.font = origFont;
3491  }
3492
3493  return width + 2 * padding;
3494}
3495/**
3496 * Draws a textBox.
3497 * @public
3498 * @function drawTextBox
3499 * @memberof Drawing
3500 *
3501 * @param  {CanvasRenderingContext2D} context The canvas context.
3502 * @param  {string} textLines   The text to display.
3503 * @param  {number} x           The x position of the textBox.
3504 * @param  {number} y           The y position of the textBox.
3505 * @param  {string} color       The color of the textBox.
3506 * @param  {Object} options     Options for the textBox.
3507 * @returns {Object} {top, left, width, height} - Bounding box; can be used for pointNearTool
3508 */
3509
3510/* harmony default export */ __webpack_exports__["default"] = (function (context, textLines, x, y, color, options) {
3511  if (Object.prototype.toString.call(textLines) !== '[object Array]') {
3512    textLines = [textLines];
3513  }
3514
3515  var padding = 5;
3516  var fontSize = _stateManagement_textStyle_js__WEBPACK_IMPORTED_MODULE_0__["default"].getFontSize();
3517  var backgroundColor = _stateManagement_textStyle_js__WEBPACK_IMPORTED_MODULE_0__["default"].getBackgroundColor(); // Find the longest text width in the array of text data
3518
3519  var maxWidth = 0;
3520  textLines.forEach(function (text) {
3521    // Get the text width in the current font
3522    var width = textBoxWidth(context, text, padding); // Find the maximum with for all the text rows;
3523
3524    maxWidth = Math.max(maxWidth, width);
3525  }); // Calculate the bounding box for this text box
3526
3527  var boundingBox = {
3528    width: maxWidth,
3529    height: padding + textLines.length * (fontSize + padding)
3530  };
3531  Object(_draw_js__WEBPACK_IMPORTED_MODULE_1__["default"])(context, function (context) {
3532    context.strokeStyle = color; // Draw the background box with padding
3533
3534    if (options && options.centering && options.centering.x === true) {
3535      x -= boundingBox.width / 2;
3536    }
3537
3538    if (options && options.centering && options.centering.y === true) {
3539      y -= boundingBox.height / 2;
3540    }
3541
3542    boundingBox.left = x;
3543    boundingBox.top = y;
3544    var fillStyle = options && options.debug === true ? '#FF0000' : backgroundColor;
3545    Object(_fillBox_js__WEBPACK_IMPORTED_MODULE_3__["default"])(context, boundingBox, fillStyle); // Draw each of the text lines on top of the background box
3546
3547    Object(_fillTextLines_js__WEBPACK_IMPORTED_MODULE_2__["default"])(context, boundingBox, textLines, color, padding);
3548  }); // Return the bounding box so it can be used for pointNearHandle
3549
3550  return boundingBox;
3551});
3552
3553/***/ }),
3554
3555/***/ "./drawing/fillBox.js":
3556/*!****************************!*\
3557  !*** ./drawing/fillBox.js ***!
3558  \****************************/
3559/*! exports provided: default */
3560/***/ (function(module, __webpack_exports__, __webpack_require__) {
3561
3562"use strict";
3563__webpack_require__.r(__webpack_exports__);
3564/**
3565 * Draw a filled rectangle defined by `boundingBox` using the style defined by `fillStyle`.
3566 * @public
3567 * @method fillBox
3568 * @memberof Drawing
3569 *
3570 * @param {CanvasRenderingContext2D} context - Target context
3571 * @param {Object} boundingBox - `{ left, top, width, height }` in canvas coordinates.
3572 * @param {FillStyle} fillStyle - The fillStyle to apply to the region.
3573 * @returns {undefined}
3574 */
3575/* harmony default export */ __webpack_exports__["default"] = (function (context, boundingBox, fillStyle) {
3576  context.fillStyle = fillStyle;
3577  context.fillRect(boundingBox.left, boundingBox.top, boundingBox.width, boundingBox.height);
3578});
3579
3580/***/ }),
3581
3582/***/ "./drawing/fillOutsideRect.js":
3583/*!************************************!*\
3584  !*** ./drawing/fillOutsideRect.js ***!
3585  \************************************/
3586/*! exports provided: default */
3587/***/ (function(module, __webpack_exports__, __webpack_require__) {
3588
3589"use strict";
3590__webpack_require__.r(__webpack_exports__);
3591/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../externalModules.js */ "./externalModules.js");
3592/* harmony import */ var _path_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./path.js */ "./drawing/path.js");
3593
3594
3595/**
3596 * Fill the region outside a rectangle defined by `corner1` and `corner2`.
3597 * @public
3598 * @method fillOutsideRect
3599 * @memberof Drawing
3600 *
3601 * @param {CanvasRenderingContext2D} context - Target context
3602 * @param {HTMLElement} element - The DOM Element to draw on
3603 * @param {Object} corner1 - `{ x, y }` in either pixel or canvas coordinates.
3604 * @param {Object} corner2 - `{ x, y }` in either pixel or canvas coordinates.
3605 * @param {Object} options - See {@link path}
3606 * @param {String} [coordSystem='pixel'] - Can be "pixel" (default) or "canvas". The coordinate
3607 *     system of the points passed in to the function. If "pixel" then cornerstone.pixelToCanvas
3608 *     is used to transform the points from pixel to canvas coordinates.
3609 * @returns {undefined}
3610 */
3611
3612/* harmony default export */ __webpack_exports__["default"] = (function (context, element, corner1, corner2, options) {
3613  var coordSystem = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 'pixel';
3614
3615  if (coordSystem === 'pixel') {
3616    var cornerstone = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone;
3617    corner1 = cornerstone.pixelToCanvas(element, corner1);
3618    corner2 = cornerstone.pixelToCanvas(element, corner2);
3619  }
3620
3621  var left = Math.min(corner1.x, corner2.x);
3622  var top = Math.min(corner1.y, corner2.y);
3623  var width = Math.abs(corner1.x - corner2.x);
3624  var height = Math.abs(corner1.y - corner2.y);
3625  Object(_path_js__WEBPACK_IMPORTED_MODULE_1__["default"])(context, options, function (context) {
3626    context.rect(0, 0, context.canvas.clientWidth, context.canvas.clientHeight);
3627    context.rect(left + width, top, -width, height);
3628  });
3629});
3630
3631/***/ }),
3632
3633/***/ "./drawing/fillTextLines.js":
3634/*!**********************************!*\
3635  !*** ./drawing/fillTextLines.js ***!
3636  \**********************************/
3637/*! exports provided: default */
3638/***/ (function(module, __webpack_exports__, __webpack_require__) {
3639
3640"use strict";
3641__webpack_require__.r(__webpack_exports__);
3642/* harmony import */ var _stateManagement_textStyle_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../stateManagement/textStyle.js */ "./stateManagement/textStyle.js");
3643
3644/**
3645 * Draw multiple lines of text within a bounding box.
3646 * @public
3647 * @method fillTextLines
3648 * @memberof Drawing
3649 *
3650 * @param {CanvasRenderingContext2D} context - Target context
3651 * @param {Object} boundingBox - `{ left, top }` in canvas coordinates. Only the top-left corner is specified, as the text will take up as much space as it needs.
3652 * @param {String[]} textLines - The text to be displayed.
3653 * @param {FillStyle} fillStyle - The fillStyle to apply to the text.
3654 * @param {Number} padding - The amount of padding above/below each line in canvas units. Note this gives an inter-line spacing of `2*padding`.
3655 * @returns {undefined}
3656 */
3657
3658/* harmony default export */ __webpack_exports__["default"] = (function (context, boundingBox, textLines, fillStyle, padding) {
3659  var fontSize = _stateManagement_textStyle_js__WEBPACK_IMPORTED_MODULE_0__["default"].getFontSize();
3660  context.font = _stateManagement_textStyle_js__WEBPACK_IMPORTED_MODULE_0__["default"].getFont();
3661  context.textBaseline = 'top';
3662  context.fillStyle = fillStyle;
3663  textLines.forEach(function (text, index) {
3664    context.fillText(text, boundingBox.left + padding, boundingBox.top + padding + index * (fontSize + padding));
3665  });
3666});
3667
3668/***/ }),
3669
3670/***/ "./drawing/getNewContext.js":
3671/*!**********************************!*\
3672  !*** ./drawing/getNewContext.js ***!
3673  \**********************************/
3674/*! exports provided: default */
3675/***/ (function(module, __webpack_exports__, __webpack_require__) {
3676
3677"use strict";
3678__webpack_require__.r(__webpack_exports__);
3679/**
3680 * Create a new {@link CanvasRenderingContext2D|context} object for the given {@link HTMLCanvasElement|canvas}
3681 * and set the transform to the {@link https://www.w3.org/TR/2dcontext/#transformations|identity transform}.
3682 *
3683 * @public
3684 * @function getNewContext
3685 * @memberof Drawing
3686 *
3687 * @param {HTMLCanvasElement} canvas - Canvas you would like the context for
3688 * @returns {CanvasRenderingContext2D} - The provided canvas's 2d context
3689 */
3690/* harmony default export */ __webpack_exports__["default"] = (function (canvas) {
3691  var context = canvas.getContext('2d');
3692  context.setTransform(1, 0, 0, 1, 0, 0);
3693  return context;
3694});
3695
3696/***/ }),
3697
3698/***/ "./drawing/index.js":
3699/*!**************************!*\
3700  !*** ./drawing/index.js ***!
3701  \**************************/
3702/*! exports provided: draw, drawArrow, drawCircle, drawEllipse, drawHandles, drawJoinedLines, drawLine, drawLines, drawLink, drawLinkedTextBox, drawRect, drawTextBox, fillBox, fillOutsideRect, fillTextLines, getNewContext, path, setShadow, transformCanvasContext, resetCanvasContextTransform */
3703/***/ (function(module, __webpack_exports__, __webpack_require__) {
3704
3705"use strict";
3706__webpack_require__.r(__webpack_exports__);
3707/* harmony import */ var _draw_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./draw.js */ "./drawing/draw.js");
3708/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "draw", function() { return _draw_js__WEBPACK_IMPORTED_MODULE_0__["default"]; });
3709
3710/* harmony import */ var _drawArrow_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./drawArrow.js */ "./drawing/drawArrow.js");
3711/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "drawArrow", function() { return _drawArrow_js__WEBPACK_IMPORTED_MODULE_1__["default"]; });
3712
3713/* harmony import */ var _drawCircle_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./drawCircle.js */ "./drawing/drawCircle.js");
3714/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "drawCircle", function() { return _drawCircle_js__WEBPACK_IMPORTED_MODULE_2__["default"]; });
3715
3716/* harmony import */ var _drawEllipse_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./drawEllipse.js */ "./drawing/drawEllipse.js");
3717/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "drawEllipse", function() { return _drawEllipse_js__WEBPACK_IMPORTED_MODULE_3__["default"]; });
3718
3719/* harmony import */ var _drawHandles_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./drawHandles.js */ "./drawing/drawHandles.js");
3720/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "drawHandles", function() { return _drawHandles_js__WEBPACK_IMPORTED_MODULE_4__["default"]; });
3721
3722/* harmony import */ var _drawJoinedLines_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./drawJoinedLines.js */ "./drawing/drawJoinedLines.js");
3723/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "drawJoinedLines", function() { return _drawJoinedLines_js__WEBPACK_IMPORTED_MODULE_5__["default"]; });
3724
3725/* harmony import */ var _drawLine_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./drawLine.js */ "./drawing/drawLine.js");
3726/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "drawLine", function() { return _drawLine_js__WEBPACK_IMPORTED_MODULE_6__["default"]; });
3727
3728/* harmony import */ var _drawLines_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./drawLines.js */ "./drawing/drawLines.js");
3729/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "drawLines", function() { return _drawLines_js__WEBPACK_IMPORTED_MODULE_7__["default"]; });
3730
3731/* harmony import */ var _drawLink_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./drawLink.js */ "./drawing/drawLink.js");
3732/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "drawLink", function() { return _drawLink_js__WEBPACK_IMPORTED_MODULE_8__["default"]; });
3733
3734/* harmony import */ var _drawLinkedTextBox_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./drawLinkedTextBox.js */ "./drawing/drawLinkedTextBox.js");
3735/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "drawLinkedTextBox", function() { return _drawLinkedTextBox_js__WEBPACK_IMPORTED_MODULE_9__["default"]; });
3736
3737/* harmony import */ var _drawRect_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./drawRect.js */ "./drawing/drawRect.js");
3738/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "drawRect", function() { return _drawRect_js__WEBPACK_IMPORTED_MODULE_10__["default"]; });
3739
3740/* harmony import */ var _drawTextBox_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./drawTextBox.js */ "./drawing/drawTextBox.js");
3741/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "drawTextBox", function() { return _drawTextBox_js__WEBPACK_IMPORTED_MODULE_11__["default"]; });
3742
3743/* harmony import */ var _fillBox_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./fillBox.js */ "./drawing/fillBox.js");
3744/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "fillBox", function() { return _fillBox_js__WEBPACK_IMPORTED_MODULE_12__["default"]; });
3745
3746/* harmony import */ var _fillOutsideRect_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./fillOutsideRect.
3746js */ "./drawing/fillOutsideRect.js");
3747/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "fillOutsideRect", function() { return _fillOutsideRect_js__WEBPACK_IMPORTED_MODULE_13__["default"]; });
3748
3749/* harmony import */ var _fillTextLines_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./fillTextLines.js */ "./drawing/fillTextLines.js");
3750/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "fillTextLines", function() { return _fillTextLines_js__WEBPACK_IMPORTED_MODULE_14__["default"]; });
3751
3752/* harmony import */ var _getNewContext_js__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./getNewContext.js */ "./drawing/getNewContext.js");
3753/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getNewContext", function() { return _getNewContext_js__WEBPACK_IMPORTED_MODULE_15__["default"]; });
3754
3755/* harmony import */ var _path_js__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./path.js */ "./drawing/path.js");
3756/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "path", function() { return _path_js__WEBPACK_IMPORTED_MODULE_16__["default"]; });
3757
3758/* harmony import */ var _setShadow_js__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./setShadow.js */ "./drawing/setShadow.js");
3759/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "setShadow", function() { return _setShadow_js__WEBPACK_IMPORTED_MODULE_17__["default"]; });
3760
3761/* harmony import */ var _transformCanvasContext_js__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./transformCanvasContext.js */ "./drawing/transformCanvasContext.js");
3762/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "transformCanvasContext", function() { return _transformCanvasContext_js__WEBPACK_IMPORTED_MODULE_18__["default"]; });
3763
3764/* harmony import */ var _resetCanvasContextTransform_js__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./resetCanvasContextTransform.js */ "./drawing/resetCanvasContextTransform.js");
3765/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "resetCanvasContextTransform", function() { return _resetCanvasContextTransform_js__WEBPACK_IMPORTED_MODULE_19__["default"]; });
3766
3767/**
3768 * A {@link https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/fillStyle|color, gradient or pattern} to use inside shapes.
3769 * @typedef {(String|CanvasGradient|CanvasPattern)} FillStyle
3770 */
3771
3772/**
3773 * A {@link https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/strokeStyle|color, gradient or pattern} to use for the lines around shapes.
3774 * @typedef {(String|CanvasGradient|CanvasPattern)} StrokeStyle
3775 */
3776
3777/**
3778 * @callback ContextFn
3779 * @param {CanvasRenderingContext2D} context
3780 */
3781
3782
3783
3784
3785
3786
3787
3788
3789
3790
3791
3792
3793
3794
3795
3796
3797
3798
3799
3800 // Named exports
3801
3802
3803
3804/***/ }),
3805
3806/***/ "./drawing/path.js":
3807/*!*************************!*\
3808  !*** ./drawing/path.js ***!
3809  \*************************/
3810/*! exports provided: default */
3811/***/ (function(module, __webpack_exports__, __webpack_require__) {
3812
3813"use strict";
3814__webpack_require__.r(__webpack_exports__);
3815/* harmony import */ var _stateManagement_toolStyle_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../stateManagement/toolStyle.js */ "./stateManagement/toolStyle.js");
3816
3817/**
3818 * This function manages the beginPath/stroke pattern for working with
3819 * {@link https://www.w3.org/TR/2dcontext/#drawing-paths-to-the-canvas|path objects}.
3820 *
3821 * @public
3822 * @function path
3823 * @memberof Drawing
3824 *
3825 * @param {CanvasRenderingContext2D} context - Context to add path to
3826 * @param {Object} [options={}] - Drawing Options
3827 * @param {StrokeStyle} [options.color] - The stroke style of the path.
3828 * @param {Number} [options.lineWidth] - The width of lines in the path. If null, no line width is set.
3829 *     If undefined then toolStyle.getToolWidth() is set.
3830 * @param {FillStyle} [options.fillStyle] - The style to fill the path with. If undefined then no filling is done.
3831 * @param {Number[]} [options.lineDash] - The {@link https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/setLineDash|dash pattern}
3832 *     to use on the lines.
3833 * @param {ContextFn} fn - A drawing function to execute with the provided stroke pattern.
3834 * @returns {undefined}
3835 */
3836
3837/* harmony default export */ __webpack_exports__["default"] = (function (context) {
3838  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
3839  var fn = arguments.length > 2 ? arguments[2] : undefined;
3840  var color = options.color,
3841      lineWidth = options.lineWidth,
3842      fillStyle = options.fillStyle,
3843      lineDash = options.lineDash;
3844  context.beginPath();
3845  context.strokeStyle = color || context.strokeStyle;
3846  context.lineWidth = lineWidth || lineWidth === undefined && _stateManagement_toolStyle_js__WEBPACK_IMPORTED_MODULE_0__["default"].getToolW
3846idth() || context.lineWidth;
3847
3848  if (lineDash) {
3849    context.setLineDash(lineDash);
3850  }
3851
3852  fn(context);
3853
3854  if (fillStyle) {
3855    context.fillStyle = fillStyle;
3856    context.fill();
3857  }
3858
3859  context.stroke();
3860
3861  if (lineDash) {
3862    context.setLineDash([]);
3863  }
3864});
3865
3866/***/ }),
3867
3868/***/ "./drawing/resetCanvasContextTransform.js":
3869/*!************************************************!*\
3870  !*** ./drawing/resetCanvasContextTransform.js ***!
3871  \************************************************/
3872/*! exports provided: default */
3873/***/ (function(module, __webpack_exports__, __webpack_require__) {
3874
3875"use strict";
3876__webpack_require__.r(__webpack_exports__);
3877/**
3878 * Resets the canvas {@link CanvasRenderingContext2D|context} transform to the
3879 * {@link https://www.w3.org/TR/2dcontext/#transformations|identity transform}.
3880 *
3881 * @public
3882 * @function resetCanvasContextTransform
3883 * @memberof Drawing
3884 *
3885 * @param {CanvasRenderingContext2D} context - context you wish to transform
3886 * @returns {void}
3887 */
3888/* harmony default export */ __webpack_exports__["default"] = (function (context) {
3889  context.setTransform(1, 0, 0, 1, 0, 0);
3890});
3891
3892/***/ }),
3893
3894/***/ "./drawing/setShadow.js":
3895/*!******************************!*\
3896  !*** ./drawing/setShadow.js ***!
3897  \******************************/
3898/*! exports provided: default */
3899/***/ (function(module, __webpack_exports__, __webpack_require__) {
3900
3901"use strict";
3902__webpack_require__.r(__webpack_exports__);
3903/* harmony import */ var _util_getDefault_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../util/getDefault.js */ "./util/getDefault.js");
3904
3905/**
3906 * Set the {@link https://www.w3.org/TR/2dcontext/#shadows|shadow} properties of the context.
3907 * Each property is set on the context object if defined, otherwise a default value is set.
3908 *
3909 * @public
3910 * @method setShadow
3911 * @memberof Drawing
3912 *
3913 * @param {CanvasRenderingContext2D} context - Context to apply shadow options on
3914 * @param {Object}  [options={}] - Options object
3915 * @param {Boolean} [options.shadow=undefined] - Whether to set any shadow options
3916 * @param {String}  [options.shadowColor=#000000] - Default value: #000000
3917 * @param {Number}  [options.shadowBlur=0] - Default Value: 0
3918 * @param {Number}  [options.shadowOffsetX=1] - Default value: 1
3919 * @param {Number}  [options.shadowOffsetY=1] - Default value: 1
3920 * @returns {undefined}
3921 */
3922
3923/* harmony default export */ __webpack_exports__["default"] = (function (context) {
3924  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
3925
3926  if (options.shadow) {
3927    context.shadowColor = Object(_util_getDefault_js__WEBPACK_IMPORTED_MODULE_0__["default"])(options.shadowColor, '#000000');
3928    context.shadowBlur = Object(_util_getDefault_js__WEBPACK_IMPORTED_MODULE_0__["default"])(options.shadowBlur, 0);
3929    context.shadowOffsetX = Object(_util_getDefault_js__WEBPACK_IMPORTED_MODULE_0__["default"])(options.shadowOffsetX, 1);
3930    context.shadowOffsetY = Object(_util_getDefault_js__WEBPACK_IMPORTED_MODULE_0__["default"])(options.shadowOffsetY, 1);
3931  }
3932});
3933
3934/***/ }),
3935
3936/***/ "./drawing/transformCanvasContext.js":
3937/*!*******************************************!*\
3938  !*** ./drawing/transformCanvasContext.js ***!
3939  \*******************************************/
3940/*! exports provided: default */
3941/***/ (function(module, __webpack_exports__, __webpack_require__) {
3942
3943"use strict";
3944__webpack_require__.r(__webpack_exports__);
3945/**
3946 * Transform the canvas {@link CanvasRenderingContext2D|context} such that it
3947 * coincides with the orientation of the viewport.
3948 *
3949 * @public
3950 * @function transformCanvasContext
3951 * @memberof Drawing
3952 *
3953 * @param {CanvasRenderingContext2D} context - Context you wish to transform.
3954 * @param {HTMLCanvasElement} canvas - Canvas the context relates to.
3955 * @param {*} viewport - The viewport you wish to map on to.
3956 * @returns {void}
3957 */
3958/* harmony default export */ __webpack_exports__["default"] = (function (context, canvas, viewport) {
3959  if (!(viewport.vflip || viewport.vflip || viewport.rotation)) {
3960    return;
3961  }
3962
3963  var translation = {
3964    x: canvas.width / 2 + viewport.translation.x * viewport.scale,
3965    y: canvas.height / 2 + viewport.translation.y * viewport.scale
3966  };
3967  context.translate(translation.x, translation.y);
3968
3969  if (viewport.rotation) {
3970    context.rotate(viewport.rotation * Math.PI / 180);
3971  }
3972
3973  if (viewport.vflip) {
3974    context.scale(1, -1);
3975  }
3976
3977  if (viewport.hflip) {
3978    context.scale(-1, 1);
3979  }
3980
3981  context.translate(-translation.x, -translation.y);
3982});
3983
3984/***/ }),
3985
3986/***/ "./eventDispatchers/imageRenderedEventDispatcher.js":
3987/*!**********************************************************!*\
3988  !*** ./eventDispatchers/imageRenderedEventDispatcher.js ***!
3989  \**********************************************************/
3990/*! exports provided: default */
3991/***/ (function(module, __webpack_exports__, __webpack_require__) {
3992
3993"use strict";
3994__webpack_require__.r(__webpack_exports__);
3995/* harmony import */ var _store_index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../store/index.js */ "./store/index.js");
3996/* harmony import */ var _tools_base_BaseBrushTool_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./../tools/base/BaseBrushTool.js */ "./tools/base/BaseBrushTool.js");
3997/* harmony import */ var _eventListeners_onImageRenderedBrushEventHandler_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../eventListeners/onImageRenderedBrushEventHandler.js */ "./eventListeners/onImageRenderedBrushEventHandler.js");
3998/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./../externalModules.js */ "./externalModules.js");
3999
4000
4001
4002
4003
4004var onImageRendered = function onImageRendered(evt) {
4005  var eventData = evt.detail;
4006  var element = eventData.element; // Render Annotation Tools
4007
4008  var toolsToRender = _store_index_js__WEBPACK_IMPORTED_MODULE_0__["state"].tools.filter(function (tool) {
4009    return tool.element === element && (tool.mode === 'active' || tool.mode === 'passive' || tool.mode === 'enabled');
4010  });
4011  var brushTools = toolsToRender.filter(function (tool) {
4012    return tool instanceof _tools_base_BaseBrushTool_js__WEBPACK_IMPORTED_MODULE_1__["default"];
4013  });
4014
4015  if (brushTools.length > 0) {
4016    Object(_eventListeners_onImageRenderedBrushEventHandler_js__WEBPACK_IMPORTED_MODULE_2__["default"])(evt);
4017  }
4018
4019  toolsToRender.forEach(function (tool) {
4020    if (tool.renderToolData) {
4021      tool.renderToolData(evt);
4022    }
4023  });
4024};
4025
4026var enable = function enable(element) {
4027  element.addEventListener(_externalModules_js__WEBPACK_IMPORTED_MODULE_3__["default"].cornerstone.EVENTS.IMAGE_RENDERED, onImageRendered);
4028};
4029
4030var disable = function disable(element) {
4031  element.removeEventListener(_externalModules_js__WEBPACK_IMPORTED_MODULE_3__["default"].cornerstone.EVENTS.IMAGE_RENDERED, onImageRendered);
4032};
4033
4034/* harmony default export */ __webpack_exports__["default"] = ({
4035  enable: enable,
4036  disable: disable
4037});
4038
4039/***/ }),
4040
4041/***/ "./eventDispatchers/index.js":
4042/*!***********************************!*\
4043  !*** ./eventDispatchers/index.js ***!
4044  \***********************************/
4045/*! exports provided: imageRenderedEventDispatcher, mouseToolEventDispatcher, newImageEventDispatcher, touchToolEventDispatcher */
4046/***/ (function(module, __webpack_exports__, __webpack_require__) {
4047
4048"use strict";
4049__webpack_require__.r(__webpack_exports__);
4050/* harmony import */ var _imageRenderedEventDispatcher_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./imageRenderedEventDispatcher.js */ "./eventDispatchers/imageRenderedEventDispatcher.js");
4051/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "imageRenderedEventDispatcher", function() { return _imageRenderedEventDispatcher_js__WEBPACK_IMPORTED_MODULE_0__["default"]; });
4052
4053/* harmony import */ var _mouseToolEventDispatcher_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./mouseToolEventDispatcher.js */ "./eventDispatchers/mouseToolEventDispatcher.js");
4054/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "mouseToolEventDispatcher", function() { return _mouseToolEventDispatcher_js__WEBPACK_IMPORTED_MODULE_1__["default"]; });
4055
4056/* harmony import */ var _newImageEventDispatcher_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./newImageEventDispatcher.js */ "./eventDispatchers/newImageEventDispatcher.js");
4057/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "newImageEventDispatcher", function() { return _newImageEventDispatcher_js__WEBPACK_IMPORTED_MODULE_2__["default"]; });
4058
4059/* harmony import */ var _touchToolEventDispatcher_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./touchToolEventDispatcher.js */ "./eventDispatchers/touchToolEventDispatcher.js");
4060/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "touchToolEventDispatcher", function() { return _touchToolEventDispatcher_js__WEBPACK_IMPORTED_MODULE_3__["default"]; });
4061
4062
4063
4064
4065
4066
4067
4068/***/ }),
4069
4070/***/ "./eventDispatchers/mouseEventHandlers/addNewMeasurement.js":
4071/*!******************************************************************!*\
4072  !*** ./eventDispatchers/mouseEventHandlers/addNewMeasurement.js ***!
4073  \******************************************************************/
4074/*! exports provided: default */
4075/***/ (function(module, __webpack_exports__, __webpack_require__) {
4076
4077"use strict";
4078__webpack_require__.r(__webpack_exports__);
4079/* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../events.js */ "./events.js");
4080/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../externalModules.js */ "./externalModules.js");
4081/* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../stateManagement/toolState.js */ "./stateManagement/toolState.js");
4082/* harmony import */ var _manipulators_index_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../manipulators/index.js */ "./manipulators/index.js");
4083/* harmony import */ var _util_logger_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../util/logger.js */ "./util/logger.js");
4084/* harmony import */ var _util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../util/triggerEvent.js */ "./util/triggerEvent.js");
4085
4086
4087
4088
4089
4090
4091var logger = Object(_util_logger_js__WEBPACK_IMPORTED_MODULE_4__["getLogger"])('eventDispatchers:mouseEventHandlers');
4092/* harmony default export */ __webpack_exports__["default"] = (function (evt, tool) {
4093  logger.log('addNewMeasurement');
4094  evt.preventDefault();
4095  evt.stopPropagation();
4096  var eventData = evt.detail;
4097  var element = eventData.element;
4098  var measurementData = tool.createNewMeasurement(eventData);
4099
4100  if (!measurementData) {
4101    return;
4102  } // Associate this data with this imageId so we can render it and manipulate it
4103
4104
4105  Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_2__["addToolState"])(element, tool.name, measurementData);
4106  _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.updateImage(element);
4107  var options = Object.assign({
4108    doneMovingCallback: function doneMovingCallback() {
4109      var eventType = _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MEASUREMENT_COMPLETED;
4110      var eventData = {
4111        toolName: tool.name,
4112        element: element,
4113        measurementData: measurementData
4114      };
4115      Object(_util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_5__["default"])(element, eventType, eventData);
4116    }
4117  }, tool.options);
4118  var handleMover = Object.keys(measurementData.handles).length === 1 ? _manipulators_index_js__WEBPACK_IMPORTED_MODULE_3__["moveHandle"] : _manipulators_index_js__WEBPACK_IMPORTED_MODULE_3__["moveNewHandle"];
4119  handleMover(eventData, tool.name, measurementData, measurementData.handles.end, options, 'mouse');
4120});
4121
4122/***/ }),
4123
4124/***/ "./eventDispatchers/mouseEventHandlers/index.js":
4125/*!******************************************************!*\
4126  !*** ./eventDispatchers/mouseEventHandlers/index.js ***!
4127  \******************************************************/
4128/*! exports provided: mouseClick, mouseDown, mouseDownActivate, mouseDoubleClick, mouseDrag, mouseMove, mouseUp, mouseWheel */
4129/***/ (function(module, __webpack_exports__, __webpack_require__) {
4130
4131"use strict";
4132__webpack_require__.r(__webpack_exports__);
4133/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "mouseClick", function() { return mouseClick; });
4134/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "mouseDoubleClick", function() { return mouseDoubleClick; });
4135/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "mouseUp", function() { return mouseUp; });
4136/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "mouseWheel", function() { return mouseWheel; });
4137/* harmony import */ var _shared_customCallbackHandler_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../shared/customCallbackHandler.js */ "./eventDispatchers/shared/customCallbackHandler.js");
4138/* harmony import */ var _mouseDown_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./mouseDown.js */ "./eventDispatchers/mouseEventHandlers/mouseDown.js");
4139/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "mouseDown", function() { return _mouseDown_js__WEBPACK_IMPORTED_MODULE_1__["default"]; });
4140
4141/* harmony import */ var _mouseDownActivate_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./mouseDownActivate.js */ "./eventDispatchers/mouseEventHandlers/mouseDownActivate.js");
4142/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "mouseDownActivate", function() { return _mouseDownActivate_js__WEBPACK_IMPORTED_MODULE_2__["default"]; });
4143
4144/* harmony import */ var _mouseDrag_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./mouseDrag.js */ "./eventDispatchers/mouseEventHandlers/mouseDrag.js");
4145/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "mouseDrag", function() { return _mouseDrag_js__WEBPACK_IMPORTED_MODULE_3__["default"]; });
4146
4147/* harmony import */ var _mouseMove_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./mouseMove.js */ "./eventDispatchers/mouseEventHandlers/mouseMove.js");
4148/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "mouseMove", function() { return _mouseMove_js__WEBPACK_IMPORTED_MODULE_4__["default"]; });
4149
4150
4151
4152
4153
4154
4155var mouseClick = _shared_customCallbackHandler_js__WEBPACK_IMPORTED_MODULE_0__["default"].bind(null, 'Mouse', 'mouseClickCallback');
4156var mouseDoubleClick = _shared_customCallbackHandler_js__WEBPACK_IMPORTED_MODULE_0__["default"].bind(null, 'Mouse', 'doubleClickCallback');
4157var mouseUp = _shared_customCallbackHandler_js__WEBPACK_IMPORTED_MODULE_0__["default"].bind(null, 'Mouse', 'mouseUpCallback');
4158var mouseWheel = _shared_customCallbackHandler_js__WEBPACK_IMPORTED_MODULE_0__["default"].bind(null, 'MouseWheel', 'mouseWheelCallback');
4159
4160
4161/***/ }),
4162
4163/***/ "./eventDispatchers/mouseEventHandlers/mouseDown.js":
4164/*!**********************************************************!*\
4165  !*** ./eventDispatchers/mouseEventHandlers/mouseDown.js ***!
4166  \**********************************************************/
4167/*! exports provided: default */
4168/***/ (function(module, __webpack_exports__, __webpack_require__) {
4169
4170"use strict";
4171__webpack_require__.r(__webpack_exports__);
4172/* harmony import */ var _store_index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../../store/index.js */ "./store/index.js");
4173/* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./../../stateManagement/toolState.js */ "./stateManagement/toolState.js");
4174/* harmony import */ var _store_getToolsWithMoveableHandles_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../store/getToolsWithMoveableHandles.js */ "./store/getToolsWithMoveableHandles.js");
4175/* harmony import */ var _util_findAndMoveHelpers_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../util/findAndMoveHelpers.js */ "./util/findAndMoveHelpers.js");
4176/* harmony import */ var _store_getInteractiveToolsForElement_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./../../store/getInteractiveToolsForElement.js */ "./store/getInteractiveToolsForElement.js");
4177/* harmony import */ var _store_getToolsWithDataForElement_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./../../store/getToolsWithDataForElement.js */ "./store/getToolsWithDataForElement.js");
4178/* harmony import */ var _store_filterToolsUsableWithMultiPartTools_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./../../store/filterToolsUsableWithMultiPartTools.js */ "./store/filterToolsUsableWithMultiPartTools.js");
4179// State
4180
4181 // Util
4182
4183
4184
4185
4186
4187
4188/**
4189 * MouseDown is called before MouseDownActivate. If MouseDown
4190 * finds an existing tool to interact with, it can prevent the
4191 * event from bubbling to MouseDownActivate.
4192 *
4193 * @private
4194 * @param {mousedown} evt
4195 * @listens {CornerstoneTools.event:cornerstonetoolsmousedown}
4196 * @returns {undefined}
4197 */
4198
4199/* harmony default export */ __webpack_exports__["default"] = (function (evt) {
4200  if (_store_index_js__WEBPACK_IMPORTED_MODULE_0__["state"].isToolLocked) {
4201    return;
4202  }
4203
4204  var eventData = evt.detail;
4205  var element = evt.detail.element;
4206  var coords = evt.detail.currentPoints.canvas; // High level filtering
4207
4208  var activeAndPassiveTools = Object(_store_getInteractiveToolsForElement_js__WEBPACK_IMPORTED_MODULE_4__["default"])(element, _store_index_js__WEBPACK_IMPORTED_MODULE_0__["getters"].mouseTools()); // ACTIVE TOOL W/ PRE CALLBACK?
4209  // Note: In theory, this should only ever be a single tool.
4210
4211  var activeTools = activeAndPassiveTools.filter(function (tool) {
4212    return tool.mode === 'active' && Array.isArray(tool.options.mouseButtonMask) && tool.options.mouseButtonMask.includes(eventData.buttons) && tool.options.isMouseActive;
4213  });
4214
4215  if (_store_index_js__WEBPACK_IMPORTED_MODULE_0__["state"].isMultiPartToolActive) {
4216    activeTools = Object(_store_filterToolsUsableWithMultiPartTools_js__WEBPACK_IMPORTED_MODULE_6__["default"])(activeTools);
4217  } // If any tools are active, check if they have a special reason for dealing with the event.
4218
4219
4220  if (activeTools.length > 0) {
4221    // TODO: If length > 1, you could assess fitness and select the ideal tool
4222    // TODO: But because we're locking this to 'active' tools, that should rarely be an issue
4223    // Super-Meta-TODO: ^ I think we should just take the approach of one active tool per mou
4223se button?
4224    var firstActiveToolWithCallback = activeTools.find(function (tool) {
4225      return typeof tool.preMouseDownCallback === 'function';
4226    });
4227
4228    if (firstActiveToolWithCallback) {
4229      var consumedEvent = firstActiveToolWithCallback.preMouseDownCallback(evt);
4230
4231      if (consumedEvent) {
4232        return;
4233      }
4234    }
4235  }
4236
4237  if (_store_index_js__WEBPACK_IMPORTED_MODULE_0__["state"].isMultiPartToolActive) {
4238    // Don't fire events to Annotation Tools during a multi part loop.
4239    return;
4240  } // Annotation tool specific
4241
4242
4243  var annotationTools = Object(_store_getToolsWithDataForElement_js__WEBPACK_IMPORTED_MODULE_5__["default"])(element, activeAndPassiveTools); // NEAR HANDLES?
4244
4245  var annotationToolsWithMoveableHandles = Object(_store_getToolsWithMoveableHandles_js__WEBPACK_IMPORTED_MODULE_2__["default"])(element, annotationTools, coords, 'mouse');
4246
4247  if (annotationToolsWithMoveableHandles.length > 0) {
4248    var firstToolWithMoveableHandles = annotationToolsWithMoveableHandles[0];
4249    var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_1__["getToolState"])(element, firstToolWithMoveableHandles.name);
4250
4251    var _findHandleDataNearIm = Object(_util_findAndMoveHelpers_js__WEBPACK_IMPORTED_MODULE_3__["findHandleDataNearImagePoint"])(element, toolState, firstToolWithMoveableHandles.name, coords),
4252        handle = _findHandleDataNearIm.handle,
4253        data = _findHandleDataNearIm.data;
4254
4255    firstToolWithMoveableHandles.handleSelectedCallback(evt, data, handle, 'mouse');
4256    return;
4257  } // NEAR TOOL?
4258
4259
4260  var annotationToolsWithPointNearClick = activeAndPassiveTools.filter(function (tool) {
4261    var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_1__["getToolState"])(element, tool.name);
4262    var isNearPoint = toolState && toolState.data && tool.pointNearTool && toolState.data.some(function (data) {
4263      return tool.pointNearTool(element, data, coords, 'mouse');
4264    });
4265    return isNearPoint;
4266  });
4267
4268  if (annotationToolsWithPointNearClick.length > 0) {
4269    var firstToolNearPoint = annotationToolsWithPointNearClick[0];
4270
4271    var _toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_1__["getToolState"])(element, firstToolNearPoint.name);
4272
4273    var firstAnnotationNearPoint = _toolState.data.find(function (data) {
4274      return firstToolNearPoint.pointNearTool(element, data, coords);
4275    });
4276
4277    firstToolNearPoint.toolSelectedCallback(evt, firstAnnotationNearPoint, 'mouse');
4278    return;
4279  } // ACTIVE TOOL W/ POST CALLBACK?
4280  // If any tools are active, check if they have a special reason for dealing with the event.
4281
4282
4283  if (activeTools.length > 0) {
4284    // TODO: If length > 1, you could assess fitness and select the ideal tool
4285    // TODO: But because we're locking this to 'active' tools, that should rarely be an issue
4286    // Super-Meta-TODO: ^ I think we should just take the approach of one active tool per mou
4286se button?
4287    var _firstActiveToolWithCallback = activeTools.find(function (tool) {
4288      return typeof tool.postMouseDownCallback === 'function';
4289    });
4290
4291    if (_firstActiveToolWithCallback) {
4292      var _consumedEvent = _firstActiveToolWithCallback.postMouseDownCallback(evt);
4293
4294      if (_consumedEvent) {
4295        return;
4296      }
4297    }
4298  }
4299});
4300
4301/***/ }),
4302
4303/***/ "./eventDispatchers/mouseEventHandlers/mouseDownActivate.js":
4304/*!******************************************************************!*\
4305  !*** ./eventDispatchers/mouseEventHandlers/mouseDownActivate.js ***!
4306  \******************************************************************/
4307/*! exports provided: default */
4308/***/ (function(module, __webpack_exports__, __webpack_require__) {
4309
4310"use strict";
4311__webpack_require__.r(__webpack_exports__);
4312/* harmony import */ var _addNewMeasurement_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./addNewMeasurement.js */ "./eventDispatchers/mouseEventHandlers/addNewMeasurement.js");
4313/* harmony import */ var _store_index_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./../../store/index.js */ "./store/index.js");
4314/* harmony import */ var _tools_base_BaseAnnotationTool_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./../../tools/base/BaseAnnotationTool.js */ "./tools/base/BaseAnnotationTool.js");
4315/* harmony import */ var _util_getActiveTool__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../util/getActiveTool */ "./util/getActiveTool.js");
4316
4317
4318
4319
4320/* harmony default export */ __webpack_exports__["default"] = (function (evt) {
4321  if (_store_index_js__WEBPACK_IMPORTED_MODULE_1__["state"].isToolLocked) {
4322    return;
4323  }
4324
4325  var _evt$detail = evt.detail,
4326      element = _evt$detail.element,
4327      buttons = _evt$detail.buttons;
4328  var activeTool = Object(_util_getActiveTool__WEBPACK_IMPORTED_MODULE_3__["default"])(element, buttons, 'mouse');
4329
4330  if (!activeTool) {
4331    return;
4332  }
4333
4334  if (typeof activeTool.preMouseDownActivateCallback === 'function') {
4335    var consumedEvent = activeTool.preMouseDownActivateCallback(evt);
4336
4337    if (consumedEvent) {
4338      return;
4339    }
4340  }
4341
4342  if (_store_index_js__WEBPACK_IMPORTED_MODULE_1__["state"].isMultiPartToolActive) {
4343    return;
4344  } // Note: custom `addNewMeasurement` will need to prevent event bubbling
4345
4346
4347  if (activeTool.addNewMeasurement) {
4348    activeTool.addNewMeasurement(evt, 'mouse');
4349  } else if (activeTool instanceof _tools_base_BaseAnnotationTool_js__WEBPACK_IMPORTED_MODULE_2__["default"]) {
4350    Object(_addNewMeasurement_js__WEBPACK_IMPORTED_MODULE_0__["default"])(evt, activeTool);
4351  }
4352});
4353
4354/***/ }),
4355
4356/***/ "./eventDispatchers/mouseEventHandlers/mouseDrag.js":
4357/*!**********************************************************!*\
4358  !*** ./eventDispatchers/mouseEventHandlers/mouseDrag.js ***!
4359  \**********************************************************/
4360/*! exports provided: default */
4361/***/ (function(module, __webpack_exports__, __webpack_require__) {
4362
4363"use strict";
4364__webpack_require__.r(__webpack_exports__);
4365/* harmony import */ var _store_index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../../store/index.js */ "./store/index.js");
4366/* harmony import */ var _store_getActiveToolsForElement_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./../../store/getActiveToolsForElement.js */ "./store/getActiveToolsForElement.js");
4367/* harmony import */ var _store_filterToolsUsableWithMultiPartTools_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./../../store/filterToolsUsableWithMultiPartTools.js */ "./store/filterToolsUsableWithMultiPartTools.js");
4368
4369
4370 // Tools like wwwc. Non-annotation tools w/ specific
4371// Down + mouse behavior
4372// TODO: I don't like filtering in drag because it's such
4373// A high frequency event. Anything we can do to reduce
4374// Repeat math here would be a big help
4375
4376/* harmony default export */ __webpack_exports__["default"] = (function (evt) {
4377  if (_store_index_js__WEBPACK_IMPORTED_MODULE_0__["state"].isToolLocked) {
4378    return;
4379  }
4380
4381  var tools;
4382  var eventData = evt.detail;
4383  var element = eventData.element; // Filter out disabled, enabled, and passive
4384
4385  tools = Object(_store_getActiveToolsForElement_js__WEBPACK_IMPORTED_MODULE_1__["default"])(element, _store_index_js__WEBPACK_IMPORTED_MODULE_0__["getters"].mouseTools());
4386  tools = tools.filter(function (tool) {
4387    return Array.isArray(tool.options.mouseButtonMask) && tool.options.mouseButtonMask.includes(eventData.buttons) && tool.options.isMouseActive;
4388  });
4389  tools = tools.filter(function (tool) {
4390    return typeof tool.mouseDragCallback === 'function';
4391  });
4392
4393  if (_store_index_js__WEBPACK_IMPORTED_MODULE_0__["state"].isMultiPartToolActive) {
4394    tools = Object(_store_filterToolsUsableWithMultiPartTools_js__WEBPACK_IMPORTED_MODULE_2__["default"])(tools);
4395  }
4396
4397  if (tools.length === 0) {
4398    return;
4399  }
4400
4401  var activeTool = tools[0];
4402  activeTool.mouseDragCallback(evt);
4403});
4404
4405/***/ }),
4406
4407/***/ "./eventDispatchers/mouseEventHandlers/mouseMove.js":
4408/*!**********************************************************!*\
4409  !*** ./eventDispatchers/mouseEventHandlers/mouseMove.js ***!
4410  \**********************************************************/
4411/*! exports provided: default */
4412/***/ (function(module, __webpack_exports__, __webpack_require__) {
4413
4414"use strict";
4415__webpack_require__.r(__webpack_exports__);
4416/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../../externalModules.js */ "./externalModules.js");
4417/* harmony import */ var _store_index_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./../../store/index.js */ "./store/index.js");
4418/* harmony import */ var _store_getInteractiveToolsForElement_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./../../store/getInteractiveToolsForElement.js */ "./store/getInteractiveToolsForElement.js");
4419/* harmony import */ var _store_getToolsWithDataForElement_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./../../store/getToolsWithDataForElement.js */ "./store/getToolsWithDataForElement.js");
4420 // State
4421
4422
4423
4424
4425/**
4426 * This is mostly used to update the [un]hover state
4427 * of a tool.
4428 *
4429 * @private
4430 * @param {*} evt
4431 * @returns {void}
4432 */
4433
4434/* harmony default export */ __webpack_exports__["default"] = (function (evt) {
4435  if (_store_index_js__WEBPACK_IMPORTED_MODULE_1__["state"].isToolLocked || _store_index_js__WEBPACK_IMPORTED_MODULE_1__["state"].isMultiPartToolActive) {
4436    return;
4437  }
4438
4439  var tools;
4440  var _evt$detail = evt.detail,
4441      element = _evt$detail.element,
4442      currentPoints = _evt$detail.currentPoints; // Set the mouse position incase any tool needs it.
4443
4444  _store_index_js__WEBPACK_IMPORTED_MODULE_1__["state"].mousePositionImage = currentPoints.image; // TODO: instead of filtering these for every interaction, we can change our
4445  // TODO: State's structure to always know these values.
4446  // Filter out disabled and enabled
4447
4448  tools = Object(_store_getInteractiveToolsForElement_js__WEBPACK_IMPORTED_MODULE_2__["default"])(element, _store_index_js__WEBPACK_IMPORTED_MODULE_1__["getters"].mouseTools());
4449  var activeTools = tools.filter(function (tool) {
4450    return tool.mode === 'active' && tool.options.isMouseActive;
4451  });
4452  var imageNeedsUpdate = false; // If any tools are active, check if they have a canvas cursor, and if so update image.
4453
4454  if (activeTools.length > 0) {
4455    imageNeedsUpdate = activeTools.some(function (tool) {
4456      return tool.updateOnMouseMove;
4457    });
4458  }
4459
4460  tools = Object(_store_getToolsWithDataForElement_js__WEBPACK_IMPORTED_MODULE_3__["default"])(element, tools); // Iterate over each tool, and each tool's data
4461  // Activate any handles we're hovering over, or whole tools if we're near the tool
4462  // If we've changed the state of anything, redrawn the image
4463
4464  for (var t = 0; t < tools.length; t++) {
4465    var tool = tools[t];
4466
4467    if (typeof tool.mouseMoveCallback === 'function') {
4468      imageNeedsUpdate = tool.mouseMoveCallback(evt) || imageNeedsUpdate;
4469    }
4470  } // Tool data activation status changed, redraw the image
4471
4472
4473  if (imageNeedsUpdate === true) {
4474    _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.updateImage(element);
4475  }
4476});
4477
4478/***/ }),
4479
4480/***/ "./eventDispatchers/mouseToolEventDispatcher.js":
4481/*!******************************************************!*\
4482  !*** ./eventDispatchers/mouseToolEventDispatcher.js ***!
4483  \******************************************************/
4484/*! exports provided: default */
4485/***/ (function(module, __webpack_exports__, __webpack_require__) {
4486
4487"use strict";
4488__webpack_require__.r(__webpack_exports__);
4489/* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../events.js */ "./events.js");
4490/* harmony import */ var _mouseEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./mouseEventHandlers/index.js */ "./eventDispatchers/mouseEventHandlers/index.js");
4491
4492
4493/**
4494 * These listeners are emitted in order, and can be cancelled/prevented from bubbling
4495 * by any previous event.
4496 * - mouseMove: used to update the [un]hover state of a tool (highlighting)
4497 * - mouseDown: check to see if we are close to an existing annotation, grab it
4498 * - mouseDownActivate: createNewMeasurement (usually)
4499 * - mouseDrag: update measurement or apply strategy (wwwc)
4500 * - mouseDoubleClick: usually a one-time apply specialty action
4501 * - onImageRendered: redraw visible tool data
4502 * @private
4503 * @param {*} element
4504 * @returns {undefined}
4505 */
4506
4507var enable = function enable(element) {
4508  element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MOUSE_CLICK, _mouseEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__["mouseClick"]);
4509  element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MOUSE_DOWN, _mouseEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__["mouseDown"]);
4510  element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MOUSE_DOWN_ACTIVATE, _mouseEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__["mouseDownActivate"]);
4511  element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MOUSE_DOUBLE_CLICK, _mouseEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__["mouseDoubleClick"]);
4512  element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MOUSE_DRAG, _mouseEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__["mouseDrag"]);
4513  element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MOUSE_MOVE, _mouseEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__["mouseMove"]);
4514  element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MOUSE_UP, _mouseEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__["mouseUp"]);
4515  element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MOUSE_WHEEL, _mouseEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__["mouseWheel"]);
4516};
4517
4518var disable = function disable(element) {
4519  element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MOUSE_CLICK, _mouseEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__["mouseClick"]);
4520  element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MOUSE_DOWN, _mouseEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__["mouseDown"]);
4521  element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MOUSE_DOWN_ACTIVATE, _mouseEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__["mouseDownActivate"]);
4522  element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MOUSE_DOUBLE_CLICK, _mouseEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__["mouseDoubleClick"]);
4523  element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MOUSE_DRAG, _mouseEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__["mouseDrag"]);
4524  element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MOUSE_MOVE, _mouseEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__["mouseMove"]);
4525  element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MOUSE_UP, _mouseEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__["mouseUp"]);
4526  element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MOUSE_WHEEL, _mouseEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__["mouseWheel"]);
4527};
4528
4529/* harmony default export */ __webpack_exports__["default"] = ({
4530  enable: enable,
4531  disable: disable
4532});
4533
4534/***/ }),
4535
4536/***/ "./eventDispatchers/newImageEventDispatcher.js":
4537/*!*****************************************************!*\
4538  !*** ./eventDispatchers/newImageEventDispatcher.js ***!
4539  \*****************************************************/
4540/*! exports provided: default */
4541/***/ (function(module, __webpack_exports__, __webpack_require__) {
4542
4543"use strict";
4544__webpack_require__.r(__webpack_exports__);
4545/* harmony import */ var _store_index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../store/index.js */ "./store/index.js");
4546/* harmony import */ var _tools_base_BaseBrushTool_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./../tools/base/BaseBrushTool.js */ "./tools/base/BaseBrushTool.js");
4547/* harmony import */ var _eventListeners_onNewImageBrushEventHandler_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../eventListeners/onNewImageBrushEventHandler.js */ "./eventListeners/onNewImageBrushEventHandler.js");
4548/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./../externalModules.js */ "./externalModules.js");
4549
4550
4551
4552
4553
4554var onNewImage = function onNewImage(evt) {
4555  if (_store_index_js__WEBPACK_IMPORTED_MODULE_0__["state"].isToolLocked) {
4556    return false;
4557  }
4558
4559  var element = evt.detail.element;
4560  var tools = _store_index_js__WEBPACK_IMPORTED_MODULE_0__["state"].tools.filter(function (tool) {
4561    return tool.element === element && (tool.mode === 'active' || tool.mode === 'passive' || tool.mode === 'enabled');
4562  });
4563
4564  if (tools.length === 0) {
4565    return false;
4566  }
4567
4568  tools.forEach(function (tool) {
4569    if (tool.newImageCallback) {
4570      tool.newImageCallback(evt);
4571    }
4572  }); // Check if any brush tools are present.
4573
4574  var brushTools = tools.filter(function (tool) {
4575    return tool instanceof _tools_base_BaseBrushTool_js__WEBPACK_IMPORTED_MODULE_1__["default"];
4576  });
4577
4578  if (brushTools.length > 0) {
4579    Object(_eventListeners_onNewImageBrushEventHandler_js__WEBPACK_IMPORTED_MODULE_2__["default"])(evt);
4580  }
4581};
4582
4583var enable = function enable(element) {
4584  element.addEventListener(_externalModules_js__WEBPACK_IMPORTED_MODULE_3__["default"].cornerstone.EVENTS.NEW_IMAGE, onNewImage);
4585};
4586
4587var disable = function disable(element) {
4588  element.removeEventListener(_externalModules_js__WEBPACK_IMPORTED_MODULE_3__["default"].cornerstone.EVENTS.NEW_IMAGE, onNewImage);
4589};
4590
4591/* harmony default export */ __webpack_exports__["default"] = ({
4592  enable: enable,
4593  disable: disable
4594});
4595
4596/***/ }),
4597
4598/***/ "./eventDispatchers/shared/customCallbackHandler.js":
4599/*!**********************************************************!*\
4600  !*** ./eventDispatchers/shared/customCallbackHandler.js ***!
4601  \**********************************************************/
4602/*! exports provided: default */
4603/***/ (function(module, __webpack_exports__, __webpack_require__) {
4604
4605"use strict";
4606__webpack_require__.r(__webpack_exports__);
4607/* harmony import */ var _store_index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../../store/index.js */ "./store/index.js");
4608/* harmony import */ var _store_getActiveToolsForElement_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./../../store/getActiveToolsForElement.js */ "./store/getActiveToolsForElement.js");
4609/* harmony import */ var _store_filterToolsUsableWithMultiPartTools_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./../../store/filterToolsUsableWithMultiPartTools.js */ "./store/filterToolsUsableWithMultiPartTools.js");
4610
4611
4612
4613/* harmony default export */ __webpack_exports__["default"] = (function (handlerType, customFunction, evt) {
4614  if (_store_index_js__WEBPACK_IMPORTED_MODULE_0__["state"].isToolLocked) {
4615    return false;
4616  } // TODO: We sometimes see a null detail for TOUCH_PRESS
4617
4618
4619  var element = evt.detail.element;
4620  var tools = _store_index_js__WEBPACK_IMPORTED_MODULE_0__["state"].tools.filter(function (tool) {
4621    return tool.supportedInteractionTypes.includes(handlerType);
4622  }); // Tool is active, and specific callback is active
4623
4624  tools = Object(_store_getActiveToolsForElement_js__WEBPACK_IMPORTED_MODULE_1__["default"])(element, tools, handlerType); // Tool has expected callback custom function
4625
4626  tools = tools.filter(function (tool) {
4627    return typeof tool[customFunction] === 'function';
4628  });
4629
4630  if (_store_index_js__WEBPACK_IMPORTED_MODULE_0__["state"].isMultiPartToolActive) {
4631    tools = Object(_store_filterToolsUsableWithMultiPartTools_js__WEBPACK_IMPORTED_MODULE_2__["default"])(tools);
4632  }
4633
4634  if (tools.length === 0) {
4635    return false;
4636  }
4637
4638  tools[0][customFunction](evt);
4639});
4640
4641/***/ }),
4642
4643/***/ "./eventDispatchers/touchEventHandlers/addNewMeasurement.js":
4644/*!******************************************************************!*\
4645  !*** ./eventDispatchers/touchEventHandlers/addNewMeasurement.js ***!
4646  \******************************************************************/
4647/*! exports provided: default */
4648/***/ (function(module, __webpack_exports__, __webpack_require__) {
4649
4650"use strict";
4651__webpack_require__.r(__webpack_exports__);
4652/* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../events.js */ "./events.js");
4653/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../externalModules.js */ "./externalModules.js");
4654/* harmony import */ var _store_index_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../store/index.js */ "./store/index.js");
4655/* harmony import */ var _manipulators_anyHandlesOutsideImage_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./../../manipulators/anyHandlesOutsideImage.js */ "./manipulators/anyHandlesOutsideImage.js");
4656/* harmony import */ var _manipulators_index_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../manipulators/index.js */ "./manipulators/index.js");
4657/* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../stateManagement/toolState.js */ "./stateManagement/toolState.js");
4658/* harmony import */ var _util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../util/triggerEvent.js */ "./util/triggerEvent.js");
4659/* harmony import */ var _util_logger_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../util/logger.js */ "./util/logger.js");
4660
4661
4662
4663
4664
4665
4666
4667
4668var logger = Object(_util_logger_js__WEBPACK_IMPORTED_MODULE_7__["getLogger"])('eventDispatchers:touchEventHandlers');
4669/* harmony default export */ __webpack_exports__["default"] = (function (evt, tool) {
4670  logger.log('addNewMeasurement');
4671  evt.preventDefault();
4672  evt.stopPropagation();
4673  var touchEventData = evt.detail;
4674  var element = touchEventData.element;
4675  var measurementData = tool.createNewMeasurement(touchEventData);
4676
4677  if (!measurementData) {
4678    return;
4679  }
4680
4681  Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_5__["addToolState"])(element, tool.name, measurementData); // Todo: Looks like we're handling the "up" of the tap?
4682
4683  if (Object.keys(measurementData.handles).length === 1 && touchEventData.type === _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TAP) {
4684    // Todo: bold assumptions about measurement data for all tools?
4685    measurementData.active = false;
4686    measurementData.handles.end.active = false;
4687    measurementData.handles.end.highlight = false;
4688    measurementData.invalidated = true;
4689    var deleteIfHandleOutsideImage = _store_index_js__WEBPACK_IMPORTED_MODULE_2__["state"].deleteIfHandleOutsideImage || tool.options.deleteIfHandleOutsideImage;
4690
4691    if (deleteIfHandleOutsideImage && Object(_manipulators_anyHandlesOutsideImage_js__WEBPACK_IMPORTED_MODULE_3__["default"])(touchEventData, measurementData.handles)) {
4692      // Delete the measurement
4693      Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_5__["removeToolState"])(element, tool.name, measurementData);
4694    }
4695
4696    _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.updateImage(element);
4697    return;
4698  }
4699
4700  _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.updateImage(element);
4701  var options = Object.assign({
4702    doneMovingCallback: function doneMovingCallback() {
4703      var eventType = _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MEASUREMENT_COMPLETED;
4704      var eventData = {
4705        toolName: tool.name,
4706        element: element,
4707        measurementData: measurementData
4708      };
4709      Object(_util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_6__["default"])(element, eventType, eventData);
4710    }
4711  }, tool.options);
4712  Object(_manipulators_index_js__WEBPACK_IMPORTED_MODULE_4__["moveNewHandle"])(touchEventData, tool.name, measurementData, measurementData.handles.end, options, 'touch');
4713});
4714
4715/***/ }),
4716
4717/***/ "./eventDispatchers/touchEventHandlers/index.js":
4718/*!******************************************************!*\
4719  !*** ./eventDispatchers/touchEventHandlers/index.js ***!
4720  \******************************************************/
4721/*! exports provided: doubleTap, multiTouchDrag, tap, touchDrag, touchEnd, touchPinch, touchPress, touchRotate, touchStart, touchStartActive */
4722/***/ (function(module, __webpack_exports__, __webpack_require__) {
4723
4724"use strict";
4725__webpack_require__.r(__webpack_exports__);
4726/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "doubleTap", function() { return doubleTap; });
4727/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "touchDrag", function() { return touchDrag; });
4728/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "touchEnd", function() { return touchEnd; });
4729/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "touchPinch", function() { return touchPinch; });
4730/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "touchPress", function() { return touchPress; });
4731/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "touchRotate", function() { return touchRotate; });
4732/* harmony import */ var _shared_customCallbackHandler_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../shared/customCallbackHandler.js */ "./eventDispatchers/shared/customCallbackHandler.js");
4733/* harmony import */ var _multiTouchDrag_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./multiTouchDrag.js */ "./eventDispatchers/touchEventHandlers/multiTouchDrag.js");
4734/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "multiTouchDrag", function() { return _multiTouchDrag_js__WEBPACK_IMPORTED_MODULE_1__["default"]; });
4735
4736/* harmony import */ var _tap_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tap.js */ "./eventDispatchers/touchEventHandlers/tap.js");
4737/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "tap", function() { return _tap_js__WEBPACK_IMPORTED_MODULE_2__["default"]; });
4738
4739/* harmony import */ var _touchStart_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./touchStart.js */ "./eventDispatchers/touchEventHandlers/touchStart.js");
4740/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "touchStart", function() { return _touchStart_js__WEBPACK_IMPORTED_MODULE_3__["default"]; });
4741
4742/* harmony import */ var _touchStartActive_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./touchStartActive.js */ "./eventDispatchers/touchEventHandlers/touchStartActive.js");
4743/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "touchStartActive", function() { return _touchStartActive_js__WEBPACK_IMPORTED_MODULE_4__["default"]; });
4744
4745
4746
4747
4748
4749
4750var doubleTap = _shared_customCallbackHandler_js__WEBPACK_IMPORTED_MODULE_0__["default"].bind(null, 'DoubleTap', 'doubleTapCallback'); // TODO: some touchDrag tools don't want to fire on touchStart
4751// TODO: Drag tools have an option `fireOnTouchStart` used to filter
4752// TODO: Them out of TOUCH_START handler
4753
4754var touchDrag = _shared_customCallbackHandler_js__WEBPACK_IMPORTED_MODULE_0__["default"].bind(null, 'Touch', 'touchDragCallback');
4755var touchEnd = _shared_customCallbackHandler_js__WEBPACK_IMPORTED_MODULE_0__["default"].bind(null, 'Touch', 'touchEndCallback');
4756var touchPinch = _shared_customCallbackHandler_js__WEBPACK_IMPORTED_MODULE_0__["default"].bind(null, 'TouchPinch', 'touchPinchCallback');
4757var touchPress = _shared_customCallbackHandler_js__WEBPACK_IMPORTED_MODULE_0__["default"].bind(null, 'Touch', 'touchPressCallback');
4758var touchRotate = _shared_customCallbackHandler_js__WEBPACK_IMPORTED_MODULE_0__["default"].bind(null, 'TouchRotate', 'touchRotateCallback');
4759
4760
4761/***/ }),
4762
4763/***/ "./eventDispatchers/touchEventHandlers/multiTouchDrag.js":
4764/*!***************************************************************!*\
4765  !*** ./eventDispatchers/touchEventHandlers/multiTouchDrag.js ***!
4766  \***************************************************************/
4767/*! exports provided: default */
4768/***/ (function(module, __webpack_exports__, __webpack_require__) {
4769
4770"use strict";
4771__webpack_require__.r(__webpack_exports__);
4772/* harmony import */ var _store_index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../store/index.js */ "./store/index.js");
4773/* harmony import */ var _store_getActiveToolsForElement_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../store/getActiveToolsForElement.js */ "./store/getActiveToolsForElement.js");
4774/* harmony import */ var _store_filterToolsUsableWithMultiPartTools_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./../../store/filterToolsUsableWithMultiPartTools.js */ "./store/filterToolsUsableWithMultiPartTools.js");
4775
4776
4777
4778/* harmony default export */ __webpack_exports__["default"] = (function (evt) {
4779  if (_store_index_js__WEBPACK_IMPORTED_MODULE_0__["state"].isToolLocked) {
4780    return false;
4781  } // TODO: We sometimes see a null detail for TOUCH_PRESS
4782
4783
4784  var _evt$detail = evt.detail,
4785      element = _evt$detail.element,
4786      numPointers = _evt$detail.numPointers;
4787  var tools = _store_index_js__WEBPACK_IMPORTED_MODULE_0__["state"].tools.filter(function (tool) {
4788    return tool.supportedInteractionTypes.includes('MultiTouch');
4789  }); // Tool is active, and specific callback is active
4790
4791  tools = Object(_store_getActiveToolsForElement_js__WEBPACK_IMPORTED_MODULE_1__["default"])(element, tools, 'MultiTouch'); // Tool has expected callback custom function
4792
4793  tools = tools.filter(function (tool) {
4794    return typeof tool.multiTouchDragCallback === 'function' && numPointers === tool.configuration.touchPointers;
4795  });
4796
4797  if (_store_index_js__WEBPACK_IMPORTED_MODULE_0__["state"].isMultiPartToolActive) {
4798    tools = Object(_store_filterToolsUsableWithMultiPartTools_js__WEBPACK_IMPORTED_MODULE_2__["default"])(tools);
4799  }
4800
4801  if (tools.length === 0) {
4802    return false;
4803  }
4804
4805  var activeTool = tools[0];
4806  activeTool.multiTouchDragCallback(evt);
4807});
4808
4809/***/ }),
4810
4811/***/ "./eventDispatchers/touchEventHandlers/shared/deactivateAllToolInstances.js":
4812/*!**********************************************************************************!*\
4813  !*** ./eventDispatchers/touchEventHandlers/shared/deactivateAllToolInstances.js ***!
4814  \**********************************************************************************/
4815/*! exports provided: default */
4816/***/ (function(module, __webpack_exports__, __webpack_require__) {
4817
4818"use strict";
4819__webpack_require__.r(__webpack_exports__);
4820/* harmony default export */ __webpack_exports__["default"] = (function (toolData) {
4821  if (!toolData) {
4822    return;
4823  }
4824
4825  for (var i = 0; i < toolData.data.length; i++) {
4826    var data = toolData.data[i];
4827    data.active = false;
4828
4829    if (!data.handles) {
4830      continue;
4831    }
4832
4833    deactivateAllHandles(data.handles);
4834  }
4835});
4836
4837function deactivateAllHandles(handles) {
4838  Object.keys(handles).forEach(function (name) {
4839    var handle = handles[name];
4840    handle.active = false;
4841  });
4842}
4843
4844/***/ }),
4845
4846/***/ "./eventDispatchers/touchEventHandlers/tap.js":
4847/*!****************************************************!*\
4848  !*** ./eventDispatchers/touchEventHandlers/tap.js ***!
4849  \****************************************************/
4850/*! exports provided: default */
4851/***/ (function(module, __webpack_exports__, __webpack_require__) {
4852
4853"use strict";
4854__webpack_require__.r(__webpack_exports__);
4855/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../externalModules.js */ "./externalModules.js");
4856/* harmony import */ var _touchStartActive_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./touchStartActive.js */ "./eventDispatchers/touchEventHandlers/touchStartActive.js");
4857/* harmony import */ var _store_index_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../store/index.js */ "./store/index.js");
4858/* harmony import */ var _store_getActiveToolsForElement_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../store/getActiveToolsForElement.js */ "./store/getActiveToolsForElement.js");
4859/* harmony import */ var _store_getToolsWithDataForElement_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../store/getToolsWithDataForElement.js */ "./store/getToolsWithDataForElement.js");
4860/* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../stateManagement/toolState.js */ "./stateManagement/toolState.js");
4861/* harmony import */ var _manipulators_getHandleNearImagePoint_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../manipulators/getHandleNearImagePoint.js */ "./manipulators/getHandleNearImagePoint.js");
4862/* harmony import */ var _manipulators_index_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../manipulators/index.js */ "./manipulators/index.js");
4863/* harmony import */ var _shared_deactivateAllToolInstances_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./shared/deactivateAllToolInstances.js */ "./eventDispatchers/touchEventHandlers/shared/deactivateAllToolInstances.js");
4864
4865 // State
4866
4867
4868
4869
4870 //
4871
4872
4873 //
4874
4875
4876/* harmony default export */ __webpack_exports__["default"] = (function (evt) {
4877  if (_store_index_js__WEBPACK_IMPORTED_MODULE_2__["state"].isToolLocked || _store_index_js__WEBPACK_IMPORTED_MODULE_2__["state"].isMultiPartToolActive) {
4878    return;
4879  }
4880
4881  var tools;
4882  var distanceFromHandle = 28;
4883  var element = evt.detail.element;
4884  var coords = evt.detail.currentPoints.canvas;
4885  tools = Object(_store_getActiveToolsForElement_js__WEBPACK_IMPORTED_MODULE_3__["default"])(element, _store_index_js__WEBPACK_IMPORTED_MODULE_2__["getters"].touchTools());
4886  tools = Object(_store_getToolsWithDataForElement_js__WEBPACK_IMPORTED_MODULE_4__["default"])(element, tools); // Deactivate everything
4887  // DeactivateAllToolInstances(toolData);
4888  // Find all tools w/ handles that we are near
4889
4890  var toolsWithMoveableHandles = tools.filter(function (tool) {
4891    var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_5__["getToolState"])(element, tool.name);
4892
4893    for (var i = 0; i < toolState.data.length; i++) {
4894      if (Object(_manipulators_getHandleNearImagePoint_js__WEBPACK_IMPORTED_MODULE_6__["default"])(element, toolState.data[i].handles, coords, distanceFromHandle) !== undefined) {
4895        return true;
4896      }
4897    }
4898
4899    return false;
4900  }); // TODO: More than one? Which one was moved most recently?
4901  // We'll just grab the first one we encounter for now
4902
4903  if (toolsWithMoveableHandles.length > 0) {
4904    // Todo: ignore: touch_start, tap
4905    var firstToolWithMoveableHandles = toolsWithMoveableHandles[0];
4906    var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_5__["getToolState"])(element, firstToolWithMoveableHandles.name);
4907    var moveableHandle = toolState.data.find(function (d) {
4908      return Object(_manipulators_getHandleNearImagePoint_js__WEBPACK_IMPORTED_MODULE_6__["default"])(element, d.handles, coords, distanceFromHandle) !== undefined;
4909    });
4910    toolState.data.active = true;
4911    moveableHandle.active = true; // Why here, but not touchStart?
4912
4913    _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.updateImage(element);
4914    var toolOptions = Object.assign({}, {
4915      doneMovingCallback: function doneMovingCallback() {
4916        Object(_shared_deactivateAllToolInstances_js__WEBPACK_IMPORTED_MODULE_8__["default"])(toolState);
4917      }
4918    }, firstToolWithMoveableHandles.options);
4919    Object(_manipulators_index_js__WEBPACK_IMPORTED_MODULE_7__["moveHandle"])(evt.detail, firstToolWithMoveableHandles.name, toolState.data, moveableHandle, toolOptions, 'touch');
4920    evt.stopImmediatePropagation();
4921    evt.preventDefault(); // Why no stopPropagation?
4922
4923    return;
4924  } // Find all tools near our point
4925
4926
4927  var toolsNearPoint = tools.filter(function (tool) {
4928    var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_5__["getToolState"])(element, tool.name);
4929    var isNearPoint = toolState && toolState.data && tool.pointNearTool && toolState.data.some(function (data) {
4930      return tool.pointNearTool(element, data, coords);
4931    });
4932    return isNearPoint;
4933  }); // TODO: More than one? Which one was moved most recently?
4934  // We'll just grab the first one we encounter for now
4935
4936  if (toolsNearPoint.length > 0) {
4937    // Todo: Ignore: TAP, START, PRESS
4938    var firstToolNearPoint = toolsNearPoint[0];
4939
4940    var _toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_5__["getToolState"])(element, firstToolNearPoint.name);
4941
4942    var firstAnnotationNearPoint = _toolState.data.find(function (data) {
4943      return firstToolNearPoint.pointNearTool(element, data, coords);
4944    }); // Todo: ignore: touch_start, tap
4945
4946
4947    firstAnnotationNearPoint.active = true;
4948    _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.updateImage(element);
4949
4950    var _toolOptions = Object.assign({}, {
4951      doneMovingCallback: function doneMovingCallback() {
4952        Object(_shared_deactivateAllToolInstances_js__WEBPACK_IMPORTED_MODULE_8__["default"])(_toolState);
4953      }
4954    }, firstToolNearPoint.options);
4955
4956    Object(_manipulators_index_js__WEBPACK_IMPORTED_MODULE_7__["moveAllHandles"])(evt.detail, firstToolNearPoint.name, firstAnnotationNearPoint, null, _toolOptions, 'touch');
4957    evt.stopImmediatePropagation();
4958    evt.preventDefault(); // TODO: Why no stop propagation?
4959
4960    return;
4961  } // If there is nothing to move, add a new instance of the tool
4962  // Need to check here to see if activation is allowed!
4963  // TODO: What would this be? First active tool?
4964  // Or should _always_ pass through to our larger event handler that checks
4965  // All tools anyway?
4966
4967
4968  var allActiveTools = Object(_store_getActiveToolsForElement_js__WEBPACK_IMPORTED_MODULE_3__["default"])(element, _store_index_js__WEBPACK_IMPORTED_MODULE_2__["getters"].touchTools());
4969
4970  if (allActiveTools.length > 0 && allActiveTools[0].touchStartActiveCallback) {
4971    allActiveTools[0].touchStartActiveCallback(evt);
4972  } else {
4973    Object(_touchStartActive_js__WEBPACK_IMPORTED_MODULE_1__["default"])(evt);
4974  }
4975
4976  return false;
4977});
4978
4979/***/ }),
4980
4981/***/ "./eventDispatchers/touchEventHandlers/touchStart.js":
4982/*!***********************************************************!*\
4983  !*** ./eventDispatchers/touchEventHandlers/touchStart.js ***!
4984  \***********************************************************/
4985/*! exports provided: default */
4986/***/ (function(module, __webpack_exports__, __webpack_require__) {
4987
4988"use strict";
4989__webpack_require__.r(__webpack_exports__);
4990/* harmony import */ var _store_index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../store/index.js */ "./store/index.js");
4991/* harmony import */ var _util_findAndMoveHelpers_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../util/findAndMoveHelpers.js */ "./util/findAndMoveHelpers.js");
4992/* harmony import */ var _store_getToolsWithMoveableHandles_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../store/getToolsWithMoveableHandles.js */ "./store/getToolsWithMoveableHandles.js");
4993/* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./../../stateManagement/toolState.js */ "./stateManagement/toolState.js");
4994/* harmony import */ var _store_getInteractiveToolsForElement_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./../../store/getInteractiveToolsForElement.js */ "./store/getInteractiveToolsForElement.js");
4995/* harmony import */ var _store_getToolsWithDataForElement_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./../../store/getToolsWithDataForElement.js */ "./store/getToolsWithDataForElement.js");
4996/* harmony import */ var _store_filterToolsUsableWithMultiPartTools_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./../../store/filterToolsUsableWithMultiPartTools.js */ "./store/filterToolsUsableWithMultiPartTools.js");
4997// State
4998
4999
5000
5001
5002
5003
5004
5005/* harmony default export */ __webpack_exports__["default"] = (function (evt) {
5006  if (_store_index_js__WEBPACK_IMPORTED_MODULE_0__["state"].isToolLocked) {
5007    return;
5008  }
5009
5010  var eventData = evt.detail;
5011  var element = eventData.element;
5012  var coords = eventData.startPoints.canvas;
5013  var activeAndPassiveTools = Object(_store_getInteractiveToolsForElement_js__WEBPACK_IMPORTED_MODULE_4__["default"])(element, _store_index_js__WEBPACK_IMPORTED_MODULE_0__["getters"].touchTools());
5014  var activeTools = activeAndPassiveTools.filter(function (tool) {
5015    return tool.mode === 'active' && tool.options.isTouchActive;
5016  });
5017
5018  if (_store_index_js__WEBPACK_IMPORTED_MODULE_0__["state"].isMultiPartToolActive) {
5019    activeTools = Object(_store_filterToolsUsableWithMultiPartTools_js__WEBPACK_IMPORTED_MODULE_6__["default"])(activeTools);
5020  } // If any tools are active, check if they have a special reason for dealing with the event.
5021
5022
5023  if (activeTools.length > 0) {
5024    // TODO: If length > 1, you could assess fitness and select the ideal tool
5025    // TODO: But because we're locking this to 'active' tools, that should rarely be an issue
5026    // Super-Meta-TODO: ^ I think we should just take the approach of one active tool per mou
5026se button?
5027    var firstActiveToolWithCallback = activeTools.find(function (tool) {
5028      return typeof tool.preTouchStartCallback === 'function';
5029    });
5030
5031    if (firstActiveToolWithCallback) {
5032      var consumedEvent = firstActiveToolWithCallback.preTouchStartCallback(evt);
5033
5034      if (consumedEvent) {
5035        return;
5036      }
5037    }
5038  }
5039
5040  if (_store_index_js__WEBPACK_IMPORTED_MODULE_0__["state"].isMultiPartToolActive) {
5041    return;
5042  }
5043
5044  var annotationTools = Object(_store_getToolsWithDataForElement_js__WEBPACK_IMPORTED_MODULE_5__["default"])(element, activeAndPassiveTools); // NEAR HANDLES?
5045
5046  var annotationToolsWithMoveableHandles = Object(_store_getToolsWithMoveableHandles_js__WEBPACK_IMPORTED_MODULE_2__["default"])(element, annotationTools, coords, 'touch'); // TODO: More than one? Which one was moved most recently?
5047  // We'll just grab the first one we encounter for now
5048
5049  if (annotationToolsWithMoveableHandles.length > 0) {
5050    // Todo: Ignore TAP, START, PRESS
5051    var firstToolWithMoveableHandles = annotationToolsWithMoveableHandles[0];
5052    var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_3__["getToolState"])(element, firstToolWithMoveableHandles.name);
5053
5054    var _findHandleDataNearIm = Object(_util_findAndMoveHelpers_js__WEBPACK_IMPORTED_MODULE_1__["findHandleDataNearImagePoint"])(element, toolState, firstToolWithMoveableHandles.name, coords, 'touch'),
5055        handle = _findHandleDataNearIm.handle,
5056        data = _findHandleDataNearIm.data;
5057
5058    firstToolWithMoveableHandles.handleSelectedCallback(evt, data, handle, 'touch');
5059    return;
5060  } // NEAR POINT?
5061
5062
5063  var annotationToolsWithPointNearTouch = annotationTools.filter(function (tool) {
5064    var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_3__["getToolState"])(element, tool.name);
5065    var isNearPoint = toolState && toolState.data && tool.pointNearTool && toolState.data.some(function (data) {
5066      return tool.pointNearTool(element, data, coords, 'touch');
5067    });
5068    return isNearPoint;
5069  }); // TODO: More than one? Which one was moved most recently?
5070  // We'll just grab the first one we encounter for now
5071
5072  if (annotationToolsWithPointNearTouch.length > 0) {
5073    // Todo: Ignore: TAP, START, PRESS
5074    var firstToolNearPoint = annotationToolsWithPointNearTouch[0];
5075
5076    var _toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_3__["getToolState"])(element, firstToolNearPoint.name);
5077
5078    var firstAnnotationNearPoint = _toolState.data.find(function (data) {
5079      return firstToolNearPoint.pointNearTool(element, data, coords);
5080    });
5081
5082    firstToolNearPoint.toolSelectedCallback(evt, firstAnnotationNearPoint, 'touch');
5083    return;
5084  } // If any tools are active, check if they have a special reason for dealing with the event.
5085
5086
5087  if (activeTools.length > 0) {
5088    // TODO: If length > 1, you could assess fitness and select the ideal tool
5089    // TODO: But because we're locking this to 'active' tools, that should rarely be an issue
5090    // Super-Meta-TODO: ^ I think we should just take the approach of one active tool per mou
5090se button?
5091    var _firstActiveToolWithCallback = activeTools.find(function (tool) {
5092      return typeof tool.postTouchStartCallback === 'function';
5093    });
5094
5095    if (_firstActiveToolWithCallback) {
5096      var _consumedEvent = _firstActiveToolWithCallback.postTouchStartCallback(evt);
5097
5098      if (_consumedEvent) {
5099        return;
5100      }
5101    }
5102  }
5103});
5104
5105/***/ }),
5106
5107/***/ "./eventDispatchers/touchEventHandlers/touchStartActive.js":
5108/*!*****************************************************************!*\
5109  !*** ./eventDispatchers/touchEventHandlers/touchStartActive.js ***!
5110  \*****************************************************************/
5111/*! exports provided: default */
5112/***/ (function(module, __webpack_exports__, __webpack_require__) {
5113
5114"use strict";
5115__webpack_require__.r(__webpack_exports__);
5116/* harmony import */ var _store_index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../../store/index.js */ "./store/index.js");
5117/* harmony import */ var _addNewMeasurement_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./addNewMeasurement.js */ "./eventDispatchers/touchEventHandlers/addNewMeasurement.js");
5118/* harmony import */ var _tools_base_BaseAnnotationTool_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./../../tools/base/BaseAnnotationTool.js */ "./tools/base/BaseAnnotationTool.js");
5119/* harmony import */ var _util_getActiveTool__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../util/getActiveTool */ "./util/getActiveTool.js");
5120// State
5121
5122
5123
5124
5125/* harmony default export */ __webpack_exports__["default"] = (function (evt) {
5126  if (_store_index_js__WEBPACK_IMPORTED_MODULE_0__["state"].isToolLocked || _store_index_js__WEBPACK_IMPORTED_MODULE_0__["state"].isMultiPartToolActive) {
5127    return;
5128  }
5129
5130  var element = evt.detail.element;
5131  var activeTool = Object(_util_getActiveTool__WEBPACK_IMPORTED_MODULE_3__["default"])(element, null, 'touch'); // Note: custom `addNewMeasurement` will need to prevent event bubbling
5132
5133  if (activeTool && activeTool.addNewMeasurement) {
5134    activeTool.addNewMeasurement(evt, 'touch');
5135  } else if (activeTool instanceof _tools_base_BaseAnnotationTool_js__WEBPACK_IMPORTED_MODULE_2__["default"]) {
5136    Object(_addNewMeasurement_js__WEBPACK_IMPORTED_MODULE_1__["default"])(evt, activeTool);
5137  }
5138});
5139
5140/***/ }),
5141
5142/***/ "./eventDispatchers/touchToolEventDispatcher.js":
5143/*!******************************************************!*\
5144  !*** ./eventDispatchers/touchToolEventDispatcher.js ***!
5145  \******************************************************/
5146/*! exports provided: default */
5147/***/ (function(module, __webpack_exports__, __webpack_require__) {
5148
5149"use strict";
5150__webpack_require__.r(__webpack_exports__);
5151/* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../events.js */ "./events.js");
5152/* harmony import */ var _touchEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./touchEventHandlers/index.js */ "./eventDispatchers/touchEventHandlers/index.js");
5153
5154
5155/**
5156 * These listeners are emitted in order, and can be cancelled/prevented from bubbling
5157 * by any previous event.
5158 * - tap:
5159 * - touchStart: check to see if we are close to an existing annotation, grab it
5160 * - touchDrag:
5161 * - touchStartActive: createNewMeasurement (usually)
5162 * - touchPress:
5163 * - touchRotate:
5164 * - doubleTap: usually a one-time apply specialty action
5165 * - touchPinch:
5166 * - onImageRendered: redraw visible tool data
5167 * @private
5168 * @param {*} element
5169 * @returns {void}
5170 */
5171
5172var enable = function enable(element) {
5173  element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TAP, _touchEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__["tap"]);
5174  element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_START, _touchEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__["touchStart"], {
5175    passive: false
5176  });
5177  element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_DRAG, _touchEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__["touchDrag"], {
5178    passive: false
5179  });
5180  element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_END, _touchEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__["touchEnd"]); // Mouse equivelant is `mouse_down_activate`
5181  // Should the naming pattern here match?
5182
5183  element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_START_ACTIVE, _touchEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__["touchStartActive"]);
5184  element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_PRESS, _touchEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__["touchPress"]);
5185  element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].DOUBLE_TAP, _touchEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__["doubleTap"]);
5186  element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_PINCH, _touchEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__["touchPinch"]);
5187  element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_ROTATE, _touchEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__["touchRotate"]);
5188  element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MULTI_TOUCH_DRAG, _touchEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__["multiTouchDrag"]);
5189};
5190
5191var disable = function disable(element) {
5192  element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TAP, _touchEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__["tap"]);
5193  element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_START, _touchEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__["touchStart"]);
5194  element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_DRAG, _touchEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__["touchDrag"]);
5195  element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_END, _touchEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__["touchEnd"]); // Mouse equivelant is `mouse_down_activate`
5196  // Should the naming pattern here match?
5197
5198  element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_START_ACTIVE, _touchEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__["touchStartActive"]);
5199  element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_PRESS, _touchEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__["touchPress"]);
5200  element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].DOUBLE_TAP, _touchEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__["doubleTap"]);
5201  element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_PINCH, _touchEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__["touchPinch"]);
5202  element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_ROTATE, _touchEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__["touchRotate"]);
5203  element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MULTI_TOUCH_DRAG, _touchEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__["multiTouchDrag"]);
5204};
5205
5206/* harmony default export */ __webpack_exports__["default"] = ({
5207  enable: enable,
5208  disable: disable
5209});
5210
5211/***/ }),
5212
5213/***/ "./eventListeners/index.js":
5214/*!*********************************!*\
5215  !*** ./eventListeners/index.js ***!
5216  \*********************************/
5217/*! exports provided: mouseEventListeners, wheelEventListener, touchEventListeners */
5218/***/ (function(module, __webpack_exports__, __webpack_require__) {
5219
5220"use strict";
5221__webpack_require__.r(__webpack_exports__);
5222/* harmony import */ var _mouseEventListeners_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./mouseEventListeners.js */ "./eventListeners/mouseEventListeners.js");
5223/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "mouseEventListeners", function() { return _mouseEventListeners_js__WEBPACK_IMPORTED_MODULE_0__["default"]; });
5224
5225/* harmony import */ var _wheelEventListener_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./wheelEventListener.js */ "./eventListeners/wheelEventListener.js");
5226/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "wheelEventListener", function() { return _wheelEventListener_js__WEBPACK_IMPORTED_MODULE_1__["default"]; });
5227
5228/* harmony import */ var _touchEventListeners_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./touchEventListeners.js */ "./eventListeners/touchEventListeners.js");
5229/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "touchEventListeners", function() { return _touchEventListeners_js__WEBPACK_IMPORTED_MODULE_2__["default"]; });
5230
5231
5232
5233
5234
5235
5236/***/ }),
5237
vendor: 1,908 bytes, lines 5238-5324
5238/***/ "./eventListeners/internals/normalizeWheel.js":
5239/*!****************************************************!*\
5240  !*** ./eventListeners/internals/normalizeWheel.js ***!
5241  \****************************************************/
5242/*! exports provided: default */
5243/***/ (function(module, __webpack_exports__, __webpack_require__) {
5244
5245"use strict";
5246__webpack_require__.r(__webpack_exports__);
5247// Reasonable defaults
5248var PIXEL_STEP = 10;
5249var LINE_HEIGHT = 40;
5250var PAGE_HEIGHT = 800;
5251/**
5252 * Normalizes wheel events and provides properties that are more
5253 * consistent and helpful across different browsers
5254 *
5255 * @private
5256 * @function normalizeWheel
5257 * @param {WheelEvent} event
5258 * @returns {Object} { spinX, spinY, pixlX, pixelY }
5259 */
5260
5261/* harmony default export */ __webpack_exports__["default"] = (function (event) {
5262  var spinX = 0,
5263      spinY = 0,
5264      pixelX = 0,
5265      pixelY = 0; // Legacy
5266
5267  if ('detail' in event) {
5268    spinY = event.detail;
5269  }
5270
5271  if ('wheelDelta' in event) {
5272    spinY = -event.wheelDelta / 120;
5273  }
5274
5275  if ('wheelDeltaY' in event) {
5276    spinY = -event.wheelDeltaY / 120;
5277  }
5278
5279  if ('wheelDeltaX' in event) {
5280    spinX = -event.wheelDeltaX / 120;
5281  }
5282
5283  pixelX = spinX * PIXEL_STEP;
5284  pixelY = spinY * PIXEL_STEP;
5285
5286  if ('deltaY' in event) {
5287    pixelY = event.deltaY;
5288  }
5289
5290  if ('deltaX' in event) {
5291    pixelX = event.deltaX;
5292  }
5293
5294  if ((pixelX || pixelY) && event.deltaMode) {
5295    if (event.deltaMode === 1) {
5296      // Delta in LINE units
5297      pixelX *= LINE_HEIGHT;
5298      pixelY *= LINE_HEIGHT;
5299    } else {
5300      // Delta in PAGE units
5301      pixelX *= PAGE_HEIGHT;
5302      pixelY *= PAGE_HEIGHT;
5303    }
5304  } // Fall-back if spin cannot be determined
5305
5306
5307  if (pixelX && !spinX) {
5308    spinX = pixelX < 1 ? -1 : 1;
5309  }
5310
5311  if (pixelY && !spinY) {
5312    spinY = pixelY < 1 ? -1 : 1;
5313  }
5314
5315  return {
5316    spinX: spinX,
5317    spinY: spinY,
5318    pixelX: pixelX,
5319    pixelY: pixelY
5320  };
5321});
5322
5323/***/ }),
5324
5325/***/ "./eventListeners/mouseEventListeners.js":
5326/*!***********************************************!*\
5327  !*** ./eventListeners/mouseEventListeners.js ***!
5328  \***********************************************/
5329/*! exports provided: default */
5330/***/ (function(module, __webpack_exports__, __webpack_require__) {
5331
5332"use strict";
5333__webpack_require__.r(__webpack_exports__);
5334/* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../events.js */ "./events.js");
5335/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js");
5336/* harmony import */ var _util_copyPoints_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../util/copyPoints.js */ "./util/copyPoints.js");
5337/* harmony import */ var _util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../util/triggerEvent.js */ "./util/triggerEvent.js");
5338/* harmony import */ var _util_logger_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../util/logger.js */ "./util/logger.js");
5339
5340
5341
5342
5343
5344var logger = Object(_util_logger_js__WEBPACK_IMPORTED_MODULE_4__["getLogger"])('eventListeners:mouseEventListeners');
5345var isClickEvent = true;
5346var preventClickTimeout;
5347var clickDelay = 200;
5348
5349function getEventButtons(event) {
5350  if (typeof event.buttons === 'number') {
5351    return event.buttons;
5352  }
5353
5354  switch (event.which) {
5355    // No button
5356    case 0:
5357      return 0;
5358    // Left
5359
5360    case 1:
5361      return 1;
5362    // Middle
5363
5364    case 2:
5365      return 4;
5366    // Right
5367
5368    case 3:
5369      return 2;
5370  }
5371
5372  return 0;
5373}
5374
5375function preventClickHandler() {
5376  isClickEvent = false;
5377}
5378
5379function mouseDoubleClick(e) {
5380  var element = e.currentTarget;
5381  var enabledElement = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.getEnabledElement(element);
5382
5383  if (!enabledElement.image) {
5384    return;
5385  }
5386
5387  var eventType = _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MOUSE_DOUBLE_CLICK;
5388  var startPoints = {
5389    page: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstoneMath.point.pageToPoint(e),
5390    image: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pageToPixel(element, e.pageX, e.pageY),
5391    client: {
5392      x: e.clientX,
5393      y: e.clientY
5394    }
5395  };
5396  startPoints.canvas = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pixelToCanvas(element, startPoints.image);
5397  var lastPoints = Object(_util_copyPoints_js__WEBPACK_IMPORTED_MODULE_2__["default"])(startPoints);
5398  logger.log('double-click: %o', getEventButtons(e));
5399  var eventData = {
5400    event: e,
5401    buttons: getEventButtons(e),
5402    viewport: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.getViewport(element),
5403    image: enabledElement.image,
5404    element: element,
5405    startPoints: startPoints,
5406    lastPoints: lastPoints,
5407    currentPoints: startPoints,
5408    deltaPoints: {
5409      x: 0,
5410      y: 0
5411    },
5412    type: eventType
5413  };
5414  Object(_util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_3__["default"])(element, eventType, eventData);
5415}
5416
5417function mouseDown(e) {
5418  var element = e.currentTarget;
5419  var enabledElement = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.getEnabledElement(element);
5420
5421  if (!enabledElement.image) {
5422    return;
5423  }
5424
5425  preventClickTimeout = setTimeout(preventClickHandler, clickDelay); // Prevent CornerstoneToolsMouseMove while mouse is down
5426
5427  element.removeEventListener('mousemove', mouseMove);
5428  var startPoints = {
5429    page: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstoneMath.point.pageToPoint(e),
5430    image: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pageToPixel(element, e.pageX, e.pageY),
5431    client: {
5432      x: e.clientX,
5433      y: e.clientY
5434    }
5435  };
5436  startPoints.canvas = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pixelToCanvas(element, startPoints.image);
5437  var lastPoints = Object(_util_copyPoints_js__WEBPACK_IMPORTED_MODULE_2__["default"])(startPoints);
5438  var eventData = {
5439    event: e,
5440    buttons: getEventButtons(e),
5441    viewport: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.getViewport(element),
5442    image: enabledElement.image,
5443    element: element,
5444    startPoints: startPoints,
5445    lastPoints: lastPoints,
5446    currentPoints: startPoints,
5447    deltaPoints: {
5448      x: 0,
5449      y: 0
5450    },
5451    type: _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MOUSE_DOWN
5452  };
5453  var eventPropagated = Object(_util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_3__["default"])(eventData.element, _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MOUSE_DOWN, eventData);
5454
5455  if (eventPropagated) {
5456    // No tools responded to this event, create a new tool
5457    eventData.type = _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MOUSE_DOWN_ACTIVATE;
5458    Object(_util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_3__["default"])(eventData.element, _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MOUSE_DOWN_ACTIVATE, eventData);
5459  }
5460
5461  function onMouseMove(e) {
5462    // Calculate our current points in page and image coordinates
5463    var eventType = _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MOUSE_DRAG;
5464    var currentPoints = {
5465      page: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstoneMath.point.pageToPoint(e),
5466      image: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pageToPixel(element, e.pageX, e.pageY),
5467      client: {
5468        x: e.clientX,
5469        y: e.clientY
5470      }
5471    };
5472    currentPoints.canvas = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pixelToCanvas(element, currentPoints.image); // Calculate delta values in page and image coordinates
5473
5474    var deltaPoints = {
5475      page: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstoneMath.point.subtract(currentPoints.page, lastPoints.page),
5476      image: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstoneMath.point.subtract(currentPoints.image, lastPoints.image),
5477      client: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstoneMath.point.subtract(currentPoints.client, lastPoints.client),
5478      canvas: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstoneMath.point.subtract(currentPoints.canvas, lastPoints.canvas)
5479    };
5480    logger.log('mousemove: %o', getEventButtons(e));
5481    var eventData = {
5482      buttons: getEventButtons(e),
5483      viewport: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.getViewport(element),
5484      image: enabledElement.image,
5485      element: element,
5486      startPoints: startPoints,
5487      lastPoints: lastPoints,
5488      currentPoints: currentPoints,
5489      deltaPoints: deltaPoints,
5490      type: eventType,
5491      ctrlKey: e.ctrlKey,
5492      metaKey: e.metaKey,
5493      shiftKey: e.shiftKey
5494    };
5495    Object(_util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_3__["default"])(eventData.element, eventType, eventData); // Update the last points
5496
5497    lastPoints = Object(_util_copyPoints_js__WEBPACK_IMPORTED_MODULE_2__["default"])(currentPoints);
5498  } // Hook mouseup so we can unbind our event listeners
5499  // When they stop dragging
5500
5501
5502  function onMouseUp(e) {
5503    // Cancel the timeout preventing the click event from triggering
5504    clearTimeout(preventClickTimeout);
5505    var eventType = _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MOUSE_UP;
5506
5507    if (isClickEvent) {
5508      eventType = _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MOUSE_CLICK;
5509    } // Calculate our current points in page and image coordinates
5510
5511
5512    var currentPoints = {
5513      page: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstoneMath.point.pageToPoint(e),
5514      image: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pageToPixel(element, e.pageX, e.pageY),
5515      client: {
5516        x: e.clientX,
5517        y: e.clientY
5518      }
5519    };
5520    currentPoints.canvas = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pixelToCanvas(element, currentPoints.image); // Calculate delta values in page and image coordinates
5521
5522    var deltaPoints = {
5523      page: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstoneMath.point.subtract(currentPoints.page, lastPoints.page),
5524      image: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstoneMath.point.subtract(currentPoints.image, lastPoints.image),
5525      client: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstoneMath.point.subtract(currentPoints.client, lastPoints.client),
5526      canvas: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstoneMath.point.subtract(currentPoints.canvas, lastPoints.canvas)
5527    };
5528    logger.log('mouseup: %o', getEventButtons(e));
5529    var eventData = {
5530      event: e,
5531      buttons: getEventButtons(e),
5532      viewport: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.getViewport(element),
5533      image: enabledElement.image,
5534      element: element,
5535      startPoints: startPoints,
5536      lastPoints: lastPoints,
5537      currentPoints: currentPoints,
5538      deltaPoints: deltaPoints,
5539      type: eventType
5540    };
5541    Object(_util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_3__["default"])(eventData.element, eventType, eventData);
5542    document.removeEventListener('mousemove', onMouseMove);
5543    document.removeEventListener('mouseup', onMouseUp);
5544    element.addEventListener('mousemove', mouseMove);
5545    isClickEvent = true;
5546  }
5547
5548  document.addEventListener('mousemove', onMouseMove);
5549  document.addEventListener('mouseup', onMouseUp);
5550}
5551
5552function mouseMove(e) {
5553  var element = e.currentTarget;
5554  var enabledElement = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.getEnabledElement(element);
5555
5556  if (!enabledElement.image) {
5557    return;
5558  }
5559
5560  var eventType = _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MOUSE_MOVE;
5561  var startPoints = {
5562    page: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstoneMath.point.pageToPoint(e),
5563    image: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pageToPixel(element, e.pageX, e.pageY),
5564    client: {
5565      x: e.clientX,
5566      y: e.clientY
5567    }
5568  };
5569  startPoints.canvas = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pixelToCanvas(element, startPoints.image);
5570  var lastPoints = Object(_util_copyPoints_js__WEBPACK_IMPORTED_MODULE_2__["default"])(startPoints); // Calculate our current points in page and image coordinates
5571
5572  var currentPoints = {
5573    page: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstoneMath.point.pageToPoint(e),
5574    image: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pageToPixel(element, e.pageX, e.pageY),
5575    client: {
5576      x: e.clientX,
5577      y: e.clientY
5578    }
5579  };
5580  currentPoints.canvas = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pixelToCanvas(element, currentPoints.image); // Calculate delta values in page and image coordinates
5581
5582  var deltaPoints = {
5583    page: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstoneMath.point.subtract(currentPoints.page, lastPoints.page),
5584    image: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstoneMath.point.subtract(currentPoints.image, lastPoints.image),
5585    client: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstoneMath.point.subtract(currentPoints.client, lastPoints.client),
5586    canvas: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstoneMath.point.subtract(currentPoints.canvas, lastPoints.canvas)
5587  };
5588  var eventData = {
5589    viewport: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.getViewport(element),
5590    image: enabledElement.image,
5591    element: element,
5592    startPoints: startPoints,
5593    lastPoints: lastPoints,
5594    currentPoints: currentPoints,
5595    deltaPoints: deltaPoints,
5596    type: eventType
5597  };
5598  Object(_util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_3__["default"])(element, eventType, eventData); // Update the last points
5599
5600  lastPoints = Object(_util_copyPoints_js__WEBPACK_IMPORTED_MODULE_2__["default"])(currentPoints);
5601}
5602
5603function disable(element) {
5604  element.removeEventListener('mousedown', mouseDown);
5605  element.removeEventListener('mousemove', mouseMove);
5606  element.removeEventListener('dblclick', mouseDoubleClick);
5607}
5608
5609function enable(element) {
5610  // Prevent handlers from being attached multiple times
5611  disable(element);
5612  element.addEventListener('mousedown', mouseDown);
5613  element.addEventListener('mousemove', mouseMove);
5614  element.addEventListener('dblclick', mouseDoubleClick);
5615}
5616
5617/* harmony default export */ __webpack_exports__["default"] = ({
5618  enable: enable,
5619  disable: disable
5620});
5621
5622/***/ }),
5623
5624/***/ "./eventListeners/onImageRenderedBrushEventHandler.js":
5625/*!************************************************************!*\
5626  !*** ./eventListeners/onImageRenderedBrushEventHandler.js ***!
5627  \************************************************************/
5628/*! exports provided: default */
5629/***/ (function(module, __webpack_exports__, __webpack_require__) {
5630
5631"use strict";
5632__webpack_require__.r(__webpack_exports__);
5633/* harmony import */ var _drawing_index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../drawing/index.js */ "./drawing/index.js");
5634/* harmony import */ var _tools_base_BaseBrushTool_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./../tools/base/BaseBrushTool.js */ "./tools/base/BaseBrushTool.js");
5635/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js");
5636/* harmony import */ var _store_getActiveToolsForElement_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../store/getActiveToolsForElement.js */ "./store/getActiveToolsForElement.js");
5637/* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../stateManagement/toolState.js */ "./stateManagement/toolState.js");
5638/* harmony import */ var _store_index_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../store/index.js */ "./store/index.js");
5639
5640
5641
5642
5643
5644
5645/* Safari and Edge polyfill for createImageBitmap
5646 * https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/createImageBitmap
5647 */
5648// TODO: Do we still need this? I've yanked the package for now
5649// It should be covered by @babel/runtime and plugin-transform-runtime:
5650// https://babeljs.io/docs/en/babel-plugin-transform-runtime
5651// @James, I think Babel should take care of this for us
5652// Import regeneratorRuntime from "regenerator-runtime";
5653
5654if (!('createImageBitmap' in window)) {
5655  window.createImageBitmap = function (imageData) {
5656    return new Promise(function (resolve) {
5657      var img = document.createElement('img');
5658      img.addEventListener('load', function () {
5659        resolve(this);
5660      });
5661      var conversionCanvas = document.createElement('canvas');
5662      conversionCanvas.width = imageData.width;
5663      conversionCanvas.height = imageData.height;
5664      var conversionCanvasContext = conversionCanvas.getContext('2d');
5665      conversionCanvasContext.putImageData(imageData, 0, 0, 0, 0, conversionCanvas.width, conversionCanvas.height);
5666      img.src = conversionCanvas.toDataURL();
5667    });
5668  };
5669}
5670
5671var _store$modules$brush = _store_index_js__WEBPACK_IMPORTED_MODULE_5__["default"].modules.brush,
5672    state = _store$modules$brush.state,
5673    getters = _store$modules$brush.getters,
5674    setters = _store$modules$brush.setters;
5675/**
5676 * Used to redraw the brush label map data per render.
5677 *
5678 * @private
5679 * @param {Object} evt - The event.
5680 * @returns {void}
5681 */
5682
5683/* harmony default export */ __webpack_exports__["default"] = (function (evt) {
5684  var eventData = evt.detail;
5685  var element = eventData.element;
5686  var maxSegmentations = _tools_base_BaseBrushTool_js__WEBPACK_IMPORTED_MODULE_1__["default"].getNumberOfColors();
5687  var toolData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_4__["getToolState"])(element, _tools_base_BaseBrushTool_js__WEBPACK_IMPORTED_MODULE_1__["default"].getReferencedToolDataName());
5688
5689  if (!toolData) {
5690    return;
5691  }
5692
5693  var enabledElement = _externalModules_js__WEBPACK_IMPORTED_MODULE_2__["default"].cornerstone.getEnabledElement(element);
5694  var enabledElementUID = enabledElement.uuid;
5695  var segData = {
5696    visibleSegmentations: getters.visibleSegmentationsForElement(enabledElementUID),
5697    imageBitmapCache: getters.imageBitmapCacheForElement(enabledElementUID),
5698    toolData: toolData
5699  };
5700
5701  for (var segIndex = 0; segIndex < maxSegmentations; segIndex++) {
5702    if (shouldRenderSegmentation(evt, segIndex, segData)) {
5703      renderSegmentation(evt, segIndex, segData);
5704    }
5705  }
5706});
5707
5708function shouldRenderSegmentation(evt, segIndex, segData) {
5709  var element = evt.detail.element;
5710  var toolData = segData.toolData;
5711  var visibleSegmentations = segData.visibleSegmentations;
5712
5713  if (!toolData.data[segIndex] || !toolData.data[segIndex].pixelData) {
5714    // No data, no render.
5715    return false;
5716  }
5717
5718  if (visibleSegmentations[segIndex]) {
5719    // Has data and marked as visible, render!
5720    return true;
5721  }
5722
5723  var currentColor = state.drawColorId;
5724
5725  if (currentColor !== segIndex) {
5726    // Hidden and not current color, don't render.
5727    return false;
5728  } // Check that a brush tool is active.
5729
5730
5731  var activeTools = Object(_store_getActiveToolsForElement_js__WEBPACK_IMPORTED_MODULE_3__["default"])(element, _store_index_js__WEBPACK_IMPORTED_MODULE_5__["default"].state.tools);
5732  var brushTools = activeTools.filter(function (tool) {
5733    return tool instanceof _tools_base_BaseBrushTool_js__WEBPACK_IMPORTED_MODULE_1__["default"];
5734  });
5735
5736  if (brushTools.length > 0) {
5737    // Active brush tool with same color, render!
5738    return true;
5739  }
5740
5741  return false;
5742}
5743
5744function renderSegmentation(evt, segIndex, segData) {
5745  var toolData = segData.toolData;
5746  var imageBitmapCache = segData.imageBitmapCache;
5747  var visibleSegmentations = segData.visibleSegmentations; // Draw previous image if cached.
5748
5749  if (imageBitmapCache && imageBitmapCache[segIndex]) {
5750    _drawImageBitmap(evt, imageBitmapCache[segIndex], visibleSegmentations[segIndex]);
5751  }
5752
5753  if (toolData.data[segIndex].invalidated) {
5754    createNewBitmapAndQueueRenderOfSegmentation(evt, toolData, segIndex);
5755  }
5756}
5757
5758function createNewBitmapAndQueueRenderOfSegmentation(evt, toolData, segIndex) {
5759  var eventData = evt.detail;
5760  var element = eventData.element;
5761  var enabledElement = _externalModules_js__WEBPACK_IMPORTED_MODULE_2__["default"].cornerstone.getEnabledElement(element);
5762  var pixelData = toolData.data[segIndex].pixelData;
5763  var imageSpecificSegmentationAlpha = toolData.data[segIndex].alpha;
5764
5765  if (!pixelData) {
5766    return;
5767  }
5768
5769  var colormapId = state.colorMapId;
5770  var colormap = _externalModules_js__WEBPACK_IMPORTED_MODULE_2__["default"].cornerstone.colors.getColormap(colormapId);
5771  var colorLutTable = [[0, 0, 0, 0], colormap.getColor(segIndex)];
5772  var imageData = new ImageData(eventData.image.width, eventData.image.height);
5773  var image = {
5774    stats: {},
5775    minPixelValue: 0,
5776    getPixelData: function getPixelData() {
5777      return pixelData;
5778    }
5779  };
5780  var hasImageSpecificSegmentationAlpha = imageSpecificSegmentationAlpha !== undefined;
5781
5782  if (hasImageSpecificSegmentationAlpha) {
5783    colorLutTable[1][3] = imageSpecificSegmentationAlpha;
5784  }
5785
5786  _externalModules_js__WEBPACK_IMPORTED_MODULE_2__["default"].cornerstone.storedPixelDataToCanvasImageDataColorLUT(image, colorLutTable, imageData.data);
5787  window.createImageBitmap(imageData).then(function (newImageBitmap) {
5788    setters.imageBitmapCacheForElement(enabledElement.uuid, segIndex, newImageBitmap);
5789    toolData.data[segIndex].invalidated = false;
5790    _externalModules_js__WEBPACK_IMPORTED_MODULE_2__["default"].cornerstone.updateImage(eventData.element);
5791  });
5792}
5793/**
5794 * Draws the ImageBitmap the canvas.
5795 *
5796 * @private
5797 * @param  {Object} evt description
5798 * @param {ImageBitmap} imageBitmap
5799 * @param {Boolean} alwaysVisible
5800 * @returns {void}
5801 */
5802
5803
5804function _drawImageBitmap(evt, imageBitmap, alwaysVisible) {
5805  var eventData = evt.detail;
5806  var context = Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_0__["getNewContext"])(eventData.canvasContext.canvas);
5807  var canvasTopLeft = _externalModules_js__WEBPACK_IMPORTED_MODULE_2__["default"].cornerstone.pixelToCanvas(eventData.element, {
5808    x: 0,
5809    y: 0
5810  });
5811  var canvasTopRight = _externalModules_js__WEBPACK_IMPORTED_MODULE_2__["default"].cornerstone.pixelToCanvas(eventData.element, {
5812    x: eventData.image.width,
5813    y: 0
5814  });
5815  var canvasBottomRight = _externalModules_js__WEBPACK_IMPORTED_MODULE_2__["default"].cornerstone.pixelToCanvas(eventData.element, {
5816    x: eventData.image.width,
5817    y: eventData.image.height
5818  });
5819  var cornerstoneCanvasWidth = _externalModules_js__WEBPACK_IMPORTED_MODULE_2__["default"].cornerstoneMath.point.distance(canvasTopLeft, canvasTopRight);
5820  var cornerstoneCanvasHeight = _externalModules_js__WEBPACK_IMPORTED_MODULE_2__["default"].cornerstoneMath.point.distance(canvasTopRight, canvasBottomRight);
5821  var canvas = eventData.canvasContext.canvas;
5822  var viewport = eventData.viewport;
5823  context.imageSmoothingEnabled = false;
5824  context.globalAlpha = getLayerAlpha(alwaysVisible);
5825  Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_0__["transformCanvasContext"])(context, canvas, viewport);
5826  var canvasViewportTranslation = {
5827    x: viewport.translation.x * viewport.scale,
5828    y: viewport.translation.y * viewport.scale
5829  };
5830  context.drawImage(imageBitmap, canvas.width / 2 - cornerstoneCanvasWidth / 2 + canvasViewportTranslation.x, canvas.height / 2 - cornerstoneCanvasHeight / 2 + canvasViewportTranslation.y, cornerstoneCanvasWidth, cornerstoneCanvasHeight);
5831  context.globalAlpha = 1.0;
5832  Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_0__["resetCanvasContextTransform"])(context);
5833}
5834
5835function getLayerAlpha(alwaysVisible) {
5836  if (alwaysVisible) {
5837    return state.alpha;
5838  }
5839
5840  return state.hiddenButActiveAlpha;
5841}
5842
5843/***/ }),
5844
5845/***/ "./eventListeners/onNewImageBrushEventHandler.js":
5846/*!*******************************************************!*\
5847  !*** ./eventListeners/onNewImageBrushEventHandler.js ***!
5848  \*******************************************************/
5849/*! exports provided: default */
5850/***/ (function(module, __webpack_exports__, __webpack_require__) {
5851
5852"use strict";
5853__webpack_require__.r(__webpack_exports__);
5854/* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../stateManagement/toolState.js */ "./stateManagement/toolState.js");
5855/* harmony import */ var _tools_base_BaseBrushTool_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./../tools/base/BaseBrushTool.js */ "./tools/base/BaseBrushTool.js");
5856/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js");
5857
5858
5859
5860/**
5861 * Clears the brush imageBitmapCache,
5862 * invaldates the data and calls for a re-render.
5863 * @private
5864 * @param {Object} evt - The event.
5865 * @returns {void}
5866 */
5867
5868/* harmony default export */ __webpack_exports__["default"] = (function (evt) {
5869  var eventData = evt.detail;
5870  var element = eventData.element;
5871  var toolData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_0__["getToolState"])(element, _tools_base_BaseBrushTool_js__WEBPACK_IMPORTED_MODULE_1__["default"].getReferencedToolDataName());
5872
5873  if (!toolData) {
5874    Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_0__["addToolState"])(element, _tools_base_BaseBrushTool_js__WEBPACK_IMPORTED_MODULE_1__["default"].getReferencedToolDataName(), {});
5875    toolData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_0__["getToolState"])(element, _tools_base_BaseBrushTool_js__WEBPACK_IMPORTED_MODULE_1__["default"].getReferencedToolDataName());
5876  }
5877
5878  var maxSegmentations = _tools_base_BaseBrushTool_js__WEBPACK_IMPORTED_MODULE_1__["default"].getNumberOfColors(); // Invalidate the segmentation bitmap such that it gets redrawn.
5879
5880  for (var i = 0; i < maxSegmentations; i++) {
5881    if (toolData.data[i]) {
5882      toolData.data[i].invalidated = true;
5883    }
5884  } // Refresh the canvas
5885
5886
5887  _externalModules_js__WEBPACK_IMPORTED_MODULE_2__["default"].cornerstone.updateImage(eventData.element);
5888});
5889
5890/***/ }),
5891
5892/***/ "./eventListeners/preventGhostClick.js":
5893/*!*********************************************!*\
5894  !*** ./eventListeners/preventGhostClick.js ***!
5895  \*********************************************/
5896/*! exports provided: default */
5897/***/ (function(module, __webpack_exports__, __webpack_require__) {
5898
5899"use strict";
5900__webpack_require__.r(__webpack_exports__);
5901// Functions to prevent ghost clicks following a touch
5902// All credit to @kosich
5903// https://gist.github.com/kosich/23188dd86633b6c2efb7
5904var antiGhostDelay = 2000,
5905    pointerType = {
5906  mouse: 0,
5907  touch: 1
5908};
5909var lastInteractionType, lastInteractionTime;
5910
5911function handleTap(type, e) {
5912  var now = Date.now();
5913
5914  if (type !== lastInteractionType) {
5915    if (now - lastInteractionTime <= antiGhostDelay) {
5916      e.preventDefault();
5917      e.stopPropagation();
5918      e.stopImmediatePropagation();
5919      return false;
5920    }
5921
5922    lastInteractionType = type;
5923  }
5924
5925  lastInteractionTime = now;
5926} // Cacheing the function references
5927// Necessary because a new function reference is created after .bind() is called
5928// http://stackoverflow.com/questions/11565471/removing-event-listener-which-was-added-with-bind
5929
5930
5931var handleTapMouse = handleTap.bind(null, pointerType.mouse);
5932var handleTapTouch = handleTap.bind(null, pointerType.touch);
5933
5934function attachEvents(element, eventList, interactionType) {
5935  var tapHandler = interactionType ? handleTapMouse : handleTapTouch;
5936  eventList.forEach(function (eventName) {
5937    element.addEventListener(eventName, tapHandler, {
5938      passive: false
5939    });
5940  });
5941}
5942
5943function removeEvents(element, eventList, interactionType) {
5944  var tapHandler = interactionType ? handleTapMouse : handleTapTouch;
5945  eventList.forEach(function (eventName) {
5946    element.removeEventListener(eventName, tapHandler);
5947  });
5948}
5949
5950var mouseEvents = ['mousedown', 'mouseup'];
5951var touchEvents = ['touchstart', 'touchend'];
5952
5953function disable(element) {
5954  removeEvents(element, mouseEvents, pointerType.mouse);
5955  removeEvents(element, touchEvents, pointerType.touch);
5956}
5957
5958function enable(element) {
5959  disable(element);
5960  attachEvents(element, mouseEvents, pointerType.mouse);
5961  attachEvents(element, touchEvents, pointerType.touch);
5962}
5963
5964/* harmony default export */ __webpack_exports__["default"] = ({
5965  enable: enable,
5966  disable: disable
5967});
5968
5969/***/ }),
5970
5971/***/ "./eventListeners/touchEventListeners.js":
5972/*!***********************************************!*\
5973  !*** ./eventListeners/touchEventListeners.js ***!
5974  \***********************************************/
5975/*! exports provided: default */
5976/***/ (function(module, __webpack_exports__, __webpack_require__) {
5977
5978"use strict";
5979__webpack_require__.r(__webpack_exports__);
5980/* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../events.js */ "./events.js");
5981/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js");
5982/* harmony import */ var _util_copyPoints_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../util/copyPoints.js */ "./util/copyPoints.js");
5983/* harmony import */ var _preventGhostClick_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./preventGhostClick.js */ "./eventListeners/preventGhostClick.js");
5984/* harmony import */ var _util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../util/triggerEvent.js */ "./util/triggerEvent.js");
5985/* harmony import */ var _toolOptions_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../toolOptions.js */ "./toolOptions.js");
5986
5987
5988
5989
5990
5991
5992var startPoints, currentPoints, lastPoints, deltaPoints, eventData, touchStartDelay, pressTimeout, pageDistanceMoved;
5993var lastScale = 1.0,
5994    lastRotation = 0.0,
5995    preventNextPinch = false,
5996    isPress = false,
5997    lastDelta;
5998var pressDelay = 700,
5999    pressMaxDistance = 5;
6000var toolType = 'touchInput';
6001
6002function onTouch(e) {
6003  var element = e.currentTarget || e.srcEvent.currentTarget;
6004  var enabledElement = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.getEnabledElement(element);
6005
6006  if (!enabledElement.image) {
6007    return;
6008  }
6009
6010  var eventType, scaleChange, delta, remainingPointers, rotation; // Prevent mouse events from occurring alongside touch events
6011
6012  e.preventDefault(); // If more than one finger is placed on the element, stop the press t
6012imeout
6013
6014  if (e.pointers && e.pointers.length > 1 || e.touches && e.touches.length > 1) {
6015    isPress = false;
6016    clearTimeout(pressTimeout);
6017  }
6018
6019  switch (e.type) {
6020    case 'tap':
6021      isPress = false;
6022      clearTimeout(pressTimeout); // Calculate our current points in page and image coordinates
6023
6024      currentPoints = {
6025        page: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstoneMath.point.pageToPoint(e.pointers[0]),
6026        image: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pageToPixel(element, e.pointers[0].pageX, e.pointers[0].pageY),
6027        client: {
6028          x: e.pointers[0].clientX,
6029          y: e.pointers[0].clientY
6030        }
6031      };
6032      currentPoints.canvas = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pixelToCanvas(element, currentPoints.image);
6033      eventType = _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TAP;
6034      eventData = {
6035        event: e,
6036        viewport: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.getViewport(element),
6037        image: enabledElement.image,
6038        element: element,
6039        currentPoints: currentPoints,
6040        type: eventType,
6041        isTouchEvent: true
6042      };
6043      Object(_util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_4__["default"])(element, eventType, eventData);
6044      break;
6045
6046    case 'doubletap':
6047      isPress = false;
6048      clearTimeout(pressTimeout); // Calculate our current points in page and image coordinates
6049
6050      currentPoints = {
6051        page: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstoneMath.point.pageToPoint(e.pointers[0]),
6052        image: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pageToPixel(element, e.pointers[0].pageX, e.pointers[0].pageY),
6053        client: {
6054          x: e.pointers[0].clientX,
6055          y: e.pointers[0].clientY
6056        }
6057      };
6058      currentPoints.canvas = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pixelToCanvas(element, currentPoints.image);
6059      eventType = _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].DOUBLE_TAP;
6060      eventData = {
6061        event: e,
6062        viewport: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.getViewport(element),
6063        image: enabledElement.image,
6064        element: element,
6065        currentPoints: currentPoints,
6066        type: eventType,
6067        isTouchEvent: true
6068      };
6069      Object(_util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_4__["default"])(element, eventType, eventData);
6070      break;
6071
6072    case 'pinchstart':
6073      isPress = false;
6074      clearTimeout(pressTimeout);
6075      lastScale = 1.0;
6076      break;
6077
6078    case 'pinchmove':
6079      isPress = false;
6080      clearTimeout(pressTimeout);
6081
6082      if (preventNextPinch === true) {
6083        lastScale = e.scale;
6084        preventNextPinch = false;
6085        break;
6086      }
6087
6088      scaleChange = (e.scale - lastScale) / lastScale;
6089      startPoints = {
6090        page: e.center,
6091        image: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pageToPixel(element, e.center.x, e.center.y)
6092      };
6093      startPoints.canvas = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pixelToCanvas(element, startPoints.image);
6094      eventType = _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_PINCH;
6095      eventData = {
6096        event: e,
6097        startPoints: startPoints,
6098        viewport: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.getViewport(element),
6099        image: enabledElement.image,
6100        element: element,
6101        direction: e.scale < 1 ? 1 : -1,
6102        scaleChange: scaleChange,
6103        type: eventType,
6104        isTouchEvent: true
6105      };
6106      Object(_util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_4__["default"])(element, eventType, eventData);
6107      lastScale = e.scale;
6108      break;
6109
6110    case 'touchstart':
6111      lastScale = 1.0;
6112      clearTimeout(pressTimeout);
6113      clearTimeout(touchStartDelay);
6114      touchStartDelay = setTimeout(function () {
6115        startPoints = {
6116          page: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstoneMath.point.pageToPoint(e.touches[0]),
6117          image: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pageToPixel(element, e.touches[0].pageX, e.touches[0].pageY),
6118          client: {
6119            x: e.touches[0].clientX,
6120            y: e.touches[0].clientY
6121          }
6122        };
6123        startPoints.canvas = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pixelToCanvas(element, startPoints.image);
6124        eventType = _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_START;
6125
6126        if (e.touches.length > 1) {
6127          eventType = _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MULTI_TOUCH_START;
6128        }
6129
6130        eventData = {
6131          event: e,
6132          viewport: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.getViewport(element),
6133          image: enabledElement.image,
6134          element: element,
6135          startPoints: startPoints,
6136          currentPoints: startPoints,
6137          type: eventType,
6138          isTouchEvent: true
6139        };
6140        var eventPropagated = Object(_util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_4__["default"])(element, eventType, eventData);
6141
6142        if (eventPropagated === true) {
6143          // IsPress = false;
6144          // ClearTimeout(pressTimeout);
6145          // No current tools responded to the drag action.
6146          // Create new tool measurement
6147          eventType = _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_START_ACTIVE;
6148
6149          if (e.touches.length > 1) {
6150            eventType = _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MULTI_TOUCH_START_ACTIVE;
6151          }
6152
6153          eventData.type = eventType;
6154          Object(_util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_4__["default"])(element, eventType, eventData);
6155        } // Console.log(eventType);
6156
6157
6158        lastPoints = Object(_util_copyPoints_js__WEBPACK_IMPORTED_MODULE_2__["default"])(startPoints);
6159      }, 50);
6160      isPress = true;
6161      pageDistanceMoved = 0;
6162      pressTimeout = setTimeout(function () {
6163        if (!isPress) {
6164          return;
6165        }
6166
6167        currentPoints = {
6168          page: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstoneMath.point.pageToPoint(e.touches[0]),
6169          image: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pageToPixel(element, e.touches[0].pageX, e.touches[0].pageY),
6170          client: {
6171            x: e.touches[0].clientX,
6172            y: e.touches[0].clientY
6173          }
6174        };
6175        currentPoints.canvas = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pixelToCanvas(element, startPoints.image);
6176        eventType = _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_PRESS;
6177        eventData = {
6178          event: e,
6179          viewport: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.getViewport(element),
6180          image: enabledElement.image,
6181          element: element,
6182          currentPoints: currentPoints,
6183          type: eventType,
6184          isTouchEvent: true
6185        };
6186        Object(_util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_4__["default"])(element, eventType, eventData); // Console.log(eventType);
6187      }, pressDelay);
6188      break;
6189
6190    case 'touchend':
6191      lastScale = 1.0;
6192      isPress = false;
6193      clearTimeout(pressTimeout);
6194      setTimeout(function () {
6195        startPoints = {
6196          page: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstoneMath.point.pageToPoint(e.changedTouches[0]),
6197          image: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pageToPixel(element, e.changedTouches[0].pageX, e.changedTouches[0].pageY),
6198          client: {
6199            x: e.changedTouches[0].clientX,
6200            y: e.changedTouches[0].clientY
6201          }
6202        };
6203        startPoints.canvas = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pixelToCanvas(element, startPoints.image);
6204        eventType = _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_END;
6205        eventData = {
6206          event: e,
6207          viewport: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.getViewport(element),
6208          image: enabledElement.image,
6209          element: element,
6210          startPoints: startPoints,
6211          currentPoints: startPoints,
6212          type: eventType,
6213          isTouchEvent: true
6214        };
6215        Object(_util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_4__["default"])(element, eventType, eventData);
6216      }, 50);
6217      break;
6218
6219    case 'panmove':
6220      // Using the delta-value of HammerJS, because it takes all pointers into account
6221      // This is very important when using panning in combination with pinch-zooming
6222      // But HammerJS' delta is relative to the start of the pan event
6223      // So it needs to be converted to a per-event-delta for CornerstoneTools
6224      delta = {
6225        x: e.deltaX - lastDelta.x,
6226        y: e.deltaY - lastDelta.y
6227      };
6228      lastDelta = {
6229        x: e.deltaX,
6230        y: e.deltaY
6231      }; // Calculate our current points in page and image coordinates
6232
6233      currentPoints = {
6234        page: {
6235          x: lastPoints.page.x + delta.x,
6236          y: lastPoints.page.y + delta.y
6237        },
6238        image: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pageToPixel(element, lastPoints.page.x + delta.x, lastPoints.page.y + delta.y),
6239        client: {
6240          x: lastPoints.client.x + delta.x,
6241          y: lastPoints.client.y + delta.y
6242        }
6243      };
6244      currentPoints.canvas = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pixelToCanvas(element, currentPoints.image); // Calculate delta values in page and image coordinates
6245
6246      deltaPoints = {
6247        page: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstoneMath.point.subtract(currentPoints.page, lastPoints.page),
6248        image: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstoneMath.point.subtract(currentPoints.image, lastPoints.image),
6249        client: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstoneMath.point.subtract(currentPoints.client, lastPoints.client),
6250        canvas: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstoneMath.point.subtract(currentPoints.canvas, lastPoints.canvas)
6251      };
6252      pageDistanceMoved += Math.sqrt(deltaPoints.page.x * deltaPoints.page.x + deltaPoints.page.y * deltaPoints.page.y); // Console.log("pageDistanceMoved: " + pageDistanceMoved);
6253
6254      if (pageDistanceMoved > pressMaxDistance) {
6255        // Console.log('Press event aborted due to movement');
6256        isPress = false;
6257        clearTimeout(pressTimeout);
6258      }
6259
6260      eventType = _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_DRAG;
6261
6262      if (e.pointers.length > 1) {
6263        eventType = _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MULTI_TOUCH_DRAG;
6264      }
6265
6266      eventData = {
6267        viewport: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.getViewport(element),
6268        image: enabledElement.image,
6269        element: element,
6270        startPoints: startPoints,
6271        lastPoints: lastPoints,
6272        currentPoints: currentPoints,
6273        deltaPoints: deltaPoints,
6274        numPointers: e.pointers.length,
6275        type: eventType,
6276        isTouchEvent: true
6277      };
6278      Object(_util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_4__["default"])(element, eventType, eventData);
6279      lastPoints = Object(_util_copyPoints_js__WEBPACK_IMPORTED_MODULE_2__["default"])(currentPoints);
6280      break;
6281
6282    case 'panstart':
6283      lastDelta = {
6284        x: e.deltaX,
6285        y: e.deltaY
6286      };
6287      currentPoints = {
6288        page: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstoneMath.point.pageToPoint(e.pointers[0]),
6289        image: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pageToPixel(element, e.pointers[0].pageX, e.pointers[0].pageY),
6290        client: {
6291          x: e.pointers[0].clientX,
6292          y: e.pointers[0].clientY
6293        }
6294      };
6295      currentPoints.canvas = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pixelToCanvas(element, currentPoints.image);
6296      lastPoints = Object(_util_copyPoints_js__WEBPACK_IMPORTED_MODULE_2__["default"])(currentPoints);
6297      break;
6298
6299    case 'panend':
6300      isPress = false;
6301      clearTimeout(pressTimeout); // If lastPoints is not yet set, it means panend fired without panstart or pan,
6302      // So we can ignore this event
6303
6304      if (!lastPoints) {
6305        return false;
6306      }
6307
6308      currentPoints = {
6309        page: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstoneMath.point.pageToPoint(e.pointers[0]),
6310        image: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pageToPixel(element, e.pointers[0].pageX, e.pointers[0].pageY),
6311        client: {
6312          x: e.pointers[0].clientX,
6313          y: e.pointers[0].clientY
6314        }
6315      };
6316      currentPoints.canvas = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pixelToCanvas(element, currentPoints.image); // Calculate delta values in page and image coordinates
6317
6318      deltaPoints = {
6319        page: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstoneMath.point.subtract(currentPoints.page, lastPoints.page),
6320        image: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstoneMath.point.subtract(currentPoints.image, lastPoints.image),
6321        client: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstoneMath.point.subtract(currentPoints.client, lastPoints.client),
6322        canvas: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstoneMath.point.subtract(currentPoints.canvas, lastPoints.canvas)
6323      };
6324      eventType = _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_DRAG_END;
6325      eventData = {
6326        event: e.srcEvent,
6327        viewport: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.getViewport(element),
6328        image: enabledElement.image,
6329        element: element,
6330        startPoints: startPoints,
6331        lastPoints: lastPoints,
6332        currentPoints: currentPoints,
6333        deltaPoints: deltaPoints,
6334        type: eventType,
6335        isTouchEvent: true
6336      };
6337      Object(_util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_4__["default"])(element, eventType, eventData);
6338      remainingPointers = e.pointers.length - e.changedPointers.length;
6339
6340      if (remainingPointers === 2) {
6341        preventNextPinch = true;
6342      }
6343
6344      break;
6345
6346    case 'rotatemove':
6347      isPress = false;
6348      clearTimeout(pressTimeout);
6349      rotation = e.rotation - lastRotation;
6350      lastRotation = e.rotation;
6351      eventType = _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_ROTATE;
6352      eventData = {
6353        event: e.srcEvent,
6354        viewport: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.getViewport(element),
6355        image: enabledElement.image,
6356        element: element,
6357        rotation: rotation,
6358        type: eventType
6359      };
6360      Object(_util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_4__["default"])(element, eventType, eventData);
6361      break;
6362  }
6363
6364  return false;
6365}
6366
6367function enable(element) {
6368  disable(element);
6369  var Hammer = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].Hammer;
6370  var hammerOptions = {
6371    inputClass: Hammer.SUPPORT_POINTER_EVENTS ? Hammer.PointerEventInput : Hammer.TouchInput
6372  };
6373  var mc = new Hammer.Manager(element, hammerOptions);
6374  var panOptions = {
6375    pointers: 0,
6376    direction: Hammer.DIRECTION_ALL,
6377    threshold: 0
6378  };
6379  var pan = new Hammer.Pan(panOptions);
6380  var pinch = new Hammer.Pinch({
6381    threshold: 0
6382  });
6383  var rotate = new Hammer.Rotate({
6384    threshold: 0
6385  });
6386  pinch.recognizeWith(pan);
6387  pinch.recognizeWith(rotate);
6388  rotate.recognizeWith(pan);
6389  var doubleTap = new Hammer.Tap({
6390    event: 'doubletap',
6391    taps: 2,
6392    interval: 1500,
6393    threshold: 50,
6394    posThreshold: 50
6395  });
6396  doubleTap.recognizeWith(pan); // Add to the Manager
6397
6398  mc.add([doubleTap, pan, rotate, pinch]);
6399  mc.on('tap doubletap panstart panmove panend pinchstart pinchmove rotatemove', onTouch);
6400  _preventGhostClick_js__WEBPACK_IMPORTED_MODULE_3__["default"].enable(element);
6401  var touchEvents = ['touchstart', 'touchend'];
6402  touchEvents.forEach(function (eventType) {
6403    element.addEventListener(eventType, onTouch, {
6404      passive: false
6405    });
6406  });
6407  var options = Object(_toolOptions_js__WEBPACK_IMPORTED_MODULE_5__["getToolOptions"])(toolType, element);
6408  options.hammer = mc;
6409  Object(_toolOptions_js__WEBPACK_IMPORTED_MODULE_5__["setToolOptions"])(toolType, element, options);
6410}
6411
6412function disable(element) {
6413  _preventGhostClick_js__WEBPACK_IMPORTED_MODULE_3__["default"].disable(element);
6414  var touchEvents = ['touchstart', 'touchend'];
6415  touchEvents.forEach(function (eventType) {
6416    element.removeEventListener(eventType, onTouch);
6417  });
6418  var options = Object(_toolOptions_js__WEBPACK_IMPORTED_MODULE_5__["getToolOptions"])(toolType, element);
6419  var mc = options.hammer;
6420
6421  if (mc) {
6422    mc.off('tap doubletap panstart panmove panend pinchstart pinchmove rotatemove', onTouch);
6423  }
6424} // Module exports
6425
6426
6427var touchInput = {
6428  enable: enable,
6429  disable: disable
6430};
6431/* harmony default export */ __webpack_exports__["default"] = (touchInput);
6432
6433/***/ }),
6434
6435/***/ "./eventListeners/wheelEventListener.js":
6436/*!**********************************************!*\
6437  !*** ./eventListeners/wheelEventListener.js ***!
6438  \**********************************************/
6439/*! exports provided: default */
6440/***/ (function(module, __webpack_exports__, __webpack_require__) {
6441
6442"use strict";
6443__webpack_require__.r(__webpack_exports__);
6444/* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../events.js */ "./events.js");
6445/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js");
6446/* harmony import */ var _util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../util/triggerEvent.js */ "./util/triggerEvent.js");
6447/* harmony import */ var _internals_normalizeWheel_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./internals/normalizeWheel.js */ "./eventListeners/internals/normalizeWheel.js");
6448/**
6449 * Internal module used to turn on listening, handling, and normalizing of the
6450 * native `wheel` event
6451 */
6452
6453
6454
6455
6456/**
6457 *
6458 * @private
6459 * @function wheelEventHandler
6460 * @param {WheelEvent} evt
6461 * @returns {undefined}
6462 */
6463
6464function wheelEventHandler(evt) {
6465  var element = evt.currentTarget;
6466  var enabledElement = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.getEnabledElement(element);
6467
6468  if (!enabledElement.image) {
6469    return;
6470  } // Prevent triggering MouseWheel events that are not real scroll events:
6471  // E.g. when clicking the MiddleMouseWheelButton, a deltaY of 0 is emitted.
6472  // See https://github.com/cornerstonejs/cornerstoneTools/issues/935
6473
6474
6475  if (evt.deltaY > -1 && evt.deltaY < 1) {
6476    return;
6477  }
6478
6479  evt.preventDefault();
6480  var pageX = evt.pageX,
6481      pageY = evt.pageY;
6482  var startingCoords = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pageToPixel(element, pageX, pageY);
6483
6484  var _normalizeWheel = Object(_internals_normalizeWheel_js__WEBPACK_IMPORTED_MODULE_3__["default"])(evt),
6485      spinX = _normalizeWheel.spinX,
6486      spinY = _normalizeWheel.spinY,
6487      pixelX = _normalizeWheel.pixelX,
6488      pixelY = _normalizeWheel.pixelY;
6489
6490  var direction = spinY < 0 ? -1 : 1;
6491  var mouseWheelData = {
6492    element: element,
6493    viewport: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.getViewport(element),
6494    detail: evt,
6495    image: enabledElement.image,
6496    direction: direction,
6497    spinX: spinX,
6498    spinY: spinY,
6499    pixelX: pixelX,
6500    pixelY: pixelY,
6501    pageX: pageX,
6502    pageY: pageY,
6503    imageX: startingCoords.x,
6504    imageY: startingCoords.y
6505  };
6506  Object(_util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_2__["default"])(element, _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MOUSE_WHEEL, mouseWheelData);
6507}
6508/**
6509 * Listens for the wheel event, and handles it. Handled event
6510 * will be "normalized" and re-emitted as `EVENTS.MOUSE_WHEEL`
6511 *
6512 * @private
6513 * @param {HTMLElement} element
6514 * @returns {undefined}
6515 */
6516
6517
6518function enable(element) {
6519  disable(element);
6520  element.addEventListener('wheel', wheelEventHandler, {
6521    passive: false
6522  });
6523}
6524/**
6525 * Removes listener and handler for wheel event. `EVENTS.MOUSE_WHEEL`
6526 * will no longer be emitted.
6527 *
6528 * @private
6529 * @param {HTMLElement} element
6530 * @returns {undefined}
6531 */
6532
6533
6534function disable(element) {
6535  element.removeEventListener('wheel', wheelEventHandler, {
6536    passive: false
6537  });
6538}
6539
6540/* harmony default export */ __webpack_exports__["default"] = ({
6541  enable: enable,
6542  disable: disable
6543});
6544
6545/***/ }),
6546
6547/***/ "./eventListeners/windowResizeHandler.js":
6548/*!***********************************************!*\
6549  !*** ./eventListeners/windowResizeHandler.js ***!
6550  \***********************************************/
6551/*! exports provided: forceEnabledElementResize, default */
6552/***/ (function(module, __webpack_exports__, __webpack_require__) {
6553
6554"use strict";
6555__webpack_require__.r(__webpack_exports__);
6556/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "forceEnabledElementResize", function() { return forceEnabledElementResize; });
6557/* harmony import */ var _store_index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../store/index.js */ "./store/index.js");
6558/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./../externalModules.js */ "./externalModules.js");
6559
6560
6561
6562var enable = function enable() {
6563  disable(); // Clean up any lingering listeners
6564
6565  window.addEventListener('resize', resizeThrottler, false);
6566};
6567
6568var disable = function disable() {
6569  window.removeEventListener('resize', resizeThrottler, false);
6570};
6571
6572var resizeTimeout;
6573
6574function resizeThrottler() {
6575  // Ignore resize events as long as an actualResizeHandler execution is in the queue
6576  if (!resizeTimeout) {
6577    resizeTimeout = setTimeout(function () {
6578      resizeTimeout = null;
6579      forceEnabledElementResize(); // The actualResizeHandler will execute at a rate of 15fps
6580    }, 66);
6581  }
6582}
6583
6584var forceEnabledElementResize = function forceEnabledElementResize() {
6585  _store_index_js__WEBPACK_IMPORTED_MODULE_0__["state"].enabledElements.forEach(function (element) {
6586    _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.resize(element);
6587  });
6588};
6589/* harmony default export */ __webpack_exports__["default"] = ({
6590  enable: enable,
6591  disable: disable
6592});
6593
6594/***/ }),
6595
6596/***/ "./events.js":
6597/*!*******************!*\
6598  !*** ./events.js ***!
6599  \*******************/
6600/*! exports provided: default */
6601/***/ (function(module, __webpack_exports__, __webpack_require__) {
6602
6603"use strict";
6604__webpack_require__.r(__webpack_exports__);
6605/**
6606 *  Enumerates the events for CornestoneTools. Native events are captured,
6607 *  normalized, and re-triggered with a `cornerstonetools` prefix. This allows
6608 *  us to handle events consistently across different browsers.
6609 *
6610 *  @enum {String}
6611 *  @memberof CornerstoneTools
6612 *  @readonly
6613 */
6614var EVENTS = {
6615  //
6616  // MOUSE
6617  //
6618
6619  /**
6620   * https://developer.mozilla.org/en-US/docs/Web/Events/mousedown
6621   *  @type {String}
6622   */
6623  MOUSE_DOWN: 'cornerstonetoolsmousedown',
6624
6625  /**
6626   * https://developer.mozilla.org/en-US/docs/Web/Events/mouseup
6627   *  @type {String}
6628   */
6629  MOUSE_UP: 'cornerstonetoolsmouseup',
6630
6631  /**
6632   * Is fired if a handled `MOUSE_DOWN` event does not `stopPropagation`. The hook
6633   * we use to create new measurement data for mouse events.
6634   *  @type {String}
6635   */
6636  MOUSE_DOWN_ACTIVATE: 'cornerstonetoolsmousedownactivate',
6637
6638  /**
6639   * https://developer.mozilla.org/en-US/docs/Web/Events/drag
6640   *  @type {String}
6641   */
6642  MOUSE_DRAG: 'cornerstonetoolsmousedrag',
6643
6644  /**
6645   * https://developer.mozilla.org/en-US/docs/Web/Events/mousemove
6646   *  @type {String}
6647   */
6648  MOUSE_MOVE: 'cornerstonetoolsmousemove',
6649
6650  /**
6651   * https://developer.mozilla.org/en-US/docs/Web/Events/click
6652   *  @type {String}
6653   */
6654  MOUSE_CLICK: 'cornerstonetoolsmouseclick',
6655
6656  /**
6657   * https://developer.mozilla.org/en-US/docs/Web/Events/dblclick
6658   *  @type {String}
6659   */
6660  MOUSE_DOUBLE_CLICK: 'cornerstonetoolsmousedoubleclick',
6661
6662  /**
6663   * https://developer.mozilla.org/en-US/docs/Web/Events/wheel
6664   *  @type {String}
6665   */
6666  MOUSE_WHEEL: 'cornerstonetoolsmousewheel',
6667  //
6668  // TOUCH
6669  //
6670
6671  /**
6672   * https://developer.mozilla.org/en-US/docs/Web/Events/touchstart
6673   *  @type {String}
6674   */
6675  TOUCH_START: 'cornerstonetoolstouchstart',
6676
6677  /**
6678   * Is fired if a handled `TOUCH_START` event does not `stopPropagation`. The hook
6679   * we use to create new measurement data for touch events.
6680   *  @type {String}
6681   */
6682  TOUCH_START_ACTIVE: 'cornerstonetoolstouchstartactive',
6683
6684  /**
6685   *  @type {String}
6686   */
6687  TOUCH_END: 'cornerstonetoolstouchend',
6688
6689  /**
6690   *  @type {String}
6691   */
6692  TOUCH_DRAG: 'cornerstonetoolstouchdrag',
6693
6694  /**
6695   *  @type {String}
6696   */
6697  TOUCH_DRAG_END: 'cornerstonetoolstouchdragend',
6698
6699  /**
6700   * http://hammerjs.github.io/recognizer-pinch/
6701   *  @type {String}
6702   */
6703  TOUCH_PINCH: 'cornerstonetoolstouchpinch',
6704
6705  /**
6706   * http://hammerjs.github.io/recognizer-rotate/
6707   *  @type {String}
6708   */
6709  TOUCH_ROTATE: 'cornerstonetoolstouchrotate',
6710
6711  /**
6712   * http://hammerjs.github.io/recognizer-press/
6713   *  @type {String}
6714   */
6715  TOUCH_PRESS: 'cornerstonetoolstouchpress',
6716
6717  /**
6718   * http://hammerjs.github.io/recognizer-tap/
6719   *  @type {String}
6720   */
6721  TAP: 'cornerstonetoolstap',
6722
6723  /**
6724   *  @type {String}
6725   */
6726  DOUBLE_TAP: 'cornerstonetoolsdoubletap',
6727
6728  /**
6729   *  @type {String}
6730   */
6731  MULTI_TOUCH_START: 'cornerstonetoolsmultitouchstart',
6732
6733  /**
6734   *  @type {String}
6735   */
6736  MULTI_TOUCH_START_ACTIVE: 'cornerstonetoolsmultitouchstartactive',
6737
6738  /**
6739   *  @type {String}
6740   */
6741  MULTI_TOUCH_DRAG: 'cornerstonetoolsmultitouchdrag',
6742  //
6743  // KEYBOARD
6744  //
6745
6746  /**
6747   * https://developer.mozilla.org/en-US/docs/Web/Events/keydown
6748   *  @type {String}
6749   */
6750  KEY_DOWN: 'cornerstonetoolskeydown',
6751
6752  /**
6753   * https://developer.mozilla.org/en-US/docs/Web/Events/keyup
6754   *  @type {String}
6755   */
6756  KEY_UP: 'cornerstonetoolskeyup',
6757
6758  /**
6759   * https://developer.mozilla.org/en-US/docs/Web/Events/keypress
6760   *  @type {String}
6761   */
6762  KEY_PRESS: 'cornerstonetoolskeypress',
6763  //
6764  // CUSTOM
6765  //
6766
6767  /**
6768   *  @type {String}
6769   */
6770  MEASUREMENT_ADDED: 'cornerstonetoolsmeasurementadded',
6771
6772  /**
6773   *  @type {String}
6774   */
6775  MEASUREMENT_MODIFIED: 'cornerstonetoolsmeasurementmodified',
6776
6777  /**
6778   *  @type {String}
6779   */
6780  MEASUREMENT_COMPLETED: 'cornerstonetoolsmeasurementcompleted',
6781
6782  /**
6783   *  @type {String}
6784   */
6785  MEASUREMENT_REMOVED: 'cornerstonetoolsmeasurementremoved',
6786
6787  /**
6788   *  @type {String}
6789   */
6790  TOOL_DEACTIVATED: 'cornerstonetoolstooldeactivated',
6791
6792  /**
6793   *  @type {String}
6794   */
6795  CLIP_STOPPED: 'cornerstonetoolsclipstopped',
6796
6797  /**
6798   *  @type {String}
6799   */
6800  STACK_SCROLL: 'cornerstonetoolsstackscroll'
6801};
6802/* harmony default export */ __webpack_exports__["default"] = (EVENTS);
6803
6804/***/ }),
6805
6806/***/ "./externalModules.js":
6807/*!****************************!*\
6808  !*** ./externalModules.js ***!
6809  \****************************/
6810/*! exports provided: default */
6811/***/ (function(module, __webpack_exports__, __webpack_require__) {
6812
6813"use strict";
6814__webpack_require__.r(__webpack_exports__);
6815var cornerstone = window.cornerstone;
6816var cornerstoneMath = window.cornerstoneMath;
6817var Hammer = window.Hammer;
6818/* harmony default export */ __webpack_exports__["default"] = ({
6819  set cornerstone(cs) {
6820    cornerstone = cs;
6821  },
6822
6823  get cornerstone() {
6824    return cornerstone;
6825  },
6826
6827  set cornerstoneMath(cm) {
6828    cornerstoneMath = cm;
6829  },
6830
6831  get cornerstoneMath() {
6832    return cornerstoneMath;
6833  },
6834
6835  set Hammer(module) {
6836    Hammer = module;
6837  },
6838
6839  get Hammer() {
6840    return Hammer;
6841  }
6842
6843});
6844
6845/***/ }),
6846
6847/***/ "./import.js":
6848/*!*******************!*\
6849  !*** ./import.js ***!
6850  \*******************/
6851/*! exports provided: default */
6852/***/ (function(module, __webpack_exports__, __webpack_require__) {
6853
6854"use strict";
6855__webpack_require__.r(__webpack_exports__);
6856/* harmony import */ var _lib_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./lib.js */ "./lib.js");
6857
6858/**
6859 * Imports functionality from cornerstoneTools for use in external packages/plugins.
6860 * @export
6861 * @public
6862 * @method
6863 * @name import
6864 *
6865 * @param  {string} uri the import path for the entity to import.
6866 * @returns {Class|Object|Function} The entity requested.
6867 */
6868
6869/* harmony default export */ __webpack_exports__["default"] = (function (uri) {
6870  return _lib_js__WEBPACK_IMPORTED_MODULE_0__["lib"][uri];
6871});
6872
6873/***/ }),
6874
6875/***/ "./index.js":
6876/*!******************!*\
6877  !*** ./index.js ***!
6878  \******************/
6879/*! exports provided: AngleTool, ArrowAnnotateTool, BidirectionalTool, CircleRoiTool, CobbAngleTool, EllipticalRoiTool, FreehandMouseTool, LengthTool, ProbeTool, RectangleRoiTool, TextMarkerTool, BrushTool, CrosshairsTool, DoubleTapFitToWindowTool, DragProbeTool, EraserTool, FreehandSculpterMouseTool, MagnifyTool, PanMultiTouchTool, PanTool, ReferenceLinesTool, RotateTool, RotateTouchTool, ScaleOverlayTool, StackScrollMouseWheelTool, StackScrollMultiTouchTool, StackScrollTool, WwwcRegionTool, WwwcTool, ZoomMouseWheelTool, ZoomTool, ZoomTouchPinchTool, init, stackPrefetch, stackRenderers, playClip, stopClip, store, getToolForElement, addTool, addToolForElement, removeTool, removeToolForElement, setToolOptions, setToolOptionsForElement, setToolActive, setToolActiveForElement, setToolEnabled, setToolEnabledForElement, setToolDisabled, setToolDisabledForElement, setToolPassive, setToolPassiveForElement, addToolState, getToolState, removeToolState, clearToolState, setElementToolStateManager, getElementToolStateManager, textStyle, toolStyle, toolColors, toolCoordinates, stackSpecificStateManager, newStackSpecificToolStateManager, addStackStateManager, loadHandlerManager, newImageIdSpecificToolStateManager, globalImageIdSpecificToolStateManager, newFrameOfReferenceSpecificToolStateManager, globalFrameOfReferenceSpecificToolStateManager, forceEnabledElementResize, orientation, SaveAs, enableLogger, disableLogger, register, registerSome, wwwcSynchronizer, updateImageSynchronizer, Synchronizer, stackScrollSynchronizer, stackImagePositionSynchronizer, stackImagePositionOffsetSynchronizer, stackImageIndexSynchronizer, panZoomSynchronizer, requestPoolManager, external, EVENTS, version, import, default */
6880/***/ (function(module, __webpack_exports__, __webpack_require__) {
6881
6882"use strict";
6883__webpack_require__.r(__webpack_exports__);
6884/* harmony import */ var _tools_annotation_index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./tools/annotation/index.js */ "./tools/annotation/index.js");
6885/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "AngleTool", function() { return _tools_annotation_index_js__WEBPACK_IMPORTED_MODULE_0__["AngleTool"]; });
6886
6887/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ArrowAnnotateTool", function() { return _tools_annotation_index_js__WEBPACK_IMPORTED_MODULE_0__["ArrowAnnotateTool"]; });
6888
6889/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "BidirectionalTool", function() { return _tools_annotation_index_js__WEBPACK_IMPORTED_MODULE_0__["BidirectionalTool"]; });
6890
6891/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "CircleRoiTool", function() { return _tools_annotation_index_js__WEBPACK_IMPORTED_MODULE_0__["CircleRoiTool"]; });
6892
6893/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "CobbAngleTool", function() { return _tools_annotation_index_js__WEBPACK_IMPORTED_MODULE_0__["CobbAngleTool"]; });
6894
6895/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "EllipticalRoiTool", function() { return _tools_annotation_index_js__WEBPACK_IMPORTED_MODULE_0__["EllipticalRoiTool"]; });
6896
6897/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FreehandMouseTool", function() { return _tools_annotation_index_js__WEBPACK_IMPORTED_MODULE_0__["FreehandMouseTool"]; });
6898
6899/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "LengthTool", function() { return _tools_annotation_index_js__WEBPACK_IMPORTED_MODULE_0__["LengthTool"]; });
6900
6901/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ProbeTool", function() { return _tools_annotation_index_js__WEBPACK_IMPORTED_MODULE_0__["ProbeTool"]; });
6902
6903/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "RectangleRoiTool", function() { return _tools_annotation_index_js__WEBPACK_IMPORTED_MODULE_0__["RectangleRoiTool"]; });
6904
6905/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "TextMarkerTool", function() { return _tools_annotation_index_js__WEBPACK_IMPORTED_MODULE_0__["TextMarkerTool"]; });
6906
6907/* harmony import */ var _tools_brush_index_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./tools/brush/index.js */ "./tools/brush/index.js");
6908/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "BrushTool", function() { return _tools_brush_index_js__WEBPACK_IMPORTED_MODULE_1__["BrushTool"]; });
6909
6910/* harmony import */ var _tools_index_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tools/index.js */ "./tools/index.js");
6911/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "CrosshairsTool", function() { return _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["CrosshairsTool"]; });
6912
6913/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "DoubleTapFitToWindowTool", function() { return _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["DoubleTapFitToWindowTool"]; });
6914
6915/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "DragProbeTool", function() { return _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["DragProbeTool"]; });
6916
6917/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "EraserTool", function() { return _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["
6917EraserTool"]; });
6918
6919/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FreehandSculpterMouseTool", function() { return _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["FreehandSculpterMouseTool"]; });
6920
6921/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "MagnifyTool", function() { return _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["MagnifyTool"]; });
6922
6923/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "PanMultiTouchTool", function() { return _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["PanMultiTouchTool"]; });
6924
6925/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "PanTool", function() { return _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["PanTool"]; });
6926
6927/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ReferenceLinesTool", function() { return _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["ReferenceLinesTool"]; });
6928
6929/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "RotateTool", function() { return _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["RotateTool"]; });
6930
6931/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "RotateTouchTool", function() { return _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["RotateTouchTool"]; });
6932
6933/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ScaleOverlayTool", function() { return _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["ScaleOverlayTool"]; });
6934
6935/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "StackScrollMouseWheelTool", function() { return _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["StackScrollMouseWheelTool"]; });
6936
6937/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "StackScrollMultiTouchTool", function() { return _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["StackScrollMultiTouchTool"]; });
6938
6939/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "StackScrollTool", function() { return _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["StackScrollTool"]; });
6940
6941/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "WwwcRegionTool", function() { return _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["WwwcRegionTool"]; });
6942
6943/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "WwwcTool", function() { return _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["WwwcTool"]; });
6944
6945/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ZoomMouseWheelTool", function() { return _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["ZoomMouseWheelTool"]; });
6946
6947/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ZoomTool", function() { return _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["ZoomTool"]; });
6948
6949/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ZoomTouchPinchTool", function() { return _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["ZoomTouchPinchTool"]; });
6950
6951/* harmony import */ var _import_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./import.js */ "./import.js");
6952/* harmony import */ var _init_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./init.js */ "./init.js");
6953/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "init", function() { return _init_js__WEBPACK_IMPORTED_MODULE_4__["default"]; });
6954
6955/* harmony import */ var _stackTools_stackPrefetch_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./stackTools/stackPrefetch.js */ "./stackTools/stackPrefetch.js");
6956/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "stackPrefetch", function() { return _stackTools_stackPrefetch_js__WEBPACK_IMPORTED_MODULE_5__["default"]; });
6957
6958/* harmony import */ var _stackTools_stackRenderers_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./stackTools/stackRenderers.js */ "./stackTools/stackRenderers.js");
6959/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "stackRenderers", function() { return _stackTools_stackRenderers_js__WEBPACK_IMPORTED_MODULE_6__["default"]; });
6960
6961/* harmony import */ var _stackTools_playClip_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./stackTools/playClip.js */ "./stackTools/playClip.js");
6962/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "playClip", function() { return _stackTools_playClip_js__WEBPACK_IMPORTED_MODULE_7__["playClip"]; });
6963
6964/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "stopClip", function() { return _stackTools_playClip_js__WEBPACK_IMPORTED_MODULE_7__["stopClip"]; });
6965
6966/* harmony import */ var _store_index_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./store/index.js */ "./store/index.js");
6967/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "store", function() { return _store_index_js__WEBPACK_IMPORTED_MODULE_8__["default"]; });
6968
6969/* harmony import */ var _store_getToolForElement_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./store/getToolForElement.js */ "./store/getToolForElement.js");
6970/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getToolForElement", function() { return _store_getToolForElement_js__WEBPACK_IMPORTED_MODULE_9__["default"]; });
6971
6972/* harmony import */ var _store_addTool_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./store/addTool.js */ "./store/addTool.js");
6973/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "addTool", function() { return _store_addTool_js__WEBPACK_IMPORTED_MODULE_10__["addTool"]; });
6974
6975/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "addToolForElement", function() { return _store_addTool_js__WEBPACK_IMPORTED_MODULE_10__["addToolForElement"]; });
6976
6977/* harmony import */ var _store_removeTool_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./store/removeTool.js */ "./store/removeTool.js");
6978/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "removeTool", function() { return _store_removeTool_js__WEBPACK_IMPORTED_MODULE_11__["removeTool"]; });
6979
6980/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "removeToolForElement", function() { return _store_removeTool_js__WEBPACK_IMPORTED_MODULE_11__["removeToolForElement"]; });
6981
6982/* harmony import */ var _store_setToolOptions_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./store/setToolOptions.js */ "./store/setToolOptions.js");
6983/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "setToolOptions", function() { return _store_setToolOptions_js__WEBPACK_IMPORTED_MODULE_12__["setToolOptions"]; });
6984
6985/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "setToolOptionsForElement", function() { return _store_setToolOptions_js__WEBPACK_IMPORTED_MODULE_12__["setToolOptionsForElement"]; });
6986
6987/* harmony import */ var _store_setToolMode_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./store/setToolMode.js */ "./store/setToolMode.js");
6988/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "setToolActive", function() { return _store_setToolMode_js__WEBPACK_IMPORTED_MODULE_13__["setToolActive"]; });
6989
6990/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "setToolActiveForElement", function() { return _store_setToolMode_js__WEBPACK_IMPORTED_MODULE_13__["setToolActiveForElement"]; });
6991
6992/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "setToolEnabled", function() { return _store_setToolMode_js__WEBPACK_IMPORTED_MODULE_13__["setToolEnabled"]; });
6993
6994/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "setToolEnabledForElement", function() { return _store_setToolMode_js__WEBPACK_IMPORTED_MODULE_13__["setToolEnabledForElement"]; });
6995
6996/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "setToolDisabled", function() { return _store_setToolMode_js__WEBPACK_IMPORTED_MODULE_13__["setToolDisabled"]; });
6997
6998/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "setToolDisabledForElement", function() { return _store_setToolMode_js__WEBPACK_IMPORTED_MODULE_13__["setToolDisabledForElement"]; });
6999
7000/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "setToolPassive", function() { return _store_setToolMode_js__WEBPACK_IMPORTED_MODULE_13__["setToolPassive"]; });
7001
7002/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "setToolPassiveForElement", function() { return _store_setToolMode_js__WEBPACK_IMPORTED_MODULE_13__["setToolPassiveForElement"]; });
7003
7004/* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./stateManagement/toolState.js */ "./stateManagement/toolState.js");
7005/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "addToolState", function() { return _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_14__["addToolState"]; });
7006
7007/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getToolState", function() { return _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_14__["getToolState"]; });
7008
7009/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "removeToolState", function() { return _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_14__["removeToolState"]; });
7010
7011/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "clearToolState", function() { return _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_14__["clearToolState"]; });
7012
7013/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "setElementToolStateManager", function() { return _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_14__["setElementToolStateManager"]; });
7014
7015/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getElementToolStateManager", function() { return _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_14__["getElementToolStateManager"]; });
7016
7017/* harmony import */ var _stateManagement_textStyle_js__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./stateManagement/textStyle.js */ "./stateManagement/textStyle.js");
7018/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "textStyle", function() { return _stateManagement_textStyle_js__WEBPACK_IMPORTED_MODULE_15__["default"]; });
7019
7020/* harmony import */ var _stateManagement_toolStyle_js__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./stateManagement/toolStyle.js */ "./stateManagement/toolStyle.js");
7021/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "toolStyle", function() { return _stateManagement_toolStyle_js__WEBPACK_IMPORTED_MODULE_16__["default"]; });
7022
7023/* harmony import */ var _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./stateManagement/toolColors.js */ "./stateManagement/toolColors.js");
7024/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "toolColors", function() { return _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_17__["default"]; });
7025
7026/* harmony import */ var _stateManagement_toolCoordinates_js__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./stateManagement/toolCoordinates.js */ "./stateManagement/toolCoordinates.js");
7027/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "toolCoordinates", function() { return _stateManagement_toolCoordinates_js__WEBPACK_IMPORTED_MODULE_18__["default"]; });
7028
7029/* harmony import */ var _stateManagement_stackSpecificStateManager_js__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./stateManagement/stackSpecificStateManager.js */ "./stateManagement/stackSpecificStateManager.js");
7030/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "stackSpecificStateManager", function() { return _stateManagement_stackSpecificStateManager_js__WEBPACK_IMPORTED_MODULE_19__["stackSpecificStateManager"]; });
7031
7032/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "newStackSpecificToolStateManager", function() { return _stateManagement_stackSpecificStateManager_js__WEBPACK_IMPORTED_MODULE_19__["newStackSpecificToolStateManager"]; });
7033
7034/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "addStackStateManager", function() { return _stateManagement_stackSpecificStateManager_js__WEBPACK_IMPORTED_MODULE_19__["addStackStateManager"]; });
7035
7036/* harmony import */ var _stateManagement_loadHandlerManager_js__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./stateManagement/loadHandlerManager.js */ "./stateManagement/loadHandlerManager.js");
7037/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "loadHandlerManager", function() { return _stateManagement_loadHandlerManager_js__WEBPACK_IMPORTED_MODULE_20__["default"]; });
7038
7039/* harmony import */ var _stateManagement_imageIdSpecificStateManager_js__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./stateManagement/imageIdSpecificStateManager.js */ "./stateManagement/imageIdSpecificStateManager.js");
7040/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "newImageIdSpecificToolStateManager", function() { return _stateManagement_imageIdSpecificStateManager_js__WEBPACK_IMPORTED_MODULE_21__["newImageIdSpecificToolStateManager"]; });
7041
7042/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "globalImageIdSpecificToolStateManager", function() { return _stateManagement_imageIdSpecificStateManager_js__WEBPACK_IMPORTED_MODULE_21__["globalImageIdSpecificToolStateManager"]; });
7043
7044/* harmony import */ var _stateManagement_frameOfReferenceStateManager_js__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./stateManagement/frameOfReferenceStateManager.js */ "./stateManagement/frameOfReferenceStateManager.js");
7045/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "newFrameOfReferenceSpecificToolStateManager", function() { return _stateManagement_frameOfReferenceStateManager_js__WEBPACK_IMPORTED_MODULE_22__["newFrameOfReferenceSpecificToolStateManager"]; });
7046
7047/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "globalFrameOfReferenceSpecificToolStateManager", function() { return _stateManagement_frameOfReferenceStateManager_js__WEBPACK_IMPORTED_MODULE_22__["globalFrameOfReferenceSpecificToolStateManager"]; });
7048
7049/* harmony import */ var _eventListeners_windowResizeHandler_js__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ./eventListeners/windowResizeHandler.js */ "./eventListeners/windowResizeHandler.js");
7050/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "forceEnabledElementResize", function() { return _eventListeners_windowResizeHandler_js__WEBPACK_IMPORTED_MODULE_23__["forceEnabledElementResize"]; });
7051
7052/* harmony import */ var _orientation_index_js__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ./orientation/index.js */ "./orientation/index.js");
7053/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "orientation", function() { return _orientation_index_js__WEBPACK_IMPORTED_MODULE_24__["default"]; });
7054
7055/* harmony import */ var _util_SaveAs_js__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ./util/SaveAs.js */ "./util/SaveAs.js");
7056/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "SaveAs", function() { return _util_SaveAs_js__WEBPACK_IMPORTED_MODULE_25__["default"]; });
7057
7058/* harmony import */ var _util_logger_js__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ./util/logger.js */ "./util/logger.js");
7059/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "enableLogger", function() { return _util_logger_js__WEBPACK_IMPORTED_MODULE_26__["enable"]; });
7060
7061/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "disableLogger", function() { return _util_logger_js__WEBPACK_IMPORTED_MODULE_26__["disable"]; });
7062
7063/* harmony import */ var _thirdParty_register_js__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ./thirdParty/register.js */ "./thirdParty/register.js");
7064/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "register", function() { return _thirdParty_register_js__WEBPACK_IMPORTED_MODULE_27__["default"]; });
7065
7066/* harmony import */ var _thirdParty_registerSome_js__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ./thirdParty/registerSome.js */ "./thirdParty/registerSome.
7066js");
7067/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "registerSome", function() { return _thirdParty_registerSome_js__WEBPACK_IMPORTED_MODULE_28__["default"]; });
7068
7069/* harmony import */ var _synchronization_wwwcSynchronizer_js__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ./synchronization/wwwcSynchronizer.js */ "./synchronization/wwwcSynchronizer.js");
7070/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "wwwcSynchronizer", function() { return _synchronization_wwwcSynchronizer_js__WEBPACK_IMPORTED_MODULE_29__["default"]; });
7071
7072/* harmony import */ var _synchronization_updateImageSynchronizer_js__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ./synchronization/updateImageSynchronizer.js */ "./synchronization/updateImageSynchronizer.js");
7073/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "updateImageSynchronizer", function() { return _synchronization_updateImageSynchronizer_js__WEBPACK_IMPORTED_MODULE_30__["default"]; });
7074
7075/* harmony import */ var _synchronization_Synchronizer_js__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ./synchronization/Synchronizer.js */ "./synchronization/Synchronizer.js");
7076/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Synchronizer", function() { return _synchronization_Synchronizer_js__WEBPACK_IMPORTED_MODULE_31__["default"]; });
7077
7078/* harmony import */ var _synchronization_stackScrollSynchronizer_js__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! ./synchronization/stackScrollSynchronizer.js */ "./synchronization/stackScrollSynchronizer.js");
7079/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "stackScrollSynchronizer", function() { return _synchronization_stackScrollSynchronizer_js__WEBPACK_IMPORTED_MODULE_32__["default"]; });
7080
7081/* harmony import */ var _synchronization_stackImagePositionSynchronizer_js__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! ./synchronization/stackImagePositionSynchronizer.js */ "./synchronization/stackImagePositionSynchronizer.js");
7082/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "stackImagePositionSynchronizer", function() { return _synchronization_stackImagePositionSynchronizer_js__WEBPACK_IMPORTED_MODULE_33__["default"]; });
7083
7084/* harmony import */ var _synchronization_stackImagePositionOffsetSynchronizer_js__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! ./synchronization/stackImagePositionOffsetSynchronizer.js */ "./synchronization/stackImagePositionOffsetSynchronizer.js");
7085/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "stackImagePositionOffsetSynchronizer", function() { return _synchronization_stackImagePositionOffsetSynchronizer_js__WEBPACK_IMPORTED_MODULE_34__["default"]; });
7086
7087/* harmony import */ var _synchronization_stackImageIndexSynchronizer_js__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(/*! ./synchronization/stackImageIndexSynchronizer.js */ "./synchronization/stackImageIndexSynchronizer.js");
7088/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "stackImageIndexSynchronizer", function() { return _synchronization_stackImageIndexSynchronizer_js__WEBPACK_IMPORTED_MODULE_35__["default"]; });
7089
7090/* harmony import */ var _synchronization_panZoomSynchronizer_js__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(/*! ./synchronization/panZoomSynchronizer.js */ "./synchronization/panZoomSynchronizer.js");
7091/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "panZoomSynchronizer", function() { return _synchronization_panZoomSynchronizer_js__WEBPACK_IMPORTED_MODULE_36__["default"]; });
7092
7093/* harmony import */ var _requestPool_requestPoolManager_js__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(/*! ./requestPool/requestPoolManager.js */ "./requestPool/requestPoolManager.js");
7094/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "requestPoolManager", function() { return _requestPool_requestPoolManager_js__WEBPACK_IMPORTED_MODULE_37__["default"]; });
7095
7096/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(/*! ./externalModules.js */ "./externalModules.js");
7097/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "external", function() { return _externalModules_js__WEBPACK_IMPORTED_MODULE_38__["default"]; });
7098
7099/* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_39__ = __webpack_require__(/*! ./events.js */ "./events.js");
7100/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "EVENTS", function() { return _events_js__WEBPACK_IMPORTED_MODULE_39__["default"]; });
7101
7102/* harmony import */ var _version_js__WEBPACK_IMPORTED_MODULE_40__ = __webpack_require__(/*! ./version.js */ "./version.js");
7103/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "version", function() { return _version_js__WEBPACK_IMPORTED_MODULE_40__["default"]; });
7104
7105/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "import", function() { return _import_js__WEBPACK_IMPORTED_MODULE_3__["default"]; });
7106
7107/* harmony import */ var _lib_js__WEBPACK_IMPORTED_MODULE_41__ = __webpack_require__(/*! ./lib.js */ "./lib.js");
7108/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "lib", function() { return _lib_js__WEBPACK_IMPORTED_MODULE_41__["lib"]; });
7109
7110/**
7111 * Root
7112 * @namespace CornerstoneTools
7113 */
7114
7115/**
7116 * Drawing API to assist in consistent annotation creation
7117 * @namespace Drawing
7118 */
7119
7120/**
7121 * Event dispatchers listen for events from `cornerstone` and `enabledElements`. Dispatchers
7122 * choose which tool(s) get to handle the event by looking at callbacks, priority, and other factors.
7123 * @private
7124 * @namespace EventDispatchers
7125 */
7126
7127/**
7128 * Event listeners normalize events emitted by `cornerstone` and `enabledElements`. The listeners
7129 * then re-emit events prefixed with `cornerstonetools`. For example, `mousemove` becomes `cornerstonetoolsmousemove`.
7130 * Most of these events are caught by an `eventDispatcher`, and used to shape tool behavior.
7131 * @private
7132 * @namespace EventListeners
7133 */
7134
7135/**
7136 * Manipulators describe a tool's `handle` behavior. Leveraging a small set of manipulators
7137 * allows us to create a consistent experience when interacting with tools via their handles.
7138 * @namespace Manipulators
7139 */
7140
7141/**
7142 * Mixins are "tool beahviors" that can be added to a tool via its mixin
7143 * array configuration property
7144 * @namespace Mixins
7145 */
7146
7147/**
7148 * StateManagement
7149 * @namespace StateManagement
7150 */
7151
7152/**
7153 * Sync
7154 * @namespace Synchronization
7155 */
7156
7157/**
7158 * Third party
7159 * @namespace ThirdParty
7160 */
7161
7162/**
7163 * Tools
7164 * @namespace Tools
7165 */
7166
7167/**
7168 * Tools that extend the {@link #Tools.Base.BaseAnnotationTool|`BaseAnnotationTool`}
7169 * @namespace Tools.Annotation
7170 */
7171
7172/**
7173 * The parent (abstract) classes that all tools derive from.
7174 * @namespace Tools.Base
7175 */
7176
7177/**
7178 * Tools that extend the {@link #Tools.Base.BaseBrushTool|`BaseBrushTool`}
7179 * @namespace Tools.Brush
7180 */
7181
7182/**
7183 * Util
7184 * @namespace Util
7185 */
7186
7187
7188
7189
7190 // ~~~~~~ STACK TOOLS ~~~~~ //
7191
7192
7193
7194 // ~~~~~~ STATE MANAGEMENT ~~~~~ //
7195
7196
7197
7198
7199
7200
7201
7202
7203
7204
7205
7206
7207
7208
7209
7210
7211 // ~~~~~~ ORIENTATION  ~~~~~ //
7212
7213 // ~~~~~~ CANVAS EXPORT  ~~~~~ //
7214
7215
7216 // ~~~~~~ THIRD PARTY SUPPORT  ~~~~~ //
7217
7218
7219 // ~~~~~~ SYNCHRONIZERS ~~~~~ //
7220
7221
7222
7223
7224
7225
7226
7227
7228 // ~~~~~~ REQUEST POOL MANAGER  ~~~~~ //
7229
7230
7231
7232
7233
7234var cornerstoneTools = {
7235  // ~~~ TOOLS
7236  // ~ Annotation Tools
7237  AngleTool: _tools_annotation_index_js__WEBPACK_IMPORTED_MODULE_0__["AngleTool"],
7238  ArrowAnnotateTool: _tools_annotation_index_js__WEBPACK_IMPORTED_MODULE_0__["ArrowAnnotateTool"],
7239  BidirectionalTool: _tools_annotation_index_js__WEBPACK_IMPORTED_MODULE_0__["BidirectionalTool"],
7240  CircleRoiTool: _tools_annotation_index_js__WEBPACK_IMPORTED_MODULE_0__["CircleRoiTool"],
7241  CobbAngleTool: _tools_annotation_index_js__WEBPACK_IMPORTED_MODULE_0__["CobbAngleTool"],
7242  EllipticalRoiTool: _tools_annotation_index_js__WEBPACK_IMPORTED_MODULE_0__["EllipticalRoiTool"],
7243  FreehandMouseTool: _tools_annotation_index_js__WEBPACK_IMPORTED_MODULE_0__["FreehandMouseTool"],
7244  LengthTool: _tools_annotation_index_js__WEBPACK_IMPORTED_MODULE_0__["LengthTool"],
7245  ProbeTool: _tools_annotation_index_js__WEBPACK_IMPORTED_MODULE_0__["ProbeTool"],
7246  RectangleRoiTool: _tools_annotation_index_js__WEBPACK_IMPORTED_MODULE_0__["RectangleRoiTool"],
7247  TextMarkerTool: _tools_annotation_index_js__WEBPACK_IMPORTED_MODULE_0__["TextMarkerTool"],
7248  // ~ Brush Tools
7249  BrushTool: _tools_brush_index_js__WEBPACK_IMPORTED_MODULE_1__["BrushTool"],
7250  // ~ Tools
7251  CrosshairsTool: _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["CrosshairsTool"],
7252  DoubleTapFitToWindowTool: _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["DoubleTapFitToWindowTool"],
7253  DragProbeTool: _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["DragProbeTool"],
7254  EraserTool: _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["EraserTool"],
7255  FreehandSculpterMouseTool: _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["FreehandSculpterMouseTool"],
7256  MagnifyTool: _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["MagnifyTool"],
7257  PanMultiTouchTool: _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["PanMultiTouchTool"],
7258  PanTool: _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["PanTool"],
7259  ReferenceLinesTool: _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["ReferenceLinesTool"],
7260  RotateTool: _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["RotateTool"],
7261  RotateTouchTool: _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["RotateTouchTool"],
7262  ScaleOverlayTool: _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["ScaleOverlayTool"],
7263  StackScrollMouseWheelTool: _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["StackScrollMouseWheelTool"],
7264  StackScrollMultiTouchTool: _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["StackScrollMultiTouchTool"],
7265  StackScrollTool: _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["StackScrollTool"],
7266  WwwcRegionTool: _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["WwwcRegionTool"],
7267  WwwcTool: _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["WwwcTool"],
7268  ZoomMouseWheelTool: _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["ZoomMouseWheelTool"],
7269  ZoomTool: _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["ZoomTool"],
7270  ZoomTouchPinchTool: _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["ZoomTouchPinchTool"],
7271  init: _init_js__WEBPACK_IMPORTED_MODULE_4__["default"],
7272  stackPrefetch: _stackTools_stackPrefetch_js__WEBPACK_IMPORTED_MODULE_5__["default"],
7273  stackRenderers: _stackTools_stackRenderers_js__WEBPACK_IMPORTED_MODULE_6__["default"],
7274  playClip: _stackTools_playClip_js__WEBPACK_IMPORTED_MODULE_7__["playClip"],
7275  stopClip: _stackTools_playClip_js__WEBPACK_IMPORTED_MODULE_7__["stopClip"],
7276  store: _store_index_js__WEBPACK_IMPORTED_MODULE_8__["default"],
7277  getToolForElement: _store_getToolForElement_js__WEBPACK_IMPORTED_MODULE_9__["default"],
7278  addTool: _store_addTool_js__WEBPACK_IMPORTED_MODULE_10__["addTool"],
7279  addToolForElement: _store_addTool_js__WEBPACK_IMPORTED_MODULE_10__["addToolForElement"],
7280  removeTool: _store_removeTool_js__WEBPACK_IMPORTED_MODULE_11__["removeTool"],
7281  removeToolForElement: _store_removeTool_js__WEBPACK_IMPORTED_MODULE_11__["removeToolForElement"],
7282  setToolOptions: _store_setToolOptions_js__WEBPACK_IMPORTED_MODULE_12__["setToolOptions"],
7283  setToolOptionsForElement: _store_setToolOptions_js__WEBPACK_IMPORTED_MODULE_12__["setToolOptionsForElement"],
7284  setToolActive: _store_setToolMode_js__WEBPACK_IMPORTED_MODULE_13__["setToolActive"],
7285  setToolActiveForElement: _store_setToolMode_js__WEBPACK_IMPORTED_MODULE_13__["setToolActiveForElement"],
7286  setToolEnabled: _store_setToolMode_js__WEBPACK_IMPORTED_MODULE_13__["setToolEnabled"],
7287  setToolEnabledForElement: _store_setToolMode_js__WEBPACK_IMPORTED_MODULE_13__["setToolEnabledForElement"],
7288  setToolDisabled: _store_setToolMode_js__WEBPACK_IMPORTED_MODULE_13__["setToolDisabled"],
7289  setToolDisabledForElement: _store_setToolMode_js__WEBPACK_IMPORTED_MODULE_13__["setToolDisabledForElement"],
7290  setToolPassive: _store_setToolMode_js__WEBPACK_IMPORTED_MODULE_13__["setToolPassive"],
7291  setToolPassiveForElement: _store_setToolMode_js__WEBPACK_IMPORTED_MODULE_13__["setToolPassiveForElement"],
7292  addToolState: _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_14__["addToolState"],
7293  getToolState: _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_14__["getToolState"],
7294  removeToolState: _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_14__["removeToolState"],
7295  clearToolState: _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_14__["clearToolState"],
7296  setElementToolStateManager: _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_14__["setElementToolStateManager"],
7297  getElementToolStateManager: _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_14__["getElementToolStateManager"],
7298  textStyle: _stateManagement_textStyle_js__WEBPACK_IMPORTED_MODULE_15__["default"],
7299  toolStyle: _stateManagement_toolStyle_js__WEBPACK_IMPORTED_MODULE_16__["default"],
7300  toolColors: _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_17__["default"],
7301  toolCoordinates: _stateManagement_toolCoordinates_js__WEBPACK_IMPORTED_MODULE_18__["default"],
7302  stackSpecificStateManager: _stateManagement_stackSpecificStateManager_js__WEBPACK_IMPORTED_MODULE_19__["stackSpecificStateManager"],
7303  newStackSpecificToolStateManager: _stateManagement_stackSpecificStateManager_js__WEBPACK_IMPORTED_MODULE_19__["newStackSpecificToolStateManager"],
7304  addStackStateManager: _stateManagement_stackSpecificStateManager_js__WEBPACK_IMPORTED_MODULE_19__["addStackStateManager"],
7305  loadHandlerManager: _stateManagement_loadHandlerManager_js__WEBPACK_IMPORTED_MODULE_20__["default"],
7306  newImageIdSpecificToolStateManager: _stateManagement_imageIdSpecificStateManager_js__WEBPACK_IMPORTED_MODULE_21__["newImageIdSpecificToolStateManager"],
7307  globalImageIdSpecificToolStateManager: _stateManagement_imageIdSpecificStateManager_js__WEBPACK_IMPORTED_MODULE_21__["globalImageIdSpecificToolStateManager"],
7308  newFrameOfReferenceSpecificToolStateManager: _stateManagement_frameOfReferenceStateManager_js__WEBPACK_IMPORTED_MODULE_22__["newFrameOfReferenceSpecificToolStateManager"],
7309  globalFrameOfReferenceSpecificToolStateManager: _stateManagement_frameOfReferenceStateManager_js__WEBPACK_IMPORTED_MODULE_22__["globalFrameOfReferenceSpecificToolStateManager"],
7310  forceEnabledElementResize: _eventListeners_windowResizeHandler_js__WEBPACK_IMPORTED_MODULE_23__["forceEnabledElementResize"],
7311  orientation: _orientation_index_js__WEBPACK_IMPORTED_MODULE_24__["default"],
7312  SaveAs: _util_SaveAs_js__WEBPACK_IMPORTED_MODULE_25__["default"],
7313  enableLogger: _util_logger_js__WEBPACK_IMPORTED_MODULE_26__["enable"],
7314  disableLogger: _util_logger_js__WEBPACK_IMPORTED_MODULE_26__["disable"],
7315  import: _import_js__WEBPACK_IMPORTED_MODULE_3__["default"],
7316  register: _thirdParty_register_js__WEBPACK_IMPORTED_MODULE_27__["default"],
7317  registerSome: _thirdParty_registerSome_js__WEBPACK_IMPORTED_MODULE_28__["default"],
7318  wwwcSynchronizer: _synchronization_wwwcSynchronizer_js__WEBPACK_IMPORTED_MODULE_29__["default"],
7319  updateImageSynchronizer: _synchronization_updateImageSynchronizer_js__WEBPACK_IMPORTED_MODULE_30__["default"],
7320  Synchronizer: _synchronization_Synchronizer_js__WEBPACK_IMPORTED_MODULE_31__["default"],
7321  stackScrollSynchronizer: _synchronization_stackScrollSynchronizer_js__WEBPACK_IMPORTED_MODULE_32__["default"],
7322  stackImagePositionSynchronizer: _synchronization_stackImagePositionSynchronizer_js__WEBPACK_IMPORTED_MODULE_33__["default"],
7323  stackImagePositionOffsetSynchronizer: _synchronization_stackImagePositionOffsetSynchronizer_js__WEBPACK_IMPORTED_MODULE_34__["default"],
7324  stackImageIndexSynchronizer: _synchronization_stackImageIndexSynchronizer_js__WEBPACK_IMPORTED_MODULE_35__["default"],
7325  panZoomSynchronizer: _synchronization_panZoomSynchronizer_js__WEBPACK_IMPORTED_MODULE_36__["default"],
7326  requestPoolManager: _requestPool_requestPoolManager_js__WEBPACK_IMPORTED_MODULE_37__["default"],
7327  external: _externalModules_js__WEBPACK_IMPORTED_MODULE_38__["default"],
7328  EVENTS: _events_js__WEBPACK_IMPORTED_MODULE_39__["default"],
7329  version: _version_js__WEBPACK_IMPORTED_MODULE_40__["default"],
7330  lib: _lib_js__WEBPACK_IMPORTED_MODULE_41__["lib"]
7331}; // Named Exports
7332
7333 // This has a weird name, so we can't just import it as 'import';
7334
7335
7336/* harmony default export */ __webpack_exports__["default"] = (cornerstoneTools);
7337
7338/***/ }),
7339
7340/***/ "./init.js":
7341/*!*****************!*\
7342  !*** ./init.js ***!
7343  \*****************/
7344/*! exports provided: default */
7345/***/ (function(module, __webpack_exports__, __webpack_require__) {
7346
7347"use strict";
7348__webpack_require__.r(__webpack_exports__);
7349/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./externalModules.js */ "./externalModules.js");
7350/* harmony import */ var _store_index_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./store/index.js */ "./store/index.js");
7351/* harmony import */ var _store_internals_addEnabledElement_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./store/internals/addEnabledElement.js */ "./store/internals/addEnabledElement.js");
7352/* harmony import */ var _store_internals_removeEnabledElement_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./store/internals/removeEnabledElement.js */ "./store/internals/removeEnabledElement.js");
7353/* harmony import */ var _eventListeners_windowResizeHandler_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./eventListeners/windowResizeHandler.js */ "./eventListeners/windowResizeHandler.js");
7354
7355
7356
7357
7358
7359/**
7360 * Merges the provided configuration with default values and returns a
7361 * configured CornerstoneTools instance.
7362 * @export
7363 * @public
7364 * @method
7365 * @name init
7366 *
7367 * @param {Object} configuration
7368 * @returns {Object} A configured CornerstoneTools instance with top level API members.
7369 */
7370
7371/* harmony default export */ __webpack_exports__["default"] = (function (configuration) {
7372  _addCornerstoneEventListeners();
7373
7374  _initModules();
7375
7376  _eventListeners_windowResizeHandler_js__WEBPACK_IMPORTED_MODULE_4__["default"].enable(); // Apply global configuration
7377
7378  _store_index_js__WEBPACK_IMPORTED_MODULE_1__["default"].modules.globalConfiguration.state = Object.assign({}, _store_index_js__WEBPACK_IMPORTED_MODULE_1__["default"].modules.globalConfiguration.state, configuration);
7379});
7380/**
7381 * Wires up event listeners for the Cornerstone#ElementDisabled and
7382 * Cornerstone#ElementEnabled events.
7383 * @private
7384 * @method
7385 * @returns {void}
7386 */
7387
7388function _addCornerstoneEventListeners() {
7389  // Clear any listeners that may already be set
7390  _removeCornerstoneEventListeners();
7391
7392  var cornerstone = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone;
7393  var elementEnabledEvent = cornerstone.EVENTS.ELEMENT_ENABLED;
7394  var elementDisabledEvent = cornerstone.EVENTS.ELEMENT_DISABLED;
7395  cornerstone.events.addEventListener(elementEnabledEvent, _store_internals_addEnabledElement_js__WEBPACK_IMPORTED_MODULE_2__["default"]);
7396  cornerstone.events.addEventListener(elementDisabledEvent, _store_internals_removeEnabledElement_js__WEBPACK_IMPORTED_MODULE_3__["default"]);
7397}
7398/**
7399 * Removes event listeners for the Cornerstone#ElementDisabled and
7400 * Cornerstone#ElementEnabled events.
7401 * @private
7402 * @method
7403 * @returns {void}
7404 */
7405
7406
7407function _removeCornerstoneEventListeners() {
7408  var cornerstone = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone;
7409  var elementEnabledEvent = cornerstone.EVENTS.ELEMENT_ENABLED;
7410  var elementDisabledEvent = cornerstone.EVENTS.ELEMENT_DISABLED;
7411  cornerstone.events.removeEventListener(elementEnabledEvent, _store_internals_addEnabledElement_js__WEBPACK_IMPORTED_MODULE_2__["default"]);
7412  cornerstone.events.removeEventListener(elementDisabledEvent, _store_internals_removeEnabledElement_js__WEBPACK_IMPORTED_MODULE_3__["default"]);
7413}
7414/*
7415 * TODO: This could cause issues if the module was already initialized for
7416 * the store. As there's nothing stopping implementers from calling `init`
7417 * multiple times. Modules should self-check if they have already been
7418 * registered to prevent issues.
7419 */
7420
7421/**
7422 * Iterate over our store's modules. If the module has an `onRegisterCallback`
7423 * call it. This hook can be used to setup any global store requirements per
7424 * module.
7425 * @private
7426 * @method
7427 * @returns {void}
7428 */
7429
7430
7431function _initModules() {
7432  var modules = _store_index_js__WEBPACK_IMPORTED_MODULE_1__["default"].modules;
7433  Object.keys(modules).forEach(function (key) {
7434    if (typeof modules[key].onRegisterCallback === 'function') {
7435      modules[key].onRegisterCallback();
7436    }
7437  });
7438}
7439
7440/***/ }),
7441
7442/***/ "./lib.js":
7443/*!****************!*\
7444  !*** ./lib.js ***!
7445  \****************/
7446/*! exports provided: lib */
7447/***/ (function(module, __webpack_exports__, __webpack_require__) {
7448
7449"use strict";
7450__webpack_require__.r(__webpack_exports__);
7451/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "lib", function() { return lib; });
7452/* harmony import */ var _tools_base_BaseTool_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./tools/base/BaseTool.js */ "./tools/base/BaseTool.js");
7453/* harmony import */ var _tools_base_BaseAnnotationTool_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./tools/base/BaseAnnotationTool.js */ "./tools/base/BaseAnnotationTool.js");
7454/* harmony import */ var _tools_base_BaseBrushTool_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tools/base/BaseBrushTool.js */ "./tools/base/BaseBrushTool.js");
7455/* harmony import */ var _manipulators_index_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./manipulators/index.js */ "./manipulators/index.js");
7456/* harmony import */ var _util_findAndMoveHelpers_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./util/findAndMoveHelpers.js */ "./util/findAndMoveHelpers.js");
7457/* harmony import */ var _mixins_index_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./mixins/index.js */ "./mixins/index.js");
7458/* harmony import */ var _tools_cursors_index_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./tools/cursors/index.js */ "./tools/cursors/index.js");
7459/* harmony import */ var _drawing_index_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./drawing/index.js */ "./drawing/index.js");
7460/* harmony import */ var _drawing_drawTextBox_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./drawing/drawTextBox.js */ "./drawing/drawTextBox.js");
7461/* harmony import */ var _drawing_drawArrow_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./drawing/drawArrow.js */ "./drawing/drawArrow.js");
7462/* harmony import */ var _drawing_drawLink_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./drawing/drawLink.js */ "./drawing/drawLink.js");
7463/* harmony import */ var _drawing_drawLinkedTextBox_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./drawing/drawLinkedTextBox.js */ "./drawing/drawLinkedTextBox.js");
7464/* harmony import */ var _drawing_drawHandles_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./drawing/drawHandles.js */ "./drawing/drawHandles.js");
7465/* harmony import */ var _util_getLuminance_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./util/getLuminance.js */ "./util/getLuminance.js");
7466/* harmony import */ var _util_copyPoints_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./util/copyPoints.js */ "./util/copyPoints.js");
7467/* harmony import */ var _util_calculateSUV_js__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./util/calculateSUV.js */ "./util/calculateSUV.js");
7468/* harmony import */ var _util_setContextToDisplayFontSize_js__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./util/setContextToDisplayFontSize.js */ "./util/setContextToDisplayFontSize.js");
7469/* harmony import */ var _util_scrollToIndex_js__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./util/scrollToIndex.js */ "./util/scrollToIndex.js");
7470/* harmony import */ var _util_scroll_js__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./util/scroll.js */ "./util/scroll.js");
7471/* harmony import */ var _util_roundToDecimal_js__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./util/roundToDecimal.js */ "./util/roundToDecimal.js");
7472/* harmony import */ var _util_pointProjector_js__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./util/pointProjector.js */ "./util/pointProjector.js");
7473/* harmony import */ var _util_lineSegDistance_js__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./util/lineSegDistance.js */ "./util/lineSegDistance.js");
7474/* harmony import */ var _util_pointInsideBoundingBox_js__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./util/pointInsideBoundingBox.js */ "./util/pointInsideBoundingBox.js");
7475/* harmony import */ var _util_makeUnselectable_js__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ./util/makeUnselectable.js */ "./util/makeUnselectable.js");
7476/* harmony import */ var _util_getRGBPixels_js__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ./util/getRGBPixels.js */ "./util/getRGBPixels.js");
7477/* harmony import */ var _util_getMaxSimultaneousRequests_js__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ./util/getMaxSimultaneousRequests.js */ "./util/getMaxSimultaneousRequests.js");
7478/* harmony import */ var _util_angleBetweenPoints_js__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ./util/angleBetweenPoints.js */ "./util/angleBetweenPoints.js");
7479/* harmony import */ var _util_getKeyFromKeyCode_js__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ./util/getKeyFromKeyCode.js */ "./util/getKeyFromKeyCode.js");
7480/* harmony import */ var _util_numbersWithCommas_js__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ./util/numbersWithCommas.js */ "./util/numbersWithCommas.js");
7481/* harmony import */ var _tools_cursors_MouseCursor_js__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ./tools/cursors/MouseCursor.js */ "./tools/cursors/MouseCursor.js");
7482/* harmony import */ var _util_ellipse_index_js__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ./util/ellipse/index.js */ "./util/ellipse/index.js");
7483/* harmony import */ var _util_freehand_index_js__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ./util/freehand/index.js */ "./util/freehand/index.js");
7484/* harmony import */ var _util_brush_index_js__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! ./util/brush/index.js */ "./util/brush/index.js");
7485/* harmony import */ var _util_zoom_index_js__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! ./util/zoom/index.js */ "./util/zoom/index.js");
7486/* harmony import */ var _util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! ./util/triggerEvent.js */ "./util/triggerEvent.js");
7487/* harmony import */ var _util_convertToVector3_js__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(/*! ./util/convertToVector3.js */ "./util/convertToVector3.js");
7488
7489
7490
7491
7492
7493
7494
7495
7496
7497
7498
7499
7500
7501
7502
7503
7504
7505
7506
7507
7508
7509
7510
7511
7512
7513
7514
7515
7516
7517
7518
7519
7520
7521
7522
7523
7524var lib = {
7525  'base/BaseTool': _tools_base_BaseTool_js__WEBPACK_IMPORTED_MODULE_0__["default"],
7526  'base/BaseAnnotationTool': _tools_base_BaseAnnotationTool_js__WEBPACK_IMPORTED_MODULE_1__["default"],
7527  'base/BaseBrushTool': _tools_base_BaseBrushTool_js__WEBPACK_IMPORTED_MODULE_2__["default"],
7528  'tools/cursors/MouseCursor': _tools_cursors_MouseCursor_js__WEBPACK_IMPORTED_MODULE_29__["default"],
7529  'tools/cursors': _tools_cursors_index_js__WEBPACK_IMPORTED_MODULE_6__,
7530  'manipulators/anyHandlesOutsideImage': _manipulators_index_js__WEBPACK_IMPORTED_MODULE_3__["anyHandlesOutsideImage"],
7531  'manipulators/getHandleNearImagePoint': _manipulators_index_js__WEBPACK_IMPORTED_MODULE_3__["getHandleNearImagePoint"],
7532  'manipulators/handleActivator': _manipulators_index_js__WEBPACK_IMPORTED_MODULE_3__["handleActivator"],
7533  'manipulators/moveAllHandles': _manipulators_index_js__WEBPACK_IMPORTED_MODULE_3__["moveAllHandles"],
7534  'manipulators/moveHandle': _manipulators_index_js__WEBPACK_IMPORTED_MODULE_3__["moveHandle"],
7535  'manipulators/moveNewHandle': _manipulators_index_js__WEBPACK_IMPORTED_MODULE_3__["moveNewHandle"],
7536  'manipulators/moveHandleNearImagePoint': _util_findAndMoveHelpers_js__WEBPACK_IMPORTED_MODULE_4__["moveHandleNearImagePoint"],
7537  'manipulators/findHandleDataNearImagePoint': _util_findAndMoveHelpers_js__WEBPACK_IMPORTED_MODULE_4__["findHandleDataNearImagePoint"],
7538  'manipulators/moveAnnotation': _util_findAndMoveHelpers_js__WEBPACK_IMPORTED_MODULE_4__["moveAnnotation"],
7539  'mixins/activeOrDisabledBinaryTool': _mixins_index_js__WEBPACK_IMPORTED_MODULE_5__["default"].activeOrDisabledBinaryTool,
7540  'mixins/enabledOrDisabledBinaryTool': _mixins_index_js__WEBPACK_IMPORTED_MODULE_5__["default"].enabledOrDisabledBinaryTool,
7541  'drawing/getNewContext': _drawing_index_js__WEBPACK_IMPORTED_MODULE_7__["getNewContext"],
7542  'drawing/draw': _drawing_index_js__WEBPACK_IMPORTED_MODULE_7__["draw"],
7543  'drawing/path': _drawing_index_js__WEBPACK_IMPORTED_MODULE_7__["path"],
7544  'drawing/setShadow': _drawing_index_js__WEBPACK_IMPORTED_MODULE_7__["setShadow"],
7545  'drawing/drawLine': _drawing_index_js__WEBPACK_IMPORTED_MODULE_7__["drawLine"],
7546  'drawing/drawLines': _drawing_index_js__WEBPACK_IMPORTED_MODULE_7__["drawLines"],
7547  'drawing/drawJoinedLines': _drawing_index_js__WEBPACK_IMPORTED_MODULE_7__["drawJoinedLines"],
7548  'drawing/drawCircle': _drawing_index_js__WEBPACK_IMPORTED_MODULE_7__["drawCircle"],
7549  'drawing/drawEllipse': _drawing_index_js__WEBPACK_IMPORTED_MODULE_7__["drawEllipse"],
7550  'drawing/drawRect': _drawing_index_js__WEBPACK_IMPORTED_MODULE_7__["drawRect"],
7551  'drawing/fillOutsideRect': _drawing_index_js__WEBPACK_IMPORTED_MODULE_7__["fillOutsideRect"],
7552  'drawing/drawTextBox': _drawing_drawTextBox_js__WEBPACK_IMPORTED_MODULE_8__["default"],
7553  'drawing/drawArrow': _drawing_drawArrow_js__WEBPACK_IMPORTED_MODULE_9__["default"],
7554  'drawing/fillBox': _drawing_index_js__WEBPACK_IMPORTED_MODULE_7__["fillBox"],
7555  'drawing/fillTextLines': _drawing_index_js__WEBPACK_IMPORTED_MODULE_7__["fillTextLines"],
7556  'drawing/drawLink': _drawing_drawLink_js__WEBPACK_IMPORTED_MODULE_10__["default"],
7557  'drawing/drawLinkedTextBox': _drawing_drawLinkedTextBox_js__WEBPACK_IMPORTED_MODULE_11__["default"],
7558  'drawing/drawHandles': _drawing_drawHandles_js__WEBPACK_IMPORTED_MODULE_12__["default"],
7559  'drawing/textBoxWidth': _drawing_drawTextBox_js__WEBPACK_IMPORTED_MODULE_8__["textBoxWidth"],
7560  'util/getLuminance': _util_getLuminance_js__WEBPACK_IMPORTED_MODULE_13__["default"],
7561  'util/copyPoints': _util_copyPoints_js__WEBPACK_IMPORTED_MODULE_14__["default"],
7562  'util/calculateSUV': _util_calculateSUV_js__WEBPACK_IMPORTED_MODULE_15__["default"],
7563  'util/setContextToDisplayFontSize': _util_setContextToDisplayFontSize_js__WEBPACK_IMPORTED_MODULE_16__["default"],
7564  'util/scrollToIndex': _util_scrollToIndex_js__WEBPACK_IMPORTED_MODULE_17__["default"],
7565  'util/scroll': _util_scroll_js__WEBPACK_IMPORTED_MODULE_18__["default"],
7566  'util/roundToDecimal': _util_roundToDecimal_js__WEBPACK_IMPORTED_MODULE_19__["default"],
7567  'util/projectPatientPointToImagePlane': _util_pointProjector_js__WEBPACK_IMPORTED_MODULE_20__["projectPatientPointToImagePlane"],
7568  'util/imagePointToPatientPoint': _util_pointProjector_js__WEBPACK_IMPORTED_MODULE_20__["imagePointToPatientPoint"],
7569  'util/planePlaneIntersection': _util_pointProjector_js__WEBPACK_IMPORTED_MODULE_20__["planePlaneIntersection"],
7570  'util/pointInsideBoundingBox': _util_pointInsideBoundingBox_js__WEBPACK_IMPORTED_MODULE_22__["default"],
7571  'util/makeUnselectable': _util_makeUnselectable_js__WEBPACK_IMPORTED_MODULE_23__["default"],
7572  'util/getRGBPixels': _util_getRGBPixels_js__WEBPACK_IMPORTED_MODULE_24__["default"],
7573  'util/getDefaultSimultaneousRequests': _util_getMaxSimultaneousRequests_js__WEBPACK_IMPORTED_MODULE_25__["getDefaultSimultaneousRequests"],
7574  'util/getMaxSimultaneousRequests': _util_getMaxSimultaneousRequests_js__WEBPACK_IMPORTED_MODULE_25__["getMaxSimultaneousRequests"],
7575  'util/getBrowserInfo': _util_getMaxSimultaneousRequests_js__WEBPACK_IMPORTED_MODULE_25__["getBrowserInfo"],
7576  'util/isMobileDevice': _util_getMaxSimultaneousRequests_js__WEBPACK_IMPORTED_MODULE_25__["isMobileDevice"],
7577  'util/angleBetweenPoints': _util_angleBetweenPoints_js__WEBPACK_IMPORTED_MODULE_26__["default"],
7578  'util/getKeyFromKeyCode': _util_getKeyFromKeyCode_js__WEBPACK_IMPORTED_MODULE_27__["default"],
7579  'util/numbersWithCommas': _util_numbersWithCommas_js__WEBPACK_IMPORTED_MODULE_28__["default"],
7580  'util/lineSegDistance': _util_lineSegDistance_js__WEBPACK_IMPORTED_MODULE_21__["default"],
7581  'util/triggerEvent': _util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_34__["default"],
7582  'util/convertToVectro3': _util_convertToVector3_js__WEBPACK_IMPORTED_MODULE_35__["default"],
7583  // Whole tool specific util packages
7584  'util/ellipseUtils': _util_ellipse_index_js__WEBPACK_IMPORTED_MODULE_30__["default"],
7585  'util/freehandUtils': _util_freehand_index_js__WEBPACK_IMPORTED_MODULE_31__["default"],
7586  'util/brushUtils': _util_brush_index_js__WEBPACK_IMPORTED_MODULE_32__["default"],
7587  'util/zoomUtils': _util_zoom_index_js__WEBPACK_IMPORTED_MODULE_33__["default"]
7588};
7589
7590/***/ }),
7591
7592/***/ "./manipulators/anyHandlesOutsideImage.js":
7593/*!************************************************!*\
7594  !*** ./manipulators/anyHandlesOutsideImage.js ***!
7595  \************************************************/
7596/*! exports provided: default */
7597/***/ (function(module, __webpack_exports__, __webpack_require__) {
7598
7599"use strict";
7600__webpack_require__.r(__webpack_exports__);
7601/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js");
7602
7603/**
7604 * Determine if a handle is outside the bounds of the rendered image.
7605 * @public
7606 * @function anyHandlesOutsideImage
7607 * @memberof Manipulators
7608 *
7609 * @param {*} renderData - Cornerstone Tool's event detail
7610 * @param {Object} handles - An object containing named handles
7611 * @returns {Boolean} - True if the handle was placed outside the image
7612 */
7613
7614/* harmony default export */ __webpack_exports__["default"] = (function (renderData, handles) {
7615  var image = renderData.image;
7616  var imageRect = {
7617    left: 0,
7618    top: 0,
7619    width: image.width,
7620    height: image.height
7621  };
7622  var handleOutsideImage = false;
7623  Object.keys(handles).forEach(function (name) {
7624    var handle = handles[name];
7625
7626    if (handle.allowedOutsideImage === true) {
7627      return;
7628    }
7629
7630    if (_externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstoneMath.point.insideRect(handle, imageRect) === false) {
7631      handleOutsideImage = true;
7632    }
7633  });
7634  return handleOutsideImage;
7635});
7636
7637/***/ }),
7638
7639/***/ "./manipulators/getHandleNearImagePoint.js":
7640/*!*************************************************!*\
7641  !*** ./manipulators/getHandleNearImagePoint.js ***!
7642  \*************************************************/
7643/*! exports provided: default */
7644/***/ (function(module, __webpack_exports__, __webpack_require__) {
7645
7646"use strict";
7647__webpack_require__.r(__webpack_exports__);
7648/* harmony import */ var _babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/typeof */ "../node_modules/@babel/runtime/helpers/typeof.js");
7649/* harmony import */ var _babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0__);
7650/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js");
7651/* harmony import */ var _util_pointInsideBoundingBox_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../util/pointInsideBoundingBox.js */ "./util/pointInsideBoundingBox.js");
7652
7653
7654
7655/**
7656 * Returns the first handle found to be near the provided point. Handles to search can be an array of handles, an
7657 * object of named handles, or an object of named handles AND named arrays of handles.
7658 *
7659 * @public
7660 * @function getHandleNearImagePoint
7661 * @memberof Manipulators
7662 *
7663 * @param {*} element - Target enabledElement
7664 * @param {(Array|Object)} handles - An arry of handles, object with named handles, or object with named handles AND named arrays of handles
7665 * @param {Object} coords - The coordinates to measure from when determining distance from handles
7666 * @param {number} distanceThreshold - minimum distance handle needs to be from provided coords
7667 * @returns {Object} Handle
7668 */
7669
7670var getHandleNearImagePoint = function getHandleNearImagePoint(element, handles, coords, distanceThreshold) {
7671  var nearbyHandle;
7672
7673  if (!handles) {
7674    return;
7675  }
7676
7677  if (Array.isArray(handles)) {
7678    var handleKeys = Object.keys(handles);
7679
7680    for (var i = 0; i < handleKeys.length; i++) {
7681      var key = handleKeys[i];
7682      var handle = handles[key];
7683
7684      if ( // Not a true handle
7685      !handle.hasOwnProperty('x') || !handle.hasOwnProperty('y')) {
7686        continue;
7687      }
7688
7689      if (_isHandleNearImagePoint(handle, element, coords, distanceThreshold)) {
7690        nearbyHandle = handle;
7691        break;
7692      }
7693    }
7694  } else if (_babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0___default()(handles) === 'object') {
7695    var _handleKeys = Object.keys(handles);
7696
7697    for (var _i = 0; _i < _handleKeys.length; _i++) {
7698      var handleName = _handleKeys[_i];
7699
7700      if (Array.isArray(handles[handleName])) {
7701        nearbyHandle = getHandleNearImagePoint(element, handles[handleName], coords, distanceThreshold);
7702
7703        if (nearbyHandle) {
7704          break;
7705        }
7706      } else {
7707        var _handle = handles[handleName];
7708
7709        if (_isHandleNearImagePoint(_handle, element, coords, distanceThreshold)) {
7710          nearbyHandle = _handle;
7711          break;
7712        }
7713      }
7714    }
7715  }
7716
7717  return nearbyHandle;
7718};
7719/**
7720 * Determines if the handle is less than the provided distance from the  provided coordinates
7721 * @private
7722 * @function _isHandleNearImagePoint
7723 *
7724 * @param {*} handle
7725 * @param {*} element
7726 * @param {*} coords
7727 * @param {*} distanceThreshold
7728 * @returns {boolean} true if handles is near image point
7729 */
7730
7731
7732var _isHandleNearImagePoint = function _isHandleNearImagePoint(handle, element, coords, distanceThreshold) {
7733  if (handle.hasOwnProperty('pointNearHandle')) {
7734    if (handle.pointNearHandle(element, handle, coords)) {
7735      return true;
7736    }
7737  } else if (handle.hasBoundingBox === true) {
7738    if (Object(_util_pointInsideBoundingBox_js__WEBPACK_IMPORTED_MODULE_2__["default"])(handle, coords)) {
7739      return true;
7740    }
7741  } else {
7742    var handleCanvas = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pixelToCanvas(element, handle);
7743    var distance = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstoneMath.point.distance(handleCanvas, coords);
7744
7745    if (distance <= distanceThreshold) {
7746      return true;
7747    }
7748  }
7749
7750  return false;
7751};
7752
7753/* harmony default export */ __webpack_exports__["default"] = (getHandleNearImagePoint);
7754
7755/***/ }),
7756
7757/***/ "./manipulators/handleActivator.js":
7758/*!*****************************************!*\
7759  !*** ./manipulators/handleActivator.js ***!
7760  \*****************************************/
7761/*! exports provided: default */
7762/***/ (function(module, __webpack_exports__, __webpack_require__) {
7763
7764"use strict";
7765__webpack_require__.r(__webpack_exports__);
7766/* harmony import */ var _getHandleNearImagePoint_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getHandleNearImagePoint.js */ "./manipulators/getHandleNearImagePoint.js");
7767
7768/**
7769 * Update the active handle
7770 * @public
7771 * @function handleActivator
7772 * @memberof Manipulators
7773 *
7774 * @param {*} element
7775 * @param {*} handles
7776 * @param {*} canvasPoint
7777 * @param {*} distanceThreshold
7778 * @returns {Boolean} - True if a handle was activated
7779 */
7780
7781/* harmony default export */ __webpack_exports__["default"] = (function (element, handles, canvasPoint, distanceThreshold) {
7782  if (!distanceThreshold) {
7783    distanceThreshold = 6;
7784  }
7785
7786  var activeHandle = _getActiveHandle(handles);
7787
7788  var nearbyHandle = Object(_getHandleNearImagePoint_js__WEBPACK_IMPORTED_MODULE_0__["default"])(element, handles, canvasPoint, distanceThreshold);
7789
7790  if (activeHandle !== nearbyHandle) {
7791    if (nearbyHandle !== undefined) {
7792      nearbyHandle.active = true;
7793    }
7794
7795    if (activeHandle !== undefined) {
7796      activeHandle.active = false;
7797    }
7798
7799    return true;
7800  }
7801
7802  return false;
7803});
7804/**
7805 *
7806 * @private
7807 *
7808 * @param {*} handles
7809 * @returns {Object} - Activated Handle
7810 */
7811
7812function _getActiveHandle(handles) {
7813  var activeHandle;
7814  Object.keys(handles).forEach(function (name) {
7815    var handle = handles[name];
7816
7817    if (handle.active === true) {
7818      activeHandle = handle;
7819      return;
7820    }
7821  });
7822  return activeHandle;
7823}
vendor: 22 bytes, lines 7823-7827
7823
7824
7825/***/ }),
7826
7827/***/ "./
7827manipulators/index.js":
7828/*!*******************************!*\
7829  !*** ./manipulators/index.js ***!
7830  \*******************************/
7831/*! exports provided: anyHandlesOutsideImage, getHandleNearImagePoint, handleActivator, moveAllHandles, moveHandle, moveNewHandle */
7832/***/ (function(module, __webpack_exports__, __webpack_require__) {
7833
7834"use strict";
7835__webpack_require__.r(__webpack_exports__);
7836/* harmony import */ var _anyHandlesOutsideImage_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./anyHandlesOutsideImage.js */ "./manipulators/anyHandlesOutsideImage.js");
7837/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "anyHandlesOutsideImage", function() { return _anyHandlesOutsideImage_js__WEBPACK_IMPORTED_MODULE_0__["default"]; });
7838
7839/* harmony import */ var _getHandleNearImagePoint_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./getHandleNearImagePoint.js */ "./manipulators/getHandleNearImagePoint.js");
7840/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getHandleNearImagePoint", function() { return _getHandleNearImagePoint_js__WEBPACK_IMPORTED_MODULE_1__["default"]; });
7841
7842/* harmony import */ var _handleActivator_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./handleActivator.js */ "./manipulators/handleActivator.js");
7843/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "handleActivator", function() { return _handleActivator_js__WEBPACK_IMPORTED_MODULE_2__["default"]; });
7844
7845/* harmony import */ var _moveAllHandles_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./moveAllHandles.js */ "./manipulators/moveAllHandles.js");
7846/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "moveAllHandles", function() { return _moveAllHandles_js__WEBPACK_IMPORTED_MODULE_3__["default"]; });
7847
7848/* harmony import */ var _moveHandle_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./moveHandle.js */ "./manipulators/moveHandle.js");
7849/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "moveHandle", function() { return _moveHandle_js__WEBPACK_IMPORTED_MODULE_4__["default"]; });
7850
7851/* harmony import */ var _moveNewHandle_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./moveNewHandle.js */ "./manipulators/moveNewHandle.js");
7852/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "moveNewHandle", function() { return _moveNewHandle_js__WEBPACK_IMPORTED_MODULE_5__["default"]; });
7853
7854
7855
7856
7857
7858
7859
7860
7861
7862/***/ }),
7863
7864/***/ "./manipulators/moveAllHandles.js":
7865/*!****************************************!*\
7866  !*** ./manipulators/moveAllHandles.js ***!
7867  \****************************************/
7868/*! exports provided: default */
7869/***/ (function(module, __webpack_exports__, __webpack_require__) {
7870
7871"use strict";
7872__webpack_require__.r(__webpack_exports__);
7873/* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../events.js */ "./events.js");
7874/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js");
7875/* harmony import */ var _anyHandlesOutsideImage_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./anyHandlesOutsideImage.js */ "./manipulators/anyHandlesOutsideImage.js");
7876/* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../stateManagement/toolState.js */ "./stateManagement/toolState.js");
7877/* harmony import */ var _util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../util/triggerEvent.js */ "./util/triggerEvent.js");
7878/* harmony import */ var _util_clip_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../util/clip.js */ "./util/clip.js");
7879/* harmony import */ var _store_index_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./../store/index.js */ "./store/index.js");
7880/* harmony import */ var _util_getActiveTool__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../util/getActiveTool */ "./util/getActiveTool.js");
7881/* harmony import */ var _tools_base_BaseAnnotationTool__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../tools/base/BaseAnnotationTool */ "./tools/base/BaseAnnotationTool.js");
7882
7883
7884
7885
7886
7887
7888
7889
7890
7891var _dragEvents = {
7892  mouse: [_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MOUSE_DRAG],
7893  touch: [_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_DRAG]
7894};
7895var _upOrEndEvents = {
7896  mouse: [_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MOUSE_UP, _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MOUSE_CLICK
7896],
7897  touch: [_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_END, _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_DRAG_END, _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_PINCH, _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_PRESS, _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TAP]
7898};
7899/**
7900 * Manipulator to move all provided handles at the same time
7901 * @public
7902 * @function moveAllHandles
7903 * @memberof Manipulators
7904 *
7905 * @param {*}        evtDetail
7906 * @param {*}        evtDetail.element
7907 * @param {String}   toolName
7908 * @param {*}        annotation
7909 * @param {*}        [handle=null] - not needed by moveAllHandles, but keeps call signature the same as `moveHandle`
7910 * @param {Object}   [options={}]
7911 * @param {Boolean}  [options.deleteIfHandleOutsideImage]
7912 * @param {function} [options.doneMovingCallback]
7913 * @param {Boolean}  [options.preventHandleOutsideImage]
7914 * @param {string}   [interactionType=mouse]
7915 * @returns {undefined}
7916 */
7917
7918/* harmony default export */ __webpack_exports__["default"] = (function (_ref, toolName, annotation, handle) {
7919  var element = _ref.element;
7920  var options = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {};
7921  var interactionType = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 'mouse';
7922  // Use global defaults, unless overidden by provided options
7923  options = Object.assign({
7924    deleteIfHandleOutsideImage: _store_index_js__WEBPACK_IMPORTED_MODULE_6__["state"].deleteIfHandleOutsideImage,
7925    preventHandleOutsideImage: _store_index_js__WEBPACK_IMPORTED_MODULE_6__["state"].preventHandleOutsideImage
7926  }, options);
7927
7928  var dragHandler = _dragHandler.bind(this, toolName, annotation, options, interactionType); // So we don't need to inline the entire `upOrEndHandler` function
7929
7930
7931  var upOrEndHandler = function upOrEndHandler(evt) {
7932    _upOrEndHandler(toolName, annotation, options, interactionType, {
7933      dragHandler: dragHandler,
7934      upOrEndHandler: upOrEndHandler
7935    }, evt);
7936  };
7937
7938  annotation.active = true;
7939  _store_index_js__WEBPACK_IMPORTED_MODULE_6__["state"].isToolLocked = true; // Add Event Listeners
7940
7941  _dragEvents[interactionType].forEach(function (eventType) {
7942    element.addEventListener(eventType, dragHandler);
7943  });
7944
7945  _upOrEndEvents[interactionType].forEach(function (eventType) {
7946    element.addEventListener(eventType, upOrEndHandler);
7947  });
7948});
7949
7950function _dragHandler(toolName, annotation) {
7951  var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
7952  var interactionType = arguments.length > 3 ? arguments[3] : undefined;
7953  var evt = arguments.length > 4 ? arguments[4] : undefined;
7954  var _evt$detail = evt.detail,
7955      element = _evt$detail.element,
7956      image = _evt$detail.image,
7957      buttons = _evt$detail.buttons;
7958  var _evt$detail$deltaPoin = evt.detail.deltaPoints.image,
7959      x = _evt$detail$deltaPoin.x,
7960      y = _evt$detail$deltaPoin.y;
7961  annotation.active = true;
7962  annotation.invalidated = true;
7963  var handleKeys = Object.keys(annotation.handles);
7964
7965  for (var i = 0; i < handleKeys.length; i++) {
7966    var key = handleKeys[i];
7967    var handle = annotation.handles[key];
7968
7969    if ( // Don't move this part of the annotation
7970    handle.movesIndependently === true || // Not a true handle
7971    !handle.hasOwnProperty('x') || !handle.hasOwnProperty('y')) {
7972      continue;
7973    }
7974
7975    handle.x += x;
7976    handle.y += y;
7977
7978    if (options.preventHandleOutsideImage) {
7979      Object(_util_clip_js__WEBPACK_IMPORTED_MODULE_5__["clipToBox"])(handle, image);
7980    }
7981  }
7982
7983  _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.updateImage(element);
7984  var activeTool = Object(_util_getActiveTool__WEBPACK_IMPORTED_MODULE_7__["default"])(element, buttons, interactionType);
7985
7986  if (activeTool instanceof _tools_base_BaseAnnotationTool__WEBPACK_IMPORTED_MODULE_8__["default"]) {
7987    activeTool.updateCachedStats(image, element, annotation);
7988  }
7989
7990  var eventType = _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MEASUREMENT_MODIFIED;
7991  var modifiedEventData = {
7992    toolName: toolName,
7993    element: element,
7994    measurementData: annotation
7995  };
7996  Object(_util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_4__["default"])(element, eventType, modifiedEventData);
7997  evt.preventDefault();
7998  evt.stopPropagation();
7999}
8000
8001function _upOrEndHandler(toolName, annotation) {
8002  var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
8003  var interactionType = arguments.length > 3 ? arguments[3] : undefined;
8004
8005  var _ref2 = arguments.length > 4 ? arguments[4] : undefined,
8006      dragHandler = _ref2.dragHandler,
8007      upOrEndHandler = _ref2.upOrEndHandler;
8008
8009  var evt = arguments.length > 5 ? arguments[5] : undefined;
8010  var eventData = evt.detail;
8011  var element = evt.detail.element;
8012  annotation.active = false;
8013  annotation.invalidated = true;
8014  _store_index_js__WEBPACK_IMPORTED_MODULE_6__["state"].isToolLocked = false; // Remove Event Listeners
8015
8016  _dragEvents[interactionType].forEach(function (eventType) {
8017    element.removeEventListener(eventType, dragHandler);
8018  });
8019
8020  _upOrEndEvents[interactionType].forEach(function (eventType) {
8021    element.removeEventListener(eventType, upOrEndHandler);
8022  }); // If any handle is outside the image, delete the tool data
8023
8024
8025  if (options.deleteIfHandleOutsideImage && Object(_anyHandlesOutsideImage_js__WEBPACK_IMPORTED_MODULE_2__["default"])(eventData, annotation.handles)) {
8026    Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_3__["removeToolState"])(element, toolName, annotation);
8027  }
8028
8029  if (typeof options.doneMovingCallback === 'function') {
8030    options.doneMovingCallback();
8031  }
8032
8033  _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.updateImage(element);
8034}
8035
8036/***/ }),
8037
8038/***/ "./manipulators/moveHandle.js":
8039/*!************************************!*\
8040  !*** ./manipulators/moveHandle.js ***!
8041  \************************************/
8042/*! exports provided: default */
8043/***/ (function(module, __webpack_exports__, __webpack_require__) {
8044
8045"use strict";
8046__webpack_require__.r(__webpack_exports__);
8047/* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../events.js */ "./events.js");
8048/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js");
8049/* harmony import */ var _anyHandlesOutsideImage_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./anyHandlesOutsideImage.js */ "./manipulators/anyHandlesOutsideImage.js");
8050/* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../stateManagement/toolState.js */ "./stateManagement/toolState.js");
8051/* harmony import */ var _util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../util/triggerEvent.js */ "./util/triggerEvent.js");
8052/* harmony import */ var _util_clip_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../util/clip.js */ "./util/clip.js");
8053/* harmony import */ var _store_index_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./../store/index.js */ "./store/index.js");
8054/* harmony import */ var _util_getActiveTool__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../util/getActiveTool */ "./util/getActiveTool.js");
8055/* harmony import */ var _tools_base_BaseAnnotationTool__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../tools/base/BaseAnnotationTool */ "./tools/base/BaseAnnotationTool.js");
8056
8057
8058
8059
8060
8061
8062
8063
8064
8065var runAnimation = {
8066  value: false
8067};
8068var _dragEvents = {
8069  mouse: [_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MOUSE_DRAG],
8070  touch: [_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_DRAG]
8071};
8072var _upOrEndEvents = {
8073  mouse: [_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MOUSE_UP, _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MOUSE_CLICK
8073],
8074  touch: [_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_END, _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_DRAG_END, _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_PINCH, _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_PRESS, _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TAP]
8075};
8076/**
8077 * Move the provided handle
8078 *
8079 * @public
8080 * @method moveHandle
8081 * @memberof Manipulators
8082 *
8083 * @param {*} evtDetail
8084 * @param {*} toolName
8085 * @param {*} annotation
8086 * @param {*} handle
8087 * @param {*} [options={}]
8088 * @param {Boolean}  [options.deleteIfHandleOutsideImage]
8089 * @param {function} [options.doneMovingCallback]
8090 * @param {Boolean}  [options.preventHandleOutsideImage]
8091 * @param {*} [interactionType=mouse]
8092 * @returns {undefined}
8093 */
8094
8095/* harmony default export */ __webpack_exports__["default"] = (function (evtDetail, toolName, annotation, handle) {
8096  var options = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {};
8097  var interactionType = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 'mouse';
8098  // Use global defaults, unless overidden by provided options
8099  options = Object.assign({
8100    deleteIfHandleOutsideImage: _store_index_js__WEBPACK_IMPORTED_MODULE_6__["state"].deleteIfHandleOutsideImage,
8101    preventHandleOutsideImage: _store_index_js__WEBPACK_IMPORTED_MODULE_6__["state"].preventHandleOutsideImage
8102  }, options);
8103  var element = evtDetail.element;
8104
8105  var dragHandler = _dragHandler.bind(this, toolName, annotation, handle, options, interactionType); // So we don't need to inline the entire `upOrEndHandler` function
8106
8107
8108  var upOrEndHandler = function upOrEndHandler(evt) {
8109    _upOrEndHandler(toolName, evtDetail, annotation, handle, options, interactionType, {
8110      dragHandler: dragHandler,
8111      upOrEndHandler: upOrEndHandler
8112    }, evt);
8113  };
8114
8115  handle.active = true;
8116  annotation.active = true;
8117  _store_index_js__WEBPACK_IMPORTED_MODULE_6__["state"].isToolLocked = true; // Add Event Listeners
8118
8119  _dragEvents[interactionType].forEach(function (eventType) {
8120    element.addEventListener(eventType, dragHandler);
8121  });
8122
8123  _upOrEndEvents[interactionType].forEach(function (eventType) {
8124    element.addEventListener(eventType, upOrEndHandler);
8125  }); // ==========================
8126  // ========  TOUCH ==========
8127  // ==========================
8128
8129
8130  if (interactionType === 'touch') {
8131    runAnimation.value = true;
8132    var enabledElement = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.getEnabledElement(element); // Average pixel width of index finger is 45-57 pixels
8133    // https://www.smashingmagazine.com/2012/02/finger-friendly-design-ideal-mobile-touchscreen-target-sizes/
8134
8135    var fingerDistance = -57;
8136    var aboveFinger = {
8137      x: evtDetail.currentPoints.page.x,
8138      y: evtDetail.currentPoints.page.y + fingerDistance
8139    };
8140    var targetLocation = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pageToPixel(element, aboveFinger.x, aboveFinger.y);
8141
8142    _animate(handle, runAnimation, enabledElement, targetLocation);
8143  }
8144});
8145
8146function _dragHandler(toolName, annotation, handle, options, interactionType, evt) {
8147  var _evt$detail = evt.detail,
8148      image = _evt$detail.image,
8149      currentPoints = _evt$detail.currentPoints,
8150      element = _evt$detail.element,
8151      buttons = _evt$detail.buttons;
8152  var page = currentPoints.page;
8153  var fingerOffset = -57;
8154  var targetLocation = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pageToPixel(element, page.x, interactionType === 'touch' ? page.y + fingerOffset : page.y);
8155  runAnimation.value = false;
8156  handle.active = true;
8157  handle.hasMoved = true;
8158  handle.x = targetLocation.x;
8159  handle.y = targetLocation.y; // TODO: A way to not flip this for textboxes on annotations
8160
8161  annotation.invalidated = true;
8162
8163  if (options.preventHandleOutsideImage) {
8164    Object(_util_clip_js__WEBPACK_IMPORTED_MODULE_5__["clipToBox"])(handle, image);
8165  }
8166
8167  _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.updateImage(element);
8168  var activeTool = Object(_util_getActiveTool__WEBPACK_IMPORTED_MODULE_7__["default"])(element, buttons, interactionType);
8169
8170  if (activeTool instanceof _tools_base_BaseAnnotationTool__WEBPACK_IMPORTED_MODULE_8__["default"]) {
8171    activeTool.updateCachedStats(image, element, annotation);
8172  }
8173
8174  var eventType = _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MEASUREMENT_MODIFIED;
8175  var modifiedEventData = {
8176    toolName: toolName,
8177    element: element,
8178    measurementData: annotation
8179  };
8180  Object(_util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_4__["default"])(element, eventType, modifiedEventData);
8181}
8182
8183function _upOrEndHandler(toolName, evtDetail, annotation, handle) {
8184  var options = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {};
8185  var interactionType = arguments.length > 5 ? arguments[5] : undefined;
8186
8187  var _ref = arguments.length > 6 ? arguments[6] : undefined,
8188      dragHandler = _ref.dragHandler,
8189      upOrEndHandler = _ref.upOrEndHandler;
8190
8191  var evt = arguments.length > 7 ? arguments[7] : undefined;
8192  var image = evtDetail.currentPoints.image;
8193  var element = evt.detail.element;
8194  handle.active = false;
8195  annotation.active = false; // TODO: A way to not flip this for textboxes on annotations
8196
8197  annotation.invalidated = true;
8198  _store_index_js__WEBPACK_IMPORTED_MODULE_6__["state"].isToolLocked = false;
8199  runAnimation.value = false; // Remove Event Listeners
8200
8201  _dragEvents[interactionType].forEach(function (eventType) {
8202    element.removeEventListener(eventType, dragHandler);
8203  });
8204
8205  _upOrEndEvents[interactionType].forEach(function (eventType) {
8206    element.removeEventListener(eventType, upOrEndHandler);
8207  }); // If any handle is outside the image, delete the tool data
8208
8209
8210  if (options.deleteIfHandleOutsideImage && Object(_anyHandlesOutsideImage_js__WEBPACK_IMPORTED_MODULE_2__["default"])(evtDetail, annotation.handles)) {
8211    Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_3__["removeToolState"])(element, toolName, annotation);
8212  } // TODO: What dark magic makes us want to handle TOUCH_PRESS differently?
8213
8214
8215  if (evt.type === _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_PRESS) {
8216    evt.detail.handlePressed = annotation;
8217    handle.x = image.x; // Original Event
8218
8219    handle.y = image.y;
8220  }
8221
8222  if (typeof options.doneMovingCallback === 'function') {
8223    options.doneMovingCallback();
8224  }
8225
8226  _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.updateImage(element);
8227}
8228/**
8229 * Animates the provided handle using `requestAnimationFrame`
8230 * @private
8231 * @method _animate
8232 *
8233 * @param {*} handle
8234 * @param {*} runAnimation
8235 * @param {*} enabledElement
8236 * @param {*} targetLocation
8237 * @returns {undefined}
8238 */
8239
8240
8241function _animate(handle, runAnimation, enabledElement, targetLocation) {
8242  if (!runAnimation.value) {
8243    return;
8244  } // Pixels / second
8245
8246
8247  var distanceRemaining = Math.abs(handle.y - targetLocation.y);
8248  var linearDistEachFrame = distanceRemaining / 10;
8249
8250  if (distanceRemaining < 1) {
8251    handle.y = targetLocation.y;
8252    runAnimation.value = false;
8253    return;
8254  }
8255
8256  if (handle.y > targetLocation.y) {
8257    handle.y -= linearDistEachFrame;
8258  } else if (handle.y < targetLocation.y) {
8259    handle.y += linearDistEachFrame;
8260  } // Update the image
8261
8262
8263  _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.updateImage(enabledElement.element); // Request a new frame
8264
8265  _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.requestAnimationFrame(function () {
8266    _animate(handle, runAnimation, enabledElement, targetLocation);
8267  });
8268}
8269
8270/***/ }),
8271
8272/***/ "./manipulators/moveNewHandle.js":
8273/*!***************************************!*\
8274  !*** ./manipulators/moveNewHandle.js ***!
8275  \***************************************/
8276/*! exports provided: default */
8277/***/ (function(module, __webpack_exports__, __webpack_require__) {
8278
8279"use strict";
8280__webpack_require__.r(__webpack_exports__);
8281/* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../events.js */ "./events.js");
8282/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js");
8283/* harmony import */ var _anyHandlesOutsideImage_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./anyHandlesOutsideImage.js */ "./manipulators/anyHandlesOutsideImage.js");
8284/* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../stateManagement/toolState.js */ "./stateManagement/toolState.js");
8285/* harmony import */ var _util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../util/triggerEvent.js */ "./util/triggerEvent.js");
8286/* harmony import */ var _util_clip_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../util/clip.js */ "./util/clip.js");
8287/* harmony import */ var _store_index_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./../store/index.js */ "./store/index.js");
8288/* harmony import */ var _util_getActiveTool__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../util/getActiveTool */ "./util/getActiveTool.js");
8289/* harmony import */ var _tools_base_BaseAnnotationTool__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../tools/base/BaseAnnotationTool */ "./tools/base/BaseAnnotationTool.js");
8290
8291
8292
8293
8294
8295
8296
8297
8298
8299var _moveEvents = {
8300  mouse: [_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MOUSE_MOVE, _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MOUSE_DRAG],
8301  touch: [_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_DRAG]
8302};
8303var _moveEndEvents = {
8304  mouse: [_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MOUSE_UP, _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MOUSE_CLICK
8304],
8305  touch: [_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_END, _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_PINCH, _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TAP]
8306};
8307/**
8308 * Move a new handle
8309 * @public
8310 * @method moveNewHandle
8311 * @memberof Manipulators
8312 *
8313 * @param {*} evtDetail
8314 * @param {*} toolName
8315 * @param {*} annotation
8316 * @param {*} handle
8317 * @param {*} [options={}]
8318 * @param {Boolean}  [options.deleteIfHandleOutsideImage]
8319 * @param {function} [options.doneMovingCallback]
8320 * @param {Boolean}  [options.preventHandleOutsideImage]
8321 * @param {*} [interactionType=mouse]
8322 * @returns {undefined}
8323 */
8324
8325/* harmony default export */ __webpack_exports__["default"] = (function (evtDetail, toolName, annotation, handle, options) {
8326  var interactionType = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 'mouse';
8327  // Use global defaults, unless overidden by provided options
8328  options = Object.assign({
8329    deleteIfHandleOutsideImage: _store_index_js__WEBPACK_IMPORTED_MODULE_6__["state"].deleteIfHandleOutsideImage,
8330    preventHandleOutsideImage: _store_index_js__WEBPACK_IMPORTED_MODULE_6__["state"].preventHandleOutsideImage
8331  }, options);
8332  var element = evtDetail.element;
8333  annotation.active = true;
8334  handle.active = true;
8335  _store_index_js__WEBPACK_IMPORTED_MODULE_6__["state"].isToolLocked = true;
8336
8337  var moveHandler = _moveHandler.bind(this, toolName, annotation, handle, options, interactionType); // So we don't need to inline the entire `moveEndEventHandler` function
8338
8339
8340  var moveEndHandler = function moveEndHandler(evt) {
8341    _moveEndHandler(toolName, annotation, handle, options, interactionType, {
8342      moveHandler: moveHandler,
8343      moveEndHandler: moveEndHandler
8344    }, evt);
8345  }; // Add event listeners
8346
8347
8348  _moveEvents[interactionType].forEach(function (eventType) {
8349    element.addEventListener(eventType, moveHandler);
8350  });
8351
8352  _moveEndEvents[interactionType].forEach(function (eventType) {
8353    element.addEventListener(eventType, moveEndHandler);
8354  });
8355
8356  element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_START, _stopImmediatePropagation);
8357});
8358
8359function _moveHandler(toolName, annotation, handle, options, interactionType, evt) {
8360  var _evt$detail = evt.detail,
8361      currentPoints = _evt$detail.currentPoints,
8362      image = _evt$detail.image,
8363      element = _evt$detail.element,
8364      buttons = _evt$detail.buttons;
8365  var page = currentPoints.page;
8366  var fingerOffset = -57;
8367  var targetLocation = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pageToPixel(element, interactionType === 'touch' ? page.x + fingerOffset : page.x, interactionType === 'touch' ? page.y + fingerOffset : page.y);
8368  annotation.invalidated = true;
8369  handle.active = true;
8370  handle.x = targetLocation.x;
8371  handle.y = targetLocation.y;
8372
8373  if (options && options.preventHandleOutsideImage) {
8374    Object(_util_clip_js__WEBPACK_IMPORTED_MODULE_5__["clipToBox"])(handle, image);
8375  }
8376
8377  _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.updateImage(element);
8378  var activeTool = Object(_util_getActiveTool__WEBPACK_IMPORTED_MODULE_7__["default"])(element, buttons, interactionType);
8379
8380  if (activeTool instanceof _tools_base_BaseAnnotationTool__WEBPACK_IMPORTED_MODULE_8__["default"]) {
8381    activeTool.updateCachedStats(image, element, annotation);
8382  }
8383
8384  var eventType = _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MEASUREMENT_MODIFIED;
8385  var modifiedEventData = {
8386    toolName: toolName,
8387    element: element,
8388    measurementData: annotation
8389  };
8390  Object(_util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_4__["default"])(element, eventType, modifiedEventData);
8391}
8392
8393function _moveEndHandler(toolName, annotation, handle, options, interactionType, _ref, evt) {
8394  var moveHandler = _ref.moveHandler,
8395      moveEndHandler = _ref.moveEndHandler;
8396  var _evt$detail2 = evt.detail,
8397      element = _evt$detail2.element,
8398      currentPoints = _evt$detail2.currentPoints;
8399  var page = currentPoints.page;
8400  var fingerOffset = -57;
8401  var targetLocation = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pageToPixel(element, interactionType === 'touch' ? page.x + fingerOffset : page.x, interactionType === 'touch' ? page.y + fingerOffset : page.y); // "Release" the handle
8402
8403  annotation.active = false;
8404  annotation.invalidated = true;
8405  handle.active = false;
8406  handle.x = targetLocation.x;
8407  handle.y = targetLocation.y;
8408  _store_index_js__WEBPACK_IMPORTED_MODULE_6__["state"].isToolLocked = false; // Remove event listeners
8409
8410  _moveEvents[interactionType].forEach(function (eventType) {
8411    element.removeEventListener(eventType, moveHandler);
8412  });
8413
8414  _moveEndEvents[interactionType].forEach(function (eventType) {
8415    element.removeEventListener(eventType, moveEndHandler);
8416  });
8417
8418  element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_START, _stopImmediatePropagation); // TODO: WHY?
8419  // Why would a Touch_Pinch or Touch_Press be associated with a new handle?
8420
8421  if (evt.type === _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_PINCH || evt.type === _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_PRESS) {
8422    handle.active = false;
8423    _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.updateImage(element);
8424
8425    if (typeof options.doneMovingCallback === 'function') {
8426      options.doneMovingCallback();
8427    }
8428
8429    return;
8430  }
8431
8432  if (options.preventHandleOutsideImage) {
8433    Object(_util_clip_js__WEBPACK_IMPORTED_MODULE_5__["clipToBox"])(handle, evt.detail.image);
8434  } // If any handle is outside the image, delete the tool data
8435
8436
8437  if (options.deleteIfHandleOutsideImage && Object(_anyHandlesOutsideImage_js__WEBPACK_IMPORTED_MODULE_2__["default"])(evt.detail, annotation.handles)) {
8438    Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_3__["removeToolState"])(element, toolName, annotation);
8439  }
8440
8441  if (typeof options.doneMovingCallback === 'function') {
8442    options.doneMovingCallback();
8443  } // Update Image
8444
8445
8446  _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.updateImage(element);
8447}
8448/**
8449 * Stop the CornerstoneToolsTouchStart event from
8450 * Becoming a CornerstoneToolsTouchStartActive event when
8451 * MoveNewHandle ends
8452 *
8453 * @private
8454 * @function _stopImmediatePropagation
8455 *
8456 * @param {*} evt
8457 * @returns {Boolean} false
8458 */
8459
8460
8461function _stopImmediatePropagation(evt) {
8462  evt.stopImmediatePropagation();
8463  return false;
8464}
8465
8466/***/ }),
8467
8468/***/ "./mixins/activeOrDisabledBinaryTool.js":
8469/*!**********************************************!*\
8470  !*** ./mixins/activeOrDisabledBinaryTool.js ***!
8471  \**********************************************/
8472/*! exports provided: default */
8473/***/ (function(module, __webpack_exports__, __webpack_require__) {
8474
8475"use strict";
8476__webpack_require__.r(__webpack_exports__);
8477/* harmony import */ var _store_setToolMode_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../store/setToolMode.js */ "./store/setToolMode.js");
8478
8479/**
8480 * If one attempts to change mode to 'passive', redirect the tool to 'disabled'.
8481 *
8482 * @param {HTMLElement} element The element on which the tool resides.
8483 * @returns {undefined}
8484 */
8485
8486function passiveCallback(element) {
8487  Object(_store_setToolMode_js__WEBPACK_IMPORTED_MODULE_0__["setToolDisabledForElement"])(element, this.name);
8488}
8489/**
8490 * If one attempts to turn the tool 'enabled', redirect the tool to 'active'.
8491 *
8492 * @param {HTMLElement} element The element on which the tool resides.
8493 * @returns {undefined}
8494 */
8495
8496
8497function enabledCallback(element) {
8498  Object(_store_setToolMode_js__WEBPACK_IMPORTED_MODULE_0__["setToolActiveForElement"])(element, this.name);
8499}
8500/**
8501 * @mixin activeOrDisabledBinaryTool - Redirect enabled/passive mode changes to active/disabled.
8502 * @memberof Mixins
8503 */
8504
8505
8506/* harmony default export */ __webpack_exports__["default"] = ({
8507  passiveCallback: passiveCallback,
8508  enabledCallback: enabledCallback
8509});
8510
8511/***/ }),
8512
8513/***/ "./mixins/enabledOrDisabledBinaryTool.js":
8514/*!***********************************************!*\
8515  !*** ./mixins/enabledOrDisabledBinaryTool.js ***!
8516  \***********************************************/
8517/*! exports provided: default */
8518/***/ (function(module, __webpack_exports__, __webpack_require__) {
8519
8520"use strict";
8521__webpack_require__.r(__webpack_exports__);
8522/* harmony import */ var _store_setToolMode_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../store/setToolMode.js */ "./store/setToolMode.js");
8523
8524/**
8525 * If one attempts to change mode to 'passive', redirect the tool to 'disabled'.
8526 *
8527 * @param {HTMLElement} element The element on which the tool resides.
8528 * @returns {undefined}
8529 */
8530
8531function passiveCallback(element) {
8532  Object(_store_setToolMode_js__WEBPACK_IMPORTED_MODULE_0__["setToolDisabledForElement"])(element, this.name);
8533}
8534/**
8535 * If one attempts to change mode to 'active', redirect the tool to 'enabled'.
8536 *
8537 * @param {HTMLElement} element The element on which the tool resides.
8538 * @returns {undefined}
8539 */
8540
8541
8542function activeCallback(element) {
8543  Object(_store_setToolMode_js__WEBPACK_IMPORTED_MODULE_0__["setToolEnabledForElement"])(element, this.name);
8544}
8545/**
8546 *
8547 * @mixin enabledOrDisabledBinaryTool - Redirect active/passive mode changes to enabled/disabled.
8548 * @memberof Mixins
8549 */
8550
8551
8552/* harmony default export */ __webpack_exports__["default"] = ({
8553  passiveCallback: passiveCallback,
8554  activeCallback: activeCallback
8555});
8556
8557/***/ }),
8558
8559/***/ "./mixins/index.js":
8560/*!*************************!*\
8561  !*** ./mixins/index.js ***!
8562  \*************************/
8563/*! exports provided: default */
8564/***/ (function(module, __webpack_exports__, __webpack_require__) {
8565
8566"use strict";
8567__webpack_require__.r(__webpack_exports__);
8568/* harmony import */ var _activeOrDisabledBinaryTool_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./activeOrDisabledBinaryTool.js */ "./mixins/activeOrDisabledBinaryTool.js");
8569/* harmony import */ var _enabledOrDisabledBinaryTool_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./enabledOrDisabledBinaryTool.js */ "./mixins/enabledOrDisabledBinaryTool.js");
8570
8571
8572/* harmony default export */ __webpack_exports__["default"] = ({
8573  activeOrDisabledBinaryTool: _activeOrDisabledBinaryTool_js__WEBPACK_IMPORTED_MODULE_0__["default"],
8574  enabledOrDisabledBinaryTool: _enabledOrDisabledBinaryTool_js__WEBPACK_IMPORTED_MODULE_1__["default"]
8575});
8576
8577/***/ }),
8578
8579/***/ "./orientation/getOrientationString.js":
8580/*!*********************************************!*\
8581  !*** ./orientation/getOrientationString.js ***!
8582  \*********************************************/
8583/*! exports provided: default */
8584/***/ (function(module, __webpack_exports__, __webpack_require__) {
8585
8586"use strict";
8587__webpack_require__.r(__webpack_exports__);
8588/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js");
8589/* harmony import */ var _util_convertToVector3_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../util/convertToVector3.js */ "./util/convertToVector3.js");
8590
8591
8592/**
8593 * Returns the orientation of the vector in the patient coordinate system.
8594 * @public
8595 * @function getOrientationString
8596 *
8597 * @param  {Array|cornerstoneMath.Vector3} vector Input array or Vector3
8598 * @returns {string} The orientation in the patient coordinate system.
8599 */
8600
8601/* harmony default export */ __webpack_exports__["default"] = (function (vector) {
8602  var vec3 = Object(_util_convertToVector3_js__WEBPACK_IMPORTED_MODULE_1__["default"])(vector); // Thanks to David Clunie
8603  // https://sites.google.com/site/dicomnotes/
8604
8605  var orientation = '';
8606  var orientationX = vec3.x < 0 ? 'R' : 'L';
8607  var orientationY = vec3.y < 0 ? 'A' : 'P';
8608  var orientationZ = vec3.z < 0 ? 'F' : 'H'; // Should probably make this a function vector3.abs
8609
8610  var abs = new _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstoneMath.Vector3(Math.abs(vec3.x), Math.abs(vec3.y), Math.abs(vec3.z));
8611
8612  for (var i = 0; i < 3; i++) {
8613    if (abs.x > 0.0001 && abs.x > abs.y && abs.x > abs.z) {
8614      orientation += orientationX;
8615      abs.x = 0;
8616    } else if (abs.y > 0.0001 && abs.y > abs.x && abs.y > abs.z) {
8617      orientation += orientationY;
8618      abs.y = 0;
8619    } else if (abs.z > 0.0001 && abs.z > abs.x && abs.z > abs.y) {
8620      orientation += orientationZ;
8621      abs.z = 0;
8622    } else {
8623      break;
8624    }
8625  }
8626
8627  return orientation;
8628});
8629
8630/***/ }),
8631
8632/***/ "./orientation/index.js":
8633/*!******************************!*\
8634  !*** ./orientation/index.js ***!
8635  \******************************/
8636/*! exports provided: default */
8637/***/ (function(module, __webpack_exports__, __webpack_require__) {
8638
8639"use strict";
8640__webpack_require__.r(__webpack_exports__);
8641/* harmony import */ var _getOrientationString_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getOrientationString.js */ "./orientation/getOrientationString.js");
8642/* harmony import */ var _invertOrientationString_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./invertOrientationString.js */ "./orientation/invertOrientationString.js");
8643
8644
8645var orientation = {
8646  getOrientationString: _getOrientationString_js__WEBPACK_IMPORTED_MODULE_0__["default"],
8647  invertOrientationString: _invertOrientationString_js__WEBPACK_IMPORTED_MODULE_1__["default"]
8648};
8649/* harmony default export */ __webpack_exports__["default"] = (orientation);
8650
8651/***/ }),
8652
8653/***/ "./orientation/invertOrientationString.js":
8654/*!************************************************!*\
8655  !*** ./orientation/invertOrientationString.js ***!
8656  \************************************************/
8657/*! exports provided: default */
8658/***/ (function(module, __webpack_exports__, __webpack_require__) {
8659
8660"use strict";
8661__webpack_require__.r(__webpack_exports__);
8662/**
8663 * Inverts an orientation string.
8664 * @public
8665 * @function invertOrientationString
8666 *
8667 * @param  {string} orientationString The orientation.
8668 * @returns {string}  The inverted orientationString.
8669 */
8670/* harmony default export */ __webpack_exports__["default"] = (function (orientationString) {
8671  var inverted = orientationString.replace('H', 'f');
8672  inverted = inverted.replace('F', 'h');
8673  inverted = inverted.replace('R', 'l');
8674  inverted = inverted.replace('L', 'r');
8675  inverted = inverted.replace('A', 'p');
8676  inverted = inverted.replace('P', 'a');
8677  inverted = inverted.toUpperCase();
8678  return inverted;
8679});
8680
8681/***/ }),
8682
8683/***/ "./requestPool/requestPoolManager.js":
8684/*!*******************************************!*\
8685  !*** ./requestPool/requestPoolManager.js ***!
8686  \*******************************************/
8687/*! exports provided: default */
8688/***/ (function(module, __webpack_exports__, __webpack_require__) {
8689
8690"use strict";
8691__webpack_require__.r(__webpack_exports__);
8692/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js");
8693/* harmony import */ var _util_getMaxSimultaneousRequests_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../util/getMaxSimultaneousRequests.js */ "./util/getMaxSimultaneousRequests.js");
8694
8695
8696var requestPool = {
8697  interaction: [],
8698  thumbnail: [],
8699  prefetch: []
8700};
8701var numRequests = {
8702  interaction: 0,
8703  thumbnail: 0,
8704  prefetch: 0
8705};
8706var maxNumRequests = {
8707  interaction: 6,
8708  thumbnail: 6,
8709  prefetch: 5
8710};
8711var awake = false;
8712var grabDelay = 20;
8713
8714function addRequest(element, imageId, type, preventCache, doneCallback, failCallback, addToBeginning) {
8715  if (!requestPool.hasOwnProperty(type)) {
8716    throw new Error('Request type must be one of interaction, thumbnail, or prefetch');
8717  }
8718
8719  if (!element || !imageId) {
8720    return;
8721  } // Describe the request
8722
8723
8724  var requestDetails = {
8725    type: type,
8726    imageId: imageId,
8727    preventCache: preventCache,
8728    doneCallback: doneCallback,
8729    failCallback: failCallback
8730  }; // If this imageId is in the cache, resolve it immediately
8731
8732  var imageLoadObject = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.imageCache.getImageLoadObject(imageId);
8733
8734  if (imageLoadObject) {
8735    imageLoadObject.promise.then(function (image) {
8736      doneCallback(image);
8737    }, function (error) {
8738      failCallback(error);
8739    });
8740    return;
8741  }
8742
8743  if (addToBeginning) {
8744    // Add it to the beginning of the stack
8745    requestPool[type].unshift(requestDetails);
8746  } else {
8747    // Add it to the end of the stack
8748    requestPool[type].push(requestDetails);
8749  } // Wake up
8750
8751
8752  awake = true;
8753}
8754
8755function clearRequestStack(type) {
8756  // Console.log('clearRequestStack');
8757  if (!requestPool.hasOwnProperty(type)) {
8758    throw new Error('Request type must be one of interaction, thumbnail, or prefetch');
8759  }
8760
8761  requestPool[type] = [];
8762}
8763
8764function startAgain() {
8765  if (!awake) {
8766    return;
8767  }
8768
8769  setTimeout(function () {
8770    startGrabbing();
8771  }, grabDelay);
8772}
8773
8774function sendRequest(requestDetails) {
8775  var cornerstone = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone; // Increment the number of current requests of this type
8776
8777  var type = requestDetails.type;
8778  numRequests[type]++;
8779  awake = true;
8780  var imageId = requestDetails.imageId;
8781  var doneCallback = requestDetails.doneCallback;
8782  var failCallback = requestDetails.failCallback; // Check if we already have this image promise in the cache
8783
8784  var imageLoadObject = cornerstone.imageCache.getImageLoadObject(imageId);
8785
8786  if (imageLoadObject) {
8787    // If we do, remove from list (when resolved, as we could have
8788    // Pending prefetch requests) and stop processing this iteration
8789    imageLoadObject.promise.then(function (image) {
8790      numRequests[type]--; // Console.log(numRequests);
8791
8792      doneCallback(image);
8793      startAgain();
8794    }, function (error) {
8795      numRequests[type]--; // Console.log(numRequests);
8796
8797      failCallback(error);
8798      startAgain();
8799    });
8800    return;
8801  }
8802
8803  function requestTypeToLoadPriority(requestDetails) {
8804    if (requestDetails.type === 'prefetch') {
8805      return -5;
8806    } else if (requestDetails.type === 'interactive') {
8807      return 0;
8808    } else if (requestDetails.type === 'thumbnail') {
8809      return 5;
8810    }
8811  }
8812
8813  var priority = requestTypeToLoadPriority(requestDetails);
8814  var loader;
8815
8816  if (requestDetails.preventCache === true) {
8817    loader = cornerstone.loadImage(imageId, {
8818      priority: priority,
8819      type: requestDetails.type
8820    });
8821  } else {
8822    loader = cornerstone.loadAndCacheImage(imageId, {
8823      priority: priority,
8824      type: requestDetails.type
8825    });
8826  } // Load and cache the image
8827
8828
8829  loader.then(function (image) {
8830    numRequests[type]--; // Console.log(numRequests);
8831
8832    doneCallback(image);
8833    startAgain();
8834  }, function (error) {
8835    numRequests[type]--; // Console.log(numRequests);
8836
8837    failCallback(error);
8838    startAgain();
8839  });
8840}
8841
8842function startGrabbing() {
8843  // Begin by grabbing X images
8844  var maxSimultaneousRequests = Object(_util_getMaxSimultaneousRequests_js__WEBPACK_IMPORTED_MODULE_1__["getMaxSimultaneousRequests"])();
8845  maxNumRequests = {
8846    interaction: Math.max(maxSimultaneousRequests, 1),
8847    thumbnail: Math.max(maxSimultaneousRequests - 2, 1),
8848    prefetch: Math.max(maxSimultaneousRequests - 1, 1)
8849  };
8850  var currentRequests = numRequests.interaction + numRequests.thumbnail + numRequests.prefetch;
8851  var requestsToSend = maxSimultaneousRequests - currentRequests;
8852
8853  for (var i = 0; i < requestsToSend; i++) {
8854    var requestDetails = getNextRequest();
8855
8856    if (requestDetails) {
8857      sendRequest(requestDetails);
8858    }
8859  }
8860}
8861
8862function getNextRequest() {
8863  if (requestPool.interaction.length && numRequests.interaction < maxNumRequests.interaction) {
8864    return requestPool.interaction.shift();
8865  }
8866
8867  if (requestPool.thumbnail.length && numRequests.thumbnail < maxNumRequests.thumbnail) {
8868    return requestPool.thumbnail.shift();
8869  }
8870
8871  if (requestPool.prefetch.length && numRequests.prefetch < maxNumRequests.prefetch) {
8872    return requestPool.prefetch.shift();
8873  }
8874
8875  if (!requestPool.interaction.length && !requestPool.thumbnail.length && !requestPool.prefetch.length) {
8876    awake = false;
8877  }
8878
8879  return false;
8880}
8881
8882function getRequestPool() {
8883  return requestPool;
8884}
8885
8886/* harmony default export */ __webpack_exports__["default"] = ({
8887  numRequests,
8888  addRequest: addRequest,
8889  clearRequestStack: clearRequestStack,
8890  startGrabbing: startGrabbing,
8891  getRequestPool: getRequestPool
8892});
8893
8894/***/ }),
8895
8896/***/ "./stackTools/fusionRenderer.js":
8897/*!**************************************!*\
8898  !*** ./stackTools/fusionRenderer.js ***!
8899  \**************************************/
8900/*! exports provided: default */
8901/***/ (function(module, __webpack_exports__, __webpack_require__) {
8902
8903"use strict";
8904__webpack_require__.r(__webpack_exports__);
8905/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return FusionRenderer; });
8906/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js");
8907/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
8908/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js");
8909/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
8910/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js");
8911/* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../stateManagement/toolState.js */ "./stateManagement/toolState.js");
8912
8913
8914
8915
8916
8917var FusionRenderer =
8918/*#__PURE__*/
8919function () {
8920  function FusionRenderer() {
8921    _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, FusionRenderer);
8922
8923    this.currentImageIdIndex = 0;
8924    this.layerIds = [];
8925    this.findImageFn = undefined;
8926  }
8927
8928  _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(FusionRenderer, [{
8929    key: "render",
8930    value: function render(element, imageStacks) {
8931      var _this = this;
8932
8933      // Move this to base Renderer class
8934      if (!Number.isInteger(this.currentImageIdIndex)) {
8935        throw new Error('FusionRenderer: render - Image ID Index is not an integer');
8936      }
8937
8938      if (!this.findImageFn) {
8939        throw new Error('No findImage function has been defined');
8940      }
8941
8942      if (!imageStacks) {
8943        var toolData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_3__["getToolState"])(element, 'stack');
8944        imageStacks = toolData.data;
8945      } // TODO: Figure out what to do with LoadHandlers in this scenario...
8946
8947
8948      var cornerstone = _externalModules_js__WEBPACK_IMPORTED_MODULE_2__["default"].cornerstone; // For the base layer, go to the currentImageIdIndex
8949
8950      var baseImageObject = imageStacks[0];
8951      var currentImageId = baseImageObject.imageIds[this.currentImageIdIndex];
8952      var overlayImageStacks = imageStacks.slice(1, imageStacks.length);
8953      cornerstone.loadAndCacheImage(currentImageId).then(function (baseImage) {
8954        var baseLayerId = _this.layerIds[0]; // Get the base layer if one exists
8955
8956        if (baseLayerId) {
8957          cornerstone.setLayerImage(element, baseImage, baseLayerId);
8958        } else {
8959          // Otherwise, create a new layer with the base layer's image
8960          baseLayerId = cornerstone.addLayer(element, baseImage, baseImageObject.options);
8961
8962          _this.layerIds.push(baseLayerId);
8963        } // Display the image immediately while the overlay images are identified
8964
8965
8966        cornerstone.displayImage(element, baseImage); // Loop through the remaining 'overlay' image stacks
8967
8968        overlayImageStacks.forEach(function (imgObj, overlayLayerIndex) {
8969          var imageId = _this.findImageFn(imgObj.imageIds, currentImageId);
8970
8971          var layerIndex = overlayLayerIndex + 1;
8972          var currentLayerId = _this.layerIds[layerIndex]; // If no layer exists yet for this overlaid stack, create
8973          // One and add it to the layerIds property for this instance
8974          // Of the fusion renderer.
8975
8976          if (!currentLayerId) {
8977            currentLayerId = cornerstone.addLayer(element, undefined, imgObj.options);
8978
8979            _this.layerIds.push(currentLayerId);
8980          }
8981
8982          if (imageId) {
8983            // If an imageId was returned from the findImage function,
8984            // Load it, make sure it's visible and update the layer
8985            // With the new image object.
8986            cornerstone.loadAndCacheImage(imageId).then(function (image) {
8987              cornerstone.setLayerImage(element, image, currentLayerId);
8988              cornerstone.updateImage(element);
8989            });
8990          } else {
8991            // If no imageId was returned from the findImage function.
8992            // This means that there is no relevant image to display.
8993            cornerstone.setLayerImage(element, undefined, currentLayerId);
8994            cornerstone.setActiveLayer(element, baseLayerId);
8995            cornerstone.updateImage(element);
8996          }
8997        });
8998      });
8999    }
9000  }]);
9001
9002  return FusionRenderer;
9003}();
9004
9005
9006
9007/***/ }),
9008
9009/***/ "./stackTools/playClip.js":
9010/*!********************************!*\
9011  !*** ./stackTools/playClip.js ***!
9012  \********************************/
9013/*! exports provided: playClip, stopClip */
9014/***/ (function(module, __webpack_exports__, __webpack_require__) {
9015
9016"use strict";
9017__webpack_require__.r(__webpack_exports__);
9018/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "playClip", function() { return playClip; });
9019/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "stopClip", function() { return stopClip; });
9020/* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../events.js */ "./events.js");
9021/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js");
9022/* harmony import */ var _stateManagement_loadHandlerManager_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../stateManagement/loadHandlerManager.js */ "./stateManagement/loadHandlerManager.js");
9023/* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../stateManagement/toolState.js */ "./stateManagement/toolState.js");
9024/* harmony import */ var _util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../util/triggerEvent.js */ "./util/triggerEvent.js");
9025
9026
9027
9028
9029
9030var toolType = 'playClip';
9031/**
9032 * [private] Turns a Frame Time Vector (0018,1065) array into a normalized array of timeouts. Each element
9033 * ... of the resulting array represents the amount of time each frame will remain on the screen.
9034 * @param {Array} vector A Frame Time Vector (0018,1065) as specified in section C.7.6.5.1.2 of DICOM standard.
9035 * @param {Number} speed A speed factor which will be applied to each element of the resulting array.
9036 * @returns {Array} An array with timeouts for each animation frame.
9037 */
9038
9039function getPlayClipTimeouts(vector, speed) {
9040  var i;
9041  var sample;
9042  var delay;
9043  var sum = 0;
9044  var limit = vector.length;
9045  var timeouts = []; // Initialize time varying to false
9046
9047  timeouts.isTimeVarying = false;
9048
9049  if (typeof speed !== 'number' || speed <= 0) {
9050    speed = 1;
9051  } // First element of a frame time vector must be discarded
9052
9053
9054  for (i = 1; i < limit; i++) {
9055    // eslint-disable-next-line no-bitwise
9056    delay = Number(vector[i]) / speed | 0; // Integral part only
9057
9058    timeouts.push(delay);
9059
9060    if (i === 1) {
9061      // Use first item as a sample for comparison
9062      sample = delay;
9063    } else if (delay !== sample) {
9064      timeouts.isTimeVarying = true;
9065    }
9066
9067    sum += delay;
9068  }
9069
9070  if (timeouts.length > 0) {
9071    if (timeouts.isTimeVarying) {
9072      // If it's a time varying vector, make the last item an average...
9073      // eslint-disable-next-line no-bitwise
9074      delay = sum / timeouts.length | 0;
9075    } else {
9076      delay = timeouts[0];
9077    }
9078
9079    timeouts.push(delay);
9080  }
9081
9082  return timeouts;
9083}
9084/**
9085 * [private] Performs the heavy lifting of stopping an ongoing animation.
9086 * @param {Object} playClipData The data from playClip that needs to be stopped.
9087 * @returns {void}
9088 */
9089
9090
9091function stopClipWithData(playClipData) {
9092  var id = playClipData.intervalId;
9093
9094  if (typeof id !== 'undefined') {
9095    playClipData.intervalId = undefined;
9096
9097    if (playClipData.usingFrameTimeVector) {
9098      clearTimeout(id);
9099    } else {
9100      clearInterval(id);
9101    }
9102  }
9103}
9104/**
9105 * [private] Trigger playClip tool stop event.
9106 * @param {HTMLElement} element
9107 * @returns {void}
9108 */
9109
9110
9111function triggerStopEvent(element) {
9112  var eventDetail = {
9113    element: element
9114  };
9115  Object(_util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_4__["default"])(element, _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].CLIP_STOPPED, eventDetail);
9116}
9117/**
9118 * Starts playing a clip or adjusts the frame rate of an already playing clip.  framesPerSecond is
9119 * optional and defaults to 30 if not specified.  A negative framesPerSecond will play the clip in reverse.
9120 * The element must be a stack of images
9121 * @param {HTMLElement} element
9122 * @param {number} framesPerSecond
9123 * @returns {void}
9124 */
9125
9126
9127function playClip(element, framesPerSecond) {
9128  var playClipData;
9129  var playClipTimeouts;
9130
9131  if (element === undefined) {
9132    throw new Error('playClip: element must not be undefined');
9133  }
9134
9135  var stackToolData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_3__["getToolState"])(element, 'stack');
9136
9137  if (!stackToolData || !stackToolData.data || !stackToolData.data.length) {
9138    return;
9139  }
9140
9141  var cornerstone = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone; // If we have more than one stack, check if we have a stack renderer defined
9142
9143  var stackRenderer;
9144
9145  if (stackToolData.data.length > 1) {
9146    var stackRendererData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_3__["getToolState"])(element, 'stackRenderer');
9147
9148    if (stackRendererData && stackRendererData.data && stackRendererData.data.length) {
9149      stackRenderer = stackRendererData.data[0];
9150    }
9151  }
9152
9153  var stackData = stackToolData.data[0];
9154  var playClipToolData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_3__["getToolState"])(element, toolType);
9155
9156  if (!playClipToolData || !playClipToolData.data || !playClipToolData.data.length) {
9157    playClipData = {
9158      intervalId: undefined,
9159      framesPerSecond: 30,
9160      lastFrameTimeStamp: undefined,
9161      frameRate: 0,
9162      frameTimeVector: undefined,
9163      ignoreFrameTimeVector: false,
9164      usingFrameTimeVector: false,
9165      speed: 1,
9166      reverse: false,
9167      loop: true
9168    };
9169    Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_3__["addToolState"])(element, toolType, playClipData);
9170  } else {
9171    playClipData = playClipToolData.data[0]; // Make sure the specified clip is not running before any property update
9172
9173    stopClipWithData(playClipData);
9174  } // If a framesPerSecond is specified and is valid, update the playClipData now
9175
9176
9177  if (framesPerSecond < 0 || framesPerSecond > 0) {
9178    playClipData.framesPerSecond = Number(framesPerSecond);
9179    playClipData.reverse = playClipData.framesPerSecond < 0; // If framesPerSecond is given, frameTimeVector will be ignored...
9180
9181    playClipData.ignoreFrameTimeVector = true;
9182  } // Determine if frame time vector should be used instead of a fixed frame rate...
9183
9184
9185  if (playClipData.ignoreFrameTimeVector !== true && playClipData.frameTimeVector && playClipData.frameTimeVector.length === stackData.imageIds.length) {
9186    playClipTimeouts = getPlayClipTimeouts(playClipData.frameTimeVector, playClipData.speed);
9187  } // This function encapsulates the frame rendering logic...
9188
9189
9190  var playClipAction = function playClipAction() {
9191    // Hoisting of context variables
9192    var loader,
9193        startLoadingHandler,
9194        endLoadingHandler,
9195        errorLoadingHandler,
9196        newImageIdIndex = stackData.currentImageIdIndex;
9197    var imageCount = stackData.imageIds.length;
9198
9199    if (playClipData.reverse) {
9200      newImageIdIndex--;
9201    } else {
9202      newImageIdIndex++;
9203    }
9204
9205    if (!playClipData.loop && (newImageIdIndex < 0 || newImageIdIndex >= imageCount)) {
9206      stopClipWithData(playClipData);
9207      triggerStopEvent(element);
9208      return;
9209    } // Loop around if we go outside the stack
9210
9211
9212    if (newImageIdIndex >= imageCount) {
9213      newImageIdIndex = 0;
9214    }
9215
9216    if (newImageIdIndex < 0) {
9217      newImageIdIndex = imageCount - 1;
9218    }
9219
9220    if (newImageIdIndex !== stackData.currentImageIdIndex) {
9221      startLoadingHandler = _stateManagement_loadHandlerManager_js__WEBPACK_IMPORTED_MODULE_2__["default"].getStartLoadHandler(element);
9222      endLoadingHandler = _stateManagement_loadHandlerManager_js__WEBPACK_IMPORTED_MODULE_2__["default"].getEndLoadHandler(element);
9223      errorLoadingHandler = _stateManagement_loadHandlerManager_js__WEBPACK_IMPORTED_MODULE_2__["default"].getErrorLoadingHandler(element);
9224
9225      if (startLoadingHandler) {
9226        startLoadingHandler(element);
9227      }
9228
9229      if (stackData.preventCache === true) {
9230        loader = cornerstone.loadImage(stackData.imageIds[newImageIdIndex]);
9231      } else {
9232        loader = cornerstone.loadAndCacheImage(stackData.imageIds[newImageIdIndex]);
9233      }
9234
9235      loader.then(function (image) {
9236        try {
9237          stackData.currentImageIdIndex = newImageIdIndex;
9238
9239          if (stackRenderer) {
9240            stackRenderer.currentImageIdIndex = newImageIdIndex;
9241            stackRenderer.render(element, stackToolData.data);
9242          } else {
9243            cornerstone.displayImage(element, image);
9244          }
9245
9246          if (endLoadingHandler) {
9247            endLoadingHandler(element, image);
9248          }
9249        } catch (error) {
9250          return;
9251        }
9252      }, function (error) {
9253        var imageId = stackData.imageIds[newImageIdIndex];
9254
9255        if (errorLoadingHandler) {
9256          errorLoadingHandler(element, imageId, error);
9257        }
9258      });
9259    }
9260  }; // If playClipTimeouts array is available, not empty and its elements are NOT uniform ...
9261  // ... (at least one timeout is different from the others), use alternate setTimeout implementation
9262
9263
9264  if (playClipTimeouts && playClipTimeouts.length > 0 && playClipTimeouts.isTimeVarying) {
9265    playClipData.usingFrameTimeVector = true;
9266    playClipData.intervalId = setTimeout(function playClipTimeoutHandler() {
9267      playClipData.intervalId = setTimeout(playClipTimeoutHandler, playClipTimeouts[stackData.currentImageIdIndex]);
9268      playClipAction();
9269    }, 0);
9270  } else {
9271    // ... otherwise user setInterval implementation which is much more efficient.
9272    playClipData.usingFrameTimeVector = false;
9273    playClipData.intervalId = setInterval(playClipAction, 1000 / Math.abs(playClipData.framesPerSecond));
9274  }
9275}
9276/**
9277 * Stops an already playing clip.
9278 * @param {HTMLElement} element
9279 * @returns {void}
9280 */
9281
9282
9283function stopClip(element) {
9284  var playClipToolData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_3__["getToolState"])(element, toolType);
9285
9286  if (!playClipToolData || !playClipToolData.data || !playClipToolData.data.length) {
9287    return;
9288  }
9289
9290  stopClipWithData(playClipToolData.data[0]);
9291}
9292
9293
9294
9295/***/ }),
9296
9297/***/ "./stackTools/stackPrefetch.js":
9298/*!*************************************!*\
9299  !*** ./stackTools/stackPrefetch.js ***!
9300  \*************************************/
9301/*! exports provided: default */
9302/***/ (function(module, __webpack_exports__, __webpack_require__) {
9303
9304"use strict";
9305__webpack_require__.r(__webpack_exports__);
9306/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../externalModules.js */ "./externalModules.js");
9307/* harmony import */ var _requestPool_requestPoolManager_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../requestPool/requestPoolManager.js */ "./requestPool/requestPoolManager.js");
9308/* harmony import */ var _stateManagement_loadHandlerManager_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../stateManagement/loadHandlerManager.js */ "./stateManagement/loadHandlerManager.js");
9309/* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../stateManagement/toolState.js */ "./stateManagement/toolState.js");
9310/* harmony import */ var _util_getMaxSimultaneousRequests_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../util/getMaxSimultaneousRequests.js */ "./util/getMaxSimultaneousRequests.js");
9311/* harmony import */ var _util_logger_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../util/logger.js */ "./util/logger.js");
9312
9313
9314
9315
9316
9317
9318var logger = Object(_util_logger_js__WEBPACK_IMPORTED_MODULE_5__["getLogger"])('stackTools:stackPrefetch');
9319var toolType = 'stackPrefetch';
9320var requestType = 'prefetch';
9321var configuration = {
9322  maxImagesToPrefetch: Infinity
9323};
9324var resetPrefetchTimeout;
9325var resetPrefetchDelay = 10;
9326
9327function range(lowEnd, highEnd) {
9328  // Javascript version of Python's range function
9329  // http://stackoverflow.com/questions/3895478/does-javascript-have-a-method-like-range-to-generate-an-array-based-on-suppl
9330  lowEnd = Math.round(lowEnd) || 0;
9331  highEnd = Math.round(highEnd) || 0;
9332  var arr = [];
9333  var c = highEnd - lowEnd + 1;
9334
9335  if (c <= 0) {
9336    return arr;
9337  }
9338
9339  while (c--) {
9340    arr[c] = highEnd--;
9341  }
9342
9343  return arr;
9344}
9345
9346var max = function max(arr) {
9347  return Math.max.apply(null, arr);
9348};
9349
9350var min = function min(arr) {
9351  return Math.min.apply(null, arr);
9352};
9353
9354function nearestIndex(arr, x) {
9355  // Return index of nearest values in array
9356  // http://stackoverflow.com/questions/25854212/return-index-of-nearest-values-in-an-array
9357  var l = [];
9358  var h = [];
9359  arr.forEach(function (v) {
9360    if (v < x) {
9361      l.push(v);
9362    } else if (v > x) {
9363      h.push(v);
9364    }
9365  });
9366  return {
9367    low: arr.indexOf(max(l)),
9368    high: arr.indexOf(min(h))
9369  };
9370}
9371
9372function prefetch(element) {
9373  // Check to make sure stack data exists
9374  var stackData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_3__["getToolState"])(element, 'stack');
9375
9376  if (!stackData || !stackData.data || !stackData.data.length) {
9377    return;
9378  }
9379
9380  var stack = stackData.data[0]; // Get the stackPrefetch tool data
9381
9382  var stackPrefetchData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_3__["getToolState"])(element, toolType);
9383
9384  if (!stackPrefetchData) {
9385    return;
9386  }
9387
9388  var stackPrefetch = stackPrefetchData.data[0] || {}; // If all the requests are complete, disable the stackPrefetch tool
9389
9390  if (!stackPrefetch.indicesToRequest || !stackPrefetch.indicesToRequest.length) {
9391    stackPrefetch.enabled = false;
9392  } // Make sure the tool is still enabled
9393
9394
9395  if (stackPrefetch.enabled === false) {
9396    return;
9397  } // Remove an imageIdIndex from the list of indices to request
9398  // This fires when the individual image loading deferred is resolved
9399
9400
9401  function removeFromList(imageIdIndex) {
9402    var index = stackPrefetch.indicesToRequest.indexOf(imageIdIndex);
9403
9404    if (index > -1) {
9405      // Don't remove last element if imageIdIndex not found
9406      stackPrefetch.indicesToRequest.splice(index, 1);
9407    }
9408  } // Remove all already cached images from the
9409  // IndicesToRequest array
9410
9411
9412  stackPrefetchData.data[0].indicesToRequest.sort(function (a, b) {
9413    return a - b;
9414  });
9415  var indicesToRequestCopy = stackPrefetch.indicesToRequest.slice();
9416  indicesToRequestCopy.forEach(function (imageIdIndex) {
9417    var imageId = stack.imageIds[imageIdIndex];
9418
9419    if (!imageId) {
9420      return;
9421    }
9422
9423    var imageLoadObject = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.imageCache.getImageLoadObject(imageId);
9424
9425    if (imageLoadObject) {
9426      removeFromList(imageIdIndex);
9427    }
9428  }); // Stop here if there are no images left to request
9429  // After those in the cache have been removed
9430
9431  if (!stackPrefetch.indicesToRequest.length) {
9432    return;
9433  } // Clear the requestPool of prefetch requests
9434
9435
9436  _requestPool_requestPoolManager_js__WEBPACK_IMPORTED_MODULE_1__["default"].clearRequestStack(requestType); // Identify the nearest imageIdIndex to the currentImageIdIndex
9437
9438  var nearest = nearestIndex(stackPrefetch.indicesToRequest, stack.currentImageIdIndex);
9439  var imageId;
9440  var nextImageIdIndex;
9441  var preventCache = false;
9442
9443  function doneCallback(image) {
9444    logger.log('prefetch done: %s', image.imageId);
9445    var imageIdIndex = stack.imageIds.indexOf(image.imageId);
9446    removeFromList(imageIdIndex);
9447  } // Retrieve the errorLoadingHandler if one exists
9448
9449
9450  var errorLoadingHandler = _stateManagement_loadHandlerManager_js__WEBPACK_IMPORTED_MODULE_2__["default"].getErrorLoadingHandler(element);
9451
9452  function failCallback(error) {
9453    logger.log('prefetch errored: %o', error);
9454
9455    if (errorLoadingHandler) {
9456      errorLoadingHandler(element, imageId, error, 'stackPrefetch');
9457    }
9458  } // Prefetch images around the current image (before and after)
9459
9460
9461  var lowerIndex = nearest.low;
9462  var higherIndex = nearest.high;
9463
9464  while (lowerIndex >= 0 || higherIndex < stackPrefetch.indicesToRequest.length) {
9465    var currentIndex = stack.currentImageIdIndex;
9466    var shouldSkipLower = currentIndex - stackPrefetch.indicesToRequest[lowerIndex] > configuration.maxImagesToPrefetch;
9467    var shouldSkipHigher = stackPrefetch.indicesToRequest[higherIndex] - currentIndex > configuration.maxImagesToPrefetch;
9468    var shouldLoadLower = !shouldSkipLower && lowerIndex >= 0;
9469    var shouldLoadHigher = !shouldSkipHigher && higherIndex < stackPrefetch.indicesToRequest.length;
9470
9471    if (!shouldLoadHigher && !shouldLoadLower) {
9472      break;
9473    }
9474
9475    if (shouldLoadLower) {
9476      nextImageIdIndex = stackPrefetch.indicesToRequest[lowerIndex--];
9477      imageId = stack.imageIds[nextImageIdIndex];
9478      _requestPool_requestPoolManager_js__WEBPACK_IMPORTED_MODULE_1__["default"].addRequest(element, imageId, requestType, preventCache, doneCallback, failCallback);
9479    }
9480
9481    if (shouldLoadHigher) {
9482      nextImageIdIndex = stackPrefetch.indicesToRequest[higherIndex++];
9483      imageId = stack.imageIds[nextImageIdIndex];
9484      _requestPool_requestPoolManager_js__WEBPACK_IMPORTED_MODULE_1__["default"].addRequest(element, imageId, requestType, preventCache, doneCallback, failCallback);
9485    }
9486  } // Try to start the requestPool's grabbing procedure
9487  // In case it isn't already running
9488
9489
9490  _requestPool_requestPoolManager_js__WEBPACK_IMPORTED_MODULE_1__["default"].startGrabbing();
9491}
9492
9493function getPromiseRemovedHandler(element) {
9494  return function (e) {
9495    var eventData = e.detail; // When an imagePromise has been pushed out of the cache, re-add its index
9496    // It to the indicesToRequest list so that it will be retrieved later if the
9497    // CurrentImageIdIndex is changed to an image nearby
9498
9499    var stackData;
9500
9501    try {
9502      // It will throw an exception in some cases (eg: thumbnails)
9503      stackData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_3__["getToolState"])(element, 'stack');
9504    } catch (error) {
9505      return;
9506    }
9507
9508    if (!stackData || !stackData.data || !stackData.data.length) {
9509      return;
9510    }
9511
9512    var stack = stackData.data[0];
9513    var imageIdIndex = stack.imageIds.indexOf(eventData.imageId); // Make sure the image that was removed is actually in this stack
9514    // Before adding it to the indicesToRequest array
9515
9516    if (imageIdIndex < 0) {
9517      return;
9518    }
9519
9520    var stackPrefetchData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_3__["getToolState"])(element, toolType);
9521
9522    if (!stackPrefetchData || !stackPrefetchData.data || !stackPrefetchData.data.length) {
9523      return;
9524    }
9525
9526    stackPrefetchData.data[0].indicesToRequest.push(imageIdIndex);
9527  };
9528}
9529
9530function onImageUpdated(e) {
9531  // Start prefetching again (after a delay)
9532  // When the user has scrolled to a new image
9533  clearTimeout(resetPrefetchTimeout);
9534  resetPrefetchTimeout = setTimeout(function () {
9535    var element = e.target; // If playClip is enabled and the user loads a different series in the viewport
9536    // An exception will be thrown because the element will not be enabled anymore
9537
9538    try {
9539      prefetch(element);
9540    } catch (error) {
9541      return;
9542    }
9543  }, resetPrefetchDelay);
9544}
9545
9546function enable(element) {
9547  // Clear old prefetch data. Skipping this can cause problems when changing the series inside an element
9548  var stackPrefetchDataArray = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_3__["getToolState"])(element, toolType);
9549  stackPrefetchDataArray.data = []; // First check that there is stack data available
9550
9551  var stackData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_3__["getToolState"])(element, 'stack');
9552
9553  if (!stackData || !stackData.data || !stackData.data.length) {
9554    return;
9555  }
9556
9557  var stack = stackData.data[0]; // Check if we are allowed to cache images in this stack
9558
9559  if (stack.preventCache === true) {
9560    logger.warn('A stack that should not be cached was given the stackPrefetch');
9561    return;
9562  } // Use the currentImageIdIndex from the stack as the initalImageIdIndex
9563
9564
9565  var stackPrefetchData = {
9566    indicesToRequest: range(0, stack.imageIds.length - 1),
9567    enabled: true,
9568    direction: 1
9569  }; // Remove the currentImageIdIndex from the list to request
9570
9571  var indexOfCurrentImage = stackPrefetchData.indicesToRequest.indexOf(stack.currentImageIdIndex);
9572  stackPrefetchData.indicesToRequest.splice(indexOfCurrentImage, 1);
9573  Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_3__["addToolState"])(element, toolType, stackPrefetchData);
9574  prefetch(element);
9575  element.removeEventListener(_externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.EVENTS.NEW_IMAGE, onImageUpdated);
9576  element.addEventListener(_externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.EVENTS.NEW_IMAGE, onImageUpdated);
9577  var promiseRemovedHandler = getPromiseRemovedHandler(element);
9578  _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.events.removeEventListener(_externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.EVENTS.IMAGE_CACHE_PROMISE_REMOVED, promiseRemovedHandler);
9579  _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.events.addEventListener(_externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.EVENTS.IMAGE_CACHE_PROMISE_REMOVED, promiseRemovedHandler);
9580}
9581
9582function disable(element) {
9583  clearTimeout(resetPrefetchTimeout);
9584  element.removeEventListener(_externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.EVENTS.NEW_IMAGE, onImageUpdated);
9585  var promiseRemovedHandler = getPromiseRemovedHandler(element);
9586  _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.events.removeEventListener(_externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.EVENTS.IMAGE_CACHE_PROMISE_REMOVED, promiseRemovedHandler);
9587  var stackPrefetchData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_3__["getToolState"])(element, toolType); // If there is actually something to disable, disable it
9588
9589  if (stackPrefetchData && stackPrefetchData.data.length) {
9590    stackPrefetchData.data[0].enabled = false; // Clear current prefetch requests from the requestPool
9591
9592    _requestPool_requestPoolManager_js__WEBPACK_IMPORTED_MODULE_1__["default"].clearRequestStack(requestType);
9593  }
9594}
9595
9596function getConfiguration() {
9597  return configuration;
9598}
9599
9600function setConfiguration(config) {
9601  configuration = config;
9602
9603  if (config.maxSimultaneousRequests) {
9604    Object(_util_getMaxSimultaneousRequests_js__WEBPACK_IMPORTED_MODULE_4__["setMaxSimultaneousRequests"])(config.maxSimultaneousRequests);
9605  }
9606} // Module/private exports
9607
9608
9609var stackPrefetch = {
9610  enable: enable,
9611  disable: disable,
9612  getConfiguration: getConfiguration,
9613  setConfiguration: setConfiguration
9614};
9615/* harmony default export */ __webpack_exports__["default"] = (stackPrefetch);
9616
9617/***/ }),
9618
9619/***/ "./stackTools/stackRenderers.js":
9620/*!**************************************!*\
9621  !*** ./stackTools/stackRenderers.js ***!
9622  \**************************************/
9623/*! exports provided: default */
9624/***/ (function(module, __webpack_exports__, __webpack_require__) {
9625
9626"use strict";
9627__webpack_require__.r(__webpack_exports__);
9628/* harmony import */ var _fusionRenderer_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./fusionRenderer.js */ "./stackTools/fusionRenderer.js");
9629
9630var stackRenderers = {};
9631stackRenderers.FusionRenderer = _fusionRenderer_js__WEBPACK_IMPORTED_MODULE_0__["default"];
9632/* harmony default export */ __webpack_exports__["default"] = (stackRenderers);
9633
9634/***/ }),
9635
9636/***/ "./stateManagement/frameOfReferenceStateManager.js":
9637/*!*********************************************************!*\
9638  !*** ./stateManagement/frameOfReferenceStateManager.js ***!
9639  \*********************************************************/
9640/*! exports provided: newFrameOfReferenceSpecificToolStateManager, globalFrameOfReferenceSpecificToolStateManager */
9641/***/ (function(module, __webpack_exports__, __webpack_require__) {
9642
9643"use strict";
9644__webpack_require__.r(__webpack_exports__);
9645/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "newFrameOfReferenceSpecificToolStateManager", function() { return newFrameOfReferenceSpecificToolStateManager; });
9646/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "globalFrameOfReferenceSpecificToolStateManager", function() { return globalFrameOfReferenceSpecificToolStateManager; });
9647/**
9648 * Implements a frame-of-reference specific tool state management strategy.  This means that
9649 * Measurement data are tied to a specific frame of reference UID and only visible to objects using
9650 * That frame-of-reference UID.
9651 * @public
9652 * @constructor newFrameOfReferenceSpecificToolStateManager
9653 * @memberof StateManagement
9654 *
9655 * @returns {Object} A frameOfReferenceSpecificToolStateManager instance.
9656 */
9657function newFrameOfReferenceSpecificToolStateManager() {
9658  var toolState = {}; // Here we add tool state, this is done by tools as well
9659  // As modules that restore saved state
9660
9661  function addFrameOfReferenceSpecificToolState(frameOfReference, toolType, data) {
9662    // If we don't have any tool state for this frameOfReference, add an empty object
9663    if (toolState.hasOwnProperty(frameOfReference) === false) {
9664      toolState[frameOfReference] = {};
9665    }
9666
9667    var frameOfReferenceToolState = toolState[frameOfReference]; // If we don't have tool state for this type of tool, add an empty object
9668
9669    if (frameOfReferenceToolState.hasOwnProperty(toolType) === false) {
9670      frameOfReferenceToolState[toolType] = {
9671        data: []
9672      };
9673    }
9674
9675    var toolData = frameOfReferenceToolState[toolType]; // Finally, add this new tool to the state
9676
9677    toolData.data.push(data);
9678  } // Here you can get state - used by tools as well as modules
9679  // That save state persistently
9680
9681
9682  function getFrameOfReferenceSpecificToolState(frameOfReference, toolType) {
9683    // If we don't have any tool state for this frame of reference, return undefined
9684    if (toolState.hasOwnProperty(frameOfReference) === false) {
9685      return;
9686    }
9687
9688    var frameOfReferenceToolState = toolState[frameOfReference]; // If we don't have tool state for this type of tool, return undefined
9689
9690    if (frameOfReferenceToolState.hasOwnProperty(toolType) === false) {
9691      return;
9692    }
9693
9694    var toolData = frameOfReferenceToolState[toolType];
9695    return toolData;
9696  }
9697
9698  function removeFrameOfReferenceSpecificToolState(frameOfReference, toolType, data) {
9699    // If we don't have any tool state for this frame of reference, return undefined
9700    if (toolState.hasOwnProperty(frameOfReference) === false) {
9701      return;
9702    }
9703
9704    var frameOfReferenceToolState = toolState[frameOfReference]; // If we don't have tool state for this type of tool, return undefined
9705
9706    if (frameOfReferenceToolState.hasOwnProperty(toolType) === false) {
9707      return;
9708    }
9709
9710    var toolData = frameOfReferenceToolState[toolType]; // Find this tool data
9711
9712    var indexOfData = -1;
9713
9714    for (var i = 0; i < toolData.data.length; i++) {
9715      if (toolData.data[i] === data) {
9716        indexOfData = i;
9717      }
9718    }
9719
9720    if (indexOfData !== -1) {
9721      toolData.data.splice(indexOfData, 1);
9722    }
9723  }
9724
9725  return {
9726    get: getFrameOfReferenceSpecificToolState,
9727    add: addFrameOfReferenceSpecificToolState,
9728    remove: removeFrameOfReferenceSpecificToolState
9729  };
9730} // A global frameOfReferenceSpecificToolStateManager - the most common case is to share 3d information
9731// Between stacks of images
9732
9733
9734var globalFrameOfReferenceSpecificToolStateManager = newFrameOfReferenceSpecificToolStateManager();
9735
9736
9737/***/ }),
9738
9739/***/ "./stateManagement/imageIdSpecificStateManager.js":
9740/*!********************************************************!*\
9741  !*** ./stateManagement/imageIdSpecificStateManager.js ***!
9742  \********************************************************/
9743/*! exports provided: newImageIdSpecificToolStateManager, globalImageIdSpecificToolStateManager */
9744/***/ (function(module, __webpack_exports__, __webpack_require__) {
9745
9746"use strict";
9747__webpack_require__.r(__webpack_exports__);
9748/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "newImageIdSpecificToolStateManager", function() { return newImageIdSpecificToolStateManager; });
9749/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "globalImageIdSpecificToolStateManager", function() { return globalImageIdSpecificToolStateManager; });
9750/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js");
9751
9752/**
9753 * Implements an imageId specific tool state management strategy.  This means that
9754 * Measurements data is tied to a specific imageId and only visible for enabled elements
9755 * That are displaying that imageId.
9756 * @public
9757 * @constructor newImageIdSpecificToolStateManager
9758 * @memberof StateManagement
9759 *
9760 * @returns {Object} An imageIdSpecificToolStateManager instance.
9761 */
9762
9763function newImageIdSpecificToolStateManager() {
9764  var toolState = {}; // Here we add tool state, this is done by tools as well
9765  // As modules that restore saved state
9766
9767  function saveImageIdToolState(imageId) {
9768    return toolState[imageId];
9769  }
9770
9771  function restoreImageIdToolState(imageId, imageIdToolState) {
9772    toolState[imageId] = imageIdToolState;
9773  }
9774
9775  function saveToolState() {
9776    return toolState;
9777  }
9778
9779  function restoreToolState(savedToolState) {
9780    toolState = savedToolState;
9781  } // Here we add tool state, this is done by tools as well
9782  // As modules that restore saved state
9783
9784
9785  function addImageIdSpecificToolState(element, toolType, data) {
9786    var enabledElement = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.getEnabledElement(element); // If we don't have an image for this element exit early
9787
9788    if (!enabledElement.image) {
9789      return;
9790    } // If we don't have any tool state for this imageId, add an empty object
9791
9792
9793    if (toolState.hasOwnProperty(enabledElement.image.imageId) === false) {
9794      toolState[enabledElement.image.imageId] = {};
9795    }
9796
9797    var imageIdToolState = toolState[enabledElement.image.imageId]; // If we don't have tool state for this type of tool, add an empty object
9798
9799    if (imageIdToolState.hasOwnProperty(toolType) === false) {
9800      imageIdToolState[toolType] = {
9801        data: []
9802      };
9803    }
9804
9805    var toolData = imageIdToolState[toolType]; // Finally, add this new tool to the state
9806
9807    toolData.data.push(data);
9808  } // Here you can get state - used by tools as well as modules
9809  // That save state persistently
9810
9811
9812  function getImageIdSpecificToolState(element, toolType) {
9813    var enabledElement = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.getEnabledElement(element); // If we don't have any tool state for this imageId, return undefined
9814
9815    if (!enabledElement.image || toolState.hasOwnProperty(enabledElement.image.imageId) === false) {
9816      return;
9817    }
9818
9819    var imageIdToolState = toolState[enabledElement.image.imageId]; // If we don't have tool state for this type of tool, return undefined
9820
9821    if (imageIdToolState.hasOwnProperty(toolType) === false) {
9822      return;
9823    }
9824
9825    var toolData = imageIdToolState[toolType];
9826    return toolData;
9827  } // Clears all tool data from this toolStateManager.
9828
9829
9830  function clearImageIdSpecificToolStateManager(element) {
9831    var enabledElement = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.getEnabledElement(element);
9832
9833    if (!enabledElement.image || toolState.hasOwnProperty(enabledElement.image.imageId) === false) {
9834      return;
9835    }
9836
9837    delete toolState[enabledElement.image.imageId];
9838  }
9839
9840  return {
9841    get: getImageIdSpecificToolState,
9842    add: addImageIdSpecificToolState,
9843    clear: clearImageIdSpecificToolStateManager,
9844    saveImageIdToolState: saveImageIdToolState,
9845    restoreImageIdToolState: restoreImageIdToolState,
9846    saveToolState: saveToolState,
9847    restoreToolState: restoreToolState,
9848    toolState: toolState
9849  };
9850} // A global imageIdSpecificToolStateManager - the most common case is to share state between all
9851// Visible enabled images
9852
9853
9854var globalImageIdSpecificToolStateManager = newImageIdSpecificToolStateManager();
9855
9856
9857/***/ }),
9858
9859/***/ "./stateManagement/loadHandlerManager.js":
9860/*!***********************************************!*\
9861  !*** ./stateManagement/loadHandlerManager.js ***!
9862  \***********************************************/
9863/*! exports provided: default */
9864/***/ (function(module, __webpack_exports__, __webpack_require__) {
9865
9866"use strict";
9867__webpack_require__.r(__webpack_exports__);
9868/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js");
9869
9870var _DEFAULT_LOAD_HANDLER = 'DEFAULT';
9871var defaultStartLoadHandler = {};
9872var defaultEndLoadHandler = {};
9873var defaultErrorLoadingHandler = {};
9874
9875function _getUUIDFromElement(element) {
9876  if (!element) {
9877    return _DEFAULT_LOAD_HANDLER;
9878  }
9879
9880  var uuid = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.getEnabledElement(element).uuid;
9881
9882  if (!uuid) {
9883    throw new Error('Something went wrong when getting uuid from element');
9884  }
9885
9886  return uuid;
9887}
9888
9889function setStartLoadHandler(handler) {
9890  var element = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : undefined;
9891
9892  if (!handler) {
9893    throw new Error('The Handler function must be defined');
9894  }
9895
9896  var uuid = _getUUIDFromElement(element);
9897
9898  defaultStartLoadHandler[uuid] = handler;
9899}
9900
9901function getStartLoadHandler(element) {
9902  var uuid = _getUUIDFromElement(element);
9903
9904  return defaultStartLoadHandler[uuid] || defaultStartLoadHandler[_DEFAULT_LOAD_HANDLER];
9905}
9906
9907function setEndLoadHandler(handler) {
9908  var element = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : undefined;
9909
9910  if (!handler) {
9911    throw new Error('The Handler function must be defined');
9912  }
9913
9914  var uuid = _getUUIDFromElement(element);
9915
9916  defaultEndLoadHandler[uuid] = handler;
9917}
9918
9919function getEndLoadHandler(element) {
9920  var uuid = _getUUIDFromElement(element);
9921
9922  return defaultEndLoadHandler[uuid] || defaultEndLoadHandler[_DEFAULT_LOAD_HANDLER];
9923}
9924
9925function setErrorLoadingHandler(handler) {
9926  var element = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : undefined;
9927
9928  if (!handler) {
9929    throw new Error('The Handler function must be defined');
9930  }
9931
9932  var uuid = _getUUIDFromElement(element);
9933
9934  defaultErrorLoadingHandler[uuid] = handler;
9935}
9936
9937function getErrorLoadingHandler(element) {
9938  var uuid = _getUUIDFromElement(element);
9939
9940  return defaultErrorLoadingHandler[uuid] || defaultErrorLoadingHandler[_DEFAULT_LOAD_HANDLER];
9941}
9942
9943function removeHandlers(element) {
9944  var uuid = _getUUIDFromElement(element);
9945
9946  delete defaultStartLoadHandler[uuid];
9947  delete defaultEndLoadHandler[uuid];
9948  delete defaultErrorLoadingHandler[uuid];
9949}
9950
9951var loadHandlerManager = {
9952  setStartLoadHandler: setStartLoadHandler,
9953  getStartLoadHandler: getStartLoadHandler,
9954  setEndLoadHandler: setEndLoadHandler,
9955  getEndLoadHandler: getEndLoadHandler,
9956  setErrorLoadingHandler: setErrorLoadingHandler,
9957  getErrorLoadingHandler: getErrorLoadingHandler,
9958  removeHandlers: removeHandlers
9959};
9960/* harmony default export */ __webpack_exports__["default"] = (loadHandlerManager);
9961
9962/***/ }),
9963
9964/***/ "./stateManagement/stackSpecificStateManager.js":
9965/*!******************************************************!*\
9966  !*** ./stateManagement/stackSpecificStateManager.js ***!
9967  \******************************************************/
9968/*! exports provided: stackSpecificStateManager, newStackSpecificToolStateManager, addStackStateManager */
9969/***/ (function(module, __webpack_exports__, __webpack_require__) {
9970
9971"use strict";
9972__webpack_require__.r(__webpack_exports__);
9973/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "stackSpecificStateManager", function() { return stackSpecificStateManager; });
9974/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "newStackSpecificToolStateManager", function() { return newStackSpecificToolStateManager; });
9975/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addStackStateManager", function() { return addStackStateManager; });
9976/* harmony import */ var _imageIdSpecificStateManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./imageIdSpecificStateManager.js */ "./stateManagement/imageIdSpecificStateManager.js");
9977/* harmony import */ var _toolState_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./toolState.js */ "./stateManagement/toolState.js");
9978
9979
9980/**
9981 * Implements an Stack specific tool state management strategy. This means
9982 * That tool data is shared between all imageIds in a given stack.
9983 * @public
9984 * @constructor newStackSpecificToolStateManager
9985 * @memberof StateManagement
9986 *
9987 * @param  {string[]} toolTypes       The tool types to apply to the stack.
9988 * @param  {Object} oldStateManager The imageIdSpecificStateManager.
9989 * @returns {Object} A stackSpecificToolStateManager instance.
9990 */
9991
9992function newStackSpecificToolStateManager(toolTypes, oldStateManager) {
9993  var toolState = {};
9994
9995  function saveToolState() {
9996    return toolState;
9997  }
9998
9999  function restoreToolState(stackToolState) {
10000    toolState = stackToolState;
10001  } // Here we add tool state, this is done by tools as well
10002  // As modules that restore saved state
10003
10004
10005  function addStackSpecificToolState(element, toolType, data) {
10006    // If this is a tool type to apply to the stack, do so
10007    if (toolTypes.indexOf(toolType) >= 0) {
10008      // If we don't have tool state for this type of tool, add an empty object
10009      if (toolState.hasOwnProperty(toolType) === false) {
10010        toolState[toolType] = {
10011          data: []
10012        };
10013      }
10014
10015      var toolData = toolState[toolType]; // Finally, add this new tool to the state
10016
10017      toolData.data.push(data);
10018    } else {
10019      // Call the imageId specific tool state manager
10020      return oldStateManager.add(element, toolType, data);
10021    }
10022  } // Here you can get state - used by tools as well as modules
10023  // That save state persistently
10024
10025
10026  function getStackSpecificToolState(element, toolType) {
10027    // If this is a tool type to apply to the stack, do so
10028    if (toolTypes.indexOf(toolType) >= 0) {
10029      // If we don't have tool state for this type of tool, add an empty object
10030      if (toolState.hasOwnProperty(toolType) === false) {
10031        toolState[toolType] = {
10032          data: []
10033        };
10034      }
10035
10036      return toolState[toolType];
10037    } // Call the imageId specific tool state manager
10038
10039
10040    return oldStateManager.get(element, toolType);
10041  }
10042
10043  var stackSpecificToolStateManager = {
10044    get: getStackSpecificToolState,
10045    add: addStackSpecificToolState,
10046    saveToolState: saveToolState,
10047    restoreToolState: restoreToolState,
10048    toolState: toolState
10049  };
10050  return stackSpecificToolStateManager;
10051}
10052
10053var stackStateManagers = [];
10054
10055function addStackStateManager(element, otherTools) {
10056  var oldStateManager = Object(_toolState_js__WEBPACK_IMPORTED_MODULE_1__["getElementToolStateManager"])(element);
10057
10058  if (!oldStateManager) {
10059    oldStateManager = _imageIdSpecificStateManager_js__WEBPACK_IMPORTED_MODULE_0__["globalImageIdSpecificToolStateManager"];
10060  }
10061
10062  var stackTools = ['stack', 'stackPrefetch', 'playClip', 'volume', 'slab', 'referenceLines', 'crosshairs', 'stackRenderer'];
10063
10064  if (otherTools) {
10065    stackTools = stackTools.concat(otherTools);
10066  }
10067
10068  var stackSpecificStateManager = newStackSpecificToolStateManager(stackTools, oldStateManager);
10069  stackStateManagers.push(stackSpecificStateManager);
10070  Object(_toolState_js__WEBPACK_IMPORTED_MODULE_1__["setElementToolStateManager"])(element, stackSpecificStateManager);
10071}
10072
10073var stackSpecificStateManager = {
10074  newStackSpecificToolStateManager: newStackSpecificToolStateManager,
10075  addStackStateManager: addStackStateManager
10076};
10077
10078
10079/***/ }),
10080
10081/***/ "./stateManagement/textStyle.js":
10082/*!**************************************!*\
10083  !*** ./stateManagement/textStyle.js ***!
10084  \**************************************/
10085/*! exports provided: default */
10086/***/ (function(module, __webpack_exports__, __webpack_require__) {
10087
10088"use strict";
10089__webpack_require__.r(__webpack_exports__);
10090var defaultFontSize = 15,
10091    defaultFont = "".concat(defaultFontSize, "px Arial"),
10092    defaultBackgroundColor = 'transparent';
10093
10094function setFont(font) {
10095  defaultFont = font;
10096}
10097
10098function getFont() {
10099  return defaultFont;
10100}
10101
10102function setFontSize(fontSize) {
10103  defaultFontSize = fontSize;
10104}
10105
10106function getFontSize() {
10107  return defaultFontSize;
10108}
10109
10110function setBackgroundColor(backgroundColor) {
10111  defaultBackgroundColor = backgroundColor;
10112}
10113
10114function getBackgroundColor() {
10115  return defaultBackgroundColor;
10116}
10117
10118var textStyle = {
10119  setFont: setFont,
10120  getFont: getFont,
10121  setFontSize: setFontSize,
10122  getFontSize: getFontSize,
10123  setBackgroundColor: setBackgroundColor,
10124  getBackgroundColor: getBackgroundColor
10125};
10126/* harmony default export */ __webpack_exports__["default"] = (textStyle);
10127
10128/***/ }),
10129
10130/***/ "./stateManagement/toolColors.js":
10131/*!***************************************!*\
10132  !*** ./stateManagement/toolColors.js ***!
10133  \***************************************/
10134/*! exports provided: default */
10135/***/ (function(module, __webpack_exports__, __webpack_require__) {
10136
10137"use strict";
10138__webpack_require__.r(__webpack_exports__);
10139var defaultColor = 'white',
10140    activeColor = 'greenyellow',
10141    fillColor = 'transparent';
10142
10143function setFillColor(color) {
10144  fillColor = color;
10145}
10146
10147function getFillColor() {
10148  return fillColor;
10149}
10150
10151function setToolColor(color) {
10152  defaultColor = color;
10153}
10154
10155function getToolColor() {
10156  return defaultColor;
10157}
10158
10159function setActiveColor(color) {
10160  activeColor = color;
10161}
10162
10163function getActiveColor() {
10164  return activeColor;
10165}
10166
10167function getColorIfActive(data) {
10168  if (data.color) {
10169    return data.color;
10170  }
10171
10172  return data.active ? activeColor : defaultColor;
10173}
10174
10175var toolColors = {
10176  setFillColor: setFillColor,
10177  getFillColor: getFillColor,
10178  setToolColor: setToolColor,
10179  getToolColor: getToolColor,
10180  setActiveColor: setActiveColor,
10181  getActiveColor: getActiveColor,
10182  getColorIfActive: getColorIfActive
10183};
10184/* harmony default export */ __webpack_exports__["default"] = (toolColors);
10185
10186/***/ }),
10187
10188/***/ "./stateManagement/toolCoordinates.js":
10189/*!********************************************!*\
10190  !*** ./stateManagement/toolCoordinates.js ***!
10191  \********************************************/
10192/*! exports provided: default */
10193/***/ (function(module, __webpack_exports__, __webpack_require__) {
10194
10195"use strict";
10196__webpack_require__.r(__webpack_exports__);
10197var coordsData;
10198
10199function setCoords(eventData) {
10200  coordsData = eventData.currentPoints.canvas;
10201}
10202
10203function getCoords() {
10204  return coordsData;
10205}
10206
10207var toolCoordinates = {
10208  setCoords: setCoords,
10209  getCoords: getCoords
10210};
10211/* harmony default export */ __webpack_exports__["default"] = (toolCoordinates);
10212
10213/***/ }),
10214
10215/***/ "./stateManagement/toolState.js":
10216/*!**************************************!*\
10217  !*** ./stateManagement/toolState.js ***!
10218  \**************************************/
10219/*! exports provided: addToolState, getToolState, removeToolState, clearToolState, setElementToolStateManager, getElementToolStateManager */
10220/***/ (function(module, __webpack_exports__, __webpack_require__) {
10221
10222"use strict";
10223__webpack_require__.r(__webpack_exports__);
10224/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addToolState", function() { return addToolState; });
10225/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getToolState", function() { return getToolState; });
10226/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "removeToolState", function() { return removeToolState; });
10227/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "clearToolState", function() { return clearToolState; });
10228/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setElementToolStateManager", function() { return setElementToolStateManager; });
10229/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getElementToolStateManager", function() { return getElementToolStateManager; });
10230/* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../events.js */ "./events.js");
10231/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js");
10232/* harmony import */ var _imageIdSpecificStateManager_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./imageIdSpecificStateManager.js */ "./stateManagement/imageIdSpecificStateManager.js");
10233/* harmony import */ var _util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../util/triggerEvent.js */ "./util/triggerEvent.js");
10234
10235
10236
10237
10238/**
10239 * Returns the toolstate for a specific element.
10240 * @public
10241 * @function getElementToolStateManager
10242 *
10243 * @param  {HTMLElement} element The element.
10244 * @returns {Object} The toolState.
10245 */
10246
10247function getElementToolStateManager(element) {
10248  var enabledElement = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.getEnabledElement(element); // If the enabledElement has no toolStateManager, create a default one for it
10249  // NOTE: This makes state management element specific
10250
10251  if (enabledElement.toolStateManager === undefined) {
10252    enabledElement.toolStateManager = _imageIdSpecificStateManager_js__WEBPACK_IMPORTED_MODULE_2__["globalImageIdSpecificToolStateManager"];
10253  }
10254
10255  return enabledElement.toolStateManager;
10256}
10257/**
10258 * Adds tool state to the toolStateManager, this is done by tools as well
10259 * as modules that restore saved state.
10260 * @public
10261 * @method addToolState
10262 *
10263 * @param  {HTMLElement} element  The element.
10264 * @param  {string} toolType      The toolType of the state.
10265 * @param  {Object} measurementData The data to store in the state.
10266 * @returns {undefined}
10267 */
10268
10269
10270function addToolState(element, toolType, measurementData) {
10271  var toolStateManager = getElementToolStateManager(element);
10272  toolStateManager.add(element, toolType, measurementData);
10273  var eventType = _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MEASUREMENT_ADDED;
10274  var eventData = {
10275    toolType: toolType,
10276    element: element,
10277    measurementData: measurementData
10278  };
10279  Object(_util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_3__["default"])(element, eventType, eventData);
10280}
10281/**
10282 * Returns tool specific state of an element. Used by tools as well as modules
10283 * that save state persistently
10284 * @export
10285 * @public
10286 * @method
10287 * @name getToolState
10288 *
10289 * @param  {HTMLElement} element The element.
10290 * @param  {string} toolType The toolType of the state.
10291 * @returns {Object}          The element's state for the given toolType.
10292 */
10293
10294
10295function getToolState(element, toolType) {
10296  var toolStateManager = getElementToolStateManager(element);
10297  return toolStateManager.get(element, toolType);
10298}
10299/**
10300 * Removes specific tool state from the toolStateManager.
10301 * @public
10302 * @method removeToolState
10303 *
10304 * @param  {HTMLElement} element  The element.
10305 * @param  {string} toolType      The toolType of the state.
10306 * @param  {Object}
10306 data          The data to remove from the toolStateManager.
10307 * @returns {undefined}
10308 */
10309
10310
10311function removeToolState(element, toolType, data) {
10312  var toolStateManager = getElementToolStateManager(element);
10313  var toolData = toolStateManager.get(element, toolType); // Find this tool data
10314
10315  var indexOfData = -1;
10316
10317  for (var i = 0; i < toolData.data.length; i++) {
10318    if (toolData.data[i] === data) {
10319      indexOfData = i;
10320    }
10321  }
10322
10323  if (indexOfData !== -1) {
10324    toolData.data.splice(indexOfData, 1);
10325    var eventType = _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MEASUREMENT_REMOVED;
10326    var eventData = {
10327      toolType: toolType,
10328      element: element,
10329      measurementData: data
10330    };
10331    Object(_util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_3__["default"])(element, eventType, eventData);
10332  }
10333}
10334/**
10335 * Removes all toolState from the toolStateManager corresponding to
10336 * the toolType and element.
10337 * @public
10338 * @method clearToolState
10339 *
10340 * @param  {HTMLElement} element  The element.
10341 * @param  {string} toolType      The toolType of the state.
10342 * @returns {undefined}
10343 */
10344
10345
10346function clearToolState(element, toolType) {
10347  var toolStateManager = getElementToolStateManager(element);
10348  var toolData = toolStateManager.get(element, toolType); // If any toolData actually exists, clear it
10349
10350  if (toolData !== undefined) {
10351    toolData.data = [];
10352  }
10353}
10354/**
10355 * Sets the tool state manager for an element
10356 * @public
10357 * @method setElementToolStateManager
10358 *
10359 * @param  {HTMLElement} element The element.
10360 * @param {Object} toolStateManager The toolStateManager.
10361 * @returns {undefined}
10362 */
10363
10364
10365function setElementToolStateManager(element, toolStateManager) {
10366  var enabledElement = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.getEnabledElement(element);
10367  enabledElement.toolStateManager = toolStateManager;
10368}
10369
10370
10371
10372/***/ }),
10373
10374/***/ "./stateManagement/toolStyle.js":
10375/*!**************************************!*\
10376  !*** ./stateManagement/toolStyle.js ***!
10377  \**************************************/
10378/*! exports provided: default */
10379/***/ (function(module, __webpack_exports__, __webpack_require__) {
10380
10381"use strict";
10382__webpack_require__.r(__webpack_exports__);
10383var defaultWidth = 1,
10384    activeWidth = 2;
10385
10386function setToolWidth(width) {
10387  defaultWidth = width;
10388}
10389
10390function getToolWidth() {
10391  return defaultWidth;
10392}
10393
10394function setActiveWidth(width) {
10395  activeWidth = width;
10396}
10397
10398function getActiveWidth() {
10399  return activeWidth;
10400}
10401
10402var toolStyle = {
10403  setToolWidth: setToolWidth,
10404  getToolWidth: getToolWidth,
10405  setActiveWidth: setActiveWidth,
10406  getActiveWidth: getActiveWidth
10407};
10408/* harmony default export */ __webpack_exports__["default"] = (toolStyle);
10409
10410/***/ }),
10411
10412/***/ "./store/addTool.js":
10413/*!**************************!*\
10414  !*** ./store/addTool.js ***!
10415  \**************************/
10416/*! exports provided: addTool, addToolForElement */
10417/***/ (function(module, __webpack_exports__, __webpack_require__) {
10418
10419"use strict";
10420__webpack_require__.r(__webpack_exports__);
10421/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addTool", function() { return addTool; });
10422/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addToolForElement", function() { return addToolForElement; });
10423/* harmony import */ var _index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./index.js */ "./store/index.js");
10424/* harmony import */ var _getToolForElement_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./getToolForElement.js */ "./store/getToolForElement.js");
10425/* harmony import */ var _util_logger_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../util/logger.js */ "./util/logger.js");
10426
10427
10428
10429var logger = Object(_util_logger_js__WEBPACK_IMPORTED_MODULE_2__["getLogger"])('addTool');
10430/**
10431 * Adds a tool to an enabled element.
10432 *
10433 * @public
10434 * @function addToolForElement
10435 * @memberof CornerstoneTools
10436 *
10437 * @param {HTMLElement} element The element to add the tool to.
10438 * @param {BaseTool} ApiTool The tool to add to the element.
10439 * @param {Object} [props] Override the default tool props
10440 * @returns {undefined}
10441 */
10442
10443var addToolForElement = function addToolForElement(element, ApiTool, props) {
10444  // Instantiating the tool here makes it harder to accidentally add
10445  // The same tool (by reference) for multiple elements (which would reassign the tool
10446  // To a new element).
10447  var tool = new ApiTool(props);
10448  var toolAlreadyAddedToElement = Object(_getToolForElement_js__WEBPACK_IMPORTED_MODULE_1__["default"])(element, tool.name);
10449
10450  if (toolAlreadyAddedToElement) {
10451    logger.warn('%s has already been added to the target element', tool.name);
10452    return;
10453  }
10454
10455  tool.element = element;
10456  _index_js__WEBPACK_IMPORTED_MODULE_0__["default"].state.tools.push(tool);
10457};
10458/**
10459 * Adds a tool to all enabled element.
10460 *
10461 * @public
10462 * @function addTool
10463 * @memberof CornerstoneTools
10464 *
10465 * @param {BaseTool} ApiTool The tool to add to each element.
10466 * @param {Object} [props] Override the default tool configuration
10467 * @returns {undefined}
10468 */
10469
10470
10471var addTool = function addTool(ApiTool, props) {
10472  _addToolGlobally(ApiTool, props);
10473
10474  _index_js__WEBPACK_IMPORTED_MODULE_0__["default"].state.enabledElements.forEach(function (element) {
10475    addToolForElement(element, ApiTool, props);
10476  });
10477};
10478/**
10479 * Adds tool with matching name from globally registered tools.
10480 * Requires `globalToolSyncEnabled` to be set to true
10481 *
10482 * @private
10483 * @function addToolGlobally
10484 *
10485 * @param {BaseTool} ApiTool
10486 * @param {Object} [props] Override the default tool configuration
10487 * @returns {undefined}
10488 */
10489
10490
10491var _addToolGlobally = function _addToolGlobally(ApiTool, props) {
10492  if (!_index_js__WEBPACK_IMPORTED_MODULE_0__["default"].modules.globalConfiguration.state.globalToolSyncEnabled) {
10493    return;
10494  }
10495
10496  var tool = new ApiTool(props);
10497  var toolAlreadyAddedGlobally = _index_js__WEBPACK_IMPORTED_MODULE_0__["default"].state.globalTools[tool.name] !== undefined;
10498
10499  if (toolAlreadyAddedGlobally) {
10500    logger.warn('%s has already been added globally', tool.name);
10501    return;
10502  }
10503
10504  _index_js__WEBPACK_IMPORTED_MODULE_0__["default"].state.globalTools[tool.name] = {
10505    tool: ApiTool,
10506    props: props,
10507    activeBindings: []
10508  };
10509};
10510
10511
10512
10513/***/ }),
10514
10515/***/ "./store/filterToolsUsableWithMultiPartTools.js":
10516/*!******************************************************!*\
10517  !*** ./store/filterToolsUsableWithMultiPartTools.js ***!
10518  \******************************************************/
10519/*! exports provided: default */
10520/***/ (function(module, __webpack_exports__, __webpack_require__) {
10521
10522"use strict";
10523__webpack_require__.r(__webpack_exports__);
10524/* harmony import */ var _tools_base_BaseAnnotationTool_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../tools/base/BaseAnnotationTool.js */ "./tools/base/BaseAnnotationTool.js");
10525/* harmony import */ var _tools_base_BaseBrushTool_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../tools/base/BaseBrushTool.js */ "./tools/base/BaseBrushTool.js");
10526
10527
10528/**
10529 * Filters an array of tools, returning only tools which are active or passive.
10530 * @export
10531 * @public
10532 * @method
10533 * @name filterToolsUseableWithMultiPartTools
10534 *
10535 * @param  {Object[]} tools      The input tool array.
10536 * @returns {Object[]}            The filtered array.
10537 */
10538
10539/* harmony default export */ __webpack_exports__["default"] = (function (tools) {
10540  return tools.filter(function (tool) {
10541    return !tool.isMultiPartTool && !(tool instanceof _tools_base_BaseAnnotationTool_js__WEBPACK_IMPORTED_MODULE_0__["default"]) && !(tool instanceof _tools_base_BaseBrushTool_js__WEBPACK_IMPORTED_MODULE_1__["default"]);
10542  });
10543});
10544
10545/***/ }),
10546
10547/***/ "./store/getActiveToolsForElement.js":
10548/*!*******************************************!*\
10549  !*** ./store/getActiveToolsForElement.js ***!
10550  \*******************************************/
10551/*! exports provided: default */
10552/***/ (function(module, __webpack_exports__, __webpack_require__) {
10553
10554"use strict";
10555__webpack_require__.r(__webpack_exports__);
10556/**
10557 * Filters an array of tools, returning only tools which are active.
10558 * @export
10559 * @public
10560 * @method
10561 * @name getActiveToolsForElement
10562 *
10563 * @param  {HTMLElement} element The element.
10564 * @param  {Object[]} tools      The input tool array.
10565 * @param  {string} handlerType  The input type being queried.
10566 * @returns {Object[]}            The filtered array.
10567 */
10568/* harmony default export */ __webpack_exports__["default"] = (function (element, tools, handlerType) {
10569  return tools.filter(function (tool) {
10570    return tool.element === element && tool.mode === 'active' && (handlerType === undefined || tool.options["is".concat(handlerType, "Active")]);
10571  });
10572});
10573
10574/***/ }),
10575
10576/***/ "./store/getInteractiveToolsForElement.js":
10577/*!************************************************!*\
10578  !*** ./store/getInteractiveToolsForElement.js ***!
10579  \************************************************/
10580/*! exports provided: default */
10581/***/ (function(module, __webpack_exports__, __webpack_require__) {
10582
10583"use strict";
10584__webpack_require__.r(__webpack_exports__);
10585/**
10586 * Filters an array of tools, returning only tools which are active or passive.
10587 * @export
10588 * @public
10589 * @method
10590 * @name getInteractiveToolsForElement
10591 *
10592 * @param  {HTMLElement} element The element.
10593 * @param  {Object[]} tools      The input tool array.
10594 * @returns {Object[]}            The filtered array.
10595 */
10596/* harmony default export */ __webpack_exports__["default"] = (function (element, tools) {
10597  return tools.filter(function (tool) {
10598    return tool.element === element && (tool.mode === 'active' || tool.mode === 'passive');
10599  });
10600});
10601
10602/***/ }),
10603
10604/***/ "./store/getToolForElement.js":
10605/*!************************************!*\
10606  !*** ./store/getToolForElement.js ***!
10607  \************************************/
10608/*! exports provided: default */
10609/***/ (function(module, __webpack_exports__, __webpack_require__) {
10610
10611"use strict";
10612__webpack_require__.r(__webpack_exports__);
10613/* harmony import */ var _index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./index.js */ "./store/index.js");
10614
10615/**
10616 * Returns the tool instance attached to the element.
10617 * @export
10618 * @public
10619 * @method
10620 * @name getToolForElement
10621 *
10622 * @param  {HTMLElement} element The element.
10623 * @param  {string}      name The tool's name.
10624 * @returns {Object}      The tool instance.
10625 */
10626
10627/* harmony default export */ __webpack_exports__["default"] = (function (element, name) {
10628  return _index_js__WEBPACK_IMPORTED_MODULE_0__["state"].tools.find(function (tool) {
10629    return tool.element === element && tool.name === name;
10630  });
10631});
10632
10633/***/ }),
10634
10635/***/ "./store/getToolsWithDataForElement.js":
10636/*!*********************************************!*\
10637  !*** ./store/getToolsWithDataForElement.js ***!
10638  \*********************************************/
10639/*! exports provided: default */
10640/***/ (function(module, __webpack_exports__, __webpack_require__) {
10641
10642"use strict";
10643__webpack_require__.r(__webpack_exports__);
10644/* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../stateManagement/toolState.js */ "./stateManagement/toolState.js");
10645
10646/**
10647 * Filters an array of tools, returning only tools which have annotation data.
10648 * @export
10649 * @public
10650 * @method
10651 * @name getToolsWithDataForElement
10652 *
10653 * @param  {HTMLElement} element The element.
10654 * @param  {Object[]} tools      The input tool array.
10655 * @returns {Object[]}            The filtered array.
10656 */
10657
10658/* harmony default export */ __webpack_exports__["default"] = (function (element, tools) {
10659  return tools.filter(function (tool) {
10660    var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_0__["getToolState"])(element, tool.name);
10661    return toolState && toolState.data.length > 0;
10662  });
10663});
10664
10665/***/ }),
10666
10667/***/ "./store/getToolsWithMoveableHandles.js":
10668/*!**********************************************!*\
10669  !*** ./store/getToolsWithMoveableHandles.js ***!
10670  \**********************************************/
10671/*! exports provided: default */
10672/***/ (function(module, __webpack_exports__, __webpack_require__) {
10673
10674"use strict";
10675__webpack_require__.r(__webpack_exports__);
10676/* harmony import */ var _index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./index.js */ "./store/index.js");
10677/* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../stateManagement/toolState.js */ "./stateManagement/toolState.js");
10678/* harmony import */ var _manipulators_getHandleNearImagePoint_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../manipulators/getHandleNearImagePoint.js */ "./manipulators/getHandleNearImagePoint.js");
10679
10680
10681
10682/**
10683 * Filters an array of tools, returning only tools with moveable handles at the
10684 * mouse location.
10685 *
10686 * @public
10687 * @function getToolsWithMoveableHandles
10688 *
10689 * @param  {HTMLElement} element The element
10690 * @param  {Object[]}    tools   The input tool array.
10691 * @param  {Object}      coords  The coordinates of the mouse position.
10692 * @param  {string}      [interactionType=mouse]
10693 * @returns {Object[]}            The filtered array.
10694 */
10695
10696/* harmony default export */ __webpack_exports__["default"] = (function (element, tools, coords) {
10697  var interactionType = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'mouse';
10698  var proximity = interactionType === 'mouse' ? _index_js__WEBPACK_IMPORTED_MODULE_0__["state"].clickProximity : _index_js__WEBPACK_IMPORTED_MODULE_0__["state"].touchProximity;
10699  return tools.filter(function (tool) {
10700    var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_1__["getToolState"])(element, tool.name);
10701
10702    for (var i = 0; i < toolState.data.length; i++) {
10703      if (Object(_manipulators_getHandleNearImagePoint_js__WEBPACK_IMPORTED_MODULE_2__["default"])(element, toolState.data[i].handles, coords, proximity) !== undefined) {
10704        return true;
10705      }
10706    }
10707
10708    return false;
10709  });
10710});
10711
10712/***/ }),
10713
10714/***/ "./store/index.js":
10715/*!************************!*\
10716  !*** ./store/index.js ***!
10717  \************************/
10718/*! exports provided: state, getters, setters, modules, default */
10719/***/ (function(module, __webpack_exports__, __webpack_require__) {
10720
10721"use strict";
10722__webpack_require__.r(__webpack_exports__);
10723/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "state", function() { return state; });
10724/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getters", function() { return getters; });
10725/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setters", function() { return setters; });
10726/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "modules", function() { return modules; });
10727/* harmony import */ var _modules_brushModule_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./modules/brushModule.js */ "./store/modules/brushModule.js");
10728/* harmony import */ var _modules_cursorModule_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./modules/cursorModule.js */ "./store/modules/cursorModule.js");
10729/* harmony import */ var _modules_globalConfigurationModule_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./modules/globalConfigurationModule.js */ "./store/modules/globalConfigurationModule.js");
10730/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js");
10731// Modules
10732
10733
10734
10735
10736var state = {
10737  // Global
10738  globalTools: {},
10739  globalToolChangeHistory: [],
10740  // Tracking
10741  enabledElements: [],
10742  tools: [],
10743  isToolLocked: false,
10744  activeMultiPartTool: null,
10745  mousePositionImage: {},
10746  // Settings
10747  clickProximity: 6,
10748  touchProximity: 10,
10749  handleRadius: 6,
10750  deleteIfHandleOutsideImage: true,
10751  preventHandleOutsideImage: false,
10752  // Cursor
10753  svgCursorUrl: null
10754};
10755var getters = {
10756  mouseTools: function mouseTools() {
10757    return state.tools.filter(function (tool) {
10758      return tool.supportedInteractionTypes.includes('Mouse');
10759    });
10760  },
10761  touchTools: function touchTools() {
10762    return state.tools.filter(function (tool) {
10763      return tool.supportedInteractionTypes.includes('Touch');
10764    });
10765  },
10766  enabledElementByUID: function enabledElementByUID(enabledElementUID) {
10767    return state.enabledElements.find(function (element) {
10768      return _externalModules_js__WEBPACK_IMPORTED_MODULE_3__["default"].cornerstone.getEnabledElement(element).uuid === enabledElementUID;
10769    });
10770  }
10771};
10772var setters = {};
10773var modules = {
10774  brush: _modules_brushModule_js__WEBPACK_IMPORTED_MODULE_0__["default"],
10775  cursor: _modules_cursorModule_js__WEBPACK_IMPORTED_MODULE_1__["default"],
10776  globalConfiguration: _modules_globalConfigurationModule_js__WEBPACK_IMPORTED_MODULE_2__["default"]
10777};
10778/* harmony default export */ __webpack_exports__["default"] = ({
10779  modules: modules,
10780  state: state,
10781  getters: getters
10782});
10783
10784/***/ }),
10785
10786/***/ "./store/internals/addEnabledElement.js":
10787/*!**********************************************!*\
10788  !*** ./store/internals/addEnabledElement.js ***!
10789  \**********************************************/
10790/*! exports provided: default */
10791/***/ (function(module, __webpack_exports__, __webpack_require__) {
10792
10793"use strict";
10794__webpack_require__.r(__webpack_exports__);
10795/* harmony import */ var _eventListeners_index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../eventListeners/index.js */ "./eventListeners/index.js");
10796/* harmony import */ var _eventDispatchers_index_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../eventDispatchers/index.js */ "./eventDispatchers/index.js");
10797/* harmony import */ var _addTool_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./../addTool.js */ "./store/addTool.js");
10798/* harmony import */ var _setToolMode_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./../setToolMode.js */ "./store/setToolMode.js");
10799/* harmony import */ var _index_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../index.js */ "./store/index.js");
10800/* harmony import */ var _util_logger_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../util/logger.js */ "./util/logger.js");
10801
10802
10803
10804
10805
10806
10807var logger = Object(_util_logger_js__WEBPACK_IMPORTED_MODULE_5__["getLogger"])('internals:addEnabledElement');
10808/**
10809 * Element Enabled event.
10810 *
10811 * @event Cornerstone#ElementEnabled
10812 * @type {Object}
10813 * @property {string} type
10814 * @property {Object} detail
10815 * @property {HTMLElement} detail.element - The element being enabled.
10816 */
10817
10818/* TODO: It would be nice if this automatically added "all tools"
10819 * To the enabledElement that already exist on all other tools.
10820 * A half-measure might be a new method to "duplicate" the tool
10821 * Configuration for an existing enabled element
10822 * We may need to also save/store the original class/constructor per tool
10823 * To accomplish this
10824 */
10825
10826/**
10827 * Adds an enabledElement to our store.
10828 * @export
10829 * @private
10830 * @method
10831 * @name addEnabledElement
10832 * @param {Cornerstone#ElementEnabled} elementEnabledEvt
10833 * @listens Cornerstone#ElementEnabled
10834 * @returns {void}
10835 */
10836
10837/* harmony default export */ __webpack_exports__["default"] = (function (elementEnabledEvt) {
10838  logger.log('EVENT:ELEMENT_ENABLED');
10839  var enabledElement = elementEnabledEvt.detail.element; // Dispatchers
10840
10841  _eventDispatchers_index_js__WEBPACK_IMPORTED_MODULE_1__["imageRenderedEventDispatcher"].enable(enabledElement);
10842  _eventDispatchers_index_js__WEBPACK_IMPORTED_MODULE_1__["newImageEventDispatcher"].enable(enabledElement); // Mouse
10843
10844  if (_index_js__WEBPACK_IMPORTED_MODULE_4__["default"].modules.globalConfiguration.state.mouseEnabled) {
10845    _eventListeners_index_js__WEBPACK_IMPORTED_MODULE_0__["mouseEventListeners"].enable(enabledElement);
10846    _eventListeners_index_js__WEBPACK_IMPORTED_MODULE_0__["wheelEventListener"].enable(enabledElement);
10847    _eventDispatchers_index_js__WEBPACK_IMPORTED_MODULE_1__["mouseToolEventDispatcher"].enable(enabledElement);
10848  } // Touch
10849
10850
10851  if (_index_js__WEBPACK_IMPORTED_MODULE_4__["default"].modules.globalConfiguration.state.touchEnabled) {
10852    _eventListeners_index_js__WEBPACK_IMPORTED_MODULE_0__["touchEventListeners"].enable(enabledElement);
10853    _eventDispatchers_index_js__WEBPACK_IMPORTED_MODULE_1__["touchToolEventDispatcher"].enable(enabledElement);
10854  } // State
10855
10856
10857  _addEnabledElement(enabledElement);
10858});
10859/**
10860 * Adds the enabled element to the store.
10861 * @private
10862 * @method
10863 * @param {HTMLElement} enabledElement
10864 * @returns {void}
10865 */
10866
10867var _addEnabledElement = function _addEnabledElement(enabledElement) {
10868  _index_js__WEBPACK_IMPORTED_MODULE_4__["default"].state.enabledElements.push(enabledElement);
10869
10870  if (_index_js__WEBPACK_IMPORTED_MODULE_4__["default"].modules) {
10871    _initModulesOnElement(enabledElement);
10872  }
10873
10874  _addGlobalToolsToElement(enabledElement);
10875
10876  _repeatGlobalToolHistory(enabledElement);
10877};
10878/**
10879 * Iterate over our store's modules. If the module has an `enabledElementCallback`
10880 * call it and pass it a reference to our enabled element.
10881 * @private
10882 * @method
10883 * @param  {Object} enabledElement
10884 * @returns {void}
10885 */
10886
10887
10888function _initModulesOnElement(enabledElement) {
10889  var modules = _index_js__WEBPACK_IMPORTED_MODULE_4__["default"].modules;
10890  Object.keys(modules).forEach(function (key) {
10891    if (typeof modules[key].enabledElementCallback === 'function') {
10892      modules[key].enabledElementCallback(enabledElement);
10893    }
10894  });
10895}
10896/**
10897 * Iterate over our stores globalTools adding each one to `enabledElement`
10898 * @private
10899 * @method
10900 * @param {HTMLElement} enabledElement
10901 * @returns {void}
10902 */
10903
10904
10905function _addGlobalToolsToElement(enabledElement) {
10906  if (!_index_js__WEBPACK_IMPORTED_MODULE_4__["default"].modules.globalConfiguration.state.globalToolSyncEnabled) {
10907    return;
10908  }
10909
10910  Object.keys(_index_js__WEBPACK_IMPORTED_MODULE_4__["default"].state.globalTools).forEach(function (key) {
10911    var _store$state$globalTo = _index_js__WEBPACK_IMPORTED_MODULE_4__["default"].state.globalTools[key],
10912        tool = _store$state$globalTo.tool,
10913        props = _store$state$globalTo.props;
10914    Object(_addTool_js__WEBPACK_IMPORTED_MODULE_2__["addToolForElement"])(enabledElement, tool, props);
10915  });
10916}
10917/**
10918 * Iterate over the globalToolChangeHistory and apply each `historyEvent`
10919 * to the supplied `enabledElement`.
10920 * @private
10921 * @method
10922 * @param {HTMLElement} enabledElement
10923 * @returns {void}
10924 */
10925
10926
10927function _repeatGlobalToolHistory(enabledElement) {
10928  if (!_index_js__WEBPACK_IMPORTED_MODULE_4__["default"].modules.globalConfiguration.state.globalToolSyncEnabled) {
10929    return;
10930  }
10931
10932  var setToolModeFns = {
10933    active: _setToolMode_js__WEBPACK_IMPORTED_MODULE_3__["setToolActiveForElement"],
10934    passive: _setToolMode_js__WEBPACK_IMPORTED_MODULE_3__["setToolPassiveForElement"],
10935    enabled: _setToolMode_js__WEBPACK_IMPORTED_MODULE_3__["setToolEnabledForElement"],
10936    disabled: _setToolMode_js__WEBPACK_IMPORTED_MODULE_3__["setToolDisabledForElement"]
10937  };
10938  _index_js__WEBPACK_IMPORTED_MODULE_4__["default"].state.globalToolChangeHistory.forEac
10938h(function (historyEvent) {
10939    var args = historyEvent.args.slice(0);
10940    args.unshift(enabledElement);
10941    setToolModeFns[historyEvent.mode].apply(null, args);
10942  });
10943}
10944
10945/***/ }),
10946
10947/***/ "./store/internals/removeEnabledElement.js":
10948/*!*************************************************!*\
10949  !*** ./store/internals/removeEnabledElement.js ***!
10950  \*************************************************/
10951/*! exports provided: default */
10952/***/ (function(module, __webpack_exports__, __webpack_require__) {
10953
10954"use strict";
10955__webpack_require__.r(__webpack_exports__);
10956/* harmony import */ var _eventListeners_index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../eventListeners/index.js */ "./eventListeners/index.js");
10957/* harmony import */ var _eventDispatchers_index_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../eventDispatchers/index.js */ "./eventDispatchers/index.js");
10958/* harmony import */ var _index_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../index.js */ "./store/index.js");
10959/* harmony import */ var _util_logger_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../util/logger.js */ "./util/logger.js");
10960/* harmony import */ var _stateManagement_loadHandlerManager_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../stateManagement/loadHandlerManager.js */ "./stateManagement/loadHandlerManager.js");
10961
10962
10963
10964
10965
10966var logger = Object(_util_logger_js__WEBPACK_IMPORTED_MODULE_3__["getLogger"])('internals:removeEnabledElement');
10967/**
10968 * Element Disabled event.
10969 *
10970 * @event Cornerstone#ElementDisabled
10971 * @type {Object}
10972 * @property {string} type
10973 * @property {Object} detail
10974 * @property {HTMLElement} detail.element - The element being disabled.
10975 */
10976
10977/**
10978 * Removes an enabledElement from our store, and all associated tools that were added to it.
10979 * @export
10980 * @private
10981 * @method
10982 * @name removeEnabledElement
10983 * @param {Cornerstone#ElementDisabled} elementDisabledEvt
10984 * @listens Cornerstone#ElementDisabled
10985 * @returns {void}
10986 */
10987
10988/* harmony default export */ __webpack_exports__["default"] = (function (elementDisabledEvt) {
10989  logger.log('EVENT:ELEMENT_DISABLED');
10990  var enabledElement = elementDisabledEvt.detail.element; // Dispatchers
10991
10992  _eventDispatchers_index_js__WEBPACK_IMPORTED_MODULE_1__["imageRenderedEventDispatcher"].disable(enabledElement);
10993  _eventDispatchers_index_js__WEBPACK_IMPORTED_MODULE_1__["newImageEventDispatcher"].disable(enabledElement); // Mouse
10994
10995  if (_index_js__WEBPACK_IMPORTED_MODULE_2__["default"].modules.globalConfiguration.state.mouseEnabled) {
10996    _eventListeners_index_js__WEBPACK_IMPORTED_MODULE_0__["mouseEventListeners"].disable(enabledElement);
10997    _eventListeners_index_js__WEBPACK_IMPORTED_MODULE_0__["wheelEventListener"].disable(enabledElement);
10998    _eventDispatchers_index_js__WEBPACK_IMPORTED_MODULE_1__["mouseToolEventDispatcher"].disable(enabledElement);
10999  } // Touch
11000
11001
11002  if (_index_js__WEBPACK_IMPORTED_MODULE_2__["default"].modules.globalConfiguration.state.touchEnabled) {
11003    _eventListeners_index_js__WEBPACK_IMPORTED_MODULE_0__["touchEventListeners"].disable(enabledElement);
11004    _eventDispatchers_index_js__WEBPACK_IMPORTED_MODULE_1__["touchToolEventDispatcher"].disable(enabledElement);
11005  } // State
11006
11007
11008  _removeAllToolsForElement(enabledElement);
11009
11010  _removeEnabledElement(enabledElement);
11011
11012  _removeLoadHandlers(enabledElement);
11013});
11014/**
11015 * Remove all tools associated with enabled element.
11016 * @private
11017 * @method
11018 * @param {HTMLElement} enabledElement
11019 * @returns  {void}
11020 */
11021
11022var _removeAllToolsForElement = function _removeAllToolsForElement(enabledElement) {
11023  // Note: We may want to `setToolDisabled` before removing from store
11024  // Or take other action to remove any lingering eventListeners/state
11025  _index_js__WEBPACK_IMPORTED_MODULE_2__["default"].state.tools = _index_js__WEBPACK_IMPORTED_MODULE_2__["default"].state.tools.filter(function (tool) {
11026    return tool.element !== enabledElement;
11027  });
11028};
11029/**
11030 * Remove the enabled element from the store if it exists.
11031 * @private
11032 * @method
11033 * @param {HTMLElement} enabledElement
11034 * @returns {void}
11035 */
11036
11037
11038var _removeEnabledElement = function _removeEnabledElement(enabledElement) {
11039  if (_index_js__WEBPACK_IMPORTED_MODULE_2__["default"].modules) {
11040    _cleanModulesOnElement(enabledElement);
11041  }
11042
11043  var foundElementIndex = _index_js__WEBPACK_IMPORTED_MODULE_2__["default"].state.enabledElements.findIndex(function (element) {
11044    return element === enabledElement;
11045  });
11046
11047  if (foundElementIndex > -1) {
11048    _index_js__WEBPACK_IMPORTED_MODULE_2__["default"].state.enabledElements.splice(foundElementIndex, 1);
11049  } else {
11050    logger.warn('unable to remove element');
11051  }
11052};
11053/**
11054 * Remove load handler for the element
11055 * @private
11056 * @method
11057 * @param {HTMLElement} element
11058 * @returns {void}
11059 */
11060
11061
11062var _removeLoadHandlers = function _removeLoadHandlers(element) {
11063  _stateManagement_loadHandlerManager_js__WEBPACK_IMPORTED_MODULE_4__["default"].removeHandlers(element);
11064};
11065/**
11066 * Iterate over our store's modules. If the module has a
11067 * `removeEnabledElementCallback` call it and clean up unneeded metadata.
11068 * @private
11069 * @method
11070 * @param  {Object} enabledElement
11071 * @returns {void}
11072 */
11073
11074
11075function _cleanModulesOnElement(enabledElement) {
11076  var modules = _index_js__WEBPACK_IMPORTED_MODULE_2__["default"].modules;
11077  Object.keys(modules).forEach(function (key) {
11078    if (typeof modules[key].removeEnabledElementCallback === 'function') {
11079      modules[key].removeEnabledElementCallback(enabledElement);
11080    }
11081  });
11082}
11083
11084/***/ }),
11085
11086/***/ "./store/isToolActive.js":
11087/*!*******************************!*\
11088  !*** ./store/isToolActive.js ***!
11089  \*******************************/
11090/*! exports provided: default */
11091/***/ (function(module, __webpack_exports__, __webpack_require__) {
11092
11093"use strict";
11094__webpack_require__.r(__webpack_exports__);
11095/* harmony import */ var _getToolForElement_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getToolForElement.js */ "./store/getToolForElement.js");
11096
11097/**
11098 * Queries if a tool is active on the specified element.
11099 * @export
11100 * @public
11101 * @method
11102 * @name isToolActive
11103 *
11104 * @param  {HTMLElement} element The element being queried.
11105 * @param  {string} name    The name of the tool.
11106 * @returns {boolean}         True if the tool is active.
11107 */
11108
11109/* harmony default export */ __webpack_exports__["default"] = (function (element, name) {
11110  var tool = Object(_getToolForElement_js__WEBPACK_IMPORTED_MODULE_0__["default"])(element, name);
11111  return tool.mode === 'active';
11112});
11113
11114/***/ }),
11115
11116/***/ "./store/modules/brushModule.js":
11117/*!**************************************!*\
11118  !*** ./store/modules/brushModule.js ***!
11119  \**************************************/
11120/*! exports provided: default */
11121/***/ (function(module, __webpack_exports__, __webpack_require__) {
11122
11123"use strict";
11124__webpack_require__.r(__webpack_exports__);
11125/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../../externalModules.js */ "./externalModules.js");
11126
11127var state = {
11128  drawColorId: 0,
11129  radius: 10,
11130  minRadius: 1,
11131  maxRadius: 50,
11132  alpha: 0.4,
11133  renderBrushIfHiddenButActive: true,
11134  hiddenButActiveAlpha: 0.2,
11135  colorMapId: 'BrushColorMap',
11136  visibleSegmentations: {},
11137  imageBitmapCache: {},
11138  segmentationMetadata: {}
11139};
11140var setters = {
11141  /**
11142   * Sets the brush radius, account for global min/max radius
11143   *
11144   * @param {number} radius
11145   * @returns {void}
11146   */
11147  radius: function radius(_radius) {
11148    state.radius = Math.min(Math.max(_radius, state.minRadius), state.maxRadius);
11149  },
11150
11151  /**
11152   * TODO: Should this be a init config property?
11153   * Sets the brush color map to something other than the default
11154   *
11155   * @param  {Array} colors An array of 4D [red, green, blue, alpha] arrays.
11156   * @returns {void}
11157   */
11158  brushColorMap: function brushColorMap(colors) {
11159    var colormap = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.colors.getColormap(state.colorMapId);
11160    colormap.setNumberOfColors(colors.length);
11161
11162    for (var i = 0; i < colors.length; i++) {
11163      colormap.setColor(i, colors[i]);
11164    }
11165  },
11166  elementVisible: function elementVisible(enabledElement) {
11167    if (!_externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone) {
11168      return;
11169    }
11170
11171    var cornerstoneEnabledElement = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.getEnabledElement(enabledElement);
11172    var enabledElementUID = cornerstoneEnabledElement.uuid;
11173    var colormap = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.colors.getColormap(state.colorMapId);
11174    var numberOfColors = colormap.getNumberOfColors();
11175    state.visibleSegmentations[enabledElementUID] = [];
11176
11177    for (var i = 0; i < numberOfColors; i++) {
11178      state.visibleSegmentations[enabledElementUID].push(true);
11179    }
11180  },
11181  brushVisibilityForElement: function brushVisibilityForElement(enabledElementUID, segIndex) {
11182    var visible = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
11183
11184    if (!state.visibleSegmentations[enabledElementUID]) {
11185      state.imageBitmapCache[enabledElementUID] = [];
11186    }
11187
11188    state.visibleSegmentations[enabledElementUID][segIndex] = visible;
11189  },
11190  imageBitmapCacheForElement: function imageBitmapCacheForElement(enabledElementUID, segIndex, imageBitmap) {
11191    if (!state.imageBitmapCache[enabledElementUID]) {
11192      state.imageBitmapCache[enabledElementUID] = [];
11193    }
11194
11195    state.imageBitmapCache[enabledElementUID][segIndex] = imageBitmap;
11196  },
11197  clearImageBitmapCacheForElement: function clearImageBitmapCacheForElement(enabledElementUID) {
11198    state.imageBitmapCache[enabledElementUID] = [];
11199  },
11200  metadata: function metadata(seriesInstanceUid, segIndex, _metadata) {
11201    if (!state.segmentationMetadata[seriesInstanceUid]) {
11202      state.segmentationMetadata[seriesInstanceUid] = [];
11203    }
11204
11205    state.segmentationMetadata[seriesInstanceUid][segIndex] = _metadata;
11206  }
11207};
11208var getters = {
11209  imageBitmapCacheForElement: function imageBitmapCacheForElement(enabledElementUID) {
11210    if (!state.imageBitmapCache[enabledElementUID]) {
11211      return null;
11212    }
11213
11214    return state.imageBitmapCache[enabledElementUID];
11215  },
11216  visibleSegmentationsForElement: function visibleSegmentationsForElement(enabledElementUID) {
11217    if (!state.visibleSegmentations[enabledElementUID]) {
11218      return null;
11219    }
11220
11221    return state.visibleSegmentations[enabledElementUID];
11222  },
11223
11224  /**
11225   * Retrieves series-specific brush segmentation metadata.
11226   * @public
11227   * @function metadata
11228   * @param {string} seriesInstanceUid - The seriesInstanceUid of the scan.
11229   * @param {number} [segIndex] - The segmentation index.
11230   *
11231   * @returns {Object[]|Object} An array of segmentation metadata, or specifc
11232   *                            segmentation data if segIndex is defined.
11233   */
11234  metadata: function metadata(seriesInstanceUid, segIndex) {
11235    if (!state.segmentationMetadata[seriesInstanceUid]) {
11236      return;
11237    }
11238
11239    if (segIndex !== undefined) {
11240      return state.segmentationMetadata[seriesInstanceUid][segIndex];
11241    }
11242
11243    return state.segmentationMetadata[seriesInstanceUid];
11244  }
11245};
11246/**
11247 * EnabledElementCallback - Element specific initilisation.
11248 * @public
11249 * @param  {Object} enabledElement - The element on which the module is
11250 *                                  being initialised.
11251 * @returns {void}
11252 */
11253
11254function enabledElementCallback(enabledElement) {
11255  setters.elementVisible(enabledElement);
11256}
11257/**
11258 * RemoveEnabledElementCallback - Element specific memory cleanup.
11259 * @public
11260 * @param  {Object} enabledElement  The element being removed.
11261 * @returns {void}
11262 */
11263// TODO -> Test this before adding it to the module.
11264
11265
11266function removeEnabledElementCallback(enabledElement) {
11267  if (!_externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone) {
11268    return;
11269  }
11270
11271  var cornerstoneEnabledElement = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.getEnabledElement(enabledElement);
11272  var enabledElementUID = cornerstoneEnabledElement.uuid;
11273  var colormap = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.colors.getColormap(state.colorMapId);
11274  var numberOfColors = colormap.getNumberOfColors(); // Remove enabledElement specific data.
11275
11276  delete state.visibleSegmentations[enabledElementUID];
11277  delete state.imageBitmapCache[enabledElementUID];
11278}
11279/**
11280 * OnRegisterCallback - Initialise the module when a new element is added.
11281 * @public
11282 * @returns {void}
11283 */
11284
11285
11286function onRegisterCallback() {
11287  _initDefaultColorMap();
11288}
11289
11290/* harmony default export */ __webpack_exports__["default"] = ({
11291  state: state,
11292  onRegisterCallback: onRegisterCallback,
11293  enabledElementCallback: enabledElementCallback,
11294  getters: getters,
11295  setters: setters
11296});
11297var distinctColors = [[230, 25, 75, 255], [60, 180, 175, 255], [255, 225, 25, 255], [0, 130, 200, 255], [245, 130, 48, 255], [145, 30, 180, 255], [70, 240, 240, 255], [240, 50, 230, 255], [210, 245, 60, 255], [250, 190, 190, 255], [0, 128, 128, 255], [230, 190, 255, 255], [170, 110, 40, 255], [255, 250, 200, 255], [128, 0, 0, 255], [170, 255, 195, 255], [128, 128, 0, 255], [255, 215, 180, 255], [0, 0, 128, 255]];
11298var colorPairIndex = 0;
11299
11300function _initDefaultColorMap() {
11301  var defaultSegmentationCount = 19;
11302  var colormap = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.colors.getColormap(state.colorMapId);
11303  colormap.setNumberOfColors(defaultSegmentationCount);
11304  /*
11305    19 Colors selected to be as distinct from each other as possible,
11306    and ordered such that between each index you make large jumps around the
11307    color wheel. If defaultSegmentationCount is greater than 19, generate a
11308    random linearly interperlated color between 2 colors.
11309  */
11310
11311  for (var i = 0; i < defaultSegmentationCount; i++) {
11312    if (i < distinctColors.length) {
11313      colormap.setColor(i, distinctColors[i]);
11314    } else {
11315      colormap.setColor(i, _generateInterpolatedColor());
11316    }
11317  }
11318}
11319/**
11320 * _generateInterpolatedColor -  generates a color interpolated between two
11321 *                              colors. Humans can only distinguish between
11322 *                              ~15-20 colors, so this is the best we can do.
11323 * @private
11324 *
11325 * @returns {type}  description
11326 */
11327
11328
11329function _generateInterpolatedColor() {
11330  var randIndicies = _getNextColorPair();
11331
11332  var fraction = Math.random();
11333  var interpolatedColor = [];
11334
11335  for (var i = 0; i < 4; i++) {
11336    interpolatedColor.push(Math.floor(fraction * distinctColors[randIndicies[0]][i] + (1.0 - fraction) * distinctColors[randIndicies[1]][i]));
11337  }
11338
11339  return interpolatedColor;
11340}
11341/**
11342 * _getNextColorPair - returns the next pair of indicies to interpolate between.
11343 *
11344 * @private
11345 *
11346 * @returns {Array} An array containing the two indicies.
11347 */
11348
11349
11350function _getNextColorPair() {
11351  var indexPair = [colorPairIndex];
11352
11353  if (colorPairIndex < distinctColors.length - 1) {
11354    colorPairIndex++;
11355    indexPair.push(colorPairIndex);
11356  } else {
11357    colorPairIndex = 0;
11358    indexPair.push(colorPairIndex);
11359  }
11360
11361  return indexPair;
11362}
11363
11364/***/ }),
11365
11366/***/ "./store/modules/cursorModule.js":
11367/*!***************************************!*\
11368  !*** ./store/modules/cursorModule.js ***!
11369  \***************************************/
11370/*! exports provided: default */
11371/***/ (function(module, __webpack_exports__, __webpack_require__) {
11372
11373"use strict";
11374__webpack_require__.r(__webpack_exports__);
11375var state = {
11376  iconSize: 16,
11377  viewBox: {
11378    x: 16,
11379    y: 16
11380  },
11381  mousePoint: {
11382    x: 8,
11383    y: 8
11384  },
11385  mousePointerGroupString: "\n    <path stroke=\"ACTIVE_COLOR\" d=\"M8 16L8 0\"></path>\n    <path stroke=\"ACTIVE_COLOR\" d=\"M16 8L0 8\"></path>\n  "
11386};
11387var setters = {
11388  defaultOptions: function defaultOptions(newOptions) {
11389    Object.assign(state, newOptions);
11390  }
11391};
11392var getters = {
11393  defaultOptions: function defaultOptions() {
11394    return state;
11395  }
11396};
11397/* harmony default export */ __webpack_exports__["default"] = ({
11398  getters: getters,
11399  setters: setters
11400});
11401
11402/***/ }),
11403
11404/***/ "./store/modules/globalConfigurationModule.js":
11405/*!****************************************************!*\
11406  !*** ./store/modules/globalConfigurationModule.js ***!
11407  \****************************************************/
11408/*! exports provided: default */
11409/***/ (function(module, __webpack_exports__, __webpack_require__) {
11410
11411"use strict";
11412__webpack_require__.r(__webpack_exports__);
11413var state = {
11414  mouseEnabled: true,
11415  touchEnabled: true,
11416  globalToolSyncEnabled: false,
11417  showSVGCursors: false
11418};
11419/* harmony default export */ __webpack_exports__["default"] = ({
11420  state: state,
11421  setters: {}
11422});
11423
11424/***/ }),
11425
11426/***/ "./store/removeTool.js":
11427/*!*****************************!*\
11428  !*** ./store/removeTool.js ***!
11429  \*****************************/
11430/*! exports provided: removeTool, removeToolForElement */
11431/***/ (function(module, __webpack_exports__, __webpack_require__) {
11432
11433"use strict";
11434__webpack_require__.r(__webpack_exports__);
11435/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "removeTool", function() { return removeTool; });
11436/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "removeToolForElement", function() { return removeToolForElement; });
11437/* harmony import */ var _index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./index.js */ "./store/index.js");
11438
11439/**
11440 * Deactivates and removes the tool from the target element with the provided name
11441 *
11442 * @export
11443 * @public
11444 * @method
11445 * @name removeToolForElement
11446 * @param {HTMLElement} element The element.
11447 * @param {string} toolName The name of the tool.
11448 * @returns {void}
11449 */
11450
11451var removeToolForElement = function removeToolForElement(element, toolName) {
11452  var toolIndex = _index_js__WEBPACK_IMPORTED_MODULE_0__["default"].state.tools.findIndex(function (tool) {
11453    return tool.element === element && tool.name === toolName;
11454  });
11455
11456  if (toolIndex >= 0) {
11457    _index_js__WEBPACK_IMPORTED_MODULE_0__["default"].state.tools.splice(toolIndex, 1);
11458  }
11459};
11460/**
11461 * Removes all tools from all enabled elements with the provided name.
11462 *
11463 * @export
11464 * @public
11465 * @method
11466 * @name removeTool
11467 * @param {string} toolName The name of the tool.
11468 * @returns {void}
11469 */
11470
11471
11472var removeTool = function removeTool(toolName) {
11473  _removeToolGlobally(toolName);
11474
11475  _index_js__WEBPACK_IMPORTED_MODULE_0__["default"].state.enabledElements.forEach(function (element) {
11476    removeToolForElement(element, toolName);
11477  });
11478};
11479/**
11480 * Removes tool with matching name from globally registered tools.
11481 * Requires `globalToolSyncEnabled` to be set to true
11482 *
11483 * @private
11484 * @method
11485 * @name removeToolGlobally
11486 * @param {string} toolName The name of the tool to remove.
11487 * @returns {void}
11488 */
11489
11490
11491var _removeToolGlobally = function _removeToolGlobally(toolName) {
11492  if (!_index_js__WEBPACK_IMPORTED_MODULE_0__["default"].modules.globalConfiguration.state.globalToolSyncEnabled) {
11493    return;
11494  }
11495
11496  if (_index_js__WEBPACK_IMPORTED_MODULE_0__["default"].state.globalTools[toolName]) {
11497    delete _index_js__WEBPACK_IMPORTED_MODULE_0__["default"].state.globalTools[toolName];
11498  }
11499};
11500
11501
11502
11503/***/ }),
11504
11505/***/ "./store/setToolCursor.js":
11506/*!********************************!*\
11507  !*** ./store/setToolCursor.js ***!
11508  \********************************/
11509/*! exports provided: setToolCursor, resetToolCursor, hideToolCursor */
11510/***/ (function(module, __webpack_exports__, __webpack_require__) {
11511
11512"use strict";
11513__webpack_require__.r(__webpack_exports__);
11514/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setToolCursor", function() { return setToolCursor; });
11515/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "resetToolCursor", function() { return resetToolCursor; });
11516/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "hideToolCursor", function() { return hideToolCursor; });
11517/* harmony import */ var _index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./index.js */ "./store/index.js");
11518
11519
11520var globalConfiguration = _index_js__WEBPACK_IMPORTED_MODULE_0__["modules"].globalConfiguration;
11521/**
11522 * Creates an SVG Cursor for the target element
11523 *
11524 * @param {HTMLElement} element - The DOM Element to draw on
11525 * @param {MouseCursor} svgCursor - The cursor.
11526 * @returns {void}
11527 */
11528
11529function setToolCursor(element, svgCursor) {
11530  if (!globalConfiguration.state.showSVGCursors) {
11531    return;
11532  } // TODO: (state vs options) Exit if cursor wasn't updated
11533  // TODO: Exit if invalid options to create cursor
11534  // Note: Max size of an SVG cursor is 128x128, default is 32x32.
11535
11536
11537  var cursorBlob = svgCursor.getIconWithPointerSVG();
11538  var mousePoint = svgCursor.mousePoint;
11539  var svgCursorUrl = window.URL.createObjectURL(cursorBlob);
11540  element.style.cursor = "url('".concat(svgCursorUrl, "') ").concat(mousePoint, ", auto");
11541  _index_js__WEBPACK_IMPORTED_MODULE_0__["state"].svgCursorUrl = svgCursorUrl;
11542}
11543
11544function resetToolCursor(element) {
11545  _clearStateAndSetCursor(element, 'initial');
11546}
11547
11548function hideToolCursor(element) {
11549  if (!globalConfiguration.state.showSVGCursors) {
11550    return;
11551  }
11552
11553  _clearStateAndSetCursor(element, 'none');
11554}
11555
11556function _clearStateAndSetCursor(element, cursorSeting) {
11557  if (_index_js__WEBPACK_IMPORTED_MODULE_0__["state"].svgCursorUrl) {
11558    window.URL.revokeObjectURL(_index_js__WEBPACK_IMPORTED_MODULE_0__["state"].svgCursorUrl);
11559  }
11560
11561  _index_js__WEBPACK_IMPORTED_MODULE_0__["state"].svgCursorUrl = null;
11562  element.style.cursor = cursorSeting;
11563}
11564
11565/***/ }),
11566
11567/***/ "./store/setToolMode.js":
11568/*!******************************!*\
11569  !*** ./store/setToolMode.js ***!
11570  \******************************/
11571/*! exports provided: setToolActive, setToolActiveForElement, setToolDisabled, setToolDisabledForElement, setToolEnabled, setToolEnabledForElement, setToolPassive, setToolPassiveForElement, setToolMode, setToolModeForElement, _getNormalizedOptions, _mergeMouseButtonMask */
11572/***/ (function(module, __webpack_exports__, __webpack_require__) {
11573
11574"use strict";
11575__webpack_require__.r(__webpack_exports__);
11576/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setToolActive", function() { return setToolActive; });
11577/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setToolActiveForElement", function() { return setToolActiveForElement; });
11578/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setToolDisabled", function() { return setToolDisabled; });
11579/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setToolDisabledForElement", function() { return setToolDisabledForElement; });
11580/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setToolEnabled", function() { return setToolEnabled; });
11581/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setToolEnabledForElement", function() { return setToolEnabledForElement; });
11582/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setToolPassive", function() { return setToolPassive; });
11583/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setToolPassiveForElement", function() { return setToolPassiveForElement; });
11584/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setToolMode", function() { return setToolMode; });
11585/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setToolModeForElement", function() { return setToolModeForElement; });
11586/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_getNormalizedOptions", function() { return _getNormalizedOptions; });
11587/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_mergeMouseButtonMask", function() { return _mergeMouseButtonMask; });
11588/* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../events.js */ "./events.js");
11589/* harmony import */ var _util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./../util/triggerEvent.js */ "./util/triggerEvent.js");
11590/* harmony import */ var _getToolForElement_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./getToolForElement.js */ "./store/getToolForElement.js");
11591/* harmony import */ var _store_index_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./../store/index.js */ "./store/index.js");
11592/* harmony import */ var _setToolCursor_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./setToolCursor.js */ "./store/setToolCursor.js");
11593/* harmony import */ var _util_logger_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../util/logger.js */ "./util/logger.js");
11594
11595
11596
11597
11598
11599
11600var globalConfiguration = _store_index_js__WEBPACK_IMPORTED_MODULE_3__["default"].modules.globalConfiguration;
11601var logger = Object(_util_logger_js__WEBPACK_IMPORTED_MODULE_5__["getLogger"])('store:setToolMode');
11602/**
11603 * Sets a tool's state, with the provided toolName and element, to 'active'. Active tools are rendered,
11604 * respond to user input, and can create new data.
11605 *
11606 * @public
11607 * @function setToolActiveForElement
11608 * @memberof CornerstoneTools
11609 *
11610 * @example <caption>Setting a tool 'active' for a specific interaction type.</caption>
11611 * // Sets length tool to Active
11612 * setToolActiveForElement(element, 'Length', {
11613 *   mouseButtonMask: 1
11614 * }, ['Mouse'])
11615 * @example <caption>Setting a tool 'active' for all interaction types.</caption>
11616 * // Sets length tool to Active
11617 * setToolActiveForElement(element, 'Length', {
11618 *   mouseButtonMask: 1
11619 * })
11620 * @param {HTMLElement} element
11621 * @param {string} toolName
11622 * @param {(Object|string[]|number)} options
11623 * @param {(string[])} interactionTypes
11624 * @returns {undefined}
11625 */
11626
11627var setToolActiveForElement = function setToolActiveForElement(element, toolName, options, interactionTypes) {
11628  // If interactionTypes was passed in via options
11629  if (interactionTypes === undefined && Array.isArray(options)) {
11630    interactionTypes = options;
11631    options = null;
11632  }
11633
11634  var tool = Object(_getToolForElement_js__WEBPACK_IMPORTED_MODULE_2__["default"])(element, toolName);
11635
11636  if (tool) {
11637    _resolveInputConflicts(element, tool, options, interactionTypes); // Iterate over specific interaction types and set active
11638    // This is used as a secondary check on active tools to find the active "parts" of the tool
11639
11640
11641    tool.supportedInteractionTypes.forEach(function (interactionType) {
11642      if (interactionTypes === undefined || interactionTypes.includes(interactionType)) {
11643        options["is".concat(interactionType, "Active")] = true;
11644      } else {
11645        options["is".concat(interactionType, "Active")] = false;
11646      }
11647    });
11648
11649    if (globalConfiguration.state.showSVGCursors && tool.supportedInteractionTypes.includes('Mouse')) {
11650      _setToolCursorIfPrimary(element, options, tool);
11651    }
11652  } // Resume normal behavior
11653
11654
11655  setToolModeForElement('active', null, element, toolName, options);
11656};
11657
11658function _setToolCursorIfPrimary(element, options, tool) {
11659  var mouseButtonMask;
11660
11661  if (typeof options === 'number') {
11662    mouseButtonMask = [options];
11663  } else {
11664    mouseButtonMask = options.mouseButtonMask;
11665  }
11666
11667  if (mouseButtonMask.includes(1)) {
11668    if (tool.svgCursor) {
11669      Object(_setToolCursor_js__WEBPACK_IMPORTED_MODULE_4__["setToolCursor"])(tool.element, tool.svgCursor);
11670    } else if (tool.hideDefaultCursor) {
11671      Object(_setToolCursor_js__WEBPACK_IMPORTED_MODULE_4__["hideToolCursor"])(element);
11672    } else {
11673      Object(_setToolCursor_js__WEBPACK_IMPORTED_MODULE_4__["resetToolCursor"])(element);
11674    }
11675  }
11676}
11677/**
11678 * Sets all tool's state, with the provided toolName, to 'active'. Active tools are rendered,
11679 * respond to user input, and can create new data.
11680 * @public
11681 * @function setToolActive
11682 * @memberof CornerstoneTools
11683 *
11684 * @param {string} toolName
11685 * @param {(Object|string[]|number)} options
11686 * @param {(string[])} interactionTypes
11687 * @returns {undefined}
11688 */
11689
11690
11691var setToolActive = function setToolActive(toolName, options, interactionTypes) {
11692  _trackGlobalToolModeChange('active', toolName, options, interactionTypes);
11693
11694  _store_index_js__WEBPACK_IMPORTED_MODULE_3__["default"].state.enabledElements.forEach(function (element) {
11695    setToolActiveForElement(element, toolName, options, interactionTypes);
11696  });
11697};
11698/**
11699 * Sets a tool's state, with the provided toolName and element, to 'disabled'. Disabled tools are not rendered,
11700 * and do not respond to user input
11701 * @public
11702 * @function setToolDisabledForElement
11703 * @memberof CornerstoneTools
11704 *
11705 * @param {HTMLElement} element
11706 * @param {string} toolName
11707 * @param {(Object|number)} options
11708 * @returns {undefined}
11709 */
11710
11711
11712var setToolDisabledForElement = setToolModeForElement.bind(null, 'disabled', null);
11713/**
11714 * Sets all tool's state, with the provided toolName, to 'disabled'. Disabled tools are not rendered,
11715 * and do not respond to user input
11716 * @public
11717 * @function setToolDisabled
11718 * @memberof CornerstoneTools
11719 *
11720 * @param {string} toolName
11721 * @param {(Object|number)} options
11722 * @returns {undefined}
11723 */
11724
11725var setToolDisabled = setToolMode.bind(null, 'disabled', null);
11726/**
11727 * Sets a tool's state, with the provided toolName and element, to 'enabled'. Enabled tools are rendered,
11728 * but do not respond to user input
11729 * @public
11730 * @function setToolEnabledForElement
11731 * @memberof CornerstoneTools
11732 *
11733 * @param {HTMLElement} element
11734 * @param {string} toolName
11735 * @param {(Object|number)} options
11736 * @returns {undefined}
11737 */
11738
11739var setToolEnabledForElement = setToolModeForElement.bind(null, 'enabled', null);
11740/**
11741 * Sets all tool's state, with the provided toolName, to 'enabled'. Enabled tools are rendered,
11742 * but do not respond to user input
11743 * @public
11744 * @function setToolEnabled
11745 * @memberof CornerstoneTools
11746 *
11747 * @param {string} toolName
11748 * @param {(Object|number)} options
11749 * @returns {undefined}
11750 */
11751
11752var setToolEnabled = setToolMode.bind(null, 'enabled', null);
11753/**
11754 * Sets a tool's state, with the provided toolName and element, to 'passive'. Passive tools are rendered and respond to user input,
11755 * but do not create new measurements or annotations.
11756 * @public
11757 * @function setToolPassiveForElement
11758 * @memberof CornerstoneTools
11759 *
11760 * @param {HTMLElement} element
11761 * @param {string} toolName
11762 * @param {(Object|number)} options
11763 * @returns {undefined}
11764 */
11765
11766var setToolPassiveForElement = setToolModeForElement.bind(null, 'passive', _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOOL_DEACTIVATED);
11767/**
11768 * Sets all tool's state, with the provided toolName, to 'passive'. Passive tools are rendered and respond to user input,
11769 * but do not create new measurements or annotations.
11770 * @public
11771 * @function setToolPassive
11772 * @memberof CornerstoneTools
11773 *
11774 * @param {string} toolName
11775 * @param {(Object|number)} options
11776 * @returns {undefined}
11777 */
11778
11779var setToolPassive = setToolMode.bind(null, 'passive', _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOOL_DEACTIVATED);
11780/**
11781 * An internal method that helps make sure we change tool mode in a consistent
11782 * way
11783 * @private
11784 * @function setToolModeForElement
11785 *
11786 * @param {string} mode
11787 * @param {string} changeEvent
11788 * @param {HTMLElement} element
11789 * @param {string} toolName
11790 * @param {(Object|number[]|number)} options
11791 * @returns {undefined}
11792 */
11793
11794function setToolModeForElement(mode, changeEvent, element, toolName, options) {
11795  var tool = Object(_getToolForElement_js__WEBPACK_IMPORTED_MODULE_2__["default"])(element, toolName);
11796
11797  if (!tool) {
11798    logger.warn('Unable to find tool "%s" for enabledElement', toolName);
11799    return;
11800  }
11801
11802  options = _getNormalizedOptions(options); // Keep the same if not an array (undefined)
11803  // Reset if empty array
11804  // Merge if array contains any bindings
11805
11806  if (Array.isArray(options.mouseButtonMask) && options.mouseButtonMask.length !== 0 && Array.isArray(tool.options.mouseButtonMask)) {
11807    options.mouseButtonMask = _mergeMouseButtonMask(options.mouseButtonMask, tool.options.mouseButtonMask);
11808  } // Set mode & options
11809
11810
11811  tool.mode = mode;
11812  tool.mergeOptions(options); // Call tool's hook for this event, if one exists
11813
11814  if (tool["".concat(mode, "Callback")]) {
11815    tool["".concat(mode, "Callback")](element, options);
11816  } // Emit event indicating tool state change
11817
11818
11819  if (changeEvent) {
11820    var statusChangeEventData = {
11821      options: options,
11822      toolName: toolName,
11823      type: changeEvent
11824    };
11825    Object(_util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_1__["default"])(element, changeEvent, statusChangeEventData);
11826  } // Trigger Update
11827  // Todo: don't error out if image hasn't been loaded...
11828  // Cornerstone.updateImage(element);
11829
11830}
11831/**
11832 * A helper/quick way to set a tool's mode for all canvases
11833 *
11834 * @private
11835 * @function setToolMode
11836 *
11837 * @param {string} mode
11838 * @param {string} changeEvent
11839 * @param {string} toolName
11840 * @param {(Object|number)} options
11841 * @returns {undefined}
11842 */
11843
11844
11845function setToolMode(mode, changeEvent, toolName, options) {
11846  _trackGlobalToolModeChange(mode, toolName, options);
11847
11848  _store_index_js__WEBPACK_IMPORTED_MODULE_3__["default"].state.enabledElements.forEach(function (element) {
11849    setToolModeForElement(mode, changeEvent, element, toolName, options);
11850  });
11851}
11852/**
11853 * Find tool's that conflict with the incoming tool's mouse/touch bindings and
11854 * resolve those conflicts.
11855 *
11856 * @private
11857 * @function _resolveInputConflicts
11858 *
11859 * @param {HTMLElement} element
11860 * @param {Object} tool
11861 * @param {(Object|number)} options
11862 * @param {(Array)} interactionTypes
11863 * @returns {undefined}
11864 */
11865
11866
11867function _resolveInputConflicts(element, tool, options, interactionTypes) {
11868  // Iterate over the interaction types our tool supports.
11869  // For each one we intend to activate, check for potential conflicts
11870  // And resolve them
11871  tool.supportedInteractionTypes.forEach(function (interactionType) {
11872    if (interactionTypes === undefined || interactionTypes.includes(interactionType)) {
11873      var inputResolver = _inputResolvers[interactionType];
11874
11875      if (inputResolver) {
11876        inputResolver(tool, element, options);
11877      } else {
11878        logger.warn('Unable to resolve input conflicts for type %s', interactionType);
11879      }
11880    }
11881  });
11882  var activeToolsForElement = _store_index_js__WEBPACK_IMPORTED_MODULE_3__["default"].state.tools.filter(function (t) {
11883    return t.element === element && t.mode === 'active' && t.supportedInteractionTypes.length > 0;
11884  });
11885  activeToolsForElement.forEach(function (t) {
11886    var toolHasAnyActiveInteractionType = false;
11887    t.supportedInteractionTypes.forEach(function (interactionType) {
11888      if (t.options["is".concat(interactionType, "Active")]) {
11889        toolHasAnyActiveInteractionType = true;
11890      }
11891    });
11892
11893    if (!toolHasAnyActiveInteractionType) {
11894      logger.log("Setting tool %s's to PASSIVE", t.name);
11895      setToolPassiveForElement(element, t.name);
11896    }
11897  });
11898}
11899/**
11900 * Resolves conflicting active tools when activating a tool for mouse interaction
11901 * @private
11902 * @function _resolveMouseInputConflicts
11903 *
11904 * @param {Object} tool
11905 * @param {HTMLElement} element
11906 * @param {(Object|number)} options
11907 * @returns {undefined}
11908 */
11909
11910
11911function _resolveMouseInputConflicts(tool, element, options) {
11912  var mouseButtonMask = _getNormalizedOptions(options).mouseButtonMask;
11913
11914  var hasMouseButtonMask = Array.isArray(mouseButtonMask) && mouseButtonMask.length > 0;
11915
11916  if (!hasMouseButtonMask) {
11917    return;
11918  }
11919
11920  var activeToolWithMatchingMouseButtonMask = _store_index_js__WEBPACK_IMPORTED_MODULE_3__["default"].state.tools.find(function (t) {
11921    return t.element === element && t.mode === 'active' && t.options.isMouseActive === true && Array.isArray(t.options.mouseButtonMask) && t.options.mouseButtonMask.some(function (v) {
11922      return mouseButtonMask.includes(v);
11923    });
11924  });
11925
11926  if (activeToolWithMatchingMouseButtonMask) {
11927    // Remove collissions
11928    activeToolWithMatchingMouseButtonMask.options.mouseButtonMask = activeToolWithMatchingMouseButtonMask.options.mouseButtonMask.filter(function (mask) {
11929      return !mouseButtonMask.includes(mask);
11930    }); // If no remaining bindings, set inactive
11931
11932    if (activeToolWithMatchingMouseButtonMask.options.mouseButtonMask.length === 0) {
11933      activeToolWithMatchingMouseButtonMask.options.isMouseActive = false;
11934    }
11935  }
11936}
11937/**
11938 * Resolves conflicting active tools when activating a tool for touch interaction
11939 * @private
11940 * @function _resolveTouchInputConflicts
11941 *
11942 * @param {Object} tool
11943 * @param {HTMLElement} element
11944 * @param {Object} options
11945 * @returns {undefined}
11946 */
11947
11948
11949function _resolveTouchInputConflicts(tool, element, options) {
11950  var activeTouchTool = _store_index_js__WEBPACK_IMPORTED_MODULE_3__["default"].state.tools.find(function (t) {
11951    return t.element === element && t.mode === 'active' && t.options.isTouchActive === true;
11952  });
11953  var activeMultiTouchToolWithOneTouchPointer = _store_index_js__WEBPACK_IMPORTED_MODULE_3__["default"].state.tools.find(function (t) {
11954    return t.element === element && t.mode === 'active' && t.options.isMultiTouchActive === true && t.configuration.touchPointers === 1;
11955  });
11956
11957  if (activeTouchTool) {
11958    logger.log("Setting tool %s's isTouchActive to false", activeTouchTool.name);
11959    activeTouchTool.options.isTouchActive = false;
11960  }
11961
11962  if (activeMultiTouchToolWithOneTouchPointer) {
11963    logger.log("Setting tool %s's isTouchActive to false", activeMultiTouchToolWithOneTouchPointer.name);
11964    activeMultiTouchToolWithOneTouchPointer.options.isMultiTouchActive = false;
11965  }
11966}
11967/**
11968 * Resolves conflicting active tools when activating a tool for MultiTouch interaction
11969 * @private
11970 * @function _resolveMultiTouchInputConflicts
11971 *
11972 * @param {Object} tool
11973 * @param {HTMLElement} element
11974 * @param {Object} options
11975 * @returns {undefined}
11976 */
11977
11978
11979function _resolveMultiTouchInputConflicts(tool, element, options) {
11980  var activeMultiTouchTool = _store_index_js__WEBPACK_IMPORTED_MODULE_3__["default"].state.tools.find(function (t) {
11981    return t.element === element && t.mode === 'active' && t.options.isMultiTouchActive === true && t.configuration.touchPointers === tool.configuration.touchPointers;
11982  });
11983  var activeTouchTool;
11984
11985  if (tool.configuration.touchPointers === 1) {
11986    activeTouchTool = _store_index_js__WEBPACK_IMPORTED_MODULE_3__["default"].state.tools.find(function (t) {
11987      return t.element === element && t.mode === 'active' && t.options.isTouchActive === true;
11988    });
11989  }
11990
11991  if (activeMultiTouchTool) {
11992    logger.log("Setting tool %s's isMultiTouchActive to false", activeMultiTouchTool.name);
11993    activeMultiTouchTool.options.isMultiTouchActive = false;
11994  }
11995
11996  if (activeTouchTool) {
11997    logger.log("Setting tool %s's isTouchActive to false", activeTouchTool.name);
11998    activeTouchTool.options.isTouchActive = false;
11999  }
12000}
12001/**
12002 * If the incoming tool isTouchActive, find any conflicting tools
12003 * and set their isTouchActive to false to avoid conflicts.
12004 *
12005 * @private
12006 * @function _resolveGenericInputConflicts
12007 *
12008 * @param {string} interactionType
12009 * @param {Object} tool
12010 * @param {HTMLElement} element
12011 * @param {(Object|number)} options
12012 * @returns {undefined}
12013 */
12014
12015
12016function _resolveGenericInputConflicts(interactionType, tool, element, options) {
12017  var interactionTypeFlag = "is".concat(interactionType, "Active");
12018  var activeToolWithActiveInteractionType = _store_index_js__WEBPACK_IMPORTED_MODULE_3__["default"].state.tools.find(function (t) {
12019    return t.element === element && t.mode === 'active' && t.options[interactionTypeFlag] === true;
12020  });
12021
12022  if (activeToolWithActiveInteractionType) {
12023    logger.log("Setting tool %s's %s to false", activeToolWithActiveInteractionType.name, interactionTypeFlag);
12024    activeToolWithActiveInteractionType.options[interactionTypeFlag] = false;
12025  }
12026}
12027
12028function _trackGlobalToolModeChange(mode, toolName, options, interactionTypes) {
12029  if (!_store_index_js__WEBPACK_IMPORTED_MODULE_3__["default"].modules.globalConfiguration.state.globalToolSyncEnabled) {
12030    return;
12031  } // Update Tool History
12032
12033
12034  var historyEvent = {
12035    mode: mode,
12036    args: [toolName, options]
12037  };
12038
12039  if (interactionTypes) {
12040    historyEvent.push(interactionTypes);
12041  }
12042
12043  _store_index_js__WEBPACK_IMPORTED_MODULE_3__["default"].state.globalToolChangeHistory.push(historyEvent);
12044  var arbitraryChangeHistoryLimit = 50;
12045
12046  if (_store_index_js__WEBPACK_IMPORTED_MODULE_3__["default"].state.globalToolChangeHistory.length > arbitraryChangeHistoryLimit) {
12047    _store_index_js__WEBPACK_IMPORTED_MODULE_3__["default"].state.globalToolChangeHistory.shift();
12048  } // Update ActiveBindings Array
12049
12050
12051  var globalTool = _store_index_js__WEBPACK_IMPORTED_MODULE_3__["default"].state.globalTools[toolName];
12052
12053  if (!globalTool) {
12054    logger.warn("setToolMode call for tool that's not available globally: ".concat(toolName));
12055    return;
12056  }
12057
12058  if (mode === 'active') {
12059    var stringBindings = _determineStringBindings(toolName, options, interactionTypes); // Remove the incoming bindings from all global tools
12060
12061
12062    Object.keys(_store_index_js__WEBPACK_IMPORTED_MODULE_3__["default"].state.globalTools).forEach(function (key) {
12063      var tool = _store_index_js__WEBPACK_IMPORTED_MODULE_3__["default"].state.globalTools[key];
12064      tool.activeBindings = tool.activeBindings.filter(function (binding) {
12065        return !stringBindings.includes(binding);
12066      });
12067    }); // @HACK: Clear mouse bindings
12068
12069    if (stringBindings.some(function (binding) {
12070      return binding.includes('Mouse-DELETE');
12071    })) {
12072      globalTool.activeBindings = globalTool.activeBindings.filter(function (binding) {
12073        return !binding.includes('Mouse');
12074      });
12075      stringBindings = stringBindings.filter(function (binding) {
12076        return !binding.includes('Mouse');
12077      });
12078    }
12079
12080    globalTool.activeBindings = globalTool.activeBindings.concat(stringBindings);
12081  } else {
12082    globalTool.activeBindings = [];
12083  }
12084}
12085
12086function _determineStringBindings(toolName, options, interactionTypes) {
12087  if (interactionTypes === undefined && Array.isArray(options)) {
12088    interactionTypes = options;
12089    options = null;
12090  }
12091
12092  var stringBindings = [];
12093  var globalTool = _store_index_js__WEBPACK_IMPORTED_MODULE_3__["default"].state.globalTools[toolName];
12094
12095  if (globalTool) {
12096    // eslint-disable-next-line new-cap
12097    var tool = new globalTool.tool(globalTool.props);
12098    tool.supportedInteractionTypes.forEach(function (interactionType) {
12099      if (interactionTypes === undefined || interactionTypes.includes(interactionType)) {
12100        if (interactionType === 'Mouse') {
12101          var mouseButtonMasks = _getNormalizedOptions(options).mouseButtonMask; // Add or delete
12102
12103
12104          if (Array.isArray(mouseButtonMasks) && mouseButtonMasks.length > 0) {
12105            mouseButtonMasks.forEach(function (mask) {
12106              return stringBindings.push("".concat(interactionType, "-").concat(mask));
12107            });
12108          } else if (Array.isArray(mouseButtonMasks) && mouseButtonMasks.length === 0) {
12109            stringBindings.push("".concat(interactionType, "-DELETE"));
12110          }
12111        } else if (interactionType === 'MultiTouch') {
12112          stringBindings.push("".concat(interactionType, "-").concat(tool.configuration.touchPointers));
12113        } else {
12114          stringBindings.push(interactionType);
12115        }
12116      }
12117    });
12118  }
12119
12120  return stringBindings;
12121}
12122
12123var _inputResolvers = {
12124  Mouse: _resolveMouseInputConflicts,
12125  MouseWheel: _resolveGenericInputConflicts.bind(undefined, 'MouseWheel'),
12126  Touch: _resolveTouchInputConflicts,
12127  TouchPinch: _resolveGenericInputConflicts.bind(undefined, 'TouchPinch'),
12128  TouchRotate: _resolveGenericInputConflicts.bind(undefined, 'TouchRotate'),
12129  DoubleTap: _resolveGenericInputConflicts.bind(undefined, 'DoubleTap'),
12130  MultiTouch: _resolveMultiTouchInputConflicts
12131};
12132
12133function _getNormalizedOptions(options) {
12134  if (Array.isArray(options)) {
12135    // If options is an array assume the array is the mouseButtonMask array
12136    options = {
12137      mouseButtonMask: options
12138    };
12139  } else if (options !== Object(options)) {
12140    // And if it's something other than an object, assume options is
12141    // a single mouseButtonMask
12142    options = {
12143      mouseButtonMask: [options]
12144    };
12145  } // If there is still no 'mouseButtonMask' default it to an empty array
12146
12147
12148  if (!options.hasOwnProperty('mouseButtonMask')) {
12149    options.mouseButtonMask = [];
12150  }
12151
12152  if (!Array.isArray(options.mouseButtonMask)) {
12153    options.mouseButtonMask = [options.mouseButtonMask];
12154  } // Now filter out anything that is not an number or is the number 0
12155
12156
12157  options.mouseButtonMask = options.mouseButtonMask.filter(function (o) {
12158    return typeof o === 'number' && o !== 0;
12159  });
12160  return options;
12161}
12162
12163function _mergeMouseButtonMask(newMask, oldMask) {
12164  // Merges and removes duplicates
12165  return newMask.concat(oldMask).reduce(function (acc, m) {
12166    if (acc.indexOf(m) === -1) {
12167      acc.push(m);
12168    }
12169
12170    return acc;
12171  }, []);
12172}
12173
12174
12175
12176/***/ }),
12177
12178/***/ "./store/setToolOptions.js":
12179/*!*********************************!*\
12180  !*** ./store/setToolOptions.js ***!
12181  \*********************************/
12182/*! exports provided: setToolOptions, setToolOptionsForElement */
12183/***/ (function(module, __webpack_exports__, __webpack_require__) {
12184
12185"use strict";
12186__webpack_require__.r(__webpack_exports__);
12187/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setToolOptions", function() { return setToolOptions; });
12188/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setToolOptionsForElement", function() { return setToolOptionsForElement; });
12189/* harmony import */ var _getToolForElement_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getToolForElement.js */ "./store/getToolForElement.js");
12190/* harmony import */ var _index_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./index.js */ "./store/index.js");
12191
12192
12193/**
12194 * Sets the options of a tool on a specific element.
12195 * @export
12196 * @public
12197 * @method
12198 * @name setToolOptionsForElement
12199 *
12200 * @param {HTMLElement} element The element.
12201 * @param {string} toolName The name of the tool.
12202 * @param {Object} options The options to set.
12203 * @returns {void}
12204 */
12205
12206var setToolOptionsForElement = function setToolOptionsForElement(element, toolName, options) {
12207  var tool = Object(_getToolForElement_js__WEBPACK_IMPORTED_MODULE_0__["default"])(element, toolName);
12208
12209  if (tool) {
12210    tool.mergeOptions(options);
12211  }
12212};
12213/**
12214 * Sets the options of a tool for all elements.
12215 * @export
12216 * @public
12217 * @method
12218 * @name setToolOptions
12219 *
12220 * @param {string} toolName
12221 * @param {Object} options
12222 * @returns {void}
12223 */
12224
12225
12226var setToolOptions = function setToolOptions(toolName, options) {
12227  _index_js__WEBPACK_IMPORTED_MODULE_1__["state"].enabledElements.forEach(function (element) {
12228    setToolOptionsForElement(element, toolName, options);
12229  });
12230};
12231
12232
12233
12234/***/ }),
12235
12236/***/ "./synchronization/Synchronizer.js":
12237/*!*****************************************!*\
12238  !*** ./synchronization/Synchronizer.js ***!
12239  \*****************************************/
12240/*! exports provided: default */
12241/***/ (function(module, __webpack_exports__, __webpack_require__) {
12242
12243"use strict";
12244__webpack_require__.r(__webpack_exports__);
12245/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js");
12246/* harmony import */ var _util_convertToVector3_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../util/convertToVector3.js */ "./util/convertToVector3.js");
12247/* harmony import */ var _toolOptions_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../toolOptions.js */ "./toolOptions.js");
12248
12249
12250
12251/**
12252 * Return an array filtered to only its unique members
12253 *
12254 * @private
12255 * @param {Array} array - The array to filter
12256 * @returns {Array}
12257 */
12258
12259function unique(array) {
12260  return array.filter(function (value, index, self) {
12261    return self.indexOf(value) === index;
12262  });
12263}
12264/**
12265 * Synchronize target and source elements when an event fires on the source element
12266 * @export @public constructor
12267 * @name Synchronizer
12268 *
12269 * @param {String} event - The event(s) that will trigger synchronization. Separate multiple events by a space
12270 * @param {Function} handler - The function that will make the necessary changes to the target element in order to synchronize it with the source element
12271 * @returns {void}
12272 */
12273
12274
12275function Synchronizer(event, handler) {
12276  var cornerstone = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone;
12277  var that = this;
12278  var sourceElements = []; // Source elements fire the events we want to synchronize to
12279
12280  var targetElements = []; // Target elements we want to synchronize to source elements
12281
12282  var ignoreFiredEvents = false;
12283  var initialData = {};
12284  var eventHandler = handler;
12285  this.enabled = true;
12286  /**
12287   * Update the event handler to perform synchronization
12288   * @param {Function} handler - The event handler function
12289   * @returns {void}
12290   */
12291
12292  this.setHandler = function (handler) {
12293    eventHandler = handler;
12294  };
12295  /**
12296   * Return a reference to the event handler function
12297   * @returns {Function}
12298   */
12299
12300
12301  this.getHandler = function () {
12302    return eventHandler;
12303  };
12304  /**
12305   * Calculate the initial distances between the source image and each
12306   * of the target images
12307   * @returns {void}
12308   */
12309
12310
12311  this.getDistances = function () {
12312    if (!sourceElements.length || !targetElements.length) {
12313      return;
12314    }
12315
12316    initialData.distances = {};
12317    initialData.imageIds = {
12318      sourceElements: [],
12319      targetElements: []
12320    };
12321    sourceElements.forEach(function (sourceElement) {
12322      var sourceEnabledElement = cornerstone.getEnabledElement(sourceElement);
12323
12324      if (!sourceEnabledElement || !sourceEnabledElement.image) {
12325        return;
12326      }
12327
12328      var sourceImageId = sourceEnabledElement.image.imageId;
12329      var sourceImagePlane = cornerstone.metaData.get('imagePlaneModule', sourceImageId);
12330
12331      if (!sourceImagePlane || !sourceImagePlane.imagePositionPatient) {
12332        return;
12333      }
12334
12335      var sourceImagePosition = Object(_util_convertToVector3_js__WEBPACK_IMPORTED_MODULE_1__["default"])(sourceImagePlane.imagePositionPatient);
12336
12337      if (initialData.hasOwnProperty(sourceEnabledElement)) {
12338        return;
12339      }
12340
12341      initialData.distances[sourceImageId] = {};
12342      initialData.imageIds.sourceElements.push(sourceImageId);
12343      targetElements.forEach(function (targetElement) {
12344        var targetEnabledElement = cornerstone.getEnabledElement(targetElement);
12345
12346        if (!targetEnabledElement || !targetEnabledElement.image) {
12347          return;
12348        }
12349
12350        var targetImageId = targetEnabledElement.image.imageId;
12351        initialData.imageIds.targetElements.push(targetImageId);
12352
12353        if (sourceElement === targetElement) {
12354          return;
12355        }
12356
12357        if (sourceImageId === targetImageId) {
12358          return;
12359        }
12360
12361        if (initialData.distances[sourceImageId].hasOwnProperty(targetImageId)) {
12362          return;
12363        }
12364
12365        var targetImagePlane = cornerstone.metaData.get('imagePlaneModule', targetImageId);
12366
12367        if (!targetImagePlane || !targetImagePlane.imagePositionPatient) {
12368          return;
12369        }
12370
12371        var targetImagePosition = Object(_util_convertToVector3_js__WEBPACK_IMPORTED_MODULE_1__["default"])(targetImagePlane.imagePositionPatient);
12372        initialData.distances[sourceImageId][targetImageId] = targetImagePosition.clone().sub(sourceImagePosition);
12373      });
12374
12375      if (!Object.keys(initialData.distances[sourceImageId]).length) {
12376        delete initialData.distances[sourceImageId];
12377      }
12378    });
12379  };
12380  /**
12381   * Gather necessary event data and call synchronization handler
12382   *
12383   * @private
12384   * @param {HTMLElement} sourceElement - The source element for the event
12385   * @param {Object} eventData - The data object for the source event
12386   * @returns {void}
12387   */
12388
12389
12390  function fireEvent(sourceElement, eventData) {
12391    var isDisabled = !that.enabled;
12392    var noElements = !sourceElements.length || !targetElements.length;
12393
12394    if (isDisabled || noElements) {
12395      return;
12396    }
12397
12398    ignoreFiredEvents = true;
12399    targetElements.forEach(function (targetElement) {
12400      var targetIndex = targetElements.indexOf(targetElement);
12401
12402      if (targetIndex === -1) {
12403        return;
12404      }
12405
12406      var targetImageId = initialData.imageIds.targetElements[targetIndex];
12407      var sourceIndex = sourceElements.indexOf(sourceElement);
12408
12409      if (sourceIndex === -1) {
12410        return;
12411      }
12412
12413      var sourceImageId = initialData.imageIds.sourceElements[sourceIndex];
12414      var positionDifference;
12415
12416      if (sourceImageId === targetImageId) {
12417        positionDifference = 0;
12418      } else if (initialData.distances[sourceImageId] !== undefined) {
12419        positionDifference = initialData.distances[sourceImageId][targetImageId];
12420      }
12421
12422      eventHandler(that, sourceElement, targetElement, eventData, positionDifference);
12423    });
12424    ignoreFiredEvents = false;
12425  }
12426  /**
12427   * Call fireEvent if not ignoring events, and pass along event data
12428   *
12429   * @private
12430   * @param {Event} e - The source event object
12431   * @returns {void}
12432   */
12433
12434
12435  function onEvent(e) {
12436    var eventData = e.detail;
12437
12438    if (ignoreFiredEvents === true) {
12439      return;
12440    }
12441
12442    fireEvent(e.currentTarget, eventData);
12443  }
12444  /**
12445   * Add a source element to this synchronizer
12446   *
12447   * @param {HTMLElement} element - The new source element
12448   * @returns {void}
12449   */
12450
12451
12452  this.addSource = function (element) {
12453    // Return if this element was previously added
12454    var index = sourceElements.indexOf(element);
12455
12456    if (index !== -1) {
12457      return;
12458    } // Add to our list of enabled elements
12459
12460
12461    sourceElements.push(element); // Subscribe to the event
12462
12463    event.split(' ').forEach(function (oneEvent) {
12464      element.addEventListener(oneEvent, onEvent);
12465    }); // Update the initial distances between elements
12466
12467    that.getDistances();
12468    that.updateDisableHandlers();
12469  };
12470  /**
12471   * Add a target element to this synchronizer
12472   *
12473   * @param {HTMLElement} element - The new target element to be synchronized
12474   * @returns {void}
12475   */
12476
12477
12478  this.addTarget = function (element) {
12479    // Return if this element was previously added
12480    var index = targetElements.indexOf(element);
12481
12482    if (index !== -1) {
12483      return;
12484    } // Add to our list of enabled elements
12485
12486
12487    targetElements.push(element); // Update the initial distances between elements
12488
12489    that.getDistances(); // Invoke the handler for this new target element
12490
12491    eventHandler(that, element, element, 0);
12492    that.updateDisableHandlers();
12493  };
12494  /**
12495   * Add an element to this synchronizer as both a source and a target
12496   *
12497   * @param {HTMLElement} element - The new element
12498   * @returns {void}
12499   */
12500
12501
12502  this.add = function (element) {
12503    that.addSource(element);
12504    that.addTarget(element);
12505  };
12506  /**
12507   * Remove a source element from this synchronizer
12508   *
12509   * @param {HTMLElement} element - The element to be removed
12510   * @returns {void}
12511   */
12512
12513
12514  this.removeSource = function (element) {
12515    // Find the index of this element
12516    var index = sourceElements.indexOf(element);
12517
12518    if (index === -1) {
12519      return;
12520    } // Remove this element from the array
12521
12522
12523    sourceElements.splice(index, 1); // Stop listening for the event
12524
12525    event.split(' ').forEach(function (oneEvent) {
12526      element.removeEventListener(oneEvent, onEvent);
12527    }); // Update the initial distances between elements
12528
12529    that.getDistances(); // Update everyone listening for events
12530
12531    fireEvent(element);
12532    that.updateDisableHandlers();
12533  };
12534  /**
12535   * Remove a target element from this synchronizer
12536   *
12537   * @param {HTMLElement} element - The element to be removed
12538   * @returns {void}
12539   */
12540
12541
12542  this.removeTarget = function (element) {
12543    // Find the index of this element
12544    var index = targetElements.indexOf(element);
12545
12546    if (index === -1) {
12547      return;
12548    } // Remove this element from the array
12549
12550
12551    targetElements.splice(index, 1); // Update the initial distances between elements
12552
12553    that.getDistances(); // Invoke the handler for the removed target
12554
12555    eventHandler(that, element, element, 0);
12556    that.updateDisableHandlers();
12557  };
12558  /**
12559   * Remove an element from this synchronizer as both a target and source
12560   *
12561   * @param {HTMLElement} element - The element to be removed
12562   * @returns {void}
12563   */
12564
12565
12566  this.remove = function (element) {
12567    that.removeTarget(element);
12568    that.removeSource(element);
12569  };
12570  /**
12571   * Get the array of source elements
12572   *
12573   * @returns {HTMLElement[]}
12574   */
12575
12576
12577  this.getSourceElements = function () {
12578    return sourceElements;
12579  };
12580  /**
12581   * Get the array of target elements
12582   *
12583   * @returns {HTMLElement[]}
12584   */
12585
12586
12587  this.getTargetElements = function () {
12588    return targetElements;
12589  };
12590  /**
12591   * Display an image while halting synchronization
12592   *
12593   * @param {HTMLElement} element - The element containing the image
12594   * @param {Object} image - The cornerstone image object
12595   * @param {Object} viewport - The cornerstone viewport object
12596   * @returns {void}
12597   */
12598
12599
12600  this.displayImage = function (element, image, viewport) {
12601    ignoreFiredEvents = true;
12602    cornerstone.displayImage(element, image, viewport);
12603    ignoreFiredEvents = false;
12604  };
12605  /**
12606   * Update a viewport while halting synchronization
12607   *
12608   * @param {HTMLElement} element - The target element
12609   * @param {Object} viewport - The new cornerstone viewport object
12610   * @returns {void}
12611   */
12612
12613
12614  this.setViewport = function (element, viewport) {
12615    ignoreFiredEvents = true;
12616    cornerstone.setViewport(element, viewport);
12617    ignoreFiredEvents = false;
12618  };
12619  /**
12620   * Remove an element from the synchronizer based on an event from that element
12621   *
12622   * @private
12623   * @param {Event} e - The event whose element will be removed
12624   * @returns {void}
12625   */
12626
12627
12628  function disableHandler(e) {
12629    var element = e.detail.element;
12630    that.remove(element);
12631    Object(_toolOptions_js__WEBPACK_IMPORTED_MODULE_2__["clearToolOptionsByElement"])(element);
12632  }
12633  /**
12634   * Add an event listener to each element that can remove it from the synchronizer
12635   * @returns {void}
12636   */
12637
12638
12639  this.updateDisableHandlers = function () {
12640    var elements = unique(sourceElements.concat(targetElements));
12641    elements.forEach(function (element) {
12642      element.removeEventListener(_externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.EVENTS.ELEMENT_DISABLED, disableHandler);
12643      element.addEventListener(_externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.EVENTS.ELEMENT_DISABLED, disableHandler);
12644    });
12645  };
12646  /**
12647   * Remove all elements from this synchronizer
12648   *  @returns {void}
12649   */
12650
12651
12652  this.destroy = function () {
12653    var elements = unique(sourceElements.concat(targetElements));
12654    elements.forEach(function (element) {
12655      that.remove(element);
12656    });
12657  };
12658}
12659
12660/* harmony default export */ __webpack_exports__["default"] = (Synchronizer);
12661
12662/***/ }),
12663
12664/***/ "./synchronization/panZoomSynchronizer.js":
12665/*!************************************************!*\
12666  !*** ./synchronization/panZoomSynchronizer.js ***!
12667  \************************************************/
12668/*! exports provided: default */
12669/***/ (function(module, __webpack_exports__, __webpack_require__) {
12670
12671"use strict";
12672__webpack_require__.r(__webpack_exports__);
12673/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js");
12674
12675/**
12676 * Synchronize the target zoom and pan to match the source
12677 * @export
12678 * @public
12679 * @method
12680 * @name panZoomSynchronizer
12681 *
12682 * @param {Object} synchronizer - The Synchronizer instance that attaches this
12683 * handler to an event
12684 * @param {HTMLElement} sourceElement - The source element for the zoom and pan values
12685 * @param {HTMLElement} targetElement - The target element
12686 * @returns {void}
12687 */
12688
12689/* harmony default export */ __webpack_exports__["default"] = (function (synchronizer, sourceElement, targetElement) {
12690  // Ignore the case where the source and target are the same enabled element
12691  if (targetElement === sourceElement) {
12692    return;
12693  }
12694
12695  var cornerstone = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone; // Get the source and target viewports
12696
12697  var sourceViewport = cornerstone.getViewport(sourceElement);
12698  var targetViewport = cornerstone.getViewport(targetElement); // Do nothing if the scale and translation are the same
12699
12700  if (targetViewport.scale === sourceViewport.scale && targetViewport.translation.x === sourceViewport.translation.x && targetViewport.translation.y === sourceViewport.translation.y) {
12701    return;
12702  } // Scale and/or translation are different, sync them
12703
12704
12705  targetViewport.scale = sourceViewport.scale;
12706  targetViewport.translation.x = sourceViewport.translation.x;
12707  targetViewport.translation.y = sourceViewport.translation.y;
12708  synchronizer.setViewport(targetElement, targetViewport);
12709});
12710
12711/***/ }),
12712
12713/***/ "./synchronization/stackImageIndexSynchronizer.js":
12714/*!********************************************************!*\
12715  !*** ./synchronization/stackImageIndexSynchronizer.js ***!
12716  \********************************************************/
12717/*! exports provided: default */
12718/***/ (function(module, __webpack_exports__, __webpack_require__) {
12719
12720"use strict";
12721__webpack_require__.r(__webpack_exports__);
12722/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js");
12723/* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../stateManagement/toolState.js */ "./stateManagement/toolState.js");
12724/* harmony import */ var _stateManagement_loadHandlerManager_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../stateManagement/loadHandlerManager.js */ "./stateManagement/loadHandlerManager.js");
12725/* harmony import */ var _util_clip_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../util/clip.js */ "./util/clip.js");
12726
12727
12728
12729
12730/**
12731 * Synchronize the target stack to the index closest to the source stack's index
12732 * @export
12733 * @public
12734 * @method
12735 * @name stackImageIndexSynchronizer
12736 *
12737 * @param {Object} synchronizer - The Synchronizer instance that attaches this
12738 * handler to an event
12739 * @param {HTMLElement} sourceElement - The source element for the index value
12740 * @param {HTMLElement} targetElement - The target element
12741 * @returns {void}
12742 */
12743
12744/* harmony default export */ __webpack_exports__["default"] = (function (synchronizer, sourceElement, targetElement) {
12745  // Ignore the case where the source and target are the same enabled element
12746  if (targetElement === sourceElement) {
12747    return;
12748  }
12749
12750  var cornerstone = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone;
12751  var sourceStackToolDataSource = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_1__["getToolState"])(sourceElement, 'stack');
12752  var sourceStackData = sourceStackToolDataSource.data[0];
12753  var targetStackToolDataSource = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_1__["getToolState"])(targetElement, 'stack');
12754  var targetStackData = targetStackToolDataSource.data[0];
12755  var newImageIdIndex = sourceStackData.currentImageIdIndex; // Clamp the index
12756
12757  newImageIdIndex = Object(_util_clip_js__WEBPACK_IMPORTED_MODULE_3__["default"])(newImageIdIndex, 0, targetStackData.imageIds.length - 1); // Do nothing if the index has not changed
12758
12759  if (newImageIdIndex === targetStackData.currentImageIdIndex) {
12760    return;
12761  }
12762
12763  var startLoadingHandler = _stateManagement_loadHandlerManager_js__WEBPACK_IMPORTED_MODULE_2__["default"].getStartLoadHandler(targetElement);
12764  var endLoadingHandler = _stateManagement_loadHandlerManager_js__WEBPACK_IMPORTED_MODULE_2__["default"].getEndLoadHandler(targetElement);
12765  var errorLoadingHandler = _stateManagement_loadHandlerManager_js__WEBPACK_IMPORTED_MODULE_2__["default"].getErrorLoadingHandler(targetElement);
12766
12767  if (startLoadingHandler) {
12768    startLoadingHandler(targetElement);
12769  }
12770
12771  var loader;
12772
12773  if (targetStackData.preventCache === true) {
12774    loader = cornerstone.loadImage(targetStackData.imageIds[newImageIdIndex]);
12775  } else {
12776    loader = cornerstone.loadAndCacheImage(targetStackData.imageIds[newImageIdIndex]);
12777  }
12778
12779  loader.then(function (image) {
12780    var viewport = cornerstone.getViewport(targetElement);
12781    targetStackData.currentImageIdIndex = newImageIdIndex;
12782    synchronizer.displayImage(targetElement, image, viewport);
12783
12784    if (endLoadingHandler) {
12785      endLoadingHandler(targetElement, image);
12786    }
12787  }, function (error) {
12788    var imageId = targetStackData.imageIds[newImageIdIndex];
12789
12790    if (errorLoadingHandler) {
12791      errorLoadingHandler(targetElement, imageId, error);
12792    }
12793  });
12794});
12795
12796/***/ }),
12797
12798/***/ "./synchronization/stackImagePositionOffsetSynchronizer.js":
12799/*!*****************************************************************!*\
12800  !*** ./synchronization/stackImagePositionOffsetSynchronizer.js ***!
12801  \*****************************************************************/
12802/*! exports provided: default */
12803/***/ (function(module, __webpack_exports__, __webpack_require__) {
12804
12805"use strict";
12806__webpack_require__.r(__webpack_exports__);
12807/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js");
12808/* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../stateManagement/toolState.js */ "./stateManagement/toolState.js");
12809/* harmony import */ var _stateManagement_loadHandlerManager_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../stateManagement/loadHandlerManager.js */ "./stateManagement/loadHandlerManager.js");
12810/* harmony import */ var _util_convertToVector3_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../util/convertToVector3.js */ "./util/convertToVector3.js");
12811
12812
12813
12814 // In the future we will want to have a way to manually register links sets of the same orientation (e.g. an axial link set from a prior with an axial link set of a current).  The user could do this by scrolling the two stacks to a similar location and then doing a user action (e.g. right click link) at which point the system will capture the delta between the image position (patient) of both stacks and use that to sync them.  This offset will need to be adjustable.
12815
12816/**
12817 * Calculate a position in space that is offset from the source image's position,
12818 * and synchronize the target stack to the image that is closest to that position.
12819 * @export
12820 * @public
12821 * @method
12822 * @name stackImagePositionOffsetSynchronizer
12823 *
12824 * @param {Object} synchronizer - The Synchronizer instance that attaches this
12825 * handler to an event
12826 * @param {HTMLElement} sourceElement - The source element
12827 * @param {HTMLElement} targetElement - The target element
12828 * @param {Object} eventData - The data object from the triggering event
12829 * @param {Object} positionDifference - An object with { x, y, z } values that will be
12830 * added to the source image's coordinates
12831 * @returns {void}
12832 */
12833
12834/* harmony default export */ __webpack_exports__["default"] = (function (synchronizer, sourceElement, targetElement, eventData, positionDifference) {
12835  // Ignore the case where the source and target are the same enabled element
12836  if (targetElement === sourceElement) {
12837    return;
12838  }
12839
12840  var cornerstone = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone;
12841  var sourceStackData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_1__["getToolState"])(sourceElement, 'stack').data[0];
12842  var sourceImageId = sourceStackData.imageIds[sourceStackData.currentImageIdIndex];
12843  var sourceImagePlane = cornerstone.metaData.get('imagePlaneModule', sourceImageId);
12844
12845  if (sourceImagePlane === undefined || sourceImagePlane.imagePositionPatient === undefined) {
12846    return;
12847  }
12848
12849  var sourceImagePosition = Object(_util_convertToVector3_js__WEBPACK_IMPORTED_MODULE_3__["default"])(sourceImagePlane.imagePositionPatient);
12850  var stackToolDataSource = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_1__["getToolState"])(targetElement, 'stack');
12851  var stackData = stackToolDataSource.data[0];
12852  var minDistance = Number.MAX_VALUE;
12853  var newImageIdIndex = -1;
12854
12855  if (!positionDifference) {
12856    return;
12857  }
12858
12859  var finalPosition = sourceImagePosition.clone().add(positionDifference);
12860  stackData.imageIds.forEach(function (imageId, index) {
12861    var imagePlane = cornerstone.metaData.get('imagePlaneModule', imageId);
12862
12863    if (imagePlane === undefined || imagePlane.imagePositionPatient === undefined) {
12864      return;
12865    }
12866
12867    var imagePosition = Object(_util_convertToVector3_js__WEBPACK_IMPORTED_MODULE_3__["default"])(imagePlane.imagePositionPatient);
12868    var distance = finalPosition.distanceToSquared(imagePosition);
12869
12870    if (distance < minDistance) {
12871      minDistance = distance;
12872      newImageIdIndex = index;
12873    }
12874  });
12875
12876  if (newImageIdIndex === stackData.currentImageIdIndex || newImageIdIndex === -1) {
12877    return;
12878  }
12879
12880  var startLoadingHandler = _stateManagement_loadHandlerManager_js__WEBPACK_IMPORTED_MODULE_2__["default"].getStartLoadHandler(targetElement);
12881  var endLoadingHandler = _stateManagement_loadHandlerManager_js__WEBPACK_IMPORTED_MODULE_2__["default"].getEndLoadHandler(targetElement);
12882  var errorLoadingHandler = _stateManagement_loadHandlerManager_js__WEBPACK_IMPORTED_MODULE_2__["default"].getErrorLoadingHandler(targetElement);
12883  stackData.currentImageIdIndex = newImageIdIndex;
12884  var newImageId = stackData.imageIds[newImageIdIndex];
12885
12886  if (startLoadingHandler) {
12887    startLoadingHandler(targetElement);
12888  }
12889
12890  var loader;
12891
12892  if (stackData.preventCache === true) {
12893    loader = cornerstone.loadImage(newImageId);
12894  } else {
12895    loader = cornerstone.loadAndCacheImage(newImageId);
12896  }
12897
12898  loader.then(function (image) {
12899    var viewport = cornerstone.getViewport(targetElement);
12900
12901    if (stackData.currentImageIdIndex !== newImageIdIndex) {
12902      return;
12903    }
12904
12905    synchronizer.displayImage(targetElement, image, viewport);
12906
12907    if (endLoadingHandler) {
12908      endLoadingHandler(targetElement, image);
12909    }
12910  }, function (error) {
12911    var imageId = stackData.imageIds[newImageIdIndex];
12912
12913    if (errorLoadingHandler) {
12914      errorLoadingHandler(targetElement, imageId, error);
12915    }
12916  });
12917});
12918
12919/***/ }),
12920
12921/***/ "./synchronization/stackImagePositionSynchronizer.js":
12922/*!***********************************************************!*\
12923  !*** ./synchronization/stackImagePositionSynchronizer.js ***!
12924  \***********************************************************/
12925/*! exports provided: default */
12926/***/ (function(module, __webpack_exports__, __webpack_require__) {
12927
12928"use strict";
12929__webpack_require__.r(__webpack_exports__);
12930/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js");
12931/* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../stateManagement/toolState.js */ "./stateManagement/toolState.js");
12932/* harmony import */ var _stateManagement_loadHandlerManager_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../stateManagement/loadHandlerManager.js */ "./stateManagement/loadHandlerManager.js");
12933/* harmony import */ var _util_convertToVector3_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../util/convertToVector3.js */ "./util/convertToVector3.js");
12934
12935
12936
12937
12938/**
12939 * Synchronize the target stack to the image closest to the source image's position
12940 * @export
12941 * @public
12942 * @method
12943 * @name stackImagePositionSynchronizer
12944 *
12945 * @param {Object} synchronizer - The Synchronizer instance that attaches this
12946 * handler to an event
12947 * @param {HTMLElement} sourceElement - The source element for the image position
12948 * @param {HTMLElement} targetElement - The target element
12949 * @returns {void}
12950 */
12951
12952/* harmony default export */ __webpack_exports__["default"] = (function (synchronizer, sourceElement, targetElement) {
12953  // Ignore the case where the source and target are the same enabled element
12954  if (targetElement === sourceElement) {
12955    return;
12956  }
12957
12958  var cornerstone = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone;
12959  var sourceStackData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_1__["getToolState"])(sourceElement, 'stack').data[0];
12960  var sourceImageId = sourceStackData.imageIds[sourceStackData.currentImageIdIndex];
12961  var sourceImagePlane = cornerstone.metaData.get('imagePlaneModule', sourceImageId);
12962
12963  if (sourceImagePlane === undefined || sourceImagePlane.imagePositionPatient === undefined) {
12964    // Console.log('No position found for image ' + sourceImage.imageId);
12965    return;
12966  }
12967
12968  var sourceImagePosition = Object(_util_convertToVector3_js__WEBPACK_IMPORTED_MODULE_3__["default"])(sourceImagePlane.imagePositionPatient);
12969  var stackToolDataSource = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_1__["getToolState"])(targetElement, 'stack');
12970  var stackData = stackToolDataSource.data[0];
12971  var minDistance = Number.MAX_VALUE;
12972  var newImageIdIndex = -1;
12973  stackData.imageIds.forEach(function (imageId, index) {
12974    var imagePlane = cornerstone.metaData.get('imagePlaneModule', imageId);
12975
12976    if (imagePlane === undefined || imagePlane.imagePositionPatient === undefined) {
12977      // Console.log('No position found for image ' + imageId);
12978      return;
12979    }
12980
12981    var imagePosition = Object(_util_convertToVector3_js__WEBPACK_IMPORTED_MODULE_3__["default"])(imagePlane.imagePositionPatient);
12982    var distance = imagePosition.distanceToSquared(sourceImagePosition); // Console.log(index + '=' + distance);
12983
12984    if (distance < minDistance) {
12985      minDistance = distance;
12986      newImageIdIndex = index;
12987    }
12988  });
12989
12990  if (newImageIdIndex === stackData.currentImageIdIndex) {
12991    return;
12992  }
12993
12994  var startLoadingHandler = _stateManagement_loadHandlerManager_js__WEBPACK_IMPORTED_MODULE_2__["default"].getStartLoadHandler(targetElement);
12995  var endLoadingHandler = _stateManagement_loadHandlerManager_js__WEBPACK_IMPORTED_MODULE_2__["default"].getEndLoadHandler(targetElement);
12996  var errorLoadingHandler = _stateManagement_loadHandlerManager_js__WEBPACK_IMPORTED_MODULE_2__["default"].getErrorLoadingHandler(targetElement);
12997  stackData.currentImageIdIndex = newImageIdIndex;
12998  var newImageId = stackData.imageIds[newImageIdIndex];
12999
13000  if (startLoadingHandler) {
13001    startLoadingHandler(targetElement);
13002  }
13003
13004  if (newImageIdIndex !== -1) {
13005    var loader;
13006
13007    if (stackData.preventCache === true) {
13008      loader = cornerstone.loadImage(newImageId);
13009    } else {
13010      loader = cornerstone.loadAndCacheImage(newImageId);
13011    }
13012
13013    loader.then(function (image) {
13014      var viewport = cornerstone.getViewport(targetElement);
13015
13016      if (stackData.currentImageIdIndex !== newImageIdIndex) {
13017        return;
13018      }
13019
13020      synchronizer.displayImage(targetElement, image, viewport);
13021
13022      if (endLoadingHandler) {
13023        endLoadingHandler(targetElement, image);
13024      }
13025    }, function (error) {
13026      var imageId = stackData.imageIds[newImageIdIndex];
13027
13028      if (errorLoadingHandler) {
13029        errorLoadingHandler(targetElement, imageId, error);
13030      }
13031    });
13032  }
13033});
13034
13035/***/ }),
13036
13037/***/ "./synchronization/stackScrollSynchronizer.js":
13038/*!****************************************************!*\
13039  !*** ./synchronization/stackScrollSynchronizer.js ***!
13040  \****************************************************/
13041/*! exports provided: default */
13042/***/ (function(module, __webpack_exports__, __webpack_require__) {
13043
13044"use strict";
13045__webpack_require__.r(__webpack_exports__);
13046/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js");
13047/* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../stateManagement/toolState.js */ "./stateManagement/toolState.js");
13048/* harmony import */ var _stateManagement_loadHandlerManager_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../stateManagement/loadHandlerManager.js */ "./stateManagement/loadHandlerManager.js");
13049/* harmony import */ var _util_clip_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../util/clip.js */ "./util/clip.js");
13050
13051
13052
13053
13054/**
13055 * Propogate scrolling actions from the source element to the target element.
13056 * @export
13057 * @public
13058 * @method
13059 * @name stackScrollSynchronizer
13060 *
13061 * @param {Object} synchronizer - The Synchronizer instance that attaches this
13062 * handler to an event
13063 * @param {HTMLElement} sourceElement - The source element for the scroll event
13064 * @param {HTMLElement} targetElement - The target element
13065 * @param {Object} eventData - The data object from the triggering event
13066 * @returns {void}
13067 */
13068
13069/* harmony default export */ __webpack_exports__["default"] = (function (synchronizer, sourceElement, targetElement, eventData) {
13070  // If the target and source are the same, stop
13071  if (sourceElement === targetElement) {
13072    return;
13073  } // If there is no event, or direction is 0, stop
13074
13075
13076  if (!eventData || !eventData.direction) {
13077    return;
13078  }
13079
13080  var cornerstone = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone; // Get the stack of the target viewport
13081
13082  var stackToolDataSource = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_1__["getToolState"])(targetElement, 'stack');
13083  var stackData = stackToolDataSource.data[0]; // Get the new index for the stack
13084
13085  var newImageIdIndex = stackData.currentImageIdIndex + eventData.direction; // Ensure the index does not exceed the bounds of the stack
13086
13087  newImageIdIndex = Object(_util_clip_js__WEBPACK_IMPORTED_MODULE_3__["default"])(newImageIdIndex, 0, stackData.imageIds.length - 1); // If the index has not changed, stop here
13088
13089  if (stackData.currentImageIdIndex === newImageIdIndex) {
13090    return;
13091  }
13092
13093  var startLoadingHandler = _stateManagement_loadHandlerManager_js__WEBPACK_IMPORTED_MODULE_2__["default"].getStartLoadHandler(targetElement);
13094  var endLoadingHandler = _stateManagement_loadHandlerManager_js__WEBPACK_IMPORTED_MODULE_2__["default"].getEndLoadHandler(targetElement);
13095  var errorLoadingHandler = _stateManagement_loadHandlerManager_js__WEBPACK_IMPORTED_MODULE_2__["default"].getErrorLoadingHandler(targetElement);
13096  stackData.currentImageIdIndex = newImageIdIndex;
13097  var newImageId = stackData.imageIds[newImageIdIndex];
13098
13099  if (startLoadingHandler) {
13100    startLoadingHandler(targetElement);
13101  }
13102
13103  var loader;
13104
13105  if (stackData.preventCache === true) {
13106    loader = cornerstone.loadImage(newImageId);
13107  } else {
13108    loader = cornerstone.loadAndCacheImage(newImageId);
13109  }
13110
13111  loader.then(function (image) {
13112    var viewport = cornerstone.getViewport(targetElement);
13113
13114    if (stackData.currentImageIdIndex !== newImageIdIndex) {
13115      return;
13116    }
13117
13118    synchronizer.displayImage(targetElement, image, viewport);
13119
13120    if (endLoadingHandler) {
13121      endLoadingHandler(targetElement, image);
13122    }
13123  }, function (error) {
13124    var imageId = stackData.imageIds[newImageIdIndex];
13125
13126    if (errorLoadingHandler) {
13127      errorLoadingHandler(targetElement, imageId, error);
13128    }
13129  });
13130});
13131
13132/***/ }),
13133
13134/***/ "./synchronization/updateImageSynchronizer.js":
13135/*!****************************************************!*\
13136  !*** ./synchronization/updateImageSynchronizer.js ***!
13137  \****************************************************/
13138/*! exports provided: default */
13139/***/ (function(module, __webpack_exports__, __webpack_require__) {
13140
13141"use strict";
13142__webpack_require__.r(__webpack_exports__);
13143/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js");
13144
13145/**
13146 * Redraw target image immediately any time handler is called from source element.
13147 * @export
13148 * @public
13149 * @method
13150 * @name updateImageSynchronizer
13151 *
13152 * @param {Object} synchronizer - The Synchronizer instance that attaches this
13153 * handler to an event
13154 * @param {HTMLElement} sourceElement - The source element
13155 * @param {HTMLElement} targetElement - The target element
13156 * @returns {void}
13157 */
13158
13159/* harmony default export */ __webpack_exports__["default"] = (function (synchronizer, sourceElement, targetElement) {
13160  // Ignore the case where the source and target are the same enabled element
13161  if (targetElement === sourceElement) {
13162    return;
13163  }
13164
13165  _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.updateImage(targetElement);
13166});
13167
13168/***/ }),
13169
13170/***/ "./synchronization/wwwcSynchronizer.js":
13171/*!*********************************************!*\
13172  !*** ./synchronization/wwwcSynchronizer.js ***!
13173  \*********************************************/
13174/*! exports provided: default */
13175/***/ (function(module, __webpack_exports__, __webpack_require__) {
13176
13177"use strict";
13178__webpack_require__.r(__webpack_exports__);
13179/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js");
13180
13181/**
13182 * Synchronize the target viewport ww/wc to match the source element.
13183 * @export
13184 * @public
13185 * @method
13186 * @name wwwcSynchronizer
13187 *
13188 * @param {Object} synchronizer - The Synchronizer instance that attaches this
13189 * handler to an event
13190 * @param {HTMLElement} sourceElement - The source element for the ww/wc values
13191 * @param {HTMLElement} targetElement - The target element
13192 * @returns {void}
13193 */
13194
13195/* harmony default export */ __webpack_exports__["default"] = (function (synchronizer, sourceElement, targetElement) {
13196  // Ignore the case where the source and target are the same enabled element
13197  if (targetElement === sourceElement) {
13198    return;
13199  }
13200
13201  var cornerstone = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone; // Get the source and target viewports
13202
13203  var sourceViewport = cornerstone.getViewport(sourceElement);
13204  var targetViewport = cornerstone.getViewport(targetElement); // Do nothing if the ww/wc already match
13205
13206  if (targetViewport.voi.windowWidth === sourceViewport.voi.windowWidth && targetViewport.voi.windowCenter === sourceViewport.voi.windowCenter && targetViewport.invert === sourceViewport.invert) {
13207    return;
13208  } // Www/wc are different, sync them
13209
13210
13211  targetViewport.voi.windowWidth = sourceViewport.voi.windowWidth;
13212  targetViewport.voi.windowCenter = sourceViewport.voi.windowCenter;
13213  targetViewport.invert = sourceViewport.invert;
13214  synchronizer.setViewport(targetElement, targetViewport);
13215});
13216
13217/***/ }),
13218
13219/***/ "./thirdParty/register.js":
13220/*!********************************!*\
13221  !*** ./thirdParty/register.js ***!
13222  \********************************/
13223/*! exports provided: default */
13224/***/ (function(module, __webpack_exports__, __webpack_require__) {
13225
13226"use strict";
13227__webpack_require__.r(__webpack_exports__);
13228/* harmony import */ var _babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/typeof */ "../node_modules/@babel/runtime/helpers/typeof.js");
13229/* harmony import */ var _babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0__);
13230/* harmony import */ var _registerModule_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./registerModule.js */ "./thirdParty/registerModule.js");
13231/* harmony import */ var _registerMixin_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./registerMixin.js */ "./thirdParty/registerMixin.js");
13232/* harmony import */ var _registerItem_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./registerItem.js */ "./thirdParty/registerItem.js");
13233/* harmony import */ var _util_logger_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../util/logger.js */ "./util/logger.js");
13234
13235
13236
13237
13238
13239var logger = Object(_util_logger_js__WEBPACK_IMPORTED_MODULE_4__["getLogger"])('thirdParty:register');
13240/**
13241 * Register an item or module to cornerstoneTools.
13242 * @export
13243 * @public
13244 * @method
13245 * @name register
13246 *
13247 * @param {string} type The type of the item/module.
13248 * @param {string} name The name of the item/module.
13249 * @param {Object|function} item The item/module itself.
13250 * @param {boolean} [overwrite=false] Whether an item/module should be
13251 *                                    overwritten, should it have the same name.
13252 * @returns {void}
13253 */
13254
13255/* harmony default export */ __webpack_exports__["default"] = (function (type, name, item) {
13256  var overwrite = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
13257
13258  if (!isValidInput(type, name, item)) {
13259    return;
13260  }
13261
13262  switch (type) {
13263    case 'module':
13264      Object(_registerModule_js__WEBPACK_IMPORTED_MODULE_1__["default"])(name, item, overwrite);
13265      break;
13266
13267    case 'mixin':
13268      Object(_registerMixin_js__WEBPACK_IMPORTED_MODULE_2__["default"])(name, item, overwrite);
13269      break;
13270
13271    default:
13272      Object(_registerItem_js__WEBPACK_IMPORTED_MODULE_3__["default"])(type, name, item, overwrite);
13273  }
13274});
13275/**
13276 * Returns true if the item is valid, this avoids
13277 * clogging up the library with invalid data.
13278 * @private
13279 * @method
13280 * @name isValidInput
13281 *
13282 * @param {string} type The type of the item/module.
13283 * @param {string} name The name of the item/module.
13284 * @param {Object|function} item The item/module itself.
13285 * @returns {boolean}    Whether the input is valid.
13286 */
13287
13288function isValidInput(type, name, item) {
13289  if (!type) {
13290    logger.warn('The type must be given in order to register.');
13291    return false;
13292  }
13293
13294  if (!name) {
13295    logger.warn("The %s must have a name in order to register.", type);
13296    return false;
13297  }
13298
13299  if (_babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0___default()(item) !== 'object' && typeof item !== 'function') {
13300    logger.warn("The %s is a %s, it should be an Object or a function.", item, _babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0___default()(item));
13301    return false;
13302  }
13303
13304  return true;
13305}
13306
13307/***/ }),
13308
13309/***/ "./thirdParty/registerItem.js":
13310/*!************************************!*\
13311  !*** ./thirdParty/registerItem.js ***!
13312  \************************************/
13313/*! exports provided: default */
13314/***/ (function(module, __webpack_exports__, __webpack_require__) {
13315
13316"use strict";
13317__webpack_require__.r(__webpack_exports__);
13318/* harmony import */ var _lib_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../lib.js */ "./lib.js");
13319/* harmony import */ var _util_logger_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../util/logger.js */ "./util/logger.js");
13320
13321
13322var logger = Object(_util_logger_js__WEBPACK_IMPORTED_MODULE_1__["getLogger"])('thirdParty:registerType');
13323/**
13324 * Register an item to cornerstoneTools.
13325 * @export
13326 * @private
13327 * @method
13328 * @name registerItem
13329 *
13330 * @param {string} type The type of the item.
13331 * @param {string} name The name of the item.
13332 * @param {Object|function} item The item itself.
13333 * @param {boolean} [overwrite=false] Whether an item should be overwritten,
13334 *                                    should it have the same name.
13335 * @returns {void}
13336 */
13337
13338/* harmony default export */ __webpack_exports__["default"] = (function (type, name, item) {
13339  var overwrite = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
13340  var itemKey = "".concat(type, "/").concat(name);
13341  var alreadyRegistered = isItemNameRegistered(itemKey);
13342
13343  if (alreadyRegistered && !overwrite) {
13344    logger.warn('%s is already registered', itemKey);
13345    return;
13346  }
13347
13348  if (alreadyRegistered) {
13349    logger.warn('Overwriting %s', itemKey);
13350  }
13351
13352  _lib_js__WEBPACK_IMPORTED_MODULE_0__["lib"][itemKey] = item;
13353});
13354
13355function isItemNameRegistered(itemKey) {
13356  return _lib_js__WEBPACK_IMPORTED_MODULE_0__["lib"][itemKey] !== undefined;
13357}
13358
13359/***/ }),
13360
13361/***/ "./thirdParty/registerMixin.js":
13362/*!*************************************!*\
13363  !*** ./thirdParty/registerMixin.js ***!
13364  \*************************************/
13365/*! exports provided: default */
13366/***/ (function(module, __webpack_exports__, __webpack_require__) {
13367
13368"use strict";
13369__webpack_require__.r(__webpack_exports__);
13370/* harmony import */ var _lib_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../lib.js */ "./lib.js");
13371/* harmony import */ var _mixins_index_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../mixins/index.js */ "./mixins/index.js");
13372/* harmony import */ var _util_logger_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../util/logger.js */ "./util/logger.js");
13373
13374
13375
13376var logger = Object(_util_logger_js__WEBPACK_IMPORTED_MODULE_2__["getLogger"])('thirdParty:registerMixin');
13377/**
13378 * Register an mixin to cornerstoneTools.
13379 * @export
13380 * @private
13381 * @method
13382 * @name registerMixin
13383 *
13384 * @param {string} name The name of the mixin.
13385 * @param {Object} mixin The mixin itself.
13386 * @param {boolean} [overwrite=false] Whether an mixin should be overwritten,
13387 *                                    should it have the same name.
13388 * @returns {void}
13389 */
13390
13391/* harmony default export */ __webpack_exports__["default"] = (function (name, mixin) {
13392  var overwrite = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
13393  var alreadyRegistered = isMixinRegistered(name);
13394
13395  if (alreadyRegistered && !overwrite) {
13396    logger.warn('mixins/%s is already registered', name);
13397    return;
13398  }
13399
13400  if (alreadyRegistered) {
13401    logger.warn('Overwriting mixins/%s', name);
13402  } // Register to the mixins object
13403
13404
13405  _mixins_index_js__WEBPACK_IMPORTED_MODULE_1__["default"][name] = mixin; // Reference the mixin from the library so it can be exported externally.
13406
13407  _lib_js__WEBPACK_IMPORTED_MODULE_0__["lib"]["mixins/".concat(name)] = _mixins_index_js__WEBPACK_IMPORTED_MODULE_1__["default"][name];
13408});
13409
13410function isMixinRegistered(name) {
13411  return _mixins_index_js__WEBPACK_IMPORTED_MODULE_1__["default"][name] !== undefined;
13412}
13413
13414/***/ }),
13415
13416/***/ "./thirdParty/registerModule.js":
13417/*!**************************************!*\
13418  !*** ./thirdParty/registerModule.js ***!
13419  \**************************************/
13420/*! exports provided: default */
13421/***/ (function(module, __webpack_exports__, __webpack_require__) {
13422
13423"use strict";
13424__webpack_require__.r(__webpack_exports__);
13425/* harmony import */ var _store_index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../store/index.js */ "./store/index.js");
13426/* harmony import */ var _util_logger_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../util/logger.js */ "./util/logger.js");
13427
13428
13429var logger = Object(_util_logger_js__WEBPACK_IMPORTED_MODULE_1__["getLogger"])('thirdParty:registerModule');
13430/**
13431 * Register a module.
13432 * @export
13433 * @private
13434 * @method
13435 * @name registerModule
13436 *
13437 * @param {string} name The name of the module.
13438 * @param {Object} newModule The module to register.
13439 * @param {boolean} [overwrite] Whether a module should be overwritten,
13440 *                              should it have the same name.
13441 * @returns {void}
13442 */
13443
13444/* harmony default export */ __webpack_exports__["default"] = (function (name, newModule) {
13445  var overwrite = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
13446  var alreadyRegistered = isModuleNameRegistered(name);
13447
13448  if (alreadyRegistered && !overwrite) {
13449    logger.warn('A module with the name %s is already registered', name);
13450    return;
13451  }
13452
13453  if (alreadyRegistered) {
13454    logger.warn('Overwriting module %s', name);
13455  }
13456
13457  _store_index_js__WEBPACK_IMPORTED_MODULE_0__["modules"][name] = newModule;
13458});
13459
13460function isModuleNameRegistered(name) {
13461  return _store_index_js__WEBPACK_IMPORTED_MODULE_0__["modules"][name] !== undefined;
13462}
13463
13464/***/ }),
13465
13466/***/ "./thirdParty/registerSome.js":
13467/*!************************************!*\
13468  !*** ./thirdParty/registerSome.js ***!
13469  \************************************/
13470/*! exports provided: default */
13471/***/ (function(module, __webpack_exports__, __webpack_require__) {
13472
13473"use strict";
13474__webpack_require__.r(__webpack_exports__);
13475/* harmony import */ var _register_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./register.js */ "./thirdParty/register.js");
13476
13477/**
13478 * Register an array of items and/or modules to cornerstoneTools.
13479 * @export
13480 * @public
13481 * @method
13482 * @name registerSome
13483 *
13484 * @param {Object[]} items An array of items/modules to register.
13485 * @param {boolean} [overwrite=false] Whether an item/module should be
13486 *                                    overwritten, should it have the same name.
13487 * @returns {void}
13488 */
13489
13490/* harmony default export */ __webpack_exports__["default"] = (function (items) {
13491  var overwrite = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
13492  items.forEach(function (_ref) {
13493    var type = _ref.type,
13494        name = _ref.name,
13495        item = _ref.item;
13496    Object(_register_js__WEBPACK_IMPORTED_MODULE_0__["default"])(type, name, item, overwrite);
13497  });
13498});
13499
13500/***/ }),
13501
13502/***/ "./toolOptions.js":
13503/*!************************!*\
13504  !*** ./toolOptions.js ***!
13505  \************************/
13506/*! exports provided: getToolOptions, setToolOptions, clearToolOptions, clearToolOptionsByToolType, clearToolOptionsByElement */
13507/***/ (function(module, __webpack_exports__, __webpack_require__) {
13508
13509"use strict";
13510__webpack_require__.r(__webpack_exports__);
13511/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getToolOptions", function() { return getToolOptions; });
13512/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setToolOptions", function() { return setToolOptions; });
13513/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "clearToolOptions", function() { return clearToolOptions; });
13514/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "clearToolOptionsByToolType", function() { return clearToolOptionsByToolType; });
13515/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "clearToolOptionsByElement", function() { return clearToolOptionsByElement; });
13516var elementToolOptions = {};
13517/**
13518 * Retrieve the options object associated with a particular toolType and element
13519 * @export
13520 * @public
13521 * @method
13522 * @name getToolOptions
13523 *
13524 * @param {string} toolType Tool type identifier of the target options object
13525 * @param {HTMLElement} element Element of the target options object
13526 *
13527 * @returns {Object} Target options object (empty if not yet set)
13528 */
13529
13530function getToolOptions(toolType, element) {
13531  if (!elementToolOptions[toolType]) {
13532    return {};
13533  }
13534
13535  var toolOptions = elementToolOptions[toolType];
13536  var optionsObject = toolOptions.find(function (toolOptionObject) {
13537    return toolOptionObject.element === element;
13538  });
13539
13540  if (!optionsObject) {
13541    return {};
13542  }
13543
13544  return optionsObject.options;
13545}
13546/**
13547 * Set the options object associated with a particular toolType and element.
13548 * @export
13549 * @public
13550 * @method
13551 * @name setToolOptions
13552 *
13553 * @param {string} toolType Tool type identifier of the target options object.
13554 * @param {HTMLElement} element Element of the target options object.
13555 * @param {Object} options Options object to store at target.
13556 * @returns {void}
13557 */
13558
13559
13560function setToolOptions(toolType, element, options) {
13561  if (!elementToolOptions[toolType]) {
13562    elementToolOptions[toolType] = [{
13563      element: element,
13564      options: options
13565    }];
13566    return;
13567  }
13568
13569  var toolOptions = elementToolOptions[toolType];
13570  var index = toolOptions.findIndex(function (toolOptionObject) {
13571    return toolOptionObject.element === element;
13572  });
13573
13574  if (index === -1) {
13575    elementToolOptions[toolType].push({
13576      element: element,
13577      options: options
13578    });
13579  } else {
13580    var elementOptions = elementToolOptions[toolType][index].options || {};
13581    elementToolOptions[toolType][index].options = Object.assign(elementOptions, options);
13582  }
13583}
13584/**
13585 * Clear the options object associated with a particular toolType and element.
13586 * @export
13587 * @public
13588 * @method
13589 * @name clearToolOptions
13590 *
13591 * @param {string} toolType Tool type identifier of the target options object.
13592 * @param {HTMLElement} element Element of the target options object.
13593 * @returns {void}
13594 */
13595
13596
13597function clearToolOptions(toolType, element) {
13598  var toolOptions = elementToolOptions[toolType];
13599
13600  if (toolOptions) {
13601    elementToolOptions[toolType] = toolOptions.filter(function (toolOptionObject) {
13602      return toolOptionObject.element !== element;
13603    });
13604  }
13605}
13606/**
13607 * Clear the options objects associated with a particular toolType.
13608 * @export
13609 * @public
13610 * @method
13611 * @name clearToolOptionsByToolType
13612 *
13613 * @param {string} toolType Tool type identifier of the target options objects.
13614 * @returns {void}
13615 */
13616
13617
13618function clearToolOptionsByToolType(toolType) {
13619  delete elementToolOptions[toolType];
13620}
13621/**
13622 * Clear the options objects associated with a particular element.
13623 * @export
13624 * @public
13625 * @method
13626 * @name clearToolOptionsByElement
13627 *
13628 * @param {HTMLElement} element Element of the target options objects.
13629 * @returns {void}
13630 */
13631
13632
13633function clearToolOptionsByElement(element) {
13634  for (var toolType in elementToolOptions) {
13635    elementToolOptions[toolType] = elementToolOptions[toolType].filter(function (toolOptionObject) {
13636      return toolOptionObject.element !== element;
13637    });
13638  }
13639}
13640
13641
13642
13643/***/ }),
13644
13645/***/ "./tools/CrosshairsTool.js":
13646/*!*********************************!*\
13647  !*** ./tools/CrosshairsTool.js ***!
13648  \*********************************/
13649/*! exports provided: default */
13650/***/ (function(module, __webpack_exports__, __webpack_require__) {
13651
13652"use strict";
13653__webpack_require__.r(__webpack_exports__);
13654/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return CrosshairsTool; });
13655/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js");
13656/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
13657/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js");
13658/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
13659/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js");
13660/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
13661/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js");
13662/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
13663/* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/assertThisInitialized */ "../node_modules/@babel/runtime/helpers/assertThisInitialized.js");
13664/* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4__);
13665/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js");
13666/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__);
13667/* harmony import */ var _base_BaseTool_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./base/BaseTool.js */ "./tools/base/BaseTool.js");
13668/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./../externalModules.js */ "./externalModules.js");
13669/* harmony import */ var _stateManagement_loadHandlerManager_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../stateManagement/loadHandlerManager.js */ "./stateManagement/loadHandlerManager.js");
13670/* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../stateManagement/toolState.js */ "./stateManagement/toolState.js");
13671/* harmony import */ var _util_pointProjector_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../util/pointProjector.js */ "./util/pointProjector.js");
13672/* harmony import */ var _util_convertToVector3_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../util/convertToVector3.js */ "./util/convertToVector3.js");
13673/* harmony import */ var _toolOptions_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../toolOptions.js */ "./toolOptions.js");
13674/* harmony import */ var _cursors_index_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./cursors/index.js */ "./tools/cursors/index.js");
13675
13676
13677
13678
13679
13680
13681
13682
13683
13684
13685
13686
13687
13688
13689/**
13690 * @public
13691 * @class CrosshairsTool
13692 * @memberof Tools
13693 *
13694 * @classdesc Tool for finding the slice in another element corresponding to the
13695 * image position in a synchronized image series.
13696 * @extends Tools.Base.BaseTool
13697 */
13698
13699var CrosshairsTool =
13700/*#__PURE__*/
13701function (_BaseTool) {
13702  _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default()(CrosshairsTool, _BaseTool);
13703
13704  function CrosshairsTool() {
13705    var _this;
13706
13707    var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
13708
13709    _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, CrosshairsTool);
13710
13711    var defaultProps = {
13712      name: 'Crosshairs',
13713      supportedInteractionTypes: ['Mouse', 'Touch'],
13714      svgCursor: _cursors_index_js__WEBPACK_IMPORTED_MODULE_13__["crosshairsCursor"]
13715    };
13716    _this = _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(CrosshairsTool).call(this, props, defaultProps));
13717    _this.mouseDownCallback = _this._chooseLocation.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this));
13718    _this.mouseDragCallback = _this._chooseLocation.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this));
13719    _this.touchDragCallback = _this._chooseLocation.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this));
13720    return _this;
13721  }
13722
13723  _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(CrosshairsTool, [{
13724    key: "_chooseLocation",
13725    value: function _chooseLocation(evt) {
13726      var eventData = evt.detail;
13727      var element = eventData.element; // Prevent CornerstoneToolsTouchStartActive from killing any press events
13728
13729      evt.stopImmediatePropagation(); // If we have no toolData for this element, return immediately as there is nothing to do
13730
13731      //var toolData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_9__["getToolState"])(element, this.name);
13732
13733      //if (!toolData) {
13734      //  return;
13735      //} // Get current element target information
13736
13737
13738      var sourceElement = element;
13739      var sourceEnabledElement = _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstone.getEnabledElement(sourceElement);
13740      var sourceImageId = sourceEnabledElement.image.imageId;
13741      var sourceImagePlane = _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstone.metaData.get('imagePlaneModule', sourceImageId);
13742
13743      if (!sourceImagePlane) {
13744        return;
13745      }
13745 // Get currentPoints from mouse cursor on selected element
13746
13747
13748      var sourceImagePoint = eventData.currentPoints.image; // Transfer this to a patientPoint given imagePlane metadata
13749
13750      var patientPoint = Object(_util_pointProjector_js__WEBPACK_IMPORTED_MODULE_10__["imagePointToPatientPoint"])(sourceImagePoint, sourceImagePlane); // Get the enabled elements associated with this synchronization context
13751
13752      var syncContext = /*toolData.data[0]*/this.synchronizationContext;
13753      var enabledElements = syncContext.getTargetElements(); // Iterate over each synchronized element
13754
13755      enabledElements.forEach(function (targetElement) {
13756        // Don't do anything if the target is the same as the source
13757        if (targetElement === sourceElement) {
13758          return;
13759        }
13760
13761        var minDistance = Number.MAX_VALUE;
13762        var newImageIdIndex = -1;
13763        var stackToolDataSource = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_9__["getToolState"])(targetElement, 'stack');
13764
13765        if (stackToolDataSource === undefined) {
13766          return;
13767        }
13768
13769        var stackData = stackToolDataSource.data[0]; // Find within the element's stack the closest image plane to selected location
13770
13771        stackData.imageIds.forEach(function (imageId, index) {
13772          var imagePlane = _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstone.metaData.get('imagePlaneModule', imageId); // Skip if the image plane is not ready
13773
13774          if (!imagePlane || !imagePlane.imagePositionPatient || !imagePlane.rowCosines || !imagePlane.columnCosines) {
13775            return;
13776          }
13777
13778          var imagePosition = Object(_util_convertToVector3_js__WEBPACK_IMPORTED_MODULE_11__["default"])(imagePlane.imagePositionPatient);
13779          var row = Object(_util_convertToVector3_js__WEBPACK_IMPORTED_MODULE_11__["default"])(imagePlane.rowCosines);
13780          var column = Object(_util_convertToVector3_js__WEBPACK_IMPORTED_MODULE_11__["default"])(imagePlane.columnCosines);
13781          var normal = column.clone().cross(row.clone());
13782          var distance = Math.abs(normal.clone().dot(imagePosition) - normal.clone().dot(patientPoint));
13783
13784          if (distance < minDistance) {
13785            minDistance = distance;
13786            newImageIdIndex = index;
13787          }
13788        });
13789
13790        if (newImageIdIndex === stackData.currentImageIdIndex) {
13791          return;
13792        } // Switch the loaded image to the required image
13793
13794
13795        if (newImageIdIndex !== -1 && stackData.imageIds[newImageIdIndex] !== undefined) {
13796          var startLoadingHandler = _stateManagement_loadHandlerManager_js__WEBPACK_IMPORTED_MODULE_8__["default"].getStartLoadHandler(targetElement);
13797          var endLoadingHandler = _stateManagement_loadHandlerManager_js__WEBPACK_IMPORTED_MODULE_8__["default"].getEndLoadHandler(targetElement);
13798          var errorLoadingHandler = _stateManagement_loadHandlerManager_js__WEBPACK_IMPORTED_MODULE_8__["default"].getErrorLoadingHandler(targetElement);
13799
13800          if (startLoadingHandler) {
13801            startLoadingHandler(targetElement);
13802          }
13803
13804          var loader;
13805
13806          if (stackData.preventCache === true) {
13807            loader = _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstone.loadImage(stackData.imageIds[newImageIdIndex]);
13808          } else {
13809            loader = _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstone.loadAndCacheImage(stackData.imageIds[newImageIdIndex]);
13810          }
13811
13812          loader.then(function (image) {
13813            var viewport = _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstone.getViewport(targetElement);
13814            stackData.currentImageIdIndex = newImageIdIndex;
13815            _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstone.displayImage(targetElement, image, viewport);
13816
13817            if (endLoadingHandler) {
13818              endLoadingHandler(targetElement, image);
13819            }
13820          }, function (error) {
13821            var imageId = stackData.imageIds[newImageIdIndex];
13822
13823            if (errorLoadingHandler) {
13824              errorLoadingHandler(targetElement, imageId, error);
13825            }
13826          });
13827        }
13828      });
13829    }
13830  }, {
13831    key: "activeCallback",
13832    value: function activeCallback(element, _ref) {
13833      var mouseButtonMask = _ref.mouseButtonMask,
13834          synchronizationContext = _ref.synchronizationContext;
13835      Object(_toolOptions_js__WEBPACK_IMPORTED_MODULE_12__["setToolOptions"])(this.name, element, {
13836        mouseButtonMask: mouseButtonMask
13837      }); // Clear any currently existing toolData
13838
13839      Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_9__["clearToolState"])(element, this.name);
13840      Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_9__["addToolState"])(element, this.name, {
13841        synchronizationContext: synchronizationContext
13842      });
13843      this.synchronizationContext = synchronizationContext;
13844    }
13845  }]);
13846
13847  return CrosshairsTool;
13848}(_base_BaseTool_js__WEBPACK_IMPORTED_MODULE_6__["default"]);
13849
13850
13851
13852/***/ }),
13853
13854/***/ "./tools/DoubleTapFitToWindowTool.js":
13855/*!*******************************************!*\
13856  !*** ./tools/DoubleTapFitToWindowTool.js ***!
13857  \*******************************************/
13858/*! exports provided: default */
13859/***/ (function(module, __webpack_exports__, __webpack_require__) {
13860
13861"use strict";
13862__webpack_require__.r(__webpack_exports__);
13863/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return DoubleTapFitToWindowTool; });
13864/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js");
13865/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
13866/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js");
13867/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
13868/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js");
13869/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
13870/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js");
13871/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
13872/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js");
13873/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__);
13874/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js");
13875/* harmony import */ var _base_BaseTool_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./base/BaseTool.js */ "./tools/base/BaseTool.js");
13876
13877
13878
13879
13880
13881
13882
13883/**
13884 * @public
13885 * @class DoubleTapFitToWindowTool
13886 * @memberof Tools
13887 *
13888 * @classdesc Tool which calls the external cornerstone.fitToWindow() function
13889 * on double tap.
13890 * @extends Tools.Base.BaseTool
13891 */
13892
13893var DoubleTapFitToWindowTool =
13894/*#__PURE__*/
13895function (_BaseTool) {
13896  _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(DoubleTapFitToWindowTool, _BaseTool);
13897
13898  function DoubleTapFitToWindowTool() {
13899    var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
13900
13901    _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, DoubleTapFitToWindowTool);
13902
13903    var defaultProps = {
13904      name: 'DoubleTapFitToWindow',
13905      supportedInteractionTypes: ['DoubleTap']
13906    };
13907    return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(DoubleTapFitToWindowTool).call(this, props, defaultProps));
13908  }
13909
13910  _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(DoubleTapFitToWindowTool, [{
13911    key: "doubleTapCallback",
13912    value: function doubleTapCallback(evt) {
13913      var eventData = evt.detail;
13914      _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.fitToWindow(eventData.element);
13915    }
13916  }]);
13917
13918  return DoubleTapFitToWindowTool;
13919}(_base_BaseTool_js__WEBPACK_IMPORTED_MODULE_6__["default"]);
13920
13921
13922
13923/***/ }),
13924
13925/***/ "./tools/DragProbeTool.js":
13926/*!********************************!*\
13927  !*** ./tools/DragProbeTool.js ***!
13928  \********************************/
13929/*! exports provided: default */
13930/***/ (function(module, __webpack_exports__, __webpack_require__) {
13931
13932"use strict";
13933__webpack_require__.r(__webpack_exports__);
13934/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return DragProbeTool; });
13935/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js");
13936/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
13937/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js");
13938/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
13939/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js");
13940/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
13941/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js");
13942/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
13943/* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/assertThisInitialized */ "../node_modules/@babel/runtime/helpers/assertThisInitialized.js");
13944/* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4__);
13945/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js");
13946/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__);
13947/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js");
13948/* harmony import */ var _base_BaseTool_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./base/BaseTool.js */ "./tools/base/BaseTool.js");
13949/* harmony import */ var _stateManagement_textStyle_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../stateManagement/textStyle.js */ "./stateManagement/textStyle.js");
13950/* harmony import */ var _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../stateManagement/toolColors.js */ "./stateManagement/toolColors.js");
13951/* harmony import */ var _util_getRGBPixels_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../util/getRGBPixels.js */ "./util/getRGBPixels.js");
13952/* harmony import */ var _util_calculateSUV_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../util/calculateSUV.js */ "./util/calculateSUV.js");
13953/* harmony import */ var _drawing_index_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../drawing/index.js */ "./drawing/index.js");
13954/* harmony import */ var _drawing_drawTextBox_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../drawing/drawTextBox.js */ "./drawing/drawTextBox.js");
13955/* harmony import */ var _cursors_index_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./cursors/index.js */ "./tools/cursors/index.js");
13956
13957
13958
13959
13960
13961
13962
13963
13964
13965
13966
13967
13968
13969
13970
13971/**
13972 * @public
13973 * @class DragProbeTool
13974 * @memberof Tools
13975 *
13976 * @classdesc Tool which provides a probe of the image data at the
13977 * input position on drag.
13978 * @extends Tools.Base.BaseTool
13979 */
13980
13981var DragProbeTool =
13982/*#__PURE__*/
13983function (_BaseTool) {
13984  _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default()(DragProbeTool, _BaseTool);
13985
13986  function DragProbeTool() {
13987    var _this;
13988
13989    var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
13990
13991    _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, DragProbeTool);
13992
13993    var defaultProps = {
13994      name: 'DragProbe',
13995      strategies: {
13996        default: defaultStrategy,
13997        minimal: minimalStrategy
13998      },
13999      defaultStrategy: 'default',
14000      supportedInteractionTypes: ['Mouse', 'Touch'],
14001      svgCursor: _cursors_index_js__WEBPACK_IMPORTED_MODULE_14__["probeCursor"]
14002    };
14003    _this = _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(DragProbeTool).call(this, props, defaultProps));
14004    _this.touchDragCallback = _this._movingEventCallback.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this));
14005    _this.touchEndCallback = _this._endMovingEventCallback.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this));
14006    _this.mouseDragCallback = _this._movingEventCallback.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this));
14007    _this.mouseUpCallback = _this._endMovingEventCallback.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this));
14008    _this.dragEventData = {};
14009    return _this;
14010  }
14011
14012  _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(DragProbeTool, [{
14013    key: "_movingEventCallback",
14014    value: function _movingEventCallback(evt) {
14015      var eventData = evt.detail;
14016      var element = eventData.element;
14017      this.dragEventData = eventData;
14018      _externalModules_js__WEBPACK_IMPORTED_MODULE_6__["default"].cornerstone.updateImage(element);
14019    }
14020  }, {
14021    key: "_endMovingEventCallback",
14022    value: function _endMovingEventCallback(evt) {
14023      var eventData = evt.detail;
14024      var element = eventData.element;
14025      this.dragEventData = {};
14026      _externalModules_js__WEBPACK_IMPORTED_MODULE_6__["default"].cornerstone.updateImage(element);
14027    }
14028  }, {
14029    key: "renderToolData",
14030    value: function renderToolData(evt) {
14031      if (!this.dragEventData.currentPoints) {
14032        return;
14033      }
14034
14035      if (evt && evt.detail && Boolean(Object.keys(this.dragEventData.currentPoints).length)) {
14036        evt.detail.currentPoints = this.dragEventData.currentPoints;
14037        this.applyActiveStrategy(evt);
14038      }
14039    }
14040  }]);
14041
14042  return DragProbeTool;
14043}(_base_BaseTool_js__WEBPACK_IMPORTED_MODULE_7__["default"]);
14044/**
14045 * Default strategy will pick the exactly point of mouse/touch interact and display the probe data.
14046 *
14047 * @param  {Object} evt Image rendered event
14048 * @param  {Object} config Tool configuration
14049 * @returns {void}
14050 */
14051
14052
14053
14054
14055var defaultStrategy = function defaultStrategy(evt, config) {
14056  var cornerstone = _externalModules_js__WEBPACK_IMPORTED_MODULE_6__["default"].cornerstone;
14057  var eventData = evt.detail;
14058  var element = eventData.element,
14059      image = eventData.image,
14060      currentPoints = eventData.currentPoints,
14061      canvasContext = eventData.canvasContext;
14062  var context = Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_12__["getNewContext"])(canvasContext.canvas);
14063  var color = _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_9__["default"].getActiveColor();
14064  var fontHeight = _stateManagement_textStyle_js__WEBPACK_IMPORTED_MODULE_8__["default"].getFontSize();
14065  var x = Math.round(currentPoints.image.x);
14066  var y = Math.round(currentPoints.image.y);
14067
14068  if (x < 0 || y < 0 || x >= image.columns || y >= image.rows) {
14069    return;
14070  }
14071
14072  Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_12__["draw"])(context, function (context) {
14073    Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_12__["setShadow"])(context, config);
14074    var text = "".concat(x, ", ").concat(y);
14075    var storedPixels;
14076    var str;
14077
14078    if (image.color) {
14079      storedPixels = Object(_util_getRGBPixels_js__WEBPACK_IMPORTED_MODULE_10__["default"])(element, x, y, 1, 1);
14080      str = "R: ".concat(storedPixels[0], " G: ").concat(storedPixels[1], " B: ").concat(storedPixels[2], " A: ").concat(storedPixels[3]);
14081    } else {
14082      storedPixels = cornerstone.getStoredPixels(element, x, y, 1, 1);
14083      var sp = storedPixels[0];
14084      var mo = sp * image.slope + image.intercept;
14085      var suv = Object(_util_calculateSUV_js__WEBPACK_IMPORTED_MODULE_11__["default"])(image, sp); // Draw text
14086
14087      str = "SP: ".concat(sp, " MO: ").concat(parseFloat(mo.toFixed(3)));
14088
14089      if (suv) {
14090        str += " SUV: ".concat(parseFloat(suv.toFixed(3)));
14091      }
14092    } // Draw text 5px away from cursor
14093
14094
14095    var textCoords = {
14096      x: currentPoints.canvas.x + 5,
14097      y: currentPoints.canvas.y - 5
14098    };
14099    Object(_drawing_drawTextBox_js__WEBPACK_IMPORTED_MODULE_13__["default"])(context, str, textCoords.x, textCoords.y + fontHeight + 5, color);
14100    Object(_drawing_drawTextBox_js__WEBPACK_IMPORTED_MODULE_13__["default"])(context, text, textCoords.x, textCoords.y, color);
14101  });
14102};
14103/**
14104 * Minimal strategy will position a circle and use the center of the circle to calculate and display probe data.
14105 *
14106 * @param  {Object} evt Image rendered event
14107 * @param  {Object} config Tool configuration
14108 * @returns {void}
14109 */
14110
14111
14112var minimalStrategy = function minimalStrategy(evt, config) {
14113  var cornerstone = _externalModules_js__WEBPACK_IMPORTED_MODULE_6__["default"].cornerstone;
14114  var eventData = evt.detail;
14115  var element = eventData.element,
14116      image = eventData.image,
14117      currentPoints = eventData.currentPoints,
14118      canvasContext = eventData.canvasContext,
14119      isTouchEvent = eventData.isTouchEvent;
14120  var context = Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_12__["getNewContext"])(canvasContext.canvas);
14121  var color = _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_9__["default"].getActiveColor();
14122  var pageCoordY = currentPoints.page.y - _stateManagement_textStyle_js__WEBPACK_IMPORTED_MODULE_8__["default"].getFontSize() / 2;
14123
14124  if (isTouchEvent) {
14125    pageCoordY = currentPoints.page.y - _stateManagement_textStyle_js__WEBPACK_IMPORTED_MODULE_8__["default"].getFontSize() * 4;
14126  }
14127
14128  var toolCoords = cornerstone.pageToPixel(element, currentPoints.page.x, pageCoordY);
14129
14130  if (toolCoords.x < 0 || toolCoords.y < 0 || toolCoords.x >= image.columns || toolCoords.y >= image.rows) {
14131    return;
14132  }
14133
14134  Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_12__["draw"])(context, function (context) {
14135    Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_12__["setShadow"])(context, config);
14136    var seriesModule = cornerstone.metaData.get('generalSeriesModule', image.imageId);
14137    var modality = seriesModule && seriesModule.modality;
14138    var storedPixels;
14139    var text = '';
14140
14141    if (image.color) {
14142      storedPixels = Object(_util_getRGBPixels_js__WEBPACK_IMPORTED_MODULE_10__["default"])(element, toolCoords.x, toolCoords.y, 1, 1);
14143      text = "R: ".concat(storedPixels[0], " G: ").concat(storedPixels[1], " B: ").concat(storedPixels[2]);
14144    } else {
14145      storedPixels = cornerstone.getStoredPixels(element, toolCoords.x, toolCoords.y, 1, 1);
14146      var sp = storedPixels[0];
14147      var mo = sp * image.slope + image.intercept;
14148      var modalityPixelValueText = parseFloat(mo.toFixed(2));
14149
14150      if (modality === 'CT') {
14151        text += "HU: ".concat(modalityPixelValueText);
14152      } else if (modality === 'PT') {
14153        text += modalityPixelValueText;
14154        var suv = Object(_util_calculateSUV_js__WEBPACK_IMPORTED_MODULE_11__["default"])(image, sp);
14155
14156        if (suv) {
14157          text += " SUV: ".concat(parseFloat(suv.toFixed(2)));
14158        }
14159      } else {
14160        text += modalityPixelValueText;
14161      }
14162    } // Prepare text
14163
14164
14165    var textCoords = cornerstone.pixelToCanvas(element, toolCoords); // Translate the x/y away from the cursor
14166
14167    var translation = {
14168      x: 12,
14169      y: -(_stateManagement_textStyle_js__WEBPACK_IMPORTED_MODULE_8__["default"].getFontSize() + 10) / 2
14170    };
14171    var handleRadius = 6;
14172    var padding = 5;
14173    var width = Object(_drawing_drawTextBox_js__WEBPACK_IMPORTED_MODULE_13__["textBoxWidth"])(context, text, padding);
14174
14175    if (isTouchEvent) {
14176      translation = {
14177        x: -width / 2,
14178        y: -_stateManagement_textStyle_js__WEBPACK_IMPORTED_MODULE_8__["default"].getFontSize() - 10 - 2 * handleRadius
14179      };
14180    }
14181
14182    Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_12__["drawCircle"])(context, element, textCoords, handleRadius, {
14183      color: color
14184    }, 'canvas');
14185    Object(_drawing_drawTextBox_js__WEBPACK_IMPORTED_MODULE_13__["default"])(context, text, textCoords.x + translation.x, textCoords.y + translation.y, color);
14186  });
14187};
14188
14189/***/ }),
14190
14191/***/ "./tools/EraserTool.js":
14192/*!*****************************!*\
14193  !*** ./tools/EraserTool.js ***!
14194  \*****************************/
14195/*! exports provided: default */
14196/***/ (function(module, __webpack_exports__, __webpack_require__) {
14197
14198"use strict";
14199__webpack_require__.r(__webpack_exports__);
14200/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return EraserTool; });
14201/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js");
14202/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
14203/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js");
14204/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
14205/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js");
14206/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
14207/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js");
14208/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
14209/* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/assertThisInitialized */ "../node_modules/@babel/runtime/helpers/assertThisInitialized.js");
14210/* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4__);
14211/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js");
14212/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__);
14213/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js");
14214/* harmony import */ var _base_BaseTool_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./base/BaseTool.js */ "./tools/base/BaseTool.js");
14215/* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../stateManagement/toolState.js */ "./stateManagement/toolState.js");
14216/* harmony import */ var _store_index_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../store/index.js */ "./store/index.js");
14217/* harmony import */ var _cursors_index_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./cursors/index.js */ "./tools/cursors/index.js");
14218
14219
14220
14221
14222
14223
14224
14225
14226
14227
14228
14229/**
14230 * @public
14231 * @class EraserTool
14232 * @memberof Tools
14233 *
14234 * @classdesc Tool for deleting the data of other Annotation Tools.
14235 * @extends Tools.Base.BaseTool
14236 */
14237
14238var EraserTool =
14239/*#__PURE__*/
14240function (_BaseTool) {
14241  _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default()(EraserTool, _BaseTool);
14242
14243  function EraserTool() {
14244    var _this;
14245
14246    var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
14247
14248    _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, EraserTool);
14249
14250    var defaultProps = {
14251      name: 'Eraser',
14252      supportedInteractionTypes: ['Mouse', 'Touch'],
14253      svgCursor: _cursors_index_js__WEBPACK_IMPORTED_MODULE_10__["eraserCursor"]
14254    };
14255    _this = _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(EraserTool).call(this, props, defaultProps));
14256    _this.preMouseDownCallback = _this._deleteAllNearbyTools.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this));
14257    _this.preTouchStartCallback = _this._deleteAllNearbyTools.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this));
14258    return _this;
14259  }
14260
14261  _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(EraserTool, [{
14262    key: "_deleteAllNearbyTools",
14263    value: function _deleteAllNearbyTools(evt) {
14264      var coords = evt.detail.currentPoints.canvas;
14265      var element = evt.detail.element;
14266      _store_index_js__WEBPACK_IMPORTED_MODULE_9__["state"].tools.forEac
14266h(function (tool) {
14267        var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_8__["getToolState"])(element, tool.name);
14268
14269        if (toolState) {
14270          // Modifying in a foreach? Probably not ideal
14271          toolState.data.forEach(function (data) {
14272            if (typeof tool.pointNearTool === 'function' && tool.pointNearTool(element, data, coords)) {
14273              Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_8__["removeToolState"])(element, tool.name, data);
14274              _externalModules_js__WEBPACK_IMPORTED_MODULE_6__["default"].cornerstone.updateImage(element);
14275            }
14276          });
14277        }
14278      });
14279      var consumeEvent = true;
14280      return consumeEvent;
14281    }
14282  }]);
14283
14284  return EraserTool;
14285}(_base_BaseTool_js__WEBPACK_IMPORTED_MODULE_7__["default"]);
14286
14287
14288
14289/***/ }),
14290
14291/***/ "./tools/FreehandSculpterMouseTool.js":
14292/*!********************************************!*\
14293  !*** ./tools/FreehandSculpterMouseTool.js ***!
14294  \********************************************/
14295/*! exports provided: default */
14296/***/ (function(module, __webpack_exports__, __webpack_require__) {
14297
14298"use strict";
14299__webpack_require__.r(__webpack_exports__);
14300/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return FreehandSculpterMouseTool; });
14301/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js");
14302/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
14303/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js");
14304/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
14305/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js");
14306/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
14307/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js");
14308/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
14309/* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/assertThisInitialized */ "../node_modules/@babel/runtime/helpers/assertThisInitialized.js");
14310/* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4__);
14311/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js");
14312/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__);
14313/* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../events.js */ "./events.js");
14314/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js");
14315/* harmony import */ var _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../stateManagement/toolColors.js */ "./stateManagement/toolColors.js");
14316/* harmony import */ var _drawing_drawHandles_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../drawing/drawHandles.js */ "./drawing/drawHandles.js");
14317/* harmony import */ var _store_index_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../store/index.js */ "./store/index.js");
14318/* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../stateManagement/toolState.js */ "./stateManagement/toolState.js");
14319/* harmony import */ var _util_clip_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../util/clip.js */ "./util/clip.js");
14320/* harmony import */ var _store_getToolForElement_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../store/getToolForElement.js */ "./store/getToolForElement.js");
14321/* harmony import */ var _base_BaseTool_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./base/BaseTool.js */ "./tools/base/BaseTool.js");
14322/* harmony import */ var _store_setToolCursor_js__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../store/setToolCursor.js */ "./store/setToolCursor.js");
14323/* harmony import */ var _cursors_index_js__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./cursors/index.js */ "./tools/cursors/index.js");
14324/* harmony import */ var _util_freehand_index_js__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../util/freehand/index.js */ "./util/freehand/index.js");
14325
14326
14327
14328
14329
14330
14331
14332
14333
14334
14335
14336
14337
14338
14339
14340
14341
14342
14343var FreehandHandleData = _util_freehand_index_js__WEBPACK_IMPORTED_MODULE_17__["default"].FreehandHandleData;
14344/**
14345 * @public
14346 * @class FreehandSculpterMouseTool
14347 * @memberof Tools
14348 *
14349 * @classdesc Tool for easily sculpting annotations drawn with
14350 * the FreehandMouseTool.
14351 * @extends Tools.Base.BaseTool
14352 */
14353
14354var FreehandSculpterMouseTool =
14355/*#__PURE__*/
14356function (_BaseTool) {
14357  _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default()(FreehandSculpterMouseTool, _BaseTool);
14358
14359  function FreehandSculpterMouseTool() {
14360    var _this;
14361
14362    var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
14363
14364    _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, FreehandSculpterMouseTool);
14365
14366    var defaultProps = {
14367      name: 'FreehandSculpterMouse',
14368      referencedToolName: 'FreehandMouse',
14369      supportedInteractionTypes: ['Mouse', 'Touch', 'DoubleTap'],
14370      mixins: ['activeOrDisabledBinaryTool'],
14371      configuration: getDefaultFreehandSculpterMouseToolConfiguration(),
14372      svgCursor: _cursors_index_js__WEBPACK_IMPORTED_MODULE_16__["freehandSculpterMouseCursor"]
14373    };
14374    _this = _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(FreehandSculpterMouseTool).call(this, props, defaultProps));
14375    _this.updateOnMouseMove = true;
14376    _this.isMultiPartTool = true;
14377    _this.referencedToolName = defaultProps.referencedToolName;
14378    _this._active = false; // Create bound functions for private event loop.
14379
14380    _this.activeMouseUpCallback = _this.activeMouseUpCallback.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this));
14381    _this.activeTouchEndCallback = _this.activeTouchEndCallback.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this));
14382    _this.activeMouseDragCallback = _this.activeMouseDragCallback.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this));
14383    return _this;
14384  }
14385
14386  _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(FreehandSculpterMouseTool, [{
14387    key: "renderToolData",
14388    value: function renderToolData(evt) {
14389      var eventData = evt.detail;
14390
14391      if (this.configuration.currentTool === null) {
14392        return false;
14393      }
14394
14395      var element = eventData.element;
14396      var config = this.configuration;
14397      var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_11__["getToolState"])(element, this.referencedToolName);
14398      var data = toolState.data[config.currentTool];
14399
14400      if (!data) {
14401        return false;
14402      }
14403
14404      if (this._active) {
14405        var context = eventData.canvasContext.canvas.getContext('2d');
14406        var options = {
14407          color: this.configuration.dragColor,
14408          fill: null,
14409          handleRadius: this._toolSizeCanvas
14410        };
14411        Object(_drawing_drawHandles_js__WEBPACK_IMPORTED_MODULE_9__["default"])(context, eventData, this.configuration.mouseLocation.handles, options);
14412      } else if (this.configuration.showCursorOnHover && !this._recentTouchEnd) {
14413        this._renderHoverCursor(evt);
14414      }
14415    }
14416  }, {
14417    key: "doubleClickCallback",
14418    value: function doubleClickCallback(evt) {
14419      var eventData = evt.detail;
14420
14421      this._selectFreehandTool(eventData);
14422
14423      _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstone.updateImage(eventData.element);
14424    }
14425  }, {
14426    key: "doubleTapCallback",
14427    value: function doubleTapCallback(evt) {
14428      var eventData = evt.detail;
14429
14430      this._selectFreehandTool(eventData);
14431
14432      _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstone.updateImage(eventData.element);
14433    }
14434  }, {
14435    key: "preTouchStartCallback",
14436    value: function preTouchStartCallback(evt) {
14437      this._initialiseSculpting(evt);
14438
14439      return true;
14440    }
14441    /**
14442     * Event handler for MOUSE_DOWN.
14443     *
14444     * @param {Object} evt - The event.
14445     * @returns {boolean}
14446     */
14447
14448  }, {
14449    key: "preMouseDownCallback",
14450    value: function preMouseDownCallback(evt) {
14451      if (!this.options.mouseButtonMask.includes(evt.detail.buttons)) {
14452        return;
14453      }
14454
14455      this._initialiseSculpting(evt);
14456
14457      return true;
14458    }
14459    /**
14460     * Event handler for MOUSE_DRAG during the active loop.
14461     *
14462     * @event
14463     * @param {Object} evt - The event.
14464     * @returns {void}
14465     */
14466
14467  }, {
14468    key: "activeMouseDragCallback",
14469    value: function activeMouseDragCallback(evt) {
14470      var config = this.configuration;
14471
14472      if (!this._active) {
14473        return;
14474      }
14475
14476      var eventData = evt.detail;
14477      var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_11__["getToolState"])(eventData.element, this.referencedToolName);
14478
14479      if (!toolState) {
14480        return;
14481      }
14482
14483      var points = toolState.data[config.currentTool].handles.points; // Set the mouseLocation handle
14484
14485      this._getMouseLocation(eventData);
14486
14487      this._sculpt(eventData, points); // Update the image
14488
14489
14490      _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstone.updateImage(eventData.element);
14491    }
14492    /**
14493     * Event handler for MOUSE_UP during the active loop.
14494     *
14495     * @param {Object} evt - The event.
14496     * @returns {void}
14497     */
14498
14499  }, {
14500    key: "activeMouseUpCallback",
14501    value: function activeMouseUpCallback(evt) {
14502      this._activeEnd(evt);
14503    }
14504    /**
14505     * Event handler for TOUCH_END during the active loop.
14506     *
14507     * @param {Object} evt - The event.
14508     * @returns {void}
14509     */
14510
14511  }, {
14512    key: "activeTouchEndCallback",
14513    value: function activeTouchEndCallback(evt) {
14514      this._activeEnd(evt);
14515
14516      this._deselectAllTools(evt);
14517
14518      this._recentTouchEnd = true;
14519    }
14520  }, {
14521    key: "_activeEnd",
14522    value: function _activeEnd(evt) {
14523      var eventData = evt.detail;
14524      var element = eventData.element;
14525      var config = this.configuration;
14526      this._active = false;
14527      _store_index_js__WEBPACK_IMPORTED_MODULE_10__["state"].isMultiPartToolActive = false;
14528
14529      this._getMouseLocation(eventData);
14530
14531      this._invalidateToolData(eventData);
14532
14533      config.mouseUpRender = true;
14534
14535      this._deactivateSculpt(element); // Update the image
14536
14537
14538      _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstone.updateImage(eventData.element);
14539      preventPropagation(evt);
14540    }
14541    /**
14542     * Renders the cursor
14543     *
14544     * @private
14545     * @param  {type} evt description
14546     * @returns {void}
14547     */
14548
14549  }, {
14550    key: "_renderHoverCursor",
14551    value: function _renderHoverCursor(evt) {
14552      var eventData = evt.detail;
14553      var element = eventData.element;
14554      var context = eventData.canvasContext.canvas.getContext('2d');
14555      var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_11__["getToolState"])(element, this.referencedToolName);
14556      var data = toolState.data[this.configuration.currentTool];
14557      this._recentTouchEnd = false;
14558      var coords;
14559
14560      if (this.configuration.mouseUpRender) {
14561        coords = this.configuration.mouseLocation.handles.start;
14562        this.configuration.mouseUpRender = false;
14563      } else {
14564        coords = _store_index_js__WEBPACK_IMPORTED_MODULE_10__["state"].mousePositionImage;
14565      }
14566
14567      var freehandMouseTool = Object(_store_getToolForElement_js__WEBPACK_IMPORTED_MODULE_13__["default"])(element, this.referencedToolName);
14568      var radiusCanvas = freehandMouseTool.distanceFromPointCanvas(element, data, coords);
14569      this.configuration.mouseLocation.handles.start.x = coords.x;
14570      this.configuration.mouseLocation.handles.start.y = coords.y;
14571
14572      if (this.configuration.limitRadiusOutsideRegion) {
14573        var unlimitedRadius = radiusCanvas;
14574        radiusCanvas = this._limitCursorRadiusCanvas(eventData, radiusCanvas); // Fade if distant
14575
14576        if (unlimitedRadius > this.configuration.hoverCursorFadeDistance * radiusCanvas) {
14577          context.globalAlpha = this.configuration.hoverCursorFadeAlpha;
14578        }
14579      }
14580
14581      var options = {
14582        fill: null,
14583        color: this.configuration.hoverColor,
14584        handleRadius: radiusCanvas
14585      };
14586      Object(_drawing_drawHandles_js__WEBPACK_IMPORTED_MODULE_9__["default"])(context, eventData, this.configuration.mouseLocation.handles, options);
14587
14588      if (this.configuration.limitRadiusOutsideRegion) {
14589        context.globalAlpha = 1.0; // Reset drawing alpha for other draw calls.
14590      }
14591    }
14592    /**
14593     * Event handler for NEW_IMAGE event.
14594     *
14595     * @public
14596     * @param {Object} evt - The event.
14597     * @returns {void}
14598     */
14599
14600  }, {
14601    key: "newImageCallback",
14602    value: function newImageCallback(evt) {
14603      this._deselectAllTools(evt);
14604    }
14605    /**
14606     * Event handler for switching mode to enabled.
14607     *
14608     * @public
14609     * @param {Object} evt - The event.
14610     * @returns {void}
14611     */
14612
14613  }, {
14614    key: "enabledCallback",
14615    value: function enabledCallback(evt) {
14616      this._deselectAllTools(evt);
14617    }
14618    /**
14619     * Event handler for switching mode to passive.
14620     *
14621     * @public
14622     * @param {Object} evt - The event.
14623     * @returns {void}
14624     */
14625
14626  }, {
14627    key: "passiveCallback",
14628    value: function passiveCallback(evt) {
14629      this._deselectAllTools(evt);
14630    }
14631    /**
14632     * Event handler for switching mode to disabled.
14633     *
14634     * @public
14635     * @param {Object} evt - The event.
14636     * @returns {void}
14637     */
14638
14639  }, {
14640    key: "disabledCallback",
14641    value: function disabledCallback(evt) {
14642      this._deselectAllTools(evt);
14643    }
14644    /**
14645     * Select the freehand tool to be edited.
14646     *
14647     * @private
14648     * @param {Object} eventData - Data object associated with the event.
14649     * @returns {void}
14650     */
14651
14652  }, {
14653    key: "_selectFreehandTool",
14654    value: function _selectFreehandTool(eventData) {
14655      var config = this.configuration;
14656      var element = eventData.element;
14657
14658      var closestToolIndex = this._getClosestFreehandToolOnElement(element, eventData);
14659
14660      if (closestToolIndex === undefined) {
14661        return;
14662      }
14663
14664      config.currentTool = closestToolIndex;
14665      Object(_store_setToolCursor_js__WEBPACK_IMPORTED_MODULE_15__["hideToolCursor"])(element);
14666    }
14667    /**
14668     * Activate the selected freehand tool and deactivate others.
14669     *
14670     * @private
14671     * @param {Object} element - The parent element of the freehand tool.
14672     * @param {Number} toolIndex - The ID of the freehand tool.
14673     * @returns {void}
14674     */
14675
14676  }, {
14677    key: "_activateFreehandTool",
14678    value: function _activateFreehandTool(element, toolIndex) {
14679      var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_11__["getToolState"])(element, this.referencedToolName);
14680      var data = toolState.data;
14681      var config = this.configuration;
14682      config.currentTool = toolIndex;
14683
14684      for (var i = 0; i < data.length; i++) {
14685        if (i === toolIndex) {
14686          data[i].active = true;
14687        } else {
14688          data[i].active = false;
14689        }
14690      }
14691    }
14692    /**
14693     * Choose the tool radius from the mouse position relative to the active freehand
14694     * tool, and begin sculpting.
14695     *
14696     * @private
14697     * @param {Object} evt - The event.
14698     * @returns {void}
14699     */
14700
14701  }, {
14702    key: "_initialiseSculpting",
14703    value: function _initialiseSculpting(evt) {
14704      var eventData = evt.detail;
14705      var config = this.configuration;
14706      var element = eventData.element;
14707
14708      if (config.currentTool === null) {
14709        this._selectFreehandTool(eventData);
14710
14711        if (config.currentTool === null) {
14712          return;
14713        }
14714      }
14715
14716      this._active = true; // Interupt event dispatcher
14717
14718      _store_index_js__WEBPACK_IMPORTED_MODULE_10__["state"].isMultiPartToolActive = true;
14719
14720      this._configureToolSize(eventData);
14721
14722      this._getMouseLocation(eventData);
14723
14724      this._activateFreehandTool(element, config.currentTool);
14725
14726      this._activateSculpt(element);
14727
14728      _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstone.updateImage(eventData.element);
14729    }
14730    /**
14731     * Sculpts the freehand ROI with the circular freehandSculpter tool, moving,
14732     * adding and removing handles as necessary.
14733     *
14734     * @private
14735     * @param {Object} eventData - Data object associated with the event.
14736     * @param {Object} points - Array of points.
14737     * @returns {void}
14738     */
14739
14740  }, {
14741    key: "_sculpt",
14742    value: function _sculpt(eventData, points) {
14743      var config = this.configuration;
14744      this._sculptData = {
14745        element: eventData.element,
14746        image: eventData.image,
14747        mousePoint: eventData.currentPoints.image,
14748        points: points,
14749        toolSize: this._toolSizeImage,
14750        minSpacing: config.minSpacing,
14751        maxSpacing: Math.max(this._toolSizeImage, config.minSpacing * 2)
14752      }; // Push existing handles radially away from tool.
14753
14754      var pushedHandles = this._pushHandles(); // Insert new handles in sparsely populated areas of the
14755      // Pushed part of the contour.
14756
14757
14758      if (pushedHandles.first !== undefined) {
14759        this._insertNewHandles(pushedHandles); // If any handles have been pushed very close together or even overlap,
14760        // Combine these into a single handle.
14761
14762
14763        this._consolidateHandles();
14764      }
14765    }
14766    /**
14767     * _pushHandles -Pushes the points radially away from the mouse if they are
14768     * contained within the circle defined by the freehandSculpter's toolSize and
14769     * the mouse position.
14770     *
14771     * @returns {Object}  The first and last pushedHandles.
14772     */
14773
14774  }, {
14775    key: "_pushHandles",
14776    value: function _pushHandles() {
14777      var _this$_sculptData = this._sculptData,
14778          points = _this$_sculptData.points,
14779          mousePoint = _this$_sculptData.mousePoint,
14780          toolSize = _this$_sculptData.toolSize;
14781      var pushedHandles = {};
14782
14783      for (var i = 0; i < points.length; i++) {
14784        var distanceToHandle = _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstoneMath.point.distance(points[i], mousePoint);
14785
14786        if (distanceToHandle > toolSize) {
14787          continue;
14788        } // Push point if inside circle, to edge of circle.
14789
14790
14791        this._pushOneHandle(i, distanceToHandle);
14792
14793        if (pushedHandles.first === undefined) {
14794          pushedHandles.first = i;
14795          pushedHandles.last = i;
14796        } else {
14797          pushedHandles.last = i;
14798        }
14799      }
14800
14801      return pushedHandles;
14802    }
14803    /**
14804     * Pushes one handle.
14805     *
14806     * @private
14807     * @param {number} i - The index of the handle to push.
14808     * @param {number}
14808 distanceToHandle - The distance between the mouse cursor and the handle.
14809     * @returns {void}
14810     */
14811
14812  }, {
14813    key: "_pushOneHandle",
14814    value: function _pushOneHandle(i, distanceToHandle) {
14815      var _this$_sculptData2 = this._sculptData,
14816          points = _this$_sculptData2.points,
14817          mousePoint = _this$_sculptData2.mousePoint,
14818          toolSize = _this$_sculptData2.toolSize,
14819          image = _this$_sculptData2.image;
14820      var handle = points[i];
14821      var directionUnitVector = {
14822        x: (handle.x - mousePoint.x) / distanceToHandle,
14823        y: (handle.y - mousePoint.y) / distanceToHandle
14824      };
14825      var position = {
14826        x: mousePoint.x + toolSize * directionUnitVector.x,
14827        y: mousePoint.y + toolSize * directionUnitVector.y
14828      };
14829      Object(_util_clip_js__WEBPACK_IMPORTED_MODULE_12__["clipToBox"])(position, image);
14830      handle.x = position.x;
14831      handle.y = position.y; // Push lines
14832
14833      var lastHandleIndex = this.constructor._getPreviousHandleIndex(i, points.length);
14834
14835      points[lastHandleIndex].lines.pop();
14836      points[lastHandleIndex].lines.push(handle);
14837    }
14838    /**
14839     * Inserts additional handles in sparsely sampled regions of the contour. The
14840     * new handles are placed on the circle defined by the the freehandSculpter's
14841     * toolSize and the mouse position.
14842     * @private
14843     * @param {Array} pushedHandles
14844     * @returns {void}
14845     */
14846
14847  }, {
14848    key: "_insertNewHandles",
14849    value: function _insertNewHandles(pushedHandles) {
14850      var indiciesToInsertAfter = this._findNewHandleIndicies(pushedHandles);
14851
14852      var newIndexModifier = 0;
14853
14854      for (var i = 0; i < indiciesToInsertAfter.length; i++) {
14855        var insertIndex = indiciesToInsertAfter[i] + 1 + newIndexModifier;
14856
14857        this._insertHandleRadially(insertIndex);
14858
14859        newIndexModifier++;
14860      }
14861    }
14862    /**
14863     * Returns an array of indicies that describe where new handles should be
14864     * inserted (where the distance between subsequent handles is >
14865     * config.maxSpacing).
14866     *
14867     * @private
14868     * @param {Object} pushedHandles - The first and last handles that were pushed.
14869     * @returns {Object} An array of indicies that describe where new handles should be inserted.
14870     */
14871
14872  }, {
14873    key: "_findNewHandleIndicies",
14874    value: function _findNewHandleIndicies(pushedHandles) {
14875      var _this$_sculptData3 = this._sculptData,
14876          points = _this$_sculptData3.points,
14877          maxSpacing = _this$_sculptData3.maxSpacing;
14878      var indiciesToInsertAfter = [];
14879
14880      for (var i = pushedHandles.first; i <= pushedHandles.last; i++) {
14881        this._checkSpacing(i, points, indiciesToInsertAfter, maxSpacing);
14882      }
14883
14884      var pointAfterLast = this.constructor._getNextHandleIndex(pushedHandles.last, points.length); // Check points before and after those pushed.
14885
14886
14887      if (pointAfterLast !== pushedHandles.first) {
14888        this._checkSpacing(pointAfterLast, points, indiciesToInsertAfter, maxSpacing);
14889
14890        var pointBeforeFirst = this.constructor._getPreviousHandleIndex(pushedHandles.first, points.length);
14891
14892        if (pointBeforeFirst !== pointAfterLast) {
14893          this._checkSpacing(pointBeforeFirst, points, indiciesToInsertAfter, maxSpacing);
14894        }
14895      }
14896
14897      return indiciesToInsertAfter;
14898    }
14899    /**
14900     * _checkSpacing - description
14901     *@modifies indiciesToInsertAfter
14902     *
14903     * @param {number} i - The index to check.
14904     * @param {Object} points - The points.
14905     * @param {Array} indiciesToInsertAfter - The working list of indicies to insert new points after.
14906     * @param {number} maxSpacing
14907     * @returns {void}
14908     */
14909
14910  }, {
14911    key: "_checkSpacing",
14912    value: function _checkSpacing(i, points, indiciesToInsertAfter, maxSpacing) {
14913      var nextHandleIndex = this.constructor._getNextHandleIndex(i, points.length);
14914
14915      var distanceToNextHandle = _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstoneMath.point.distance(points[i], points[nextHandleIndex]);
14916
14917      if (distanceToNextHandle > maxSpacing) {
14918        indiciesToInsertAfter.push(i);
14919      }
14920    }
14921    /**
14922     * Inserts a handle on the surface of the circle defined by toolSize and the
14923     * mousePoint.
14924     *
14925     * @private
14926     * @param {number} insertIndex - The index to insert the new handle.
14927     * @returns {void}
14928     */
14929
14930  }, {
14931    key: "_insertHandleRadially",
14932    value: function _insertHandleRadially(insertIndex) {
14933      var points = this._sculptData.points;
14934      var previousIndex = insertIndex - 1;
14935
14936      var nextIndex = this.constructor._getNextHandleIndexBeforeInsert(insertIndex, points.length);
14937
14938      var insertPosition = this._getInsertPosition(insertIndex, previousIndex, nextIndex);
14939
14940      var handleData = new FreehandHandleData(insertPosition);
14941      points.splice(insertIndex, 0, handleData); // Add the line from the previous handle to the inserted handle (note the tool is now one increment longer)
14942
14943      points[previousIndex].lines.pop();
14944      points[previousIndex].lines.push(points[insertIndex]);
14945      _util_freehand_index_js__WEBPACK_IMPORTED_MODULE_17__["default"].addLine(points, insertIndex);
14946    }
14947    /**
14948     * Checks for any close points and consolidates these to a
14949     * single point.
14950     *
14951     * @private
14952     * @returns {void}
14953     */
14954
14955  }, {
14956    key: "_consolidateHandles",
14957    value: function _consolidateHandles() {
14958      var points = this._sculptData.points; // Don't merge handles if it would destroy the polygon.
14959
14960      if (points.length <= 3) {
14961        return;
14962      }
14963
14964      var closePairs = this._findCloseHandlePairs();
14965
14966      this._mergeCloseHandles(closePairs);
14967    }
14968    /**
14969     * Finds pairs of close handles with seperations < config.minSpacing. No handle
14970     * is included in more than one pair, to avoid spurious deletion of densely
14971     * populated regions of the contour (see mergeCloseHandles).
14972     *
14973     * @private
14974     * @returns {Array} An array of close pairs in points.
14975     */
14976
14977  }, {
14978    key: "_findCloseHandlePairs",
14979    value: function _findCloseHandlePairs() {
14980      var _this$_sculptData4 = this._sculptData,
14981          points = _this$_sculptData4.points,
14982          minSpacing = _this$_sculptData4.minSpacing;
14983      var closePairs = [];
14984      var length = points.length;
14985
14986      for (var i = 0; i < length; i++) {
14987        var nextHandleIndex = this.constructor._getNextHandleIndex(i, points.length);
14988
14989        var distanceToNextHandle = _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstoneMath.point.distance(points[i], points[nextHandleIndex]);
14990
14991        if (distanceToNextHandle < minSpacing) {
14992          var pair = [i, nextHandleIndex];
14993          closePairs.push(pair); // Don't check last node if first in pair to avoid double counting.
14994
14995          if (i === 0) {
14996            length -= 1;
14997          } // Don't double count pairs in order to prevent your polygon collapsing to a singularity.
14998
14999
15000          i++;
15001        }
15002      }
15003
15004      return closePairs;
15005    }
15006    /**
15007     * Merges points given a list of close pairs. The points are merged in an
15008     * iterative fashion to prevent generating a singularity in some edge cases.
15009     *
15010     * @private
15011     * @param {Array} closePairs - An array of pairs of handle indicies.
15012     * @returns {void}
15013     */
15014
15015  }, {
15016    key: "_mergeCloseHandles",
15017    value: function _mergeCloseHandles(closePairs) {
15018      var removedIndexModifier = 0;
15019
15020      for (var i = 0; i < closePairs.length; i++) {
15021        var pair = this.constructor._getCorrectedPair(closePairs[i], removedIndexModifier);
15022
15023        this._combineHandles(pair);
15024
15025        removedIndexModifier++;
15026      } // Recursively remove problem childs
15027
15028
15029      var newClosePairs = this._findCloseHandlePairs();
15030
15031      if (newClosePairs.length) {
15032        this._mergeCloseHandles(newClosePairs);
15033      }
15034    }
15035    /**
15036     * Combines two handles defined by the indicies in handlePairs.
15037     *
15038     * @private
15039     * @param {Object} handlePair - A pair of handle indicies.
15040     * @returns {void}
15041     */
15042
15043  }, {
15044    key: "_combineHandles",
15045    value: function _combineHandles(handlePair) {
15046      var _this$_sculptData5 = this._sculptData,
15047          points = _this$_sculptData5.points,
15048          image = _this$_sculptData5.image; // Calculate combine position: half way between the handles.
15049
15050      var midPoint = {
15051        x: (points[handlePair[0]].x + points[handlePair[1]].x) / 2.0,
15052        y: (points[handlePair[0]].y + points[handlePair[1]].y) / 2.0
15053      };
15054      Object(_util_clip_js__WEBPACK_IMPORTED_MODULE_12__["clipToBox"])(midPoint, image); // Move first point to midpoint
15055
15056      points[handlePair[0]].x = midPoint.x;
15057      points[handlePair[0]].y = midPoint.y; // Link first point to handle that second point links to.
15058
15059      var handleAfterPairIndex = this.constructor._getNextHandleIndex(handlePair[1], points.length);
15060
15061      points[handlePair[0]].lines.pop();
15062      points[handlePair[0]].lines.push(points[handleAfterPairIndex]); // Remove the latter handle
15063
15064      points.splice(handlePair[1], 1);
15065    }
15066    /**
15067     * Calculates the distance to the closest handle in the tool, and stores the
15068     * result in this._toolSizeImage and this._toolSizeCanvas.
15069     *
15070     * @private
15071     * @param {Object} eventData - Data object associated with the event.
15072     * @returns {void}
15073     */
15074
15075  }, {
15076    key: "_configureToolSize",
15077    value: function _configureToolSize(eventData) {
15078      var element = eventData.element;
15079      var config = this.configuration;
15080      var toolIndex = config.currentTool;
15081      var coords = eventData.currentPoints.image;
15082      var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_11__["getToolState"])(element, this.referencedToolName);
15083      var data = toolState.data[toolIndex];
15084      var freehandMouseTool = Object(_store_getToolForElement_js__WEBPACK_IMPORTED_MODULE_13__["default"])(element, this.referencedToolName);
15085      var radiusImage = freehandMouseTool.distanceFromPoint(element, data, coords);
15086      var radiusCanvas = freehandMouseTool.distanceFromPointCanvas(element, data, coords); // Check if should limit maximum size.
15087
15088      if (config.limitRadiusOutsideRegion) {
15089        radiusImage = this._limitCursorRadiusImage(eventData, radiusImage);
15090        radiusCanvas = this._limitCursorRadiusCanvas(eventData, radiusCanvas);
15091      }
15092
15093      this._toolSizeImage = radiusImage;
15094      this._toolSizeCanvas = radiusCanvas;
15095    }
15096    /**
15097     * Gets the current mouse location and stores it in the configuration object.
15098     *
15099     * @private
15100     * @param {Object} eventData - The data assoicated with the event.
15101     * @returns {void}
15102     */
15103
15104  }, {
15105    key: "_getMouseLocation",
15106    value: function _getMouseLocation(eventData) {
15107      var config = this.configuration;
15108      config.mouseLocation.handles.start.x = eventData.currentPoints.image.x;
15109      config.mouseLocation.handles.start.y = eventData.currentPoints.image.y;
15110      Object(_util_clip_js__WEBPACK_IMPORTED_MODULE_12__["clipToBox"])(config.mouseLocation.handles.start, eventData.image);
15111    }
15112    /**
15113     * Attaches event listeners to the element such that is is visible, modifiable, and new data can be created.
15114     *
15115     * @private
15116     * @param {Object} element - The viewport element to attach event listeners to.
15117     * @modifies {element}
15118     * @returns {void}
15119     */
15120
15121  }, {
15122    key: "_activateSculpt",
15123    value: function _activateSculpt(element) {
15124      this._deactivateSculpt(element); // Begin activeMouseDragCallback loop - call activeMouseUpCallback at end of drag or straight away if just a click.
15125
15126
15127      element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_6__["default"].MOUSE_UP, this.activeMouseUpCallback);
15128      element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_6__["default"].MOUSE_CLICK, this.activeMouseUpCallback);
15129      element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_6__["default"].MOUSE_DRAG, this.activeMouseDragCallback);
15130      element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_6__["default"].TOUCH_END, this.activeTouchEndCallback);
15131      element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_6__["default"].TOUCH_TAP, this.activeTouchEndCallback);
15132      element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_6__["default"].TOUCH_DRAG, this.activeMouseDragCallback);
15133      _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstone.updateImage(element);
15134    }
15135    /**
15136     * Removes event listeners from the element.
15137     *
15138     * @private
15139     * @param {Object} element - The viewport element to remove event listeners from.
15140     * @modifies {element}
15141     * @returns {void}
15142     */
15143
15144  }, {
15145    key: "_deactivateSculpt",
15146    value: function _deactivateSculpt(element) {
15147      element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_6__["default"].MOUSE_UP, this.activeMouseUpCallback);
15148      element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_6__["default"].MOUSE_CLICK, this.activeMouseUpCallback);
15149      element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_6__["default"].MOUSE_DRAG, this.activeMouseDragCallback);
15150      element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_6__["default"].TOUCH_END, this.activeTouchEndCallback);
15151      element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_6__["default"].TOUCH_TAP, this.activeTouchEndCallback);
15152      element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_6__["default"].TOUCH_DRAG, this.activeMouseDragCallback);
15153      _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstone.updateImage(element);
15154    }
15155    /**
15156     * Invalidate the freehand tool data, tirggering re-calculation of statistics.
15157     *
15158     * @private
15159     * @param {Object} eventData - Data object associated with the event.
15160     * @returns {void}
15161     */
15162
15163  }, {
15164    key: "_invalidateToolData",
15165    value: function _invalidateToolData(eventData) {
15166      var config = this.configuration;
15167      var element = eventData.element;
15168      var toolData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_11__["getToolState"])(element, this.referencedToolName);
15169      var data = toolData.data[config.currentTool];
15170      data.invalidated = true;
15171    }
15172    /**
15173     * Deactivates all freehand ROIs and change currentTool to null
15174     *
15175     * @private
15176     * @param {Object} evt - The event.
15177     * @returns {void}
15178     */
15179    // eslint-disable-next-line no-unused-vars
15180
15181  }, {
15182    key: "_deselectAllTools",
15183    value: function _deselectAllTools(evt) {
15184      var config = this.configuration;
15185      var toolData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_11__["getToolState"])(this.element, this.referencedToolName);
15186      config.currentTool = null;
15187
15188      if (toolData) {
15189        for (var i = 0; i < toolData.data.length; i++) {
15190          toolData.data[i].active = false;
15191        }
15192      }
15193
15194      Object(_store_setToolCursor_js__WEBPACK_IMPORTED_MODULE_15__["setToolCursor"])(this.element, this.svgCursor);
15195      _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstone.updateImage(this.element);
15196    }
15197    /**
15198     * Given a pair of indicies, and the number of points already removed,
15199     * convert to the correct live indicies.
15200     *
15201     * @private
15202     * @static
15203     * @param {Object} pair A pairs of handle indicies.
15204     * @param {Number} removedIndexModifier The number of handles already removed.
15205     * @returns {Object} The corrected pair of handle indicies.
15206     */
15207
15208  }, {
15209    key: "_limitCursorRadiusCanvas",
15210
15211    /**
15212     * Limits the cursor radius so that it its maximum area is the same as the
15213     * ROI being sculpted (in canvas coordinates).
15214     *
15215     * @private
15216     * @param  {Object}  eventData    Data object associated with the event.
15217     * @param  {Number}  radiusCanvas The distance from the mouse to the ROI
15218     *                                in canvas coordinates.
15219     * @returns {Number}              The limited radius in canvas coordinates.
15220     */
15221    value: function _limitCursorRadiusCanvas(eventData, radiusCanvas) {
15222      return this._limitCursorRadius(eventData, radiusCanvas, true);
15223    }
15224    /**
15225     * Limits the cursor radius so that it its maximum area is the same as the
15226     * ROI being sculpted (in image coordinates).
15227     *
15228     * @private
15229     * @param  {Object}  eventData    Data object associated with the event.
15230     * @param  {Number}  radiusImage  The distance from the mouse to the ROI
15231     *                                in image coordinates.
15232     * @returns {Number}              The limited radius in image coordinates.
15233     */
15234
15235  }, {
15236    key: "_limitCursorRadiusImage",
15237    value: function _limitCursorRadiusImage(eventData, radiusImage) {
15238      return this._limitCursorRadius(eventData, radiusImage, false);
15239    }
15240    /**
15241     * Limits the cursor radius so that it its maximum area is the same as the
15242     * ROI being sculpted.
15243     *
15244     * @private
15245     * @param  {Object}  eventData    Data object associated with the event.
15246     * @param  {Number}  radius       The distance from the mouse to the ROI.
15247     * @param  {Boolean} canvasCoords Whether the calculation should be performed
15248     *                                In canvas coordinates.
15249     * @returns {Number}              The limited radius.
15250     */
15251
15252  }, {
15253    key: "_limitCursorRadius",
15254    value: function _limitCursorRadius(eventData, radius) {
15255      var canvasCoords = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
15256      var element = eventData.element;
15257      var image = eventData.image;
15258      var config = this.configuration;
15259      var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_11__["getToolState"])(element, this.referencedToolName);
15260      var data = toolState.data[config.currentTool];
15261      var areaModifier = 1.0;
15262
15263      if (canvasCoords) {
15264        var topLeft = _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstone.pixelToCanvas(element, {
15265          x: 0,
15266          y: 0
15267        });
15268        var bottomRight = _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstone.pixelToCanvas(element, {
15269          x: image.width,
15270          y: image.height
15271        });
15272        var canvasArea = (bottomRight.x - topLeft.x) * (bottomRight.y - topLeft.y);
15273        areaModifier = canvasArea / (image.width * image.height);
15274      }
15275
15276      var area = data.area * areaModifier;
15277      var maxRadius = Math.pow(area / Math.PI, 0.5);
15278      return Math.min(radius, maxRadius);
15279    }
15280    /**
15281     * Finds the nearest handle to the mouse cursor for all freehand
15282     * data on the element.
15283     *
15284     * @private
15285     * @param {Object} element - The element.
15286     * @param {Object} eventData - Data object associated with the event.
15287     * @returns {Number} The tool index of the closest freehand tool.
15288     */
15289
15290  }, {
15291    key: "_getClosestFreehandToolOnElement",
15292    value: function _getClosestFreehandToolOnElement(element, eventData) {
15293      var freehand = Object(_store_getToolForElement_js__WEBPACK_IMPORTED_MODULE_13__["default"])(element, this.referencedToolName);
15294      var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_11__["getToolState"])(element, this.referencedToolName);
15295
15296      if (!toolState) {
15297        return;
15298      }
15299
15300      var data = toolState.data;
15301      var pixelCoords = eventData.currentPoints.image;
15302      var closest = {
15303        distance: Infinity,
15304        toolIndex: null
15305      };
15306
15307      for (var i = 0; i < data.length; i++) {
15308        var distanceFromToolI = freehand.distanceFromPoint(element, data[i], pixelCoords);
15309
15310        if (distanceFromToolI === -1) {
15311          continue;
15312        }
15313
15314        if (distanceFromToolI < closest.distance) {
15315          closest.distance = distanceFromToolI;
15316          closest.toolIndex = i;
15317        }
15318      }
15319
15320      return closest.toolIndex;
15321    }
15322    /**
15323     * Returns the next handle index.
15324     *
15325     * @private
15326     * @static
15327     * @param {Number} i - The handle index.
15328     * @param {Number} length - The length of the polygon.
15329     * @returns {Number} The next handle index.
15330     */
15331
15332  }, {
15333    key: "_getInsertPosition",
15334
15335    /**
15336     * Calculates the position that a new handle should be inserted.
15337     *
15338     * @private
15339     * @static
15340     * @param {Number} insertIndex - The index to insert the new handle.
15341     * @param {Number} previousIndex - The previous index.
15342     * @param {Number} nextIndex - The next index.
15343     * @returns {Object} The position the handle should be inserted.
15344     */
15345    value: function _getInsertPosition(insertIndex, previousIndex, nextIndex) {
15346      var _this$_sculptData6 = this._sculptData,
15347          points = _this$_sculptData6.points,
15348          toolSize = _this$_sculptData6.toolSize,
15349          mousePoint = _this$_sculptData6.mousePoint,
15350          image = _this$_sculptData6.image; // Calculate insert position: half way between the handles, then pushed out
15351      // Radially to the edge of the freehandSculpter.
15352
15353      var midPoint = {
15354        x: (points[previousIndex].x + points[nextIndex].x) / 2.0,
15355        y: (points[previousIndex].y + points[nextIndex].y) / 2.0
15356      };
15357      var distanceToMidPoint = _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstoneMath.point.distance(mousePoint, midPoint);
15358      var insertPosition;
15359
15360      if (distanceToMidPoint < toolSize) {
15361        var directionUnitVector = {
15362          x: (midPoint.x - mousePoint.x) / distanceToMidPoint,
15363          y: (midPoint.y - mousePoint.y) / distanceToMidPoint
15364        };
15365        insertPosition = {
15366          x: mousePoint.x + toolSize * directionUnitVector.x,
15367          y: mousePoint.y + toolSize * directionUnitVector.y
15368        };
15369      } else {
15370        insertPosition = midPoint;
15371      }
15372
15373      Object(_util_clip_js__WEBPACK_IMPORTED_MODULE_12__["clipToBox"])(insertPosition, image);
15374      return insertPosition;
15375    } // ===================================================================
15376    // Public Configuration API. .
15377    // ===================================================================
15378
15379  }, {
15380    key: "minSpacing",
15381    get: function get() {
15382      return this.configuration.minSpacing;
15383    },
15384    set: function set(value) {
15385      if (typeof value !== 'number') {
15386        throw new Error('Attempting to set freehandSculpter minSpacing to a value other than a number.');
15387      }
15388
15389      this.configuration.minSpacing = value;
15390    }
15391  }, {
15392    key: "maxSpacing",
15393    get: function get() {
15394      return this.configuration.maxSpacing;
15395    },
15396    set: function set(value) {
15397      if (typeof value !== 'number') {
15398        throw new Error('Attempting to set freehandSculpter maxSpacing to a value other than a number.');
15399      }
15400
15401      this.configuration.maxSpacing = value;
15402    }
15403  }, {
15404    key: "showCursorOnHover",
15405    get: function get() {
15406      return this.configuration.showCursorOnHover;
15407    },
15408    set: function set(value) {
15409      if (typeof value !== 'boolean') {
15410        throw new Error('Attempting to set freehandSculpter showCursorOnHover to a value other than a boolean.');
15411      }
15412
15413      this.configuration.showCursorOnHover = value;
15414      _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstone.updateImage(this.element);
15415    }
15416  }, {
15417    key: "limitRadiusOutsideRegion",
15418    get: function get() {
15419      return this.configuration.limitRadiusOutsideRegion;
15420    },
15421    set: function set(value) {
15422      if (typeof value !== 'boolean') {
15423        throw new Error('Attempting to set freehandSculpter limitRadiusOutsideRegion to a value other than a boolean.');
15424      }
15425
15426      this.configuration.limitRadiusOutsideRegion = value;
15427      _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstone.updateImage(this.element);
15428    }
15429  }, {
15430    key: "hoverCursorFadeAlpha",
15431    get: function get() {
15432      return this.configuration.hoverCursorFadeAlpha;
15433    },
15434    set: function set(value) {
15435      if (typeof value !== 'number') {
15436        throw new Error('Attempting to set freehandSculpter hoverCursorFadeAlpha to a value other than a number.');
15437      } // Clamp the value from 0 to 1.
15438
15439
15440      value = Math.max(Math.min(value, 1.0), 0.0);
15441      this.configuration.hoverCursorFadeAlpha = value;
15442      _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstone.updateImage(this.element);
15443    }
15444  }, {
15445    key: "hoverCursorFadeDistance",
15446    get: function get() {
15447      return this.configuration.hoverCursorFadeDistance;
15448    },
15449    set: function set(value) {
15450      if (typeof value !== 'number') {
15451        throw new Error('Attempting to set freehandSculpter hoverCursorFadeDistance to a value other than a number.');
15452      } // Don't allow to fade a distances smaller than the tool's radius.
15453
15454
15455      value = Math.max(value, 1.0);
15456      this.configuration.hoverCursorFadeDistance = value;
15457      _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstone.updateImage(this.element);
15458    }
15459  }], [{
15460    key: "_getCorrectedPair",
15461    value: function _getCorrectedPair(pair, removedIndexModifier) {
15462      var correctedPair = [pair[0] - removedIndexModifier, pair[1] - removedIndexModifier];
15462 // Deal with edge case of last node + first node.
15463
15464      if (correctedPair[1] < 0) {
15465        correctedPair[1] = 0;
15466      }
15467
15468      return correctedPair;
15469    }
15470  }, {
15471    key: "_getNextHandleIndex",
15472    value: function _getNextHandleIndex(i, length) {
15473      if (i === length - 1) {
15474        return 0;
15475      }
15476
15477      return i + 1;
15478    }
15479    /**
15480     * Returns the previous handle index.
15481     *
15482     * @private
15483     * @static
15484     * @param {Number} i - The handle index.
15485     * @param {Number} length - The length of the polygon.
15486     * @returns {Number} The previous handle index.
15487     */
15488
15489  }, {
15490    key: "_getPreviousHandleIndex",
15491    value: function _getPreviousHandleIndex(i, length) {
15492      if (i === 0) {
15493        return length - 1;
15494      }
15495
15496      return i - 1;
15497    }
15498    /**
15499     * Returns the next handle index, with a correction considering a handle is
15500     * about to be inserted.
15501     *
15502     * @private
15503     * @static
15504     * @param {Number} insertIndex - The index in which the handle is being inserted.
15505     * @param {Number} length - The length of the polygon.
15506     * @returns {Number} The next handle index.
15507     */
15508
15509  }, {
15510    key: "_getNextHandleIndexBeforeInsert",
15511    value: function _getNextHandleIndexBeforeInsert(insertIndex, length) {
15512      if (insertIndex === length) {
15513        return 0;
15514      } // Index correction here: The line bellow is correct, as we haven't inserted our handle yet!
15515
15516
15517      return insertIndex;
15518    }
15519  }]);
15520
15521  return FreehandSculpterMouseTool;
15522}(_base_BaseTool_js__WEBPACK_IMPORTED_MODULE_14__["default"]);
15523/**
15524 * Returns the default freehandSculpterMouseTool configuration.
15525 *
15526 * @returns {Object} The default configuration object.
15527 */
15528
15529
15530
15531
15532function getDefaultFreehandSculpterMouseToolConfiguration() {
15533  return {
15534    mouseLocation: {
15535      handles: {
15536        start: {
15537          highlight: true,
15538          active: true
15539        }
15540      }
15541    },
15542    minSpacing: 1,
15543    currentTool: null,
15544    dragColor: _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_8__["default"].getActiveColor(),
15545    hoverColor: _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_8__["default"].getToolColor(),
15546
15547    /* --- Hover options ---
15548    showCursorOnHover:        Shows a preview of the sculpting radius on hover.
15549    limitRadiusOutsideRegion: Limit max toolsize outside the subject ROI based
15550                              on subject ROI area.
15551    hoverCursorFadeAlpha:     Alpha to fade to when tool very distant from
15552                              subject ROI.
15553    hoverCursorFadeDistance:  Distance from ROI in which to fade the hoverCursor
15554                              (in units of radii).
15555    */
15556    showCursorOnHover: true,
15557    limitRadiusOutsideRegion: true,
15558    hoverCursorFadeAlpha: 0.5,
15559    hoverCursorFadeDistance: 1.2
15560  };
15561}
15562
15563function preventPropagation(evt) {
15564  evt.stopImmediatePropagation();
15565  evt.stopPropagation();
15566  evt.preventDefault();
15567}
15568
15569/***/ }),
15570
15571/***/ "./tools/MagnifyTool.js":
15572/*!******************************!*\
15573  !*** ./tools/MagnifyTool.js ***!
15574  \******************************/
15575/*! exports provided: default */
15576/***/ (function(module, __webpack_exports__, __webpack_require__) {
15577
15578"use strict";
15579__webpack_require__.r(__webpack_exports__);
15580/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return MagnifyTool; });
15581/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js");
15582/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
15583/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js");
15584/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
15585/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js");
15586/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
15587/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js");
15588/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
15589/* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/assertThisInitialized */ "../node_modules/@babel/runtime/helpers/assertThisInitialized.js");
15590/* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4__);
15591/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js");
15592/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__);
15593/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js");
15594/* harmony import */ var _drawing_index_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../drawing/index.js */ "./drawing/index.js");
15595/* harmony import */ var _base_BaseTool_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./base/BaseTool.js */ "./tools/base/BaseTool.js");
15596/* harmony import */ var _store_setToolCursor_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../store/setToolCursor.js */ "./store/setToolCursor.js");
15597/* harmony import */ var _cursors_index_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./cursors/index.js */ "./tools/cursors/index.js");
15598
15599
15600
15601
15602
15603
15604
15605
15606
15607
15608
15609/**
15610 * @public
15611 * @class MagnifyTool
15612 * @memberof Tools
15613 *
15614 * @classdesc Tool for inspecting a region at increased magnification.
15615 * @extends Tools.Base.BaseTool
15616 */
15617
15618var MagnifyTool =
15619/*#__PURE__*/
15620function (_BaseTool) {
15621  _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default()(MagnifyTool, _BaseTool);
15622
15623  function MagnifyTool() {
15624    var _this;
15625
15626    var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
15627
15628    _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, MagnifyTool);
15629
15630    var defaultProps = {
15631      name: 'Magnify',
15632      supportedInteractionTypes: ['Mouse', 'Touch'],
15633      configuration: {
15634        magnifySize: 300,
15635        magnificationLevel: 2
15636      },
15637      svgCursor: _cursors_index_js__WEBPACK_IMPORTED_MODULE_10__["magnifyCursor"]
15638    };
15639    _this = _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(MagnifyTool).call(this, props, defaultProps));
15640    _this.zoomCanvas = undefined;
15641    _this.zoomElement = undefined; // Mode Callbacks: (element, options)
15642
15643    _this.activeCallback = _this._createMagnificationCanvas.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this));
15644    _this.enabledCallback = _this._createMagnificationCanvas.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this));
15645    _this.disabledCallback = _this._destroyMagnificationCanvas.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this)); // Touch
15646
15647    _this.postTouchStartCallback = _this._addMagnifyingGlass.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this));
15648    _this.touchDragCallback = _this._updateMagnifyingGlass.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this));
15649    _this.touchEndCallback = _this._removeMagnifyingGlass.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this));
15650    _this.touchDragEndCallback = _this._removeMagnifyingGlass.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this)); // Mouse
15651
15652    _this.postMouseDownCallback = _this._addMagnifyingGlass.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this));
15653    _this.mouseDragCallback = _this._updateMagnifyingGlass.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this));
15654    _this.mouseUpCallback = _this._removeMagnifyingGlass.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this)); // On quick clicks, mouseUp does not fire, but this does
15655
15656    _this.mouseClickCallback = _this._removeMagnifyingGlass.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this)); // Misc
15657
15658    _this.newImageCallback = _this._drawMagnificationTool.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this));
15659    return _this;
15660  }
15661
15662  _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(MagnifyTool, [{
15663    key: "_addMagnifyingGlass",
15664    value: function _addMagnifyingGlass(evt) {
15665      var _this2 = this;
15666
15667      // Ignore until next event
15668      this._removeZoomElement();
15669
15670      this._drawZoomedElement(evt); // On next frame
15671
15672
15673      window.requestAnimationFrame(function () {
15674        return _this2._drawMagnificationTool(evt);
15675      });
15676      Object(_store_setToolCursor_js__WEBPACK_IMPORTED_MODULE_9__["hideToolCursor"])(evt.detail.element);
15677      evt.preventDefault();
15678      evt.stopPropagation();
15679    }
15680  }, {
15681    key: "_updateMagnifyingGlass",
15682    value: function _updateMagnifyingGlass(evt) {
15683      this._drawMagnificationTool(evt);
15684
15685      evt.preventDefault();
15686      evt.stopPropagation();
15687    }
15688  }, {
15689    key: "_removeMagnifyingGlass",
15690    value: function _removeMagnifyingGlass(evt) {
15691      var element = evt.detail.element;
15691 // Re-enable the mouse cursor
15692
15693      Object(_store_setToolCursor_js__WEBPACK_IMPORTED_MODULE_9__["setToolCursor"])(this.element, this.svgCursor);
15694      element.querySelector('.magnifyTool').style.display = 'none';
15695
15696      this._removeZoomElement();
15697    }
15698  }, {
15699    key: "_drawMagnificationTool",
15700    value: function _drawMagnificationTool(evt) {
15701      var element = evt.detail.element;
15702      var magnifyCanvas = element.querySelector('.magnifyTool');
15703
15704      if (!magnifyCanvas) {
15705        this._createMagnificationCanvas(element);
15706      }
15707
15708      if (this.zoomCanvas === undefined) {
15709        return;
15710      } // The 'not' magnifyTool class here is necessary because cornerstone places
15711      // No classes of it's own on the canvas we want to select
15712
15713
15714      var canvas = element.querySelector('canvas:not(.magnifyTool)');
15715      var context = Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_7__["getNewContext"])(magnifyCanvas); // Calculate the on-canvas location of the mouse pointer / touch
15716
15717      var canvasLocation = _externalModules_js__WEBPACK_IMPORTED_MODULE_6__["default"].cornerstone.pixelToCanvas(evt.detail.element, evt.detail.currentPoints.image); // Shrink magnifier to smallest canvas dimension if smaller than desired magnifier size
15718
15719      var magnifySize = Math.min(this.configuration.magnifySize, canvas.width, canvas.height);
15720      var magnificationLevel = this.configuration.magnificationLevel;
15721      magnifyCanvas.width = magnifySize;
15722      magnifyCanvas.height = magnifySize; // Constrain drag movement to zoomed image boundaries
15723
15724      canvasLocation.x = Math.max(canvasLocation.x, 0.5 * magnifySize / magnificationLevel);
15725      canvasLocation.x = Math.min(canvasLocation.x, canvas.width - 0.5 * magnifySize / magnificationLevel);
15726      canvasLocation.y = Math.max(canvasLocation.y, 0.5 * magnifySize / magnificationLevel);
15727      canvasLocation.y = Math.min(canvasLocation.y, canvas.height - 0.5 * magnifySize / magnificationLevel);
15728      var copyFrom = {
15729        x: canvasLocation.x * magnificationLevel - 0.5 * magnifySize,
15730        y: canvasLocation.y * magnificationLevel - 0.5 * magnifySize
15731      };
15732      copyFrom.x = Math.max(copyFrom.x, 0);
15733      copyFrom.y = Math.max(copyFrom.y, 0);
15734      context.drawImage(this.zoomCanvas, copyFrom.x, copyFrom.y, magnifySize, magnifySize, 0, 0, magnifySize, magnifySize); // Place the magnification tool at the same location as the pointer
15735
15736      var touchOffset = evt.detail.isTouchEvent ? 120 : 0;
15737      var magnifyPosition = {
15738        top: Math.max(canvasLocation.y - 0.5 * magnifySize - touchOffset, 0),
15739        left: Math.max(canvasLocation.x - 0.5 * magnifySize, 0)
15740      }; // Get full magnifier dimensions with borders
15741
15742      var magnifierBox = magnifyCanvas.getBoundingClientRect(); // Constrain magnifier to canvas boundaries
15743
15744      magnifyPosition.top = Math.min(magnifyPosition.top, canvas.height - magnifierBox.height);
15745      magnifyPosition.left = Math.min(magnifyPosition.left, canvas.width - magnifierBox.width);
15746      magnifyCanvas.style.top = "".concat(magnifyPosition.top, "px");
15747      magnifyCanvas.style.left = "".concat(magnifyPosition.left, "px");
15748      magnifyCanvas.style.display = 'block';
15749    }
15750    /**
15751     * Creates a cornerstone enabled element, and renders the target image at the
15752     * desired magnification level using it.
15753     *
15754     * @private
15755     * @param {*} evt
15756     * @returns {void}
15757     */
15758
15759  }, {
15760    key: "_drawZoomedElement",
15761    value: function _drawZoomedElement(evt) {
15762      var element = evt.detail.element;
15763      var enabledElement = evt.detail.enabledElement;
15764
15765      if (enabledElement === undefined) {
15766        enabledElement = _externalModules_js__WEBPACK_IMPORTED_MODULE_6__["default"].cornerstone.getEnabledElement(element);
15767      }
15768
15769      var magnificationLevel = this.configuration.magnificationLevel;
15770      var origCanvas = enabledElement.canvas;
15771      var image = enabledElement.image; // Create a new cornerstone enabledElement
15772
15773      if (!this.zoomElement) {
15774        this.zoomElement = document.createElement('div');
15775        this.zoomElement.width = origCanvas.width * magnificationLevel;
15776        this.zoomElement.height = origCanvas.height * magnificationLevel;
15777        _externalModules_js__WEBPACK_IMPORTED_MODULE_6__["default"].cornerstone.enable(this.zoomElement, enabledElement.options);
15778      }
15779
15780      var zoomEnabledElement = _externalModules_js__WEBPACK_IMPORTED_MODULE_6__["default"].cornerstone.getEnabledElement(this.zoomElement);
15781      var viewport = _externalModules_js__WEBPACK_IMPORTED_MODULE_6__["default"].cornerstone.getViewport(enabledElement.element);
15782      this.zoomCanvas = zoomEnabledElement.canvas;
15783      this.zoomCanvas.width = origCanvas.width * magnificationLevel;
15784      this.zoomCanvas.height = origCanvas.height * magnificationLevel;
15785      zoomEnabledElement.viewport = Object.assign({}, viewport); // Update it's viewport to render at desired magnification level
15786
15787      viewport.scale *= magnificationLevel;
15788      _externalModules_js__WEBPACK_IMPORTED_MODULE_6__["default"].cornerstone.displayImage(this.zoomElement, image);
15789      _externalModules_js__WEBPACK_IMPORTED_MODULE_6__["default"].cornerstone.setViewport(this.zoomElement, viewport); // To do enable annotation tools for zoomElement
15790    }
15791    /**
15792     * Removes the canvas and associated enabled element that's
15793     * used to render the zoomed image.
15794     * @returns {void}
15795     */
15796
15797  }, {
15798    key: "_removeZoomElement",
15799    value: function _removeZoomElement() {
15800      if (this.zoomElement !== undefined) {
15801        _externalModules_js__WEBPACK_IMPORTED_MODULE_6__["default"].cornerstone.disable(this.zoomCanvas);
15802        this.zoomElement = undefined;
15803        this.zoomCanvas = undefined;
15804      }
15805    }
15806    /**
15807     * The canvas used to render the zoomed image.
15808     * It will be displayed and clipped inside the magnifying glass frame/element.
15809     *
15810     * @private
15811     *
15812     * @param {*} element
15813     * @returns {void}
15814     */
15815
15816  }, {
15817    key: "_createMagnificationCanvas",
15818    value: function _createMagnificationCanvas(element) {
15819      // If the magnifying glass canvas doesn't already exist
15820      if (element.querySelector('.magnifyTool') === null) {
15821        // Create a canvas and append it as a child to the element
15822        var magnifyCanvas = document.createElement('canvas'); // The magnifyTool class is used to find the canvas later on
15823        // Make sure position is absolute so the canvas can follow the mouse / touch
15824
15825        magnifyCanvas.classList.add('magnifyTool');
15826        magnifyCanvas.width = this.configuration.magnifySize;
15827        magnifyCanvas.height = this.configuration.magnifySize;
15828        magnifyCanvas.style.position = 'absolute';
15829        magnifyCanvas.style.display = 'none';
15830        element.appendChild(magnifyCanvas);
15831      }
15832    }
15833    /**
15834     *
15835     *
15836     * @param {*} element
15837     * @returns {void}
15838     */
15839
15840  }, {
15841    key: "_destroyMagnificationCanvas",
15842    value: function _destroyMagnificationCanvas(element) {
15843      var magnifyCanvas = element.querySelector('.magnifyTool');
15844
15845      if (magnifyCanvas) {
15846        element.removeChild(magnifyCanvas);
15847      }
15848    }
15849  }]);
15850
15851  return MagnifyTool;
15852}(_base_BaseTool_js__WEBPACK_IMPORTED_MODULE_8__["default"]);
15853
15854
15855
15856/***/ }),
15857
15858/***/ "./tools/PanMultiTouchTool.js":
15859/*!************************************!*\
15860  !*** ./tools/PanMultiTouchTool.js ***!
15861  \************************************/
15862/*! exports provided: default */
15863/***/ (function(module, __webpack_exports__, __webpack_require__) {
15864
15865"use strict";
15866__webpack_require__.r(__webpack_exports__);
15867/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return PanMultiTouchTool; });
15868/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js");
15869/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
15870/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js");
15871/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
15872/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js");
15873/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
15874/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js");
15875/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
15876/* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/assertThisInitialized */ "../node_modules/@babel/runtime/helpers/assertThisInitialized.js");
15877/* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4__);
15878/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js");
15879/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__);
15880/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js");
15881/* harmony import */ var _base_BaseTool_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./base/BaseTool.js */ "./tools/base/BaseTool.js");
15882
15883
15884
15885
15886
15887
15888
15889
15890/**
15891 * @public
15892 * @class PanMultiTouchTool
15893 * @memberof Tools
15894 *
15895 * @classdesc Tool for panning the image using multi-touch.
15896 * @extends Tools.Base.BaseTool
15897 */
15898
15899var PanMultiTouchTool =
15900/*#__PURE__*/
15901function (_BaseTool) {
15902  _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default()(PanMultiTouchTool, _BaseTool);
15903
15904  function PanMultiTouchTool() {
15905    var _this;
15906
15907    var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
15908
15909    _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, PanMultiTouchTool);
15910
15911    var defaultProps = {
15912      name: 'PanMultiTouch',
15913      supportedInteractionTypes: ['MultiTouch'],
15914      configuration: {
15915        touchPointers: 2
15916      }
15917    };
15918    _this = _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(PanMultiTouchTool).call(this, props, defaultProps)); // Touch
15919
15920    _this.multiTouchDragCallback = _this._dragCallback.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this));
15921    return _this;
15922  }
15923
15924  _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(PanMultiTouchTool, [{
15925    key: "_dragCallback",
15926    value: function _dragCallback(evt) {
15927      var eventData = evt.detail;
15928      var element = eventData.element,
15929          viewport = eventData.viewport;
15930
15931      if (eventData.numPointers === this.configuration.touchPointers) {
15932        var translation = this._getTranslation(eventData);
15933
15934        this._applyTranslation(viewport, translation);
15935
15936        _externalModules_js__WEBPACK_IMPORTED_MODULE_6__["default"].cornerstone.setViewport(element, viewport);
15937      }
15938    }
15939  }, {
15940    key: "_getTranslation",
15941    value: function _getTranslation(eventData) {
15942      var viewport = eventData.viewport,
15943          image = eventData.image,
15944          deltaPoints = eventData.deltaPoints;
15945      var widthScale = viewport.scale;
15946      var heightScale = viewport.scale;
15947
15948      if (image.rowPixelSpacing < image.columnPixelSpacing) {
15949        widthScale *= image.columnPixelSpacing / image.rowPixelSpacing;
15950      } else if (image.columnPixelSpacing < image.rowPixelSpacing) {
15951        heightScale *= image.rowPixelSpacing / image.columnPixelSpacing;
15952      }
15953
15954      return {
15955        x: deltaPoints.page.x / widthScale,
15956        y: deltaPoints.page.y / heightScale
15957      };
15958    }
15959  }, {
15960    key: "_applyTranslation",
15961    value: function _applyTranslation(viewport, translation) {
15962      viewport.translation.x += translation.x;
15963      viewport.translation.y += translation.y;
15964    }
15965  }]);
15966
15967  return PanMultiTouchTool;
15968}(_base_BaseTool_js__WEBPACK_IMPORTED_MODULE_7__["default"]);
15969
15970
15971
15972/***/ }),
15973
15974/***/ "./tools/PanTool.js":
15975/*!**************************!*\
15976  !*** ./tools/PanTool.js ***!
15977  \**************************/
15978/*! exports provided: default */
15979/***/ (function(module, __webpack_exports__, __webpack_require__) {
15980
15981"use strict";
15982__webpack_require__.r(__webpack_exports__);
15983/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return PanTool; });
15984/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js");
15985/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
15986/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js");
15987/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
15988/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js");
15989/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
15990/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js");
15991/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
15992/* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/assertThisInitialized */ "../node_modules/@babel/runtime/helpers/assertThisInitialized.js");
15993/* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4__);
15994/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js");
15995/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__);
15996/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./../externalModules.js */ "./externalModules.js");
15997/* harmony import */ var _base_BaseTool_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./base/BaseTool.js */ "./tools/base/BaseTool.js");
15998/* harmony import */ var _cursors_index_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./cursors/index.js */ "./tools/cursors/index.js");
15999
16000
16001
16002
16003
16004
16005
16006
16007
16008/**
16009 * @public
16010 * @class PanTool
16011 * @memberof Tools
16012 *
16013 * @classdesc Tool for panning the image.
16014 * @extends Tools.Base.BaseTool
16015 */
16016
16017var PanTool =
16018/*#__PURE__*/
16019function (_BaseTool) {
16020  _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default()(PanTool, _BaseTool);
16021
16022  function PanTool() {
16023    var _this;
16024
16025    var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
16026
16027    _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, PanTool);
16028
16029    var defaultProps = {
16030      name: 'Pan',
16031      supportedInteractionTypes: ['Mouse', 'Touch'],
16032      svgCursor: _cursors_index_js__WEBPACK_IMPORTED_MODULE_8__["panCursor"]
16033    };
16034    _this = _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(PanTool).call(this, props, defaultProps)); // Touch
16035
16036    _this.touchDragCallback = _this._dragCallback.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this)); // Mouse
16037
16038    _this.mouseDragCallback = _this._dragCallback.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this));
16039    return _this;
16040  }
16041
16042  _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(PanTool, [{
16043    key: "_dragCallback",
16044    value: function _dragCallback(evt) {
16045      var eventData = evt.detail;
16046      var element = eventData.element,
16047          viewport = eventData.viewport;
16048
16049      var translation = this._getTranslation(eventData);
16050
16051      this._applyTranslation(viewport, translation);
16052
16053      _externalModules_js__WEBPACK_IMPORTED_MODULE_6__["default"].cornerstone.setViewport(element, viewport);
16054    }
16055  }, {
16056    key: "_getTranslation",
16057    value: function _getTranslation(eventData) {
16058      var viewport = eventData.viewport,
16059          image = eventData.image,
16060          deltaPoints = eventData.deltaPoints;
16061      var widthScale = viewport.scale;
16062      var heightScale = viewport.scale;
16063
16064      if (image.rowPixelSpacing < image.columnPixelSpacing) {
16065        widthScale *= image.columnPixelSpacing / image.rowPixelSpacing;
16066      } else if (image.columnPixelSpacing < image.rowPixelSpacing) {
16067        heightScale *= image.rowPixelSpacing / image.columnPixelSpacing;
16068      }
16069
16070      return {
16071        x: deltaPoints.page.x / widthScale,
16072        y: deltaPoints.page.y / heightScale
16073      };
16074    }
16075  }, {
16076    key: "_applyTranslation",
16077    value: function _applyTranslation(viewport, translation) {
16078      viewport.translation.x += translation.x;
16079      viewport.translation.y += translation.y;
16080    }
16081  }]);
16082
16083  return PanTool;
16084}(_base_BaseTool_js__WEBPACK_IMPORTED_MODULE_7__["default"]);
16085
16086
16087
16088/***/ }),
16089
16090/***/ "./tools/ReferenceLinesTool.js":
16091/*!*************************************!*\
16092  !*** ./tools/ReferenceLinesTool.js ***!
16093  \*************************************/
16094/*! exports provided: default */
16095/***/ (function(module, __webpack_exports__, __webpack_require__) {
16096
16097"use strict";
16098__webpack_require__.r(__webpack_exports__);
16099/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return ReferenceLinesTool; });
16100/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/regenerator */ "../node_modules/@babel/runtime/regenerator/index.js");
16101/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__);
16102/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ "../node_modules/@babel/runtime/helpers/asyncToGenerator.js");
16103/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1__);
16104/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js");
16105/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_2__);
16106/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js");
16107/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_3__);
16108/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js");
16109/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_4__);
16110/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js");
16111/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_5__);
16112/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js");
16113/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_6__);
16114/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./../externalModules.js */ "./externalModules.js");
16115/* harmony import */ var _base_BaseTool_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./base/BaseTool.js */ "./tools/base/BaseTool.js");
16116/* harmony import */ var _drawing_index_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../drawing/index.js */ "./drawing/index.js");
16117/* harmony import */ var _referenceLines_renderActiveReferenceLine_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./referenceLines/renderActiveReferenceLine.js */ "./tools/referenceLines/renderActiveReferenceLine.js");
16118/* harmony import */ var _util_wait_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../util/wait.js */ "./util/wait.js");
16119/* harmony import */ var _util_logger_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../util/logger.js */ "./util/logger.js");
16120
16121
16122
16123
16124
16125
16126
16127
16128
16129
16130
16131
16132
16133var logger = Object(_util_logger_js__WEBPACK_IMPORTED_MODULE_12__["getLogger"])('tools:ReferenceLinesTool');
16134/**
16135 * When enabled, this tool will display references lines for each source
16136 * enabledElement in the provided synchronizer. This tool can also be c
16136onfigured
16137 * to use a custom renderer for alternative reference line rendering behavior
16138 *
16139 * TODO: Need to watch for configuration changes to update ToolState
16140 * TODO:
16141 *
16142 * @export @public @class
16143 * @name ReferenceLinesTool
16144 * @classdesc Tool for displaying reference lines of other enabledElements
16145 * @extends Tools.Base.BaseTool
16146 */
16147
16148var ReferenceLinesTool =
16149/*#__PURE__*/
16150function (_BaseTool) {
16151  _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_6___default()(ReferenceLinesTool, _BaseTool);
16152
16153  function ReferenceLinesTool() {
16154    var _this;
16155
16156    var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
16157
16158    _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_2___default()(this, ReferenceLinesTool);
16159
16160    var defaultProps = {
16161      name: 'ReferenceLines',
16162      mixins: ['enabledOrDisabledBinaryTool'],
16163      configuration: {
16164        renderer: _referenceLines_renderActiveReferenceLine_js__WEBPACK_IMPORTED_MODULE_10__["default"]
16165      }
16166    };
16167    _this = _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_4___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_5___default()(ReferenceLinesTool).call(this, props, defaultProps));
16168    _this.renderer = null;
16169    _this.synchronizationContext = null;
16170    return _this;
16171  }
16172
16173  _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_3___default()(ReferenceLinesTool, [{
16174    key: "enabledCallback",
16175    value: function () {
16176      var _enabledCallback = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(
16177      /*#__PURE__*/
16178      _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee(element) {
16179        var _ref,
16180            synchronizationContext,
16181            renderer,
16182            enabledElement,
16183            _args = arguments;
16184
16185        return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee$(_context) {
16186          while (1) {
16187            switch (_context.prev = _context.next) {
16188              case 0:
16189                _ref = _args.length > 1 && _args[1] !== undefined ? _args[1] : {}, synchronizationContext = _ref.synchronizationContext;
16190                renderer = this.configuration.renderer;
16191                _context.next = 4;
16192                return Object(_util_wait_js__WEBPACK_IMPORTED_MODULE_11__["waitForEnabledElementImageToLoad"])(element);
16193
16194              case 4:
16195                enabledElement = _context.sent;
16196
16197                if (!(!enabledElement || !renderer || !synchronizationContext)) {
16198                  _context.next = 8;
16199                  break;
16200                }
16201
16202                // TODO: Unable to add tool state, image never loaded.
16203                // Should we `setToolDisabledForElement` here?
16204                logger.warn("Unable to enable ".concat(this.name, ". Exiting enable callback. Tool will be enabled, but will not render."));
16205                return _context.abrupt("return");
16206
16207              case 8:
16208                this.renderer = renderer;
16209                this.synchronizationContext = synchronizationContext;
16210                this.forceImageUpdate(element);
16211
16212              case 11:
16213              case "end":
16214                return _context.stop();
16215            }
16216          }
16217        }, _callee, this);
16218      }));
16219
16220      function enabledCallback(_x) {
16221        return _enabledCallback.apply(this, arguments);
16222      }
16223
16224      return enabledCallback;
16225    }()
16226  }, {
16227    key: "disabledCallback",
16228    value: function disabledCallback(element) {
16229      this.forceImageUpdate(element);
16230    }
16231  }, {
16232    key: "forceImageUpdate",
16233    value: function forceImageUpdate(element) {
16234      var enabledElement = _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstone.getEnabledElement(element);
16235
16236      if (enabledElement.image) {
16237        _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstone.updateImage(element);
16238      }
16239    }
16240  }, {
16241    key: "renderToolData",
16242    value: function renderToolData(evt) {
16243      var _this2 = this;
16244
16245      var eventData = evt.detail; // No renderer or synch context? Adios
16246
16247      if (!this.renderer || !this.synchronizationContext) {
16248        return;
16249      } // Get the enabled elements associated with this synchronization context and draw them
16250
16251
16252      var enabledElements = this.synchronizationContext.getSourceElements();
16253      var context = Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_9__["getNewContext"])(eventData.canvasContext.canvas);
16254      _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstone.setToPixelCoordinateSystem(eventData.enabledElement, context);
16255      enabledElements.forEach(function (referenceEnabledElement) {
16256        // Don't draw ourselves
16257        if (referenceEnabledElement === evt.currentTarget) {
16258          return;
16259        } // Render it
16260
16261
16262        _this2.renderer(context, eventData, evt.currentTarget, referenceEnabledElement);
16263      });
16264    }
16265  }]);
16266
16267  return ReferenceLinesTool;
16268}(_base_BaseTool_js__WEBPACK_IMPORTED_MODULE_8__["default"]);
16269
16270
16271
16272/***/ }),
16273
16274/***/ "./tools/RotateTool.js":
16275/*!*****************************!*\
16276  !*** ./tools/RotateTool.js ***!
16277  \*****************************/
16278/*! exports provided: default */
16279/***/ (function(module, __webpack_exports__, __webpack_require__) {
16280
16281"use strict";
16282__webpack_require__.r(__webpack_exports__);
16283/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return RotateTool; });
16284/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js");
16285/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
16286/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js");
16287/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
16288/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js");
16289/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
16290/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js");
16291/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
16292/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js");
16293/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__);
16294/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./../externalModules.js */ "./externalModules.js");
16295/* harmony import */ var _base_BaseTool_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./base/BaseTool.js */ "./tools/base/BaseTool.js");
16296/* harmony import */ var _util_angleBetweenPoints_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../util/angleBetweenPoints.js */ "./util/angleBetweenPoints.js");
16297/* harmony import */ var _cursors_index_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./cursors/index.js */ "./tools/cursors/index.js");
16298
16299
16300
16301
16302
16303
16304
16305
16306
16307/**
16308 * @public
16309 * @class RotateTool
16310 * @memberof Tools
16311 *
16312 * @classdesc Tool for rotating the image.
16313 * @extends Tools.Base.BaseTool
16314 */
16315
16316var RotateTool =
16317/*#__PURE__*/
16318function (_BaseTool) {
16319  _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(RotateTool, _BaseTool);
16320
16321  function RotateTool() {
16322    var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
16323
16324    _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, RotateTool);
16325
16326    var defaultProps = {
16327      name: 'Rotate',
16328      strategies: {
16329        default: defaultStrategy,
16330        horizontal: horizontalStrategy,
16331        vertical: verticalStrategy
16332      },
16333      defaultStrategy: 'default',
16334      supportedInteractionTypes: ['Mouse', 'Touch'],
16335      svgCursor: _cursors_index_js__WEBPACK_IMPORTED_MODULE_8__["rotateCursor"]
16336    };
16337    return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(RotateTool).call(this, props, defaultProps));
16338  }
16339
16340  _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(RotateTool, [{
16341    key: "touchDragCallback",
16342    value: function touchDragCallback(evt) {
16343      this.dragCallback(evt);
16344    }
16345  }, {
16346    key: "mouseDragCallback",
16347    value: function mouseDragCallback(evt) {
16348      this.dragCallback(evt);
16349    }
16350  }, {
16351    key: "postMouseDownCallback",
16352    value: function postMouseDownCallback(evt) {
16353      this.initialRotation = evt.detail.viewport.rotation;
16354    }
16355  }, {
16356    key: "dragCallback",
16357    value: function dragCallback(evt) {
16358      evt.detail.viewport.initialRotation = this.initialRotation;
16359      this.applyActiveStrategy(evt, this.configuration);
16360      _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.setViewport(evt.detail.element, evt.detail.viewport);
16361    }
16362  }]);
16363
16364  return RotateTool;
16365}(_base_BaseTool_js__WEBPACK_IMPORTED_MODULE_6__["default"]);
16366
16367
16368
16369var defaultStrategy = function defaultStrategy(evt) {
16370  var eventData = evt.detail;
16371  var element = eventData.element,
16372      viewport = eventData.viewport;
16373  var initialRotation = viewport.initialRotation; // Calculate the center of the image
16374
16375  var rect = element.getBoundingClientRect(element);
16376  var width = element.clientWidth,
16377      height = element.clientHeight;
16378  var initialPoints = {
16379    x: eventData.startPoints.client.x,
16380    y: eventData.startPoints.client.y
16381  };
16382  var scale = viewport.scale,
16383      translation = viewport.translation;
16384  var centerPoints = {
16385    x: rect.left + width / 2 + translation.x * scale,
16386    y: rect.top + height / 2 + translation.y * scale
16387  };
16388  var currentPoints = {
16389    x: eventData.currentPoints.client.x,
16390    y: eventData.currentPoints.client.y
16391  };
16392  var angleInfo = Object(_util_angleBetweenPoints_js__WEBPACK_IMPORTED_MODULE_7__["default"])(centerPoints, initialPoints, currentPoints);
16393
16394  if (angleInfo.direction < 0) {
16395    angleInfo.angle = -angleInfo.angle;
16396  }
16397
16398  viewport.rotation = initialRotation + angleInfo.angle;
16399};
16400
16401var horizontalStrategy = function horizontalStrategy(evt) {
16402  var eventData = evt.detail;
16403  var viewport = eventData.viewport,
16404      deltaPoints = eventData.deltaPoints;
16405  viewport.rotation += deltaPoints.page.x / viewport.scale;
16406};
16407
16408var verticalStrategy = function verticalStrategy(evt) {
16409  var eventData = evt.detail;
16410  var viewport = eventData.viewport,
16411      deltaPoints = eventData.deltaPoints;
16412  viewport.rotation += deltaPoints.page.y / viewport.scale;
16413};
16414
16415/***/ }),
16416
16417/***/ "./tools/RotateTouchTool.js":
16418/*!**********************************!*\
16419  !*** ./tools/RotateTouchTool.js ***!
16420  \**********************************/
16421/*! exports provided: default */
16422/***/ (function(module, __webpack_exports__, __webpack_require__) {
16423
16424"use strict";
16425__webpack_require__.r(__webpack_exports__);
16426/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return RotateTouchTool; });
16427/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js");
16428/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
16429/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js");
16430/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
16431/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js");
16432/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
16433/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js");
16434/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
16435/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js");
16436/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__);
16437/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./../externalModules.js */ "./externalModules.js");
16438/* harmony import */ var _base_BaseTool_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./base/BaseTool.js */ "./tools/base/BaseTool.js");
16439
16440
16441
16442
16443
16444
16445
16446/**
16447 * @public
16448 * @class RotateTouchTool
16449 * @memberof Tools
16450 *
16451 * @classdesc Tool for rotating the image using touch.
16452 * @extends Tools.Base.BaseTool
16453 */
16454
16455var RotateTouchTool =
16456/*#__PURE__*/
16457function (_BaseTool) {
16458  _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(RotateTouchTool, _BaseTool);
16459
16460  function RotateTouchTool() {
16461    var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
16462
16463    _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, RotateTouchTool);
16464
16465    var defaultProps = {
16466      name: 'RotateTouch',
16467      supportedInteractionTypes: ['TouchRotate']
16468    };
16469    return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(RotateTouchTool).call(this, props, defaultProps));
16470  }
16471
16472  _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(RotateTouchTool, [{
16473    key: "touchRotateCallback",
16474    value: function touchRotateCallback(evt) {
16475      var eventData = evt.detail;
16476      var element = eventData.element,
16477          viewport = eventData.viewport,
16478          rotation = eventData.rotation;
16479      viewport.rotation += rotation;
16480      _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.setViewport(element, viewport);
16481    }
16482  }]);
16483
16484  return RotateTouchTool;
16485}(_base_BaseTool_js__WEBPACK_IMPORTED_MODULE_6__["default"]);
16486
16487
16488
16489/***/ }),
16490
16491/***/ "./tools/ScaleOverlayTool.js":
16492/*!***********************************!*\
16493  !*** ./tools/ScaleOverlayTool.js ***!
16494  \***********************************/
16495/*! exports provided: default */
16496/***/ (function(module, __webpack_exports__, __webpack_require__) {
16497
16498"use strict";
16499__webpack_require__.r(__webpack_exports__);
16500/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return ScaleOverlayTool; });
16501/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js");
16502/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
16503/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js");
16504/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
16505/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js");
16506/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
16507/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js");
16508/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
16509/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js");
16510/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__);
16511/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js");
16512/* harmony import */ var _base_BaseTool_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./base/BaseTool.js */ "./tools/base/BaseTool.js");
16513/* harmony import */ var _drawing_index_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../drawing/index.js */ "./drawing/index.js");
16514/* harmony import */ var _stateManagement_toolStyle_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../stateManagement/toolStyle.js */ "./stateManagement/toolStyle.js");
16515/* harmony import */ var _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../stateManagement/toolColors.js */ "./stateManagement/toolColors.js");
16516/* harmony import */ var _util_logger_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../util/logger.js */ "./util/logger.js");
16517
16518
16519
16520
16521
16522
16523 // Drawing
16524
16525
16526
16527
16528
16529var logger = Object(_util_logger_js__WEBPACK_IMPORTED_MODULE_10__["getLogger"])('tools:ScaleOverlayTool');
16530/**
16531 * @public
16532 * @class ScaleOverlayTool
16533 * @memberof Tools
16534 *
16535 * @classdesc Tool for displaying a scale overlay on the image.
16536 * @extends Tools.Base.BaseTool
16537 */
16538
16539var ScaleOverlayTool =
16540/*#__PURE__*/
16541function (_BaseTool) {
16542  _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(ScaleOverlayTool, _BaseTool);
16543
16544  function ScaleOverlayTool() {
16545    var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
16546
16547    _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, ScaleOverlayTool);
16548
16549    var defaultProps = {
16550      name: 'ScaleOverlay',
16551      configuration: {
16552        minorTickLength: 12.5,
16553        majorTickLength: 25
16554      },
16555      mixins: ['enabledOrDisabledBinaryTool']
16556    };
16557    return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(ScaleOverlayTool).call(this, props, defaultProps));
16558  }
16559
16560  _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(ScaleOverlayTool, [{
16561    key: "enabledCallback",
16562    value: function enabledCallback(element) {
16563      this.forceImageUpdate(element);
16564    }
16565  }, {
16566    key: "disabledCallback",
16567    value: function disabledCallback(element) {
16568      this.forceImageUpdate(element);
16569    }
16570  }, {
16571    key: "forceImageUpdate",
16572    value: function forceImageUpdate(element) {
16573      var enabledElement = _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.getEnabledElement(element);
16574
16575      if (enabledElement.image) {
16576        _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.updateImage(element);
16577      }
16578    }
16579  }, {
16580    key: "renderToolData",
16581    value: function renderToolData(evt) {
16582      var eventData = evt.detail;
16583      var context = Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_7__["getNewContext"])(eventData.canvasContext.canvas);
16584      var image = eventData.image,
16585          viewport = eventData.viewport,
16586          element = eventData.element;
16587      var rowPixelSpacing = image.rowPixelSpacing;
16588      var colPixelSpacing = image.columnPixelSpacing;
16589      var imagePlane = _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.metaData.get('imagePlaneModule', image.imageId);
16590
16591      if (imagePlane) {
16592        rowPixelSpacing = imagePlane.rowPixelSpacing || imagePlane.rowImagePixelSpacing;
16593        colPixelSpacing = imagePlane.columnPixelSpacing || imagePlane.colImagePixelSpacing;
16594      } // Check whether pixel spacing is defined
16595
16596
16597      if (!rowPixelSpacing || !colPixelSpacing) {
16598        logger.warn("unable to define rowPixelSpacing or colPixelSpacing from data on ".concat(this.name, "'s renderToolData"));
16599        return;
16600      }
16601
16602      var canvasSize = {
16603        width: context.canvas.width,
16604        height: context.canvas.height
16605      }; // Distance between intervals is 10mm
16606
16607      var verticalIntervalScale = 10.0 / rowPixelSpacing * viewport.scale;
16608      var horizontalIntervalScale = 10.0 / colPixelSpacing * viewport.scale; // 0.1 and 0.05 gives margin to horizontal and vertical lines
16609
16610      var hscaleBounds = computeScaleBounds(canvasSize, 0.25, 0.05);
16611      var vscaleBounds = computeScaleBounds(canvasSize, 0.05, 0.15);
16612
16613      if (!canvasSize.width || !canvasSize.height || !hscaleBounds || !vscaleBounds) {
16614        return;
16615      }
16616
16617      var color = _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_9__["default"].getToolColor();
16618      var lineWidth = _stateManagement_toolStyle_js__WEBPACK_IMPORTED_MODULE_8__["default"].getToolW
16618idth();
16619      var imageAttributes = Object.assign({}, {
16620        hscaleBounds: hscaleBounds,
16621        vscaleBounds: vscaleBounds,
16622        verticalMinorTick: verticalIntervalScale,
16623        horizontalMinorTick: horizontalIntervalScale,
16624        verticalLine: {
16625          start: {
16626            x: vscaleBounds.bottomRight.x,
16627            y: vscaleBounds.topLeft.y
16628          },
16629          end: {
16630            x: vscaleBounds.bottomRight.x,
16631            y: vscaleBounds.bottomRight.y
16632          }
16633        },
16634        horizontalLine: {
16635          start: {
16636            x: hscaleBounds.topLeft.x,
16637            y: hscaleBounds.bottomRight.y
16638          },
16639          end: {
16640            x: hscaleBounds.bottomRight.x,
16641            y: hscaleBounds.bottomRight.y
16642          }
16643        },
16644        color: color,
16645        lineWidth: lineWidth
16646      }, this.configuration);
16647      Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_7__["draw"])(context, function (context) {
16648        Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_7__["setShadow"])(context, imageAttributes); // Draw vertical line
16649
16650        Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_7__["drawLine"])(context, element, imageAttributes.verticalLine.start, imageAttributes.verticalLine.end, {
16651          color: color,
16652          lineWidth: lineWidth
16653        }, 'canvas');
16654        drawVerticalScalebarIntervals(context, element, imageAttributes); // Draw horizontal line
16655
16656        Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_7__["drawLine"])(context, element, imageAttributes.horizontalLine.start, imageAttributes.horizontalLine.end, {
16657          color: color,
16658          lineWidth: lineWidth
16659        }, 'canvas');
16660        drawHorizontalScalebarIntervals(context, element, imageAttributes);
16661      });
16662    }
16663  }]);
16664
16665  return ScaleOverlayTool;
16666}(_base_BaseTool_js__WEBPACK_IMPORTED_MODULE_6__["default"]);
16667/**
16668 * Computes the max bound for scales on the image
16669 * @param  {{width: number, height: number}} canvasSize
16670 * @param  {number} horizontalReduction
16671 * @param  {number} verticalReduction
16672 * @returns {Object.<string, { x:number, y:number }>}
16673 */
16674
16675
16676
16677
16678var computeScaleBounds = function computeScaleBounds(canvasSize, horizontalReduction, verticalReduction) {
16679  var hReduction = horizontalReduction * Math.min(1000, canvasSize.width);
16680  var vReduction = verticalReduction * Math.min(1000, canvasSize.height);
16681  var canvasBounds = {
16682    left: hReduction,
16683    top: vReduction,
16684    width: canvasSize.width - 2 * hReduction,
16685    height: canvasSize.height - 2 * vReduction
16686  };
16687  return {
16688    topLeft: {
16689      x: canvasBounds.left,
16690      y: canvasBounds.top
16691    },
16692    bottomRight: {
16693      x: canvasBounds.left + canvasBounds.width,
16694      y: canvasBounds.top + canvasBounds.height
16695    }
16696  };
16697};
16698/**
16699 * @param {CanvasRenderingContext2D} context
16700 * @param {HTMLElement} element
16701 * @param {Object} imageAttributes
16702 * @returns {void}
16703 */
16704
16705
16706var drawVerticalScalebarIntervals = function drawVerticalScalebarIntervals(context, element, imageAttributes) {
16707  var i = 0;
16708
16709  while (imageAttributes.verticalLine.start.y + i * imageAttributes.verticalMinorTick <= imageAttributes.vscaleBounds.bottomRight.y) {
16710    var color = imageAttributes.color,
16711        lineWidth = imageAttributes.lineWidth;
16712    var startPoint = {
16713      x: imageAttributes.verticalLine.start.x,
16714      y: imageAttributes.verticalLine.start.y + i * imageAttributes.verticalMinorTick
16715    };
16716    var endPoint = {
16717      x: 0,
16718      y: imageAttributes.verticalLine.start.y + i * imageAttributes.verticalMinorTick
16719    };
16720
16721    if (i % 5 === 0) {
16722      endPoint.x = imageAttributes.verticalLine.start.x - imageAttributes.majorTickLength;
16723    } else {
16724      endPoint.x = imageAttributes.verticalLine.start.x - imageAttributes.minorTickLength;
16725    }
16726
16727    Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_7__["drawLine"])(context, element, startPoint, endPoint, {
16728      color: color,
16729      lineWidth: lineWidth
16730    }, 'canvas');
16731    i++;
16732  }
16733};
16734/**
16735 * @param {CanvasRenderingContext2D} context
16736 * @param {HTMLElement} element
16737 * @param {Object} imageAttributes
16738 * @returns {void}
16739 */
16740
16741
16742var drawHorizontalScalebarIntervals = function drawHorizontalScalebarIntervals(context, element, imageAttributes) {
16743  var i = 0;
16744
16745  while (imageAttributes.horizontalLine.start.x + i * imageAttributes.horizontalMinorTick <= imageAttributes.hscaleBounds.bottomRight.x) {
16746    var color = imageAttributes.color,
16747        lineWidth = imageAttributes.lineWidth;
16748    var startPoint = {
16749      x: imageAttributes.horizontalLine.start.x + i * imageAttributes.horizontalMinorTick,
16750      y: imageAttributes.horizontalLine.start.y
16751    };
16752    var endPoint = {
16753      x: imageAttributes.horizontalLine.start.x + i * imageAttributes.horizontalMinorTick,
16754      y: 0
16755    };
16756
16757    if (i % 5 === 0) {
16758      endPoint.y = imageAttributes.horizontalLine.start.y - imageAttributes.majorTickLength;
16759    } else {
16760      endPoint.y = imageAttributes.horizontalLine.start.y - imageAttributes.minorTickLength;
16761    }
16762
16763    Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_7__["drawLine"])(context, element, startPoint, endPoint, {
16764      color: color,
16765      lineWidth: lineWidth
16766    }, 'canvas');
16767    i++;
16768  }
16769};
16770
16771/***/ }),
16772
16773/***/ "./tools/StackScrollMouseWheelTool.js":
16774/*!********************************************!*\
16775  !*** ./tools/StackScrollMouseWheelTool.js ***!
16776  \********************************************/
16777/*! exports provided: default */
16778/***/ (function(module, __webpack_exports__, __webpack_require__) {
16779
16780"use strict";
16781__webpack_require__.r(__webpack_exports__);
16782/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return StackScrollMouseWheelTool; });
16783/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js");
16784/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
16785/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js");
16786/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
16787/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js");
16788/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
16789/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js");
16790/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
16791/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js");
16792/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__);
16793/* harmony import */ var _base_BaseTool_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./base/BaseTool.js */ "./tools/base/BaseTool.js");
16794/* harmony import */ var _util_scroll_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../util/scroll.js */ "./util/scroll.js");
16795
16796
16797
16798
16799
16800
16801
16802/**
16803 * @public
16804 * @class StackScrollMouseWheelTool
16805 * @memberof Tools
16806 *
16807 * @classdesc Tool for scrolling through a series using the mouse wheel.
16808 * @extends Tools.Base.BaseTool
16809 */
16810
16811var StackScrollMouseWheelTool =
16812/*#__PURE__*/
16813function (_BaseTool) {
16814  _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(StackScrollMouseWheelTool, _BaseTool);
16815
16816  function StackScrollMouseWheelTool() {
16817    var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
16818
16819    _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, StackScrollMouseWheelTool);
16820
16821    var defaultProps = {
16822      name: 'StackScrollMouseWheel',
16823      supportedInteractionTypes: ['MouseWheel'],
16824      configuration: {
16825        loop: true,
16826        allowSkipping: true,
16827        invert: false
16828      }
16829    };
16830    return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(StackScrollMouseWheelTool).call(this, props, defaultProps));
16831  }
16832
16833  _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(StackScrollMouseWheelTool, [{
16834    key: "mouseWheelCallback",
16835    value: function mouseWheelCallback(evt) {
16836      var _evt$detail = evt.detail,
16837          images = _evt$detail.direction,
16838          element = _evt$detail.element;
16839      var _this$configuration = this.configuration,
16840          loop = _this$configuration.loop,
16841          allowSkipping = _this$configuration.allowSkipping,
16842          invert = _this$configuration.invert;
16843      var direction = invert ? -images : images;
16844      Object(_util_scroll_js__WEBPACK_IMPORTED_MODULE_6__["default"])(element, direction, loop, allowSkipping);
16845    }
16846  }]);
16847
16848  return StackScrollMouseWheelTool;
16849}(_base_BaseTool_js__WEBPACK_IMPORTED_MODULE_5__["default"]);
16850
16851
16852
16853/***/ }),
16854
16855/***/ "./tools/StackScrollMultiTouchTool.js":
16856/*!********************************************!*\
16857  !*** ./tools/StackScrollMultiTouchTool.js ***!
16858  \********************************************/
16859/*! exports provided: default */
16860/***/ (function(module, __webpack_exports__, __webpack_require__) {
16861
16862"use strict";
16863__webpack_require__.r(__webpack_exports__);
16864/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return StackScrollMultiTouchTool; });
16865/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js");
16866/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
16867/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js");
16868/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
16869/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js");
16870/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
16871/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js");
16872/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
16873/* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/assertThisInitialized */ "../node_modules/@babel/runtime/helpers/assertThisInitialized.js");
16874/* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4__);
16875/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js");
16876/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__);
16877/* harmony import */ var _base_BaseTool_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./base/BaseTool.js */ "./tools/base/BaseTool.js");
16878/* harmony import */ var _util_scroll_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../util/scroll.js */ "./util/scroll.js");
16879/* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../stateManagement/toolState.js */ "./stateManagement/toolState.js");
16880/* harmony import */ var _toolOptions_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../toolOptions.js */ "./toolOptions.js");
16881
16882
16883
16884
16885
16886
16887
16888
16889
16890
16891/**
16892 * @public
16893 * @class StackScrollMultiTouchTool
16894 * @memberof Tools
16895 *
16896 * @classdesc Tool for scrolling through a series using multi-touch.
16897 * @extends Tools.Base.BaseTool
16898 */
16899
16900var StackScrollMultiTouchTool =
16901/*#__PURE__*/
16902function (_BaseTool) {
16903  _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default()(StackScrollMultiTouchTool, _BaseTool);
16904
16905  function StackScrollMultiTouchTool() {
16906    var _this;
16907
16908    var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
16909
16910    _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, StackScrollMultiTouchTool);
16911
16912    var defaultProps = {
16913      name: 'StackScrollMultiTouch',
16914      supportedInteractionTypes: ['MultiTouch'],
16915      configuration: {
16916        loop: false,
16917        allowSkipping: true,
16918        touchPointers: 3
16919      }
16920    };
16921    _this = _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(StackScrollMultiTouchTool).call(this, props, defaultProps));
16922    _this.multiTouchDragCallback = _this._dragCallback.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this));
16923    return _this;
16924  }
16925
16926  _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(StackScrollMultiTouchTool, [{
16927    key: "_dragCallback",
16928    value: function _dragCallback(evt) {
16929      var eventData = evt.detail;
16930
16931      if (eventData.numPointers === this.configuration.touchPointers) {
16932        var element = eventData.element,
16933            deltaPoints = eventData.deltaPoints;
16934        var _this$configuration = this.configuration,
16935            loop = _this$configuration.loop,
16936            allowSkipping = _this$configuration.allowSkipping;
16937        var options = Object(_toolOptions_js__WEBPACK_IMPORTED_MODULE_9__["getToolOptions"])(this.name, element);
16938
16939        var pixelsPerImage = this._getPixelPerImage(element);
16940
16941        var deltaY = this._getDeltaY(element, deltaPoints.page.y);
16942
16943        if (!pixelsPerImage) {
16944          return;
16945        }
16946
16947        if (Math.abs(deltaY) >= pixelsPerImage) {
16948          var imageIdIndexOffset = Math.round(deltaY / pixelsPerImage);
16949          Object(_util_scroll_js__WEBPACK_IMPORTED_MODULE_7__["default"])(element, imageIdIndexOffset, loop, allowSkipping);
16950          options.deltaY = deltaY % pixelsPerImage;
16951        } else {
16952          options.deltaY = deltaY;
16953        }
16954
16955        Object(_toolOptions_js__WEBPACK_IMPORTED_MODULE_9__["setToolOptions"])(this.name, element, options);
16956      }
16957    }
16958  }, {
16959    key: "_getDeltaY",
16960    value: function _getDeltaY(element, deltaPointsY) {
16961      var options = Object(_toolOptions_js__WEBPACK_IMPORTED_MODULE_9__["getToolOptions"])(this.name, element);
16962      var deltaY = options.deltaY || 0;
16963      return deltaY + deltaPointsY;
16964    }
16965  }, {
16966    key: "_getPixelPerImage",
16967    value: function _getPixelPerImage(element) {
16968      var toolData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_8__["getToolState"])(element, 'stack');
16969
16970      if (!toolData || !toolData.data || !toolData.data.length) {
16971        return;
16972      }
16973
16974      var stackData = toolData.data[0];
16975      var stackScrollSpeed = this.configuration.stackScrollSpeed; // The Math.max here makes it easier to mouseDrag-scroll small or really large image stacks
16976
16977      return stackScrollSpeed || Math.max(2, element.offsetHeight / Math.max(stackData.imageIds.length, 8));
16978    }
16979  }]);
16980
16981  return StackScrollMultiTouchTool;
16982}(_base_BaseTool_js__WEBPACK_IMPORTED_MODULE_6__["default"]);
16983
16984
16985
16986/***/ }),
16987
16988/***/ "./tools/StackScrollTool.js":
16989/*!**********************************!*\
16990  !*** ./tools/StackScrollTool.js ***!
16991  \**********************************/
16992/*! exports provided: default */
16993/***/ (function(module, __webpack_exports__, __webpack_require__) {
16994
16995"use strict";
16996__webpack_require__.r(__webpack_exports__);
16997/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return StackScrollTool; });
16998/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js");
16999/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
17000/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js");
17001/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
17002/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js");
17003/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
17004/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js");
17005/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
17006/* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/assertThisInitialized */ "../node_modules/@babel/runtime/helpers/assertThisInitialized.js");
17007/* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4__);
17008/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js");
17009/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__);
17010/* harmony import */ var _base_BaseTool_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./base/BaseTool.js */ "./tools/base/BaseTool.js");
17011/* harmony import */ var _util_scroll_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../util/scroll.js */ "./util/scroll.js");
17012/* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../stateManagement/toolState.js */ "./stateManagement/toolState.js");
17013/* harmony import */ var _toolOptions_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../toolOptions.js */ "./toolOptions.js");
17014/* harmony import */ var _cursors_index_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./cursors/index.js */ "./tools/cursors/index.js");
17015
17016
17017
17018
17019
17020
17021
17022
17023
17024
17025
17026/**
17027 * @public
17028 * @class StackScrollTool
17029 * @memberof Tools
17030 *
17031 * @classdesc Tool for scrolling through a series.
17032 * @extends Tools.Base.BaseTool
17033 */
17034
17035var StackScrollTool =
17036/*#__PURE__*/
17037function (_BaseTool) {
17038  _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default()(StackScrollTool, _BaseTool);
17039
17040  function StackScrollTool() {
17041    var _this;
17042
17043    var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
17044
17045    _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, StackScrollTool);
17046
17047    var defaultProps = {
17048      name: 'StackScroll',
17049      supportedInteractionTypes: ['Mouse', 'Touch'],
17050      configuration: {
17051        loop: true,
17052        allowSkipping: true
17053      },
17054      svgCursor: _cursors_index_js__WEBPACK_IMPORTED_MODULE_10__["stackScrollCursor"]
17055    };
17056    _this = _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(StackScrollTool).
17056call(this, props, defaultProps));
17057    _this.mouseDragCallback = _this._dragCallback.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this));
17058    _this.touchDragCallback = _this._dragCallback.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this));
17059    return _this;
17060  }
17061
17062  _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(StackScrollTool, [{
17063    key: "_dragCallback",
17064    value: function _dragCallback(evt) {
17065      var eventData = evt.detail;
17066      var element = eventData.element,
17067          deltaPoints = eventData.deltaPoints;
17068      var _this$configuration = this.configuration,
17069          loop = _this$configuration.loop,
17070          allowSkipping = _this$configuration.allowSkipping;
17071      var options = Object(_toolOptions_js__WEBPACK_IMPORTED_MODULE_9__["getToolOptions"])(this.name, element);
17072
17073      var pixelsPerImage = this._getPixelPerImage(element);
17074
17075      var deltaY = this._getDeltaY(element, deltaPoints.page.y);
17076
17077      if (!pixelsPerImage) {
17078        return;
17079      }
17080
17081      if (Math.abs(deltaY) >= pixelsPerImage) {
17082        var imageIdIndexOffset = Math.round(deltaY / pixelsPerImage);
17083        Object(_util_scroll_js__WEBPACK_IMPORTED_MODULE_7__["default"])(element, imageIdIndexOffset, loop, allowSkipping);
17084        options.deltaY = deltaY % pixelsPerImage;
17085      } else {
17086        options.deltaY = deltaY;
17087      }
17088
17089      Object(_toolOptions_js__WEBPACK_IMPORTED_MODULE_9__["setToolOptions"])(this.name, element, options);
17090    }
17091  }, {
17092    key: "_getDeltaY",
17093    value: function _getDeltaY(element, deltaPointsY) {
17094      var options = Object(_toolOptions_js__WEBPACK_IMPORTED_MODULE_9__["getToolOptions"])(this.name, element);
17095      var deltaY = options.deltaY || 0;
17096      return deltaY + deltaPointsY;
17097    }
17098  }, {
17099    key: "_getPixelPerImage",
17100    value: function _getPixelPerImage(element) {
17101      var toolData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_8__["getToolState"])(element, 'stack');
17102
17103      if (!toolData || !toolData.data || !toolData.data.length) {
17104        return;
17105      }
17106
17107      var stackData = toolData.data[0];
17108      var stackScrollSpeed = this.configuration.stackScrollSpeed; // The Math.max here makes it easier to mouseDrag-scroll small or really large image stacks
17109
17110      return stackScrollSpeed || Math.max(2, element.offsetHeight / Math.max(stackData.imageIds.length, 8));
17111    }
17112  }]);
17113
17114  return StackScrollTool;
17115}(_base_BaseTool_js__WEBPACK_IMPORTED_MODULE_6__["default"]);
17116
17117
17118
17119/***/ }),
17120
17121/***/ "./tools/WwwcRegionTool.js":
17122/*!*********************************!*\
17123  !*** ./tools/WwwcRegionTool.js ***!
17124  \*********************************/
17125/*! exports provided: default */
17126/***/ (function(module, __webpack_exports__, __webpack_require__) {
17127
17128"use strict";
17129__webpack_require__.r(__webpack_exports__);
17130/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return WwwcRegionTool; });
17131/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js");
17132/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
17133/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js");
17134/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
17135/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js");
17136/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
17137/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js");
17138/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
17139/* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/assertThisInitialized */ "../node_modules/@babel/runtime/helpers/assertThisInitialized.js");
17140/* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4__);
17141/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js");
17142/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__);
17143/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js");
17144/* harmony import */ var _base_BaseTool_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./base/BaseTool.js */ "./tools/base/BaseTool.js");
17145/* harmony import */ var _drawing_index_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../drawing/index.js */ "./drawing/index.js");
17146/* harmony import */ var _util_clip_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../util/clip.js */ "./util/clip.js");
17147/* harmony import */ var _util_getLuminance_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../util/getLuminance.js */ "./util/getLuminance.js");
17148/* harmony import */ var _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../stateManagement/toolColors.js */ "./stateManagement/toolColors.js");
17149/* harmony import */ var _cursors_index_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./cursors/index.js */ "./tools/cursors/index.js");
17150
17151
17152
17153
17154
17155
17156
17157 // Drawing
17158
17159
17160
17161
17162
17163
17164/**
17165 * @public
17166 * @class WwwcRegionTool
17167 * @memberof Tools
17168 *
17169 * @classdesc Tool for setting wwwc based on a rectangular region.
17170 * @extends Tools.Base.BaseTool
17171 */
17172
17173var WwwcRegionTool =
17174/*#__PURE__*/
17175function (_BaseTool) {
17176  _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default()(WwwcRegionTool, _BaseTool);
17177
17178  /** @inheritdoc */
17179  function WwwcRegionTool() {
17180    var _this;
17181
17182    var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
17183
17184    _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, WwwcRegionTool);
17185
17186    var defaultProps = {
17187      name: 'WwwcRegion',
17188      supportedInteractionTypes: ['Mouse', 'Touch'],
17189      configuration: {
17190        minWindowWidth: 10
17191      },
17192      svgCursor: _cursors_index_js__WEBPACK_IMPORTED_MODULE_12__["wwwcRegionCursor"]
17193    };
17194    _this = _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(WwwcRegionTool).call(this, props, defaultProps));
17195
17196    _this._resetHandles(); //
17197    // Touch
17198    //
17199
17200    /** @inheritdoc */
17201
17202
17203    _this.postTouchStartCallback = _this._startOutliningRegion.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this));
17204    /** @inheritdoc */
17205
17206    _this.touchDragCallback = _this._setHandlesAndUpdate.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this));
17207    /** @inheritdoc */
17208
17209    _this.touchEndCallback = _this._applyStrategy.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this)); //
17210    // MOUSE
17211    //
17212
17213    /** @inheritdoc */
17214
17215    _this.postMouseDownCallback = _this._startOutliningRegion.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this));
17216    /** @inheritdoc */
17217
17218    _this.mouseClickCallback = _this._startOutliningRegion.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this));
17219    /** @inheritdoc */
17220
17221    _this.mouseDragCallback = _this._setHandlesAndUpdate.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this));
17222    /** @inheritdoc */
17223
17224    _this.mouseMoveCallback = _this._setHandlesAndUpdate.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this));
17225    /** @inheritdoc */
17226
17227    _this.mouseUpCallback = _this._applyStrategy.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this));
17228    return _this;
17229  }
17230  /**
17231   * Render hook: draws the WWWCRegion's "box" when selecting
17232   *
17233   * @param {Cornerstone.event#cornerstoneimagerendered} evt cornerstoneimagerendered event
17234   * @memberof Tools.WwwcRegionTool
17235   * @returns {void}
17236   */
17237
17238
17239  _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(WwwcRegionTool, [{
17240    key: "renderToolData",
17241    value: function renderToolData(evt) {
17242      var _this2 = this;
17243
17244      var eventData = evt.detail;
17245      var element = eventData.element;
17246      var color = _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_11__["default"].getColorIfActive({
17247        active: true
17248      });
17249      var context = Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_8__["getNewContext"])(eventData.canvasContext.canvas);
17250      Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_8__["draw"])(context, function (context) {
17251        Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_8__["drawRect"])(context, element, _this2.handles.start, _this2.handles.end, {
17252          color: color
17253        });
17254      });
17255    }
17256    /**
17257     * Sets the start handle point and claims the eventDispatcher event
17258     *
17259     * @private
17260     * @param {*} evt // mousedown, touchstart, click
17261     * @returns {Boolean} True
17262     */
17263
17264  }, {
17265    key: "_startOutliningRegion",
17266    value: function _startOutliningRegion(evt) {
17267      var consumeEvent = true;
17268      var element = evt.detail.element;
17269      var image = evt.detail.currentPoints.image;
17270
17271      if (_isEmptyObject(this.handles.start)) {
17272        this.handles.start = image;
17273      } else {
17274        this.handles.end = image;
17275
17276        this._applyStrategy(evt);
17277      }
17278
17279      _externalModules_js__WEBPACK_IMPORTED_MODULE_6__["default"].cornerstone.updateImage(element);
17280      return consumeEvent;
17281    }
17282    /**
17283     * This function will update the handles and updateImage to force re-draw
17284     *
17285     * @private
17286     * @method _setHandlesAndUpdate
17287     * @param {(CornerstoneTools.event#TOUCH_DRAG|CornerstoneTools.event#MOUSE_DRAG|CornerstoneTools.event#MOUSE_MOVE)} evt  Interaction event emitted by an enabledElement
17288     * @returns {void}
17289     */
17290
17291  }, {
17292    key: "_setHandlesAndUpdate",
17293    value: function _setHandlesAndUpdate(evt) {
17294      var element = evt.detail.element;
17295      var image = evt.detail.currentPoints.image;
17296      this.handles.end = image;
17297      _externalModules_js__WEBPACK_IMPORTED_MODULE_6__["default"].cornerstone.updateImage(element);
17298    }
17299    /**
17300     * Event handler for MOUSE_UP/TOUCH_END during handle drag event loop.
17301     *
17302     * @private
17303     * @method _applyStrategy
17304     * @param {(CornerstoneTools.event#MOUSE_UP|CornerstoneTools.event#TOUCH_END)} evt Interaction event emitted by an enabledElement
17305     * @returns {void}
17306     */
17307
17308  }, {
17309    key: "_applyStrategy",
17310    value: function _applyStrategy(evt) {
17311      if (_isEmptyObject(this.handles.start) || _isEmptyObject(this.handles.end)) {
17312        return;
17313      }
17314
17315      evt.detail.handles = this.handles;
17316
17317      _applyWWWCRegion(evt, this.configuration);
17318
17319      this._resetHandles();
17320    }
17321    /**
17322     * Sets the start and end handle points to empty objects
17323     *
17324     * @private
17325     * @method _resetHandles
17326     * @returns {undefined}
17327     */
17328
17329  }, {
17330    key: "_resetHandles",
17331    value: function _resetHandles() {
17332      this.handles = {
17333        start: {},
17334        end: {}
17335      };
17336    }
17337  }]);
17338
17339  return WwwcRegionTool;
17340}(_base_BaseTool_js__WEBPACK_IMPORTED_MODULE_7__["default"]);
17341/**
17342 * Helper to determine if an object has no keys and is the correct type (is empty)
17343 *
17344 * @private
17345 * @function _isEmptyObject
17346 * @param {Object} obj The object to check
17347 * @returns {Boolean} true if the object is empty
17348 */
17349
17350
17351
17352
17353var _isEmptyObject = function _isEmptyObject(obj) {
17354  return Object.keys(obj).length === 0 && obj.constructor === Object;
17355};
17356/**
17357 * Calculates the minimum and maximum value in the given pixel array
17358 * and updates the viewport of the element in the event.
17359 *
17360 * @private
17361 * @method _applyWWWCRegion
17362 * @param {(CornerstoneTools.event#MOUSE_UP|CornerstoneTools.event#TOUCH_END)} evt Interaction event emitted by an enabledElement
17363 * @param {Object} config The tool's configuration object
17364 * @returns {void}
17365 */
17366
17367
17368var _applyWWWCRegion = function _applyWWWCRegion(evt, config) {
17369  var eventData = evt.detail;
17370  var image = eventData.image,
17371      element = eventData.element;
17372  var _evt$detail$handles = evt.detail.handles,
17373      startPoint = _evt$detail$handles.start,
17374      endPoint = _evt$detail$handles.end; // Get the rectangular region defined by the handles
17375
17376  var left = Math.min(startPoint.x, endPoint.x);
17377  var top = Math.min(startPoint.y, endPoint.y);
17378  var width = Math.abs(startPoint.x - endPoint.x);
17379  var height = Math.abs(startPoint.y - endPoint.y); // Bound the rectangle so we don't get undefined pixels
17380
17381  left = Object(_util_clip_js__WEBPACK_IMPORTED_MODULE_9__["default"])(left, 0, image.width);
17382  top = Object(_util_clip_js__WEBPACK_IMPORTED_MODULE_9__["default"])(top, 0, image.height);
17383  width = Math.floor(Math.min(width, Math.abs(image.width - left)));
17384  height = Math.floor(Math.min(height, Math.abs(image.height - top))); // Get the pixel data in the rectangular region
17385
17386  var pixelLuminanceData = Object(_util_getLuminance_js__WEBPACK_IMPORTED_MODULE_10__["default"])(element, left, top, width, height); // Calculate the minimum and maximum pixel values
17387
17388  var minMaxMean = _calculateMinMaxMean(pixelLuminanceData, image.minPixelValue, image.maxPixelValue); // Adjust the viewport window width and center based on the calculated values
17389
17390
17391  var viewport = eventData.viewport;
17392
17393  if (config.minWindowWidth === undefined) {
17394    config.minWindowWidth = 10;
17395  }
17396
17397  viewport.voi.windowWidth = Math.max(Math.abs(minMaxMean.max - minMaxMean.min), config.minWindowWidth);
17398  viewport.voi.windowCenter = minMaxMean.mean;
17399  _externalModules_js__WEBPACK_IMPORTED_MODULE_6__["default"].cornerstone.setViewport(element, viewport);
17400  _externalModules_js__WEBPACK_IMPORTED_MODULE_6__["default"].cornerstone.updateImage(element);
17401};
17402/**
17403 * Calculates the minimum, maximum, and mean value in the given pixel array
17404 *
17405 * @private
17406 * @method _calculateMinMaxMean
17407 * @param {number[]} pixelLuminance array of pixel luminance values
17408 * @param {number} globalMin starting "min" valie
17409 * @param {bumber} globalMax starting "max" value
17410 * @returns {Object} {min: number, max: number, mean: number }
17411 */
17412
17413
17414var _calculateMinMaxMean = function _calculateMinMaxMean(pixelLuminance, globalMin, globalMax) {
17415  var numPixels = pixelLuminance.length;
17416  var min = globalMax;
17417  var max = globalMin;
17418  var sum = 0;
17419
17420  if (numPixels < 2) {
17421    return {
17422      min: min,
17423      max: max,
17424      mean: (globalMin + globalMax) / 2
17425    };
17426  }
17427
17428  for (var index = 0; index < numPixels; index++) {
17429    var spv = pixelLuminance[index];
17430    min = Math.min(min, spv);
17431    max = Math.max(max, spv);
17432    sum += spv;
17433  }
17434
17435  return {
17436    min: min,
17437    max: max,
17438    mean: sum / numPixels
17439  };
17440};
17441
17442/***/ }),
17443
17444/***/ "./tools/WwwcTool.js":
17445/*!***************************!*\
17446  !*** ./tools/WwwcTool.js ***!
17447  \***************************/
17448/*! exports provided: default */
17449/***/ (function(module, __webpack_exports__, __webpack_require__) {
17450
17451"use strict";
17452__webpack_require__.r(__webpack_exports__);
17453/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return WwwcTool; });
17454/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js");
17455/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
17456/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js");
17457/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
17458/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js");
17459/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
17460/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js");
17461/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
17462/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js");
17463/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__);
17464/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js");
17465/* harmony import */ var _base_BaseTool_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./base/BaseTool.js */ "./tools/base/BaseTool.js");
17466/* harmony import */ var _cursors_index_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./cursors/index.js */ "./tools/cursors/index.js");
17467
17468
17469
17470
17471
17472
17473
17474
17475/**
17476 * @public
17477 * @class WwwcTool
17478 * @memberof Tools
17479 *
17480 * @classdesc Tool for setting wwwc by dragging with mouse/touch.
17481 * @extends Tools.Base.BaseTool
17482 */
17483
17484var WwwcTool =
17485/*#__PURE__*/
17486function (_BaseTool) {
17487  _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(WwwcTool, _BaseTool);
17488
17489  function WwwcTool() {
17490    var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
17491
17492    _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, WwwcTool);
17493
17494    var defaultProps = {
17495      name: 'Wwwc',
17496      strategies: {
17497        basicLevelingStrategy: basicLevelingStrategy
17498      },
17499      supportedInteractionTypes: ['Mouse', 'Touch'],
17500      configuration: {
17501        orientation: 0
17502      },
17503      svgCursor: _cursors_index_js__WEBPACK_IMPORTED_MODULE_7__["wwwcCursor"]
17504    };
17505    return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(WwwcTool).call(this, props, defaultProps));
17506  }
17507
17508  _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(WwwcTool, [{
17509    key: "mouseDragCallback",
17510    value: function mouseDragCallback(evt) {
17511      this.applyActiveStrategy(evt);
17512      _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.setViewport(evt.detail.element, evt.detail.viewport);
17513    }
17514  }, {
17515    key: "touchDragCallback",
17516    value: function touchDragCallback(evt) {
17517      // Prevent CornerstoneToolsTouchStartActive from killing any press events
17518      evt.stopImmediatePropagation();
17519      this.applyActiveStrategy(evt);
17520      _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.setViewport(evt.detail.element, evt.detail.viewport);
17521    }
17522  }]);
17523
17524  return WwwcTool;
17525}(_base_BaseTool_js__WEBPACK_IMPORTED_MODULE_6__["default"]);
17526/**
17527 * Here we normalize the ww/wc adjustments so the same number of on screen pixels
17528 * adjusts the same percentage of the dynamic range of the image.  This is needed to
17529 * provide consistency for the ww/wc tool regardless of the dynamic range (e.g. an 8 bit
17530 * image will feel the same as a 16 bit image would)
17531 *
17532 * @param {Object} evt
17533 * @param {Object} { orienttion }
17534 * @returns {void}
17535 */
17536
17537
17538
17539
17540function basicLevelingStrategy(evt, _ref) {
17541  var orientation = _ref.orientation;
17542  var eventData = evt.detail;
17543  var maxVOI = eventData.image.maxPixelValue * eventData.image.slope + eventData.image.intercept;
17544  var minVOI = eventData.image.minPixelValue * eventData.image.slope + eventData.image.intercept;
17545  var imageDynamicRange = maxVOI - minVOI;
17546  var multiplier = imageDynamicRange / 1024;
17547  var deltaX = eventData.deltaPoints.page.x * multiplier;
17548  var deltaY = eventData.deltaPoints.page.y * multiplier;
17549
17550  if (orientation === 0) {
17551    eventData.viewport.voi.windowWidth += deltaX;
17552    eventData.viewport.voi.windowCenter += deltaY;
17553  } else {
17554    eventData.viewport.voi.windowWidth += deltaY;
17555    eventData.viewport.voi.windowCenter += deltaX;
17556  }
17557}
17558
17559/***/ }),
17560
17561/***/ "./tools/ZoomMouseWheelTool.js":
17562/*!*************************************!*\
17563  !*** ./tools/ZoomMouseWheelTool.js ***!
17564  \*************************************/
17565/*! exports provided: default */
17566/***/ (function(module, __webpack_exports__, __webpack_require__) {
17567
17568"use strict";
17569__webpack_require__.r(__webpack_exports__);
17570/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return ZoomMouseWheelTool; });
17571/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js");
17572/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
17573/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js");
17574/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
17575/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js");
17576/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
17577/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js");
17578/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
17579/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js");
17580/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__);
17581/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./../externalModules.js */ "./externalModules.js");
17582/* harmony import */ var _base_BaseTool_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./base/BaseTool.js */ "./tools/base/BaseTool.js");
17583/* harmony import */ var _util_zoom_index_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../util/zoom/index.js */ "./util/zoom/index.js");
17584
17585
17586
17587
17588
17589
17590
17591
17592/**
17593 * @public
17594 * @class ZoomMouseWheelTool
17595 * @memberof Tools
17596 *
17597 * @classdesc Tool for changing magnification with the mouse wheel.
17598 * @extends Tools.Base.BaseTool
17599 */
17600
17601var ZoomMouseWheelTool =
17602/*#__PURE__*/
17603function (_BaseTool) {
17604  _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(ZoomMouseWheelTool, _BaseTool);
17605
17606  function ZoomMouseWheelTool() {
17607    var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
17608
17609    _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, ZoomMouseWheelTool);
17610
17611    var defaultProps = {
17612      name: 'ZoomMouseWheel',
17613      supportedInteractionTypes: ['MouseWheel'],
17614      configuration: {
17615        minScale: 0.25,
17616        maxScale: 20.0,
17617        invert: false
17618      }
17619    };
17620    return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(ZoomMouseWheelTool).call(this, props, defaultProps));
17621  }
17622
17623  _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(ZoomMouseWheelTool, [{
17624    key: "mouseWheelCallback",
17625    value: function mouseWheelCallback(evt) {
17626      var _evt$detail = evt.detail,
17627          element = _evt$detail.element,
17628          viewport = _evt$detail.viewport,
17629          spinY = _evt$detail.spinY;
17630      var _this$configuration = this.configuration,
17631          invert = _this$configuration.invert,
17632          maxScale = _this$configuration.maxScale,
17633          minScale = _this$configuration.minScale;
17634      var ticks = invert ? spinY / 4 : -spinY / 4;
17635      var updatedViewport = Object(_util_zoom_index_js__WEBPACK_IMPORTED_MODULE_7__["changeViewportScale"])(viewport, ticks, {
17636        maxScale: maxScale,
17637        minScale: minScale
17638      });
17639      _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.setViewport(element, updatedViewport);
17640    }
17641  }]);
17642
17643  return ZoomMouseWheelTool;
17644}(_base_BaseTool_js__WEBPACK_IMPORTED_MODULE_6__["default"]);
17645
17646
17647
17648/***/ }),
17649
17650/***/ "./tools/ZoomTool.js":
17651/*!***************************!*\
17652  !*** ./tools/ZoomTool.js ***!
17653  \***************************/
17654/*! exports provided: default */
17655/***/ (function(module, __webpack_exports__, __webpack_require__) {
17656
17657"use strict";
17658__webpack_require__.r(__webpack_exports__);
17659/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return ZoomTool; });
17660/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js");
17661/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
17662/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js");
17663/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
17664/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js");
17665/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
17666/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js");
17667/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
17668/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js");
17669/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__);
17670/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js");
17671/* harmony import */ var _base_BaseTool_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./base/BaseTool.js */ "./tools/base/BaseTool.js");
17672/* harmony import */ var _util_clip_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../util/clip.js */ "./util/clip.js");
17673/* harmony import */ var _util_zoom_index_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../util/zoom/index.js */ "./util/zoom/index.js");
17674/* harmony import */ var _cursors_index_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./cursors/index.js */ "./tools/cursors/index.js");
17675
17676
17677
17678
17679
17680
17681
17682
17683
17684
17685var correctShift = _util_zoom_index_js__WEBPACK_IMPORTED_MODULE_8__["default"].correctShift,
17686    changeViewportScale = _util_zoom_index_js__WEBPACK_IMPORTED_MODULE_8__["default"].changeViewportScale;
17687/**
17688 * @public
17689 * @class ZoomTool
17690 * @memberof Tools
17691 *
17692 * @classdesc Tool for changing magnification.
17693 * @extends Tools.Base.BaseTool
17694 */
17695
17696var ZoomTool =
17697/*#__PURE__*/
17698function (_BaseTool) {
17699  _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(ZoomTool, _BaseTool);
17700
17701  function ZoomTool() {
17702    var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
17703
17704    _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, ZoomTool);
17705
17706    var defaultProps = {
17707      name: 'Zoom',
17708      strategies: {
17709        default: defaultStrategy,
17710        translate: translateStrategy,
17711        zoomToCenter: zoomToCenterStrategy
17712      },
17713      defaultStrategy: 'default',
17714      supportedInteractionTypes: ['Mouse', 'Touch'],
17715      configuration: {
17716        invert: false,
17717        preventZoomOutsideImage: false,
17718        minScale: 0.25,
17719        maxScale: 20.0
17720      },
17721      svgCursor: _cursors_index_js__WEBPACK_IMPORTED_MODULE_9__["zoomCursor"]
17722    };
17723    return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(ZoomTool).call(this, props, defaultProps));
17724  }
17725
17726  _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(ZoomTool, [{
17727    key: "touchDragCallback",
17728    value: function touchDragCallback(evt) {
17729      dragCallback.call(this, evt);
17730    }
17731  }, {
17732    key: "mouseDragCallback",
17733    value: function mouseDragCallback(evt) {
17734      dragCallback.call(this, evt);
17735    }
17736  }]);
17737
17738  return ZoomTool;
17739}(_base_BaseTool_js__WEBPACK_IMPORTED_MODULE_6__["default"]);
17740
17741
17742
17743var dragCallback = function dragCallback(evt) {
17744  var deltaY = evt.detail.deltaPoints.page.y;
17745
17746  if (!deltaY) {
17747    return false;
17748  }
17749
17750  this.applyActiveStrategy(evt, this.configuration);
17751  _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.setViewport(evt.detail.element, evt.detail.viewport);
17752};
17753/**
17754 * The default strategy keeps the target location fixed on the page
17755 * as we zoom in/out.
17756 *
17757 * @param {*} evt
17758 * @param {*} { invert, maxScale, minScale }
17759 * @returns {void}
17760 */
17761
17762
17763function defaultStrategy(evt, _ref) {
17764  var invert = _ref.invert,
17765      maxScale = _ref.maxScale,
17766      minScale = _ref.minScale;
17767  var deltaY = evt.detail.deltaPoints.page.y;
17768  var ticks = invert ? -deltaY / 100 : deltaY / 100;
17769  var _evt$detail = evt.detail,
17770      element = _evt$detail.element,
17771      viewport = _evt$detail.viewport;
17772  var _ref2 = [evt.detail.startPoints.page.x, evt.detail.startPoints.page.y, evt.detail.startPoints.image.x, evt.detail.startPoints.image.y],
17773      startX = _ref2[0],
17774      startY = _ref2[1],
17775      imageX = _ref2[2],
17776      imageY = _ref2[3]; // Calculate the new scale factor based on how far the mouse has changed
17777
17778  var updatedViewport = changeViewportScale(viewport, ticks, {
17779    maxScale: maxScale,
17780    minScale: minScale
17781  });
17782  _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.setViewport(element, updatedViewport); // Now that the scale has been updated, determine the offset we need to apply to the center so we can
17783  // Keep the original start location in the same position
17784
17785  var newCoords = _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.pageToPixel(element, startX, startY); // The shift we will use is the difference between the original image coordinates of the point we've selected
17786  // And the image coordinates of the same point on the page after the viewport scaling above has been performed
17787  // This shift is in image coordinates, and is designed to keep the target location fixed on the page.
17788
17789  var shift = {
17790    x: imageX - newCoords.x,
17791    y: imageY - newCoords.y
17792  }; // Correct the required shift using the viewport rotation and flip parameters
17793
17794  shift = correctShift(shift, updatedViewport); // Apply the shift to the Viewport's translation setting
17795
17796  viewport.translation.x -= shift.x;
17797  viewport.translation.y -= shift.y;
17798}
17799
17800function translateStrategy(evt, _ref3) {
17801  var invert = _ref3.invert,
17802      preventZoomOutsideImage = _ref3.preventZoomOutsideImage,
17803      maxScale = _ref3.maxScale,
17804      minScale = _ref3.minScale;
17805  var deltaY = evt.detail.deltaPoints.page.y;
17806  var ticks = invert ? -deltaY / 100 : deltaY / 100;
17807  var image = evt.detail.image;
17808  var viewport = evt.detail.viewport;
17809  var _ref4 = [evt.detail.startPoints.image.x, evt.detail.startPoints.image.y],
17810      startX = _ref4[0],
17811      startY = _ref4[1]; // Calculate the new scale factor based on how far the mouse has changed
17812  // Note that in this case we don't need to update the viewport after the initial
17813  // Zoom step since we aren't don't intend to keep the target position static on
17814  // The page
17815
17816  var updatedViewport = changeViewportScale(viewport, ticks, {
17817    maxScale: maxScale,
17818    minScale: minScale
17819  }); // Define the default shift to take place during this zoom step
17820
17821  var shift = {
17822    x: 0,
17823    y: 0
17824  }; // Define the parameters for the translate strategy
17825
17826  var translateSpeed = 8;
17827  var outwardsMinScaleToTranslate = 3;
17828  var minTranslation = 0.01;
17829
17830  if (ticks < 0) {
17831    // Zoom outwards from the image center
17832    if (updatedViewport.scale < outwardsMinScaleToTranslate) {
17833      // If the current translation is smaller than the minimum desired translation,
17834      // Set the translation to zero
17835      if (Math.abs(updatedViewport.translation.x) < minTranslation) {
17836        updatedViewport.translation.x = 0;
17837      } else {
17838        shift.x = updatedViewport.translation.x / translateSpeed;
17839      } // If the current translation is smaller than the minimum desired translation,
17840      // Set the translation to zero
17841
17842
17843      if (Math.abs(updatedViewport.translation.y) < minTranslation) {
17844        updatedViewport.translation.y = 0;
17845      } else {
17846        shift.y = updatedViewport.translation.y / translateSpeed;
17847      }
17848    }
17849  } else {
17850    // Zoom inwards to the current image point
17851    // Identify the coordinates of the point the user is trying to zoom into
17852    // If we are not allowed to zoom outside the image, bound the user-selected position to
17853    // A point inside the image
17854    if (preventZoomOutsideImage) {
17855      Object(_util_clip_js__WEBPACK_IMPORTED_MODULE_7__["clipToBox"])(evt.detail.startPoints.image, image);
17856    } // Calculate the translation value that would place the desired image point in the center
17857    // Of the viewport
17858
17859
17860    var desiredTranslation = {
17861      x: image.width / 2 - startX,
17862      y: image.height / 2 - startY
17863    }; // Correct the target location using the viewport rotation and flip parameters
17864
17865    desiredTranslation = correctShift(desiredTranslation, updatedViewport); // Calculate the difference between the current viewport translation value and the
17866    // Final desired translation values
17867
17868    var distanceToDesired = {
17869      x: updatedViewport.translation.x - desiredTranslation.x,
17870      y: updatedViewport.translation.y - desiredTranslation.y
17871    }; // If the current translation is smaller than the minimum desired translation,
17872    // Stop translating in the x-direction
17873
17874    if (Math.abs(distanceToDesired.x) < minTranslation) {
17875      updatedViewport.translation.x = desiredTranslation.x;
17876    } else {
17877      // Otherwise, shift the viewport by one step
17878      shift.x = distanceToDesired.x / translateSpeed;
17879    } // If the current translation is smaller than the minimum desired translation,
17880    // Stop translating in the y-direction
17881
17882
17883    if (Math.abs(distanceToDesired.y) < minTranslation) {
17884      updatedViewport.translation.y = desiredTranslation.y;
17885    } else {
17886      // Otherwise, shift the viewport by one step
17887      shift.y = distanceToDesired.y / translateSpeed;
17888    }
17889  } // Apply the shift to the Viewport's translation setting
17890
17891
17892  updatedViewport.translation.x -= shift.x;
17893  updatedViewport.translation.y -= shift.y;
17894}
17895
17896function zoomToCenterStrategy(evt, _ref5) {
17897  var invert = _ref5.invert,
17898      maxScale = _ref5.maxScale,
17899      minScale = _ref5.minScale;
17900  var deltaY = evt.detail.deltaPoints.page.y;
17901  var ticks = invert ? -deltaY / 100 : deltaY / 100;
17902  var viewport = evt.detail.viewport; // Calculate the new scale factor based on how far the mouse has changed
17903
17904  changeViewportScale(viewport, ticks, {
17905    maxScale: maxScale,
17906    minScale: minScale
17907  });
17908}
17909
17910/***/ }),
17911
17912/***/ "./tools/ZoomTouchPinchTool.js":
17913/*!*************************************!*\
17914  !*** ./tools/ZoomTouchPinchTool.js ***!
17915  \*************************************/
17916/*! exports provided: default */
17917/***/ (function(module, __webpack_exports__, __webpack_require__) {
17918
17919"use strict";
17920__webpack_require__.r(__webpack_exports__);
17921/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return ZoomTouchPinchTool; });
17922/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js");
17923/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
17924/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js");
17925/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
17926/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js");
17927/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
17928/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js");
17929/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
17930/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js");
17931/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__);
17932/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./../externalModules.js */ "./externalModules.js");
17933/* harmony import */ var _base_BaseTool_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./base/BaseTool.js */ "./tools/base/BaseTool.js");
17934/* harmony import */ var _util_zoom_index_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../util/zoom/index.js */ "./util/zoom/index.js");
17935
17936
17937
17938
17939
17940
17941
17942
17943var correctShift = _util_zoom_index_js__WEBPACK_IMPORTED_MODULE_7__["default"].correctShift;
17944/**
17945 *
17946 *
17947 * @public
17948 * @class ZoomTouchPinchTool
17949 * @memberof Tools
17950 *
17951 * @extends {BaseTool}
17952 */
17953
17954var ZoomTouchPinchTool =
17955/*#__PURE__*/
17956function (_BaseTool) {
17957  _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(ZoomTouchPinchTool, _BaseTool);
17958
17959  function ZoomTouchPinchTool() {
17960    var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
17961
17962    _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, ZoomTouchPinchTool);
17963
17964    var defaultProps = {
17965      name: 'ZoomTouchPinch',
17966      // TODO: Do we need a better way to specify touchPinch?
17967      supportedInteractionTypes: ['TouchPinch'],
17968      configuration: {
17969        minScale: 0.25,
17970        maxScale: 20.0
17971      }
17972    };
17973    return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(ZoomTouchPinchTool).call(this, props, defaultProps));
17974  }
17975
17976  _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(ZoomTouchPinchTool, [{
17977    key: "touchPinchCallback",
17978    value: function touchPinchCallback(evt) {
17979      var _evt$detail = evt.detail,
17980          element = _evt$detail.element,
17981          viewport = _evt$detail.viewport,
17982          scaleChange = _evt$detail.scaleChange;
17983      var _ref = [evt.detail.startPoints.page.x, evt.detail.startPoints.page.y, evt.detail.startPoints.image.x, evt.detail.startPoints.image.y],
17984          pageStartX = _ref[0],
17985          pageStartY = _ref[1],
17986          imageStartX = _ref[2],
17987          imageStartY = _ref[3];
17988      var _this$configuration = this.configuration,
17989          maxScale = _this$configuration.maxScale,
17990          minScale = _this$configuration.minScale; // Change the scale based on the pinch gesture's scale change
17991
17992      viewport.scale += scaleChange * viewport.scale;
17993
17994      if (maxScale && viewport.scale > maxScale) {
17995        viewport.scale = maxScale;
17996      } else if (minScale && viewport.scale < minScale) {
17997        viewport.scale = minScale;
17998      }
17999
18000      _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.setViewport(element, viewport); // Now that the scale has been updated, determine the offset we need to apply to the center so we can
18001      // Keep the original start location in the same position
18002
18003      var newCoords = _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.pageToPixel(element, pageStartX, pageStartY);
18004      var shift = {
18005        x: imageStartX - newCoords.x,
18006        y: imageStartY - newCoords.y
18007      };
18008      shift = correctShift(shift, viewport);
18009      viewport.translation.x -= shift.x;
18010      viewport.translation.y -= shift.y;
18011      _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.setViewport(element, viewport);
18012    }
18013  }]);
18014
18015  return ZoomTouchPinchTool;
18016}(_base_BaseTool_js__WEBPACK_IMPORTED_MODULE_6__["default"]);
18017
18018
18019
18020/***/ }),
18021
18022/***/ "./tools/annotation/AngleTool.js":
18023/*!***************************************!*\
18024  !*** ./tools/annotation/AngleTool.js ***!
18025  \***************************************/
18026/*! exports provided: default */
18027/***/ (function(module, __webpack_exports__, __webpack_require__) {
18028
18029"use strict";
18030__webpack_require__.r(__webpack_exports__);
18031/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return AngleTool; });
18032/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js");
18033/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
18034/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js");
18035/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
18036/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js");
18037/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
18038/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js");
18039/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
18040/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js");
18041/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__);
18042/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./../../externalModules.js */ "./externalModules.js");
18043/* harmony import */ var _base_BaseAnnotationTool_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../base/BaseAnnotationTool.js */ "./tools/base/BaseAnnotationTool.js");
18044/* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./../../stateManagement/toolState.js */ "./stateManagement/toolState.js");
18045/* harmony import */ var _stateManagement_toolStyle_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./../../stateManagement/toolStyle.js */ "./stateManagement/toolStyle.js");
18046/* harmony import */ var _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./../../stateManagement/toolColors.js */ "./stateManagement/toolColors.js");
18047/* harmony import */ var _manipulators_index_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./../../manipulators/index.js */ "./manipulators/index.js");
18048/* harmony import */ var _drawing_index_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./../../drawing/index.js */ "./drawing/index.js");
18049/* harmony import */ var _drawing_drawLinkedTextBox_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./../../drawing/drawLinkedTextBox.js */ "./drawing/drawLinkedTextBox.js");
18050/* harmony import */ var _drawing_drawTextBox_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./../../drawing/drawTextBox.js */ "./drawing/drawTextBox.js");
18051/* harmony import */ var _drawing_drawHandles_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./../../drawing/drawHandles.js */ "./drawing/drawHandles.js");
18052/* harmony import */ var _util_lineSegDistance_js__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./../../util/lineSegDistance.js */ "./util/lineSegDistance.js");
18053/* harmony import */ var _util_roundToDecimal_js__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./../../util/roundToDecimal.js */ "./util/roundToDecimal.js");
18054/* harmony import */ var _cursors_index_js__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../cursors/index.js */ "./tools/cursors/index.js");
18055/* harmony import */ var _util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../../util/triggerEvent.js */ "./util/triggerEvent.js");
18056/* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../../events.js */ "./events.js");
18057/* harmony import */ var _util_getPixelSpacing__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ../../util/getPixelSpacing */ "./util/getPixelSpacing.js");
18058/* harmony import */ var _util_throttle__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ../../util/throttle */ "./util/throttle.js");
18059
18060
18061
18062
18063
18064
18065 // State
18066
18067
18068
18069 // Manipulators
18070
18071 // Drawing
18072
18073
18074
18075
18076
18077
18078
18079
18080
18081
18082
18083
18084/**
18085 * @public
18086 * @class AngleTool
18087 * @memberof Tools.Annotation
18088 * @classdesc Create and position an angle by placing three consecutive points.
18089 * @extends Tools.Base.BaseAnnotationTool
18090 * @hideconstructor
18091 *
18092 * @param {ToolConfiguration} [props={}]
18093 */
18094
18095var AngleTool =
18096/*#__PURE__*/
18097function (_BaseAnnotationTool) {
18098  _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(AngleTool, _BaseAnnotationTool);
18099
18100  function AngleTool() {
18101    var _this;
18102
18103    var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
18104
18105    _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, AngleTool);
18106
18107    var defaultProps = {
18108      name: 'Angle',
18109      supportedInteractionTypes: ['Mouse', 'Touch'],
18110      svgCursor: _cursors_index_js__WEBPACK_IMPORTED_MODULE_17__["angleCursor"]
18111    };
18112    _this = _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(AngleTool).call(this, props, defaultProps));
18113    _this.preventNewMeasurement = false;
18114    _this.throttledUpdateCachedStats = Object(_util_throttle__WEBPACK_IMPORTED_MODULE_21__["default"])(_this.updateCachedStats, 110);
18115    return _this;
18116  }
18117
18118  _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(AngleTool, [{
18119    key: "createNewMeasurement",
18120    value: function createNewMeasurement(eventData) {
18121      // Create the measurement data for this tool with the end handle activated
18122      return {
18123        visible: true,
18124        active: true,
18125        color: undefined,
18126        invalidated: true,
18127        handles: {
18128          start: {
18129            x: eventData.currentPoints.image.x,
18130            y: eventData.currentPoints.image.y,
18131            highlight: true,
18132            active: false
18133          },
18134          middle: {
18135            x: eventData.currentPoints.image.x,
18136            y: eventData.currentPoints.image.y,
18137            highlight: true,
18138            active: true
18139          },
18140          end: {
18141            x: eventData.currentPoints.image.x,
18142            y: eventData.currentPoints.image.y,
18143            highlight: true,
18144            active: false
18145          },
18146          textBox: {
18147            active: false,
18148            hasMoved: false,
18149            movesIndependently: false,
18150            drawnIndependently: true,
18151            allowedOutsideImage: true,
18152            hasBoundingBox: true
18153          }
18154        }
18155      };
18156    }
18157  }, {
18158    key: "pointNearTool",
18159    value: function pointNearTool(element, data, coords) {
18160      if (data.visible === false) {
18161        return false;
18162      }
18163
18164      return Object(_util_lineSegDistance_js__WEBPACK_IMPORTED_MODULE_15__["default"])(element, data.handles.start, data.handles.middle, coords) < 25 || Object(_util_lineSegDistance_js__WEBPACK_IMPORTED_MODULE_15__["default"])(element, data.handles.middle, data.handles.end, coords) < 25;
18165    }
18166  }, {
18167    key: "updateCachedStats",
18168    value: function updateCachedStats(image, element, data) {
18169      var _getPixelSpacing = Object(_util_getPixelSpacing__WEBPACK_IMPORTED_MODULE_20__["default"])(image),
18170          rowPixelSpacing = _getPixelSpacing.rowPixelSpacing,
18171          colPixelSpacing = _getPixelSpacing.colPixelSpacing;
18172
18173      var sideA = {
18174        x: (data.handles.middle.x - data.handles.start.x) * colPixelSpacing,
18175        y: (data.handles.middle.y - data.handles.start.y) * rowPixelSpacing
18176      };
18177      var sideB = {
18178        x: (data.handles.end.x - data.handles.middle.x) * colPixelSpacing,
18179        y: (data.handles.end.y - data.handles.middle.y) * rowPixelSpacing
18180      };
18181      var sideC = {
18182        x: (data.handles.end.x - data.handles.start.x) * colPixelSpacing,
18183        y: (data.handles.end.y - data.handles.start.y) * rowPixelSpacing
18184      };
18185      var sideALength = length(sideA);
18186      var sideBLength = length(sideB);
18187      var sideCLength = length(sideC); // Cosine law
18188
18189      var angle = Math.acos((Math.pow(sideALength, 2) + Math.pow(sideBLength, 2) - Math.pow(sideCLength, 2)) / (2 * sideALength * sideBLength));
18190      angle *= 180 / Math.PI;
18191      data.rAngle = Object(_util_roundToDecimal_js__WEBPACK_IMPORTED_MODULE_16__["default"])(angle, 2);
18192      data.invalidated = false;
18193    }
18194  }, {
18195    key: "renderToolData",
18196    value: function renderToolData(evt) {
18197      var _this2 = this;
18198
18199      var eventData = evt.detail;
18200      var enabledElement = eventData.enabledElement;
18201      var _this$configuration = this.configuration,
18202          handleRadius = _this$configuration.handleRadius,
18203          drawHandlesOnHover = _this$configuration.drawHandlesOnHover; // If we have no toolData for this element, return immediately as there is nothing to do
18204
18205      var toolData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_7__["getToolState"])(evt.currentTarget, this.name);
18206
18207      if (!toolData) {
18208        return;
18209      } // We have tool data for this element - iterate over each one and draw it
18210
18211
18212      var context = Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_11__["getNewContext"])(eventData.canvasContext.canvas);
18213      var image = eventData.image,
18214          element = eventData.element;
18215
18216      var _getPixelSpacing2 = Object(_util_getPixelSpacing__WEBPACK_IMPORTED_MODULE_20__["default"])(image),
18217          rowPixelSpacing = _getPixelSpacing2.rowPixelSpacing,
18218          colPixelSpacing = _getPixelSpacing2.colPixelSpacing;
18219
18220      var lineWidth = _stateManagement_toolStyle_js__WEBPACK_IMPORTED_MODULE_8__["default"].getToolW
18220idth();
18221
18222      var _loop = function _loop(i) {
18223        var data = toolData.data[i];
18224
18225        if (data.visible === false) {
18226          return "continue";
18227        }
18228
18229        Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_11__["draw"])(context, function (context) {
18230          Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_11__["setShadow"])(context, _this2.configuration); // Differentiate the color of activation tool
18231
18232          var color = _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_9__["default"].getColorIfActive(data);
18233          var handleStartCanvas = _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.pixelToCanvas(eventData.element, data.handles.start);
18234          var handleMiddleCanvas = _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.pixelToCanvas(eventData.element, data.handles.middle);
18235
18236          var lineOptions = {
18237            color: color
18238          };
18239          if(data.lineWidth){
18240            lineOptions.lineWidth = data.lineWidth;
18241          }
18242          Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_11__["drawJoinedLines"])(context, eventData.element, data.handles.start, [data.handles.middle, data.handles.end], lineOptions); // Draw the handles
18243
18244          var handleOptions = {
18245            color: color,
18246            handleRadius: handleRadius,
18247            drawHandlesIfActive: drawHandlesOnHover
18248          };
18249          Object(_drawing_drawHandles_js__WEBPACK_IMPORTED_MODULE_14__["default"])(context, eventData, data.handles, handleOptions); // Update textbox stats
18250
18251          if (data.invalidated === true) {
18252            if (data.rAngle) {
18253              _this2.throttledUpdateCachedStats(image, element, data);
18254            } else {
18255              _this2.updateCachedStats(image, element, data);
18256            }
18257          }
18258
18259          if (data.rAngle) {
18260            var text = textBoxText(data, rowPixelSpacing, colPixelSpacing);
18261            var distance = 15;
18262            var textCoords;
18263
18264            if (!data.handles.textBox.hasMoved) {
18265              textCoords = {
18266                x: handleMiddleCanvas.x,
18267                y: handleMiddleCanvas.y
18268              };
18269              var padding = 5;
18270              var textWidth = Object(_drawing_drawTextBox_js__WEBPACK_IMPORTED_MODULE_13__["textBoxWidth"])(context, text, padding);
18271
18272              if (handleMiddleCanvas.x < handleStartCanvas.x) {
18273                textCoords.x -= distance + textWidth + 10;
18274              } else {
18275                textCoords.x += distance;
18276              }
18277
18278              var transform = _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.internal.getTransform(enabledElement);
18279              transform.invert();
18280              var coords = transform.transformPoint(textCoords.x, textCoords.y);
18281              data.handles.textBox.x = coords.x;
18282              data.handles.textBox.y = coords.y;
18283            }
18284
18285            Object(_drawing_drawLinkedTextBox_js__WEBPACK_IMPORTED_MODULE_12__["default"])(context, eventData.element, data.handles.textBox, text, data.handles, textBoxAnchorPoints, color, lineWidth, 0, true);
18286          }
18287        });
18288      };
18289
18290      for (var i = 0; i < toolData.data.length; i++) {
18291        var _ret = _loop(i);
18292
18293        if (_ret === "continue") continue;
18294      }
18295
18296      function textBoxText(data, rowPixelSpacing, colPixelSpacing) {
18297        var suffix = !rowPixelSpacing || !colPixelSpacing ? ' (isotropic)' : '';
18298        var str = '00B0'; // Degrees symbol
18299
18300        return data.rAngle.toString() + String.fromCharCode(parseInt(str, 16)) + suffix;
18301      }
18302
18303      function textBoxAnchorPoints(handles) {
18304        return [handles.start, handles.middle, handles.end];
18305      }
18306    }
18307  }, {
18308    key: "addNewMeasurement",
18309    value: function addNewMeasurement(evt, interactionType) {
18310      var _this3 = this;
18311
18312      if (this.preventNewMeasurement) {
18313        return;
18314      }
18315
18316      this.preventNewMeasurement = true;
18317      evt.preventDefault();
18318      evt.stopPropagation();
18319      var eventData = evt.detail;
18320      var measurementData = this.createNewMeasurement(eventData);
18321      var element = evt.detail.element; // Associate this data with this imageId so we can render it and manipulate it
18322
18323      Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_7__["addToolState"])(element, this.name, measurementData);
18324      _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.updateImage(element);
18325      var doneMovingEndHandleOptions = Object.assign({}, {
18326        doneMovingCallback: function doneMovingCallback() {
18327          measurementData.active = false;
18328          _this3.preventNewMeasurement = false;
18329          var eventType = _events_js__WEBPACK_IMPORTED_MODULE_19__["default"].MEASUREMENT_COMPLETED;
18330          var eventData = {
18331            toolType: _this3.name,
18332            element: element,
18333            measurementData: measurementData
18334          };
18335          Object(_util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_18__["default"])(element, eventType, eventData);
18336          _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.updateImage(element);
18337        }
18338      }, this.options);
18339      var doneMovingMiddleHandleOptions = Object.assign({}, {
18340        doneMovingCallback: function doneMovingCallback() {
18341          measurementData.active = false;
18342          measurementData.handles.end.active = true;
18343          _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.updateImage(element);
18344          Object(_manipulators_index_js__WEBPACK_IMPORTED_MODULE_10__["moveNewHandle"])(eventData, _this3.name, measurementData, measurementData.handles.end, doneMovingEndHandleOptions, interactionType);
18345        }
18346      }, this.options); // Step 1, create start and second middle
18347
18348      Object(_manipulators_index_js__WEBPACK_IMPORTED_MODULE_10__["moveNewHandle"])(eventData, this.name, measurementData, measurementData.handles.middle, doneMovingMiddleHandleOptions, interactionType);
18349    }
18350  }]);
18351
18352  return AngleTool;
18353}(_base_BaseAnnotationTool_js__WEBPACK_IMPORTED_MODULE_6__["default"]);
18354
18355
18356
18357function length(vector) {
18358  return Math.sqrt(Math.pow(vector.x, 2) + Math.pow(vector.y, 2));
18359}
18360
18361/***/ }),
18362
18363/***/ "./tools/annotation/ArrowAnnotateTool.js":
18364/*!***********************************************!*\
18365  !*** ./tools/annotation/ArrowAnnotateTool.js ***!
18366  \***********************************************/
18367/*! exports provided: default */
18368/***/ (function(module, __webpack_exports__, __webpack_require__) {
18369
18370"use strict";
18371__webpack_require__.r(__webpack_exports__);
18372/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return ArrowAnnotateTool; });
18373/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js");
18374/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
18375/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js");
18376/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
18377/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js");
18378/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
18379/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js");
18380/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
18381/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js");
18382/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__);
18383/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./../../externalModules.js */ "./externalModules.js");
18384/* harmony import */ var _base_BaseAnnotationTool_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../base/BaseAnnotationTool.js */ "./tools/base/BaseAnnotationTool.js");
18385/* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./../../events.js */ "./events.js");
18386/* harmony import */ var _stateManagement_toolStyle_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./../../stateManagement/toolStyle.js */ "./stateManagement/toolStyle.js");
18387/* harmony import */ var _stateManagement_textStyle_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./../../stateManagement/textStyle.js */ "./stateManagement/textStyle.js");
18388/* harmony import */ var _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./../../stateManagement/toolColors.js */ "./stateManagement/toolColors.js");
18389/* harmony import */ var _manipulators_index_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./../../manipulators/index.js */ "./manipulators/index.js");
18390/* harmony import */ var _util_pointInsideBoundingBox_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./../../util/pointInsideBoundingBox.js */ "./util/pointInsideBoundingBox.js");
18391/* harmony import */ var _util_lineSegDistance_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./../../util/lineSegDistance.js */ "./util/lineSegDistance.js");
18392/* harmony import */ var _util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./../../util/triggerEvent.js */ "./util/triggerEvent.js");
18393/* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./../../stateManagement/toolState.js */ "./stateManagement/toolState.js");
18394/* harmony import */ var _drawing_drawLinkedTextBox_js__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./../../drawing/drawLinkedTextBox.js */ "./drawing/drawLinkedTextBox.js");
18395/* harmony import */ var _drawing_index_js__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./../../drawing/index.js */ "./drawing/index.js");
18396/* harmony import */ var _drawing_drawArrow_js__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./../../drawing/drawArrow.js */ "./drawing/drawArrow.js");
18397/* harmony import */ var _drawing_drawHandles_js__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./../../drawing/drawHandles.js */ "./drawing/drawHandles.js");
18398/* harmony import */ var _drawing_drawTextBox_js__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./../../drawing/drawTextBox.js */ "./drawing/drawTextBox.js");
18399/* harmony import */ var _cursors_index_js__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ../cursors/index.js */ "./tools/cursors/index.js");
18400
18401
18402
18403
18404
18405
18406/* eslint no-alert: 0 */
18407
18408
18409
18410
18411
18412
18413
18414
18415
18416
18417
18418
18419
18420
18421
18422
18423
18424/**
18425 * @public
18426 * @class ArrowAnnotateTool
18427 * @memberof Tools.Annotation
18428 * @classdesc Create and position an arrow and label
18429 * @extends Tools.Base.BaseAnnotationTool
18430 */
18431
18432var ArrowAnnotateTool =
18433/*#__PURE__*/
18434function (_BaseAnnotationTool) {
18435  _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(ArrowAnnotateTool, _BaseAnnotationTool);
18436
18437  function ArrowAnnotateTool() {
18438    var _this;
18439
18440    var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
18441
18442    _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, ArrowAnnotateTool);
18443
18444    var defaultProps = {
18445      name: 'ArrowAnnotate',
18446      supportedInteractionTypes: ['Mouse', 'Touch'],
18447      configuration: {
18448        getTextCallback: getTextCallback,
18449        changeTextCallback: changeTextCallback,
18450        drawHandles: false,
18451        drawHandlesOnHover: true,
18452        arrowFirst: true
18453      },
18454      svgCursor: _cursors_index_js__WEBPACK_IMPORTED_MODULE_21__["arrowAnnotateCursor"]
18455    };
18456    _this = _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(ArrowAnnotateTool).call(this, props, defaultProps));
18457    _this.preventNewMeasurement = false;
18458    return _this;
18459  }
18460
18461  _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(ArrowAnnotateTool, [{
18462    key: "createNewMeasurement",
18463    value: function createNewMeasurement(evt) {
18464      // Create the measurement data for this tool with the end handle activated
18465      return {
18466        visible: true,
18467        active: true,
18468        color: undefined,
18469        handles: {
18470          start: {
18471            x: evt.detail.currentPoints.image.x,
18472            y: evt.detail.currentPoints.image.y,
18473            highlight: true,
18474            active: false
18475          },
18476          end: {
18477            x: evt.detail.currentPoints.image.x,
18478            y: evt.detail.currentPoints.image.y,
18479            highlight: true,
18480            active: false
18481          },
18482          textBox: {
18483            active: false,
18484            hasMoved: false,
18485            movesIndependently: false,
18486            drawnIndependently: true,
18487            allowedOutsideImage: true,
18488            hasBoundingBox: true
18489          }
18490        }
18491      };
18492    }
18493  }, {
18494    key: "pointNearTool",
18495    value: function pointNearTool(element, data, coords) {
18496      if (data.visible === false) {
18497        return false;
18498      }
18499
18500      return Object(_util_lineSegDistance_js__WEBPACK_IMPORTED_MODULE_13__["default"])(element, data.handles.start, data.handles.end, coords) < 25;
18501    }
18502  }, {
18503    key: "updateCachedStats",
18504    value: function updateCachedStats(image, element, data) {// No stats calculation for this tool
18505    }
18506  }, {
18507    key: "renderToolData",
18508    value: function renderToolData(evt) {
18509      var _this2 = this;
18510
18511      var _evt$detail = evt.detail,
18512          element = _evt$detail.element,
18513          enabledElement = _evt$detail.enabledElement;
18514      var _this$configuration = this.configuration,
18515          handleRadius = _this$configuration.handleRadius,
18516          drawHandlesOnHover = _this$configuration.drawHandlesOnHover; // If we have no toolData for this element, return immediately as there is nothing to do
18517
18518      var toolData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_15__["getToolState"])(element, this.name);
18519
18520      if (!toolData) {
18521        return;
18522      } // We have tool data for this element - iterate over each one and draw it
18523
18524
18525      var canvas = evt.detail.canvasContext.canvas;
18526      var context = Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_17__["getNewContext"])(canvas);
18527      var lineWidth = _stateManagement_toolStyle_js__WEBPACK_IMPORTED_MODULE_8__["default"].getToolW
18527idth();
18528
18529      var _loop = function _loop(i) {
18530        var data = toolData.data[i];
18531
18532        if (data.visible === false) {
18533          return "continue";
18534        }
18535
18536        Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_17__["draw"])(context, function (context) {
18537          Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_17__["setShadow"])(context, _this2.configuration);
18538          var color = _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_10__["default"].getColorIfActive(data); // Draw the arrow
18539
18540          var handleStartCanvas = _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.pixelToCanvas(element, data.handles.start);
18541          var handleEndCanvas = _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.pixelToCanvas(element, data.handles.end); // Config.arrowFirst = false;
18542
18543          if (_this2.configuration.arrowFirst) {
18544            Object(_drawing_drawArrow_js__WEBPACK_IMPORTED_MODULE_18__["default"])(context, handleEndCanvas, handleStartCanvas, color, lineWidth);
18545          } else {
18546            Object(_drawing_drawArrow_js__WEBPACK_IMPORTED_MODULE_18__["default"])(context, handleStartCanvas, handleEndCanvas, color, lineWidth);
18547          }
18548
18549          var handleOptions = {
18550            color: color,
18551            handleRadius: handleRadius,
18552            drawHandlesIfActive: drawHandlesOnHover
18553          };
18554
18555          if (_this2.configuration.drawHandles) {
18556            Object(_drawing_drawHandles_js__WEBPACK_IMPORTED_MODULE_19__["default"])(context, evt.detail, data.handles, handleOptions);
18557          }
18558
18559          var text = textBoxText(data); // Draw the text
18560
18561          if (text && text !== '') {
18562            // Calculate the text coordinates.
18563            var padding = 5;
18564            var textWidth = Object(_drawing_drawTextBox_js__WEBPACK_IMPORTED_MODULE_20__["textBoxWidth"])(context, text, padding);
18565            var textHeight = _stateManagement_textStyle_js__WEBPACK_IMPORTED_MODULE_9__["default"].getFontSize() + 10;
18566            var distance = Math.max(textWidth, textHeight) / 2 + 5;
18567
18568            if (handleEndCanvas.x < handleStartCanvas.x) {
18569              distance = -distance;
18570            }
18571
18572            if (!data.handles.textBox.hasMoved) {
18573              var textCoords;
18574
18575              if (_this2.configuration.arrowFirst) {
18576                textCoords = {
18577                  x: handleEndCanvas.x - textWidth / 2 + distance,
18578                  y: handleEndCanvas.y - textHeight / 2
18579                };
18580              } else {
18581                // If the arrow is at the End position, the text should
18582                // Be placed near the Start position
18583                textCoords = {
18584                  x: handleStartCanvas.x - textWidth / 2 - distance,
18585                  y: handleStartCanvas.y - textHeight / 2
18586                };
18587              }
18588
18589              var transform = _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.internal.getTransform(enabledElement);
18590              transform.invert();
18591              var coords = transform.transformPoint(textCoords.x, textCoords.y);
18592              data.handles.textBox.x = coords.x;
18593              data.handles.textBox.y = coords.y;
18594            }
18595
18596            Object(_drawing_drawLinkedTextBox_js__WEBPACK_IMPORTED_MODULE_16__["default"])(context, element, data.handles.textBox, text, data.handles, textBoxAnchorPoints, color, lineWidth, 0, false);
18597          }
18598        });
18599      };
18600
18601      for (var i = 0; i < toolData.data.length; i++) {
18602        var _ret = _loop(i);
18603
18604        if (_ret === "continue") continue;
18605      }
18606
18607      function textBoxText(data) {
18608        return data.text;
18609      }
18610
18611      function textBoxAnchorPoints(handles) {
18612        var midpoint = {
18613          x: (handles.start.x + handles.end.x) / 2,
18614          y: (handles.start.y + handles.end.y) / 2
18615        };
18616        return [handles.start, midpoint, handles.end];
18617      }
18618    }
18619  }, {
18620    key: "addNewMeasurement",
18621    value: function addNewMeasurement(evt, interactionType) {
18622      var _this3 = this;
18623
18624      var element = evt.detail.element;
18625      var measurementData = this.createNewMeasurement(evt); // Associate this data with this imageId so we can render it and manipulate it
18626
18627      Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_15__["addToolState"])(element, this.name, measurementData);
18628      _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.updateImage(element);
18629      var toolOptions = Object.assign({}, {
18630        doneMovingCallback: function doneMovingCallback() {
18631          if (measurementData.text === undefined) {
18632            _this3.configuration.getTextCallback(function (text) {
18633              measurementData.active = false;
18634
18635              if (text) {
18636                measurementData.text = text;
18637                var eventType = _events_js__WEBPACK_IMPORTED_MODULE_7__["default"].MEASUREMENT_COMPLETED;
18638                var eventData = {
18639                  toolName: _this3.name,
18640                  element: element,
18641                  measurementData: measurementData
18642                };
18643                Object(_util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_14__["default"])(element, eventType, eventData);
18644              } else {
18645                Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_15__["removeToolState"])(element, _this3.name, measurementData);
18646              }
18647
18648              _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.updateImage(element);
18649            });
18650          }
18651
18652          _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.updateImage(element);
18653        }
18654      }, this.options);
18655      Object(_manipulators_index_js__WEBPACK_IMPORTED_MODULE_11__["moveNewHandle"])(evt.detail, this.name, measurementData, measurementData.handles.end, toolOptions, interactionType);
18656    }
18657  }, {
18658    key: "doubleClickCallback",
18659    value: function doubleClickCallback(evt) {
18660      if (!Array.isArray(this.options.mouseButtonMask) || !this.options.mouseButtonMask.includes(evt.detail.buttons)) {
18661        return;
18662      }
18663
18664      return this._updateTextForNearbyAnnotation(evt);
18665    }
18666  }, {
18667    key: "touchPressCallback",
18668    value: function touchPressCallback(evt) {
18669      return this._updateTextForNearbyAnnotation(evt);
18670    }
18671  }, {
18672    key: "_updateTextForNearbyAnnotation",
18673    value: function _updateTextForNearbyAnnotation(evt) {
18674      var element = evt.detail.element;
18675      var coords = evt.detail.currentPoints.canvas;
18676      var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_15__["getToolState"])(element, this.name);
18677
18678      if (!toolState) {
18679        return false;
18680      }
18681
18682      for (var i = 0; i < toolState.data.length; i++) {
18683        var data = toolState.data[i];
18684
18685        if (this.pointNearTool(element, data, coords) || Object(_util_pointInsideBoundingBox_js__WEBPACK_IMPORTED_MODULE_12__["default"])(data.handles.textBox, coords)) {
18686          data.active = true;
18687          _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.updateImage(element); // Allow relabelling via a callback
18688
18689          this.configuration.changeTextCallback(data, evt.detail, this._doneChangingTextCallback.bind(this, element, data));
18690          evt.stopImmediatePropagation();
18691          evt.preventDefault();
18692          evt.stopPropagation();
18693          return true;
18694        }
18695      }
18696    }
18697  }, {
18698    key: "_doneChangingTextCallback",
18699    value: function _doneChangingTextCallback(element, data, updatedText, deleteTool) {
18700      if (deleteTool === true) {
18701        Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_15__["removeToolState"])(element, this.name, data);
18702      } else {
18703        data.text = updatedText;
18704      }
18705
18706      data.active = false;
18707      _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.updateImage(element);
18708    }
18709  }]);
18710
18711  return ArrowAnnotateTool;
18712}(_base_BaseAnnotationTool_js__WEBPACK_IMPORTED_MODULE_6__["default"]);
18713
18714
18715
18716function getTextCallback(doneChangingTextCallback) {
18717  doneChangingTextCallback(prompt('Enter your annotation:'));
18718}
18719
18720function changeTextCallback(data, eventData, doneChangingTextCallback) {
18721  doneChangingTextCallback(prompt('Change your annotation:'));
18722}
18723
18724/***/ }),
18725
18726/***/ "./tools/annotation/BidirectionalTool.js":
18727/*!***********************************************!*\
18728  !*** ./tools/annotation/BidirectionalTool.js ***!
18729  \***********************************************/
18730/*! exports provided: default */
18731/***/ (function(module, __webpack_exports__, __webpack_require__) {
18732
18733"use strict";
18734__webpack_require__.r(__webpack_exports__);
18735/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return BidirectionalTool; });
18736/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js");
18737/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
18738/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js");
18739/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
18740/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js");
18741/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
18742/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js");
18743/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
18744/* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/assertThisInitialized */ "../node_modules/@babel/runtime/helpers/assertThisInitialized.js");
18745/* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4__);
18746/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js");
18747/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__);
18748/* harmony import */ var _base_BaseAnnotationTool_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../base/BaseAnnotationTool.js */ "./tools/base/BaseAnnotationTool.js");
18749/* harmony import */ var _bidirectionalTool_createNewMeasurement_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./bidirectionalTool/createNewMeasurement.js */ "./tools/annotation/bidirectionalTool/createNewMeasurement.js");
18750/* harmony import */ var _bidirectionalTool_pointNearTool_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./bidirectionalTool/pointNearTool.js */ "./tools/annotation/bidirectionalTool/pointNearTool.js");
18751/* harmony import */ var _bidirectionalTool_renderToolData_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./bidirectionalTool/renderToolData.js */ "./tools/annotation/bidirectionalTool/renderToolData.js");
18752/* harmony import */ var _bidirectionalTool_addNewMeasurement_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./bidirectionalTool/addNewMeasurement.js */ "./tools/annotation/bidirectionalTool/addNewMeasurement.js");
18753/* harmony import */ var _bidirectionalTool_mouseMoveCallback_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./bidirectionalTool/mouseMoveCallback.js */ "./tools/annotation/bidirectionalTool/mouseMoveCallback.js");
18754/* harmony import */ var _bidirectionalTool_handleSelectedCallback_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./bidirectionalTool/handleSelectedCallback.js */ "./tools/annotation/bidirectionalTool/handleSelectedCallback.js");
18755/* harmony import */ var _bidirectionalTool_handleSelectedMouseCallback_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./bidirectionalTool/handleSelectedMouseCallback.js */ "./tools/annotation/bidirectionalTool/handleSelectedMouseCallback.js");
18756/* harmony import */ var _bidirectionalTool_handleSelectedTouchCallback_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./bidirectionalTool/handleSelectedTouchCallback.js */ "./tools/annotation/bidirectionalTool/handleSelectedTouchCallback.js");
18757/* harmony import */ var _cursors_index_js__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../cursors/index.js */ "./tools/cursors/index.js");
18758/* harmony import */ var _util_throttle__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../../util/throttle */ "./util/throttle.js");
18759/* harmony import */ var _util_getPixelSpacing__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../../util/getPixelSpacing */ "./util/getPixelSpacing.js");
18760/* harmony import */ var _bidirectionalTool_utils_calculateLongestAndSh
18760ortestDiameters__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./bidirectionalTool/utils/calculateLongestAndShortestDiameters */ "./tools/annotation/bidirectionalTool/utils/calculateLongestAndShortestDiameters.js");
18761
18762
18763
18764
18765
18766
18767
18768
18769
18770
18771
18772
18773
18774
18775
18776
18777
18778
18779
18780
18781var emptyLocationCallback = function emptyLocationCallback(measurementData, eventData, doneCallback) {
18782  return doneCallback();
18783};
18784/**
18785 * @public
18786 * @class BidirectionalTool
18787 * @memberof Tools.Annotation
18788 * @classdesc Create and position an annotation that measures the
18789 * length and width of a region.
18790 * @extends Tools.Base.BaseAnnotationTool
18791 */
18792
18793
18794var BidirectionalTool =
18795/*#__PURE__*/
18796function (_BaseAnnotationTool) {
18797  _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default()(BidirectionalTool, _BaseAnnotationTool);
18798
18799  function BidirectionalTool(props) {
18800    var _this;
18801
18802    _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, BidirectionalTool);
18803
18804    var defaultProps = {
18805      name: 'Bidirectional',
18806      supportedInteractionTypes: ['Mouse', 'Touch'],
18807      configuration: {
18808        changeMeasurementLocationCallback: emptyLocationCallback,
18809        getMeasurementLocationCallback: emptyLocationCallback,
18810        textBox: '',
18811        shadow: '',
18812        drawHandlesOnHover: true,
18813        additionalData: []
18814      },
18815      svgCursor: _cursors_index_js__WEBPACK_IMPORTED_MODULE_15__["bidirectionalCursor"]
18816    };
18817    _this = _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(BidirectionalTool).call(this, props, defaultProps));
18818    _this.throttledUpdateCachedStats = Object(_util_throttle__WEBPACK_IMPORTED_MODULE_16__["default"])(_this.updateCachedStats, 110);
18819    _this.createNewMeasurement = _bidirectionalTool_createNewMeasurement_js__WEBPACK_IMPORTED_MODULE_7__["default"].bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this));
18820    _this.pointNearTool = _bidirectionalTool_pointNearTool_js__WEBPACK_IMPORTED_MODULE_8__["default"].bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this));
18821    _this.renderToolData = _bidirectionalTool_renderToolData_js__WEBPACK_IMPORTED_MODULE_9__["default"].bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this));
18822    _this.addNewMeasurement = _bidirectionalTool_addNewMeasurement_js__WEBPACK_IMPORTED_MODULE_10__["default"].bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this));
18823    _this._moveCallback = _bidirectionalTool_mouseMoveCallback_js__WEBPACK_IMPORTED_MODULE_11__["default"].bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this));
18824    _this.handleSelectedCallback = _bidirectionalTool_handleSelectedCallback_js__WEBPACK_IMPORTED_MODULE_12__["default"].bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this));
18825    _this.handleSelectedMouseCallback = _bidirectionalTool_handleSelectedMouseCallback_js__WEBPACK_IMPORTED_MODULE_13__["default"].bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this));
18826    _this.handleSelectedTouchCallback = _bidirectionalTool_handleSelectedTouchCallback_js__WEBPACK_IMPORTED_MODULE_14__["default"].bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this));
18827    return _this;
18828  }
18829
18830  _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(BidirectionalTool, [{
18831    key: "updateCachedStats",
18832    value: function updateCachedStats(image, element, data) {
18833      var pixelSpacing = Object(_util_getPixelSpacing__WEBPACK_IMPORTED_MODULE_17__["default"])(image);
18834
18835      var _calculateLongestAndS = Object(_bidirectionalTool_utils_calculateLongestAndShortestDiameters__WEBPACK_IMPORTED_MODULE_18__["default"])(data, pixelSpacing),
18836          longestDiameter = _calculateLongestAndS.longestDiameter,
18837          shortestDiameter = _calculateLongestAndS.shortestDiameter; // Set measurement text to show lesion table
18838
18839
18840      data.longestDiameter = longestDiameter;
18841      data.shortestDiameter = shortestDiameter;
18842      data.invalidated = false;
18843    }
18844  }]);
18845
18846  return BidirectionalTool;
18847}(_base_BaseAnnotationTool_js__WEBPACK_IMPORTED_MODULE_6__["default"]);
18848
18849
18850
18851/***/ }),
18852
18853/***/ "./tools/annotation/CircleRoiTool.js":
18854/*!*******************************************!*\
18855  !*** ./tools/annotation/CircleRoiTool.js ***!
18856  \*******************************************/
18857/*! exports provided: default */
18858/***/ (function(module, __webpack_exports__, __webpack_require__) {
18859
18860"use strict";
18861__webpack_require__.r(__webpack_exports__);
18862/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return CircleRoiTool; });
18863/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js");
18864/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
18865/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js");
18866/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
18867/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js");
18868/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
18869/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js");
18870/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
18871/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js");
18872/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__);
18873/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./../../externalModules.js */ "./externalModules.js");
18874/* harmony import */ var _base_BaseAnnotationTool_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../base/BaseAnnotationTool.js */ "./tools/base/BaseAnnotationTool.js");
18875/* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./../../stateManagement/toolState.js */ "./stateManagement/toolState.js");
18876/* harmony import */ var _stateManagement_toolStyle_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./../../stateManagement/toolStyle.js */ "./stateManagement/toolStyle.js");
18877/* harmony import */ var _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./../../stateManagement/toolColors.js */ "./stateManagement/toolColors.js");
18878/* harmony import */ var _drawing_index_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./../../drawing/index.js */ "./drawing/index.js");
18879/* harmony import */ var _util_calculateSUV_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./../../util/calculateSUV.js */ "./util/calculateSUV.js");
18880/* harmony import */ var _util_ellipse_index_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./../../util/ellipse/index.js */ "./util/ellipse/index.js");
18881/* harmony import */ var _util_getROITextBoxCoords_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../../util/getROITextBoxCoords.js */ "./util/getROITextBoxCoords.js");
18882/* harmony import */ var _util_numbersWithCommas_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./../../util/numbersWithCommas.js */ "./util/numbersWithCommas.js");
18883/* harmony import */ var _util_throttle_js__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./../../util/throttle.js */ "./util/throttle.js");
18884/* harmony import */ var _util_logger_js__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../../util/logger.js */ "./util/logger.js");
18885/* harmony import */ var _util_getPixelSpacing__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../../util/getPixelSpacing */ "./util/getPixelSpacing.js");
18886/* harmony import */ var _cursors_index_js__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../cursors/index.js */ "./tools/cursors/index.js");
18887
18888
18889
18890
18891
18892
18893 // State
18894
18895
18896
18897 // Drawing
18898
18899 // Util
18900
18901
18902
18903
18904
18905
18906
18907
18908
18909var logger = Object(_util_logger_js__WEBPACK_IMPORTED_MODULE_16__["getLogger"])('tools:annotation:CircleRoiTool');
18910/**
18911 * @public
18912 * @class CircleRoiTool
18913 * @memberof Tools.Annotation
18914 * @classdesc Tool for drawing circular regions of interest, and measuring
18915 * the statistics of the enclosed pixels.
18916 * @extends Tools.Base.BaseAnnotationTool
18917 */
18918
18919var CircleRoiTool =
18920/*#__PURE__*/
18921function (_BaseAnnotationTool) {
18922  _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(CircleRoiTool, _BaseAnnotationTool);
18923
18924  function CircleRoiTool() {
18925    var _this;
18926
18927    var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
18928
18929    _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, CircleRoiTool);
18930
18931    var defaultProps = {
18932      name: 'CircleRoi',
18933      supportedInteractionTypes: ['Mouse', 'Touch'],
18934      svgCursor: _cursors_index_js__WEBPACK_IMPORTED_MODULE_18__["circleRoiCursor"]
18935    };
18936    _this = _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(CircleRoiTool).call(this, props, defaultProps));
18937    _this.throttledUpdateCachedStats = Object(_util_throttle_js__WEBPACK_IMPORTED_MODULE_15__["default"])(_this.updateCachedStats, 110);
18938    return _this;
18939  }
18940
18941  _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(CircleRoiTool, [{
18942    key: "createNewMeasurement",
18943    value: function createNewMeasurement(eventData) {
18944      var goodEventData = eventData && eventData.currentPoints && eventData.currentPoints.image;
18945
18946      if (!goodEventData) {
18947        logger.error("required eventData not supplied to tool ".concat(this.name, "'s createNewMeasurement"));
18948        return;
18949      }
18950
18951      return {
18952        visible: true,
18953        active: true,
18954        color: undefined,
18955        invalidated: true,
18956        handles: {
18957          start: {
18958            x: eventData.currentPoints.image.x,
18959            y: eventData.currentPoints.image.y,
18960            highlight: true,
18961            active: false
18962          },
18963          end: {
18964            x: eventData.currentPoints.image.x,
18965            y: eventData.currentPoints.image.y,
18966            highlight: true,
18967            active: true
18968          },
18969          initialRotation: eventData.viewport.rotation,
18970          textBox: {
18971            active: false,
18972            hasMoved: false,
18973            movesIndependently: false,
18974            drawnIndependently: true,
18975            allowedOutsideImage: true,
18976            hasBoundingBox: true
18977          }
18978        }
18979      };
18980    }
18981  }, {
18982    key: "pointNearTool",
18983    value: function pointNearTool(element, data, coords, interactionType) {
18984      var hasStartAndEndHandles = data && data.handles && data.handles.start && data.handles.end;
18985
18986      if (!hasStartAndEndHandles) {
18987        logger.warn("invalid parameters supplied to tool ".concat(this.name, "'s pointNearTool"));
18988      }
18989
18990      if (!hasStartAndEndHandles || data.visible === false) {
18991        return false;
18992      }
18993
18994      var distance = interactionType === 'mouse' ? 15 : 25;
18995      var startCanvas = _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.pixelToCanvas(element, data.handles.start);
18996      var endCanvas = _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.pixelToCanvas(element, data.handles.end); // StartCanvas is the center of the circle
18997
18998      var distanceFromCenter = _getDistance(startCanvas, coords); // Getting radius of circle annotation in canvas
18999
19000
19001      var radius = _getDistance(startCanvas, endCanvas); // Checking if point is near the tool by comparing its distance from the center of the circle
19002
19003
19004      return distanceFromCenter > radius - distance / 2 && distanceFromCenter < radius + distance / 2;
19005    }
19006  }, {
19007    key: "updateCachedStats",
19008    value: function updateCachedStats(image, element, data) {
19009      var seriesModule = _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.metaData.get('generalSeriesModule', image.imageId) || {};
19010      var modality = seriesModule.modality;
19011      var pixelSpacing = Object(_util_getPixelSpacing__WEBPACK_IMPORTED_MODULE_17__["default"])(image);
19012
19013      var stats = _calculateStats(image, element, data.handles, modality, pixelSpacing);
19014
19015      data.cachedStats = stats;
19016      data.invalidated = false;
19017    }
19018  }, {
19019    key: "renderToolData",
19020    value: function renderToolData(evt) {
19021      var _this2 = this;
19022
19023      var toolData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_7__["getToolState"])(evt.currentTarget, this.name);
19024
19025      if (!toolData) {
19026        return;
19027      }
19028
19029      var eventData = evt.detail;
19030      var image = eventData.image,
19031          element = eventData.element,
19032          canvasContext = eventData.canvasContext;
19033      var lineWidth = _stateManagement_toolStyle_js__WEBPACK_IMPORTED_MODULE_8__["default"].getToolW
19033idth();
19034      var _this$configuration = this.configuration,
19035          handleRadius = _this$configuration.handleRadius,
19036          drawHandlesOnHover = _this$configuration.drawHandlesOnHover;
19037      var newContext = Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_10__["getNewContext"])(canvasContext.canvas);
19038
19039      var _getPixelSpacing = Object(_util_getPixelSpacing__WEBPACK_IMPORTED_MODULE_17__["default"])(image),
19040          rowPixelSpacing = _getPixelSpacing.rowPixelSpacing,
19041          colPixelSpacing = _getPixelSpacing.colPixelSpacing; // Meta
19042
19043
19044      var seriesModule = _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.metaData.get('generalSeriesModule', image.imageId) || {}; // Pixel Spacing
19045
19046      var modality = seriesModule.modality;
19047      var hasPixelSpacing = rowPixelSpacing && colPixelSpacing;
19048      Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_10__["draw"])(newContext, function (context) {
19049        // If we have tool data for this element, iterate over each set and draw it
19050        for (var i = 0; i < toolData.data.length; i++) {
19051          var data = toolData.data[i];
19052
19053          if (data.visible === false) {
19054            continue;
19055          } // Configure
19056
19057
19058          var color = _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_9__["default"].getColorIfActive(data);
19059          var handleOptions = {
19060            color: color,
19061            handleRadius: handleRadius,
19062            drawHandlesIfActive: drawHandlesOnHover
19063          };
19064          Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_10__["setShadow"])(context, _this2.configuration);
19065          var startCanvas = _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.pixelToCanvas(element, data.handles.start);
19066          var endCanvas = _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.pixelToCanvas(element, data.handles.end); // Calculating the radius where startCanvas is the center of the circle to be drawn
19067
19068          var radius = _getDistance(startCanvas, endCanvas); // Draw Circle
19069
19070
19071          Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_10__["drawCircle"])(context, element, data.handles.start, radius, {
19072            color: color
19073          }, 'pixel');
19074          Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_10__["drawHandles"])(context, eventData, data.handles, handleOptions); // Update textbox stats
19075
19076          if (data.invalidated === true) {
19077            if (data.cachedStats) {
19078              _this2.throttledUpdateCachedStats(image, element, data);
19079            } else {
19080              _this2.updateCachedStats(image, element, data);
19081            }
19082          } // Default to textbox on right side of ROI
19083
19084
19085          if (!data.handles.textBox.hasMoved) {
19086            var defaultCoords = Object(_util_getROITextBoxCoords_js__WEBPACK_IMPORTED_MODULE_13__["default"])(eventData.viewport, data.handles);
19087            Object.assign(data.handles.textBox, defaultCoords);
19088          }
19089
19090          var textBoxAnchorPoints = function textBoxAnchorPoints(handles) {
19091            return _findTextBoxAnchorPoints(handles.start, handles.end);
19092          };
19093
19094          var textBoxContent = _createTextBoxContent(context, image.color, data.cachedStats, modality, hasPixelSpacing, _this2.configuration);
19095
19096          Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_10__["drawLinkedTextBox"])(context, element, data.handles.textBox, textBoxContent, data.handles, textBoxAnchorPoints, color, lineWidth, 10, true);
19097        }
19098      });
19099    }
19100  }]);
19101
19102  return CircleRoiTool;
19103}(_base_BaseAnnotationTool_js__WEBPACK_IMPORTED_MODULE_6__["default"]);
19104/**
19105 *
19106 *
19107 * @param {*} startHandle
19108 * @param {*} endHandle
19109 * @returns {Array.<{x: number, y: number}>}
19110 */
19111
19112
19113
19114
19115function _findTextBoxAnchorPoints(startHandle, endHandle) {
19116  var _getCirlceImageCoodin = _getCirlceImageCoodinates(startHandle, endHandle),
19117      left = _getCirlceImageCoodin.left,
19118      top = _getCirlceImageCoodin.top,
19119      width = _getCirlceImageCoodin.width,
19120      height = _getCirlceImageCoodin.height;
19121
19122  return [{
19123    // Top middle point of ellipse
19124    x: left + width / 2,
19125    y: top
19126  }, {
19127    // Left middle point of ellipse
19128    x: left,
19129    y: top + height / 2
19130  }, {
19131    // Bottom middle point of ellipse
19132    x: left + width / 2,
19133    y: top + height
19134  }, {
19135    // Right middle point of ellipse
19136    x: left + width,
19137    y: top + height / 2
19138  }];
19139}
19140/**
19141 *
19142 *
19143 * @param {*} context
19144 * @param {*} isColorImage
19145 * @param {*} { area, mean, stdDev, min, max, meanStdDevSUV }
19146 * @param {*} modality
19147 * @param {*} hasPixelSpacing
19148 * @param {*} [options={}] - { showMinMax, showHounsfieldUnits }
19149 * @returns {string[]}
19150 */
19151
19152
19153function _createTextBoxContent(context, isColorImage) {
19154  var _ref = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},
19155      area = _ref.area,
19156      mean = _ref.mean,
19157      stdDev = _ref.stdDev,
19158      min = _ref.min,
19159      max = _ref.max,
19160      meanStdDevSUV = _ref.meanStdDevSUV;
19161
19162  var modality = arguments.length > 3 ? arguments[3] : undefined;
19163  var hasPixelSpacing = arguments.length > 4 ? arguments[4] : undefined;
19164  var options = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : {};
19165  var showMinMax = options.showMinMax || false;
19166  var showHounsfieldUnits = options.showHounsfieldUnits !== false;
19167  var textLines = []; // Don't display mean/standardDev for color images
19168
19169  var otherLines = [];
19170
19171  if (!isColorImage) {
19172    var hasStandardUptakeValues = meanStdDevSUV && meanStdDevSUV.mean !== 0;
19173    var suffix = modality === 'CT' && showHounsfieldUnits ? ' HU' : '';
19174    var meanString = "Mean: ".concat(Object(_util_numbersWithCommas_js__WEBPACK_IMPORTED_MODULE_14__["default"])(mean.toFixed(2))).concat(suffix);
19175    var stdDevString = "Std Dev: ".concat(Object(_util_numbersWithCommas_js__WEBPACK_IMPORTED_MODULE_14__["default"])(stdDev.toFixed(2))).concat(suffix); // If this image has SUV values to display, concatenate them to the text line
19176
19177    if (hasStandardUptakeValues) {
19178      var SUVtext = ' SUV: ';
19179      var meanSuvString = "".concat(SUVtext).concat(Object(_util_numbersWithCommas_js__WEBPACK_IMPORTED_MODULE_14__["default"])(meanStdDevSUV.mean.toFixed(2)));
19180      var stdDevSuvString = "".concat(SUVtext).concat(Object(_util_numbersWithCommas_js__WEBPACK_IMPORTED_MODULE_14__["default"])(meanStdDevSUV.stdDev.toFixed(2)));
19181      var targetStringLength = Math.floor(context.measureText("".concat(stdDevString, "     ")).width);
19182
19183      while (context.measureText(meanString).width < targetStringLength) {
19184        meanString += ' ';
19185      }
19186
19187      otherLines.push("".concat(meanString).concat(meanSuvString));
19188      otherLines.push("".concat(stdDevString, "     ").concat(stdDevSuvString));
19189    } else {
19190      otherLines.push("".concat(meanString, "     ").concat(stdDevString));
19191    }
19192
19193    if (showMinMax) {
19194      var minString = "Min: ".concat(min).concat(suffix);
19195      var maxString = "Max: ".concat(max).concat(suffix);
19196
19197      var _targetStringLength = hasStandardUptakeValues ? Math.floor(context.measureText("".concat(stdDevString, "     ")).width) : Math.floor(context.measureText("".concat(meanString, "     ")).width);
19198
19199      while (context.measureText(minString).width < _targetStringLength) {
19200        minString += ' ';
19201      }
19202
19203      otherLines.push("".concat(minString).concat(maxString));
19204    }
19205  }
19206
19207  textLines.push(_formatArea(area, hasPixelSpacing));
19208  otherLines.forEach(function (x) {
19209    return textLines.push(x);
19210  });
19211  return textLines;
19212}
19213/**
19214 *
19215 *
19216 * @param {*} area
19217 * @param {*} hasPixelSpacing
19218 * @returns {string} The formatted label for showing area
19219 */
19220
19221
19222function _formatArea(area, hasPixelSpacing) {
19223  // This uses Char code 178 for a superscript 2
19224  var suffix = hasPixelSpacing ? " mm".concat(String.fromCharCode(178)) : " px".concat(String.fromCharCode(178));
19225  return "Area: ".concat(Object(_util_numbersWithCommas_js__WEBPACK_IMPORTED_MODULE_14__["default"])(area.toFixed(2))).concat(suffix);
19226}
19227/**
19228 *
19229 *
19230 * @param {*} image
19231 * @param {*} element
19232 * @param {*} handles
19233 * @param {*} modality
19234 * @param {*} pixelSpacing
19235 * @returns {Object} The Stats object
19236 */
19237
19238
19239function _calculateStats(image, element, handles, modality, pixelSpacing) {
19240  // Retrieve the bounds of the ellipse in image coordinates
19241  var circleCoordinates = _getCirlceImageCoodinates(handles.start, handles.end); // Retrieve the array of pixels that the ellipse bounds cover
19242
19243
19244  var pixels = _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.getPixels(element, circleCoordinates.left, circleCoordinates.top, circleCoordinates.width, circleCoordinates.height); // Calculate the mean & standard deviation from the pixels and the ellipse details.
19245
19246  var ellipseMeanStdDev = Object(_util_ellipse_index_js__WEBPACK_IMPORTED_MODULE_12__["calculateEllipseStatistics"])(pixels, circleCoordinates);
19247  var meanStdDevSUV;
19248
19249  if (modality === 'PT') {
19250    meanStdDevSUV = {
19251      mean: Object(_util_calculateSUV_js__WEBPACK_IMPORTED_MODULE_11__["default"])(image, ellipseMeanStdDev.mean, true) || 0,
19252      stdDev: Object(_util_calculateSUV_js__WEBPACK_IMPORTED_MODULE_11__["default"])(image, ellipseMeanStdDev.stdDev, true) || 0
19253    };
19254  }
19255
19256  var area = Math.PI * (circleCoordinates.width * (pixelSpacing.colPixelSpacing || 1) / 2) * (circleCoordinates.height * (pixelSpacing.rowPixelSpacing || 1) / 2);
19257  return {
19258    area: area || 0,
19259    count: ellipseMeanStdDev.count || 0,
19260    mean: ellipseMeanStdDev.mean || 0,
19261    variance: ellipseMeanStdDev.variance || 0,
19262    stdDev: ellipseMeanStdDev.stdDev || 0,
19263    min: ellipseMeanStdDev.min || 0,
19264    max: ellipseMeanStdDev.max || 0,
19265    meanStdDevSUV: meanStdDevSUV
19266  };
19267}
19268/**
19269 * Retrieve the bounds of the ellipse in image coordinates
19270 *
19271 * @param {*} startHandle
19272 * @param {*} endHandle
19273 * @returns {{ left: number, top: number, width: number, height: number }}
19274 */
19275
19276
19277function _getCirlceImageCoodinates(startHandle, endHandle) {
19278  var radius = _getDistance(startHandle, endHandle);
19279
19280  return {
19281    left: Math.round(Math.min(startHandle.x - radius, endHandle.x)),
19282    top: Math.round(Math.min(startHandle.y - radius, endHandle.y)),
19283    width: radius * 2,
19284    height: radius * 2
19285  };
19286}
19287/**
19288 * Returns the distance in canvas from the given coords to the center of the circle annotation.
19289 *
19290 * @param {*} startCoords - start point cooridnates
19291 * @param {*} endCoords - end point cooridnates
19292 * @returns {number} number - the distance between two points (start and end)
19293 */
19294
19295
19296function _getDistance(startCoords, endCoords) {
19297  var dx = startCoords.x - endCoords.x;
19298  var dy = startCoords.y - endCoords.y;
19299  return Math.sqrt(dx * dx + dy * dy);
19300}
19301
19302/***/ }),
19303
19304/***/ "./tools/annotation/CobbAngleTool.js":
19305/*!*******************************************!*\
19306  !*** ./tools/annotation/CobbAngleTool.js ***!
19307  \*******************************************/
19308/*! exports provided: default */
19309/***/ (function(module, __webpack_exports__, __webpack_require__) {
19310
19311"use strict";
19312__webpack_require__.r(__webpack_exports__);
19313/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return CobbAngleTool; });
19314/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js");
19315/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
19316/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js");
19317/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
19318/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js");
19319/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
19320/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js");
19321/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
19322/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js");
19323/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__);
19324/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./../../externalModules.js */ "./externalModules.js");
19325/* harmony import */ var _base_BaseAnnotationTool_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../base/BaseAnnotationTool.js */ "./tools/base/BaseAnnotationTool.js");
19326/* harmony import */ var _stateManagement_textStyle_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./../../stateManagement/textStyle.js */ "./stateManagement/textStyle.js");
19327/* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./../../stateManagement/toolState.js */ "./stateManagement/toolState.js");
19328/* harmony import */ var _stateManagement_toolStyle_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./../../stateManagement/toolStyle.js */ "./stateManagement/toolStyle.js");
19329/* harmony import */ var _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./../../stateManagement/toolColors.js */ "./stateManagement/toolColors.js");
19330/* harmony import */ var _manipulators_index_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./../../manipulators/index.js */ "./manipulators/index.js");
19331/* harmony import */ var _drawing_index_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./../../drawing/index.js */ "./drawing/index.js");
19332/* harmony import */ var _drawing_drawHandles_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./../../drawing/drawHandles.js */ "./drawing/drawHandles.js");
19333/* harmony import */ var _drawing_drawLinkedTextBox_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./../../drawing/drawLinkedTextBox.js */ "./drawing/drawLinkedTextBox.js");
19334/* harmony import */ var _util_lineSegDistance_js__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./../../util/lineSegDistance.js */ "./util/lineSegDistance.js");
19335/* harmony import */ var _util_roundToDecimal_js__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./../../util/roundToDecimal.js */ "./util/roundToDecimal.js");
19336/* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./../../events.js */ "./events.js");
19337/* harmony import */ var _cursors_index_js__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../cursors/index.js */ "./tools/cursors/index.js");
19338/* harmony import */ var _util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../../util/triggerEvent.js */ "./util/triggerEvent.js");
19339/* harmony import */ var _util_throttle__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ../../util/throttle */ "./util/throttle.js");
19340/* harmony import */ var _util_getPixelSpacing__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ../../util/getPixelSpacing */ "./util/getPixelSpacing.js");
19341
19342
19343
19344
19345
19346
19347 // State
19348
19349
19350
19351
19352 // Manipulators
19353
19354 // Drawing
19355
19356
19357
19358
19359
19360
19361
19362
19363
19364
19365
19366/**
19367 * @public
19368 * @class CobbAngleTool
19369 * @memberof Tools.Annotation
19370 * @classdesc Tool for measuring the angle between two straight lines.
19371 * @extends Tools.Base.BaseAnnotationTool
19372 */
19373
19374var CobbAngleTool =
19375/*#__PURE__*/
19376function (_BaseAnnotationTool) {
19377  _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(CobbAngleTool, _BaseAnnotationTool);
19378
19379  function CobbAngleTool() {
19380    var _this;
19381
19382    var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
19383
19384    _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, CobbAngleTool);
19385
19386    var defaultProps = {
19387      name: 'CobbAngle',
19388      supportedInteractionTypes: ['Mouse', 'Touch'],
19389      svgCursor: _cursors_index_js__WEBPACK_IMPORTED_MODULE_18__["cobbAngleCursor"]
19390    };
19391    _this = _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(CobbAngleTool).call(this, props, defaultProps));
19392    _this.hasIncomplete = false;
19393    _this.throttledUpdateCachedStats = Object(_util_throttle__WEBPACK_IMPORTED_MODULE_20__["default"])(_this.updateCachedStats, 110);
19394    return _this;
19395  }
19396
19397  _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(CobbAngleTool, [{
19398    key: "createNewMeasurement",
19399    value: function createNewMeasurement(eventData) {
19400      // Create the measurement data for this tool with the end handle activated
19401      this.hasIncomplete = true;
19402      return {
19403        visible: true,
19404        active: true,
19405        color: undefined,
19406        invalidated: true,
19407        complete: false,
19408        value: '',
19409        handles: {
19410          start: {
19411            x: eventData.currentPoints.image.x,
19412            y: eventData.currentPoints.image.y,
19413            highlight: true,
19414            active: false
19415          },
19416          end: {
19417            x: eventData.currentPoints.image.x,
19418            y: eventData.currentPoints.image.y,
19419            highlight: true,
19420            active: true
19421          },
19422          start2: {
19423            x: eventData.currentPoints.image.x,
19424            y: eventData.currentPoints.image.y,
19425            highlight: true,
19426            active: false,
19427            drawnIndependently: true
19428          },
19429          end2: {
19430            x: eventData.currentPoints.image.x + 1,
19431            y: eventData.currentPoints.image.y,
19432            highlight: true,
19433            active: false,
19434            drawnIndependently: true
19435          },
19436          textBox: {
19437            active: false,
19438            hasMoved: false,
19439            movesIndependently: false,
19440            drawnIndependently: true,
19441            allowedOutsideImage: true,
19442            hasBoundingBox: true
19443          }
19444        }
19445      };
19446    }
19447    /**
19448     *
19449     *
19450     * @param {*} element
19451     * @param {*} data
19452     * @param {*} coords
19453     * @returns {Boolean}
19454     */
19455
19456  }, {
19457    key: "pointNearTool",
19458    value: function pointNearTool(element, data, coords) {
19459      if (data.visible === false) {
19460        return false;
19461      }
19462
19463      if (this.hasIncomplete) {
19464        return false;
19465      }
19466
19467      return Object(_util_lineSegDistance_js__WEBPACK_IMPORTED_MODULE_15__["default"])(element, data.handles.start, data.handles.end, coords) < 25 || Object(_util_lineSegDistance_js__WEBPACK_IMPORTED_MODULE_15__["default"])(element, data.handles.start2, data.handles.end2, coords) < 25;
19468    }
19469  }, {
19470    key: "updateCachedStats",
19471    value: function updateCachedStats(image, element, data) {
19472      var _getPixelSpacing = Object(_util_getPixelSpacing__WEBPACK_IMPORTED_MODULE_21__["default"])(image),
19473          rowPixelSpacing = _getPixelSpacing.rowPixelSpacing,
19474          colPixelSpacing = _getPixelSpacing.colPixelSpacing;
19475
19476      var dx1 = (Math.ceil(data.handles.start.x) - Math.ceil(data.handles.end.x)) * colPixelSpacing;
19477      var dy1 = (Math.ceil(data.handles.start.y) - Math.ceil(data.handles.end.y)) * rowPixelSpacing;
19478      var dx2 = (Math.ceil(data.handles.start2.x) - Math.ceil(data.handles.end2.x)) * colPixelSpacing;
19479      var dy2 = (Math.ceil(data.handles.start2.y) - Math.ceil(data.handles.end2.y)) * rowPixelSpacing;
19480      var angle = Math.acos(Math.abs((dx1 * dx2 + dy1 * dy2) / (Math.sqrt(dx1 * dx1 + dy1 * dy1) * Math.sqrt(dx2 * dx2 + dy2 * dy2))));
19481      angle *= 180 / Math.PI;
19482      data.rAngle = Object(_util_roundToDecimal_js__WEBPACK_IMPORTED_MODULE_16__["default"])(angle, 2);
19483      data.invalidated = false;
19484    }
19485  }, {
19486    key: "renderToolData",
19487    value: function renderToolData(evt) {
19488      var _this2 = this;
19489
19490      var eventData = evt.detail;
19491      var _this$configuration = this.configuration,
19492          handleRadius = _this$configuration.handleRadius,
19493          drawHandlesOnHover = _this$configuration.drawHandlesOnHover; // If we have no toolData for this element, return immediately as there is nothing to do
19494
19495      var toolData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_8__["getToolState"])(evt.currentTarget, this.name);
19496
19497      if (!toolData) {
19498        return;
19499      } // We have tool data for this element - iterate over each one and draw it
19500
19501
19502      var context = Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_12__["getNewContext"])(eventData.canvasContext.canvas);
19503      var lineWidth = _stateManagement_toolStyle_js__WEBPACK_IMPORTED_MODULE_9__["default"].getToolW
19503idth();
19504      var font = _stateManagement_textStyle_js__WEBPACK_IMPORTED_MODULE_7__["default"].getFont();
19505
19506      var _loop = function _loop(i) {
19507        var data = toolData.data[i];
19508
19509        if (data.visible === false) {
19510          return "continue";
19511        }
19512
19513        Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_12__["draw"])(context, function (context) {
19514          Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_12__["setShadow"])(context, _this2.configuration); // Differentiate the color of activation tool
19515
19516          var color = _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_10__["default"].getColorIfActive(data);
19517          Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_12__["drawLine"])(context, eventData.element, data.handles.start, data.handles.end, {
19518            color: color
19519          });
19520
19521          if (data.complete) {
19522            Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_12__["drawLine"])(context, eventData.element, data.handles.start2, data.handles.end2, {
19523              color: color
19524            });
19525          } // Draw the handles
19526
19527
19528          var handleOptions = {
19529            color: color,
19530            handleRadius: handleRadius,
19531            drawHandlesIfActive: drawHandlesOnHover
19532          };
19533          Object(_drawing_drawHandles_js__WEBPACK_IMPORTED_MODULE_13__["default"])(context, eventData, data.handles, handleOptions); // Draw the text
19534
19535          context.fillStyle = color;
19536          var text = data.value;
19537
19538          if (!data.handles.textBox.hasMoved) {
19539            var textCoords = {
19540              x: (data.handles.start.x + data.handles.end.x) / 2,
19541              y: (data.handles.start.y + data.handles.end.y) / 2 - 10
19542            };
19543            context.font = font;
19544            data.handles.textBox.x = textCoords.x;
19545            data.handles.textBox.y = textCoords.y;
19546          }
19547
19548          Object(_drawing_drawLinkedTextBox_js__WEBPACK_IMPORTED_MODULE_14__["default"])(context, eventData.element, data.handles.textBox, text, data.handles, textBoxAnchorPoints, color, lineWidth, 0, true);
19549        });
19550      };
19551
19552      for (var i = 0; i < toolData.data.length; i++) {
19553        var _ret = _loop(i);
19554
19555        if (_ret === "continue") continue;
19556      }
19557
19558      function textBoxAnchorPoints(handles) {
19559        return [handles.start, handles.start2, handles.end, handles.end2];
19560      }
19561    }
19562  }, {
19563    key: "getIncomplete",
19564    value: function getIncomplete(element) {
19565      var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_8__["getToolState"])(element, this.name);
19566
19567      if (toolState && Array.isArray(toolState.data)) {
19568        return toolState.data.find(function (_ref) {
19569          var complete = _ref.complete;
19570          return complete === false;
19571        });
19572      }
19573    }
19574  }, {
19575    key: "addNewMeasurement",
19576    value: function addNewMeasurement(evt, interactionType) {
19577      var _this3 = this;
19578
19579      evt.preventDefault();
19580      evt.stopPropagation();
19581      var eventData = evt.detail;
19582      var measurementData;
19583      var toMoveHandle;
19584      var options; // Search for incomplete measurements
19585
19586      var element = evt.detail.element;
19587      var pendingMeasurement = this.getIncomplete(element);
19588
19589      if (pendingMeasurement) {
19590        measurementData = pendingMeasurement;
19591        measurementData.complete = true;
19592        measurementData.handles.start2 = {
19593          x: eventData.currentPoints.image.x,
19594          y: eventData.currentPoints.image.y,
19595          drawnIndependently: false,
19596          highlight: true,
19597          active: false
19598        };
19599        measurementData.handles.end2 = {
19600          x: eventData.currentPoints.image.x,
19601          y: eventData.currentPoints.image.y,
19602          drawnIndependently: false,
19603          highlight: true,
19604          active: true
19605        };
19606        toMoveHandle = measurementData.handles.end2;
19607        this.hasIncomplete = false;
19608        options = Object.assign({
19609          doneMovingCallback: function doneMovingCallback() {
19610            var eventType = _events_js__WEBPACK_IMPORTED_MODULE_17__["default"].MEASUREMENT_COMPLETED;
19611            var eventData = {
19612              toolType: _this3.name,
19613              element: element,
19614              measurementData: measurementData
19615            };
19616            Object(_util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_19__["default"])(element, eventType, eventData);
19617          }
19618        }, this.options);
19619      } else {
19620        measurementData = this.createNewMeasurement(eventData);
19621        Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_8__["addToolState"])(element, this.name, measurementData);
19622        toMoveHandle = measurementData.handles.end;
19623        options = this.options;
19624      } // Associate this data with this imageId so we can render it and manipulate it
19625
19626
19627      _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.updateImage(element);
19628      Object(_manipulators_index_js__WEBPACK_IMPORTED_MODULE_11__["moveNewHandle"])(eventData, this.name, measurementData, toMoveHandle, options, interactionType);
19629    }
19630  }, {
19631    key: "onMeasureModified",
19632    value: function onMeasureModified(ev) {
19633      var element = ev.detail.element;
19634      var image = _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.getEnabledElement(element).image;
19635
19636      var _getPixelSpacing2 = Object(_util_getPixelSpacing__WEBPACK_IMPORTED_MODULE_21__["default"])(image),
19637          rowPixelSpacing = _getPixelSpacing2.rowPixelSpacing,
19638          colPixelSpacing = _getPixelSpacing2.colPixelSpacing;
19639
19640      if (ev.detail.toolName !== this.name) {
19641        return;
19642      }
19643
19644      var data = ev.detail.measurementData; // Update textbox stats
19645
19646      if (data.invalidated === true) {
19647        if (data.rAngle) {
19648          this.throttledUpdateCachedStats(image, element, data);
19649        } else {
19650          this.updateCachedStats(image, element, data);
19651        }
19652      }
19653
19654      var rAngle = data.rAngle;
19655      data.value = '';
19656
19657      if (!Number.isNaN(rAngle)) {
19658        data.value = textBoxText(rAngle, rowPixelSpacing, colPixelSpacing);
19659      }
19660
19661      function textBoxText(rAngle, rowPixelSpacing, colPixelSpacing) {
19662        var suffix = !rowPixelSpacing || !colPixelSpacing ? ' (isotropic)' : '';
19663        var str = '00B0'; // Degrees symbol
19664
19665        return rAngle.toString() + String.fromCharCode(parseInt(str, 16)) + suffix;
19666      }
19667    }
19668  }, {
19669    key: "activeCallback",
19670    value: function activeCallback(element) {
19671      this.onMeasureModified = this.onMeasureModified.bind(this);
19672      element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_17__["default"].MEASUREMENT_MODIFIED, this.onMeasureModified);
19673    }
19674  }, {
19675    key: "passiveCallback",
19676    value: function passiveCallback(element) {
19677      this.onMeasureModified = this.onMeasureModified.bind(this);
19678      element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_17__["default"].MEASUREMENT_MODIFIED, this.onMeasureModified);
19679    }
19680  }, {
19681    key: "enabledCallback",
19682    value: function enabledCallback(element) {
19683      element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_17__["default"].MEASUREMENT_MODIFIED, this.onMeasureModified);
19684    }
19685  }, {
19686    key: "disabledCallback",
19687    value: function disabledCallback(element) {
19688      element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_17__["default"].MEASUREMENT_MODIFIED, this.onMeasureModified);
19689    }
19690  }]);
19691
19692  return CobbAngleTool;
19693}(_base_BaseAnnotationTool_js__WEBPACK_IMPORTED_MODULE_6__["default"]);
19694
19695
19696
19697/***/ }),
19698
19699/***/ "./tools/annotation/EllipticalRoiTool.js":
19700/*!***********************************************!*\
19701  !*** ./tools/annotation/EllipticalRoiTool.js ***!
19702  \***********************************************/
19703/*! exports provided: default */
19704/***/ (function(module, __webpack_exports__, __webpack_require__) {
19705
19706"use strict";
19707__webpack_require__.r(__webpack_exports__);
19708/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return EllipticalRoiTool; });
19709/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js");
19710/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
19711/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js");
19712/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
19713/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js");
19714/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
19715/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js");
19716/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
19717/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js");
19718/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__);
19719/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./../../externalModules.js */ "./externalModules.js");
19720/* harmony import */ var _base_BaseAnnotationTool_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../base/BaseAnnotationTool.js */ "./tools/base/BaseAnnotationTool.js");
19721/* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./../../stateManagement/toolState.js */ "./stateManagement/toolState.js");
19722/* harmony import */ var _stateManagement_toolStyle_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./../../stateManagement/toolStyle.js */ "./stateManagement/toolStyle.js");
19723/* harmony import */ var _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./../../stateManagement/toolColors.js */ "./stateManagement/toolColors.js");
19724/* harmony import */ var _drawing_index_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./../../drawing/index.js */ "./drawing/index.js");
19725/* harmony import */ var _util_calculateSUV_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./../../util/calculateSUV.js */ "./util/calculateSUV.js");
19726/* harmony import */ var _util_ellipse_index_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./../../util/ellipse/index.js */ "./util/ellipse/index.js");
19727/* harmony import */ var _util_getROITextBoxCoords_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../../util/getROITextBoxCoords.js */ "./util/getROITextBoxCoords.js");
19728/* harmony import */ var _util_numbersWithCommas_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./../../util/numbersWithCommas.js */ "./util/numbersWithCommas.js");
19729/* harmony import */ var _util_throttle_js__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./../../util/throttle.js */ "./util/throttle.js");
19730/* harmony import */ var _cursors_index_js__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../cursors/index.js */ "./tools/cursors/index.js");
19731/* harmony import */ var _util_logger_js__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../../util/logger.js */ "./util/logger.js");
19732/* harmony import */ var _util_getPixelSpacing__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../../util/getPixelSpacing */ "./util/getPixelSpacing.js");
19733
19734
19735
19736
19737
19738
19739 // State
19740
19741
19742
19743 // Drawing
19744
19745 // Util
19746
19747
19748
19749
19750
19751
19752
19753
19754
19755var logger = Object(_util_logger_js__WEBPACK_IMPORTED_MODULE_17__["getLogger"])('tools:annotation:EllipticalRoiTool');
19756/**
19757 * @public
19758 * @class EllipticalRoiTool
19759 * @memberof Tools.Annotation
19760 * @classdesc Tool for drawing elliptical regions of interest, and measuring
19761 * the statistics of the enclosed pixels.
19762 * @extends Tools.Base.BaseAnnotationTool
19763 */
19764
19765var EllipticalRoiTool =
19766/*#__PURE__*/
19767function (_BaseAnnotationTool) {
19768  _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(EllipticalRoiTool, _BaseAnnotationTool);
19769
19770  function EllipticalRoiTool() {
19771    var _this;
19772
19773    var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
19774
19775    _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, EllipticalRoiTool);
19776
19777    var defaultProps = {
19778      name: 'EllipticalRoi',
19779      supportedInteractionTypes: ['Mouse', 'Touch'],
19780      configuration: {// showMinMax: false,
19781        // showHounsfieldUnits: true,
19782      },
19783      svgCursor: _cursors_index_js__WEBPACK_IMPORTED_MODULE_16__["ellipticalRoiCursor"]
19784    };
19785    _this = _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(EllipticalRoiTool).call(this, props, defaultProps));
19786    _this.throttledUpdateCachedStats = Object(_util_throttle_js__WEBPACK_IMPORTED_MODULE_15__["default"])(_this.updateCachedStats, 110);
19787    return _this;
19788  }
19789
19790  _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(EllipticalRoiTool, [{
19791    key: "createNewMeasurement",
19792    value: function createNewMeasurement(eventData) {
19793      var goodEventData = eventData && eventData.currentPoints && eventData.currentPoints.image;
19794
19795      if (!goodEventData) {
19796        logger.error("required eventData not supplied to tool ".concat(this.name, "'s createNewMeasurement"));
19797        return;
19798      }
19799
19800      return {
19801        visible: true,
19802        active: true,
19803        color: undefined,
19804        invalidated: true,
19805        handles: {
19806          start: {
19807            x: eventData.currentPoints.image.x,
19808            y: eventData.currentPoints.image.y,
19809            highlight: true,
19810            active: false
19811          },
19812          end: {
19813            x: eventData.currentPoints.image.x,
19814            y: eventData.currentPoints.image.y,
19815            highlight: true,
19816            active: true
19817          },
19818          initialRotation: eventData.viewport.rotation,
19819          textBox: {
19820            active: false,
19821            hasMoved: false,
19822            movesIndependently: false,
19823            drawnIndependently: true,
19824            allowedOutsideImage: true,
19825            hasBoundingBox: true
19826          }
19827        }
19828      };
19829    }
19830  }, {
19831    key: "pointNearTool",
19832    value: function pointNearTool(element, data, coords, interactionType) {
19833      var hasStartAndEndHandles = data && data.handles && data.handles.start && data.handles.end;
19834      var validParameters = hasStartAndEndHandles;
19835
19836      if (!validParameters) {
19837        logger.warn("invalid parameters supplied to tool ".concat(this.name, "'s pointNearTool"));
19838      }
19839
19840      if (!validParameters || data.visible === false) {
19841        return false;
19842      }
19843
19844      var distance = interactionType === 'mouse' ? 15 : 25;
19845      var startCanvas = _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.pixelToCanvas(element, data.handles.start);
19846      var endCanvas = _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.pixelToCanvas(element, data.handles.end);
19847      var minorEllipse = {
19848        left: Math.min(startCanvas.x, endCanvas.x) + distance / 2,
19849        top: Math.min(startCanvas.y, endCanvas.y) + distance / 2,
19850        width: Math.abs(startCanvas.x - endCanvas.x) - distance,
19851        height: Math.abs(startCanvas.y - endCanvas.y) - distance
19852      };
19853      var majorEllipse = {
19854        left: Math.min(startCanvas.x, endCanvas.x) - distance / 2,
19855        top: Math.min(startCanvas.y, endCanvas.y) - distance / 2,
19856        width: Math.abs(startCanvas.x - endCanvas.x) + distance,
19857        height: Math.abs(startCanvas.y - endCanvas.y) + distance
19858      };
19859      var pointInMinorEllipse = Object(_util_ellipse_index_js__WEBPACK_IMPORTED_MODULE_12__["pointInEllipse"])(minorEllipse, coords);
19860      var pointInMajorEllipse = Object(_util_ellipse_index_js__WEBPACK_IMPORTED_MODULE_12__["pointInEllipse"])(majorEllipse, coords);
19861
19862      if (pointInMajorEllipse && !pointInMinorEllipse) {
19863        return true;
19864      }
19865
19866      return false;
19867    }
19868  }, {
19869    key: "updateCachedStats",
19870    value: function updateCachedStats(image, element, data) {
19871      var seriesModule = _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.metaData.get('generalSeriesModule', image.imageId) || {};
19872      var modality = seriesModule.modality;
19873      var pixelSpacing = Object(_util_getPixelSpacing__WEBPACK_IMPORTED_MODULE_18__["default"])(image);
19874
19875      var stats = _calculateStats(image, element, data.handles, modality, pixelSpacing);
19876
19877      data.cachedStats = stats;
19878      data.invalidated = false;
19879    }
19880  }, {
19881    key: "renderToolData",
19882    value: function renderToolData(evt) {
19883      var _this2 = this;
19884
19885      var toolData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_7__["getToolState"])(evt.currentTarget, this.name);
19886
19887      if (!toolData) {
19888        return;
19889      }
19890
19891      var eventData = evt.detail;
19892      var image = eventData.image,
19893          element = eventData.element;
19894      var lineWidth = _stateManagement_toolStyle_js__WEBPACK_IMPORTED_MODULE_8__["default"].getToolW
19894idth();
19895      var _this$configuration = this.configuration,
19896          handleRadius = _this$configuration.handleRadius,
19897          drawHandlesOnHover = _this$configuration.drawHandlesOnHover;
19898      var context = Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_10__["getNewContext"])(eventData.canvasContext.canvas);
19899
19900      var _getPixelSpacing = Object(_util_getPixelSpacing__WEBPACK_IMPORTED_MODULE_18__["default"])(image),
19901          rowPixelSpacing = _getPixelSpacing.rowPixelSpacing,
19902          colPixelSpacing = _getPixelSpacing.colPixelSpacing; // Meta
19903
19904
19905      var seriesModule = _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.metaData.get('generalSeriesModule', image.imageId) || {}; // Pixel Spacing
19906
19907      var modality = seriesModule.modality;
19908      var hasPixelSpacing = rowPixelSpacing && colPixelSpacing;
19909      Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_10__["draw"])(context, function (context) {
19910        // If we have tool data for this element - iterate over each set and draw it
19911        for (var i = 0; i < toolData.data.length; i++) {
19912          var data = toolData.data[i];
19913
19914          if (data.visible === false) {
19915            continue;
19916          } // Configure
19917
19918
19919          var color = _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_9__["default"].getColorIfActive(data);
19920          var handleOptions = {
19921            color: color,
19922            handleRadius: handleRadius,
19923            drawHandlesIfActive: drawHandlesOnHover
19924          };
19925          var lineOptions = {
19926            color: color
19927          };
19928          if(data.lineWidth){
19929            lineOptions.lineWidth = data.lineWidth;
19930          }
19931          Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_10__["setShadow"])(context, _this2.configuration); // Draw
19932
19933          Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_10__["drawEllipse"])(context, element, data.handles.start, data.handles.end,
19934          lineOptions, 'pixel', data.handles.initialRotation);
19935          Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_10__["drawHandles"])(context, eventData, data.handles, handleOptions); // Update textbox stats
19936
19937          if (data.invalidated === true) {
19938            if (data.cachedStats) {
19939              _this2.throttledUpdateCachedStats(image, element, data);
19940            } else {
19941              _this2.updateCachedStats(image, element, data);
19942            }
19943          } // Default to textbox on right side of ROI
19944
19945
19946          if (!data.handles.textBox.hasMoved) {
19947            var defaultCoords = Object(_util_getROITextBoxCoords_js__WEBPACK_IMPORTED_MODULE_13__["default"])(eventData.viewport, data.handles);
19948            Object.assign(data.handles.textBox, defaultCoords);
19949          }
19950
19951          var textBoxAnchorPoints = function textBoxAnchorPoints(handles) {
19952            return _findTextBoxAnchorPoints(handles.start, handles.end);
19953          };
19954
19955          var textBoxContent = _createTextBoxContent(context, image.color, data.cachedStats, modality, hasPixelSpacing, _this2.configuration);
19956
19957          Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_10__["drawLinkedTextBox"])(context, element, data.handles.textBox, textBoxContent, data.handles, textBoxAnchorPoints, color, lineWidth, 10, true);
19958        }
19959      });
19960    }
19961  }]);
19962
19963  return EllipticalRoiTool;
19964}(_base_BaseAnnotationTool_js__WEBPACK_IMPORTED_MODULE_6__["default"]);
19965/**
19966 *
19967 *
19968 * @param {*} startHandle
19969 * @param {*} endHandle
19970 * @returns {Array.<{x: number, y: number}>}
19971 */
19972
19973
19974
19975
19976function _findTextBoxAnchorPoints(startHandle, endHandle) {
19977  var _getEllipseImageCoord = _getEllipseImageCoordinates(startHandle, endHandle),
19978      left = _getEllipseImageCoord.left,
19979      top = _getEllipseImageCoord.top,
19980      width = _getEllipseImageCoord.width,
19981      height = _getEllipseImageCoord.height;
19982
19983  return [{
19984    // Top middle point of ellipse
19985    x: left + width / 2,
19986    y: top
19987  }, {
19988    // Left middle point of ellipse
19989    x: left,
19990    y: top + height / 2
19991  }, {
19992    // Bottom middle point of ellipse
19993    x: left + width / 2,
19994    y: top + height
19995  }, {
19996    // Right middle point of ellipse
19997    x: left + width,
19998    y: top + height / 2
19999  }];
20000}
20001/**
20002 *
20003 *
20004 * @param {*} context
20005 * @param {*} isColorImage
20006 * @param {*} { area, mean, stdDev, min, max, meanStdDevSUV }
20007 * @param {*} modality
20008 * @param {*} hasPixelSpacing
20009 * @param {*} [options={}] - { showMinMax, showHounsfieldUnits }
20010 * @returns {string[]}
20011 */
20012
20013
20014function _createTextBoxContent(context, isColorImage) {
20015  var _ref = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},
20016      area = _ref.area,
20017      mean = _ref.mean,
20018      stdDev = _ref.stdDev,
20019      min = _ref.min,
20020      max = _ref.max,
20021      meanStdDevSUV = _ref.meanStdDevSUV;
20022
20023  var modality = arguments.length > 3 ? arguments[3] : undefined;
20024  var hasPixelSpacing = arguments.length > 4 ? arguments[4] : undefined;
20025  var options = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : {};
20026  var showMinMax = options.showMinMax || false;
20027  var showHounsfieldUnits = options.showHounsfieldUnits !== false;
20028  var textLines = []; // Don't display mean/standardDev for color images
20029
20030  var otherLines = [];
20031
20032  if (!isColorImage) {
20033    var hasStandardUptakeValues = meanStdDevSUV && meanStdDevSUV.mean !== 0;
20034    var suffix = modality === 'CT' && showHounsfieldUnits ? ' HU' : '';
20035    var meanString = "Mean: ".concat(Object(_util_numbersWithCommas_js__WEBPACK_IMPORTED_MODULE_14__["default"])(mean.toFixed(2))).concat(suffix);
20036    var stdDevString = "Std Dev: ".concat(Object(_util_numbersWithCommas_js__WEBPACK_IMPORTED_MODULE_14__["default"])(stdDev.toFixed(2))).concat(suffix); // If this image has SUV values to display, concatenate them to the text line
20037
20038    if (hasStandardUptakeValues) {
20039      var SUVtext = ' SUV: ';
20040      var meanSuvString = "".concat(SUVtext).concat(Object(_util_numbersWithCommas_js__WEBPACK_IMPORTED_MODULE_14__["default"])(meanStdDevSUV.mean.toFixed(2)));
20041      var stdDevSuvString = "".concat(SUVtext).concat(Object(_util_numbersWithCommas_js__WEBPACK_IMPORTED_MODULE_14__["default"])(meanStdDevSUV.stdDev.toFixed(2)));
20042      var targetStringLength = Math.floor(context.measureText("".concat(stdDevString, "     ")).width);
20043
20044      while (context.measureText(meanString).width < targetStringLength) {
20045        meanString += ' ';
20046      }
20047
20048      otherLines.push("".concat(meanString).concat(meanSuvString));
20049      otherLines.push("".concat(stdDevString, "     ").concat(stdDevSuvString));
20050    } else {
20051      otherLines.push("".concat(meanString, "     ").concat(stdDevString));
20052    }
20053
20054    if (showMinMax) {
20055      var minString = "Min: ".concat(min).concat(suffix);
20056      var maxString = "Max: ".concat(max).concat(suffix);
20057
20058      var _targetStringLength = hasStandardUptakeValues ? Math.floor(context.measureText("".concat(stdDevString, "     ")).width) : Math.floor(context.measureText("".concat(meanString, "     ")).width);
20059
20060      while (context.measureText(minString).width < _targetStringLength) {
20061        minString += ' ';
20062      }
20063
20064      otherLines.push("".concat(minString).concat(maxString));
20065    }
20066  }
20067
20068  textLines.push(_formatArea(area, hasPixelSpacing));
20069  otherLines.forEach(function (x) {
20070    return textLines.push(x);
20071  });
20072  return textLines;
20073}
20074/**
20075 *
20076 *
20077 * @param {*} area
20078 * @param {*} hasPixelSpacing
20079 * @returns {string} The formatted label for showing area
20080 */
20081
20082
20083function _formatArea(area, hasPixelSpacing) {
20084  // This uses Char code 178 for a superscript 2
20085  var suffix = hasPixelSpacing ? " mm".concat(String.fromCharCode(178)) : " px".concat(String.fromCharCode(178));
20086  return "Area: ".concat(Object(_util_numbersWithCommas_js__WEBPACK_IMPORTED_MODULE_14__["default"])(area.toFixed(2))).concat(suffix);
20087}
20088/**
20089 *
20090 *
20091 * @param {*} image
20092 * @param {*} element
20093 * @param {*} handles
20094 * @param {*} modality
20095 * @param {*} pixelSpacing
20096 * @returns {Object} The Stats object
20097 */
20098
20099
20100function _calculateStats(image, element, handles, modality, pixelSpacing) {
20101  // Retrieve the bounds of the ellipse in image coordinates
20102  var ellipseCoordinates = _getEllipseImageCoordinates(handles.start, handles.end); // Retrieve the array of pixels that the ellipse bounds cover
20103
20104
20105  var pixels = _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.getPixels(element, ellipseCoordinates.left, ellipseCoordinates.top, ellipseCoordinates.width, ellipseCoordinates.height); // Calculate the mean & standard deviation from the pixels and the ellipse details.
20106
20107  var ellipseMeanStdDev = Object(_util_ellipse_index_js__WEBPACK_IMPORTED_MODULE_12__["calculateEllipseStatistics"])(pixels, ellipseCoordinates);
20108  var meanStdDevSUV;
20109
20110  if (modality === 'PT') {
20111    meanStdDevSUV = {
20112      mean: Object(_util_calculateSUV_js__WEBPACK_IMPORTED_MODULE_11__["default"])(image, ellipseMeanStdDev.mean, true) || 0,
20113      stdDev: Object(_util_calculateSUV_js__WEBPACK_IMPORTED_MODULE_11__["default"])(image, ellipseMeanStdDev.stdDev, true) || 0
20114    };
20115  } // Calculate the image area from the ellipse dimensions and pixel spacing
20116
20117
20118  var area = Math.PI * (ellipseCoordinates.width * (pixelSpacing.colPixelSpacing || 1) / 2) * (ellipseCoordinates.height * (pixelSpacing.rowPixelSpacing || 1) / 2);
20119  return {
20120    area: area || 0,
20121    count: ellipseMeanStdDev.count || 0,
20122    mean: ellipseMeanStdDev.mean || 0,
20123    variance: ellipseMeanStdDev.variance || 0,
20124    stdDev: ellipseMeanStdDev.stdDev || 0,
20125    min: ellipseMeanStdDev.min || 0,
20126    max: ellipseMeanStdDev.max || 0,
20127    meanStdDevSUV: meanStdDevSUV
20128  };
20129}
20130/**
20131 * Retrieve the bounds of the ellipse in image coordinates
20132 *
20133 * @param {*} startHandle
20134 * @param {*} endHandle
20135 * @returns {{ left: number, top: number, width: number, height: number }}
20136 */
20137
20138
20139function _getEllipseImageCoordinates(startHandle, endHandle) {
20140  return {
20141    left: Math.round(Math.min(startHandle.x, endHandle.x)),
20142    top: Math.round(Math.min(startHandle.y, endHandle.y)),
20143    width: Math.round(Math.abs(startHandle.x - endHandle.x)),
20144    height: Math.round(Math.abs(startHandle.y - endHandle.y))
20145  };
20146}
20147
20148/***/ }),
20149
20150/***/ "./tools/annotation/FreehandMouseTool.js":
20151/*!***********************************************!*\
20152  !*** ./tools/annotation/FreehandMouseTool.js ***!
20153  \***********************************************/
20154/*! exports provided: default */
20155/***/ (function(module, __webpack_exports__, __webpack_require__) {
20156
20157"use strict";
20158__webpack_require__.r(__webpack_exports__);
20159/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return FreehandMouseTool; });
20160/* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/toConsumableArray */ "../node_modules/@babel/runtime/helpers/toConsumableArray.js");
20161/* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__);
20162/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js");
20163/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_1__);
20164/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js");
20165/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_2__);
20166/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js");
20167/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_3__);
20168/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js");
20169/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4__);
20170/* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/assertThisInitialized */ "../node_modules/@babel/runtime/helpers/assertThisInitialized.js");
20171/* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_5__);
20172/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js");
20173/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_6__);
20174/* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./../../events.js */ "./events.js");
20175/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./../../externalModules.js */ "./externalModules.js");
20176/* harmony import */ var _base_BaseAnnotationTool_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./../base/BaseAnnotationTool.js */ "./tools/base/BaseAnnotationTool.js");
20177/* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./../../stateManagement/toolState.js */ "./stateManagement/toolState.js");
20178/* harmony import */ var _stateManagement_toolStyle_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./../../stateManagement/toolStyle.js */ "./stateManagement/toolStyle.js");
20179/* harmony import */ var _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./../../stateManagement/toolColors.js */ "./stateManagement/toolColors.js");
20180/* harmony import */ var _store_index_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../../store/index.js */ "./store/index.js");
20181/* harmony import */ var _util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../../util/triggerEvent.js */ "./util/triggerEvent.js");
20182/* harmony import */ var _util_findAndMoveHelpers_js__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../../util/findAndMoveHelpers.js */ "./util/findAndMoveHelpers.js");
20183/* harmony import */ var _util_pointInsideBoundingBox_js__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../../util/pointInsideBoundingBox.js */ "./util/pointInsideBoundingBox.js");
20184/* harmony import */ var _util_calculateSUV_js__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../../util/calculateSUV.js */ "./util/calculateSUV.js");
20185/* harmony import */ var _util_numbersWithCommas_js__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../../util/numbersWithCommas.js */ "./util/numbersWithCommas.js");
20186/* harmony import */ var _drawing_index_js__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../../drawing/index.js */ "./drawing/index.js");
20187/* harmony import */ var _drawing_drawLinkedTextBox_js__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ../../drawing/drawLinkedTextBox.js */ "./drawing/drawLinkedTextBox.js");
20188/* harmony import */ var _drawing_drawHandles_js__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ../../drawing/drawHandles.js */ "./drawing/drawHandles.js");
20189/* harmony import */ var _util_clip_js__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ../../util/clip.js */ "./util/clip.js");
20190/* harmony import */ var _store_setToolCursor_js__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ../../store/setToolCursor.js */ "./store/setToolCursor.js");
20191/* harmony import */ var _cursors_index_js__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ../cursors/index.js */ "./tools/cursors/index.js");
20192/* harmony import */ var _util_freehand_index_js__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ../../util/freehand/index.js */ "./util/freehand/index.js");
20193/* harmony import */ var _util_logger_js__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ../../util/logger.js */ "./util/logger.js");
20194/* harmony import */ var _util_throttle__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ../../util/throttle */ "./util/throttle.js");
20195
20196
20197
20198
20199
20200
20201
20202
20203
20204 // State
20205
20206
20207
20208
20209
20210 // Manipulators
20211
20212 // Implementation Logic
20213
20214
20215
20216 // Drawing
20217
20218
20219
20220
20221
20222
20223
20224
20225
20226
20227var logger = Object(_util_logger_js__WEBPACK_IMPORTED_MODULE_26__["getLogger"])('tools:annotation:FreehandMouseTool');
20228var insertOrDelete = _util_freehand_index_js__WEBPACK_IMPORTED_MODULE_25__["default"].insertOrDelete,
20229    freehandArea = _util_freehand_index_js__WEBPACK_IMPORTED_MODULE_25__["default"].freehandArea,
20230    calculateFreehandStatistics = _util_freehand_index_js__WEBPACK_IMPORTED_MODULE_25__["default"].calculateFreehandStatistics,
20231    freehandIntersect = _util_freehand_index_js__WEBPACK_IMPORTED_MODULE_25__["default"].freehandIntersect,
20232    FreehandHandleData = _util_freehand_index_js__WEBPACK_IMPORTED_MODULE_25__["default"].FreehandHandleData;
20233/**
20234 * @public
20235 * @class FreehandMouseTool
20236 * @memberof Tools.Annotation
20237 * @classdesc Tool for drawing arbitrary polygonal regions of interest, and
20238 * measuring the statistics of the enclosed pixels.
20239 * @extends Tools.Base.BaseAnnotationTool
20240 */
20241
20242var FreehandMouseTool =
20243/*#__PURE__*/
20244function (_BaseAnnotationTool) {
20245  _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_6___default()(FreehandMouseTool, _BaseAnnotationTool);
20246
20247  function FreehandMouseTool() {
20248    var _this;
20249
20250    var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
20251
20252    _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_1___default()(this, FreehandMouseTool);
20253
20254    var defaultProps = {
20255      name: 'FreehandMouse',
20256      supportedInteractionTypes: ['Mouse', 'Touch'],
20257      configuration: defaultFreehandConfiguration(),
20258      svgCursor: _cursors_index_js__WEBPACK_IMPORTED_MODULE_24__["freehandMouseCursor"]
20259    };
20260    _this = _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_3___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4___default()(FreehandMouseTool).call(this, props, defaultProps));
20261    _this.isMultiPartTool = true;
20262    _this._drawing = false;
20263    _this._dragging = false;
20264    _this._modifying = false; // Create bound callback functions for private event loops
20265
20266    _this._drawingMouseDownCallback = _this._drawingMouseDownCallback.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_5___default()(_this));
20267    _this._drawingMouseMoveCallback = _this._drawingMouseMoveCallback.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_5___default()(_this));
20268    _this._drawingMouseDragCallback = _this._drawingMouseDragCallback.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_5___default()(_this));
20269    _this._drawingMouseUpCallback = _this._drawingMouseUpCallback.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_5___default()(_this));
20270    _this._drawingMouseDoubleClickCallback = _this._drawingMouseDoubleClickCallback.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_5___default()(_this));
20271    _this._editMouseUpCallback = _this._editMouseUpCallback.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_5___default()(_this));
20272    _this._editMouseDragCallback = _this._editMouseDragCallback.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_5___default()(_this));
20273    _this._drawingTouchStartCallback = _this._drawingTouchStartCallback.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_5___default()(_this));
20274    _this._drawingTouchDragCallback = _this._drawingTouchDragCallback.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_5___default()(_this));
20275    _this._drawingDoubleTapClickCallback = _this._drawingDoubleTapClickCallback.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_5___default()(_this));
20276    _this._editTouchDragCallback = _this._editTouchDragCallback.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_5___default()(_this));
20277    _this.throttledUpdateCachedStats = Object(_util_throttle__WEBPACK_IMPORTED_MODULE_27__["default"])(_this.updateCachedStats, 110);
20278    return _this;
20279  }
20280
20281  _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_2___default()(FreehandMouseTool, [{
20282    key: "createNewMeasurement",
20283    value: function createNewMeasurement(eventData) {
20284      var goodEventData = eventData && eventData.currentPoints && eventData.currentPoints.image;
20285
20286      if (!goodEventData) {
20287        logger.error("required eventData not supplied to tool ".concat(this.name, "'s createNewMeasurement"));
20288        return;
20289      }
20290
20291      var measurementData = {
20292        visible: true,
20293        active: true,
20294        invalidated: true,
20295        color: undefined,
20296        handles: {
20297          points: []
20298        }
20299      };
20300      measurementData.handles.textBox = {
20301        active: false,
20302        hasMoved: false,
20303        movesIndependently: false,
20304        drawnIndependently: true,
20305        allowedOutsideImage: true,
20306        hasBoundingBox: true
20307      };
20308      return measurementData;
20309    }
20310    /**
20311     *
20312     *
20313     * @param {*} element
20314     * @param {*} data
20315     * @param {*} coords
20316     * @returns {Boolean}
20317     */
20318
20319  }, {
20320    key: "pointNearTool",
20321    value: function pointNearTool(element, data, coords) {
20322      var validParameters = data && data.handles && data.handles.points;
20323
20324      if (!validParameters) {
20325        throw new Error("invalid parameters supplied to tool ".concat(this.name, "'s pointNearTool"));
20326      }
20327
20328      if (!validParameters || data.visible === false) {
20329        return false;
20330      }
20331
20332      var isPointNearTool = this._pointNearHandle(element, data, coords);
20333
20334      if (isPointNearTool !== undefined) {
20335        return true;
20336      }
20337
20338      return false;
20339    }
20340    /**
20341     * @param {*} element
20342     * @param {*} data
20343     * @param {*} coords
20344     * @returns {number} the distance in px from the provided coordinates to the
20345     * closest rendered portion of the annotation. -1 if the distance cannot be
20346     * calculated.
20347     */
20348
20349  }, {
20350    key: "distanceFromPoint",
20351    value: function distanceFromPoint(element, data, coords) {
20352      var distance = Infinity;
20353
20354      for (var i = 0; i < data.handles.points.length; i++) {
20355        var distanceI = _externalModules_js__WEBPACK_IMPORTED_MODULE_8__["default"].cornerstoneMath.point.distance(data.handles.points[i], coords);
20356        distance = Math.min(distance, distanceI);
20357      } // If an error caused distance not to be calculated, return -1.
20358
20359
20360      if (distance === Infinity) {
20361        return -1;
20362      }
20363
20364      return distance;
20365    }
20366    /**
20367     * @param {*} element
20368     * @param {*} data
20369     * @param {*} coords
20370     * @returns {number} the distance in canvas units from the provided coordinates to the
20371     * closest rendered portion of the annotation. -1 if the distance cannot be
20372     * calculated.
20373     */
20374
20375  }, {
20376    key: "distanceFromPointCanvas",
20377    value: function distanceFromPointCanvas(element, data, coords) {
20378      var distance = Infinity;
20379
20380      if (!data) {
20381        return -1;
20382      }
20383
20384      var canvasCoords = _externalModules_js__WEBPACK_IMPORTED_MODULE_8__["default"].cornerstone.pixelToCanvas(element, coords);
20385      var points = data.handles.points;
20386
20387      for (var i = 0; i < points.length; i++) {
20388        var handleCanvas = _externalModules_js__WEBPACK_IMPORTED_MODULE_8__["default"].cornerstone.pixelToCanvas(element, points[i]);
20389        var distanceI = _externalModules_js__WEBPACK_IMPORTED_MODULE_8__["default"].cornerstoneMath.point.distance(handleCanvas, canvasCoords);
20390        distance = Math.min(distance, distanceI);
20391      } // If an error caused distance not to be calculated, return -1.
20392
20393
20394      if (distance === Infinity) {
20395        return -1;
20396      }
20397
20398      return distance;
20399    }
20400    /**
20401     *
20402     *
20403     *
20404     * @param image
20405     * @param element
20406     * @param data
20407     */
20408
20409  }, {
20410    key: "updateCachedStats",
20411    value: function updateCachedStats(image, element, data) {
20412      // Define variables for the area and mean/standard deviation
20413      var area, meanStdDev, meanStdDevSUV;
20414      var seriesModule = _externalModules_js__WEBPACK_IMPORTED_MODULE_8__["default"].cornerstone.metaData.get('generalSeriesModule', image.imageId);
20415      var modality = seriesModule ? seriesModule.modality : null;
20416      var points = data.handles.points; // If the data has been invalidated, and the tool is not currently active,
20417      // We need to calculate it again.
20418      // Retrieve the bounds of the ROI in image coordinates
20419
20420      var bounds = {
20421        left: points[0].x,
20422        right: points[0].x,
20423        bottom: points[0].y,
20424        top: points[0].x
20425      };
20426
20427      for (var i = 0; i < points.length; i++) {
20428        bounds.left = Math.min(bounds.left, points[i].x);
20429        bounds.right = Math.max(bounds.right, points[i].x);
20430        bounds.bottom = Math.min(bounds.bottom, points[i].y);
20431        bounds.top = Math.max(bounds.top, points[i].y);
20432      }
20433
20434      var polyBoundingBox = {
20435        left: bounds.left,
20436        top: bounds.bottom,
20437        width: Math.abs(bounds.right - bounds.left),
20438        height: Math.abs(bounds.top - bounds.bottom)
20439      }; // Store the bounding box information for the text box
20440
20441      data.polyBoundingBox = polyBoundingBox; // First, make sure this is not a color image, since no mean / standard
20442      // Deviation will be calculated for color images.
20443
20444      if (!image.color) {
20445        // Retrieve the array of pixels that the ROI bounds cover
20446        var pixels = _externalModules_js__WEBPACK_IMPORTED_MODULE_8__["default"].cornerstone.getPixels(element, polyBoundingBox.left, polyBoundingBox.top, polyBoundingBox.width, polyBoundingBox.height); // Calculate the mean & standard deviation from the pixels and the object shape
20447
20448        meanStdDev = calculateFreehandStatistics.call(this, pixels, polyBoundingBox, data.handles.points);
20449
20450        if (modality === 'PT') {
20451          // If the image is from a PET scan, use the DICOM tags to
20452          // Calculate the SUV from the mean and standard deviation.
20453          // Note that because we are using modality pixel values from getPixels, and
20454          // The calculateSUV routine also rescales to modality pixel values, we are first
20455          // Returning the values to storedPixel values before calcuating SUV with them.
20456          // TODO: Clean this up? Should we add an option to not scale in calculateSUV?
20457          meanStdDevSUV = {
20458            mean: Object(_util_calculateSUV_js__WEBPACK_IMPORTED_MODULE_17__["default"])(image, (meanStdDev.mean - image.intercept) / image.slope),
20459            stdDev: Object(_util_calculateSUV_js__WEBPACK_IMPORTED_MODULE_17__["default"])(image, (meanStdDev.stdDev - image.intercept) / image.slope)
20460          };
20461        } // If the mean and standard deviation values are sane, store them for later retrieval
20462
20463
20464        if (meanStdDev && !isNaN(meanStdDev.mean)) {
20465          data.meanStdDev = meanStdDev;
20466          data.meanStdDevSUV = meanStdDevSUV;
20467        }
20468      } // Retrieve the pixel spacing values, and if they are not
20469      // Real non-zero values, set them to 1
20470
20471
20472      var columnPixelSpacing = image.columnPixelSpacing || 1;
20473      var rowPixelSpacing = image.rowPixelSpacing || 1;
20474      var scaling = columnPixelSpacing * rowPixelSpacing;
20475      area = freehandArea(data.handles.points, scaling); // If the area value is sane, store it for later retrieval
20476
20477      if (!isNaN(area)) {
20478        data.area = area;
20479      } // Set the invalidated flag to false so that this data won't automatically be recalculated
20480
20481
20482      data.invalidated = false;
20483    }
20484    /**
20485     *
20486     *
20487     * @param {*} evt
20488     * @returns {undefined}
20489     */
20490
20491  }, {
20492    key: "renderToolData",
20493    value: function renderToolData(evt) {
20494      var _this2 = this;
20495
20496      var eventData = evt.detail; // If we have no toolState for this element, return immediately as there is nothing to do
20497
20498      var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_10__["getToolState"])(evt.currentTarget, this.name);
20499
20500      if (!toolState) {
20501        return;
20502      }
20503
20504      var image = eventData.image,
20505          element = eventData.element;
20506      var config = this.configuration;
20507      var seriesModule = _externalModules_js__WEBPACK_IMPORTED_MODULE_8__["default"].cornerstone.metaData.get('generalSeriesModule', image.imageId);
20508      var modality = seriesModule ? seriesModule.modality : null; // We have tool data for this element - iterate over each one and draw it
20509
20510      var context = Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_19__["getNewContext"])(eventData.canvasContext.canvas);
20511      var lineWidth = _stateManagement_toolStyle_js__WEBPACK_IMPORTED_MODULE_11__["default"].getToolW
20511idth();
20512
20513      var _loop = function _loop(i) {
20514        var data = toolState.data[i];
20515
20516        if (data.visible === false) {
20517          return "continue";
20518        }
20519
20520        Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_19__["draw"])(context, function (context) {
20521          var color = _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_12__["default"].getColorIfActive(data);
20522          var fillColor;
20523
20524          if (data.active) {
20525            if (data.handles.invalidHandlePlacement) {
20526              color = config.invalidColor;
20527              fillColor = config.invalidColor;
20528            } else {
20529              color = _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_12__["default"].getColorIfActive(data);
20530              fillColor = _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_12__["default"].getFillColor();
20531            }
20532          } else {
20533            fillColor = _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_12__["default"].getToolColor();
20534          }
20535
20536          if (data.handles.points.length) {
20537            for (var j = 0; j < data.handles.points.length; j++) {
20538              var lines = _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default()(data.handles.points[j].lines);
20539
20540              var points = data.handles.points;
20541
20542              if (j === points.length - 1 && !data.polyBoundingBox) {
20543                // If it's still being actively drawn, keep the last line to
20544                // The mouse location
20545                lines.push(config.mouseLocation.handles.start);
20546              }
20547
20548              var lineOptions = {
20549                color: color
20550              };
20551              if(data.lineWidth){
20552                lineOptions.lineWidth = data.lineWidth;
20553              }
20554              Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_19__["drawJoinedLines"])(context, eventData.element, data.handles.points[j], lines, lineOptions);
20555            }
20556          } // Draw handles
20557
20558
20559          var options = {
20560            color: color,
20561            fill: fillColor
20562          };
20563
20564          if (config.alwaysShowHandles || data.active && data.polyBoundingBox) {
20565            // Render all handles
20566            options.handleRadius = config.activeHandleRadius;
20567            Object(_drawing_drawHandles_js__WEBPACK_IMPORTED_MODULE_21__["default"])(context, eventData, data.handles.points, options);
20568          }
20569
20570          if (data.canComplete) {
20571            // Draw large handle at the origin if can complete drawing
20572            options.handleRadius = config.completeHandleRadius;
20573            var handle = data.handles.points[0];
20574            Object(_drawing_drawHandles_js__WEBPACK_IMPORTED_MODULE_21__["default"])(context, eventData, [handle], options);
20575          }
20576
20577          if (data.active && !data.polyBoundingBox) {
20578            // Draw handle at origin and at mouse if actively drawing
20579            options.handleRadius = config.activeHandleRadius;
20580            Object(_drawing_drawHandles_js__WEBPACK_IMPORTED_MODULE_21__["default"])(context, eventData, config.mouseLocation.handles, options);
20581            var firstHandle = data.handles.points[0];
20582            Object(_drawing_drawHandles_js__WEBPACK_IMPORTED_MODULE_21__["default"])(context, eventData, [firstHandle], options);
20583          } // Update textbox stats
20584
20585
20586          if (data.invalidated === true && !data.active) {
20587            if (data.meanStdDev && data.meanStdDevSUV && data.area) {
20588              _this2.throttledUpdateCachedStats(image, element, data);
20589            } else {
20590              _this2.updateCachedStats(image, element, data);
20591            }
20592          } // Only render text if polygon ROI has been completed and freehand 'shiftKey' mode was not used:
20593
20594
20595          if (data.polyBoundingBox && !data.handles.textBox.freehand) {
20596            // If the textbox has not been moved by the user, it should be displayed on the right-most
20597            // Side of the tool.
20598            if (!data.handles.textBox.hasMoved) {
20599              // Find the rightmost side of the polyBoundingBox at its vertical center, and place the textbox here
20600              // Note that this calculates it in image coordinates
20601              data.handles.textBox.x = data.polyBoundingBox.left + data.polyBoundingBox.width;
20602              data.handles.textBox.y = data.polyBoundingBox.top + data.polyBoundingBox.height / 2;
20603            }
20604
20605            var text = textBoxText.call(_this2, data);
20606            Object(_drawing_drawLinkedTextBox_js__WEBPACK_IMPORTED_MODULE_20__["default"])(context, element, data.handles.textBox, text, data.handles.points, textBoxAnchorPoints, color, lineWidth, 0, true);
20607          }
20608        });
20609      };
20610
20611      for (var i = 0; i < toolState.data.length; i++) {
20612        var _ret = _loop(i);
20613
20614        if (_ret === "continue") continue;
20615      }
20616
20617      function textBoxText(data) {
20618        var meanStdDev = data.meanStdDev,
20619            meanStdDevSUV = data.meanStdDevSUV,
20620            area = data.area; // Define an array to store the rows of text for the textbox
20621
20622        var textLines = []; // If the mean and standard deviation values are present, display them
20623
20624        if (meanStdDev && meanStdDev.mean !== undefined) {
20625          // If the modality is CT, add HU to denote Hounsfield Units
20626          var moSuffix = '';
20627
20628          if (modality === 'CT') {
20629            moSuffix = ' HU';
20630          } // Create a line of text to display the mean and any units that were specified (i.e. HU)
20631
20632
20633          var meanText = "Mean: ".concat(Object(_util_numbersWithCommas_js__WEBPACK_IMPORTED_MODULE_18__["default"])(meanStdDev.mean.toFixed(2))).concat(moSuffix); // Create a line of text to display the standard deviation and any units that were specified (i.e. HU)
20634
20635          var stdDevText = "StdDev: ".concat(Object(_util_numbersWithCommas_js__WEBPACK_IMPORTED_MODULE_18__["default"])(meanStdDev.stdDev.toFixed(2))).concat(moSuffix); // If this image has SUV values to display, concatenate them to the text line
20636
20637          if (meanStdDevSUV && meanStdDevSUV.mean !== undefined) {
20638            var SUVtext = ' SUV: ';
20639            meanText += SUVtext + Object(_util_numbersWithCommas_js__WEBPACK_IMPORTED_MODULE_18__["default"])(meanStdDevSUV.mean.toFixed(2));
20640            stdDevText += SUVtext + Object(_util_numbersWithCommas_js__WEBPACK_IMPORTED_MODULE_18__["default"])(meanStdDevSUV.stdDev.toFixed(2));
20641          } // Add these text lines to the array to be displayed in the textbox
20642
20643
20644          textLines.push(meanText);
20645          textLines.push(stdDevText);
20646        } // If the area is a sane value, display it
20647
20648
20649        if (area) {
20650          // Determine the area suffix based on the pixel spacing in the image.
20651          // If pixel spacing is present, use millimeters. Otherwise, use pixels.
20652          // This uses Char code 178 for a superscript 2
20653          var suffix = " mm".concat(String.fromCharCode(178));
20654
20655          if (!image.rowPixelSpacing || !image.columnPixelSpacing) {
20656            suffix = " pixels".concat(String.fromCharCode(178));
20657          } // Create a line of text to display the area and its units
20658
20659
20660          var areaText = "Area: ".concat(Object(_util_numbersWithCommas_js__WEBPACK_IMPORTED_MODULE_18__["default"])(area.toFixed(2))).concat(suffix); // Add this text line to the array to be displayed in the textbox
20661
20662          textLines.push(areaText);
20663        }
20664
20665        return textLines;
20666      }
20667
20668      function textBoxAnchorPoints(handles) {
20669        return handles;
20670      }
20671    }
20672  }, {
20673    key: "addNewMeasurement",
20674    value: function addNewMeasurement(evt) {
20675      var eventData = evt.detail;
20676
20677      this._startDrawing(evt);
20678
20679      this._addPoint(eventData);
20680
20681      preventPropagation(evt);
20682    }
20683  }, {
20684    key: "preMouseDownCallback",
20685    value: function preMouseDownCallback(evt) {
20686      var eventData = evt.detail;
20687
20688      var nearby = this._pointNearHandleAllTools(eventData);
20689
20690      if (eventData.event.ctrlKey) {
20691        if (nearby !== undefined && nearby.handleNearby.hasBoundingBox) {// Ctrl + clicked textBox, do nothing but still consume event.
20692        } else {
20693          insertOrDelete.call(this, evt, nearby);
20694        }
20695
20696        preventPropagation(evt);
20697        return true;
20698      }
20699
20700      return false;
20701    }
20702  }, {
20703    key: "handleSelectedCallback",
20704    value: function handleSelectedCallback(evt, toolData, handle) {
20705      var interactionType = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'mouse';
20706      var eventData = evt.detail;
20707      var element = eventData.element;
20708      var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_10__["getToolState"])(eventData.element, this.name);
20709
20710      if (handle.hasBoundingBox) {
20711        // Use default move handler.
20712        Object(_util_findAndMoveHelpers_js__WEBPACK_IMPORTED_MODULE_15__["moveHandleNearImagePoint"])(evt, this, toolData, handle, interactionType);
20713        return;
20714      }
20715
20716      var config = this.configuration;
20717      config.dragOrigin = {
20718        x: handle.x,
20719        y: handle.y
20720      }; // Iterating over handles of all toolData instances to find the indices of the selected handle
20721
20722      for (var toolIndex = 0; toolIndex < toolState.data.length; toolIndex++) {
20723        var points = toolState.data[toolIndex].handles.points;
20724
20725        for (var p = 0; p < points.length; p++) {
20726          if (points[p] === handle) {
20727            config.currentHandle = p;
20728            config.currentTool = toolIndex;
20729          }
20730        }
20731      }
20732
20733      this._modifying = true;
20734
20735      this._activateModify(element); // Interupt eventDispatchers
20736
20737
20738      preventPropagation(evt);
20739    }
20740    /**
20741     * Event handler for MOUSE_MOVE during drawing event loop.
20742     *
20743     * @event
20744     * @param {Object} evt - The event.
20745     * @returns {undefined}
20746     */
20747
20748  }, {
20749    key: "_drawingMouseMoveCallback",
20750    value: function _drawingMouseMoveCallback(evt) {
20751      var eventData = evt.detail;
20752      var element = eventData.element;
20753      var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_10__["getToolState"])(eventData.element, this.name);
20754      var config = this.configuration;
20755      var currentTool = config.currentTool;
20756      var data = toolState.data[currentTool];
20757      var coords = eventData.currentPoints.canvas; // Set the mouseLocation handle
20758
20759      this._getMouseLocation(eventData);
20760
20761      this._checkInvalidHandleLocation(data, eventData); // Mouse move -> Polygon Mode
20762
20763
20764      var handleNearby = this._pointNearHandle(element, data, coords);
20765
20766      var points = data.handles.points; // If there is a handle nearby to snap to
20767      // (and it's not the actual mouse handle)
20768
20769      if (handleNearby !== undefined && !handleNearby.hasBoundingBox && handleNearby < points.length - 1) {
20770        config.mouseLocation.handles.start.x = points[handleNearby].x;
20771        config.mouseLocation.handles.start.y = points[handleNearby].y;
20772      } // Force onImageRendered
20773
20774
20775      _externalModules_js__WEBPACK_IMPORTED_MODULE_8__["default"].cornerstone.updateImage(eventData.element);
20776    }
20777    /**
20778     * Event handler for MOUSE_DRAG during drawing event loop.
20779     *
20780     * @event
20781     * @param {Object} evt - The event.
20782     * @returns {undefined}
20783     */
20784
20785  }, {
20786    key: "_drawingMouseDragCallback",
20787    value: function _drawingMouseDragCallback(evt) {
20788      if (!this.options.mouseButtonMask.includes(evt.detail.buttons)) {
20789        return;
20790      }
20791
20792      this._drawingDrag(evt);
20793    }
20794    /**
20795     * Event handler for TOUCH_DRAG during drawing event loop.
20796     *
20797     * @event
20798     * @param {Object} evt - The event.
20799     * @returns {undefined}
20800     */
20801
20802  }, {
20803    key: "_drawingTouchDragCallback",
20804    value: function _drawingTouchDragCallback(evt) {
20805      this._drawingDrag(evt);
20806    }
20807  }, {
20808    key: "_drawingDrag",
20809    value: function _drawingDrag(evt) {
20810      var eventData = evt.detail;
20811      var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_10__["getToolState"])(eventData.element, this.name);
20812      var config = this.configuration;
20813      var currentTool = config.currentTool;
20814      var data = toolState.data[currentTool]; // Set the mouseLocation handle
20815
20816      this._getMouseLocation(eventData);
20817
20818      this._checkInvalidHandleLocation(data, eventData);
20819
20820      this._addPointPencilMode(eventData, data.handles.points);
20821
20822      this._dragging = true; // Force onImageRendered
20823
20824      _externalModules_js__WEBPACK_IMPORTED_MODULE_8__["default"].cornerstone.updateImage(eventData.element);
20825    }
20826    /**
20827     * Event handler for MOUSE_UP during drawing event loop.
20828     *
20829     * @event
20830     * @param {Object} evt - The event.
20831     * @returns {undefined}
20832     */
20833
20834  }, {
20835    key: "_drawingMouseUpCallback",
20836    value: function _drawingMouseUpCallback(evt) {
20837      var eventData = evt.detail;
20838
20839      if (!this._dragging) {
20840        return;
20841      }
20842
20843      this._dragging = false;
20844      var element = eventData.element;
20845      var config = this.configuration;
20846      var currentTool = config.currentTool;
20847      var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_10__["getToolState"])(eventData.element, this.name);
20848      var data = toolState.data[currentTool];
20849
20850      if (!freehandIntersect.end(data.handles.points) && data.canComplete) {
20851        var lastHandlePlaced = config.currentHandle;
20852
20853        this._endDrawing(element, lastHandlePlaced);
20854      }
20855
20856      preventPropagation(evt);
20857      return;
20858    }
20859    /**
20860     * Event handler for MOUSE_DOWN during drawing event loop.
20861     *
20862     * @event
20863     * @param {Object} evt - The event.
20864     * @returns {undefined}
20865     */
20866
20867  }, {
20868    key: "_drawingMouseDownCallback",
20869    value: function _drawingMouseDownCallback(evt) {
20870      var eventData = evt.detail;
20871
20872      if (!this.options.mouseButtonMask.includes(eventData.buttons)) {
20873        return;
20874      }
20875
20876      var element = eventData.element;
20877      var coords = eventData.currentPoints.canvas;
20878      var config = this.configuration;
20879      var currentTool = config.currentTool;
20880      var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_10__["getToolState"])(eventData.element, this.name);
20881      var data = toolState.data[currentTool];
20882
20883      var handleNearby = this._pointNearHandle(element, data, coords);
20884
20885      if (!freehandIntersect.end(data.handles.points) && data.canComplete) {
20886        var lastHandlePlaced = config.currentHandle;
20887
20888        this._endDrawing(element, lastHandlePlaced);
20889      } else if (handleNearby === undefined) {
20890        this._addPoint(eventData);
20891      }
20892
20893      preventPropagation(evt);
20894      return;
20895    }
20896    /**
20897     * Event handler for TOUCH_START during drawing event loop.
20898     *
20899     * @event
20900     * @param {Object} evt - The event.
20901     * @returns {undefined}
20902     */
20903
20904  }, {
20905    key: "_drawingTouchStartCallback",
20906    value: function _drawingTouchStartCallback(evt) {
20907      var eventData = evt.detail;
20908      var element = eventData.element;
20909      var coords = eventData.currentPoints.canvas;
20910      var config = this.configuration;
20911      var currentTool = config.currentTool;
20912      var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_10__["getToolState"])(eventData.element, this.name);
20913      var data = toolState.data[currentTool];
20914
20915      var handleNearby = this._pointNearHandle(element, data, coords);
20916
20917      if (!freehandIntersect.end(data.handles.points) && data.canComplete) {
20918        var lastHandlePlaced = config.currentHandle;
20919
20920        this._endDrawing(element, lastHandlePlaced);
20921      } else if (handleNearby === undefined) {
20922        this._addPoint(eventData);
20923      }
20924
20925      preventPropagation(evt);
20926      return;
20927    }
20928    /** Ends the active drawing loop and completes the polygon.
20929     *
20930     * @public
20931     * @param {Object} element - The element on which the roi is being drawn.
20932     * @returns {null}
20933     */
20934
20935  }, {
20936    key: "completeDrawing",
20937    value: function completeDrawing(element) {
20938      if (!this._drawing) {
20939        return;
20940      }
20941
20942      var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_10__["getToolState"])(element, this.name);
20943      var config = this.configuration;
20944      var data = toolState.data[config.currentTool];
20945
20946      if (!freehandIntersect.end(data.handles.points) && data.handles.points.length >= 2) {
20947        var lastHandlePlaced = config.currentHandle;
20948        data.polyBoundingBox = {};
20949
20950        this._endDrawing(element, lastHandlePlaced);
20951      }
20952    }
20953    /**
20954     * Event handler for MOUSE_DOUBLE_CLICK during drawing event loop.
20955     *
20956     * @event
20957     * @param {Object} evt - The event.
20958     * @returns {undefined}
20959     */
20960
20961  }, {
20962    key: "_drawingMouseDoubleClickCallback",
20963    value: function _drawingMouseDoubleClickCallback(evt) {
20964      var eventData = evt.detail;
20965      this.completeDrawing(eventData.element);
20966      preventPropagation(evt);
20967    }
20968    /**
20969     * Event handler for DOUBLE_TAP during drawing event loop.
20970     *
20971     * @event
20972     * @param {Object} evt - The event.
20973     * @returns {undefined}
20974     */
20975
20976  }, {
20977    key: "_drawingDoubleTapClickCallback",
20978    value: function _drawingDoubleTapClickCallback(evt) {
20979      var eventData = evt.detail;
20980      this.completeDrawing(eventData.element);
20981      preventPropagation(evt);
20982    }
20983    /**
20984     * Event handler for MOUSE_DRAG during handle drag event loop.
20985     *
20986     * @event
20987     * @param {Object} evt - The event.
20988     * @returns {undefined}
20989     */
20990
20991  }, {
20992    key: "_editMouseDragCallback",
20993    value: function _editMouseDragCallback(evt) {
20994      var eventData = evt.detail;
20995
20996      if (!this.options.mouseButtonMask.includes(eventData.buttons)) {
20997        return;
20998      }
20999
21000      var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_10__["getToolState"])(eventData.element, this.name);
21001      var config = this.configuration;
21002      var data = toolState.data[config.currentTool];
21003      var currentHandle = config.currentHandle;
21004      var points = data.handles.points;
21005      var handleIndex = -1; // Set the mouseLocation handle
21006
21007      this._getMouseLocation(eventData);
21008
21009      data.handles.invalidHandlePlacement = freehandIntersect.modify(points, currentHandle);
21010      data.active = true;
21011      data.highlight = true;
21012      points[currentHandle].x = config.mouseLocation.handles.start.x;
21013      points[currentHandle].y = config.mouseLocation.handles.start.y;
21014      handleIndex = this._getPrevHandleIndex(currentHandle, points);
21015
21016      if (currentHandle >= 0) {
21017        var lastLineIndex = points[handleIndex].lines.length - 1;
21018        var lastLine = points[handleIndex].lines[lastLineIndex];
21019        lastLine.x = config.mouseLocation.handles.start.x;
21020        lastLine.y = config.mouseLocation.handles.start.y;
21021      } // Update the image
21022
21023
21024      _externalModules_js__WEBPACK_IMPORTED_MODULE_8__["default"].cornerstone.updateImage(eventData.element);
21025    }
21026    /**
21027     * Event handler for TOUCH_DRAG during handle drag event loop.
21028     *
21029     * @event
21030     * @param {Object} evt - The event.
21031     * @returns {void}
21032     */
21033
21034  }, {
21035    key: "_editTouchDragCallback",
21036    value: function _editTouchDragCallback(evt) {
21037      var eventData = evt.detail;
21038      var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_10__["getToolState"])(eventData.element, this.name);
21039      var config = this.configuration;
21040      var data = toolState.data[config.currentTool];
21041      var currentHandle = config.currentHandle;
21042      var points = data.handles.points;
21043      var handleIndex = -1; // Set the mouseLocation handle
21044
21045      this._getMouseLocation(eventData);
21046
21047      data.handles.invalidHandlePlacement = freehandIntersect.modify(points, currentHandle);
21048      data.active = true;
21049      data.highlight = true;
21050      points[currentHandle].x = config.mouseLocation.handles.start.x;
21051      points[currentHandle].y = config.mouseLocation.handles.start.y;
21052      handleIndex = this._getPrevHandleIndex(currentHandle, points);
21053
21054      if (currentHandle >= 0) {
21055        var lastLineIndex = points[handleIndex].lines.length - 1;
21056        var lastLine = points[handleIndex].lines[lastLineIndex];
21057        lastLine.x = config.mouseLocation.handles.start.x;
21058        lastLine.y = config.mouseLocation.handles.start.y;
21059      } // Update the image
21060
21061
21062      _externalModules_js__WEBPACK_IMPORTED_MODULE_8__["default"].cornerstone.updateImage(eventData.element);
21063    }
21064    /**
21065     * Returns the previous handle to the current one.
21066     * @param {Number} currentHandle - the current handle index
21067     * @param {Array} points - the handles Array of the freehand data
21068     * @returns {Number} - The index of the previos handle
21069     */
21070
21071  }, {
21072    key: "_getPrevHandleIndex",
21073    value: function _getPrevHandleIndex(currentHandle, points) {
21074      if (currentHandle === 0) {
21075        return points.length - 1;
21076      }
21077
21078      return currentHandle - 1;
21079    }
21080    /**
21081     * Event handler for MOUSE_UP during handle drag event loop.
21082     *
21083     * @private
21084     * @param {Object} evt - The event.
21085     * @returns {undefined}
21086     */
21087
21088  }, {
21089    key: "_editMouseUpCallback",
21090    value: function _editMouseUpCallback(evt) {
21091      var eventData = evt.detail;
21092      var element = eventData.element;
21093      var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_10__["getToolState"])(eventData.element, this.name);
21094
21095      this._deactivateModify(element);
21096
21097      this._dropHandle(eventData, toolState);
21098
21099      this._endDrawing(element);
21100
21101      _externalModules_js__WEBPACK_IMPORTED_MODULE_8__["default"].cornerstone.updateImage(eventData.element);
21102    }
21103    /**
21104     * Places a handle of the freehand tool if the new location is valid.
21105     * If the new location is invalid the handle snaps back to its previous position.
21106     *
21107     * @private
21108     * @param {Object} eventData - Data object associated with the event.
21109     * @param {Object} toolState - The data associated with the freehand tool.
21110     * @modifies {toolState}
21111     * @returns {undefined}
21112     */
21113
21114  }, {
21115    key: "_dropHandle",
21116    value: function _dropHandle(eventData, toolState) {
21117      var config = this.configuration;
21118      var currentTool = config.currentTool;
21119      var handles = toolState.data[currentTool].handles;
21120      var points = handles.points; // Don't allow the line being modified to intersect other lines
21121
21122      if (handles.invalidHandlePlacement) {
21123        var currentHandle = config.currentHandle;
21124        var currentHandleData = points[currentHandle];
21125        var previousHandleData;
21126
21127        if (currentHandle === 0) {
21128          var lastHandleID = points.length - 1;
21129          previousHandleData = points[lastHandleID];
21130        } else {
21131          previousHandleData = points[currentHandle - 1];
21132        } // Snap back to previous position
21133
21134
21135        currentHandleData.x = config.dragOrigin.x;
21136        currentHandleData.y = config.dragOrigin.y;
21137        previousHandleData.lines[0] = currentHandleData;
21138        handles.invalidHandlePlacement = false;
21139      }
21140    }
21141    /**
21142     * Begining of drawing loop when tool is active and a click event happens far
21143     * from existing handles.
21144     *
21145     * @private
21146     * @param {Object} evt - The event.
21147     * @returns {undefined}
21148     */
21149
21150  }, {
21151    key: "_startDrawing",
21152    value: function _startDrawing(evt) {
21153      var eventData = evt.detail;
21154      var measurementData = this.createNewMeasurement(eventData);
21155      var element = eventData.element;
21156      var config = this.configuration;
21157      this._referencedElement = element;
21158      var interactionType;
21159
21160      if (evt.type === _events_js__WEBPACK_IMPORTED_MODULE_7__["default"].MOUSE_DOWN_ACTIVATE) {
21161        interactionType = 'Mouse';
21162      } else if (evt.type === _events_js__WEBPACK_IMPORTED_MODULE_7__["default"].TOUCH_START_ACTIVE) {
21163        interactionType = 'Touch';
21164      }
21165
21166      this._activateDraw(element, interactionType);
21167
21168      this._getMouseLocation(eventData);
21169
21170      Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_10__["addToolState"])(eventData.element, this.name, measurementData);
21171      var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_10__["getToolState"])(eventData.element, this.name);
21172      config.currentTool = toolState.data.length - 1;
21173      this._activeDrawingToolReference = toolState.data[config.currentTool];
21174    }
21175    /**
21176     * Adds a point on mouse click in polygon mode.
21177     *
21178     * @private
21179     * @param {Object} eventData - data object associated with an event.
21180     * @returns {undefined}
21181     */
21182
21183  }, {
21184    key: "_addPoint",
21185    value: function _addPoint(eventData) {
21186      var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_10__["getToolState"])(eventData.element, this.name); // Get the toolState from the last-drawn polygon
21187
21188      var config = this.configuration;
21189      var data = toolState.data[config.currentTool];
21190
21191      if (data.handles.invalidHandlePlacement) {
21192        return;
21193      }
21194
21195      var newHandleData = new FreehandHandleData(eventData.currentPoints.image); // If this is not the first handle
21196
21197      if (data.handles.points.length) {
21198        // Add the line from the current handle to the new handle
21199        data.handles.points[config.currentHandle - 1].lines.push(eventData.currentPoints.image);
21200      } // Add the new handle
21201
21202
21203      data.handles.points.push(newHandleData); // Increment the current handle value
21204
21205      config.currentHandle += 1; // Force onImageRendered to fire
21206
21207      _externalModules_js__WEBPACK_IMPORTED_MODULE_8__["default"].cornerstone.updateImage(eventData.element);
21208      this.fireModifiedEvent(eventData.element, data);
21209    }
21210    /**
21211     * If in pencilMode, check the mouse position is farther than the minimum
21212     * distance between points, then add a point.
21213     *
21214     * @private
21215     * @param {Object} eventData - Data object associated with an event.
21216     * @param {Object} points - Data object associated with the tool.
21217     * @returns {undefined}
21218     */
21219
21220  }, {
21221    key: "_addPointPencilMode",
21222    value: function _addPointPencilMode(eventData, points) {
21223      var _this3 = this;
21224
21225      var config = this.configuration;
21226      var element = eventData.element;
21227      var mousePoint = config.mouseLocation.handles.start;
21228
21229      var handleFurtherThanMinimumSpacing = function handleFurtherThanMinimumSpacing(handle) {
21230        return _this3._isDistanceLargerThanSpacing(element, handle, mousePoint);
21231      };
21232
21233      if (points.every(handleFurtherThanMinimumSpacing)) {
21234        this._addPoint(eventData);
21235      }
21236    }
21237    /**
21238     * Ends the active drawing loop and completes the polygon.
21239     *
21240     * @private
21241     * @param {Object} element - The element on which the roi is being drawn.
21242     * @param {Object}
21242 handleNearby - the handle nearest to the mouse cursor.
21243     * @returns {undefined}
21244     */
21245
21246  }, {
21247    key: "_endDrawing",
21248    value: function _endDrawing(element, handleNearby) {
21249      var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_10__["getToolState"])(element, this.name);
21250      var config = this.configuration;
21251      var data = toolState.data[config.currentTool];
21252      data.active = false;
21253      data.highlight = false;
21254      data.handles.invalidHandlePlacement = false; // Connect the end handle to the origin handle
21255
21256      if (handleNearby !== undefined) {
21257        var points = data.handles.points;
21258        points[config.currentHandle - 1].lines.push(points[0]);
21259      }
21260
21261      if (this._modifying) {
21262        this._modifying = false;
21263        data.invalidated = true;
21264      } // Reset the current handle
21265
21266
21267      config.currentHandle = 0;
21268      config.currentTool = -1;
21269      data.canComplete = false;
21270
21271      if (this._drawing) {
21272        this._deactivateDraw(element);
21273      }
21274
21275      _externalModules_js__WEBPACK_IMPORTED_MODULE_8__["default"].cornerstone.updateImage(element);
21276      this.fireModifiedEvent(element, data);
21277      this.fireCompletedEvent(element, data);
21278    }
21279    /**
21280     * Returns a handle of a particular tool if it is close to the mouse cursor
21281     *
21282     * @private
21283     * @param {Object} element - The element on which the roi is being drawn.
21284     * @param {Object} data      Data object associated with the tool.
21285     * @param {*} coords
21286     * @returns {Number|Object|Boolean}
21287     */
21288
21289  }, {
21290    key: "_pointNearHandle",
21291    value: function _pointNearHandle(element, data, coords) {
21292      if (data.handles === undefined || data.handles.points === undefined) {
21293        return;
21294      }
21295
21296      if (data.visible === false) {
21297        return;
21298      }
21299
21300      for (var i = 0; i < data.handles.points.length; i++) {
21301        var handleCanvas = _externalModules_js__WEBPACK_IMPORTED_MODULE_8__["default"].cornerstone.pixelToCanvas(element, data.handles.points[i]);
21302
21303        if (_externalModules_js__WEBPACK_IMPORTED_MODULE_8__["default"].cornerstoneMath.point.distance(handleCanvas, coords) < 6) {
21304          return i;
21305        }
21306      } // Check to see if mouse in bounding box of textbox
21307
21308
21309      if (data.handles.textBox) {
21310        if (Object(_util_pointInsideBoundingBox_js__WEBPACK_IMPORTED_MODULE_16__["default"])(data.handles.textBox, coords)) {
21311          return data.handles.textBox;
21312        }
21313      }
21314    }
21315    /**
21316     * Returns a handle if it is close to the mouse cursor (all tools)
21317     *
21318     * @private
21319     * @param {Object} eventData - data object associated with an event.
21320     * @returns {Object}
21321     */
21322
21323  }, {
21324    key: "_pointNearHandleAllTools",
21325    value: function _pointNearHandleAllTools(eventData) {
21326      var element = eventData.element;
21327      var coords = eventData.currentPoints.canvas;
21328      var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_10__["getToolState"])(element, this.name);
21329
21330      if (!toolState) {
21331        return;
21332      }
21333
21334      var handleNearby;
21335
21336      for (var toolIndex = 0; toolIndex < toolState.data.length; toolIndex++) {
21337        handleNearby = this._pointNearHandle(element, toolState.data[toolIndex], coords);
21338
21339        if (handleNearby !== undefined) {
21340          return {
21341            handleNearby: handleNearby,
21342            toolIndex: toolIndex
21343          };
21344        }
21345      }
21346    }
21347    /**
21348     * Gets the current mouse location and stores it in the configuration object.
21349     *
21350     * @private
21351     * @param {Object} eventData The data assoicated with the event.
21352     * @returns {undefined}
21353     */
21354
21355  }, {
21356    key: "_getMouseLocation",
21357    value: function _getMouseLocation(eventData) {
21358      // Set the mouseLocation handle
21359      var config = this.configuration;
21360      config.mouseLocation.handles.start.x = eventData.currentPoints.image.x;
21361      config.mouseLocation.handles.start.y = eventData.currentPoints.image.y;
21362      Object(_util_clip_js__WEBPACK_IMPORTED_MODULE_22__["clipToBox"])(config.mouseLocation.handles.start, eventData.image);
21363    }
21364    /**
21365     * Returns true if the proposed location of a new handle is invalid.
21366     *
21367     * @private
21368     * @param {Object} data      Data object associated with the tool.
21369     * @param {Object} eventData The data assoicated with the event.
21370     * @returns {Boolean}
21371     */
21372
21373  }, {
21374    key: "_checkInvalidHandleLocation",
21375    value: function _checkInvalidHandleLocation(data, eventData) {
21376      if (data.handles.points.length < 2) {
21377        return true;
21378      }
21379
21380      var invalidHandlePlacement;
21381
21382      if (this._dragging) {
21383        invalidHandlePlacement = this._checkHandlesPencilMode(data, eventData);
21384      } else {
21385        invalidHandlePlacement = this._checkHandlesPolygonMode(data, eventData);
21386      }
21387
21388      data.handles.invalidHandlePlacement = invalidHandlePlacement;
21389    }
21390    /**
21391     * Returns true if the proposed location of a new handle is invalid (in polygon mode).
21392     *
21393     * @private
21394     *
21395     * @param {Object} data - data object associated with the tool.
21396     * @param {Object} eventData The data assoicated with the event.
21397     * @returns {Boolean}
21398     */
21399
21400  }, {
21401    key: "_checkHandlesPolygonMode",
21402    value: function _checkHandlesPolygonMode(data, eventData) {
21403      var config = this.configuration;
21404      var element = eventData.element;
21405      var mousePoint = config.mouseLocation.handles.start;
21406      var points = data.handles.points;
21407      var invalidHandlePlacement = false;
21408      data.canComplete = false;
21409
21410      var mouseAtOriginHandle = this._isDistanceSmallerThanCompleteSpacingCanvas(element, points[0], mousePoint);
21411
21412      if (mouseAtOriginHandle && !freehandIntersect.end(points) && points.length > 2) {
21413        data.canComplete = true;
21414        invalidHandlePlacement = false;
21415      } else {
21416        invalidHandlePlacement = freehandIntersect.newHandle(mousePoint, points);
21417      }
21418
21419      return invalidHandlePlacement;
21420    }
21421    /**
21422     * Returns true if the proposed location of a new handle is invalid (in pencilMode).
21423     *
21424     * @private
21425     * @param {Object} data - data object associated with the tool.
21426     * @param {Object} eventData The data associated with the event.
21427     * @returns {Boolean}
21428     */
21429
21430  }, {
21431    key: "_checkHandlesPencilMode",
21432    value: function _checkHandlesPencilMode(data, eventData) {
21433      var config = this.configuration;
21434      var mousePoint = config.mouseLocation.handles.start;
21435      var points = data.handles.points;
21436      var invalidHandlePlacement = freehandIntersect.newHandle(mousePoint, points);
21437
21438      if (invalidHandlePlacement === false) {
21439        invalidHandlePlacement = this._invalidHandlePencilMode(data, eventData);
21440      }
21441
21442      return invalidHandlePlacement;
21443    }
21444    /**
21445     * Returns true if the mouse position is far enough from previous points (in pencilMode).
21446     *
21447     * @private
21448     * @param {Object} data - data object associated with the tool.
21449     * @param {Object} eventData The data associated with the event.
21450     * @returns {Boolean}
21451     */
21452
21453  }, {
21454    key: "_invalidHandlePencilMode",
21455    value: function _invalidHandlePencilMode(data, eventData) {
21456      var config = this.configuration;
21457      var element = eventData.element;
21458      var mousePoint = config.mouseLocation.handles.start;
21459      var points = data.handles.points;
21460
21461      var mouseAtOriginHandle = this._isDistanceSmallerThanCompleteSpacingCanvas(element, points[0], mousePoint);
21462
21463      if (mouseAtOriginHandle) {
21464        data.canComplete = true;
21465        return false;
21466      }
21467
21468      data.canComplete = false; // Compare with all other handles appart from the last one
21469
21470      for (var i = 1; i < points.length - 1; i++) {
21471        if (this._isDistanceSmallerThanSpacing(element, points[i], mousePoint)) {
21472          return true;
21473        }
21474      }
21475
21476      return false;
21477    }
21478    /**
21479     * Returns true if two points are closer than this.configuration.spacing.
21480     *
21481     * @private
21482     * @param  {Object} element     The element on which the roi is being drawn.
21483     * @param  {Object} p1          The first point, in pixel space.
21484     * @param  {Object} p2          The second point, in pixel space.
21485     * @returns {boolean}            True if the distance is smaller than the
21486     *                              allowed canvas spacing.
21487     */
21488
21489  }, {
21490    key: "_isDistanceSmallerThanCompleteSpacingCanvas",
21491    value: function _isDistanceSmallerThanCompleteSpacingCanvas(element, p1, p2) {
21492      var p1Canvas = _externalModules_js__WEBPACK_IMPORTED_MODULE_8__["default"].cornerstone.pixelToCanvas(element, p1);
21493      var p2Canvas = _externalModules_js__WEBPACK_IMPORTED_MODULE_8__["default"].cornerstone.pixelToCanvas(element, p2);
21494      var completeHandleRadius;
21495
21496      if (this._drawingInteractionType === 'Mouse') {
21497        completeHandleRadius = this.configuration.completeHandleRadius;
21498      } else if (this._drawingInteractionType === 'Touch') {
21499        completeHandleRadius = this.configuration.completeHandleRadiusTouch;
21500      }
21501
21502      return this._compareDistanceToSpacing(element, p1Canvas, p2Canvas, '<', completeHandleRadius);
21503    }
21504    /**
21505     * Returns true if two points are closer than this.configuration.spacing.
21506     *
21507     * @private
21508     * @param  {Object} element     The element on which the roi is being drawn.
21509     * @param  {Object} p1          The first point, in pixel space.
21510     * @param  {Object} p2          The second point, in pixel space.
21511     * @returns {boolean}            True if the distance is smaller than the
21512     *                              allowed canvas spacing.
21513     */
21514
21515  }, {
21516    key: "_isDistanceSmallerThanSpacing",
21517    value: function _isDistanceSmallerThanSpacing(element, p1, p2) {
21518      return this._compareDistanceToSpacing(element, p1, p2, '<');
21519    }
21520    /**
21521     * Returns true if two points are farther than this.configuration.spacing.
21522     *
21523     * @private
21524     * @param  {Object} element     The element on which the roi is being drawn.
21525     * @param  {Object} p1          The first point, in pixel space.
21526     * @param  {Object} p2          The second point, in pixel space.
21527     * @returns {boolean}            True if the distance is smaller than the
21528     *                              allowed canvas spacing.
21529     */
21530
21531  }, {
21532    key: "_isDistanceLargerThanSpacing",
21533    value: function _isDistanceLargerThanSpacing(element, p1, p2) {
21534      return this._compareDistanceToSpacing(element, p1, p2, '>');
21535    }
21536    /**
21537     * Compares the distance between two points to this.configuration.spacing.
21538     *
21539     * @private
21540     * @param  {Object} element     The element on which the roi is being drawn.
21541     * @param  {Object} p1          The first point, in pixel space.
21542     * @param  {Object} p2          The second point, in pixel space.
21543     * @param  {string} comparison  The comparison to make.
21544     * @param  {number} spacing     The allowed canvas spacing
21545     * @returns {boolean}           True if the distance is smaller than the
21546     *                              allowed canvas spacing.
21547     */
21548
21549  }, {
21550    key: "_compareDistanceToSpacing",
21551    value: function _compareDistanceToSpacing(element, p1, p2) {
21552      var comparison = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : '>';
21553      var spacing = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : this.configuration.spacing;
21554
21555      if (comparison === '>') {
21556        return _externalModules_js__WEBPACK_IMPORTED_MODULE_8__["default"].cornerstoneMath.point.distance(p1, p2) > spacing;
21557      }
21558
21559      return _externalModules_js__WEBPACK_IMPORTED_MODULE_8__["default"].cornerstoneMath.point.distance(p1, p2) < spacing;
21560    }
21561    /**
21562     * Adds drawing loop event listeners.
21563     *
21564     * @private
21565     * @param {Object} element - The viewport element to add event listeners to.
21566     * @param {string} interactionType - The interactionType used for the loop.
21567     * @modifies {element}
21568     * @returns {undefined}
21569     */
21570
21571  }, {
21572    key: "_activateDraw",
21573    value: function _activateDraw(element) {
21574      var interactionType = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'Mouse';
21575      this._drawing = true;
21576      this._drawingInteractionType = interactionType;
21577      _store_index_js__WEBPACK_IMPORTED_MODULE_13__["state"].isMultiPartToolActive = true;
21578      Object(_store_setToolCursor_js__WEBPACK_IMPORTED_MODULE_23__["hideToolCursor"])(this.element); // Polygonal Mode
21579
21580      element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_7__["default"].MOUSE_DOWN, this._drawingMouseDownCallback);
21581      element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_7__["default"].MOUSE_MOVE, this._drawingMouseMoveCallback);
21582      element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_7__["default"].MOUSE_DOUBLE_CLICK, this._drawingMouseDoubleClickCallback); // Drag/Pencil Mode
21583
21584      element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_7__["default"].MOUSE_DRAG, this._drawingMouseDragCallback);
21585      element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_7__["default"].MOUSE_UP, this._drawingMouseUpCallback); // Touch
21586
21587      element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_7__["default"].TOUCH_START, this._drawingMouseMoveCallback);
21588      element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_7__["default"].TOUCH_START, this._drawingTouchStartCallback);
21589      element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_7__["default"].TOUCH_DRAG, this._drawingTouchDragCallback);
21590      element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_7__["default"].TOUCH_END, this._drawingMouseUpCallback);
21591      element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_7__["default"].DOUBLE_TAP, this._drawingDoubleTapClickCallback);
21592      _externalModules_js__WEBPACK_IMPORTED_MODULE_8__["default"].cornerstone.updateImage(element);
21593    }
21594    /**
21595     * Removes drawing loop event listeners.
21596     *
21597     * @private
21598     * @param {Object} element - The viewport element to add event listeners to.
21599     * @modifies {element}
21600     * @returns {undefined}
21601     */
21602
21603  }, {
21604    key: "_deactivateDraw",
21605    value: function _deactivateDraw(element) {
21606      this._drawing = false;
21607      _store_index_js__WEBPACK_IMPORTED_MODULE_13__["state"].isMultiPartToolActive = false;
21608      this._activeDrawingToolReference = null;
21609      this._drawingInteractionType = null;
21610      Object(_store_setToolCursor_js__WEBPACK_IMPORTED_MODULE_23__["setToolCursor"])(this.element, this.svgCursor);
21611      element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_7__["default"].MOUSE_DOWN, this._drawingMouseDownCallback);
21612      element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_7__["default"].MOUSE_MOVE, this._drawingMouseMoveCallback);
21613      element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_7__["default"].MOUSE_DOUBLE_CLICK, this._drawingMouseDoubleClickCallback);
21614      element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_7__["default"].MOUSE_DRAG, this._drawingMouseDragCallback);
21615      element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_7__["default"].MOUSE_UP, this._drawingMouseUpCallback); // Touch
21616
21617      element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_7__["default"].TOUCH_START, this._drawingTouchStartCallback);
21618      element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_7__["default"].TOUCH_DRAG, this._drawingTouchDragCallback);
21619      element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_7__["default"].TOUCH_START, this._drawingMouseMoveCallback);
21620      element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_7__["default"].TOUCH_END, this._drawingMouseUpCallback);
21621      _externalModules_js__WEBPACK_IMPORTED_MODULE_8__["default"].cornerstone.updateImage(element);
21622    }
21623    /**
21624     * Adds modify loop event listeners.
21625     *
21626     * @private
21627     * @param {Object} element - The viewport element to add event listeners to.
21628     * @modifies {element}
21629     * @returns {undefined}
21630     */
21631
21632  }, {
21633    key: "_activateModify",
21634    value: function _activateModify(element) {
21635      _store_index_js__WEBPACK_IMPORTED_MODULE_13__["state"].isToolLocked = true;
21636      element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_7__["default"].MOUSE_UP, this._editMouseUpCallback);
21637      element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_7__["default"].MOUSE_DRAG, this._editMouseDragCallback);
21638      element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_7__["default"].MOUSE_CLICK, this._editMouseUpCallback);
21639      element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_7__["default"].TOUCH_END, this._editMouseUpCallback);
21640      element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_7__["default"].TOUCH_DRAG, this._editTouchDragCallback);
21641      _externalModules_js__WEBPACK_IMPORTED_MODULE_8__["default"].cornerstone.updateImage(element);
21642    }
21643    /**
21644     * Removes modify loop event listeners.
21645     *
21646     * @private
21647     * @param {Object} element - The viewport element to add event listeners to.
21648     * @modifies {element}
21649     * @returns {undefined}
21650     */
21651
21652  }, {
21653    key: "_deactivateModify",
21654    value: function _deactivateModify(element) {
21655      _store_index_js__WEBPACK_IMPORTED_MODULE_13__["state"].isToolLocked = false;
21656      element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_7__["default"].MOUSE_UP, this._editMouseUpCallback);
21657      element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_7__["default"].MOUSE_DRAG, this._editMouseDragCallback);
21658      element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_7__["default"].MOUSE_CLICK, this._editMouseUpCallback);
21659      element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_7__["default"].TOUCH_END, this._editMouseUpCallback);
21660      element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_7__["default"].TOUCH_DRAG, this._editTouchDragCallback);
21661      _externalModules_js__WEBPACK_IMPORTED_MODULE_8__["default"].cornerstone.updateImage(element);
21662    }
21663  }, {
21664    key: "passiveCallback",
21665    value: function passiveCallback(element) {
21666      this._closeToolIfDrawing(element);
21667    }
21668  }, {
21669    key: "enabledCallback",
21670    value: function enabledCallback(element) {
21671      this._closeToolIfDrawing(element);
21672    }
21673  }, {
21674    key: "disabledCallback",
21675    value: function disabledCallback(element) {
21676      this._closeToolIfDrawing(element);
21677    }
21678  }, {
21679    key: "_closeToolIfDrawing",
21680    value: function _closeToolIfDrawing(element) {
21681      if (this._drawing) {
21682        // Actively drawing but changed mode.
21683        var config = this.configuration;
21684        var lastHandlePlaced = config.currentHandle;
21685
21686        this._endDrawing(element, lastHandlePlaced);
21687
21688        _externalModules_js__WEBPACK_IMPORTED_MODULE_8__["default"].cornerstone.updateImage(element);
21689      }
21690    }
21691    /**
21692     * Fire MEASUREMENT_MODIFIED event on provided element
21693     * @param {any} element which freehand data has been modified
21694     * @param {any} measurementData the measurment data
21695     * @returns {void}
21696     */
21697
21698  }, {
21699    key: "fireModifiedEvent",
21700    value: function fireModifiedEvent(element, measurementData) {
21701      var eventType = _events_js__WEBPACK_IMPORTED_MODULE_7__["default"].MEASUREMENT_MODIFIED;
21702      var eventData = {
21703        toolName: this.name,
21704        element: element,
21705        measurementData: measurementData
21706      };
21707      Object(_util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_14__["default"])(element, eventType, eventData);
21708    }
21709  }, {
21710    key: "fireCompletedEvent",
21711    value: function fireCompletedEvent(element, measurementData) {
21712      var eventType = _events_js__WEBPACK_IMPORTED_MODULE_7__["default"].MEASUREMENT_COMPLETED;
21713      var eventData = {
21714        toolName: this.name,
21715        element: element,
21716        measurementData: measurementData
21717      };
21718      Object(_util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_14__["default"])(element, eventType, eventData);
21719    } // ===================================================================
21720    // Public Configuration API. .
21721    // ===================================================================
21722
21723  }, {
21724    key: "cancelDrawing",
21725
21726    /**
21727     * Ends the active drawing loop and removes the polygon.
21728     *
21729     * @public
21730     * @param {Object} element - The element on which the roi is being drawn.
21731     * @returns {null}
21732     */
21733    value: function cancelDrawing(element) {
21734      if (!this._drawing) {
21735        return;
21736      }
21737
21738      var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_10__["getToolState"])(element, this.name);
21739      var config = this.configuration;
21740      var data = toolState.data[config.currentTool];
21741      data.active = false;
21742      data.highlight = false;
21743      data.handles.invalidHandlePlacement = false; // Reset the current handle
21744
21745      config.currentHandle = 0;
21746      config.currentTool = -1;
21747      data.canComplete = false;
21748      Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_10__["removeToolState"])(element, this.name, data);
21749
21750      this._deactivateDraw(element);
21751
21752      _externalModules_js__WEBPACK_IMPORTED_MODULE_8__["default"].cornerstone.updateImage(element);
21753    }
21754    /**
21755     * New image event handler.
21756     *
21757     * @public
21758     * @param  {Object} evt The event.
21759     * @returns {null}
21760     */
21761
21762  }, {
21763    key: "newImageCallback",
21764    value: function newImageCallback(evt) {
21765      var config = this.configuration;
21766
21767      if (!(this._drawing && this._activeDrawingToolReference)) {
21768        return;
21769      } // Actively drawing but scrolled to different image.
21770
21771
21772      var element = evt.detail.element;
21773      var data = this._activeDrawingToolReference;
21774      data.active = false;
21775      data.highlight = false;
21776      data.handles.invalidHandlePlacement = false; // Connect the end handle to the origin handle
21777
21778      var points = data.handles.points;
21779      points[config.currentHandle - 1].lines.push(points[0]); // Reset the current handle
21780
21781      config.currentHandle = 0;
21782      config.currentTool = -1;
21783      data.canComplete = false;
21784
21785      this._deactivateDraw(element);
21786
21787      _externalModules_js__WEBPACK_IMPORTED_MODULE_8__["default"].cornerstone.updateImage(element);
21788    }
21789  }, {
21790    key: "spacing",
21791    get: function get() {
21792      return this.configuration.spacing;
21793    },
21794    set: function set(value) {
21795      if (typeof value !== 'number') {
21796        throw new Error('Attempting to set freehand spacing to a value other than a number.');
21797      }
21798
21799      this.configuration.spacing = value;
21800      _externalModules_js__WEBPACK_IMPORTED_MODULE_8__["default"].cornerstone.updateImage(this.element);
21801    }
21802  }, {
21803    key: "activeHandleRadius",
21804    get: function get() {
21805      return this.configuration.activeHandleRadius;
21806    },
21807    set: function set(value) {
21808      if (typeof value !== 'number') {
21809        throw new Error('Attempting to set freehand activeHandleRadius to a value other than a 
21809number.');
21810      }
21811
21812      this.configuration.activeHandleRadius = value;
21813      _externalModules_js__WEBPACK_IMPORTED_MODULE_8__["default"].cornerstone.updateImage(this.element);
21814    }
21815  }, {
21816    key: "completeHandleRadius",
21817    get: function get() {
21818      return this.configuration.completeHandleRadius;
21819    },
21820    set: function set(value) {
21821      if (typeof value !== 'number') {
21822        throw new Error('Attempting to set freehand completeHandleRadius to a value other than a number.');
21823      }
21824
21825      this.configuration.completeHandleRadius = value;
21826      _externalModules_js__WEBPACK_IMPORTED_MODULE_8__["default"].cornerstone.updateImage(this.element);
21827    }
21828  }, {
21829    key: "alwaysShowHandles",
21830    get: function get() {
21831      return this.configuration.alwaysShowHandles;
21832    },
21833    set: function set(value) {
21834      if (typeof value !== 'boolean') {
21835        throw new Error('Attempting to set freehand alwaysShowHandles to a value other than a boolean.');
21836      }
21837
21838      this.configuration.alwaysShowHandles = value;
21839      _externalModules_js__WEBPACK_IMPORTED_MODULE_8__["default"].cornerstone.updateImage(this.element);
21840    }
21841  }, {
21842    key: "invalidColor",
21843    get: function get() {
21844      return this.configuration.invalidColor;
21845    },
21846    set: function set(value) {
21847      /*
21848        It'd be easy to check if the color was e.g. a valid rgba color. However
21849        it'd be difficult to check if the color was a named CSS color without
21850        bloating the library, so we don't. If the canvas can't intepret the color
21851        it'll show up grey.
21852      */
21853      this.configuration.invalidColor = value;
21854      _externalModules_js__WEBPACK_IMPORTED_MODULE_8__["default"].cornerstone.updateImage(this.element);
21855    }
21856  }]);
21857
21858  return FreehandMouseTool;
21859}(_base_BaseAnnotationTool_js__WEBPACK_IMPORTED_MODULE_9__["default"]);
21860
21861
21862
21863function defaultFreehandConfiguration() {
21864  return {
21865    mouseLocation: {
21866      handles: {
21867        start: {
21868          highlight: true,
21869          active: true
21870        }
21871      }
21872    },
21873    spacing: 1,
21874    activeHandleRadius: 3,
21875    completeHandleRadius: 6,
21876    completeHandleRadiusTouch: 28,
21877    alwaysShowHandles: false,
21878    invalidColor: 'crimson',
21879    currentHandle: 0,
21880    currentTool: -1
21881  };
21882}
21883
21884function preventPropagation(evt) {
21885  evt.stopImmediatePropagation();
21886  evt.stopPropagation();
21887  evt.preventDefault();
21888}
21889
21890/***/ }),
21891
21892/***/ "./tools/annotation/LengthTool.js":
21893/*!****************************************!*\
21894  !*** ./tools/annotation/LengthTool.js ***!
21895  \****************************************/
21896/*! exports provided: default */
21897/***/ (function(module, __webpack_exports__, __webpack_require__) {
21898
21899"use strict";
21900__webpack_require__.r(__webpack_exports__);
21901/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return LengthTool; });
21902/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js");
21903/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
21904/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js");
21905/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
21906/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js");
21907/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
21908/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js");
21909/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
21910/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js");
21911/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__);
21912/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./../../externalModules.js */ "./externalModules.js");
21913/* harmony import */ var _base_BaseAnnotationTool_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../base/BaseAnnotationTool.js */ "./tools/base/BaseAnnotationTool.js");
21914/* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./../../stateManagement/toolState.js */ "./stateManagement/toolState.js");
21915/* harmony import */ var _stateManagement_toolStyle_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./../../stateManagement/toolStyle.js */ "./stateManagement/toolStyle.js");
21916/* harmony import */ var _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./../../stateManagement/toolColors.js */ "./stateManagement/toolColors.js");
21917/* harmony import */ var _drawing_index_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./../../drawing/index.js */ "./drawing/index.js");
21918/* harmony import */ var _drawing_drawLinkedTextBox_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./../../drawing/drawLinkedTextBox.js */ "./drawing/drawLinkedTextBox.js");
21919/* harmony import */ var _drawing_drawHandles_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./../../drawing/drawHandles.js */ "./drawing/drawHandles.js");
21920/* harmony import */ var _util_lineSegDistance_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./../../util/lineSegDistance.js */ "./util/lineSegDistance.js");
21921/* harmony import */ var _cursors_index_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../cursors/index.js */ "./tools/cursors/index.js");
21922/* harmony import */ var _util_logger_js__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../../util/logger.js */ "./util/logger.js");
21923/* harmony import */ var _util_getPixelSpacing__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../../util/getPixelSpacing */ "./util/getPixelSpacing.js");
21924/* harmony import */ var _util_throttle__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../../util/throttle */ "./util/throttle.js");
21925
21926
21927
21928
21929
21930
21931 // State
21932
21933
21934
21935 // Drawing
21936
21937
21938
21939
21940
21941
21942
21943
21944
21945var logger = Object(_util_logger_js__WEBPACK_IMPORTED_MODULE_15__["getLogger"])('tools:annotation:LengthTool');
21946/**
21947 * @public
21948 * @class LengthTool
21949 * @memberof Tools.Annotation
21950 * @classdesc Tool for measuring distances.
21951 * @extends Tools.Base.BaseAnnotationTool
21952 */
21953
21954var LengthTool =
21955/*#__PURE__*/
21956function (_BaseAnnotationTool) {
21957  _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(LengthTool, _BaseAnnotationTool);
21958
21959  function LengthTool() {
21960    var _this;
21961
21962    var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
21963
21964    _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, LengthTool);
21965
21966    var defaultProps = {
21967      name: 'Length',
21968      supportedInteractionTypes: ['Mouse', 'Touch'],
21969      svgCursor: _cursors_index_js__WEBPACK_IMPORTED_MODULE_14__["lengthCursor"]
21970    };
21971    _this = _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(LengthTool).call(this, props, defaultProps));
21972    _this.throttledUpdateCachedStats = Object(_util_throttle__WEBPACK_IMPORTED_MODULE_17__["default"])(_this.updateCachedStats, 110);
21973    return _this;
21974  }
21975
21976  _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(LengthTool, [{
21977    key: "createNewMeasurement",
21978    value: function createNewMeasurement(eventData) {
21979      var goodEventData = eventData && eventData.currentPoints && eventData.currentPoints.image;
21980
21981      if (!goodEventData) {
21982        logger.error("required eventData not supplied to tool ".concat(this.name, "'s createNewMeasurement"));
21983        return;
21984      }
21985
21986      var _eventData$currentPoi = eventData.currentPoints.image,
21987          x = _eventData$currentPoi.x,
21988          y = _eventData$currentPoi.y;
21989      return {
21990        visible: true,
21991        active: true,
21992        color: undefined,
21993        invalidated: true,
21994        handles: {
21995          start: {
21996            x: x,
21997            y: y,
21998            highlight: true,
21999            active: false
22000          },
22001          end: {
22002            x: x,
22003            y: y,
22004            highlight: true,
22005            active: true
22006          },
22007          textBox: {
22008            active: false,
22009            hasMoved: false,
22010            movesIndependently: false,
22011            drawnIndependently: true,
22012            allowedOutsideImage: true,
22013            hasBoundingBox: true
22014          }
22015        }
22016      };
22017    }
22018    /**
22019     *
22020     *
22021     * @param {*} element
22022     * @param {*} data
22023     * @param {*} coords
22024     * @returns {Boolean}
22025     */
22026
22027  }, {
22028    key: "pointNearTool",
22029    value: function pointNearTool(element, data, coords) {
22030      var hasStartAndEndHandles = data && data.handles && data.handles.start && data.handles.end;
22031      var validParameters = hasStartAndEndHandles;
22032
22033      if (!validParameters) {
22034        logger.warn("invalid parameters supplied to tool ".concat(this.name, "'s pointNearTool"));
22035        return false;
22036      }
22037
22038      if (data.visible === false) {
22039        return false;
22040      }
22041
22042      return Object(_util_lineSegDistance_js__WEBPACK_IMPORTED_MODULE_13__["default"])(element, data.handles.start, data.handles.end, coords) < 25;
22043    }
22044  }, {
22045    key: "updateCachedStats",
22046    value: function updateCachedStats(image, element, data) {
22047      var _getPixelSpacing = Object(_util_getPixelSpacing__WEBPACK_IMPORTED_MODULE_16__["default"])(image),
22048          rowPixelSpacing = _getPixelSpacing.rowPixelSpacing,
22049          colPixelSpacing = _getPixelSpacing.colPixelSpacing; // Set rowPixelSpacing and columnPixelSpacing to 1 if they are undefined (or zero)
22050
22051
22052      var dx = (data.handles.end.x - data.handles.start.x) * (colPixelSpacing || 1);
22053      var dy = (data.handles.end.y - data.handles.start.y) * (rowPixelSpacing || 1); // Calculate the length, and create the text variable with the millimeters or pixels suffix
22054
22055      var length = Math.sqrt(dx * dx + dy * dy); // Store the length inside the tool for outside access
22056
22057      data.length = length;
22058      data.invalidated = false;
22059    }
22060  }, {
22061    key: "renderToolData",
22062    value: function renderToolData(evt) {
22063      var _this2 = this;
22064
22065      var eventData = evt.detail;
22066      var _this$configuration = this.configuration,
22067          handleRadius = _this$configuration.handleRadius,
22068          drawHandlesOnHover = _this$configuration.drawHandlesOnHover;
22069      var toolData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_7__["getToolState"])(evt.currentTarget, this.name);
22070
22071      if (!toolData) {
22072        return;
22073      } // We have tool data for this element - iterate over each one and draw it
22074
22075
22076      var context = Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_10__["getNewContext"])(eventData.canvasContext.canvas);
22077      var image = eventData.image,
22078          element = eventData.element;
22079
22080      var _getPixelSpacing2 = Object(_util_getPixelSpacing__WEBPACK_IMPORTED_MODULE_16__["default"])(image),
22081          rowPixelSpacing = _getPixelSpacing2.rowPixelSpacing,
22082          colPixelSpacing = _getPixelSpacing2.colPixelSpacing;
22083
22084      var lineWidth = _stateManagement_toolStyle_js__WEBPACK_IMPORTED_MODULE_8__["default"].getToolW
22084idth();
22085
22086      var _loop = function _loop(i) {
22087        var data = toolData.data[i];
22088
22089        if (data.visible === false) {
22090          return "continue";
22091        }
22092
22093        Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_10__["draw"])(context, function (context) {
22094          // Configurable shadow
22095          Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_10__["setShadow"])(context, _this2.configuration);
22096          var color = _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_9__["default"].getColorIfActive(data); // Draw the measurement line
22097
22098          var lineOptions = {
22099            color: color
22100          };
22101          if(data.lineWidth){
22102            lineOptions.lineWidth = data.lineWidth;
22103          }
22104          Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_10__["drawLine"])(context, element, data.handles.start, data.handles.end, lineOptions); // Draw the handles
22105
22106          var handleOptions = {
22107            color: color,
22108            handleRadius: handleRadius,
22109            drawHandlesIfActive: drawHandlesOnHover
22110          };
22111          Object(_drawing_drawHandles_js__WEBPACK_IMPORTED_MODULE_12__["default"])(context, eventData, data.handles, handleOptions);
22112
22113          if (!data.handles.textBox.hasMoved) {
22114            var coords = {
22115              x: Math.max(data.handles.start.x, data.handles.end.x)
22116            }; // Depending on which handle has the largest x-value,
22117            // Set the y-value for the text box
22118
22119            if (coords.x === data.handles.start.x) {
22120              coords.y = data.handles.start.y;
22121            } else {
22122              coords.y = data.handles.end.y;
22123            }
22124
22125            data.handles.textBox.x = coords.x;
22126            data.handles.textBox.y = coords.y;
22127          } // Move the textbox slightly to the right and upwards
22128          // So that it sits beside the length tool handle
22129
22130
22131          var xOffset = 10; // Update textbox stats
22132
22133          if (data.invalidated === true) {
22134            if (data.length) {
22135              _this2.throttledUpdateCachedStats(image, element, data);
22136            } else {
22137              _this2.updateCachedStats(image, element, data);
22138            }
22139          }
22140
22141          var text = textBoxText(data, rowPixelSpacing, colPixelSpacing);
22142          Object(_drawing_drawLinkedTextBox_js__WEBPACK_IMPORTED_MODULE_11__["default"])(context, element, data.handles.textBox, text, data.handles, textBoxAnchorPoints, color, lineWidth, xOffset, true);
22143        });
22144      };
22145
22146      for (var i = 0; i < toolData.data.length; i++) {
22147        var _ret = _loop(i);
22148
22149        if (_ret === "continue") continue;
22150      }
22151
22152      function textBoxText(data, rowPixelSpacing, colPixelSpacing) {
22153        // Set the length text suffix depending on whether or not pixelSpacing is available
22154        var suffix = ' mm';
22155
22156        if (!rowPixelSpacing || !colPixelSpacing) {
22157          suffix = ' pixels';
22158        }
22159
22160        return "".concat(data.length.toFixed(2)).concat(suffix);
22161      }
22162
22163      function textBoxAnchorPoints(handles) {
22164        var midpoint = {
22165          x: (handles.start.x + handles.end.x) / 2,
22166          y: (handles.start.y + handles.end.y) / 2
22167        };
22168        return [handles.start, midpoint, handles.end];
22169      }
22170    }
22171  }]);
22172
22173  return LengthTool;
22174}(_base_BaseAnnotationTool_js__WEBPACK_IMPORTED_MODULE_6__["default"]);
22175
22176
22177
22178/***/ }),
22179
22180/***/ "./tools/annotation/ProbeTool.js":
22181/*!***************************************!*\
22182  !*** ./tools/annotation/ProbeTool.js ***!
22183  \***************************************/
22184/*! exports provided: default */
22185/***/ (function(module, __webpack_exports__, __webpack_require__) {
22186
22187"use strict";
22188__webpack_require__.r(__webpack_exports__);
22189/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return ProbeTool; });
22190/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js");
22191/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
22192/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js");
22193/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
22194/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js");
22195/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
22196/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js");
22197/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
22198/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js");
22199/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__);
22200/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../externalModules.js */ "./externalModules.js");
22201/* harmony import */ var _base_BaseAnnotationTool_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../base/BaseAnnotationTool.js */ "./tools/base/BaseAnnotationTool.js");
22202/* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../stateManagement/toolState.js */ "./stateManagement/toolState.js");
22203/* harmony import */ var _stateManagement_textStyle_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../stateManagement/textStyle.js */ "./stateManagement/textStyle.js");
22204/* harmony import */ var _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../stateManagement/toolColors.js */ "./stateManagement/toolColors.js");
22205/* harmony import */ var _drawing_index_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../drawing/index.js */ "./drawing/index.js");
22206/* harmony import */ var _drawing_drawTextBox_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../drawing/drawTextBox.js */ "./drawing/drawTextBox.js");
22207/* harmony import */ var _drawing_drawHandles_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../../drawing/drawHandles.js */ "./drawing/drawHandles.js");
22208/* harmony import */ var _util_getRGBPixels_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../../util/getRGBPixels.js */ "./util/getRGBPixels.js");
22209/* harmony import */ var _util_calculateSUV_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../../util/calculateSUV.js */ "./util/calculateSUV.js");
22210/* harmony import */ var _cursors_index_js__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../cursors/index.js */ "./tools/cursors/index.js");
22211/* harmony import */ var _util_logger_js__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../../util/logger.js */ "./util/logger.js");
22212/* harmony import */ var _util_throttle__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../../util/throttle */ "./util/throttle.js");
22213
22214
22215
22216
22217
22218
22219 // State
22220
22221
22222
22223 // Drawing
22224
22225
22226
22227 // Utilities
22228
22229
22230
22231
22232
22233
22234var logger = Object(_util_logger_js__WEBPACK_IMPORTED_MODULE_16__["getLogger"])('tools:annotation:ProbeTool');
22235/**
22236 * @public
22237 * @class ProbeTool
22238 * @memberof Tools.Annotation
22239 * @classdesc Tool which provides a probe of the image data at the
22240 * desired position.
22241 * @extends Tools.Base.BaseAnnotationTool
22242 */
22243
22244var ProbeTool =
22245/*#__PURE__*/
22246function (_BaseAnnotationTool) {
22247  _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(ProbeTool, _BaseAnnotationTool);
22248
22249  function ProbeTool() {
22250    var _this;
22251
22252    var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
22253
22254    _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, ProbeTool);
22255
22256    var defaultProps = {
22257      name: 'Probe',
22258      supportedInteractionTypes: ['Mouse', 'Touch'],
22259      svgCursor: _cursors_index_js__WEBPACK_IMPORTED_MODULE_15__["probeCursor"]
22260    };
22261    _this = _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(ProbeTool).call(this, props, defaultProps));
22262    _this.throttledUpdateCachedStats = Object(_util_throttle__WEBPACK_IMPORTED_MODULE_17__["default"])(_this.updateCachedStats, 110);
22263    return _this;
22264  }
22265
22266  _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(ProbeTool, [{
22267    key: "createNewMeasurement",
22268    value: function createNewMeasurement(eventData) {
22269      var goodEventData = eventData && eventData.currentPoints && eventData.currentPoints.image;
22270
22271      if (!goodEventData) {
22272        logger.error("required eventData not supplied to tool ".concat(this.name, "'s createNewMeasurement"));
22273        return;
22274      }
22275
22276      return {
22277        visible: true,
22278        active: true,
22279        color: undefined,
22280        invalidated: true,
22281        handles: {
22282          end: {
22283            x: eventData.currentPoints.image.x,
22284            y: eventData.currentPoints.image.y,
22285            highlight: true,
22286            active: true
22287          }
22288        }
22289      };
22290    }
22291    /**
22292     *
22293     *
22294     * @param {*} element
22295     * @param {*} data
22296     * @param {*} coords
22297     * @returns {Boolean}
22298     */
22299
22300  }, {
22301    key: "pointNearTool",
22302    value: function pointNearTool(element, data, coords) {
22303      var hasEndHandle = data && data.handles && data.handles.end;
22304      var validParameters = hasEndHandle;
22305
22306      if (!validParameters) {
22307        logger.warn("invalid parameters supplied to tool ".concat(this.name, "'s pointNearTool"));
22308      }
22309
22310      if (!validParameters || data.visible === false) {
22311        return false;
22312      }
22313
22314      var probeCoords = _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.pixelToCanvas(element, data.handles.end);
22315      return _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstoneMath.point.distance(probeCoords, coords) < 5;
22316    }
22317  }, {
22318    key: "updateCachedStats",
22319    value: function updateCachedStats(image, element, data) {
22320      var x = Math.round(data.handles.end.x);
22321      var y = Math.round(data.handles.end.y);
22322      var stats = {};
22323
22324      if (x >= 0 && y >= 0 && x < image.columns && y < image.rows) {
22325        stats.x = x;
22326        stats.y = y;
22327
22328        if (image.color) {
22329          stats.storedPixels = Object(_util_getRGBPixels_js__WEBPACK_IMPORTED_MODULE_13__["default"])(element, x, y, 1, 1);
22330        } else {
22331          stats.storedPixels = _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.getStoredPixels(element, x, y, 1, 1);
22332          stats.sp = stats.storedPixels[0];
22333          stats.mo = stats.sp * image.slope + image.intercept;
22334          stats.suv = Object(_util_calculateSUV_js__WEBPACK_IMPORTED_MODULE_14__["default"])(image, stats.sp);
22335        }
22336      }
22337
22338      data.cachedStats = stats;
22339      data.invalidated = false;
22340    }
22341  }, {
22342    key: "renderToolData",
22343    value: function renderToolData(evt) {
22344      var _this2 = this;
22345
22346      var eventData = evt.detail;
22347      var handleRadius = this.configuration.handleRadius;
22348      var toolData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_7__["getToolState"])(evt.currentTarget, this.name);
22349
22350      if (!toolData) {
22351        return;
22352      } // We have tool data for this element - iterate over each one and draw it
22353
22354
22355      var context = Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_10__["getNewContext"])(eventData.canvasContext.canvas);
22356      var image = eventData.image,
22357          element = eventData.element;
22358      var fontHeight = _stateManagement_textStyle_js__WEBPACK_IMPORTED_MODULE_8__["default"].getFontSize();
22359
22360      var _loop = function _loop(i) {
22361        var data = toolData.data[i];
22362
22363        if (data.visible === false) {
22364          return "continue";
22365        }
22366
22367        Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_10__["draw"])(context, function (context) {
22368          var color = _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_9__["default"].getColorIfActive(data); // Draw the handles
22369
22370          var handlesOptions = {
22371            handleRadius: handleRadius,
22372            color: color
22373          }
22374          if(data.lineWidth){
22375            handlesOptions.lineWidth = data.lineWidth;
22376          }
22377          Object(_drawing_drawHandles_js__WEBPACK_IMPORTED_MODULE_12__["default"])(context, eventData, data.handles, handlesOptions); // Update textbox stats
22378
22379          if (data.invalidated === true) {
22380            if (data.cachedStats) {
22381              _this2.throttledUpdateCachedStats(image, element, data);
22382            } else {
22383              _this2.updateCachedStats(image, element, data);
22384            }
22385          }
22386
22387          var text, str;
22388          var _data$cachedStats = data.cachedStats,
22389              x = _data$cachedStats.x,
22390              y = _data$cachedStats.y,
22391              storedPixels = _data$cachedStats.storedPixels,
22392              sp = _data$cachedStats.sp,
22393              mo = _data$cachedStats.mo,
22394              suv = _data$cachedStats.suv;
22395
22396          if (x >= 0 && y >= 0 && x < image.columns && y < image.rows) {
22397            text = "".concat(x, ", ").concat(y);
22398
22399            if (image.color) {
22400              str = "R: ".concat(storedPixels[0], " G: ").concat(storedPixels[1], " B: ").concat(storedPixels[2]);
22401            } else {
22402              // Draw text
22403              str = "SP: ".concat(sp, " MO: ").concat(parseFloat(mo.toFixed(3)));
22404
22405              if (suv) {
22406                str += " SUV: ".concat(parseFloat(suv.toFixed(3)));
22407              }
22408            } // Coords for text
22409
22410
22411            var coords = {
22412              // Translate the x/y away from the cursor
22413              x: data.handles.end.x + 3,
22414              y: data.handles.end.y - 3
22415            };
22416            var textCoords = _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.pixelToCanvas(eventData.element, coords);
22417            Object(_drawing_drawTextBox_js__WEBPACK_IMPORTED_MODULE_11__["default"])(context, str, textCoords.x, textCoords.y + fontHeight + 5, color);
22418            Object(_drawing_drawTextBox_js__WEBPACK_IMPORTED_MODULE_11__["default"])(context, text, textCoords.x, textCoords.y, color);
22419          }
22420        });
22421      };
22422
22423      for (var i = 0; i < toolData.data.length; i++) {
22424        var _ret = _loop(i);
22425
22426        if (_ret === "continue") continue;
22427      }
22428    }
22429  }]);
22430
22431  return ProbeTool;
22432}(_base_BaseAnnotationTool_js__WEBPACK_IMPORTED_MODULE_6__["default"]);
22433
22434
22435
22436/***/ }),
22437
22438/***/ "./tools/annotation/RectangleRoiTool.js":
22439/*!**********************************************!*\
22440  !*** ./tools/annotation/RectangleRoiTool.js ***!
22441  \**********************************************/
22442/*! exports provided: default */
22443/***/ (function(module, __webpack_exports__, __webpack_require__) {
22444
22445"use strict";
22446__webpack_require__.r(__webpack_exports__);
22447/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return RectangleRoiTool; });
22448/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js");
22449/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
22450/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js");
22451/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
22452/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js");
22453/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
22454/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js");
22455/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
22456/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js");
22457/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__);
22458/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./../../externalModules.js */ "./externalModules.js");
22459/* harmony import */ var _base_BaseAnnotationTool_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../base/BaseAnnotationTool.js */ "./tools/base/BaseAnnotationTool.js");
22460/* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./../../stateManagement/toolState.js */ "./stateManagement/toolState.js");
22461/* harmony import */ var _stateManagement_toolStyle_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./../../stateManagement/toolStyle.js */ "./stateManagement/toolStyle.js");
22462/* harmony import */ var _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./../../stateManagement/toolColors.js */ "./stateManagement/toolColors.js");
22463/* harmony import */ var _drawing_index_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./../../drawing/index.js */ "./drawing/index.js");
22464/* harmony import */ var _util_calculateSUV_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./../../util/calculateSUV.js */ "./util/calculateSUV.js");
22465/* harmony import */ var _util_getROITextBoxCoords_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../../util/getROITextBoxCoords.js */ "./util/getROITextBoxCoords.js");
22466/* harmony import */ var _util_numbersWithCommas_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./../../util/numbersWithCommas.js */ "./util/numbersWithCommas.js");
22467/* harmony import */ var _util_throttle_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./../../util/throttle.js */ "./util/throttle.js");
22468/* harmony import */ var _cursors_index_js__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../cursors/index.js */ "./tools/cursors/index.js");
22469/* harmony import */ var _util_logger_js__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../../util/logger.js */ "./util/logger.js");
22470/* harmony import */ var _util_getPixelSpacing__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../../util/getPixelSpacing */ "./util/getPixelSpacing.js");
22471
22472
22473
22474
22475
22476
22477 // State
22478
22479
22480
22481 // Drawing
22482
22483 // Util
22484
22485
22486
22487
22488
22489
22490
22491
22492var logger = Object(_util_logger_js__WEBPACK_IMPORTED_MODULE_16__["getLogger"])('tools:annotation:RectangleRoiTool');
22493/**
22494 * @public
22495 * @class RectangleRoiTool
22496 * @memberof Tools.Annotation
22497 * @classdesc Tool for drawing rectangular regions of interest, and measuring
22498 * the statistics of the enclosed pixels.
22499 * @extends Tools.Base.BaseAnnotationTool
22500 */
22501
22502var RectangleRoiTool =
22503/*#__PURE__*/
22504function (_BaseAnnotationTool) {
22505  _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(RectangleRoiTool, _BaseAnnotationTool);
22506
22507  function RectangleRoiTool() {
22508    var _this;
22509
22510    var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
22511
22512    _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, RectangleRoiTool);
22513
22514    var defaultProps = {
22515      name: 'RectangleRoi',
22516      supportedInteractionTypes: ['Mouse', 'Touch'],
22517      configuration: {// showMinMax: false,
22518        // showHounsfieldUnits: true
22519      },
22520      svgCursor: _cursors_index_js__WEBPACK_IMPORTED_MODULE_15__["rectangleRoiCursor"]
22521    };
22522    _this = _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(RectangleRoiTool).call(this, props, defaultProps));
22523    _this.throttledUpdateCachedStats = Object(_util_throttle_js__WEBPACK_IMPORTED_MODULE_14__["default"])(_this.updateCachedStats, 110);
22524    return _this;
22525  }
22526
22527  _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(RectangleRoiTool, [{
22528    key: "createNewMeasurement",
22529    value: function createNewMeasurement(eventData) {
22530      var goodEventData = eventData && eventData.currentPoints && eventData.currentPoints.image;
22531
22532      if (!goodEventData) {
22533        logger.error("required eventData not supplied to tool ".concat(this.name, "'s createNewMeasurement"));
22534        return;
22535      }
22536
22537      return {
22538        visible: true,
22539        active: true,
22540        color: undefined,
22541        invalidated: true,
22542        handles: {
22543          start: {
22544            x: eventData.currentPoints.image.x,
22545            y: eventData.currentPoints.image.y,
22546            highlight: true,
22547            active: false
22548          },
22549          end: {
22550            x: eventData.currentPoints.image.x,
22551            y: eventData.currentPoints.image.y,
22552            highlight: true,
22553            active: true
22554          },
22555          initialRotation: eventData.viewport.rotation,
22556          textBox: {
22557            active: false,
22558            hasMoved: false,
22559            movesIndependently: false,
22560            drawnIndependently: true,
22561            allowedOutsideImage: true,
22562            hasBoundingBox: true
22563          }
22564        }
22565      };
22566    }
22567  }, {
22568    key: "pointNearTool",
22569    value: function pointNearTool(element, data, coords, interactionType) {
22570      var hasStartAndEndHandles = data && data.handles && data.handles.start && data.handles.end;
22571      var validParameters = hasStartAndEndHandles;
22572
22573      if (!validParameters) {
22574        logger.warn("invalid parameters supplied to tool ".concat(this.name, "'s pointNearTool"));
22575      }
22576
22577      if (!validParameters || data.visible === false) {
22578        return false;
22579      }
22580
22581      var distance = interactionType === 'mouse' ? 15 : 25;
22582      var startCanvas = _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.pixelToCanvas(element, data.handles.start);
22583      var endCanvas = _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.pixelToCanvas(element, data.handles.end);
22584      var rect = {
22585        left: Math.min(startCanvas.x, endCanvas.x),
22586        top: Math.min(startCanvas.y, endCanvas.y),
22587        width: Math.abs(startCanvas.x - endCanvas.x),
22588        height: Math.abs(startCanvas.y - endCanvas.y)
22589      };
22590      var distanceToPoint = _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstoneMath.rect.distanceToPoint(rect, coords);
22591      return distanceToPoint < distance;
22592    }
22593  }, {
22594    key: "updateCachedStats",
22595    value: function updateCachedStats(image, element, data) {
22596      var seriesModule = _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.metaData.get('generalSeriesModule', image.imageId) || {};
22597      var modality = seriesModule.modality;
22598      var pixelSpacing = Object(_util_getPixelSpacing__WEBPACK_IMPORTED_MODULE_17__["default"])(image);
22599
22600      var stats = _calculateStats(image, element, data.handles, modality, pixelSpacing);
22601
22602      data.cachedStats = stats;
22603      data.invalidated = false;
22604    }
22605  }, {
22606    key: "renderToolData",
22607    value: function renderToolData(evt) {
22608      var _this2 = this;
22609
22610      var toolData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_7__["getToolState"])(evt.currentTarget, this.name);
22611
22612      if (!toolData) {
22613        return;
22614      }
22615
22616      var eventData = evt.detail;
22617      var image = eventData.image,
22618          element = eventData.element;
22619      var lineWidth = _stateManagement_toolStyle_js__WEBPACK_IMPORTED_MODULE_8__["default"].getToolW
22619idth();
22620      var _this$configuration = this.configuration,
22621          handleRadius = _this$configuration.handleRadius,
22622          drawHandlesOnHover = _this$configuration.drawHandlesOnHover;
22623      var context = Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_10__["getNewContext"])(eventData.canvasContext.canvas);
22624
22625      var _getPixelSpacing = Object(_util_getPixelSpacing__WEBPACK_IMPORTED_MODULE_17__["default"])(image),
22626          rowPixelSpacing = _getPixelSpacing.rowPixelSpacing,
22627          colPixelSpacing = _getPixelSpacing.colPixelSpacing; // Meta
22628
22629
22630      var seriesModule = _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.metaData.get('generalSeriesModule', image.imageId) || {}; // Pixel Spacing
22631
22632      var modality = seriesModule.modality;
22633      var hasPixelSpacing = rowPixelSpacing && colPixelSpacing;
22634      Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_10__["draw"])(context, function (context) {
22635        // If we have tool data for this element - iterate over each set and draw it
22636        for (var i = 0; i < toolData.data.length; i++) {
22637          var data = toolData.data[i];
22638
22639          if (data.visible === false) {
22640            continue;
22641          } // Configure
22642
22643
22644          var color = _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_9__["default"].getColorIfActive(data);
22645          var handleOptions = {
22646            color: color,
22647            handleRadius: handleRadius,
22648            drawHandlesIfActive: drawHandlesOnHover
22649          };
22650          var lineOptions = {
22651            color: color
22652          };
22653          if(data.lineWidth){
22654            lineOptions.lineWidth = data.lineWidth;
22655          }
22656          Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_10__["setShadow"])(context, _this2.configuration); // Draw
22657
22658          Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_10__["drawRect"])(context, element, data.handles.start, data.handles.end, lineOptions, 'pixel', data.handles.initialRotation);
22659          Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_10__["drawHandles"])(context, eventData, data.handles, handleOptions); // Update textbox stats
22660
22661          if (data.invalidated === true) {
22662            if (data.cachedStats) {
22663              _this2.throttledUpdateCachedStats(image, element, data);
22664            } else {
22665              _this2.updateCachedStats(image, element, data);
22666            }
22667          } // Default to textbox on right side of ROI
22668
22669
22670          if (!data.handles.textBox.hasMoved) {
22671            var defaultCoords = Object(_util_getROITextBoxCoords_js__WEBPACK_IMPORTED_MODULE_12__["default"])(eventData.viewport, data.handles);
22672            Object.assign(data.handles.textBox, defaultCoords);
22673          }
22674
22675          var textBoxAnchorPoints = function textBoxAnchorPoints(handles) {
22676            return _findTextBoxAnchorPoints(handles.start, handles.end);
22677          };
22678
22679          var textBoxContent = _createTextBoxContent(context, image.color, data.cachedStats, modality, hasPixelSpacing, _this2.configuration);
22680
22681          Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_10__["drawLinkedTextBox"])(context, element, data.handles.textBox, textBoxContent, data.handles, textBoxAnchorPoints, color, lineWidth, 10, true);
22682        }
22683      });
22684    }
22685  }]);
22686
22687  return RectangleRoiTool;
22688}(_base_BaseAnnotationTool_js__WEBPACK_IMPORTED_MODULE_6__["default"]);
22689/**
22690 * TODO: This is the same method (+ GetPixels) for the other ROIs
22691 * TODO: The pixel filtering is the unique bit
22692 *
22693 * @param {*} startHandle
22694 * @param {*} endHandle
22695 * @returns {{ left: number, top: number, width: number, height: number}}
22696 */
22697
22698
22699
22700
22701function _getRectangleImageCoordinates(startHandle, endHandle) {
22702  return {
22703    left: Math.min(startHandle.x, endHandle.x),
22704    top: Math.min(startHandle.y, endHandle.y),
22705    width: Math.abs(startHandle.x - endHandle.x),
22706    height: Math.abs(startHandle.y - endHandle.y)
22707  };
22708}
22709/**
22710 *
22711 *
22712 * @param {*} image
22713 * @param {*} element
22714 * @param {*} handles
22715 * @param {*} modality
22716 * @param {*} pixelSpacing
22717 * @returns {Object} The Stats object
22718 */
22719
22720
22721function _calculateStats(image, element, handles, modality, pixelSpacing) {
22722  // Retrieve the bounds of the rectangle in image coordinates
22723  var roiCoordinates = _getRectangleImageCoordinates(handles.start, handles.end); // Retrieve the array of pixels that the rectangle bounds cover
22724
22725
22726  var pixels = _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.getPixels(element, roiCoordinates.left, roiCoordinates.top, roiCoordinates.width, roiCoordinates.height); // Calculate the mean & standard deviation from the pixels and the rectangle details
22727
22728  var roiMeanStdDev = _calculateRectangleStats(pixels, roiCoordinates);
22729
22730  var meanStdDevSUV;
22731
22732  if (modality === 'PT') {
22733    meanStdDevSUV = {
22734      mean: Object(_util_calculateSUV_js__WEBPACK_IMPORTED_MODULE_11__["default"])(image, roiMeanStdDev.mean, true) || 0,
22735      stdDev: Object(_util_calculateSUV_js__WEBPACK_IMPORTED_MODULE_11__["default"])(image, roiMeanStdDev.stdDev, true) || 0
22736    };
22737  } // Calculate the image area from the rectangle dimensions and pixel spacing
22738
22739
22740  var area = roiCoordinates.width * (pixelSpacing.colPixelSpacing || 1) * (roiCoordinates.height * (pixelSpacing.rowPixelSpacing || 1));
22741  return {
22742    area: area || 0,
22743    count: roiMeanStdDev.count || 0,
22744    mean: roiMeanStdDev.mean || 0,
22745    variance: roiMeanStdDev.variance || 0,
22746    stdDev: roiMeanStdDev.stdDev || 0,
22747    min: roiMeanStdDev.min || 0,
22748    max: roiMeanStdDev.max || 0,
22749    meanStdDevSUV: meanStdDevSUV
22750  };
22751}
22752/**
22753 *
22754 *
22755 * @param {*} sp
22756 * @param {*} rectangle
22757 * @returns {{ count, number, mean: number,  variance: number,  stdDev: number,  min: number,  max: number }}
22758 */
22759
22760
22761function _calculateRectangleStats(sp, rectangle) {
22762  var sum = 0;
22763  var sumSquared = 0;
22764  var count = 0;
22765  var index = 0;
22766  var min = sp ? sp[0] : null;
22767  var max = sp ? sp[0] : null;
22768
22769  for (var y = rectangle.top; y < rectangle.top + rectangle.height; y++) {
22770    for (var x = rectangle.left; x < rectangle.left + rectangle.width; x++) {
22771      sum += sp[index];
22772      sumSquared += sp[index] * sp[index];
22773      min = Math.min(min, sp[index]);
22774      max = Math.max(max, sp[index]);
22775      count++; // TODO: Wouldn't this just be sp.length?
22776
22777      index++;
22778    }
22779  }
22780
22781  if (count === 0) {
22782    return {
22783      count: count,
22784      mean: 0.0,
22785      variance: 0.0,
22786      stdDev: 0.0,
22787      min: 0.0,
22788      max: 0.0
22789    };
22790  }
22791
22792  var mean = sum / count;
22793  var variance = sumSquared / count - mean * mean;
22794  return {
22795    count: count,
22796    mean: mean,
22797    variance: variance,
22798    stdDev: Math.sqrt(variance),
22799    min: min,
22800    max: max
22801  };
22802}
22803/**
22804 *
22805 *
22806 * @param {*} startHandle
22807 * @param {*} endHandle
22808 * @returns {Array.<{x: number, y: number}>}
22809 */
22810
22811
22812function _findTextBoxAnchorPoints(startHandle, endHandle) {
22813  var _getRectangleImageCoo = _getRectangleImageCoordinates(startHandle, endHandle),
22814      left = _getRectangleImageCoo.left,
22815      top = _getRectangleImageCoo.top,
22816      width = _getRectangleImageCoo.width,
22817      height = _getRectangleImageCoo.height;
22818
22819  return [{
22820    // Top middle point of rectangle
22821    x: left + width / 2,
22822    y: top
22823  }, {
22824    // Left middle point of rectangle
22825    x: left,
22826    y: top + height / 2
22827  }, {
22828    // Bottom middle point of rectangle
22829    x: left + width / 2,
22830    y: top + height
22831  }, {
22832    // Right middle point of rectangle
22833    x: left + width,
22834    y: top + height / 2
22835  }];
22836}
22837/**
22838 *
22839 *
22840 * @param {*} area
22841 * @param {*} hasPixelSpacing
22842 * @returns {string} The formatted label for showing area
22843 */
22844
22845
22846function _formatArea(area, hasPixelSpacing) {
22847  // This uses Char code 178 for a superscript 2
22848  var suffix = hasPixelSpacing ? " mm".concat(String.fromCharCode(178)) : " px".concat(String.fromCharCode(178));
22849  return "Area: ".concat(Object(_util_numbersWithCommas_js__WEBPACK_IMPORTED_MODULE_13__["default"])(area.toFixed(2))).concat(suffix);
22850}
22851/**
22852 * TODO: This is identical to EllipticalROI's same fn
22853 * TODO: We may want to make this a utility for ROIs with these values?
22854 *
22855 * @param {*} context
22856 * @param {*} isColorImage
22857 * @param {*} { area, mean, stdDev, min, max, meanStdDevSUV }
22858 * @param {*} modality
22859 * @param {*} hasPixelSpacing
22860 * @param {*} [options={}]
22861 * @returns {string[]}
22862 */
22863
22864
22865function _createTextBoxContent(context, isColorImage, _ref, modality, hasPixelSpacing) {
22866  var area = _ref.area,
22867      mean = _ref.mean,
22868      stdDev = _ref.stdDev,
22869      min = _ref.min,
22870      max = _ref.max,
22871      meanStdDevSUV = _ref.meanStdDevSUV;
22872  var options = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : {};
22873  var showMinMax = options.showMinMax || false;
22874  var showHounsfieldUnits = options.showHounsfieldUnits !== false;
22875  var textLines = [];
22876  var otherLines = [];
22877
22878  if (!isColorImage) {
22879    var hasStandardUptakeValues = meanStdDevSUV && meanStdDevSUV.mean !== 0;
22880    var suffix = modality === 'CT' && showHounsfieldUnits ? ' HU' : '';
22881    var meanString = "Mean: ".concat(Object(_util_numbersWithCommas_js__WEBPACK_IMPORTED_MODULE_13__["default"])(mean.toFixed(2))).concat(suffix);
22882    var stdDevString = "Std Dev: ".concat(Object(_util_numbersWithCommas_js__WEBPACK_IMPORTED_MODULE_13__["default"])(stdDev.toFixed(2))).concat(suffix); // If this image has SUV values to display, concatenate them to the text line
22883
22884    if (hasStandardUptakeValues) {
22885      var SUVtext = ' SUV: ';
22886      var meanSuvString = "".concat(SUVtext).concat(Object(_util_numbersWithCommas_js__WEBPACK_IMPORTED_MODULE_13__["default"])(meanStdDevSUV.mean.toFixed(2)));
22887      var stdDevSuvString = "".concat(SUVtext).concat(Object(_util_numbersWithCommas_js__WEBPACK_IMPORTED_MODULE_13__["default"])(meanStdDevSUV.stdDev.toFixed(2)));
22888      var targetStringLength = Math.floor(context.measureText("".concat(stdDevString, "     ")).width);
22889
22890      while (context.measureText(meanString).width < targetStringLength) {
22891        meanString += ' ';
22892      }
22893
22894      otherLines.push("".concat(meanString).concat(meanSuvString));
22895      otherLines.push("".concat(stdDevString, "     ").concat(stdDevSuvString));
22896    } else {
22897      otherLines.push("".concat(meanString, "     ").concat(stdDevString));
22898    }
22899
22900    if (showMinMax) {
22901      var minString = "Min: ".concat(min).concat(suffix);
22902      var maxString = "Max: ".concat(max).concat(suffix);
22903
22904      var _targetStringLength = hasStandardUptakeValues ? Math.floor(context.measureText("".concat(stdDevString, "     ")).width) : Math.floor(context.measureText("".concat(meanString, "     ")).width);
22905
22906      while (context.measureText(minString).width < _targetStringLength) {
22907        minString += ' ';
22908      }
22909
22910      otherLines.push("".concat(minString).concat(maxString));
22911    }
22912  }
22913
22914  textLines.push(_formatArea(area, hasPixelSpacing));
22915  otherLines.forEach(function (x) {
22916    return textLines.push(x);
22917  });
22918  return textLines;
22919}
22920
22921/***/ }),
22922
22923/***/ "./tools/annotation/TextMarkerTool.js":
22924/*!********************************************!*\
22925  !*** ./tools/annotation/TextMarkerTool.js ***!
22926  \********************************************/
22927/*! exports provided: default */
22928/***/ (function(module, __webpack_exports__, __webpack_require__) {
22929
22930"use strict";
22931__webpack_require__.r(__webpack_exports__);
22932/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return TextMarkerTool; });
22933/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js");
22934/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
22935/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js");
22936/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
22937/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js");
22938/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
22939/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js");
22940/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
22941/* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/assertThisInitialized */ "../node_modules/@babel/runtime/helpers/assertThisInitialized.js");
22942/* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4__);
22943/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js");
22944/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__);
22945/* harmony import */ var _base_BaseAnnotationTool_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../base/BaseAnnotationTool.js */ "./tools/base/BaseAnnotationTool.js");
22946/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./../../externalModules.js */ "./externalModules.js");
22947/* harmony import */ var _util_pointInsideBoundingBox_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./../../util/pointInsideBoundingBox.js */ "./util/pointInsideBoundingBox.js");
22948/* harmony import */ var _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./../../stateManagement/toolColors.js */ "./stateManagement/toolColors.js");
22949/* harmony import */ var _drawing_index_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./../../drawing/index.js */ "./drawing/index.js");
22950/* harmony import */ var _drawing_drawTextBox_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./../../drawing/drawTextBox.js */ "./drawing/drawTextBox.js");
22951/* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./../../stateManagement/toolState.js */ "./stateManagement/toolState.js");
22952/* harmony import */ var _cursors_index_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../cursors/index.js */ "./tools/cursors/index.js");
22953
22954
22955
22956
22957
22958
22959
22960
22961
22962
22963
22964
22965
22966
22967/**
22968 * @public
22969 * @class TextMarkerTool
22970 * @memberof Tools.Annotation
22971 *
22972 * @classdesc Tool for annotating an image with text markers.
22973 * @extends Tools.Base.BaseAnnotationTool
22974 */
22975
22976var TextMarkerTool =
22977/*#__PURE__*/
22978function (_BaseAnnotationTool) {
22979  _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default()(TextMarkerTool, _BaseAnnotationTool);
22980
22981  function TextMarkerTool() {
22982    var _this;
22983
22984    var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
22985
22986    _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, TextMarkerTool);
22987
22988    var defaultProps = {
22989      name: 'TextMarker',
22990      supportedInteractionTypes: ['Mouse', 'Touch'],
22991      configuration: {
22992        markers: [],
22993        current: '',
22994        ascending: true,
22995        loop: false,
22996        changeTextCallback: changeTextCallback
22997      },
22998      svgCursor: _cursors_index_js__WEBPACK_IMPORTED_MODULE_13__["textMarkerCursor"]
22999    };
23000    _this = _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(TextMarkerTool).call(this, props, defaultProps));
23001    _this.touchPressCallback = _this._changeText.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this));
23002    _this.doubleClickCallback = _this._changeText.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this));
23003    return _this;
23004  }
23005
23006  _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(TextMarkerTool, [{
23007    key: "createNewMeasurement",
23008    value: function createNewMeasurement(eventData) {
23009      var config = this.configuration;
23010
23011      if (!config.current) {
23012        return;
23013      } // Create the measurement data for this tool with the end handle activated
23014
23015
23016      var measurementData = {
23017        visible: true,
23018        active: true,
23019        text: config.current,
23020        color: undefined,
23021        handles: {
23022          end: {
23023            x: eventData.currentPoints.image.x,
23024            y: eventData.currentPoints.image.y,
23025            highlight: true,
23026            active: true,
23027            hasBoundingBox: true
23028          }
23029        }
23030      }; // Create a rectangle representing the image
23031
23032      var imageRect = {
23033        left: 0,
23034        top: 0,
23035        width: eventData.image.width,
23036        height: eventData.image.height
23037      }; // Check if the current handle is outside the image,
23038      // If it is, prevent the handle creation
23039
23040      if (!_externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstoneMath.point.insideRect(measurementData.handles.end, imageRect)) {
23041        return;
23042      } // Update the current marker for the next marker
23043
23044
23045      var currentIndex = config.markers.indexOf(config.current);
23046      var increment = config.ascending ? 1 : -1;
23047      currentIndex += increment;
23048
23049      if (currentIndex >= config.markers.length) {
23050        currentIndex = config.loop ? 0 : -1;
23051      } else if (currentIndex < 0) {
23052        currentIndex = config.loop ? config.markers.length : -1;
23053      }
23054
23055      config.current = config.markers[currentIndex];
23056      return measurementData;
23057    }
23058  }, {
23059    key: "pointNearTool",
23060    value: function pointNearTool(element, data, coords) {
23061      if (data.visible === false) {
23062        return false;
23063      }
23064
23065      if (!data.handles.end.boundingBox) {
23066        return;
23067      }
23068
23069      var distanceToPoint = _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstoneMath.rect.distanceToPoint(data.handles.end.boundingBox, coords);
23070      var insideBoundingBox = Object(_util_pointInsideBoundingBox_js__WEBPACK_IMPORTED_MODULE_8__["default"])(data.handles.end, coords);
23071      return distanceToPoint < 10 || insideBoundingBox;
23072    }
23073  }, {
23074    key: "updateCachedStats",
23075    value: function updateCachedStats(image, element, data) {// No stats calculation for this tool
23076    }
23077  }, {
23078    key: "renderToolData",
23079    value: function renderToolData(evt) {
23080      var eventData = evt.detail;
23081      var config = this.configuration; // If we have no toolData for this element, return immediately as there is nothing to do
23082
23083      var toolData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_12__["getToolState"])(eventData.element, this.name);
23084
23085      if (!toolData) {
23086        return;
23087      } // We have tool data for this element - iterate over each one and draw it
23088
23089
23090      var context = Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_10__["getNewContext"])(eventData.canvasContext.canvas);
23091
23092      var _loop = function _loop(i) {
23093        var data = toolData.data[i];
23094
23095        if (data.visible === false) {
23096          return "continue";
23097        }
23098
23099        var color = _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_9__["default"].getColorIfActive(data);
23100        Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_10__["draw"])(context, function (context) {
23101          Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_10__["setShadow"])(context, config);
23102          var textCoords = _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstone.pixelToCanvas(eventData.element, data.handles.end);
23103          var options = {
23104            centering: {
23105              x: true,
23106              y: true
23107            }
23108          };
23109          data.handles.end.boundingBox = Object(_drawing_drawTextBox_js__WEBPACK_IMPORTED_MODULE_11__["default"])(context, data.text, textCoords.x, textCoords.y - 10, color, options);
23110        });
23111      };
23112
23113      for (var i = 0; i < toolData.data.length; i++) {
23114        var _ret = _loop(i);
23115
23116        if (_ret === "continue") continue;
23117      }
23118    }
23119  }, {
23120    key: "_changeText",
23121    value: function _changeText(evt) {
23122      var eventData = evt.detail;
23123      var element = eventData.element,
23124          currentPoints = eventData.currentPoints;
23125      var data;
23126
23127      function doneChangingTextCallback(data, updatedText, deleteTool) {
23128        if (deleteTool === true) {
23129          Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_12__["removeToolState"])(element, this.name, data);
23130        } else {
23131          data.text = updatedText;
23132        }
23133
23134        data.active = false;
23135        _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstone.updateImage(element);
23136      }
23137
23138      var config = this.configuration;
23139      var coords = currentPoints.canvas;
23140      var toolData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_12__["getToolState"])(element, this.name); // Now check to see if there is a handle we can move
23141
23142      if (!toolData) {
23143        return;
23144      }
23145
23146      for (var i = 0; i < toolData.data.length; i++) {
23147        data = toolData.data[i];
23148
23149        if (this.pointNearTool(element, data, coords)) {
23150          data.active = true;
23151          _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstone.updateImage(element); // Allow relabelling via a callback
23152
23153          config.changeTextCallback(data, eventData, doneChangingTextCallback);
23154          evt.stopImmediatePropagation();
23155          evt.preventDefault();
23156          evt.stopPropagation();
23157          return;
23158        }
23159      }
23160    }
23161  }]);
23162
23163  return TextMarkerTool;
23164}(_base_BaseAnnotationTool_js__WEBPACK_IMPORTED_MODULE_6__["default"]);
23165/**
23166 * This function is a callback to be overwriten in order to provide the wanted feature
23167 * modal, overlay, popup or any kind of interaction with the user to be able to update
23168 * the text marker label.
23169 *
23170 * @param  {Object} data
23171 * @param  {Object} eventData
23172 * @param  {doneChangingTextCallback} doneChangingTextCallback
23173 * @returns {void}
23174 */
23175
23176
23177
23178
23179var changeTextCallback = function changeTextCallback(data, eventData, doneChangingTextCallback) {
23180  // eslint-disable-next-line no-alert
23181  doneChangingTextCallback(data, prompt('Change your annotation:'));
23182};
23183/**
23184 * @callback doneChangingTextCallback
23185 * @param {Object} data
23186 * @param {string} text - The new text
23187 */
23188
23189/***/ }),
23190
23191/***/ "./tools/annotation/bidirectionalTool/addNewMeasurement.js":
23192/*!*****************************************************************!*\
23193  !*** ./tools/annotation/bidirectionalTool/addNewMeasurement.js ***!
23194  \*****************************************************************/
23195/*! exports provided: default */
23196/***/ (function(module, __webpack_exports__, __webpack_require__) {
23197
23198"use strict";
23199__webpack_require__.r(__webpack_exports__);
23200/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../../../externalModules.js */ "./externalModules.js");
23201/* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./../../../events.js */ "./events.js");
23202/* harmony import */ var _manipulators_index_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./../../../manipulators/index.js */ "./manipulators/index.js");
23203/* harmony import */ var _manipulators_anyHandlesOutsideImage_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./../../../manipulators/anyHandlesOutsideImage.js */ "./manipulators/anyHandlesOutsideImage.js");
23204/* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./../../../stateManagement/toolState.js */ "./stateManagement/toolState.js");
23205/* harmony import */ var _util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../../util/triggerEvent.js */ "./util/triggerEvent.js");
23206/* harmony import */ var _util_getActiveTool__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../../util/getActiveTool */ "./util/getActiveTool.js");
23207/* harmony import */ var _base_BaseAnnotationTool__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../base/BaseAnnotationTool */ "./tools/base/BaseAnnotationTool.js");
23208
23209
23210
23211
23212
23213
23214
23215
23216/* harmony default export */ __webpack_exports__["default"] = (function (evt, interactionType) {
23217  var _this = this;
23218
23219  var eventData = evt.detail;
23220  var element = eventData.element,
23221      image = eventData.image,
23222      buttons = eventData.buttons;
23223  var config = this.configuration;
23224
23225  if (checkPixelSpacing(image)) {
23226    return;
23227  }
23228
23229  var measurementData = this.createNewMeasurement(eventData);
23230
23231  var doneCallback = function doneCallback() {
23232    measurementData.active = false;
23233    _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.updateImage(element);
23234  }; // Associate this data with this imageId so we can render it and manipulate it
23235
23236
23237  Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_4__["addToolState"])(element, this.name, measurementData);
23238  _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.updateImage(element);
23239  var timestamp = new Date().getTime();
23240  var _measurementData$hand = measurementData.handles,
23241      end = _measurementData$hand.end,
23242      perpendicularStart = _measurementData$hand.perpendicularStart;
23243  Object(_manipulators_index_js__WEBPACK_IMPORTED_MODULE_2__["moveNewHandle"])(eventData, this.name, measurementData, end, {
23244    doneMovingCallback: function doneMovingCallback() {
23245      var handles = measurementData.handles,
23246          longestDiameter = measurementData.longestDiameter,
23247          shortestDiameter = measurementData.shortestDiameter;
23248      var hasHandlesOutside = Object(_manipulators_anyHandlesOutsideImage_js__WEBPACK_IMPORTED_MODULE_3__["default"])(eventData, handles);
23249      var longestDiameterSize = parseFloat(longestDiameter) || 0;
23250      var shortestDiameterSize = parseFloat(shortestDiameter) || 0;
23251      var isTooSmal = longestDiameterSize < 1 || shortestDiameterSize < 1;
23252      var isTooFast = new Date().getTime() - timestamp < 150;
23253
23254      if (hasHandlesOutside || isTooSmal || isTooFast) {
23255        // Delete the measurement
23256        measurementData.cancelled = true;
23257        Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_4__["removeToolState"])(element, _this.name, measurementData);
23258      } else {
23259        // Set lesionMeasurementData Session
23260        config.getMeasurementLocationCallback(measurementData, eventData, doneCallback);
23261      } // Perpendicular line is not connected to long-line
23262
23263
23264      perpendicularStart.locked = false;
23265      measurementData.invalidated = true;
23266      _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.updateImage(element);
23267      var activeTool = Object(_util_getActiveTool__WEBPACK_IMPORTED_MODULE_6__["default"])(element, buttons, interactionType);
23268
23269      if (activeTool instanceof _base_BaseAnnotationTool__WEBPACK_IMPORTED_MODULE_7__["default"]) {
23270        activeTool.updateCachedStats(image, element, measurementData);
23271      }
23272
23273      var modifiedEventData = {
23274        toolType: _this.name,
23275        element: element,
23276        measurementData: measurementData
23277      };
23278      Object(_util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_5__["default"])(element, _events_js__WEBPACK_IMPORTED_MODULE_1__["default"].MEASUREMENT_MODIFIED, modifiedEventData);
23279      Object(_util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_5__["default"])(element, _events_js__WEBPACK_IMPORTED_MODULE_1__["default"].MEASUREMENT_COMPLETED, modifiedEventData);
23280    }
23281  }, interactionType);
23282});
23283
23284var checkPixelSpacing = function checkPixelSpacing(image) {
23285  var imagePlane = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.metaData.get('imagePlaneModule', image.imageId);
23286  var rowPixelSpacing = image.rowPixelSpacing;
23287  var colPixelSpacing = image.columnPixelSpacing;
23288
23289  if (imagePlane) {
23290    rowPixelSpacing = imagePlane.rowPixelSpacing || imagePlane.rowImagePixelSpacing;
23291    colPixelSpacing = imagePlane.columnPixelSpacing || imagePlane.colImagePixelSpacing;
23292  } // LT-29 Disable Target Measurements when pixel spacing is not available
23293
23294
23295  return !rowPixelSpacing || !colPixelSpacing;
23296};
23297
23298/***/ }),
23299
23300/***/ "./tools/annotation/bidirectionalTool/createNewMeasurement.js":
23301/*!********************************************************************!*\
23302  !*** ./tools/annotation/bidirectionalTool/createNewMeasurement.js ***!
23303  \********************************************************************/
23304/*! exports provided: default */
23305/***/ (function(module, __webpack_exports__, __webpack_require__) {
23306
23307"use strict";
23308__webpack_require__.r(__webpack_exports__);
23309var getHandle = function getHandle(x, y, index) {
23310  var extraAttributes = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
23311  return Object.assign({
23312    x: x,
23313    y: y,
23314    index: index,
23315    drawnIndependently: false,
23316    allowedOutsideImage: false,
23317    highlight: true,
23318    active: false
23319  }, extraAttributes);
23320};
23321
23322/* harmony default export */ __webpack_exports__["default"] = (function (mouseEventData) {
23323  var _mouseEventData$curre = mouseEventData.currentPoints.image,
23324      x = _mouseEventData$curre.x,
23325      y = _mouseEventData$curre.y; // Create the measurement data for this tool with the end handle activated
23326
23327  var measurementData = {
23328    toolType: this.name,
23329    isCreating: true,
23330    visible: true,
23331    active: true,
23332    invalidated: true,
23333    handles: {
23334      start: getHandle(x, y, 0),
23335      end: getHandle(x, y, 1, {
23336        active: true
23337      }),
23338      perpendicularStart: getHandle(x, y, 2, {
23339        locked: true
23340      }),
23341      perpendicularEnd: getHandle(x, y, 3),
23342      textBox: getHandle(x - 50, y - 70, null, {
23343        highlight: false,
23344        hasMoved: true,
23345        active: false,
23346        movesIndependently: false,
23347        drawnIndependently: true,
23348        allowedOutsideImage: true,
23349        hasBoundingBox: true
23350      })
23351    },
23352    longestDiameter: 0,
23353    shortestDiameter: 0
23354  };
23355  return measurementData;
23356});
23357
23358/***/ }),
23359
23360/***/ "./tools/annotation/bidirectionalTool/handleSelectedCallback.js":
23361/*!**********************************************************************!*\
23362  !*** ./tools/annotation/bidirectionalTool/handleSelectedCallback.js ***!
23363  \**********************************************************************/
23364/*! exports provided: default */
23365/***/ (function(module, __webpack_exports__, __webpack_require__) {
23366
23367"use strict";
23368__webpack_require__.r(__webpack_exports__);
23369/* harmony default export */ __webpack_exports__["default"] = (function (evt, toolData, handle) {
23370  var interactionType = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'mouse';
23371
23372  if (interactionType === 'touch') {
23373    this.handleSelectedTouchCallback(evt);
23374  } else {
23375    this.handleSelectedMouseCallback(evt);
23376  }
23377});
23378
23379/***/ }),
23380
23381/***/ "./tools/annotation/bidirectionalTool/handleSelectedMouseCallback.js":
23382/*!***************************************************************************!*\
23383  !*** ./tools/annotation/bidirectionalTool/handleSelectedMouseCallback.js ***!
23384  \***************************************************************************/
23385/*! exports provided: default */
23386/***/ (function(module, __webpack_exports__, __webpack_require__) {
23387
23388"use strict";
23389__webpack_require__.r(__webpack_exports__);
23390/* harmony import */ var _babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/typeof */ "../node_modules/@babel/runtime/helpers/typeof.js");
23391/* harmony import */ var _babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0__);
23392/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./../../../externalModules.js */ "./externalModules.js");
23393/* harmony import */ var _store_index_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../store/index.js */ "./store/index.js");
23394/* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./../../../events.js */ "./events.js");
23395/* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./../../../stateManagement/toolState.js */ "./stateManagement/toolState.js");
23396/* harmony import */ var _manipulators_anyHandlesOutsideImage_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./../../../manipulators/anyHandlesOutsideImage.js */ "./manipulators/anyHandlesOutsideImage.js");
23397/* harmony import */ var _manipulators_getHandleNearImagePoint_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./../../../manipulators/getHandleNearImagePoint.js */ "./manipulators/getHandleNearImagePoint.js");
23398/* harmony import */ var _manipulators_index_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./../../../manipulators/index.js */ "./manipulators/index.js");
23399/* harmony import */ var _moveHandle_moveHandle_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./moveHandle/moveHandle.js */ "./tools/annotation/bidirectionalTool/moveHandle/moveHandle.js");
23400/* harmony import */ var _invertHandles_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./invertHandles.js */ "./tools/annotation/bidirectionalTool/invertHandles.js");
23401/* harmony import */ var _store_setToolCursor_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../../store/setToolCursor.js */ "./store/setToolCursor.js");
23402
23403
23404/* jshint -W083 */
23405
23406
23407
23408
23409
23410
23411
23412
23413
23414
23415/* harmony default export */ __webpack_exports__["default"] = (function (evt) {
23416  var _this = this;
23417
23418  var eventData = evt.detail;
23419  var element = eventData.element;
23420  var data;
23421  var distanceThreshold = _store_index_js__WEBPACK_IMPORTED_MODULE_2__["state"].clickProximity;
23422
23423  var handleDoneMove = function handleDoneMove(handle) {
23424    data.invalidated = true;
23425
23426    if (Object(_manipulators_anyHandlesOutsideImage_js__WEBPACK_IMPORTED_MODULE_5__["default"])(eventData, data.handles)) {
23427      // Delete the measurement
23428      Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_4__["removeToolState"])(element, _this.name, data);
23429    } // Update the handles to keep selected state
23430
23431
23432    if (handle) {
23433      handle.moving = false;
23434      handle.selected = true;
23435    }
23436
23437    Object(_store_setToolCursor_js__WEBPACK_IMPORTED_MODULE_10__["setToolCursor"])(_this.element, _this.svgCursor);
23438    _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.updateImage(element);
23439    element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_3__["default"].MOUSE_MOVE, _this._moveCallback);
23440    element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_3__["default"].TOUCH_START, _this._moveCallback);
23441  };
23442
23443  var coords = eventData.startPoints.canvas;
23444  var toolData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_4__["getToolState"])(evt.currentTarget, this.name);
23445
23446  if (!toolData) {
23447    return;
23448  } // Now check to see if there is a handle we can move
23449
23450
23451  var _loop = function _loop(i) {
23452    data = toolData.data[i];
23453    var handleParams = [element, data.handles, coords, distanceThreshold];
23454    var handle = _manipulators_getHandleNearImagePoint_js__WEBPACK_IMPORTED_MODULE_6__["default"].apply(void 0, handleParams);
23455
23456    if (handle) {
23457      element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_3__["default"].MOUSE_MOVE, _this._moveCallback);
23458      element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_3__["default"].TOUCH_START, _this._moveCallback);
23459      data.active = true;
23460      unselectAllHandles(data.handles);
23461      handle.moving = true; // Invert handles if needed
23462
23463      handle = Object(_invertHandles_js__WEBPACK_IMPORTED_MODULE_9__["default"])(eventData, data, handle);
23464      /* Hide the cursor to improve precision while resizing the line or set to move
23465         if dragging text box
23466      */
23467
23468      if (!handle.hasBoundingBox) {
23469        Object(_store_setToolCursor_js__WEBPACK_IMPORTED_MODULE_10__["hideToolCursor"])(_this.element);
23470      }
23471
23472      Object(_moveHandle_moveHandle_js__WEBPACK_IMPORTED_MODULE_8__["default"])(eventData, _this.name, data, handle, function () {
23473        return handleDoneMove(handle);
23474      });
23475      preventPropagation(evt);
23476      return {
23477        v: true
23478      };
23479    }
23480  };
23481
23482  for (var i = 0; i < toolData.data.length; i++) {
23483    var _ret = _loop(i);
23484
23485    if (_babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0___default()(_ret) === "object") return _ret.v;
23486  }
23487
23488  var getDoneMovingCallback = function getDoneMovingCallback(handles) {
23489    return function () {
23490      setHandlesMovingState(handles, false);
23491      handleDoneMove();
23492    };
23493  };
23494
23495  for (var i = 0; i < toolData.data.length; i++) {
23496    data = toolData.data[i];
23497
23498    if (this.pointNearTool(element, data, coords, 'mouse')) {
23499      element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_3__["default"].MOUSE_MOVE, this._moveCallback);
23500      element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_3__["default"].TOUCH_START, this._moveCallback);
23501      data.active = true;
23502      unselectAllHandles(data.handles);
23503      setHandlesMovingState(data.handles, true);
23504      var doneMovingCallback = getDoneMovingCallback(data.handles);
23505      Object(_manipulators_index_js__WEBPACK_IMPORTED_MODULE_7__["moveAllHandles"])(eventData, this.name, data, null, {
23506        deleteIfHandleOutsideImage: true,
23507        preventHandleOutsideImage: false,
23508        doneMovingCallback: doneMovingCallback
23509      }, 'mouse');
23510      preventPropagation(evt);
23511      return true;
23512    }
23513  }
23514}); // Clear the selected state for the given handles object
23515
23516var unselectAllHandles = function unselectAllHandles(handles) {
23517  var imageNeedsUpdate = false;
23518  Object.keys(handles).forEach(function (handleKey) {
23519    if (handleKey === 'textBox') {
23520      return;
23521    }
23522
23523    handles[handleKey].selected = false;
23524    imageNeedsUpdate = handles[handleKey].active || imageNeedsUpdate;
23525    handles[handleKey].active = false;
23526  });
23527  return imageNeedsUpdate;
23528};
23529
23530var setHandlesMovingState = function setHandlesMovingState(handles, state) {
23531  Object.keys(handles).forEach(function (handleKey) {
23532    if (handleKey === 'textBox') {
23533      return;
23534    }
23535
23536    handles[handleKey].moving = state;
23537  });
23538};
23539
23540var preventPropagation = function preventPropagation(evt) {
23541  evt.stopImmediatePropagation();
23542  evt.stopPropagation();
23543  evt.preventDefault();
23544};
23545
23546/***/ }),
23547
23548/***/ "./tools/annotation/bidirectionalTool/handleSelectedTouchCallback.js":
23549/*!***************************************************************************!*\
23550  !*** ./tools/annotation/bidirectionalTool/handleSelectedTouchCallback.js ***!
23551  \***************************************************************************/
23552/*! exports provided: default */
23553/***/ (function(module, __webpack_exports__, __webpack_require__) {
23554
23555"use strict";
23556__webpack_require__.r(__webpack_exports__);
23557/* harmony import */ var _babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/typeof */ "../node_modules/@babel/runtime/helpers/typeof.js");
23558/* harmony import */ var _babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0__);
23559/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./../../../externalModules.js */ "./externalModules.js");
23560/* harmony import */ var _store_index_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../store/index.js */ "./store/index.js");
23561/* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./../../../events.js */ "./events.js");
23562/* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./../../../stateManagement/toolState.js */ "./stateManagement/toolState.js");
23563/* harmony import */ var _manipulators_anyHandlesOutsideImage_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./../../../manipulators/anyHandlesOutsideImage.js */ "./manipulators/anyHandlesOutsideImage.js");
23564/* harmony import */ var _manipulators_getHandleNearImagePoint_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./../../../manipulators/getHandleNearImagePoint.js */ "./manipulators/getHandleNearImagePoint.js");
23565/* harmony import */ var _manipulators_index_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./../../../manipulators/index.js */ "./manipulators/index.js");
23566/* harmony import */ var _moveHandle_touchMoveHandle_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./moveHandle/touchMoveHandle.js */ "./tools/annotation/bidirectionalTool/moveHandle/touchMoveHandle.js");
23567
23568
23569/* jshint -W083 */
23570
23571
23572
23573
23574
23575
23576
23577
23578/* harmony default export */ __webpack_exports__["default"] = (function (evt) {
23579  var _this = this;
23580
23581  var eventData = evt.detail;
23582  var element = eventData.element;
23583  var data;
23584  var distanceThreshold = _store_index_js__WEBPACK_IMPORTED_MODULE_2__["state"].touchProximity;
23585
23586  var handleDoneMove = function handleDoneMove(handle) {
23587    data.invalidated = true;
23588
23589    if (Object(_manipulators_anyHandlesOutsideImage_js__WEBPACK_IMPORTED_MODULE_5__["default"])(eventData, data.handles)) {
23590      // Delete the measurement
23591      Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_4__["removeToolState"])(element, _this.name, data);
23592    } // Update the handles to keep selected state
23593
23594
23595    if (handle) {
23596      handle.moving = false;
23597      handle.selected = true;
23598    }
23599
23600    _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.updateImage(element);
23601    element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_3__["default"].TOUCH_DRAG, _this._moveCallback);
23602  };
23603
23604  var coords = eventData.startPoints.canvas;
23605  var toolData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_4__["getToolState"])(evt.currentTarget, this.name);
23606
23607  if (!toolData) {
23608    return;
23609  } // Now check to see if there is a handle we can move
23610
23611
23612  var _loop = function _loop(i) {
23613    data = toolData.data[i];
23614    var handleParams = [element, data.handles, coords, distanceThreshold];
23615    var handle = _manipulators_getHandleNearImagePoint_js__WEBPACK_IMPORTED_MODULE_6__["default"].apply(void 0, handleParams);
23616
23617    if (handle) {
23618      element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_3__["default"].TOUCH_DRAG, _this._moveCallback);
23619      data.active = true;
23620      unselectAllHandles(data.handles);
23621      handle.moving = true;
23622      Object(_moveHandle_touchMoveHandle_js__WEBPACK_IMPORTED_MODULE_8__["default"])(eventData, _this.name, data, handle, function () {
23623        return handleDoneMove(handle);
23624      });
23625      preventPropagation(evt);
23626      return {
23627        v: true
23628      };
23629    }
23630  };
23631
23632  for (var i = 0; i < toolData.data.length; i++) {
23633    var _ret = _loop(i);
23634
23635    if (_babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0___default()(_ret) === "object") return _ret.v;
23636  }
23637
23638  var getDoneMovingCallback = function getDoneMovingCallback(handles) {
23639    return function () {
23640      setHandlesMovingState(handles, false);
23641      handleDoneMove();
23642    };
23643  };
23644
23645  for (var i = 0; i < toolData.data.length; i++) {
23646    data = toolData.data[i];
23647
23648    if (this.pointNearTool(element, data, coords, 'touch')) {
23649      element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_3__["default"].TOUCH_DRAG, this._moveCallback);
23650      data.active = true;
23651      unselectAllHandles(data.handles);
23652      setHandlesMovingState(data.handles, true);
23653      var doneMovingCallback = getDoneMovingCallback(data.handles);
23654      Object(_manipulators_index_js__WEBPACK_IMPORTED_MODULE_7__["moveAllHandles"])(eventData, this.name, data, null, {
23655        deleteIfHandleOutsideImage: true,
23656        preventHandleOutsideImage: false,
23657        doneMovingCallback: doneMovingCallback
23658      }, 'touch');
23659      preventPropagation(evt);
23660      return true;
23661    }
23662  }
23663}); // Clear the selected state for the given handles object
23664
23665var unselectAllHandles = function unselectAllHandles(handles) {
23666  var imageNeedsUpdate = false;
23667  Object.keys(handles).forEach(function (handleKey) {
23668    if (handleKey === 'textBox') {
23669      return;
23670    }
23671
23672    handles[handleKey].selected = false;
23673    imageNeedsUpdate = handles[handleKey].active || imageNeedsUpdate;
23674    handles[handleKey].active = false;
23675  });
23676  return imageNeedsUpdate;
23677};
23678
23679var setHandlesMovingState = function setHandlesMovingState(handles, state) {
23680  Object.keys(handles).forEach(function (handleKey) {
23681    if (handleKey === 'textBox') {
23682      return;
23683    }
23684
23685    handles[handleKey].moving = state;
23686  });
23687};
23688
23689var preventPropagation = function preventPropagation(evt) {
23690  evt.stopImmediatePropagation();
23691  evt.stopPropagation();
23692  evt.preventDefault();
23693};
23694
23695/***/ }),
23696
23697/***/ "./tools/annotation/bidirectionalTool/invertHandles.js":
23698/*!*************************************************************!*\
23699  !*** ./tools/annotation/bidirectionalTool/invertHandles.js ***!
23700  \*************************************************************/
23701/*! exports provided: default */
23702/***/ (function(module, __webpack_exports__, __webpack_require__) {
23703
23704"use strict";
23705__webpack_require__.r(__webpack_exports__);
23706/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return invertHandles; });
23707var swapAttribute = function swapAttribute(a, b, attribute) {
23708  var originalA = a[attribute];
23709  var originalB = b[attribute];
23710  a[attribute] = originalB;
23711  b[attribute] = originalA;
23712};
23713
23714var swapHandles = function swapHandles(a, b) {
23715  swapAttribute(a, b, 'x');
23716  swapAttribute(a, b, 'y');
23717  swapAttribute(a, b, 'moving');
23718  swapAttribute(a, b, 'hover');
23719  swapAttribute(a, b, 'active');
23720  swapAttribute(a, b, 'selected');
23721};
23722
23723function invertHandles(eventData, measurementData, handle) {
23724  var _eventData$image = eventData.image,
23725      rowPixelSpacing = _eventData$image.rowPixelSpacing,
23726      columnPixelSpacing = _eventData$image.columnPixelSpacing;
23727  var handles = measurementData.handles;
23728  var start = handles.start,
23729      end = handles.end,
23730      perpendicularStart = handles.perpendicularStart,
23731      perpendicularEnd = handles.perpendicularEnd; // Calculate the long axis length
23732
23733  var dx = (start.x - end.x) * (columnPixelSpacing || 1);
23734  var dy = (start.y - end.y) * (rowPixelSpacing || 1);
23735  var length = Math.sqrt(dx * dx + dy * dy); // Calculate the short axis length
23736
23737  var wx = (perpendicularStart.x - perpendicularEnd.x) * (columnPixelSpacing || 1);
23738  var wy = (perpendicularStart.y - perpendicularEnd.y) * (rowPixelSpacing || 1);
23739  var width = Math.sqrt(wx * wx + wy * wy) || 0;
23740
23741  if (width > length) {
23742    swapHandles(start, end);
23743    swapHandles(start, perpendicularStart);
23744    swapHandles(end, perpendicularEnd);
23745    return Object.values(handles).find(function (h) {
23746      return h.moving === true;
23747    });
23748  }
23749
23750  return handle;
23751}
vendor: 22 bytes, lines 23751-23755
23751
23752
23753/***/ }),
23754
23755/***/ "./
23755tools/annotation/bidirectionalTool/mouseMoveCallback.js":
23756/*!*****************************************************************!*\
23757  !*** ./tools/annotation/bidirectionalTool/mouseMoveCallback.js ***!
23758  \*****************************************************************/
23759/*! exports provided: default */
23760/***/ (function(module, __webpack_exports__, __webpack_require__) {
23761
23762"use strict";
23763__webpack_require__.r(__webpack_exports__);
23764/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../../../externalModules.js */ "./externalModules.js");
23765/* harmony import */ var _stateManagement_toolCoordinates_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./../../../stateManagement/toolCoordinates.js */ "./stateManagement/toolCoordinates.js");
23766/* harmony import */ var _manipulators_getHandleNearImagePoint_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./../../../manipulators/getHandleNearImagePoint.js */ "./manipulators/getHandleNearImagePoint.js");
23767/* harmony 
23767import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./../../../stateManagement/toolState.js */ "./stateManagement/toolState.js");
23768
23769
23770
23771 // Replaces the cornerstoneTools.handleActivator function by skiping the active handle comparison
23772
23773var handleActivator = function handleActivator(element, handles, canvasPoint) {
23774  var distanceThreshold = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 6;
23775  var nearbyHandle = Object(_manipulators_getHandleNearImagePoint_js__WEBPACK_IMPORTED_MODULE_2__["default"])(element, handles, canvasPoint, distanceThreshold);
23776  var handleActivatorChanged = false;
23777  Object.keys(handles).forEach(function (handleKey) {
23778    if (handleKey === 'textBox') {
23779      return;
23780    }
23781
23782    var handle = handles[handleKey];
23783    var newActiveState = handle === nearbyHandle;
23784
23785    if (handle.active !== newActiveState) {
23786      handleActivatorChanged = true;
23787    }
23788
23789    handle.active = newActiveState;
23790  });
23791  return handleActivatorChanged;
23792}; // MouseMoveCallback is used to hide handles when mouse is away
23793
23794
23795/* harmony default export */ __webpack_exports__["default"] = (function (event) {
23796  var _this = this;
23797
23798  var eventData = event.detail;
23799  var element = eventData.element;
23800  _stateManagement_toolCoordinates_js__WEBPACK_IMPORTED_MODULE_1__["default"].setCoords(eventData); // If we have no tool data for this element, do nothing
23801
23802  var toolData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_3__["getToolState"])(element, this.name);
23803
23804  if (!toolData) {
23805    return;
23806  } // We have tool data, search through all data and see if we can activate a handle
23807
23808
23809  var imageNeedsUpdate = false;
23810
23811  var _loop = function _loop(i) {
23812    // Get the cursor position in canvas coordinates
23813    var coords = eventData.currentPoints.canvas;
23814    var data = toolData.data[i];
23815    var handleActivatorChanged = handleActivator(element, data.handles, coords);
23816    Object.keys(data.handles).forEach(function (handleKey) {
23817      if (handleKey === 'textBox') {
23818        return;
23819      }
23820
23821      var handle = data.handles[handleKey];
23822      handle.hover = handle.active;
23823    });
23824
23825    if (handleActivatorChanged) {
23826      imageNeedsUpdate = true;
23827    }
23828
23829    var nearTool = _this.pointNearTool(element, data, coords, 'mouse');
23830
23831    var nearToolAndInactive = nearTool && !data.active;
23832    var notNearToolAndActive = !nearTool && data.active;
23833
23834    if (nearToolAndInactive || notNearToolAndActive) {
23835      data.active = !data.active;
23836      imageNeedsUpdate = true;
23837    }
23838  };
23839
23840  for (var i = 0; i < toolData.data.length; i++) {
23841    _loop(i);
23842  } // Handle activation status changed, redraw the image
23843
23844
23845  if (imageNeedsUpdate === true) {
23846    _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.updateImage(element);
23847  }
23848});
23849
23850/***/ }),
23851
23852/***/ "./tools/annotation/bidirectionalTool/moveHandle/moveHandle.js":
23853/*!*********************************************************************!*\
23854  !*** ./tools/annotation/bidirectionalTool/moveHandle/moveHandle.js ***!
23855  \*********************************************************************/
23856/*! exports provided: default */
23857/***/ (function(module, __webpack_exports__, __webpack_require__) {
23858
23859"use strict";
23860__webpack_require__.r(__webpack_exports__);
23861/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../../../../externalModules.js */ "./externalModules.js");
23862/* harmony import */ var _store_index_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../../store/index.js */ "./store/index.js");
23863/* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./../../../../events.js */ "./events.js");
23864/* harmony import */ var _setHandlesPosition_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./setHandlesPosition.js */ "./tools/annotation/bidirectionalTool/moveHandle/setHandlesPosition.js");
23865/* harmony import */ var _util_getActiveTool__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../../util/getActiveTool */ "./util/getActiveTool.js");
23866/* harmony import */ var _base_BaseAnnotationTool__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../../base/BaseAnnotationTool */ "./tools/base/BaseAnnotationTool.js");
23867
23868
23869
23870
23871
23872
23873/* harmony default export */ __webpack_exports__["default"] = (function (mouseEventData, toolType, data, handle, doneMovingCallback, preventHandleOutsideImage) {
23874  var element = mouseEventData.element,
23875      image = mouseEventData.image,
23876      buttons = mouseEventData.buttons;
23877  var distanceFromTool = {
23878    x: handle.x - mouseEventData.currentPoints.image.x,
23879    y: handle.y - mouseEventData.currentPoints.image.y
23880  };
23881
23882  var _dragCallback = function _dragCallback(event) {
23883    var eventData = event.detail;
23884    handle.hasMoved = true;
23885
23886    if (handle.index === undefined || handle.index === null) {
23887      handle.x = eventData.currentPoints.image.x + distanceFromTool.x;
23888      handle.y = eventData.currentPoints.image.y + distanceFromTool.y;
23889    } else {
23890      Object(_setHandlesPosition_js__WEBPACK_IMPORTED_MODULE_3__["default"])(handle, eventData, data, distanceFromTool);
23891    }
23892
23893    if (preventHandleOutsideImage) {
23894      handle.x = Math.max(handle.x, 0);
23895      handle.x = Math.min(handle.x, eventData.image.width);
23896      handle.y = Math.max(handle.y, 0);
23897      handle.y = Math.min(handle.y, eventData.image.height);
23898    }
23899
23900    data.invalidated = true;
23901    _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.updateImage(element);
23902    var activeTool = Object(_util_getActiveTool__WEBPACK_IMPORTED_MODULE_4__["default"])(element, buttons, 'mouse');
23903
23904    if (activeTool instanceof _base_BaseAnnotationTool__WEBPACK_IMPORTED_MODULE_5__["default"]) {
23905      activeTool.updateCachedStats(image, element, data);
23906    }
23907
23908    var modifiedEventData = {
23909      toolType: toolType,
23910      element: element,
23911      measurementData: data
23912    };
23913    _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.triggerEvent(element, _events_js__WEBPACK_IMPORTED_MODULE_2__["default"].MEASUREMENT_MODIFIED, modifiedEventData);
23914  };
23915
23916  handle.active = true;
23917  _store_index_js__WEBPACK_IMPORTED_MODULE_1__["state"].isToolLocked = true;
23918  element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_2__["default"].MOUSE_DRAG, _dragCallback);
23919  element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_2__["default"].TOUCH_DRAG, _dragCallback);
23920  var currentImage = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.getImage(element);
23921
23922  var imageRenderedHandler = function imageRenderedHandler() {
23923    var newImage = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.getImage(element); // Check if the rendered image changed during measurement modifying and stop it if so
23924
23925    if (newImage.imageId !== currentImage.imageId) {
23926      interactionEndCallback();
23927    }
23928  }; // Bind the event listener for image rendering
23929
23930
23931  element.addEventListener(_externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.EVENTS.IMAGE_RENDERED, imageRenderedHandler);
23932
23933  var interactionEndCallback = function interactionEndCallback() {
23934    handle.active = false;
23935    _store_index_js__WEBPACK_IMPORTED_MODULE_1__["state"].isToolLocked = false;
23936    element.removeEventListener(_externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.EVENTS.IMAGE_RENDERED, imageRenderedHandler);
23937    element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_2__["default"].MOUSE_DRAG, _dragCallback);
23938    element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_2__["default"].MOUSE_UP, interactionEndCallback);
23939    element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_2__["default"].MOUSE_CLICK, interactionEndCallback);
23940    element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_2__["default"].TOUCH_DRAG, _dragCallback);
23941    element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_2__["default"].TOUCH_DRAG_END, interactionEndCallback);
23942    element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_2__["default"].TAP, interactionEndCallback);
23943    _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.updateImage(element);
23944
23945    if (typeof doneMovingCallback === 'function') {
23946      doneMovingCallback();
23947    }
23948  };
23949
23950  element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_2__["default"].MOUSE_UP, interactionEndCallback);
23951  element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_2__["default"].MOUSE_CLICK, interactionEndCallback);
23952  element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_2__["default"].TOUCH_DRAG_END, interactionEndCallback);
23953  element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_2__["default"].TAP, interactionEndCallback);
23954});
23955
23956/***/ }),
23957
23958/***/ "./tools/annotation/bidirectionalTool/moveHandle/perpendicularBothFixedLeft.js":
23959/*!*************************************************************************************!*\
23960  !*** ./tools/annotation/bidirectionalTool/moveHandle/perpendicularBothFixedLeft.js ***!
23961  \*************************************************************************************/
23962/*! exports provided: default */
23963/***/ (function(module, __webpack_exports__, __webpack_require__) {
23964
23965"use strict";
23966__webpack_require__.r(__webpack_exports__);
23967/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../../../../externalModules.js */ "./externalModules.js");
23968 // Move long-axis start point
23969
23970/* harmony default export */ __webpack_exports__["default"] = (function (proposedPoint, data) {
23971  var distance = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstoneMath.point.distance;
23972  var _data$handles = data.handles,
23973      start = _data$handles.start,
23974      end = _data$handles.end,
23975      perpendicularStart = _data$handles.perpendicularStart,
23976      perpendicularEnd = _data$handles.perpendicularEnd;
23977  var longLine = {
23978    start: {
23979      x: start.x,
23980      y: start.y
23981    },
23982    end: {
23983      x: end.x,
23984      y: end.y
23985    }
23986  };
23987  var perpendicularLine = {
23988    start: {
23989      x: perpendicularStart.x,
23990      y: perpendicularStart.y
23991    },
23992    end: {
23993      x: perpendicularEnd.x,
23994      y: perpendicularEnd.y
23995    }
23996  };
23997  var intersection = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstoneMath.lineSegment.intersectLine(longLine, perpendicularLine);
23998  var distanceFromPerpendicularP1 = distance(perpendicularStart, intersection);
23999  var distanceFromPerpendicularP2 = distance(perpendicularEnd, intersection);
24000  var distanceToLineP2 = distance(end, intersection);
24001  var newLineLength = distance(end, proposedPoint);
24002
24003  if (newLineLength <= distanceToLineP2) {
24004    return false;
24005  }
24006
24007  var dx = (end.x - proposedPoint.x) / newLineLength;
24008  var dy = (end.y - proposedPoint.y) / newLineLength;
24009  var k = distanceToLineP2 / newLineLength;
24010  var newIntersection = {
24011    x: end.x + (proposedPoint.x - end.x) * k,
24012    y: end.y + (proposedPoint.y - end.y) * k
24013  };
24014  perpendicularStart.x = newIntersection.x - distanceFromPerpendicularP1 * dy;
24015  perpendicularStart.y = newIntersection.y + distanceFromPerpendicularP1 * dx;
24016  perpendicularEnd.x = newIntersection.x + distanceFromPerpendicularP2 * dy;
24017  perpendicularEnd.y = newIntersection.y - distanceFromPerpendicularP2 * dx;
24018  return true;
24019});
24020
24021/***/ }),
24022
24023/***/ "./tools/annotation/bidirectionalTool/moveHandle/perpendicularBothFixedRight.js":
24024/*!**************************************************************************************!*\
24025  !*** ./tools/annotation/bidirectionalTool/moveHandle/perpendicularBothFixedRight.js ***!
24026  \**************************************************************************************/
24027/*! exports provided: default */
24028/***/ (function(module, __webpack_exports__, __webpack_require__) {
24029
24030"use strict";
24031__webpack_require__.r(__webpack_exports__);
24032/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../../../../externalModules.js */ "./externalModules.js");
24033 // Move long-axis end point
24034
24035/* harmony default export */ __webpack_exports__["default"] = (function (proposedPoint, data) {
24036  var distance = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstoneMath.point.distance;
24037  var _data$handles = data.handles,
24038      start = _data$handles.start,
24039      end = _data$handles.end,
24040      perpendicularStart = _data$handles.perpendicularStart,
24041      perpendicularEnd = _data$handles.perpendicularEnd;
24042  var longLine = {
24043    start: {
24044      x: start.x,
24045      y: start.y
24046    },
24047    end: {
24048      x: end.x,
24049      y: end.y
24050    }
24051  };
24052  var perpendicularLine = {
24053    start: {
24054      x: perpendicularStart.x,
24055      y: perpendicularStart.y
24056    },
24057    end: {
24058      x: perpendicularEnd.x,
24059      y: perpendicularEnd.y
24060    }
24061  };
24062  var intersection = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstoneMath.lineSegment.intersectLine(longLine, perpendicularLine);
24063  var distanceFromPerpendicularP1 = distance(perpendicularStart, intersection);
24064  var distanceFromPerpendicularP2 = distance(perpendicularEnd, intersection);
24065  var distanceToLineP2 = distance(start, intersection);
24066  var newLineLength = distance(start, proposedPoint);
24067
24068  if (newLineLength <= distanceToLineP2) {
24069    return false;
24070  }
24071
24072  var dx = (start.x - proposedPoint.x) / newLineLength;
24073  var dy = (start.y - proposedPoint.y) / newLineLength;
24074  var k = distanceToLineP2 / newLineLength;
24075  var newIntersection = {
24076    x: start.x + (proposedPoint.x - start.x) * k,
24077    y: start.y + (proposedPoint.y - start.y) * k
24078  };
24079  perpendicularStart.x = newIntersection.x + distanceFromPerpendicularP1 * dy;
24080  perpendicularStart.y = newIntersection.y - distanceFromPerpendicularP1 * dx;
24081  perpendicularEnd.x = newIntersection.x - distanceFromPerpendicularP2 * dy;
24082  perpendicularEnd.y = newIntersection.y + distanceFromPerpendicularP2 * dx;
24083  return true;
24084});
24085
24086/***/ }),
24087
24088/***/ "./tools/annotation/bidirectionalTool/moveHandle/perpendicularLeftFixedPoint.js":
24089/*!**************************************************************************************!*\
24090  !*** ./tools/annotation/bidirectionalTool/moveHandle/perpendicularLeftFixedPoint.js ***!
24091  \**************************************************************************************/
24092/*! exports provided: default */
24093/***/ (function(module, __webpack_exports__, __webpack_require__) {
24094
24095"use strict";
24096__webpack_require__.r(__webpack_exports__);
24097/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../../../../externalModules.js */ "./externalModules.js");
24098 // Move perpendicular line start point
24099
24100/* harmony default export */ __webpack_exports__["default"] = (function (movedPoint, data) {
24101  var distance = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstoneMath.point.distance;
24102  var _data$handles = data.handles,
24103      start = _data$handles.start,
24104      end = _data$handles.end,
24105      perpendicularStart = _data$handles.perpendicularStart,
24106      perpendicularEnd = _data$handles.perpendicularEnd;
24107  var fudgeFactor = 1;
24108  var fixedPoint = perpendicularEnd;
24109  var distanceFromFixed = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstoneMath.lineSegment.distanceToPoint(data.handles, fixedPoint);
24110  var distanceFromMoved = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstoneMath.lineSegment.distanceToPoint(data.handles, movedPoint);
24111  var distanceBetweenPoints = distance(fixedPoint, movedPoint);
24112  var total = distanceFromFixed + distanceFromMoved;
24113
24114  if (distanceBetweenPoints <= distanceFromFixed) {
24115    return false;
24116  }
24117
24118  var length = distance(start, end);
24119
24120  if (length === 0) {
24121    return false;
24122  }
24123
24124  var dx = (start.x - end.x) / length;
24125  var dy = (start.y - end.y) / length;
24126  var adjustedLineP1 = {
24127    x: start.x - fudgeFactor * dx,
24128    y: start.y - fudgeFactor * dy
24129  };
24130  var adjustedLineP2 = {
24131    x: end.x + fudgeFactor * dx,
24132    y: end.y + fudgeFactor * dy
24133  };
24134  perpendicularStart.x = movedPoint.x;
24135  perpendicularStart.y = movedPoint.y;
24136  perpendicularEnd.x = movedPoint.x - total * dy;
24137  perpendicularEnd.y = movedPoint.y + total * dx;
24138  var longLine = {
24139    start: {
24140      x: start.x,
24141      y: start.y
24142    },
24143    end: {
24144      x: end.x,
24145      y: end.y
24146    }
24147  };
24148  var perpendicularLine = {
24149    start: {
24150      x: perpendicularStart.x,
24151      y: perpendicularStart.y
24152    },
24153    end: {
24154      x: perpendicularEnd.x,
24155      y: perpendicularEnd.y
24156    }
24157  };
24158  var intersection = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstoneMath.lineSegment.intersectLine(longLine, perpendicularLine);
24159
24160  if (!intersection) {
24161    if (distance(movedPoint, start) > distance(movedPoint, end)) {
24162      perpendicularStart.x = adjustedLineP2.x + distanceFromMoved * dy;
24163      perpendicularStart.y = adjustedLineP2.y - distanceFromMoved * dx;
24164      perpendicularEnd.x = perpendicularStart.x - total * dy;
24165      perpendicularEnd.y = perpendicularStart.y + total * dx;
24166    } else {
24167      perpendicularStart.x = adjustedLineP1.x + distanceFromMoved * dy;
24168      perpendicularStart.y = adjustedLineP1.y - distanceFromMoved * dx;
24169      perpendicularEnd.x = perpendicularStart.x - total * dy;
24170      perpendicularEnd.y = perpendicularStart.y + total * dx;
24171    }
24172  }
24173
24174  return true;
24175});
24176
24177/***/ }),
24178
24179/***/ "./tools/annotation/bidirectionalTool/moveHandle/perpendicularRightFixedPoint.js":
24180/*!***************************************************************************************!*\
24181  !*** ./tools/annotation/bidirectionalTool/moveHandle/perpendicularRightFixedPoint.js ***!
24182  \***************************************************************************************/
24183/*! exports provided: default */
24184/***/ (function(module, __webpack_exports__, __webpack_require__) {
24185
24186"use strict";
24187__webpack_require__.r(__webpack_exports__);
24188/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../../../../externalModules.js */ "./externalModules.js");
24189 // Move perpendicular line end point
24190
24191/* harmony default export */ __webpack_exports__["default"] = (function (movedPoint, data) {
24192  var distance = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstoneMath.point.distance;
24193  var _data$handles = data.handles,
24194      start = _data$handles.start,
24195      end = _data$handles.end,
24196      perpendicularStart = _data$handles.perpendicularStart,
24197      perpendicularEnd = _data$handles.perpendicularEnd;
24198  var fudgeFactor = 1;
24199  var fixedPoint = perpendicularStart;
24200  var distanceFromFixed = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstoneMath.lineSegment.distanceToPoint(data.handles, fixedPoint);
24201  var distanceFromMoved = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstoneMath.lineSegment.distanceToPoint(data.handles, movedPoint);
24202  var distanceBetweenPoints = distance(fixedPoint, movedPoint);
24203  var total = distanceFromFixed + distanceFromMoved;
24204
24205  if (distanceBetweenPoints <= distanceFromFixed) {
24206    return false;
24207  }
24208
24209  var length = distance(start, end);
24210  var dx = (start.x - end.x) / length;
24211  var dy = (start.y - end.y) / length;
24212  var adjustedLineP1 = {
24213    x: start.x - fudgeFactor * dx,
24214    y: start.y - fudgeFactor * dy
24215  };
24216  var adjustedLineP2 = {
24217    x: end.x + fudgeFactor * dx,
24218    y: end.y + fudgeFactor * dy
24219  };
24220  perpendicularStart.x = movedPoint.x + total * dy;
24221  perpendicularStart.y = movedPoint.y - total * dx;
24222  perpendicularEnd.x = movedPoint.x;
24223  perpendicularEnd.y = movedPoint.y;
24224  perpendicularEnd.locked = false;
24225  perpendicularStart.locked = false;
24226  var longLine = {
24227    start: {
24228      x: start.x,
24229      y: start.y
24230    },
24231    end: {
24232      x: end.x,
24233      y: end.y
24234    }
24235  };
24236  var perpendicularLine = {
24237    start: {
24238      x: perpendicularStart.x,
24239      y: perpendicularStart.y
24240    },
24241    end: {
24242      x: perpendicularEnd.x,
24243      y: perpendicularEnd.y
24244    }
24245  };
24246  var intersection = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstoneMath.lineSegment.intersectLine(longLine, perpendicularLine);
24247
24248  if (!intersection) {
24249    if (distance(movedPoint, start) > distance(movedPoint, end)) {
24250      perpendicularEnd.x = adjustedLineP2.x - distanceFromMoved * dy;
24251      perpendicularEnd.y = adjustedLineP2.y + distanceFromMoved * dx;
24252      perpendicularStart.x = perpendicularEnd.x + total * dy;
24253      perpendicularStart.y = perpendicularEnd.y - total * dx;
24254    } else {
24255      perpendicularEnd.x = adjustedLineP1.x - distanceFromMoved * dy;
24256      perpendicularEnd.y = adjustedLineP1.y + distanceFromMoved * dx;
24257      perpendicularStart.x = perpendicularEnd.x + total * dy;
24258      perpendicularStart.y = perpendicularEnd.y - total * dx;
24259    }
24260  }
24261
24262  return true;
24263});
24264
24265/***/ }),
24266
24267/***/ "./tools/annotation/bidirectionalTool/moveHandle/setHandlesPosition.js":
24268/*!*****************************************************************************!*\
24269  !*** ./tools/annotation/bidirectionalTool/moveHandle/setHandlesPosition.js ***!
24270  \*****************************************************************************/
24271/*! exports provided: default */
24272/***/ (function(module, __webpack_exports__, __webpack_require__) {
24273
24274"use strict";
24275__webpack_require__.r(__webpack_exports__);
24276/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../../../../externalModules.js */ "./externalModules.js");
24277/* harmony import */ var _perpendicularBothFixedLeft_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./perpendicularBothFixedLeft.js */ "./tools/annotation/bidirectionalTool/moveHandle/perpendicularBothFixedLeft.js");
24278/* harmony import */ var _perpendicularBothFixedRight_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./perpendicularBothFixedRight.js */ "./tools/annotation/bidirectionalTool/moveHandle/perpendicularBothFixedRight.js");
24279/* harmony import */ var _perpendicularLeftFixedPoint_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./perpendicularLeftFixedPoint.js */ "./tools/annotation/bidirectionalTool/moveHandle/perpendicularLeftFixedPoint.js");
24280/* harmony import */ var _perpendicularRightFixedPoint_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./perpendicularRightFixedPoint.js */ "./tools/annotation/bidirectionalTool/moveHandle/perpendicularRightFixedPoint.js");
24281
24282
24283
24284
24285 // Sets position of handles(start, end, perpendicularStart, perpendicularEnd)
24286
24287/* harmony default export */ __webpack_exports__["default"] = (function (handle, eventData, data, distanceFromTool) {
24288  var movedPoint;
24289  var outOfBounds;
24290  var result;
24291  var intersection;
24292  var d1;
24293  var d2;
24294  var longLine = {};
24295  var perpendicularLine = {};
24296  var proposedPoint = {
24297    x: eventData.currentPoints.image.x + distanceFromTool.x,
24298    y: eventData.currentPoints.image.y + distanceFromTool.y
24299  };
24300
24301  if (handle.index === 0) {
24302    // If long-axis start point is moved
24303    result = Object(_perpendicularBothFixedLeft_js__WEBPACK_IMPORTED_MODULE_1__["default"])(proposedPoint, data);
24304
24305    if (result) {
24306      handle.x = proposedPoint.x;
24307      handle.y = proposedPoint.y;
24308    } else {
24309      eventData.currentPoints.image.x = handle.x;
24310      eventData.currentPoints.image.y = handle.y;
24311    }
24312  } else if (handle.index === 1) {
24313    // If long-axis end point is moved
24314    result = Object(_perpendicularBothFixedRight_js__WEBPACK_IMPORTED_MODULE_2__["default"])(proposedPoint, data);
24315
24316    if (result) {
24317      handle.x = proposedPoint.x;
24318      handle.y = proposedPoint.y;
24319    } else {
24320      eventData.currentPoints.image.x = handle.x;
24321      eventData.currentPoints.image.y = handle.y;
24322    }
24323  } else if (handle.index === 2) {
24324    outOfBounds = false; // If perpendicular start point is moved
24325
24326    longLine.start = {
24327      x: data.handles.start.x,
24328      y: data.handles.start.y
24329    };
24330    longLine.end = {
24331      x: data.handles.end.x,
24332      y: data.handles.end.y
24333    };
24334    perpendicularLine.start = {
24335      x: data.handles.perpendicularEnd.x,
24336      y: data.handles.perpendicularEnd.y
24337    };
24338    perpendicularLine.end = {
24339      x: proposedPoint.x,
24340      y: proposedPoint.y
24341    };
24342    intersection = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstoneMath.lineSegment.intersectLine(longLine, perpendicularLine);
24343
24344    if (!intersection) {
24345      perpendicularLine.end = {
24346        x: data.handles.perpendicularStart.x,
24347        y: data.handles.perpendicularStart.y
24348      };
24349      intersection = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstoneMath.lineSegment.intersectLine(longLine, perpendicularLine);
24350      d1 = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstoneMath.point.distance(intersection, data.handles.start);
24351      d2 = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstoneMath.point.distance(intersection, data.handles.end);
24352
24353      if (!intersection || d1 < 3 || d2 < 3) {
24354        outOfBounds = true;
24355      }
24356    }
24357
24358    movedPoint = false;
24359
24360    if (!outOfBounds) {
24361      movedPoint = Object(_perpendicularLeftFixedPoint_js__WEBPACK_IMPORTED_MODULE_3__["default"])(proposedPoint, data);
24362
24363      if (!movedPoint) {
24364        eventData.currentPoints.image.x = data.handles.perpendicularStart.x;
24365        eventData.currentPoints.image.y = data.handles.perpendicularStart.y;
24366      }
24367    }
24368  } else if (handle.index === 3) {
24369    outOfBounds = false; // If perpendicular end point is moved
24370
24371    longLine.start = {
24372      x: data.handles.start.x,
24373      y: data.handles.start.y
24374    };
24375    longLine.end = {
24376      x: data.handles.end.x,
24377      y: data.handles.end.y
24378    };
24379    perpendicularLine.start = {
24380      x: data.handles.perpendicularStart.x,
24381      y: data.handles.perpendicularStart.y
24382    };
24383    perpendicularLine.end = {
24384      x: proposedPoint.x,
24385      y: proposedPoint.y
24386    };
24387    intersection = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstoneMath.lineSegment.intersectLine(longLine, perpendicularLine);
24388
24389    if (!intersection) {
24390      perpendicularLine.end = {
24391        x: data.handles.perpendicularEnd.x,
24392        y: data.handles.perpendicularEnd.y
24393      };
24394      intersection = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstoneMath.lineSegment.intersectLine(longLine, perpendicularLine);
24395      d1 = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstoneMath.point.distance(intersection, data.handles.start);
24396      d2 = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstoneMath.point.distance(intersection, data.handles.end);
24397
24398      if (!intersection || d1 < 3 || d2 < 3) {
24399        outOfBounds = true;
24400      }
24401    }
24402
24403    movedPoint = false;
24404
24405    if (!outOfBounds) {
24406      movedPoint = Object(_perpendicularRightFixedPoint_js__WEBPACK_IMPORTED_MODULE_4__["default"])(proposedPoint, data);
24407
24408      if (!movedPoint) {
24409        eventData.currentPoints.image.x = data.handles.perpendicularEnd.x;
24410        eventData.currentPoints.image.y = data.handles.perpendicularEnd.y;
24411      }
24412    }
24413  }
24414});
24415
24416/***/ }),
24417
24418/***/ "./tools/annotation/bidirectionalTool/moveHandle/touchMoveHandle.js":
24419/*!**************************************************************************!*\
24420  !*** ./tools/annotation/bidirectionalTool/moveHandle/touchMoveHandle.js ***!
24421  \**************************************************************************/
24422/*! exports provided: default */
24423/***/ (function(module, __webpack_exports__, __webpack_require__) {
24424
24425"use strict";
24426__webpack_require__.r(__webpack_exports__);
24427/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../../../../externalModules.js */ "./externalModules.js");
24428/* harmony import */ var _store_index_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../../store/index.js */ "./store/index.js");
24429/* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./../../../../events.js */ "./events.js");
24430/* harmony import */ var _setHandlesPosition_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./setHandlesPosition.js */ "./tools/annotation/bidirectionalTool/moveHandle/setHandlesPosition.js");
24431/* harmony import */ var _util_getActiveTool__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../../util/getActiveTool */ "./util/getActiveTool.js");
24432/* harmony import */ var _base_BaseAnnotationTool__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../../base/BaseAnnotationTool */ "./tools/base/BaseAnnotationTool.js");
24433
24434
24435
24436
24437
24438
24439var touchEndEvents = [_events_js__WEBPACK_IMPORTED_MODULE_2__["default"].TOUCH_END, _events_js__WEBPACK_IMPORTED_MODULE_2__["default"].TOUCH_DRAG_END, _events_js__WEBPACK_IMPORTED_MODULE_2__["default"].TOUCH_PINCH, _events_js__WEBPACK_IMPORTED_MODULE_2__["default"].TOUCH_PRESS, _events_js__WEBPACK_IMPORTED_MODULE_2__["default"].TAP];
24440/* harmony default export */ __webpack_exports__["default"] = (function (mouseEventData, toolType, data, handle, doneMovingCallback, preventHandleOutsideImage) {
24441  var element = mouseEventData.element,
24442      image = mouseEventData.image,
24443      buttons = mouseEventData.buttons;
24444  var distanceFromTool = {
24445    x: handle.x - mouseEventData.currentPoints.image.x,
24446    y: handle.y - mouseEventData.currentPoints.image.y
24447  };
24448
24449  var touchDragCallback = function touchDragCallback(event) {
24450    var eventData = event.detail;
24451    handle.hasMoved = true;
24452
24453    if (handle.index === undefined || handle.index === null) {
24454      handle.x = eventData.currentPoints.image.x + distanceFromTool.x;
24455      handle.y = eventData.currentPoints.image.y + distanceFromTool.y;
24456    } else {
24457      Object(_setHandlesPosition_js__WEBPACK_IMPORTED_MODULE_3__["default"])(handle, eventData, data, distanceFromTool);
24458    }
24459
24460    if (preventHandleOutsideImage) {
24461      handle.x = Math.max(handle.x, 0);
24462      handle.x = Math.min(handle.x, eventData.image.width);
24463      handle.y = Math.max(handle.y, 0);
24464      handle.y = Math.min(handle.y, eventData.image.height);
24465    }
24466
24467    data.invalidated = true;
24468    _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.updateImage(element);
24469    var activeTool = Object(_util_getActiveTool__WEBPACK_IMPORTED_MODULE_4__["default"])(element, buttons, 'touch');
24470
24471    if (activeTool instanceof _base_BaseAnnotationTool__WEBPACK_IMPORTED_MODULE_5__["default"]) {
24472      activeTool.updateCachedStats(image, element, data);
24473    }
24474
24475    var modifiedEventData = {
24476      toolType: toolType,
24477      element: element,
24478      measurementData: data
24479    };
24480    _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.triggerEvent(element, _events_js__WEBPACK_IMPORTED_MODULE_2__["default"].MEASUREMENT_MODIFIED, modifiedEventData);
24481  };
24482
24483  handle.active = true;
24484  _store_index_js__WEBPACK_IMPORTED_MODULE_1__["state"].isToolLocked = true;
24485  element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_2__["default"].TOUCH_DRAG, touchDragCallback);
24486
24487  var touchEndCallback = function touchEndCallback() {
24488    handle.active = false;
24489    _store_index_js__WEBPACK_IMPORTED_MODULE_1__["state"].isToolLocked = false;
24490    element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_2__["default"].TOUCH_DRAG, touchDragCallback);
24491    touchEndEvents.forEach(function (eventType) {
24492      element.removeEventListener(eventType, touchEndCallback);
24493    });
24494    _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.updateImage(element);
24495
24496    if (typeof doneMovingCallback === 'function') {
24497      doneMovingCallback();
24498    }
24499  };
24500
24501  touchEndEvents.forEach(function (eventType) {
24502    element.addEventListener(eventType, touchEndCallback);
24503  });
24504});
24505
24506/***/ }),
24507
24508/***/ "./tools/annotation/bidirectionalTool/pointNearTool.js":
24509/*!*************************************************************!*\
24510  !*** ./tools/annotation/bidirectionalTool/pointNearTool.js ***!
24511  \*************************************************************/
24512/*! exports provided: default */
24513/***/ (function(module, __webpack_exports__, __webpack_require__) {
24514
24515"use strict";
24516__webpack_require__.r(__webpack_exports__);
24517/* harmony import */ var _store_index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../store/index.js */ "./store/index.js");
24518/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./../../../externalModules.js */ "./externalModules.js");
24519/* harmony import */ var _util_pointInsideBoundingBox_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./../../../util/pointInsideBoundingBox.js */ "./util/pointInsideBoundingBox.js");
24520
24521
24522
24523
24524var pointNearPerpendicular = function pointNearPerpendicular(element, handles, coords, distanceThreshold) {
24525  var cornerstone = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone;
24526  var cornerstoneMath = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstoneMath;
24527  var lineSegment = {
24528    start: cornerstone.pixelToCanvas(element, handles.perpendicularStart),
24529    end: cornerstone.pixelToCanvas(element, handles.perpendicularEnd)
24530  };
24531  var distanceToPoint = cornerstoneMath.lineSegment.distanceToPoint(lineSegment, coords);
24532  return distanceToPoint < distanceThreshold;
24533};
24534
24535/* harmony default export */ __webpack_exports__["default"] = (function (element, data, coords) {
24536  var interactionType = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'mouse';
24537  var cornerstone = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone;
24538  var cornerstoneMath = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstoneMath;
24539  var handles = data.handles;
24540  var lineSegment = {
24541    start: cornerstone.pixelToCanvas(element, handles.start),
24542    end: cornerstone.pixelToCanvas(element, handles.end)
24543  };
24544  var distanceToPoint = cornerstoneMath.lineSegment.distanceToPoint(lineSegment, coords);
24545
24546  if (Object(_util_pointInsideBoundingBox_js__WEBPACK_IMPORTED_MODULE_2__["default"])(handles.textBox, coords)) {
24547    return true;
24548  }
24549
24550  var distanceThreshold = interactionType === 'mouse' ? _store_index_js__WEBPACK_IMPORTED_MODULE_0__["state"].clickProximity : _store_index_js__WEBPACK_IMPORTED_MODULE_0__["state"].touchProximity;
24551
24552  if (pointNearPerpendicular(element, handles, coords, distanceThreshold)) {
24553    return true;
24554  }
24555
24556  return distanceToPoint < distanceThreshold;
24557});
24558
24559/***/ }),
24560
24561/***/ "./tools/annotation/bidirectionalTool/renderToolData.js":
24562/*!**************************************************************!*\
24563  !*** ./tools/annotation/bidirectionalTool/renderToolData.js ***!
24564  \**************************************************************/
24565/*! exports provided: default */
24566/***/ (function(module, __webpack_exports__, __webpack_require__) {
24567
24568"use strict";
24569__webpack_require__.r(__webpack_exports__);
24570/* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/toConsumableArray */ "../node_modules/@babel/runtime/helpers/toConsumableArray.js");
24571/* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__);
24572/* harmony import */ var _drawing_drawHandles_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./../../../drawing/drawHandles.js */ "./drawing/drawHandles.js");
24573/* harmony import */ var _utils_updatePerpendicularLineHandles_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utils/updatePerpendicularLineHandles.js */ "./tools/annotation/bidirectionalTool/utils/updatePerpendicularLineHandles.js");
24574/* harmony import */ var _stateManagement_toolStyle_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./../../../stateManagement/toolStyle.js */ "./stateManagement/toolStyle.js");
24575/* harmony import */ var _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./../../../stateManagement/toolColors.js */ "./stateManagement/toolColors.js");
24576/* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./../../../stateManagement/toolState.js */ "./stateManagement/toolState.js");
24577/* harmony import */ var _drawing_index_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./../../../drawing/index.js */ "./drawing/index.js");
24578/* harmony import */ var _drawing_drawLinkedTextBox_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./../../../drawing/drawLinkedTextBox.js */ "./drawing/drawLinkedTextBox.js");
24579/* harmony import */ var _util_getPixelSpacing__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../../util/getPixelSpacing */ "./util/getPixelSpacing.js");
24580
24581
24582/* eslint no-loop-func: 0 */
24583// --> OFF
24584
24585
24586
24587
24588
24589
24590
24591
24592/* harmony default export */ __webpack_exports__["default"] = (function (evt) {
24593  var _this = this;
24594
24595  var eventData = evt.detail;
24596  var element = eventData.element,
24597      canvasContext = eventData.canvasContext,
24598      image = eventData.image;
24599  var _this$configuration = this.configuration,
24600      handleRadius = _this$configuration.handleRadius,
24601      drawHandlesOnHover = _this$configuration.drawHandlesOnHover; // If we have no toolData for this element, return immediately as there is nothing to do
24602
24603  var toolData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_5__["getToolState"])(element, this.name);
24604
24605  if (!toolData) {
24606    return;
24607  }
24608
24609  var _getPixelSpacing = Object(_util_getPixelSpacing__WEBPACK_IMPORTED_MODULE_8__["default"])(image),
24610      rowPixelSpacing = _getPixelSpacing.rowPixelSpacing,
24611      colPixelSpacing = _getPixelSpacing.colPixelSpacing; // LT-29 Disable Target Measurements when pixel spacing is not available
24612
24613
24614  if (!rowPixelSpacing || !colPixelSpacing) {
24615    return;
24616  } // We have tool data for this element - iterate over each one and draw it
24617
24618
24619  var context = Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_6__["getNewContext"])(canvasContext.canvas);
24620  var color;
24621  var activeColor = _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_4__["default"].getActiveColor();
24622  var lineWidth = _stateManagement_toolStyle_js__WEBPACK_IMPORTED_MODULE_3__["default"].getToolW
24622idth();
24623
24624  var _loop = function _loop(i) {
24625    var data = toolData.data[i];
24626
24627    if (data.visible === false) {
24628      return "continue";
24629    }
24630
24631    color = data.active ? activeColor : _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_4__["default"].getToolColor(); // Calculate the data measurements
24632
24633    if (data.invalidated === true) {
24634      if (data.longestDiameter && data.shortestDiameter) {
24635        _this.throttledUpdateCachedStats(image, element, data);
24636      } else {
24637        _this.updateCachedStats(image, element, data);
24638      }
24639    }
24640
24641    Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_6__["draw"])(context, function (context) {
24642      // Configurable shadow
24643      Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_6__["setShadow"])(context, _this.configuration);
24644      var _data$handles = data.handles,
24645          start = _data$handles.start,
24646          end = _data$handles.end,
24647          perpendicularStart = _data$handles.perpendicularStart,
24648          perpendicularEnd = _data$handles.perpendicularEnd,
24649          textBox = _data$handles.textBox; // Draw the measurement line
24650
24651      Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_6__["drawLine"])(context, element, start, end, {
24652        color: color
24653      }); // Draw perpendicular line
24654
24655      var strokeWidth = lineWidth;
24656      Object(_utils_updatePerpendicularLineHandles_js__WEBPACK_IMPORTED_MODULE_2__["default"])(eventData, data);
24657      Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_6__["drawLine"])(context, element, perpendicularStart, perpendicularEnd, {
24658        color: color,
24659        strokeWidth: strokeWidth
24660      }); // Draw the handles
24661
24662      var handleOptions = {
24663        color: color,
24664        handleRadius: handleRadius,
24665        drawHandlesIfActive: drawHandlesOnHover
24666      }; // Draw the handles
24667
24668      Object(_drawing_drawHandles_js__WEBPACK_IMPORTED_MODULE_1__["default"])(context, eventData, data.handles, handleOptions); // Draw the textbox
24669      // Move the textbox slightly to the right and upwards
24670      // So that it sits beside the length tool handle
24671
24672      var xOffset = 10;
24673
24674      var textBoxAnchorPoints = function textBoxAnchorPoints(handles) {
24675        return [handles.start, handles.end, handles.perpendicularStart, handles.perpendicularEnd];
24676      };
24677
24678      var textLines = getTextBoxText(data, rowPixelSpacing, colPixelSpacing);
24679      Object(_drawing_drawLinkedTextBox_js__WEBPACK_IMPORTED_MODULE_7__["default"])(context, element, textBox, textLines, data.handles, textBoxAnchorPoints, color, lineWidth, xOffset, true);
24680    });
24681  };
24682
24683  for (var i = 0; i < toolData.data.length; i++) {
24684    var _ret = _loop(i);
24685
24686    if (_ret === "continue") continue;
24687  }
24688});
24689
24690var getTextBoxText = function getTextBoxText(data, rowPixelSpacing, colPixelSpacing) {
24691  var suffix = ' mm';
24692
24693  if (!rowPixelSpacing || !colPixelSpacing) {
24694    suffix = ' pixels';
24695  }
24696
24697  var lengthText = " L ".concat(data.longestDiameter).concat(suffix);
24698  var widthText = " W ".concat(data.shortestDiameter).concat(suffix);
24699  var labels = data.labels;
24700
24701  if (labels && Array.isArray(labels)) {
24702    return [].concat(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default()(labels), [lengthText, widthText]);
24703  }
24704
24705  return [lengthText, widthText];
24706};
24707
24708/***/ }),
24709
24710/***/ "./tools/annotation/bidirectionalTool/utils/calculateLongestAndShortestDiameters.js":
24711/*!******************************************************************************************!*\
24712  !*** ./tools/annotation/bidirectionalTool/utils/calculateLongestAndShortestDiameters.js ***!
24713  \******************************************************************************************/
24714/*! exports provided: default */
24715/***/ (function(module, __webpack_exports__, __webpack_require__) {
24716
24717"use strict";
24718__webpack_require__.r(__webpack_exports__);
24719/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return calculateLongestAndShortestDiameters; });
24720/**
24721 * Calculates longest and shortest diameters using measurement handles and pixelSpacing
24722 * @param  {Object} measurementData
24723 * @param pixelSpacing
24724 */
24725function calculateLongestAndShortestDiameters(measurementData, pixelSpacing) {
24726  var rowPixelSpacing = pixelSpacing.rowPixelSpacing,
24727      colPixelSpacing = pixelSpacing.colPixelSpacing;
24728  var _measurementData$hand = measurementData.handles,
24729      start = _measurementData$hand.start,
24730      end = _measurementData$hand.end,
24731      perpendicularStart = _measurementData$hand.perpendicularStart,
24732      perpendicularEnd = _measurementData$hand.perpendicularEnd; // Calculate the long axis length
24733
24734  var dx = (start.x - end.x) * (colPixelSpacing || 1);
24735  var dy = (start.y - end.y) * (rowPixelSpacing || 1);
24736  var length = Math.sqrt(dx * dx + dy * dy); // Calculate the short axis length
24737
24738  var wx = (perpendicularStart.x - perpendicularEnd.x) * (colPixelSpacing || 1);
24739  var wy = (perpendicularStart.y - perpendicularEnd.y) * (rowPixelSpacing || 1);
24740  var width = Math.sqrt(wx * wx + wy * wy);
24741
24742  if (!width) {
24743    width = 0;
24744  } // Length is always longer than width
24745
24746
24747  if (width > length) {
24748    var tempW = width;
24749    var tempL = length;
24750    length = tempW;
24751    width = tempL;
24752  }
24753
24754  return {
24755    longestDiameter: length.toFixed(1),
24756    shortestDiameter: width.toFixed(1)
24757  };
24758}
24759
24760/***/ }),
24761
24762/***/ "./tools/annotation/bidirectionalTool/utils/updatePerpendicularLineHandles.js":
24763/*!************************************************************************************!*\
24764  !*** ./tools/annotation/bidirectionalTool/utils/updatePerpendicularLineHandles.js ***!
24765  \************************************************************************************/
24766/*! exports provided: default */
24767/***/ (function(module, __webpack_exports__, __webpack_require__) {
24768
24769"use strict";
24770__webpack_require__.r(__webpack_exports__);
24771// Update the  perpendicular line handles
24772/* harmony default export */ __webpack_exports__["default"] = (function (eventData, data) {
24773  if (!data.handles.perpendicularStart.locked) {
24774    return;
24775  }
24776
24777  var startX, startY, endX, endY;
24778  var _data$handles = data.handles,
24779      start = _data$handles.start,
24780      end = _data$handles.end;
24781
24782  if (start.x === end.x && start.y === end.y) {
24783    startX = start.x;
24784    startY = start.y;
24785    endX = end.x;
24786    endY = end.y;
24787  } else {
24788    // Mid point of long-axis line
24789    var mid = {
24790      x: (start.x + end.x) / 2,
24791      y: (start.y + end.y) / 2
24792    }; // Length of long-axis
24793
24794    var dx = (start.x - end.x) * (eventData.image.columnPixelSpacing || 1);
24795    var dy = (start.y - end.y) * (eventData.image.rowPixelSpacing || 1);
24796    var length = Math.sqrt(dx * dx + dy * dy);
24797    var vectorX = (start.x - end.x) / length;
24798    var vectorY = (start.y - end.y) / length;
24799    var perpendicularLineLength = length / 2;
24800    startX = mid.x + perpendicularLineLength / 2 * vectorY;
24801    startY = mid.y - perpendicularLineLength / 2 * vectorX;
24802    endX = mid.x - perpendicularLineLength / 2 * vectorY;
24803    endY = mid.y + perpendicularLineLength / 2 * vectorX;
24804  }
24805
24806  data.handles.perpendicularStart.x = startX;
24807  data.handles.perpendicularStart.y = startY;
24808  data.handles.perpendicularEnd.x = endX;
24809  data.handles.perpendicularEnd.y = endY;
24810});
24811
24812/***/ }),
24813
24814/***/ "./tools/annotation/index.js":
24815/*!***********************************!*\
24816  !*** ./tools/annotation/index.js ***!
24817  \***********************************/
24818/*! exports provided: AngleTool, ArrowAnnotateTool, BidirectionalTool, CircleRoiTool, CobbAngleTool, EllipticalRoiTool, FreehandMouseTool, LengthTool, ProbeTool, RectangleRoiTool, TextMarkerTool, default */
24819/***/ (function(module, __webpack_exports__, __webpack_require__) {
24820
24821"use strict";
24822__webpack_require__.r(__webpack_exports__);
24823/* harmony import */ var _AngleTool_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./AngleTool.js */ "./tools/annotation/AngleTool.js");
24824/* harmony import */ var _ArrowAnnotateTool_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./ArrowAnnotateTool.js */ "./tools/annotation/ArrowAnnotateTool.js");
24825/* harmony import */ var _BidirectionalTool_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./BidirectionalTool.js */ "./tools/annotation/BidirectionalTool.js");
24826/* harmony import */ var _CircleRoiTool_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./CircleRoiTool.js */ "./tools/annotation/CircleRoiTool.js");
24827/* harmony import */ var _CobbAngleTool_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./CobbAngleTool.js */ "./tools/annotation/CobbAngleTool.js");
24828/* harmony import */ var _EllipticalRoiTool_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./EllipticalRoiTool.js */ "./tools/annotation/EllipticalRoiTool.js");
24829/* harmony import */ var _FreehandMouseTool_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./FreehandMouseTool.js */ "./tools/annotation/FreehandMouseTool.js");
24830/* harmony import */ var _LengthTool_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./LengthTool.js */ "./tools/annotation/LengthTool.js");
24831/* harmony import */ var _ProbeTool_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./ProbeTool.js */ "./tools/annotation/ProbeTool.js");
24832/* harmony import */ var _RectangleRoiTool_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./RectangleRoiTool.js */ "./tools/annotation/RectangleRoiTool.js");
24833/* harmony import */ var _TextMarkerTool_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./TextMarkerTool.js */ "./tools/annotation/TextMarkerTool.js");
24834/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "AngleTool", function() { return _AngleTool_js__WEBPACK_IMPORTED_MODULE_0__["default"]; });
24835
24836/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ArrowAnnotateTool", function() { return _ArrowAnnotateTool_js__WEBPACK_IMPORTED_MODULE_1__["default"]; });
24837
24838/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "BidirectionalTool", function() { return _BidirectionalTool_js__WEBPACK_IMPORTED_MODULE_2__["default"]; });
24839
24840/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "CircleRoiTool", function() { return _CircleRoiTool_js__WEBPACK_IMPORTED_MODULE_3__["default"]; });
24841
24842/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "CobbAngleTool", function() { return _CobbAngleTool_js__WEBPACK_IMPORTED_MODULE_4__["default"]; });
24843
24844/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "EllipticalRoiTool", function() { return _EllipticalRoiTool_js__WEBPACK_IMPORTED_MODULE_5__["default"]; });
24845
24846/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FreehandMouseTool", function() { return _FreehandMouseTool_js__WEBPACK_IMPORTED_MODULE_6__["default"]; });
24847
24848/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "LengthTool", function() { return _LengthTool_js__WEBPACK_IMPORTED_MODULE_7__["default"]; });
24849
24850/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ProbeTool", function() { return _ProbeTool_js__WEBPACK_IMPORTED_MODULE_8__["default"]; });
24851
24852/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "RectangleRoiTool", function() { return _RectangleRoiTool_js__WEBPACK_IMPORTED_MODULE_9__["default"]; });
24853
24854/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "TextMarkerTool", function() { return _TextMarkerTool_js__WEBPACK_IMPORTED_MODULE_10__["default"]; });
24855
24856
24857
24858
24859
24860
24861
24862
24863
24864
24865
24866 // Named Exports
24867
24868
24869
24870
24871
24872
24873
24874
24875
24876
24877
24878 // Namespace, default export
24879
24880/* harmony default export */ __webpack_exports__["default"] = ({
24881  AngleTool: _AngleTool_js__WEBPACK_IMPORTED_MODULE_0__["default"],
24882  ArrowAnnotateTool: _ArrowAnnotateTool_js__WEBPACK_IMPORTED_MODULE_1__["default"],
24883  BidirectionalTool: _BidirectionalTool_js__WEBPACK_IMPORTED_MODULE_2__["default"],
24884  CircleRoiTool: _CircleRoiTool_js__WEBPACK_IMPORTED_MODULE_3__["default"],
24885  CobbAngleTool: _CobbAngleTool_js__WEBPACK_IMPORTED_MODULE_4__["default"],
24886  EllipticalRoiTool: _EllipticalRoiTool_js__WEBPACK_IMPORTED_MODULE_5__["default"],
24887  FreehandMouseTool: _FreehandMouseTool_js__WEBPACK_IMPORTED_MODULE_6__["default"],
24888  LengthTool: _LengthTool_js__WEBPACK_IMPORTED_MODULE_7__["default"],
24889  ProbeTool: _ProbeTool_js__WEBPACK_IMPORTED_MODULE_8__["default"],
24890  RectangleRoiTool: _RectangleRoiTool_js__WEBPACK_IMPORTED_MODULE_9__["default"],
24891  TextMarkerTool: _TextMarkerTool_js__WEBPACK_IMPORTED_MODULE_10__["default"]
24892});
24893
24894/***/ }),
24895
24896/***/ "./tools/base/BaseAnnotationTool.js":
24897/*!******************************************!*\
24898  !*** ./tools/base/BaseAnnotationTool.js ***!
24899  \******************************************/
24900/*! exports provided: default */
24901/***/ (function(module, __webpack_exports__, __webpack_require__) {
24902
24903"use strict";
24904__webpack_require__.r(__webpack_exports__);
24905/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js");
24906/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
24907/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js");
24908/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
24909/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js");
24910/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
24911/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js");
24912/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
24913/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js");
24914/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__);
24915/* harmony import */ var _BaseTool_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./BaseTool.js */ "./tools/base/BaseTool.js");
24916/* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./../../stateManagement/toolState.js */ "./stateManagement/toolState.js");
24917/* harmony import */ var _manipulators_handleActivator_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./../../manipulators/handleActivator.js */ "./manipulators/handleActivator.js");
24918/* harmony import */ var _util_findAndMoveHelpers_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./../../util/findAndMoveHelpers.js */ "./util/findAndMoveHelpers.js");
24919/* harmony import */ var _util_logger__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../util/logger */ "./util/logger.js");
24920
24921
24922
24923
24924
24925
24926
24927
24928
24929
24930var logger = Object(_util_logger__WEBPACK_IMPORTED_MODULE_9__["getLogger"])('baseAnnotationTool');
24931/**
24932 * @memberof Tools.Base
24933 * @classdesc Abstract class for tools which create and display annotations on the
24934 * cornerstone canvas.
24935 * @extends Tools.Base.BaseTool
24936 */
24937
24938var BaseAnnotationTool =
24939/*#__PURE__*/
24940function (_BaseTool) {
24941  _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(BaseAnnotationTool, _BaseTool);
24942
24943  function BaseAnnotationTool() {
24944    var _getPrototypeOf2;
24945
24946    _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, BaseAnnotationTool);
24947
24948    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
24949      args[_key] = arguments[_key];
24950    }
24951
24952    return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, (_getPrototypeOf2 = _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(BaseAnnotationTool)).call.apply(_getPrototypeOf2, [this].concat(args)));
24953  } // ===================================================================
24954  // Abstract Methods - Must be implemented.
24955  // ===================================================================
24956
24957  /**
24958   * Creates a new annotation.
24959   *
24960   * @method createNewMeasurement
24961   * @memberof Tools.Base.BaseAnnotationTool
24962   *
24963   * @param  {type} evt description
24964   * @returns {type}     description
24965   */
24966  // eslint-disable-next-line no-unused-vars
24967
24968
24969  _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(BaseAnnotationTool, [{
24970    key: "createNewMeasurement",
24971    value: function createNewMeasurement(evt) {
24972      throw new Error("Method createNewMeasurement not implemented for ".concat(this.name, "."));
24973    }
24974    /**
24975     *
24976     * Returns true if the given coords are need the tool.
24977     *
24978     * @method pointNearTool
24979     * @memberof Tools.Base.BaseAnnotationTool
24980     *
24981     * @param {*} element
24982     * @param {*} data
24983     * @param {*} coords
24984     * @param {string} [interactionType=mouse]
24985     * @returns {boolean} If the point is near the tool
24986     */
24987    // eslint-disable-next-line no-unused-vars
24988
24989  }, {
24990    key: "pointNearTool",
24991    value: function pointNearTool(element, data, coords) {
24992      var interactionType = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'mouse';
24993      throw new Error("Method pointNearTool not implemented for ".concat(this.name, "."));
24994    }
24995    /**
24996     * Returns the distance in px from the given coords to the closest handle of the annotation.
24997     *
24998     * @method distanceFromPoint
24999     * @memberof Tools.Base.BaseAnnotationTool
25000     *
25001     * @param {*} element
25002     * @param {*} data
25003     * @param {*} coords
25004     * @returns {number} -  the distance in px from the provided coordinates to the
25005     * closest rendered portion of the annotation. -1 if the distance cannot be
25006     * calculated.
25007     */
25008    // eslint-disable-next-line no-unused-vars
25009
25010  }, {
25011    key: "distanceFromPoint",
25012    value: function distanceFromPoint(element, data, coords) {
25013      throw new Error("Method distanceFromPoint not implemented for ".concat(this.name, "."));
25014    }
25015    /**
25016     * Used to redraw the tool's annotation data per render
25017     *
25018     * @abstract
25019     * @param {*} evt
25020     * @returns {void}
25021     */
25022    // eslint-disable-next-line no-unused-vars
25023
25024  }, {
25025    key: "renderToolData",
25026    value: function renderToolData(evt) {
25027      throw new Error("renderToolData not implemented for ".concat(this.name, "."));
25028    } // ===================================================================
25029    // Virtual Methods - Have default behavior but may be overriden.
25030    // ===================================================================
25031
25032    /**
25033     * Event handler for MOUSE_MOVE event.
25034     *
25035     * @abstract
25036     * @event
25037     * @param {Object} evt - The event.
25038     * @returns {boolean} - True if the image needs to be updated
25039     */
25040
25041  }, {
25042    key: "mouseMoveCallback",
25043    value: function mouseMoveCallback(evt) {
25044      var _evt$detail = evt.detail,
25045          element = _evt$detail.element,
25046          currentPoints = _evt$detail.currentPoints;
25047      var coords = currentPoints.canvas;
25048      var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_6__["getToolState"])(element, this.name);
25049      var imageNeedsUpdate = false;
25050
25051      for (var d = 0; d < toolState.data.length; d++) {
25052        var data = toolState.data[d]; // Hovering a handle?
25053
25054        if (Object(_manipulators_handleActivator_js__WEBPACK_IMPORTED_MODULE_7__["default"])(element, data.handles, coords) === true) {
25055          imageNeedsUpdate = true;
25056        } // Tool data's 'active' does not match coordinates
25057        // TODO: can't we just do an if/else and save on a pointNearTool check?
25058
25059
25060        var nearToolAndNotMarkedActive = this.pointNearTool(element, data, coords, 'mouse') && !data.active;
25061        var notNearToolAndMarkedActive = !this.pointNearTool(element, data, coords, 'mouse') && data.active;
25062
25063        if (nearToolAndNotMarkedActive || notNearToolAndMarkedActive) {
25064          data.active = !data.active;
25065          imageNeedsUpdate = true;
25066        }
25067      }
25068
25069      return imageNeedsUpdate;
25070    }
25071    /**
25072     * Custom callback for when a handle is selected.
25073     * @method handleSelectedCallback
25074     * @memberof Tools.Base.BaseAnnotationTool
25075     *
25076     * @param  {*} evt    -
25077     * @param  {*} toolData   -
25078     * @param  {*} handle - The selected handle.
25079     * @param  {String} interactionType -
25080     * @returns {void}
25081     */
25082
25083  }, {
25084    key: "handleSelectedCallback",
25085    value: function handleSelectedCallback(evt, toolData, handle) {
25086      var interactionType = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'mouse';
25087      Object(_util_findAndMoveHelpers_js__WEBPACK_IMPORTED_MODULE_8__["moveHandleNearImagePoint"])(evt, this, toolData, handle, interactionType);
25088    }
25089    /**
25090     * Custom callback for when a tool is selected.
25091     *
25092     * @method toolSelectedCallback
25093     * @memberof Tools.Base.BaseAnnotationTool
25094     *
25095     * @param  {*} evt
25096     * @param  {*} annotation
25097     * @param  {string} [interactionType=mouse]
25098     * @returns {void}
25099     */
25100
25101  }, {
25102    key: "toolSelectedCallback",
25103    value: function toolSelectedCallback(evt, annotation) {
25104      var interactionType = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'mouse';
25105      Object(_util_findAndMoveHelpers_js__WEBPACK_IMPORTED_MODULE_8__["moveAnnotation"])(evt, this, annotation, interactionType);
25106    }
25107    /**
25108     * Updates cached statistics for the tool's annotation data on the element
25109     *
25110     * @param {*} image
25111     * @param {*} element
25112     * @param {*} data
25113     * @returns {void}
25114     */
25115
25116  }, {
25117    key: "updateCachedStats",
25118    value: function updateCachedStats(image, element, data) {
25119      logger.warn("updateCachedStats not implemented for ".concat(this.name, "."));
25120    }
25121  }]);
25122
25123  return BaseAnnotationTool;
25124}(_BaseTool_js__WEBPACK_IMPORTED_MODULE_5__["default"]);
25125
25126/* harmony default export */ __webpack_exports__["default"] = (BaseAnnotationTool);
25127
25128/***/ }),
25129
25130/***/ "./tools/base/BaseBrushTool.js":
25131/*!*************************************!*\
25132  !*** ./tools/base/BaseBrushTool.js ***!
25133  \*************************************/
25134/*! exports provided: default */
25135/***/ (function(module, __webpack_exports__, __webpack_require__) {
25136
25137"use strict";
25138__webpack_require__.r(__webpack_exports__);
25139/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js");
25140/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
25141/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js");
25142/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
25143/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js");
25144/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
25145/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js");
25146/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
25147/* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/assertThisInitialized */ "../node_modules/@babel/runtime/helpers/assertThisInitialized.js");
25148/* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4__);
25149/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js");
25150/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__);
25151/* harmony import */ var _BaseTool_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./BaseTool.js */ "./tools/base/BaseTool.js");
25152/* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./../../events.js */ "./events.js");
25153/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./../../externalModules.js */ "./externalModules.js");
25154/* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../stateManagement/toolState.js */ "./stateManagement/toolState.js");
25155/* harmony import */ var _stateManagement_imageIdSpecificStateManager_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../stateManagement/imageIdSpecificStateManager.js */ "./stateManagement/imageIdSpecificStateManager.js");
25156/* harmony import */ var _store_isToolActive_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./../../store/isToolActive.js */ "./store/isToolActive.js");
25157/* harmony import */ var _store_index_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./../../store/index.js */ "./store/index.js");
25158/* harmony import */ var _util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./../../util/triggerEvent.js */ "./util/triggerEvent.js");
25159/* harmony import */ var _util_logger_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./../../util/logger.js */ "./util/logger.js");
25160
25161
25162
25163
25164
25165
25166
25167
25168
25169
25170
25171
25172
25173
25174
25175var logger = Object(_util_logger_js__WEBPACK_IMPORTED_MODULE_14__["getLogger"])('baseBrushTool');
25176var _store$modules$brush = _store_index_js__WEBPACK_IMPORTED_MODULE_12__["default"].modules.brush,
25177    state = _store$modules$brush.state,
25178    setters = _store$modules$brush.setters;
25179/**
25180 * @abstract
25181 * @memberof Tools.Base
25182 * @classdesc Abstract class for tools which manipulate the mask data to be displayed on
25183 * the cornerstone canvas.
25184 * @extends Tools.Base.BaseTool
25185 */
25186
25187var BaseBrushTool =
25188/*#__PURE__*/
25189function (_BaseTool) {
25190  _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default()(BaseBrushTool, _BaseTool);
25191
25192  function BaseBrushTool(props) {
25193    var _this;
25194
25195    var defaultProps = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
25196
25197    _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, BaseBrushTool);
25198
25199    if (!defaultProps.configuration) {
25200      defaultProps.configuration = {};
25201    }
25202
25203    defaultProps.configuration.referencedToolData = 'brush';
25204    _this = _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(BaseBrushTool).call(this, props, defaultProps));
25205    _this.updateOnMouseMove = true;
25206    _this.hideDefaultCursor = true;
25207    _this._drawing = false;
25208    _this._drawingMouseUpCallback = _this._drawingMouseUpCallback.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this));
25209    return _this;
25210  } // ===================================================================
25211  // Abstract Methods - Must be implemented.
25212  // ===================================================================
25213
25214  /**
25215   * Helper function for rendering the brush.
25216   *
25217   * @abstract
25218   * @param {Object} evt - The event.
25219   * @returns {void}
25220   */
25221  // eslint-disable-next-line no-unused-vars
25222
25223
25224  _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(BaseBrushTool, [{
25225    key: "renderBrush",
25226    value: function renderBrush(evt) {
25227      throw new Error("Method renderBrush not implemented for ".concat(this.name, "."));
25228    }
25229    /**
25230     * Paints the data to the canvas.
25231     *
25232     * @protected
25233     * @abstract
25234     * @param  {Object} evt The event.
25235     * @returns {void}
25236     */
25237    // eslint-disable-next-line no-unused-vars
25238
25239  }, {
25240    key: "_paint",
25241    value: function _paint(evt) {
25242      throw new Error("Method _paint not implemented for ".concat(this.name, "."));
25243    } // ===================================================================
25244    // Virtual Methods - Have default behavior but may be overriden.
25245    // ===================================================================
25246
25247    /**
25248     * Event handler for MOUSE_DRAG event.
25249     *
25250     * @override
25251     * @event
25252     * @param {Object} evt - The event.
25253     */
25254
25255  }, {
25256    key: "mouseDragCallback",
25257    value: function mouseDragCallback(evt) {
25258      this._startPainting(evt);
25259    }
25260    /**
25261     * Event handler for MOUSE_DOWN event.
25262     *
25263     * @override
25264     * @event
25265     * @param {Object} evt - The event.
25266     */
25267
25268  }, {
25269    key: "preMouseDownCallback",
25270    value: function preMouseDownCallback(evt) {
25271      this._startPainting(evt);
25272
25273      return true;
25274    }
25275    /**
25276     * Initialise painting with baseBrushTool
25277     *
25278     * @protected
25279     * @event
25280     * @param {Object} evt - The event.
25281     * @returns {void}
25282     */
25283
25284  }, {
25285    key: "_startPainting",
25286    value: function _startPainting(evt) {
25287      var eventData = evt.detail;
25288      var element = eventData.element;
25289
25290      this._paint(evt);
25291
25292      this._drawing = true;
25293
25294      this._startListeningForMouseUp(element);
25295
25296      this._lastImageCoords = eventData.currentPoints.image;
25297    }
25298    /**
25299     * Event handler for MOUSE_MOVE event.
25300     *
25301     * @override
25302     * @event
25303     * @param {Object} evt - The event.
25304     */
25305
25306  }, {
25307    key: "mouseMoveCallback",
25308    value: function mouseMoveCallback(evt) {
25309      var currentPoints = evt.detail.currentPoints;
25310      this._lastImageCoords = currentPoints.image;
25311    }
25312    /**
25313     * Event handler for switching mode to passive;
25314     *
25315     * @override
25316     * @event
25317     * @param {Object} evt - The event.
25318     */
25319    // eslint-disable-next-line no-unused-vars
25320
25321  }, {
25322    key: "passiveCallback",
25323    value: function passiveCallback(evt) {
25324      try {
25325        _externalModules_js__WEBPACK_IMPORTED_MODULE_8__["default"].cornerstone.updateImage(this.element);
25326      } catch (error) {
25327        // It is possible that the image has not been loaded
25328        // when this is called.
25329        return;
25330      }
25331    }
25332    /**
25333     * Used to redraw the tool's annotation data per render.
25334     *
25335     * @override
25336     * @param {Object} evt - The event.
25337     */
25338
25339  }, {
25340    key: "renderToolData",
25341    value: function renderToolData(evt) {
25342      var eventData = evt.detail;
25343      var element = eventData.element; // Only brush needs to render.
25344
25345      if (Object(_store_isToolActive_js__WEBPACK_IMPORTED_MODULE_11__["default"])(element, this.name)) {
25346        // Call the hover event for the brush
25347        this.renderBrush(evt);
25348      }
25349    } // ===================================================================
25350    // Implementation interface
25351    // ===================================================================
25352
25353    /**
25354     * Get the draw color (segmentation) of the tool.
25355     *
25356     * @protected
25357     * @param  {Number} drawId The id of the color (segmentation) to switch to.
25358     * @returns {string} The brush color in rgba format
25359     */
25360
25361  }, {
25362    key: "_getBrushColor",
25363    value: function _getBrushColor(drawId) {
25364      var colormap = _externalModules_js__WEBPACK_IMPORTED_MODULE_8__["default"].cornerstone.colors.getColormap(state.colorMapId);
25365      var colorArray = colormap.getColor(drawId);
25366
25367      if (this._drawing) {
25368        return "rgba(".concat(colorArray[[0]], ", ").concat(colorArray[[1]], ", ").concat(colorArray[[2]], ", 1.0 )");
25369      }
25370
25371      return "rgba(".concat(colorArray[[0]], ", ").concat(colorArray[[1]], ", ").concat(colorArray[[2]], ", 0.8 )");
25372    }
25373    /**
25374     * Event handler for MOUSE_UP during the drawing event loop.
25375     *
25376     * @protected
25377     * @event
25378     * @param {Object} evt - The event.
25379     * @returns {void}
25380     */
25381
25382  }, {
25383    key: "_drawingMouseUpCallback",
25384    value: function _drawingMouseUpCallback(evt) {
25385      var element = evt.detail.element;
25386      this._drawing = false;
25387      this._mouseUpRender = true;
25388      var measurementData = null;
25389      var brushModule = _store_index_js__WEBPACK_IMPORTED_MODULE_12__["default"].modules.brush;
25390      var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_9__["getToolState"])(element, this.name) || Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_9__["getToolState"])(element, 'brush');
25391      var currentSegmentationIndex = brushModule.state.drawColorId;
25392
25393      if (toolState.data && toolState.data.length > currentSegmentationIndex) {
25394        measurementData = toolState.data[currentSegmentationIndex];
25395      }
25396
25397      var eventData = {
25398        toolName: this.name,
25399        element: element,
25400        measurementData: measurementData,
25401        evtDetail: evt.detail
25402      };
25403      Object(_util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_13__["default"])(element, _events_js__WEBPACK_IMPORTED_MODULE_7__["default"].MEASUREMENT_COMPLETED, eventData);
25404
25405      this._stopListeningForMouseUp(element);
25406    }
25407    /**
25408     * Adds modify loop event listeners.
25409     *
25410     * @protected
25411     * @param {Object} element - The viewport element to add event listeners to.
25412     * @modifies {element}
25413     * @returns {void}
25414     */
25415
25416  }, {
25417    key: "_startListeningForMouseUp",
25418    value: function _startListeningForMouseUp(element) {
25419      element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_7__["default"].MOUSE_UP, this._drawingMouseUpCallback);
25420      element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_7__["default"].MOUSE_CLICK, this._drawingMouseUpCallback);
25421      element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_7__["default"].MOUSE_UP, this._drawingMouseUpCallback);
25422      element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_7__["default"].MOUSE_CLICK, this._drawingMouseUpCallback);
25423      _externalModules_js__WEBPACK_IMPORTED_MODULE_8__["default"].cornerstone.updateImage(element);
25424    }
25425    /**
25426     * Adds modify loop event listeners.
25427     *
25428     * @protected
25429     * @param {Object} element - The viewport element to add event listeners to.
25430     * @modifies {element}
25431     * @returns {void}
25432     */
25433
25434  }, {
25435    key: "_stopListeningForMouseUp",
25436    value: function _stopListeningForMouseUp(element) {
25437      element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_7__["default"].MOUSE_UP, this._drawingMouseUpCallback);
25438      element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_7__["default"].MOUSE_CLICK, this._drawingMouseUpCallback);
25439      _externalModules_js__WEBPACK_IMPORTED_MODULE_8__["default"].cornerstone.updateImage(element);
25440    } // ===================================================================
25441    // Segmentation API. This is effectively a wrapper around the store.
25442    // ===================================================================
25443
25444    /**
25445     * Switches to the next segmentation color.
25446     *
25447     * @public
25448     * @api
25449     * @returns {void}
25450     */
25451
25452  }, {
25453    key: "nextSegmentation",
25454    value: function nextSegmentation() {
25455      var numberOfColors = this.constructor.getNumberOfColors();
25456      var drawId = state.drawColorId + 1;
25457
25458      if (drawId === numberOfColors) {
25459        drawId = 0;
25460      }
25461
25462      state.drawColorId = drawId;
25463    }
25464    /**
25465     * Switches to the previous segmentation color.
25466     *
25467     * @public
25468     * @api
25469     * @returns {void}
25470     */
25471
25472  }, {
25473    key: "previousSegmentation",
25474    value: function previousSegmentation() {
25475      var numberOfColors = this.constructor.getNumberOfColors();
25476      var drawId = state.drawColorId - 1;
25477
25478      if (drawId < 0) {
25479        drawId = numberOfColors - 1;
25480      }
25481
25482      state.drawColorId = drawId;
25483    }
25484    /**
25485     * Increases the brush size
25486     *
25487     * @public
25488     * @api
25489     * @returns {void}
25490     */
25491
25492  }, {
25493    key: "increaseBrushSize",
25494    value: function increaseBrushSize() {
25495      var oldRadius = state.radius;
25496      var newRadius = Math.floor(oldRadius * 1.2); // If e.g. only 2 pixels big. Math.floor(2*1.2) = 2.
25497      // Hence, have minimum increment of 1 pixel.
25498
25499      if (newRadius === oldRadius) {
25500        newRadius += 1;
25501      }
25502
25503      setters.radius(newRadius);
25504    }
25505    /**
25506     * Decreases the brush size
25507     *
25508     * @public
25509     * @api
25510     * @returns {void}
25511     */
25512
25513  }, {
25514    key: "decreaseBrushSize",
25515    value: function decreaseBrushSize() {
25516      var oldRadius = state.radius;
25517      var newRadius = Math.floor(oldRadius * 0.8);
25518      setters.radius(newRadius);
25519    }
25520    /**
25521     * Displays a segmentation on the element.
25522     *
25523     * @public
25524     * @api
25525     * @param  {Number} segIndex        The index of the segmentation.
25526     * @returns {void}
25527     */
25528
25529  }, {
25530    key: "showSegmentationOnElement",
25531    value: function showSegmentationOnElement(segIndex) {
25532      var enabledElement = this._getEnabledElement();
25533
25534      var enabledElementUID = enabledElement.uuid;
25535      setters.brushVisibilityForElement(enabledElementUID, segIndex, true);
25536      _externalModules_js__WEBPACK_IMPORTED_MODULE_8__["default"].cornerstone.updateImage(enabledElement.element);
25537    }
25538    /**
25539     * Hides a segmentation on an element.
25540     *
25541     * @public
25542     * @api
25543     * @param  {Number} segIndex        The index of the segmentation.
25544     * @returns {void}
25545     */
25546
25547  }, {
25548    key: "hideSegmentationOnElement",
25549    value: function hideSegmentationOnElement(segIndex) {
25550      var enabledElement = this._getEnabledElement();
25551
25552      var enabledElementUID = enabledElement.uuid;
25553      setters.brushVisibilityForElement(enabledElementUID, segIndex, false);
25554      _externalModules_js__WEBPACK_IMPORTED_MODULE_8__["default"].cornerstone.updateImage(enabledElement.element);
25555    }
25556    /**
25557     * Displays all segmentations on an element.
25558     *
25559     * @public
25560     * @api
25561     * @returns {void}
25562     */
25563
25564  }, {
25565    key: "showAllSegmentationsOnElement",
25566    value: function showAllSegmentationsOnElement() {
25567      var enabledElement = this._getEnabledElement();
25568
25569      var enabledElementUID = enabledElement.uuid;
25570      var colormap = _externalModules_js__WEBPACK_IMPORTED_MODULE_8__["default"].cornerstone.colors.getColormap(state.colorMapId);
25571      var numberOfColors = colormap.getNumberOfColors();
25572
25573      for (var segIndex = 0; segIndex < numberOfColors; segIndex++) {
25574        setters.brushVisibilityForElement(enabledElementUID, segIndex, true);
25575      }
25576
25577      _externalModules_js__WEBPACK_IMPORTED_MODULE_8__["default"].cornerstone.updateImage(enabledElement.element);
25578    }
25579    /**
25580     * Hides all segmentations on an element.
25581     *
25582     * @public
25583     * @api
25584     * @returns {void}
25585     */
25586
25587  }, {
25588    key: "hideAllSegmentationsOnElement",
25589    value: function hideAllSegmentationsOnElement() {
25590      var enabledElement = this._getEnabledElement();
25591
25592      var enabledElementUID = enabledElement.uuid;
25593      var colormap = _externalModules_js__WEBPACK_IMPORTED_MODULE_8__["default"].cornerstone.colors.getColormap(state.colorMapId);
25594      var numberOfColors = colormap.getNumberOfColors();
25595
25596      for (var segIndex = 0; segIndex < numberOfColors; segIndex++) {
25597        setters.brushVisibilityForElement(enabledElementUID, segIndex, false);
25598      }
25599
25600      _externalModules_js__WEBPACK_IMPORTED_MODULE_8__["default"].cornerstone.updateImage(enabledElement.element);
25601    }
25602    /**
25603     * Returns the number of colors in the colormap.
25604     *
25605     * @static
25606     * @public
25607     * @api
25608     * @returns {Number} The number of colors in the color map.
25609     */
25610
25611  }, {
25612    key: "_getEnabledElement",
25613    value: function _getEnabledElement() {
25614      return _externalModules_js__WEBPACK_IMPORTED_MODULE_8__["default"].cornerstone.getEnabledElement(this.element);
25615    }
25616    /**
25617     * Returns the toolData type assoicated with this type of tool.
25618     *
25619     * @static
25620     * @public
25621     * @returns {String} The number of colors in the color map.
25622     */
25623
25624  }, {
25625    key: "alpha",
25626    get: function get() {
25627      return state.alpha;
25628    },
25629    set: function set(value) {
25630      var enabledElement = this._getEnabledElement();
25631
25632      state.alpha = value;
25633      _externalModules_js__WEBPACK_IMPORTED_MODULE_8__["default"].cornerstone.updateImage(enabledElement.element);
25634    }
25635  }, {
25636    key: "hiddenButActiveAlpha",
25637    get: function get() {
25638      return state.hiddenButActiveAlpha;
25639    },
25640    set: function set(value) {
25641      var enabledElement = this._getEnabledElement();
25642
25643      state.hiddenButActiveAlpha = value;
25644      _externalModules_js__WEBPACK_IMPORTED_MODULE_8__["default"].cornerstone.updateImage(enabledElement.element);
25645    }
25646  }], [{
25647    key: "getNumberOfColors",
25648    value: function getNumberOfColors() {
25649      var colormap = _externalModules_js__WEBPACK_IMPORTED_MODULE_8__["default"].cornerstone.colors.getColormap(state.colorMapId);
25650      return colormap.getNumberOfColors();
25651    }
25652  }, {
25653    key: "getReferencedToolDataName",
25654    value: function getReferencedToolDataName() {
25655      return 'brush';
25656    }
25657    /**
25658     * Invalidate all the brush data.
25659     *
25660     * @static
25661     * @public
25662     * @param {string}
25662 enabledElementUID - This identifier for the enabled element.
25663     * @returns {void}
25664     */
25665
25666  }, {
25667    key: "invalidateBrushOnEnabledElement",
25668    value: function invalidateBrushOnEnabledElement(enabledElementUID) {
25669      /** WIP **/
25670      var element = _store_index_js__WEBPACK_IMPORTED_MODULE_12__["default"].getters.enabledElementByUID(enabledElementUID);
25671      var stackToolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_9__["getToolState"])(element, 'stack');
25672
25673      if (!stackToolState) {
25674        return;
25675      }
25676
25677      var imageIds = stackToolState.data[0].imageIds;
25678      var toolState = _stateManagement_imageIdSpecificStateManager_js__WEBPACK_IMPORTED_MODULE_10__["globalImageIdSpecificToolStateManager"].saveToolState();
25679
25680      for (var i = 0; i < imageIds.length; i++) {
25681        var imageId = imageIds[i];
25682
25683        if (toolState[imageId] && toolState[imageId].brush) {
25684          var brushData = toolState[imageId].brush.data;
25685
25686          for (var j = 0; j < brushData.length; j++) {
25687            if (brushData[j].pixelData) {
25688              brushData[j].invalidated = true;
25689            }
25690          }
25691        }
25692      }
25693
25694      _externalModules_js__WEBPACK_IMPORTED_MODULE_8__["default"].cornerstone.updateImage(element, true);
25695    }
25696    /**
25697     * Returns a datacube for the segmentation.
25698     *
25699     * @static
25700     * @param {string} enabledElementUID - This identifier for the enabled element.
25701     * @returns {type}  description
25702     */
25703
25704  }, {
25705    key: "getDataAsVolume",
25706    value: function getDataAsVolume(enabledElementUID) {
25707      /** WIP **/
25708      var element = _store_index_js__WEBPACK_IMPORTED_MODULE_12__["default"].getters.enabledElementByUID(enabledElementUID);
25709      var stackToolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_9__["getToolState"])(element, 'stack');
25710
25711      if (!stackToolState) {
25712        return;
25713      }
25714
25715      var imageIds = stackToolState.data[0].imageIds;
25716      var enabledElement = _externalModules_js__WEBPACK_IMPORTED_MODULE_8__["default"].cornerstone.getEnabledElement(element);
25717      var image = enabledElement.image;
25718      var dim = {
25719        xy: image.columns * image.rows,
25720        z: image.rows,
25721        xyz: image.columns * image.rows * imageIds.length
25722      };
25723      var toolState = _stateManagement_imageIdSpecificStateManager_js__WEBPACK_IMPORTED_MODULE_10__["globalImageIdSpecificToolStateManager"].saveToolState();
25724      var buffer = new ArrayBuffer(dim.xyz);
25725      var uint8View = new Uint8Array(buffer);
25726
25727      for (var i = 0; i < imageIds.length; i++) {
25728        var imageId = imageIds[i]; // TODO -> Workout HTF we will do this for multiple colors etc.
25729
25730        if (toolState[imageId] && toolState[imageId].brush && toolState[imageId].brush.data[0].pixelData) {// ADD brush data to the location of that slice.
25731        }
25732      }
25733    }
25734  }]);
25735
25736  return BaseBrushTool;
25737}(_BaseTool_js__WEBPACK_IMPORTED_MODULE_6__["default"]);
25738
25739/* harmony default export */ __webpack_exports__["default"] = (BaseBrushTool);
25740
25741/***/ }),
25742
25743/***/ "./tools/base/BaseTool.js":
25744/*!********************************!*\
25745  !*** ./tools/base/BaseTool.js ***!
25746  \********************************/
25747/*! exports provided: default */
25748/***/ (function(module, __webpack_exports__, __webpack_require__) {
25749
25750"use strict";
25751__webpack_require__.r(__webpack_exports__);
25752/* harmony import */ var _babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/typeof */ "../node_modules/@babel/runtime/helpers/typeof.js");
25753/* harmony import */ var _babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0__);
25754/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js");
25755/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_1__);
25756/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js");
25757/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_2__);
25758/* harmony import */ var _mixins_index_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./../../mixins/index.js */ "./mixins/index.js");
25759/* harmony import */ var _util_logger_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../util/logger.js */ "./util/logger.js");
25760/* harmony import */ var _util_deepmerge_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./../../util/deepmerge.js */ "./util/deepmerge.js");
25761
25762
25763
25764
25765
25766
25767var logger = Object(_util_logger_js__WEBPACK_IMPORTED_MODULE_4__["getLogger"])('tools:base:BaseTool');
25768/**
25769 * @typedef ToolConfiguration
25770 * @param {String} name
25771 * @param {object} strategies - Named strategy functions
25772 * @param {String} defaultStrategy - The name of the strategy to use by default
25773 * @param {Object} configuration
25774 * @param {String[]} mixins - A list of mixin names to apply to the tool
25775 */
25776
25777/**
25778 * @memberof Tools.Base
25779 * @classdesc BaseTool Class description
25780 * @property {String[]} supportedInteractionTypes - A string list of ways the tool can interact with the user
25781 */
25782
25783var BaseTool =
25784/*#__PURE__*/
25785function () {
25786  /**
25787   * Constructor description
25788   * @param {defaultProps} [defaultProps={}] Tools Default properties
25789   * @param {props} [props={}] Tool properties set on instantiation of a tool
25790   */
25791  function BaseTool(props, defaultProps) {
25792    _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_1___default()(this, BaseTool);
25793
25794    /**
25795     * Merge default props with custom props
25796     */
25797    this.initialConfiguration = Object(_util_deepmerge_js__WEBPACK_IMPORTED_MODULE_5__["default"])(defaultProps, props);
25798    var _this$initialConfigur = this.initialConfiguration,
25799        name = _this$initialConfigur.name,
25800        strategies = _this$initialConfigur.strategies,
25801        defaultStrategy = _this$initialConfigur.defaultStrategy,
25802        configuration = _this$initialConfigur.configuration,
25803        supportedInteractionTypes = _this$initialConfigur.supportedInteractionTypes,
25804        mixins = _this$initialConfigur.mixins,
25805        svgCursor = _this$initialConfigur.svgCursor;
25806    /**
25807     * A unique, identifying tool name
25808     * @type {String}
25809     */
25810
25811    this.name = name;
25812    /** @type {String} */
25813
25814    this.mode = 'disabled';
25815    this.element = undefined;
25816    this.supportedInteractionTypes = supportedInteractionTypes || [];
25817    this.strategies = strategies || {};
25818    this.defaultStrategy = defaultStrategy || Object.keys(this.strategies)[0] || undefined;
25819    this.activeStrategy = this.defaultStrategy;
25820
25821    if (svgCursor) {
25822      this.svgCursor = svgCursor;
25823    } // Options are set when a tool is added, during a "mode" change,
25824    // or via a tool's option's setter
25825
25826
25827    this._options = {}; // Configuration is set at tool initalization
25828
25829    this._configuration = Object.assign({}, configuration); // `updateOnMouseMove` causes the frame to render on every mouse move when
25830    // the tool is active. This is useful for tools that render large/dynamic
25831    // items to the canvas which can't easily be respresented with an SVG Cursor.
25832
25833    this.updateOnMouseMove = false;
25834    this.hideDefaultCursor = false; // Apply mixins if mixinsArray is not empty.
25835
25836    if (mixins && mixins.length) {
25837      this._applyMixins(mixins);
25838    }
25839  } //
25840  // CONFIGURATION
25841  //
25842
25843  /**
25844   * Config...
25845   * @public
25846   * @type {Object}
25847   * @instance
25848   */
25849
25850
25851  _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_2___default()(BaseTool, [{
25852    key: "mergeOptions",
25853
25854    /**
25855     * Merges provided options with existing options.
25856     *
25857     * @public
25858     * @instance
25859     * @param {Object} options - options object to merge with existing options.
25860     * @returns {undefined}
25861     */
25862    value: function mergeOptions(options) {
25863      this._options = Object.assign({}, this._options, options);
25864    }
25865    /**
25866     * Clears the tools options.
25867     *
25868     * @public
25869     * @instance
25870     * @memberof Tools.Base.BaseTool
25871     * @returns {undefined}
25872     */
25873
25874  }, {
25875    key: "clearOptions",
25876    value: function clearOptions() {
25877      this._options = {};
25878    }
25879    /**
25880     * Apply the currently set/active strategy.
25881     *
25882     * @public
25883     * @instance
25884     * @method applyActiveStrategy
25885     * @memberof Tools.Base.BaseTool
25886     *
25887     * @param {*} evt The event that triggered the strategies application
25888     * @returns {*} strategies vary widely; check each specific strategy to find expected return value
25889     */
25890
25891  }, {
25892    key: "applyActiveStrategy",
25893    value: function applyActiveStrategy(evt) {
25894      return this.strategies[this.activeStrategy](evt, this.configuration);
25895    }
25896    /**
25897     * Iterates over registered mixins; any matching names in the provided `mixinsArray` will
25898     * be merged with this instance.
25899     *
25900     * @private
25901     * @method _applyMixins
25902     * @param {string[]} mixinsArray An array of mixin identifiers (strings).
25903     * @returns {undefined}
25904     */
25905
25906  }, {
25907    key: "_applyMixins",
25908    value: function _applyMixins(mixinsArray) {
25909      for (var i = 0; i < mixinsArray.length; i++) {
25910        var mixin = _mixins_index_js__WEBPACK_IMPORTED_MODULE_3__["default"]["".concat(mixinsArray[i])];
25911
25912        if (_babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0___default()(mixin) === 'object') {
25913          Object.assign(this, mixin);
25914        } else {
25915          logger.warn("".concat(this.name, ": mixin ").concat(_mixins_index_js__WEBPACK_IMPORTED_MODULE_3__["default"][i], " does not exist."));
25916        }
25917      }
25918    } // ===================================================================
25919    // Virtual Methods - Have default behavior but may be overriden.
25920    // ===================================================================
25921    //
25922    // MOUSE
25923    //
25924
25925    /**
25926     * Callback that takes priority if the tool is active, before `MOUSE_DOWN`
25927     * events are processed. Does nothing by default.
25928     *
25929     * @callback BaseTool~preMouseDownCallback
25930     * @param  {CornerstoneTools.event:cornerstonetoolsmousedown} evt
25931     * @returns {boolean} consumedEvent - True if function consumed the event.
25932     */
25933
25934    /**
25935     * Callback that takes priority if the tool is active, after `MOUSE_DOWN`
25936     * events are processed. Does nothing by default.
25937     *
25938     * @callback BaseTool~postMouseDownCallback
25939     * @param  {CornerstoneTools.event:cornerstonetoolsmousedown} evt
25940     * @returns {boolean} consumedEvent - True if function consumed the event.
25941     */
25942
25943    /**
25944     * Callback that is called if the tool is active, after `MOUSE_DOWN`
25945     * events are processed. Does nothing by default.
25946     *
25947     * @virtual
25948     * @param  {type} evt
25949     * @returns {boolean} consumedEvent - True if function consumed the event.
25950     */
25951
25952    /**
25953     * Example implementation:
25954     *
25955     * postMouseDownCallback(evt) {
25956     *    return false;
25957     * }
25958     */
25959
25960    /**
25961     * Callback that takes priority if the tool is active, before `TOUCH_START`
25962     * events are processed. Does nothing by default.
25963     *
25964     * @virtual
25965     * @param  {type} evt
25966     * @returns {boolean} consumedEvent - True if function consumed the event.
25967     */
25968
25969    /**
25970     * Example implementation:
25971     *
25972     * preTouchStartCallback(evt) {
25973     *    return false;
25974     * }
25975     */
25976
25977    /**
25978     * Callback that is called if the tool is active, after `TOUCH_START`
25979     * events are processed. Does nothing by default.
25980     *
25981     * @virtual
25982     * @param  {type} evt
25983     * @returns {boolean} consumedEvent - True if function consumed the event.
25984     */
25985
25986    /**
25987     * Example implementation:
25988     *
25989     * postTouchStartCallback(evt) {
25990     *    return false;
25991     * }
25992     */
25993
25994  }, {
25995    key: "configuration",
25996    get: function get() {
25997      return this._configuration;
25998    },
25999    set: function set(configuration) {
26000      this._configuration = configuration;
26001    } //
26002    // OPTIONS
26003    //
26004
26005    /**
26006     * Options...
26007     * @readonly
26008     * @instance
26009     */
26010
26011  }, {
26012    key: "options",
26013    get: function get() {
26014      return this._options;
26015    }
26016  }], [{
26017    key: "configuration",
26018    get: function get() {}
26019  }]);
26020
26021  return BaseTool;
26022}();
26023
26024/* harmony default export */ __webpack_exports__["default"] = (BaseTool);
26025
26026/***/ }),
26027
26028/***/ "./tools/brush/BrushTool.js":
26029/*!**********************************!*\
26030  !*** ./tools/brush/BrushTool.js ***!
26031  \**********************************/
26032/*! exports provided: default */
26033/***/ (function(module, __webpack_exports__, __webpack_require__) {
26034
26035"use strict";
26036__webpack_require__.r(__webpack_exports__);
26037/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return BrushTool; });
26038/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js");
26039/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
26040/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js");
26041/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
26042/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js");
26043/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
26044/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js");
26045/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
26046/* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/assertThisInitialized */ "../node_modules/@babel/runtime/helpers/assertThisInitialized.js");
26047/* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4__);
26048/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js");
26049/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__);
26050/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./../../externalModules.js */ "./externalModules.js");
26051/* harmony import */ var _base_BaseBrushTool_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./../base/BaseBrushTool.js */ "./tools/base/BaseBrushTool.js");
26052/* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./../../stateManagement/toolState.js */ "./stateManagement/toolState.js");
26053/* harmony import */ var _store_index_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./../../store/index.js */ "./store/index.js");
26054/* harmony import */ var _util_brush_index_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./../../util/brush/index.js */ "./util/brush/index.js");
26055/* harmony import */ var _util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./../../util/triggerEvent.js */ "./util/triggerEvent.js");
26056/* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../../events.js */ "./events.js");
26057
26058
26059
26060
26061
26062
26063
26064
26065
26066
26067
26068
26069
26070var drawBrushPixels = _util_brush_index_js__WEBPACK_IMPORTED_MODULE_10__["default"].drawBrushPixels,
26071    getCircle = _util_brush_index_js__WEBPACK_IMPORTED_MODULE_10__["default"].getCircle;
26072var brushModule = _store_index_js__WEBPACK_IMPORTED_MODULE_9__["default"].modules.brush;
26073/**
26074 * @public
26075 * @class BrushTool
26076 * @memberof Tools.Brush
26077 * @classdesc Tool for drawing segmentations on an image.
26078 * @extends Tools.Base.BaseBrushTool
26079 */
26080
26081var BrushTool =
26082/*#__PURE__*/
26083function (_BaseBrushTool) {
26084  _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default()(BrushTool, _BaseBrushTool);
26085
26086  function BrushTool() {
26087    var _this;
26088
26089    var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
26090
26091    _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, BrushTool);
26092
26093    var defaultProps = {
26094      name: 'Brush',
26095      supportedInteractionTypes: ['Mouse', 'Touch'],
26096      strategies: {
26097        overlapping: _overlappingStrategy,
26098        nonOverlapping: _nonOverlappingStrategy
26099      },
26100      defaultStrategy: 'overlapping',
26101      configuration: {
26102        alwaysEraseOnClick: false
26103      }
26104    };
26105    _this = _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(BrushTool).call(this, props, defaultProps));
26106    _this.touchDragCallback = _this._paint.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this));
26107    return _this;
26108  }
26109  /**
26110   * Called by the event dispatcher to render the image.
26111   *
26112   * @param {Object} evt - The event.
26113   * @returns {void}
26114   */
26115
26116
26117  _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(BrushTool, [{
26118    key: "renderBrush",
26119    value: function renderBrush(evt) {
26120      var eventData = evt.detail;
26121      var viewport = eventData.viewport;
26122      var mousePosition;
26123
26124      if (this._drawing) {
26125        mousePosition = this._lastImageCoords;
26126      } else if (this._mouseUpRender) {
26127        mousePosition = this._lastImageCoords;
26128        this._mouseUpRender = false;
26129      } else {
26130        mousePosition = _store_index_js__WEBPACK_IMPORTED_MODULE_9__["default"].state.mousePositionImage;
26131      }
26132
26133      if (!mousePosition) {
26134        return;
26135      }
26136
26137      var _eventData$image = eventData.image,
26138          rows = _eventData$image.rows,
26139          columns = _eventData$image.columns;
26140      var _mousePosition = mousePosition,
26141          x = _mousePosition.x,
26142          y = _mousePosition.y;
26143
26144      if (x < 0 || x > columns || y < 0 || y > rows) {
26145        return;
26146      } // Draw the hover overlay on top of the pixel data
26147
26148
26149      var radius = brushModule.state.radius;
26150      var context = eventData.canvasContext;
26151      var element = eventData.element;
26152      var drawId = brushModule.state.drawColorId;
26153
26154      var color = this._getBrushColor(drawId);
26155
26156      context.setTransform(1, 0, 0, 1, 0, 0);
26157      var cornerstone = _externalModules_js__WEBPACK_IMPORTED_MODULE_6__["default"].cornerstone;
26158      var circleRadius = radius * viewport.scale;
26159      var mouseCoordsCanvas = cornerstone.pixelToCanvas(element, mousePosition);
26160      context.beginPath();
26161      context.strokeStyle = color;
26162      context.ellipse(mouseCoordsCanvas.x, mouseCoordsCanvas.y, circleRadius, circleRadius, 0, 0, 2 * Math.PI);
26163      context.stroke();
26164    }
26165    /**
26166     * Paints the data to the canvas.
26167     *
26168     * @private
26169     * @param  {Object} evt The data object associated with the event.
26170     * @returns {void}
26171     */
26172
26173  }, {
26174    key: "_paint",
26175    value: function _paint(evt) {
26176      this.applyActiveStrategy(evt, this.configuration);
26177      Object(_util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_11__["default"])(evt.detail.element, _events_js__WEBPACK_IMPORTED_MODULE_12__["default"].MEASUREMENT_MODIFIED, evt.detail);
26178      _externalModules_js__WEBPACK_IMPORTED_MODULE_6__["default"].cornerstone.updateImage(evt.detail.element);
26179    }
26180  }]);
26181
26182  return BrushTool;
26183}(_base_BaseBrushTool_js__WEBPACK_IMPORTED_MODULE_7__["default"]);
26184
26185
26186
26187function _overlappingStrategy(evt, configuration) {
26188  var eventData = evt.detail;
26189  var element = eventData.element;
26190  var _eventData$image2 = eventData.image,
26191      rows = _eventData$image2.rows,
26192      columns = _eventData$image2.columns;
26193  var _eventData$currentPoi = eventData.currentPoints.image,
26194      x = _eventData$currentPoi.x,
26195      y = _eventData$currentPoi.y;
26196  var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_8__["getToolState"])(element, _base_BaseBrushTool_js__WEBPACK_IMPORTED_MODULE_7__["default"].getReferencedToolDataName());
26197
26198  if (!toolState) {
26199    Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_8__["addToolState"])(element, _base_BaseBrushTool_js__WEBPACK_IMPORTED_MODULE_7__["default"].getReferencedToolDataName(), {});
26200    toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_8__["getToolState"])(element, _base_BaseBrushTool_js__WEBPACK_IMPORTED_MODULE_7__["default"].getReferencedToolDataName());
26201  }
26202
26203  var toolData = toolState.data;
26204
26205  if (x < 0 || x > columns || y < 0 || y > rows) {
26206    return;
26207  }
26208
26209  var radius = brushModule.state.radius;
26210  var pointerArray = getCircle(radius, rows, columns, x, y);
26211
26212  _drawMainColor(eventData, toolData, pointerArray, configuration);
26213}
26214
26215function _nonOverlappingStrategy(evt, configuration) {
26216  var eventData = evt.detail;
26217  var element = eventData.element;
26218  var _eventData$image3 = eventData.image,
26219      rows = _eventData$image3.rows,
26220      columns = _eventData$image3.columns;
26221  var _eventData$currentPoi2 = eventData.currentPoints.image,
26222      x = _eventData$currentPoi2.x,
26223      y = _eventData$currentPoi2.y;
26224  var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_8__["getToolState"])(element, _base_BaseBrushTool_js__WEBPACK_IMPORTED_MODULE_7__["default"].getReferencedToolDataName());
26225
26226  if (!toolState) {
26227    Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_8__["addToolState"])(element, _base_BaseBrushTool_js__WEBPACK_IMPORTED_MODULE_7__["default"].getReferencedToolDataName(), {});
26228    toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_8__["getToolState"])(element, _base_BaseBrushTool_js__WEBPACK_IMPORTED_MODULE_7__["default"].getReferencedToolDataName());
26229  }
26230
26231  var toolData = toolState.data;
26232  var segmentationIndex = brushModule.state.drawColorId;
26233
26234  if (x < 0 || x > columns || y < 0 || y > rows) {
26235    return;
26236  }
26237
26238  var radius = brushModule.state.radius;
26239  var pointerArray = getCircle(radius, rows, columns, x, y);
26240  var numberOfColors = _base_BaseBrushTool_js__WEBPACK_IMPORTED_MODULE_7__["default"].getNumberOfColors(); // If there is brush data in this region for other colors, delete it.
26241
26242  for (var i = 0; i < numberOfColors; i++) {
26243    if (i === segmentationIndex) {
26244      continue;
26245    }
26246
26247    if (toolData[i] && toolData[i].pixelData) {
26248      drawBrushPixels(pointerArray, toolData[i], columns, true);
26249      toolData[i].invalidated = true;
26250    }
26251  }
26252
26253  _drawMainColor(eventData, toolData, pointerArray, configuration);
26254}
26255
26256function _drawMainColor(eventData, toolData, pointerArray, configuration) {
26257  var shouldErase = configuration.alwaysEraseOnClick || _isCtrlDown(eventData);
26258
26259  var columns = eventData.image.columns;
26260  var segmentationIndex = brushModule.state.drawColorId;
26261
26262  if (shouldErase && !toolData[segmentationIndex]) {
26263    // Erase command, yet no data yet, just return.
26264    return;
26265  }
26266
26267  if (!toolData[segmentationIndex]) {
26268    toolData[segmentationIndex] = {};
26269  }
26270
26271  if (!toolData[segmentationIndex].pixelData) {
26272    var enabledElement = _externalModules_js__WEBPACK_IMPORTED_MODULE_6__["default"].cornerstone.getEnabledElement(eventData.element);
26273    var enabledElementUID = enabledElement.uuid; // Clear cache for this color to avoid flickering.
26274
26275    var imageBitmapCacheForElement = brushModule.getters.imageBitmapCacheForElement(enabledElementUID);
26276
26277    if (imageBitmapCacheForElement) {
26278      imageBitmapCacheForElement[segmentationIndex] = null;
26279    } // Add a new pixelData array.
26280
26281
26282    toolData[segmentationIndex].pixelData = new Uint8ClampedArray(eventData.image.width * eventData.image.height);
26283  }
26284
26285  var toolDataI = toolData[segmentationIndex]; // Draw / Erase the active color.
26286
26287  drawBrushPixels(pointerArray, toolDataI, columns, shouldErase);
26288  toolDataI.invalidated = true;
26289}
26290
26291function _isCtrlDown(eventData) {
26292  return eventData.event && eventData.event.ctrlKey || eventData.ctrlKey;
26293}
26294
26295/***/ }),
26296
26297/***/ "./tools/brush/index.js":
26298/*!******************************!*\
26299  !*** ./tools/brush/index.js ***!
26300  \******************************/
26301/*! exports provided: BrushTool, default */
26302/***/ (function(module, __webpack_exports__, __webpack_require__) {
26303
26304"use strict";
26305__webpack_require__.r(__webpack_exports__);
26306/* harmony import */ var _BrushTool_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./BrushTool.js */ "./tools/brush/BrushTool.js");
26307/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "BrushTool", function() { return _BrushTool_js__WEBPACK_IMPORTED_MODULE_0__["default"]; });
26308
26309 // Named Exports
26310
26311 // Namespace, default export
26312
26313/* harmony default export */ __webpack_exports__["default"] = ({
26314  BrushTool: _BrushTool_js__WEBPACK_IMPORTED_MODULE_0__["default"]
26315});
26316
26317/***/ }),
26318
26319/***/ "./tools/cursors/MouseCursor.js":
26320/*!**************************************!*\
26321  !*** ./tools/cursors/MouseCursor.js ***!
26322  \**************************************/
26323/*! exports provided: default */
26324/***/ (function(module, __webpack_exports__, __webpack_require__) {
26325
26326"use strict";
26327__webpack_require__.r(__webpack_exports__);
26328/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return MouseCursor; });
26329/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js");
26330/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
26331/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js");
26332/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
26333/* harmony import */ var _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../stateManagement/toolColors.js */ "./stateManagement/toolColors.js");
26334/* harmony import */ var _store_index_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../store/index.js */ "./store/index.js");
26335
26336
26337
26338
26339var cursorModule = _store_index_js__WEBPACK_IMPORTED_MODULE_3__["modules"].cursor;
26340/*
26341MACROS - The following keys will have the appropriate value injected when
26342an SVG is requested:
26343
26344- ACTIVE_COLOR  => options.activeColor || toolColors.getActiveColor();
26345- TOOL_COLOR    => options.toolColor || toolColors.getToolColor();
26346- FILL_COLOR    => options.fillColor || toolColors.getFillColor();
26347*/
26348
26349var MouseCursor =
26350/*#__PURE__*/
26351function () {
26352  function MouseCursor(iconGroupString, options) {
26353    _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, MouseCursor);
26354
26355    this.iconGroupString = iconGroupString;
26356    this.options = Object.assign({}, cursorModule.getters.defaultOptions(), options);
26357  }
26358  /**
26359   * getIconSVG - Returns an SVG of the icon only.
26360   *
26361   * @param  {Object} options    An object which overrides default properties
26362   *                             of the returned SVG.
26363   * @returns {Blob}              The SVG of the icon.
26364   */
26365
26366
26367  _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(MouseCursor, [{
26368    key: "getIconSVG",
26369    value: function getIconSVG() {
26370      var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
26371
26372      var svgString = this._generateIconSVGString(options);
26373
26374      return new Blob([svgString], {
26375        type: 'image/svg+xml'
26376      });
26377    }
26378    /**
26379     * getIconSVGString - Returns a string representation of the SVG of the icon only.
26380     *
26381     * @param  {Object} options An object which overrides default properties
26382     *                             of the returned SVG.
26383     * @returns {string}         The stringified SVG of the icon.
26384     */
26385
26386  }, {
26387    key: "getIconSVGString",
26388    value: function getIconSVGString() {
26389      var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
26390      return this._generateIconSVGString(options);
26391    }
26392    /**
26393     * getIconWithPointerSVG - Returns an SVG of the icon + pointer.
26394     *
26395     * @param  {Object} options An object which overrides default properties
26396     *                             of the returned SVG.
26397     * @returns {Blob}              The SVG of the icon + pointer..
26398     */
26399
26400  }, {
26401    key: "getIconWithPointerSVG",
26402    value: function getIconWithPointerSVG() {
26403      var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
26404
26405      var svgString = this._generateIconWithPointerSVGString(options);
26406
26407      return new Blob([svgString], {
26408        type: 'image/svg+xml'
26409      });
26410    }
26411    /**
26412     * getIconWithPointerString - Returns a string representation of the SVG
26413     *                            of the icon + pointer.
26414     *
26415     * @param  {Object} options An object which overrides default properties
26416     *                          of the returned SVG.
26417     * @returns {string}         The stringified SVG of the icon + pointer.
26418     */
26419
26420  }, {
26421    key: "getIconWithPointerString",
26422    value: function getIconWithPointerString() {
26423      var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
26424      return this._generateIconWithPointerSVGString(options);
26425    }
26426    /**
26427     * get mousePoint - Returns the mousePoint as a space seperated string.
26428     *
26429     * @returns {string} The mousePoint.
26430     */
26431
26432  }, {
26433    key: "_generateIconWithPointerSVGString",
26434
26435    /**
26436     * _generateIconWithPointerSVGString - Generates a string representation of
26437     *                                     the icon + pointer.
26438     *
26439     * @param  {Object} options   An object which overrides default properties
26440     *                            of the returned string.
26441     * @returns {string}           The SVG as a string.
26442     */
26443    value: function _generateIconWithPointerSVGString() {
26444      var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
26445      var svgOptions = Object.assign({}, this.options, options);
26446      var mousePointerGroupString = svgOptions.mousePointerGroupString,
26447          iconSize = svgOptions.iconSize,
26448          viewBox = svgOptions.viewBox;
26449      var scale = iconSize / Math.max(viewBox.x, viewBox.y);
26450      var svgSize = 16 + iconSize;
26451      var svgString = "\n        <svg\n        data-icon=\"cursor\" role=\"img\" xmlns=\"http://www.w3.org/2000/svg\"\n        width=\"".concat(svgSize, "\" height=\"").concat(svgSize, "\" viewBox=\"0 0 ").concat(svgSize, " ").concat(svgSize, "\"\n      >\n        <g>\n          ").concat(mousePointerGroupString, "\n        </g>\n        <g transform=\"translate(16, 16) scale(").concat(scale, ")\">\n          ").concat(this.iconGroupString, "\n        </g>\n      </svg>");
26452      return this._injectColors(svgString, svgOptions);
26453    }
26454    /**
26455     * _generateIconSVGString - Generates a string representation of the icon.
26456     *
26457     * @param  {Object} options   An object which overrides default properties
26458     *                            of the returned string.
26459     * @returns {string}           The SVG as a string.
26460     */
26461
26462  }, {
26463    key: "_generateIconSVGString",
26464    value: function _generateIconSVGString() {
26465      var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
26466      var svgOptions = Object.assign({}, this.options, options);
26467      var iconSize = svgOptions.iconSize,
26468          viewBox = svgOptions.viewBox;
26469      var svgString = "\n      <svg\n        data-icon=\"cursor\" role=\"img\" xmlns=\"http://www.w3.org/2000/svg\"\n        width=\"".concat(iconSize, "\" height=\"").concat(iconSize, "\" viewBox=\"0 0\n        ").concat(viewBox.x, " ").concat(viewBox.y, "\"\n      >\n        ").concat(this.iconGroupString, "\n      </svg>");
26470      return this._injectColors(svgString, svgOptions);
26471    }
26472    /**
26473     * _injectColors - Replaces ACTIVE_COLOR, TOOL_COLOR and FILL_COLOR in
26474     *                 svgString with their appropriate values.
26475     *
26476     * @param  {string} svgString    The string to modify.
26477     * @param  {Object} options      Optional overrides for the colors.
26478     * @returns {string}              The string with color values injected.
26479     */
26480
26481  }, {
26482    key: "_injectColors",
26483    value: function _injectColors(svgString) {
26484      var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
26485      var activeColor = options.activeColor || _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_2__["default"].getActiveColor();
26486      var toolColor = options.toolColor || _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_2__["default"].getToolColor();
26487      var fillColor = options.fillColor || _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_2__["default"].getFillColor();
26488      return svgString.replace(/ACTIVE_COLOR/g, "".concat(activeColor)).replace(/TOOL_COLOR/g, "".concat(toolColor)).replace(/FILL_COLOR/g, "".concat(fillColor));
26489    }
26490  }, {
26491    key: "mousePoint",
26492    get: function get() {
26493      var mousePoint = this.options.mousePoint;
26494      return "".concat(mousePoint.x, " ").concat(mousePoint.y);
26495    }
26496  }]);
26497
26498  return MouseCursor;
26499}();
26500
26501
26502
26503/***/ }),
26504
26505/***/ "./tools/cursors/index.js":
26506/*!********************************!*\
26507  !*** ./tools/cursors/index.js ***!
26508  \********************************/
26509/*! exports provided: angleCursor, arrowAnnotateCursor, bidirectionalCursor, cobbAngleCursor, circleRoiCursor, ellipticalRoiCursor, freehandMouseCursor, freehandSculpterMouseCursor, lengthCursor, probeCursor, rectangleRoiCursor, textMarkerCursor, crosshairsCursor, eraserCursor, magnifyCursor, panCursor, rotateCursor, stackScrollCursor, wwwcRegionCursor, wwwcCursor, zoomCursor */
26510/***/ (function(module, __webpack_exports__, __webpack_require__) {
26511
26512"use strict";
26513__webpack_require__.r(__webpack_exports__);
26514/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "angleCursor", function() { return angleCursor; });
26515/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "arrowAnnotateCursor", function() { return arrowAnnotateCursor; });
26516/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bidirectionalCursor", function() { return bidirectionalCursor; });
26517/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "cobbAngleCursor", function() { return cobbAngleCursor; });
26518/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "circleRoiCursor", function() { return circleRoiCursor; });
26519/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ellipticalRoiCursor", function() { return ellipticalRoiCursor; });
26520/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "freehandMouseCursor", function() { return freehandMouseCursor; });
26521/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "freehandSculpterMouseCursor", function() { return freehandSculpterMouseCursor; });
26522/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "lengthCursor", function() { return lengthCursor; });
26523/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "probeCursor", function() { return probeCursor; });
26524/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "rectangleRoiCursor", function() { return rectangleRoiCursor; });
26525/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "textMarkerCursor", function() { return textMarkerCursor; });
26526/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "crosshairsCursor", function() { return crosshairsCursor; });
26527/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "eraserCursor", function() { return eraserCursor; });
26528/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "magnifyCursor", function() { return magnifyCursor; });
26529/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "panCursor", function() { return panCursor; });
26530/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "rotateCursor", function() { return rotateCursor; });
26531/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "stackScrollCursor", function() { return stackScrollCursor; });
26532/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "wwwcRegionCursor", function() { return wwwcRegionCursor; });
26533/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "wwwcCursor", function() { return wwwcCursor; });
26534/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "zoomCursor", function() { return zoomCursor; });
26535/* harmony import */ var _MouseCursor_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./MouseCursor.js */ "./tools/cursors/MouseCursor.js");
26536
26537/*
26538MACROS:
26539
26540The following keys will have the appropriate value injected by the MouseCursor
26541class when an SVG is requested:
26542
26543- ACTIVE_COLOR  => options.activeColor || toolColors.getActiveColor();
26544- TOOL_COLOR    => options.toolColor || toolColors.getToolColor();
26545- FILL_COLOR    => options.fillColor || toolColors.getFillColor();
26546*/
26547
26548var angleCursor = new _MouseCursor_js__WEBPACK_IMPORTED_MODULE_0__["default"]("<path fill=\"ACTIVE_COLOR\" d=\"M1203 544q0 13-10 23l-393 393 393 393q10 10 10 23t-10 23l-50\n        50q-10 10-23 10t-23-10l-466-466q-10-10-10-23t10-23l466-466q10-10 23-10t23\n        10l50 50q10 10 10 23z\"\n      />", {
26549  viewBox: {
26550    x: 1792,
26551    y: 1792
26552  }
26553});
26554var arrowAnnotateCursor = new _MouseCursor_js__WEBPACK_IMPORTED_MODULE_0__["default"]("<g id=\"arrowAnnotate-group\" fill=\"none\" stroke-width=\"1\" stroke=\"ACTIVE_COLOR\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n    <path id=\"arrowAnnotate-arrow\" d=\"M23,7 l-15,15 M7,17 l0,6 6,0\" stroke-width=\"2\" />\n  </g>", {
26555  viewBox: {
26556    x: 24,
26557    y: 24
26558  }
26559});
26560var bidirectionalCursor = new _MouseCursor_js__WEBPACK_IMPORTED_MODULE_0__["default"]("<g fill=\"ACTIVE_COLOR\" stroke-width=\"3\" stroke=\"ACTIVE_COLOR\">\n    <path d=\"M27.63 3.21L3.12 28.81\"></path>\n    <path d=\"M27.63 15.75L15.27 4.43\"></path>\n    <path d=\"M16.5 4.28C16.5 4.96 15.95 5.51 15.27 5.51C14.59 5.51 14.03 4.96 14.03 4.28C14.03 3.59 14.59 3.04 15.27 3.04C15.95 3.04 16.5 3.59 16.5 4.28Z\" ></path>\n    <path d=\"M28.87 3.19C28.87 3.87 28.31 4.43 27.63 4.43C26.95 4.43 26.4 3.87 26.4 3.19C26.4 2.51 26.95 1.95 27.63 1.95C28.31 1.95 28.87 2.51 28.87 3.19Z\"></path>\n    <path d=\"M28.87 15.75C28.87 16.43 28.31 16.99 27.63 16.99C26.95 16.99 26.4 16.43 26.4 15.75C26.4 15.07 26.95 14.51 27.63 14.51C28.31 14.51 28.87 15.07 28.87 15.75Z\"></path>\n    <path d=\"M4.73 28.44C4.73 29.12 4.17 29.68 3.49 29.68C2.81 29.68 2.25 29.12 2.25 28.44C2.25 27.76 2.81 27.2 3.49 27.2C4.17 27.2 4.73 27.76 4.73 28.44Z\"></path>\n  </g>", {
26561  viewBox: {
26562    x: 48,
26563    y: 48
26564  }
26565});
26566var cobbAngleCursor = new _MouseCursor_js__WEBPACK_IMPORTED_MODULE_0__["default"]("<g stroke=\"ACTIVE_COLOR\" stroke-width=\"3\">
26566\n    <path d=\"M28.59 2.34L3.82 12.32\"></path>\n    <path d=\"M28.59 29.66L3.82 19.68\"></path>\n    <path stroke-dasharray=\"2\" fill-opacity=\"0\" d=\"M12.37\n      23.06C12.67 22.36 12.85 21.93 12.92 21.76C14.6 17.8 14.68 13.35 13.15\n      9.33C13.11 9.24 13.02 9 12.88 8.63\">\n    </path>\n  </g>", {
26567  viewBox: {
26568    x: 32,
26569    y: 32
26570  }
26571});
26572var circleRoiCursor = new _MouseCursor_js__WEBPACK_IMPORTED_MODULE_0__["default"]("<circle stroke=\"ACTIVE_COLOR\" fill=\"none\" stroke-width=\"3\" cx=\"16\" cy=\"16\" r=\"14\" />", {
26573  viewBox: {
26574    x: 32,
26575    y: 32
26576  }
26577});
26578var ellipticalRoiCursor = new _MouseCursor_js__WEBPACK_IMPORTED_MODULE_0__["default"]("<path stroke=\"ACTIVE_COLOR\" fill=\"none\" stroke-width=\"3\" d=\"M30.74 15.76C30.74 20.99 24.14 25.23 16\n    25.23C7.86 25.23 1.26 20.99 1.26 15.76C1.26 10.54 7.86 6.3 16 6.3C24.14\n    6.3 30.74 10.54 30.74 15.76Z\"\n    />", {
26579  viewBox: {
26580    x: 32,
26581    y: 32
26582  }
26583});
26584var freehandMouseCursor = new _MouseCursor_js__WEBPACK_IMPORTED_MODULE_0__["default"]("\n  <g fill=\"ACTIVE_COLOR\" stroke=\"ACTIVE_COLOR\" stroke-width=\"2\">\n    <ellipse ry=\"1\" rx=\"1\" id=\"svg_3\" cy=\"4.240343\" cx=\"14.306499\"/>\n    <line id=\"svg_4\" y2=\"3.58462\" x2=\"12.242186\" y1=\"3.997482\" x1=\"13.432202\"/>\n    <line id=\"svg_5\" y2=\"3.268901\" x2=\"10.857882\" y1=\"3.608906\" x1=\"12.387902\"/>\n    <line id=\"svg_6\" y2=\"3.147471\" x2=\"9.740724\" y1=\"3.293187\" x1=\"10.955026\"/>\n    <line id=\"svg_7\" y2=\"3.147471\" x2=\"8.089274\" y1=\"3.196043\" x1=\"9.983585\"/>\n    <line id=\"svg_8\" y2=\"3.268901\" x2=\"6.874972\" y1=\"3.123185\" x1=\"8.307848\"/>\n    <line id=\"svg_9\" y2=\"3.657478\" x2=\"5.587812\" y1=\"3.220329\" x1=\"7.020688\"/>\n    <line id=\"svg_10\" y2=\"4.046054\" x2=\"4.737801\" y1=\"3.560334\" x1=\"5.854959\"/>\n    <line id=\"svg_11\" y2=\"4.337487\" x2=\"4.300652\" y1=\"3.997482\" x1=\"4.834945\"/>\n    <line id=\"svg_12\" y2=\"4.726063\" x2=\"3.88779\" y1=\"4.191771\" x1=\"4.470655\"/>\n    <line id=\"svg_15\" y2=\"5.3575\" x2=\"3.377783\" y1=\"4.604633\" x1=\"3.960648\"/>\n    <line id=\"svg_16\" y2=\"6.183226\" x2=\"2.916348\" y1=\"5.138926\" x1=\"3.547785\"/>\n    <line id=\"svg_17\" y2=\"6.960379\" x2=\"2.770632\" y1=\"5.867507\" x1=\"3.037779\"/>\n    <line id=\"svg_18\" y2=\"7.713246\" x2=\"2.673488\" y1=\"6.741804\" x1=\"2.819204\"/>\n    <line id=\"svg_19\" y2=\"8.684687\" x2=\"2.697774\" y1=\"7.616102\" x1=\"2.673488\"/>\n    <line id=\"svg_20\" y2=\"9.753273\" x2=\"2.892062\" y1=\"8.611829\" x1=\"2.697774\"/>\n    <line id=\"svg_21\" y2=\"10.724714\" x2=\"3.134923\" y1=\"9.534698\" x1=\"2.84349\"/>\n    <line id=\"svg_23\" y2=\"11.647583\" x2=\"3.596357\" y1=\"10.578998\" x1=\"3.086351\"/>\n    <line id=\"svg_25\" y2=\"12.521881\" x2=\"4.276366\" y1=\"11.501867\" x1=\"3.499213\"/>\n    <line id=\"svg_26\" y2=\"13.930471\" x2=\"5.830673\" y1=\"12.376165\" x1=\"4.13065\"/>\n    <line id=\"svg_28\" y2=\"14.707624\" x2=\"7.263549\" y1=\"13.881899\" x1=\"5.733528\"/>\n    <line id=\"svg_29\" y2=\"15.339061\" x2=\"8.963571\" y1=\"14.61048\" x1=\"7.06926\"/>\n    <line id=\"svg_30\" y2=\"15.581921\" x2=\"10.882168\" y1=\"15.314775\" x1=\"8.817855\"/>\n    <line id=\"svg_31\" y2=\"15.460491\" x2=\"12.023612\" y1=\"15.581921\" x1=\"10.785024\"/>\n    <line id=\"svg_33\" y2=\"15.120487\" x2=\"13.092197\" y1=\"15.484777\" x1=\"11.877895\"/>\n    <line id=\"svg_34\" y2=\"14.586194\" x2=\"13.86935\" y1=\"15.217631\" x1=\"12.897909\"/>\n    <line id=\"svg_35\" y2=\"13.833327\" x2=\"14.597931\" y1=\"14.756196\" x1=\"13.699348\"/>\n    <line id=\"svg_37\" y2=\"12.716169\" x2=\"15.180796\" y1=\"13.881899\" x1=\"14.549359\"/>\n    <line id=\"svg_39\" y2=\"11.429009\" x2=\"15.520801\" y1=\"12.813313\" x1=\"15.15651\"/>\n    <ellipse ry=\"1\" rx=\"1\" id=\"svg_40\" cy=\"10.967574\" cx=\"15.520801\"/>\n  </g>", {
26585  viewBox: {
26586    x: 18,
26587    y: 18
26588  }
26589});
26590var freehandSculpterMouseCursor = new _MouseCursor_js__WEBPACK_IMPORTED_MODULE_0__["default"]("<g id=\"icon-freehand-sculpt\" fill=\"none\" stroke-width=\"1.5\" stroke=\"ACTIVE_COLOR\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n      <line id=\"svg_1\" y2=\"2.559367\" x2=\"10.184807\" y1=\"4.467781\" x1=\"8.81711\"/>\n      <line id=\"svg_4\" y2=\"1.493836\" x2=\"11.727442\" y1=\"2.766112\" x1=\"10.089386\"/>\n      <line id=\"svg_7\" y2=\"1.080346\" x2=\"13.047428\" y1=\"1.748291\" x1=\"11.345759\"/>\n      <line id=\"svg_8\" y2=\"1.000829\" x2=\"14.351511\" y1=\"1.112153\" x1=\"12.77707\"/>\n      <line id=\"svg_9\" y2=\"1.350705\" x2=\"15.242104\" y1=\"0.905408\" x1=\"13.969828\"/>\n      <line id=\"svg_10\" y2=\"2.098167\" x2=\"15.862339\" y1=\"1.14396\" x1=\"14.955842\"/>\n      <line id=\"svg_11\" y2=\"3.195505\" x2=\"16.41896\" y1=\"1.939133\" x1=\"15.766918\"/>\n      <line id=\"svg_12\" y2=\"4.292843\" x2=\"16.530284\" y1=\"2.925147\" x1=\"16.387153\"/>\n      <line id=\"svg_16\" y2=\"5.644637\" x2=\"16.196311\" y1=\"3.831643\" x1=\"16.593898\"/>\n      <line id=\"svg_18\" y2=\"7.266789\" x2=\"15.623787\" y1=\"5.19934\" x1=\"16.275829\"/>\n      <line id=\"svg_19\" y2=\"10.813258\" x2=\"14.526449\" y1=\"6.726071\" x1=\"15.766918\"/>\n      <line id=\"svg_20\" y2=\"5.056209\" x2=\"8.085552\" y1=\"4.181519\" x1=\"8.976145\"/>\n      <line id=\"svg_23\" y2=\"5.326568\" x2=\"7.481221\" y1=\"4.78585\" x1=\"8.403621\"/>\n      <line id=\"svg_24\" y2=\"5.565119\" x2=\"6.749662\" y1=\"5.294761\" x1=\"7.624352\"/>\n      <line id=\"svg_25\" y2=\"5.994512\" x2=\"5.429675\" y1=\"5.533312\" x1=\"6.956407\"/>\n      <line id=\"svg_27\" y2=\"6.551133\" x2=\"4.284627\" y1=\"5.962706\" x1=\"5.572807\"/>\n      <line id=\"svg_28\" y2=\"7.584858\" x2=\"3.044158\" y1=\"6.392099\" x1=\"4.427758\"/>\n      <line id=\"svg_29\" y2=\"8.84123\" x2=\"2.185372\" y1=\"7.489437\" x1=\"3.219096\"/>\n      <line id=\"svg_31\" y2=\"10.606513\" x2=\"1.644654\" y1=\"8.602678\" x1=\"2.280792\"/>\n      <line id=\"svg_32\" y2=\"13.214679\" x2=\"1.48562\" y1=\"10.352058\" x1=\"1.724171\"/>\n      <line id=\"svg_33\" y2=\"14.375631\" x2=\"1.676461\" y1=\"12.992031\" x1=\"1.453813\"/>\n      <line id=\"svg_34\" y2=\"15.298031\" x2=\"2.264889\" y1=\"14.152983\" x1=\"1.517427\"/>\n      <line id=\"svg_35\" y2=\"16.172721\" x2=\"3.521261\" y1=\"14.948155\" x1=\"1.915013\"/>\n      <line id=\"svg_36\" y2=\"16.824762\" x2=\"5.207027\" y1=\"15.997783\" x1=\"3.28271\"/>\n      <line id=\"svg_38\" y2=\"17.063314\" x2=\"7.035924\" y1=\"16.745245\" x1=\"4.968475\"/>\n      <line id=\"svg_39\" y2=\"16.888376\" x2=\"9.278311\" y1=\"17.047411\" x1=\"6.733758\"/>\n      <line id=\"svg_40\" y2=\"16.284045\" x2=\"10.661911\" y1=\"16.983797\" x1=\"8.992048\"/>\n      <line id=\"svg_41\" y2=\"15.313934\" x2=\"11.647925\" y1=\"16.395369\" x1=\"10.455166\"/>\n      <line id=\"svg_44\" y2=\"13.898527\" x2=\"12.82478\" y1=\"15.425259\" x1=\"11.504794\"/>\n      <line id=\"svg_45\" y2=\"12.037824\" x2=\"14.144766\" y1=\"14.312017\" x1=\"12.522614\"/>
26590\n      <line id=\"svg_47\" y2=\"10.59061\" x2=\"14.605966\" y1=\"12.228665\" x1=\"13.953925\"/>\n      <ellipse ry=\"1\" rx=\"1\" id=\"svg_48\" cy=\"3.982726\" cx=\"13.460918\"/>\n    </g>", {
26591  viewBox: {
26592    x: 18,
26593    y: 18
26594  }
26595});
26596var lengthCursor = new _MouseCursor_js__WEBPACK_IMPORTED_MODULE_0__["default"]("<g id=\"length-group\" fill=\"none\" stroke-width=\"1\" stroke=\"ACTIVE_COLOR\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n    <path id=\"length-dashes\" d=\"m22.5,6 -16.5,16.5\" stroke-width=\"3\" stroke-dasharray=\"0.6666,5\" />\n  </g>", {
26597  viewBox: {
26598    x: 24,
26599    y: 24
26600  }
26601});
26602var probeCursor = new _MouseCursor_js__WEBPACK_IMPORTED_MODULE_0__["default"]("<path fill=\"ACTIVE_COLOR\" d=\"M1152 896q0 106-75 181t-181 75-181-75-75-181 75-181 181-75 181 75\n    75 181zm-256-544q-148 0-273 73t-198 198-73 273 73 273 198 198 273 73 273-73\n    198-198 73-273-73-273-198-198-273-73zm768 544q0 209-103 385.5t-279.5\n    279.5-385.5 103-385.5-103-279.5-279.5-103-385.5 103-385.5 279.5-279.5\n    385.5-103 385.5 103 279.5 279.5 103 385.5z\"\n  />", {
26603  viewBox: {
26604    x: 1792,
26605    y: 1792
26606  }
26607});
26608var rectangleRoiCursor = new _MouseCursor_js__WEBPACK_IMPORTED_MODULE_0__["default"]("<path fill=\"ACTIVE_COLOR\" d=\"M1312 256h-832q-66 0-113 47t-47 113v832q0 66 47\n    113t113 47h832q66 0 113-47t47-113v-832q0-66-47-113t-113-47zm288 160v832q0\n    119-84.5 203.5t-203.5 84.5h-832q-119 0-203.5-84.5t-84.5-203.5v-832q0-119\n    84.5-203.5t203.5-84.5h832q119 0 203.5 84.5t84.5 203.5z\"\n  />", {
26609  viewBox: {
26610    x: 1792,
26611    y: 1792
26612  }
26613});
26614var textMarkerCursor = new _MouseCursor_js__WEBPACK_IMPORTED_MODULE_0__["default"]("<path fill=\"ACTIVE_COLOR\" d=\"M789 559l-170 450q33 0 136.5 2t160.5 2q19 0\n    57-2-87-253-184-452zm-725 1105l2-79q23-7 56-12.5t57-10.5 49.5-14.5 44.5-29\n    31-50.5l237-616 280-724h128q8 14 11 21l205 480q33 78 106 257.5t114 274.5q15\n    34 58 144.5t72 168.5q20 45 35 57 19 15 88 29.5t84 20.5q6 38 6 57 0 5-.5\n    13.5t-.5 12.5q-63 0-190-8t-191-8q-76 0-215 7t-178 8q0-43 4-78l131-28q1 0\n    12.5-2.5t15.5-3.5 14.5-4.5 15-6.5 11-8 9-11\n    2.5-14q0-16-31-96.5t-72-177.5-42-100l-450-2q-26 58-76.5 195.5t-50.5 162.5q0\n    22 14 37.5t43.5 24.5 48.5 13.5 57 8.5 41 4q1 19 1 58 0 9-2 27-58\n    0-174.5-10t-174.5-10q-8 0-26.5 4t-21.5 4q-80 14-188 14z\"\n  />", {
26615  viewBox: {
26616    x: 1792,
26617    y: 1792
26618  }
26619});
26620var crosshairsCursor = new _MouseCursor_js__WEBPACK_IMPORTED_MODULE_0__["default"]("<path fill=\"ACTIVE_COLOR\" d=\"M1325 1024h-109q-26 0-45-19t-19-45v-128q0-26\n    19-45t45-19h109q-32-108-112.5-188.5t-188.5-112.5v109q0 26-19 45t-45\n    19h-128q-26 0-45-19t-19-45v-109q-108 32-188.5 112.5t-112.5 188.5h109q26\n    0 45 19t19 45v128q0 26-19 45t-45 19h-109q32 108 112.5 188.5t188.5\n    112.5v-109q0-26 19-45t45-19h128q26 0 45 19t19 45v109q108-32\n    188.5-112.5t112.5-188.5zm339-192v128q0 26-19 45t-45 19h-143q-37 161-154.5\n    278.5t-278.5 154.5v143q0 26-19 45t-45 19h-128q-26\n    0-45-19t-19-45v-143q-161-37-278.5-154.5t-154.5-278.5h-143q-26\n    0-45-19t-19-45v-128q0-26 19-45t45-19h143q37-161\n    154.5-278.5t278.5-154.5v-143q0-26 19-45t45-19h128q26 0 45 19t19 45v143q161\n    37 278.5 154.5t154.5 278.5h143q26 0 45 19t19 45z\"\n  />", {
26621  viewBox: {
26622    x: 1792,
26623    y: 1792
26624  }
26625});
26626var eraserCursor = new _MouseCursor_js__WEBPACK_IMPORTED_MODULE_0__["default"]("<path transform=\"translate(0,1792) scale(1,-1)\" fill=\"ACTIVE_COLOR\" d=\"M960 1408l336-384h-768l-336 384h768zm1013-1077q15\n      34 9.5 71.5t-30.5 65.5l-896 1024q-38 44-96 44h-768q-38\n      0-69.5-20.5t-47.5-54.5q-15-34-9.5-71.5t30.5-65.5l896-1024q38-44 96-44h768q38\n      0 69.5 20.5t47.5 54.5z\"\n    />", {
26627  viewBox: {
26628    x: 2048,
26629    y: 1792
26630  }
26631});
26632var magnifyCursor = new _MouseCursor_js__WEBPACK_IMPORTED_MODULE_0__["default"]("<path fill=\"ACTIVE_COLOR\" d=\"M508.5 481.6l-129-129c-2.3-2.3-5.3-3.5-8.5-3.5h-10.3C395\n      312 416 262.5 416 208 416 93.1 322.9 0 208 0S0 93.1 0 208s93.1 208 208 208c54.5\n      0 104-21 141.1-55.2V371c0 3.2 1.3 6.2 3.5 8.5l129 129c4.7 4.7 12.3 4.7 17\n      0l9.9-9.9c4.7-4.7 4.7-12.3 0-17zM208 384c-97.3 0-176-78.7-176-176S110.7 32 208\n      32s176 78.7 176 176-78.7 176-176 176z\"\n    />", {
26633  viewBox: {
26634    x: 512,
26635    y: 512
26636  }
26637});
26638var panCursor = new _MouseCursor_js__WEBPACK_IMPORTED_MODULE_0__["default"]("<path fill=\"ACTIVE_COLOR\" d=\"M1411 541l-355 355 355 355 144-144q29-31 70-14 39 17\n      39 59v448q0 26-19 45t-45 19h-448q-42 0-59-40-17-39 14-69l144-144-355-35
266385-355\n      355 144 144q31 30 14 69-17 40-59 40h-448q-26 0-45-19t-19-45v-448q0-42 40-59\n      39-17 69 14l144 144 355-355-355-355-144 144q-19 19-45 19-12\n      0-24-5-40-17-40-59v-448q0-26 19-45t45-19h448q42 0 59 40 17 39-14 69l-144\n      144 355 355 355-355-144-144q-31-30-14-69 17-40 59-40h448q26 0 45 19t19\n      45v448q0 42-39 59-13 5-25 5-26 0-45-19z\"\n    />", {
26639  viewBox: {
26640    x: 1792,
26641    y: 1792
26642  }
26643});
26644var rotateCursor = new _MouseCursor_js__WEBPACK_IMPORTED_MODULE_0__["default"]("<path fill=\"ACTIVE_COLOR\" d=\"M1664 256v448q0 26-19 45t-45 19h-448q-42 0-59-40-17-39\n      14-69l138-138q-148-137-349-137-104 0-198.5 40.5t-163.5 109.5-109.5\n      163.5-40.5 198.5 40.5 198.5 109.5 163.5 163.5 109.5 198.5 40.5q119 0\n      225-52t179-147q7-10 23-12 15 0 25 9l137 138q9 8 9.5 20.5t-7.5 22.5q-109\n      132-264 204.5t-327 72.5q-156 0-298-61t-245-164-164-245-61-298 61-298\n      164-245 245-164 298-61q147 0 284.5 55.5t244.5 156.5l130-129q29-31 70-14\n      39 17 39 59z\"\n    />", {
26645  viewBox: {
26646    x: 1792,
26647    y: 1792
26648  }
26649});
26650var stackScrollCursor = new _MouseCursor_js__WEBPACK_IMPORTED_MODULE_0__["default"]("<path fill=\"ACTIVE_COLOR\" d=\"M24 21v2c0 0.547-0.453 1-1 1h-22c-0.547\n      0-1-0.453-1-1v-2c0-0.547 0.453-1 1-1h22c0.547 0 1 0.453 1 1zM24 13v2c0\n      0.547-0.453 1-1 1h-22c-0.547 0-1-0.453-1-1v-2c0-0.547 0.453-1 1-1h22c0.547\n      0 1 0.453 1 1zM24 5v2c0 0.547-0.453 1-1 1h-22c-0.547\n      0-1-0.453-1-1v-2c0-0.547 0.453-1 1-1h22c0.547 0 1 0.453 1 1z\"\n      />", {
26651  viewBox: {
26652    x: 24,
26653    y: 28
26654  }
26655});
26656var wwwcRegionCursor = new _MouseCursor_js__WEBPACK_IMPORTED_MODULE_0__["default"]("<path fill=\"ACTIVE_COLOR\" d=\"M1664 416v960q0 119-84.5 203.5t-203.5 84.5h-960q-119\n    0-203.5-84.5t-84.5-203.5v-960q0-119 84.5-203.5t203.5-84.5h960q119 0 203.5\n    84.5t84.5 203.5z\"\n  />", {
26657  viewBox: {
26658    x: 1792,
26659    y: 1792
26660  }
26661});
26662var wwwcCursor = new _MouseCursor_js__WEBPACK_IMPORTED_MODULE_0__["default"]("<path fill=\"ACTIVE_COLOR\" d=\"M14.5,3.5 a1 1 0 0 1 -11,11 Z\" stroke=\"none\" opacity=\"0.8\" />\n    <circle cx=\"9\" cy=\"9\" r=\"8\" fill=\"none\" stroke-width=\"2\" stroke=\"ACTIVE_COLOR\" />", {
26663  viewBox: {
26664    x: 18,
26665    y: 18
26666  }
26667});
26668var zoomCursor = new _MouseCursor_js__WEBPACK_IMPORTED_MODULE_0__["default"]("<path fill=\"ACTIVE_COLOR\" d=\"M508.5 481.6l-129-129c-2.3-2.3-5.3-3.5-8.5-3.5h-10.3C395\n      312 416 262.5 416 208 416 93.1 322.9 0 208 0S0 93.1 0 208s93.1 208 208 208c54.5\n      0 104-21 141.1-55.2V371c0 3.2 1.3 6.2 3.5 8.5l129 129c4.7 4.7 12.3 4.7 17\n      0l9.9-9.9c4.7-4.7 4.7-12.3 0-17zM208 384c-97.3 0-176-78.7-176-176S110.7 32 208\n      32s176 78.7 176 176-78.7 176-176 176z\"\n    />\n    <path fill=\"ACTIVE_COLOR\" transform=\"scale(0.22,0.22) translate(1400,0)\" d=\"M1216\n      320q0 26-19 45t-45 19h-128v1024h128q26 0 45 19t19 45-19 45l-256 256q-19\n      19-45 19t-45-19l-256-256q-19-19-19-45t19-45 45-19h128v-1024h-128q-26\n      0-45-19t-19-45 19-45l256-256q19-19 45-19t45 19l256 256q19 19 19 45z\"\n    />", {
26669  viewBox: {
26670    x: 640,
26671    y: 512
26672  }
26673});
26674
26675/***/ }),
26676
26677/***/ "./tools/index.js":
26678/*!************************!*\
26679  !*** ./tools/index.js ***!
26680  \************************/
26681/*! exports provided: CrosshairsTool, DoubleTapFitToWindowTool, DragProbeTool, EraserTool, FreehandSculpterMouseTool, MagnifyTool, PanMultiTouchTool, PanTool, ReferenceLinesTool, RotateTool, RotateTouchTool, ScaleOverlayTool, StackScrollMouseWheelTool, StackScrollMultiTouchTool, StackScrollTool, WwwcRegionTool, WwwcTool, ZoomMouseWheelTool, ZoomTool, ZoomTouchPinchTool, default */
26682/***/ (function(module, __webpack_exports__, __webpack_require__) {
26683
26684"use strict";
26685__webpack_require__.r(__webpack_exports__);
26686/* harmony import */ var _CrosshairsTool_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./CrosshairsTool.js */ "./tools/CrosshairsTool.js");
26687/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "CrosshairsTool", function() { return _CrosshairsTool_js__WEBPACK_IMPORTED_MODULE_0__["default"]; });
26688
26689/* harmony import */ var _DoubleTapFitToWindowTool_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./DoubleTapFitToWindowTool.js */ "./tools/DoubleTapFitToWindowTool.js");
26690/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "DoubleTapFitToWindowTool", function() { return _DoubleTapFitToWindowTool_js__WEBPACK_IMPORTED_MODULE_1__["default"]; });
26691
26692/* harmony import */ var _DragProbeTool_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./DragProbeTool.js */ "./tools/DragProbeTool.js");
26693/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "DragProbeTool", function() { return _DragProbeTool_js__WEBPACK_IMPORTED_MODULE_2__["default"]; });
26694
26695/* harmony import */ var _EraserTool_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./EraserTool.js */ "./tools/EraserTool.js");
26696/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "EraserTool", function() { return _EraserTool_js__WEBPACK_IMPORTED_MODULE_3__["default"]; });
26697
26698/* harmony import */ var _FreehandSculpterMouseTool_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./FreehandSculpterMouseTool.js */ "./tools/FreehandSculpterMouseTool.js");
26699/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FreehandSculpterMouseTool", function() { return _FreehandSculpterMouseTool_js__WEBPACK_IMPORTED_MODULE_4__["default"]; });
26700
26701/* harmony import */ var _MagnifyTool_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./MagnifyTool.js */ "./tools/MagnifyTool.js");
26702/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "MagnifyTool", function() { return _MagnifyTool_js__WEBPACK_IMPORTED_MODULE_5__["default"]; });
26703
26704/* harmony import */ var _PanMultiTouchTool_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./PanMultiTouchTool.js */ "./tools/PanMultiTouchTool.js");
26705/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "PanMultiTouchTool", function() { return _PanMultiTouchTool_js__WEBPACK_IMPORTED_MODULE_6__["default"]; });
26706
26707/* harmony import */ var _PanTool_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./PanTool.js */ "./tools/PanTool.js");
26708/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "PanTool", function() { return _PanTool_js__WEBPACK_IMPORTED_MODULE_7__["default"]; });
26709
26710/* harmony import */ var _ReferenceLinesTool_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./ReferenceLinesTool.js */ "./tools/ReferenceLinesTool.js");
26711/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ReferenceLinesTool", function() { return _ReferenceLinesTool_js__WEBPACK_IMPORTED_MODULE_8__["default"]; });
26712
26713/* harmony import */ var _RotateTool_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./RotateTool.js */ "./tools/RotateTool.js");
26714/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "RotateTool", function() { return _RotateTool_js__WEBPACK_IMPORTED_MODULE_9__["default"]; });
26715
26716/* harmony import */ var _RotateTouchTool_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./RotateTouchTool.js */ "./tools/RotateTouchTool.js");
26717/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "RotateTouchTool", function() { return _RotateTouchTool_js__WEBPACK_IMPORTED_MODULE_10__["default"]; });
26718
26719/* harmony import */ var _ScaleOverlayTool_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./ScaleOverlayTool.js */ "./tools/ScaleOverlayTool.js");
26720/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ScaleOverlayTool", function() { return _ScaleOverlayTool_js__WEBPACK_IMPORTED_MODULE_11__["default"]; });
26721
26722/* harmony import */ var _StackScrollMouseWheelTool_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./StackScrollMouseWheelTool.js */ "./tools/StackScrollMouseWheelTool.js");
26723/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "StackScrollMouseWheelTool", function() { return _StackScrollMouseWheelTool_js__WEBPACK_IMPORTED_MODULE_12__["default"]; });
26724
26725/* harmony import */ var _StackScrollMultiTouchTool_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./StackScrollMultiTouchTool.js */ "./tools/StackScrollMultiTouchTool.js");
26726/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "StackScrollMultiTouchTool", function() { return _StackScrollMultiTouchTool_js__WEBPACK_IMPORTED_MODULE_13__["default"]; });
26727
26728/* harmony import */ var _StackScrollTool_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./StackScrollTool.js */ "./tools/StackScrollTool.js");
26729/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "StackScrollTool", function() { return _StackScrollTool_js__WEBPACK_IMPORTED_MODULE_14__["default"]; });
26730
26731/* harmony import */ var _WwwcRegionTool_js__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./WwwcRegionTool.js */ "./tools/WwwcRegionTool.js");
26732/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "WwwcRegionTool", function() { return _WwwcRegionTool_js__WEBPACK_IMPORTED_MODULE_15__["default"]; });
26733
26734/* harmony import */ var _WwwcTool_js__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./WwwcTool.js */ "./tools/WwwcTool.js");
26735/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "WwwcTool", function() { return _WwwcTool_js__WEBPACK_IMPORTED_MODULE_16__["default"]; });
26736
26737/* harmony import */ var _ZoomMouseWheelTool_js__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./ZoomMouseWheelTool.js */ "./tools/ZoomMouseWheelTool.js");
26738/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ZoomMouseWheelTool", function() { return _ZoomMouseWheelTool_js__WEBPACK_IMPORTED_MODULE_17__["default"]; });
26739
26740/* harmony import */ var _ZoomTool_js__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./ZoomTool.js */ "./tools/ZoomTool.js");
26741/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ZoomTool", function() { return _ZoomTool_js__WEBPACK_IMPORTED_MODULE_18__["default"]; });
26742
26743/* harmony import */ var _ZoomTouchPinchTool_js__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./ZoomTouchPinchTool.js */ "./tools/ZoomTouchPinchTool.js");
26744/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ZoomTouchPinchTool", function() { return _ZoomTouchPinchTool_js__WEBPACK_IMPORTED_MODULE_19__["default"]; });
26745
26746
26747
26748
26749
26750
26751
26752
26753
26754
26755
26756
26757
26758
26759
26760
26761
26762
26763
26764
26765 // Named Exports
26766
26767 // Namespace, default export
26768
26769/* harmony default export */ __webpack_exports__["default"] = ({
26770  CrosshairsTool: _CrosshairsTool_js__WEBPACK_IMPORTED_MODULE_0__["default"],
26771  DoubleTapFitToWindowTool: _DoubleTapFitToWindowTool_js__WEBPACK_IMPORTED_MODULE_1__["default"],
26772  DragProbeTool: _DragProbeTool_js__WEBPACK_IMPORTED_MODULE_2__["default"],
26773  EraserTool: _EraserTool_js__WEBPACK_IMPORTED_MODULE_3__["default"],
26774  FreehandSculpterMouseTool: _FreehandSculpterMouseTool_js__WEBPACK_IMPORTED_MODULE_4__["default"],
26775  MagnifyTool: _MagnifyTool_js__WEBPACK_IMPORTED_MODULE_5__["default"],
26776  PanMultiTouchTool: _PanMultiTouchTool_js__WEBPACK_IMPORTED_MODULE_6__["default"],
26777  PanTool: _PanTool_js__WEBPACK_IMPORTED_MODULE_7__["default"],
26778  ReferenceLinesTool: _ReferenceLinesTool_js__WEBPACK_IMPORTED_MODULE_8__["default"],
26779  RotateTool: _RotateTool_js__WEBPACK_IMPORTED_MODULE_9__["default"],
26780  RotateTouchTool: _RotateTouchTool_js__WEBPACK_IMPORTED_MODULE_10__["default"],
26781  ScaleOverlayTool: _ScaleOverlayTool_js__WEBPACK_IMPORTED_MODULE_11__["default"],
26782  StackScrollMouseWheelTool: _StackScrollMouseWheelTool_js__WEBPACK_IMPORTED_MODULE_12__["default"],
26783  StackScrollMultiTouchTool: _StackScrollMultiTouchTool_js__WEBPACK_IMPORTED_MODULE_13__["default"],
26784  StackScrollTool: _StackScrollTool_js__WEBPACK_IMPORTED_MODULE_14__["default"],
26785  WwwcRegionTool: _WwwcRegionTool_js__WEBPACK_IMPORTED_MODULE_15__["default"],
26786  WwwcTool: _WwwcTool_js__WEBPACK_IMPORTED_MODULE_16__["default"],
26787  ZoomMouseWheelTool: _ZoomMouseWheelTool_js__WEBPACK_IMPORTED_MODULE_17__["default"],
26788  ZoomTool: _ZoomTool_js__WEBPACK_IMPORTED_MODULE_18__["default"],
26789  ZoomTouchPinchTool: _ZoomTouchPinchTool_js__WEBPACK_IMPORTED_MODULE_19__["default"]
26790});
26791
26792/***/ }),
26793
26794/***/ "./tools/referenceLines/calculateReferenceLine.js":
26795/*!********************************************************!*\
26796  !*** ./tools/referenceLines/calculateReferenceLine.js ***!
26797  \********************************************************/
26798/*! exports provided: default */
26799/***/ (function(module, __webpack_exports__, __webpack_require__) {
26800
26801"use strict";
26802__webpack_require__.r(__webpack_exports__);
26803/* harmony import */ var _util_pointProjector_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../../util/pointProjector.js */ "./util/pointProjector.js");
26804
26805/**
26806 * Calculates a reference line between two planes by projecting the top left hand corner and bottom right hand corner
26807 * Of the reference image onto the target image.  Ideally we would calculate the intersection between the planes but
26808 * That requires a bit more math and this works fine for most cases.
26809 *
26810 * @export
26811 * @public
26812 * @method
26813 * @name calculateReferenceLine
26814 * @param  {Object} targetImagePlane    The imagePlane on which the reference line will be drawn.
26815 * @param  {Object} referenceImagePlane The imagePlane being referenced.
26816 * @returns {Object}  The start and end points of the line to be drawn.
26817 */
26818
26819/* harmony default export */ __webpack_exports__["default"] = (function (targetImagePlane, referenceImagePlane) {
26820  var points = Object(_util_pointProjector_js__WEBPACK_IMPORTED_MODULE_0__["planePlaneIntersection"])(targetImagePlane, referenceImagePlane);
26821
26822  if (!points) {
26823    return;
26824  }
26825
26826  return {
26827    start: Object(_util_pointProjector_js__WEBPACK_IMPORTED_MODULE_0__["projectPatientPointToImagePlane"])(points.start, targetImagePlane),
26828    end: Object(_util_pointProjector_js__WEBPACK_IMPORTED_MODULE_0__["projectPatientPointToImagePlane"])(points.end, targetImagePlane)
26829  };
26830});
26831
26832/***/ }),
26833
26834/***/ "./tools/referenceLines/renderActiveReferenceLine.js":
26835/*!***********************************************************!*\
26836  !*** ./tools/referenceLines/renderActiveReferenceLine.js ***!
26837  \***********************************************************/
26838/*! exports provided: default */
26839/***/ (function(module, __webpack_exports__, __webpack_require__) {
26840
26841"use strict";
26842__webpack_require__.r(__webpack_exports__);
26843/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../../externalModules.js */ "./externalModules.js");
26844/* harmony import */ var _calculateReferenceLine_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./calculateReferenceLine.js */ "./tools/referenceLines/calculateReferenceLine.js");
26845/* harmony import */ var _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./../../stateManagement/toolColors.js */ "./stateManagement/toolColors.js");
26846/* harmony import */ var _util_convertToVector3_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./../../util/convertToVector3.js */ "./util/convertToVector3.js");
26847/* harmony import */ var _drawing_index_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./../../drawing/index.js */ "./drawing/index.js");
26848
26849
26850
26851
26852
26853/**
26854 * Renders the active reference line.
26855 *
26856 * @export @public @method
26857 * @name renderActiveReferenceLine
26858 * @param  {Object} context        The canvas context.
26859 * @param  {Object} eventData      The data associated with the event.
26860 * @param  {HTMLElement} targetElement    The element on which to render the reference line.
26861 * @param  {HTMLElement} referenceElement The element referenced by the line.
26862 * @returns {void}
26863 */
26864
26865/* harmony default export */ __webpack_exports__["default"] = (function (context, eventData, targetElement, referenceElement) {
26866
26867  var cornerstone = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone;
26868  var targetImage = cornerstone.getEnabledElement(targetElement).image;
26869  var referenceImage = cornerstone.getEnabledElement(referenceElement).image; // Make sure the images are actually loaded for the target and reference
26870
26871  if (!targetImage || !referenceImage) {
26872    return;
26873  }
26874
26875  var targetImagePlane = cornerstone.metaData.get('imagePlaneModule', targetImage.imageId);
26876  var referenceImagePlane = cornerstone.metaData.get('imagePlaneModule', referenceImage.imageId); // Make sure the target and reference actually have image plane metadata
26877
26878  if (!targetImagePlane || !referenceImagePlane || !targetImagePlane.rowCosines || !targetImagePlane.columnCosines || !targetImagePlane.imagePositionPatient || !referenceImagePlane.rowCosines || !referenceImagePlane.columnCosines || !referenceImagePlane.imagePositionPatient) {
26879    return;
26880  } // The image planes must be in the same frame of reference
26881
26882
26883  //if (targetImagePlane.frameOfReferenceUID !== referenceImagePlane.frameOfReferenceUID) {
26884  //  return;
26885  //}
26886
26887  // if (targetImage.data.string('x0020000d') !== (referenceImage.data.string('x0020000d') )) {
26888  //   return;
26889  // }
26890
26891  targetImagePlane.rowCosines = Object(_util_convertToVector3_js__WEBPACK_IMPORTED_MODULE_3__["default"])(targetImagePlane.rowCosines);
26892  targetImagePlane.columnCosines = Object(_util_convertToVector3_js__WEBPACK_IMPORTED_MODULE_3__["default"])(targetImagePlane.columnCosines);
26893  targetImagePlane.imagePositionPatient = Object(_util_convertToVector3_js__WEBPACK_IMPORTED_MODULE_3__["default"])(targetImagePlane.imagePositionPatient);
26894  referenceImagePlane.rowCosines = Object(_util_convertToVector3_js__WEBPACK_IMPORTED_MODULE_3__["default"])(referenceImagePlane.rowCosines);
26895  referenceImagePlane.columnCosines = Object(_util_convertToVector3_js__WEBPACK_IMPORTED_MODULE_3__["default"])(referenceImagePlane.columnCosines);
26896  referenceImagePlane.imagePositionPatient = Object(_util_convertToVector3_js__WEBPACK_IMPORTED_MODULE_3__["default"])(referenceImagePlane.imagePositionPatient); // The image plane normals must be > 30 degrees apart
26897
26898  var targetNormal = targetImagePlane.rowCosines.clone().cross(targetImagePlane.columnCosines);
26899  var referenceNormal = referenceImagePlane.rowCosines.clone().cross(referenceImagePlane.columnCosines);
26900  var angleInRadians = targetNormal.angleTo(referenceNormal);
26901  angleInRadians = Math.abs(angleInRadians);
26902
26903  if (angleInRadians < 0.5) {
26904    // 0.5 radians = ~30 degrees
26905    return;
26906  }
26907
26908  var referenceLine = Object(_calculateReferenceLine_js__WEBPACK_IMPORTED_MODULE_1__["default"])(targetImagePlane, referenceImagePlane);
26909
26910  if (!referenceLine) {
26911    return;
26912  }
26913
26914  var color = _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_2__["default"].getActiveColor(); // Draw the referenceLines
26915
26916  context.setTransform(1, 0, 0, 1, 0, 0);
26917  Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_4__["draw"])(context, function (context) {
26918    Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_4__["drawLine"])(context, eventData.element, referenceLine.start, referenceLine.end, {
26919      color: color
26920    });
26921  });
26922});
26923
26924/***/ }),
26925
26926/***/ "./util/SaveAs.js":
26927/*!************************!*\
26928  !*** ./util/SaveAs.js ***!
26929  \************************/
26930/*! exports provided: default */
26931/***/ (function(module, __webpack_exports__, __webpack_require__) {
26932
26933"use strict";
26934__webpack_require__.r(__webpack_exports__);
26935/**
26936 * Exports an image of the canvas.
26937 * @export @public @method
26938 * @name saveAs
26939 *
26940 * @param {HTMLElement} element The element to export.
26941 * @param {string} filename The name of the exported image.
26942 * @param {string} [mimetype = 'image/png'] The mimetype of the exported image.
26943 * @returns {void}
26944 */
26945/* harmony default export */ __webpack_exports__["default"] = (function (element, filename) {
26946  var mimetype = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'image/png';
26947  var canvas = element.querySelector('canvas'); // If we are using IE, use canvas.msToBlob
26948
26949  if (canvas.msToBlob) {
26950    var blob = canvas.msToBlob();
26951    return window.navigator.msSaveBlob(blob, filename);
26952  } // Thanks to Ken Fyrstenber
26953  // http://stackoverflow.com/questions/18480474/how-to-save-an-image-from-canvas
26954
26955
26956  var lnk = document.createElement('a'); // The key here is to set the download attribute of the a tag
26957
26958  lnk.download = filename; // Convert canvas content to data-uri for link. When download
26959  // Attribute is set the content pointed to by link will be
26960  // Pushed as 'download' in HTML5 capable browsers
26961
26962  lnk.href = canvas.toDataURL(mimetype, 1); // Create a 'fake' click-event to trigger the download
26963
26964  if (document.createEvent) {
26965    var e = document.createEvent('MouseEvents');
26966    e.initMouseEvent('click', true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
26967    lnk.dispatchEvent(e);
26968  } else if (lnk.fireEvent) {
26969    lnk.fireEvent('onclick');
26970  }
26971});
26972
26973/***/ }),
26974
26975/***/ "./util/angleBetweenPoints.js":
26976/*!************************************!*\
26977  !*** ./util/angleBetweenPoints.js ***!
26978  \************************************/
26979/*! exports provided: default */
26980/***/ (function(module, __webpack_exports__, __webpack_require__) {
26981
26982"use strict";
26983__webpack_require__.r(__webpack_exports__);
26984/**
26985 * Calculates the (interior) angle in degrees from the initial mouse location
26986 * to the current mouse location in relation to the center point.
26987 * @public
26988 * @function angleBetweenPoints
26989 *
26990 * @param  {Object} p0  The center point.
26991 * @param  {Object} p1  The initial point.
26992 * @param  {Object} p2  The final point.
26993 * @returns {Object} { angle, direction }
26994 */
26995/* harmony default export */ __webpack_exports__["default"] = (function (p0, p1, p2) {
26996  var p12 = Math.sqrt(Math.pow(p0.x - p1.x, 2) + Math.pow(p0.y - p1.y, 2));
26997  var p13 = Math.sqrt(Math.pow(p0.x - p2.x, 2) + Math.pow(p0.y - p2.y, 2));
26998  var p23 = Math.sqrt(Math.pow(p1.x - p2.x, 2) + Math.pow(p1.y - p2.y, 2));
26999  var angle = Math.acos((Math.pow(p12, 2) + Math.pow(p13, 2) - Math.pow(p23, 2)) / (2 * p12 * p13)) * 180 / Math.PI; // The direction of the angle (> 0 clockwise, < 0 anti-clockwise)
27000
27001  var direction = (p1.x - p0.x) * (p2.y - p0.y) - (p1.y - p0.y) * (p2.x - p0.x);
27002  return {
27003    angle: angle,
27004    direction: direction
27005  };
27006});
27007
27008/***/ }),
27009
27010/***/ "./util/brush/drawBrush.js":
27011/*!*********************************!*\
27012  !*** ./util/brush/drawBrush.js ***!
27013  \*********************************/
27014/*! exports provided: drawBrushPixels, drawBrushOnCanvas */
27015/***/ (function(module, __webpack_exports__, __webpack_require__) {
27016
27017"use strict";
27018__webpack_require__.r(__webpack_exports__);
27019/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "drawBrushPixels", function() { return drawBrushPixels; });
27020/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "drawBrushOnCanvas", function() { return drawBrushOnCanvas; });
27021/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../externalModules.js */ "./externalModules.js");
27022/* harmony import */ var _drawing_index_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../drawing/index.js */ "./drawing/index.js");
27023
27024
27025/**
27026 * Fills in the brush mask data with new data.
27027 * @export @public @method
27028 * @name drawBrushPixels
27029 *
27030 * @param  {Object[]} pointerArray        The array of points to draw.
27031 * @param  {number[]} toolData            The cornerstoneTools annotation to modify.
27032 * @param  {number} columns               The number of columns in the mask.
27033 * @param  {boolean} [shouldErase = false] If true the modified mask pixels will be set to 0, rather than 1.
27034 * @returns {void}
27035 */
27036
27037function drawBrushPixels(pointerArray, toolData, columns) {
27038  var shouldErase = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
27039
27040  var getPixelIndex = function getPixelIndex(x, y) {
27041    return y * columns + x;
27042  };
27043
27044  var pixelData = toolData.pixelData;
27045  pointerArray.forEach(function (point) {
27046    var spIndex = getPixelIndex(point[0], point[1]);
27047    pixelData[spIndex] = shouldErase ? 0 : 1;
27048  }); // If Erased the last pixel, delete the pixelData array.
27049
27050  if (shouldErase && !pixelData.some(function (element) {
27051    return element !== 0;
27052  })) {
27053    delete toolData.pixelData;
27054  }
27055}
27056/**
27057 * Draws the brush data to the canvas.
27058 * @export @public @method
27059 *
27060 * @param  {Object[]} pointerArray Array of points to draw.
27061 * @param  {Object} context      The canvas context.
27062 * @param  {string} color        The color to draw the pixels.
27063 * @param  {HTMLElement} element      The element on which the canvas resides.
27064 * @returns {void}
27065 */
27066
27067
27068function drawBrushOnCanvas(pointerArray, context, color, element) {
27069  var canvasPtTL = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.pixelToCanvas(element, {
27070    x: 0,
27071    y: 0
27072  });
27073  var canvasPtBR = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.pixelToCanvas(element, {
27074    x: 1,
27075    y: 1
27076  });
27077  var sizeX = canvasPtBR.x - canvasPtTL.x;
27078  var sizeY = canvasPtBR.y - canvasPtTL.y;
27079  Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_1__["draw"])(context, function (context) {
27080    pointerArray.forEach(function (point) {
27081      var canvasPt = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.pixelToCanvas(element, {
27082        x: point[0],
27083        y: point[1]
27084      });
27085      var boundingBox = {
27086        left: canvasPt.x,
27087        top: canvasPt.y,
27088        width: sizeX,
27089        height: sizeY
27090      };
27091      Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_1__["fillBox"])(context, boundingBox, color);
27092    });
27093  });
27094}
27095
27096
27097
27098/***/ }),
27099
27100/***/ "./util/brush/getCircle.js":
27101/*!*********************************!*\
27102  !*** ./util/brush/getCircle.js ***!
27103  \*********************************/
27104/*! exports provided: default */
27105/***/ (function(module, __webpack_exports__, __webpack_require__) {
27106
27107"use strict";
27108__webpack_require__.r(__webpack_exports__);
27109/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return getCircle; });
27110/**
27111 * Gets the pixels within the circle.
27112 * @export @public @method
27113 * @name getCircle
27114 *
27115 * @param  {number} radius     The radius of the circle.
27116 * @param  {number} rows       The number of rows.
27117 * @param  {number} columns    The number of columns.
27118 * @param  {number} [xCoord = 0] The x-location of the center of the circle.
27119 * @param  {number} [yCoord = 0] The y-location of the center of the circle.
27120 * @returns {Array.number[]}        Array of pixels contained within the circle.
27121 */
27122function getCircle(radius, rows, columns) {
27123  var xCoord = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0;
27124  var yCoord = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 0;
27125  var x0 = Math.floor(xCoord);
27126  var y0 = Math.floor(yCoord);
27127
27128  if (radius === 1) {
27129    return [[x0, y0]];
27130  }
27131
27132  var circleArray = [];
27133  var index = 0;
27134
27135  for (var y = -radius; y <= radius; y++) {
27136    var _yCoord = y0 + y;
27137
27138    if (_yCoord > rows || _yCoord < 0) {
27139      continue;
27140    }
27141
27142    for (var x = -radius; x <= radius; x++) {
27143      var _xCoord = x0 + x;
27144
27145      if (_xCoord >= columns || _xCoord < 0) {
27146        continue;
27147      }
27148
27149      if (x * x + y * y < radius * radius) {
27150        circleArray[index++] = [x0 + x, y0 + y];
27151      }
27152    }
27153  }
27154
27155  return circleArray;
27156}
27157
27158/***/ }),
27159
27160/***/ "./util/brush/index.js":
27161/*!*****************************!*\
27162  !*** ./util/brush/index.js ***!
27163  \*****************************/
27164/*! exports provided: default */
27165/***/ (function(module, __webpack_exports__, __webpack_require__) {
27166
27167"use strict";
27168__webpack_require__.r(__webpack_exports__);
27169/* harmony import */ var _drawBrush_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./drawBrush.js */ "./util/brush/drawBrush.js");
27170/* harmony import */ var _getCircle_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./getCircle.js */ "./util/brush/getCircle.js");
27171
27172
27173/* harmony default export */ __webpack_exports__["default"] = ({
27174  drawBrushPixels: _drawBrush_js__WEBPACK_IMPORTED_MODULE_0__["drawBrushPixels"],
27175  drawBrushOnCanvas: _drawBrush_js__WEBPACK_IMPORTED_MODULE_0__["drawBrushOnCanvas"],
27176  getCircle: _getCircle_js__WEBPACK_IMPORTED_MODULE_1__["default"]
27177});
27178
27179/***/ }),
27180
27181/***/ "./util/calculateSUV.js":
27182/*!******************************!*\
27183  !*** ./util/calculateSUV.js ***!
27184  \******************************/
27185/*! exports provided: default */
27186/***/ (function(module, __webpack_exports__, __webpack_require__) {
27187
27188"use strict";
27189__webpack_require__.r(__webpack_exports__);
27190/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js");
27191
27192/**
27193 * Calculates a Standardized Uptake Value.
27194 * @export @public @method
27195 * @name calculateSUV
27196 *
27197 * @param  {Object} image            The image.
27198 * @param  {number} storedPixelValue The raw pixel value.
27199 * @param  {bool} [skipRescale=fale]
27200 * @returns {number}                  The SUV.
27201 */
27202
27203/* harmony default export */ __webpack_exports__["default"] = (function (image, storedPixelValue) {
27204  var skipRescale = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
27205  var cornerstone = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone;
27206  var patientStudyModule = cornerstone.metaData.get('patientStudyModule', image.imageId);
27207  var seriesModule = cornerstone.metaData.get('generalSeriesModule', image.imageId);
27208
27209  if (!patientStudyModule || !seriesModule) {
27210    return;
27211  }
27212
27213  var modality = seriesModule.modality; // Image must be PET
27214
27215  if (modality !== 'PT') {
27216    return;
27217  }
27218
27219  var modalityPixelValue = skipRescale ? storedPixelValue : storedPixelValue * image.slope + image.intercept;
27220  var patientWeight = patientStudyModule.patientWeight; // In kg
27221
27222  if (!patientWeight) {
27223    return;
27224  }
27225
27226  var petSequenceModule = cornerstone.metaData.get('petIsotopeModule', image.imageId);
27227
27228  if (!petSequenceModule) {
27229    return;
27230  }
27231
27232  var radiopharmaceuticalInfo = petSequenceModule.radiopharmaceuticalInfo;
27233  var startTime = radiopharmaceuticalInfo.radiopharmaceuticalStartTime;
27234  var totalDose = radiopharmaceuticalInfo.radionuclideTotalDose;
27235  var halfLife = radiopharmaceuticalInfo.radionuclideHalfLife;
27236  var seriesAcquisitionTime = seriesModule.seriesTime;
27237
27238  if (!startTime || !totalDose || !halfLife || !seriesAcquisitionTime) {
27239    return;
27240  }
27241
27242  var acquisitionTimeInSeconds = fracToDec(seriesAcquisitionTime.fractionalSeconds || 0) + seriesAcquisitionTime.seconds + seriesAcquisitionTime.minutes * 60 + seriesAcquisitionTime.hours * 60 * 60;
27243  var injectionStartTimeInSeconds = fracToDec(startTime.fractionalSeconds) + startTime.seconds + startTime.minutes * 60 + startTime.hours * 60 * 60;
27244  var durationInSeconds = acquisitionTimeInSeconds - injectionStartTimeInSeconds;
27245  var correctedDose = totalDose * Math.exp(-durationInSeconds * Math.log(2) / halfLife);
27246  var suv = modalityPixelValue * patientWeight / correctedDose * 1000;
27247  return suv;
27248});
27249/**
27250 * Returns a decimal value given a fractional value.
27251 * @private
27252 * @method
27253 * @name fracToDec
27254 *
27255 * @param  {number} fractionalValue The value to convert.
27256 * @returns {number}                 The value converted to decimal.
27257 */
27258
27259function fracToDec(fractionalValue) {
27260  return parseFloat(".".concat(fractionalValue));
27261}
27262
27263/***/ }),
27264
27265/***/ "./util/clip.js":
27266/*!**********************!*\
27267  !*** ./util/clip.js ***!
27268  \**********************/
27269/*! exports provided: default, clipToBox */
27270/***/ (function(module, __webpack_exports__, __webpack_require__) {
27271
27272"use strict";
27273__webpack_require__.r(__webpack_exports__);
27274/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return clip; });
27275/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "clipToBox", function() { return clipToBox; });
27276/**
27277 * Clips a value to an upper and lower bound.
27278 * @export @public @method
27279 * @name clip
27280 *
27281 * @param  {number} val  The value to clip.
27282 * @param  {number} low  The lower bound.
27283 * @param  {number} high The upper bound.
27284 * @returns {number}      The clipped value.
27285 */
27286function clip(val, low, high) {
27287  return Math.min(Math.max(low, val), high);
27288}
27289/**
27290 * Clips a value within a box.
27291 * @export @public @method
27292 * @name clipToBox
27293 *
27294 * @param  {Object} point The point to clip
27295 * @param  {Object} box   The bounding box to clip to.
27296 * @returns {Object}       The clipped point.
27297 */
27298
27299function clipToBox(point, box) {
27300  // Clip an {x, y} point to a box of size {width, height}
27301  point.x = clip(point.x, 0, box.width);
27302  point.y = clip(point.y, 0, box.height);
27303}
27304
27305/***/ }),
27306
27307/***/ "./util/convertToVector3.js":
27308/*!**********************************!*\
27309  !*** ./util/convertToVector3.js ***!
27310  \**********************************/
27311/*! exports provided: default */
27312/***/ (function(module, __webpack_exports__, __webpack_require__) {
27313
27314"use strict";
27315__webpack_require__.r(__webpack_exports__);
27316/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return convertToVector3; });
27317/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js");
27318
27319/**
27320 * Convert an Array to a cornerstoneMath.Vector3
27321 * @export @public @method
27322 * @name convertToVector3
27323 *
27324 * @param {Array|cornerstoneMath.Vector3} arrayOrVector3 Input array or Vector3
27325 * @returns {cornerstoneMath.Vector3}
27326 */
27327
27328function convertToVector3(arrayOrVector3) {
27329  var cornerstoneMath = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstoneMath;
27330
27331  if (arrayOrVector3 instanceof cornerstoneMath.Vector3) {
27332    return arrayOrVector3;
27333  }
27334
27335  return new cornerstoneMath.Vector3(arrayOrVector3[0], arrayOrVector3[1], arrayOrVector3[2]);
27336}
27337
27338/***/ }),
27339
27340/***/ "./util/copyPoints.js":
27341/*!****************************!*\
27342  !*** ./util/copyPoints.js ***!
27343  \****************************/
27344/*! exports provided: default */
27345/***/ (function(module, __webpack_exports__, __webpack_require__) {
27346
27347"use strict";
27348__webpack_require__.r(__webpack_exports__);
27349/**
27350 * Returns a copy of the points object.
27351 * @public
27352 * @function copyPoints
27353 *
27354 * @param  {Object} points - The object to copy.
27355 * @returns {Object} - The copy.
27356 */
27357/* harmony default export */ __webpack_exports__["default"] = (function (points) {
27358  var page = _copy(points.page);
27359
27360  var image = _copy(points.image);
27361
27362  var client = _copy(points.client);
27363
27364  var canvas = _copy(points.canvas);
27365
27366  return {
27367    page: page,
27368    image: image,
27369    client: client,
27370    canvas: canvas
27371  };
27372});
27373/**
27374 *
27375 * @private
27376 * @function _copy
27377 *
27378 * @param {Object} point - { x, y }
27379 * @returns {Object} { x, y }
27380 */
27381
27382function _copy() {
27383  var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
27384      x = _ref.x,
27385      y = _ref.y;
27386
27387  return {
27388    x: x,
27389    y: y
27390  };
27391}
27392
27393/***/ }),
27394
27395/***/ "./util/debounce.js":
27396/*!**************************!*\
27397  !*** ./util/debounce.js ***!
27398  \**************************/
27399/*! exports provided: default */
27400/***/ (function(module, __webpack_exports__, __webpack_require__) {
27401
27402"use strict";
27403__webpack_require__.r(__webpack_exports__);
27404/* harmony import */ var _isObject_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./isObject.js */ "./util/isObject.js");
27405
27406/**
27407 * Creates a debounced function that delays invoking `func` until after `wait`
27408 * milliseconds have elapsed since the last time the debounced function was
27409 * invoked, or until the next browser frame is drawn. The debounced function
27410 * comes with a `cancel` method to cancel delayed `func` invocations and a
27411 * `flush` method to immediately invoke them. Provide `options` to indicate
27412 * whether `func` should be invoked on the leading and/or trailing edge of the
27413 * `wait` timeout. The `func` is invoked with the last arguments provided to the
27414 * debounced function. Subsequent calls to the debounced function return the
27415 * result of the last `func` invocation.
27416 *
27417 * **Note:** If `leading` and `trailing` options are `true`, `func` is
27418 * invoked on the trailing edge of the timeout only if the debounced function
27419 * is invoked more than once during the `wait` timeout.
27420 *
27421 * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
27422 * until the next tick, similar to `setTimeout` with a timeout of `0`.
27423 *
27424 * If `wait` is omitted in an environment with `requestAnimationFrame`, `func`
27425 * invocation will be deferred until the next frame is drawn (typically about
27426 * 16ms).
27427 *
27428 * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
27429 * for details over the differences between `debounce` and `throttle`.
27430 *
27431 * @since 0.1.0
27432 * @category Function
27433 * @param {Function} func The function to debounce.
27434 * @param {number} [wait=0]
27435 *  The number of milliseconds to delay; if omitted, `requestAnimationFrame` is
27436 *  used (if available).
27437 * @param {Object} [options={}] The options object.
27438 * @param {boolean} [options.leading=false]
27439 *  Specify invoking on the leading edge of the timeout.
27440 * @param {number} [options.maxWait]
27441 *  The maximum time `func` is allowed to be delayed before it's invoked.
27442 * @param {boolean} [options.trailing=true]
27443 *  Specify invoking on the trailing edge of the timeout.
27444 * @returns {Function} Returns the new debounced function.
27445 * @example
27446 *
27447 * // Avoid costly calculations while the window size is in flux.
27448 * jQuery(window).on('resize', debounce(calculateLayout, 150))
27449 *
27450 * // Invoke `sendMail` when clicked, debouncing subsequent calls.
27451 * jQuery(element).on('click', debounce(sendMail, 300, {
27452 *   'leading': true,
27453 *   'trailing': false
27454 * }))
27455 *
27456 * // Ensure `batchLog` is invoked once after 1 second of debounced calls.
27457 * const debounced = debounce(batchLog, 250, { 'maxWait': 1000 })
27458 * const source = new EventSource('/stream')
27459 * jQuery(source).on('message', debounced)
27460 *
27461 * // Cancel the trailing debounced invocation.
27462 * jQuery(window).on('popstate', debounced.cancel)
27463 *
27464 * // Check for pending invocations.
27465 * const status = debounced.pending() ? "Pending..." : "Ready"
27466 */
27467
27468function debounce(func, wait, options) {
27469  var lastArgs, lastThis, maxWait, result, timerId, lastCallTime;
27470  var lastInvokeTime = 0;
27471  var leading = false;
27472  var maxing = false;
27473  var trailing = true; // Bypass `requestAnimationFrame` by explicitly setting `wait=0`.
27474
27475  var useRAF = !wait && wait !== 0 && typeof window.requestAnimationFrame === 'function';
27476
27477  if (typeof func !== 'function') {
27478    throw new TypeError('Expected a function');
27479  }
27480
27481  wait = Number(wait) || 0;
27482
27483  if (Object(_isObject_js__WEBPACK_IMPORTED_MODULE_0__["default"])(options)) {
27484    leading = Boolean(options.leading);
27485    maxing = 'maxWait' in options;
27486    maxWait = maxing ? Math.max(Number(options.maxWait) || 0, wait) : maxWait;
27487    trailing = 'trailing' in options ? Boolean(options.trailing) : trailing;
27488  }
27489
27490  function invokeFunc(time) {
27491    var args = lastArgs;
27492    var thisArg = lastThis;
27493    lastArgs = lastThis = undefined;
27494    lastInvokeTime = time;
27495    result = func.apply(thisArg, args);
27496    return result;
27497  }
27498
27499  function startTimer(pendingFunc, wait) {
27500    if (useRAF) {
27501      return window.requestAnimationFrame(pendingFunc);
27502    }
27503
27504    return setTimeout(pendingFunc, wait);
27505  }
27506
27507  function cancelTimer(id) {
27508    if (useRAF) {
27509      return window.cancelAnimationFrame(id);
27510    }
27511
27512    clearTimeout(id);
27513  }
27514
27515  function leadingEdge(time) {
27516    // Reset any `maxWait` timer.
27517    lastInvokeTime = time; // Start the timer for the trailing edge.
27518
27519    timerId = startTimer(timerExpired, wait); // Invoke the leading edge.
27520
27521    return leading ? invokeFunc(time) : result;
27522  }
27523
27524  function remainingWait(time) {
27525    var timeSinceLastCall = time - lastCallTime;
27526    var timeSinceLastInvoke = time - lastInvokeTime;
27527    var timeWaiting = wait - timeSinceLastCall;
27528    return maxing ? Math.min(timeWaiting, maxWait - timeSinceLastInvoke) : timeWaiting;
27529  }
27530
27531  function shouldInvoke(time) {
27532    var timeSinceLastCall = time - lastCallTime;
27533    var timeSinceLastInvoke = time - lastInvokeTime; // Either this is the first call, activity has stopped and we're at the
27534    // trailing edge, the system time has gone backwards and we're treating
27535    // it as the trailing edge, or we've hit the `maxWait` limit.
27536
27537    return lastCallTime === undefined || timeSinceLastCall >= wait || timeSinceLastCall < 0 || maxing && timeSinceLastInvoke >= maxWait;
27538  }
27539
27540  function timerExpired() {
27541    var time = Date.now();
27542
27543    if (shouldInvoke(time)) {
27544      return trailingEdge(time);
27545    } // Restart the timer.
27546
27547
27548    timerId = startTimer(timerExpired, remainingWait(time));
27549  }
27550
27551  function trailingEdge(time) {
27552    timerId = undefined; // Only invoke if we have `lastArgs` which means `func` has been
27553    // debounced at least once.
27554
27555    if (trailing && lastArgs) {
27556      return invokeFunc(time);
27557    }
27558
27559    lastArgs = lastThis = undefined;
27560    return result;
27561  }
27562
27563  function cancel() {
27564    if (timerId !== undefined) {
27565      cancelTimer(timerId);
27566    }
27567
27568    lastInvokeTime = 0;
27569    lastArgs = lastCallTime = lastThis = timerId = undefined;
27570  }
27571
27572  function flush() {
27573    return timerId === undefined ? result : trailingEdge(Date.now());
27574  }
27575
27576  function pending() {
27577    return timerId !== undefined;
27578  }
27579
27580  function debounced() {
27581    var time = Date.now();
27582    var isInvoking = shouldInvoke(time);
27583
27584    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
27585      args[_key] = arguments[_key];
27586    }
27587
27588    lastArgs = args;
27589    lastThis = this; // eslint-disable-line consistent-this
27590
27591    lastCallTime = time;
27592
27593    if (isInvoking) {
27594      if (timerId === undefined) {
27595        return leadingEdge(lastCallTime);
27596      }
27597
27598      if (maxing) {
27599        // Handle invocations in a tight loop.
27600        timerId = startTimer(timerExpired, wait);
27601        return invokeFunc(lastCallTime);
27602      }
27603    }
27604
27605    if (timerId === undefined) {
27606      timerId = startTimer(timerExpired, wait);
27607    }
27608
27609    return result;
27610  }
27611
27612  debounced.cancel = cancel;
27613  debounced.flush = flush;
27614  debounced.pending = pending;
27615  return debounced;
27616}
27617
27618/* harmony default export */ __webpack_exports__["default"] = (debounce);
27619
27620/***/ }),
27621
27622/***/ "./util/deepmerge.js":
27623/*!***************************!*\
27624  !*** ./util/deepmerge.js ***!
27625  \***************************/
27626/*! exports provided: default */
27627/***/ (function(module, __webpack_exports__, __webpack_require__) {
27628
27629"use strict";
27630__webpack_require__.r(__webpack_exports__);
27631/* harmony import */ var _babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/typeof */ "../node_modules/@babel/runtime/helpers/typeof.js");
27632/* harmony import */ var _babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0__);
27633
27634
27635var isMergeableObject = function isMergeableObject(val) {
27636  var nonNullObject = val && _babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0___default()(val) === 'object';
27637  return nonNullObject && Object.prototype.toString.call(val) !== '[object RegExp]' && Object.prototype.toString.call(val) !== '[object Date]';
27638};
27639
27640var emptyTarget = function emptyTarget(val) {
27641  return Array.isArray(val) ? [] : {};
27642};
27643
27644var cloneIfNecessary = function cloneIfNecessary(value, optionsArgument) {
27645  var clone = optionsArgument && optionsArgument.clone === true;
27646  return clone && isMergeableObject(value) ? deepmerge(emptyTarget(value), value, optionsArgument) : value;
27647};
27648
27649var defaultArrayMerge = function defaultArrayMerge(target, source, optionsArgument) {
27650  var destination = target.slice();
27651  source.forEach(function (e, i) {
27652    if (typeof destination[i] === 'undefined') {
27653      destination[i] = cloneIfNecessary(e, optionsArgument);
27654    } else if (isMergeableObject(e)) {
27655      destination[i] = deepmerge(target[i], e, optionsArgument);
27656    } else if (target.indexOf(e) === -1) {
27657      destination.push(cloneIfNecessary(e, optionsArgument));
27658    }
27659  });
27660  return destination;
27661};
27662
27663var mergeObject = function mergeObject(target, source, optionsArgument) {
27664  var destination = {};
27665
27666  if (isMergeableObject(target)) {
27667    Object.keys(target).forEach(function (key) {
27668      destination[key] = cloneIfNecessary(target[key], optionsArgument);
27669    });
27670  }
27671
27672  Object.keys(source).forEach(function (key) {
27673    if (!isMergeableObject(source[key]) || !target[key]) {
27674      destination[key] = cloneIfNecessary(source[key], optionsArgument);
27675    } else {
27676      destination[key] = deepmerge(target[key], source[key], optionsArgument);
27677    }
27678  });
27679  return destination;
27680};
27681
27682var deepmerge = function deepmerge() {
27683  var target = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
27684  var source = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
27685  var optionsArgument = arguments.length > 2 ? arguments[2] : undefined;
27686  var array = Array.isArray(source);
27687  var options = optionsArgument || {
27688    arrayMerge: defaultArrayMerge
27689  };
27690  var arrayMerge = options.arrayMerge || defaultArrayMerge;
27691
27692  if (array) {
27693    return Array.isArray(target) ? arrayMerge(target, source, optionsArgument) : cloneIfNecessary(source, optionsArgument);
27694  }
27695
27696  return mergeObject(target, source, optionsArgument);
27697};
27698
27699/* harmony default export */ __webpack_exports__["default"] = (deepmerge);
27700
27701/***/ }),
27702
27703/***/ "./util/ellipse/calculateEllipseStatistics.js":
27704/*!****************************************************!*\
27705  !*** ./util/ellipse/calculateEllipseStatistics.js ***!
27706  \****************************************************/
27707/*! exports provided: default */
27708/***/ (function(module, __webpack_exports__, __webpack_require__) {
27709
27710"use strict";
27711__webpack_require__.r(__webpack_exports__);
27712/* harmony import */ var _pointInEllipse_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./pointInEllipse.js */ "./util/ellipse/pointInEllipse.js");
27713
27714/**
27715 * Calculates the statistics of an elliptical region of interest.
27716 *
27717 * @private
27718 * @function calculateEllipseStatistics
27719 *
27720 * @param {number[]} sp - Array of the image data's pixel values.
27721 * @param {Object} ellipse - { top, left, height, width } - An object describing the ellipse.
27722 * @returns {Object} { count, mean, variance, stdDev, min, max }
27723 */
27724
27725/* harmony default export */ __webpack_exports__["default"] = (function (sp, ellipse) {
27726  var sum = 0;
27727  var sumSquared = 0;
27728  var count = 0;
27729  var index = 0;
27730  var min = null;
27731  var max = null;
27732
27733  for (var y = ellipse.top; y < ellipse.top + ellipse.height; y++) {
27734    for (var x = ellipse.left; x < ellipse.left + ellipse.width; x++) {
27735      var point = {
27736        x: x,
27737        y: y
27738      };
27739
27740      if (Object(_pointInEllipse_js__WEBPACK_IMPORTED_MODULE_0__["default"])(ellipse, point)) {
27741        if (min === null) {
27742          min = sp[index];
27743          max = sp[index];
27744        }
27745
27746        sum += sp[index];
27747        sumSquared += sp[index] * sp[index];
27748        min = Math.min(min, sp[index]);
27749        max = Math.max(max, sp[index]);
27750        count++;
27751      }
27752
27753      index++;
27754    }
27755  }
27756
27757  if (count === 0) {
27758    return {
27759      count: count,
27760      mean: 0.0,
27761      variance: 0.0,
27762      stdDev: 0.0,
27763      min: 0.0,
27764      max: 0.0
27765    };
27766  }
27767
27768  var mean = sum / count;
27769  var variance = sumSquared / count - mean * mean;
27770  return {
27771    count: count,
27772    mean: mean,
27773    variance: variance,
27774    stdDev: Math.sqrt(variance),
27775    min: min,
27776    max: max
27777  };
27778});
27779
27780/***/ }),
27781
27782/***/ "./util/ellipse/index.js":
27783/*!*******************************!*\
27784  !*** ./util/ellipse/index.js ***!
27785  \*******************************/
27786/*! exports provided: calculateEllipseStatistics, pointInEllipse, default */
27787/***/ (function(module, __webpack_exports__, __webpack_require__) {
27788
27789"use strict";
27790__webpack_require__.r(__webpack_exports__);
27791/* harmony import */ var _calculateEllipseStatistics_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./calculateEllipseStatistics.js */ "./util/ellipse/calculateEllipseStatistics.js");
27792/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "calculateEllipseStatistics", function() { return _calculateEllipseStatistics_js__WEBPACK_IMPORTED_MODULE_0__["default"]; });
27793
27794/* harmony import */ var _pointInEllipse_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./pointInEllipse.js */ "./util/ellipse/pointInEllipse.js");
27795/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "pointInEllipse", function() { return _pointInEllipse_js__WEBPACK_IMPORTED_MODULE_1__["default"]; });
27796
27797
27798 // Named
27799
27800 // Default
27801
27802/* harmony default export */ __webpack_exports__["default"] = ({
27803  calculateEllipseStatistics: _calculateEllipseStatistics_js__WEBPACK_IMPORTED_MODULE_0__["default"],
27804  pointInEllipse: _pointInEllipse_js__WEBPACK_IMPORTED_MODULE_1__["default"]
27805});
27806
27807/***/ }),
27808
27809/***/ "./util/ellipse/pointInEllipse.js":
27810/*!****************************************!*\
27811  !*** ./util/ellipse/pointInEllipse.js ***!
27812  \****************************************/
27813/*! exports provided: default */
27814/***/ (function(module, __webpack_exports__, __webpack_require__) {
27815
27816"use strict";
27817__webpack_require__.r(__webpack_exports__);
27818/**
27819 * Returns true if a point is within an ellipse
27820 * @export @public @method
27821 * @name pointInEllipse
27822 *
27823 * @param  {Object} ellipse  Object defining the ellipse.
27824 * @param  {Object} location The location of the point.
27825 * @returns {boolean} True if the point is within the ellipse.
27826 */
27827/* harmony default export */ __webpack_exports__["default"] = (function (ellipse, location) {
27828  var xRadius = ellipse.width / 2;
27829  var yRadius = ellipse.height / 2;
27830
27831  if (xRadius <= 0.0 || yRadius <= 0.0) {
27832    return false;
27833  }
27834
27835  var center = {
27836    x: ellipse.left + xRadius,
27837    y: ellipse.top + yRadius
27838  };
27839  /* This is a more general form of the circle equation
27840   *
27841   * X^2/a^2 + Y^2/b^2 <= 1
27842   */
27843
27844  var normalized = {
27845    x: location.x - center.x,
27846    y: location.y - center.y
27847  };
27848  var inEllipse = normalized.x * normalized.x / (xRadius * xRadius) + normalized.y * normalized.y / (yRadius * yRadius) <= 1.0;
27849  return inEllipse;
27850});
27851
27852/***/ }),
27853
27854/***/ "./util/findAndMoveHelpers.js":
27855/*!************************************!*\
27856  !*** ./util/findAndMoveHelpers.js ***!
27857  \************************************/
27858/*! exports provided: moveHandleNearImagePoint, findHandleDataNearImagePoint, moveAnnotation */
27859/***/ (function(module, __webpack_exports__, __webpack_require__) {
27860
27861"use strict";
27862__webpack_require__.r(__webpack_exports__);
27863/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "moveHandleNearImagePoint", function() { return moveHandleNearImagePoint; });
27864/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "findHandleDataNearImagePoint", function() { return findHandleDataNearImagePoint; });
27865/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "moveAnnotation", function() { return moveAnnotation; });
27866/* harmony import */ var _store_index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../store/index.js */ "./store/index.js");
27867/* harmony import */ var _manipulators_getHandleNearImagePoint_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../manipulators/getHandleNearImagePoint.js */ "./manipulators/getHandleNearImagePoint.js");
27868/* harmony import */ var _manipulators_index_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./../manipulators/index.js */ "./manipulators/index.js");
27869
27870
27871 // TODO this should just be in manipulators? They are just manipulator wrappers anyway.
27872
27873/**
27874 * Moves a handle near the image point.
27875 * @public
27876 * @function moveHandleNearImagePoint
27877 * @memberof Util
27878 *
27879 * @param  {Event} evt      The event.
27880 * @param  {*} tool The tool
27881 * @param  {Object} toolData     The toolData that corresponds to the handle.
27882 * @param  {Object} handle  The handle to be moved.
27883 * @param  {string} interactionType
27884 * @returns {undefined}
27885 */
27886
27887var moveHandleNearImagePoint = function moveHandleNearImagePoint(evt, tool, toolData, handle, interactionType) {
27888  toolData.active = true;
27889  _store_index_js__WEBPACK_IMPORTED_MODULE_0__["state"].isToolLocked = true;
27890  Object(_manipulators_index_js__WEBPACK_IMPORTED_MODULE_2__["moveHandle"])(evt.detail, tool.name, toolData, handle, tool.options, interactionType);
27891  evt.stopImmediatePropagation();
27892  evt.stopPropagation();
27893  evt.preventDefault();
27894  return;
27895};
27896/**
27897 * Finds the handle near the image point and its corresponding data.
27898 *
27899 * @public
27900 * @function findHandleDataNearImagePoint
27901 * @memberof Util
27902 *
27903 * @param  {HTMLElement} element  The elment.
27904 * @param  {Object} toolState     The state of the tool.
27905 * @param  {string} toolName The name of the tool the handle corrosponds to.
27906 * @param  {Object} coords The coordinates that need to be checked.
27907 * @param  {String} [interactionType=mouse]
27908 * @returns {*}
27909 */
27910
27911
27912var findHandleDataNearImagePoint = function findHandleDataNearImagePoint(element, toolState, toolName, coords) {
27913  var interactionType = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 'mouse';
27914
27915  for (var i = 0; i < toolState.data.length; i++) {
27916    var data = toolState.data[i];
27917    var handle = Object(_manipulators_getHandleNearImagePoint_js__WEBPACK_IMPORTED_MODULE_1__["default"])(element, data.handles, coords, interactionType === 'mouse' ? _store_index_js__WEBPACK_IMPORTED_MODULE_0__["state"].clickProximity : _store_index_js__WEBPACK_IMPORTED_MODULE_0__["state"].touchProximity);
27918
27919    if (handle) {
27920      return {
27921        handle: handle,
27922        data: data
27923      };
27924    }
27925  }
27926};
27927/**
27928 * Moves an entire annotation near the click.
27929 *
27930 * @public
27931 * @function moveAnnotation
27932 * @memberof Util
27933 *
27934 * @param  {Event}   evt           The event.
27935 * @param  {Object}  tool The tool that the annotation belongs to.
27936 * @param  {string}  tool.name
27937 * @param  {Object}  [tool.options={}]
27938 * @param  {Boolean} [tool.options.preventHandleOutsideImage]
27939 * @param  {Boolean} [tool.options.deleteIfHandleOutsideImage]
27940 * @param  {Object}  annotation The toolData that corresponds to the annotation.
27941 * @param  {String}  [interactionType=mouse]
27942 * @returns {undefined}
27943 */
27944
27945
27946var moveAnnotation = function moveAnnotation(evt, tool, annotation) {
27947  var interactionType = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'mouse';
27948  var toolOptions = Object.assign({}, {
27949    doneMovingCallback: function doneMovingCallback() {
27950      annotation.active = false;
27951      _store_index_js__WEBPACK_IMPORTED_MODULE_0__["state"].isToolLocked = false;
27952    }
27953  }, tool.options);
27954  annotation.active = true;
27955  _store_index_js__WEBPACK_IMPORTED_MODULE_0__["state"].isToolLocked = true;
27956  Object(_manipulators_index_js__WEBPACK_IMPORTED_MODULE_2__["moveAllHandles"])(evt.detail, tool.name, annotation, null, toolOptions, interactionType);
27957  evt.stopImmediatePropagation();
27958  evt.stopPropagation();
27959  evt.preventDefault();
27960  return;
27961};
27962
27963
27964
27965/***/ }),
27966
27967/***/ "./util/freehand/ClickedLineData.js":
27968/*!******************************************!*\
27969  !*** ./util/freehand/ClickedLineData.js ***!
27970  \******************************************/
27971/*! exports provided: default */
27972/***/ (function(module, __webpack_exports__, __webpack_require__) {
27973
27974"use strict";
27975__webpack_require__.r(__webpack_exports__);
27976/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return ClickedLineData; });
27977/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js");
27978/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
27979
27980
27981/**
27982 * @public
27983 * @name ClickedLineData
27984 * @classdesc Creates an object containing information about the clicked line.
27985 * @property {number} toolIndex ID of the tool that the line corresponds to.
27986 * @property {Object} handleIndexArray An array of the handle indicies that correspond to the line segment.
27987 */
27988var ClickedLineData =
27989/**
27990 * Constructs an object containing information about the clicked line.
27991 * @param {number} toolIndex - The ID of the tool the line corresponds to.
27992 * @param {Object} handleIndexArray - An array of the handle indicies that correspond to the line segment.
27993 */
27994function ClickedLineData(toolIndex, handleIndexArray) {
27995  _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, ClickedLineData);
27996
27997  this.toolIndex = toolIndex;
27998  this.handleIndexArray = handleIndexArray;
27999};
28000
28001
28002
28003/***/ }),
28004
28005/***/ "./util/freehand/FreehandHandleData.js":
28006/*!*********************************************!*\
28007  !*** ./util/freehand/FreehandHandleData.js ***!
28008  \*********************************************/
28009/*! exports provided: default */
28010/***/ (function(module, __webpack_exports__, __webpack_require__) {
28011
28012"use strict";
28013__webpack_require__.r(__webpack_exports__);
28014/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return FreehandHandleData; });
28015/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js");
28016/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
28017
28018
28019/**
28020 * @public
28021 * @name FreehandHandleData
28022 * @classdesc Creates a single handle for the freehand tool.
28023 *
28024 * @property {number} x The x position.
28025 * @property {number} y The y position.
28026 * @property {boolean} highlight Whether the handle should be rendered as the highlighted color.
28027 * @property {boolean} active Whether the handle is active.
28028 * @property {Object} lines An array of lines associated with the handle.
28029 */
28030var FreehandHandleData =
28031/**
28032 * Constructs a a single handle for the freehand tool
28033 *
28034 * @param {Object} position - The position of the handle.
28035 * @param {boolean} highlight - whether the handle should be rendered as the highlighted color.
28036 * @param {boolean} active - whether the handle is active.
28037 */
28038function FreehandHandleData(position) {
28039  var highlight = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
28040  var active = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
28041
28042  _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, FreehandHandleData);
28043
28044  this.x = position.x;
28045  this.y = position.y;
28046  this.highlight = highlight;
28047  this.active = active;
28048  this.lines = [];
28049};
28050
28051
28052
28053/***/ }),
28054
28055/***/ "./util/freehand/FreehandLineFinder.js":
28056/*!*********************************************!*\
28057  !*** ./util/freehand/FreehandLineFinder.js ***!
28058  \*********************************************/
28059/*! exports provided: default */
28060/***/ (function(module, __webpack_exports__, __webpack_require__) {
28061
28062"use strict";
28063__webpack_require__.r(__webpack_exports__);
28064/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return FreehandLineFinder; });
28065/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js");
28066/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
28067/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js");
28068/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
28069/* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../stateManagement/toolState.js */ "./stateManagement/toolState.js");
28070/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../externalModules.js */ "./externalModules.js");
28071/* harmony import */ var _ClickedLineData_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./ClickedLineData.js */ "./util/freehand/ClickedLineData.js");
28072
28073
28074
28075
28076
28077var distanceThreshold = 10;
28078/**
28079 * @public
28080 * @class FreehandLineFinder
28081 * @classdesc Class that finds lines of freehand ROIs based on click proximity.
28082 */
28083
28084var FreehandLineFinder =
28085/*#__PURE__*/
28086function () {
28087  /**
28088   * Creates an instance of FreehandLineFinder.
28089   * @param {*} eventData - Data object associated with the event.
28090   * @param {string} toolName - The tool name
28091   * @memberof FreehandLineFinder
28092   */
28093  function FreehandLineFinder(eventData, toolName) {
28094    _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, FreehandLineFinder);
28095
28096    this._eventData = eventData;
28097    this._toolName = toolName;
28098  }
28099  /**
28100   * Looks for lines near the mouse cursor.
28101   *
28102   * @public
28103   * @method
28104   * @returns {ClickedLineData} Data object corresponding to the clicked line.
28105   */
28106
28107
28108  _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(FreehandLineFinder, [{
28109    key: "findLine",
28110    value: function findLine() {
28111      var closestToolIndex = this.findTool();
28112
28113      if (closestToolIndex === null) {
28114        return null;
28115      }
28116
28117      var closeLines = this._getCloseLinesInTool(closestToolIndex);
28118
28119      if (closeLines) {
28120        var clickedLineData = this._findCorrectLine(closestToolIndex, closeLines); // Note: clickedLineData may be null if no valid projections are found.
28121
28122
28123        return clickedLineData;
28124      } // Return null if no valid close lines found.
28125
28126
28127      return null;
28128    }
28129    /**
28130     * Looks for tools near the mouse cursor.
28131     *
28132     * @public
28133     * @method
28134     *
28135     * @returns {ClickedLineData} Data object corresponding to the clicked line.
28136     */
28137
28138  }, {
28139    key: "findTool",
28140    value: function findTool() {
28141      this._toolData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_2__["getToolState"])(this._eventData.element, this._toolName);
28142      this._mousePoint = this._eventData.currentPoints.canvas;
28143
28144      if (!this._toolData) {
28145        return null;
28146      }
28147
28148      var closestHandle = this._nearestHandleToPointAllTools();
28149
28150      return closestHandle.toolIndex;
28151    }
28152    /**
28153     * Finds the nearest handle to the mouse cursor for all tools.
28154     * @private
28155     * @method
28156     * @returns {Object} The handle closest to the point.
28157     */
28158
28159  }, {
28160    key: "_nearestHandleToPointAllTools",
28161    value: function _nearestHandleToPointAllTools() {
28162      var toolData = this._toolData;
28163      var closestHandle = {
28164        toolIndex: null,
28165        handleIndex: null,
28166        distance: Infinity // Some large number
28167
28168      };
28169
28170      for (var toolIndex = 0; toolIndex < toolData.data.length; toolIndex++) {
28171        var closestHandleForToolI = this._nearestHandleToPoint(toolIndex);
28172
28173        if (closestHandleForToolI === null) {
28174          continue;
28175        }
28176
28177        if (closestHandleForToolI.distance < closestHandle.distance) {
28178          closestHandle = closestHandleForToolI;
28179        }
28180      }
28181
28182      return closestHandle;
28183    }
28184    /**
28185     * Finds the nearest handle to the mouse cursor for a specific tool.
28186     * @private
28187     * @method
28188     *
28189     * @param {number} toolIndex The index of the particular freehand tool.
28190     * @returns {Object} An object containing information about the closest handle.
28191     */
28192
28193  }, {
28194    key: "_nearestHandleToPoint",
28195    value: function _nearestHandleToPoint(toolIndex) {
28196      var eventData = this._eventData;
28197      var toolData = this._toolData;
28198      var data = toolData.data[toolIndex];
28199      var points = data.handles.points;
28200
28201      if (points === undefined) {
28202        return null;
28203      }
28204
28205      if (data.visible === false) {
28206        return null;
28207      }
28208
28209      var closest = {
28210        toolIndex: toolIndex,
28211        handleIndex: null,
28212        distance: Infinity // Some large number
28213
28214      };
28215
28216      for (var i = 0; i < points.length; i++) {
28217        var handleCanvas = _externalModules_js__WEBPACK_IMPORTED_MODULE_3__["default"].cornerstone.pixelToCanvas(eventData.element, points[i]);
28218        var handleDistanceFromMousePoint = _externalModules_js__WEBPACK_IMPORTED_MODULE_3__["default"].cornerstoneMath.point.distance(handleCanvas, this._mousePoint);
28219
28220        if (handleDistanceFromMousePoint < closest.distance) {
28221          closest.handleIndex = i;
28222          closest.distance = handleDistanceFromMousePoint;
28223        }
28224      }
28225
28226      return closest;
28227    }
28228    /**
28229     * Finds all the lines close to the mouse point for a particular tool.
28230     * @private
28231     * @method
28232     *
28233     * @param {number} toolIndex The index of the particular freehand tool.
28234     * @returns {Object} An array of lines close to the mouse point.
28235     */
28236
28237  }, {
28238    key: "_getCloseLinesInTool",
28239    value: function _getCloseLinesInTool(toolIndex) {
28240      var toolData = this._toolData;
28241      var points = toolData.data[toolIndex].handles.points;
28242      var closeLines = [];
28243
28244      for (var i = 0; i < points.length; i++) {
28245        var nextIndex = FreehandLineFinder.getNextHandleIndex(i, points.length);
28246
28247        var d = this._distanceOfPointfromLine(points[i], points[nextIndex]);
28248
28249        if (d < distanceThreshold) {
28250          closeLines.push([i, nextIndex]);
28251        }
28252      }
28253
28254      return closeLines;
28255    }
28256    /**
28257     * Finds the line the user clicked on from an array of close lines.\
28258     * @private
28259     * @method
28260     *
28261     * @param {number} toolIndex The index of the particular freehand tool.
28262     * @param {Object} closeLines An array of lines close to the mouse point.
28263     * @returns {ClickedLineData|null} An instance of ClickedLineData containing information about the line, or null if no line is correct.
28264     */
28265
28266  }, {
28267    key: "_findCorrectLine",
28268    value: function _findCorrectLine(toolIndex, closeLines) {
28269      // Test if any candidate lines can be projected onto by the mousePoint
28270      for (var i = 0; i < closeLines.length; i++) {
28271        if (this._pointProjectsToLineSegment(toolIndex, closeLines[i])) {
28272          return new _ClickedLineData_js__WEBPACK_IMPORTED_MODULE_4__["default"](toolIndex, closeLines[i]);
28273        }
28274      } // No valid line found
28275
28276
28277      return null;
28278    }
28279    /**
28280     * Returns true if the mouse point projects onto the line segment.
28281     * @private
28282     * @method
28283     *
28284     * @param {number} toolIndex The index of the particular freehand tool.
28285     * @param {Object} handleIndexArray An array of indicies corresponding to the line segment.
28286     * @returns {boolean} True if the mouse point projects onto the line segment
28287     */
28288
28289  }, {
28290    key: "_pointProjectsToLineSegment",
28291    value: function _pointProjectsToLineSegment(toolIndex, handleIndexArray) {
28292      var eventData = this._eventData;
28293      var toolData = this._toolData;
28294      var data = toolData.data[toolIndex];
28295      var points = data.handles.points;
28296
28297      if (data.handles.points === undefined) {
28298        return;
28299      }
28300
28301      if (data.visible === false) {
28302        return false;
28303      }
28304
28305      var handle1 = points[handleIndexArray[0]];
28306      var handle2 = points[handleIndexArray[1]];
28307      var p = FreehandLineFinder.getCanvasPointsFromHandles(handle1, handle2, eventData.element);
28308      var r = FreehandLineFinder.getLineAsVector(p);
28309
28310      var m = this._getLineOriginToMouseAsVector(p); // Project vector m onto r to see if the point is within bounds of line segment
28311
28312
28313      var mProj = (m[0] * r[0] + m[1] * r[1]) / r.magnitude;
28314
28315      if (mProj > 0 && mProj < r.magnitude) {
28316        return true;
28317      }
28318
28319      return false;
28320    }
28321    /**
28322     * Returns the canvas positions from the handle's pixel positions.
28323     *
28324     * @static
28325     * @public
28326     * @method
28327     * @param {FreehandHandleData} handle1 The first handle.
28328     * @param {FreehandHandleData} handle2 The second handle.
28329     * @param {Object} element The element on which the handles reside.
28330     * @returns {Object} An array contsining the handle positions in canvas coordinates.
28331     */
28332
28333  }, {
28334    key: "_getLineOriginToMouseAsVector",
28335
28336    /**
28337     * Constructs a vector from the direction and magnitude of the line from the the line origin to the mouse cursor.
28338     * @private
28339     * @method
28340     *
28341     * @param {Object} p An array of two points respresenting the line segment.
28342     * @returns {Object} An array containing the x and y components of the vector.
28343     */
28344    value: function _getLineOriginToMouseAsVector(p) {
28345      var m = [this._mousePoint.x - p[0].x, this._mousePoint.y - p[0].y];
28346      return m;
28347    }
28348    /**
28349     * Calculates the perpendicular distance of the mouse cursor from a line segment.
28350     * @private
28351     * @method
28352     *
28353     * @param {FreehandHandleData} handle1 The first handle.
28354     * @param {FreehandHandleData} handle2 The first handle.
28355     * @returns {number} The perpendicular distance of the mouse cursor from the line segment.
28356     */
28357
28358  }, {
28359    key: "_distanceOfPointfromLine",
28360    value: function _distanceOfPointfromLine(handle1, handle2) {
28361      var eventData = this._eventData;
28362      var p1 = _externalModules_js__WEBPACK_IMPORTED_MODULE_3__["default"].cornerstone.pixelToCanvas(eventData.element, handle1);
28363      var p2 = _externalModules_js__WEBPACK_IMPORTED_MODULE_3__["default"].cornerstone.pixelToCanvas(eventData.element, handle2);
28364      var pMouse = this._mousePoint; // Perpendicular distance of point from line:
28365      // = 2* area of triangle(p1,p2,pm) / length of triangle's base |p2 - p1|
28366
28367      var twiceAreaOfTriangle = Math.abs((p2.y - p1.y) * pMouse.x - (p2.x - p1.x) * pMouse.y + p2.x * p1.y - p2.y * p1.x);
28368      var rMagnitude = _externalModules_js__WEBPACK_IMPORTED_MODULE_3__["default"].cornerstoneMath.point.distance(p1, p2);
28369      var d = twiceAreaOfTriangle / rMagnitude;
28370      return d;
28371    }
28372    /**
28373     * Gets the next handl index from a cyclical array of points.
28374     *
28375     * @static
28376     * @public
28377     * @method
28378     *
28379     * @param {number} currentIndex The current index.
28380     * @param {number} length The number of handles in the polygon.
28381     * @returns {number} The index of the next handle.
28382     */
28383
28384  }], [{
28385    key: "getCanvasPointsFromHandles",
28386    value: function getCanvasPointsFromHandles(handle1, handle2, element) {
28387      var p = []; // Point r from left to right so that we only have one orientation to test.
28388
28389      if (handle1.x < handle2.x) {
28390        p.push(_externalModules_js__WEBPACK_IMPORTED_MODULE_3__["default"].cornerstone.pixelToCanvas(element, handle1));
28391        p.push(_externalModules_js__WEBPACK_IMPORTED_MODULE_3__["default"].cornerstone.pixelToCanvas(element, handle2));
28392      } else {
28393        p.push(_externalModules_js__WEBPACK_IMPORTED_MODULE_3__["default"].cornerstone.pixelToCanvas(element, handle2));
28394        p.push(_externalModules_js__WEBPACK_IMPORTED_MODULE_3__["default"].cornerstone.pixelToCanvas(element, handle1));
28395      }
28396
28397      return p;
28398    }
28399    /**
28400     * Converts a line segment to a vector.
28401     *
28402     * @static
28403     * @public
28404     * @method
28405     * @param {Object} p An array of two points respresenting the line segment.
28406     * @returns {Object} An array containing the x and y components of the vector, as well as a magnitude property.
28407     */
28408
28409  }, {
28410    key: "getLineAsVector",
28411    value: function getLineAsVector(p) {
28412      var r = [p[1].x - p[0].x, p[1].y - p[0].y];
28413      r.magnitude = _externalModules_js__WEBPACK_IMPORTED_MODULE_3__["default"].cornerstoneMath.point.distance(p[0], p[1]);
28414      return r;
28415    }
28416  }, {
28417    key: "getNextHandleIndex",
28418    value: function getNextHandleIndex(currentIndex, length) {
28419      var nextIndex;
28420
28421      if (currentIndex < length - 1) {
28422        nextIndex = currentIndex + 1;
28423      } else {
28424        nextIndex = 0;
28425      }
28426
28427      return nextIndex;
28428    }
28429  }]);
28430
28431  return FreehandLineFinder;
28432}();
28433
28434
28435
28436/***/ }),
28437
28438/***/ "./util/freehand/addLine.js":
28439/*!**********************************!*\
28440  !*** ./util/freehand/addLine.js ***!
28441  \**********************************/
28442/*! exports provided: default */
28443/***/ (function(module, __webpack_exports__, __webpack_require__) {
28444
28445"use strict";
28446__webpack_require__.r(__webpack_exports__);
28447/**
28448 * AddLine - Adds a line to a specifc index of a freehand tool points array.
28449 *
28450 * @param  {Object[]} points      The array of points.
28451 * @param  {Number} insertIndex The index to insert the line.
28452 * @returns {Null}             description
28453 */
28454/* harmony default export */ __webpack_exports__["default"] = (function (points, insertIndex) {
28455  // Add the line from the inserted handle to the handle after
28456  if (insertIndex === points.length - 1) {
28457    points[insertIndex].lines.push(points[0]);
28458  } else {
28459    points[insertIndex].lines.push(points[insertIndex + 1]);
28460  }
28461});
28462
28463/***/ }),
28464
28465/***/ "./util/freehand/calculateFreehandStatistics.js":
28466/*!******************************************************!*\
28467  !*** ./util/freehand/calculateFreehandStatistics.js ***!
28468  \******************************************************/
28469/*! exports provided: default */
28470/***/ (function(module, __webpack_exports__, __webpack_require__) {
28471
28472"use strict";
28473__webpack_require__.r(__webpack_exports__);
28474/* harmony import */ var _pointInFreehand_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./pointInFreehand.js */ "./util/freehand/pointInFreehand.js");
28475
28476/**
28477 * Calculates the statistics of all the pixels within the freehand object.
28478 * @export @public @method
28479 * @name calculateFreehandStatistics
28480 *
28481 * @param {Object} sp An array of the pixel data.
28482 * @param {Object} boundingBox Rectangular box enclosing the polygon.
28483 * @param {Object} dataHandles Data object associated with the tool.
28484 * @returns {Object} Object containing the derived statistics.
28485 */
28486
28487/* harmony default export */ __webpack_exports__["default"] = (function (sp, boundingBox, dataHandles) {
28488  var statisticsObj = {
28489    count: 0,
28490    mean: 0.0,
28491    variance: 0.0,
28492    stdDev: 0.0
28493  };
28494  var sum = getSum(sp, boundingBox, dataHandles);
28495
28496  if (sum.count === 0) {
28497    return statisticsObj;
28498  }
28499
28500  statisticsObj.count = sum.count;
28501  statisticsObj.mean = sum.value / sum.count;
28502  statisticsObj.variance = sum.squared / sum.count - statisticsObj.mean * statisticsObj.mean;
28503  statisticsObj.stdDev = Math.sqrt(statisticsObj.variance);
28504  return statisticsObj;
28505});
28506/**
28507 * Calculates the sum, squared sum and count of all pixels within the polygon.
28508 * @private
28509 * @method
28510 * @name getSum
28511 *
28512 * @param {Object} sp An array of the pixel data.
28513 * @param {Object} boundingBox Rectangular box enclosing the polygon.
28514 * @param {Object} dataHandles Data object associated with the tool.
28515 * @returns {Object} Object containing the sum, squared sum and pixel count.
28516 */
28517
28518function getSum(sp, boundingBox, dataHandles) {
28519  var sum = {
28520    value: 0,
28521    squared: 0,
28522    count: 0
28523  };
28524  var index = 0;
28525
28526  for (var y = boundingBox.top; y < boundingBox.top + boundingBox.height; y++) {
28527    for (var x = boundingBox.left; x < boundingBox.left + boundingBox.width; x++) {
28528      var point = {
28529        x: x,
28530        y: y
28531      };
28532      sumPointIfInFreehand(dataHandles, point, sum, sp[index]);
28533      index++;
28534    }
28535  }
28536
28537  return sum;
28538}
28539/**
28540 * Adds the pixel to the workingSum if it is within the polygon.
28541 * @private
28542 * @method sumPointIfInFreehand
28543 *
28544 * @param {Object} dataHandles Data object associated with the tool.
28545 * @param {Object} point The pixel coordinates.
28546 * @param {Object} workingSum The working sum, squared sum and pixel count.
28547 * @param {Object} pixelValue The pixel value. // @modifies {workingSum}
28548 * @returns {undefined}
28549 */
28550
28551
28552function sumPointIfInFreehand(dataHandles, point, workingSum, pixelValue) {
28553  if (Object(_pointInFreehand_js__WEBPACK_IMPORTED_MODULE_0__["default"])(dataHandles, point)) {
28554    workingSum.value += pixelValue;
28555    workingSum.squared += pixelValue * pixelValue;
28556    workingSum.count++;
28557  }
28558}
28559
28560/***/ }),
28561
28562/***/ "./util/freehand/freehandArea.js":
28563/*!***************************************!*\
28564  !*** ./util/freehand/freehandArea.js ***!
28565  \***************************************/
28566/*! exports provided: default */
28567/***/ (function(module, __webpack_exports__, __webpack_require__) {
28568
28569"use strict";
28570__webpack_require__.r(__webpack_exports__);
28571/**
28572 * Calculates the area of a freehand tool polygon.
28573 * @export @public @method
28574 * @name freehandArea
28575 *
28576 * @param {Object} dataHandles Data object associated with the tool.
28577 * @param {Object} scaling Area scaling of image.
28578 * @returns {number} The area of the polygon.
28579 */
28580/* harmony default export */ __webpack_exports__["default"] = (function (dataHandles, scaling) {
28581  var freeHandArea = 0;
28582  var j = dataHandles.length - 1; // The last vertex is the previous one to the first
28583
28584  scaling = scaling || 1; // If scaling is falsy, set scaling to 1
28585
28586  for (var i = 0; i < dataHandles.length; i++) {
28587    freeHandArea += (dataHandles[j].x + dataHandles[i].x) * (dataHandles[j].y - dataHandles[i].y);
28588    j = i; // Here j is previous vertex to i
28589  }
28590
28591  return Math.abs(freeHandArea * scaling / 2.0);
28592});
28593
28594/***/ }),
28595
28596/***/ "./util/freehand/freehandIntersect.js":
28597/*!********************************************!*\
28598  !*** ./util/freehand/freehandIntersect.js ***!
28599  \********************************************/
28600/*! exports provided: default */
28601/***/ (function(module, __webpack_exports__, __webpack_require__) {
28602
28603"use strict";
28604__webpack_require__.r(__webpack_exports__);
28605/**
28606 * Orientation algoritm to determine if two lines cross.
28607 * Credit and details: geeksforgeeks.org/check-if-two-given-line-segments-intersect/
28608 */
28609
28610/**
28611 * Determines whether a new handle causes an intersection of the lines of the polygon.
28612 * @public
28613 * @function newHandle
28614 *
28615 * @param {Object} candidateHandle The new handle to check.
28616 * @param {Object} dataHandles data object associated with the tool.
28617 * @returns {boolean} - Whether the new line intersects with any other lines of the polygon.
28618 */
28619function newHandle(candidateHandle, dataHandles) {
28620  // Check if the proposed line will intersect any existent line
28621  var lastHandleId = dataHandles.length - 1;
28622  var lastHandle = getCoords(dataHandles[lastHandleId]);
28623  var newHandle = getCoords(candidateHandle);
28624  return doesIntersectOtherLines(dataHandles, lastHandle, newHandle, [lastHandleId]);
28625}
28626/**
28627 * Checks if the last line of a polygon will intersect the other lines of the polgyon.
28628 * @public
28629 * @function end
28630 *
28631 * @param {Object} dataHandles data object associated with the tool.
28632 * @returns {boolean} Whether the last line intersects with any other lines of the polygon.
28633 */
28634
28635
28636function end(dataHandles) {
28637  var lastHandleId = dataHandles.length - 1;
28638  var lastHandle = getCoords(dataHandles[lastHandleId]);
28639  var firstHandle = getCoords(dataHandles[0]);
28640  return doesIntersectOtherLines(dataHandles, lastHandle, firstHandle, [lastHandleId, 0]);
28641}
28642/**
28643 * Checks whether the modification of a handle's position causes intersection of the lines of the polygon.
28644 * @public
28645 * @method modify
28646 *
28647 * @param {Object} dataHandles Data object associated with the tool.
28648 * @param {number} modifiedHandleId The id of the handle being modified.
28649 * @returns {boolean} Whether the modfication causes any intersections.
28650 */
28651
28652
28653function modify(dataHandles, modifiedHandleId) {
28654  // Check if the modifiedHandle's previous and next lines will intersect any other line in the polygon
28655  var modifiedHandle = getCoords(dataHandles[modifiedHandleId]); // Previous neightbor handle
28656
28657  var neighborHandleId = modifiedHandleId - 1;
28658
28659  if (modifiedHandleId === 0) {
28660    neighborHandleId = dataHandles.length - 1;
28661  }
28662
28663  var neighborHandle = getCoords(dataHandles[neighborHandleId]);
28664
28665  if (doesIntersectOtherLines(dataHandles, modifiedHandle, neighborHandle, [modifiedHandleId, neighborHandleId])) {
28666    return true;
28667  } // Next neightbor handle
28668
28669
28670  if (modifiedHandleId === dataHandles.length - 1) {
28671    neighborHandleId = 0;
28672  } else {
28673    neighborHandleId = modifiedHandleId + 1;
28674  }
28675
28676  neighborHandle = getCoords(dataHandles[neighborHandleId]);
28677  return doesIntersectOtherLines(dataHandles, modifiedHandle, neighborHandle, [modifiedHandleId, neighborHandleId]);
28678}
28679/**
28680 * Checks whether the line (p1,q1) intersects any of the other lines in the polygon.
28681 * @private
28682 * @function doesIntersectOtherLines
28683 *
28684 * @param {Object} dataHandles Data object associated with the tool.
28685 * @param {Object} p1 Coordinates of the start of the line.
28686 * @param {Object} q1 Coordinates of the end of the line.
28687 * @param {Object} ignoredHandleIds Ids of handles to ignore (i.e. lines that share a vertex with the line being tested).
28688 * @returns {boolean} Whether the line intersects any of the other lines in the polygon.
28689 */
28690
28691
28692function doesIntersectOtherLines(dataHandles, p1, q1, ignoredHandleIds) {
28693  var j = dataHandles.length - 1;
28694
28695  for (var i = 0; i < dataHandles.length; i++) {
28696    if (ignoredHandleIds.indexOf(i) !== -1 || ignoredHandleIds.indexOf(j) !== -1) {
28697      j = i;
28698      continue;
28699    }
28700
28701    var p2 = getCoords(dataHandles[j]);
28702    var q2 = getCoords(dataHandles[i]);
28703
28704    if (doesIntersect(p1, q1, p2, q2)) {
28705      return true;
28706    }
28707
28708    j = i;
28709  }
28710
28711  return false;
28712}
28713/**
28714 * Checks whether the line (p1,q1) intersects the line (p2,q2) via an orientation algorithm.
28715 * @private
28716 * @function doesIntersect
28717 *
28718 * @param {Object} p1 Coordinates of the start of the line 1.
28719 * @param {Object} q1 Coordinates of the end of the line 1.
28720 * @param {Object} p2 Coordinates of the start of the line 2.
28721 * @param {Object} q2 Coordinates of the end of the line 2.
28722 * @returns {boolean} Whether lines (p1,q1) and (p2,q2) intersect.
28723 */
28724
28725
28726function doesIntersect(p1, q1, p2, q2) {
28727  var result = false;
28728  var orient = [orientation(p1, q1, p2), orientation(p1, q1, q2), orientation(p2, q2, p1), orientation(p2, q2, q1)]; // General Case
28729
28730  if (orient[0] !== orient[1] && orient[2] !== orient[3]) {
28731    return true;
28732  } // Special Cases
28733
28734
28735  if (orient[0] === 0 && onSegment(p1, p2, q1)) {
28736    // If p1, q1 and p2 are colinear and p2 lies on segment p1q1
28737    result = true;
28738  } else if (orient[1] === 0 && onSegment(p1, q2, q1)) {
28739    // If p1, q1 and p2 are colinear and q2 lies on segment p1q1
28740    result = true;
28741  } else if (orient[2] === 0 && onSegment(p2, p1, q2)) {
28742    // If p2, q2 and p1 are colinear and p1 lies on segment p2q2
28743    result = true;
28744  } else if (orient[3] === 0 && onSegment(p2, q1, q2)) {
28745    // If p2, q2 and q1 are colinear and q1 lies on segment p2q2
28746    result = true;
28747  }
28748
28749  return result;
28750}
28751/**
28752 * Returns an object with two properties, x and y, from a heavier FreehandHandleData object.
28753 * @private
28754 * @function getCoords
28755 *
28756 * @param {Object} dataHandle Data object associated with a single handle in the freehand tool.
28757 * @returns {Object} An object containing position propeties x and y.
28758 */
28759
28760
28761function getCoords(dataHandle) {
28762  return {
28763    x: dataHandle.x,
28764    y: dataHandle.y
28765  };
28766}
28767/**
28768 * Checks the orientation of 3 points.
28769 * @private
28770 * @function orientation
28771 *
28772 * @param {Object} p First point.
28773 * @param {Object} q Second point.
28774 * @param {Object} r Third point.
28775 * @returns {number} - 0: Colinear, 1: Clockwise, 2: Anticlockwise
28776 */
28777
28778
28779function orientation(p, q, r) {
28780  var orientationValue = (q.y - p.y) * (r.x - q.x) - (q.x - p.x) * (r.y - q.y);
28781
28782  if (orientationValue === 0) {
28783    return 0; // Colinear
28784  }
28785
28786  return orientationValue > 0 ? 1 : 2;
28787}
28788/**
28789 * Checks if point q lines on the segment (p,r).
28790 * @private
28791 * @function onSegment
28792 *
28793 * @param {Object} p Point p.
28794 * @param {Object} q Point q.
28795 * @param {Object} r Point r.
28796 * @returns {boolean} - If q lies on line segment (p,r).
28797 */
28798
28799
28800function onSegment(p, q, r) {
28801  if (q.x <= Math.max(p.x, r.x) && q.x >= Math.min(p.x, r.x) && q.y <= Math.max(p.y, r.y) && q.y >= Math.min(p.y, r.y)) {
28802    return true;
28803  }
28804
28805  return false;
28806}
28807
28808/* harmony default export */ __webpack_exports__["default"] = ({
28809  newHandle: newHandle,
28810  end: end,
28811  modify: modify
28812});
28813
28814/***/ }),
28815
28816/***/ "./util/freehand/index.js":
28817/*!********************************!*\
28818  !*** ./util/freehand/index.js ***!
28819  \********************************/
28820/*! exports provided: default */
28821/***/ (function(module, __webpack_exports__, __webpack_require__) {
28822
28823"use strict";
28824__webpack_require__.r(__webpack_exports__);
28825/* harmony import */ var _calculateFreehandStatistics_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./calculateFreehandStatistics.js */ "./util/freehand/calculateFreehandStatistics.js");
28826/* harmony import */ var _ClickedLineData_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./ClickedLineData.js */ "./util/freehand/ClickedLineData.js");
28827/* harmony import */ var _freehandArea_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./freehandArea.js */ "./util/freehand/freehandArea.js");
28828/* harmony import */ var _FreehandHandleData_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./FreehandHandleData.js */ "./util/freehand/FreehandHandleData.js");
28829/* harmony import */ var _freehandIntersect_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./freehandIntersect.js */ "./util/freehand/freehandIntersect.js");
28830/* harmony import */ var _FreehandLineFinder_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./FreehandLineFinder.js */ "./util/freehand/FreehandLineFinder.js");
28831/* harmony import */ var _insertOrDelete_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./insertOrDelete.js */ "./util/freehand/insertOrDelete.js");
28832/* harmony import */ var _pointInFreehand_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./pointInFreehand.js */ "./util/freehand/pointInFreehand.js");
28833/* harmony import */ var _addLine_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./addLine.js */ "./util/freehand/addLine.js");
28834
28835
28836
28837
28838
28839
28840
28841
28842
28843/* harmony default export */ __webpack_exports__["default"] = ({
28844  calculateFreehandStatistics: _calculateFreehandStatistics_js__WEBPACK_IMPORTED_MODULE_0__["default"],
28845  ClickedLineData: _ClickedLineData_js__WEBPACK_IMPORTED_MODULE_1__["default"],
28846  freehandArea: _freehandArea_js__WEBPACK_IMPORTED_MODULE_2__["default"],
28847  FreehandHandleData: _FreehandHandleData_js__WEBPACK_IMPORTED_MODULE_3__["default"],
28848  freehandIntersect: _freehandIntersect_js__WEBPACK_IMPORTED_MODULE_4__["default"],
28849  FreehandLineFinder: _FreehandLineFinder_js__WEBPACK_IMPORTED_MODULE_5__["default"],
28850  insertOrDelete: _insertOrDelete_js__WEBPACK_IMPORTED_MODULE_6__["default"],
28851  pointInFreehand: _pointInFreehand_js__WEBPACK_IMPORTED_MODULE_7__["default"],
28852  addLine: _addLine_js__WEBPACK_IMPORTED_MODULE_8__["default"]
28853});
28854
28855/***/ }),
28856
28857/***/ "./util/freehand/insertOrDelete.js":
28858/*!*****************************************!*\
28859  !*** ./util/freehand/insertOrDelete.js ***!
28860  \*****************************************/
28861/*! exports provided: default */
28862/***/ (function(module, __webpack_exports__, __webpack_require__) {
28863
28864"use strict";
28865__webpack_require__.r(__webpack_exports__);
28866/* harmony import */ var _FreehandLineFinder_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./FreehandLineFinder.js */ "./util/freehand/FreehandLineFinder.js");
28867/* harmony import */ var _FreehandHandleData_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./FreehandHandleData.js */ "./util/freehand/FreehandHandleData.js");
28868/* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../stateManagement/toolState.js */ "./stateManagement/toolState.js");
28869/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../externalModules.js */ "./externalModules.js");
28870/* harmony import */ var _addLine_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./addLine.js */ "./util/freehand/addLine.js");
28871
28872
28873
28874
28875
28876/**
28877 * Inserts or deletes a point from a freehand tool.
28878 * @export @public @method
28879 * @name insertOrDelete
28880 *
28881 * @param {Object} evt The event.
28882 * @param {Object} nearby Object containing information about a nearby handle.
28883 * @returns {void}
28884 */
28885
28886/* harmony default export */ __webpack_exports__["default"] = (function (evt, nearby) {
28887  var eventData = evt.detail;
28888
28889  if (nearby && nearby.handleNearby !== null) {
28890    var deleteInfo = {
28891      toolIndex: nearby.toolIndex,
28892      handleIndex: nearby.handleNearby
28893    };
28894
28895    _deletePoint.call(this, eventData, deleteInfo);
28896  } else {
28897    var freehandLineFinder = new _FreehandLineFinder_js__WEBPACK_IMPORTED_MODULE_0__["default"](eventData, this.name);
28898    var insertInfo = freehandLineFinder.findLine();
28899
28900    if (insertInfo) {
28901      _insertPoint.call(this, eventData, insertInfo);
28902    }
28903  }
28904});
28905/**
28906 * Deletes a point from a freehand tool.
28907 * @private
28908 * @method
28909 *
28910 * @param {Object} eventData The data object associated with the event.
28911 * @param {Object} deleteInfo Object containing information about which point to delete.
28912 * @returns {void}
28913 */
28914
28915function _deletePoint(eventData, deleteInfo) {
28916  var toolData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_2__["getToolState"])(eventData.element, this.name);
28917
28918  if (toolData === undefined) {
28919    return;
28920  }
28921
28922  var deleteHandle = deleteInfo.handleIndex;
28923  var toolIndex = deleteInfo.toolIndex; // Get the toolData from insertInfo
28924
28925  var data = toolData.data[toolIndex];
28926  var points = data.handles.points; // Only allow delete if > 3 points
28927
28928  if (points.length <= 3) {
28929    return;
28930  } // Link the line of the previous handle to the one after handles[deleteHandle];
28931
28932
28933  if (deleteHandle === points.length - 1) {
28934    points[deleteHandle - 1].lines.pop();
28935    points[deleteHandle - 1].lines.push(points[0]);
28936  } else if (deleteHandle === 0) {
28937    points[points.length - 1].lines.pop();
28938    points[points.length - 1].lines.push(points[deleteHandle + 1]);
28939  } else {
28940    points[deleteHandle - 1].lines.pop();
28941    points[deleteHandle - 1].lines.push(points[deleteHandle + 1]);
28942  } // Remove the handle
28943
28944
28945  points.splice(deleteHandle, 1);
28946  data.invalidated = true;
28947  data.active = true;
28948  data.highlight = true; // Force onImageRendered to fire
28949
28950  _externalModules_js__WEBPACK_IMPORTED_MODULE_3__["default"].cornerstone.updateImage(eventData.element);
28951}
28952/**
28953 * Inserts a new point into a freehand tool.
28954 * @private
28955 * @method
28956 *
28957 * @param {Object} eventData - The data object associated with the event.
28958 * @param {Object} insertInfo - Object containing information about where to insert the point.
28959 * @returns {void}
28960 */
28961
28962
28963function _insertPoint(eventData, insertInfo) {
28964  var toolData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_2__["getToolState"])(eventData.element, this.name);
28965
28966  if (toolData === undefined) {
28967    return;
28968  } // Get the toolData from insertInfo
28969
28970
28971  var data = toolData.data[insertInfo.toolIndex];
28972
28973  var insertIndex = _getInsertionIndex(insertInfo);
28974
28975  if (insertIndex === Infinity) {
28976    return;
28977  }
28978
28979  var handleData = new _FreehandHandleData_js__WEBPACK_IMPORTED_MODULE_1__["default"](eventData.currentPoints.image);
28980  var points = data.handles.points; // Add the new handle
28981
28982  points.splice(insertIndex, 0, handleData); // Add the line from the previous handle to the inserted handle (note the tool is now one increment longer)
28983
28984  points[insertIndex - 1].lines.pop();
28985  points[insertIndex - 1].lines.push(eventData.currentPoints.image);
28986  Object(_addLine_js__WEBPACK_IMPORTED_MODULE_4__["default"])(points, insertIndex);
28987  data.active = true;
28988  data.highlight = true; // Force onImageRendered to fire
28989
28990  data.invalidated = true;
28991  _externalModules_js__WEBPACK_IMPORTED_MODULE_3__["default"].cornerstone.updateImage(eventData.element);
28992}
28993/**
28994 * Gets the handle index of a tool in which to insert the new point.
28995 * @private
28996 * @method
28997 *
28998 * @param {Object} insertInfo - Object containing information about where to insert the point.
28999 * @returns {void}
29000 */
29001
29002
29003function _getInsertionIndex(insertInfo) {
29004  // Get lowest index that isn't zero
29005  var handleIndexArray = insertInfo.handleIndexArray;
29006  var insertIndex = Infinity;
29007  var arrayContainsZero = handleIndexArray.includes(0);
29008
29009  for (var i = 0; i < handleIndexArray.length; i++) {
29010    var index = handleIndexArray[i];
29011
29012    if (index !== 0 && index < insertIndex) {
29013      insertIndex = index;
29014    }
29015  } // Treat the special case of handleIndexArray === [0,1] || [1,0]
29016
29017
29018  if (arrayContainsZero && insertIndex === 1) {
29019    insertIndex = 0;
29020  } // The insertion index shall be just after the lower index
29021
29022
29023  insertIndex++;
29024  return insertIndex;
29025}
29026
29027/***/ }),
29028
29029/***/ "./util/freehand/pointInFreehand.js":
29030/*!******************************************!*\
29031  !*** ./util/freehand/pointInFreehand.js ***!
29032  \******************************************/
29033/*! exports provided: default */
29034/***/ (function(module, __webpack_exports__, __webpack_require__) {
29035
29036"use strict";
29037__webpack_require__.r(__webpack_exports__);
29038/**
29039 * Calculates whether "location" is inside the polygon defined by dataHandles
29040 * by counting the number of times a ray originating from "point" crosses the
29041 * edges of the polygon. Odd === inside, Even === outside.
29042 * @export @public @method
29043 * @name pointInFreehand
29044 *
29045 * @param {Object} dataHandles Data object associated with the tool.
29046 * @param {Object} location The coordinates being queried.
29047 * @returns {boolean} True if the location is inside the polygon defined by dataHandles.
29048 */
29049/* harmony default export */ __webpack_exports__["default"] = (function (dataHandles, location) {
29050  var inROI = false; // Cycle round pairs of points
29051
29052  var j = dataHandles.length - 1; // The last vertex is the previous one to the first
29053
29054  for (var i = 0; i < dataHandles.length; i++) {
29055    if (rayFromPointCrosssesLine(location, dataHandles[i], dataHandles[j])) {
29056      inROI = !inROI;
29057    }
29058
29059    j = i; // Here j is previous vertex to i
29060  }
29061
29062  return inROI;
29063});
29064/**
29065 * Returns true if the y-position yp is enclosed within y-positions y1 and y2.
29066 * @private
29067 * @method
29068 * @name isEnclosedY
29069 *
29070 * @param {number} yp The y position of point p.
29071 * @param {number} y1 The y position of point 1.
29072 * @param {number} y2 The y position of point 2.
29073 * @returns {boolean} True if the y-position yp is enclosed within y-positions y1 and y2.
29074 */
29075
29076function isEnclosedY(yp, y1, y2) {
29077  if (y1 < yp && yp < y2 || y2 < yp && yp < y1) {
29078    return true;
29079  }
29080
29081  return false;
29082}
29083/**
29084 * Returns true if the line segment is to the right of the point.
29085 * @private
29086 * @method
29087 * @name isLineRightOfPoint
29088 *
29089 * @param {Object} point The point being queried.
29090 * @param {Object} lp1 The first point of the line segment.
29091 * @param {Object} lp2 The second point of the line segment.
29092 * @returns {boolean} True if the line is to the right of the point.
29093 */
29094
29095
29096function isLineRightOfPoint(point, lp1, lp2) {
29097  // If both right of point return true
29098  if (lp1.x > point.x && lp2.x > point.x) {
29099    return true;
29100  } // Catch when line is vertical.
29101
29102
29103  if (lp1.x === lp2.x) {
29104    return point.x < lp1.x;
29105  } // Put leftmost point in lp1
29106
29107
29108  if (lp1.x > lp2.x) {
29109    var lptemp = lp1;
29110    lp1 = lp2;
29111    lp2 = lptemp;
29112  }
29113
29114  var lPointY = lineSegmentAtPoint(point, lp1, lp2); // If the lp1.x and lp2.x enclose point.x check gradient of line and see if
29115  // Point is above or below the line to calculate if it inside.
29116
29117  if (Math.sign(lPointY.gradient) * point.y > lPointY.value) {
29118    return true;
29119  }
29120
29121  return false;
29122}
29123/**
29124 * Returns the y value of the line segment at the x value of the point.
29125 * @private
29126 * @method
29127 * @name lineSegmentAtPoint
29128 *
29129 * @param {Object} point The point being queried.
29130 * @param {Object} lp1 The first point of the line segment.
29131 * @param {Object} lp2 The second point of the line segment.
29132 * @returns {Object} An object containing the y value as well as the gradient of the line segment.
29133 */
29134
29135
29136function lineSegmentAtPoint(point, lp1, lp2) {
29137  var dydx = (lp2.y - lp1.y) / (lp2.x - lp1.x);
29138  var fx = {
29139    value: lp1.x + dydx * (point.x - lp1.x),
29140    gradient: dydx
29141  };
29142  return fx;
29143}
29144/**
29145 * Returns true if a rightwards ray originating from the point crosses the line defined by handleI and handleJ.
29146 * @private
29147 * @method
29148 * @name rayFromPointCrosssesLine
29149 *
29150 * @param {Object} point The point being queried.
29151 * @param {Object} handleI The first handle of the line segment.
29152 * @param {Object} handleJ The second handle of the line segment.
29153 * @returns {boolean} True if a rightwards ray originating from the point crosses the line defined by handleI and handleJ.
29154 */
29155
29156
29157function rayFromPointCrosssesLine(point, handleI, handleJ) {
29158  if (isEnclosedY(point.y, handleI.y, handleJ.y) && isLineRightOfPoint(point, handleI, handleJ)) {
29159    return true;
29160  }
29161
29162  return false;
29163}
29164
29165/***/ }),
29166
29167/***/ "./util/getActiveTool.js":
29168/*!*******************************!*\
29169  !*** ./util/getActiveTool.js ***!
29170  \*******************************/
29171/*! exports provided: default */
29172/***/ (function(module, __webpack_exports__, __webpack_require__) {
29173
29174"use strict";
29175__webpack_require__.r(__webpack_exports__);
29176/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return getActiveTool; });
29177/* harmony import */ var _store__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../store */ "./store/index.js");
29178/* harmony import */ var _store_getActiveToolsForElement__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../store/getActiveToolsForElement */ "./store/getActiveToolsForElement.js");
29179/* harmony import */ var _store_filterToolsUsableWithMultiPartTools__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../store/filterToolsUsableWithMultiPartTools */ "./store/filterToolsUsableWithMultiPartTools.js");
29180
29181
29182 // Todo: We could simplify this if we only allow one active
29183// Tool per mou
29183se button mask?
29184
29185function getActiveTool(element, buttons) {
29186  var interactionType = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'mouse';
29187  var tools;
29188
29189  if (interactionType === 'touch') {
29190    tools = Object(_store_getActiveToolsForElement__WEBPACK_IMPORTED_MODULE_1__["default"])(element, _store__WEBPACK_IMPORTED_MODULE_0__["getters"].touchTools());
29191    tools = tools.filter(function (tool) {
29192      return tool.options.isTouchActive;
29193    });
29194  } else {
29195    // Filter out disabled, enabled, and passive
29196    tools = Object(_store_getActiveToolsForElement__WEBPACK_IMPORTED_MODULE_1__["default"])(element, _store__WEBPACK_IMPORTED_MODULE_0__["getters"].mouseTools()); // Filter out tools that do not match mouseButtonMask
29197
29198    tools = tools.filter(function (tool) {
29199      return Array.isArray(tool.options.mouseButtonMask) && buttons && tool.options.mouseButtonMask.includes(buttons) && tool.options.isMouseActive;
29200    });
29201
29202    if (_store__WEBPACK_IMPORTED_MODULE_0__["state"].isMultiPartToolActive) {
29203      tools = Object(_store_filterToolsUsableWithMultiPartTools__WEBPACK_IMPORTED_MODULE_2__["default"])(tools);
29204    }
29205  }
29206
29207  if (tools.length === 0) {
29208    return;
29209  }
29210
29211  return tools[0];
29212}
29213
29214/***/ }),
29215
29216/***/ "./util/getDefault.js":
29217/*!****************************!*\
29218  !*** ./util/getDefault.js ***!
29219  \****************************/
29220/*! exports provided: default */
29221/***/ (function(module, __webpack_exports__, __webpack_require__) {
29222
29223"use strict";
29224__webpack_require__.r(__webpack_exports__);
29225/**
29226 * Returns the first argument if defined, otherwise returns the second
29227 *
29228 * @param {*} value
29229 * @param {*} defaultValue
29230 * @returns {*}
29231 */
29232/* harmony default export */ __webpack_exports__["default"] = (function (value, defaultValue) {
29233  return value === undefined ? defaultValue : value;
29234});
29235
29236/***/ }),
29237
29238/***/ "./util/getKeyFromKeyCode.js":
29239/*!***********************************!*\
29240  !*** ./util/getKeyFromKeyCode.js ***!
29241  \***********************************/
29242/*! exports provided: default */
29243/***/ (function(module, __webpack_exports__, __webpack_require__) {
29244
29245"use strict";
29246__webpack_require__.r(__webpack_exports__);
29247/**
29248 * Returns a string representation of the a key, given a keycode. Useful for
29249 * hooking up api calls to buttons using external libraries.
29250 * @export @public @method
29251 * @name getKeyFromKeyCode
29252 *
29253 * @param  {number} keyCode The keycode to look up.
29254 * @returns {string} The corresponding character.
29255 */
29256/* harmony default export */ __webpack_exports__["default"] = (function (keyCode) {
29257  return KEY_CODES[keyCode];
29258});
29259var KEY_CODES = {
29260  // Numbers - above letter keys
29261  48: '0',
29262  49: '1',
29263  50: '2',
29264  51: '3',
29265  52: '4',
29266  53: '5',
29267  54: '6',
29268  55: '7',
29269  56: '8',
29270  57: '9',
29271  // Numbers - numpad
29272  96: '0',
29273  97: '1',
29274  98: '2',
29275  99: '3',
29276  100: '4',
29277  101: '5',
29278  102: '6',
29279  103: '7',
29280  104: '8',
29281  105: '9',
29282  // Letters
29283  65: 'a',
29284  66: 'b',
29285  67: 'c',
29286  68: 'd',
29287  69: 'e',
29288  70: 'f',
29289  71: 'g',
29290  72: 'h',
29291  73: 'i',
29292  74: 'j',
29293  75: 'k',
29294  76: 'l',
29295  77: 'm',
29296  78: 'n',
29297  79: 'o',
29298  80: 'p',
29299  81: 'q',
29300  82: 'r',
29301  83: 's',
29302  84: 't',
29303  85: 'u',
29304  86: 'v',
29305  87: 'w',
29306  88: 'x',
29307  89: 'y',
29308  90: 'z',
29309  // Function keys
29310  112: 'F1',
29311  113: 'F2',
29312  114: 'F3',
29313  115: 'F4',
29314  116: 'F5',
29315  // Command keys
29316  13: 'RETURN',
29317  8: 'BACKSPACE',
29318  9: 'TAB',
29319  46: 'DELETE',
29320  12: 'DELETE',
29321  27: 'ESCAPE',
29322  20: 'CAPSLOCK',
29323  // Misc - NOTE: There are multiple keycodes for certain characters due to browsers having different mappings.
29324  173: '-',
29325  189: '-',
29326  109: '-',
29327  61: '+',
29328  187: '+',
29329  107: '+',
29330  219: '[',
29331  221: ']',
29332  59: ';',
29333  186: ';',
29334  188: ',',
29335  190: '.',
29336  199: '/'
29337};
29338
29339/***/ }),
29340
29341/***/ "./util/getLuminance.js":
29342/*!******************************!*\
29343  !*** ./util/getLuminance.js ***!
29344  \******************************/
29345/*! exports provided: default */
29346/***/ (function(module, __webpack_exports__, __webpack_require__) {
29347
29348"use strict";
29349__webpack_require__.r(__webpack_exports__);
29350/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js");
29351
29352/**
29353 * Returns the luminance of a region.
29354 * @public
29355 * @function getLuminance
29356 *
29357 * @param  {HTMLElement} element The element.
29358 * @param  {number} x       The x position of the top-left corner of the region.
29359 * @param  {number} y       The y position of the top-left corner of the region.
29360 * @param  {number} width   The width of the region.
29361 * @param  {number} height  The height of the region
29362 * @returns {number[]}         The luminance.
29363 */
29364
29365/* harmony default export */ __webpack_exports__["default"] = (function (element, x, y, width, height) {
29366  if (!element) {
29367    throw new Error('getLuminance: parameter element must not be undefined');
29368  }
29369
29370  x = Math.round(x);
29371  y = Math.round(y);
29372  var enabledElement = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.getEnabledElement(element);
29373  var image = enabledElement.image;
29374  var luminance = [];
29375  var index = 0;
29376  var pixelData = image.getPixelData();
29377  var spIndex, row, column;
29378
29379  if (image.color) {
29380    for (row = 0; row < height; row++) {
29381      for (column = 0; column < width; column++) {
29382        spIndex = ((row + y) * image.columns + (column + x)) * 4;
29383        var red = pixelData[spIndex];
29384        var green = pixelData[spIndex + 1];
29385        var blue = pixelData[spIndex + 2];
29386        luminance[index++] = 0.2126 * red + 0.7152 * green + 0.0722 * blue;
29387      }
29388    }
29389  } else {
29390    for (row = 0; row < height; row++) {
29391      for (column = 0; column < width; column++) {
29392        spIndex = (row + y) * image.columns + (column + x);
29393        luminance[index++] = pixelData[spIndex] * image.slope + image.intercept;
29394      }
29395    }
29396  }
29397
29398  return luminance;
29399});
29400
29401/***/ }),
29402
29403/***/ "./util/getMaxSimultaneousRequests.js":
29404/*!********************************************!*\
29405  !*** ./util/getMaxSimultaneousRequests.js ***!
29406  \********************************************/
29407/*! exports provided: getDefaultSimultaneousRequests, getMaxSimultaneousRequests, setMaxSimultaneousRequests, getBrowserInfo, isMobileDevice */
29408/***/ (function(module, __webpack_exports__, __webpack_require__) {
29409
29410"use strict";
29411__webpack_require__.r(__webpack_exports__);
29412/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getDefaultSimultaneousRequests", function() { return getDefaultSimultaneousRequests; });
29413/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getMaxSimultaneousRequests", function() { return getMaxSimultaneousRequests; });
29414/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setMaxSimultaneousRequests", function() { return setMaxSimultaneousRequests; });
29415/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getBrowserInfo", function() { return getBrowserInfo; });
29416/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isMobileDevice", function() { return isMobileDevice; });
29417var configMaxSimultaneousRequests; // Maximum concurrent connections to the same server
29418// Information from http://sgdev-blog.blogspot.fr/2014/01/maximum-concurrent-connection-to-same.html
29419
29420var maxSimultaneousRequests = {
29421  default: 6,
29422  IE: {
29423    9: 6,
29424    10: 8,
29425    default: 8
29426  },
29427  Firefox: {
29428    default: 6
29429  },
29430  Opera: {
29431    10: 8,
29432    11: 6,
29433    12: 6,
29434    default: 6
29435  },
29436  Chrome: {
29437    default: 6
29438  },
29439  Safari: {
29440    default: 6
29441  }
29442}; // Browser name / version detection
29443//
29444//
29445
29446/**
29447 * Browser name / version detection
29448 * http://stackoverflow.com/questions/2400935/browser-detection-in-javascript
29449 * @export @public @method
29450 * @name getBrowserInfo
29451 *
29452 * @returns {string} The name and version of the browser.
29453 */
29454
29455function getBrowserInfo() {
29456  var ua = navigator.userAgent;
29457  var M = ua.match(/(opera|chrome|safari|firefox|msie|trident(?=\/))\/?\s*(\d+)/i) || [];
29458  var tem;
29459
29460  if (/trident/i.test(M[1])) {
29461    tem = /\brv[ :]+(\d+)/g.exec(ua) || [];
29462    return "IE ".concat(tem[1] || '');
29463  }
29464
29465  if (M[1] === 'Chrome') {
29466    tem = ua.match(/\b(OPR|Edge)\/(\d+)/);
29467
29468    if (tem !== null) {
29469      return tem.slice(1).join(' ').replace('OPR', 'Opera');
29470    }
29471  }
29472
29473  M = M[2] ? [M[1], M[2]] : [navigator.appName, navigator.appVersion, '-?'];
29474
29475  if ((tem = ua.match(/version\/(\d+)/i)) !== null) {
29476    M.splice(1, 1, tem[1]);
29477  }
29478
29479  return M.join(' ');
29480}
29481/**
29482 * Sets the maximum number of simultaneous requests.
29483 * @export @public @method
29484 * @name setMaxSimultaneousRequests
29485 *
29486 * @param  {number} newMaxSimultaneousRequests The value.
29487 * @returns {void}
29488 */
29489
29490
29491function setMaxSimultaneousRequests(newMaxSimultaneousRequests) {
29492  configMaxSimultaneousRequests = newMaxSimultaneousRequests;
29493}
29494/**
29495 * Returns the maximum number of simultaneous requests.
29496 * @export @public @method
29497 * @name getMaxSimultaneousRequests
29498 *
29499 * @returns {number} The maximum number of simultaneous requests
29500 */
29501
29502
29503function getMaxSimultaneousRequests() {
29504  if (configMaxSimultaneousRequests) {
29505    return configMaxSimultaneousRequests;
29506  }
29507
29508  return getDefaultSimultaneousRequests();
29509}
29510/**
29511 * Returns the default number of simultaneous requests.
29512 * @export @public @method
29513 * @name getDefaultSimultaneousRequests
29514 *
29515 * @returns {number} The default number of simultaneous requests.
29516 */
29517
29518
29519function getDefaultSimultaneousRequests() {
29520  var infoString = getBrowserInfo();
29521  var info = infoString.split(' ');
29522  var browserName = info[0];
29523  var browserVersion = info[1];
29524  var browserData = maxSimultaneousRequests[browserName];
29525
29526  if (!browserData) {
29527    return maxSimultaneousRequests.default;
29528  }
29529
29530  if (!browserData[browserVersion]) {
29531    return browserData.default;
29532  }
29533
29534  return browserData[browserVersion];
29535}
29536/**
29537 * Checks if cornerstoneTools is operating on a mobile device.
29538 * @export @public @method
29539 * @name isMobileDevice
29540 *
29541 * @returns {boolean} True if running on a mobile device.
29542 */
29543
29544
29545function isMobileDevice() {
29546  var pattern = new RegExp('Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini');
29547  return pattern.test(navigator.userAgent);
29548}
29549
29550
29551
29552/***/ }),
29553
29554/***/ "./util/getPixelSpacing.js":
29555/*!*********************************!*\
29556  !*** ./util/getPixelSpacing.js ***!
29557  \*********************************/
29558/*! exports provided: default */
29559/***/ (function(module, __webpack_exports__, __webpack_require__) {
29560
29561"use strict";
29562__webpack_require__.r(__webpack_exports__);
29563/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return getPixelSpacing; });
29564/* harmony import */ var _externalModules__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../externalModules */ "./externalModules.js");
29565
29566function getPixelSpacing(image) {
29567  var imagePlane = _externalModules__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.metaData.get('imagePlaneModule', image.imageId);
29568
29569  if (imagePlane) {
29570    return {
29571      rowPixelSpacing: imagePlane.rowPixelSpacing || imagePlane.rowImagePixelSpacing,
29572      colPixelSpacing: imagePlane.columnPixelSpacing || imagePlane.colImagePixelSpacing
29573    };
29574  }
29575
29576  return {
29577    rowPixelSpacing: image.rowPixelSpacing,
29578    colPixelSpacing: image.columnPixelSpacing
29579  };
29580}
29581
29582/***/ }),
29583
29584/***/ "./util/getRGBPixels.js":
29585/*!******************************!*\
29586  !*** ./util/getRGBPixels.js ***!
29587  \******************************/
29588/*! exports provided: default */
29589/***/ (function(module, __webpack_exports__, __webpack_require__) {
29590
29591"use strict";
29592__webpack_require__.r(__webpack_exports__);
29593/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js");
29594
29595/**
29596 * Gets pixels of an RGB image.
29597 * @export @public @method
29598 * @name getRGBPixels
29599 *
29600 * @param  {HTMLElement} element The element.
29601 * @param  {number} x       The x position of the top-left corner of the region.
29602 * @param  {number} y       The y position of the top-left corner of the region.
29603 * @param  {number} width   The width of the region.
29604 * @param  {number} height  The height of the region
29605 * @returns {number[]}       The pixel data.
29606 */
29607
29608/* harmony default export */ __webpack_exports__["default"] = (function (element, x, y, width, height) {
29609  if (!element) {
29610    throw new Error('getRGBPixels: parameter element must not be undefined');
29611  }
29612
29613  x = Math.round(x);
29614  y = Math.round(y);
29615  var enabledElement = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.getEnabledElement(element);
29616  var storedPixelData = [];
29617  var index = 0;
29618  var pixelData = enabledElement.image.getPixelData();
29619  var spIndex, row, column;
29620
29621  if (enabledElement.image.color) {
29622    for (row = 0; row < height; row++) {
29623      for (column = 0; column < width; column++) {
29624        spIndex = ((row + y) * enabledElement.image.columns + (column + x)) * 4;
29625        var red = pixelData[spIndex];
29626        var green = pixelData[spIndex + 1];
29627        var blue = pixelData[spIndex + 2];
29628        var alpha = pixelData[spIndex + 3];
29629        storedPixelData[index++] = red;
29630        storedPixelData[index++] = green;
29631        storedPixelData[index++] = blue;
29632        storedPixelData[index++] = alpha;
29633      }
29634    }
29635  }
29636
29637  return storedPixelData;
29638});
29639
29640/***/ }),
29641
29642/***/ "./util/getROITextBoxCoords.js":
29643/*!*************************************!*\
29644  !*** ./util/getROITextBoxCoords.js ***!
29645  \*************************************/
29646/*! exports provided: default */
29647/***/ (function(module, __webpack_exports__, __webpack_require__) {
29648
29649"use strict";
29650__webpack_require__.r(__webpack_exports__);
29651/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return getROITextBoxCoords; });
29652/**
29653 * Determine the coordinates that will place the textbox to the right of the
29654 * annotation, taking rotation, hflip, and vflip into account.
29655 *
29656 * @param {Object} viewport - The object that stores rotation, hflip, and vflip.
29657 * @param {Object} handles - The handles of the annotation.
29658 * @returns {Object} - The coordinates for default placement of the textbox
29659 */
29660function getROITextBoxCoords(viewport, handles) {
29661  var corners = _determineCorners(handles);
29662
29663  var centerX = (corners.left.x + corners.right.x) / 2;
29664  var centerY = (corners.top.y + corners.bottom.y) / 2;
29665  var textBox = {};
29666
29667  if (viewport.rotation >= 0 && viewport.rotation < 90) {
29668    textBox.x = viewport.hflip ? corners.left.x : corners.right.x;
29669    textBox.y = centerY;
29670  }
29671
29672  if (viewport.rotation >= 90 && viewport.rotation < 180) {
29673    textBox.x = centerX;
29674    textBox.y = viewport.vflip ? corners.bottom.y : corners.top.y;
29675  }
29676
29677  if (viewport.rotation >= 180 && viewport.rotation < 270) {
29678    textBox.x = viewport.hflip ? corners.right.x : corners.left.x;
29679    textBox.y = centerY;
29680  }
29681
29682  if (viewport.rotation >= 270 && viewport.rotation < 360) {
29683    textBox.x = centerX;
29684    textBox.y = viewport.vflip ? corners.top.y : corners.bottom.y;
29685  }
29686
29687  return textBox;
29688}
29689/**
29690 * Determine the handles that have the min/max x and y values.
29691 *
29692 * @param {Object} handles - The handles of the annotation.
29693 * @returns {Object} - The top, left, bottom, and right handles
29694 */
29695
29696function _determineCorners(handles) {
29697  var handlesLeftToRight = [handles.start, handles.end].sort(_compareX);
29698  var handlesTopToBottom = [handles.start, handles.end].sort(_compareY);
29699  var left = handlesLeftToRight[0];
29700  var right = handlesLeftToRight[handlesLeftToRight.length - 1];
29701  var top = handlesTopToBottom[0];
29702  var bottom = handlesTopToBottom[handlesTopToBottom.length - 1];
29703  return {
29704    top: top,
29705    left: left,
29706    bottom: bottom,
29707    right: right
29708  };
29709
29710  function _compareX(a, b) {
29711    return a.x < b.x ? -1 : 1;
29712  }
29713
29714  function _compareY(a, b) {
29715    return a.y < b.y ? -1 : 1;
29716  }
29717}
29718
29719/***/ }),
29720
29721/***/ "./util/isObject.js":
29722/*!**************************!*\
29723  !*** ./util/isObject.js ***!
29724  \**************************/
29725/*! exports provided: default */
29726/***/ (function(module, __webpack_exports__, __webpack_require__) {
29727
29728"use strict";
29729__webpack_require__.r(__webpack_exports__);
29730/* harmony import */ var _babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/typeof */ "../node_modules/@babel/runtime/helpers/typeof.js");
29731/* harmony import */ var _babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0__);
29732
29733
29734/**
29735 * Checks if `value` is the
29736 * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
29737 * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
29738 *
29739 * @since 0.1.0
29740 * @category Lang
29741 * @param {*} value The value to check.
29742 * @returns {boolean} Returns `true` if `value` is an object, else `false`.
29743 * @example
29744 *
29745 * isObject({})
29746 * // => true
29747 *
29748 * isObject([1, 2, 3])
29749 * // => true
29750 *
29751 * isObject(Function)
29752 * // => true
29753 *
29754 * isObject(null)
29755 * // => false
29756 */
29757function isObject(value) {
29758  var type = _babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0___default()(value);
29759
29760  return value !== null && (type === 'object' || type === 'function');
29761}
29762
29763/* harmony default export */ __webpack_exports__["default"] = (isObject);
29764
29765/***/ }),
29766
29767/***/ "./util/lineSegDistance.js":
29768/*!*********************************!*\
29769  !*** ./util/lineSegDistance.js ***!
29770  \*********************************/
29771/*! exports provided: default */
29772/***/ (function(module, __webpack_exports__, __webpack_require__) {
29773
29774"use strict";
29775__webpack_require__.r(__webpack_exports__);
29776/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js");
29777
29778/**
29779 * Calculates the distance of a line segment from a point.
29780 * @export @public @method
29781 * @name lineSegDistance
29782 *
29783 * @param  {HTMLElement} element The element.
29784 * @param  {Object} start   The starting position of the line.
29785 * @param  {Object} end     The end position of the line.
29786 * @param  {Object} coords  The coordinates of the point.
29787 * @returns {name}         The distance between the line and the point.
29788 */
29789
29790/* harmony default export */ __webpack_exports__["default"] = (function (element, start, end, coords) {
29791  var cornerstone = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone;
29792  var lineSegment = {
29793    start: cornerstone.pixelToCanvas(element, start),
29794    end: cornerstone.pixelToCanvas(element, end)
29795  };
29796  return _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstoneMath.lineSegment.distanceToPoint(lineSegment, coords);
29797});
29798
29799/***/ }),
29800
29801/***/ "./util/logger.js":
29802/*!************************!*\
29803  !*** ./util/logger.js ***!
29804  \************************/
29805/*! exports provided: getLogger, enable, disable */
29806/***/ (function(module, __webpack_exports__, __webpack_require__) {
29807
29808"use strict";
29809__webpack_require__.r(__webpack_exports__);
29810/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getLogger", function() { return getLogger; });
29811/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "enable", function() { return enable; });
29812/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "disable", function() { return disable; });
29813/* harmony import */ var debug__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! debug */ "../node_modules/debug/src/browser.js");
29814/* harmony import */ var debug__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(debug__WEBPACK_IMPORTED_MODULE_0__);
29815
29816var BASE_SCOPE = 'cornerstoneTools';
29817var baseLogger = debug__WEBPACK_IMPORTED_MODULE_0___default()(BASE_SCOPE); // eslint-disable-next-line no-process-env
29818
29819var devMode = "development" === 'development'; // If we're in dev-mode, tell the user how to get logs
29820
29821if (devMode && !baseLogger.enabled) {
29822  // eslint-disable-next-line no-console
29823  console.log('%cCornerstone Tools', 'background: #339955; padding: 4px; font-weight: bold; color: white'); // eslint-disable-next-line no-console
29824
29825  console.info('run %clocalStorage.setItem("debug", "cornerstoneTools")%c to see console output', 'background: #eaeaea; color: #333; font-family: monospace', '');
29826}
29827/**
29828 * @method debug
29829 * Create's a scoped debuging logger
29830 */
29831
29832
29833var getLogger = function getLogger(scope) {
29834  var log = baseLogger.extend(scope);
29835  return {
29836    log: log,
29837    // eslint-disable-next-line no-console
29838    warn: devMode ? console.warn.bind(console) : log,
29839    // eslint-disable-next-line no-console
29840    error: console.error.bind(console)
29841  };
29842};
29843/**
29844 * @method enable
29845 * @param {string} scope The scope to enabled
29846 * @returns {void}
29847 */
29848
29849var enable = function enable() {
29850  var scope = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : "".concat(BASE_SCOPE, ":*");
29851  return debug__WEBPACK_IMPORTED_MODULE_0___default.a.enable(scope);
29852};
29853/**
29854 * @method disable
29855 * @param {string} scope
29856 * @returns {string} The previously enabled scope
29857 */
29858
29859var disable = function disable() {
29860  return debug__WEBPACK_IMPORTED_MODULE_0___default.a.disable();
29861};
29862
29863/***/ }),
29864
29865/***/ "./util/makeUnselectable.js":
29866/*!**********************************!*\
29867  !*** ./util/makeUnselectable.js ***!
29868  \**********************************/
29869/*! exports provided: default */
29870/***/ (function(module, __webpack_exports__, __webpack_require__) {
29871
29872"use strict";
29873__webpack_require__.r(__webpack_exports__);
29874/**
29875 * A helper function to make an element (and its content) being non selectable.
29876 * @export @public @method
29877 * @name makeUnselectable
29878 *
29879 * @param {HTMLElement} element The element to make unselectable
29880 * @param {Boolean} ignorePointerEvents  true to make this element also
29881 * ignore events (e.g. mouse click), false otherwise.
29882 * @returns {void}
29883 */
29884/* harmony default export */ __webpack_exports__["default"] = (function (element, ignorePointerEvents) {
29885  element.style.webkitUserSelect = 'none';
29886  element.style.webkitTouchCallout = 'none';
29887  element.style.mozUserSelect = 'none';
29888  element.style.msUserSelect = 'none';
29889  element.style.oUserSelect = 'none';
29890  element.style.khtmlUserSelect = 'none';
29891  element.style.userSelect = 'none';
29892  element.unselectable = 'on';
29893
29894  element.oncontextmenu = function () {
29895    return false;
29896  };
29897
29898  if (ignorePointerEvents === true) {
29899    element.style.pointerEvents = 'none';
29900  }
29901});
29902
29903/***/ }),
29904
29905/***/ "./util/numbersWithCommas.js":
29906/*!***********************************!*\
29907  !*** ./util/numbersWithCommas.js ***!
29908  \***********************************/
29909/*! exports provided: default */
29910/***/ (function(module, __webpack_exports__, __webpack_require__) {
29911
29912"use strict";
29913__webpack_require__.r(__webpack_exports__);
29914/**
29915 * Converts a number to a string with comma separators.
29916 * http://stackoverflow.com/questions/2901102/how-to-print-a-number-with-commas-as-thousands-separators-in-javascript
29917 * @export @public @method
29918 * @name numbersWithCommas
29919 *
29920 * @param  {number} x The number to convert.
29921 * @returns {string}   The pretty-printed number as a string.
29922 */
29923/* harmony default export */ __webpack_exports__["default"] = (function (x) {
29924  var parts = x.toString().split('.');
29925  parts[0] = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, ',');
29926  return parts.join('.');
29927});
29928
29929/***/ }),
29930
29931/***/ "./util/pointInsideBoundingBox.js":
29932/*!****************************************!*\
29933  !*** ./util/pointInsideBoundingBox.js ***!
29934  \****************************************/
29935/*! exports provided: default */
29936/***/ (function(module, __webpack_exports__, __webpack_require__) {
29937
29938"use strict";
29939__webpack_require__.r(__webpack_exports__);
29940/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js");
29941
29942/**
29943 * Returns true if a point is enclosed within a bounding box.
29944 * @export @public @method
29945 * @name pointInsideBoundingBox
29946 *
29947 * @param  {Object} handle The handle containing the boundingBox.
29948 * @param  {Object} coords The coordinate to check.
29949 * @returns {boolean} True if the point is enclosed within the bounding box.
29950 */
29951
29952/* harmony default export */ __webpack_exports__["default"] = (function (handle, coords) {
29953  if (!handle.boundingBox) {
29954    return;
29955  }
29956
29957  return _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstoneMath.point.insideRect(coords, handle.boundingBox);
29958});
29959
29960/***/ }),
29961
29962/***/ "./util/pointProjector.js":
29963/*!********************************!*\
29964  !*** ./util/pointProjector.js ***!
29965  \********************************/
29966/*! exports provided: projectPatientPointToImagePlane, imagePointToPatientPoint, planePlaneIntersection, rotatePoint */
29967/***/ (function(module, __webpack_exports__, __webpack_require__) {
29968
29969"use strict";
29970__webpack_require__.r(__webpack_exports__);
29971/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "projectPatientPointToImagePlane", function() { return projectPatientPointToImagePlane; });
29972/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "imagePointToPatientPoint", function() { return imagePointToPatientPoint; });
29973/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "planePlaneIntersection", function() { return planePlaneIntersection; });
29974/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "rotatePoint", function() { return rotatePoint; });
29975/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js");
29976/* harmony import */ var _util_convertToVector3_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../util/convertToVector3.js */ "./util/convertToVector3.js");
29977
29978
29979/**
29980 * Projects a patient point to an image point
29981 * @export @public @method
29982 * @name projectPatientPointToImagePlane
29983 *
29984 * @param  {Object} patientPoint The patient point.
29985 * @param  {Object} imagePlane   The image plane used for projection.
29986 * @returns {Object}              The projected coordinates.
29987 */
29988
29989function projectPatientPointToImagePlane(patientPoint, imagePlane) {
29990  var rowCosines = Object(_util_convertToVector3_js__WEBPACK_IMPORTED_MODULE_1__["default"])(imagePlane.rowCosines);
29991  var columnCosines = Object(_util_convertToVector3_js__WEBPACK_IMPORTED_MODULE_1__["default"])(imagePlane.columnCosines);
29992  var imagePositionPatient = Object(_util_convertToVector3_js__WEBPACK_IMPORTED_MODULE_1__["default"])(imagePlane.imagePositionPatient);
29993  var point = patientPoint.clone().sub(imagePositionPatient);
29994  var x = rowCosines.dot(point) / imagePlane.columnPixelSpacing;
29995  var y = columnCosines.dot(point) / imagePlane.rowPixelSpacing;
29996  return {
29997    x: x,
29998    y: y
29999  };
30000} //
30001
30002/**
30003 * Projects an image point to a patient point
30004 * @export @public @method
30005 * @name imagePointToPatientPoint
30006 *
30007 * @param  {Object} imagePoint   The image point.
30008 * @param  {Object} imagePlane   The image plane used for projection.
30009 * @returns {Object}              The projected coordinates.
30010 */
30011
30012function imagePointToPatientPoint(imagePoint, imagePlane) {
30013  var rowCosines = Object(_util_convertToVector3_js__WEBPACK_IMPORTED_MODULE_1__["default"])(imagePlane.rowCosines);
30014  var columnCosines = Object(_util_convertToVector3_js__WEBPACK_IMPORTED_MODULE_1__["default"])(imagePlane.columnCosines);
30015  var imagePositionPatient = Object(_util_convertToVector3_js__WEBPACK_IMPORTED_MODULE_1__["default"])(imagePlane.imagePositionPatient);
30016  var x = rowCosines.clone().multiplyScalar(imagePoint.x);
30017  x.multiplyScalar(imagePlane.columnPixelSpacing);
30018  var y = columnCosines.clone().multiplyScalar(imagePoint.y);
30019  y.multiplyScalar(imagePlane.rowPixelSpacing);
30020  var patientPoint = x.add(y);
30021  patientPoint.add(imagePositionPatient);
30022  return patientPoint;
30023}
30024/**
30025 * Returns a rectangle from the imagePlane.
30026 * @export @public @method
30027 * @name getRectangleFromImagePlane
30028 *
30029 * @param  {Object} imagePlane The imagePlane.
30030 * @returns {Object} The rect.
30031 */
30032
30033function getRectangleFromImagePlane(imagePlane) {
30034  // Get the points
30035  var topLeft = imagePointToPatientPoint({
30036    x: 0,
30037    y: 0
30038  }, imagePlane);
30039  var topRight = imagePointToPatientPoint({
30040    x: imagePlane.columns,
30041    y: 0
30042  }, imagePlane);
30043  var bottomLeft = imagePointToPatientPoint({
30044    x: 0,
30045    y: imagePlane.rows
30046  }, imagePlane);
30047  var bottomRight = imagePointToPatientPoint({
30048    x: imagePlane.columns,
30049    y: imagePlane.rows
30050  }, imagePlane); // Get each side as a vector
30051
30052  var rect = {
30053    top: new _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstoneMath.Line3(topLeft, top
30053Right),
30054    left: new _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstoneMath.Line3(topLeft, bottomLeft),
30055    right: new _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstoneMath.Line3(topRight, bottomRight),
30056    bottom: new _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstoneMath.Line3(bottomLeft, bottomRight)
30057  };
30058  return rect;
30059}
30060/**
30061 * Gets all the intersections of a line with a rect.
30062 * @private
30063 * @method
30064 * @name lineRectangleIntersection
30065 *
30066 * @param  {Object} line The line to check.
30067 * @param  {Object} rect The rect being intersected.
30068 * @returns {Object[]} An array of the intersections.
30069 */
30070
30071
30072function lineRectangleIntersection(line, rect) {
30073  var intersections = [];
30074  Object.keys(rect).forEach(function (side) {
30075    var segment = rect[side];
30076    var intersection = line.intersectLine(segment);
30077
30078    if (intersection) {
30079      intersections.push(intersection);
30080    }
30081  });
30082  return intersections;
30083}
30084/**
30085 * Gets the line of intersection between two planes in patient space.
30086 * @export @public @method
30087 * @name planePlaneIntersection
30088 *
30089 * @param  {Object} targetImagePlane    The target plane.
30090 * @param  {Object} referenceImagePlane The reference plane
30091 * @returns {Object}                   The intersections.
30092 */
30093
30094
30095function planePlaneIntersection(targetImagePlane, referenceImagePlane) {
30096  var targetRowCosines = Object(_util_convertToVector3_js__WEBPACK_IMPORTED_MODULE_1__["default"])(targetImagePlane.rowCosines);
30097  var targetColumnCosines = Object(_util_convertToVector3_js__WEBPACK_IMPORTED_MODULE_1__["default"])(targetImagePlane.columnCosines);
30098  var targetImagePositionPatient = Object(_util_convertToVector3_js__WEBPACK_IMPORTED_MODULE_1__["default"])(targetImagePlane.imagePositionPatient);
30099  var referenceRowCosines = Object(_util_convertToVector3_js__WEBPACK_IMPORTED_MODULE_1__["default"])(referenceImagePlane.rowCosines);
30100  var referenceColumnCosines = Object(_util_convertToVector3_js__WEBPACK_IMPORTED_MODULE_1__["default"])(referenceImagePlane.columnCosines);
30101  var referenceImagePositionPatient = Object(_util_convertToVector3_js__WEBPACK_IMPORTED_MODULE_1__["default"])(referenceImagePlane.imagePositionPatient); // First, get the normals of each image plane
30102
30103  var targetNormal = targetRowCosines.clone().cross(targetColumnCosines);
30104  var targetPlane = new _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstoneMath.Plane();
30105  targetPlane.setFromNormalAndCoplanarPoint(targetNormal, targetImagePositionPatient);
30106  var referenceNormal = referenceRowCosines.clone().cross(referenceColumnCosines);
30107  var referencePlane = new _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstoneMath.Plane();
30108  referencePlane.setFromNormalAndCoplanarPoint(referenceNormal, referenceImagePositionPatient);
30109  var originDirection = referencePlane.clone().intersectPlane(targetPlane);
30110  var origin = originDirection.origin;
30111  var direction = originDirection.direction; // Calculate the longest possible length in the reference image plane (the length of the diagonal)
30112
30113  var bottomRight = imagePointToPatientPoint({
30114    x: referenceImagePlane.columns,
30115    y: referenceImagePlane.rows
30116  }, referenceImagePlane);
30117  var distance = referenceImagePositionPatient.distanceTo(bottomRight); // Use this distance to bound the ray intersecting the two planes
30118
30119  var line = new _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstoneMath.Line3();
30120  line.start = origin;
30121  line.end = origin.clone().add(direction.multiplyScalar(distance)); // Find the intersections between this line and the reference image plane's four sides
30122
30123  var rect = getRectangleFromImagePlane(referenceImagePlane);
30124  var intersections = lineRectangleIntersection(line, rect); // Return the intersections between this line and the reference image plane's sides
30125  // In order to draw the reference line from the target image.
30126
30127  if (intersections.length !== 2) {
30128    return;
30129  }
30130
30131  return {
30132    start: intersections[0],
30133    end: intersections[1]
30134  };
30135}
30136/**
30137 * Translate a point using a rotation angle.
30138 * @export @public @method
30139 * @name rotatePoint
30140 *
30141 * @param {Object} point - `{ x, y }` in either pixel or canvas coordinates.
30142 * @param {Object} center - `{ x, y }` in either pixel or canvas coordinates.
30143 * @param {Number} angle - angle in degrees
30144 * @returns {Object} - `{ x, y }` new point translated
30145 */
30146
30147function rotatePoint(point, center, angle) {
30148  var angleRadians = angle * (Math.PI / 180); // Convert to radians
30149
30150  var rotatedX = Math.cos(angleRadians) * (point.x - center.x) - Math.sin(angleRadians) * (point.y - center.y) + center.x;
30151  var rotatedY = Math.sin(angleRadians) * (point.x - center.x) + Math.
30151cos(angleRadians) * (point.y - center.y) + center.y;
30152  return {
30153    x: rotatedX,
30154    y: rotatedY
30155  };
30156}
30157
30158/***/ }),
30159
30160/***/ "./util/roundToDecimal.js":
30161/*!********************************!*\
30162  !*** ./util/roundToDecimal.js ***!
30163  \********************************/
30164/*! exports provided: default */
30165/***/ (function(module, __webpack_exports__, __webpack_require__) {
30166
30167"use strict";
30168__webpack_require__.r(__webpack_exports__);
30169/**
30170 * Rounds a number to the specified precision.
30171 * @export @public @method
30172 * @name roundToDecimal
30173 *
30174 * @param  {number} value     The value to round.
30175 * @param  {number} precision The required precision.
30176 * @returns {number}           The rounded number.
30177 */
30178/* harmony default export */ __webpack_exports__["default"] = (function (value, precision) {
30179  var multiplier = Math.pow(10, precision);
30180  return Math.round(value * multiplier) / multiplier;
30181});
30182
30183/***/ }),
30184
30185/***/ "./util/scroll.js":
30186/*!************************!*\
30187  !*** ./util/scroll.js ***!
30188  \************************/
30189/*! exports provided: default */
30190/***/ (function(module, __webpack_exports__, __webpack_require__) {
30191
30192"use strict";
30193__webpack_require__.r(__webpack_exports__);
30194/* harmony import */ var _scrollToIndex_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./scrollToIndex.js */ "./util/scrollToIndex.js");
30195/* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../stateManagement/toolState.js */ "./stateManagement/toolState.js");
30196/* harmony import */ var _clip_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./clip.js */ "./util/clip.js");
30197/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./../externalModules.js */ "./externalModules.js");
30198
30199
30200
30201
30202/**
30203 * Scrolls through the stack.
30204 * @export @public @method
30205 * @name scroll
30206 *
30207 * @param  {HTMLElement} element          The element to scroll.
30208 * @param  {number} images                The number of images to scroll through.
30209 * @param  {type} [loop = false]          Whether to loop the scrolling.
30210 * @param  {type} [allowSkipping = true]  Whether frames can be skipped.
30211 * @returns {void}
30212 */
30213
30214/* harmony default export */ __webpack_exports__["default"] = (function (element, images) {
30215  var loop = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
30216  var allowSkipping = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;
30217  var toolData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_1__["getToolState"])(element, 'stack');
30218
30219  if (!toolData || !toolData.data || !toolData.data.length) {
30220    return;
30221  }
30222
30223  var stackData = toolData.data[0];
30224
30225  if (!stackData.pending) {
30226    stackData.pending = [];
30227  }
30228
30229  var newImageIdIndex = stackData.currentImageIdIndex + images;
30230
30231  if (loop) {
30232    var nbImages = stackData.imageIds.length;
30233    newImageIdIndex %= nbImages;
30234  } else {
30235    newImageIdIndex = Object(_clip_js__WEBPACK_IMPORTED_MODULE_2__["default"])(newImageIdIndex, 0, stackData.imageIds.length - 1);
30236  }
30237
30238  if (allowSkipping) {
30239    Object(_scrollToIndex_js__WEBPACK_IMPORTED_MODULE_0__["default"])(element, newImageIdIndex);
30240  } else {
30241    var pendingEvent = {
30242      index: newImageIdIndex
30243    };
30244    stackData.pending.push(pendingEvent);
30245    scrollWithoutSkipping(stackData, pendingEvent, element);
30246  }
30247});
30248/**
30249 * Recursively scrolls the stack until the desired image is reached.
30250 * @private
30251 * @method
30252 * @name scrollWithoutSkipping
30253 *
30254 * @param  {type} stackData    Data object containing information about the stack.
30255 * @param  {Object} pendingEvent The event to process next.
30256 * @param  {HTMLElement} element      The element being scrolled through.
30257 * @returns {void}
30258 */
30259
30260function scrollWithoutSkipping(stackData, pendingEvent, element) {
30261  if (stackData.pending[0] === pendingEvent) {
30262    if (stackData.currentImageIdIndex === pendingEvent.index) {
30263      stackData.pending.splice(stackData.pending.indexOf(pendingEvent), 1);
30264
30265      if (stackData.pending.length > 0) {
30266        scrollWithoutSkipping(stackData, stackData.pending[0], element);
30267      }
30268
30269      return;
30270    }
30271
30272    var newImageHandler = function newImageHandler(event) {
30273      var index = stackData.imageIds.indexOf(event.detail.image.imageId);
30274
30275      if (index === pendingEvent.index) {
30276        stackData.pending.splice(stackData.pending.indexOf(pendingEvent), 1);
30277        element.removeEventListener(_externalModules_js__WEBPACK_IMPORTED_MODULE_3__["default"].cornerstone.EVENTS.NEW_IMAGE, newImageHandler);
30278
30279        if (stackData.pending.length > 0) {
30280          scrollWithoutSkipping(stackData, stackData.pending[0], element);
30281        }
30282      }
30283    };
30284
30285    element.addEventListener(_externalModules_js__WEBPACK_IMPORTED_MODULE_3__["default"].cornerstone.EVENTS.NEW_IMAGE, newImageHandler);
30286    Object(_scrollToIndex_js__WEBPACK_IMPORTED_MODULE_0__["default"])(element, pendingEvent.index);
30287  }
30288}
30289
30290/***/ }),
30291
30292/***/ "./util/scrollToIndex.js":
30293/*!*******************************!*\
30294  !*** ./util/scrollToIndex.js ***!
30295  \*******************************/
30296/*! exports provided: default */
30297/***/ (function(module, __webpack_exports__, __webpack_require__) {
30298
30299"use strict";
30300__webpack_require__.r(__webpack_exports__);
30301/* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../events.js */ "./events.js");
30302/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js");
30303/* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../stateManagement/toolState.js */ "./stateManagement/toolState.js");
30304/* harmony import */ var _requestPool_requestPoolManager_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../requestPool/requestPoolManager.js */ "./requestPool/requestPoolManager.js");
30305/* harmony import */ var _stateManagement_loadHandlerManager_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../stateManagement/loadHandlerManager.js */ "./stateManagement/loadHandlerManager.js");
30306/* harmony import */ var _util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../util/triggerEvent.js */ "./util/triggerEvent.js");
30307
30308
30309
30310
30311
30312
30313/**
30314 * Scrolls through the stack to the image index requested.
30315 * @export @public @method
30316 * @name scrollToIndex
30317 *
30318 * @param  {type} element         The element to scroll through.
30319 * @param  {type} newImageIdIndex The target image index.
30320 * @returns {void}
30321 */
30322
30323/* harmony default export */ __webpack_exports__["default"] = (function (element, newImageIdIndex) {
30324  var toolData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_2__["getToolState"])(element, 'stack');
30325
30326  if (!toolData || !toolData.data || !toolData.data.length) {
30327    return;
30328  }
30329
30330  var cornerstone = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone; // If we have more than one stack, check if we have a stack renderer defined
30331
30332  var stackRenderer;
30333
30334  if (toolData.data.length > 1) {
30335    var stackRendererData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_2__["getToolState"])(element, 'stackRenderer');
30336
30337    if (stackRendererData && stackRendererData.data && stackRendererData.data.length) {
30338      stackRenderer = stackRendererData.data[0];
30339    }
30340  }
30341
30342  var stackData = toolData.data[0]; // Allow for negative indexing
30343
30344  if (newImageIdIndex < 0) {
30345    newImageIdIndex += stackData.imageIds.length;
30346  }
30347
30348  var startLoadingHandler = _stateManagement_loadHandlerManager_js__WEBPACK_IMPORTED_MODULE_4__["default"].getStartLoadHandler(element);
30349  var endLoadingHandler = _stateManagement_loadHandlerManager_js__WEBPACK_IMPORTED_MODULE_4__["default"].getEndLoadHandler(element);
30350  var errorLoadingHandler = _stateManagement_loadHandlerManager_js__WEBPACK_IMPORTED_MODULE_4__["default"].getErrorLoadingHandler(element);
30351
30352  function doneCallback(image) {
30353    if (stackData.currentImageIdIndex !== newImageIdIndex) {
30354      return;
30355    } // Check if the element is still enabled in Cornerstone,
30356    // If an error is thrown, stop here.
30357
30358
30359    try {
30360      // TODO: Add 'isElementEnabled' to Cornerstone?
30361      cornerstone.getEnabledElement(element);
30362    } catch (error) {
30363      return;
30364    }
30365
30366    if (stackRenderer) {
30367      stackRenderer.currentImageIdIndex = newImageIdIndex;
30368      stackRenderer.render(element, toolData.data);
30369    } else {
30370      cornerstone.displayImage(element, image);
30371    }
30372
30373    if (endLoadingHandler) {
30374      endLoadingHandler(element, image);
30375    }
30376  }
30377
30378  function failCallback(error) {
30379    var imageId = stackData.imageIds[newImageIdIndex];
30380
30381    if (errorLoadingHandler) {
30382      errorLoadingHandler(element, imageId, error);
30383    }
30384  }
30385
30386  if (newImageIdIndex === stackData.currentImageIdIndex) {
30387    return;
30388  }
30389
30390  if (startLoadingHandler) {
30391    startLoadingHandler(element);
30392  }
30393
30394  var eventData = {
30395    newImageIdIndex: newImageIdIndex,
30396    direction: newImageIdIndex - stackData.currentImageIdIndex
30397  };
30398  stackData.currentImageIdIndex = newImageIdIndex;
30399  var newImageId = stackData.imageIds[newImageIdIndex]; // Retry image loading in cases where previous image promise
30400  // Was rejected, if the option is set
30401
30402  /*
30403     Const config = stackScroll.getConfiguration();
30404     TODO: Revisit this. It appears that Core's imageCache is not
30405    keeping rejected promises anywhere, so we have no way to know
30406    if something was previously rejected.
30407     if (config && config.retryLoadOnScroll === true) {
30408    }
30409  */
30410  // Convert the preventCache value in stack data to a boolean
30411
30412  var preventCache = Boolean(stackData.preventCache);
30413  var imagePromise;
30414
30415  if (preventCache) {
30416    imagePromise = cornerstone.loadImage(newImageId);
30417  } else {
30418    imagePromise = cornerstone.loadAndCacheImage(newImageId);
30419  }
30420
30421  imagePromise.then(doneCallback, failCallback); // Make sure we kick off any changed download request pools
30422
30423  _requestPool_requestPoolManager_js__WEBPACK_IMPORTED_MODULE_3__["default"].startGrabbing();
30424  Object(_util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_5__["default"])(element, _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].STACK_SCROLL, eventData);
30425});
30426
30427/***/ }),
30428
30429/***/ "./util/setContextToDisplayFontSize.js":
30430/*!*********************************************!*\
30431  !*** ./util/setContextToDisplayFontSize.js ***!
30432  \*********************************************/
30433/*! exports provided: default */
30434/***/ (function(module, __webpack_exports__, __webpack_require__) {
30435
30436"use strict";
30437__webpack_require__.r(__webpack_exports__);
30438/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js");
30439
30440/**
30441 * Sets the canvas context transformation matrix so it is scaled to show text
30442 * more cleanly even if the image is scaled up.  See
30443 * https://github.com/cornerstonejs/cornerstoneTools/wiki/DrawingText
30444 * for more information
30445 * @export @public @function
30446 * @name setContextToDisplayFontSize
30447 *
30448 * @param {HTMLElement} enabledElement The cornerstone enabled element.
30449 * @param {CanvasRenderingContext2D} context The canvas context.
30450 * @param {number} fontSize The font size.
30451 * @returns {Object} {fontSize: number, lineHeight: number, fontScale: number}
30452 */
30453
30454/* harmony default export */ __webpack_exports__["default"] = (function (enabledElement, context, fontSize) {
30455  var fontScale = 0.1;
30456  _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.setToPixelCoordinateSystem(enabledElement, context, fontScale); // Return the font size to use
30457
30458  var scaledFontSize = fontSize / enabledElement.viewport.scale / fontScale; // TODO: actually calculate this?
30459
30460  var lineHeight = fontSize / enabledElement.viewport.scale / fontScale;
30461  return {
30462    fontSize: scaledFontSize,
30463    lineHeight: lineHeight,
30464    fontScale: fontScale
30465  };
30466});
30467
30468/***/ }),
30469
30470/***/ "./util/throttle.js":
30471/*!**************************!*\
30472  !*** ./util/throttle.js ***!
30473  \**************************/
30474/*! exports provided: default */
30475/***/ (function(module, __webpack_exports__, __webpack_require__) {
30476
30477"use strict";
30478__webpack_require__.r(__webpack_exports__);
30479/* harmony import */ var _debounce_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./debounce.js */ "./util/debounce.js");
30480/* harmony import */ var _isObject_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./isObject.js */ "./util/isObject.js");
30481
30482
30483/**
30484 * Creates a throttled function that only invokes `func` at most once per
30485 * every `wait` milliseconds (or once per browser frame). The throttled function
30486 * comes with a `cancel` method to cancel delayed `func` invocations and a
30487 * `flush` method to immediately invoke them. Provide `options` to indicate
30488 * whether `func` should be invoked on the leading and/or trailing edge of the
30489 * `wait` timeout. The `func` is invoked with the last arguments provided to the
30490 * throttled function. Subsequent calls to the throttled function return the
30491 * result of the last `func` invocation.
30492 *
30493 * **Note:** If `leading` and `trailing` options are `true`, `func` is
30494 * invoked on the trailing edge of the timeout only if the throttled function
30495 * is invoked more than once during the `wait` timeout.
30496 *
30497 * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
30498 * until the next tick, similar to `setTimeout` with a timeout of `0`.
30499 *
30500 * If `wait` is omitted in an environment with `requestAnimationFrame`, `func`
30501 * invocation will be deferred until the next frame is drawn (typically about
30502 * 16ms).
30503 *
30504 * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
30505 * for details over the differences between `throttle` and `debounce`.
30506 *
30507 * @since 0.1.0
30508 * @category Function
30509 * @param {Function} func The function to throttle.
30510 * @param {number} [wait=0]
30511 *  The number of milliseconds to throttle invocations to; if omitted,
30512 *  `requestAnimationFrame` is used (if available).
30513 * @param {Object} [options={}] The options object.
30514 * @param {boolean} [options.leading=true]
30515 *  Specify invoking on the leading edge of the timeout.
30516 * @param {boolean} [options.trailing=true]
30517 *  Specify invoking on the trailing edge of the timeout.
30518 * @returns {Function} Returns the new throttled function.
30519 * @example
30520 *
30521 * // Avoid excessively updating the position while scrolling.
30522 * jQuery(window).on('scroll', throttle(updatePosition, 100))
30523 *
30524 * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.
30525 * const throttled = throttle(renewToken, 300000, { 'trailing': false })
30526 * jQuery(element).on('click', throttled)
30527 *
30528 * // Cancel the trailing throttled invocation.
30529 * jQuery(window).on('popstate', throttled.cancel)
30530 */
30531
30532function throttle(func, wait, options) {
30533  var leading = true;
30534  var trailing = true;
30535
30536  if (typeof func !== 'function') {
30537    throw new TypeError('Expected a function');
30538  }
30539
30540  if (Object(_isObject_js__WEBPACK_IMPORTED_MODULE_1__["default"])(options)) {
30541    leading = 'leading' in options ? Boolean(options.leading) : leading;
30542    trailing = 'trailing' in options ? Boolean(options.trailing) : trailing;
30543  }
30544
30545  return Object(_debounce_js__WEBPACK_IMPORTED_MODULE_0__["default"])(func, wait, {
30546    leading: leading,
30547    trailing: trailing,
30548    maxWait: wait
30549  });
30550}
30551
30552/* harmony default export */ __webpack_exports__["default"] = (throttle);
30553
30554/***/ }),
30555
30556/***/ "./util/triggerEvent.js":
30557/*!******************************!*\
30558  !*** ./util/triggerEvent.js ***!
30559  \******************************/
30560/*! exports provided: default */
30561/***/ (function(module, __webpack_exports__, __webpack_require__) {
30562
30563"use strict";
30564__webpack_require__.r(__webpack_exports__);
30565/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return triggerEvent; });
30566/**
30567 * Triggers a CustomEvent.
30568 * @public
30569 * @method triggerEvent
30570 *
30571 * @param {EventTarget} el The element or EventTarget to trigger the event upon.
30572 * @param {String} type    The event type name.
30573 * @param {Object|null} [detail=null] The event data to be sent.
30574 * @returns {Boolean} The return value is false if at least one event listener called preventDefault(). Otherwise it returns true.
30575 */
30576function triggerEvent(el, type) {
30577  var detail = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
30578  var event; // This check is needed to polyfill CustomEvent on IE11-
30579
30580  if (typeof window.CustomEvent === 'function') {
30581    event = new CustomEvent(type, {
30582      detail: detail,
30583      cancelable: true
30584    });
30585  } else {
30586    event = document.createEvent('CustomEvent');
30587    event.initCustomEvent(type, true, true, detail);
30588  }
30589
30590  return el.dispatchEvent(event);
30591}
30592
30593/***/ }),
30594
30595/***/ "./util/wait.js":
30596/*!**********************!*\
30597  !*** ./util/wait.js ***!
30598  \**********************/
30599/*! exports provided: wait, waitForEnabledElementImageToLoad, default */
30600/***/ (function(module, __webpack_exports__, __webpack_require__) {
30601
30602"use strict";
30603__webpack_require__.r(__webpack_exports__);
30604/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "wait", function() { return wait; });
30605/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "waitForEnabledElementImageToLoad", function() { return waitForEnabledElementImageToLoad; });
30606/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../externalModules.js */ "./externalModules.js");
30607
30608/**
30609 * Waits a set amount of time, then resolves. Can be chained off of to delay
30610 * next call in promise chain.
30611 * @public
30612 * @function wait
30613 * @param {number} ms - number in ms to wait
30614 * @returns {Promise} - A promise that resolves when setTimeout elapses
30615 */
30616
30617var wait = function wait(ms) {
30618  return new Promise(function (resolve) {
30619    return setTimeout(resolve, ms);
30620  });
30621};
30622/**
30623 * A promise that returns an EnabledElement who's image has loaded, or
30624 * null if the provided element ceases being an enabledElement before an
30625 * image has been loaded.
30626 * @public
30627 * @function waitForEnabledElementImageToLoad
30628 *
30629 * @param {HTMLElement} element - An element that is an EnabledElement
30630 * @returns {EnabledElement} - The enabled element that has loaded an image
30631 */
30632
30633function waitForEnabledElementImageToLoad(element) {
30634  try {
30635    var enabledElement = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.getEnabledElement(element);
30636
30637    if (!enabledElement.image) {
30638      return wait(250).then(function () {
30639        return waitForEnabledElementImageToLoad(element);
30640      });
30641    } // EnabledElement's image is loaded.
30642
30643
30644    return enabledElement;
30645  } catch (ex) {
30646    // Is no longer, or never was an enabled element, stop polling
30647    return null;
30648  }
30649}
30650/* harmony default export */ __webpack_exports__["default"] = (wait);
30651
30652/***/ }),
30653
30654/***/ "./util/zoom/changeViewportScale.js":
30655/*!******************************************!*\
30656  !*** ./util/zoom/changeViewportScale.js ***!
30657  \******************************************/
30658/*! exports provided: default */
30659/***/ (function(module, __webpack_exports__, __webpack_require__) {
30660
30661"use strict";
30662__webpack_require__.r(__webpack_exports__);
30663/**
30664 * Changes the scale of the viewport.
30665 *
30666 * @private
30667 * @function changeViewportScale
30668 *
30669 * @param {Object} viewport The viewport to scale.
30670 * @param {number} ticks The change in magnifcation factor.
30671 * @param {Object} scaleLimits The limits in scale.
30672 * @returns {Object} The scaled viewport.
30673 */
30674/* harmony default export */ __webpack_exports__["default"] = (function (viewport, ticks, scaleLimits) {
30675  var maxScale = scaleLimits.maxScale,
30676      minScale = scaleLimits.minScale;
30677  var pow = 1.7;
30678  var oldFactor = Math.log(viewport.scale) / Math.log(pow);
30679  var factor = oldFactor + ticks;
30680  var scale = Math.pow(pow, factor);
30681
30682  if (maxScale && scale > maxScale) {
30683    viewport.scale = maxScale;
30684  } else if (minScale && scale < minScale) {
30685    viewport.scale = minScale;
30686  } else {
30687    viewport.scale = scale;
30688  }
30689
30690  return viewport;
30691});
30692
30693/***/ }),
30694
30695/***/ "./util/zoom/correctShift.js":
30696/*!***********************************!*\
30697  !*** ./util/zoom/correctShift.js ***!
30698  \***********************************/
30699/*! exports provided: default */
30700/***/ (function(module, __webpack_exports__, __webpack_require__) {
30701
30702"use strict";
30703__webpack_require__.r(__webpack_exports__);
30704/**
30705 * Corrects the shift by accountoing for viewport rotation and flips.
30706 * @export @public @method
30707 * @name correctShift
30708 *
30709 * @param  {Object} shift      The shift to correct.
30710 * @param  {Object} viewportOrientation  Object containing information on the viewport orientation.
30711 * @returns {Object}            The corrected shift.
30712 */
30713/* harmony default export */ __webpack_exports__["default"] = (function (shift, viewportOrientation) {
30714  var hflip = viewportOrientation.hflip,
30715      vflip = viewportOrientation.vflip,
30716      rotation = viewportOrientation.rotation; // Apply Flips
30717
30718  shift.x *= hflip ? -1 : 1;
30719  shift.y *= vflip ? -1 : 1; // Apply rotations
30720
30721  if (rotation !== 0) {
30722    var angle = rotation * Math.PI / 180;
30723    var cosA = Math.cos(angle);
30724    var sinA = Math.sin(angle);
30725    var newX = shift.x * cosA - shift.y * sinA;
30726    var newY = shift.x * sinA + shift.y * cosA;
30727    shift.x = newX;
30728    shift.y = newY;
30729  }
30730
30731  return shift;
30732});
30733
30734/***/ }),
30735
30736/***/ "./util/zoom/index.js":
30737/*!****************************!*\
30738  !*** ./util/zoom/index.js ***!
30739  \****************************/
30740/*! exports provided: changeViewportScale, correctShift, default */
30741/***/ (function(module, __webpack_exports__, __webpack_require__) {
30742
30743"use strict";
30744__webpack_require__.r(__webpack_exports__);
30745/* harmony import */ var _changeViewportScale_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./changeViewportScale.js */ "./util/zoom/changeViewportScale.js");
30746/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "changeViewportScale", function() { return _changeViewportScale_js__WEBPACK_IMPORTED_MODULE_0__["default"]; });
30747
30748/* harmony import */ var _correctShift_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./correctShift.js */ "./util/zoom/correctShift.js");
30749/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "correctShift", function() { return _correctShift_js__WEBPACK_IMPORTED_MODULE_1__["default"]; });
30750
30751
30752 // Named
30753
30754 // Default
30755
30756/* harmony default export */ __webpack_exports__["default"] = ({
30757  changeViewportScale: _changeViewportScale_js__WEBPACK_IMPORTED_MODULE_0__["default"],
30758  correctShift: _correctShift_js__WEBPACK_IMPORTED_MODULE_1__["default"]
30759});
30760
30761/***/ }),
30762
30763/***/ "./version.js":
30764/*!********************!*\
30765  !*** ./version.js ***!
30766  \********************/
30767/*! exports provided: default */
30768/***/ (function(module, __webpack_exports__, __webpack_require__) {
30769
30770"use strict";
30771__webpack_require__.r(__webpack_exports__);
30772/* harmony default export */ __webpack_exports__["default"] = ('3.16.0');
30773
30774/***/ })
30774
30775
30776/******/ });
30777});
30778//# sourceMappingURL=cornerstoneTools.js.map

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.