From 18bc466032ee1318c9900b60ed4a6a62e578ecc5 Mon Sep 17 00:00:00 2001 From: segun Date: Fri, 9 Dec 2022 15:21:24 +0100 Subject: [PATCH 01/57] reversal of unintended changes --- dist/leaflet.distortableimage.js | 8305 +------------------------ src/edit/iconsets/IconSet.js | 17 + src/edit/iconsets/KeymapperIconSet.js | 7 + src/edit/iconsets/ToolbarIconSet.js | 23 + 4 files changed, 48 insertions(+), 8304 deletions(-) create mode 100644 src/edit/iconsets/IconSet.js create mode 100644 src/edit/iconsets/KeymapperIconSet.js create mode 100644 src/edit/iconsets/ToolbarIconSet.js diff --git a/dist/leaflet.distortableimage.js b/dist/leaflet.distortableimage.js index 3e2317d62..7c8e6e4f0 100644 --- a/dist/leaflet.distortableimage.js +++ b/dist/leaflet.distortableimage.js @@ -1,8305 +1,2 @@ -/******/ (function() { // webpackBootstrap -/******/ var __webpack_modules__ = ({ - -/***/ "./node_modules/ansi-html-community/index.js": -/*!***************************************************!*\ - !*** ./node_modules/ansi-html-community/index.js ***! - \***************************************************/ -/***/ (function(module) { - -"use strict"; - - -module.exports = ansiHTML - -// Reference to https://github.com/sindresorhus/ansi-regex -var _regANSI = /(?:(?:\u001b\[)|\u009b)(?:(?:[0-9]{1,3})?(?:(?:;[0-9]{0,3})*)?[A-M|f-m])|\u001b[A-M]/ - -var _defColors = { - reset: ['fff', '000'], // [FOREGROUD_COLOR, BACKGROUND_COLOR] - black: '000', - red: 'ff0000', - green: '209805', - yellow: 'e8bf03', - blue: '0000ff', - magenta: 'ff00ff', - cyan: '00ffee', - lightgrey: 'f0f0f0', - darkgrey: '888' -} -var _styles = { - 30: 'black', - 31: 'red', - 32: 'green', - 33: 'yellow', - 34: 'blue', - 35: 'magenta', - 36: 'cyan', - 37: 'lightgrey' -} -var _openTags = { - '1': 'font-weight:bold', // bold - '2': 'opacity:0.5', // dim - '3': '', // italic - '4': '', // underscore - '8': 'display:none', // hidden - '9': '' // delete -} -var _closeTags = { - '23': '', // reset italic - '24': '', // reset underscore - '29': '' // reset delete -} - -;[0, 21, 22, 27, 28, 39, 49].forEach(function (n) { - _closeTags[n] = '' -}) - -/** - * Converts text with ANSI color codes to HTML markup. - * @param {String} text - * @returns {*} - */ -function ansiHTML (text) { - // Returns the text if the string has no ANSI escape code. - if (!_regANSI.test(text)) { - return text - } - - // Cache opened sequence. - var ansiCodes = [] - // Replace with markup. - var ret = text.replace(/\033\[(\d+)m/g, function (match, seq) { - var ot = _openTags[seq] - if (ot) { - // If current sequence has been opened, close it. - if (!!~ansiCodes.indexOf(seq)) { // eslint-disable-line no-extra-boolean-cast - ansiCodes.pop() - return '' - } - // Open tag. - ansiCodes.push(seq) - return ot[0] === '<' ? ot : '' - } - - var ct = _closeTags[seq] - if (ct) { - // Pop sequence - ansiCodes.pop() - return ct - } - return '' - }) - - // Make sure tags are closed. - var l = ansiCodes.length - ;(l > 0) && (ret += Array(l + 1).join('')) - - return ret -} - -/** - * Customize colors. - * @param {Object} colors reference to _defColors - */ -ansiHTML.setColors = function (colors) { - if (typeof colors !== 'object') { - throw new Error('`colors` parameter must be an Object.') - } - - var _finalColors = {} - for (var key in _defColors) { - var hex = colors.hasOwnProperty(key) ? colors[key] : null - if (!hex) { - _finalColors[key] = _defColors[key] - continue - } - if ('reset' === key) { - if (typeof hex === 'string') { - hex = [hex] - } - if (!Array.isArray(hex) || hex.length === 0 || hex.some(function (h) { - return typeof h !== 'string' - })) { - throw new Error('The value of `' + key + '` property must be an Array and each item could only be a hex string, e.g.: FF0000') - } - var defHexColor = _defColors[key] - if (!hex[0]) { - hex[0] = defHexColor[0] - } - if (hex.length === 1 || !hex[1]) { - hex = [hex[0]] - hex.push(defHexColor[1]) - } - - hex = hex.slice(0, 2) - } else if (typeof hex !== 'string') { - throw new Error('The value of `' + key + '` property must be a hex string, e.g.: FF0000') - } - _finalColors[key] = hex - } - _setTags(_finalColors) -} - -/** - * Reset colors. - */ -ansiHTML.reset = function () { - _setTags(_defColors) -} - -/** - * Expose tags, including open and close. - * @type {Object} - */ -ansiHTML.tags = {} - -if (Object.defineProperty) { - Object.defineProperty(ansiHTML.tags, 'open', { - get: function () { return _openTags } - }) - Object.defineProperty(ansiHTML.tags, 'close', { - get: function () { return _closeTags } - }) -} else { - ansiHTML.tags.open = _openTags - ansiHTML.tags.close = _closeTags -} - -function _setTags (colors) { - // reset all - _openTags['0'] = 'font-weight:normal;opacity:1;color:#' + colors.reset[0] + ';background:#' + colors.reset[1] - // inverse - _openTags['7'] = 'color:#' + colors.reset[1] + ';background:#' + colors.reset[0] - // dark grey - _openTags['90'] = 'color:#' + colors.darkgrey - - for (var code in _styles) { - var color = _styles[code] - var oriColor = colors[color] || '000' - _openTags[code] = 'color:#' + oriColor - code = parseInt(code) - _openTags[(code + 10).toString()] = 'background:#' + oriColor - } -} - -ansiHTML.reset() - - -/***/ }), - -/***/ "./src/DistortableCollection.js": -/*!**************************************!*\ - !*** ./src/DistortableCollection.js ***! - \**************************************/ -/***/ (function() { - -var arr = []; -L.DistortableCollection = L.FeatureGroup.extend({ - options: { - editable: true, - exportOpts: { - exportStartUrl: '//export.mapknitter.org/export', - statusUrl: '//export.mapknitter.org', - exportUrl: 'http://export.mapknitter.org/' - } - }, - initialize: function initialize(options) { - L.setOptions(this, options); - L.FeatureGroup.prototype.initialize.call(this, options); - L.Utils.initTranslation.call(this); - this.editable = this.options.editable; - }, - onAdd: function onAdd(map) { - L.FeatureGroup.prototype.onAdd.call(this, map); - this._map = map; - - if (this.editable) { - this.editing.enable(); - } - /** - * although we have a DistortableCollection.Edit class that handles collection events to keep our code managable, - * events that need to be added on individual images are kept here to do so through `layeradd`. - */ - - - this.on('layeradd', this._addEvents, this); - this.on('layerremove', this._removeEvents, this); - }, - onRemove: function onRemove() { - if (this.editing) { - this.editing.disable(); - } - - this.off('layeradd', this._addEvents, this); - this.off('layerremove', this._removeEvents, this); - }, - _addEvents: function _addEvents(e) { - var layer = e.layer; - L.DomEvent.on(layer, { - dragstart: this._dragStartMultiple, - drag: this._dragMultiple - }, this); - L.DomEvent.on(layer.getElement(), { - mousedown: this._deselectOthers, - - /* Enable longpress for multi select for touch devices. */ - contextmenu: this._longPressMultiSelect - }, this); - }, - _removeEvents: function _removeEvents(e) { - var layer = e.layer; - L.DomEvent.off(layer, { - dragstart: this._dragStartMultiple, - drag: this._dragMultiple - }, this); - L.DomEvent.off(layer.getElement(), { - mousedown: this._deselectOthers, - contextmenu: this._longPressMultiSelect - }, this); - }, - _longPressMultiSelect: function _longPressMultiSelect(e) { - var _this = this; - - if (!this.editable) { - return; - } - - e.preventDefault(); - this.eachLayer(function (layer) { - var edit = layer.editing; - - if (layer.getElement() === e.target && edit.enabled()) { - L.DomUtil.toggleClass(layer.getElement(), 'collected'); - - if (_this.anyCollected()) { - layer.deselect(); - - _this.editing._addToolbar(); - } else { - _this.editing._removeToolbar(); - } - } - }); - }, - isCollected: function isCollected(overlay) { - return L.DomUtil.hasClass(overlay.getElement(), 'collected'); - }, - anyCollected: function anyCollected() { - var layerArr = this.getLayers(); - return layerArr.some(this.isCollected.bind(this)); - }, - _toggleCollected: function _toggleCollected(e, layer) { - if (e.shiftKey) { - /* conditional prevents disabled images from flickering multi-select mode */ - if (layer.editing.enabled()) { - L.DomUtil.toggleClass(e.target, 'collected'); // re-order layers by _leaflet_id to match their display order in UI - // add new layer to right position and avoid repitition - - var newArr = arr.every(function (each) { - return each._leaflet_id !== layer._leaflet_id; - }); - - if (newArr) { - arr.push(layer); - } else { - arr.splice(arr.indexOf(layer), 1); - } - } - } - - if (this.anyCollected()) { - layer.deselect(); - } else { - this.editing._removeToolbar(); - } - }, - _deselectOthers: function _deselectOthers(e) { - var _this2 = this; - - if (!this.editable) { - return; - } - - this.eachLayer(function (layer) { - if (layer.getElement() !== e.target) { - layer.deselect(); - } else { - _this2._toggleCollected(e, layer); - } - }); - - if (e) { - L.DomEvent.stopPropagation(e); - } - }, - _dragStartMultiple: function _dragStartMultiple(e) { - var overlay = e.target; - var map = this._map; - var i; - - if (!this.isCollected(overlay)) { - return; - } - - this.eachLayer(function (layer) { - layer._dragStartPoints = {}; - layer.deselect(); - - for (i = 0; i < 4; i++) { - var c = layer.getCorner(i); - layer._dragStartPoints[i] = map.latLngToLayerPoint(c); - } - }); - }, - _dragMultiple: function _dragMultiple(e) { - var overlay = e.target; - var map = this._map; - - if (!this.isCollected(overlay)) { - return; - } - - var topLeft = map.latLngToLayerPoint(overlay.getCorner(0)); - - var delta = overlay._dragStartPoints[0].subtract(topLeft); - - this._updateCollectionFromPoints(delta, overlay); - }, - _toRemove: function _toRemove() { - var _this3 = this; - - var layerArr = this.getLayers(); - return layerArr.filter(function (layer) { - var mode = layer.editing._mode; - return _this3.isCollected(layer) && mode !== 'lock'; - }); - }, - _toMove: function _toMove(overlay) { - var _this4 = this; - - var layerArr = this.getLayers(); - return layerArr.filter(function (layer) { - var mode = layer.editing._mode; - return layer !== overlay && _this4.isCollected(layer) && mode !== 'lock'; - }); - }, - _updateCollectionFromPoints: function _updateCollectionFromPoints(delta, overlay) { - var layersToMove = this._toMove(overlay); - - var p = new L.Transformation(1, -delta.x, 1, -delta.y); - var i; - layersToMove.forEach(function (layer) { - var movedPoints = {}; - - for (i = 0; i < 4; i++) { - movedPoints[i] = p.transform(layer._dragStartPoints[i]); - } - - layer.setCornersFromPoints(movedPoints); - }); - }, - _getAvgCmPerPixel: function _getAvgCmPerPixel(imgs) { - var reduce = imgs.reduce(function (sum, img) { - return sum + img.cm_per_pixel; - }, 0); - return reduce / imgs.length; - }, - generateExportJson: function generateExportJson() { - var json = {}; - json.images = []; - this.eachLayer(function (layer) { - - if (this.isCollected(layer)) { - var sections = layer._image.src.split('/'); - - var filename = sections[sections.length - 1]; - var zc = layer.getCorners(); - var corners = [{ - lat: zc[0].lat, - lon: zc[0].lng - }, { - lat: zc[1].lat, - lon: zc[1].lng - }, { - lat: zc[3].lat, - lon: zc[3].lng - }, { - lat: zc[2].lat, - lon: zc[2].lng - }]; - json.images.push({ - id: layer._leaflet_id, - src: layer._image.src, - width: layer._image.width, - height: layer._image.height, - image_file_name: filename, - nodes: corners, - cm_per_pixel: L.ImageUtil.getCmPerPixel(layer) - }); - } - }, this); - json.images = json.images.reverse(); - json.avg_cm_per_pixel = this._getAvgCmPerPixel(json.images); - return json; - } -}); - -L.distortableCollection = function (id, options) { - return new L.DistortableCollection(id, options); -}; - -/***/ }), - -/***/ "./src/DistortableImageOverlay.js": -/*!****************************************!*\ - !*** ./src/DistortableImageOverlay.js ***! - \****************************************/ -/***/ (function() { - -L.DistortableImageOverlay = L.ImageOverlay.extend({ - options: { - height: 200, - crossOrigin: true, - // todo: find ideal number to prevent distortions during RotateScale, and make it dynamic (remove hardcoding) - edgeMinWidth: 50, - editable: true, - mode: 'distort', - selected: false - }, - initialize: function initialize(url, options) { - L.setOptions(this, options); - L.Utils.initTranslation.call(this); - this.edgeMinWidth = this.options.edgeMinWidth; - this.editable = this.options.editable; - this._selected = this.options.selected; - this._url = url; - this.rotation = {}; - }, - onAdd: function onAdd(map) { - var _this = this; - - this._map = map; - - if (!this.getElement()) { - this._initImage(); - } - - map.on('viewreset', this._reset, this); - - if (this.options.corners) { - this._corners = this.options.corners; - - if (map.options.zoomAnimation && L.Browser.any3d) { - map.on('zoomanim', this._animateZoom, this); - } - } // Have to wait for the image to load because need to access its w/h - - - L.DomEvent.on(this.getElement(), 'load', function () { - _this.getPane().appendChild(_this.getElement()); - - _this._initImageDimensions(); - - if (_this.options.rotation) { - var units = _this.options.rotation.deg >= 0 ? 'deg' : 'rad'; - - _this.setAngle(_this.options.rotation[units], units); - } else { - _this.rotation = { - deg: 0, - rad: 0 - }; - - _this._reset(); - } - /* Initialize default corners if not already set */ - - - if (!_this._corners) { - if (map.options.zoomAnimation && L.Browser.any3d) { - map.on('zoomanim', _this._animateZoom, _this); - } - } - /** if there is a featureGroup, only its editable option matters */ - - - var eventParents = _this._eventParents; - - if (eventParents) { - _this.eP = eventParents[Object.keys(eventParents)[0]]; - - if (_this.eP.editable) { - _this.editing.enable(); - } - } else { - if (_this.editable) { - _this.editing.enable(); - } - - _this.eP = null; - } - }); - L.DomEvent.on(this.getElement(), 'click', this.select, this); - L.DomEvent.on(map, { - singleclickon: this._singleClickListeners, - singleclickoff: this._resetClickListeners, - singleclick: this._singleClick - }, this); - /** - * custom events fired from DoubleClickLabels.js. Used to differentiate - * single / dblclick to not deselect images on map dblclick. - */ - - if (!(map.doubleClickZoom.enabled() || map.doubleClickLabels.enabled())) { - L.DomEvent.on(map, 'click', this.deselect, this); - } - - this.fire('add'); - }, - onRemove: function onRemove(map) { - L.DomEvent.off(this.getElement(), 'click', this.select, this); - L.DomEvent.off(map, { - singleclickon: this._singleClickListeners, - singleclickoff: this._resetClickListeners, - singleclick: this._singleClick - }, this); - L.DomEvent.off(map, 'click', this.deselect, this); - - if (this.editing) { - this.editing.disable(); - } - - this.fire('remove'); - L.ImageOverlay.prototype.onRemove.call(this, map); - }, - _initImageDimensions: function _initImageDimensions() { - var map = this._map; - var originalImageWidth = L.DomUtil.getStyle(this.getElement(), 'width'); - var originalImageHeight = L.DomUtil.getStyle(this.getElement(), 'height'); - var aspectRatio = parseInt(originalImageWidth) / parseInt(originalImageHeight); - var imageHeight = this.options.height; - var imageWidth = parseInt(aspectRatio * imageHeight); - var center = map.project(map.getCenter()); - var offset = L.point(imageWidth, imageHeight).divideBy(2); - - if (this.options.corners) { - this._corners = this.options.corners; - } else { - this._corners = [map.unproject(center.subtract(offset)), map.unproject(center.add(L.point(offset.x, -offset.y))), map.unproject(center.add(L.point(-offset.x, offset.y))), map.unproject(center.add(offset))]; - } - - this._initialDimensions = { - 'center': center, - 'offset': offset, - 'zoom': map.getZoom() - }; - this.setBounds(L.latLngBounds(this.getCorners())); - }, - _singleClick: function _singleClick(e) { - if (e.type === 'singleclick') { - this.deselect(); - } else { - return; - } - }, - _singleClickListeners: function _singleClickListeners() { - var map = this._map; - L.DomEvent.off(map, 'click', this.deselect, this); - L.DomEvent.on(map, 'singleclick', this.deselect, this); - }, - _resetClickListeners: function _resetClickListeners() { - var map = this._map; - L.DomEvent.on(map, 'click', this.deselect, this); - L.DomEvent.off(map, 'singleclick', this.deselect, this); - }, - isSelected: function isSelected() { - return this._selected; - }, - deselect: function deselect() { - var edit = this.editing; - - if (!edit.enabled()) { - return; - } - - edit._removeToolbar(); - - edit._hideMarkers(); - - this._selected = false; - this.fire('deselect'); - return this; - }, - select: function select(e) { - var edit = this.editing; - var eP = this.eP; - - if (!edit.enabled()) { - return; - } - - if (e) { - L.DomEvent.stopPropagation(e); - } // this ensures deselection of all other images, allowing us to keep collection group optional - - - this._programmaticGrouping(); - - this._selected = true; - - edit._addToolbar(); - - edit._showMarkers(); - - this.fire('select'); // we run the selection logic 1st anyway because the collection group's _addToolbar method depends on it - - if (eP && eP.anyCollected()) { - this.deselect(); - return; - } - - return this; - }, - _programmaticGrouping: function _programmaticGrouping() { - this._map.eachLayer(function (layer) { - if (layer instanceof L.DistortableImageOverlay) { - layer.deselect(); - } - }); - }, - setCorner: function setCorner(corner, latlng) { - var edit = this.editing; - this._corners[corner] = latlng; - this.setBounds(L.latLngBounds(this.getCorners())); - this.fire('update'); - - if (edit.toolbar && edit.toolbar instanceof L.DistortableImage.PopupBar) { - edit._updateToolbarPos(); - } - - this.edited = true; - return this; - }, - _cornerExceedsMapLats: function _cornerExceedsMapLats(zoom, corner, map) { - if (map.options.crs.Simple == L.CRS.Simple) { - return false; - } else { - var exceedsTop; - var exceedsBottom; - - if (zoom === 0) { - exceedsTop = map.project(corner).y < 2; - exceedsBottom = map.project(corner).y >= 255; - } else { - exceedsTop = map.project(corner).y / zoom < 2; - exceedsBottom = map.project(corner).y / Math.pow(2, zoom) >= 255; - } - - return exceedsTop || exceedsBottom; - } - }, - setCorners: function setCorners(latlngObj) { - var map = this._map; - var zoom = map.getZoom(); - var edit = this.editing; - var i = 0; // this is to fix https://github.com/publiclab/Leaflet.DistortableImage/issues/402 - - for (var k in latlngObj) { - if (this._cornerExceedsMapLats(zoom, latlngObj[k], map)) { - // calling reset / update w/ the same corners bc it prevents a marker flicker for rotate - this.setBounds(L.latLngBounds(this.getCorners())); - this.fire('update'); - return; - } - } - - for (var _k in latlngObj) { - this._corners[i] = latlngObj[_k]; - i += 1; - } - - this.setBounds(L.latLngBounds(this.getCorners())); - this.fire('update'); - - if (edit.toolbar && edit.toolbar instanceof L.DistortableImage.PopupBar) { - edit._updateToolbarPos(); - } - - this.edited = true; - return this; - }, - setCornersFromPoints: function setCornersFromPoints(pointsObj) { - var map = this._map; - var zoom = map.getZoom(); - var edit = this.editing; - var i = 0; - - for (var k in pointsObj) { - var corner = map.layerPointToLatLng(pointsObj[k]); - - if (this._cornerExceedsMapLats(zoom, corner, map)) { - // calling reset / update w/ the same corners bc it prevents a marker flicker for rotate - this.setBounds(L.latLngBounds(this.getCorners())); - this.fire('update'); - return; - } - } - - for (var _k2 in pointsObj) { - this._corners[i] = map.layerPointToLatLng(pointsObj[_k2]); - i += 1; - } - - this.setBounds(L.latLngBounds(this.getCorners())); - this.fire('update'); - - if (edit.toolbar && edit.toolbar instanceof L.DistortableImage.PopupBar) { - edit._updateToolbarPos(); - } - - this.edited = true; - return this; - }, - scaleBy: function scaleBy(scale) { - var map = this._map; - var center = map.project(this.getCenter()); - var i; - var p; - var scaledCorners = {}; - - if (scale === 0) { - return; - } - - for (i = 0; i < 4; i++) { - p = map.project(this.getCorner(i)).subtract(center).multiplyBy(scale).add(center); - scaledCorners[i] = map.unproject(p); - } - - this.setCorners(scaledCorners); - return this; - }, - getAngle: function getAngle() { - var unit = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'deg'; - var matrix = this.getElement().style[L.DomUtil.TRANSFORM].split('matrix3d')[1].slice(1, -1).split(','); - var row0x = matrix[0]; - var row0y = matrix[1]; - var row1x = matrix[4]; - var row1y = matrix[5]; - var determinant = row0x * row1y - row0y * row1x; - var angle = L.TrigUtil.calcAngle(row0x, row0y, 'rad'); - - if (determinant < 0) { - angle += angle < 0 ? Math.PI : -Math.PI; - } - - if (angle < 0) { - angle = 2 * Math.PI + angle; - } - - return unit === 'deg' ? Math.round(L.TrigUtil.radiansToDegrees(angle)) : L.Util.formatNum(angle, 2); - }, - setAngle: function setAngle(angle) { - var unit = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'deg'; - var currentAngle = this.getAngle(unit); - var angleToRotateBy = angle - currentAngle; - this.rotateBy(angleToRotateBy, unit); - return this; - }, - rotateBy: function rotateBy(angle) { - var unit = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'deg'; - var map = this._map; - var center = map.project(this.getCenter()); - var corners = {}; - var i; - var p; - var q; - - if (unit === 'deg') { - angle = L.TrigUtil.degreesToRadians(angle); - } - - for (i = 0; i < 4; i++) { - p = map.project(this.getCorner(i)).subtract(center); - q = L.point(Math.cos(angle) * p.x - Math.sin(angle) * p.y, Math.sin(angle) * p.x + Math.cos(angle) * p.y); - corners[i] = map.unproject(q.add(center)); - } - - this.setCorners(corners); - return this; - }, - dragBy: function dragBy(formerPoint, newPoint) { - var map = this._map; - var i; - var p; - var transCorners = {}; - var delta = map.project(formerPoint).subtract(map.project(newPoint)); - - for (i = 0; i < 4; i++) { - p = map.project(this.getCorner(i)).subtract(delta); - transCorners[i] = map.unproject(p); - } - - this.setCorners(transCorners); - }, - restore: function restore() { - var map = this._map; - var center = this._initialDimensions.center; - var offset = this._initialDimensions.offset; - var zoom = this._initialDimensions.zoom; - var corners = [center.subtract(offset), center.add(L.point(offset.x, -offset.y)), center.add(L.point(-offset.x, offset.y)), center.add(offset)]; - - for (var i = 0; i < 4; i++) { - if (!map.unproject(corners[i], zoom).equals(this.getCorner(i))) { - this.setCorner(i, map.unproject(corners[i], zoom)); - } - } - - this.edited = false; - this.fire('restore'); - return this; - }, - - /* Copied from Leaflet v0.7 https://github.com/Leaflet/Leaflet/blob/66282f14bcb180ec87d9818d9f3c9f75afd01b30/src/dom/DomUtil.js#L189-L199 */ - - /* since L.DomUtil.getTranslateString() is deprecated in Leaflet v1.0 */ - _getTranslateString: function _getTranslateString(point) { - // on WebKit browsers (Chrome/Safari/iOS Safari/Android) - // using translate3d instead of translate - // makes animation smoother as it ensures HW accel is used. - // Firefox 13 doesn't care - // (same speed either way), Opera 12 doesn't support translate3d - var is3d = L.Browser.webkit3d; - var open = 'translate' + (is3d ? '3d' : '') + '('; - var close = (is3d ? ',0' : '') + ')'; - return open + point.x + 'px,' + point.y + 'px' + close; - }, - _reset: function _reset() { - var map = this._map; - var image = this.getElement(); - var latLngToLayerPoint = L.bind(map.latLngToLayerPoint, map); - - var transformMatrix = this._calculateProjectiveTransform(latLngToLayerPoint); - - var topLeft = latLngToLayerPoint(this.getCorner(0)); - var warp = L.DomUtil.getMatrixString(transformMatrix); - - var translation = this._getTranslateString(topLeft); - /* See L.DomUtil.setPosition. Mainly for the purposes of L.Draggable. */ - - - image._leaflet_pos = topLeft; - image.style[L.DomUtil.TRANSFORM] = [translation, warp].join(' '); - /* Set origin to the upper-left corner rather than - * the center of the image, which is the default. - */ - - image.style[L.DomUtil.TRANSFORM + '-origin'] = '0 0 0'; - this.rotation.deg = this.getAngle(); - this.rotation.rad = this.getAngle('rad'); - }, - - /* - * Calculates the transform string that will be - * correct *at the end* of zooming. - * Leaflet then generates a CSS3 animation between the current transform and - * future transform which makes the transition appear smooth. - */ - _animateZoom: function _animateZoom(event) { - var map = this._map; - var image = this.getElement(); - - var latLngToNewLayerPoint = function latLngToNewLayerPoint(latlng) { - return map._latLngToNewLayerPoint(latlng, event.zoom, event.center); - }; - - var transformMatrix = this._calculateProjectiveTransform(latLngToNewLayerPoint); - - var topLeft = latLngToNewLayerPoint(this.getCorner(0)); - var warp = L.DomUtil.getMatrixString(transformMatrix); - - var translation = this._getTranslateString(topLeft); - /* See L.DomUtil.setPosition. Mainly for the purposes of L.Draggable. */ - - - image._leaflet_pos = topLeft; - image.style[L.DomUtil.TRANSFORM] = [translation, warp].join(' '); - }, - getCorners: function getCorners() { - return this._corners; - }, - getCorner: function getCorner(i) { - return this._corners[i]; - }, - // image (vertex) centroid calculation - getCenter: function getCenter() { - var map = this._map; - var reduce = this.getCorners().reduce(function (agg, corner) { - return agg.add(map.project(corner)); - }, L.point(0, 0)); - return map.unproject(reduce.divideBy(4)); - }, - _calculateProjectiveTransform: function _calculateProjectiveTransform(latLngToCartesian) { - /* Setting reasonable but made-up image defaults - * allow us to place images on the map before - * they've finished downloading. */ - var offset = latLngToCartesian(this.getCorner(0)); - var w = this.getElement().offsetWidth || 500; - var h = this.getElement().offsetHeight || 375; - var c = []; - var j; - /* Convert corners to container points (i.e. cartesian coordinates). */ - - for (j = 0; j < 4; j++) { - c.push(latLngToCartesian(this.getCorner(j))._subtract(offset)); - } - /* - * This matrix describes the action of - * the CSS transform on each corner of the image. - * It maps from the coordinate system centered - * at the upper left corner of the image - * to the region bounded by the latlngs in this._corners. - * For example: - * 0, 0, c[0].x, c[0].y - * says that the upper-left corner of the image - * maps to the first latlng in this._corners. - */ - - - return L.MatrixUtil.general2DProjection(0, 0, c[0].x, c[0].y, w, 0, c[1].x, c[1].y, 0, h, c[2].x, c[2].y, w, h, c[3].x, c[3].y); - } -}); - -L.distortableImageOverlay = function (id, options) { - return new L.DistortableImageOverlay(id, options); -}; - -L.Map.addInitHook(function () { - if (!L.DomUtil.hasClass(this.getContainer(), 'ldi')) { - L.DomUtil.addClass(this.getContainer(), 'ldi'); - } -}); - -/***/ }), - -/***/ "./src/components/DistortableImage.Keymapper.js": -/*!******************************************************!*\ - !*** ./src/components/DistortableImage.Keymapper.js ***! - \******************************************************/ -/***/ (function() { - -var _this = this; - -L.DomUtil = L.DomUtil || {}; -L.DistortableImage = L.DistortableImage || {}; -L.distortableImage = L.DistortableImage; -L.DistortableImage.Keymapper = L.Handler.extend({ - options: { - position: 'topright' - }, - initialize: function initialize(map, options) { - this._map = map; - L.setOptions(this, options); - }, - addHooks: function addHooks() { - if (!this._keymapper) { - this._container = this._buildContainer(); - this._scrollWrapper = this._wrap(); - this._toggler = this._createButton(); - - this._setMapper(this._container, this._scrollWrapper, this._toggler); - - L.DomEvent.on(this._toggler, 'click', this._toggleKeymapper, this); - L.DomEvent.disableClickPropagation(this._container); - L.DomEvent.disableScrollPropagation(this._container); - } - }, - removeHooks: function removeHooks() { - if (this._keymapper) { - L.DomEvent.off(this._toggler, 'click', this._toggleKeymapper, this); - L.DomUtil.remove(this._toggler); - L.DomUtil.remove(this._scrollWrapper); - L.DomUtil.remove(this._container); - this._keymapper = false; - } - }, - _buildContainer: function _buildContainer() { - var container = L.DomUtil.create('div', 'ldi-keymapper-hide'); - container.setAttribute('id', 'ldi-keymapper'); - var divider = L.DomUtil.create('br', 'divider'); - container.appendChild(divider); - return container; - }, - _createButton: function _createButton() { - var toggler = L.DomUtil.create('a', ''); - toggler.innerHTML = L.IconUtil.create('keyboard_open'); - toggler.setAttribute('id', 'toggle-keymapper'); - toggler.setAttribute('href', '#'); - toggler.setAttribute('title', 'Show keymap'); // Will force screen readers like VoiceOver to read this as "Show keymap - button" - - toggler.setAttribute('role', 'button'); - toggler.setAttribute('aria-label', 'Show keymap'); - return toggler; - }, - _wrap: function _wrap() { - var wrap = L.DomUtil.create('div', ''); - wrap.setAttribute('id', 'keymapper-wrapper'); - wrap.style.display = 'none'; - return wrap; - }, - _setMapper: function _setMapper(container, wrap, button) { - this._keymapper = L.control({ - position: this.options.position - }); - - this._keymapper.onAdd = function () { - container.appendChild(wrap); - wrap.insertAdjacentHTML('beforeend', '' + '
' + - /* eslint-disable */ - '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '
Rotate Mode
R
RotateScale Mode
r
Scale Mode
s
Distort Mode
d
Drag Mode
D
Lock (Mode) / Unlock Image
l\xa0u
Stack up / down
q\xa0a
Add / Remove Image Border
b
Toggle Opacity
o
Deselect All
esc
Delete Image(s)
delete\xa0backspace
Export Image(s)
e
'); - /* eslint-enable */ - - container.appendChild(button); - return container; - }; - - this._keymapper.addTo(this._map); - }, - _toggleKeymapper: function _toggleKeymapper(e) { - e.preventDefault(); - this._container.className = this._container.className === 'ldi-keymapper leaflet-control' ? 'ldi-keymapper-hide leaflet-control' : 'ldi-keymapper leaflet-control'; - this._scrollWrapper.style.display = this._scrollWrapper.style.display === 'none' ? 'block' : 'none'; - this._toggler.innerHTML = this._toggler.innerHTML === 'close' ? L.IconUtil.create('keyboard_open') : 'close'; - L.IconUtil.toggleTitle(this._toggler, 'Show keymap', 'Hide keymap'); - L.DomUtil.toggleClass(this._toggler, 'close-icon'); - }, - _injectIconSet: function _injectIconSet() { - if (document.querySelector('#keymapper-iconset')) { - return; - } - - var el = L.DomUtil.create('div', ''); - el.id = 'keymapper-iconset'; - el.setAttribute('hidden', 'hidden'); - this._iconset = new L.KeymapperIconSet().render(); - el.innerHTML = this._iconset; - document.querySelector('.leaflet-control-container').appendChild(el); - } -}); -L.DistortableImage.Keymapper.addInitHook(function () { - L.DistortableImage.Keymapper.prototype._n = L.DistortableImage.Keymapper.prototype._n ? L.DistortableImage.Keymapper.prototype._n + 1 : 1; // dont enable keymapper for mobile - - if (L.DistortableImage.Keymapper.prototype._n === 1 && !L.Browser.mobile) { - _this.enable(); - - _this._injectIconSet(); - } -}); - -L.distortableImage.keymapper = function (map, options) { - return new L.DistortableImage.Keymapper(map, options); -}; - -/***/ }), - -/***/ "./src/edit/DistortableCollection.Edit.js": -/*!************************************************!*\ - !*** ./src/edit/DistortableCollection.Edit.js ***! - \************************************************/ -/***/ (function() { - -L.DistortableImage = L.DistortableImage || {}; // this class holds the keybindings and toolbar API for an image collection instance - -L.DistortableCollection.Edit = L.Handler.extend({ - options: { - keymap: L.distortableImage.group_action_map - }, - initialize: function initialize(group, options) { - this._group = group; - this._exportOpts = group.options.exportOpts; - L.setOptions(this, options); - L.distortableImage.group_action_map.Escape = '_decollectAll'; - }, - addHooks: function addHooks() { - var group = this._group; - var map = group._map; - this.editActions = this.options.actions; - this.runExporter = L.bind(L.Utils.getNestedVal(this, '_exportOpts', 'exporter') || this.startExport, this); - L.DomEvent.on(document, 'keydown', this._onKeyDown, this); - - if (!(map.doubleClickZoom.enabled() || map.doubleClickLabels.enabled())) { - L.DomEvent.on(map, 'click', this._decollectAll, this); - } - - L.DomEvent.on(map, { - singleclickon: this._singleClickListeners, - singleclickoff: this._resetClickListeners, - singleclick: this._singleClick, - boxcollectend: this._addCollections - }, this); - this._group.editable = true; - - this._group.eachLayer(function (layer) { - return layer.editing.enable(); - }); - }, - removeHooks: function removeHooks() { - var group = this._group; - var map = group._map; - L.DomEvent.off(document, 'keydown', this._onKeyDown, this); - - if (!(map.doubleClickZoom.enabled() || map.doubleClickLabels.enabled())) { - L.DomEvent.off(map, 'click', this._decollectAll, this); - } - - L.DomEvent.off(map, { - singleclickon: this._singleClickListeners, - singleclickoff: this._resetClickListeners, - singleclick: this._singleClick, - boxcollectend: this._addCollections - }, this); - - this._decollectAll(); - - this._group.editable = false; - - this._group.eachLayer(function (layer) { - return layer.editing.disable(); - }); - }, - enable: function enable() { - this._enabled = true; - this.addHooks(); - return this; - }, - disable: function disable() { - this._enabled = false; - this.removeHooks(); - return this; - }, - _onKeyDown: function _onKeyDown(e) { - var keymap = this.options.keymap; - var handlerName = keymap[e.key]; - - if (!this[handlerName]) { - return; - } - - if (this._group.anyCollected()) { - this[handlerName].call(this); - } - }, - _singleClick: function _singleClick(e) { - if (e.type === 'singleclick') { - this._decollectAll(e); - } else { - return; - } - }, - _singleClickListeners: function _singleClickListeners() { - var map = this._group._map; - L.DomEvent.off(map, 'click', this._decollectAll, this); - L.DomEvent.on(map, 'singleclick', this._decollectAll, this); - }, - _resetClickListeners: function _resetClickListeners() { - var map = this._group._map; - L.DomEvent.on(map, 'click', this._decollectAll, this); - L.DomEvent.off(map, 'singleclick', this._decollectAll, this); - }, - _decollectAll: function _decollectAll(e) { - var oe; - - if (e) { - oe = e.originalEvent; - } - /** - * prevents image deselection following the 'boxcollectend' event - note 'shift' must not be released until dragging is complete - * also prevents deselection following a click on a disabled img by differentiating it from the map - */ - - - if (oe && (oe.shiftKey || oe.target instanceof HTMLImageElement)) { - return; - } - - this._group.eachLayer(function (layer) { - L.DomUtil.removeClass(layer.getElement(), 'collected'); - layer.deselect(); - }); - - this._removeToolbar(); - - if (e) { - L.DomEvent.stopPropagation(e); - } - }, - _unlockGroup: function _unlockGroup() { - var _this = this; - - if (!this.hasTool(L.UnlockAction)) { - return; - } - - this._group.eachLayer(function (layer) { - if (_this._group.isCollected(layer)) { - var edit = layer.editing; - - edit._unlock(); // unlock updates the layer's handles; deselect to ensure they're hidden - - - layer.deselect(); - } - }); - }, - _lockGroup: function _lockGroup() { - var _this2 = this; - - if (!this.hasTool(L.LockAction)) { - return; - } - - this._group.eachLayer(function (layer) { - if (_this2._group.isCollected(layer)) { - var edit = layer.editing; - - edit._lock(); // map.addLayer also deselects the image, so we reselect here - - - L.DomUtil.addClass(layer.getElement(), 'collected'); - } - }); - }, - _addCollections: function _addCollections(e) { - var _this3 = this; - - var box = e.boxCollectBounds; - var map = this._group._map; - - this._group.eachLayer(function (layer) { - var edit = layer.editing; - - if (layer.isSelected()) { - layer.deselect(); - } - - var zoom = map.getZoom(); - var center = map.getCenter(); - var imgBounds = L.latLngBounds(layer.getCorner(2), layer.getCorner(1)); - imgBounds = map._latLngBoundsToNewLayerBounds(imgBounds, zoom, center); - - if (box.intersects(imgBounds) && edit.enabled()) { - if (!_this3.toolbar) { - _this3._addToolbar(); - } - - L.DomUtil.addClass(layer.getElement(), 'collected'); - } - }); - }, - _removeGroup: function _removeGroup(e) { - var _this4 = this; - - if (!this.hasTool(L.DeleteAction)) { - return; - } - - var layersToRemove = this._group._toRemove(); - - var n = layersToRemove.length; - - if (n === 0) { - return; - } - - var choice = L.DomUtil.confirmDeletes(n); - - if (choice) { - layersToRemove.forEach(function (layer) { - _this4._group.removeLayer(layer); - }); - - if (!this._group.anyCollected()) { - this._removeToolbar(); - } - } - - if (e) { - L.DomEvent.stopPropagation(e); - } - }, - cancelExport: function cancelExport() { - if (!this.customCollection) { - this._exportOpts.collection = undefined; - } - - clearInterval(this.updateInterval); - }, - _addToolbar: function _addToolbar() { - var group = this._group; - var map = group._map; - - if (group.options.suppressToolbar || this.toolbar) { - return; - } - - this.toolbar = L.distortableImage.controlBar({ - actions: this.editActions, - position: 'topleft' - }).addTo(map, group); - }, - _removeToolbar: function _removeToolbar() { - var map = this._group._map; - - if (this.toolbar) { - map.removeLayer(this.toolbar); - this.toolbar = false; - } else { - return false; - } - }, - hasTool: function hasTool(value) { - return this.editActions.some(function (action) { - return action === value; - }); - }, - addTool: function addTool(value) { - if (value.baseClass === 'leaflet-toolbar-icon' && !this.hasTool(value)) { - this._removeToolbar(); - - this.editActions.push(value); - - this._addToolbar(); - } - - return this; - }, - removeTool: function removeTool(value) { - var _this5 = this; - - this.editActions.some(function (item, idx) { - if (_this5.editActions[idx] === value) { - _this5._removeToolbar(); - - _this5.editActions.splice(idx, 1); - - _this5._addToolbar(); - - return true; - } else { - return false; - } - }); - return this; - }, - startExport: function startExport() { - var _this6 = this; - - if (!this.hasTool(L.ExportAction)) { - return; - } - - return new Promise(function (resolve) { - var opts = _this6._exportOpts; - opts.resolve = resolve; // allow resolving promise in user-defined functions, to stop spinner on completion - - var statusUrl; - _this6.updateInterval = null; // this may be overridden to update the UI to show export progress or completion - - var _defaultUpdater = function _defaultUpdater(data) { - data = JSON.parse(data); // optimization: fetch status directly from google storage: - - if (data.status_url) { - if (statusUrl !== data.status_url && data.status_url.match('.json')) { - // if (data.status_url && data.status_url.substr(0,1) === "/") { - // opts.statusUrl = opts.statusUrl + data.status_url; - // } else { - statusUrl = data.status_url; // } - } - - if (data.status === 'complete') { - clearInterval(_this6.updateInterval); - - if (!_this6.customCollection) { - _this6._exportOpts.collection = undefined; - } - - resolve(); - - if (data.jpg !== null) { - alert('Export succeeded. ' + opts.exportUrl + data.jpg); - } - } // TODO: update to clearInterval when status == "failed" if we update that in this file: - // https://github.com/publiclab/mapknitter-exporter/blob/main/lib/mapknitterExporter.rb - - - console.log(data); - } - }; // receives the URL of status.json, and starts running the updater to repeatedly fetch from status.json; - // this may be overridden to integrate with any UI - - - var _defaultHandleStatusRes = function _defaultHandleStatusRes(data) { - statusUrl = opts.statusUrl + data; // repeatedly fetch the status.json - - _this6.updateInterval = setInterval(function () { - var reqOpts = { - method: 'GET' - }; - var req = new Request("".concat(statusUrl, "?").concat(Date.now()), reqOpts); - fetch(req).then(function (res) { - if (res.ok) { - return res.text(); - } - }).then(opts.updater); - }, opts.frequency); - }; // initiate the export - - - var _defaultFetchStatusUrl = function _defaultFetchStatusUrl(mergedOpts) { - var form = new FormData(); - form.append('collection', JSON.stringify(mergedOpts.collection)); - form.append('scale', mergedOpts.scale); - form.append('upload', true); - var reqOpts = { - method: 'POST', - body: form - }; - var req = new Request(mergedOpts.exportStartUrl, reqOpts); - fetch(req).then(function (res) { - if (res.ok) { - return res.text(); - } - }).then(mergedOpts.handleStatusRes); - }; // If the user has passed collection property - - - _this6.customCollection = !!opts.collection; - - if (!_this6.customCollection) { - opts.collection = _this6._group.generateExportJson().images; - } - - opts.frequency = opts.frequency || 3000; - opts.scale = opts.scale || 100; // switch it to _getAvgCmPerPixel ! - - opts.updater = opts.updater || _defaultUpdater; - opts.handleStatusRes = opts.handleStatusRes || _defaultHandleStatusRes; - opts.fetchStatusUrl = opts.fetchStatusUrl || _defaultFetchStatusUrl; - opts.fetchStatusUrl(opts); - }); - } -}); - -L.distortableCollection.edit = function (group, options) { - return new L.DistortableCollection.Edit(group, options); -}; - -/***/ }), - -/***/ "./src/edit/DistortableImage.Edit.js": -/*!*******************************************!*\ - !*** ./src/edit/DistortableImage.Edit.js ***! - \*******************************************/ -/***/ (function() { - -L.DistortableImage = L.DistortableImage || {}; // holds the keybindings & toolbar API for an individual image instance - -L.DistortableImage.Edit = L.Handler.extend({ - options: { - opacity: 0.7, - outline: '1px solid red', - keymap: L.distortableImage.action_map - }, - initialize: function initialize(overlay, options) { - this._overlay = overlay; - this._toggledImage = false; - this._mode = overlay.options.mode; - this._transparent = false; - this._outlined = false; - L.setOptions(this, options); - L.distortableImage.action_map.Escape = '_deselect'; - }, - - /* Run on image selection. */ - addHooks: function addHooks() { - var overlay = this._overlay; - this.editActions = this.options.actions; - /* bring the selected image into view */ - - overlay.bringToFront(); - - this._initModes(); - - this._initHandles(); - - this._appendHandlesandDragable(); - - if (overlay.isSelected() && !overlay.options.suppressToolbar) { - this._addToolbar(); - } - - this.parentGroup = overlay.eP ? overlay.eP : false; - L.DomEvent.on(overlay.getElement(), { - dblclick: this.nextMode - }, this); - L.DomEvent.on(window, 'keydown', this._onKeyDown, this); - }, - - /* Run on image deselection. */ - removeHooks: function removeHooks() { - var overlay = this._overlay; - var eP = this.parentGroup; // First, check if dragging exists - it may be off due to locking - - this._disableDragging(); - - if (this.toolbar) { - this._removeToolbar(); - } - - for (var handle in this._handles) { - L.DomUtil.remove(handle); - } - /** - * ensures if you disable an image while it is multi-selected - * additional deselection logic is run - */ - - - if (L.DomUtil.hasClass(overlay.getElement(), 'collected')) { - L.DomUtil.removeClass(overlay.getElement(), 'collected'); - } - - if (eP && !eP.anyCollected() && eP.editing.toolbar) { - eP.editing._removeToolbar(); - } - - L.DomEvent.off(overlay.getElement(), { - dblclick: this.nextMode - }, this); - L.DomEvent.off(window, 'keydown', this._onKeyDown, this); - }, - disable: function disable() { - if (!this._enabled) { - return this; - } - - this._overlay.deselect(); - - this._enabled = false; - this.removeHooks(); - return this; - }, - _initModes: function _initModes() { - this._modes = {}; // passed from L.DistortablImage.PopupBar. If the mode is one - // of the current toolbar actions, adds it to this._modes - - for (var mode in L.DistortableImage.Edit.MODES) { - var action = L.DistortableImage.Edit.MODES[mode]; - - if (this.editActions.indexOf(action) !== -1) { - this._modes[mode] = action; - } - } // sets the current mode to the 1st available one if the one selected - // during initialization is not available - - - if (!this._modes[this._mode]) { - this._mode = Object.keys(this._modes)[0]; - } - }, - _initHandles: function _initHandles() { - var overlay = this._overlay; - var i; - this._dragHandles = L.layerGroup(); - - for (i = 0; i < 4; i++) { - this._dragHandles.addLayer(L.dragHandle(overlay, i)); - } - - this._scaleHandles = L.layerGroup(); - - for (i = 0; i < 4; i++) { - this._scaleHandles.addLayer(L.scaleHandle(overlay, i)); - } - - this._distortHandles = L.layerGroup(); - - for (i = 0; i < 4; i++) { - this._distortHandles.addLayer(L.distortHandle(overlay, i)); - } - - this._rotateHandles = L.layerGroup(); // individual rotate - - for (i = 0; i < 4; i++) { - this._rotateHandles.addLayer(L.rotateHandle(overlay, i)); - } // handle includes rotate AND scale - - - this._freeRotateHandles = L.layerGroup(); - - for (i = 0; i < 4; i++) { - this._freeRotateHandles.addLayer(L.freeRotateHandle(overlay, i)); - } - - this._lockHandles = L.layerGroup(); - - for (i = 0; i < 4; i++) { - this._lockHandles.addLayer(L.lockHandle(overlay, i, { - draggable: false - })); - } - - this._handles = { - drag: this._dragHandles, - scale: this._scaleHandles, - distort: this._distortHandles, - rotate: this._rotateHandles, - freeRotate: this._freeRotateHandles, - lock: this._lockHandles - }; - }, - _appendHandlesandDragable: function _appendHandlesandDragable() { - var ov = this._overlay; // won't throw error if user adds 0 mode actions to toolbar - - if (!this._mode) { - this._enableDragging(); - - return; - } - - this._updateHandle(); - - if (!ov.isSelected() && this.currentHandle) { - this.currentHandle.eachLayer(function (handle) { - handle.setOpacity(0); - - if (handle.dragging) { - handle.dragging.disable(); - } - }); - } - - if (!this.isMode('lock')) { - this._enableDragging(); - } - }, - _onKeyDown: function _onKeyDown(e) { - var keymap = this.options.keymap; - var handlerName = keymap[e.key]; - var ov = this._overlay; - var eP = this.parentGroup; - - if (eP && eP.anyCollected()) { - return; - } - - if (this[handlerName] !== undefined && !ov.options.suppressToolbar) { - if (ov.isSelected() && this.toolbar) { - this[handlerName].call(this); - } - } - }, - replaceTool: function replaceTool(old, next) { - var _this = this; - - if (next.baseClass !== 'leaflet-toolbar-icon' || this.hasTool(next)) { - return this; - } - - this.editActions.some(function (item, idx) { - if (item === old) { - _this._removeToolbar(); - - _this.editActions[idx] = next; - - _this._addToolbar(); - - for (var mode in L.DistortableImage.Edit.MODES) { - if (L.DistortableImage.Edit.MODES[mode] === old) { - delete _this._modes[mode]; - - _this._nextOrNone(mode); - } else if (L.DistortableImage.Edit.MODES[mode] === next) { - _this._modes[mode] = next; - } - } - - return true; - } - }); - return this; - }, - addTool: function addTool(value) { - if (value.baseClass === 'leaflet-toolbar-icon' && !this.hasTool(value)) { - this._removeToolbar(); - - this.editActions.push(value); - - this._addToolbar(); - - for (var mode in L.DistortableImage.Edit.MODES) { - if (L.DistortableImage.Edit.MODES[mode] === value) { - this._modes[mode] = value; - } - } - - if (!this._overlay.isSelected()) { - this._removeToolbar(); - } - } - - return this; - }, - hasTool: function hasTool(value) { - return this.editActions.some(function (action) { - return action === value; - }); - }, - removeTool: function removeTool(value) { - var _this2 = this; - - this.editActions.some(function (item, idx) { - if (item === value) { - _this2._removeToolbar(); - - _this2.editActions.splice(idx, 1); - - _this2._addToolbar(); - - for (var mode in L.DistortableImage.Edit.MODES) { - if (L.DistortableImage.Edit.MODES[mode] === value) { - delete _this2._modes[mode]; - - _this2._nextOrNone(mode); - } - } - - return true; - } - }); - - if (!this._overlay.isSelected()) { - this._removeToolbar(); - } - - return this; - }, - // set the mode to the next mode or if that was the last one set mode to '' - _nextOrNone: function _nextOrNone(mode) { - if (this.isMode(mode)) { - if (Object.keys(this.getModes()).length >= 1) { - this.nextMode(); - } else { - if (mode === 'lock') { - this._enableDragging(); - } - - this._mode = ''; - - this._updateHandle(); - } - } - }, - _removeToolbar: function _removeToolbar() { - var ov = this._overlay; - var map = ov._map; - - if (this.toolbar) { - map.removeLayer(this.toolbar); - this.toolbar = false; - } - }, - _enableDragging: function _enableDragging() { - var _this3 = this; - - var overlay = this._overlay; - var map = overlay._map; - this.dragging = new L.Draggable(overlay.getElement()); - this.dragging.enable(); - /* Hide toolbars and markers while dragging; click will re-show it */ - - this.dragging.on('dragstart', function () { - overlay.fire('dragstart'); - - _this3._removeToolbar(); - }); - /* - * Adjust default behavior of L.Draggable, which overwrites the CSS3 - * distort transformations that we set when it calls L.DomUtil.setPosition. - */ - - this.dragging._updatePosition = function () { - var topLeft = overlay.getCorner(0); - - var delta = this._newPos.subtract(map.latLngToLayerPoint(topLeft)); - - var currentPoint; - var corners = {}; - var i; - this.fire('predrag'); - - for (i = 0; i < 4; i++) { - currentPoint = map.latLngToLayerPoint(overlay.getCorner(i)); - corners[i] = map.layerPointToLatLng(currentPoint.add(delta)); - } - - overlay.setCorners(corners); - overlay.fire('drag'); - this.fire('drag'); - }; - - this.dragging.on('dragend', function () { - overlay.fire('dragend'); - }); - }, - _disableDragging: function _disableDragging() { - if (this.dragging) { - this.dragging.disable(); - delete this.dragging; - } - }, - _dragMode: function _dragMode() { - this.setMode('drag'); - }, - _scaleMode: function _scaleMode() { - this.setMode('scale'); - }, - _distortMode: function _distortMode() { - this.setMode('distort'); - }, - _rotateMode: function _rotateMode() { - this.setMode('rotate'); - }, - _freeRotateMode: function _freeRotateMode() { - this.setMode('freeRotate'); - }, - _toggleLockMode: function _toggleLockMode() { - if (this.isMode('lock')) { - this._unlock(); - } else { - this._lock(); - } - }, - _toggleOpacity: function _toggleOpacity() { - var image = this._overlay.getElement(); - - var opacity; - - if (!this.hasTool(L.OpacityAction)) { - return; - } - - this._transparent = !this._transparent; - opacity = this._transparent ? this.options.opacity : 1; - L.DomUtil.setOpacity(image, opacity); - image.setAttribute('opacity', opacity); - - this._refresh(); - }, - _toggleBorder: function _toggleBorder() { - var image = this._overlay.getElement(); - - var outline; - - if (!this.hasTool(L.BorderAction)) { - return; - } - - this._outlined = !this._outlined; - outline = this._outlined ? this.options.outline : 'none'; - image.style.outline = outline; - - this._refresh(); - }, - // compare this to using overlay zIndex - _toggleOrder: function _toggleOrder() { - if (this._toggledImage) { - this._stackUp(); - } else { - this._stackDown(); - } - }, - _removeOverlay: function _removeOverlay() { - var ov = this._overlay; - var eP = this.parentGroup; - - if (this.isMode('lock') || !this.hasTool(L.DeleteAction)) { - return; - } - - var choice = L.DomUtil.confirmDelete(); - - if (!choice) { - return; - } - - this._removeToolbar(); - - if (eP) { - eP.removeLayer(ov); - } else { - ov._map.removeLayer(ov); - } - }, - // Based on https://github.com/publiclab/mapknitter/blob/8d94132c81b3040ae0d0b4627e685ff75275b416/app/assets/javascripts/mapknitter/Map.js#L47-L82 - _getExport: function _getExport() { - var overlay = this._overlay; - var map = overlay._map; - var img = overlay.getElement(); - - if (!this.hasTool(L.ExportAction)) { - return; - } // make a new image - - - var downloadable = new Image(); - downloadable.id = downloadable.id || 'tempId12345'; - document.body.appendChild(downloadable); - - downloadable.onload = function onLoadDownloadableImage() { - var height = downloadable.height; - var width = downloadable.width; - var nw = map.latLngToLayerPoint(overlay.getCorner(0)); - var ne = map.latLngToLayerPoint(overlay.getCorner(1)); - var sw = map.latLngToLayerPoint(overlay.getCorner(2)); - var se = map.latLngToLayerPoint(overlay.getCorner(3)); // I think this is to move the image to the upper left corner, - // eslint-disable-next-line max-len - // jywarren: i think we may need these or the image goes off the edge of the canvas - // jywarren: but these seem to break the distortion math... - // jywarren: i think it should be rejiggered so it - // finds the most negative values of x and y and then - // adds those to all coordinates - // nw.x -= nw.x; - // ne.x -= nw.x; - // se.x -= nw.x; - // sw.x -= nw.x; - // nw.y -= nw.y; - // ne.y -= nw.y; - // se.y -= nw.y; - // sw.y -= nw.y; - // run once warping is complete - - downloadable.onload = function () { - L.DomUtil.remove(downloadable); - }; - - if (window && window.hasOwnProperty('warpWebGl')) { - warpWebGl(downloadable.id, [0, 0, width, 0, width, height, 0, height], [nw.x, nw.y, ne.x, ne.y, se.x, se.y, sw.x, sw.y], true // trigger download - ); - } - }; - - downloadable.src = overlay.options.fullResolutionSrc || img.src; - }, - _stackUp: function _stackUp() { - var t = this._toggledImage; - - if (!t || !this.hasTool(L.StackAction)) { - return; - } - - this._toggledImage = false; - - this._overlay.bringToFront(); - - this._refresh(); - }, - _stackDown: function _stackDown() { - var t = this._toggledImage; - - if (t || !this.hasTool(L.StackAction)) { - return; - } - - this._toggledImage = true; - - this._overlay.bringToBack(); - - this._refresh(); - }, - _unlock: function _unlock() { - var ov = this._overlay; - var map = ov._map; - var eP = this.parentGroup; - - if (!this.isMode('lock')) { - return; - } - - if (eP && !eP.isCollected(ov) || !eP) { - if (!this.hasTool(L.LockAction)) { - return; - } - } - - if (this.currentHandle) { - map.removeLayer(this.currentHandle); - } - - if (ov.options.mode === 'lock' || !this.hasMode(ov.options.mode)) { - this._mode = ''; - this.currentHandle = ''; - } else { - this._mode = ov.options.mode; - } - - this._updateHandle(); - - this._enableDragging(); - - this._refresh(); - }, - _lock: function _lock() { - var ov = this._overlay; - var map = ov._map; - var eP = this.parentGroup; - - if (this.isMode('lock')) { - return; - } - - if (eP && !eP.isCollected(ov) || !eP) { - if (!this.hasTool(L.LockAction)) { - return; - } - } - - if (this.currentHandle) { - map.removeLayer(this.currentHandle); - } - - this._mode = 'lock'; - - this._updateHandle(); - - this._disableDragging(); - - this._refresh(); - }, - _deselect: function _deselect() { - this._overlay.deselect(); - }, - _showMarkers: function _showMarkers(e) { - var eP = this.parentGroup; - - if (!this.currentHandle) { - return; - } // only markers we want in collect interface for now is lock - - - if (!this.isMode('lock') && eP && eP.anyCollected()) { - return; - } - - this.currentHandle.eachLayer(function (handle) { - handle.setOpacity(1); - - if (handle.dragging) { - handle.dragging.enable(); - } - - L.DomUtil.addClass(handle.getElement(), 'leaflet-interactive'); - }); - }, - _hideMarkers: function _hideMarkers() { - var ov = this._overlay; - var eP = this.parentGroup; // workaround for race condition w/ feature group - - if (!this._handles) { - this._initHandles(); - } - - if (!this.currentHandle) { - return; - } - - if (this.isMode('lock') && eP && eP.isCollected(ov)) { - return; - } - - this.currentHandle.eachLayer(function (handle) { - handle.setOpacity(0); - - if (handle.dragging) { - handle.dragging.disable(); - } - - L.DomUtil.removeClass(handle.getElement(), 'leaflet-interactive'); - }); - }, - _updateHandle: function _updateHandle() { - var ov = this._overlay; - var map = ov._map; - var mode = this.getMode(); - - if (this.currentHandle) { - map.removeLayer(this.currentHandle); - } - - this.currentHandle = mode === '' ? '' : this._handles[mode]; - - if (this.currentHandle !== '') { - map.addLayer(this.currentHandle); - } - }, - _addToolbar: function _addToolbar() { - var ov = this._overlay; - var eP = this.parentGroup; - var map = ov._map; // Find the topmost point on the image. - - var corners = ov.getCorners(); - var maxLat = -Infinity; - - if (eP && eP.anyCollected()) { - eP.editing._addToolbar(); - - return; - } - - if (ov.options.suppressToolbar || this.toolbar) { - return; - } - - for (var i = 0; i < corners.length; i++) { - if (corners[i].lat > maxLat) { - maxLat = corners[i].lat; - } - } // Longitude is based on the centroid of the image. - - - var raisedPoint = ov.getCenter(); - raisedPoint.lat = maxLat; - this.toolbar = L.distortableImage.popupBar(raisedPoint, { - actions: this.editActions - }).addTo(map, ov); - ov.fire('toolbar:created'); - }, - _refresh: function _refresh() { - if (this.toolbar) { - this._removeToolbar(); - } - - this._addToolbar(); - }, - _updateToolbarPos: function _updateToolbarPos() { - var overlay = this._overlay; // Find the topmost point on the image. - - var corners = overlay.getCorners(); - var toolbar = this.toolbar; - var maxLat = -Infinity; - - if (toolbar && toolbar instanceof L.DistortableImage.PopupBar) { - for (var i = 0; i < corners.length; i++) { - if (corners[i].lat > maxLat) { - maxLat = corners[i].lat; - } - } // Longitude is based on the centroid of the image. - - - var raisedPoint = overlay.getCenter(); - raisedPoint.lat = maxLat; - - if (!overlay.options.suppressToolbar) { - this.toolbar.setLatLng(raisedPoint); - } - } - }, - hasMode: function hasMode(mode) { - return !!this._modes[mode]; - }, - getMode: function getMode() { - if (!this.enabled()) { - return; - } - - return this._mode; - }, - getModes: function getModes() { - return this._modes; - }, - isMode: function isMode(mode) { - if (!this.enabled()) { - return false; - } - - return this._mode === mode; - }, - setMode: function setMode(newMode) { - var ov = this._overlay; - var eP = this.parentGroup; - var mode = this.getMode(); - - if (mode === newMode || !this.hasMode(newMode) || !this.enabled()) { - return; - } - - if (this.toolbar) { - this.toolbar.clickTool(newMode); - } - - if (this.isMode('lock') && !this.dragging) { - this._enableDragging(); - } - - this._mode = newMode; - - if (this.isMode('lock')) { - this._disableDragging(); - } - - this._updateHandle(); - - this._refresh(); - - if (eP && eP.isCollected(ov)) { - ov.deselect(); - } - - return this; - }, - - /** - * need to attach a stop to img dblclick or it will propagate to - * the map and fire the handler that shows map location labels on map dblclick. - */ - nextMode: function nextMode(e) { - var mode = this.getMode(); - var eP = this.parentGroup; - var modesArray = Object.keys(this.getModes()); - var idx = modesArray.indexOf(mode); - var nextIdx = (idx + 1) % modesArray.length; - var newMode = modesArray[nextIdx]; - - if (e) { - if (eP && eP.anyCollected()) { - return; - } - - L.DomEvent.stop(e); - } - - return this.setMode(newMode); - } -}); - -L.distortableImage.edit = function (overlay, options) { - return new L.DistortableImage.Edit(overlay, options); -}; - -/***/ }), - -/***/ "./src/edit/actions/BorderAction.js": -/*!******************************************!*\ - !*** ./src/edit/actions/BorderAction.js ***! - \******************************************/ -/***/ (function() { - -L.BorderAction = L.EditAction.extend({ - initialize: function initialize(map, overlay, options) { - var edit = overlay.editing; - var mode = edit._mode; - var use; - var tooltip; - - if (edit._outlined) { - use = 'border_outer'; - tooltip = overlay.options.translation.removeBorder; - } else { - use = 'border_clear'; - tooltip = overlay.options.translation.addBorder; - } - - options = options || {}; - options.toolbarIcon = { - svg: true, - html: use, - tooltip: tooltip, - className: mode === 'lock' ? 'disabled' : '' - }; // conditional for disabling keybindings for this action when the image is locked. - - L.DistortableImage.action_map.b = mode === 'lock' ? '' : '_toggleBorder'; - L.EditAction.prototype.initialize.call(this, map, overlay, options); - }, - addHooks: function addHooks() { - var edit = this._overlay.editing; - L.IconUtil.toggleXlink(this._link, 'border_clear', 'border_outer'); - L.IconUtil.toggleTitle(this._link, 'Remove Border', 'Add Border'); - - edit._toggleBorder(); - } -}); - -/***/ }), - -/***/ "./src/edit/actions/DeleteAction.js": -/*!******************************************!*\ - !*** ./src/edit/actions/DeleteAction.js ***! - \******************************************/ -/***/ (function() { - -L.DeleteAction = L.EditAction.extend({ - initialize: function initialize(map, overlay, options) { - var edit = overlay.editing; - var use = 'delete_forever'; - var tooltip; - /** - * we can tell whether the overlay is an instance of `L.DistortableImageOverlay` or `L.DistortableCollection` bc only - * the former should have `parentGroup` defined on it. From there we call the apporpriate keybindings and methods. - */ - - if (edit instanceof L.DistortableImage.Edit) { - tooltip = overlay.options.translation.deleteImage; // backspace windows / delete mac - - L.DistortableImage.action_map.Backspace = edit._mode === 'lock' ? '' : '_removeOverlay'; - } else { - tooltip = overlay.options.translation.deleteImages; - L.DistortableImage.group_action_map.Backspace = edit._mode === 'lock' ? '' : '_removeGroup'; - } - - options = options || {}; - options.toolbarIcon = { - svg: true, - html: use, - tooltip: tooltip, - className: edit._mode === 'lock' ? 'disabled' : '' - }; - L.EditAction.prototype.initialize.call(this, map, overlay, options); - }, - addHooks: function addHooks() { - var edit = this._overlay.editing; - - if (edit instanceof L.DistortableImage.Edit) { - edit._removeOverlay(); - } else { - edit._removeGroup(); - } - } -}); - -/***/ }), - -/***/ "./src/edit/actions/DistortAction.js": -/*!*******************************************!*\ - !*** ./src/edit/actions/DistortAction.js ***! - \*******************************************/ -/***/ (function() { - -L.DistortAction = L.EditAction.extend({ - initialize: function initialize(map, overlay, options) { - options = options || {}; - options.toolbarIcon = { - svg: true, - html: 'distort', - tooltip: overlay.options.translation.distortImage, - className: 'distort' - }; - L.DistortableImage.action_map.d = '_distortMode'; - L.EditAction.prototype.initialize.call(this, map, overlay, options); - }, - addHooks: function addHooks() { - var edit = this._overlay.editing; - - edit._distortMode(); - } -}); - -/***/ }), - -/***/ "./src/edit/actions/DragAction.js": -/*!****************************************!*\ - !*** ./src/edit/actions/DragAction.js ***! - \****************************************/ -/***/ (function() { - -L.DragAction = L.EditAction.extend({ - initialize: function initialize(map, overlay, options) { - options = options || {}; - options.toolbarIcon = { - svg: true, - html: 'drag', - tooltip: overlay.options.translation.dragImage, - className: 'drag' - }; - L.DistortableImage.action_map.D = '_dragMode'; - L.EditAction.prototype.initialize.call(this, map, overlay, options); - }, - addHooks: function addHooks() { - var edit = this._overlay.editing; - - edit._dragMode(); - } -}); - -/***/ }), - -/***/ "./src/edit/actions/EditAction.js": -/*!****************************************!*\ - !*** ./src/edit/actions/EditAction.js ***! - \****************************************/ -/***/ (function() { - -L.DistortableImage = L.DistortableImage || {}; -L.distortableImage = L.DistortableImage; -L.DistortableImage.action_map = {}; -L.EditAction = L.Toolbar2.Action.extend({ - options: { - toolbarIcon: { - svg: false, - html: '', - className: '', - tooltip: '' - } - }, - initialize: function initialize(map, overlay, options) { - this._overlay = overlay; - this._map = map; - L.setOptions(this, options); - L.Toolbar2.Action.prototype.initialize.call(this, options); - - this._injectIconSet(); - }, - _createIcon: function _createIcon(toolbar, container, args) { - var _this = this; - - var iconOptions = this.options.toolbarIcon; - var className = iconOptions.className; - var edit = this._overlay.editing; - this.toolbar = toolbar; - this._icon = L.DomUtil.create('li', '', container); - this._link = L.DomUtil.create('a', '', this._icon); - - if (iconOptions.svg) { - this._link.innerHTML = L.IconUtil.create(iconOptions.html); - } else { - this._link.innerHTML = iconOptions.html; - } - - this._link.setAttribute('href', '#'); - - this._link.setAttribute('title', iconOptions.tooltip); - - this._link.setAttribute('role', 'button'); - - L.DomUtil.addClass(this._link, this.constructor.baseClass); - - if (className) { - L.DomUtil.addClass(this._link, className); - - if (className === 'disabled') { - L.DomUtil.addClass(this._icon, className); - } - - if (className === edit._mode) { - L.DomUtil.addClass(this._link, 'selected-mode'); - } else { - L.DomUtil.removeClass(this._link, 'selected-mode'); - } - } - - L.DomEvent.on(this._link, 'click', this.enable, this); - L.DomEvent.on(this._overlay, 'update', function () { - var match = _this._link.innerHTML.match(/xlink:href="#restore"/); - - if (match && match.length === 1) { - _this._enableAction(); - } - }); - /* Add secondary toolbar */ - - this._addSubToolbar(toolbar, this._icon, args); - }, - _injectIconSet: function _injectIconSet() { - if (document.querySelector('#iconset')) { - return; - } - - var el = document.createElement('div'); - el.id = 'iconset'; - el.setAttribute('hidden', 'hidden'); - el.innerHTML = new L.ToolbarIconSet().render(); - document.querySelector('.leaflet-marker-pane').appendChild(el); - }, - _enableAction: function _enableAction() { - L.DomUtil.removeClass(this._link.parentElement, 'disabled'); - L.DomUtil.removeClass(this._link, 'disabled'); - }, - _disableAction: function _disableAction() { - L.DomUtil.addClass(this._link.parentElement, 'disabled'); - L.DomUtil.addClass(this._link, 'disabled'); - } -}); - -L.editAction = function (map, overlay, options) { - return new L.EditAction(map, overlay, options); -}; - -/***/ }), - -/***/ "./src/edit/actions/ExportAction.js": -/*!******************************************!*\ - !*** ./src/edit/actions/ExportAction.js ***! - \******************************************/ -/***/ (function() { - -L.ExportAction = L.EditAction.extend({ - // This function is executed every time we select an image - initialize: function initialize(map, overlay, options) { - var edit = overlay.editing; - var tooltip; - this.isExporting = false; - this.mouseLeaveSkip = true; - this.isHooksExecuted = false; - - if (edit instanceof L.DistortableImage.Edit) { - L.DistortableImage.action_map.e = '_getExport'; - tooltip = overlay.options.translation.exportImage; - } else { - L.DistortableImage.group_action_map.e = 'runExporter'; - tooltip = overlay.options.translation.exportImages; - } - - options = options || {}; - options.toolbarIcon = { - svg: true, - html: 'get_app', - tooltip: tooltip - }; - L.EditAction.prototype.initialize.call(this, map, overlay, options); - }, - addHooks: function addHooks() { - var edit = this._overlay.editing; - - if (edit instanceof L.DistortableImage.Edit) { - edit._getExport(); - - return; - } // Make sure that addHooks is executed only once, event listeners will handle the rest - - - if (this.isHooksExecuted) { - return; - } else { - this.isHooksExecuted = true; - } - - var exportTool = this._link.parentElement; - this.mouseEnterHandler = this.handleMouseEnter.bind(this); - this.mouseLeaveHandler = this.handleMouseLeave.bind(this); - L.DomEvent.on(exportTool, 'click', function () { - if (!this.isExporting) { - this.isExporting = true; - this.renderExportIcon(); - setTimeout(this.attachMouseEventListeners.bind(this, exportTool), 100); - edit.runExporter().then(function () { - this.resetState(); - this.detachMouseEventListeners(exportTool); - }.bind(this)); - } else { - // Clicking on the export icon after export has started will be ignored - if (this.mouseLeaveSkip) { - return; - } - - this.resetState(); - this.detachMouseEventListeners(exportTool); - edit.cancelExport(); - } - }, this); - }, - resetState: function resetState() { - this.renderDownloadIcon(); - this.isExporting = false; - this.mouseLeaveSkip = true; - }, - attachMouseEventListeners: function attachMouseEventListeners(element) { - element.addEventListener('mouseenter', this.mouseEnterHandler); - element.addEventListener('mouseleave', this.mouseLeaveHandler); - }, - detachMouseEventListeners: function detachMouseEventListeners(element) { - element.removeEventListener('mouseenter', this.mouseEnterHandler); - element.removeEventListener('mouseleave', this.mouseLeaveHandler); - }, - handleMouseEnter: function handleMouseEnter() { - this.renderCancelIcon(); - }, - handleMouseLeave: function handleMouseLeave() { - if (this.mouseLeaveSkip) { - this.mouseLeaveSkip = false; - } else { - this.renderExportIcon(); - } - }, - renderDownloadIcon: function renderDownloadIcon() { - L.IconUtil.toggleXlink(this._link, 'get_app', 'spinner'); - L.IconUtil.toggleTitle(this._link, 'Export Images', 'Loading...'); - L.DomUtil.removeClass(this._link.firstChild, 'loader'); - }, - renderExportIcon: function renderExportIcon() { - L.IconUtil.toggleXlink(this._link, 'spinner'); - L.IconUtil.toggleTitle(this._link, 'Export Images', 'Loading...'); - L.IconUtil.addClassToSvg(this._link, 'loader'); - }, - renderCancelIcon: function renderCancelIcon() { - L.IconUtil.toggleXlink(this._link, 'cancel'); - L.IconUtil.toggleTitle(this._link, 'Cancel Export', 'Loading...'); - L.DomUtil.removeClass(this._link.firstChild, 'loader'); - } -}); - -/***/ }), - -/***/ "./src/edit/actions/FreeRotateAction.js": -/*!**********************************************!*\ - !*** ./src/edit/actions/FreeRotateAction.js ***! - \**********************************************/ -/***/ (function() { - -L.FreeRotateAction = L.EditAction.extend({ - initialize: function initialize(map, overlay, options) { - options = options || {}; - options.toolbarIcon = { - svg: true, - html: 'crop_rotate', - tooltip: overlay.options.translation.freeRotateImage, - className: 'freeRotate' - }; - L.DistortableImage.action_map.f = '_freeRotateMode'; - L.EditAction.prototype.initialize.call(this, map, overlay, options); - }, - addHooks: function addHooks() { - var edit = this._overlay.editing; - - edit._freeRotateMode(); - } -}); - -/***/ }), - -/***/ "./src/edit/actions/GeolocateAction.js": -/*!*********************************************!*\ - !*** ./src/edit/actions/GeolocateAction.js ***! - \*********************************************/ -/***/ (function() { - -L.GeolocateAction = L.EditAction.extend({ - initialize: function initialize(map, overlay, options) { - var edit = overlay.editing; - options = options || {}; - options.toolbarIcon = { - svg: true, - html: 'explore', - tooltip: overlay.options.translation.geolocateImage, - className: edit._mode === 'lock' ? 'disabled' : '' - }; - L.EditAction.prototype.initialize.call(this, map, overlay, options); - }, - addHooks: function addHooks() { - var image = this._overlay.getElement(); - - EXIF.getData(image, L.EXIF(image)); - } -}); - -/***/ }), - -/***/ "./src/edit/actions/LockAction.js": -/*!****************************************!*\ - !*** ./src/edit/actions/LockAction.js ***! - \****************************************/ -/***/ (function() { - -L.LockAction = L.EditAction.extend({ - initialize: function initialize(map, overlay, options) { - var edit = overlay.editing; - var use; - var tooltip; - - if (edit instanceof L.DistortableImage.Edit) { - L.DistortableImage.action_map.u = '_unlock'; - L.DistortableImage.action_map.l = '_lock'; - tooltip = overlay.options.translation.lockMode; - use = edit.isMode('lock') ? 'lock' : 'unlock'; - } else { - L.DistortableImage.group_action_map.l = '_lockGroup'; - tooltip = overlay.options.translation.lockImages; - use = 'lock'; - } - - options = options || {}; - options.toolbarIcon = { - svg: true, - html: use, - tooltip: tooltip, - className: 'lock' - }; - L.EditAction.prototype.initialize.call(this, map, overlay, options); - }, - addHooks: function addHooks() { - var edit = this._overlay.editing; - - if (edit instanceof L.DistortableImage.Edit) { - edit._toggleLockMode(); - } else { - edit._lockGroup(); - } - } -}); - -/***/ }), - -/***/ "./src/edit/actions/OpacityAction.js": -/*!*******************************************!*\ - !*** ./src/edit/actions/OpacityAction.js ***! - \*******************************************/ -/***/ (function() { - -L.OpacityAction = L.EditAction.extend({ - initialize: function initialize(map, overlay, options) { - var edit = overlay.editing; - var mode = edit._mode; - var use; - var tooltip; - - if (edit._transparent) { - use = 'opacity_empty'; - tooltip = overlay.options.translation.makeImageOpaque; - } else { - use = 'opacity'; - tooltip = overlay.options.translation.makeImageTransparent; - } - - options = options || {}; - options.toolbarIcon = { - svg: true, - html: use, - tooltip: tooltip, - className: mode === 'lock' ? 'disabled' : '' - }; - L.DistortableImage.action_map.o = mode === 'lock' ? '' : '_toggleOpacity'; - L.EditAction.prototype.initialize.call(this, map, overlay, options); - }, - addHooks: function addHooks() { - var edit = this._overlay.editing; - var link = this._link; - L.IconUtil.toggleXlink(link, 'opacity', 'opacity_empty'); - L.IconUtil.toggleTitle(link, 'Make Image Transparent', 'Make Image Opaque'); - - edit._toggleOpacity(); - } -}); - -/***/ }), - -/***/ "./src/edit/actions/RestoreAction.js": -/*!*******************************************!*\ - !*** ./src/edit/actions/RestoreAction.js ***! - \*******************************************/ -/***/ (function() { - -L.RestoreAction = L.EditAction.extend({ - initialize: function initialize(map, overlay, options) { - var mode = L.Utils.getNestedVal(overlay, 'editing', '_mode'); - var edited = overlay.edited; - options = options || {}; - options.toolbarIcon = { - svg: true, - html: 'restore', - tooltip: overlay.options.translation.restoreImage, - className: edited && mode !== 'lock' ? '' : 'disabled' - }; - L.EditAction.prototype.initialize.call(this, map, overlay, options); - }, - addHooks: function addHooks() { - var ov = this._overlay; - L.DomEvent.on(ov, { - edit: this._enableAction, - restore: this._disableAction - }, this); - ov.restore(); - } -}); - -/***/ }), - -/***/ "./src/edit/actions/RotateAction.js": -/*!******************************************!*\ - !*** ./src/edit/actions/RotateAction.js ***! - \******************************************/ -/***/ (function() { - -L.RotateAction = L.EditAction.extend({ - initialize: function initialize(map, overlay, options) { - options = options || {}; - options.toolbarIcon = { - svg: true, - html: 'rotate', - tooltip: overlay.options.translation.rotateImage, - className: 'rotate' - }; - L.DistortableImage.action_map.r = '_rotateMode'; - L.EditAction.prototype.initialize.call(this, map, overlay, options); - }, - addHooks: function addHooks() { - var edit = this._overlay.editing; - - edit._rotateMode(); - } -}); - -/***/ }), - -/***/ "./src/edit/actions/ScaleAction.js": -/*!*****************************************!*\ - !*** ./src/edit/actions/ScaleAction.js ***! - \*****************************************/ -/***/ (function() { - -L.ScaleAction = L.EditAction.extend({ - initialize: function initialize(map, overlay, options) { - options = options || {}; - options.toolbarIcon = { - svg: true, - html: 'scale', - tooltip: overlay.options.translation.scaleImage, - className: 'scale' - }; - L.DistortableImage.action_map.s = '_scaleMode'; - L.EditAction.prototype.initialize.call(this, map, overlay, options); - }, - addHooks: function addHooks() { - var edit = this._overlay.editing; - - edit._scaleMode(); - } -}); - -/***/ }), - -/***/ "./src/edit/actions/StackAction.js": -/*!*****************************************!*\ - !*** ./src/edit/actions/StackAction.js ***! - \*****************************************/ -/***/ (function() { - -L.StackAction = L.EditAction.extend({ - initialize: function initialize(map, overlay, options) { - var edit = overlay.editing; - var use; - var tooltip; - - if (edit._toggledImage) { - use = 'flip_to_back'; - tooltip = overlay.options.translation.stackToFront; - } else { - use = 'flip_to_front'; - tooltip = overlay.options.translation.stackToBack; - } - - options = options || {}; - options.toolbarIcon = { - svg: true, - html: use, - tooltip: tooltip, - className: edit._mode === 'lock' ? 'disabled' : '' - }; - L.DistortableImage.action_map.q = edit._mode === 'lock' ? '' : '_stackUp'; - L.DistortableImage.action_map.a = edit._mode === 'lock' ? '' : '_stackDown'; - L.EditAction.prototype.initialize.call(this, map, overlay, options); - }, - addHooks: function addHooks() { - var edit = this._overlay.editing; - L.IconUtil.toggleXlink(this._link, 'flip_to_front', 'flip_to_back'); - L.IconUtil.toggleTitle(this._link, 'Stack to Front', 'Stack to Back'); - - edit._toggleOrder(); - } -}); - -/***/ }), - -/***/ "./src/edit/actions/UnlockAction.js": -/*!******************************************!*\ - !*** ./src/edit/actions/UnlockAction.js ***! - \******************************************/ -/***/ (function() { - -L.UnlockAction = L.EditAction.extend({ - initialize: function initialize(map, overlay, options) { - options = options || {}; - options.toolbarIcon = { - svg: true, - html: 'unlock', - tooltip: overlay.options.translation.unlockImages - }; - L.DistortableImage.group_action_map.u = '_unlockGroup'; - L.EditAction.prototype.initialize.call(this, map, overlay, options); - }, - addHooks: function addHooks() { - var edit = this._overlay.editing; - - edit._unlockGroup(); - } -}); - -/***/ }), - -/***/ "./src/edit/getEXIFdata.js": -/*!*********************************!*\ - !*** ./src/edit/getEXIFdata.js ***! - \*********************************/ -/***/ (function() { - -/* eslint-disable no-unused-vars */ -L.EXIF = function getEXIFdata(img) { - if (Object.keys(EXIF.getAllTags(img)).length !== 0) { - console.log(EXIF.getAllTags(img)); - var GPS = EXIF.getAllTags(img); - var altitude; - /* If the lat/lng is available. */ - - if (typeof GPS.GPSLatitude !== 'undefined' && typeof GPS.GPSLongitude !== 'undefined') { - // sadly, encoded in [degrees,minutes,seconds] - // primitive value = GPS.GPSLatitude[x].numerator - var lat = GPS.GPSLatitude[0] + GPS.GPSLatitude[1] / 60 + GPS.GPSLatitude[2] / 3600; - var lng = GPS.GPSLongitude[0] + GPS.GPSLongitude[1] / 60 + GPS.GPSLongitude[2] / 3600; - - if (GPS.GPSLatitudeRef !== 'N') { - lat = lat * -1; - } - - if (GPS.GPSLongitudeRef === 'W') { - lng = lng * -1; - } - } // Attempt to use GPS compass heading; will require - // some trig to calc corner points, which you can find below: - - - var angle = 0; // "T" refers to "True north", so -90. - - if (GPS.GPSImgDirectionRef === 'T') { - angle = Math.PI / 180 * (GPS.GPSImgDirection.numerator / GPS.GPSImgDirection.denominator - 90); // "M" refers to "Magnetic north" - } else if (GPS.GPSImgDirectionRef === 'M') { - angle = Math.PI / 180 * (GPS.GPSImgDirection.numerator / GPS.GPSImgDirection.denominator - 90); - } else { - console.log('No compass data found'); - } - - console.log('Orientation:', GPS.Orientation); - /* If there is orientation data -- i.e. landscape/portrait etc */ - - if (GPS.Orientation === 6) { - // CCW - angle += Math.PI / 180 * -90; - } else if (GPS.Orientation === 8) { - // CW - angle += Math.PI / 180 * 90; - } else if (GPS.Orientation === 3) { - // 180 - angle += Math.PI / 180 * 180; - } - /* If there is altitude data */ - - - if (typeof GPS.GPSAltitude !== 'undefined' && typeof GPS.GPSAltitudeRef !== 'undefined') { - // Attempt to use GPS altitude: - // (may eventually need to find EXIF field of view for correction) - if (typeof GPS.GPSAltitude !== 'undefined' && typeof GPS.GPSAltitudeRef !== 'undefined') { - altitude = GPS.GPSAltitude.numerator / GPS.GPSAltitude.denominator + GPS.GPSAltitudeRef; - } else { - altitude = 0; // none - } - } - } else { - alert('EXIF initialized. Press again to view data in console.'); - } -}; - -/***/ }), - -/***/ "./src/edit/handles/DistortHandle.js": -/*!*******************************************!*\ - !*** ./src/edit/handles/DistortHandle.js ***! - \*******************************************/ -/***/ (function() { - -L.DistortHandle = L.EditHandle.extend({ - options: { - TYPE: 'distort', - icon: L.icon({ - iconUrl: // eslint-disable-next-line max-len - 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAChSURBVO3BIU4DURgGwNkvL2B6AkQTLBqP4QCoSm7DDXoBLBZHDbfgICAIZjEV3YTn9uVHdMZZtcnCfI13bIzxg0emg6Nm6QVbYz3jylEsXRrvwommb49X67jFkz80fR9Mb1YxTzqiWBSLYlEsikWxKBbFolgUi2JRLIpFsSgWxaJY03fHHOu40dH07bAzWCx9Ge/TiWbpHgdsjPGNB2f/yS+7xRCyiiZPJQAAAABJRU5ErkJggg==', - iconSize: [32, 32], - iconAnchor: [16, 16] - }) - }, - _onHandleDrag: function _onHandleDrag() { - var overlay = this._handled; - overlay.setCorner(this._corner, this.getLatLng()); - }, - updateHandle: function updateHandle() { - this.setLatLng(this._handled.getCorner(this._corner)); - } -}); - -L.distortHandle = function (overlay, idx, options) { - return new L.DistortHandle(overlay, idx, options); -}; - -/***/ }), - -/***/ "./src/edit/handles/DragHandle.js": -/*!****************************************!*\ - !*** ./src/edit/handles/DragHandle.js ***! - \****************************************/ -/***/ (function() { - -L.DragHandle = L.EditHandle.extend({ - options: { - TYPE: 'drag', - icon: L.icon({ - // eslint-disable-next-line max-len - iconUrl: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAsVJREFUeNrMVztLXEEUvnNVFAVBAhY2aRKbTZEHJNpYabuNjSgYg/GxdsmPSJkUAa/ZdVEX8mgWYVutbHxAHkVskjQBuUUgBISVhCQk3wnfwMlk1rusN1wHPubOzJlzvjlz5sxc01Ma/hUEwQnwDIjqc7uvgv9YYO86qgIwCXQbdNTlQ8kcCBHgBch8TcloF6oJGr6phk6EQAkfdz3zvgDr9Mr7Fg1fptEZoM8jsmrokpfsiIFO4IIjuE2v1EDmR4LRdlR5Gh51hj8D34ABtm8YTtqna0TgklIw5CgQguKxIojEjmFROg/MKQO27NkFAB+4wAPouGUJiIvWKHwbAxX2XyWRKWkqhT+pbJntJZJuUzISW0+5hW+obxrVBsfvoH/dqCCJuU97GBh2VteLSiYvArmErT8EVoAK9Bw7enbpVYmvAQlyowYforrH5jXL2rPHI/TKONDB7u9AlavdaTBPvPmazUeQuy8f7UomUgTEwIJPEQ3sQGE/6ll2l9H/KcEzBcfWn2IclluM3DpddJxSHujlFkscbUPvmB0LHVnLrId7nlaZVkEc6QGXQI1MAwZcWmVRHeNaQwJMMiU2cwy4s7p/RJ2ckpvIQs+cIs+5GzitloLKHUV3MPREuXbTOKO91dX387gGTONxIgEWm+E61FFrpcyqXLHsEwiDjEsjAksqw5XPoL9MHVrn6QR4q+XZrDaR4RoWzq2ymafuRA/Mq1stSsHLVkcbdf9VjOcx8ZH3+SFWcCWlVPyWuUBOwUWdC1wP5NVjYiXFWLO69PZ6CRTUY6KSIoEKdf6T3IzzgHxnsyHctNBEkmn6Oob8ExUDg/ahGybd177cDjzH5xHwgDiSvoS7I/LZyvxJZj0wod7tkX5G0XVC7rEyLhfLJjBGbKoLLEfZWObyKeZ6oY82g+yf5Zn/mJyHX7PMf04z/T3/LcAAu4E6iiyJqf0AAAAASUVORK5CYII=', - iconSize: [32, 32], - iconAnchor: [16, 16] - }) - }, - _onHandleDrag: function _onHandleDrag() { - var overlay = this._handled; - var formerLatLng = overlay.getCorner(this._corner); - var newLatLng = this.getLatLng(); - overlay.dragBy(formerLatLng, newLatLng); - }, - updateHandle: function updateHandle() { - this.setLatLng(this._handled.getCorner(this._corner)); - } -}); - -L.dragHandle = function (overlay, idx, options) { - return new L.DragHandle(overlay, idx, options); -}; - -/***/ }), - -/***/ "./src/edit/handles/EditHandle.js": -/*!****************************************!*\ - !*** ./src/edit/handles/EditHandle.js ***! - \****************************************/ -/***/ (function() { - -L.EditHandle = L.Marker.extend({ - initialize: function initialize(overlay, corner, options) { - var latlng = overlay.getCorner(corner); - L.setOptions(this, options); - this._handled = overlay; - this._corner = corner; - var markerOptions = { - draggable: true, - zIndexOffset: 10 - }; - - if (options && options.hasOwnProperty('draggable')) { - markerOptions.draggable = options.draggable; - } - - L.Marker.prototype.initialize.call(this, latlng, markerOptions); - }, - onAdd: function onAdd(map) { - L.Marker.prototype.onAdd.call(this, map); - - this._bindListeners(); - - this.updateHandle(); - }, - onRemove: function onRemove(map) { - this._unbindListeners(); - - L.Marker.prototype.onRemove.call(this, map); - }, - _onHandleDragStart: function _onHandleDragStart() { - this._handled.fire('editstart'); - }, - _onHandleDragEnd: function _onHandleDragEnd() { - this._fireEdit(); - }, - _fireEdit: function _fireEdit() { - this._handled.edited = true; - - this._handled.fire('edit'); - }, - _bindListeners: function _bindListeners() { - this.on({ - contextmenu: L.DomEvent.stop, - dragstart: this._onHandleDragStart, - drag: this._onHandleDrag, - dragend: this._onHandleDragEnd - }, this); - - this._handled._map.on('zoomend', this.updateHandle, this); - - this._handled.on('update', this.updateHandle, this); - }, - _unbindListeners: function _unbindListeners() { - this.off({ - contextmenu: L.DomEvent.stop, - dragstart: this._onHandleDragStart, - drag: this._onHandleDrag, - dragend: this._onHandleDragEnd - }, this); - - this._handled._map.off('zoomend', this.updateHandle, this); - - this._handled.off('update', this.updateHandle, this); - }, - - /* Takes two latlngs and calculates the scaling difference. */ - _calculateScalingFactor: function _calculateScalingFactor(latlngA, latlngB) { - var overlay = this._handled; - var map = overlay._map; - var centerPoint = map.latLngToLayerPoint(overlay.getCenter()); - var formerPoint = map.latLngToLayerPoint(latlngA); - var newPoint = map.latLngToLayerPoint(latlngB); - - var formerRadiusSquared = this._d2(centerPoint, formerPoint); - - var newRadiusSquared = this._d2(centerPoint, newPoint); - - return Math.sqrt(newRadiusSquared / formerRadiusSquared); - }, - - /* Distance between two points in cartesian space, squared (distance formula). */ - _d2: function _d2(a, b) { - var dx = a.x - b.x; - var dy = a.y - b.y; - return Math.pow(dx, 2) + Math.pow(dy, 2); - }, - - /* Takes two latlngs and calculates the angle between them. */ - calculateAngleDelta: function calculateAngleDelta(latlngA, latlngB) { - var overlay = this._handled; - var map = overlay._map; - var centerPoint = map.latLngToLayerPoint(overlay.getCenter()); - var formerPoint = map.latLngToLayerPoint(latlngA); - var newPoint = map.latLngToLayerPoint(latlngB); - var initialAngle = Math.atan2(centerPoint.y - formerPoint.y, centerPoint.x - formerPoint.x); - var newAngle = Math.atan2(centerPoint.y - newPoint.y, centerPoint.x - newPoint.x); - return newAngle - initialAngle; - } -}); - -/***/ }), - -/***/ "./src/edit/handles/FreeRotateHandle.js": -/*!**********************************************!*\ - !*** ./src/edit/handles/FreeRotateHandle.js ***! - \**********************************************/ -/***/ (function() { - -L.FreeRotateHandle = L.EditHandle.extend({ - options: { - TYPE: 'freeRotate', - icon: L.icon({ - iconUrl: // eslint-disable-next-line max-len - 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAHiSURBVMXBa3HbShgA0PMp/1sCCo8oCEpgTaCXgIXAJiDzyCJoAUTm4UVQAns1Y8+snWnTvJyeE16hkjDgDrfoNTMKcpC9UPiLSo8JyetkjEHxjPCMyoS199kFoz8Iv1HpMaN3qWDCHoegOKkkRwnJpRmroHgiPFEZ8IBekzEGxQtUEhKSS/fB7Ew4U+lxcGkVZG9QWWPSFAxBcdK59KApuA+yNwp2uEdx1GN25sZJZULSfAtm77SlbNjju6MvG75u+WHRWVR6rDVjMPsgwYyVZl3pLTpHkyYHOx8syMiayaJzlDTZ9YyaZNFVkiYH2ZUEBcVJJXVImuz6Js3Qofe59pq7DoOTILu+g+a288mCouk7/1iH4qTS+2QdDppbV1ZJmrnDXnPnc5UOs2Z0fUmTuyBr+krvSioJyUmQO0dZM7mepMkWnaNRkyrJB6uskTSjxY3Fll8bvmJwlDb83FJ8gMqAB80uyBY3Trb82PAfvjj6vuHnluIdKgMeNXOwctK5NKBoHitrb1RJeHRp5Ux4ojLg0aWMHGQvUOkxIWkKVsHsTPiNSo8HDC5lZIsgO6n0uMUdRvQuFQxB8UR4RmXC2vvsgtEfhL+o9JiQvE7GGBTPCK9QSUjoMWgKDthjDrIX+h/k0I7gth6N5gAAAABJRU5ErkJggg==', - iconSize: [32, 32], - iconAnchor: [16, 16] - }) - }, - _onHandleDrag: function _onHandleDrag() { - var overlay = this._handled; - var map = overlay._map; - var formerLatLng = overlay.getCorner(this._corner); - var newLatLng = this.getLatLng(); - var angle = this.calculateAngleDelta(formerLatLng, newLatLng); - - var scale = this._calculateScalingFactor(formerLatLng, newLatLng); - - if (angle !== 0) { - overlay.rotateBy(angle, 'rad'); - } - - var edgeMinWidth = overlay.edgeMinWidth; - - if (!edgeMinWidth) { - edgeMinWidth = 50; - } - /* just in case */ - - - var corner1 = map.latLngToContainerPoint(overlay.getCorner(0)); - var corner2 = map.latLngToContainerPoint(overlay.getCorner(1)); - var w = Math.abs(corner1.x - corner2.x); - var h = Math.abs(corner1.y - corner2.y); - var distance = Math.sqrt(w * w + h * h); - - if (distance > edgeMinWidth || scale > 1) { - overlay.scaleBy(scale); - } else { - overlay.scaleBy(1); - } - }, - updateHandle: function updateHandle() { - this.setLatLng(this._handled.getCorner(this._corner)); - } -}); - -L.freeRotateHandle = function (overlay, idx, options) { - return new L.FreeRotateHandle(overlay, idx, options); -}; - -/***/ }), - -/***/ "./src/edit/handles/LockHandle.js": -/*!****************************************!*\ - !*** ./src/edit/handles/LockHandle.js ***! - \****************************************/ -/***/ (function() { - -L.LockHandle = L.EditHandle.extend({ - options: { - TYPE: 'lock', - interactive: false, - icon: L.icon({ - // eslint-disable-next-line max-len - iconUrl: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAD8SURBVO3BPU7CYAAA0AdfjIcQlRCQBG7C3gk2uIPG2RC3Dk16Gz0FTO1WZs/gwGCMP/2+xsSl7+n1er1Iz9LtRQjaPeMeO+TinLDCJV78YqjdA04YodKuxhUaPGoRxMmxwRQZSt87Yo4KExGCeAUyLLFB4bMacxywEClIU2KDKXbInTUYo8JCgoFuGoxQO5uiwY1EA91VmDqrcKeDoX8WdNNgjApvmGGLXKIgXY0xGkxQYItrrFFIEKQ5Yo4KEx9yrDFDhlKkIF6NOQ5Y+KpAhiXWKEQI4pxwiwoLPyuxwQw75FoE7fZYocFEuwI7jHCBV39gL92TXq/Xi/AOcmczZmaIMScAAAAASUVORK5CYII=', - iconSize: [32, 32], - iconAnchor: [16, 16] - }) - }, - onRemove: function onRemove(map) { - this.unbindTooltip(); - L.EditHandle.prototype.onRemove.call(this, map); - }, - _bindListeners: function _bindListeners() { - var icon = this.getElement(); - - L.EditHandle.prototype._bindListeners.call(this); - - L.DomEvent.on(icon, { - mousedown: this._tooltipOn, - mouseup: this._tooltipOff - }, this); - L.DomEvent.on(document, 'pointerleave', this._tooltipOff, this); - }, - _unbindListeners: function _unbindListeners() { - var icon = this.getElement(); - - L.EditHandle.prototype._bindListeners.call(this); - - L.DomEvent.off(icon, { - mousedown: this._tooltipOn, - mouseup: this._tooltipOff - }, this); - L.DomEvent.off(document, 'pointerleave', this._tooltipOff, this); - }, - - /* cannot be dragged */ - _onHandleDrag: function _onHandleDrag() {}, - updateHandle: function updateHandle() { - this.setLatLng(this._handled.getCorner(this._corner)); - }, - _tooltipOn: function _tooltipOn(e) { - var eP = this._handled.parentGroup; - var edit = eP ? eP.editing : this._handled.editing; - - if (e.shiftKey) { - return; - } - - if (!this._handled.isSelected() && eP && !eP.isCollected(this._handled)) { - return; - } - - var handlesArr = edit._lockHandles; - this._timer = setTimeout(L.bind(function () { - if (this._timeout) { - clearTimeout(this._timeout); - } - - if (!this.getTooltip()) { - this.bindTooltip('Locked!', { - permanent: true - }); - } else { - handlesArr.eachLayer(function (handle) { - if (this !== handle) { - handle.closeTooltip(); - } - }); - } - - this.openTooltip(); - }, this), 500); - }, - _tooltipOff: function _tooltipOff(e) { - var eP = this._handled.parentGroup; - var edit = eP ? eP.editing : this._handled.editing; - - if (e.shiftKey) { - return; - } - - if (!this._handled.isSelected() && eP && !eP.isCollected(this._handled)) { - return; - } - - var handlesArr = edit._lockHandles; - - if (e.currentTarget === document) { - handlesArr.eachLayer(function (handle) { - handle.closeTooltip(); - }); - } - - if (this._timer) { - clearTimeout(this._timer); - } - - this._timeout = setTimeout(L.bind(function () { - this.closeTooltip(); - }, this), 400); - } -}); - -L.lockHandle = function (overlay, idx, options) { - return new L.LockHandle(overlay, idx, options); -}; - -/***/ }), - -/***/ "./src/edit/handles/RotateHandle.js": -/*!******************************************!*\ - !*** ./src/edit/handles/RotateHandle.js ***! - \******************************************/ -/***/ (function() { - -L.RotateHandle = L.EditHandle.extend({ - options: { - TYPE: 'rotate', - icon: L.icon({ - iconUrl: // eslint-disable-next-line max-len - 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAHiSURBVMXBa3HbShgA0PMp/1sCCo8oCEpgTaCXgIXAJiDzyCJoAUTm4UVQAns1Y8+snWnTvJyeE16hkjDgDrfoNTMKcpC9UPiLSo8JyetkjEHxjPCMyoS199kFoz8Iv1HpMaN3qWDCHoegOKkkRwnJpRmroHgiPFEZ8IBekzEGxQtUEhKSS/fB7Ew4U+lxcGkVZG9QWWPSFAxBcdK59KApuA+yNwp2uEdx1GN25sZJZULSfAtm77SlbNjju6MvG75u+WHRWVR6rDVjMPsgwYyVZl3pLTpHkyYHOx8syMiayaJzlDTZ9YyaZNFVkiYH2ZUEBcVJJXVImuz6Js3Qofe59pq7DoOTILu+g+a288mCouk7/1iH4qTS+2QdDppbV1ZJmrnDXnPnc5UOs2Z0fUmTuyBr+krvSioJyUmQO0dZM7mepMkWnaNRkyrJB6uskTSjxY3Fll8bvmJwlDb83FJ8gMqAB80uyBY3Trb82PAfvjj6vuHnluIdKgMeNXOwctK5NKBoHitrb1RJeHRp5Ux4ojLg0aWMHGQvUOkxIWkKVsHsTPiNSo8HDC5lZIsgO6n0uMUdRvQuFQxB8UR4RmXC2vvsgtEfhL+o9JiQvE7GGBTPCK9QSUjoMWgKDthjDrIX+h/k0I7gth6N5gAAAABJRU5ErkJggg==', - iconSize: [32, 32], - iconAnchor: [16, 16] - }) - }, - _onHandleDrag: function _onHandleDrag() { - var overlay = this._handled; - var formerLatLng = overlay.getCorner(this._corner); - var newLatLng = this.getLatLng(); - var angle = this.calculateAngleDelta(formerLatLng, newLatLng); - /* - * running rotation logic even for an angle delta of 0 - * prevents a small, occasional marker flicker - */ - - overlay.rotateBy(angle, 'rad'); - }, - updateHandle: function updateHandle() { - this.setLatLng(this._handled.getCorner(this._corner)); - } -}); - -L.rotateHandle = function (overlay, idx, options) { - return new L.RotateHandle(overlay, idx, options); -}; - -/***/ }), - -/***/ "./src/edit/handles/ScaleHandle.js": -/*!*****************************************!*\ - !*** ./src/edit/handles/ScaleHandle.js ***! - \*****************************************/ -/***/ (function() { - -L.ScaleHandle = L.EditHandle.extend({ - options: { - TYPE: 'scale', - icon: L.icon({ - iconUrl: // eslint-disable-next-line max-len - 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2ZXJzaW9uPSIxLjEiIHdpZHRoPSI0NTkiIGhlaWdodD0iNDY0IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCA1MTIgNTEyIiB4bWw6c3BhY2U9InByZXNlcnZlIiBzdHlsZT0iIj48cmVjdCBpZD0iYmFja2dyb3VuZHJlY3QiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIHg9IjAiIHk9IjAiIGZpbGw9Im5vbmUiIHN0cm9rZT0ibm9uZSIgY2xhc3M9IiIgc3R5bGU9IiIvPjxnIGNsYXNzPSJjdXJyZW50TGF5ZXIiIHN0eWxlPSIiPjx0aXRsZT5MYXllciAxPC90aXRsZT48cGF0aCBkPSJNNDU5LjA0OTE1OTUzMDQ3MTM0LDg2LjkyNjIzNDUxMjU1MDAyIFYwIGgtODUuNzE0NTczMzU2MzEyMDkgdjI3LjA0MzcxNzQwMzkwNDQ1MiBIODUuNzE0NTczMzU2MzEyMDMgVjAgSDAgdjg2LjkyNjIzNDUxMjU1MDAyIGgyNS43MTQzNzIwMDY4OTM2MjYgdjI4OS43NTQxMTUwNDE4MzM0IEgwIHY4Ni45MjYyMzQ1MTI1NTAwMiBoODUuNzE0NTczMzU2MzEyMDkgdi0yNy4wNDM3MTc0MDM5MDQ0NTIgaDI4NS43MTUyNDQ1MjEwNDAzIHYyNy4wNDM3MTc0MDM5MDQ0NTIgaDg1LjcxNDU3MzM1NjMxMjA5IHYtODYuOTI2MjM0NTEyNTUwMDIgaC0yMy44MDk2MDM3MTAwODY2OSBWODYuOTI2MjM0NTEyNTUwMDIgSDQ1OS4wNDkxNTk1MzA0NzEzNCB6TTM4NC43NjMxOTU5NTUwMDA5LDEyLjU1NjAxMTY1MTgxMjc4MSBoNjEuOTA0OTY5NjQ2MjI1Mzk2IHY2Mi43ODAwNTgyNTkwNjM5MSBoLTYxLjkwNDk2OTY0NjIyNTM5NiBWMTIuNTU2MDExNjUxODEyNzgxIHpNMTIuMzgwOTkzOTI5MjQ1MDUsMTIuNTU2MDExNjUxODEyNzgxIGg2MS45MDQ5Njk2NDYyMjUzOTYgdjYyLjc4MDA1ODI1OTA2MzkxIEgxMi4zODA5OTM5MjkyNDUwNSBWMTIuNTU2MDExNjUxODEyNzgxIHpNNzQuMjg1OTYzNTc1NDcwNTMsNDUxLjA1MDU3MjQxNTEyMDY2IEgxMi4zODA5OTM5MjkyNDUwNSB2LTYyLjc4MDA1ODI1OTA2MzkxIGg2MS45MDQ5Njk2NDYyMjUzOTYgVjQ1MS4wNTA1NzI0MTUxMjA2NiB6TTQ0NS43MTU3ODE0NTI4MjI3NCw0NTEuMDUwNTcyNDE1MTIwNjYgaC02Mi44NTczNTM3OTQ2Mjg4NjQgdi02Mi43ODAwNTgyNTkwNjM5MSBoNjIuODU3MzUzNzk0NjI4ODY0IFY0NTEuMDUwNTcyNDE1MTIwNjYgek00MDcuNjIwNDE1NTE2Njg0MjYsMzc2LjY4MDM0OTU1NDM4MzQ0IGgtMzYuMTkwNTk3NjM5MzMxNzcgdjMyLjgzODc5OTcwNDc0MTEyIEg4NS43MTQ1NzMzNTYzMTIwMyB2LTMyLjgzODc5OTcwNDc0MTEyIEg0OS41MjM5NzU3MTY5ODAzMiBWODYuOTI2MjM0NTEyNTUwMDIgaDM2LjE5MDU5NzYzOTMzMTc3IFY1MC4yMjQwNDY2MDcyNTExMjUgaDI4Ny42MjAwMTI4MTc4NDcyIHYzNi43MDIxODc5MDUyOTg5IGgzNC4yODU4MjkzNDI1MjQ4MzUgVjM3Ni42ODAzNDk1NTQzODM0NCB6IiBpZD0ic3ZnXzIiIGNsYXNzPSIiIGZpbGw9IiMxYTFhZWIiIGZpbGwtb3BhY2l0eT0iMSIvPjwvZz48L3N2Zz4=', - iconSize: [32, 32], - iconAnchor: [16, 16] - }) - }, - _onHandleDrag: function _onHandleDrag() { - var overlay = this._handled; - var map = overlay._map; - var edgeMinWidth = overlay.edgeMinWidth; - var formerLatLng = overlay.getCorner(this._corner); - var newLatLng = this.getLatLng(); - - var scale = this._calculateScalingFactor(formerLatLng, newLatLng); - /* - * checks whether the "edgeMinWidth" property is set and tracks the minimum edge length; - * this enables preventing scaling to zero, but we might also add an overall scale limit - */ - - - if (!edgeMinWidth) { - edgeMinWidth = 50; - } - /* just in case */ - - - var corner1 = map.latLngToLayerPoint(overlay.getCorner(0)); - var corner2 = map.latLngToLayerPoint(overlay.getCorner(1)); - var w = Math.abs(corner1.x - corner2.x); - var h = Math.abs(corner1.y - corner2.y); - var distance = Math.sqrt(w * w + h * h); - - if (distance > edgeMinWidth || scale > 1) { - overlay.scaleBy(scale); - /* - * running scale logic even for a scale ratio of 1 - * prevents a small, occasional marker flicker - */ - } else { - overlay.scaleBy(1); - } - }, - updateHandle: function updateHandle() { - this.setLatLng(this._handled.getCorner(this._corner)); - } -}); - -L.scaleHandle = function (overlay, idx, options) { - return new L.ScaleHandle(overlay, idx, options); -}; - -/***/ }), - -/***/ "./src/edit/toolbars/DistortableImage.ControlBar.js": -/*!**********************************************************!*\ - !*** ./src/edit/toolbars/DistortableImage.ControlBar.js ***! - \**********************************************************/ -/***/ (function() { - -L.distortableImage = L.DistortableImage || {}; -L.distortableImage = L.DistortableImage; -L.DistortableImage.group_action_map = {}; -L.DistortableImage.ControlBar = L.Toolbar2.Control.extend({}); - -L.distortableImage.controlBar = function (options) { - return new L.DistortableImage.ControlBar(options); -}; -/** addInitHooks run before onAdd */ - - -L.DistortableCollection.addInitHook(function () { - /** Default actions */ - this.ACTIONS = [L.ExportAction, L.DeleteAction, L.LockAction, L.UnlockAction]; // all possible modes - - L.DistortableCollection.Edit.MODES = { - lock: L.LockAction, - unlock: L.UnlockAction - }; - var a = this.options.actions ? this.options.actions : this.ACTIONS; - this.editing = L.distortableCollection.edit(this, { - actions: a - }); -}); - -/***/ }), - -/***/ "./src/edit/toolbars/DistortableImage.PopupBar.js": -/*!********************************************************!*\ - !*** ./src/edit/toolbars/DistortableImage.PopupBar.js ***! - \********************************************************/ -/***/ (function() { - -L.DistortableImage = L.DistortableImage || {}; -L.distortableImage = L.DistortableImage; -L.DistortableImage.action_map = {}; -L.DistortableImage.PopupBar = L.Toolbar2.Popup.extend({ - options: { - anchor: [0, -10] - }, - initialize: function initialize(latlng, options) { - L.setOptions(this, options); - L.Toolbar2.Popup.prototype.initialize.call(this, latlng, options); - }, - addHooks: function addHooks(map, ov) { - this.map = map; - this.ov = ov; - }, - tools: function tools() { - if (this._ul) { - return this._ul.children; - } - }, - clickTool: function clickTool(name) { - var tools = this.tools(); - - for (var i = 0; i < tools.length; i++) { - var tool = tools.item(i).children[0]; - - if (L.DomUtil.hasClass(tool, name)) { - tool.click(); - return tool; - } - } - - return false; - } -}); - -L.distortableImage.popupBar = function (latlng, options) { - return new L.DistortableImage.PopupBar(latlng, options); -}; - -L.DistortableImageOverlay.addInitHook(function () { - /** Default actions */ - this.ACTIONS = [L.DragAction, L.ScaleAction, L.DistortAction, L.RotateAction, L.FreeRotateAction, L.LockAction, L.OpacityAction, L.BorderAction, L.ExportAction, L.DeleteAction]; // all possible modes - - L.DistortableImage.Edit.MODES = { - drag: L.DragAction, - scale: L.ScaleAction, - distort: L.DistortAction, - rotate: L.RotateAction, - freeRotate: L.FreeRotateAction, - lock: L.LockAction - }; - var a = this.options.actions ? this.options.actions : this.ACTIONS; - this.editing = L.distortableImage.edit(this, { - actions: a - }); -}); - -/***/ }), - -/***/ "./src/iconsets/IconSet.js": -/*!*********************************!*\ - !*** ./src/iconsets/IconSet.js ***! - \*********************************/ -/***/ (function() { - -/* this is the baseclass other IconSets inherit from, -* we don't use it directly */ -L.IconSet = L.Class.extend({ - _svg: '', - _symbols: '', - render: function render() { - this.addSymbols(this._symbols); - return this._svg; - }, - addSymbols: function addSymbols(symbols) { - this._svg += symbols; - } -}); - -/***/ }), - -/***/ "./src/iconsets/KeymapperIconSet.js": -/*!******************************************!*\ - !*** ./src/iconsets/KeymapperIconSet.js ***! - \******************************************/ -/***/ (function() { - -L.KeymapperIconSet = L.IconSet.extend({ - _symbols: // eslint-disable-next-line max-len - '' -}); - -/***/ }), - -/***/ "./src/iconsets/ToolbarIconSet.js": -/*!****************************************!*\ - !*** ./src/iconsets/ToolbarIconSet.js ***! - \****************************************/ -/***/ (function() { - -/* eslint-disable max-len */ -L.ToolbarIconSet = L.IconSet.extend({ - _symbols: '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' -}); - -/***/ }), - -/***/ "./src/mapmixins/BoxCollector.js": -/*!***************************************!*\ - !*** ./src/mapmixins/BoxCollector.js ***! - \***************************************/ -/***/ (function() { - -L.Map.mergeOptions({ - boxCollector: true, - boxZoom: false -}); -/** - * primarily Leaflet 1.5.1 source code. Overriden so that it's a collection box used with - * our `L.DistortableCollection` class instead of a zoom box. - * */ - -L.Map.BoxCollector = L.Map.BoxZoom.extend({ - initialize: function initialize(map) { - this._map = map; - this._container = map._container; - this._pane = map._panes.overlayPane; - this._resetStateTimeout = 0; - map.on('unload', this._destroy, this); - }, - addHooks: function addHooks() { - L.DomEvent.on(this._container, 'mousedown', this._onMouseDown, this); - }, - removeHooks: function removeHooks() { - L.DomEvent.off(this._container, 'mousedown', this._onMouseDown, this); - }, - moved: function moved() { - return this._moved; - }, - _destroy: function _destroy() { - L.DomUtil.remove(this._pane); - delete this._pane; - }, - _resetState: function _resetState() { - this._resetStateTimeout = 0; - this._moved = false; - }, - _clearDeferredResetState: function _clearDeferredResetState() { - if (this._resetStateTimeout !== 0) { - clearTimeout(this._resetStateTimeout); - this._resetStateTimeout = 0; - } - }, - _onMouseDown: function _onMouseDown(e) { - if (!e.shiftKey || e.which !== 1 && e.button !== 1) { - return false; - } // Clear the deferred resetState if it hasn't executed yet, otherwise it - // will interrupt the interaction and orphan a box element in the container. - - - this._clearDeferredResetState(); - - this._resetState(); - - L.DomUtil.disableTextSelection(); - L.DomUtil.disableImageDrag(); - this._startPoint = this._map.mouseEventToContainerPoint(e); - L.DomEvent.on(document, { - contextmenu: L.DomEvent.stop, - mousemove: this._onMouseMove, - mouseup: this._onMouseUp - }, this); - }, - _onMouseMove: function _onMouseMove(e) { - if (!this._moved) { - this._moved = true; - this._box = L.DomUtil.create('div', 'leaflet-zoom-box', this._container); - L.DomUtil.addClass(this._container, 'leaflet-crosshair'); - - this._map.fire('boxzoomstart'); - } - - this._point = this._map.mouseEventToContainerPoint(e); - this._bounds = L.bounds(this._startPoint, this._point); - - var size = this._bounds.getSize(); - - L.DomUtil.setPosition(this._box, this._bounds.min); - this._box.style.width = size.x + 'px'; - this._box.style.height = size.y + 'px'; - }, - _finish: function _finish() { - if (this._moved) { - L.DomUtil.remove(this._box); - L.DomUtil.removeClass(this._container, 'leaflet-crosshair'); - } - - L.DomUtil.enableTextSelection(); - L.DomUtil.enableImageDrag(); - L.DomEvent.off(document, { - contextmenu: L.DomEvent.stop, - mousemove: this._onMouseMove, - mouseup: this._onMouseUp - }, this); - }, - _onMouseUp: function _onMouseUp(e) { - if (e.which !== 1 && e.button !== 1) { - return; - } - - this._finish(); - - if (!this._moved) { - return; - } // Postpone to next JS tick so internal click event handling - // still see it as "moved". - - - this._clearDeferredResetState(); - - this._resetStateTimeout = setTimeout(L.Util.bind(this._resetState, this), 0); - var bounds = L.latLngBounds(this._map.containerPointToLatLng(this._bounds.getBottomLeft()), this._map.containerPointToLatLng(this._bounds.getTopRight())); - - var zoom = this._map.getZoom(); - - var center = this._map.getCenter(); // calls the `project` method but 1st updates the pixel origin - see https://github.com/publiclab/Leaflet.DistortableImage/pull/344 - - - bounds = this._map._latLngBoundsToNewLayerBounds(bounds, zoom, center); - - this._map.fire('boxcollectend', { - boxCollectBounds: bounds - }); - } -}); -L.Map.addInitHook('addHandler', 'boxCollector', L.Map.BoxCollector); - -/***/ }), - -/***/ "./src/mapmixins/DoubleClickLabels.js": -/*!********************************************!*\ - !*** ./src/mapmixins/DoubleClickLabels.js ***! - \********************************************/ -/***/ (function() { - -L.Map.mergeOptions({ - doubleClickLabels: true -}); -/** - * The `doubleClickLabels` handler replaces `doubleClickZoom` by default if `#addGoogleMutant` - * is used unless the options 'labels: false' or 'doubleClickZoom: false` were passed to it. - */ - -L.Map.DoubleClickLabels = L.Map.DoubleClickZoom.extend({ - enable: function enable() { - var map = this._map; - - if (this._enabled) { - return this; - } // disable 'doubleClickZoom' if 'doubleClickLabels' is enabled. - - - if (map.doubleClickZoom.enabled()) { - map.doubleClickZoom.disable(); - } - - this._map.fire('singleclickon'); - - this._enabled = true; - this.addHooks(); - return this; - }, - disable: function disable() { - if (!this._enabled) { - return this; - } - - this._enabled = false; - this.removeHooks(); - return this; - }, - _fireIfSingle: function _fireIfSingle(e) { - var map = this._map; - var oe = e.originalEvent; // prevents deselection in case of box selector - - if (oe && oe.shiftKey) { - return; - } - - map._clicked += 1; - this._map._clickTimeout = setTimeout(function () { - if (map._clicked === 1) { - map._clicked = 0; - map.fire('singleclick', { - type: 'singleclick' - }); - } else { - // manually fire doubleclick event only for touch screens that don't natively fire it - if (L.Browser.touch && oe && oe.sourceCapabilities.firesTouchEvents) { - map.fire('dblclick'); - } - } - }, 250); - }, - _onDoubleClick: function _onDoubleClick() { - var map = this._map; - var labels = map._labels; - setTimeout(function () { - map._clicked = 0; - clearTimeout(map._clickTimeout); - }, 0); - - if (!labels) { - return; - } - - if (labels.options.opacity === 1) { - labels.options.opacity = 0; - labels.setOpacity(0); - } else { - labels.options.opacity = 1; - labels.setOpacity(1); - } - } -}); -L.Map.addInitHook('addHandler', 'doubleClickLabels', L.Map.DoubleClickLabels); - -/***/ }), - -/***/ "./src/mapmixins/DoubleClickZoom.js": -/*!******************************************!*\ - !*** ./src/mapmixins/DoubleClickZoom.js ***! - \******************************************/ -/***/ (function() { - -/** - * `L.Map.DoubleClickZoom` from leaflet 1.5.1, overrwritten so that it - * 1) Fires a `singleclick` event to avoid deselecting images on `dblclick`. - * 2) Maintains a mutually exclusive relationship with the map's `DoubleClickLabels` handler - */ -L.Map.DoubleClickZoom.include({ - addHooks: function addHooks() { - this._map.on({ - click: this._fireIfSingle, - dblclick: this._onDoubleClick - }, this); - }, - removeHooks: function removeHooks() { - this._map.off({ - click: this._fireIfSingle, - dblclick: this._onDoubleClick - }, this); - }, - enable: function enable() { - if (this._enabled) { - return this; - } // don't enable 'doubleClickZoom' unless 'doubleClickLabels' is disabled first - - - if (this._map.doubleClickLabels) { - if (this._map.doubleClickLabels.enabled()) { - return this; - } - } // signify to collection/instance classes to turn on 'singleclick' listeners - - - this._map.fire('singleclickon'); - - this._enabled = true; - this.addHooks(); - return this; - }, - disable: function disable() { - if (!this._enabled) { - return this; - } // signify to collection/instance safe to swap 'singleclick' listeners with 'click' listeners. - - - this._map.fire('singleclickoff'); - - this._enabled = false; - this.removeHooks(); - return this; - }, - _fireIfSingle: function _fireIfSingle(e) { - var map = this._map; - var oe = e.originalEvent; // prevents deselection in case of box selector - - if (oe && oe.shiftKey) { - return; - } - - map._clicked += 1; - this._map._clickTimeout = setTimeout(function () { - if (map._clicked === 1) { - map._clicked = 0; - map.fire('singleclick', { - type: 'singleclick' - }); - } else { - // manually fire doubleclick event only for touch screens that don't natively fire it - if (L.Browser.touch && oe && oe.sourceCapabilities.firesTouchEvents) { - /* in `DoubleClickLabels.js`, we just do map.fire('dblclick') bc `_onDoublClick` doesn't use the - passed "e" (for now). To generate a 'real' DOM event that will have all of its corresponding core - properties (originalEvent, latlng, etc.), use Leaflet's `#map._fireDOMEvent` (Leaflet 1.5.1 source) */ - map._fireDOMEvent(oe, 'dblclick', [map]); - } - } - }, 250); - }, - _onDoubleClick: function _onDoubleClick(e) { - var map = this._map; - var oe = e.originalEvent; - setTimeout(function () { - map._clicked = 0; - clearTimeout(map._clickTimeout); - }, 0); - - if (!oe) { - return false; - } - - var oldZoom = map.getZoom(); - var delta = map.options.zoomDelta; - var zoom = oe.shiftKey ? oldZoom - delta : oldZoom + delta; - - if (map.options.doubleClickZoom === 'center') { - map.setZoom(zoom); - } else { - map.setZoomAround(e.containerPoint, zoom); - } - } -}); - -/***/ }), - -/***/ "./src/mapmixins/MapMixins.js": -/*!************************************!*\ - !*** ./src/mapmixins/MapMixins.js ***! - \************************************/ -/***/ (function() { - -/* eslint-disable max-len */ -L.Map.include({ - _clicked: 0, - addGoogleMutant: function addGoogleMutant(opts) { - var url = 'http://mt0.google.com/vt/lyrs=s&x={x}&y={y}&z={z}'; - opts = this.mutantOptions = L.extend({ - mutantOpacity: 0.8, - maxZoom: 24, - maxNativeZoom: 20, - minZoom: 0, - labels: true, - labelOpacity: 1, - doubleClickLabels: true - }, opts); - - if (!opts.labels) { - this.mutantOptions = L.extend(this.mutantOptions, { - labelOpacity: opts.labels ? 1 : undefined, - doubleClickLabels: opts.labels ? true : undefined - }); - } - - this._googleMutant = L.tileLayer(url, { - maxZoom: opts.maxZoom, - maxNativeZoom: opts.maxNativeZoom, - minZoom: opts.minZoom, - opacity: opts.mutantOpacity - }).addTo(this); - - if (opts.labels) { - this._addLabels(opts); - } // shouldn't have this handler at all if there are no labels to toggle - else { - this.doubleClickLabels = undefined; - } - - return this; - }, - _addLabels: function _addLabels(opts) { - var url = 'https://stamen-tiles-{s}.a.ssl.fastly.net/toner-labels/{z}/{x}/{y}{r}.{ext}'; - - if (opts.labelOpacity !== 0 && opts.labelOpacity !== 1) { - opts.labelOpacity = 1; - } - - this._labels = L.tileLayer(url, { - attribution: 'Map tiles by Stamen Design, CC BY 3.0 — Map data © OpenStreetMap contributors', - subdomains: 'abcd', - interactive: false, - opacity: opts.labelOpacity, - maxZoom: opts.maxZoom, - maxNativeZoom: opts.maxNativeZoom, - minZoom: opts.minZoom, - ext: 'png' - }).addTo(this); - - if (this.mutantOptions.doubleClickLabels) { - this.doubleClickLabels.enable(); - } - - return this; - } -}); // start off with doubleClickZoom enabled, doubleClickLabels can later be enabled instead -// during initialization - -L.Map.addInitHook(function () { - this.doubleClickLabels.disable(); - this.doubleClickZoom.enable(); -}); - -/***/ }), - -/***/ "./src/util/DomUtil.js": -/*!*****************************!*\ - !*** ./src/util/DomUtil.js ***! - \*****************************/ -/***/ (function() { - -L.DomUtil = L.extend(L.DomUtil, { - initTranslation: function initTranslation(obj) { - this.translation = obj; - }, - getMatrixString: function getMatrixString(m) { - var is3d = L.Browser.webkit3d || L.Browser.gecko3d || L.Browser.ie3d; - /* - * Since matrix3d takes a 4*4 matrix, we add in an empty row and column, - * which act as the identity on the z-axis. - * See: - * http://franklinta.com/2014/09/08/computing-css-matrix3d-transforms/ - * https://developer.mozilla.org/en-US/docs/Web/CSS/transform-function#M.C3.B6bius'_homogeneous_coordinates_in_projective_geometry - */ - - var matrix = [m[0], m[3], 0, m[6], m[1], m[4], 0, m[7], 0, 0, 1, 0, m[2], m[5], 0, m[8]]; - var str = is3d ? 'matrix3d(' + matrix.join(',') + ')' : ''; - - if (!is3d) { - console.log('Your browser must support 3D CSS transforms' + 'in order to use DistortableImageOverlay.'); - } - - return str; - }, - toggleClass: function toggleClass(el, className) { - var c = className; - return this.hasClass(el, c) ? this.removeClass(el, c) : this.addClass(el, c); - }, - confirmDelete: function confirmDelete() { - return window.confirm(this.translation.confirmImageDelete); - }, - confirmDeletes: function confirmDeletes(n) { - if (n === 1) { - return this.confirmDelete(); - } - - var translation = this.translation.confirmImagesDeletes; - var warningMsg = ''; - - if (typeof translation === 'function') { - warningMsg = translation(n); - } else { - warningMsg = translation; - } - - return window.confirm(warningMsg); - } -}); - -/***/ }), - -/***/ "./src/util/IconUtil.js": -/*!******************************!*\ - !*** ./src/util/IconUtil.js ***! - \******************************/ -/***/ (function() { - -L.IconUtil = { - /* creates an svg elemenet with built in accessibility properties - * and standardized classes for styling, takes in the fragment - * identifier (id) of the symbol to reference. note for symplicity - * we allow providing the icon target with or without the '#' prefix - */ - create: function create(ref) { - if (/^#/.test(ref)) { - ref = ref.replace(/^#/, ''); - } - - return '' + '' + ''; - }, - addClassToSvg: function addClassToSvg(container, loader) { - var svg = container.querySelector('svg'); - - if (svg) { - L.DomUtil.addClass(svg, loader); - } - }, - // finds the use element and toggles its icon reference - toggleXlink: function toggleXlink(container, ref1, ref2) { - if (!/^#/.test(ref1)) { - ref1 = '#' + ref1; - } - - if (!/^#/.test(ref2)) { - ref2 = '#' + ref2; - } - - var use = container.querySelector('use'); - - if (use) { - var toggled = use.getAttribute('xlink:href') === ref1 ? ref2 : ref1; - use.setAttribute('xlink:href', toggled); - return toggled; - } - - return false; - }, - toggleTitle: function toggleTitle(container, title1, title2) { - var toggled = container.getAttribute('title') === title1 ? title2 : title1; - container.setAttribute('title', toggled); - - if (container.hasAttribute('aria-label')) { - container.setAttribute('aria-label', toggled); - } - - return toggled; - } -}; - -/***/ }), - -/***/ "./src/util/ImageUtil.js": -/*!*******************************!*\ - !*** ./src/util/ImageUtil.js ***! - \*******************************/ -/***/ (function() { - -L.ImageUtil = { - getCmPerPixel: function getCmPerPixel(overlay) { - var map = overlay._map; - var dist = map.latLngToLayerPoint(overlay.getCorner(0)).distanceTo(map.latLngToLayerPoint(overlay.getCorner(1))); - return dist * 100 / overlay.getElement().width; - } -}; - -/***/ }), - -/***/ "./src/util/MatrixUtil.js": -/*!********************************!*\ - !*** ./src/util/MatrixUtil.js ***! - \********************************/ -/***/ (function() { - -L.MatrixUtil = { - // Compute the adjugate of m - adj: function adj(m) { - return [m[4] * m[8] - m[5] * m[7], m[2] * m[7] - m[1] * m[8], m[1] * m[5] - m[2] * m[4], m[5] * m[6] - m[3] * m[8], m[0] * m[8] - m[2] * m[6], m[2] * m[3] - m[0] * m[5], m[3] * m[7] - m[4] * m[6], m[1] * m[6] - m[0] * m[7], m[0] * m[4] - m[1] * m[3]]; - }, - // multiply two 3*3 matrices - multmm: function multmm(a, b) { - var c = []; - var i; - - for (i = 0; i < 3; i++) { - for (var j = 0; j < 3; j++) { - var cij = 0; - - for (var k = 0; k < 3; k++) { - cij += a[3 * i + k] * b[3 * k + j]; - } - - c[3 * i + j] = cij; - } - } - - return c; - }, - // multiply a 3*3 matrix and a 3-vector - multmv: function multmv(m, v) { - return [m[0] * v[0] + m[1] * v[1] + m[2] * v[2], m[3] * v[0] + m[4] * v[1] + m[5] * v[2], m[6] * v[0] + m[7] * v[1] + m[8] * v[2]]; - }, - // multiply a scalar and a 3*3 matrix - multsm: function multsm(s, m) { - var matrix = []; - - for (var i = 0, l = m.length; i < l; i++) { - matrix.push(s * m[i]); - } - - return matrix; - }, - basisToPoints: function basisToPoints(x1, y1, x2, y2, x3, y3, x4, y4) { - var m = [x1, x2, x3, y1, y2, y3, 1, 1, 1]; - var v = L.MatrixUtil.multmv(L.MatrixUtil.adj(m), [x4, y4, 1]); - return L.MatrixUtil.multmm(m, [v[0], 0, 0, 0, v[1], 0, 0, 0, v[2]]); - }, - project: function project(m, x, y) { - var v = L.MatrixUtil.multmv(m, [x, y, 1]); - return [v[0] / v[2], v[1] / v[2]]; - }, - general2DProjection: function general2DProjection(x1s, y1s, x1d, y1d, x2s, y2s, x2d, y2d, x3s, y3s, x3d, y3d, x4s, y4s, x4d, y4d) { - var s = L.MatrixUtil.basisToPoints(x1s, y1s, x2s, y2s, x3s, y3s, x4s, y4s); - var d = L.MatrixUtil.basisToPoints(x1d, y1d, x2d, y2d, x3d, y3d, x4d, y4d); - var m = L.MatrixUtil.multmm(d, L.MatrixUtil.adj(s)); // Normalize to the unique matrix with m[8] == 1. - // See: http://franklinta.com/2014/09/08/computing-css-matrix3d-transforms/ - - return L.MatrixUtil.multsm(1 / m[8], m); - } -}; - -/***/ }), - -/***/ "./src/util/TrigUtil.js": -/*!******************************!*\ - !*** ./src/util/TrigUtil.js ***! - \******************************/ -/***/ (function() { - -L.TrigUtil = { - calcAngle: function calcAngle(x, y) { - var unit = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'deg'; - return unit === 'deg' ? this.radiansToDegrees(Math.atan2(y, x)) : Math.atan2(y, x); - }, - radiansToDegrees: function radiansToDegrees(angle) { - return angle * 180 / Math.PI; - }, - degreesToRadians: function degreesToRadians(angle) { - return angle * Math.PI / 180; - } -}; - -/***/ }), - -/***/ "./src/util/Utils.js": -/*!***************************!*\ - !*** ./src/util/Utils.js ***! - \***************************/ -/***/ (function() { - -L.Utils = { - initTranslation: function initTranslation() { - var translation = { - deleteImage: 'Delete Image', - deleteImages: 'Delete Images', - distortImage: 'Distort Image', - dragImage: 'Drag Image', - exportImage: 'Export Image', - exportImages: 'Export Images', - removeBorder: 'Remove Border', - addBorder: 'Add Border', - freeRotateImage: 'Free rotate Image', - geolocateImage: 'Geolocate Image', - lockMode: 'Lock Mode', - lockImages: 'Lock Images', - makeImageOpaque: 'Make Image Opaque', - makeImageTransparent: 'Make Image Transparent', - restoreImage: 'Restore Natural Image', - rotateImage: 'Rotate Image', - scaleImage: 'Scale Image', - stackToFront: 'Stack to Front', - stackToBack: 'Stack to Back', - unlockImages: 'Unlock Images', - confirmImageDelete: 'Are you sure? This image will be permanently deleted from the map.', - confirmImagesDeletes: 'Are you sure? These images will be permanently deleted from the map.' - }; - - if (!this.options.translation) { - this.options.translation = translation; - } else { - // If the translation for a word is not specified, fallback to English. - for (var key in translation) { - if (!this.options.translation.hasOwnProperty(key)) { - this.options.translation[key] = translation[key]; - } - } - } - - L.DomUtil.initTranslation(this.options.translation); - }, - getNestedVal: function getNestedVal(obj, key, nestedKey) { - var dig = [key, nestedKey]; - return dig.reduce(function (obj, k) { - return obj && obj[k]; - }, obj); - } -}; - -/***/ }), - -/***/ "./node_modules/events/events.js": -/*!***************************************!*\ - !*** ./node_modules/events/events.js ***! - \***************************************/ -/***/ (function(module) { - -"use strict"; -// Copyright Joyent, Inc. and other Node contributors. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to permit -// persons to whom the Software is furnished to do so, subject to the -// following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -// USE OR OTHER DEALINGS IN THE SOFTWARE. - - - -var R = typeof Reflect === 'object' ? Reflect : null -var ReflectApply = R && typeof R.apply === 'function' - ? R.apply - : function ReflectApply(target, receiver, args) { - return Function.prototype.apply.call(target, receiver, args); - } - -var ReflectOwnKeys -if (R && typeof R.ownKeys === 'function') { - ReflectOwnKeys = R.ownKeys -} else if (Object.getOwnPropertySymbols) { - ReflectOwnKeys = function ReflectOwnKeys(target) { - return Object.getOwnPropertyNames(target) - .concat(Object.getOwnPropertySymbols(target)); - }; -} else { - ReflectOwnKeys = function ReflectOwnKeys(target) { - return Object.getOwnPropertyNames(target); - }; -} - -function ProcessEmitWarning(warning) { - if (console && console.warn) console.warn(warning); -} - -var NumberIsNaN = Number.isNaN || function NumberIsNaN(value) { - return value !== value; -} - -function EventEmitter() { - EventEmitter.init.call(this); -} -module.exports = EventEmitter; -module.exports.once = once; - -// Backwards-compat with node 0.10.x -EventEmitter.EventEmitter = EventEmitter; - -EventEmitter.prototype._events = undefined; -EventEmitter.prototype._eventsCount = 0; -EventEmitter.prototype._maxListeners = undefined; - -// By default EventEmitters will print a warning if more than 10 listeners are -// added to it. This is a useful default which helps finding memory leaks. -var defaultMaxListeners = 10; - -function checkListener(listener) { - if (typeof listener !== 'function') { - throw new TypeError('The "listener" argument must be of type Function. Received type ' + typeof listener); - } -} - -Object.defineProperty(EventEmitter, 'defaultMaxListeners', { - enumerable: true, - get: function() { - return defaultMaxListeners; - }, - set: function(arg) { - if (typeof arg !== 'number' || arg < 0 || NumberIsNaN(arg)) { - throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received ' + arg + '.'); - } - defaultMaxListeners = arg; - } -}); - -EventEmitter.init = function() { - - if (this._events === undefined || - this._events === Object.getPrototypeOf(this)._events) { - this._events = Object.create(null); - this._eventsCount = 0; - } - - this._maxListeners = this._maxListeners || undefined; -}; - -// Obviously not all Emitters should be limited to 10. This function allows -// that to be increased. Set to zero for unlimited. -EventEmitter.prototype.setMaxListeners = function setMaxListeners(n) { - if (typeof n !== 'number' || n < 0 || NumberIsNaN(n)) { - throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received ' + n + '.'); - } - this._maxListeners = n; - return this; -}; - -function _getMaxListeners(that) { - if (that._maxListeners === undefined) - return EventEmitter.defaultMaxListeners; - return that._maxListeners; -} - -EventEmitter.prototype.getMaxListeners = function getMaxListeners() { - return _getMaxListeners(this); -}; - -EventEmitter.prototype.emit = function emit(type) { - var args = []; - for (var i = 1; i < arguments.length; i++) args.push(arguments[i]); - var doError = (type === 'error'); - - var events = this._events; - if (events !== undefined) - doError = (doError && events.error === undefined); - else if (!doError) - return false; - - // If there is no 'error' event listener then throw. - if (doError) { - var er; - if (args.length > 0) - er = args[0]; - if (er instanceof Error) { - // Note: The comments on the `throw` lines are intentional, they show - // up in Node's output if this results in an unhandled exception. - throw er; // Unhandled 'error' event - } - // At least give some kind of context to the user - var err = new Error('Unhandled error.' + (er ? ' (' + er.message + ')' : '')); - err.context = er; - throw err; // Unhandled 'error' event - } - - var handler = events[type]; - - if (handler === undefined) - return false; - - if (typeof handler === 'function') { - ReflectApply(handler, this, args); - } else { - var len = handler.length; - var listeners = arrayClone(handler, len); - for (var i = 0; i < len; ++i) - ReflectApply(listeners[i], this, args); - } - - return true; -}; - -function _addListener(target, type, listener, prepend) { - var m; - var events; - var existing; - - checkListener(listener); - - events = target._events; - if (events === undefined) { - events = target._events = Object.create(null); - target._eventsCount = 0; - } else { - // To avoid recursion in the case that type === "newListener"! Before - // adding it to the listeners, first emit "newListener". - if (events.newListener !== undefined) { - target.emit('newListener', type, - listener.listener ? listener.listener : listener); - - // Re-assign `events` because a newListener handler could have caused the - // this._events to be assigned to a new object - events = target._events; - } - existing = events[type]; - } - - if (existing === undefined) { - // Optimize the case of one listener. Don't need the extra array object. - existing = events[type] = listener; - ++target._eventsCount; - } else { - if (typeof existing === 'function') { - // Adding the second element, need to change to array. - existing = events[type] = - prepend ? [listener, existing] : [existing, listener]; - // If we've already got an array, just append. - } else if (prepend) { - existing.unshift(listener); - } else { - existing.push(listener); - } - - // Check for listener leak - m = _getMaxListeners(target); - if (m > 0 && existing.length > m && !existing.warned) { - existing.warned = true; - // No error code for this since it is a Warning - // eslint-disable-next-line no-restricted-syntax - var w = new Error('Possible EventEmitter memory leak detected. ' + - existing.length + ' ' + String(type) + ' listeners ' + - 'added. Use emitter.setMaxListeners() to ' + - 'increase limit'); - w.name = 'MaxListenersExceededWarning'; - w.emitter = target; - w.type = type; - w.count = existing.length; - ProcessEmitWarning(w); - } - } - - return target; -} - -EventEmitter.prototype.addListener = function addListener(type, listener) { - return _addListener(this, type, listener, false); -}; - -EventEmitter.prototype.on = EventEmitter.prototype.addListener; - -EventEmitter.prototype.prependListener = - function prependListener(type, listener) { - return _addListener(this, type, listener, true); - }; - -function onceWrapper() { - if (!this.fired) { - this.target.removeListener(this.type, this.wrapFn); - this.fired = true; - if (arguments.length === 0) - return this.listener.call(this.target); - return this.listener.apply(this.target, arguments); - } -} - -function _onceWrap(target, type, listener) { - var state = { fired: false, wrapFn: undefined, target: target, type: type, listener: listener }; - var wrapped = onceWrapper.bind(state); - wrapped.listener = listener; - state.wrapFn = wrapped; - return wrapped; -} - -EventEmitter.prototype.once = function once(type, listener) { - checkListener(listener); - this.on(type, _onceWrap(this, type, listener)); - return this; -}; - -EventEmitter.prototype.prependOnceListener = - function prependOnceListener(type, listener) { - checkListener(listener); - this.prependListener(type, _onceWrap(this, type, listener)); - return this; - }; - -// Emits a 'removeListener' event if and only if the listener was removed. -EventEmitter.prototype.removeListener = - function removeListener(type, listener) { - var list, events, position, i, originalListener; - - checkListener(listener); - - events = this._events; - if (events === undefined) - return this; - - list = events[type]; - if (list === undefined) - return this; - - if (list === listener || list.listener === listener) { - if (--this._eventsCount === 0) - this._events = Object.create(null); - else { - delete events[type]; - if (events.removeListener) - this.emit('removeListener', type, list.listener || listener); - } - } else if (typeof list !== 'function') { - position = -1; - - for (i = list.length - 1; i >= 0; i--) { - if (list[i] === listener || list[i].listener === listener) { - originalListener = list[i].listener; - position = i; - break; - } - } - - if (position < 0) - return this; - - if (position === 0) - list.shift(); - else { - spliceOne(list, position); - } - - if (list.length === 1) - events[type] = list[0]; - - if (events.removeListener !== undefined) - this.emit('removeListener', type, originalListener || listener); - } - - return this; - }; - -EventEmitter.prototype.off = EventEmitter.prototype.removeListener; - -EventEmitter.prototype.removeAllListeners = - function removeAllListeners(type) { - var listeners, events, i; - - events = this._events; - if (events === undefined) - return this; - - // not listening for removeListener, no need to emit - if (events.removeListener === undefined) { - if (arguments.length === 0) { - this._events = Object.create(null); - this._eventsCount = 0; - } else if (events[type] !== undefined) { - if (--this._eventsCount === 0) - this._events = Object.create(null); - else - delete events[type]; - } - return this; - } - - // emit removeListener for all listeners on all events - if (arguments.length === 0) { - var keys = Object.keys(events); - var key; - for (i = 0; i < keys.length; ++i) { - key = keys[i]; - if (key === 'removeListener') continue; - this.removeAllListeners(key); - } - this.removeAllListeners('removeListener'); - this._events = Object.create(null); - this._eventsCount = 0; - return this; - } - - listeners = events[type]; - - if (typeof listeners === 'function') { - this.removeListener(type, listeners); - } else if (listeners !== undefined) { - // LIFO order - for (i = listeners.length - 1; i >= 0; i--) { - this.removeListener(type, listeners[i]); - } - } - - return this; - }; - -function _listeners(target, type, unwrap) { - var events = target._events; - - if (events === undefined) - return []; - - var evlistener = events[type]; - if (evlistener === undefined) - return []; - - if (typeof evlistener === 'function') - return unwrap ? [evlistener.listener || evlistener] : [evlistener]; - - return unwrap ? - unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length); -} - -EventEmitter.prototype.listeners = function listeners(type) { - return _listeners(this, type, true); -}; - -EventEmitter.prototype.rawListeners = function rawListeners(type) { - return _listeners(this, type, false); -}; - -EventEmitter.listenerCount = function(emitter, type) { - if (typeof emitter.listenerCount === 'function') { - return emitter.listenerCount(type); - } else { - return listenerCount.call(emitter, type); - } -}; - -EventEmitter.prototype.listenerCount = listenerCount; -function listenerCount(type) { - var events = this._events; - - if (events !== undefined) { - var evlistener = events[type]; - - if (typeof evlistener === 'function') { - return 1; - } else if (evlistener !== undefined) { - return evlistener.length; - } - } - - return 0; -} - -EventEmitter.prototype.eventNames = function eventNames() { - return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : []; -}; - -function arrayClone(arr, n) { - var copy = new Array(n); - for (var i = 0; i < n; ++i) - copy[i] = arr[i]; - return copy; -} - -function spliceOne(list, index) { - for (; index + 1 < list.length; index++) - list[index] = list[index + 1]; - list.pop(); -} - -function unwrapListeners(arr) { - var ret = new Array(arr.length); - for (var i = 0; i < ret.length; ++i) { - ret[i] = arr[i].listener || arr[i]; - } - return ret; -} - -function once(emitter, name) { - return new Promise(function (resolve, reject) { - function errorListener(err) { - emitter.removeListener(name, resolver); - reject(err); - } - - function resolver() { - if (typeof emitter.removeListener === 'function') { - emitter.removeListener('error', errorListener); - } - resolve([].slice.call(arguments)); - }; - - eventTargetAgnosticAddListener(emitter, name, resolver, { once: true }); - if (name !== 'error') { - addErrorHandlerIfEventEmitter(emitter, errorListener, { once: true }); - } - }); -} - -function addErrorHandlerIfEventEmitter(emitter, handler, flags) { - if (typeof emitter.on === 'function') { - eventTargetAgnosticAddListener(emitter, 'error', handler, flags); - } -} - -function eventTargetAgnosticAddListener(emitter, name, listener, flags) { - if (typeof emitter.on === 'function') { - if (flags.once) { - emitter.once(name, listener); - } else { - emitter.on(name, listener); - } - } else if (typeof emitter.addEventListener === 'function') { - // EventTarget does not have `error` event semantics like Node - // EventEmitters, we do not listen for `error` events here. - emitter.addEventListener(name, function wrapListener(arg) { - // IE does not have builtin `{ once: true }` support so we - // have to do it manually. - if (flags.once) { - emitter.removeEventListener(name, wrapListener); - } - listener(arg); - }); - } else { - throw new TypeError('The "emitter" argument must be of type EventEmitter. Received type ' + typeof emitter); - } -} - - -/***/ }), - -/***/ "./node_modules/html-entities/lib/index.js": -/*!*************************************************!*\ - !*** ./node_modules/html-entities/lib/index.js ***! - \*************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - -"use strict"; - -var __assign = (this && this.__assign) || function () { - __assign = Object.assign || function(t) { - for (var s, i = 1, n = arguments.length; i < n; i++) { - s = arguments[i]; - for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) - t[p] = s[p]; - } - return t; - }; - return __assign.apply(this, arguments); -}; -Object.defineProperty(exports, "__esModule", ({ value: true })); -var named_references_1 = __webpack_require__(/*! ./named-references */ "./node_modules/html-entities/lib/named-references.js"); -var numeric_unicode_map_1 = __webpack_require__(/*! ./numeric-unicode-map */ "./node_modules/html-entities/lib/numeric-unicode-map.js"); -var surrogate_pairs_1 = __webpack_require__(/*! ./surrogate-pairs */ "./node_modules/html-entities/lib/surrogate-pairs.js"); -var allNamedReferences = __assign(__assign({}, named_references_1.namedReferences), { all: named_references_1.namedReferences.html5 }); -var encodeRegExps = { - specialChars: /[<>'"&]/g, - nonAscii: /(?:[<>'"&\u0080-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])/g, - nonAsciiPrintable: /(?:[<>'"&\x01-\x08\x11-\x15\x17-\x1F\x7f-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])/g, - extensive: /(?:[\x01-\x0c\x0e-\x1f\x21-\x2c\x2e-\x2f\x3a-\x40\x5b-\x60\x7b-\x7d\x7f-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])/g -}; -var defaultEncodeOptions = { - mode: 'specialChars', - level: 'all', - numeric: 'decimal' -}; -/** Encodes all the necessary (specified by `level`) characters in the text */ -function encode(text, _a) { - var _b = _a === void 0 ? defaultEncodeOptions : _a, _c = _b.mode, mode = _c === void 0 ? 'specialChars' : _c, _d = _b.numeric, numeric = _d === void 0 ? 'decimal' : _d, _e = _b.level, level = _e === void 0 ? 'all' : _e; - if (!text) { - return ''; - } - var encodeRegExp = encodeRegExps[mode]; - var references = allNamedReferences[level].characters; - var isHex = numeric === 'hexadecimal'; - encodeRegExp.lastIndex = 0; - var _b = encodeRegExp.exec(text); - var _c; - if (_b) { - _c = ''; - var _d = 0; - do { - if (_d !== _b.index) { - _c += text.substring(_d, _b.index); - } - var _e = _b[0]; - var result_1 = references[_e]; - if (!result_1) { - var code_1 = _e.length > 1 ? surrogate_pairs_1.getCodePoint(_e, 0) : _e.charCodeAt(0); - result_1 = (isHex ? '&#x' + code_1.toString(16) : '&#' + code_1) + ';'; - } - _c += result_1; - _d = _b.index + _e.length; - } while ((_b = encodeRegExp.exec(text))); - if (_d !== text.length) { - _c += text.substring(_d); - } - } - else { - _c = - text; - } - return _c; -} -exports.encode = encode; -var defaultDecodeOptions = { - scope: 'body', - level: 'all' -}; -var strict = /&(?:#\d+|#[xX][\da-fA-F]+|[0-9a-zA-Z]+);/g; -var attribute = /&(?:#\d+|#[xX][\da-fA-F]+|[0-9a-zA-Z]+)[;=]?/g; -var baseDecodeRegExps = { - xml: { - strict: strict, - attribute: attribute, - body: named_references_1.bodyRegExps.xml - }, - html4: { - strict: strict, - attribute: attribute, - body: named_references_1.bodyRegExps.html4 - }, - html5: { - strict: strict, - attribute: attribute, - body: named_references_1.bodyRegExps.html5 - } -}; -var decodeRegExps = __assign(__assign({}, baseDecodeRegExps), { all: baseDecodeRegExps.html5 }); -var fromCharCode = String.fromCharCode; -var outOfBoundsChar = fromCharCode(65533); -var defaultDecodeEntityOptions = { - level: 'all' -}; -/** Decodes a single entity */ -function decodeEntity(entity, _a) { - var _b = (_a === void 0 ? defaultDecodeEntityOptions : _a).level, level = _b === void 0 ? 'all' : _b; - if (!entity) { - return ''; - } - var _b = entity; - var decodeEntityLastChar_1 = entity[entity.length - 1]; - if (false) {} - else if (false) {} - else { - var decodeResultByReference_1 = allNamedReferences[level].entities[entity]; - if (decodeResultByReference_1) { - _b = decodeResultByReference_1; - } - else if (entity[0] === '&' && entity[1] === '#') { - var decodeSecondChar_1 = entity[2]; - var decodeCode_1 = decodeSecondChar_1 == 'x' || decodeSecondChar_1 == 'X' - ? parseInt(entity.substr(3), 16) - : parseInt(entity.substr(2)); - _b = - decodeCode_1 >= 0x10ffff - ? outOfBoundsChar - : decodeCode_1 > 65535 - ? surrogate_pairs_1.fromCodePoint(decodeCode_1) - : fromCharCode(numeric_unicode_map_1.numericUnicodeMap[decodeCode_1] || decodeCode_1); - } - } - return _b; -} -exports.decodeEntity = decodeEntity; -/** Decodes all entities in the text */ -function decode(text, _a) { - var decodeSecondChar_1 = _a === void 0 ? defaultDecodeOptions : _a, decodeCode_1 = decodeSecondChar_1.level, level = decodeCode_1 === void 0 ? 'all' : decodeCode_1, _b = decodeSecondChar_1.scope, scope = _b === void 0 ? level === 'xml' ? 'strict' : 'body' : _b; - if (!text) { - return ''; - } - var decodeRegExp = decodeRegExps[level][scope]; - var references = allNamedReferences[level].entities; - var isAttribute = scope === 'attribute'; - var isStrict = scope === 'strict'; - decodeRegExp.lastIndex = 0; - var replaceMatch_1 = decodeRegExp.exec(text); - var replaceResult_1; - if (replaceMatch_1) { - replaceResult_1 = ''; - var replaceLastIndex_1 = 0; - do { - if (replaceLastIndex_1 !== replaceMatch_1.index) { - replaceResult_1 += text.substring(replaceLastIndex_1, replaceMatch_1.index); - } - var replaceInput_1 = replaceMatch_1[0]; - var decodeResult_1 = replaceInput_1; - var decodeEntityLastChar_2 = replaceInput_1[replaceInput_1.length - 1]; - if (isAttribute - && decodeEntityLastChar_2 === '=') { - decodeResult_1 = replaceInput_1; - } - else if (isStrict - && decodeEntityLastChar_2 !== ';') { - decodeResult_1 = replaceInput_1; - } - else { - var decodeResultByReference_2 = references[replaceInput_1]; - if (decodeResultByReference_2) { - decodeResult_1 = decodeResultByReference_2; - } - else if (replaceInput_1[0] === '&' && replaceInput_1[1] === '#') { - var decodeSecondChar_2 = replaceInput_1[2]; - var decodeCode_2 = decodeSecondChar_2 == 'x' || decodeSecondChar_2 == 'X' - ? parseInt(replaceInput_1.substr(3), 16) - : parseInt(replaceInput_1.substr(2)); - decodeResult_1 = - decodeCode_2 >= 0x10ffff - ? outOfBoundsChar - : decodeCode_2 > 65535 - ? surrogate_pairs_1.fromCodePoint(decodeCode_2) - : fromCharCode(numeric_unicode_map_1.numericUnicodeMap[decodeCode_2] || decodeCode_2); - } - } - replaceResult_1 += decodeResult_1; - replaceLastIndex_1 = replaceMatch_1.index + replaceInput_1.length; - } while ((replaceMatch_1 = decodeRegExp.exec(text))); - if (replaceLastIndex_1 !== text.length) { - replaceResult_1 += text.substring(replaceLastIndex_1); - } - } - else { - replaceResult_1 = - text; - } - return replaceResult_1; -} -exports.decode = decode; - - -/***/ }), - -/***/ "./node_modules/html-entities/lib/named-references.js": -/*!************************************************************!*\ - !*** ./node_modules/html-entities/lib/named-references.js ***! - \************************************************************/ -/***/ (function(__unused_webpack_module, exports) { - -"use strict"; -Object.defineProperty(exports, "__esModule", ({value:true}));exports.bodyRegExps={xml:/&(?:#\d+|#[xX][\da-fA-F]+|[0-9a-zA-Z]+);?/g,html4:/&(?:nbsp|iexcl|cent|pound|curren|yen|brvbar|sect|uml|copy|ordf|laquo|not|shy|reg|macr|deg|plusmn|sup2|sup3|acute|micro|para|middot|cedil|sup1|ordm|raquo|frac14|frac12|frac34|iquest|Agrave|Aacute|Acirc|Atilde|Auml|Aring|AElig|Ccedil|Egrave|Eacute|Ecirc|Euml|Igrave|Iacute|Icirc|Iuml|ETH|Ntilde|Ograve|Oacute|Ocirc|Otilde|Ouml|times|Oslash|Ugrave|Uacute|Ucirc|Uuml|Yacute|THORN|szlig|agrave|aacute|acirc|atilde|auml|aring|aelig|ccedil|egrave|eacute|ecirc|euml|igrave|iacute|icirc|iuml|eth|ntilde|ograve|oacute|ocirc|otilde|ouml|divide|oslash|ugrave|uacute|ucirc|uuml|yacute|thorn|yuml|quot|amp|lt|gt|#\d+|#[xX][\da-fA-F]+|[0-9a-zA-Z]+);?/g,html5:/&(?:AElig|AMP|Aacute|Acirc|Agrave|Aring|Atilde|Auml|COPY|Ccedil|ETH|Eacute|Ecirc|Egrave|Euml|GT|Iacute|Icirc|Igrave|Iuml|LT|Ntilde|Oacute|Ocirc|Ograve|Oslash|Otilde|Ouml|QUOT|REG|THORN|Uacute|Ucirc|Ugrave|Uuml|Yacute|aacute|acirc|acute|aelig|agrave|amp|aring|atilde|auml|brvbar|ccedil|cedil|cent|copy|curren|deg|divide|eacute|ecirc|egrave|eth|euml|frac12|frac14|frac34|gt|iacute|icirc|iexcl|igrave|iquest|iuml|laquo|lt|macr|micro|middot|nbsp|not|ntilde|oacute|ocirc|ograve|ordf|ordm|oslash|otilde|ouml|para|plusmn|pound|quot|raquo|reg|sect|shy|sup1|sup2|sup3|szlig|thorn|times|uacute|ucirc|ugrave|uml|uuml|yacute|yen|yuml|#\d+|#[xX][\da-fA-F]+|[0-9a-zA-Z]+);?/g};exports.namedReferences={xml:{entities:{"<":"<",">":">",""":'"',"'":"'","&":"&"},characters:{"<":"<",">":">",'"':""","'":"'","&":"&"}},html4:{entities:{"'":"'"," ":" "," ":" ","¡":"¡","¡":"¡","¢":"¢","¢":"¢","£":"£","£":"£","¤":"¤","¤":"¤","¥":"¥","¥":"¥","¦":"¦","¦":"¦","§":"§","§":"§","¨":"¨","¨":"¨","©":"©","©":"©","ª":"ª","ª":"ª","«":"«","«":"«","¬":"¬","¬":"¬","­":"­","­":"­","®":"®","®":"®","¯":"¯","¯":"¯","°":"°","°":"°","±":"±","±":"±","²":"²","²":"²","³":"³","³":"³","´":"´","´":"´","µ":"µ","µ":"µ","¶":"¶","¶":"¶","·":"·","·":"·","¸":"¸","¸":"¸","¹":"¹","¹":"¹","º":"º","º":"º","»":"»","»":"»","¼":"¼","¼":"¼","½":"½","½":"½","¾":"¾","¾":"¾","¿":"¿","¿":"¿","À":"À","À":"À","Á":"Á","Á":"Á","Â":"Â","Â":"Â","Ã":"Ã","Ã":"Ã","Ä":"Ä","Ä":"Ä","Å":"Å","Å":"Å","Æ":"Æ","Æ":"Æ","Ç":"Ç","Ç":"Ç","È":"È","È":"È","É":"É","É":"É","Ê":"Ê","Ê":"Ê","Ë":"Ë","Ë":"Ë","Ì":"Ì","Ì":"Ì","Í":"Í","Í":"Í","Î":"Î","Î":"Î","Ï":"Ï","Ï":"Ï","Ð":"Ð","Ð":"Ð","Ñ":"Ñ","Ñ":"Ñ","Ò":"Ò","Ò":"Ò","Ó":"Ó","Ó":"Ó","Ô":"Ô","Ô":"Ô","Õ":"Õ","Õ":"Õ","Ö":"Ö","Ö":"Ö","×":"×","×":"×","Ø":"Ø","Ø":"Ø","Ù":"Ù","Ù":"Ù","Ú":"Ú","Ú":"Ú","Û":"Û","Û":"Û","Ü":"Ü","Ü":"Ü","Ý":"Ý","Ý":"Ý","Þ":"Þ","Þ":"Þ","ß":"ß","ß":"ß","à":"à","à":"à","á":"á","á":"á","â":"â","â":"â","ã":"ã","ã":"ã","ä":"ä","ä":"ä","å":"å","å":"å","æ":"æ","æ":"æ","ç":"ç","ç":"ç","è":"è","è":"è","é":"é","é":"é","ê":"ê","ê":"ê","ë":"ë","ë":"ë","ì":"ì","ì":"ì","í":"í","í":"í","î":"î","î":"î","ï":"ï","ï":"ï","ð":"ð","ð":"ð","ñ":"ñ","ñ":"ñ","ò":"ò","ò":"ò","ó":"ó","ó":"ó","ô":"ô","ô":"ô","õ":"õ","õ":"õ","ö":"ö","ö":"ö","÷":"÷","÷":"÷","ø":"ø","ø":"ø","ù":"ù","ù":"ù","ú":"ú","ú":"ú","û":"û","û":"û","ü":"ü","ü":"ü","ý":"ý","ý":"ý","þ":"þ","þ":"þ","ÿ":"ÿ","ÿ":"ÿ",""":'"',""":'"',"&":"&","&":"&","<":"<","<":"<",">":">",">":">","Œ":"Œ","œ":"œ","Š":"Š","š":"š","Ÿ":"Ÿ","ˆ":"ˆ","˜":"˜"," ":" "," ":" "," ":" ","‌":"‌","‍":"‍","‎":"‎","‏":"‏","–":"–","—":"—","‘":"‘","’":"’","‚":"‚","“":"“","”":"”","„":"„","†":"†","‡":"‡","‰":"‰","‹":"‹","›":"›","€":"€","ƒ":"ƒ","Α":"Α","Β":"Β","Γ":"Γ","Δ":"Δ","Ε":"Ε","Ζ":"Ζ","Η":"Η","Θ":"Θ","Ι":"Ι","Κ":"Κ","Λ":"Λ","Μ":"Μ","Ν":"Ν","Ξ":"Ξ","Ο":"Ο","Π":"Π","Ρ":"Ρ","Σ":"Σ","Τ":"Τ","Υ":"Υ","Φ":"Φ","Χ":"Χ","Ψ":"Ψ","Ω":"Ω","α":"α","β":"β","γ":"γ","δ":"δ","ε":"ε","ζ":"ζ","η":"η","θ":"θ","ι":"ι","κ":"κ","λ":"λ","μ":"μ","ν":"ν","ξ":"ξ","ο":"ο","π":"π","ρ":"ρ","ς":"ς","σ":"σ","τ":"τ","υ":"υ","φ":"φ","χ":"χ","ψ":"ψ","ω":"ω","ϑ":"ϑ","ϒ":"ϒ","ϖ":"ϖ","•":"•","…":"…","′":"′","″":"″","‾":"‾","⁄":"⁄","℘":"℘","ℑ":"ℑ","ℜ":"ℜ","™":"™","ℵ":"ℵ","←":"←","↑":"↑","→":"→","↓":"↓","↔":"↔","↵":"↵","⇐":"⇐","⇑":"⇑","⇒":"⇒","⇓":"⇓","⇔":"⇔","∀":"∀","∂":"∂","∃":"∃","∅":"∅","∇":"∇","∈":"∈","∉":"∉","∋":"∋","∏":"∏","∑":"∑","−":"−","∗":"∗","√":"√","∝":"∝","∞":"∞","∠":"∠","∧":"∧","∨":"∨","∩":"∩","∪":"∪","∫":"∫","∴":"∴","∼":"∼","≅":"≅","≈":"≈","≠":"≠","≡":"≡","≤":"≤","≥":"≥","⊂":"⊂","⊃":"⊃","⊄":"⊄","⊆":"⊆","⊇":"⊇","⊕":"⊕","⊗":"⊗","⊥":"⊥","⋅":"⋅","⌈":"⌈","⌉":"⌉","⌊":"⌊","⌋":"⌋","⟨":"〈","⟩":"〉","◊":"◊","♠":"♠","♣":"♣","♥":"♥","♦":"♦"},characters:{"'":"'"," ":" ","¡":"¡","¢":"¢","£":"£","¤":"¤","¥":"¥","¦":"¦","§":"§","¨":"¨","©":"©","ª":"ª","«":"«","¬":"¬","­":"­","®":"®","¯":"¯","°":"°","±":"±","²":"²","³":"³","´":"´","µ":"µ","¶":"¶","·":"·","¸":"¸","¹":"¹","º":"º","»":"»","¼":"¼","½":"½","¾":"¾","¿":"¿","À":"À","Á":"Á","Â":"Â","Ã":"Ã","Ä":"Ä","Å":"Å","Æ":"Æ","Ç":"Ç","È":"È","É":"É","Ê":"Ê","Ë":"Ë","Ì":"Ì","Í":"Í","Î":"Î","Ï":"Ï","Ð":"Ð","Ñ":"Ñ","Ò":"Ò","Ó":"Ó","Ô":"Ô","Õ":"Õ","Ö":"Ö","×":"×","Ø":"Ø","Ù":"Ù","Ú":"Ú","Û":"Û","Ü":"Ü","Ý":"Ý","Þ":"Þ","ß":"ß","à":"à","á":"á","â":"â","ã":"ã","ä":"ä","å":"å","æ":"æ","ç":"ç","è":"è","é":"é","ê":"ê","ë":"ë","ì":"ì","í":"í","î":"î","ï":"ï","ð":"ð","ñ":"ñ","ò":"ò","ó":"ó","ô":"ô","õ":"õ","ö":"ö","÷":"÷","ø":"ø","ù":"ù","ú":"ú","û":"û","ü":"ü","ý":"ý","þ":"þ","ÿ":"ÿ",'"':""","&":"&","<":"<",">":">","Œ":"Œ","œ":"œ","Š":"Š","š":"š","Ÿ":"Ÿ","ˆ":"ˆ","˜":"˜"," ":" "," ":" "," ":" ","‌":"‌","‍":"‍","‎":"‎","‏":"‏","–":"–","—":"—","‘":"‘","’":"’","‚":"‚","“":"“","”":"”","„":"„","†":"†","‡":"‡","‰":"‰","‹":"‹","›":"›","€":"€","ƒ":"ƒ","Α":"Α","Β":"Β","Γ":"Γ","Δ":"Δ","Ε":"Ε","Ζ":"Ζ","Η":"Η","Θ":"Θ","Ι":"Ι","Κ":"Κ","Λ":"Λ","Μ":"Μ","Ν":"Ν","Ξ":"Ξ","Ο":"Ο","Π":"Π","Ρ":"Ρ","Σ":"Σ","Τ":"Τ","Υ":"Υ","Φ":"Φ","Χ":"Χ","Ψ":"Ψ","Ω":"Ω","α":"α","β":"β","γ":"γ","δ":"δ","ε":"ε","ζ":"ζ","η":"η","θ":"θ","ι":"ι","κ":"κ","λ":"λ","μ":"μ","ν":"ν","ξ":"ξ","ο":"ο","π":"π","ρ":"ρ","ς":"ς","σ":"σ","τ":"τ","υ":"υ","φ":"φ","χ":"χ","ψ":"ψ","ω":"ω","ϑ":"ϑ","ϒ":"ϒ","ϖ":"ϖ","•":"•","…":"…","′":"′","″":"″","‾":"‾","⁄":"⁄","℘":"℘","ℑ":"ℑ","ℜ":"ℜ","™":"™","ℵ":"ℵ","←":"←","↑":"↑","→":"→","↓":"↓","↔":"↔","↵":"↵","⇐":"⇐","⇑":"⇑","⇒":"⇒","⇓":"⇓","⇔":"⇔","∀":"∀","∂":"∂","∃":"∃","∅":"∅","∇":"∇","∈":"∈","∉":"∉","∋":"∋","∏":"∏","∑":"∑","−":"−","∗":"∗","√":"√","∝":"∝","∞":"∞","∠":"∠","∧":"∧","∨":"∨","∩":"∩","∪":"∪","∫":"∫","∴":"∴","∼":"∼","≅":"≅","≈":"≈","≠":"≠","≡":"≡","≤":"≤","≥":"≥","⊂":"⊂","⊃":"⊃","⊄":"⊄","⊆":"⊆","⊇":"⊇","⊕":"⊕","⊗":"⊗","⊥":"⊥","⋅":"⋅","⌈":"⌈","⌉":"⌉","⌊":"⌊","⌋":"⌋","〈":"⟨","〉":"⟩","◊":"◊","♠":"♠","♣":"♣","♥":"♥","♦":"♦"}},html5:{entities:{"Æ":"Æ","Æ":"Æ","&":"&","&":"&","Á":"Á","Á":"Á","Ă":"Ă","Â":"Â","Â":"Â","А":"А","𝔄":"𝔄","À":"À","À":"À","Α":"Α","Ā":"Ā","⩓":"⩓","Ą":"Ą","𝔸":"𝔸","⁡":"⁡","Å":"Å","Å":"Å","𝒜":"𝒜","≔":"≔","Ã":"Ã","Ã":"Ã","Ä":"Ä","Ä":"Ä","∖":"∖","⫧":"⫧","⌆":"⌆","Б":"Б","∵":"∵","ℬ":"ℬ","Β":"Β","𝔅":"𝔅","𝔹":"𝔹","˘":"˘","ℬ":"ℬ","≎":"≎","Ч":"Ч","©":"©","©":"©","Ć":"Ć","⋒":"⋒","ⅅ":"ⅅ","ℭ":"ℭ","Č":"Č","Ç":"Ç","Ç":"Ç","Ĉ":"Ĉ","∰":"∰","Ċ":"Ċ","¸":"¸","·":"·","ℭ":"ℭ","Χ":"Χ","⊙":"⊙","⊖":"⊖","⊕":"⊕","⊗":"⊗","∲":"∲","”":"”","’":"’","∷":"∷","⩴":"⩴","≡":"≡","∯":"∯","∮":"∮","ℂ":"ℂ","∐":"∐","∳":"∳","⨯":"⨯","𝒞":"𝒞","⋓":"⋓","≍":"≍","ⅅ":"ⅅ","⤑":"⤑","Ђ":"Ђ","Ѕ":"Ѕ","Џ":"Џ","‡":"‡","↡":"↡","⫤":"⫤","Ď":"Ď","Д":"Д","∇":"∇","Δ":"Δ","𝔇":"𝔇","´":"´","˙":"˙","˝":"˝","`":"`","˜":"˜","⋄":"⋄","ⅆ":"ⅆ","𝔻":"𝔻","¨":"¨","⃜":"⃜","≐":"≐","∯":"∯","¨":"¨","⇓":"⇓","⇐":"⇐","⇔":"⇔","⫤":"⫤","⟸":"⟸","⟺":"⟺","⟹":"⟹","⇒":"⇒","⊨":"⊨","⇑":"⇑","⇕":"⇕","∥":"∥","↓":"↓","⤓":"⤓","⇵":"⇵","̑":"̑","⥐":"⥐","⥞":"⥞","↽":"↽","⥖":"⥖","⥟":"⥟","⇁":"⇁","⥗":"⥗","⊤":"⊤","↧":"↧","⇓":"⇓","𝒟":"𝒟","Đ":"Đ","Ŋ":"Ŋ","Ð":"Ð","Ð":"Ð","É":"É","É":"É","Ě":"Ě","Ê":"Ê","Ê":"Ê","Э":"Э","Ė":"Ė","𝔈":"𝔈","È":"È","È":"È","∈":"∈","Ē":"Ē","◻":"◻","▫":"▫","Ę":"Ę","𝔼":"𝔼","Ε":"Ε","⩵":"⩵","≂":"≂","⇌":"⇌","ℰ":"ℰ","⩳":"⩳","Η":"Η","Ë":"Ë","Ë":"Ë","∃":"∃","ⅇ":"ⅇ","Ф":"Ф","𝔉":"𝔉","◼":"◼","▪":"▪","𝔽":"𝔽","∀":"∀","ℱ":"ℱ","ℱ":"ℱ","Ѓ":"Ѓ",">":">",">":">","Γ":"Γ","Ϝ":"Ϝ","Ğ":"Ğ","Ģ":"Ģ","Ĝ":"Ĝ","Г":"Г","Ġ":"Ġ","𝔊":"𝔊","⋙":"⋙","𝔾":"𝔾","≥":"≥","⋛":"⋛","≧":"≧","⪢":"⪢","≷":"≷","⩾":"⩾","≳":"≳","𝒢":"𝒢","≫":"≫","Ъ":"Ъ","ˇ":"ˇ","^":"^","Ĥ":"Ĥ","ℌ":"ℌ","ℋ":"ℋ","ℍ":"ℍ","─":"─","ℋ":"ℋ","Ħ":"Ħ","≎":"≎","≏":"≏","Е":"Е","IJ":"IJ","Ё":"Ё","Í":"Í","Í":"Í","Î":"Î","Î":"Î","И":"И","İ":"İ","ℑ":"ℑ","Ì":"Ì","Ì":"Ì","ℑ":"ℑ","Ī":"Ī","ⅈ":"ⅈ","⇒":"⇒","∬":"∬","∫":"∫","⋂":"⋂","⁣":"⁣","⁢":"⁢","Į":"Į","𝕀":"𝕀","Ι":"Ι","ℐ":"ℐ","Ĩ":"Ĩ","І":"І","Ï":"Ï","Ï":"Ï","Ĵ":"Ĵ","Й":"Й","𝔍":"𝔍","𝕁":"𝕁","𝒥":"𝒥","Ј":"Ј","Є":"Є","Х":"Х","Ќ":"Ќ","Κ":"Κ","Ķ":"Ķ","К":"К","𝔎":"𝔎","𝕂":"𝕂","𝒦":"𝒦","Љ":"Љ","<":"<","<":"<","Ĺ":"Ĺ","Λ":"Λ","⟪":"⟪","ℒ":"ℒ","↞":"↞","Ľ":"Ľ","Ļ":"Ļ","Л":"Л","⟨":"⟨","←":"←","⇤":"⇤","⇆":"⇆","⌈":"⌈","⟦":"⟦","⥡":"⥡","⇃":"⇃","⥙":"⥙","⌊":"⌊","↔":"↔","⥎":"⥎","⊣":"⊣","↤":"↤","⥚":"⥚","⊲":"⊲","⧏":"⧏","⊴":"⊴","⥑":"⥑","⥠":"⥠","↿":"↿","⥘":"⥘","↼":"↼","⥒":"⥒","⇐":"⇐","⇔":"⇔","⋚":"⋚","≦":"≦","≶":"≶","⪡":"⪡","⩽":"⩽","≲":"≲","𝔏":"𝔏","⋘":"⋘","⇚":"⇚","Ŀ":"Ŀ","⟵":"⟵","⟷":"⟷","⟶":"⟶","⟸":"⟸","⟺":"⟺","⟹":"⟹","𝕃":"𝕃","↙":"↙","↘":"↘","ℒ":"ℒ","↰":"↰","Ł":"Ł","≪":"≪","⤅":"⤅","М":"М"," ":" ","ℳ":"ℳ","𝔐":"𝔐","∓":"∓","𝕄":"𝕄","ℳ":"ℳ","Μ":"Μ","Њ":"Њ","Ń":"Ń","Ň":"Ň","Ņ":"Ņ","Н":"Н","​":"​","​":"​","​":"​","​":"​","≫":"≫","≪":"≪"," ":"\n","𝔑":"𝔑","⁠":"⁠"," ":" ","ℕ":"ℕ","⫬":"⫬","≢":"≢","≭":"≭","∦":"∦","∉":"∉","≠":"≠","≂̸":"≂̸","∄":"∄","≯":"≯","≱":"≱","≧̸":"≧̸","≫̸":"≫̸","≹":"≹","⩾̸":"⩾̸","≵":"≵","≎̸":"≎̸","≏̸":"≏̸","⋪":"⋪","⧏̸":"⧏̸","⋬":"⋬","≮":"≮","≰":"≰","≸":"≸","≪̸":"≪̸","⩽̸":"⩽̸","≴":"≴","⪢̸":"⪢̸","⪡̸":"⪡̸","⊀":"⊀","⪯̸":"⪯̸","⋠":"⋠","∌":"∌","⋫":"⋫","⧐̸":"⧐̸","⋭":"⋭","⊏̸":"⊏̸","⋢":"⋢","⊐̸":"⊐̸","⋣":"⋣","⊂⃒":"⊂⃒","⊈":"⊈","⊁":"⊁","⪰̸":"⪰̸","⋡":"⋡","≿̸":"≿̸","⊃⃒":"⊃⃒","⊉":"⊉","≁":"≁","≄":"≄","≇":"≇","≉":"≉","∤":"∤","𝒩":"𝒩","Ñ":"Ñ","Ñ":"Ñ","Ν":"Ν","Œ":"Œ","Ó":"Ó","Ó":"Ó","Ô":"Ô","Ô":"Ô","О":"О","Ő":"Ő","𝔒":"𝔒","Ò":"Ò","Ò":"Ò","Ō":"Ō","Ω":"Ω","Ο":"Ο","𝕆":"𝕆","“":"“","‘":"‘","⩔":"⩔","𝒪":"𝒪","Ø":"Ø","Ø":"Ø","Õ":"Õ","Õ":"Õ","⨷":"⨷","Ö":"Ö","Ö":"Ö","‾":"‾","⏞":"⏞","⎴":"⎴","⏜":"⏜","∂":"∂","П":"П","𝔓":"𝔓","Φ":"Φ","Π":"Π","±":"±","ℌ":"ℌ","ℙ":"ℙ","⪻":"⪻","≺":"≺","⪯":"⪯","≼":"≼","≾":"≾","″":"″","∏":"∏","∷":"∷","∝":"∝","𝒫":"𝒫","Ψ":"Ψ",""":'"',""":'"',"𝔔":"𝔔","ℚ":"ℚ","𝒬":"𝒬","⤐":"⤐","®":"®","®":"®","Ŕ":"Ŕ","⟫":"⟫","↠":"↠","⤖":"⤖","Ř":"Ř","Ŗ":"Ŗ","Р":"Р","ℜ":"ℜ","∋":"∋","⇋":"⇋","⥯":"⥯","ℜ":"ℜ","Ρ":"Ρ","⟩":"⟩","→":"→","⇥":"⇥","⇄":"⇄","⌉":"⌉","⟧":"⟧","⥝":"⥝","⇂":"⇂","⥕":"⥕","⌋":"⌋","⊢":"⊢","↦":"↦","⥛":"⥛","⊳":"⊳","⧐":"⧐","⊵":"⊵","⥏":"⥏","⥜":"⥜","↾":"↾","⥔":"⥔","⇀":"⇀","⥓":"⥓","⇒":"⇒","ℝ":"ℝ","⥰":"⥰","⇛":"⇛","ℛ":"ℛ","↱":"↱","⧴":"⧴","Щ":"Щ","Ш":"Ш","Ь":"Ь","Ś":"Ś","⪼":"⪼","Š":"Š","Ş":"Ş","Ŝ":"Ŝ","С":"С","𝔖":"𝔖","↓":"↓","←":"←","→":"→","↑":"↑","Σ":"Σ","∘":"∘","𝕊":"𝕊","√":"√","□":"□","⊓":"⊓","⊏":"⊏","⊑":"⊑","⊐":"⊐","⊒":"⊒","⊔":"⊔","𝒮":"𝒮","⋆":"⋆","⋐":"⋐","⋐":"⋐","⊆":"⊆","≻":"≻","⪰":"⪰","≽":"≽","≿":"≿","∋":"∋","∑":"∑","⋑":"⋑","⊃":"⊃","⊇":"⊇","⋑":"⋑","Þ":"Þ","Þ":"Þ","™":"™","Ћ":"Ћ","Ц":"Ц"," ":"\t","Τ":"Τ","Ť":"Ť","Ţ":"Ţ","Т":"Т","𝔗":"𝔗","∴":"∴","Θ":"Θ","  ":"  "," ":" ","∼":"∼","≃":"≃","≅":"≅","≈":"≈","𝕋":"𝕋","⃛":"⃛","𝒯":"𝒯","Ŧ":"Ŧ","Ú":"Ú","Ú":"Ú","↟":"↟","⥉":"⥉","Ў":"Ў","Ŭ":"Ŭ","Û":"Û","Û":"Û","У":"У","Ű":"Ű","𝔘":"𝔘","Ù":"Ù","Ù":"Ù","Ū":"Ū","_":"_","⏟":"⏟","⎵":"⎵","⏝":"⏝","⋃":"⋃","⊎":"⊎","Ų":"Ų","𝕌":"𝕌","↑":"↑","⤒":"⤒","⇅":"⇅","↕":"↕","⥮":"⥮","⊥":"⊥","↥":"↥","⇑":"⇑","⇕":"⇕","↖":"↖","↗":"↗","ϒ":"ϒ","Υ":"Υ","Ů":"Ů","𝒰":"𝒰","Ũ":"Ũ","Ü":"Ü","Ü":"Ü","⊫":"⊫","⫫":"⫫","В":"В","⊩":"⊩","⫦":"⫦","⋁":"⋁","‖":"‖","‖":"‖","∣":"∣","|":"|","❘":"❘","≀":"≀"," ":" ","𝔙":"𝔙","𝕍":"𝕍","𝒱":"𝒱","⊪":"⊪","Ŵ":"Ŵ","⋀":"⋀","𝔚":"𝔚","𝕎":"𝕎","𝒲":"𝒲","𝔛":"𝔛","Ξ":"Ξ","𝕏":"𝕏","𝒳":"𝒳","Я":"Я","Ї":"Ї","Ю":"Ю","Ý":"Ý","Ý":"Ý","Ŷ":"Ŷ","Ы":"Ы","𝔜":"𝔜","𝕐":"𝕐","𝒴":"𝒴","Ÿ":"Ÿ","Ж":"Ж","Ź":"Ź","Ž":"Ž","З":"З","Ż":"Ż","​":"​","Ζ":"Ζ","ℨ":"ℨ","ℤ":"ℤ","𝒵":"𝒵","á":"á","á":"á","ă":"ă","∾":"∾","∾̳":"∾̳","∿":"∿","â":"â","â":"â","´":"´","´":"´","а":"а","æ":"æ","æ":"æ","⁡":"⁡","𝔞":"𝔞","à":"à","à":"à","ℵ":"ℵ","ℵ":"ℵ","α":"α","ā":"ā","⨿":"⨿","&":"&","&":"&","∧":"∧","⩕":"⩕","⩜":"⩜","⩘":"⩘","⩚":"⩚","∠":"∠","⦤":"⦤","∠":"∠","∡":"∡","⦨":"⦨","⦩":"⦩","⦪":"⦪","⦫":"⦫","⦬":"⦬","⦭":"⦭","⦮":"⦮","⦯":"⦯","∟":"∟","⊾":"⊾","⦝":"⦝","∢":"∢","Å":"Å","⍼":"⍼","ą":"ą","𝕒":"𝕒","≈":"≈","⩰":"⩰","⩯":"⩯","≊":"≊","≋":"≋","'":"'","≈":"≈","≊":"≊","å":"å","å":"å","𝒶":"𝒶","*":"*","≈":"≈","≍":"≍","ã":"ã","ã":"ã","ä":"ä","ä":"ä","∳":"∳","⨑":"⨑","⫭":"⫭","≌":"≌","϶":"϶","‵":"‵","∽":"∽","⋍":"⋍","⊽":"⊽","⌅":"⌅","⌅":"⌅","⎵":"⎵","⎶":"⎶","≌":"≌","б":"б","„":"„","∵":"∵","∵":"∵","⦰":"⦰","϶":"϶","ℬ":"ℬ","β":"β","ℶ":"ℶ","≬":"≬","𝔟":"𝔟","⋂":"⋂","◯":"◯","⋃":"⋃","⨀":"⨀","⨁":"⨁","⨂":"⨂","⨆":"⨆","★":"★","▽":"▽","△":"△","⨄":"⨄","⋁":"⋁","⋀":"⋀","⤍":"⤍","⧫":"⧫","▪":"▪","▴":"▴","▾":"▾","◂":"◂","▸":"▸","␣":"␣","▒":"▒","░":"░","▓":"▓","█":"█","=⃥":"=⃥","≡⃥":"≡⃥","⌐":"⌐","𝕓":"𝕓","⊥":"⊥","⊥":"⊥","⋈":"⋈","╗":"╗","╔":"╔","╖":"╖","╓":"╓","═":"═","╦":"╦","╩":"╩","╤":"╤","╧":"╧","╝":"╝","╚":"╚","╜":"╜","╙":"╙","║":"║","╬":"╬","╣":"╣","╠":"╠","╫":"╫","╢":"╢","╟":"╟","⧉":"⧉","╕":"╕","╒":"╒","┐":"┐","┌":"┌","─":"─","╥":"╥","╨":"╨","┬":"┬","┴":"┴","⊟":"⊟","⊞":"⊞","⊠":"⊠","╛":"╛","╘":"╘","┘":"┘","└":"└","│":"│","╪":"╪","╡":"╡","╞":"╞","┼":"┼","┤":"┤","├":"├","‵":"‵","˘":"˘","¦":"¦","¦":"¦","𝒷":"𝒷","⁏":"⁏","∽":"∽","⋍":"⋍","\":"\\","⧅":"⧅","⟈":"⟈","•":"•","•":"•","≎":"≎","⪮":"⪮","≏":"≏","≏":"≏","ć":"ć","∩":"∩","⩄":"⩄","⩉":"⩉","⩋":"⩋","⩇":"⩇","⩀":"⩀","∩︀":"∩︀","⁁":"⁁","ˇ":"ˇ","⩍":"⩍","č":"č","ç":"ç","ç":"ç","ĉ":"ĉ","⩌":"⩌","⩐":"⩐","ċ":"ċ","¸":"¸","¸":"¸","⦲":"⦲","¢":"¢","¢":"¢","·":"·","𝔠":"𝔠","ч":"ч","✓":"✓","✓":"✓","χ":"χ","○":"○","⧃":"⧃","ˆ":"ˆ","≗":"≗","↺":"↺","↻":"↻","®":"®","Ⓢ":"Ⓢ","⊛":"⊛","⊚":"⊚","⊝":"⊝","≗":"≗","⨐":"⨐","⫯":"⫯","⧂":"⧂","♣":"♣","♣":"♣",":":":","≔":"≔","≔":"≔",",":",","@":"@","∁":"∁","∘":"∘","∁":"∁","ℂ":"ℂ","≅":"≅","⩭":"⩭","∮":"∮","𝕔":"𝕔","∐":"∐","©":"©","©":"©","℗":"℗","↵":"↵","✗":"✗","𝒸":"𝒸","⫏":"⫏","⫑":"⫑","⫐":"⫐","⫒":"⫒","⋯":"⋯","⤸":"⤸","⤵":"⤵","⋞":"⋞","⋟":"⋟","↶":"↶","⤽":"⤽","∪":"∪","⩈":"⩈","⩆":"⩆","⩊":"⩊","⊍":"⊍","⩅":"⩅","∪︀":"∪︀","↷":"↷","⤼":"⤼","⋞":"⋞","⋟":"⋟","⋎":"⋎","⋏":"⋏","¤":"¤","¤":"¤","↶":"↶","↷":"↷","⋎":"⋎","⋏":"⋏","∲":"∲","∱":"∱","⌭":"⌭","⇓":"⇓","⥥":"⥥","†":"†","ℸ":"ℸ","↓":"↓","‐":"‐","⊣":"⊣","⤏":"⤏","˝":"˝","ď":"ď","д":"д","ⅆ":"ⅆ","‡":"‡","⇊":"⇊","⩷":"⩷","°":"°","°":"°","δ":"δ","⦱":"⦱","⥿":"⥿","𝔡":"𝔡","⇃":"⇃","⇂":"⇂","⋄":"⋄","⋄":"⋄","♦":"♦","♦":"♦","¨":"¨","ϝ":"ϝ","⋲":"⋲","÷":"÷","÷":"÷","÷":"÷","⋇":"⋇","⋇":"⋇","ђ":"ђ","⌞":"⌞","⌍":"⌍","$":"$","𝕕":"𝕕","˙":"˙","≐":"≐","≑":"≑","∸":"∸","∔":"∔","⊡":"⊡","⌆":"⌆","↓":"↓","⇊":"⇊","⇃":"⇃","⇂":"⇂","⤐":"⤐","⌟":"⌟","⌌":"⌌","𝒹":"𝒹","ѕ":"ѕ","⧶":"⧶","đ":"đ","⋱":"⋱","▿":"▿","▾":"▾","⇵":"⇵","⥯":"⥯","⦦":"⦦","џ":"џ","⟿":"⟿","⩷":"⩷","≑":"≑","é":"é","é":"é","⩮":"⩮","ě":"ě","≖":"≖","ê":"ê","ê":"ê","≕":"≕","э":"э","ė":"ė","ⅇ":"ⅇ","≒":"≒","𝔢":"𝔢","⪚":"⪚","è":"è","è":"è","⪖":"⪖","⪘":"⪘","⪙":"⪙","⏧":"⏧","ℓ":"ℓ","⪕":"⪕","⪗":"⪗","ē":"ē","∅":"∅","∅":"∅","∅":"∅"," ":" "," ":" "," ":" ","ŋ":"ŋ"," ":" ","ę":"ę","𝕖":"𝕖","⋕":"⋕","⧣":"⧣","⩱":"⩱","ε":"ε","ε":"ε","ϵ":"ϵ","≖":"≖","≕":"≕","≂":"≂","⪖":"⪖","⪕":"⪕","=":"=","≟":"≟","≡":"≡","⩸":"⩸","⧥":"⧥","≓":"≓","⥱":"⥱","ℯ":"ℯ","≐":"≐","≂":"≂","η":"η","ð":"ð","ð":"ð","ë":"ë","ë":"ë","€":"€","!":"!","∃":"∃","ℰ":"ℰ","ⅇ":"ⅇ","≒":"≒","ф":"ф","♀":"♀","ffi":"ffi","ff":"ff","ffl":"ffl","𝔣":"𝔣","fi":"fi","fj":"fj","♭":"♭","fl":"fl","▱":"▱","ƒ":"ƒ","𝕗":"𝕗","∀":"∀","⋔":"⋔","⫙":"⫙","⨍":"⨍","½":"½","½":"½","⅓":"⅓","¼":"¼","¼":"¼","⅕":"⅕","⅙":"⅙","⅛":"⅛","⅔":"⅔","⅖":"⅖","¾":"¾","¾":"¾","⅗":"⅗","⅜":"⅜","⅘":"⅘","⅚":"⅚","⅝":"⅝","⅞":"⅞","⁄":"⁄","⌢":"⌢","𝒻":"𝒻","≧":"≧","⪌":"⪌","ǵ":"ǵ","γ":"γ","ϝ":"ϝ","⪆":"⪆","ğ":"ğ","ĝ":"ĝ","г":"г","ġ":"ġ","≥":"≥","⋛":"⋛","≥":"≥","≧":"≧","⩾":"⩾","⩾":"⩾","⪩":"⪩","⪀":"⪀","⪂":"⪂","⪄":"⪄","⋛︀":"⋛︀","⪔":"⪔","𝔤":"𝔤","≫":"≫","⋙":"⋙","ℷ":"ℷ","ѓ":"ѓ","≷":"≷","⪒":"⪒","⪥":"⪥","⪤":"⪤","≩":"≩","⪊":"⪊","⪊":"⪊","⪈":"⪈","⪈":"⪈","≩":"≩","⋧":"⋧","𝕘":"𝕘","`":"`","ℊ":"ℊ","≳":"≳","⪎":"⪎","⪐":"⪐",">":">",">":">","⪧":"⪧","⩺":"⩺","⋗":"⋗","⦕":"⦕","⩼":"⩼","⪆":"⪆","⥸":"⥸","⋗":"⋗","⋛":"⋛","⪌":"⪌","≷":"≷","≳":"≳","≩︀":"≩︀","≩︀":"≩︀","⇔":"⇔"," ":" ","½":"½","ℋ":"ℋ","ъ":"ъ","↔":"↔","⥈":"⥈","↭":"↭","ℏ":"ℏ","ĥ":"ĥ","♥":"♥","♥":"♥","…":"…","⊹":"⊹","𝔥":"𝔥","⤥":"⤥","⤦":"⤦","⇿":"⇿","∻":"∻","↩":"↩","↪":"↪","𝕙":"𝕙","―":"―","𝒽":"𝒽","ℏ":"ℏ","ħ":"ħ","⁃":"⁃","‐":"‐","í":"í","í":"í","⁣":"⁣","î":"î","î":"î","и":"и","е":"е","¡":"¡","¡":"¡","⇔":"⇔","𝔦":"𝔦","ì":"ì","ì":"ì","ⅈ":"ⅈ","⨌":"⨌","∭":"∭","⧜":"⧜","℩":"℩","ij":"ij","ī":"ī","ℑ":"ℑ","ℐ":"ℐ","ℑ":"ℑ","ı":"ı","⊷":"⊷","Ƶ":"Ƶ","∈":"∈","℅":"℅","∞":"∞","⧝":"⧝","ı":"ı","∫":"∫","⊺":"⊺","ℤ":"ℤ","⊺":"⊺","⨗":"⨗","⨼":"⨼","ё":"ё","į":"į","𝕚":"𝕚","ι":"ι","⨼":"⨼","¿":"¿","¿":"¿","𝒾":"𝒾","∈":"∈","⋹":"⋹","⋵":"⋵","⋴":"⋴","⋳":"⋳","∈":"∈","⁢":"⁢","ĩ":"ĩ","і":"і","ï":"ï","ï":"ï","ĵ":"ĵ","й":"й","𝔧":"𝔧","ȷ":"ȷ","𝕛":"𝕛","𝒿":"𝒿","ј":"ј","є":"є","κ":"κ","ϰ":"ϰ","ķ":"ķ","к":"к","𝔨":"𝔨","ĸ":"ĸ","х":"х","ќ":"ќ","𝕜":"𝕜","𝓀":"𝓀","⇚":"⇚","⇐":"⇐","⤛":"⤛","⤎":"⤎","≦":"≦","⪋":"⪋","⥢":"⥢","ĺ":"ĺ","⦴":"⦴","ℒ":"ℒ","λ":"λ","⟨":"⟨","⦑":"⦑","⟨":"⟨","⪅":"⪅","«":"«","«":"«","←":"←","⇤":"⇤","⤟":"⤟","⤝":"⤝","↩":"↩","↫":"↫","⤹":"⤹","⥳":"⥳","↢":"↢","⪫":"⪫","⤙":"⤙","⪭":"⪭","⪭︀":"⪭︀","⤌":"⤌","❲":"❲","{":"{","[":"[","⦋":"⦋","⦏":"⦏","⦍":"⦍","ľ":"ľ","ļ":"ļ","⌈":"⌈","{":"{","л":"л","⤶":"⤶","“":"“","„":"„","⥧":"⥧","⥋":"⥋","↲":"↲","≤":"≤","←":"←","↢":"↢","↽":"↽","↼":"↼","⇇":"⇇","↔":"↔","⇆":"⇆","⇋":"⇋","↭":"↭","⋋":"⋋","⋚":"⋚","≤":"≤","≦":"≦","⩽":"⩽","⩽":"⩽","⪨":"⪨","⩿":"⩿","⪁":"⪁","⪃":"⪃","⋚︀":"⋚︀","⪓":"⪓","⪅":"⪅","⋖":"⋖","⋚":"⋚","⪋":"⪋","≶":"≶","≲":"≲","⥼":"⥼","⌊":"⌊","𝔩":"𝔩","≶":"≶","⪑":"⪑","↽":"↽","↼":"↼","⥪":"⥪","▄":"▄","љ":"љ","≪":"≪","⇇":"⇇","⌞":"⌞","⥫":"⥫","◺":"◺","ŀ":"ŀ","⎰":"⎰","⎰":"⎰","≨":"≨","⪉":"⪉","⪉":"⪉","⪇":"⪇","⪇":"⪇","≨":"≨","⋦":"⋦","⟬":"⟬","⇽":"⇽","⟦":"⟦","⟵":"⟵","⟷":"⟷","⟼":"⟼","⟶":"⟶","↫":"↫","↬":"↬","⦅":"⦅","𝕝":"𝕝","⨭":"⨭","⨴":"⨴","∗":"∗","_":"_","◊":"◊","◊":"◊","⧫":"⧫","(":"(","⦓":"⦓","⇆":"⇆","⌟":"⌟","⇋":"⇋","⥭":"⥭","‎":"‎","⊿":"⊿","‹":"‹","𝓁":"𝓁","↰":"↰","≲":"≲","⪍":"⪍","⪏":"⪏","[":"[","‘":"‘","‚":"‚","ł":"ł","<":"<","<":"<","⪦":"⪦","⩹":"⩹","⋖":"⋖","⋋":"⋋","⋉":"⋉","⥶":"⥶","⩻":"⩻","⦖":"⦖","◃":"◃","⊴":"⊴","◂":"◂","⥊":"⥊","⥦":"⥦","≨︀":"≨︀","≨︀":"≨︀","∺":"∺","¯":"¯","¯":"¯","♂":"♂","✠":"✠","✠":"✠","↦":"↦","↦":"↦","↧":"↧","↤":"↤","↥":"↥","▮":"▮","⨩":"⨩","м":"м","—":"—","∡":"∡","𝔪":"𝔪","℧":"℧","µ":"µ","µ":"µ","∣":"∣","*":"*","⫰":"⫰","·":"·","·":"·","−":"−","⊟":"⊟","∸":"∸","⨪":"⨪","⫛":"⫛","…":"…","∓":"∓","⊧":"⊧","𝕞":"𝕞","∓":"∓","𝓂":"𝓂","∾":"∾","μ":"μ","⊸":"⊸","⊸":"⊸","⋙̸":"⋙̸","≫⃒":"≫⃒","≫̸":"≫̸","⇍":"⇍","⇎":"⇎","⋘̸":"⋘̸","≪⃒":"≪⃒","≪̸":"≪̸","⇏":"⇏","⊯":"⊯","⊮":"⊮","∇":"∇","ń":"ń","∠⃒":"∠⃒","≉":"≉","⩰̸":"⩰̸","≋̸":"≋̸","ʼn":"ʼn","≉":"≉","♮":"♮","♮":"♮","ℕ":"ℕ"," ":" "," ":" ","≎̸":"≎̸","≏̸":"≏̸","⩃":"⩃","ň":"ň","ņ":"ņ","≇":"≇","⩭̸":"⩭̸","⩂":"⩂","н":"н","–":"–","≠":"≠","⇗":"⇗","⤤":"⤤","↗":"↗","↗":"↗","≐̸":"≐̸","≢":"≢","⤨":"⤨","≂̸":"≂̸","∄":"∄","∄":"∄","𝔫":"𝔫","≧̸":"≧̸","≱":"≱","≱":"≱","≧̸":"≧̸","⩾̸":"⩾̸","⩾̸":"⩾̸","≵":"≵","≯":"≯","≯":"≯","⇎":"⇎","↮":"↮","⫲":"⫲","∋":"∋","⋼":"⋼","⋺":"⋺","∋":"∋","њ":"њ","⇍":"⇍","≦̸":"≦̸","↚":"↚","‥":"‥","≰":"≰","↚":"↚","↮":"↮","≰":"≰","≦̸":"≦̸","⩽̸":"⩽̸","⩽̸":"⩽̸","≮":"≮","≴":"≴","≮":"≮","⋪":"⋪","⋬":"⋬","∤":"∤","𝕟":"𝕟","¬":"¬","¬":"¬","∉":"∉","⋹̸":"⋹̸","⋵̸":"⋵̸","∉":"∉","⋷":"⋷","⋶":"⋶","∌":"∌","∌":"∌","⋾":"⋾","⋽":"⋽","∦":"∦","∦":"∦","⫽⃥":"⫽⃥","∂̸":"∂̸","⨔":"⨔","⊀":"⊀","⋠":"⋠","⪯̸":"⪯̸","⊀":"⊀","⪯̸":"⪯̸","⇏":"⇏","↛":"↛","⤳̸":"⤳̸","↝̸":"↝̸","↛":"↛","⋫":"⋫","⋭":"⋭","⊁":"⊁","⋡":"⋡","⪰̸":"⪰̸","𝓃":"𝓃","∤":"∤","∦":"∦","≁":"≁","≄":"≄","≄":"≄","∤":"∤","∦":"∦","⋢":"⋢","⋣":"⋣","⊄":"⊄","⫅̸":"⫅̸","⊈":"⊈","⊂⃒":"⊂⃒","⊈":"⊈","⫅̸":"⫅̸","⊁":"⊁","⪰̸":"⪰̸","⊅":"⊅","⫆̸":"⫆̸","⊉":"⊉","⊃⃒":"⊃⃒","⊉":"⊉","⫆̸":"⫆̸","≹":"≹","ñ":"ñ","ñ":"ñ","≸":"≸","⋪":"⋪","⋬":"⋬","⋫":"⋫","⋭":"⋭","ν":"ν","#":"#","№":"№"," ":" ","⊭":"⊭","⤄":"⤄","≍⃒":"≍⃒","⊬":"⊬","≥⃒":"≥⃒",">⃒":">⃒","⧞":"⧞","⤂":"⤂","≤⃒":"≤⃒","<⃒":"<⃒","⊴⃒":"⊴⃒","⤃":"⤃","⊵⃒":"⊵⃒","∼⃒":"∼⃒","⇖":"⇖","⤣":"⤣","↖":"↖","↖":"↖","⤧":"⤧","Ⓢ":"Ⓢ","ó":"ó","ó":"ó","⊛":"⊛","⊚":"⊚","ô":"ô","ô":"ô","о":"о","⊝":"⊝","ő":"ő","⨸":"⨸","⊙":"⊙","⦼":"⦼","œ":"œ","⦿":"⦿","𝔬":"𝔬","˛":"˛","ò":"ò","ò":"ò","⧁":"⧁","⦵":"⦵","Ω":"Ω","∮":"∮","↺":"↺","⦾":"⦾","⦻":"⦻","‾":"‾","⧀":"⧀","ō":"ō","ω":"ω","ο":"ο","⦶":"⦶","⊖":"⊖","𝕠":"𝕠","⦷":"⦷","⦹":"⦹","⊕":"⊕","∨":"∨","↻":"↻","⩝":"⩝","ℴ":"ℴ","ℴ":"ℴ","ª":"ª","ª":"ª","º":"º","º":"º","⊶":"⊶","⩖":"⩖","⩗":"⩗","⩛":"⩛","ℴ":"ℴ","ø":"ø","ø":"ø","⊘":"⊘","õ":"õ","õ":"õ","⊗":"⊗","⨶":"⨶","ö":"ö","ö":"ö","⌽":"⌽","∥":"∥","¶":"¶","¶":"¶","∥":"∥","⫳":"⫳","⫽":"⫽","∂":"∂","п":"п","%":"%",".":".","‰":"‰","⊥":"⊥","‱":"‱","𝔭":"𝔭","φ":"φ","ϕ":"ϕ","ℳ":"ℳ","☎":"☎","π":"π","⋔":"⋔","ϖ":"ϖ","ℏ":"ℏ","ℎ":"ℎ","ℏ":"ℏ","+":"+","⨣":"⨣","⊞":"⊞","⨢":"⨢","∔":"∔","⨥":"⨥","⩲":"⩲","±":"±","±":"±","⨦":"⨦","⨧":"⨧","±":"±","⨕":"⨕","𝕡":"𝕡","£":"£","£":"£","≺":"≺","⪳":"⪳","⪷":"⪷","≼":"≼","⪯":"⪯","≺":"≺","⪷":"⪷","≼":"≼","⪯":"⪯","⪹":"⪹","⪵":"⪵","⋨":"⋨","≾":"≾","′":"′","ℙ":"ℙ","⪵":"⪵","⪹":"⪹","⋨":"⋨","∏":"∏","⌮":"⌮","⌒":"⌒","⌓":"⌓","∝":"∝","∝":"∝","≾":"≾","⊰":"⊰","𝓅":"𝓅","ψ":"ψ"," ":" ","𝔮":"𝔮","⨌":"⨌","𝕢":"𝕢","⁗":"⁗","𝓆":"𝓆","ℍ":"ℍ","⨖":"⨖","?":"?","≟":"≟",""":'"',""":'"',"⇛":"⇛","⇒":"⇒","⤜":"⤜","⤏":"⤏","⥤":"⥤","∽̱":"∽̱","ŕ":"ŕ","√":"√","⦳":"⦳","⟩":"⟩","⦒":"⦒","⦥":"⦥","⟩":"⟩","»":"»","»":"»","→":"→","⥵":"⥵","⇥":"⇥","⤠":"⤠","⤳":"⤳","⤞":"⤞","↪":"↪","↬":"↬","⥅":"⥅","⥴":"⥴","↣":"↣","↝":"↝","⤚":"⤚","∶":"∶","ℚ":"ℚ","⤍":"⤍","❳":"❳","}":"}","]":"]","⦌":"⦌","⦎":"⦎","⦐":"⦐","ř":"ř","ŗ":"ŗ","⌉":"⌉","}":"}","р":"р","⤷":"⤷","⥩":"⥩","”":"”","”":"”","↳":"↳","ℜ":"ℜ","ℛ":"ℛ","ℜ":"ℜ","ℝ":"ℝ","▭":"▭","®":"®","®":"®","⥽":"⥽","⌋":"⌋","𝔯":"𝔯","⇁":"⇁","⇀":"⇀","⥬":"⥬","ρ":"ρ","ϱ":"ϱ","→":"→","↣":"↣","⇁":"⇁","⇀":"⇀","⇄":"⇄","⇌":"⇌","⇉":"⇉","↝":"↝","⋌":"⋌","˚":"˚","≓":"≓","⇄":"⇄","⇌":"⇌","‏":"‏","⎱":"⎱","⎱":"⎱","⫮":"⫮","⟭":"⟭","⇾":"⇾","⟧":"⟧","⦆":"⦆","𝕣":"𝕣","⨮":"⨮","⨵":"⨵",")":")","⦔":"⦔","⨒":"⨒","⇉":"⇉","›":"›","𝓇":"𝓇","↱":"↱","]":"]","’":"’","’":"’","⋌":"⋌","⋊":"⋊","▹":"▹","⊵":"⊵","▸":"▸","⧎":"⧎","⥨":"⥨","℞":"℞","ś":"ś","‚":"‚","≻":"≻","⪴":"⪴","⪸":"⪸","š":"š","≽":"≽","⪰":"⪰","ş":"ş","ŝ":"ŝ","⪶":"⪶","⪺":"⪺","⋩":"⋩","⨓":"⨓","≿":"≿","с":"с","⋅":"⋅","⊡":"⊡","⩦":"⩦","⇘":"⇘","⤥":"⤥","↘":"↘","↘":"↘","§":"§","§":"§",";":";","⤩":"⤩","∖":"∖","∖":"∖","✶":"✶","𝔰":"𝔰","⌢":"⌢","♯":"♯","щ":"щ","ш":"ш","∣":"∣","∥":"∥","­":"­","­":"­","σ":"σ","ς":"ς","ς":"ς","∼":"∼","⩪":"⩪","≃":"≃","≃":"≃","⪞":"⪞","⪠":"⪠","⪝":"⪝","⪟":"⪟","≆":"≆","⨤":"⨤","⥲":"⥲","←":"←","∖":"∖","⨳":"⨳","⧤":"⧤","∣":"∣","⌣":"⌣","⪪":"⪪","⪬":"⪬","⪬︀":"⪬︀","ь":"ь","/":"/","⧄":"⧄","⌿":"⌿","𝕤":"𝕤","♠":"♠","♠":"♠","∥":"∥","⊓":"⊓","⊓︀":"⊓︀","⊔":"⊔","⊔︀":"⊔︀","⊏":"⊏","⊑":"⊑","⊏":"⊏","⊑":"⊑","⊐":"⊐","⊒":"⊒","⊐":"⊐","⊒":"⊒","□":"□","□":"□","▪":"▪","▪":"▪","→":"→","𝓈":"𝓈","∖":"∖","⌣":"⌣","⋆":"⋆","☆":"☆","★":"★","ϵ":"ϵ","ϕ":"ϕ","¯":"¯","⊂":"⊂","⫅":"⫅","⪽":"⪽","⊆":"⊆","⫃":"⫃","⫁":"⫁","⫋":"⫋","⊊":"⊊","⪿":"⪿","⥹":"⥹","⊂":"⊂","⊆":"⊆","⫅":"⫅","⊊":"⊊","⫋":"⫋","⫇":"⫇","⫕":"⫕","⫓":"⫓","≻":"≻","⪸":"⪸","≽":"≽","⪰":"⪰","⪺":"⪺","⪶":"⪶","⋩":"⋩","≿":"≿","∑":"∑","♪":"♪","¹":"¹","¹":"¹","²":"²","²":"²","³":"³","³":"³","⊃":"⊃","⫆":"⫆","⪾":"⪾","⫘":"⫘","⊇":"⊇","⫄":"⫄","⟉":"⟉","⫗":"⫗","⥻":"⥻","⫂":"⫂","⫌":"⫌","⊋":"⊋","⫀":"⫀","⊃":"⊃","⊇":"⊇","⫆":"⫆","⊋":"⊋","⫌":"⫌","⫈":"⫈","⫔":"⫔","⫖":"⫖","⇙":"⇙","⤦":"⤦","↙":"↙","↙":"↙","⤪":"⤪","ß":"ß","ß":"ß","⌖":"⌖","τ":"τ","⎴":"⎴","ť":"ť","ţ":"ţ","т":"т","⃛":"⃛","⌕":"⌕","𝔱":"𝔱","∴":"∴","∴":"∴","θ":"θ","ϑ":"ϑ","ϑ":"ϑ","≈":"≈","∼":"∼"," ":" ","≈":"≈","∼":"∼","þ":"þ","þ":"þ","˜":"˜","×":"×","×":"×","⊠":"⊠","⨱":"⨱","⨰":"⨰","∭":"∭","⤨":"⤨","⊤":"⊤","⌶":"⌶","⫱":"⫱","𝕥":"𝕥","⫚":"⫚","⤩":"⤩","‴":"‴","™":"™","▵":"▵","▿":"▿","◃":"◃","⊴":"⊴","≜":"≜","▹":"▹","⊵":"⊵","◬":"◬","≜":"≜","⨺":"⨺","⨹":"⨹","⧍":"⧍","⨻":"⨻","⏢":"⏢","𝓉":"𝓉","ц":"ц","ћ":"ћ","ŧ":"ŧ","≬":"≬","↞":"↞","↠":"↠","⇑":"⇑","⥣":"⥣","ú":"ú","ú":"ú","↑":"↑","ў":"ў","ŭ":"ŭ","û":"û","û":"û","у":"у","⇅":"⇅","ű":"ű","⥮":"⥮","⥾":"⥾","𝔲":"𝔲","ù":"ù","ù":"ù","↿":"↿","↾":"↾","▀":"▀","⌜":"⌜","⌜":"⌜","⌏":"⌏","◸":"◸","ū":"ū","¨":"¨","¨":"¨","ų":"ų","𝕦":"𝕦","↑":"↑","↕":"↕","↿":"↿","↾":"↾","⊎":"⊎","υ":"υ","ϒ":"ϒ","υ":"υ","⇈":"⇈","⌝":"⌝","⌝":"⌝","⌎":"⌎","ů":"ů","◹":"◹","𝓊":"𝓊","⋰":"⋰","ũ":"ũ","▵":"▵","▴":"▴","⇈":"⇈","ü":"ü","ü":"ü","⦧":"⦧","⇕":"⇕","⫨":"⫨","⫩":"⫩","⊨":"⊨","⦜":"⦜","ϵ":"ϵ","ϰ":"ϰ","∅":"∅","ϕ":"ϕ","ϖ":"ϖ","∝":"∝","↕":"↕","ϱ":"ϱ","ς":"ς","⊊︀":"⊊︀","⫋︀":"⫋︀","⊋︀":"⊋︀","⫌︀":"⫌︀","ϑ":"ϑ","⊲":"⊲","⊳":"⊳","в":"в","⊢":"⊢","∨":"∨","⊻":"⊻","≚":"≚","⋮":"⋮","|":"|","|":"|","𝔳":"𝔳","⊲":"⊲","⊂⃒":"⊂⃒","⊃⃒":"⊃⃒","𝕧":"𝕧","∝":"∝","⊳":"⊳","𝓋":"𝓋","⫋︀":"⫋︀","⊊︀":"⊊︀","⫌︀":"⫌︀","⊋︀":"⊋︀","⦚":"⦚","ŵ":"ŵ","⩟":"⩟","∧":"∧","≙":"≙","℘":"℘","𝔴":"𝔴","𝕨":"𝕨","℘":"℘","≀":"≀","≀":"≀","𝓌":"𝓌","⋂":"⋂","◯":"◯","⋃":"⋃","▽":"▽","𝔵":"𝔵","⟺":"⟺","⟷":"⟷","ξ":"ξ","⟸":"⟸","⟵":"⟵","⟼":"⟼","⋻":"⋻","⨀":"⨀","𝕩":"𝕩","⨁":"⨁","⨂":"⨂","⟹":"⟹","⟶":"⟶","𝓍":"𝓍","⨆":"⨆","⨄":"⨄","△":"△","⋁":"⋁","⋀":"⋀","ý":"ý","ý":"ý","я":"я","ŷ":"ŷ","ы":"ы","¥":"¥","¥":"¥","𝔶":"𝔶","ї":"ї","𝕪":"𝕪","𝓎":"𝓎","ю":"ю","ÿ":"ÿ","ÿ":"ÿ","ź":"ź","ž":"ž","з":"з","ż":"ż","ℨ":"ℨ","ζ":"ζ","𝔷":"𝔷","ж":"ж","⇝":"⇝","𝕫":"𝕫","𝓏":"𝓏","‍":"‍","‌":"‌"},characters:{"Æ":"Æ","&":"&","Á":"Á","Ă":"Ă","Â":"Â","А":"А","𝔄":"𝔄","À":"À","Α":"Α","Ā":"Ā","⩓":"⩓","Ą":"Ą","𝔸":"𝔸","⁡":"⁡","Å":"Å","𝒜":"𝒜","≔":"≔","Ã":"Ã","Ä":"Ä","∖":"∖","⫧":"⫧","⌆":"⌆","Б":"Б","∵":"∵","ℬ":"ℬ","Β":"Β","𝔅":"𝔅","𝔹":"𝔹","˘":"˘","≎":"≎","Ч":"Ч","©":"©","Ć":"Ć","⋒":"⋒","ⅅ":"ⅅ","ℭ":"ℭ","Č":"Č","Ç":"Ç","Ĉ":"Ĉ","∰":"∰","Ċ":"Ċ","¸":"¸","·":"·","Χ":"Χ","⊙":"⊙","⊖":"⊖","⊕":"⊕","⊗":"⊗","∲":"∲","”":"”","’":"’","∷":"∷","⩴":"⩴","≡":"≡","∯":"∯","∮":"∮","ℂ":"ℂ","∐":"∐","∳":"∳","⨯":"⨯","𝒞":"𝒞","⋓":"⋓","≍":"≍","⤑":"⤑","Ђ":"Ђ","Ѕ":"Ѕ","Џ":"Џ","‡":"‡","↡":"↡","⫤":"⫤","Ď":"Ď","Д":"Д","∇":"∇","Δ":"Δ","𝔇":"𝔇","´":"´","˙":"˙","˝":"˝","`":"`","˜":"˜","⋄":"⋄","ⅆ":"ⅆ","𝔻":"𝔻","¨":"¨","⃜":"⃜","≐":"≐","⇓":"⇓","⇐":"⇐","⇔":"⇔","⟸":"⟸","⟺":"⟺","⟹":"⟹","⇒":"⇒","⊨":"⊨","⇑":"⇑","⇕":"⇕","∥":"∥","↓":"↓","⤓":"⤓","⇵":"⇵","̑":"̑","⥐":"⥐","⥞":"⥞","↽":"↽","⥖":"⥖","⥟":"⥟","⇁":"⇁","⥗":"⥗","⊤":"⊤","↧":"↧","𝒟":"𝒟","Đ":"Đ","Ŋ":"Ŋ","Ð":"Ð","É":"É","Ě":"Ě","Ê":"Ê","Э":"Э","Ė":"Ė","𝔈":"𝔈","È":"È","∈":"∈","Ē":"Ē","◻":"◻","▫":"▫","Ę":"Ę","𝔼":"𝔼","Ε":"Ε","⩵":"⩵","≂":"≂","⇌":"⇌","ℰ":"ℰ","⩳":"⩳","Η":"Η","Ë":"Ë","∃":"∃","ⅇ":"ⅇ","Ф":"Ф","𝔉":"𝔉","◼":"◼","▪":"▪","𝔽":"𝔽","∀":"∀","ℱ":"ℱ","Ѓ":"Ѓ",">":">","Γ":"Γ","Ϝ":"Ϝ","Ğ":"Ğ","Ģ":"Ģ","Ĝ":"Ĝ","Г":"Г","Ġ":"Ġ","𝔊":"𝔊","⋙":"⋙","𝔾":"𝔾","≥":"≥","⋛":"⋛","≧":"≧","⪢":"⪢","≷":"≷","⩾":"⩾","≳":"≳","𝒢":"𝒢","≫":"≫","Ъ":"Ъ","ˇ":"ˇ","^":"^","Ĥ":"Ĥ","ℌ":"ℌ","ℋ":"ℋ","ℍ":"ℍ","─":"─","Ħ":"Ħ","≏":"≏","Е":"Е","IJ":"IJ","Ё":"Ё","Í":"Í","Î":"Î","И":"И","İ":"İ","ℑ":"ℑ","Ì":"Ì","Ī":"Ī","ⅈ":"ⅈ","∬":"∬","∫":"∫","⋂":"⋂","⁣":"⁣","⁢":"⁢","Į":"Į","𝕀":"𝕀","Ι":"Ι","ℐ":"ℐ","Ĩ":"Ĩ","І":"І","Ï":"Ï","Ĵ":"Ĵ","Й":"Й","𝔍":"𝔍","𝕁":"𝕁","𝒥":"𝒥","Ј":"Ј","Є":"Є","Х":"Х","Ќ":"Ќ","Κ":"Κ","Ķ":"Ķ","К":"К","𝔎":"𝔎","𝕂":"𝕂","𝒦":"𝒦","Љ":"Љ","<":"<","Ĺ":"Ĺ","Λ":"Λ","⟪":"⟪","ℒ":"ℒ","↞":"↞","Ľ":"Ľ","Ļ":"Ļ","Л":"Л","⟨":"⟨","←":"←","⇤":"⇤","⇆":"⇆","⌈":"⌈","⟦":"⟦","⥡":"⥡","⇃":"⇃","⥙":"⥙","⌊":"⌊","↔":"↔","⥎":"⥎","⊣":"⊣","↤":"↤","⥚":"⥚","⊲":"⊲","⧏":"⧏","⊴":"⊴","⥑":"⥑","⥠":"⥠","↿":"↿","⥘":"⥘","↼":"↼","⥒":"⥒","⋚":"⋚","≦":"≦","≶":"≶","⪡":"⪡","⩽":"⩽","≲":"≲","𝔏":"𝔏","⋘":"⋘","⇚":"⇚","Ŀ":"Ŀ","⟵":"⟵","⟷":"⟷","⟶":"⟶","𝕃":"𝕃","↙":"↙","↘":"↘","↰":"↰","Ł":"Ł","≪":"≪","⤅":"⤅","М":"М"," ":" ","ℳ":"ℳ","𝔐":"𝔐","∓":"∓","𝕄":"𝕄","Μ":"Μ","Њ":"Њ","Ń":"Ń","Ň":"Ň","Ņ":"Ņ","Н":"Н","​":"​","\n":" ","𝔑":"𝔑","⁠":"⁠"," ":" ","ℕ":"ℕ","⫬":"⫬","≢":"≢","≭":"≭","∦":"∦","∉":"∉","≠":"≠","≂̸":"≂̸","∄":"∄","≯":"≯","≱":"≱","≧̸":"≧̸","≫̸":"≫̸","≹":"≹","⩾̸":"⩾̸","≵":"≵","≎̸":"≎̸","≏̸":"≏̸","⋪":"⋪","⧏̸":"⧏̸","⋬":"⋬","≮":"≮","≰":"≰","≸":"≸","≪̸":"≪̸","⩽̸":"⩽̸","≴":"≴","⪢̸":"⪢̸","⪡̸":"⪡̸","⊀":"⊀","⪯̸":"⪯̸","⋠":"⋠","∌":"∌","⋫":"⋫","⧐̸":"⧐̸","⋭":"⋭","⊏̸":"⊏̸","⋢":"⋢","⊐̸":"⊐̸","⋣":"⋣","⊂⃒":"⊂⃒","⊈":"⊈","⊁":"⊁","⪰̸":"⪰̸","⋡":"⋡","≿̸":"≿̸","⊃⃒":"⊃⃒","⊉":"⊉","≁":"≁","≄":"≄","≇":"≇","≉":"≉","∤":"∤","𝒩":"𝒩","Ñ":"Ñ","Ν":"Ν","Œ":"Œ","Ó":"Ó","Ô":"Ô","О":"О","Ő":"Ő","𝔒":"𝔒","Ò":"Ò","Ō":"Ō","Ω":"Ω","Ο":"Ο","𝕆":"𝕆","“":"“","‘":"‘","⩔":"⩔","𝒪":"𝒪","Ø":"Ø","Õ":"Õ","⨷":"⨷","Ö":"Ö","‾":"‾","⏞":"⏞","⎴":"⎴","⏜":"⏜","∂":"∂","П":"П","𝔓":"𝔓","Φ":"Φ","Π":"Π","±":"±","ℙ":"ℙ","⪻":"⪻","≺":"≺","⪯":"⪯","≼":"≼","≾":"≾","″":"″","∏":"∏","∝":"∝","𝒫":"𝒫","Ψ":"Ψ",'"':""","𝔔":"𝔔","ℚ":"ℚ","𝒬":"𝒬","⤐":"⤐","®":"®","Ŕ":"Ŕ","⟫":"⟫","↠":"↠","⤖":"⤖","Ř":"Ř","Ŗ":"Ŗ","Р":"Р","ℜ":"ℜ","∋":"∋","⇋":"⇋","⥯":"⥯","Ρ":"Ρ","⟩":"⟩","→":"→","⇥":"⇥","⇄":"⇄","⌉":"⌉","⟧":"⟧","⥝":"⥝","⇂":"⇂","⥕":"⥕","⌋":"⌋","⊢":"⊢","↦":"↦","⥛":"⥛","⊳":"⊳","⧐":"⧐","⊵":"⊵","⥏":"⥏","⥜":"⥜","↾":"↾","⥔":"⥔","⇀":"⇀","⥓":"⥓","ℝ":"ℝ","⥰":"⥰","⇛":"⇛","ℛ":"ℛ","↱":"↱","⧴":"⧴","Щ":"Щ","Ш":"Ш","Ь":"Ь","Ś":"Ś","⪼":"⪼","Š":"Š","Ş":"Ş","Ŝ":"Ŝ","С":"С","𝔖":"𝔖","↑":"↑","Σ":"Σ","∘":"∘","𝕊":"𝕊","√":"√","□":"□","⊓":"⊓","⊏":"⊏","⊑":"⊑","⊐":"⊐","⊒":"⊒","⊔":"⊔","𝒮":"𝒮","⋆":"⋆","⋐":"⋐","⊆":"⊆","≻":"≻","⪰":"⪰","≽":"≽","≿":"≿","∑":"∑","⋑":"⋑","⊃":"⊃","⊇":"⊇","Þ":"Þ","™":"™","Ћ":"Ћ","Ц":"Ц","\t":" ","Τ":"Τ","Ť":"Ť","Ţ":"Ţ","Т":"Т","𝔗":"𝔗","∴":"∴","Θ":"Θ","  ":"  "," ":" ","∼":"∼","≃":"≃","≅":"≅","≈":"≈","𝕋":"𝕋","⃛":"⃛","𝒯":"𝒯","Ŧ":"Ŧ","Ú":"Ú","↟":"↟","⥉":"⥉","Ў":"Ў","Ŭ":"Ŭ","Û":"Û","У":"У","Ű":"Ű","𝔘":"𝔘","Ù":"Ù","Ū":"Ū",_:"_","⏟":"⏟","⎵":"⎵","⏝":"⏝","⋃":"⋃","⊎":"⊎","Ų":"Ų","𝕌":"𝕌","⤒":"⤒","⇅":"⇅","↕":"↕","⥮":"⥮","⊥":"⊥","↥":"↥","↖":"↖","↗":"↗","ϒ":"ϒ","Υ":"Υ","Ů":"Ů","𝒰":"𝒰","Ũ":"Ũ","Ü":"Ü","⊫":"⊫","⫫":"⫫","В":"В","⊩":"⊩","⫦":"⫦","⋁":"⋁","‖":"‖","∣":"∣","|":"|","❘":"❘","≀":"≀"," ":" ","𝔙":"𝔙","𝕍":"𝕍","𝒱":"𝒱","⊪":"⊪","Ŵ":"Ŵ","⋀":"⋀","𝔚":"𝔚","𝕎":"𝕎","𝒲":"𝒲","𝔛":"𝔛","Ξ":"Ξ","𝕏":"𝕏","𝒳":"𝒳","Я":"Я","Ї":"Ї","Ю":"Ю","Ý":"Ý","Ŷ":"Ŷ","Ы":"Ы","𝔜":"𝔜","𝕐":"𝕐","𝒴":"𝒴","Ÿ":"Ÿ","Ж":"Ж","Ź":"Ź","Ž":"Ž","З":"З","Ż":"Ż","Ζ":"Ζ","ℨ":"ℨ","ℤ":"ℤ","𝒵":"𝒵","á":"á","ă":"ă","∾":"∾","∾̳":"∾̳","∿":"∿","â":"â","а":"а","æ":"æ","𝔞":"𝔞","à":"à","ℵ":"ℵ","α":"α","ā":"ā","⨿":"⨿","∧":"∧","⩕":"⩕","⩜":"⩜","⩘":"⩘","⩚":"⩚","∠":"∠","⦤":"⦤","∡":"∡","⦨":"⦨","⦩":"⦩","⦪":"⦪","⦫":"⦫","⦬":"⦬","⦭":"⦭","⦮":"⦮","⦯":"⦯","∟":"∟","⊾":"⊾","⦝":"⦝","∢":"∢","⍼":"⍼","ą":"ą","𝕒":"𝕒","⩰":"⩰","⩯":"⩯","≊":"≊","≋":"≋","'":"'","å":"å","𝒶":"𝒶","*":"*","ã":"ã","ä":"ä","⨑":"⨑","⫭":"⫭","≌":"≌","϶":"϶","‵":"‵","∽":"∽","⋍":"⋍","⊽":"⊽","⌅":"⌅","⎶":"⎶","б":"б","„":"„","⦰":"⦰","β":"β","ℶ":"ℶ","≬":"≬","𝔟":"𝔟","◯":"◯","⨀":"⨀","⨁":"⨁","⨂":"⨂","⨆":"⨆","★":"★","▽":"▽","△":"△","⨄":"⨄","⤍":"⤍","⧫":"⧫","▴":"▴","▾":"▾","◂":"◂","▸":"▸","␣":"␣","▒":"▒","░":"░","▓":"▓","█":"█","=⃥":"=⃥","≡⃥":"≡⃥","⌐":"⌐","𝕓":"𝕓","⋈":"⋈","╗":"╗","╔":"╔","╖":"╖","╓":"╓","═":"═","╦":"╦","╩":"╩","╤":"╤","╧":"╧","╝":"╝","╚":"╚","╜":"╜","╙":"╙","║":"║","╬":"╬","╣":"╣","╠":"╠","╫":"╫","╢":"╢","╟":"╟","⧉":"⧉","╕":"╕","╒":"╒","┐":"┐","┌":"┌","╥":"╥","╨":"╨","┬":"┬","┴":"┴","⊟":"⊟","⊞":"⊞","⊠":"⊠","╛":"╛","╘":"╘","┘":"┘","└":"└","│":"│","╪":"╪","╡":"╡","╞":"╞","┼":"┼","┤":"┤","├":"├","¦":"¦","𝒷":"𝒷","⁏":"⁏","\\":"\","⧅":"⧅","⟈":"⟈","•":"•","⪮":"⪮","ć":"ć","∩":"∩","⩄":"⩄","⩉":"⩉","⩋":"⩋","⩇":"⩇","⩀":"⩀","∩︀":"∩︀","⁁":"⁁","⩍":"⩍","č":"č","ç":"ç","ĉ":"ĉ","⩌":"⩌","⩐":"⩐","ċ":"ċ","⦲":"⦲","¢":"¢","𝔠":"𝔠","ч":"ч","✓":"✓","χ":"χ","○":"○","⧃":"⧃","ˆ":"ˆ","≗":"≗","↺":"↺","↻":"↻","Ⓢ":"Ⓢ","⊛":"⊛","⊚":"⊚","⊝":"⊝","⨐":"⨐","⫯":"⫯","⧂":"⧂","♣":"♣",":":":",",":",","@":"@","∁":"∁","⩭":"⩭","𝕔":"𝕔","℗":"℗","↵":"↵","✗":"✗","𝒸":"𝒸","⫏":"⫏","⫑":"⫑","⫐":"⫐","⫒":"⫒","⋯":"⋯","⤸":"⤸","⤵":"⤵","⋞":"⋞","⋟":"⋟","↶":"↶","⤽":"⤽","∪":"∪","⩈":"⩈","⩆":"⩆","⩊":"⩊","⊍":"⊍","⩅":"⩅","∪︀":"∪︀","↷":"↷","⤼":"⤼","⋎":"⋎","⋏":"⋏","¤":"¤","∱":"∱","⌭":"⌭","⥥":"⥥","†":"†","ℸ":"ℸ","‐":"‐","⤏":"⤏","ď":"ď","д":"д","⇊":"⇊","⩷":"⩷","°":"°","δ":"δ","⦱":"⦱","⥿":"⥿","𝔡":"𝔡","♦":"♦","ϝ":"ϝ","⋲":"⋲","÷":"÷","⋇":"⋇","ђ":"ђ","⌞":"⌞","⌍":"⌍",$:"$","𝕕":"𝕕","≑":"≑","∸":"∸","∔":"∔","⊡":"⊡","⌟":"⌟","⌌":"⌌","𝒹":"𝒹","ѕ":"ѕ","⧶":"⧶","đ":"đ","⋱":"⋱","▿":"▿","⦦":"⦦","џ":"џ","⟿":"⟿","é":"é","⩮":"⩮","ě":"ě","≖":"≖","ê":"ê","≕":"≕","э":"э","ė":"ė","≒":"≒","𝔢":"𝔢","⪚":"⪚","è":"è","⪖":"⪖","⪘":"⪘","⪙":"⪙","⏧":"⏧","ℓ":"ℓ","⪕":"⪕","⪗":"⪗","ē":"ē","∅":"∅"," ":" "," ":" "," ":" ","ŋ":"ŋ"," ":" ","ę":"ę","𝕖":"𝕖","⋕":"⋕","⧣":"⧣","⩱":"⩱","ε":"ε","ϵ":"ϵ","=":"=","≟":"≟","⩸":"⩸","⧥":"⧥","≓":"≓","⥱":"⥱","ℯ":"ℯ","η":"η","ð":"ð","ë":"ë","€":"€","!":"!","ф":"ф","♀":"♀","ffi":"ffi","ff":"ff","ffl":"ffl","𝔣":"𝔣","fi":"fi",fj:"fj","♭":"♭","fl":"fl","▱":"▱","ƒ":"ƒ","𝕗":"𝕗","⋔":"⋔","⫙":"⫙","⨍":"⨍","½":"½","⅓":"⅓","¼":"¼","⅕":"⅕","⅙":"⅙","⅛":"⅛","⅔":"⅔","⅖":"⅖","¾":"¾","⅗":"⅗","⅜":"⅜","⅘":"⅘","⅚":"⅚","⅝":"⅝","⅞":"⅞","⁄":"⁄","⌢":"⌢","𝒻":"𝒻","⪌":"⪌","ǵ":"ǵ","γ":"γ","⪆":"⪆","ğ":"ğ","ĝ":"ĝ","г":"г","ġ":"ġ","⪩":"⪩","⪀":"⪀","⪂":"⪂","⪄":"⪄","⋛︀":"⋛︀","⪔":"⪔","𝔤":"𝔤","ℷ":"ℷ","ѓ":"ѓ","⪒":"⪒","⪥":"⪥","⪤":"⪤","≩":"≩","⪊":"⪊","⪈":"⪈","⋧":"⋧","𝕘":"𝕘","ℊ":"ℊ","⪎":"⪎","⪐":"⪐","⪧":"⪧","⩺":"⩺","⋗":"⋗","⦕":"⦕","⩼":"⩼","⥸":"⥸","≩︀":"≩︀","ъ":"ъ","⥈":"⥈","↭":"↭","ℏ":"ℏ","ĥ":"ĥ","♥":"♥","…":"…","⊹":"⊹","𝔥":"𝔥","⤥":"⤥","⤦":"⤦","⇿":"⇿","∻":"∻","↩":"↩","↪":"↪","𝕙":"𝕙","―":"―","𝒽":"𝒽","ħ":"ħ","⁃":"⁃","í":"í","î":"î","и":"и","е":"е","¡":"¡","𝔦":"𝔦","ì":"ì","⨌":"⨌","∭":"∭","⧜":"⧜","℩":"℩","ij":"ij","ī":"ī","ı":"ı","⊷":"⊷","Ƶ":"Ƶ","℅":"℅","∞":"∞","⧝":"⧝","⊺":"⊺","⨗":"⨗","⨼":"⨼","ё":"ё","į":"į","𝕚":"𝕚","ι":"ι","¿":"¿","𝒾":"𝒾","⋹":"⋹","⋵":"⋵","⋴":"⋴","⋳":"⋳","ĩ":"ĩ","і":"і","ï":"ï","ĵ":"ĵ","й":"й","𝔧":"𝔧","ȷ":"ȷ","𝕛":"𝕛","𝒿":"𝒿","ј":"ј","є":"є","κ":"κ","ϰ":"ϰ","ķ":"ķ","к":"к","𝔨":"𝔨","ĸ":"ĸ","х":"х","ќ":"ќ","𝕜":"𝕜","𝓀":"𝓀","⤛":"⤛","⤎":"⤎","⪋":"⪋","⥢":"⥢","ĺ":"ĺ","⦴":"⦴","λ":"λ","⦑":"⦑","⪅":"⪅","«":"«","⤟":"⤟","⤝":"⤝","↫":"↫","⤹":"⤹","⥳":"⥳","↢":"↢","⪫":"⪫","⤙":"⤙","⪭":"⪭","⪭︀":"⪭︀","⤌":"⤌","❲":"❲","{":"{","[":"[","⦋":"⦋","⦏":"⦏","⦍":"⦍","ľ":"ľ","ļ":"ļ","л":"л","⤶":"⤶","⥧":"⥧","⥋":"⥋","↲":"↲","≤":"≤","⇇":"⇇","⋋":"⋋","⪨":"⪨","⩿":"⩿","⪁":"⪁","⪃":"⪃","⋚︀":"⋚︀","⪓":"⪓","⋖":"⋖","⥼":"⥼","𝔩":"𝔩","⪑":"⪑","⥪":"⥪","▄":"▄","љ":"љ","⥫":"⥫","◺":"◺","ŀ":"ŀ","⎰":"⎰","≨":"≨","⪉":"⪉","⪇":"⪇","⋦":"⋦","⟬":"⟬","⇽":"⇽","⟼":"⟼","↬":"↬","⦅":"⦅","𝕝":"𝕝","⨭":"⨭","⨴":"⨴","∗":"∗","◊":"◊","(":"(","⦓":"⦓","⥭":"⥭","‎":"‎","⊿":"⊿","‹":"‹","𝓁":"𝓁","⪍":"⪍","⪏":"⪏","‚":"‚","ł":"ł","⪦":"⪦","⩹":"⩹","⋉":"⋉","⥶":"⥶","⩻":"⩻","⦖":"⦖","◃":"◃","⥊":"⥊","⥦":"⥦","≨︀":"≨︀","∺":"∺","¯":"¯","♂":"♂","✠":"✠","▮":"▮","⨩":"⨩","м":"м","—":"—","𝔪":"𝔪","℧":"℧","µ":"µ","⫰":"⫰","−":"−","⨪":"⨪","⫛":"⫛","⊧":"⊧","𝕞":"𝕞","𝓂":"𝓂","μ":"μ","⊸":"⊸","⋙̸":"⋙̸","≫⃒":"≫⃒","⇍":"⇍","⇎":"⇎","⋘̸":"⋘̸","≪⃒":"≪⃒","⇏":"⇏","⊯":"⊯","⊮":"⊮","ń":"ń","∠⃒":"∠⃒","⩰̸":"⩰̸","≋̸":"≋̸","ʼn":"ʼn","♮":"♮","⩃":"⩃","ň":"ň","ņ":"ņ","⩭̸":"⩭̸","⩂":"⩂","н":"н","–":"–","⇗":"⇗","⤤":"⤤","≐̸":"≐̸","⤨":"⤨","𝔫":"𝔫","↮":"↮","⫲":"⫲","⋼":"⋼","⋺":"⋺","њ":"њ","≦̸":"≦̸","↚":"↚","‥":"‥","𝕟":"𝕟","¬":"¬","⋹̸":"⋹̸","⋵̸":"⋵̸","⋷":"⋷","⋶":"⋶","⋾":"⋾","⋽":"⋽","⫽⃥":"⫽⃥","∂̸":"∂̸","⨔":"⨔","↛":"↛","⤳̸":"⤳̸","↝̸":"↝̸","𝓃":"𝓃","⊄":"⊄","⫅̸":"⫅̸","⊅":"⊅","⫆̸":"⫆̸","ñ":"ñ","ν":"ν","#":"#","№":"№"," ":" ","⊭":"⊭","⤄":"⤄","≍⃒":"≍⃒","⊬":"⊬","≥⃒":"≥⃒",">⃒":">⃒","⧞":"⧞","⤂":"⤂","≤⃒":"≤⃒","<⃒":"<⃒","⊴⃒":"⊴⃒","⤃":"⤃","⊵⃒":"⊵⃒","∼⃒":"∼⃒","⇖":"⇖","⤣":"⤣","⤧":"⤧","ó":"ó","ô":"ô","о":"о","ő":"ő","⨸":"⨸","⦼":"⦼","œ":"œ","⦿":"⦿","𝔬":"𝔬","˛":"˛","ò":"ò","⧁":"⧁","⦵":"⦵","⦾":"⦾","⦻":"⦻","⧀":"⧀","ō":"ō","ω":"ω","ο":"ο","⦶":"⦶","𝕠":"𝕠","⦷":"⦷","⦹":"⦹","∨":"∨","⩝":"⩝","ℴ":"ℴ","ª":"ª","º":"º","⊶":"⊶","⩖":"⩖","⩗":"⩗","⩛":"⩛","ø":"ø","⊘":"⊘","õ":"õ","⨶":"⨶","ö":"ö","⌽":"⌽","¶":"¶","⫳":"⫳","⫽":"⫽","п":"п","%":"%",".":".","‰":"‰","‱":"‱","𝔭":"𝔭","φ":"φ","ϕ":"ϕ","☎":"☎","π":"π","ϖ":"ϖ","ℎ":"ℎ","+":"+","⨣":"⨣","⨢":"⨢","⨥":"⨥","⩲":"⩲","⨦":"⨦","⨧":"⨧","⨕":"⨕","𝕡":"𝕡","£":"£","⪳":"⪳","⪷":"⪷","⪹":"⪹","⪵":"⪵","⋨":"⋨","′":"′","⌮":"⌮","⌒":"⌒","⌓":"⌓","⊰":"⊰","𝓅":"𝓅","ψ":"ψ"," ":" ","𝔮":"𝔮","𝕢":"𝕢","⁗":"⁗","𝓆":"𝓆","⨖":"⨖","?":"?","⤜":"⤜","⥤":"⥤","∽̱":"∽̱","ŕ":"ŕ","⦳":"⦳","⦒":"⦒","⦥":"⦥","»":"»","⥵":"⥵","⤠":"⤠","⤳":"⤳","⤞":"⤞","⥅":"⥅","⥴":"⥴","↣":"↣","↝":"↝","⤚":"⤚","∶":"∶","❳":"❳","}":"}","]":"]","⦌":"⦌","⦎":"⦎","⦐":"⦐","ř":"ř","ŗ":"ŗ","р":"р","⤷":"⤷","⥩":"⥩","↳":"↳","▭":"▭","⥽":"⥽","𝔯":"𝔯","⥬":"⥬","ρ":"ρ","ϱ":"ϱ","⇉":"⇉","⋌":"⋌","˚":"˚","‏":"‏","⎱":"⎱","⫮":"⫮","⟭":"⟭","⇾":"⇾","⦆":"⦆","𝕣":"𝕣","⨮":"⨮","⨵":"⨵",")":")","⦔":"⦔","⨒":"⨒","›":"›","𝓇":"𝓇","⋊":"⋊","▹":"▹","⧎":"⧎","⥨":"⥨","℞":"℞","ś":"ś","⪴":"⪴","⪸":"⪸","š":"š","ş":"ş","ŝ":"ŝ","⪶":"⪶","⪺":"⪺","⋩":"⋩","⨓":"⨓","с":"с","⋅":"⋅","⩦":"⩦","⇘":"⇘","§":"§",";":";","⤩":"⤩","✶":"✶","𝔰":"𝔰","♯":"♯","щ":"щ","ш":"ш","­":"­","σ":"σ","ς":"ς","⩪":"⩪","⪞":"⪞","⪠":"⪠","⪝":"⪝","⪟":"⪟","≆":"≆","⨤":"⨤","⥲":"⥲","⨳":"⨳","⧤":"⧤","⌣":"⌣","⪪":"⪪","⪬":"⪬","⪬︀":"⪬︀","ь":"ь","/":"/","⧄":"⧄","⌿":"⌿","𝕤":"𝕤","♠":"♠","⊓︀":"⊓︀","⊔︀":"⊔︀","𝓈":"𝓈","☆":"☆","⊂":"⊂","⫅":"⫅","⪽":"⪽","⫃":"⫃","⫁":"⫁","⫋":"⫋","⊊":"⊊","⪿":"⪿","⥹":"⥹","⫇":"⫇","⫕":"⫕","⫓":"⫓","♪":"♪","¹":"¹","²":"²","³":"³","⫆":"⫆","⪾":"⪾","⫘":"⫘","⫄":"⫄","⟉":"⟉","⫗":"⫗","⥻":"⥻","⫂":"⫂","⫌":"⫌","⊋":"⊋","⫀":"⫀","⫈":"⫈","⫔":"⫔","⫖":"⫖","⇙":"⇙","⤪":"⤪","ß":"ß","⌖":"⌖","τ":"τ","ť":"ť","ţ":"ţ","т":"т","⌕":"⌕","𝔱":"𝔱","θ":"θ","ϑ":"ϑ","þ":"þ","×":"×","⨱":"⨱","⨰":"⨰","⌶":"⌶","⫱":"⫱","𝕥":"𝕥","⫚":"⫚","‴":"‴","▵":"▵","≜":"≜","◬":"◬","⨺":"⨺","⨹":"⨹","⧍":"⧍","⨻":"⨻","⏢":"⏢","𝓉":"𝓉","ц":"ц","ћ":"ћ","ŧ":"ŧ","⥣":"⥣","ú":"ú","ў":"ў","ŭ":"ŭ","û":"û","у":"у","ű":"ű","⥾":"⥾","𝔲":"𝔲","ù":"ù","▀":"▀","⌜":"⌜","⌏":"⌏","◸":"◸","ū":"ū","ų":"ų","𝕦":"𝕦","υ":"υ","⇈":"⇈","⌝":"⌝","⌎":"⌎","ů":"ů","◹":"◹","𝓊":"𝓊","⋰":"⋰","ũ":"ũ","ü":"ü","⦧":"⦧","⫨":"⫨","⫩":"⫩","⦜":"⦜","⊊︀":"⊊︀","⫋︀":"⫋︀","⊋︀":"⊋︀","⫌︀":"⫌︀","в":"в","⊻":"⊻","≚":"≚","⋮":"⋮","𝔳":"𝔳","𝕧":"𝕧","𝓋":"𝓋","⦚":"⦚","ŵ":"ŵ","⩟":"⩟","≙":"≙","℘":"℘","𝔴":"𝔴","𝕨":"𝕨","𝓌":"𝓌","𝔵":"𝔵","ξ":"ξ","⋻":"⋻","𝕩":"𝕩","𝓍":"𝓍","ý":"ý","я":"я","ŷ":"ŷ","ы":"ы","¥":"¥","𝔶":"𝔶","ї":"ї","𝕪":"𝕪","𝓎":"𝓎","ю":"ю","ÿ":"ÿ","ź":"ź","ž":"ž","з":"з","ż":"ż","ζ":"ζ","𝔷":"𝔷","ж":"ж","⇝":"⇝","𝕫":"𝕫","𝓏":"𝓏","‍":"‍","‌":"‌"}}}; - -/***/ }), - -/***/ "./node_modules/html-entities/lib/numeric-unicode-map.js": -/*!***************************************************************!*\ - !*** ./node_modules/html-entities/lib/numeric-unicode-map.js ***! - \***************************************************************/ -/***/ (function(__unused_webpack_module, exports) { - -"use strict"; -Object.defineProperty(exports, "__esModule", ({value:true}));exports.numericUnicodeMap={0:65533,128:8364,130:8218,131:402,132:8222,133:8230,134:8224,135:8225,136:710,137:8240,138:352,139:8249,140:338,142:381,145:8216,146:8217,147:8220,148:8221,149:8226,150:8211,151:8212,152:732,153:8482,154:353,155:8250,156:339,158:382,159:376}; - -/***/ }), - -/***/ "./node_modules/html-entities/lib/surrogate-pairs.js": -/*!***********************************************************!*\ - !*** ./node_modules/html-entities/lib/surrogate-pairs.js ***! - \***********************************************************/ -/***/ (function(__unused_webpack_module, exports) { - -"use strict"; -Object.defineProperty(exports, "__esModule", ({value:true}));exports.fromCodePoint=String.fromCodePoint||function(astralCodePoint){return String.fromCharCode(Math.floor((astralCodePoint-65536)/1024)+55296,(astralCodePoint-65536)%1024+56320)};exports.getCodePoint=String.prototype.codePointAt?function(input,position){return input.codePointAt(position)}:function(input,position){return(input.charCodeAt(position)-55296)*1024+input.charCodeAt(position+1)-56320+65536};exports.highSurrogateFrom=55296;exports.highSurrogateTo=56319; - -/***/ }), - -/***/ "./node_modules/webpack-dev-server/client/clients/WebSocketClient.js": -/*!***************************************************************************!*\ - !*** ./node_modules/webpack-dev-server/client/clients/WebSocketClient.js ***! - \***************************************************************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ WebSocketClient; } -/* harmony export */ }); -/* harmony import */ var _utils_log_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils/log.js */ "./node_modules/webpack-dev-server/client/utils/log.js"); -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } - -function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } - - - -var WebSocketClient = /*#__PURE__*/function () { - /** - * @param {string} url - */ - function WebSocketClient(url) { - _classCallCheck(this, WebSocketClient); - - this.client = new WebSocket(url); - - this.client.onerror = function (error) { - _utils_log_js__WEBPACK_IMPORTED_MODULE_0__.log.error(error); - }; - } - /** - * @param {(...args: any[]) => void} f - */ - - - _createClass(WebSocketClient, [{ - key: "onOpen", - value: function onOpen(f) { - this.client.onopen = f; - } - /** - * @param {(...args: any[]) => void} f - */ - - }, { - key: "onClose", - value: function onClose(f) { - this.client.onclose = f; - } // call f with the message string as the first argument - - /** - * @param {(...args: any[]) => void} f - */ - - }, { - key: "onMessage", - value: function onMessage(f) { - this.client.onmessage = function (e) { - f(e.data); - }; - } - }]); - - return WebSocketClient; -}(); - - - -/***/ }), - -/***/ "./node_modules/webpack-dev-server/client/index.js?protocol=ws%3A&hostname=localhost&port=8081&pathname=%2Fws&logging=none&reconnect=10": -/*!**********************************************************************************************************************************************!*\ - !*** ./node_modules/webpack-dev-server/client/index.js?protocol=ws%3A&hostname=localhost&port=8081&pathname=%2Fws&logging=none&reconnect=10 ***! - \**********************************************************************************************************************************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { - -"use strict"; -var __resourceQuery = "?protocol=ws%3A&hostname=localhost&port=8081&pathname=%2Fws&logging=none&reconnect=10"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var webpack_hot_log_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! webpack/hot/log.js */ "./node_modules/webpack/hot/log.js"); -/* harmony import */ var webpack_hot_log_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(webpack_hot_log_js__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _utils_stripAnsi_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils/stripAnsi.js */ "./node_modules/webpack-dev-server/client/utils/stripAnsi.js"); -/* harmony import */ var _utils_parseURL_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utils/parseURL.js */ "./node_modules/webpack-dev-server/client/utils/parseURL.js"); -/* harmony import */ var _socket_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./socket.js */ "./node_modules/webpack-dev-server/client/socket.js"); -/* harmony import */ var _overlay_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./overlay.js */ "./node_modules/webpack-dev-server/client/overlay.js"); -/* harmony import */ var _utils_log_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./utils/log.js */ "./node_modules/webpack-dev-server/client/utils/log.js"); -/* harmony import */ var _utils_sendMessage_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./utils/sendMessage.js */ "./node_modules/webpack-dev-server/client/utils/sendMessage.js"); -/* harmony import */ var _utils_reloadApp_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./utils/reloadApp.js */ "./node_modules/webpack-dev-server/client/utils/reloadApp.js"); -/* harmony import */ var _utils_createSocketURL_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./utils/createSocketURL.js */ "./node_modules/webpack-dev-server/client/utils/createSocketURL.js"); -/* global __resourceQuery, __webpack_hash__ */ -/// - - - - - - - - - -/** - * @typedef {Object} Options - * @property {boolean} hot - * @property {boolean} liveReload - * @property {boolean} progress - * @property {boolean | { warnings?: boolean, errors?: boolean, trustedTypesPolicyName?: string }} overlay - * @property {string} [logging] - * @property {number} [reconnect] - */ - -/** - * @typedef {Object} Status - * @property {boolean} isUnloading - * @property {string} currentHash - * @property {string} [previousHash] - */ - -/** - * @type {Status} - */ - -var status = { - isUnloading: false, - // TODO Workaround for webpack v4, `__webpack_hash__` is not replaced without HotModuleReplacement - // eslint-disable-next-line camelcase - currentHash: true ? __webpack_require__.h() : 0 -}; -/** @type {Options} */ - -var options = { - hot: false, - liveReload: false, - progress: false, - overlay: false -}; -var parsedResourceQuery = (0,_utils_parseURL_js__WEBPACK_IMPORTED_MODULE_2__["default"])(__resourceQuery); - -if (parsedResourceQuery.hot === "true") { - options.hot = true; - _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.info("Hot Module Replacement enabled."); -} - -if (parsedResourceQuery["live-reload"] === "true") { - options.liveReload = true; - _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.info("Live Reloading enabled."); -} - -if (parsedResourceQuery.logging) { - options.logging = parsedResourceQuery.logging; -} - -if (typeof parsedResourceQuery.reconnect !== "undefined") { - options.reconnect = Number(parsedResourceQuery.reconnect); -} -/** - * @param {string} level - */ - - -function setAllLogLevel(level) { - // This is needed because the HMR logger operate separately from dev server logger - webpack_hot_log_js__WEBPACK_IMPORTED_MODULE_0___default().setLogLevel(level === "verbose" || level === "log" ? "info" : level); - (0,_utils_log_js__WEBPACK_IMPORTED_MODULE_5__.setLogLevel)(level); -} - -if (options.logging) { - setAllLogLevel(options.logging); -} - -self.addEventListener("beforeunload", function () { - status.isUnloading = true; -}); -var onSocketMessage = { - hot: function hot() { - if (parsedResourceQuery.hot === "false") { - return; - } - - options.hot = true; - _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.info("Hot Module Replacement enabled."); - }, - liveReload: function liveReload() { - if (parsedResourceQuery["live-reload"] === "false") { - return; - } - - options.liveReload = true; - _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.info("Live Reloading enabled."); - }, - invalid: function invalid() { - _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.info("App updated. Recompiling..."); // Fixes #1042. overlay doesn't clear if errors are fixed but warnings remain. - - if (options.overlay) { - (0,_overlay_js__WEBPACK_IMPORTED_MODULE_4__.hide)(); - } - - (0,_utils_sendMessage_js__WEBPACK_IMPORTED_MODULE_6__["default"])("Invalid"); - }, - - /** - * @param {string} hash - */ - hash: function hash(_hash) { - status.previousHash = status.currentHash; - status.currentHash = _hash; - }, - logging: setAllLogLevel, - - /** - * @param {boolean} value - */ - overlay: function overlay(value) { - if (typeof document === "undefined") { - return; - } - - options.overlay = value; - }, - - /** - * @param {number} value - */ - reconnect: function reconnect(value) { - if (parsedResourceQuery.reconnect === "false") { - return; - } - - options.reconnect = value; - }, - - /** - * @param {boolean} value - */ - progress: function progress(value) { - options.progress = value; - }, - - /** - * @param {{ pluginName?: string, percent: number, msg: string }} data - */ - "progress-update": function progressUpdate(data) { - if (options.progress) { - _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.info("".concat(data.pluginName ? "[".concat(data.pluginName, "] ") : "").concat(data.percent, "% - ").concat(data.msg, ".")); - } - - (0,_utils_sendMessage_js__WEBPACK_IMPORTED_MODULE_6__["default"])("Progress", data); - }, - "still-ok": function stillOk() { - _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.info("Nothing changed."); - - if (options.overlay) { - (0,_overlay_js__WEBPACK_IMPORTED_MODULE_4__.hide)(); - } - - (0,_utils_sendMessage_js__WEBPACK_IMPORTED_MODULE_6__["default"])("StillOk"); - }, - ok: function ok() { - (0,_utils_sendMessage_js__WEBPACK_IMPORTED_MODULE_6__["default"])("Ok"); - - if (options.overlay) { - (0,_overlay_js__WEBPACK_IMPORTED_MODULE_4__.hide)(); - } - - (0,_utils_reloadApp_js__WEBPACK_IMPORTED_MODULE_7__["default"])(options, status); - }, - // TODO: remove in v5 in favor of 'static-changed' - - /** - * @param {string} file - */ - "content-changed": function contentChanged(file) { - _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.info("".concat(file ? "\"".concat(file, "\"") : "Content", " from static directory was changed. Reloading...")); - self.location.reload(); - }, - - /** - * @param {string} file - */ - "static-changed": function staticChanged(file) { - _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.info("".concat(file ? "\"".concat(file, "\"") : "Content", " from static directory was changed. Reloading...")); - self.location.reload(); - }, - - /** - * @param {Error[]} warnings - * @param {any} params - */ - warnings: function warnings(_warnings, params) { - _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.warn("Warnings while compiling."); - - var printableWarnings = _warnings.map(function (error) { - var _formatProblem = (0,_overlay_js__WEBPACK_IMPORTED_MODULE_4__.formatProblem)("warning", error), - header = _formatProblem.header, - body = _formatProblem.body; - - return "".concat(header, "\n").concat((0,_utils_stripAnsi_js__WEBPACK_IMPORTED_MODULE_1__["default"])(body)); - }); - - (0,_utils_sendMessage_js__WEBPACK_IMPORTED_MODULE_6__["default"])("Warnings", printableWarnings); - - for (var i = 0; i < printableWarnings.length; i++) { - _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.warn(printableWarnings[i]); - } - - var needShowOverlayForWarnings = typeof options.overlay === "boolean" ? options.overlay : options.overlay && options.overlay.warnings; - - if (needShowOverlayForWarnings) { - var trustedTypesPolicyName = typeof options.overlay === "object" && options.overlay.trustedTypesPolicyName; - (0,_overlay_js__WEBPACK_IMPORTED_MODULE_4__.show)("warning", _warnings, trustedTypesPolicyName || null); - } - - if (params && params.preventReloading) { - return; - } - - (0,_utils_reloadApp_js__WEBPACK_IMPORTED_MODULE_7__["default"])(options, status); - }, - - /** - * @param {Error[]} errors - */ - errors: function errors(_errors) { - _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.error("Errors while compiling. Reload prevented."); - - var printableErrors = _errors.map(function (error) { - var _formatProblem2 = (0,_overlay_js__WEBPACK_IMPORTED_MODULE_4__.formatProblem)("error", error), - header = _formatProblem2.header, - body = _formatProblem2.body; - - return "".concat(header, "\n").concat((0,_utils_stripAnsi_js__WEBPACK_IMPORTED_MODULE_1__["default"])(body)); - }); - - (0,_utils_sendMessage_js__WEBPACK_IMPORTED_MODULE_6__["default"])("Errors", printableErrors); - - for (var i = 0; i < printableErrors.length; i++) { - _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.error(printableErrors[i]); - } - - var needShowOverlayForErrors = typeof options.overlay === "boolean" ? options.overlay : options.overlay && options.overlay.errors; - - if (needShowOverlayForErrors) { - var trustedTypesPolicyName = typeof options.overlay === "object" && options.overlay.trustedTypesPolicyName; - (0,_overlay_js__WEBPACK_IMPORTED_MODULE_4__.show)("error", _errors, trustedTypesPolicyName || null); - } - }, - - /** - * @param {Error} error - */ - error: function error(_error) { - _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.error(_error); - }, - close: function close() { - _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.info("Disconnected!"); - - if (options.overlay) { - (0,_overlay_js__WEBPACK_IMPORTED_MODULE_4__.hide)(); - } - - (0,_utils_sendMessage_js__WEBPACK_IMPORTED_MODULE_6__["default"])("Close"); - } -}; -var socketURL = (0,_utils_createSocketURL_js__WEBPACK_IMPORTED_MODULE_8__["default"])(parsedResourceQuery); -(0,_socket_js__WEBPACK_IMPORTED_MODULE_3__["default"])(socketURL, onSocketMessage, options.reconnect); - -/***/ }), - -/***/ "./node_modules/webpack-dev-server/client/modules/logger/index.js": -/*!************************************************************************!*\ - !*** ./node_modules/webpack-dev-server/client/modules/logger/index.js ***! - \************************************************************************/ -/***/ (function(__unused_webpack_module, exports) { - -/******/ (function() { // webpackBootstrap -/******/ "use strict"; -/******/ var __webpack_modules__ = ({ - -/***/ "./client-src/modules/logger/SyncBailHookFake.js": -/*!*******************************************************!*\ - !*** ./client-src/modules/logger/SyncBailHookFake.js ***! - \*******************************************************/ -/***/ (function(module) { - - -/** - * Client stub for tapable SyncBailHook - */ - -module.exports = function clientTapableSyncBailHook() { - return { - call: function call() {} - }; -}; - -/***/ }), - -/***/ "./node_modules/webpack/lib/logging/Logger.js": -/*!****************************************************!*\ - !*** ./node_modules/webpack/lib/logging/Logger.js ***! - \****************************************************/ -/***/ (function(__unused_webpack_module, exports) { - -/* - MIT License http://www.opensource.org/licenses/mit-license.php - Author Tobias Koppers @sokra -*/ - - -function _toConsumableArray(arr) { - return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); -} - -function _nonIterableSpread() { - throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); -} - -function _unsupportedIterableToArray(o, minLen) { - if (!o) return; - if (typeof o === "string") return _arrayLikeToArray(o, minLen); - var n = Object.prototype.toString.call(o).slice(8, -1); - if (n === "Object" && o.constructor) n = o.constructor.name; - if (n === "Map" || n === "Set") return Array.from(o); - if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); -} - -function _iterableToArray(iter) { - if (typeof (typeof Symbol !== "undefined" ? Symbol : function (i) { return i; }) !== "undefined" && iter[(typeof Symbol !== "undefined" ? Symbol : function (i) { return i; }).iterator] != null || iter["@@iterator"] != null) return Array.from(iter); -} - -function _arrayWithoutHoles(arr) { - if (Array.isArray(arr)) return _arrayLikeToArray(arr); -} - -function _arrayLikeToArray(arr, len) { - if (len == null || len > arr.length) len = arr.length; - - for (var i = 0, arr2 = new Array(len); i < len; i++) { - arr2[i] = arr[i]; - } - - return arr2; -} - -function _classCallCheck(instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a function"); - } -} - -function _defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i]; - descriptor.enumerable = descriptor.enumerable || false; - descriptor.configurable = true; - if ("value" in descriptor) descriptor.writable = true; - Object.defineProperty(target, descriptor.key, descriptor); - } -} - -function _createClass(Constructor, protoProps, staticProps) { - if (protoProps) _defineProperties(Constructor.prototype, protoProps); - if (staticProps) _defineProperties(Constructor, staticProps); - Object.defineProperty(Constructor, "prototype", { - writable: false - }); - return Constructor; -} - -var LogType = Object.freeze({ - error: - /** @type {"error"} */ - "error", - // message, c style arguments - warn: - /** @type {"warn"} */ - "warn", - // message, c style arguments - info: - /** @type {"info"} */ - "info", - // message, c style arguments - log: - /** @type {"log"} */ - "log", - // message, c style arguments - debug: - /** @type {"debug"} */ - "debug", - // message, c style arguments - trace: - /** @type {"trace"} */ - "trace", - // no arguments - group: - /** @type {"group"} */ - "group", - // [label] - groupCollapsed: - /** @type {"groupCollapsed"} */ - "groupCollapsed", - // [label] - groupEnd: - /** @type {"groupEnd"} */ - "groupEnd", - // [label] - profile: - /** @type {"profile"} */ - "profile", - // [profileName] - profileEnd: - /** @type {"profileEnd"} */ - "profileEnd", - // [profileName] - time: - /** @type {"time"} */ - "time", - // name, time as [seconds, nanoseconds] - clear: - /** @type {"clear"} */ - "clear", - // no arguments - status: - /** @type {"status"} */ - "status" // message, arguments - -}); -exports.LogType = LogType; -/** @typedef {typeof LogType[keyof typeof LogType]} LogTypeEnum */ - -var LOG_SYMBOL = (typeof Symbol !== "undefined" ? Symbol : function (i) { return i; })("webpack logger raw log method"); -var TIMERS_SYMBOL = (typeof Symbol !== "undefined" ? Symbol : function (i) { return i; })("webpack logger times"); -var TIMERS_AGGREGATES_SYMBOL = (typeof Symbol !== "undefined" ? Symbol : function (i) { return i; })("webpack logger aggregated times"); - -var WebpackLogger = /*#__PURE__*/function () { - /** - * @param {function(LogTypeEnum, any[]=): void} log log function - * @param {function(string | function(): string): WebpackLogger} getChildLogger function to create child logger - */ - function WebpackLogger(log, getChildLogger) { - _classCallCheck(this, WebpackLogger); - - this[LOG_SYMBOL] = log; - this.getChildLogger = getChildLogger; - } - - _createClass(WebpackLogger, [{ - key: "error", - value: function error() { - for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { - args[_key] = arguments[_key]; - } - - this[LOG_SYMBOL](LogType.error, args); - } - }, { - key: "warn", - value: function warn() { - for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { - args[_key2] = arguments[_key2]; - } - - this[LOG_SYMBOL](LogType.warn, args); - } - }, { - key: "info", - value: function info() { - for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) { - args[_key3] = arguments[_key3]; - } - - this[LOG_SYMBOL](LogType.info, args); - } - }, { - key: "log", - value: function log() { - for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) { - args[_key4] = arguments[_key4]; - } - - this[LOG_SYMBOL](LogType.log, args); - } - }, { - key: "debug", - value: function debug() { - for (var _len5 = arguments.length, args = new Array(_len5), _key5 = 0; _key5 < _len5; _key5++) { - args[_key5] = arguments[_key5]; - } - - this[LOG_SYMBOL](LogType.debug, args); - } - }, { - key: "assert", - value: function assert(assertion) { - if (!assertion) { - for (var _len6 = arguments.length, args = new Array(_len6 > 1 ? _len6 - 1 : 0), _key6 = 1; _key6 < _len6; _key6++) { - args[_key6 - 1] = arguments[_key6]; - } - - this[LOG_SYMBOL](LogType.error, args); - } - } - }, { - key: "trace", - value: function trace() { - this[LOG_SYMBOL](LogType.trace, ["Trace"]); - } - }, { - key: "clear", - value: function clear() { - this[LOG_SYMBOL](LogType.clear); - } - }, { - key: "status", - value: function status() { - for (var _len7 = arguments.length, args = new Array(_len7), _key7 = 0; _key7 < _len7; _key7++) { - args[_key7] = arguments[_key7]; - } - - this[LOG_SYMBOL](LogType.status, args); - } - }, { - key: "group", - value: function group() { - for (var _len8 = arguments.length, args = new Array(_len8), _key8 = 0; _key8 < _len8; _key8++) { - args[_key8] = arguments[_key8]; - } - - this[LOG_SYMBOL](LogType.group, args); - } - }, { - key: "groupCollapsed", - value: function groupCollapsed() { - for (var _len9 = arguments.length, args = new Array(_len9), _key9 = 0; _key9 < _len9; _key9++) { - args[_key9] = arguments[_key9]; - } - - this[LOG_SYMBOL](LogType.groupCollapsed, args); - } - }, { - key: "groupEnd", - value: function groupEnd() { - for (var _len10 = arguments.length, args = new Array(_len10), _key10 = 0; _key10 < _len10; _key10++) { - args[_key10] = arguments[_key10]; - } - - this[LOG_SYMBOL](LogType.groupEnd, args); - } - }, { - key: "profile", - value: function profile(label) { - this[LOG_SYMBOL](LogType.profile, [label]); - } - }, { - key: "profileEnd", - value: function profileEnd(label) { - this[LOG_SYMBOL](LogType.profileEnd, [label]); - } - }, { - key: "time", - value: function time(label) { - this[TIMERS_SYMBOL] = this[TIMERS_SYMBOL] || new Map(); - this[TIMERS_SYMBOL].set(label, process.hrtime()); - } - }, { - key: "timeLog", - value: function timeLog(label) { - var prev = this[TIMERS_SYMBOL] && this[TIMERS_SYMBOL].get(label); - - if (!prev) { - throw new Error("No such label '".concat(label, "' for WebpackLogger.timeLog()")); - } - - var time = process.hrtime(prev); - this[LOG_SYMBOL](LogType.time, [label].concat(_toConsumableArray(time))); - } - }, { - key: "timeEnd", - value: function timeEnd(label) { - var prev = this[TIMERS_SYMBOL] && this[TIMERS_SYMBOL].get(label); - - if (!prev) { - throw new Error("No such label '".concat(label, "' for WebpackLogger.timeEnd()")); - } - - var time = process.hrtime(prev); - this[TIMERS_SYMBOL].delete(label); - this[LOG_SYMBOL](LogType.time, [label].concat(_toConsumableArray(time))); - } - }, { - key: "timeAggregate", - value: function timeAggregate(label) { - var prev = this[TIMERS_SYMBOL] && this[TIMERS_SYMBOL].get(label); - - if (!prev) { - throw new Error("No such label '".concat(label, "' for WebpackLogger.timeAggregate()")); - } - - var time = process.hrtime(prev); - this[TIMERS_SYMBOL].delete(label); - this[TIMERS_AGGREGATES_SYMBOL] = this[TIMERS_AGGREGATES_SYMBOL] || new Map(); - var current = this[TIMERS_AGGREGATES_SYMBOL].get(label); - - if (current !== undefined) { - if (time[1] + current[1] > 1e9) { - time[0] += current[0] + 1; - time[1] = time[1] - 1e9 + current[1]; - } else { - time[0] += current[0]; - time[1] += current[1]; - } - } - - this[TIMERS_AGGREGATES_SYMBOL].set(label, time); - } - }, { - key: "timeAggregateEnd", - value: function timeAggregateEnd(label) { - if (this[TIMERS_AGGREGATES_SYMBOL] === undefined) return; - var time = this[TIMERS_AGGREGATES_SYMBOL].get(label); - if (time === undefined) return; - this[TIMERS_AGGREGATES_SYMBOL].delete(label); - this[LOG_SYMBOL](LogType.time, [label].concat(_toConsumableArray(time))); - } - }]); - - return WebpackLogger; -}(); - -exports.Logger = WebpackLogger; - -/***/ }), - -/***/ "./node_modules/webpack/lib/logging/createConsoleLogger.js": -/*!*****************************************************************!*\ - !*** ./node_modules/webpack/lib/logging/createConsoleLogger.js ***! - \*****************************************************************/ -/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_10785__) { - -/* - MIT License http://www.opensource.org/licenses/mit-license.php - Author Tobias Koppers @sokra -*/ - - -function _toConsumableArray(arr) { - return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); -} - -function _nonIterableSpread() { - throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); -} - -function _unsupportedIterableToArray(o, minLen) { - if (!o) return; - if (typeof o === "string") return _arrayLikeToArray(o, minLen); - var n = Object.prototype.toString.call(o).slice(8, -1); - if (n === "Object" && o.constructor) n = o.constructor.name; - if (n === "Map" || n === "Set") return Array.from(o); - if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); -} - -function _iterableToArray(iter) { - if (typeof (typeof Symbol !== "undefined" ? Symbol : function (i) { return i; }) !== "undefined" && iter[(typeof Symbol !== "undefined" ? Symbol : function (i) { return i; }).iterator] != null || iter["@@iterator"] != null) return Array.from(iter); -} - -function _arrayWithoutHoles(arr) { - if (Array.isArray(arr)) return _arrayLikeToArray(arr); -} - -function _arrayLikeToArray(arr, len) { - if (len == null || len > arr.length) len = arr.length; - - for (var i = 0, arr2 = new Array(len); i < len; i++) { - arr2[i] = arr[i]; - } - - return arr2; -} - -var _require = __nested_webpack_require_10785__(/*! ./Logger */ "./node_modules/webpack/lib/logging/Logger.js"), - LogType = _require.LogType; -/** @typedef {import("../../declarations/WebpackOptions").FilterItemTypes} FilterItemTypes */ - -/** @typedef {import("../../declarations/WebpackOptions").FilterTypes} FilterTypes */ - -/** @typedef {import("./Logger").LogTypeEnum} LogTypeEnum */ - -/** @typedef {function(string): boolean} FilterFunction */ - -/** - * @typedef {Object} LoggerConsole - * @property {function(): void} clear - * @property {function(): void} trace - * @property {(...args: any[]) => void} info - * @property {(...args: any[]) => void} log - * @property {(...args: any[]) => void} warn - * @property {(...args: any[]) => void} error - * @property {(...args: any[]) => void=} debug - * @property {(...args: any[]) => void=} group - * @property {(...args: any[]) => void=} groupCollapsed - * @property {(...args: any[]) => void=} groupEnd - * @property {(...args: any[]) => void=} status - * @property {(...args: any[]) => void=} profile - * @property {(...args: any[]) => void=} profileEnd - * @property {(...args: any[]) => void=} logTime - */ - -/** - * @typedef {Object} LoggerOptions - * @property {false|true|"none"|"error"|"warn"|"info"|"log"|"verbose"} level loglevel - * @property {FilterTypes|boolean} debug filter for debug logging - * @property {LoggerConsole} console the console to log to - */ - -/** - * @param {FilterItemTypes} item an input item - * @returns {FilterFunction} filter function - */ - - -var filterToFunction = function filterToFunction(item) { - if (typeof item === "string") { - var regExp = new RegExp("[\\\\/]".concat(item.replace( // eslint-disable-next-line no-useless-escape - /[-[\]{}()*+?.\\^$|]/g, "\\$&"), "([\\\\/]|$|!|\\?)")); - return function (ident) { - return regExp.test(ident); - }; - } - - if (item && typeof item === "object" && typeof item.test === "function") { - return function (ident) { - return item.test(ident); - }; - } - - if (typeof item === "function") { - return item; - } - - if (typeof item === "boolean") { - return function () { - return item; - }; - } -}; -/** - * @enum {number} - */ - - -var LogLevel = { - none: 6, - false: 6, - error: 5, - warn: 4, - info: 3, - log: 2, - true: 2, - verbose: 1 -}; -/** - * @param {LoggerOptions} options options object - * @returns {function(string, LogTypeEnum, any[]): void} logging function - */ - -module.exports = function (_ref) { - var _ref$level = _ref.level, - level = _ref$level === void 0 ? "info" : _ref$level, - _ref$debug = _ref.debug, - debug = _ref$debug === void 0 ? false : _ref$debug, - console = _ref.console; - var debugFilters = typeof debug === "boolean" ? [function () { - return debug; - }] : - /** @type {FilterItemTypes[]} */ - [].concat(debug).map(filterToFunction); - /** @type {number} */ - - var loglevel = LogLevel["".concat(level)] || 0; - /** - * @param {string} name name of the logger - * @param {LogTypeEnum} type type of the log entry - * @param {any[]} args arguments of the log entry - * @returns {void} - */ - - var logger = function logger(name, type, args) { - var labeledArgs = function labeledArgs() { - if (Array.isArray(args)) { - if (args.length > 0 && typeof args[0] === "string") { - return ["[".concat(name, "] ").concat(args[0])].concat(_toConsumableArray(args.slice(1))); - } else { - return ["[".concat(name, "]")].concat(_toConsumableArray(args)); - } - } else { - return []; - } - }; - - var debug = debugFilters.some(function (f) { - return f(name); - }); - - switch (type) { - case LogType.debug: - if (!debug) return; // eslint-disable-next-line node/no-unsupported-features/node-builtins - - if (typeof console.debug === "function") { - // eslint-disable-next-line node/no-unsupported-features/node-builtins - console.debug.apply(console, _toConsumableArray(labeledArgs())); - } else { - console.log.apply(console, _toConsumableArray(labeledArgs())); - } - - break; - - case LogType.log: - if (!debug && loglevel > LogLevel.log) return; - console.log.apply(console, _toConsumableArray(labeledArgs())); - break; - - case LogType.info: - if (!debug && loglevel > LogLevel.info) return; - console.info.apply(console, _toConsumableArray(labeledArgs())); - break; - - case LogType.warn: - if (!debug && loglevel > LogLevel.warn) return; - console.warn.apply(console, _toConsumableArray(labeledArgs())); - break; - - case LogType.error: - if (!debug && loglevel > LogLevel.error) return; - console.error.apply(console, _toConsumableArray(labeledArgs())); - break; - - case LogType.trace: - if (!debug) return; - console.trace(); - break; - - case LogType.groupCollapsed: - if (!debug && loglevel > LogLevel.log) return; - - if (!debug && loglevel > LogLevel.verbose) { - // eslint-disable-next-line node/no-unsupported-features/node-builtins - if (typeof console.groupCollapsed === "function") { - // eslint-disable-next-line node/no-unsupported-features/node-builtins - console.groupCollapsed.apply(console, _toConsumableArray(labeledArgs())); - } else { - console.log.apply(console, _toConsumableArray(labeledArgs())); - } - - break; - } - - // falls through - - case LogType.group: - if (!debug && loglevel > LogLevel.log) return; // eslint-disable-next-line node/no-unsupported-features/node-builtins - - if (typeof console.group === "function") { - // eslint-disable-next-line node/no-unsupported-features/node-builtins - console.group.apply(console, _toConsumableArray(labeledArgs())); - } else { - console.log.apply(console, _toConsumableArray(labeledArgs())); - } - - break; - - case LogType.groupEnd: - if (!debug && loglevel > LogLevel.log) return; // eslint-disable-next-line node/no-unsupported-features/node-builtins - - if (typeof console.groupEnd === "function") { - // eslint-disable-next-line node/no-unsupported-features/node-builtins - console.groupEnd(); - } - - break; - - case LogType.time: - { - if (!debug && loglevel > LogLevel.log) return; - var ms = args[1] * 1000 + args[2] / 1000000; - var msg = "[".concat(name, "] ").concat(args[0], ": ").concat(ms, " ms"); - - if (typeof console.logTime === "function") { - console.logTime(msg); - } else { - console.log(msg); - } - - break; - } - - case LogType.profile: - // eslint-disable-next-line node/no-unsupported-features/node-builtins - if (typeof console.profile === "function") { - // eslint-disable-next-line node/no-unsupported-features/node-builtins - console.profile.apply(console, _toConsumableArray(labeledArgs())); - } - - break; - - case LogType.profileEnd: - // eslint-disable-next-line node/no-unsupported-features/node-builtins - if (typeof console.profileEnd === "function") { - // eslint-disable-next-line node/no-unsupported-features/node-builtins - console.profileEnd.apply(console, _toConsumableArray(labeledArgs())); - } - - break; - - case LogType.clear: - if (!debug && loglevel > LogLevel.log) return; // eslint-disable-next-line node/no-unsupported-features/node-builtins - - if (typeof console.clear === "function") { - // eslint-disable-next-line node/no-unsupported-features/node-builtins - console.clear(); - } - - break; - - case LogType.status: - if (!debug && loglevel > LogLevel.info) return; - - if (typeof console.status === "function") { - if (args.length === 0) { - console.status(); - } else { - console.status.apply(console, _toConsumableArray(labeledArgs())); - } - } else { - if (args.length !== 0) { - console.info.apply(console, _toConsumableArray(labeledArgs())); - } - } - - break; - - default: - throw new Error("Unexpected LogType ".concat(type)); - } - }; - - return logger; -}; - -/***/ }), - -/***/ "./node_modules/webpack/lib/logging/runtime.js": -/*!*****************************************************!*\ - !*** ./node_modules/webpack/lib/logging/runtime.js ***! - \*****************************************************/ -/***/ (function(__unused_webpack_module, exports, __nested_webpack_require_20872__) { - -/* - MIT License http://www.opensource.org/licenses/mit-license.php - Author Tobias Koppers @sokra -*/ - - -function _extends() { - _extends = Object.assign ? Object.assign.bind() : function (target) { - for (var i = 1; i < arguments.length; i++) { - var source = arguments[i]; - - for (var key in source) { - if (Object.prototype.hasOwnProperty.call(source, key)) { - target[key] = source[key]; - } - } - } - - return target; - }; - return _extends.apply(this, arguments); -} - -var SyncBailHook = __nested_webpack_require_20872__(/*! tapable/lib/SyncBailHook */ "./client-src/modules/logger/SyncBailHookFake.js"); - -var _require = __nested_webpack_require_20872__(/*! ./Logger */ "./node_modules/webpack/lib/logging/Logger.js"), - Logger = _require.Logger; - -var createConsoleLogger = __nested_webpack_require_20872__(/*! ./createConsoleLogger */ "./node_modules/webpack/lib/logging/createConsoleLogger.js"); -/** @type {createConsoleLogger.LoggerOptions} */ - - -var currentDefaultLoggerOptions = { - level: "info", - debug: false, - console: console -}; -var currentDefaultLogger = createConsoleLogger(currentDefaultLoggerOptions); -/** - * @param {string} name name of the logger - * @returns {Logger} a logger - */ - -exports.getLogger = function (name) { - return new Logger(function (type, args) { - if (exports.hooks.log.call(name, type, args) === undefined) { - currentDefaultLogger(name, type, args); - } - }, function (childName) { - return exports.getLogger("".concat(name, "/").concat(childName)); - }); -}; -/** - * @param {createConsoleLogger.LoggerOptions} options new options, merge with old options - * @returns {void} - */ - - -exports.configureDefaultLogger = function (options) { - _extends(currentDefaultLoggerOptions, options); - - currentDefaultLogger = createConsoleLogger(currentDefaultLoggerOptions); -}; - -exports.hooks = { - log: new SyncBailHook(["origin", "type", "args"]) -}; - -/***/ }) - -/******/ }); -/************************************************************************/ -/******/ // The module cache -/******/ var __webpack_module_cache__ = {}; -/******/ -/******/ // The require function -/******/ function __nested_webpack_require_23009__(moduleId) { -/******/ // Check if module is in cache -/******/ var cachedModule = __webpack_module_cache__[moduleId]; -/******/ if (cachedModule !== undefined) { -/******/ return cachedModule.exports; -/******/ } -/******/ // Create a new module (and put it into the cache) -/******/ var module = __webpack_module_cache__[moduleId] = { -/******/ // no module.id needed -/******/ // no module.loaded needed -/******/ exports: {} -/******/ }; -/******/ -/******/ // Execute the module function -/******/ __webpack_modules__[moduleId](module, module.exports, __nested_webpack_require_23009__); -/******/ -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } -/******/ -/************************************************************************/ -/******/ /* webpack/runtime/define property getters */ -/******/ !function() { -/******/ // define getter functions for harmony exports -/******/ __nested_webpack_require_23009__.d = function(exports, definition) { -/******/ for(var key in definition) { -/******/ if(__nested_webpack_require_23009__.o(definition, key) && !__nested_webpack_require_23009__.o(exports, key)) { -/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); -/******/ } -/******/ } -/******/ }; -/******/ }(); -/******/ -/******/ /* webpack/runtime/hasOwnProperty shorthand */ -/******/ !function() { -/******/ __nested_webpack_require_23009__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); } -/******/ }(); -/******/ -/******/ /* webpack/runtime/make namespace object */ -/******/ !function() { -/******/ // define __esModule on exports -/******/ __nested_webpack_require_23009__.r = function(exports) { -/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { -/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); -/******/ } -/******/ Object.defineProperty(exports, '__esModule', { value: true }); -/******/ }; -/******/ }(); -/******/ -/************************************************************************/ -var __webpack_exports__ = {}; -// This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk. -!function() { -/*!********************************************!*\ - !*** ./client-src/modules/logger/index.js ***! - \********************************************/ -__nested_webpack_require_23009__.r(__webpack_exports__); -/* harmony export */ __nested_webpack_require_23009__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* reexport default export from named module */ webpack_lib_logging_runtime_js__WEBPACK_IMPORTED_MODULE_0__; } -/* harmony export */ }); -/* harmony import */ var webpack_lib_logging_runtime_js__WEBPACK_IMPORTED_MODULE_0__ = __nested_webpack_require_23009__(/*! webpack/lib/logging/runtime.js */ "./node_modules/webpack/lib/logging/runtime.js"); - -}(); -var __webpack_export_target__ = exports; -for(var i in __webpack_exports__) __webpack_export_target__[i] = __webpack_exports__[i]; -if(__webpack_exports__.__esModule) Object.defineProperty(__webpack_export_target__, "__esModule", { value: true }); -/******/ })() -; - -/***/ }), - -/***/ "./node_modules/webpack-dev-server/client/overlay.js": -/*!***********************************************************!*\ - !*** ./node_modules/webpack-dev-server/client/overlay.js ***! - \***********************************************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "formatProblem": function() { return /* binding */ formatProblem; }, -/* harmony export */ "hide": function() { return /* binding */ hide; }, -/* harmony export */ "show": function() { return /* binding */ show; } -/* harmony export */ }); -/* harmony import */ var ansi_html_community__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ansi-html-community */ "./node_modules/ansi-html-community/index.js"); -/* harmony import */ var ansi_html_community__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(ansi_html_community__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var html_entities__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! html-entities */ "./node_modules/html-entities/lib/index.js"); -/* harmony import */ var html_entities__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(html_entities__WEBPACK_IMPORTED_MODULE_1__); -// The error overlay is inspired (and mostly copied) from Create React App (https://github.com/facebookincubator/create-react-app) -// They, in turn, got inspired by webpack-hot-middleware (https://github.com/glenjamin/webpack-hot-middleware). - - -var colors = { - reset: ["transparent", "transparent"], - black: "181818", - red: "E36049", - green: "B3CB74", - yellow: "FFD080", - blue: "7CAFC2", - magenta: "7FACCA", - cyan: "C3C2EF", - lightgrey: "EBE7E3", - darkgrey: "6D7891" -}; -/** @type {HTMLIFrameElement | null | undefined} */ - -var iframeContainerElement; -/** @type {HTMLDivElement | null | undefined} */ - -var containerElement; -/** @type {Array<(element: HTMLDivElement) => void>} */ - -var onLoadQueue = []; -/** @type {TrustedTypePolicy | undefined} */ - -var overlayTrustedTypesPolicy; -ansi_html_community__WEBPACK_IMPORTED_MODULE_0___default().setColors(colors); -/** - * @param {string | null} trustedTypesPolicyName - */ - -function createContainer(trustedTypesPolicyName) { - // Enable Trusted Types if they are available in the current browser. - if (window.trustedTypes) { - overlayTrustedTypesPolicy = window.trustedTypes.createPolicy(trustedTypesPolicyName || "webpack-dev-server#overlay", { - createHTML: function createHTML(value) { - return value; - } - }); - } - - iframeContainerElement = document.createElement("iframe"); - iframeContainerElement.id = "webpack-dev-server-client-overlay"; - iframeContainerElement.src = "about:blank"; - iframeContainerElement.style.position = "fixed"; - iframeContainerElement.style.left = 0; - iframeContainerElement.style.top = 0; - iframeContainerElement.style.right = 0; - iframeContainerElement.style.bottom = 0; - iframeContainerElement.style.width = "100vw"; - iframeContainerElement.style.height = "100vh"; - iframeContainerElement.style.border = "none"; - iframeContainerElement.style.zIndex = 9999999999; - - iframeContainerElement.onload = function () { - containerElement = - /** @type {Document} */ - - /** @type {HTMLIFrameElement} */ - iframeContainerElement.contentDocument.createElement("div"); - containerElement.id = "webpack-dev-server-client-overlay-div"; - containerElement.style.position = "fixed"; - containerElement.style.boxSizing = "border-box"; - containerElement.style.left = 0; - containerElement.style.top = 0; - containerElement.style.right = 0; - containerElement.style.bottom = 0; - containerElement.style.width = "100vw"; - containerElement.style.height = "100vh"; - containerElement.style.backgroundColor = "rgba(0, 0, 0, 0.85)"; - containerElement.style.color = "#E8E8E8"; - containerElement.style.fontFamily = "Menlo, Consolas, monospace"; - containerElement.style.fontSize = "large"; - containerElement.style.padding = "2rem"; - containerElement.style.lineHeight = "1.2"; - containerElement.style.whiteSpace = "pre-wrap"; - containerElement.style.overflow = "auto"; - var headerElement = document.createElement("span"); - headerElement.innerText = "Compiled with problems:"; - var closeButtonElement = document.createElement("button"); - closeButtonElement.innerText = "X"; - closeButtonElement.style.background = "transparent"; - closeButtonElement.style.border = "none"; - closeButtonElement.style.fontSize = "20px"; - closeButtonElement.style.fontWeight = "bold"; - closeButtonElement.style.color = "white"; - closeButtonElement.style.cursor = "pointer"; - closeButtonElement.style.cssFloat = "right"; // @ts-ignore - - closeButtonElement.style.styleFloat = "right"; - closeButtonElement.addEventListener("click", function () { - hide(); - }); - containerElement.appendChild(headerElement); - containerElement.appendChild(closeButtonElement); - containerElement.appendChild(document.createElement("br")); - containerElement.appendChild(document.createElement("br")); - /** @type {Document} */ - - /** @type {HTMLIFrameElement} */ - iframeContainerElement.contentDocument.body.appendChild(containerElement); - onLoadQueue.forEach(function (onLoad) { - onLoad( - /** @type {HTMLDivElement} */ - containerElement); - }); - onLoadQueue = []; - /** @type {HTMLIFrameElement} */ - - iframeContainerElement.onload = null; - }; - - document.body.appendChild(iframeContainerElement); -} -/** - * @param {(element: HTMLDivElement) => void} callback - * @param {string | null} trustedTypesPolicyName - */ - - -function ensureOverlayExists(callback, trustedTypesPolicyName) { - if (containerElement) { - // Everything is ready, call the callback right away. - callback(containerElement); - return; - } - - onLoadQueue.push(callback); - - if (iframeContainerElement) { - return; - } - - createContainer(trustedTypesPolicyName); -} // Successful compilation. - - -function hide() { - if (!iframeContainerElement) { - return; - } // Clean up and reset internal state. - - - document.body.removeChild(iframeContainerElement); - iframeContainerElement = null; - containerElement = null; -} -/** - * @param {string} type - * @param {string | { file?: string, moduleName?: string, loc?: string, message?: string }} item - * @returns {{ header: string, body: string }} - */ - - -function formatProblem(type, item) { - var header = type === "warning" ? "WARNING" : "ERROR"; - var body = ""; - - if (typeof item === "string") { - body += item; - } else { - var file = item.file || ""; // eslint-disable-next-line no-nested-ternary - - var moduleName = item.moduleName ? item.moduleName.indexOf("!") !== -1 ? "".concat(item.moduleName.replace(/^(\s|\S)*!/, ""), " (").concat(item.moduleName, ")") : "".concat(item.moduleName) : ""; - var loc = item.loc; - header += "".concat(moduleName || file ? " in ".concat(moduleName ? "".concat(moduleName).concat(file ? " (".concat(file, ")") : "") : file).concat(loc ? " ".concat(loc) : "") : ""); - body += item.message || ""; - } - - return { - header: header, - body: body - }; -} // Compilation with errors (e.g. syntax error or missing modules). - -/** - * @param {string} type - * @param {Array} messages - * @param {string | null} trustedTypesPolicyName - */ - - -function show(type, messages, trustedTypesPolicyName) { - ensureOverlayExists(function () { - messages.forEach(function (message) { - var entryElement = document.createElement("div"); - var typeElement = document.createElement("span"); - - var _formatProblem = formatProblem(type, message), - header = _formatProblem.header, - body = _formatProblem.body; - - typeElement.innerText = header; - typeElement.style.color = "#".concat(colors.red); // Make it look similar to our terminal. - - var text = ansi_html_community__WEBPACK_IMPORTED_MODULE_0___default()((0,html_entities__WEBPACK_IMPORTED_MODULE_1__.encode)(body)); - var messageTextNode = document.createElement("div"); - messageTextNode.innerHTML = overlayTrustedTypesPolicy ? overlayTrustedTypesPolicy.createHTML(text) : text; - entryElement.appendChild(typeElement); - entryElement.appendChild(document.createElement("br")); - entryElement.appendChild(document.createElement("br")); - entryElement.appendChild(messageTextNode); - entryElement.appendChild(document.createElement("br")); - entryElement.appendChild(document.createElement("br")); - /** @type {HTMLDivElement} */ - - containerElement.appendChild(entryElement); - }); - }, trustedTypesPolicyName); -} - - - -/***/ }), - -/***/ "./node_modules/webpack-dev-server/client/socket.js": -/*!**********************************************************!*\ - !*** ./node_modules/webpack-dev-server/client/socket.js ***! - \**********************************************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "client": function() { return /* binding */ client; } -/* harmony export */ }); -/* harmony import */ var _clients_WebSocketClient_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./clients/WebSocketClient.js */ "./node_modules/webpack-dev-server/client/clients/WebSocketClient.js"); -/* harmony import */ var _utils_log_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils/log.js */ "./node_modules/webpack-dev-server/client/utils/log.js"); -/* provided dependency */ var __webpack_dev_server_client__ = __webpack_require__(/*! ./node_modules/webpack-dev-server/client/clients/WebSocketClient.js */ "./node_modules/webpack-dev-server/client/clients/WebSocketClient.js"); -/* global __webpack_dev_server_client__ */ - - // this WebsocketClient is here as a default fallback, in case the client is not injected - -/* eslint-disable camelcase */ - -var Client = // eslint-disable-next-line no-nested-ternary -typeof __webpack_dev_server_client__ !== "undefined" ? typeof __webpack_dev_server_client__.default !== "undefined" ? __webpack_dev_server_client__.default : __webpack_dev_server_client__ : _clients_WebSocketClient_js__WEBPACK_IMPORTED_MODULE_0__["default"]; -/* eslint-enable camelcase */ - -var retries = 0; -var maxRetries = 10; // Initialized client is exported so external consumers can utilize the same instance -// It is mutable to enforce singleton -// eslint-disable-next-line import/no-mutable-exports - -var client = null; -/** - * @param {string} url - * @param {{ [handler: string]: (data?: any, params?: any) => any }} handlers - * @param {number} [reconnect] - */ - -var socket = function initSocket(url, handlers, reconnect) { - client = new Client(url); - client.onOpen(function () { - retries = 0; - - if (typeof reconnect !== "undefined") { - maxRetries = reconnect; - } - }); - client.onClose(function () { - if (retries === 0) { - handlers.close(); - } // Try to reconnect. - - - client = null; // After 10 retries stop trying, to prevent logspam. - - if (retries < maxRetries) { - // Exponentially increase timeout to reconnect. - // Respectfully copied from the package `got`. - // eslint-disable-next-line no-restricted-properties - var retryInMs = 1000 * Math.pow(2, retries) + Math.random() * 100; - retries += 1; - _utils_log_js__WEBPACK_IMPORTED_MODULE_1__.log.info("Trying to reconnect..."); - setTimeout(function () { - socket(url, handlers, reconnect); - }, retryInMs); - } - }); - client.onMessage( - /** - * @param {any} data - */ - function (data) { - var message = JSON.parse(data); - - if (handlers[message.type]) { - handlers[message.type](message.data, message.params); - } - }); -}; - -/* harmony default export */ __webpack_exports__["default"] = (socket); - -/***/ }), - -/***/ "./node_modules/webpack-dev-server/client/utils/createSocketURL.js": -/*!*************************************************************************!*\ - !*** ./node_modules/webpack-dev-server/client/utils/createSocketURL.js ***! - \*************************************************************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/** - * @param {{ protocol?: string, auth?: string, hostname?: string, port?: string, pathname?: string, search?: string, hash?: string, slashes?: boolean }} objURL - * @returns {string} - */ -function format(objURL) { - var protocol = objURL.protocol || ""; - - if (protocol && protocol.substr(-1) !== ":") { - protocol += ":"; - } - - var auth = objURL.auth || ""; - - if (auth) { - auth = encodeURIComponent(auth); - auth = auth.replace(/%3A/i, ":"); - auth += "@"; - } - - var host = ""; - - if (objURL.hostname) { - host = auth + (objURL.hostname.indexOf(":") === -1 ? objURL.hostname : "[".concat(objURL.hostname, "]")); - - if (objURL.port) { - host += ":".concat(objURL.port); - } - } - - var pathname = objURL.pathname || ""; - - if (objURL.slashes) { - host = "//".concat(host || ""); - - if (pathname && pathname.charAt(0) !== "/") { - pathname = "/".concat(pathname); - } - } else if (!host) { - host = ""; - } - - var search = objURL.search || ""; - - if (search && search.charAt(0) !== "?") { - search = "?".concat(search); - } - - var hash = objURL.hash || ""; - - if (hash && hash.charAt(0) !== "#") { - hash = "#".concat(hash); - } - - pathname = pathname.replace(/[?#]/g, - /** - * @param {string} match - * @returns {string} - */ - function (match) { - return encodeURIComponent(match); - }); - search = search.replace("#", "%23"); - return "".concat(protocol).concat(host).concat(pathname).concat(search).concat(hash); -} -/** - * @param {URL & { fromCurrentScript?: boolean }} parsedURL - * @returns {string} - */ - - -function createSocketURL(parsedURL) { - var hostname = parsedURL.hostname; // Node.js module parses it as `::` - // `new URL(urlString, [baseURLString])` parses it as '[::]' - - var isInAddrAny = hostname === "0.0.0.0" || hostname === "::" || hostname === "[::]"; // why do we need this check? - // hostname n/a for file protocol (example, when using electron, ionic) - // see: https://github.com/webpack/webpack-dev-server/pull/384 - - if (isInAddrAny && self.location.hostname && self.location.protocol.indexOf("http") === 0) { - hostname = self.location.hostname; - } - - var socketURLProtocol = parsedURL.protocol || self.location.protocol; // When https is used in the app, secure web sockets are always necessary because the browser doesn't accept non-secure web sockets. - - if (socketURLProtocol === "auto:" || hostname && isInAddrAny && self.location.protocol === "https:") { - socketURLProtocol = self.location.protocol; - } - - socketURLProtocol = socketURLProtocol.replace(/^(?:http|.+-extension|file)/i, "ws"); - var socketURLAuth = ""; // `new URL(urlString, [baseURLstring])` doesn't have `auth` property - // Parse authentication credentials in case we need them - - if (parsedURL.username) { - socketURLAuth = parsedURL.username; // Since HTTP basic authentication does not allow empty username, - // we only include password if the username is not empty. - - if (parsedURL.password) { - // Result: : - socketURLAuth = socketURLAuth.concat(":", parsedURL.password); - } - } // In case the host is a raw IPv6 address, it can be enclosed in - // the brackets as the brackets are needed in the final URL string. - // Need to remove those as url.format blindly adds its own set of brackets - // if the host string contains colons. That would lead to non-working - // double brackets (e.g. [[::]]) host - // - // All of these web socket url params are optionally passed in through resourceQuery, - // so we need to fall back to the default if they are not provided - - - var socketURLHostname = (hostname || self.location.hostname || "localhost").replace(/^\[(.*)\]$/, "$1"); - var socketURLPort = parsedURL.port; - - if (!socketURLPort || socketURLPort === "0") { - socketURLPort = self.location.port; - } // If path is provided it'll be passed in via the resourceQuery as a - // query param so it has to be parsed out of the querystring in order for the - // client to open the socket to the correct location. - - - var socketURLPathname = "/ws"; - - if (parsedURL.pathname && !parsedURL.fromCurrentScript) { - socketURLPathname = parsedURL.pathname; - } - - return format({ - protocol: socketURLProtocol, - auth: socketURLAuth, - hostname: socketURLHostname, - port: socketURLPort, - pathname: socketURLPathname, - slashes: true - }); -} - -/* harmony default export */ __webpack_exports__["default"] = (createSocketURL); - -/***/ }), - -/***/ "./node_modules/webpack-dev-server/client/utils/getCurrentScriptSource.js": -/*!********************************************************************************!*\ - !*** ./node_modules/webpack-dev-server/client/utils/getCurrentScriptSource.js ***! - \********************************************************************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/** - * @returns {string} - */ -function getCurrentScriptSource() { - // `document.currentScript` is the most accurate way to find the current script, - // but is not supported in all browsers. - if (document.currentScript) { - return document.currentScript.getAttribute("src"); - } // Fallback to getting all scripts running in the document. - - - var scriptElements = document.scripts || []; - var scriptElementsWithSrc = Array.prototype.filter.call(scriptElements, function (element) { - return element.getAttribute("src"); - }); - - if (scriptElementsWithSrc.length > 0) { - var currentScript = scriptElementsWithSrc[scriptElementsWithSrc.length - 1]; - return currentScript.getAttribute("src"); - } // Fail as there was no script to use. - - - throw new Error("[webpack-dev-server] Failed to get current script source."); -} - -/* harmony default export */ __webpack_exports__["default"] = (getCurrentScriptSource); - -/***/ }), - -/***/ "./node_modules/webpack-dev-server/client/utils/log.js": -/*!*************************************************************!*\ - !*** ./node_modules/webpack-dev-server/client/utils/log.js ***! - \*************************************************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "log": function() { return /* binding */ log; }, -/* harmony export */ "setLogLevel": function() { return /* binding */ setLogLevel; } -/* harmony export */ }); -/* harmony import */ var _modules_logger_index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/logger/index.js */ "./node_modules/webpack-dev-server/client/modules/logger/index.js"); -/* harmony import */ var _modules_logger_index_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_modules_logger_index_js__WEBPACK_IMPORTED_MODULE_0__); - -var name = "webpack-dev-server"; // default level is set on the client side, so it does not need -// to be set by the CLI or API - -var defaultLevel = "info"; // options new options, merge with old options - -/** - * @param {false | true | "none" | "error" | "warn" | "info" | "log" | "verbose"} level - * @returns {void} - */ - -function setLogLevel(level) { - _modules_logger_index_js__WEBPACK_IMPORTED_MODULE_0___default().configureDefaultLogger({ - level: level - }); -} - -setLogLevel(defaultLevel); -var log = _modules_logger_index_js__WEBPACK_IMPORTED_MODULE_0___default().getLogger(name); - - -/***/ }), - -/***/ "./node_modules/webpack-dev-server/client/utils/parseURL.js": -/*!******************************************************************!*\ - !*** ./node_modules/webpack-dev-server/client/utils/parseURL.js ***! - \******************************************************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _getCurrentScriptSource_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getCurrentScriptSource.js */ "./node_modules/webpack-dev-server/client/utils/getCurrentScriptSource.js"); - -/** - * @param {string} resourceQuery - * @returns {{ [key: string]: string | boolean }} - */ - -function parseURL(resourceQuery) { - /** @type {{ [key: string]: string }} */ - var options = {}; - - if (typeof resourceQuery === "string" && resourceQuery !== "") { - var searchParams = resourceQuery.slice(1).split("&"); - - for (var i = 0; i < searchParams.length; i++) { - var pair = searchParams[i].split("="); - options[pair[0]] = decodeURIComponent(pair[1]); - } - } else { - // Else, get the url from the
Rotate Mode
R
RotateScale Mode
r
Scale Mode
s
Distort Mode
d
Drag Mode
D
Lock (Mode) / Unlock Image
l u
Stack up / down
q a
Add / Remove Image Border
b
Toggle Opacity
o
Deselect All
esc
Delete Image(s)
delete backspace
Export Image(s)
e
'),t.appendChild(i),t},this._keymapper.addTo(this._map)},_toggleKeymapper:function(t){t.preventDefault(),this._container.className="ldi-keymapper leaflet-control"===this._container.className?"ldi-keymapper-hide leaflet-control":"ldi-keymapper leaflet-control",this._scrollWrapper.style.display="none"===this._scrollWrapper.style.display?"block":"none",this._toggler.innerHTML="close"===this._toggler.innerHTML?L.IconUtil.create("keyboard_open"):"close",L.IconUtil.toggleTitle(this._toggler,"Show keymap","Hide keymap"),L.DomUtil.toggleClass(this._toggler,"close-icon")},_injectIconSet:function(){if(!document.querySelector("#keymapper-iconset")){var t=L.DomUtil.create("div","");t.id="keymapper-iconset",t.setAttribute("hidden","hidden"),this._iconset=(new L.KeymapperIconSet).render(),t.innerHTML=this._iconset,document.querySelector(".leaflet-control-container").appendChild(t)}}}),L.DistortableImage.Keymapper.addInitHook((function(){L.DistortableImage.Keymapper.prototype._n=L.DistortableImage.Keymapper.prototype._n?L.DistortableImage.Keymapper.prototype._n+1:1,1!==L.DistortableImage.Keymapper.prototype._n||L.Browser.mobile||(t.enable(),t._injectIconSet())})),L.distortableImage.keymapper=function(t,e){return new L.DistortableImage.Keymapper(t,e)}},428:function(){L.DistortableImage=L.DistortableImage||{},L.DistortableCollection.Edit=L.Handler.extend({options:{keymap:L.distortableImage.group_action_map},initialize:function(t,e){this._group=t,this._exportOpts=t.options.exportOpts,L.setOptions(this,e),L.distortableImage.group_action_map.Escape="_decollectAll"},addHooks:function(){var t=this._group._map;this.editActions=this.options.actions,this.runExporter=L.bind(L.Utils.getNestedVal(this,"_exportOpts","exporter")||this.startExport,this),L.DomEvent.on(document,"keydown",this._onKeyDown,this),t.doubleClickZoom.enabled()||t.doubleClickLabels.enabled()||L.DomEvent.on(t,"click",this._decollectAll,this),L.DomEvent.on(t,{singleclickon:this._singleClickListeners,singleclickoff:this._resetClickListeners,singleclick:this._singleClick,boxcollectend:this._addCollections},this),this._group.editable=!0,this._group.eachLayer((function(t){return t.editing.enable()}))},removeHooks:function(){var t=this._group._map;L.DomEvent.off(document,"keydown",this._onKeyDown,this),t.doubleClickZoom.enabled()||t.doubleClickLabels.enabled()||L.DomEvent.off(t,"click",this._decollectAll,this),L.DomEvent.off(t,{singleclickon:this._singleClickListeners,singleclickoff:this._resetClickListeners,singleclick:this._singleClick,boxcollectend:this._addCollections},this),this._decollectAll(),this._group.editable=!1,this._group.eachLayer((function(t){return t.editing.disable()}))},enable:function(){return this._enabled=!0,this.addHooks(),this},disable:function(){return this._enabled=!1,this.removeHooks(),this},_onKeyDown:function(t){var e=this.options.keymap[t.key];this[e]&&this._group.anyCollected()&&this[e].call(this)},_singleClick:function(t){"singleclick"===t.type&&this._decollectAll(t)},_singleClickListeners:function(){var t=this._group._map;L.DomEvent.off(t,"click",this._decollectAll,this),L.DomEvent.on(t,"singleclick",this._decollectAll,this)},_resetClickListeners:function(){var t=this._group._map;L.DomEvent.on(t,"click",this._decollectAll,this),L.DomEvent.off(t,"singleclick",this._decollectAll,this)},_decollectAll:function(t){var e;t&&(e=t.originalEvent),e&&(e.shiftKey||e.target instanceof HTMLImageElement)||(this._group.eachLayer((function(t){L.DomUtil.removeClass(t.getElement(),"collected"),t.deselect()})),this._removeToolbar(),t&&L.DomEvent.stopPropagation(t))},_unlockGroup:function(){var t=this;this.hasTool(L.UnlockAction)&&this._group.eachLayer((function(e){t._group.isCollected(e)&&(e.editing._unlock(),e.deselect())}))},_lockGroup:function(){var t=this;this.hasTool(L.LockAction)&&this._group.eachLayer((function(e){t._group.isCollected(e)&&(e.editing._lock(),L.DomUtil.addClass(e.getElement(),"collected"))}))},_addCollections:function(t){var e=this,i=t.boxCollectBounds,o=this._group._map;this._group.eachLayer((function(t){var n=t.editing;t.isSelected()&&t.deselect();var a=o.getZoom(),s=o.getCenter(),r=L.latLngBounds(t.getCorner(2),t.getCorner(1));r=o._latLngBoundsToNewLayerBounds(r,a,s),i.intersects(r)&&n.enabled()&&(e.toolbar||e._addToolbar(),L.DomUtil.addClass(t.getElement(),"collected"))}))},_removeGroup:function(t){var e=this;if(this.hasTool(L.DeleteAction)){var i=this._group._toRemove(),o=i.length;0!==o&&(L.DomUtil.confirmDeletes(o)&&(i.forEach((function(t){e._group.removeLayer(t)})),this._group.anyCollected()||this._removeToolbar()),t&&L.DomEvent.stopPropagation(t))}},cancelExport:function(){this.customCollection||(this._exportOpts.collection=void 0),clearInterval(this.updateInterval)},_addToolbar:function(){var t=this._group,e=t._map;t.options.suppressToolbar||this.toolbar||(this.toolbar=L.distortableImage.controlBar({actions:this.editActions,position:"topleft"}).addTo(e,t))},_removeToolbar:function(){var t=this._group._map;if(!this.toolbar)return!1;t.removeLayer(this.toolbar),this.toolbar=!1},hasTool:function(t){return this.editActions.some((function(e){return e===t}))},addTool:function(t){return"leaflet-toolbar-icon"!==t.baseClass||this.hasTool(t)||(this._removeToolbar(),this.editActions.push(t),this._addToolbar()),this},removeTool:function(t){var e=this;return this.editActions.some((function(i,o){return e.editActions[o]===t&&(e._removeToolbar(),e.editActions.splice(o,1),e._addToolbar(),!0)})),this},startExport:function(){var t=this;if(this.hasTool(L.ExportAction))return new Promise((function(e){var i,o=t._exportOpts;o.resolve=e,t.updateInterval=null,t.customCollection=!!o.collection,t.customCollection||(o.collection=t._group.generateExportJson().images),o.frequency=o.frequency||3e3,o.scale=o.scale||100,o.updater=o.updater||function(n){(n=JSON.parse(n)).status_url&&(i!==n.status_url&&n.status_url.match(".json")&&(i=n.status_url),"complete"===n.status&&(clearInterval(t.updateInterval),t.customCollection||(t._exportOpts.collection=void 0),e(),null!==n.jpg&&alert("Export succeeded. "+o.exportUrl+n.jpg)),console.log(n))},o.handleStatusRes=o.handleStatusRes||function(e){i=o.statusUrl+e,t.updateInterval=setInterval((function(){var t=new Request("".concat(i,"?").concat(Date.now()),{method:"GET"});fetch(t).then((function(t){if(t.ok)return t.text()})).then(o.updater)}),o.frequency)},o.fetchStatusUrl=o.fetchStatusUrl||function(t){var e=new FormData;e.append("collection",JSON.stringify(t.collection)),e.append("scale",t.scale),e.append("upload",!0);var i={method:"POST",body:e},o=new Request(t.exportStartUrl,i);fetch(o).then((function(t){if(t.ok)return t.text()})).then(t.handleStatusRes)},o.fetchStatusUrl(o)}))}}),L.distortableCollection.edit=function(t,e){return new L.DistortableCollection.Edit(t,e)}},397:function(){L.DistortableImage=L.DistortableImage||{},L.DistortableImage.Edit=L.Handler.extend({options:{opacity:.7,outline:"1px solid red",keymap:L.distortableImage.action_map},initialize:function(t,e){this._overlay=t,this._toggledImage=!1,this._mode=t.options.mode,this._transparent=!1,this._outlined=!1,L.setOptions(this,e),L.distortableImage.action_map.Escape="_deselect"},addHooks:function(){var t=this._overlay;this.editActions=this.options.actions,t.bringToFront(),this._initModes(),this._initHandles(),this._appendHandlesandDragable(),t.isSelected()&&!t.options.suppressToolbar&&this._addToolbar(),this.parentGroup=!!t.eP&&t.eP,L.DomEvent.on(t.getElement(),{dblclick:this.nextMode},this),L.DomEvent.on(window,"keydown",this._onKeyDown,this)},removeHooks:function(){var t=this._overlay,e=this.parentGroup;for(var i in this._disableDragging(),this.toolbar&&this._removeToolbar(),this._handles)L.DomUtil.remove(i);L.DomUtil.hasClass(t.getElement(),"collected")&&L.DomUtil.removeClass(t.getElement(),"collected"),e&&!e.anyCollected()&&e.editing.toolbar&&e.editing._removeToolbar(),L.DomEvent.off(t.getElement(),{dblclick:this.nextMode},this),L.DomEvent.off(window,"keydown",this._onKeyDown,this)},disable:function(){return this._enabled?(this._overlay.deselect(),this._enabled=!1,this.removeHooks(),this):this},_initModes:function(){for(var t in this._modes={},L.DistortableImage.Edit.MODES){var e=L.DistortableImage.Edit.MODES[t];-1!==this.editActions.indexOf(e)&&(this._modes[t]=e)}this._modes[this._mode]||(this._mode=Object.keys(this._modes)[0])},_initHandles:function(){var t,e=this._overlay;for(this._dragHandles=L.layerGroup(),t=0;t<4;t++)this._dragHandles.addLayer(L.dragHandle(e,t));for(this._scaleHandles=L.layerGroup(),t=0;t<4;t++)this._scaleHandles.addLayer(L.scaleHandle(e,t));for(this._distortHandles=L.layerGroup(),t=0;t<4;t++)this._distortHandles.addLayer(L.distortHandle(e,t));for(this._rotateHandles=L.layerGroup(),t=0;t<4;t++)this._rotateHandles.addLayer(L.rotateHandle(e,t));for(this._freeRotateHandles=L.layerGroup(),t=0;t<4;t++)this._freeRotateHandles.addLayer(L.freeRotateHandle(e,t));for(this._lockHandles=L.layerGroup(),t=0;t<4;t++)this._lockHandles.addLayer(L.lockHandle(e,t,{draggable:!1}));this._handles={drag:this._dragHandles,scale:this._scaleHandles,distort:this._distortHandles,rotate:this._rotateHandles,freeRotate:this._freeRotateHandles,lock:this._lockHandles}},_appendHandlesandDragable:function(){var t=this._overlay;this._mode?(this._updateHandle(),!t.isSelected()&&this.currentHandle&&this.currentHandle.eachLayer((function(t){t.setOpacity(0),t.dragging&&t.dragging.disable()})),this.isMode("lock")||this._enableDragging()):this._enableDragging()},_onKeyDown:function(t){var e=this.options.keymap[t.key],i=this._overlay,o=this.parentGroup;o&&o.anyCollected()||void 0===this[e]||i.options.suppressToolbar||i.isSelected()&&this.toolbar&&this[e].call(this)},replaceTool:function(t,e){var i=this;return"leaflet-toolbar-icon"!==e.baseClass||this.hasTool(e)||this.editActions.some((function(o,n){if(o===t){for(var a in i._removeToolbar(),i.editActions[n]=e,i._addToolbar(),L.DistortableImage.Edit.MODES)L.DistortableImage.Edit.MODES[a]===t?(delete i._modes[a],i._nextOrNone(a)):L.DistortableImage.Edit.MODES[a]===e&&(i._modes[a]=e);return!0}})),this},addTool:function(t){if("leaflet-toolbar-icon"===t.baseClass&&!this.hasTool(t)){for(var e in this._removeToolbar(),this.editActions.push(t),this._addToolbar(),L.DistortableImage.Edit.MODES)L.DistortableImage.Edit.MODES[e]===t&&(this._modes[e]=t);this._overlay.isSelected()||this._removeToolbar()}return this},hasTool:function(t){return this.editActions.some((function(e){return e===t}))},removeTool:function(t){var e=this;return this.editActions.some((function(i,o){if(i===t){for(var n in e._removeToolbar(),e.editActions.splice(o,1),e._addToolbar(),L.DistortableImage.Edit.MODES)L.DistortableImage.Edit.MODES[n]===t&&(delete e._modes[n],e._nextOrNone(n));return!0}})),this._overlay.isSelected()||this._removeToolbar(),this},_nextOrNone:function(t){this.isMode(t)&&(Object.keys(this.getModes()).length>=1?this.nextMode():("lock"===t&&this._enableDragging(),this._mode="",this._updateHandle()))},_removeToolbar:function(){var t=this._overlay._map;this.toolbar&&(t.removeLayer(this.toolbar),this.toolbar=!1)},_enableDragging:function(){var t=this,e=this._overlay,i=e._map;this.dragging=new L.Draggable(e.getElement()),this.dragging.enable(),this.dragging.on("dragstart",(function(){e.fire("dragstart"),t._removeToolbar()})),this.dragging._updatePosition=function(){var t,o,n=e.getCorner(0),a=this._newPos.subtract(i.latLngToLayerPoint(n)),s={};for(this.fire("predrag"),o=0;o<4;o++)t=i.latLngToLayerPoint(e.getCorner(o)),s[o]=i.layerPointToLatLng(t.add(a));e.setCorners(s),e.fire("drag"),this.fire("drag")},this.dragging.on("dragend",(function(){e.fire("dragend")}))},_disableDragging:function(){this.dragging&&(this.dragging.disable(),delete this.dragging)},_dragMode:function(){this.setMode("drag")},_scaleMode:function(){this.setMode("scale")},_distortMode:function(){this.setMode("distort")},_rotateMode:function(){this.setMode("rotate")},_freeRotateMode:function(){this.setMode("freeRotate")},_toggleLockMode:function(){this.isMode("lock")?this._unlock():this._lock()},_toggleOpacity:function(){var t,e=this._overlay.getElement();this.hasTool(L.OpacityAction)&&(this._transparent=!this._transparent,t=this._transparent?this.options.opacity:1,L.DomUtil.setOpacity(e,t),e.setAttribute("opacity",t),this._refresh())},_toggleBorder:function(){var t,e=this._overlay.getElement();this.hasTool(L.BorderAction)&&(this._outlined=!this._outlined,t=this._outlined?this.options.outline:"none",e.style.outline=t,this._refresh())},_toggleOrder:function(){this._toggledImage?this._stackUp():this._stackDown()},_removeOverlay:function(){var t=this._overlay,e=this.parentGroup;!this.isMode("lock")&&this.hasTool(L.DeleteAction)&&L.DomUtil.confirmDelete()&&(this._removeToolbar(),e?e.removeLayer(t):t._map.removeLayer(t))},_getExport:function(){var t=this._overlay,e=t._map,i=t.getElement();if(this.hasTool(L.ExportAction)){var o=new Image;o.id=o.id||"tempId12345",document.body.appendChild(o),o.onload=function(){var i=o.height,n=o.width,a=e.latLngToLayerPoint(t.getCorner(0)),s=e.latLngToLayerPoint(t.getCorner(1)),r=e.latLngToLayerPoint(t.getCorner(2)),l=e.latLngToLayerPoint(t.getCorner(3));o.onload=function(){L.DomUtil.remove(o)},window&&window.hasOwnProperty("warpWebGl")&&warpWebGl(o.id,[0,0,n,0,n,i,0,i],[a.x,a.y,s.x,s.y,l.x,l.y,r.x,r.y],!0)},o.src=t.options.fullResolutionSrc||i.src}},_stackUp:function(){this._toggledImage&&this.hasTool(L.StackAction)&&(this._toggledImage=!1,this._overlay.bringToFront(),this._refresh())},_stackDown:function(){!this._toggledImage&&this.hasTool(L.StackAction)&&(this._toggledImage=!0,this._overlay.bringToBack(),this._refresh())},_unlock:function(){var t=this._overlay,e=t._map,i=this.parentGroup;this.isMode("lock")&&((!i||i.isCollected(t))&&i||this.hasTool(L.LockAction))&&(this.currentHandle&&e.removeLayer(this.currentHandle),"lock"!==t.options.mode&&this.hasMode(t.options.mode)?this._mode=t.options.mode:(this._mode="",this.currentHandle=""),this._updateHandle(),this._enableDragging(),this._refresh())},_lock:function(){var t=this._overlay,e=t._map,i=this.parentGroup;this.isMode("lock")||((!i||i.isCollected(t))&&i||this.hasTool(L.LockAction))&&(this.currentHandle&&e.removeLayer(this.currentHandle),this._mode="lock",this._updateHandle(),this._disableDragging(),this._refresh())},_deselect:function(){this._overlay.deselect()},_showMarkers:function(t){var e=this.parentGroup;this.currentHandle&&(!this.isMode("lock")&&e&&e.anyCollected()||this.currentHandle.eachLayer((function(t){t.setOpacity(1),t.dragging&&t.dragging.enable(),L.DomUtil.addClass(t.getElement(),"leaflet-interactive")})))},_hideMarkers:function(){var t=this._overlay,e=this.parentGroup;this._handles||this._initHandles(),this.currentHandle&&(this.isMode("lock")&&e&&e.isCollected(t)||this.currentHandle.eachLayer((function(t){t.setOpacity(0),t.dragging&&t.dragging.disable(),L.DomUtil.removeClass(t.getElement(),"leaflet-interactive")})))},_updateHandle:function(){var t=this._overlay._map,e=this.getMode();this.currentHandle&&t.removeLayer(this.currentHandle),this.currentHandle=""===e?"":this._handles[e],""!==this.currentHandle&&t.addLayer(this.currentHandle)},_addToolbar:function(){var t=this._overlay,e=this.parentGroup,i=t._map,o=t.getCorners(),n=-1/0;if(e&&e.anyCollected())e.editing._addToolbar();else if(!t.options.suppressToolbar&&!this.toolbar){for(var a=0;an&&(n=o[a].lat);var s=t.getCenter();s.lat=n,this.toolbar=L.distortableImage.popupBar(s,{actions:this.editActions}).addTo(i,t),t.fire("toolbar:created")}},_refresh:function(){this.toolbar&&this._removeToolbar(),this._addToolbar()},_updateToolbarPos:function(){var t=this._overlay,e=t.getCorners(),i=this.toolbar,o=-1/0;if(i&&i instanceof L.DistortableImage.PopupBar){for(var n=0;no&&(o=e[n].lat);var a=t.getCenter();a.lat=o,t.options.suppressToolbar||this.toolbar.setLatLng(a)}},hasMode:function(t){return!!this._modes[t]},getMode:function(){if(this.enabled())return this._mode},getModes:function(){return this._modes},isMode:function(t){return!!this.enabled()&&this._mode===t},setMode:function(t){var e=this._overlay,i=this.parentGroup;if(this.getMode()!==t&&this.hasMode(t)&&this.enabled())return this.toolbar&&this.toolbar.clickTool(t),this.isMode("lock")&&!this.dragging&&this._enableDragging(),this._mode=t,this.isMode("lock")&&this._disableDragging(),this._updateHandle(),this._refresh(),i&&i.isCollected(e)&&e.deselect(),this},nextMode:function(t){var e=this.getMode(),i=this.parentGroup,o=Object.keys(this.getModes()),n=o.indexOf(e),a=o[(n+1)%o.length];if(t){if(i&&i.anyCollected())return;L.DomEvent.stop(t)}return this.setMode(a)}}),L.distortableImage.edit=function(t,e){return new L.DistortableImage.Edit(t,e)}},426:function(){L.BorderAction=L.EditAction.extend({initialize:function(t,e,i){var o,n,a=e.editing,s=a._mode;a._outlined?(o="border_outer",n=e.options.translation.removeBorder):(o="border_clear",n=e.options.translation.addBorder),(i=i||{}).toolbarIcon={svg:!0,html:o,tooltip:n,className:"lock"===s?"disabled":""},L.DistortableImage.action_map.b="lock"===s?"":"_toggleBorder",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){var t=this._overlay.editing;L.IconUtil.toggleXlink(this._link,"border_clear","border_outer"),L.IconUtil.toggleTitle(this._link,"Remove Border","Add Border"),t._toggleBorder()}})},114:function(){L.DeleteAction=L.EditAction.extend({initialize:function(t,e,i){var o,n=e.editing;n instanceof L.DistortableImage.Edit?(o=e.options.translation.deleteImage,L.DistortableImage.action_map.Backspace="lock"===n._mode?"":"_removeOverlay"):(o=e.options.translation.deleteImages,L.DistortableImage.group_action_map.Backspace="lock"===n._mode?"":"_removeGroup"),(i=i||{}).toolbarIcon={svg:!0,html:"delete_forever",tooltip:o,className:"lock"===n._mode?"disabled":""},L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){var t=this._overlay.editing;t instanceof L.DistortableImage.Edit?t._removeOverlay():t._removeGroup()}})},231:function(){L.DistortAction=L.EditAction.extend({initialize:function(t,e,i){(i=i||{}).toolbarIcon={svg:!0,html:"distort",tooltip:e.options.translation.distortImage,className:"distort"},L.DistortableImage.action_map.d="_distortMode",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){this._overlay.editing._distortMode()}})},541:function(){L.DragAction=L.EditAction.extend({initialize:function(t,e,i){(i=i||{}).toolbarIcon={svg:!0,html:"drag",tooltip:e.options.translation.dragImage,className:"drag"},L.DistortableImage.action_map.D="_dragMode",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){this._overlay.editing._dragMode()}})},280:function(){L.DistortableImage=L.DistortableImage||{},L.distortableImage=L.DistortableImage,L.DistortableImage.action_map={},L.EditAction=L.Toolbar2.Action.extend({options:{toolbarIcon:{svg:!1,html:"",className:"",tooltip:""}},initialize:function(t,e,i){this._overlay=e,this._map=t,L.setOptions(this,i),L.Toolbar2.Action.prototype.initialize.call(this,i),this._injectIconSet()},_createIcon:function(t,e,i){var o=this,n=this.options.toolbarIcon,a=n.className,s=this._overlay.editing;this.toolbar=t,this._icon=L.DomUtil.create("li","",e),this._link=L.DomUtil.create("a","",this._icon),n.svg?this._link.innerHTML=L.IconUtil.create(n.html):this._link.innerHTML=n.html,this._link.setAttribute("href","#"),this._link.setAttribute("title",n.tooltip),this._link.setAttribute("role","button"),L.DomUtil.addClass(this._link,this.constructor.baseClass),a&&(L.DomUtil.addClass(this._link,a),"disabled"===a&&L.DomUtil.addClass(this._icon,a),a===s._mode?L.DomUtil.addClass(this._link,"selected-mode"):L.DomUtil.removeClass(this._link,"selected-mode")),L.DomEvent.on(this._link,"click",this.enable,this),L.DomEvent.on(this._overlay,"update",(function(){var t=o._link.innerHTML.match(/xlink:href="#restore"/);t&&1===t.length&&o._enableAction()})),this._addSubToolbar(t,this._icon,i)},_injectIconSet:function(){if(!document.querySelector("#iconset")){var t=document.createElement("div");t.id="iconset",t.setAttribute("hidden","hidden"),t.innerHTML=(new L.ToolbarIconSet).render(),document.querySelector(".leaflet-marker-pane").appendChild(t)}},_enableAction:function(){L.DomUtil.removeClass(this._link.parentElement,"disabled"),L.DomUtil.removeClass(this._link,"disabled")},_disableAction:function(){L.DomUtil.addClass(this._link.parentElement,"disabled"),L.DomUtil.addClass(this._link,"disabled")}}),L.editAction=function(t,e,i){return new L.EditAction(t,e,i)}},149:function(){L.ExportAction=L.EditAction.extend({initialize:function(t,e,i){var o,n=e.editing;this.isExporting=!1,this.mouseLeaveSkip=!0,this.isHooksExecuted=!1,n instanceof L.DistortableImage.Edit?(L.DistortableImage.action_map.e="_getExport",o=e.options.translation.exportImage):(L.DistortableImage.group_action_map.e="runExporter",o=e.options.translation.exportImages),(i=i||{}).toolbarIcon={svg:!0,html:"get_app",tooltip:o},L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){var t=this._overlay.editing;if(t instanceof L.DistortableImage.Edit)t._getExport();else if(!this.isHooksExecuted){this.isHooksExecuted=!0;var e=this._link.parentElement;this.mouseEnterHandler=this.handleMouseEnter.bind(this),this.mouseLeaveHandler=this.handleMouseLeave.bind(this),L.DomEvent.on(e,"click",(function(){if(this.isExporting){if(this.mouseLeaveSkip)return;this.resetState(),this.detachMouseEventListeners(e),t.cancelExport()}else this.isExporting=!0,this.renderExportIcon(),setTimeout(this.attachMouseEventListeners.bind(this,e),100),t.runExporter().then(function(){this.resetState(),this.detachMouseEventListeners(e)}.bind(this))}),this)}},resetState:function(){this.renderDownloadIcon(),this.isExporting=!1,this.mouseLeaveSkip=!0},attachMouseEventListeners:function(t){t.addEventListener("mouseenter",this.mouseEnterHandler),t.addEventListener("mouseleave",this.mouseLeaveHandler)},detachMouseEventListeners:function(t){t.removeEventListener("mouseenter",this.mouseEnterHandler),t.removeEventListener("mouseleave",this.mouseLeaveHandler)},handleMouseEnter:function(){this.renderCancelIcon()},handleMouseLeave:function(){this.mouseLeaveSkip?this.mouseLeaveSkip=!1:this.renderExportIcon()},renderDownloadIcon:function(){L.IconUtil.toggleXlink(this._link,"get_app","spinner"),L.IconUtil.toggleTitle(this._link,"Export Images","Loading..."),L.DomUtil.removeClass(this._link.firstChild,"loader")},renderExportIcon:function(){L.IconUtil.toggleXlink(this._link,"spinner"),L.IconUtil.toggleTitle(this._link,"Export Images","Loading..."),L.IconUtil.addClassToSvg(this._link,"loader")},renderCancelIcon:function(){L.IconUtil.toggleXlink(this._link,"cancel"),L.IconUtil.toggleTitle(this._link,"Cancel Export","Loading..."),L.DomUtil.removeClass(this._link.firstChild,"loader")}})},74:function(){L.FreeRotateAction=L.EditAction.extend({initialize:function(t,e,i){(i=i||{}).toolbarIcon={svg:!0,html:"crop_rotate",tooltip:e.options.translation.freeRotateImage,className:"freeRotate"},L.DistortableImage.action_map.f="_freeRotateMode",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){this._overlay.editing._freeRotateMode()}})},691:function(){L.GeolocateAction=L.EditAction.extend({initialize:function(t,e,i){var o=e.editing;(i=i||{}).toolbarIcon={svg:!0,html:"explore",tooltip:e.options.translation.geolocateImage,className:"lock"===o._mode?"disabled":""},L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){var t=this._overlay.getElement();EXIF.getData(t,L.EXIF(t))}})},105:function(){L.LockAction=L.EditAction.extend({initialize:function(t,e,i){var o,n,a=e.editing;a instanceof L.DistortableImage.Edit?(L.DistortableImage.action_map.u="_unlock",L.DistortableImage.action_map.l="_lock",n=e.options.translation.lockMode,o=a.isMode("lock")?"lock":"unlock"):(L.DistortableImage.group_action_map.l="_lockGroup",n=e.options.translation.lockImages,o="lock"),(i=i||{}).toolbarIcon={svg:!0,html:o,tooltip:n,className:"lock"},L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){var t=this._overlay.editing;t instanceof L.DistortableImage.Edit?t._toggleLockMode():t._lockGroup()}})},944:function(){L.OpacityAction=L.EditAction.extend({initialize:function(t,e,i){var o,n,a=e.editing,s=a._mode;a._transparent?(o="opacity_empty",n=e.options.translation.makeImageOpaque):(o="opacity",n=e.options.translation.makeImageTransparent),(i=i||{}).toolbarIcon={svg:!0,html:o,tooltip:n,className:"lock"===s?"disabled":""},L.DistortableImage.action_map.o="lock"===s?"":"_toggleOpacity",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){var t=this._overlay.editing,e=this._link;L.IconUtil.toggleXlink(e,"opacity","opacity_empty"),L.IconUtil.toggleTitle(e,"Make Image Transparent","Make Image Opaque"),t._toggleOpacity()}})},954:function(){L.RestoreAction=L.EditAction.extend({initialize:function(t,e,i){var o=L.Utils.getNestedVal(e,"editing","_mode"),n=e.edited;(i=i||{}).toolbarIcon={svg:!0,html:"restore",tooltip:e.options.translation.restoreImage,className:n&&"lock"!==o?"":"disabled"},L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){var t=this._overlay;L.DomEvent.on(t,{edit:this._enableAction,restore:this._disableAction},this),t.restore()}})},178:function(){L.RotateAction=L.EditAction.extend({initialize:function(t,e,i){(i=i||{}).toolbarIcon={svg:!0,html:"rotate",tooltip:e.options.translation.rotateImage,className:"rotate"},L.DistortableImage.action_map.r="_rotateMode",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){this._overlay.editing._rotateMode()}})},547:function(){L.ScaleAction=L.EditAction.extend({initialize:function(t,e,i){(i=i||{}).toolbarIcon={svg:!0,html:"scale",tooltip:e.options.translation.scaleImage,className:"scale"},L.DistortableImage.action_map.s="_scaleMode",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){this._overlay.editing._scaleMode()}})},886:function(){L.StackAction=L.EditAction.extend({initialize:function(t,e,i){var o,n,a=e.editing;a._toggledImage?(o="flip_to_back",n=e.options.translation.stackToFront):(o="flip_to_front",n=e.options.translation.stackToBack),(i=i||{}).toolbarIcon={svg:!0,html:o,tooltip:n,className:"lock"===a._mode?"disabled":""},L.DistortableImage.action_map.q="lock"===a._mode?"":"_stackUp",L.DistortableImage.action_map.a="lock"===a._mode?"":"_stackDown",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){var t=this._overlay.editing;L.IconUtil.toggleXlink(this._link,"flip_to_front","flip_to_back"),L.IconUtil.toggleTitle(this._link,"Stack to Front","Stack to Back"),t._toggleOrder()}})},129:function(){L.UnlockAction=L.EditAction.extend({initialize:function(t,e,i){(i=i||{}).toolbarIcon={svg:!0,html:"unlock",tooltip:e.options.translation.unlockImages},L.DistortableImage.group_action_map.u="_unlockGroup",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){this._overlay.editing._unlockGroup()}})},743:function(){L.EXIF=function(t){if(0!==Object.keys(EXIF.getAllTags(t)).length){console.log(EXIF.getAllTags(t));var e=EXIF.getAllTags(t);void 0!==e.GPSLatitude&&void 0!==e.GPSLongitude&&(e.GPSLatitude[0],e.GPSLatitude[1],e.GPSLatitude[2],e.GPSLongitude[0],e.GPSLongitude[1],e.GPSLongitude[2],e.GPSLatitudeRef,e.GPSLongitudeRef),"T"===e.GPSImgDirectionRef||"M"===e.GPSImgDirectionRef?(Math.PI,e.GPSImgDirection.numerator,e.GPSImgDirection.denominator):console.log("No compass data found"),console.log("Orientation:",e.Orientation),(6===e.Orientation||8===e.Orientation||3===e.Orientation)&&Math.PI,void 0!==e.GPSAltitude&&void 0!==e.GPSAltitudeRef&&void 0!==e.GPSAltitude&&void 0!==e.GPSAltitudeRef&&(e.GPSAltitude.numerator,e.GPSAltitude.denominator,e.GPSAltitudeRef)}else alert("EXIF initialized. Press again to view data in console.")}},92:function(){L.DistortHandle=L.EditHandle.extend({options:{TYPE:"distort",icon:L.icon({iconUrl:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAChSURBVO3BIU4DURgGwNkvL2B6AkQTLBqP4QCoSm7DDXoBLBZHDbfgICAIZjEV3YTn9uVHdMZZtcnCfI13bIzxg0emg6Nm6QVbYz3jylEsXRrvwommb49X67jFkz80fR9Mb1YxTzqiWBSLYlEsikWxKBbFolgUi2JRLIpFsSgWxaJY03fHHOu40dH07bAzWCx9Ge/TiWbpHgdsjPGNB2f/yS+7xRCyiiZPJQAAAABJRU5ErkJggg==",iconSize:[32,32],iconAnchor:[16,16]})},_onHandleDrag:function(){this._handled.setCorner(this._corner,this.getLatLng())},updateHandle:function(){this.setLatLng(this._handled.getCorner(this._corner))}}),L.distortHandle=function(t,e,i){return new L.DistortHandle(t,e,i)}},194:function(){L.DragHandle=L.EditHandle.extend({options:{TYPE:"drag",icon:L.icon({iconUrl:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAsVJREFUeNrMVztLXEEUvnNVFAVBAhY2aRKbTZEHJNpYabuNjSgYg/GxdsmPSJkUAa/ZdVEX8mgWYVutbHxAHkVskjQBuUUgBISVhCQk3wnfwMlk1rusN1wHPubOzJlzvjlz5sxc01Ma/hUEwQnwDIjqc7uvgv9YYO86qgIwCXQbdNTlQ8kcCBHgBch8TcloF6oJGr6phk6EQAkfdz3zvgDr9Mr7Fg1fptEZoM8jsmrokpfsiIFO4IIjuE2v1EDmR4LRdlR5Gh51hj8D34ABtm8YTtqna0TgklIw5CgQguKxIojEjmFROg/MKQO27NkFAB+4wAPouGUJiIvWKHwbAxX2XyWRKWkqhT+pbJntJZJuUzISW0+5hW+obxrVBsfvoH/dqCCJuU97GBh2VteLSiYvArmErT8EVoAK9Bw7enbpVYmvAQlyowYforrH5jXL2rPHI/TKONDB7u9AlavdaTBPvPmazUeQuy8f7UomUgTEwIJPEQ3sQGE/6ll2l9H/KcEzBcfWn2IclluM3DpddJxSHujlFkscbUPvmB0LHVnLrId7nlaZVkEc6QGXQI1MAwZcWmVRHeNaQwJMMiU2cwy4s7p/RJ2ckpvIQs+cIs+5GzitloLKHUV3MPREuXbTOKO91dX387gGTONxIgEWm+E61FFrpcyqXLHsEwiDjEsjAksqw5XPoL9MHVrn6QR4q+XZrDaR4RoWzq2ymafuRA/Mq1stSsHLVkcbdf9VjOcx8ZH3+SFWcCWlVPyWuUBOwUWdC1wP5NVjYiXFWLO69PZ6CRTUY6KSIoEKdf6T3IzzgHxnsyHctNBEkmn6Oob8ExUDg/ahGybd177cDjzH5xHwgDiSvoS7I/LZyvxJZj0wod7tkX5G0XVC7rEyLhfLJjBGbKoLLEfZWObyKeZ6oY82g+yf5Zn/mJyHX7PMf04z/T3/LcAAu4E6iiyJqf0AAAAASUVORK5CYII=",iconSize:[32,32],iconAnchor:[16,16]})},_onHandleDrag:function(){var t=this._handled,e=t.getCorner(this._corner),i=this.getLatLng();t.dragBy(e,i)},updateHandle:function(){this.setLatLng(this._handled.getCorner(this._corner))}}),L.dragHandle=function(t,e,i){return new L.DragHandle(t,e,i)}},988:function(){L.EditHandle=L.Marker.extend({initialize:function(t,e,i){var o=t.getCorner(e);L.setOptions(this,i),this._handled=t,this._corner=e;var n={draggable:!0,zIndexOffset:10};i&&i.hasOwnProperty("draggable")&&(n.draggable=i.draggable),L.Marker.prototype.initialize.call(this,o,n)},onAdd:function(t){L.Marker.prototype.onAdd.call(this,t),this._bindListeners(),this.updateHandle()},onRemove:function(t){this._unbindListeners(),L.Marker.prototype.onRemove.call(this,t)},_onHandleDragStart:function(){this._handled.fire("editstart")},_onHandleDragEnd:function(){this._fireEdit()},_fireEdit:function(){this._handled.edited=!0,this._handled.fire("edit")},_bindListeners:function(){this.on({contextmenu:L.DomEvent.stop,dragstart:this._onHandleDragStart,drag:this._onHandleDrag,dragend:this._onHandleDragEnd},this),this._handled._map.on("zoomend",this.updateHandle,this),this._handled.on("update",this.updateHandle,this)},_unbindListeners:function(){this.off({contextmenu:L.DomEvent.stop,dragstart:this._onHandleDragStart,drag:this._onHandleDrag,dragend:this._onHandleDragEnd},this),this._handled._map.off("zoomend",this.updateHandle,this),this._handled.off("update",this.updateHandle,this)},_calculateScalingFactor:function(t,e){var i=this._handled,o=i._map,n=o.latLngToLayerPoint(i.getCenter()),a=o.latLngToLayerPoint(t),s=o.latLngToLayerPoint(e),r=this._d2(n,a),l=this._d2(n,s);return Math.sqrt(l/r)},_d2:function(t,e){var i=t.x-e.x,o=t.y-e.y;return Math.pow(i,2)+Math.pow(o,2)},calculateAngleDelta:function(t,e){var i=this._handled,o=i._map,n=o.latLngToLayerPoint(i.getCenter()),a=o.latLngToLayerPoint(t),s=o.latLngToLayerPoint(e),r=Math.atan2(n.y-a.y,n.x-a.x);return Math.atan2(n.y-s.y,n.x-s.x)-r}})},206:function(){L.FreeRotateHandle=L.EditHandle.extend({options:{TYPE:"freeRotate",icon:L.icon({iconUrl:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAHiSURBVMXBa3HbShgA0PMp/1sCCo8oCEpgTaCXgIXAJiDzyCJoAUTm4UVQAns1Y8+snWnTvJyeE16hkjDgDrfoNTMKcpC9UPiLSo8JyetkjEHxjPCMyoS199kFoz8Iv1HpMaN3qWDCHoegOKkkRwnJpRmroHgiPFEZ8IBekzEGxQtUEhKSS/fB7Ew4U+lxcGkVZG9QWWPSFAxBcdK59KApuA+yNwp2uEdx1GN25sZJZULSfAtm77SlbNjju6MvG75u+WHRWVR6rDVjMPsgwYyVZl3pLTpHkyYHOx8syMiayaJzlDTZ9YyaZNFVkiYH2ZUEBcVJJXVImuz6Js3Qofe59pq7DoOTILu+g+a288mCouk7/1iH4qTS+2QdDppbV1ZJmrnDXnPnc5UOs2Z0fUmTuyBr+krvSioJyUmQO0dZM7mepMkWnaNRkyrJB6uskTSjxY3Fll8bvmJwlDb83FJ8gMqAB80uyBY3Trb82PAfvjj6vuHnluIdKgMeNXOwctK5NKBoHitrb1RJeHRp5Ux4ojLg0aWMHGQvUOkxIWkKVsHsTPiNSo8HDC5lZIsgO6n0uMUdRvQuFQxB8UR4RmXC2vvsgtEfhL+o9JiQvE7GGBTPCK9QSUjoMWgKDthjDrIX+h/k0I7gth6N5gAAAABJRU5ErkJggg==",iconSize:[32,32],iconAnchor:[16,16]})},_onHandleDrag:function(){var t=this._handled,e=t._map,i=t.getCorner(this._corner),o=this.getLatLng(),n=this.calculateAngleDelta(i,o),a=this._calculateScalingFactor(i,o);0!==n&&t.rotateBy(n,"rad");var s=t.edgeMinWidth;s||(s=50);var r=e.latLngToContainerPoint(t.getCorner(0)),l=e.latLngToContainerPoint(t.getCorner(1)),c=Math.abs(r.x-l.x),d=Math.abs(r.y-l.y);Math.sqrt(c*c+d*d)>s||a>1?t.scaleBy(a):t.scaleBy(1)},updateHandle:function(){this.setLatLng(this._handled.getCorner(this._corner))}}),L.freeRotateHandle=function(t,e,i){return new L.FreeRotateHandle(t,e,i)}},789:function(){L.LockHandle=L.EditHandle.extend({options:{TYPE:"lock",interactive:!1,icon:L.icon({iconUrl:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAD8SURBVO3BPU7CYAAA0AdfjIcQlRCQBG7C3gk2uIPG2RC3Dk16Gz0FTO1WZs/gwGCMP/2+xsSl7+n1er1Iz9LtRQjaPeMeO+TinLDCJV78YqjdA04YodKuxhUaPGoRxMmxwRQZSt87Yo4KExGCeAUyLLFB4bMacxywEClIU2KDKXbInTUYo8JCgoFuGoxQO5uiwY1EA91VmDqrcKeDoX8WdNNgjApvmGGLXKIgXY0xGkxQYItrrFFIEKQ5Yo4KEx9yrDFDhlKkIF6NOQ5Y+KpAhiXWKEQI4pxwiwoLPyuxwQw75FoE7fZYocFEuwI7jHCBV39gL92TXq/Xi/AOcmczZmaIMScAAAAASUVORK5CYII=",iconSize:[32,32],iconAnchor:[16,16]})},onRemove:function(t){this.unbindTooltip(),L.EditHandle.prototype.onRemove.call(this,t)},_bindListeners:function(){var t=this.getElement();L.EditHandle.prototype._bindListeners.call(this),L.DomEvent.on(t,{mousedown:this._tooltipOn,mouseup:this._tooltipOff},this),L.DomEvent.on(document,"pointerleave",this._tooltipOff,this)},_unbindListeners:function(){var t=this.getElement();L.EditHandle.prototype._bindListeners.call(this),L.DomEvent.off(t,{mousedown:this._tooltipOn,mouseup:this._tooltipOff},this),L.DomEvent.off(document,"pointerleave",this._tooltipOff,this)},_onHandleDrag:function(){},updateHandle:function(){this.setLatLng(this._handled.getCorner(this._corner))},_tooltipOn:function(t){var e=this._handled.parentGroup,i=e?e.editing:this._handled.editing;if(!t.shiftKey&&(this._handled.isSelected()||!e||e.isCollected(this._handled))){var o=i._lockHandles;this._timer=setTimeout(L.bind((function(){this._timeout&&clearTimeout(this._timeout),this.getTooltip()?o.eachLayer((function(t){this!==t&&t.closeTooltip()})):this.bindTooltip("Locked!",{permanent:!0}),this.openTooltip()}),this),500)}},_tooltipOff:function(t){var e=this._handled.parentGroup,i=e?e.editing:this._handled.editing;if(!t.shiftKey&&(this._handled.isSelected()||!e||e.isCollected(this._handled))){var o=i._lockHandles;t.currentTarget===document&&o.eachLayer((function(t){t.closeTooltip()})),this._timer&&clearTimeout(this._timer),this._timeout=setTimeout(L.bind((function(){this.closeTooltip()}),this),400)}}}),L.lockHandle=function(t,e,i){return new L.LockHandle(t,e,i)}},337:function(){L.RotateHandle=L.EditHandle.extend({options:{TYPE:"rotate",icon:L.icon({iconUrl:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAHiSURBVMXBa3HbShgA0PMp/1sCCo8oCEpgTaCXgIXAJiDzyCJoAUTm4UVQAns1Y8+snWnTvJyeE16hkjDgDrfoNTMKcpC9UPiLSo8JyetkjEHxjPCMyoS199kFoz8Iv1HpMaN3qWDCHoegOKkkRwnJpRmroHgiPFEZ8IBekzEGxQtUEhKSS/fB7Ew4U+lxcGkVZG9QWWPSFAxBcdK59KApuA+yNwp2uEdx1GN25sZJZULSfAtm77SlbNjju6MvG75u+WHRWVR6rDVjMPsgwYyVZl3pLTpHkyYHOx8syMiayaJzlDTZ9YyaZNFVkiYH2ZUEBcVJJXVImuz6Js3Qofe59pq7DoOTILu+g+a288mCouk7/1iH4qTS+2QdDppbV1ZJmrnDXnPnc5UOs2Z0fUmTuyBr+krvSioJyUmQO0dZM7mepMkWnaNRkyrJB6uskTSjxY3Fll8bvmJwlDb83FJ8gMqAB80uyBY3Trb82PAfvjj6vuHnluIdKgMeNXOwctK5NKBoHitrb1RJeHRp5Ux4ojLg0aWMHGQvUOkxIWkKVsHsTPiNSo8HDC5lZIsgO6n0uMUdRvQuFQxB8UR4RmXC2vvsgtEfhL+o9JiQvE7GGBTPCK9QSUjoMWgKDthjDrIX+h/k0I7gth6N5gAAAABJRU5ErkJggg==",iconSize:[32,32],iconAnchor:[16,16]})},_onHandleDrag:function(){var t=this._handled,e=t.getCorner(this._corner),i=this.getLatLng(),o=this.calculateAngleDelta(e,i);t.rotateBy(o,"rad")},updateHandle:function(){this.setLatLng(this._handled.getCorner(this._corner))}}),L.rotateHandle=function(t,e,i){return new L.RotateHandle(t,e,i)}},350:function(){L.ScaleHandle=L.EditHandle.extend({options:{TYPE:"scale",icon:L.icon({iconUrl:"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2ZXJzaW9uPSIxLjEiIHdpZHRoPSI0NTkiIGhlaWdodD0iNDY0IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCA1MTIgNTEyIiB4bWw6c3BhY2U9InByZXNlcnZlIiBzdHlsZT0iIj48cmVjdCBpZD0iYmFja2dyb3VuZHJlY3QiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIHg9IjAiIHk9IjAiIGZpbGw9Im5vbmUiIHN0cm9rZT0ibm9uZSIgY2xhc3M9IiIgc3R5bGU9IiIvPjxnIGNsYXNzPSJjdXJyZW50TGF5ZXIiIHN0eWxlPSIiPjx0aXRsZT5MYXllciAxPC90aXRsZT48cGF0aCBkPSJNNDU5LjA0OTE1OTUzMDQ3MTM0LDg2LjkyNjIzNDUxMjU1MDAyIFYwIGgtODUuNzE0NTczMzU2MzEyMDkgdjI3LjA0MzcxNzQwMzkwNDQ1MiBIODUuNzE0NTczMzU2MzEyMDMgVjAgSDAgdjg2LjkyNjIzNDUxMjU1MDAyIGgyNS43MTQzNzIwMDY4OTM2MjYgdjI4OS43NTQxMTUwNDE4MzM0IEgwIHY4Ni45MjYyMzQ1MTI1NTAwMiBoODUuNzE0NTczMzU2MzEyMDkgdi0yNy4wNDM3MTc0MDM5MDQ0NTIgaDI4NS43MTUyNDQ1MjEwNDAzIHYyNy4wNDM3MTc0MDM5MDQ0NTIgaDg1LjcxNDU3MzM1NjMxMjA5IHYtODYuOTI2MjM0NTEyNTUwMDIgaC0yMy44MDk2MDM3MTAwODY2OSBWODYuOTI2MjM0NTEyNTUwMDIgSDQ1OS4wNDkxNTk1MzA0NzEzNCB6TTM4NC43NjMxOTU5NTUwMDA5LDEyLjU1NjAxMTY1MTgxMjc4MSBoNjEuOTA0OTY5NjQ2MjI1Mzk2IHY2Mi43ODAwNTgyNTkwNjM5MSBoLTYxLjkwNDk2OTY0NjIyNTM5NiBWMTIuNTU2MDExNjUxODEyNzgxIHpNMTIuMzgwOTkzOTI5MjQ1MDUsMTIuNTU2MDExNjUxODEyNzgxIGg2MS45MDQ5Njk2NDYyMjUzOTYgdjYyLjc4MDA1ODI1OTA2MzkxIEgxMi4zODA5OTM5MjkyNDUwNSBWMTIuNTU2MDExNjUxODEyNzgxIHpNNzQuMjg1OTYzNTc1NDcwNTMsNDUxLjA1MDU3MjQxNTEyMDY2IEgxMi4zODA5OTM5MjkyNDUwNSB2LTYyLjc4MDA1ODI1OTA2MzkxIGg2MS45MDQ5Njk2NDYyMjUzOTYgVjQ1MS4wNTA1NzI0MTUxMjA2NiB6TTQ0NS43MTU3ODE0NTI4MjI3NCw0NTEuMDUwNTcyNDE1MTIwNjYgaC02Mi44NTczNTM3OTQ2Mjg4NjQgdi02Mi43ODAwNTgyNTkwNjM5MSBoNjIuODU3MzUzNzk0NjI4ODY0IFY0NTEuMDUwNTcyNDE1MTIwNjYgek00MDcuNjIwNDE1NTE2Njg0MjYsMzc2LjY4MDM0OTU1NDM4MzQ0IGgtMzYuMTkwNTk3NjM5MzMxNzcgdjMyLjgzODc5OTcwNDc0MTEyIEg4NS43MTQ1NzMzNTYzMTIwMyB2LTMyLjgzODc5OTcwNDc0MTEyIEg0OS41MjM5NzU3MTY5ODAzMiBWODYuOTI2MjM0NTEyNTUwMDIgaDM2LjE5MDU5NzYzOTMzMTc3IFY1MC4yMjQwNDY2MDcyNTExMjUgaDI4Ny42MjAwMTI4MTc4NDcyIHYzNi43MDIxODc5MDUyOTg5IGgzNC4yODU4MjkzNDI1MjQ4MzUgVjM3Ni42ODAzNDk1NTQzODM0NCB6IiBpZD0ic3ZnXzIiIGNsYXNzPSIiIGZpbGw9IiMxYTFhZWIiIGZpbGwtb3BhY2l0eT0iMSIvPjwvZz48L3N2Zz4=",iconSize:[32,32],iconAnchor:[16,16]})},_onHandleDrag:function(){var t=this._handled,e=t._map,i=t.edgeMinWidth,o=t.getCorner(this._corner),n=this.getLatLng(),a=this._calculateScalingFactor(o,n);i||(i=50);var s=e.latLngToLayerPoint(t.getCorner(0)),r=e.latLngToLayerPoint(t.getCorner(1)),l=Math.abs(s.x-r.x),c=Math.abs(s.y-r.y);Math.sqrt(l*l+c*c)>i||a>1?t.scaleBy(a):t.scaleBy(1)},updateHandle:function(){this.setLatLng(this._handled.getCorner(this._corner))}}),L.scaleHandle=function(t,e,i){return new L.ScaleHandle(t,e,i)}},719:function(){L.distortableImage=L.DistortableImage||{},L.distortableImage=L.DistortableImage,L.DistortableImage.group_action_map={},L.DistortableImage.ControlBar=L.Toolbar2.Control.extend({}),L.distortableImage.controlBar=function(t){return new L.DistortableImage.ControlBar(t)},L.DistortableCollection.addInitHook((function(){this.ACTIONS=[L.ExportAction,L.DeleteAction,L.LockAction,L.UnlockAction],L.DistortableCollection.Edit.MODES={lock:L.LockAction,unlock:L.UnlockAction};var t=this.options.actions?this.options.actions:this.ACTIONS;this.editing=L.distortableCollection.edit(this,{actions:t})}))},93:function(){L.DistortableImage=L.DistortableImage||{},L.distortableImage=L.DistortableImage,L.DistortableImage.action_map={},L.DistortableImage.PopupBar=L.Toolbar2.Popup.extend({options:{anchor:[0,-10]},initialize:function(t,e){L.setOptions(this,e),L.Toolbar2.Popup.prototype.initialize.call(this,t,e)},addHooks:function(t,e){this.map=t,this.ov=e},tools:function(){if(this._ul)return this._ul.children},clickTool:function(t){for(var e=this.tools(),i=0;i',_symbols:"",render:function(){return this.addSymbols(this._symbols),this._svg},addSymbols:function(t){this._svg+=t}})},261:function(){L.KeymapperIconSet=L.IconSet.extend({_symbols:''})},929:function(){L.ToolbarIconSet=L.IconSet.extend({_symbols:''})},496:function(){L.Map.mergeOptions({boxCollector:!0,boxZoom:!1}),L.Map.BoxCollector=L.Map.BoxZoom.extend({initialize:function(t){this._map=t,this._container=t._container,this._pane=t._panes.overlayPane,this._resetStateTimeout=0,t.on("unload",this._destroy,this)},addHooks:function(){L.DomEvent.on(this._container,"mousedown",this._onMouseDown,this)},removeHooks:function(){L.DomEvent.off(this._container,"mousedown",this._onMouseDown,this)},moved:function(){return this._moved},_destroy:function(){L.DomUtil.remove(this._pane),delete this._pane},_resetState:function(){this._resetStateTimeout=0,this._moved=!1},_clearDeferredResetState:function(){0!==this._resetStateTimeout&&(clearTimeout(this._resetStateTimeout),this._resetStateTimeout=0)},_onMouseDown:function(t){if(!t.shiftKey||1!==t.which&&1!==t.button)return!1;this._clearDeferredResetState(),this._resetState(),L.DomUtil.disableTextSelection(),L.DomUtil.disableImageDrag(),this._startPoint=this._map.mouseEventToContainerPoint(t),L.DomEvent.on(document,{contextmenu:L.DomEvent.stop,mousemove:this._onMouseMove,mouseup:this._onMouseUp},this)},_onMouseMove:function(t){this._moved||(this._moved=!0,this._box=L.DomUtil.create("div","leaflet-zoom-box",this._container),L.DomUtil.addClass(this._container,"leaflet-crosshair"),this._map.fire("boxzoomstart")),this._point=this._map.mouseEventToContainerPoint(t),this._bounds=L.bounds(this._startPoint,this._point);var e=this._bounds.getSize();L.DomUtil.setPosition(this._box,this._bounds.min),this._box.style.width=e.x+"px",this._box.style.height=e.y+"px"},_finish:function(){this._moved&&(L.DomUtil.remove(this._box),L.DomUtil.removeClass(this._container,"leaflet-crosshair")),L.DomUtil.enableTextSelection(),L.DomUtil.enableImageDrag(),L.DomEvent.off(document,{contextmenu:L.DomEvent.stop,mousemove:this._onMouseMove,mouseup:this._onMouseUp},this)},_onMouseUp:function(t){if((1===t.which||1===t.button)&&(this._finish(),this._moved)){this._clearDeferredResetState(),this._resetStateTimeout=setTimeout(L.Util.bind(this._resetState,this),0);var e=L.latLngBounds(this._map.containerPointToLatLng(this._bounds.getBottomLeft()),this._map.containerPointToLatLng(this._bounds.getTopRight())),i=this._map.getZoom(),o=this._map.getCenter();e=this._map._latLngBoundsToNewLayerBounds(e,i,o),this._map.fire("boxcollectend",{boxCollectBounds:e})}}}),L.Map.addInitHook("addHandler","boxCollector",L.Map.BoxCollector)},291:function(){L.Map.mergeOptions({doubleClickLabels:!0}),L.Map.DoubleClickLabels=L.Map.DoubleClickZoom.extend({enable:function(){var t=this._map;return this._enabled||(t.doubleClickZoom.enabled()&&t.doubleClickZoom.disable(),this._map.fire("singleclickon"),this._enabled=!0,this.addHooks()),this},disable:function(){return this._enabled?(this._enabled=!1,this.removeHooks(),this):this},_fireIfSingle:function(t){var e=this._map,i=t.originalEvent;i&&i.shiftKey||(e._clicked+=1,this._map._clickTimeout=setTimeout((function(){1===e._clicked?(e._clicked=0,e.fire("singleclick",{type:"singleclick"})):L.Browser.touch&&i&&i.sourceCapabilities.firesTouchEvents&&e.fire("dblclick")}),250))},_onDoubleClick:function(){var t=this._map,e=t._labels;setTimeout((function(){t._clicked=0,clearTimeout(t._clickTimeout)}),0),e&&(1===e.options.opacity?(e.options.opacity=0,e.setOpacity(0)):(e.options.opacity=1,e.setOpacity(1)))}}),L.Map.addInitHook("addHandler","doubleClickLabels",L.Map.DoubleClickLabels)},752:function(){L.Map.DoubleClickZoom.include({addHooks:function(){this._map.on({click:this._fireIfSingle,dblclick:this._onDoubleClick},this)},removeHooks:function(){this._map.off({click:this._fireIfSingle,dblclick:this._onDoubleClick},this)},enable:function(){return this._enabled||this._map.doubleClickLabels&&this._map.doubleClickLabels.enabled()||(this._map.fire("singleclickon"),this._enabled=!0,this.addHooks()),this},disable:function(){return this._enabled?(this._map.fire("singleclickoff"),this._enabled=!1,this.removeHooks(),this):this},_fireIfSingle:function(t){var e=this._map,i=t.originalEvent;i&&i.shiftKey||(e._clicked+=1,this._map._clickTimeout=setTimeout((function(){1===e._clicked?(e._clicked=0,e.fire("singleclick",{type:"singleclick"})):L.Browser.touch&&i&&i.sourceCapabilities.firesTouchEvents&&e._fireDOMEvent(i,"dblclick",[e])}),250))},_onDoubleClick:function(t){var e=this._map,i=t.originalEvent;if(setTimeout((function(){e._clicked=0,clearTimeout(e._clickTimeout)}),0),!i)return!1;var o=e.getZoom(),n=e.options.zoomDelta,a=i.shiftKey?o-n:o+n;"center"===e.options.doubleClickZoom?e.setZoom(a):e.setZoomAround(t.containerPoint,a)}})},131:function(){L.Map.include({_clicked:0,addGoogleMutant:function(t){return(t=this.mutantOptions=L.extend({mutantOpacity:.8,maxZoom:24,maxNativeZoom:20,minZoom:0,labels:!0,labelOpacity:1,doubleClickLabels:!0},t)).labels||(this.mutantOptions=L.extend(this.mutantOptions,{labelOpacity:t.labels?1:void 0,doubleClickLabels:!!t.labels||void 0})),this._googleMutant=L.tileLayer("http://mt0.google.com/vt/lyrs=s&x={x}&y={y}&z={z}",{maxZoom:t.maxZoom,maxNativeZoom:t.maxNativeZoom,minZoom:t.minZoom,opacity:t.mutantOpacity}).addTo(this),t.labels?this._addLabels(t):this.doubleClickLabels=void 0,this},_addLabels:function(t){return 0!==t.labelOpacity&&1!==t.labelOpacity&&(t.labelOpacity=1),this._labels=L.tileLayer("https://stamen-tiles-{s}.a.ssl.fastly.net/toner-labels/{z}/{x}/{y}{r}.{ext}",{attribution:'Map tiles by Stamen Design, CC BY 3.0 — Map data © OpenStreetMap contributors',subdomains:"abcd",interactive:!1,opacity:t.labelOpacity,maxZoom:t.maxZoom,maxNativeZoom:t.maxNativeZoom,minZoom:t.minZoom,ext:"png"}).addTo(this),this.mutantOptions.doubleClickLabels&&this.doubleClickLabels.enable(),this}}),L.Map.addInitHook((function(){this.doubleClickLabels.disable(),this.doubleClickZoom.enable()}))},999:function(){L.DomUtil=L.extend(L.DomUtil,{initTranslation:function(t){this.translation=t},getMatrixString:function(t){var e=L.Browser.webkit3d||L.Browser.gecko3d||L.Browser.ie3d,i=[t[0],t[3],0,t[6],t[1],t[4],0,t[7],0,0,1,0,t[2],t[5],0,t[8]],o=e?"matrix3d("+i.join(",")+")":"";return e||console.log("Your browser must support 3D CSS transformsin order to use DistortableImageOverlay."),o},toggleClass:function(t,e){var i=e;return this.hasClass(t,i)?this.removeClass(t,i):this.addClass(t,i)},confirmDelete:function(){return window.confirm(this.translation.confirmImageDelete)},confirmDeletes:function(t){if(1===t)return this.confirmDelete();var e,i=this.translation.confirmImagesDeletes;return e="function"==typeof i?i(t):i,window.confirm(e)}})},85:function(){L.IconUtil={create:function(t){return/^#/.test(t)&&(t=t.replace(/^#/,"")),''},addClassToSvg:function(t,e){var i=t.querySelector("svg");i&&L.DomUtil.addClass(i,e)},toggleXlink:function(t,e,i){/^#/.test(e)||(e="#"+e),/^#/.test(i)||(i="#"+i);var o=t.querySelector("use");if(o){var n=o.getAttribute("xlink:href")===e?i:e;return o.setAttribute("xlink:href",n),n}return!1},toggleTitle:function(t,e,i){var o=t.getAttribute("title")===e?i:e;return t.setAttribute("title",o),t.hasAttribute("aria-label")&&t.setAttribute("aria-label",o),o}}},351:function(){L.ImageUtil={getCmPerPixel:function(t){var e=t._map;return 100*e.latLngToLayerPoint(t.getCorner(0)).distanceTo(e.latLngToLayerPoint(t.getCorner(1)))/t.getElement().width}}},360:function(){L.MatrixUtil={adj:function(t){return[t[4]*t[8]-t[5]*t[7],t[2]*t[7]-t[1]*t[8],t[1]*t[5]-t[2]*t[4],t[5]*t[6]-t[3]*t[8],t[0]*t[8]-t[2]*t[6],t[2]*t[3]-t[0]*t[5],t[3]*t[7]-t[4]*t[6],t[1]*t[6]-t[0]*t[7],t[0]*t[4]-t[1]*t[3]]},multmm:function(t,e){var i,o=[];for(i=0;i<3;i++)for(var n=0;n<3;n++){for(var a=0,s=0;s<3;s++)a+=t[3*i+s]*e[3*s+n];o[3*i+n]=a}return o},multmv:function(t,e){return[t[0]*e[0]+t[1]*e[1]+t[2]*e[2],t[3]*e[0]+t[4]*e[1]+t[5]*e[2],t[6]*e[0]+t[7]*e[1]+t[8]*e[2]]},multsm:function(t,e){for(var i=[],o=0,n=e.length;o2&&void 0!==arguments[2]?arguments[2]:"deg";return"deg"===i?this.radiansToDegrees(Math.atan2(e,t)):Math.atan2(e,t)},radiansToDegrees:function(t){return 180*t/Math.PI},degreesToRadians:function(t){return t*Math.PI/180}}},866:function(){L.Utils={initTranslation:function(){var t={deleteImage:"Delete Image",deleteImages:"Delete Images",distortImage:"Distort Image",dragImage:"Drag Image",exportImage:"Export Image",exportImages:"Export Images",removeBorder:"Remove Border",addBorder:"Add Border",freeRotateImage:"Free rotate Image",geolocateImage:"Geolocate Image",lockMode:"Lock Mode",lockImages:"Lock Images",makeImageOpaque:"Make Image Opaque",makeImageTransparent:"Make Image Transparent",restoreImage:"Restore Natural Image",rotateImage:"Rotate Image",scaleImage:"Scale Image",stackToFront:"Stack to Front",stackToBack:"Stack to Back",unlockImages:"Unlock Images",confirmImageDelete:"Are you sure? This image will be permanently deleted from the map.",confirmImagesDeletes:"Are you sure? These images will be permanently deleted from the map."};if(this.options.translation)for(var e in t)this.options.translation.hasOwnProperty(e)||(this.options.translation[e]=t[e]);else this.options.translation=t;L.DomUtil.initTranslation(this.options.translation)},getNestedVal:function(t,e,i){return[e,i].reduce((function(t,e){return t&&t[e]}),t)}}}};t[999](),t[85](),t[351](),t[360](),t[682](),t[866](),t[477](),t[808](),t[743](),t[988](),t[92](),t[194](),t[206](),t[789](),t[337](),t[350](),t[376](),t[261](),t[929](),t[280](),t[426](),t[114](),t[231](),t[541](),t[149](),t[74](),t[691](),t[105](),t[944](),t[954](),t[178](),t[547](),t[886](),t[129](),t[93](),t[719](),t[397](),t[428](),t[782](),t[752](),t[496](),t[291](),t[131]()}(); //# sourceMappingURL=leaflet.distortableimage.js.map \ No newline at end of file diff --git a/src/edit/iconsets/IconSet.js b/src/edit/iconsets/IconSet.js new file mode 100644 index 000000000..e7ab498b3 --- /dev/null +++ b/src/edit/iconsets/IconSet.js @@ -0,0 +1,17 @@ +/* this is the baseclass other IconSets inherit from, +* we don't use it directly */ +L.IconSet = L.Class.extend({ + + _svg: '', + + _symbols: '', + + render() { + this.addSymbols(this._symbols); + return this._svg; + }, + + addSymbols(symbols) { + this._svg += symbols; + }, +}); diff --git a/src/edit/iconsets/KeymapperIconSet.js b/src/edit/iconsets/KeymapperIconSet.js new file mode 100644 index 000000000..346e948ca --- /dev/null +++ b/src/edit/iconsets/KeymapperIconSet.js @@ -0,0 +1,7 @@ +L.KeymapperIconSet = L.IconSet.extend({ + + _symbols: + // eslint-disable-next-line max-len + '', + +}); diff --git a/src/edit/iconsets/ToolbarIconSet.js b/src/edit/iconsets/ToolbarIconSet.js new file mode 100644 index 000000000..343cbc732 --- /dev/null +++ b/src/edit/iconsets/ToolbarIconSet.js @@ -0,0 +1,23 @@ +/* eslint-disable max-len */ +L.ToolbarIconSet = L.IconSet.extend({ + _symbols: + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '', +}); From 4ced8eb94c3e8cc2df81387a27c96ea565d3d35f Mon Sep 17 00:00:00 2001 From: segun Date: Sat, 10 Dec 2022 14:55:22 +0100 Subject: [PATCH 02/57] updated select.html --- dist/leaflet.distortableimage.js | 2 +- examples/js/select.js | 58 ++++++++++++++++++++++++++++++ examples/select.html | 61 +------------------------------- src/DistortableCollection.js | 28 +++++++++++++++ src/edit/actions/ExportAction.js | 1 + 5 files changed, 89 insertions(+), 61 deletions(-) create mode 100644 examples/js/select.js diff --git a/dist/leaflet.distortableimage.js b/dist/leaflet.distortableimage.js index 7c8e6e4f0..22ff720a0 100644 --- a/dist/leaflet.distortableimage.js +++ b/dist/leaflet.distortableimage.js @@ -1,2 +1,2 @@ -!function(){var t={808:function(){var t=[];L.DistortableCollection=L.FeatureGroup.extend({options:{editable:!0,exportOpts:{exportStartUrl:"//export.mapknitter.org/export",statusUrl:"//export.mapknitter.org",exportUrl:"http://export.mapknitter.org/"}},initialize:function(t){L.setOptions(this,t),L.FeatureGroup.prototype.initialize.call(this,t),L.Utils.initTranslation.call(this),this.editable=this.options.editable},onAdd:function(t){L.FeatureGroup.prototype.onAdd.call(this,t),this._map=t,this.editable&&this.editing.enable(),this.on("layeradd",this._addEvents,this),this.on("layerremove",this._removeEvents,this)},onRemove:function(){this.editing&&this.editing.disable(),this.off("layeradd",this._addEvents,this),this.off("layerremove",this._removeEvents,this)},_addEvents:function(t){var e=t.layer;L.DomEvent.on(e,{dragstart:this._dragStartMultiple,drag:this._dragMultiple},this),L.DomEvent.on(e.getElement(),{mousedown:this._deselectOthers,contextmenu:this._longPressMultiSelect},this)},_removeEvents:function(t){var e=t.layer;L.DomEvent.off(e,{dragstart:this._dragStartMultiple,drag:this._dragMultiple},this),L.DomEvent.off(e.getElement(),{mousedown:this._deselectOthers,contextmenu:this._longPressMultiSelect},this)},_longPressMultiSelect:function(t){var e=this;this.editable&&(t.preventDefault(),this.eachLayer((function(i){var o=i.editing;i.getElement()===t.target&&o.enabled()&&(L.DomUtil.toggleClass(i.getElement(),"collected"),e.anyCollected()?(i.deselect(),e.editing._addToolbar()):e.editing._removeToolbar())})))},isCollected:function(t){return L.DomUtil.hasClass(t.getElement(),"collected")},anyCollected:function(){return this.getLayers().some(this.isCollected.bind(this))},_toggleCollected:function(e,i){e.shiftKey&&i.editing.enabled()&&(L.DomUtil.toggleClass(e.target,"collected"),t.every((function(t){return t._leaflet_id!==i._leaflet_id}))?t.push(i):t.splice(t.indexOf(i),1)),this.anyCollected()?i.deselect():this.editing._removeToolbar()},_deselectOthers:function(t){var e=this;this.editable&&(this.eachLayer((function(i){i.getElement()!==t.target?i.deselect():e._toggleCollected(t,i)})),t&&L.DomEvent.stopPropagation(t))},_dragStartMultiple:function(t){var e,i=t.target,o=this._map;this.isCollected(i)&&this.eachLayer((function(t){for(t._dragStartPoints={},t.deselect(),e=0;e<4;e++){var i=t.getCorner(e);t._dragStartPoints[e]=o.latLngToLayerPoint(i)}}))},_dragMultiple:function(t){var e=t.target,i=this._map;if(this.isCollected(e)){var o=i.latLngToLayerPoint(e.getCorner(0)),n=e._dragStartPoints[0].subtract(o);this._updateCollectionFromPoints(n,e)}},_toRemove:function(){var t=this;return this.getLayers().filter((function(e){var i=e.editing._mode;return t.isCollected(e)&&"lock"!==i}))},_toMove:function(t){var e=this;return this.getLayers().filter((function(i){var o=i.editing._mode;return i!==t&&e.isCollected(i)&&"lock"!==o}))},_updateCollectionFromPoints:function(t,e){var i,o=this._toMove(e),n=new L.Transformation(1,-t.x,1,-t.y);o.forEach((function(t){var e={};for(i=0;i<4;i++)e[i]=n.transform(t._dragStartPoints[i]);t.setCornersFromPoints(e)}))},_getAvgCmPerPixel:function(t){return t.reduce((function(t,e){return t+e.cm_per_pixel}),0)/t.length},generateExportJson:function(){var t={images:[]};return this.eachLayer((function(e){if(this.isCollected(e)){var i=e._image.src.split("/"),o=i[i.length-1],n=e.getCorners(),a=[{lat:n[0].lat,lon:n[0].lng},{lat:n[1].lat,lon:n[1].lng},{lat:n[3].lat,lon:n[3].lng},{lat:n[2].lat,lon:n[2].lng}];t.images.push({id:e._leaflet_id,src:e._image.src,width:e._image.width,height:e._image.height,image_file_name:o,nodes:a,cm_per_pixel:L.ImageUtil.getCmPerPixel(e)})}}),this),t.images=t.images.reverse(),t.avg_cm_per_pixel=this._getAvgCmPerPixel(t.images),t}}),L.distortableCollection=function(t,e){return new L.DistortableCollection(t,e)}},477:function(){L.DistortableImageOverlay=L.ImageOverlay.extend({options:{height:200,crossOrigin:!0,edgeMinWidth:50,editable:!0,mode:"distort",selected:!1},initialize:function(t,e){L.setOptions(this,e),L.Utils.initTranslation.call(this),this.edgeMinWidth=this.options.edgeMinWidth,this.editable=this.options.editable,this._selected=this.options.selected,this._url=t,this.rotation={}},onAdd:function(t){var e=this;this._map=t,this.getElement()||this._initImage(),t.on("viewreset",this._reset,this),this.options.corners&&(this._corners=this.options.corners,t.options.zoomAnimation&&L.Browser.any3d&&t.on("zoomanim",this._animateZoom,this)),L.DomEvent.on(this.getElement(),"load",(function(){if(e.getPane().appendChild(e.getElement()),e._initImageDimensions(),e.options.rotation){var i=e.options.rotation.deg>=0?"deg":"rad";e.setAngle(e.options.rotation[i],i)}else e.rotation={deg:0,rad:0},e._reset();e._corners||t.options.zoomAnimation&&L.Browser.any3d&&t.on("zoomanim",e._animateZoom,e);var o=e._eventParents;o?(e.eP=o[Object.keys(o)[0]],e.eP.editable&&e.editing.enable()):(e.editable&&e.editing.enable(),e.eP=null)})),L.DomEvent.on(this.getElement(),"click",this.select,this),L.DomEvent.on(t,{singleclickon:this._singleClickListeners,singleclickoff:this._resetClickListeners,singleclick:this._singleClick},this),t.doubleClickZoom.enabled()||t.doubleClickLabels.enabled()||L.DomEvent.on(t,"click",this.deselect,this),this.fire("add")},onRemove:function(t){L.DomEvent.off(this.getElement(),"click",this.select,this),L.DomEvent.off(t,{singleclickon:this._singleClickListeners,singleclickoff:this._resetClickListeners,singleclick:this._singleClick},this),L.DomEvent.off(t,"click",this.deselect,this),this.editing&&this.editing.disable(),this.fire("remove"),L.ImageOverlay.prototype.onRemove.call(this,t)},_initImageDimensions:function(){var t=this._map,e=L.DomUtil.getStyle(this.getElement(),"width"),i=L.DomUtil.getStyle(this.getElement(),"height"),o=parseInt(e)/parseInt(i),n=this.options.height,a=parseInt(o*n),s=t.project(t.getCenter()),r=L.point(a,n).divideBy(2);this.options.corners?this._corners=this.options.corners:this._corners=[t.unproject(s.subtract(r)),t.unproject(s.add(L.point(r.x,-r.y))),t.unproject(s.add(L.point(-r.x,r.y))),t.unproject(s.add(r))],this._initialDimensions={center:s,offset:r,zoom:t.getZoom()},this.setBounds(L.latLngBounds(this.getCorners()))},_singleClick:function(t){"singleclick"===t.type&&this.deselect()},_singleClickListeners:function(){var t=this._map;L.DomEvent.off(t,"click",this.deselect,this),L.DomEvent.on(t,"singleclick",this.deselect,this)},_resetClickListeners:function(){var t=this._map;L.DomEvent.on(t,"click",this.deselect,this),L.DomEvent.off(t,"singleclick",this.deselect,this)},isSelected:function(){return this._selected},deselect:function(){var t=this.editing;if(t.enabled())return t._removeToolbar(),t._hideMarkers(),this._selected=!1,this.fire("deselect"),this},select:function(t){var e=this.editing,i=this.eP;if(e.enabled()){if(t&&L.DomEvent.stopPropagation(t),this._programmaticGrouping(),this._selected=!0,e._addToolbar(),e._showMarkers(),this.fire("select"),!i||!i.anyCollected())return this;this.deselect()}},_programmaticGrouping:function(){this._map.eachLayer((function(t){t instanceof L.DistortableImageOverlay&&t.deselect()}))},setCorner:function(t,e){var i=this.editing;return this._corners[t]=e,this.setBounds(L.latLngBounds(this.getCorners())),this.fire("update"),i.toolbar&&i.toolbar instanceof L.DistortableImage.PopupBar&&i._updateToolbarPos(),this.edited=!0,this},_cornerExceedsMapLats:function(t,e,i){return i.options.crs.Simple!=L.CRS.Simple&&(0===t?(o=i.project(e).y<2,n=i.project(e).y>=255):(o=i.project(e).y/t<2,n=i.project(e).y/Math.pow(2,t)>=255),o||n);var o,n},setCorners:function(t){var e=this._map,i=e.getZoom(),o=this.editing,n=0;for(var a in t)if(this._cornerExceedsMapLats(i,t[a],e))return this.setBounds(L.latLngBounds(this.getCorners())),void this.fire("update");for(var s in t)this._corners[n]=t[s],n+=1;return this.setBounds(L.latLngBounds(this.getCorners())),this.fire("update"),o.toolbar&&o.toolbar instanceof L.DistortableImage.PopupBar&&o._updateToolbarPos(),this.edited=!0,this},setCornersFromPoints:function(t){var e=this._map,i=e.getZoom(),o=this.editing,n=0;for(var a in t){var s=e.layerPointToLatLng(t[a]);if(this._cornerExceedsMapLats(i,s,e))return this.setBounds(L.latLngBounds(this.getCorners())),void this.fire("update")}for(var r in t)this._corners[n]=e.layerPointToLatLng(t[r]),n+=1;return this.setBounds(L.latLngBounds(this.getCorners())),this.fire("update"),o.toolbar&&o.toolbar instanceof L.DistortableImage.PopupBar&&o._updateToolbarPos(),this.edited=!0,this},scaleBy:function(t){var e,i,o=this._map,n=o.project(this.getCenter()),a={};if(0!==t){for(e=0;e<4;e++)i=o.project(this.getCorner(e)).subtract(n).multiplyBy(t).add(n),a[e]=o.unproject(i);return this.setCorners(a),this}},getAngle:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"deg",e=this.getElement().style[L.DomUtil.TRANSFORM].split("matrix3d")[1].slice(1,-1).split(","),i=e[0],o=e[1],n=e[4],a=e[5],s=i*a-o*n,r=L.TrigUtil.calcAngle(i,o,"rad");return s<0&&(r+=r<0?Math.PI:-Math.PI),r<0&&(r=2*Math.PI+r),"deg"===t?Math.round(L.TrigUtil.radiansToDegrees(r)):L.Util.formatNum(r,2)},setAngle:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"deg",i=this.getAngle(e),o=t-i;return this.rotateBy(o,e),this},rotateBy:function(t){var e,i,o,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"deg",a=this._map,s=a.project(this.getCenter()),r={};for("deg"===n&&(t=L.TrigUtil.degreesToRadians(t)),e=0;e<4;e++)i=a.project(this.getCorner(e)).subtract(s),o=L.point(Math.cos(t)*i.x-Math.sin(t)*i.y,Math.sin(t)*i.x+Math.cos(t)*i.y),r[e]=a.unproject(o.add(s));return this.setCorners(r),this},dragBy:function(t,e){var i,o,n=this._map,a={},s=n.project(t).subtract(n.project(e));for(i=0;i<4;i++)o=n.project(this.getCorner(i)).subtract(s),a[i]=n.unproject(o);this.setCorners(a)},restore:function(){for(var t=this._map,e=this._initialDimensions.center,i=this._initialDimensions.offset,o=this._initialDimensions.zoom,n=[e.subtract(i),e.add(L.point(i.x,-i.y)),e.add(L.point(-i.x,i.y)),e.add(i)],a=0;a<4;a++)t.unproject(n[a],o).equals(this.getCorner(a))||this.setCorner(a,t.unproject(n[a],o));return this.edited=!1,this.fire("restore"),this},_getTranslateString:function(t){var e=L.Browser.webkit3d,i=(e?",0":"")+")";return"translate"+(e?"3d":"")+"("+t.x+"px,"+t.y+"px"+i},_reset:function(){var t=this._map,e=this.getElement(),i=L.bind(t.latLngToLayerPoint,t),o=this._calculateProjectiveTransform(i),n=i(this.getCorner(0)),a=L.DomUtil.getMatrixString(o),s=this._getTranslateString(n);e._leaflet_pos=n,e.style[L.DomUtil.TRANSFORM]=[s,a].join(" "),e.style[L.DomUtil.TRANSFORM+"-origin"]="0 0 0",this.rotation.deg=this.getAngle(),this.rotation.rad=this.getAngle("rad")},_animateZoom:function(t){var e=this._map,i=this.getElement(),o=function(i){return e._latLngToNewLayerPoint(i,t.zoom,t.center)},n=this._calculateProjectiveTransform(o),a=o(this.getCorner(0)),s=L.DomUtil.getMatrixString(n),r=this._getTranslateString(a);i._leaflet_pos=a,i.style[L.DomUtil.TRANSFORM]=[r,s].join(" ")},getCorners:function(){return this._corners},getCorner:function(t){return this._corners[t]},getCenter:function(){var t=this._map,e=this.getCorners().reduce((function(e,i){return e.add(t.project(i))}),L.point(0,0));return t.unproject(e.divideBy(4))},_calculateProjectiveTransform:function(t){var e,i=t(this.getCorner(0)),o=this.getElement().offsetWidth||500,n=this.getElement().offsetHeight||375,a=[];for(e=0;e<4;e++)a.push(t(this.getCorner(e))._subtract(i));return L.MatrixUtil.general2DProjection(0,0,a[0].x,a[0].y,o,0,a[1].x,a[1].y,0,n,a[2].x,a[2].y,o,n,a[3].x,a[3].y)}}),L.distortableImageOverlay=function(t,e){return new L.DistortableImageOverlay(t,e)},L.Map.addInitHook((function(){L.DomUtil.hasClass(this.getContainer(),"ldi")||L.DomUtil.addClass(this.getContainer(),"ldi")}))},782:function(){var t=this;L.DomUtil=L.DomUtil||{},L.DistortableImage=L.DistortableImage||{},L.distortableImage=L.DistortableImage,L.DistortableImage.Keymapper=L.Handler.extend({options:{position:"topright"},initialize:function(t,e){this._map=t,L.setOptions(this,e)},addHooks:function(){this._keymapper||(this._container=this._buildContainer(),this._scrollWrapper=this._wrap(),this._toggler=this._createButton(),this._setMapper(this._container,this._scrollWrapper,this._toggler),L.DomEvent.on(this._toggler,"click",this._toggleKeymapper,this),L.DomEvent.disableClickPropagation(this._container),L.DomEvent.disableScrollPropagation(this._container))},removeHooks:function(){this._keymapper&&(L.DomEvent.off(this._toggler,"click",this._toggleKeymapper,this),L.DomUtil.remove(this._toggler),L.DomUtil.remove(this._scrollWrapper),L.DomUtil.remove(this._container),this._keymapper=!1)},_buildContainer:function(){var t=L.DomUtil.create("div","ldi-keymapper-hide");t.setAttribute("id","ldi-keymapper");var e=L.DomUtil.create("br","divider");return t.appendChild(e),t},_createButton:function(){var t=L.DomUtil.create("a","");return t.innerHTML=L.IconUtil.create("keyboard_open"),t.setAttribute("id","toggle-keymapper"),t.setAttribute("href","#"),t.setAttribute("title","Show keymap"),t.setAttribute("role","button"),t.setAttribute("aria-label","Show keymap"),t},_wrap:function(){var t=L.DomUtil.create("div","");return t.setAttribute("id","keymapper-wrapper"),t.style.display="none",t},_setMapper:function(t,e,i){this._keymapper=L.control({position:this.options.position}),this._keymapper.onAdd=function(){return t.appendChild(e),e.insertAdjacentHTML("beforeend",'
Rotate Mode
R
RotateScale Mode
r
Scale Mode
s
Distort Mode
d
Drag Mode
D
Lock (Mode) / Unlock Image
l u
Stack up / down
q a
Add / Remove Image Border
b
Toggle Opacity
o
Deselect All
esc
Delete Image(s)
delete backspace
Export Image(s)
e
'),t.appendChild(i),t},this._keymapper.addTo(this._map)},_toggleKeymapper:function(t){t.preventDefault(),this._container.className="ldi-keymapper leaflet-control"===this._container.className?"ldi-keymapper-hide leaflet-control":"ldi-keymapper leaflet-control",this._scrollWrapper.style.display="none"===this._scrollWrapper.style.display?"block":"none",this._toggler.innerHTML="close"===this._toggler.innerHTML?L.IconUtil.create("keyboard_open"):"close",L.IconUtil.toggleTitle(this._toggler,"Show keymap","Hide keymap"),L.DomUtil.toggleClass(this._toggler,"close-icon")},_injectIconSet:function(){if(!document.querySelector("#keymapper-iconset")){var t=L.DomUtil.create("div","");t.id="keymapper-iconset",t.setAttribute("hidden","hidden"),this._iconset=(new L.KeymapperIconSet).render(),t.innerHTML=this._iconset,document.querySelector(".leaflet-control-container").appendChild(t)}}}),L.DistortableImage.Keymapper.addInitHook((function(){L.DistortableImage.Keymapper.prototype._n=L.DistortableImage.Keymapper.prototype._n?L.DistortableImage.Keymapper.prototype._n+1:1,1!==L.DistortableImage.Keymapper.prototype._n||L.Browser.mobile||(t.enable(),t._injectIconSet())})),L.distortableImage.keymapper=function(t,e){return new L.DistortableImage.Keymapper(t,e)}},428:function(){L.DistortableImage=L.DistortableImage||{},L.DistortableCollection.Edit=L.Handler.extend({options:{keymap:L.distortableImage.group_action_map},initialize:function(t,e){this._group=t,this._exportOpts=t.options.exportOpts,L.setOptions(this,e),L.distortableImage.group_action_map.Escape="_decollectAll"},addHooks:function(){var t=this._group._map;this.editActions=this.options.actions,this.runExporter=L.bind(L.Utils.getNestedVal(this,"_exportOpts","exporter")||this.startExport,this),L.DomEvent.on(document,"keydown",this._onKeyDown,this),t.doubleClickZoom.enabled()||t.doubleClickLabels.enabled()||L.DomEvent.on(t,"click",this._decollectAll,this),L.DomEvent.on(t,{singleclickon:this._singleClickListeners,singleclickoff:this._resetClickListeners,singleclick:this._singleClick,boxcollectend:this._addCollections},this),this._group.editable=!0,this._group.eachLayer((function(t){return t.editing.enable()}))},removeHooks:function(){var t=this._group._map;L.DomEvent.off(document,"keydown",this._onKeyDown,this),t.doubleClickZoom.enabled()||t.doubleClickLabels.enabled()||L.DomEvent.off(t,"click",this._decollectAll,this),L.DomEvent.off(t,{singleclickon:this._singleClickListeners,singleclickoff:this._resetClickListeners,singleclick:this._singleClick,boxcollectend:this._addCollections},this),this._decollectAll(),this._group.editable=!1,this._group.eachLayer((function(t){return t.editing.disable()}))},enable:function(){return this._enabled=!0,this.addHooks(),this},disable:function(){return this._enabled=!1,this.removeHooks(),this},_onKeyDown:function(t){var e=this.options.keymap[t.key];this[e]&&this._group.anyCollected()&&this[e].call(this)},_singleClick:function(t){"singleclick"===t.type&&this._decollectAll(t)},_singleClickListeners:function(){var t=this._group._map;L.DomEvent.off(t,"click",this._decollectAll,this),L.DomEvent.on(t,"singleclick",this._decollectAll,this)},_resetClickListeners:function(){var t=this._group._map;L.DomEvent.on(t,"click",this._decollectAll,this),L.DomEvent.off(t,"singleclick",this._decollectAll,this)},_decollectAll:function(t){var e;t&&(e=t.originalEvent),e&&(e.shiftKey||e.target instanceof HTMLImageElement)||(this._group.eachLayer((function(t){L.DomUtil.removeClass(t.getElement(),"collected"),t.deselect()})),this._removeToolbar(),t&&L.DomEvent.stopPropagation(t))},_unlockGroup:function(){var t=this;this.hasTool(L.UnlockAction)&&this._group.eachLayer((function(e){t._group.isCollected(e)&&(e.editing._unlock(),e.deselect())}))},_lockGroup:function(){var t=this;this.hasTool(L.LockAction)&&this._group.eachLayer((function(e){t._group.isCollected(e)&&(e.editing._lock(),L.DomUtil.addClass(e.getElement(),"collected"))}))},_addCollections:function(t){var e=this,i=t.boxCollectBounds,o=this._group._map;this._group.eachLayer((function(t){var n=t.editing;t.isSelected()&&t.deselect();var a=o.getZoom(),s=o.getCenter(),r=L.latLngBounds(t.getCorner(2),t.getCorner(1));r=o._latLngBoundsToNewLayerBounds(r,a,s),i.intersects(r)&&n.enabled()&&(e.toolbar||e._addToolbar(),L.DomUtil.addClass(t.getElement(),"collected"))}))},_removeGroup:function(t){var e=this;if(this.hasTool(L.DeleteAction)){var i=this._group._toRemove(),o=i.length;0!==o&&(L.DomUtil.confirmDeletes(o)&&(i.forEach((function(t){e._group.removeLayer(t)})),this._group.anyCollected()||this._removeToolbar()),t&&L.DomEvent.stopPropagation(t))}},cancelExport:function(){this.customCollection||(this._exportOpts.collection=void 0),clearInterval(this.updateInterval)},_addToolbar:function(){var t=this._group,e=t._map;t.options.suppressToolbar||this.toolbar||(this.toolbar=L.distortableImage.controlBar({actions:this.editActions,position:"topleft"}).addTo(e,t))},_removeToolbar:function(){var t=this._group._map;if(!this.toolbar)return!1;t.removeLayer(this.toolbar),this.toolbar=!1},hasTool:function(t){return this.editActions.some((function(e){return e===t}))},addTool:function(t){return"leaflet-toolbar-icon"!==t.baseClass||this.hasTool(t)||(this._removeToolbar(),this.editActions.push(t),this._addToolbar()),this},removeTool:function(t){var e=this;return this.editActions.some((function(i,o){return e.editActions[o]===t&&(e._removeToolbar(),e.editActions.splice(o,1),e._addToolbar(),!0)})),this},startExport:function(){var t=this;if(this.hasTool(L.ExportAction))return new Promise((function(e){var i,o=t._exportOpts;o.resolve=e,t.updateInterval=null,t.customCollection=!!o.collection,t.customCollection||(o.collection=t._group.generateExportJson().images),o.frequency=o.frequency||3e3,o.scale=o.scale||100,o.updater=o.updater||function(n){(n=JSON.parse(n)).status_url&&(i!==n.status_url&&n.status_url.match(".json")&&(i=n.status_url),"complete"===n.status&&(clearInterval(t.updateInterval),t.customCollection||(t._exportOpts.collection=void 0),e(),null!==n.jpg&&alert("Export succeeded. "+o.exportUrl+n.jpg)),console.log(n))},o.handleStatusRes=o.handleStatusRes||function(e){i=o.statusUrl+e,t.updateInterval=setInterval((function(){var t=new Request("".concat(i,"?").concat(Date.now()),{method:"GET"});fetch(t).then((function(t){if(t.ok)return t.text()})).then(o.updater)}),o.frequency)},o.fetchStatusUrl=o.fetchStatusUrl||function(t){var e=new FormData;e.append("collection",JSON.stringify(t.collection)),e.append("scale",t.scale),e.append("upload",!0);var i={method:"POST",body:e},o=new Request(t.exportStartUrl,i);fetch(o).then((function(t){if(t.ok)return t.text()})).then(t.handleStatusRes)},o.fetchStatusUrl(o)}))}}),L.distortableCollection.edit=function(t,e){return new L.DistortableCollection.Edit(t,e)}},397:function(){L.DistortableImage=L.DistortableImage||{},L.DistortableImage.Edit=L.Handler.extend({options:{opacity:.7,outline:"1px solid red",keymap:L.distortableImage.action_map},initialize:function(t,e){this._overlay=t,this._toggledImage=!1,this._mode=t.options.mode,this._transparent=!1,this._outlined=!1,L.setOptions(this,e),L.distortableImage.action_map.Escape="_deselect"},addHooks:function(){var t=this._overlay;this.editActions=this.options.actions,t.bringToFront(),this._initModes(),this._initHandles(),this._appendHandlesandDragable(),t.isSelected()&&!t.options.suppressToolbar&&this._addToolbar(),this.parentGroup=!!t.eP&&t.eP,L.DomEvent.on(t.getElement(),{dblclick:this.nextMode},this),L.DomEvent.on(window,"keydown",this._onKeyDown,this)},removeHooks:function(){var t=this._overlay,e=this.parentGroup;for(var i in this._disableDragging(),this.toolbar&&this._removeToolbar(),this._handles)L.DomUtil.remove(i);L.DomUtil.hasClass(t.getElement(),"collected")&&L.DomUtil.removeClass(t.getElement(),"collected"),e&&!e.anyCollected()&&e.editing.toolbar&&e.editing._removeToolbar(),L.DomEvent.off(t.getElement(),{dblclick:this.nextMode},this),L.DomEvent.off(window,"keydown",this._onKeyDown,this)},disable:function(){return this._enabled?(this._overlay.deselect(),this._enabled=!1,this.removeHooks(),this):this},_initModes:function(){for(var t in this._modes={},L.DistortableImage.Edit.MODES){var e=L.DistortableImage.Edit.MODES[t];-1!==this.editActions.indexOf(e)&&(this._modes[t]=e)}this._modes[this._mode]||(this._mode=Object.keys(this._modes)[0])},_initHandles:function(){var t,e=this._overlay;for(this._dragHandles=L.layerGroup(),t=0;t<4;t++)this._dragHandles.addLayer(L.dragHandle(e,t));for(this._scaleHandles=L.layerGroup(),t=0;t<4;t++)this._scaleHandles.addLayer(L.scaleHandle(e,t));for(this._distortHandles=L.layerGroup(),t=0;t<4;t++)this._distortHandles.addLayer(L.distortHandle(e,t));for(this._rotateHandles=L.layerGroup(),t=0;t<4;t++)this._rotateHandles.addLayer(L.rotateHandle(e,t));for(this._freeRotateHandles=L.layerGroup(),t=0;t<4;t++)this._freeRotateHandles.addLayer(L.freeRotateHandle(e,t));for(this._lockHandles=L.layerGroup(),t=0;t<4;t++)this._lockHandles.addLayer(L.lockHandle(e,t,{draggable:!1}));this._handles={drag:this._dragHandles,scale:this._scaleHandles,distort:this._distortHandles,rotate:this._rotateHandles,freeRotate:this._freeRotateHandles,lock:this._lockHandles}},_appendHandlesandDragable:function(){var t=this._overlay;this._mode?(this._updateHandle(),!t.isSelected()&&this.currentHandle&&this.currentHandle.eachLayer((function(t){t.setOpacity(0),t.dragging&&t.dragging.disable()})),this.isMode("lock")||this._enableDragging()):this._enableDragging()},_onKeyDown:function(t){var e=this.options.keymap[t.key],i=this._overlay,o=this.parentGroup;o&&o.anyCollected()||void 0===this[e]||i.options.suppressToolbar||i.isSelected()&&this.toolbar&&this[e].call(this)},replaceTool:function(t,e){var i=this;return"leaflet-toolbar-icon"!==e.baseClass||this.hasTool(e)||this.editActions.some((function(o,n){if(o===t){for(var a in i._removeToolbar(),i.editActions[n]=e,i._addToolbar(),L.DistortableImage.Edit.MODES)L.DistortableImage.Edit.MODES[a]===t?(delete i._modes[a],i._nextOrNone(a)):L.DistortableImage.Edit.MODES[a]===e&&(i._modes[a]=e);return!0}})),this},addTool:function(t){if("leaflet-toolbar-icon"===t.baseClass&&!this.hasTool(t)){for(var e in this._removeToolbar(),this.editActions.push(t),this._addToolbar(),L.DistortableImage.Edit.MODES)L.DistortableImage.Edit.MODES[e]===t&&(this._modes[e]=t);this._overlay.isSelected()||this._removeToolbar()}return this},hasTool:function(t){return this.editActions.some((function(e){return e===t}))},removeTool:function(t){var e=this;return this.editActions.some((function(i,o){if(i===t){for(var n in e._removeToolbar(),e.editActions.splice(o,1),e._addToolbar(),L.DistortableImage.Edit.MODES)L.DistortableImage.Edit.MODES[n]===t&&(delete e._modes[n],e._nextOrNone(n));return!0}})),this._overlay.isSelected()||this._removeToolbar(),this},_nextOrNone:function(t){this.isMode(t)&&(Object.keys(this.getModes()).length>=1?this.nextMode():("lock"===t&&this._enableDragging(),this._mode="",this._updateHandle()))},_removeToolbar:function(){var t=this._overlay._map;this.toolbar&&(t.removeLayer(this.toolbar),this.toolbar=!1)},_enableDragging:function(){var t=this,e=this._overlay,i=e._map;this.dragging=new L.Draggable(e.getElement()),this.dragging.enable(),this.dragging.on("dragstart",(function(){e.fire("dragstart"),t._removeToolbar()})),this.dragging._updatePosition=function(){var t,o,n=e.getCorner(0),a=this._newPos.subtract(i.latLngToLayerPoint(n)),s={};for(this.fire("predrag"),o=0;o<4;o++)t=i.latLngToLayerPoint(e.getCorner(o)),s[o]=i.layerPointToLatLng(t.add(a));e.setCorners(s),e.fire("drag"),this.fire("drag")},this.dragging.on("dragend",(function(){e.fire("dragend")}))},_disableDragging:function(){this.dragging&&(this.dragging.disable(),delete this.dragging)},_dragMode:function(){this.setMode("drag")},_scaleMode:function(){this.setMode("scale")},_distortMode:function(){this.setMode("distort")},_rotateMode:function(){this.setMode("rotate")},_freeRotateMode:function(){this.setMode("freeRotate")},_toggleLockMode:function(){this.isMode("lock")?this._unlock():this._lock()},_toggleOpacity:function(){var t,e=this._overlay.getElement();this.hasTool(L.OpacityAction)&&(this._transparent=!this._transparent,t=this._transparent?this.options.opacity:1,L.DomUtil.setOpacity(e,t),e.setAttribute("opacity",t),this._refresh())},_toggleBorder:function(){var t,e=this._overlay.getElement();this.hasTool(L.BorderAction)&&(this._outlined=!this._outlined,t=this._outlined?this.options.outline:"none",e.style.outline=t,this._refresh())},_toggleOrder:function(){this._toggledImage?this._stackUp():this._stackDown()},_removeOverlay:function(){var t=this._overlay,e=this.parentGroup;!this.isMode("lock")&&this.hasTool(L.DeleteAction)&&L.DomUtil.confirmDelete()&&(this._removeToolbar(),e?e.removeLayer(t):t._map.removeLayer(t))},_getExport:function(){var t=this._overlay,e=t._map,i=t.getElement();if(this.hasTool(L.ExportAction)){var o=new Image;o.id=o.id||"tempId12345",document.body.appendChild(o),o.onload=function(){var i=o.height,n=o.width,a=e.latLngToLayerPoint(t.getCorner(0)),s=e.latLngToLayerPoint(t.getCorner(1)),r=e.latLngToLayerPoint(t.getCorner(2)),l=e.latLngToLayerPoint(t.getCorner(3));o.onload=function(){L.DomUtil.remove(o)},window&&window.hasOwnProperty("warpWebGl")&&warpWebGl(o.id,[0,0,n,0,n,i,0,i],[a.x,a.y,s.x,s.y,l.x,l.y,r.x,r.y],!0)},o.src=t.options.fullResolutionSrc||i.src}},_stackUp:function(){this._toggledImage&&this.hasTool(L.StackAction)&&(this._toggledImage=!1,this._overlay.bringToFront(),this._refresh())},_stackDown:function(){!this._toggledImage&&this.hasTool(L.StackAction)&&(this._toggledImage=!0,this._overlay.bringToBack(),this._refresh())},_unlock:function(){var t=this._overlay,e=t._map,i=this.parentGroup;this.isMode("lock")&&((!i||i.isCollected(t))&&i||this.hasTool(L.LockAction))&&(this.currentHandle&&e.removeLayer(this.currentHandle),"lock"!==t.options.mode&&this.hasMode(t.options.mode)?this._mode=t.options.mode:(this._mode="",this.currentHandle=""),this._updateHandle(),this._enableDragging(),this._refresh())},_lock:function(){var t=this._overlay,e=t._map,i=this.parentGroup;this.isMode("lock")||((!i||i.isCollected(t))&&i||this.hasTool(L.LockAction))&&(this.currentHandle&&e.removeLayer(this.currentHandle),this._mode="lock",this._updateHandle(),this._disableDragging(),this._refresh())},_deselect:function(){this._overlay.deselect()},_showMarkers:function(t){var e=this.parentGroup;this.currentHandle&&(!this.isMode("lock")&&e&&e.anyCollected()||this.currentHandle.eachLayer((function(t){t.setOpacity(1),t.dragging&&t.dragging.enable(),L.DomUtil.addClass(t.getElement(),"leaflet-interactive")})))},_hideMarkers:function(){var t=this._overlay,e=this.parentGroup;this._handles||this._initHandles(),this.currentHandle&&(this.isMode("lock")&&e&&e.isCollected(t)||this.currentHandle.eachLayer((function(t){t.setOpacity(0),t.dragging&&t.dragging.disable(),L.DomUtil.removeClass(t.getElement(),"leaflet-interactive")})))},_updateHandle:function(){var t=this._overlay._map,e=this.getMode();this.currentHandle&&t.removeLayer(this.currentHandle),this.currentHandle=""===e?"":this._handles[e],""!==this.currentHandle&&t.addLayer(this.currentHandle)},_addToolbar:function(){var t=this._overlay,e=this.parentGroup,i=t._map,o=t.getCorners(),n=-1/0;if(e&&e.anyCollected())e.editing._addToolbar();else if(!t.options.suppressToolbar&&!this.toolbar){for(var a=0;an&&(n=o[a].lat);var s=t.getCenter();s.lat=n,this.toolbar=L.distortableImage.popupBar(s,{actions:this.editActions}).addTo(i,t),t.fire("toolbar:created")}},_refresh:function(){this.toolbar&&this._removeToolbar(),this._addToolbar()},_updateToolbarPos:function(){var t=this._overlay,e=t.getCorners(),i=this.toolbar,o=-1/0;if(i&&i instanceof L.DistortableImage.PopupBar){for(var n=0;no&&(o=e[n].lat);var a=t.getCenter();a.lat=o,t.options.suppressToolbar||this.toolbar.setLatLng(a)}},hasMode:function(t){return!!this._modes[t]},getMode:function(){if(this.enabled())return this._mode},getModes:function(){return this._modes},isMode:function(t){return!!this.enabled()&&this._mode===t},setMode:function(t){var e=this._overlay,i=this.parentGroup;if(this.getMode()!==t&&this.hasMode(t)&&this.enabled())return this.toolbar&&this.toolbar.clickTool(t),this.isMode("lock")&&!this.dragging&&this._enableDragging(),this._mode=t,this.isMode("lock")&&this._disableDragging(),this._updateHandle(),this._refresh(),i&&i.isCollected(e)&&e.deselect(),this},nextMode:function(t){var e=this.getMode(),i=this.parentGroup,o=Object.keys(this.getModes()),n=o.indexOf(e),a=o[(n+1)%o.length];if(t){if(i&&i.anyCollected())return;L.DomEvent.stop(t)}return this.setMode(a)}}),L.distortableImage.edit=function(t,e){return new L.DistortableImage.Edit(t,e)}},426:function(){L.BorderAction=L.EditAction.extend({initialize:function(t,e,i){var o,n,a=e.editing,s=a._mode;a._outlined?(o="border_outer",n=e.options.translation.removeBorder):(o="border_clear",n=e.options.translation.addBorder),(i=i||{}).toolbarIcon={svg:!0,html:o,tooltip:n,className:"lock"===s?"disabled":""},L.DistortableImage.action_map.b="lock"===s?"":"_toggleBorder",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){var t=this._overlay.editing;L.IconUtil.toggleXlink(this._link,"border_clear","border_outer"),L.IconUtil.toggleTitle(this._link,"Remove Border","Add Border"),t._toggleBorder()}})},114:function(){L.DeleteAction=L.EditAction.extend({initialize:function(t,e,i){var o,n=e.editing;n instanceof L.DistortableImage.Edit?(o=e.options.translation.deleteImage,L.DistortableImage.action_map.Backspace="lock"===n._mode?"":"_removeOverlay"):(o=e.options.translation.deleteImages,L.DistortableImage.group_action_map.Backspace="lock"===n._mode?"":"_removeGroup"),(i=i||{}).toolbarIcon={svg:!0,html:"delete_forever",tooltip:o,className:"lock"===n._mode?"disabled":""},L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){var t=this._overlay.editing;t instanceof L.DistortableImage.Edit?t._removeOverlay():t._removeGroup()}})},231:function(){L.DistortAction=L.EditAction.extend({initialize:function(t,e,i){(i=i||{}).toolbarIcon={svg:!0,html:"distort",tooltip:e.options.translation.distortImage,className:"distort"},L.DistortableImage.action_map.d="_distortMode",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){this._overlay.editing._distortMode()}})},541:function(){L.DragAction=L.EditAction.extend({initialize:function(t,e,i){(i=i||{}).toolbarIcon={svg:!0,html:"drag",tooltip:e.options.translation.dragImage,className:"drag"},L.DistortableImage.action_map.D="_dragMode",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){this._overlay.editing._dragMode()}})},280:function(){L.DistortableImage=L.DistortableImage||{},L.distortableImage=L.DistortableImage,L.DistortableImage.action_map={},L.EditAction=L.Toolbar2.Action.extend({options:{toolbarIcon:{svg:!1,html:"",className:"",tooltip:""}},initialize:function(t,e,i){this._overlay=e,this._map=t,L.setOptions(this,i),L.Toolbar2.Action.prototype.initialize.call(this,i),this._injectIconSet()},_createIcon:function(t,e,i){var o=this,n=this.options.toolbarIcon,a=n.className,s=this._overlay.editing;this.toolbar=t,this._icon=L.DomUtil.create("li","",e),this._link=L.DomUtil.create("a","",this._icon),n.svg?this._link.innerHTML=L.IconUtil.create(n.html):this._link.innerHTML=n.html,this._link.setAttribute("href","#"),this._link.setAttribute("title",n.tooltip),this._link.setAttribute("role","button"),L.DomUtil.addClass(this._link,this.constructor.baseClass),a&&(L.DomUtil.addClass(this._link,a),"disabled"===a&&L.DomUtil.addClass(this._icon,a),a===s._mode?L.DomUtil.addClass(this._link,"selected-mode"):L.DomUtil.removeClass(this._link,"selected-mode")),L.DomEvent.on(this._link,"click",this.enable,this),L.DomEvent.on(this._overlay,"update",(function(){var t=o._link.innerHTML.match(/xlink:href="#restore"/);t&&1===t.length&&o._enableAction()})),this._addSubToolbar(t,this._icon,i)},_injectIconSet:function(){if(!document.querySelector("#iconset")){var t=document.createElement("div");t.id="iconset",t.setAttribute("hidden","hidden"),t.innerHTML=(new L.ToolbarIconSet).render(),document.querySelector(".leaflet-marker-pane").appendChild(t)}},_enableAction:function(){L.DomUtil.removeClass(this._link.parentElement,"disabled"),L.DomUtil.removeClass(this._link,"disabled")},_disableAction:function(){L.DomUtil.addClass(this._link.parentElement,"disabled"),L.DomUtil.addClass(this._link,"disabled")}}),L.editAction=function(t,e,i){return new L.EditAction(t,e,i)}},149:function(){L.ExportAction=L.EditAction.extend({initialize:function(t,e,i){var o,n=e.editing;this.isExporting=!1,this.mouseLeaveSkip=!0,this.isHooksExecuted=!1,n instanceof L.DistortableImage.Edit?(L.DistortableImage.action_map.e="_getExport",o=e.options.translation.exportImage):(L.DistortableImage.group_action_map.e="runExporter",o=e.options.translation.exportImages),(i=i||{}).toolbarIcon={svg:!0,html:"get_app",tooltip:o},L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){var t=this._overlay.editing;if(t instanceof L.DistortableImage.Edit)t._getExport();else if(!this.isHooksExecuted){this.isHooksExecuted=!0;var e=this._link.parentElement;this.mouseEnterHandler=this.handleMouseEnter.bind(this),this.mouseLeaveHandler=this.handleMouseLeave.bind(this),L.DomEvent.on(e,"click",(function(){if(this.isExporting){if(this.mouseLeaveSkip)return;this.resetState(),this.detachMouseEventListeners(e),t.cancelExport()}else this.isExporting=!0,this.renderExportIcon(),setTimeout(this.attachMouseEventListeners.bind(this,e),100),t.runExporter().then(function(){this.resetState(),this.detachMouseEventListeners(e)}.bind(this))}),this)}},resetState:function(){this.renderDownloadIcon(),this.isExporting=!1,this.mouseLeaveSkip=!0},attachMouseEventListeners:function(t){t.addEventListener("mouseenter",this.mouseEnterHandler),t.addEventListener("mouseleave",this.mouseLeaveHandler)},detachMouseEventListeners:function(t){t.removeEventListener("mouseenter",this.mouseEnterHandler),t.removeEventListener("mouseleave",this.mouseLeaveHandler)},handleMouseEnter:function(){this.renderCancelIcon()},handleMouseLeave:function(){this.mouseLeaveSkip?this.mouseLeaveSkip=!1:this.renderExportIcon()},renderDownloadIcon:function(){L.IconUtil.toggleXlink(this._link,"get_app","spinner"),L.IconUtil.toggleTitle(this._link,"Export Images","Loading..."),L.DomUtil.removeClass(this._link.firstChild,"loader")},renderExportIcon:function(){L.IconUtil.toggleXlink(this._link,"spinner"),L.IconUtil.toggleTitle(this._link,"Export Images","Loading..."),L.IconUtil.addClassToSvg(this._link,"loader")},renderCancelIcon:function(){L.IconUtil.toggleXlink(this._link,"cancel"),L.IconUtil.toggleTitle(this._link,"Cancel Export","Loading..."),L.DomUtil.removeClass(this._link.firstChild,"loader")}})},74:function(){L.FreeRotateAction=L.EditAction.extend({initialize:function(t,e,i){(i=i||{}).toolbarIcon={svg:!0,html:"crop_rotate",tooltip:e.options.translation.freeRotateImage,className:"freeRotate"},L.DistortableImage.action_map.f="_freeRotateMode",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){this._overlay.editing._freeRotateMode()}})},691:function(){L.GeolocateAction=L.EditAction.extend({initialize:function(t,e,i){var o=e.editing;(i=i||{}).toolbarIcon={svg:!0,html:"explore",tooltip:e.options.translation.geolocateImage,className:"lock"===o._mode?"disabled":""},L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){var t=this._overlay.getElement();EXIF.getData(t,L.EXIF(t))}})},105:function(){L.LockAction=L.EditAction.extend({initialize:function(t,e,i){var o,n,a=e.editing;a instanceof L.DistortableImage.Edit?(L.DistortableImage.action_map.u="_unlock",L.DistortableImage.action_map.l="_lock",n=e.options.translation.lockMode,o=a.isMode("lock")?"lock":"unlock"):(L.DistortableImage.group_action_map.l="_lockGroup",n=e.options.translation.lockImages,o="lock"),(i=i||{}).toolbarIcon={svg:!0,html:o,tooltip:n,className:"lock"},L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){var t=this._overlay.editing;t instanceof L.DistortableImage.Edit?t._toggleLockMode():t._lockGroup()}})},944:function(){L.OpacityAction=L.EditAction.extend({initialize:function(t,e,i){var o,n,a=e.editing,s=a._mode;a._transparent?(o="opacity_empty",n=e.options.translation.makeImageOpaque):(o="opacity",n=e.options.translation.makeImageTransparent),(i=i||{}).toolbarIcon={svg:!0,html:o,tooltip:n,className:"lock"===s?"disabled":""},L.DistortableImage.action_map.o="lock"===s?"":"_toggleOpacity",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){var t=this._overlay.editing,e=this._link;L.IconUtil.toggleXlink(e,"opacity","opacity_empty"),L.IconUtil.toggleTitle(e,"Make Image Transparent","Make Image Opaque"),t._toggleOpacity()}})},954:function(){L.RestoreAction=L.EditAction.extend({initialize:function(t,e,i){var o=L.Utils.getNestedVal(e,"editing","_mode"),n=e.edited;(i=i||{}).toolbarIcon={svg:!0,html:"restore",tooltip:e.options.translation.restoreImage,className:n&&"lock"!==o?"":"disabled"},L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){var t=this._overlay;L.DomEvent.on(t,{edit:this._enableAction,restore:this._disableAction},this),t.restore()}})},178:function(){L.RotateAction=L.EditAction.extend({initialize:function(t,e,i){(i=i||{}).toolbarIcon={svg:!0,html:"rotate",tooltip:e.options.translation.rotateImage,className:"rotate"},L.DistortableImage.action_map.r="_rotateMode",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){this._overlay.editing._rotateMode()}})},547:function(){L.ScaleAction=L.EditAction.extend({initialize:function(t,e,i){(i=i||{}).toolbarIcon={svg:!0,html:"scale",tooltip:e.options.translation.scaleImage,className:"scale"},L.DistortableImage.action_map.s="_scaleMode",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){this._overlay.editing._scaleMode()}})},886:function(){L.StackAction=L.EditAction.extend({initialize:function(t,e,i){var o,n,a=e.editing;a._toggledImage?(o="flip_to_back",n=e.options.translation.stackToFront):(o="flip_to_front",n=e.options.translation.stackToBack),(i=i||{}).toolbarIcon={svg:!0,html:o,tooltip:n,className:"lock"===a._mode?"disabled":""},L.DistortableImage.action_map.q="lock"===a._mode?"":"_stackUp",L.DistortableImage.action_map.a="lock"===a._mode?"":"_stackDown",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){var t=this._overlay.editing;L.IconUtil.toggleXlink(this._link,"flip_to_front","flip_to_back"),L.IconUtil.toggleTitle(this._link,"Stack to Front","Stack to Back"),t._toggleOrder()}})},129:function(){L.UnlockAction=L.EditAction.extend({initialize:function(t,e,i){(i=i||{}).toolbarIcon={svg:!0,html:"unlock",tooltip:e.options.translation.unlockImages},L.DistortableImage.group_action_map.u="_unlockGroup",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){this._overlay.editing._unlockGroup()}})},743:function(){L.EXIF=function(t){if(0!==Object.keys(EXIF.getAllTags(t)).length){console.log(EXIF.getAllTags(t));var e=EXIF.getAllTags(t);void 0!==e.GPSLatitude&&void 0!==e.GPSLongitude&&(e.GPSLatitude[0],e.GPSLatitude[1],e.GPSLatitude[2],e.GPSLongitude[0],e.GPSLongitude[1],e.GPSLongitude[2],e.GPSLatitudeRef,e.GPSLongitudeRef),"T"===e.GPSImgDirectionRef||"M"===e.GPSImgDirectionRef?(Math.PI,e.GPSImgDirection.numerator,e.GPSImgDirection.denominator):console.log("No compass data found"),console.log("Orientation:",e.Orientation),(6===e.Orientation||8===e.Orientation||3===e.Orientation)&&Math.PI,void 0!==e.GPSAltitude&&void 0!==e.GPSAltitudeRef&&void 0!==e.GPSAltitude&&void 0!==e.GPSAltitudeRef&&(e.GPSAltitude.numerator,e.GPSAltitude.denominator,e.GPSAltitudeRef)}else alert("EXIF initialized. Press again to view data in console.")}},92:function(){L.DistortHandle=L.EditHandle.extend({options:{TYPE:"distort",icon:L.icon({iconUrl:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAChSURBVO3BIU4DURgGwNkvL2B6AkQTLBqP4QCoSm7DDXoBLBZHDbfgICAIZjEV3YTn9uVHdMZZtcnCfI13bIzxg0emg6Nm6QVbYz3jylEsXRrvwommb49X67jFkz80fR9Mb1YxTzqiWBSLYlEsikWxKBbFolgUi2JRLIpFsSgWxaJY03fHHOu40dH07bAzWCx9Ge/TiWbpHgdsjPGNB2f/yS+7xRCyiiZPJQAAAABJRU5ErkJggg==",iconSize:[32,32],iconAnchor:[16,16]})},_onHandleDrag:function(){this._handled.setCorner(this._corner,this.getLatLng())},updateHandle:function(){this.setLatLng(this._handled.getCorner(this._corner))}}),L.distortHandle=function(t,e,i){return new L.DistortHandle(t,e,i)}},194:function(){L.DragHandle=L.EditHandle.extend({options:{TYPE:"drag",icon:L.icon({iconUrl:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAsVJREFUeNrMVztLXEEUvnNVFAVBAhY2aRKbTZEHJNpYabuNjSgYg/GxdsmPSJkUAa/ZdVEX8mgWYVutbHxAHkVskjQBuUUgBISVhCQk3wnfwMlk1rusN1wHPubOzJlzvjlz5sxc01Ma/hUEwQnwDIjqc7uvgv9YYO86qgIwCXQbdNTlQ8kcCBHgBch8TcloF6oJGr6phk6EQAkfdz3zvgDr9Mr7Fg1fptEZoM8jsmrokpfsiIFO4IIjuE2v1EDmR4LRdlR5Gh51hj8D34ABtm8YTtqna0TgklIw5CgQguKxIojEjmFROg/MKQO27NkFAB+4wAPouGUJiIvWKHwbAxX2XyWRKWkqhT+pbJntJZJuUzISW0+5hW+obxrVBsfvoH/dqCCJuU97GBh2VteLSiYvArmErT8EVoAK9Bw7enbpVYmvAQlyowYforrH5jXL2rPHI/TKONDB7u9AlavdaTBPvPmazUeQuy8f7UomUgTEwIJPEQ3sQGE/6ll2l9H/KcEzBcfWn2IclluM3DpddJxSHujlFkscbUPvmB0LHVnLrId7nlaZVkEc6QGXQI1MAwZcWmVRHeNaQwJMMiU2cwy4s7p/RJ2ckpvIQs+cIs+5GzitloLKHUV3MPREuXbTOKO91dX387gGTONxIgEWm+E61FFrpcyqXLHsEwiDjEsjAksqw5XPoL9MHVrn6QR4q+XZrDaR4RoWzq2ymafuRA/Mq1stSsHLVkcbdf9VjOcx8ZH3+SFWcCWlVPyWuUBOwUWdC1wP5NVjYiXFWLO69PZ6CRTUY6KSIoEKdf6T3IzzgHxnsyHctNBEkmn6Oob8ExUDg/ahGybd177cDjzH5xHwgDiSvoS7I/LZyvxJZj0wod7tkX5G0XVC7rEyLhfLJjBGbKoLLEfZWObyKeZ6oY82g+yf5Zn/mJyHX7PMf04z/T3/LcAAu4E6iiyJqf0AAAAASUVORK5CYII=",iconSize:[32,32],iconAnchor:[16,16]})},_onHandleDrag:function(){var t=this._handled,e=t.getCorner(this._corner),i=this.getLatLng();t.dragBy(e,i)},updateHandle:function(){this.setLatLng(this._handled.getCorner(this._corner))}}),L.dragHandle=function(t,e,i){return new L.DragHandle(t,e,i)}},988:function(){L.EditHandle=L.Marker.extend({initialize:function(t,e,i){var o=t.getCorner(e);L.setOptions(this,i),this._handled=t,this._corner=e;var n={draggable:!0,zIndexOffset:10};i&&i.hasOwnProperty("draggable")&&(n.draggable=i.draggable),L.Marker.prototype.initialize.call(this,o,n)},onAdd:function(t){L.Marker.prototype.onAdd.call(this,t),this._bindListeners(),this.updateHandle()},onRemove:function(t){this._unbindListeners(),L.Marker.prototype.onRemove.call(this,t)},_onHandleDragStart:function(){this._handled.fire("editstart")},_onHandleDragEnd:function(){this._fireEdit()},_fireEdit:function(){this._handled.edited=!0,this._handled.fire("edit")},_bindListeners:function(){this.on({contextmenu:L.DomEvent.stop,dragstart:this._onHandleDragStart,drag:this._onHandleDrag,dragend:this._onHandleDragEnd},this),this._handled._map.on("zoomend",this.updateHandle,this),this._handled.on("update",this.updateHandle,this)},_unbindListeners:function(){this.off({contextmenu:L.DomEvent.stop,dragstart:this._onHandleDragStart,drag:this._onHandleDrag,dragend:this._onHandleDragEnd},this),this._handled._map.off("zoomend",this.updateHandle,this),this._handled.off("update",this.updateHandle,this)},_calculateScalingFactor:function(t,e){var i=this._handled,o=i._map,n=o.latLngToLayerPoint(i.getCenter()),a=o.latLngToLayerPoint(t),s=o.latLngToLayerPoint(e),r=this._d2(n,a),l=this._d2(n,s);return Math.sqrt(l/r)},_d2:function(t,e){var i=t.x-e.x,o=t.y-e.y;return Math.pow(i,2)+Math.pow(o,2)},calculateAngleDelta:function(t,e){var i=this._handled,o=i._map,n=o.latLngToLayerPoint(i.getCenter()),a=o.latLngToLayerPoint(t),s=o.latLngToLayerPoint(e),r=Math.atan2(n.y-a.y,n.x-a.x);return Math.atan2(n.y-s.y,n.x-s.x)-r}})},206:function(){L.FreeRotateHandle=L.EditHandle.extend({options:{TYPE:"freeRotate",icon:L.icon({iconUrl:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAHiSURBVMXBa3HbShgA0PMp/1sCCo8oCEpgTaCXgIXAJiDzyCJoAUTm4UVQAns1Y8+snWnTvJyeE16hkjDgDrfoNTMKcpC9UPiLSo8JyetkjEHxjPCMyoS199kFoz8Iv1HpMaN3qWDCHoegOKkkRwnJpRmroHgiPFEZ8IBekzEGxQtUEhKSS/fB7Ew4U+lxcGkVZG9QWWPSFAxBcdK59KApuA+yNwp2uEdx1GN25sZJZULSfAtm77SlbNjju6MvG75u+WHRWVR6rDVjMPsgwYyVZl3pLTpHkyYHOx8syMiayaJzlDTZ9YyaZNFVkiYH2ZUEBcVJJXVImuz6Js3Qofe59pq7DoOTILu+g+a288mCouk7/1iH4qTS+2QdDppbV1ZJmrnDXnPnc5UOs2Z0fUmTuyBr+krvSioJyUmQO0dZM7mepMkWnaNRkyrJB6uskTSjxY3Fll8bvmJwlDb83FJ8gMqAB80uyBY3Trb82PAfvjj6vuHnluIdKgMeNXOwctK5NKBoHitrb1RJeHRp5Ux4ojLg0aWMHGQvUOkxIWkKVsHsTPiNSo8HDC5lZIsgO6n0uMUdRvQuFQxB8UR4RmXC2vvsgtEfhL+o9JiQvE7GGBTPCK9QSUjoMWgKDthjDrIX+h/k0I7gth6N5gAAAABJRU5ErkJggg==",iconSize:[32,32],iconAnchor:[16,16]})},_onHandleDrag:function(){var t=this._handled,e=t._map,i=t.getCorner(this._corner),o=this.getLatLng(),n=this.calculateAngleDelta(i,o),a=this._calculateScalingFactor(i,o);0!==n&&t.rotateBy(n,"rad");var s=t.edgeMinWidth;s||(s=50);var r=e.latLngToContainerPoint(t.getCorner(0)),l=e.latLngToContainerPoint(t.getCorner(1)),c=Math.abs(r.x-l.x),d=Math.abs(r.y-l.y);Math.sqrt(c*c+d*d)>s||a>1?t.scaleBy(a):t.scaleBy(1)},updateHandle:function(){this.setLatLng(this._handled.getCorner(this._corner))}}),L.freeRotateHandle=function(t,e,i){return new L.FreeRotateHandle(t,e,i)}},789:function(){L.LockHandle=L.EditHandle.extend({options:{TYPE:"lock",interactive:!1,icon:L.icon({iconUrl:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAD8SURBVO3BPU7CYAAA0AdfjIcQlRCQBG7C3gk2uIPG2RC3Dk16Gz0FTO1WZs/gwGCMP/2+xsSl7+n1er1Iz9LtRQjaPeMeO+TinLDCJV78YqjdA04YodKuxhUaPGoRxMmxwRQZSt87Yo4KExGCeAUyLLFB4bMacxywEClIU2KDKXbInTUYo8JCgoFuGoxQO5uiwY1EA91VmDqrcKeDoX8WdNNgjApvmGGLXKIgXY0xGkxQYItrrFFIEKQ5Yo4KEx9yrDFDhlKkIF6NOQ5Y+KpAhiXWKEQI4pxwiwoLPyuxwQw75FoE7fZYocFEuwI7jHCBV39gL92TXq/Xi/AOcmczZmaIMScAAAAASUVORK5CYII=",iconSize:[32,32],iconAnchor:[16,16]})},onRemove:function(t){this.unbindTooltip(),L.EditHandle.prototype.onRemove.call(this,t)},_bindListeners:function(){var t=this.getElement();L.EditHandle.prototype._bindListeners.call(this),L.DomEvent.on(t,{mousedown:this._tooltipOn,mouseup:this._tooltipOff},this),L.DomEvent.on(document,"pointerleave",this._tooltipOff,this)},_unbindListeners:function(){var t=this.getElement();L.EditHandle.prototype._bindListeners.call(this),L.DomEvent.off(t,{mousedown:this._tooltipOn,mouseup:this._tooltipOff},this),L.DomEvent.off(document,"pointerleave",this._tooltipOff,this)},_onHandleDrag:function(){},updateHandle:function(){this.setLatLng(this._handled.getCorner(this._corner))},_tooltipOn:function(t){var e=this._handled.parentGroup,i=e?e.editing:this._handled.editing;if(!t.shiftKey&&(this._handled.isSelected()||!e||e.isCollected(this._handled))){var o=i._lockHandles;this._timer=setTimeout(L.bind((function(){this._timeout&&clearTimeout(this._timeout),this.getTooltip()?o.eachLayer((function(t){this!==t&&t.closeTooltip()})):this.bindTooltip("Locked!",{permanent:!0}),this.openTooltip()}),this),500)}},_tooltipOff:function(t){var e=this._handled.parentGroup,i=e?e.editing:this._handled.editing;if(!t.shiftKey&&(this._handled.isSelected()||!e||e.isCollected(this._handled))){var o=i._lockHandles;t.currentTarget===document&&o.eachLayer((function(t){t.closeTooltip()})),this._timer&&clearTimeout(this._timer),this._timeout=setTimeout(L.bind((function(){this.closeTooltip()}),this),400)}}}),L.lockHandle=function(t,e,i){return new L.LockHandle(t,e,i)}},337:function(){L.RotateHandle=L.EditHandle.extend({options:{TYPE:"rotate",icon:L.icon({iconUrl:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAHiSURBVMXBa3HbShgA0PMp/1sCCo8oCEpgTaCXgIXAJiDzyCJoAUTm4UVQAns1Y8+snWnTvJyeE16hkjDgDrfoNTMKcpC9UPiLSo8JyetkjEHxjPCMyoS199kFoz8Iv1HpMaN3qWDCHoegOKkkRwnJpRmroHgiPFEZ8IBekzEGxQtUEhKSS/fB7Ew4U+lxcGkVZG9QWWPSFAxBcdK59KApuA+yNwp2uEdx1GN25sZJZULSfAtm77SlbNjju6MvG75u+WHRWVR6rDVjMPsgwYyVZl3pLTpHkyYHOx8syMiayaJzlDTZ9YyaZNFVkiYH2ZUEBcVJJXVImuz6Js3Qofe59pq7DoOTILu+g+a288mCouk7/1iH4qTS+2QdDppbV1ZJmrnDXnPnc5UOs2Z0fUmTuyBr+krvSioJyUmQO0dZM7mepMkWnaNRkyrJB6uskTSjxY3Fll8bvmJwlDb83FJ8gMqAB80uyBY3Trb82PAfvjj6vuHnluIdKgMeNXOwctK5NKBoHitrb1RJeHRp5Ux4ojLg0aWMHGQvUOkxIWkKVsHsTPiNSo8HDC5lZIsgO6n0uMUdRvQuFQxB8UR4RmXC2vvsgtEfhL+o9JiQvE7GGBTPCK9QSUjoMWgKDthjDrIX+h/k0I7gth6N5gAAAABJRU5ErkJggg==",iconSize:[32,32],iconAnchor:[16,16]})},_onHandleDrag:function(){var t=this._handled,e=t.getCorner(this._corner),i=this.getLatLng(),o=this.calculateAngleDelta(e,i);t.rotateBy(o,"rad")},updateHandle:function(){this.setLatLng(this._handled.getCorner(this._corner))}}),L.rotateHandle=function(t,e,i){return new L.RotateHandle(t,e,i)}},350:function(){L.ScaleHandle=L.EditHandle.extend({options:{TYPE:"scale",icon:L.icon({iconUrl:"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2ZXJzaW9uPSIxLjEiIHdpZHRoPSI0NTkiIGhlaWdodD0iNDY0IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCA1MTIgNTEyIiB4bWw6c3BhY2U9InByZXNlcnZlIiBzdHlsZT0iIj48cmVjdCBpZD0iYmFja2dyb3VuZHJlY3QiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIHg9IjAiIHk9IjAiIGZpbGw9Im5vbmUiIHN0cm9rZT0ibm9uZSIgY2xhc3M9IiIgc3R5bGU9IiIvPjxnIGNsYXNzPSJjdXJyZW50TGF5ZXIiIHN0eWxlPSIiPjx0aXRsZT5MYXllciAxPC90aXRsZT48cGF0aCBkPSJNNDU5LjA0OTE1OTUzMDQ3MTM0LDg2LjkyNjIzNDUxMjU1MDAyIFYwIGgtODUuNzE0NTczMzU2MzEyMDkgdjI3LjA0MzcxNzQwMzkwNDQ1MiBIODUuNzE0NTczMzU2MzEyMDMgVjAgSDAgdjg2LjkyNjIzNDUxMjU1MDAyIGgyNS43MTQzNzIwMDY4OTM2MjYgdjI4OS43NTQxMTUwNDE4MzM0IEgwIHY4Ni45MjYyMzQ1MTI1NTAwMiBoODUuNzE0NTczMzU2MzEyMDkgdi0yNy4wNDM3MTc0MDM5MDQ0NTIgaDI4NS43MTUyNDQ1MjEwNDAzIHYyNy4wNDM3MTc0MDM5MDQ0NTIgaDg1LjcxNDU3MzM1NjMxMjA5IHYtODYuOTI2MjM0NTEyNTUwMDIgaC0yMy44MDk2MDM3MTAwODY2OSBWODYuOTI2MjM0NTEyNTUwMDIgSDQ1OS4wNDkxNTk1MzA0NzEzNCB6TTM4NC43NjMxOTU5NTUwMDA5LDEyLjU1NjAxMTY1MTgxMjc4MSBoNjEuOTA0OTY5NjQ2MjI1Mzk2IHY2Mi43ODAwNTgyNTkwNjM5MSBoLTYxLjkwNDk2OTY0NjIyNTM5NiBWMTIuNTU2MDExNjUxODEyNzgxIHpNMTIuMzgwOTkzOTI5MjQ1MDUsMTIuNTU2MDExNjUxODEyNzgxIGg2MS45MDQ5Njk2NDYyMjUzOTYgdjYyLjc4MDA1ODI1OTA2MzkxIEgxMi4zODA5OTM5MjkyNDUwNSBWMTIuNTU2MDExNjUxODEyNzgxIHpNNzQuMjg1OTYzNTc1NDcwNTMsNDUxLjA1MDU3MjQxNTEyMDY2IEgxMi4zODA5OTM5MjkyNDUwNSB2LTYyLjc4MDA1ODI1OTA2MzkxIGg2MS45MDQ5Njk2NDYyMjUzOTYgVjQ1MS4wNTA1NzI0MTUxMjA2NiB6TTQ0NS43MTU3ODE0NTI4MjI3NCw0NTEuMDUwNTcyNDE1MTIwNjYgaC02Mi44NTczNTM3OTQ2Mjg4NjQgdi02Mi43ODAwNTgyNTkwNjM5MSBoNjIuODU3MzUzNzk0NjI4ODY0IFY0NTEuMDUwNTcyNDE1MTIwNjYgek00MDcuNjIwNDE1NTE2Njg0MjYsMzc2LjY4MDM0OTU1NDM4MzQ0IGgtMzYuMTkwNTk3NjM5MzMxNzcgdjMyLjgzODc5OTcwNDc0MTEyIEg4NS43MTQ1NzMzNTYzMTIwMyB2LTMyLjgzODc5OTcwNDc0MTEyIEg0OS41MjM5NzU3MTY5ODAzMiBWODYuOTI2MjM0NTEyNTUwMDIgaDM2LjE5MDU5NzYzOTMzMTc3IFY1MC4yMjQwNDY2MDcyNTExMjUgaDI4Ny42MjAwMTI4MTc4NDcyIHYzNi43MDIxODc5MDUyOTg5IGgzNC4yODU4MjkzNDI1MjQ4MzUgVjM3Ni42ODAzNDk1NTQzODM0NCB6IiBpZD0ic3ZnXzIiIGNsYXNzPSIiIGZpbGw9IiMxYTFhZWIiIGZpbGwtb3BhY2l0eT0iMSIvPjwvZz48L3N2Zz4=",iconSize:[32,32],iconAnchor:[16,16]})},_onHandleDrag:function(){var t=this._handled,e=t._map,i=t.edgeMinWidth,o=t.getCorner(this._corner),n=this.getLatLng(),a=this._calculateScalingFactor(o,n);i||(i=50);var s=e.latLngToLayerPoint(t.getCorner(0)),r=e.latLngToLayerPoint(t.getCorner(1)),l=Math.abs(s.x-r.x),c=Math.abs(s.y-r.y);Math.sqrt(l*l+c*c)>i||a>1?t.scaleBy(a):t.scaleBy(1)},updateHandle:function(){this.setLatLng(this._handled.getCorner(this._corner))}}),L.scaleHandle=function(t,e,i){return new L.ScaleHandle(t,e,i)}},719:function(){L.distortableImage=L.DistortableImage||{},L.distortableImage=L.DistortableImage,L.DistortableImage.group_action_map={},L.DistortableImage.ControlBar=L.Toolbar2.Control.extend({}),L.distortableImage.controlBar=function(t){return new L.DistortableImage.ControlBar(t)},L.DistortableCollection.addInitHook((function(){this.ACTIONS=[L.ExportAction,L.DeleteAction,L.LockAction,L.UnlockAction],L.DistortableCollection.Edit.MODES={lock:L.LockAction,unlock:L.UnlockAction};var t=this.options.actions?this.options.actions:this.ACTIONS;this.editing=L.distortableCollection.edit(this,{actions:t})}))},93:function(){L.DistortableImage=L.DistortableImage||{},L.distortableImage=L.DistortableImage,L.DistortableImage.action_map={},L.DistortableImage.PopupBar=L.Toolbar2.Popup.extend({options:{anchor:[0,-10]},initialize:function(t,e){L.setOptions(this,e),L.Toolbar2.Popup.prototype.initialize.call(this,t,e)},addHooks:function(t,e){this.map=t,this.ov=e},tools:function(){if(this._ul)return this._ul.children},clickTool:function(t){for(var e=this.tools(),i=0;i',_symbols:"",render:function(){return this.addSymbols(this._symbols),this._svg},addSymbols:function(t){this._svg+=t}})},261:function(){L.KeymapperIconSet=L.IconSet.extend({_symbols:''})},929:function(){L.ToolbarIconSet=L.IconSet.extend({_symbols:''})},496:function(){L.Map.mergeOptions({boxCollector:!0,boxZoom:!1}),L.Map.BoxCollector=L.Map.BoxZoom.extend({initialize:function(t){this._map=t,this._container=t._container,this._pane=t._panes.overlayPane,this._resetStateTimeout=0,t.on("unload",this._destroy,this)},addHooks:function(){L.DomEvent.on(this._container,"mousedown",this._onMouseDown,this)},removeHooks:function(){L.DomEvent.off(this._container,"mousedown",this._onMouseDown,this)},moved:function(){return this._moved},_destroy:function(){L.DomUtil.remove(this._pane),delete this._pane},_resetState:function(){this._resetStateTimeout=0,this._moved=!1},_clearDeferredResetState:function(){0!==this._resetStateTimeout&&(clearTimeout(this._resetStateTimeout),this._resetStateTimeout=0)},_onMouseDown:function(t){if(!t.shiftKey||1!==t.which&&1!==t.button)return!1;this._clearDeferredResetState(),this._resetState(),L.DomUtil.disableTextSelection(),L.DomUtil.disableImageDrag(),this._startPoint=this._map.mouseEventToContainerPoint(t),L.DomEvent.on(document,{contextmenu:L.DomEvent.stop,mousemove:this._onMouseMove,mouseup:this._onMouseUp},this)},_onMouseMove:function(t){this._moved||(this._moved=!0,this._box=L.DomUtil.create("div","leaflet-zoom-box",this._container),L.DomUtil.addClass(this._container,"leaflet-crosshair"),this._map.fire("boxzoomstart")),this._point=this._map.mouseEventToContainerPoint(t),this._bounds=L.bounds(this._startPoint,this._point);var e=this._bounds.getSize();L.DomUtil.setPosition(this._box,this._bounds.min),this._box.style.width=e.x+"px",this._box.style.height=e.y+"px"},_finish:function(){this._moved&&(L.DomUtil.remove(this._box),L.DomUtil.removeClass(this._container,"leaflet-crosshair")),L.DomUtil.enableTextSelection(),L.DomUtil.enableImageDrag(),L.DomEvent.off(document,{contextmenu:L.DomEvent.stop,mousemove:this._onMouseMove,mouseup:this._onMouseUp},this)},_onMouseUp:function(t){if((1===t.which||1===t.button)&&(this._finish(),this._moved)){this._clearDeferredResetState(),this._resetStateTimeout=setTimeout(L.Util.bind(this._resetState,this),0);var e=L.latLngBounds(this._map.containerPointToLatLng(this._bounds.getBottomLeft()),this._map.containerPointToLatLng(this._bounds.getTopRight())),i=this._map.getZoom(),o=this._map.getCenter();e=this._map._latLngBoundsToNewLayerBounds(e,i,o),this._map.fire("boxcollectend",{boxCollectBounds:e})}}}),L.Map.addInitHook("addHandler","boxCollector",L.Map.BoxCollector)},291:function(){L.Map.mergeOptions({doubleClickLabels:!0}),L.Map.DoubleClickLabels=L.Map.DoubleClickZoom.extend({enable:function(){var t=this._map;return this._enabled||(t.doubleClickZoom.enabled()&&t.doubleClickZoom.disable(),this._map.fire("singleclickon"),this._enabled=!0,this.addHooks()),this},disable:function(){return this._enabled?(this._enabled=!1,this.removeHooks(),this):this},_fireIfSingle:function(t){var e=this._map,i=t.originalEvent;i&&i.shiftKey||(e._clicked+=1,this._map._clickTimeout=setTimeout((function(){1===e._clicked?(e._clicked=0,e.fire("singleclick",{type:"singleclick"})):L.Browser.touch&&i&&i.sourceCapabilities.firesTouchEvents&&e.fire("dblclick")}),250))},_onDoubleClick:function(){var t=this._map,e=t._labels;setTimeout((function(){t._clicked=0,clearTimeout(t._clickTimeout)}),0),e&&(1===e.options.opacity?(e.options.opacity=0,e.setOpacity(0)):(e.options.opacity=1,e.setOpacity(1)))}}),L.Map.addInitHook("addHandler","doubleClickLabels",L.Map.DoubleClickLabels)},752:function(){L.Map.DoubleClickZoom.include({addHooks:function(){this._map.on({click:this._fireIfSingle,dblclick:this._onDoubleClick},this)},removeHooks:function(){this._map.off({click:this._fireIfSingle,dblclick:this._onDoubleClick},this)},enable:function(){return this._enabled||this._map.doubleClickLabels&&this._map.doubleClickLabels.enabled()||(this._map.fire("singleclickon"),this._enabled=!0,this.addHooks()),this},disable:function(){return this._enabled?(this._map.fire("singleclickoff"),this._enabled=!1,this.removeHooks(),this):this},_fireIfSingle:function(t){var e=this._map,i=t.originalEvent;i&&i.shiftKey||(e._clicked+=1,this._map._clickTimeout=setTimeout((function(){1===e._clicked?(e._clicked=0,e.fire("singleclick",{type:"singleclick"})):L.Browser.touch&&i&&i.sourceCapabilities.firesTouchEvents&&e._fireDOMEvent(i,"dblclick",[e])}),250))},_onDoubleClick:function(t){var e=this._map,i=t.originalEvent;if(setTimeout((function(){e._clicked=0,clearTimeout(e._clickTimeout)}),0),!i)return!1;var o=e.getZoom(),n=e.options.zoomDelta,a=i.shiftKey?o-n:o+n;"center"===e.options.doubleClickZoom?e.setZoom(a):e.setZoomAround(t.containerPoint,a)}})},131:function(){L.Map.include({_clicked:0,addGoogleMutant:function(t){return(t=this.mutantOptions=L.extend({mutantOpacity:.8,maxZoom:24,maxNativeZoom:20,minZoom:0,labels:!0,labelOpacity:1,doubleClickLabels:!0},t)).labels||(this.mutantOptions=L.extend(this.mutantOptions,{labelOpacity:t.labels?1:void 0,doubleClickLabels:!!t.labels||void 0})),this._googleMutant=L.tileLayer("http://mt0.google.com/vt/lyrs=s&x={x}&y={y}&z={z}",{maxZoom:t.maxZoom,maxNativeZoom:t.maxNativeZoom,minZoom:t.minZoom,opacity:t.mutantOpacity}).addTo(this),t.labels?this._addLabels(t):this.doubleClickLabels=void 0,this},_addLabels:function(t){return 0!==t.labelOpacity&&1!==t.labelOpacity&&(t.labelOpacity=1),this._labels=L.tileLayer("https://stamen-tiles-{s}.a.ssl.fastly.net/toner-labels/{z}/{x}/{y}{r}.{ext}",{attribution:'Map tiles by Stamen Design, CC BY 3.0 — Map data © OpenStreetMap contributors',subdomains:"abcd",interactive:!1,opacity:t.labelOpacity,maxZoom:t.maxZoom,maxNativeZoom:t.maxNativeZoom,minZoom:t.minZoom,ext:"png"}).addTo(this),this.mutantOptions.doubleClickLabels&&this.doubleClickLabels.enable(),this}}),L.Map.addInitHook((function(){this.doubleClickLabels.disable(),this.doubleClickZoom.enable()}))},999:function(){L.DomUtil=L.extend(L.DomUtil,{initTranslation:function(t){this.translation=t},getMatrixString:function(t){var e=L.Browser.webkit3d||L.Browser.gecko3d||L.Browser.ie3d,i=[t[0],t[3],0,t[6],t[1],t[4],0,t[7],0,0,1,0,t[2],t[5],0,t[8]],o=e?"matrix3d("+i.join(",")+")":"";return e||console.log("Your browser must support 3D CSS transformsin order to use DistortableImageOverlay."),o},toggleClass:function(t,e){var i=e;return this.hasClass(t,i)?this.removeClass(t,i):this.addClass(t,i)},confirmDelete:function(){return window.confirm(this.translation.confirmImageDelete)},confirmDeletes:function(t){if(1===t)return this.confirmDelete();var e,i=this.translation.confirmImagesDeletes;return e="function"==typeof i?i(t):i,window.confirm(e)}})},85:function(){L.IconUtil={create:function(t){return/^#/.test(t)&&(t=t.replace(/^#/,"")),''},addClassToSvg:function(t,e){var i=t.querySelector("svg");i&&L.DomUtil.addClass(i,e)},toggleXlink:function(t,e,i){/^#/.test(e)||(e="#"+e),/^#/.test(i)||(i="#"+i);var o=t.querySelector("use");if(o){var n=o.getAttribute("xlink:href")===e?i:e;return o.setAttribute("xlink:href",n),n}return!1},toggleTitle:function(t,e,i){var o=t.getAttribute("title")===e?i:e;return t.setAttribute("title",o),t.hasAttribute("aria-label")&&t.setAttribute("aria-label",o),o}}},351:function(){L.ImageUtil={getCmPerPixel:function(t){var e=t._map;return 100*e.latLngToLayerPoint(t.getCorner(0)).distanceTo(e.latLngToLayerPoint(t.getCorner(1)))/t.getElement().width}}},360:function(){L.MatrixUtil={adj:function(t){return[t[4]*t[8]-t[5]*t[7],t[2]*t[7]-t[1]*t[8],t[1]*t[5]-t[2]*t[4],t[5]*t[6]-t[3]*t[8],t[0]*t[8]-t[2]*t[6],t[2]*t[3]-t[0]*t[5],t[3]*t[7]-t[4]*t[6],t[1]*t[6]-t[0]*t[7],t[0]*t[4]-t[1]*t[3]]},multmm:function(t,e){var i,o=[];for(i=0;i<3;i++)for(var n=0;n<3;n++){for(var a=0,s=0;s<3;s++)a+=t[3*i+s]*e[3*s+n];o[3*i+n]=a}return o},multmv:function(t,e){return[t[0]*e[0]+t[1]*e[1]+t[2]*e[2],t[3]*e[0]+t[4]*e[1]+t[5]*e[2],t[6]*e[0]+t[7]*e[1]+t[8]*e[2]]},multsm:function(t,e){for(var i=[],o=0,n=e.length;o2&&void 0!==arguments[2]?arguments[2]:"deg";return"deg"===i?this.radiansToDegrees(Math.atan2(e,t)):Math.atan2(e,t)},radiansToDegrees:function(t){return 180*t/Math.PI},degreesToRadians:function(t){return t*Math.PI/180}}},866:function(){L.Utils={initTranslation:function(){var t={deleteImage:"Delete Image",deleteImages:"Delete Images",distortImage:"Distort Image",dragImage:"Drag Image",exportImage:"Export Image",exportImages:"Export Images",removeBorder:"Remove Border",addBorder:"Add Border",freeRotateImage:"Free rotate Image",geolocateImage:"Geolocate Image",lockMode:"Lock Mode",lockImages:"Lock Images",makeImageOpaque:"Make Image Opaque",makeImageTransparent:"Make Image Transparent",restoreImage:"Restore Natural Image",rotateImage:"Rotate Image",scaleImage:"Scale Image",stackToFront:"Stack to Front",stackToBack:"Stack to Back",unlockImages:"Unlock Images",confirmImageDelete:"Are you sure? This image will be permanently deleted from the map.",confirmImagesDeletes:"Are you sure? These images will be permanently deleted from the map."};if(this.options.translation)for(var e in t)this.options.translation.hasOwnProperty(e)||(this.options.translation[e]=t[e]);else this.options.translation=t;L.DomUtil.initTranslation(this.options.translation)},getNestedVal:function(t,e,i){return[e,i].reduce((function(t,e){return t&&t[e]}),t)}}}};t[999](),t[85](),t[351](),t[360](),t[682](),t[866](),t[477](),t[808](),t[743](),t[988](),t[92](),t[194](),t[206](),t[789](),t[337](),t[350](),t[376](),t[261](),t[929](),t[280](),t[426](),t[114](),t[231](),t[541](),t[149](),t[74](),t[691](),t[105](),t[944](),t[954](),t[178](),t[547](),t[886](),t[129](),t[93](),t[719](),t[397](),t[428](),t[782](),t[752](),t[496](),t[291](),t[131]()}(); +!function(){var t={808:function(){var t=[];function e(t,e){return e.replace(/\n/g,"\\\\n").replace(/\r/g,"\\\\r").replace(/\t/g,"\\\\t")}L.DistortableCollection=L.FeatureGroup.extend({options:{editable:!0,exportOpts:{exportStartUrl:"//export.mapknitter.org/export",statusUrl:"//export.mapknitter.org",exportUrl:"http://export.mapknitter.org/"}},initialize:function(t){L.setOptions(this,t),L.FeatureGroup.prototype.initialize.call(this,t),L.Utils.initTranslation.call(this),this.editable=this.options.editable},onAdd:function(t){L.FeatureGroup.prototype.onAdd.call(this,t),this._map=t,this.editable&&this.editing.enable(),this.on("layeradd",this._addEvents,this),this.on("layerremove",this._removeEvents,this)},onRemove:function(){this.editing&&this.editing.disable(),this.off("layeradd",this._addEvents,this),this.off("layerremove",this._removeEvents,this)},_addEvents:function(t){var e=t.layer;L.DomEvent.on(e,{dragstart:this._dragStartMultiple,drag:this._dragMultiple},this),L.DomEvent.on(e.getElement(),{mousedown:this._deselectOthers,contextmenu:this._longPressMultiSelect},this)},_removeEvents:function(t){var e=t.layer;L.DomEvent.off(e,{dragstart:this._dragStartMultiple,drag:this._dragMultiple},this),L.DomEvent.off(e.getElement(),{mousedown:this._deselectOthers,contextmenu:this._longPressMultiSelect},this)},_longPressMultiSelect:function(t){var e=this;this.editable&&(t.preventDefault(),this.eachLayer((function(i){var o=i.editing;i.getElement()===t.target&&o.enabled()&&(L.DomUtil.toggleClass(i.getElement(),"collected"),e.anyCollected()?(i.deselect(),e.editing._addToolbar()):e.editing._removeToolbar())})))},isCollected:function(t){return L.DomUtil.hasClass(t.getElement(),"collected")},anyCollected:function(){return this.getLayers().some(this.isCollected.bind(this))},_toggleCollected:function(e,i){e.shiftKey&&i.editing.enabled()&&(L.DomUtil.toggleClass(e.target,"collected"),t.every((function(t){return t._leaflet_id!==i._leaflet_id}))?t.push(i):t.splice(t.indexOf(i),1)),this.anyCollected()?i.deselect():this.editing._removeToolbar()},_deselectOthers:function(t){var e=this;this.editable&&(this.eachLayer((function(i){i.getElement()!==t.target?i.deselect():e._toggleCollected(t,i)})),t&&L.DomEvent.stopPropagation(t))},_dragStartMultiple:function(t){var e,i=t.target,o=this._map;this.isCollected(i)&&this.eachLayer((function(t){for(t._dragStartPoints={},t.deselect(),e=0;e<4;e++){var i=t.getCorner(e);t._dragStartPoints[e]=o.latLngToLayerPoint(i)}}))},_dragMultiple:function(t){var e=t.target,i=this._map;if(this.isCollected(e)){var o=i.latLngToLayerPoint(e.getCorner(0)),n=e._dragStartPoints[0].subtract(o);this._updateCollectionFromPoints(n,e)}},_toRemove:function(){var t=this;return this.getLayers().filter((function(e){var i=e.editing._mode;return t.isCollected(e)&&"lock"!==i}))},_toMove:function(t){var e=this;return this.getLayers().filter((function(i){var o=i.editing._mode;return i!==t&&e.isCollected(i)&&"lock"!==o}))},_updateCollectionFromPoints:function(t,e){var i,o=this._toMove(e),n=new L.Transformation(1,-t.x,1,-t.y);o.forEach((function(t){var e={};for(i=0;i<4;i++)e[i]=n.transform(t._dragStartPoints[i]);t.setCornersFromPoints(e)}))},_getAvgCmPerPixel:function(t){return t.reduce((function(t,e){return t+e.cm_per_pixel}),0)/t.length},generateExportJson:function(){var t,i,o,n,a,s={images:[]};return this.eachLayer((function(t){if(this.isCollected(t)){var e=t._image.src.split("/"),i=e[e.length-1],o=t.getCorners(),n=[{lat:o[0].lat,lon:o[0].lng},{lat:o[1].lat,lon:o[1].lng},{lat:o[3].lat,lon:o[3].lng},{lat:o[2].lat,lon:o[2].lng}];s.images.push({id:t._leaflet_id,src:t._image.src,width:t._image.width,height:t._image.height,image_file_name:i,nodes:n,cm_per_pixel:L.ImageUtil.getCmPerPixel(t)})}}),this),s.images=s.images.reverse(),s.avg_cm_per_pixel=this._getAvgCmPerPixel(s.images),t=s.images,a=t.map((function(t){return{value:t.nodes}})),localStorage.setItem("locations",JSON.stringify(a)),i=localStorage.getItem("locations"),o="text/json;charset=utf-8,"+encodeURIComponent(JSON.stringify(i,e)),(n=document.createElement("a")).href="data:"+o,n.download="mapknitter.json",n.click(),s}}),L.distortableCollection=function(t,e){return new L.DistortableCollection(t,e)}},477:function(){L.DistortableImageOverlay=L.ImageOverlay.extend({options:{height:200,crossOrigin:!0,edgeMinWidth:50,editable:!0,mode:"distort",selected:!1},initialize:function(t,e){L.setOptions(this,e),L.Utils.initTranslation.call(this),this.edgeMinWidth=this.options.edgeMinWidth,this.editable=this.options.editable,this._selected=this.options.selected,this._url=t,this.rotation={}},onAdd:function(t){var e=this;this._map=t,this.getElement()||this._initImage(),t.on("viewreset",this._reset,this),this.options.corners&&(this._corners=this.options.corners,t.options.zoomAnimation&&L.Browser.any3d&&t.on("zoomanim",this._animateZoom,this)),L.DomEvent.on(this.getElement(),"load",(function(){if(e.getPane().appendChild(e.getElement()),e._initImageDimensions(),e.options.rotation){var i=e.options.rotation.deg>=0?"deg":"rad";e.setAngle(e.options.rotation[i],i)}else e.rotation={deg:0,rad:0},e._reset();e._corners||t.options.zoomAnimation&&L.Browser.any3d&&t.on("zoomanim",e._animateZoom,e);var o=e._eventParents;o?(e.eP=o[Object.keys(o)[0]],e.eP.editable&&e.editing.enable()):(e.editable&&e.editing.enable(),e.eP=null)})),L.DomEvent.on(this.getElement(),"click",this.select,this),L.DomEvent.on(t,{singleclickon:this._singleClickListeners,singleclickoff:this._resetClickListeners,singleclick:this._singleClick},this),t.doubleClickZoom.enabled()||t.doubleClickLabels.enabled()||L.DomEvent.on(t,"click",this.deselect,this),this.fire("add")},onRemove:function(t){L.DomEvent.off(this.getElement(),"click",this.select,this),L.DomEvent.off(t,{singleclickon:this._singleClickListeners,singleclickoff:this._resetClickListeners,singleclick:this._singleClick},this),L.DomEvent.off(t,"click",this.deselect,this),this.editing&&this.editing.disable(),this.fire("remove"),L.ImageOverlay.prototype.onRemove.call(this,t)},_initImageDimensions:function(){var t=this._map,e=L.DomUtil.getStyle(this.getElement(),"width"),i=L.DomUtil.getStyle(this.getElement(),"height"),o=parseInt(e)/parseInt(i),n=this.options.height,a=parseInt(o*n),s=t.project(t.getCenter()),r=L.point(a,n).divideBy(2);this.options.corners?this._corners=this.options.corners:this._corners=[t.unproject(s.subtract(r)),t.unproject(s.add(L.point(r.x,-r.y))),t.unproject(s.add(L.point(-r.x,r.y))),t.unproject(s.add(r))],this._initialDimensions={center:s,offset:r,zoom:t.getZoom()},this.setBounds(L.latLngBounds(this.getCorners()))},_singleClick:function(t){"singleclick"===t.type&&this.deselect()},_singleClickListeners:function(){var t=this._map;L.DomEvent.off(t,"click",this.deselect,this),L.DomEvent.on(t,"singleclick",this.deselect,this)},_resetClickListeners:function(){var t=this._map;L.DomEvent.on(t,"click",this.deselect,this),L.DomEvent.off(t,"singleclick",this.deselect,this)},isSelected:function(){return this._selected},deselect:function(){var t=this.editing;if(t.enabled())return t._removeToolbar(),t._hideMarkers(),this._selected=!1,this.fire("deselect"),this},select:function(t){var e=this.editing,i=this.eP;if(e.enabled()){if(t&&L.DomEvent.stopPropagation(t),this._programmaticGrouping(),this._selected=!0,e._addToolbar(),e._showMarkers(),this.fire("select"),!i||!i.anyCollected())return this;this.deselect()}},_programmaticGrouping:function(){this._map.eachLayer((function(t){t instanceof L.DistortableImageOverlay&&t.deselect()}))},setCorner:function(t,e){var i=this.editing;return this._corners[t]=e,this.setBounds(L.latLngBounds(this.getCorners())),this.fire("update"),i.toolbar&&i.toolbar instanceof L.DistortableImage.PopupBar&&i._updateToolbarPos(),this.edited=!0,this},_cornerExceedsMapLats:function(t,e,i){return i.options.crs.Simple!=L.CRS.Simple&&(0===t?(o=i.project(e).y<2,n=i.project(e).y>=255):(o=i.project(e).y/t<2,n=i.project(e).y/Math.pow(2,t)>=255),o||n);var o,n},setCorners:function(t){var e=this._map,i=e.getZoom(),o=this.editing,n=0;for(var a in t)if(this._cornerExceedsMapLats(i,t[a],e))return this.setBounds(L.latLngBounds(this.getCorners())),void this.fire("update");for(var s in t)this._corners[n]=t[s],n+=1;return this.setBounds(L.latLngBounds(this.getCorners())),this.fire("update"),o.toolbar&&o.toolbar instanceof L.DistortableImage.PopupBar&&o._updateToolbarPos(),this.edited=!0,this},setCornersFromPoints:function(t){var e=this._map,i=e.getZoom(),o=this.editing,n=0;for(var a in t){var s=e.layerPointToLatLng(t[a]);if(this._cornerExceedsMapLats(i,s,e))return this.setBounds(L.latLngBounds(this.getCorners())),void this.fire("update")}for(var r in t)this._corners[n]=e.layerPointToLatLng(t[r]),n+=1;return this.setBounds(L.latLngBounds(this.getCorners())),this.fire("update"),o.toolbar&&o.toolbar instanceof L.DistortableImage.PopupBar&&o._updateToolbarPos(),this.edited=!0,this},scaleBy:function(t){var e,i,o=this._map,n=o.project(this.getCenter()),a={};if(0!==t){for(e=0;e<4;e++)i=o.project(this.getCorner(e)).subtract(n).multiplyBy(t).add(n),a[e]=o.unproject(i);return this.setCorners(a),this}},getAngle:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"deg",e=this.getElement().style[L.DomUtil.TRANSFORM].split("matrix3d")[1].slice(1,-1).split(","),i=e[0],o=e[1],n=e[4],a=e[5],s=i*a-o*n,r=L.TrigUtil.calcAngle(i,o,"rad");return s<0&&(r+=r<0?Math.PI:-Math.PI),r<0&&(r=2*Math.PI+r),"deg"===t?Math.round(L.TrigUtil.radiansToDegrees(r)):L.Util.formatNum(r,2)},setAngle:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"deg",i=this.getAngle(e),o=t-i;return this.rotateBy(o,e),this},rotateBy:function(t){var e,i,o,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"deg",a=this._map,s=a.project(this.getCenter()),r={};for("deg"===n&&(t=L.TrigUtil.degreesToRadians(t)),e=0;e<4;e++)i=a.project(this.getCorner(e)).subtract(s),o=L.point(Math.cos(t)*i.x-Math.sin(t)*i.y,Math.sin(t)*i.x+Math.cos(t)*i.y),r[e]=a.unproject(o.add(s));return this.setCorners(r),this},dragBy:function(t,e){var i,o,n=this._map,a={},s=n.project(t).subtract(n.project(e));for(i=0;i<4;i++)o=n.project(this.getCorner(i)).subtract(s),a[i]=n.unproject(o);this.setCorners(a)},restore:function(){for(var t=this._map,e=this._initialDimensions.center,i=this._initialDimensions.offset,o=this._initialDimensions.zoom,n=[e.subtract(i),e.add(L.point(i.x,-i.y)),e.add(L.point(-i.x,i.y)),e.add(i)],a=0;a<4;a++)t.unproject(n[a],o).equals(this.getCorner(a))||this.setCorner(a,t.unproject(n[a],o));return this.edited=!1,this.fire("restore"),this},_getTranslateString:function(t){var e=L.Browser.webkit3d,i=(e?",0":"")+")";return"translate"+(e?"3d":"")+"("+t.x+"px,"+t.y+"px"+i},_reset:function(){var t=this._map,e=this.getElement(),i=L.bind(t.latLngToLayerPoint,t),o=this._calculateProjectiveTransform(i),n=i(this.getCorner(0)),a=L.DomUtil.getMatrixString(o),s=this._getTranslateString(n);e._leaflet_pos=n,e.style[L.DomUtil.TRANSFORM]=[s,a].join(" "),e.style[L.DomUtil.TRANSFORM+"-origin"]="0 0 0",this.rotation.deg=this.getAngle(),this.rotation.rad=this.getAngle("rad")},_animateZoom:function(t){var e=this._map,i=this.getElement(),o=function(i){return e._latLngToNewLayerPoint(i,t.zoom,t.center)},n=this._calculateProjectiveTransform(o),a=o(this.getCorner(0)),s=L.DomUtil.getMatrixString(n),r=this._getTranslateString(a);i._leaflet_pos=a,i.style[L.DomUtil.TRANSFORM]=[r,s].join(" ")},getCorners:function(){return this._corners},getCorner:function(t){return this._corners[t]},getCenter:function(){var t=this._map,e=this.getCorners().reduce((function(e,i){return e.add(t.project(i))}),L.point(0,0));return t.unproject(e.divideBy(4))},_calculateProjectiveTransform:function(t){var e,i=t(this.getCorner(0)),o=this.getElement().offsetWidth||500,n=this.getElement().offsetHeight||375,a=[];for(e=0;e<4;e++)a.push(t(this.getCorner(e))._subtract(i));return L.MatrixUtil.general2DProjection(0,0,a[0].x,a[0].y,o,0,a[1].x,a[1].y,0,n,a[2].x,a[2].y,o,n,a[3].x,a[3].y)}}),L.distortableImageOverlay=function(t,e){return new L.DistortableImageOverlay(t,e)},L.Map.addInitHook((function(){L.DomUtil.hasClass(this.getContainer(),"ldi")||L.DomUtil.addClass(this.getContainer(),"ldi")}))},782:function(){var t=this;L.DomUtil=L.DomUtil||{},L.DistortableImage=L.DistortableImage||{},L.distortableImage=L.DistortableImage,L.DistortableImage.Keymapper=L.Handler.extend({options:{position:"topright"},initialize:function(t,e){this._map=t,L.setOptions(this,e)},addHooks:function(){this._keymapper||(this._container=this._buildContainer(),this._scrollWrapper=this._wrap(),this._toggler=this._createButton(),this._setMapper(this._container,this._scrollWrapper,this._toggler),L.DomEvent.on(this._toggler,"click",this._toggleKeymapper,this),L.DomEvent.disableClickPropagation(this._container),L.DomEvent.disableScrollPropagation(this._container))},removeHooks:function(){this._keymapper&&(L.DomEvent.off(this._toggler,"click",this._toggleKeymapper,this),L.DomUtil.remove(this._toggler),L.DomUtil.remove(this._scrollWrapper),L.DomUtil.remove(this._container),this._keymapper=!1)},_buildContainer:function(){var t=L.DomUtil.create("div","ldi-keymapper-hide");t.setAttribute("id","ldi-keymapper");var e=L.DomUtil.create("br","divider");return t.appendChild(e),t},_createButton:function(){var t=L.DomUtil.create("a","");return t.innerHTML=L.IconUtil.create("keyboard_open"),t.setAttribute("id","toggle-keymapper"),t.setAttribute("href","#"),t.setAttribute("title","Show keymap"),t.setAttribute("role","button"),t.setAttribute("aria-label","Show keymap"),t},_wrap:function(){var t=L.DomUtil.create("div","");return t.setAttribute("id","keymapper-wrapper"),t.style.display="none",t},_setMapper:function(t,e,i){this._keymapper=L.control({position:this.options.position}),this._keymapper.onAdd=function(){return t.appendChild(e),e.insertAdjacentHTML("beforeend",'
Rotate Mode
R
RotateScale Mode
r
Scale Mode
s
Distort Mode
d
Drag Mode
D
Lock (Mode) / Unlock Image
l u
Stack up / down
q a
Add / Remove Image Border
b
Toggle Opacity
o
Deselect All
esc
Delete Image(s)
delete backspace
Export Image(s)
e
'),t.appendChild(i),t},this._keymapper.addTo(this._map)},_toggleKeymapper:function(t){t.preventDefault(),this._container.className="ldi-keymapper leaflet-control"===this._container.className?"ldi-keymapper-hide leaflet-control":"ldi-keymapper leaflet-control",this._scrollWrapper.style.display="none"===this._scrollWrapper.style.display?"block":"none",this._toggler.innerHTML="close"===this._toggler.innerHTML?L.IconUtil.create("keyboard_open"):"close",L.IconUtil.toggleTitle(this._toggler,"Show keymap","Hide keymap"),L.DomUtil.toggleClass(this._toggler,"close-icon")},_injectIconSet:function(){if(!document.querySelector("#keymapper-iconset")){var t=L.DomUtil.create("div","");t.id="keymapper-iconset",t.setAttribute("hidden","hidden"),this._iconset=(new L.KeymapperIconSet).render(),t.innerHTML=this._iconset,document.querySelector(".leaflet-control-container").appendChild(t)}}}),L.DistortableImage.Keymapper.addInitHook((function(){L.DistortableImage.Keymapper.prototype._n=L.DistortableImage.Keymapper.prototype._n?L.DistortableImage.Keymapper.prototype._n+1:1,1!==L.DistortableImage.Keymapper.prototype._n||L.Browser.mobile||(t.enable(),t._injectIconSet())})),L.distortableImage.keymapper=function(t,e){return new L.DistortableImage.Keymapper(t,e)}},428:function(){L.DistortableImage=L.DistortableImage||{},L.DistortableCollection.Edit=L.Handler.extend({options:{keymap:L.distortableImage.group_action_map},initialize:function(t,e){this._group=t,this._exportOpts=t.options.exportOpts,L.setOptions(this,e),L.distortableImage.group_action_map.Escape="_decollectAll"},addHooks:function(){var t=this._group._map;this.editActions=this.options.actions,this.runExporter=L.bind(L.Utils.getNestedVal(this,"_exportOpts","exporter")||this.startExport,this),L.DomEvent.on(document,"keydown",this._onKeyDown,this),t.doubleClickZoom.enabled()||t.doubleClickLabels.enabled()||L.DomEvent.on(t,"click",this._decollectAll,this),L.DomEvent.on(t,{singleclickon:this._singleClickListeners,singleclickoff:this._resetClickListeners,singleclick:this._singleClick,boxcollectend:this._addCollections},this),this._group.editable=!0,this._group.eachLayer((function(t){return t.editing.enable()}))},removeHooks:function(){var t=this._group._map;L.DomEvent.off(document,"keydown",this._onKeyDown,this),t.doubleClickZoom.enabled()||t.doubleClickLabels.enabled()||L.DomEvent.off(t,"click",this._decollectAll,this),L.DomEvent.off(t,{singleclickon:this._singleClickListeners,singleclickoff:this._resetClickListeners,singleclick:this._singleClick,boxcollectend:this._addCollections},this),this._decollectAll(),this._group.editable=!1,this._group.eachLayer((function(t){return t.editing.disable()}))},enable:function(){return this._enabled=!0,this.addHooks(),this},disable:function(){return this._enabled=!1,this.removeHooks(),this},_onKeyDown:function(t){var e=this.options.keymap[t.key];this[e]&&this._group.anyCollected()&&this[e].call(this)},_singleClick:function(t){"singleclick"===t.type&&this._decollectAll(t)},_singleClickListeners:function(){var t=this._group._map;L.DomEvent.off(t,"click",this._decollectAll,this),L.DomEvent.on(t,"singleclick",this._decollectAll,this)},_resetClickListeners:function(){var t=this._group._map;L.DomEvent.on(t,"click",this._decollectAll,this),L.DomEvent.off(t,"singleclick",this._decollectAll,this)},_decollectAll:function(t){var e;t&&(e=t.originalEvent),e&&(e.shiftKey||e.target instanceof HTMLImageElement)||(this._group.eachLayer((function(t){L.DomUtil.removeClass(t.getElement(),"collected"),t.deselect()})),this._removeToolbar(),t&&L.DomEvent.stopPropagation(t))},_unlockGroup:function(){var t=this;this.hasTool(L.UnlockAction)&&this._group.eachLayer((function(e){t._group.isCollected(e)&&(e.editing._unlock(),e.deselect())}))},_lockGroup:function(){var t=this;this.hasTool(L.LockAction)&&this._group.eachLayer((function(e){t._group.isCollected(e)&&(e.editing._lock(),L.DomUtil.addClass(e.getElement(),"collected"))}))},_addCollections:function(t){var e=this,i=t.boxCollectBounds,o=this._group._map;this._group.eachLayer((function(t){var n=t.editing;t.isSelected()&&t.deselect();var a=o.getZoom(),s=o.getCenter(),r=L.latLngBounds(t.getCorner(2),t.getCorner(1));r=o._latLngBoundsToNewLayerBounds(r,a,s),i.intersects(r)&&n.enabled()&&(e.toolbar||e._addToolbar(),L.DomUtil.addClass(t.getElement(),"collected"))}))},_removeGroup:function(t){var e=this;if(this.hasTool(L.DeleteAction)){var i=this._group._toRemove(),o=i.length;0!==o&&(L.DomUtil.confirmDeletes(o)&&(i.forEach((function(t){e._group.removeLayer(t)})),this._group.anyCollected()||this._removeToolbar()),t&&L.DomEvent.stopPropagation(t))}},cancelExport:function(){this.customCollection||(this._exportOpts.collection=void 0),clearInterval(this.updateInterval)},_addToolbar:function(){var t=this._group,e=t._map;t.options.suppressToolbar||this.toolbar||(this.toolbar=L.distortableImage.controlBar({actions:this.editActions,position:"topleft"}).addTo(e,t))},_removeToolbar:function(){var t=this._group._map;if(!this.toolbar)return!1;t.removeLayer(this.toolbar),this.toolbar=!1},hasTool:function(t){return this.editActions.some((function(e){return e===t}))},addTool:function(t){return"leaflet-toolbar-icon"!==t.baseClass||this.hasTool(t)||(this._removeToolbar(),this.editActions.push(t),this._addToolbar()),this},removeTool:function(t){var e=this;return this.editActions.some((function(i,o){return e.editActions[o]===t&&(e._removeToolbar(),e.editActions.splice(o,1),e._addToolbar(),!0)})),this},startExport:function(){var t=this;if(this.hasTool(L.ExportAction))return new Promise((function(e){var i,o=t._exportOpts;o.resolve=e,t.updateInterval=null,t.customCollection=!!o.collection,t.customCollection||(o.collection=t._group.generateExportJson().images),o.frequency=o.frequency||3e3,o.scale=o.scale||100,o.updater=o.updater||function(n){(n=JSON.parse(n)).status_url&&(i!==n.status_url&&n.status_url.match(".json")&&(i=n.status_url),"complete"===n.status&&(clearInterval(t.updateInterval),t.customCollection||(t._exportOpts.collection=void 0),e(),null!==n.jpg&&alert("Export succeeded. "+o.exportUrl+n.jpg)),console.log(n))},o.handleStatusRes=o.handleStatusRes||function(e){i=o.statusUrl+e,t.updateInterval=setInterval((function(){var t=new Request("".concat(i,"?").concat(Date.now()),{method:"GET"});fetch(t).then((function(t){if(t.ok)return t.text()})).then(o.updater)}),o.frequency)},o.fetchStatusUrl=o.fetchStatusUrl||function(t){var e=new FormData;e.append("collection",JSON.stringify(t.collection)),e.append("scale",t.scale),e.append("upload",!0);var i={method:"POST",body:e},o=new Request(t.exportStartUrl,i);fetch(o).then((function(t){if(t.ok)return t.text()})).then(t.handleStatusRes)},o.fetchStatusUrl(o)}))}}),L.distortableCollection.edit=function(t,e){return new L.DistortableCollection.Edit(t,e)}},397:function(){L.DistortableImage=L.DistortableImage||{},L.DistortableImage.Edit=L.Handler.extend({options:{opacity:.7,outline:"1px solid red",keymap:L.distortableImage.action_map},initialize:function(t,e){this._overlay=t,this._toggledImage=!1,this._mode=t.options.mode,this._transparent=!1,this._outlined=!1,L.setOptions(this,e),L.distortableImage.action_map.Escape="_deselect"},addHooks:function(){var t=this._overlay;this.editActions=this.options.actions,t.bringToFront(),this._initModes(),this._initHandles(),this._appendHandlesandDragable(),t.isSelected()&&!t.options.suppressToolbar&&this._addToolbar(),this.parentGroup=!!t.eP&&t.eP,L.DomEvent.on(t.getElement(),{dblclick:this.nextMode},this),L.DomEvent.on(window,"keydown",this._onKeyDown,this)},removeHooks:function(){var t=this._overlay,e=this.parentGroup;for(var i in this._disableDragging(),this.toolbar&&this._removeToolbar(),this._handles)L.DomUtil.remove(i);L.DomUtil.hasClass(t.getElement(),"collected")&&L.DomUtil.removeClass(t.getElement(),"collected"),e&&!e.anyCollected()&&e.editing.toolbar&&e.editing._removeToolbar(),L.DomEvent.off(t.getElement(),{dblclick:this.nextMode},this),L.DomEvent.off(window,"keydown",this._onKeyDown,this)},disable:function(){return this._enabled?(this._overlay.deselect(),this._enabled=!1,this.removeHooks(),this):this},_initModes:function(){for(var t in this._modes={},L.DistortableImage.Edit.MODES){var e=L.DistortableImage.Edit.MODES[t];-1!==this.editActions.indexOf(e)&&(this._modes[t]=e)}this._modes[this._mode]||(this._mode=Object.keys(this._modes)[0])},_initHandles:function(){var t,e=this._overlay;for(this._dragHandles=L.layerGroup(),t=0;t<4;t++)this._dragHandles.addLayer(L.dragHandle(e,t));for(this._scaleHandles=L.layerGroup(),t=0;t<4;t++)this._scaleHandles.addLayer(L.scaleHandle(e,t));for(this._distortHandles=L.layerGroup(),t=0;t<4;t++)this._distortHandles.addLayer(L.distortHandle(e,t));for(this._rotateHandles=L.layerGroup(),t=0;t<4;t++)this._rotateHandles.addLayer(L.rotateHandle(e,t));for(this._freeRotateHandles=L.layerGroup(),t=0;t<4;t++)this._freeRotateHandles.addLayer(L.freeRotateHandle(e,t));for(this._lockHandles=L.layerGroup(),t=0;t<4;t++)this._lockHandles.addLayer(L.lockHandle(e,t,{draggable:!1}));this._handles={drag:this._dragHandles,scale:this._scaleHandles,distort:this._distortHandles,rotate:this._rotateHandles,freeRotate:this._freeRotateHandles,lock:this._lockHandles}},_appendHandlesandDragable:function(){var t=this._overlay;this._mode?(this._updateHandle(),!t.isSelected()&&this.currentHandle&&this.currentHandle.eachLayer((function(t){t.setOpacity(0),t.dragging&&t.dragging.disable()})),this.isMode("lock")||this._enableDragging()):this._enableDragging()},_onKeyDown:function(t){var e=this.options.keymap[t.key],i=this._overlay,o=this.parentGroup;o&&o.anyCollected()||void 0===this[e]||i.options.suppressToolbar||i.isSelected()&&this.toolbar&&this[e].call(this)},replaceTool:function(t,e){var i=this;return"leaflet-toolbar-icon"!==e.baseClass||this.hasTool(e)||this.editActions.some((function(o,n){if(o===t){for(var a in i._removeToolbar(),i.editActions[n]=e,i._addToolbar(),L.DistortableImage.Edit.MODES)L.DistortableImage.Edit.MODES[a]===t?(delete i._modes[a],i._nextOrNone(a)):L.DistortableImage.Edit.MODES[a]===e&&(i._modes[a]=e);return!0}})),this},addTool:function(t){if("leaflet-toolbar-icon"===t.baseClass&&!this.hasTool(t)){for(var e in this._removeToolbar(),this.editActions.push(t),this._addToolbar(),L.DistortableImage.Edit.MODES)L.DistortableImage.Edit.MODES[e]===t&&(this._modes[e]=t);this._overlay.isSelected()||this._removeToolbar()}return this},hasTool:function(t){return this.editActions.some((function(e){return e===t}))},removeTool:function(t){var e=this;return this.editActions.some((function(i,o){if(i===t){for(var n in e._removeToolbar(),e.editActions.splice(o,1),e._addToolbar(),L.DistortableImage.Edit.MODES)L.DistortableImage.Edit.MODES[n]===t&&(delete e._modes[n],e._nextOrNone(n));return!0}})),this._overlay.isSelected()||this._removeToolbar(),this},_nextOrNone:function(t){this.isMode(t)&&(Object.keys(this.getModes()).length>=1?this.nextMode():("lock"===t&&this._enableDragging(),this._mode="",this._updateHandle()))},_removeToolbar:function(){var t=this._overlay._map;this.toolbar&&(t.removeLayer(this.toolbar),this.toolbar=!1)},_enableDragging:function(){var t=this,e=this._overlay,i=e._map;this.dragging=new L.Draggable(e.getElement()),this.dragging.enable(),this.dragging.on("dragstart",(function(){e.fire("dragstart"),t._removeToolbar()})),this.dragging._updatePosition=function(){var t,o,n=e.getCorner(0),a=this._newPos.subtract(i.latLngToLayerPoint(n)),s={};for(this.fire("predrag"),o=0;o<4;o++)t=i.latLngToLayerPoint(e.getCorner(o)),s[o]=i.layerPointToLatLng(t.add(a));e.setCorners(s),e.fire("drag"),this.fire("drag")},this.dragging.on("dragend",(function(){e.fire("dragend")}))},_disableDragging:function(){this.dragging&&(this.dragging.disable(),delete this.dragging)},_dragMode:function(){this.setMode("drag")},_scaleMode:function(){this.setMode("scale")},_distortMode:function(){this.setMode("distort")},_rotateMode:function(){this.setMode("rotate")},_freeRotateMode:function(){this.setMode("freeRotate")},_toggleLockMode:function(){this.isMode("lock")?this._unlock():this._lock()},_toggleOpacity:function(){var t,e=this._overlay.getElement();this.hasTool(L.OpacityAction)&&(this._transparent=!this._transparent,t=this._transparent?this.options.opacity:1,L.DomUtil.setOpacity(e,t),e.setAttribute("opacity",t),this._refresh())},_toggleBorder:function(){var t,e=this._overlay.getElement();this.hasTool(L.BorderAction)&&(this._outlined=!this._outlined,t=this._outlined?this.options.outline:"none",e.style.outline=t,this._refresh())},_toggleOrder:function(){this._toggledImage?this._stackUp():this._stackDown()},_removeOverlay:function(){var t=this._overlay,e=this.parentGroup;!this.isMode("lock")&&this.hasTool(L.DeleteAction)&&L.DomUtil.confirmDelete()&&(this._removeToolbar(),e?e.removeLayer(t):t._map.removeLayer(t))},_getExport:function(){var t=this._overlay,e=t._map,i=t.getElement();if(this.hasTool(L.ExportAction)){var o=new Image;o.id=o.id||"tempId12345",document.body.appendChild(o),o.onload=function(){var i=o.height,n=o.width,a=e.latLngToLayerPoint(t.getCorner(0)),s=e.latLngToLayerPoint(t.getCorner(1)),r=e.latLngToLayerPoint(t.getCorner(2)),l=e.latLngToLayerPoint(t.getCorner(3));o.onload=function(){L.DomUtil.remove(o)},window&&window.hasOwnProperty("warpWebGl")&&warpWebGl(o.id,[0,0,n,0,n,i,0,i],[a.x,a.y,s.x,s.y,l.x,l.y,r.x,r.y],!0)},o.src=t.options.fullResolutionSrc||i.src}},_stackUp:function(){this._toggledImage&&this.hasTool(L.StackAction)&&(this._toggledImage=!1,this._overlay.bringToFront(),this._refresh())},_stackDown:function(){!this._toggledImage&&this.hasTool(L.StackAction)&&(this._toggledImage=!0,this._overlay.bringToBack(),this._refresh())},_unlock:function(){var t=this._overlay,e=t._map,i=this.parentGroup;this.isMode("lock")&&((!i||i.isCollected(t))&&i||this.hasTool(L.LockAction))&&(this.currentHandle&&e.removeLayer(this.currentHandle),"lock"!==t.options.mode&&this.hasMode(t.options.mode)?this._mode=t.options.mode:(this._mode="",this.currentHandle=""),this._updateHandle(),this._enableDragging(),this._refresh())},_lock:function(){var t=this._overlay,e=t._map,i=this.parentGroup;this.isMode("lock")||((!i||i.isCollected(t))&&i||this.hasTool(L.LockAction))&&(this.currentHandle&&e.removeLayer(this.currentHandle),this._mode="lock",this._updateHandle(),this._disableDragging(),this._refresh())},_deselect:function(){this._overlay.deselect()},_showMarkers:function(t){var e=this.parentGroup;this.currentHandle&&(!this.isMode("lock")&&e&&e.anyCollected()||this.currentHandle.eachLayer((function(t){t.setOpacity(1),t.dragging&&t.dragging.enable(),L.DomUtil.addClass(t.getElement(),"leaflet-interactive")})))},_hideMarkers:function(){var t=this._overlay,e=this.parentGroup;this._handles||this._initHandles(),this.currentHandle&&(this.isMode("lock")&&e&&e.isCollected(t)||this.currentHandle.eachLayer((function(t){t.setOpacity(0),t.dragging&&t.dragging.disable(),L.DomUtil.removeClass(t.getElement(),"leaflet-interactive")})))},_updateHandle:function(){var t=this._overlay._map,e=this.getMode();this.currentHandle&&t.removeLayer(this.currentHandle),this.currentHandle=""===e?"":this._handles[e],""!==this.currentHandle&&t.addLayer(this.currentHandle)},_addToolbar:function(){var t=this._overlay,e=this.parentGroup,i=t._map,o=t.getCorners(),n=-1/0;if(e&&e.anyCollected())e.editing._addToolbar();else if(!t.options.suppressToolbar&&!this.toolbar){for(var a=0;an&&(n=o[a].lat);var s=t.getCenter();s.lat=n,this.toolbar=L.distortableImage.popupBar(s,{actions:this.editActions}).addTo(i,t),t.fire("toolbar:created")}},_refresh:function(){this.toolbar&&this._removeToolbar(),this._addToolbar()},_updateToolbarPos:function(){var t=this._overlay,e=t.getCorners(),i=this.toolbar,o=-1/0;if(i&&i instanceof L.DistortableImage.PopupBar){for(var n=0;no&&(o=e[n].lat);var a=t.getCenter();a.lat=o,t.options.suppressToolbar||this.toolbar.setLatLng(a)}},hasMode:function(t){return!!this._modes[t]},getMode:function(){if(this.enabled())return this._mode},getModes:function(){return this._modes},isMode:function(t){return!!this.enabled()&&this._mode===t},setMode:function(t){var e=this._overlay,i=this.parentGroup;if(this.getMode()!==t&&this.hasMode(t)&&this.enabled())return this.toolbar&&this.toolbar.clickTool(t),this.isMode("lock")&&!this.dragging&&this._enableDragging(),this._mode=t,this.isMode("lock")&&this._disableDragging(),this._updateHandle(),this._refresh(),i&&i.isCollected(e)&&e.deselect(),this},nextMode:function(t){var e=this.getMode(),i=this.parentGroup,o=Object.keys(this.getModes()),n=o.indexOf(e),a=o[(n+1)%o.length];if(t){if(i&&i.anyCollected())return;L.DomEvent.stop(t)}return this.setMode(a)}}),L.distortableImage.edit=function(t,e){return new L.DistortableImage.Edit(t,e)}},426:function(){L.BorderAction=L.EditAction.extend({initialize:function(t,e,i){var o,n,a=e.editing,s=a._mode;a._outlined?(o="border_outer",n=e.options.translation.removeBorder):(o="border_clear",n=e.options.translation.addBorder),(i=i||{}).toolbarIcon={svg:!0,html:o,tooltip:n,className:"lock"===s?"disabled":""},L.DistortableImage.action_map.b="lock"===s?"":"_toggleBorder",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){var t=this._overlay.editing;L.IconUtil.toggleXlink(this._link,"border_clear","border_outer"),L.IconUtil.toggleTitle(this._link,"Remove Border","Add Border"),t._toggleBorder()}})},114:function(){L.DeleteAction=L.EditAction.extend({initialize:function(t,e,i){var o,n=e.editing;n instanceof L.DistortableImage.Edit?(o=e.options.translation.deleteImage,L.DistortableImage.action_map.Backspace="lock"===n._mode?"":"_removeOverlay"):(o=e.options.translation.deleteImages,L.DistortableImage.group_action_map.Backspace="lock"===n._mode?"":"_removeGroup"),(i=i||{}).toolbarIcon={svg:!0,html:"delete_forever",tooltip:o,className:"lock"===n._mode?"disabled":""},L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){var t=this._overlay.editing;t instanceof L.DistortableImage.Edit?t._removeOverlay():t._removeGroup()}})},231:function(){L.DistortAction=L.EditAction.extend({initialize:function(t,e,i){(i=i||{}).toolbarIcon={svg:!0,html:"distort",tooltip:e.options.translation.distortImage,className:"distort"},L.DistortableImage.action_map.d="_distortMode",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){this._overlay.editing._distortMode()}})},541:function(){L.DragAction=L.EditAction.extend({initialize:function(t,e,i){(i=i||{}).toolbarIcon={svg:!0,html:"drag",tooltip:e.options.translation.dragImage,className:"drag"},L.DistortableImage.action_map.D="_dragMode",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){this._overlay.editing._dragMode()}})},280:function(){L.DistortableImage=L.DistortableImage||{},L.distortableImage=L.DistortableImage,L.DistortableImage.action_map={},L.EditAction=L.Toolbar2.Action.extend({options:{toolbarIcon:{svg:!1,html:"",className:"",tooltip:""}},initialize:function(t,e,i){this._overlay=e,this._map=t,L.setOptions(this,i),L.Toolbar2.Action.prototype.initialize.call(this,i),this._injectIconSet()},_createIcon:function(t,e,i){var o=this,n=this.options.toolbarIcon,a=n.className,s=this._overlay.editing;this.toolbar=t,this._icon=L.DomUtil.create("li","",e),this._link=L.DomUtil.create("a","",this._icon),n.svg?this._link.innerHTML=L.IconUtil.create(n.html):this._link.innerHTML=n.html,this._link.setAttribute("href","#"),this._link.setAttribute("title",n.tooltip),this._link.setAttribute("role","button"),L.DomUtil.addClass(this._link,this.constructor.baseClass),a&&(L.DomUtil.addClass(this._link,a),"disabled"===a&&L.DomUtil.addClass(this._icon,a),a===s._mode?L.DomUtil.addClass(this._link,"selected-mode"):L.DomUtil.removeClass(this._link,"selected-mode")),L.DomEvent.on(this._link,"click",this.enable,this),L.DomEvent.on(this._overlay,"update",(function(){var t=o._link.innerHTML.match(/xlink:href="#restore"/);t&&1===t.length&&o._enableAction()})),this._addSubToolbar(t,this._icon,i)},_injectIconSet:function(){if(!document.querySelector("#iconset")){var t=document.createElement("div");t.id="iconset",t.setAttribute("hidden","hidden"),t.innerHTML=(new L.ToolbarIconSet).render(),document.querySelector(".leaflet-marker-pane").appendChild(t)}},_enableAction:function(){L.DomUtil.removeClass(this._link.parentElement,"disabled"),L.DomUtil.removeClass(this._link,"disabled")},_disableAction:function(){L.DomUtil.addClass(this._link.parentElement,"disabled"),L.DomUtil.addClass(this._link,"disabled")}}),L.editAction=function(t,e,i){return new L.EditAction(t,e,i)}},149:function(){L.ExportAction=L.EditAction.extend({initialize:function(t,e,i){var o,n=e.editing;this.isExporting=!1,this.mouseLeaveSkip=!0,this.isHooksExecuted=!1,n instanceof L.DistortableImage.Edit?(L.DistortableImage.action_map.e="_getExport",o=e.options.translation.exportImage):(L.DistortableImage.group_action_map.e="runExporter",o=e.options.translation.exportImages),(i=i||{}).toolbarIcon={svg:!0,html:"get_app",tooltip:o},L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){var t=this._overlay.editing;if(t instanceof L.DistortableImage.Edit)t._getExport();else if(!this.isHooksExecuted){this.isHooksExecuted=!0;var e=this._link.parentElement;this.mouseEnterHandler=this.handleMouseEnter.bind(this),this.mouseLeaveHandler=this.handleMouseLeave.bind(this),L.DomEvent.on(e,"click",(function(){if(console.log("Inside export tool"),this.isExporting){if(this.mouseLeaveSkip)return;this.resetState(),this.detachMouseEventListeners(e),t.cancelExport()}else this.isExporting=!0,this.renderExportIcon(),setTimeout(this.attachMouseEventListeners.bind(this,e),100),t.runExporter().then(function(){this.resetState(),this.detachMouseEventListeners(e)}.bind(this))}),this)}},resetState:function(){this.renderDownloadIcon(),this.isExporting=!1,this.mouseLeaveSkip=!0},attachMouseEventListeners:function(t){t.addEventListener("mouseenter",this.mouseEnterHandler),t.addEventListener("mouseleave",this.mouseLeaveHandler)},detachMouseEventListeners:function(t){t.removeEventListener("mouseenter",this.mouseEnterHandler),t.removeEventListener("mouseleave",this.mouseLeaveHandler)},handleMouseEnter:function(){this.renderCancelIcon()},handleMouseLeave:function(){this.mouseLeaveSkip?this.mouseLeaveSkip=!1:this.renderExportIcon()},renderDownloadIcon:function(){L.IconUtil.toggleXlink(this._link,"get_app","spinner"),L.IconUtil.toggleTitle(this._link,"Export Images","Loading..."),L.DomUtil.removeClass(this._link.firstChild,"loader")},renderExportIcon:function(){L.IconUtil.toggleXlink(this._link,"spinner"),L.IconUtil.toggleTitle(this._link,"Export Images","Loading..."),L.IconUtil.addClassToSvg(this._link,"loader")},renderCancelIcon:function(){L.IconUtil.toggleXlink(this._link,"cancel"),L.IconUtil.toggleTitle(this._link,"Cancel Export","Loading..."),L.DomUtil.removeClass(this._link.firstChild,"loader")}})},74:function(){L.FreeRotateAction=L.EditAction.extend({initialize:function(t,e,i){(i=i||{}).toolbarIcon={svg:!0,html:"crop_rotate",tooltip:e.options.translation.freeRotateImage,className:"freeRotate"},L.DistortableImage.action_map.f="_freeRotateMode",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){this._overlay.editing._freeRotateMode()}})},691:function(){L.GeolocateAction=L.EditAction.extend({initialize:function(t,e,i){var o=e.editing;(i=i||{}).toolbarIcon={svg:!0,html:"explore",tooltip:e.options.translation.geolocateImage,className:"lock"===o._mode?"disabled":""},L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){var t=this._overlay.getElement();EXIF.getData(t,L.EXIF(t))}})},105:function(){L.LockAction=L.EditAction.extend({initialize:function(t,e,i){var o,n,a=e.editing;a instanceof L.DistortableImage.Edit?(L.DistortableImage.action_map.u="_unlock",L.DistortableImage.action_map.l="_lock",n=e.options.translation.lockMode,o=a.isMode("lock")?"lock":"unlock"):(L.DistortableImage.group_action_map.l="_lockGroup",n=e.options.translation.lockImages,o="lock"),(i=i||{}).toolbarIcon={svg:!0,html:o,tooltip:n,className:"lock"},L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){var t=this._overlay.editing;t instanceof L.DistortableImage.Edit?t._toggleLockMode():t._lockGroup()}})},944:function(){L.OpacityAction=L.EditAction.extend({initialize:function(t,e,i){var o,n,a=e.editing,s=a._mode;a._transparent?(o="opacity_empty",n=e.options.translation.makeImageOpaque):(o="opacity",n=e.options.translation.makeImageTransparent),(i=i||{}).toolbarIcon={svg:!0,html:o,tooltip:n,className:"lock"===s?"disabled":""},L.DistortableImage.action_map.o="lock"===s?"":"_toggleOpacity",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){var t=this._overlay.editing,e=this._link;L.IconUtil.toggleXlink(e,"opacity","opacity_empty"),L.IconUtil.toggleTitle(e,"Make Image Transparent","Make Image Opaque"),t._toggleOpacity()}})},954:function(){L.RestoreAction=L.EditAction.extend({initialize:function(t,e,i){var o=L.Utils.getNestedVal(e,"editing","_mode"),n=e.edited;(i=i||{}).toolbarIcon={svg:!0,html:"restore",tooltip:e.options.translation.restoreImage,className:n&&"lock"!==o?"":"disabled"},L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){var t=this._overlay;L.DomEvent.on(t,{edit:this._enableAction,restore:this._disableAction},this),t.restore()}})},178:function(){L.RotateAction=L.EditAction.extend({initialize:function(t,e,i){(i=i||{}).toolbarIcon={svg:!0,html:"rotate",tooltip:e.options.translation.rotateImage,className:"rotate"},L.DistortableImage.action_map.r="_rotateMode",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){this._overlay.editing._rotateMode()}})},547:function(){L.ScaleAction=L.EditAction.extend({initialize:function(t,e,i){(i=i||{}).toolbarIcon={svg:!0,html:"scale",tooltip:e.options.translation.scaleImage,className:"scale"},L.DistortableImage.action_map.s="_scaleMode",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){this._overlay.editing._scaleMode()}})},886:function(){L.StackAction=L.EditAction.extend({initialize:function(t,e,i){var o,n,a=e.editing;a._toggledImage?(o="flip_to_back",n=e.options.translation.stackToFront):(o="flip_to_front",n=e.options.translation.stackToBack),(i=i||{}).toolbarIcon={svg:!0,html:o,tooltip:n,className:"lock"===a._mode?"disabled":""},L.DistortableImage.action_map.q="lock"===a._mode?"":"_stackUp",L.DistortableImage.action_map.a="lock"===a._mode?"":"_stackDown",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){var t=this._overlay.editing;L.IconUtil.toggleXlink(this._link,"flip_to_front","flip_to_back"),L.IconUtil.toggleTitle(this._link,"Stack to Front","Stack to Back"),t._toggleOrder()}})},129:function(){L.UnlockAction=L.EditAction.extend({initialize:function(t,e,i){(i=i||{}).toolbarIcon={svg:!0,html:"unlock",tooltip:e.options.translation.unlockImages},L.DistortableImage.group_action_map.u="_unlockGroup",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){this._overlay.editing._unlockGroup()}})},743:function(){L.EXIF=function(t){if(0!==Object.keys(EXIF.getAllTags(t)).length){console.log(EXIF.getAllTags(t));var e=EXIF.getAllTags(t);void 0!==e.GPSLatitude&&void 0!==e.GPSLongitude&&(e.GPSLatitude[0],e.GPSLatitude[1],e.GPSLatitude[2],e.GPSLongitude[0],e.GPSLongitude[1],e.GPSLongitude[2],e.GPSLatitudeRef,e.GPSLongitudeRef),"T"===e.GPSImgDirectionRef||"M"===e.GPSImgDirectionRef?(Math.PI,e.GPSImgDirection.numerator,e.GPSImgDirection.denominator):console.log("No compass data found"),console.log("Orientation:",e.Orientation),(6===e.Orientation||8===e.Orientation||3===e.Orientation)&&Math.PI,void 0!==e.GPSAltitude&&void 0!==e.GPSAltitudeRef&&void 0!==e.GPSAltitude&&void 0!==e.GPSAltitudeRef&&(e.GPSAltitude.numerator,e.GPSAltitude.denominator,e.GPSAltitudeRef)}else alert("EXIF initialized. Press again to view data in console.")}},92:function(){L.DistortHandle=L.EditHandle.extend({options:{TYPE:"distort",icon:L.icon({iconUrl:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAChSURBVO3BIU4DURgGwNkvL2B6AkQTLBqP4QCoSm7DDXoBLBZHDbfgICAIZjEV3YTn9uVHdMZZtcnCfI13bIzxg0emg6Nm6QVbYz3jylEsXRrvwommb49X67jFkz80fR9Mb1YxTzqiWBSLYlEsikWxKBbFolgUi2JRLIpFsSgWxaJY03fHHOu40dH07bAzWCx9Ge/TiWbpHgdsjPGNB2f/yS+7xRCyiiZPJQAAAABJRU5ErkJggg==",iconSize:[32,32],iconAnchor:[16,16]})},_onHandleDrag:function(){this._handled.setCorner(this._corner,this.getLatLng())},updateHandle:function(){this.setLatLng(this._handled.getCorner(this._corner))}}),L.distortHandle=function(t,e,i){return new L.DistortHandle(t,e,i)}},194:function(){L.DragHandle=L.EditHandle.extend({options:{TYPE:"drag",icon:L.icon({iconUrl:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAsVJREFUeNrMVztLXEEUvnNVFAVBAhY2aRKbTZEHJNpYabuNjSgYg/GxdsmPSJkUAa/ZdVEX8mgWYVutbHxAHkVskjQBuUUgBISVhCQk3wnfwMlk1rusN1wHPubOzJlzvjlz5sxc01Ma/hUEwQnwDIjqc7uvgv9YYO86qgIwCXQbdNTlQ8kcCBHgBch8TcloF6oJGr6phk6EQAkfdz3zvgDr9Mr7Fg1fptEZoM8jsmrokpfsiIFO4IIjuE2v1EDmR4LRdlR5Gh51hj8D34ABtm8YTtqna0TgklIw5CgQguKxIojEjmFROg/MKQO27NkFAB+4wAPouGUJiIvWKHwbAxX2XyWRKWkqhT+pbJntJZJuUzISW0+5hW+obxrVBsfvoH/dqCCJuU97GBh2VteLSiYvArmErT8EVoAK9Bw7enbpVYmvAQlyowYforrH5jXL2rPHI/TKONDB7u9AlavdaTBPvPmazUeQuy8f7UomUgTEwIJPEQ3sQGE/6ll2l9H/KcEzBcfWn2IclluM3DpddJxSHujlFkscbUPvmB0LHVnLrId7nlaZVkEc6QGXQI1MAwZcWmVRHeNaQwJMMiU2cwy4s7p/RJ2ckpvIQs+cIs+5GzitloLKHUV3MPREuXbTOKO91dX387gGTONxIgEWm+E61FFrpcyqXLHsEwiDjEsjAksqw5XPoL9MHVrn6QR4q+XZrDaR4RoWzq2ymafuRA/Mq1stSsHLVkcbdf9VjOcx8ZH3+SFWcCWlVPyWuUBOwUWdC1wP5NVjYiXFWLO69PZ6CRTUY6KSIoEKdf6T3IzzgHxnsyHctNBEkmn6Oob8ExUDg/ahGybd177cDjzH5xHwgDiSvoS7I/LZyvxJZj0wod7tkX5G0XVC7rEyLhfLJjBGbKoLLEfZWObyKeZ6oY82g+yf5Zn/mJyHX7PMf04z/T3/LcAAu4E6iiyJqf0AAAAASUVORK5CYII=",iconSize:[32,32],iconAnchor:[16,16]})},_onHandleDrag:function(){var t=this._handled,e=t.getCorner(this._corner),i=this.getLatLng();t.dragBy(e,i)},updateHandle:function(){this.setLatLng(this._handled.getCorner(this._corner))}}),L.dragHandle=function(t,e,i){return new L.DragHandle(t,e,i)}},988:function(){L.EditHandle=L.Marker.extend({initialize:function(t,e,i){var o=t.getCorner(e);L.setOptions(this,i),this._handled=t,this._corner=e;var n={draggable:!0,zIndexOffset:10};i&&i.hasOwnProperty("draggable")&&(n.draggable=i.draggable),L.Marker.prototype.initialize.call(this,o,n)},onAdd:function(t){L.Marker.prototype.onAdd.call(this,t),this._bindListeners(),this.updateHandle()},onRemove:function(t){this._unbindListeners(),L.Marker.prototype.onRemove.call(this,t)},_onHandleDragStart:function(){this._handled.fire("editstart")},_onHandleDragEnd:function(){this._fireEdit()},_fireEdit:function(){this._handled.edited=!0,this._handled.fire("edit")},_bindListeners:function(){this.on({contextmenu:L.DomEvent.stop,dragstart:this._onHandleDragStart,drag:this._onHandleDrag,dragend:this._onHandleDragEnd},this),this._handled._map.on("zoomend",this.updateHandle,this),this._handled.on("update",this.updateHandle,this)},_unbindListeners:function(){this.off({contextmenu:L.DomEvent.stop,dragstart:this._onHandleDragStart,drag:this._onHandleDrag,dragend:this._onHandleDragEnd},this),this._handled._map.off("zoomend",this.updateHandle,this),this._handled.off("update",this.updateHandle,this)},_calculateScalingFactor:function(t,e){var i=this._handled,o=i._map,n=o.latLngToLayerPoint(i.getCenter()),a=o.latLngToLayerPoint(t),s=o.latLngToLayerPoint(e),r=this._d2(n,a),l=this._d2(n,s);return Math.sqrt(l/r)},_d2:function(t,e){var i=t.x-e.x,o=t.y-e.y;return Math.pow(i,2)+Math.pow(o,2)},calculateAngleDelta:function(t,e){var i=this._handled,o=i._map,n=o.latLngToLayerPoint(i.getCenter()),a=o.latLngToLayerPoint(t),s=o.latLngToLayerPoint(e),r=Math.atan2(n.y-a.y,n.x-a.x);return Math.atan2(n.y-s.y,n.x-s.x)-r}})},206:function(){L.FreeRotateHandle=L.EditHandle.extend({options:{TYPE:"freeRotate",icon:L.icon({iconUrl:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAHiSURBVMXBa3HbShgA0PMp/1sCCo8oCEpgTaCXgIXAJiDzyCJoAUTm4UVQAns1Y8+snWnTvJyeE16hkjDgDrfoNTMKcpC9UPiLSo8JyetkjEHxjPCMyoS199kFoz8Iv1HpMaN3qWDCHoegOKkkRwnJpRmroHgiPFEZ8IBekzEGxQtUEhKSS/fB7Ew4U+lxcGkVZG9QWWPSFAxBcdK59KApuA+yNwp2uEdx1GN25sZJZULSfAtm77SlbNjju6MvG75u+WHRWVR6rDVjMPsgwYyVZl3pLTpHkyYHOx8syMiayaJzlDTZ9YyaZNFVkiYH2ZUEBcVJJXVImuz6Js3Qofe59pq7DoOTILu+g+a288mCouk7/1iH4qTS+2QdDppbV1ZJmrnDXnPnc5UOs2Z0fUmTuyBr+krvSioJyUmQO0dZM7mepMkWnaNRkyrJB6uskTSjxY3Fll8bvmJwlDb83FJ8gMqAB80uyBY3Trb82PAfvjj6vuHnluIdKgMeNXOwctK5NKBoHitrb1RJeHRp5Ux4ojLg0aWMHGQvUOkxIWkKVsHsTPiNSo8HDC5lZIsgO6n0uMUdRvQuFQxB8UR4RmXC2vvsgtEfhL+o9JiQvE7GGBTPCK9QSUjoMWgKDthjDrIX+h/k0I7gth6N5gAAAABJRU5ErkJggg==",iconSize:[32,32],iconAnchor:[16,16]})},_onHandleDrag:function(){var t=this._handled,e=t._map,i=t.getCorner(this._corner),o=this.getLatLng(),n=this.calculateAngleDelta(i,o),a=this._calculateScalingFactor(i,o);0!==n&&t.rotateBy(n,"rad");var s=t.edgeMinWidth;s||(s=50);var r=e.latLngToContainerPoint(t.getCorner(0)),l=e.latLngToContainerPoint(t.getCorner(1)),c=Math.abs(r.x-l.x),d=Math.abs(r.y-l.y);Math.sqrt(c*c+d*d)>s||a>1?t.scaleBy(a):t.scaleBy(1)},updateHandle:function(){this.setLatLng(this._handled.getCorner(this._corner))}}),L.freeRotateHandle=function(t,e,i){return new L.FreeRotateHandle(t,e,i)}},789:function(){L.LockHandle=L.EditHandle.extend({options:{TYPE:"lock",interactive:!1,icon:L.icon({iconUrl:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAD8SURBVO3BPU7CYAAA0AdfjIcQlRCQBG7C3gk2uIPG2RC3Dk16Gz0FTO1WZs/gwGCMP/2+xsSl7+n1er1Iz9LtRQjaPeMeO+TinLDCJV78YqjdA04YodKuxhUaPGoRxMmxwRQZSt87Yo4KExGCeAUyLLFB4bMacxywEClIU2KDKXbInTUYo8JCgoFuGoxQO5uiwY1EA91VmDqrcKeDoX8WdNNgjApvmGGLXKIgXY0xGkxQYItrrFFIEKQ5Yo4KEx9yrDFDhlKkIF6NOQ5Y+KpAhiXWKEQI4pxwiwoLPyuxwQw75FoE7fZYocFEuwI7jHCBV39gL92TXq/Xi/AOcmczZmaIMScAAAAASUVORK5CYII=",iconSize:[32,32],iconAnchor:[16,16]})},onRemove:function(t){this.unbindTooltip(),L.EditHandle.prototype.onRemove.call(this,t)},_bindListeners:function(){var t=this.getElement();L.EditHandle.prototype._bindListeners.call(this),L.DomEvent.on(t,{mousedown:this._tooltipOn,mouseup:this._tooltipOff},this),L.DomEvent.on(document,"pointerleave",this._tooltipOff,this)},_unbindListeners:function(){var t=this.getElement();L.EditHandle.prototype._bindListeners.call(this),L.DomEvent.off(t,{mousedown:this._tooltipOn,mouseup:this._tooltipOff},this),L.DomEvent.off(document,"pointerleave",this._tooltipOff,this)},_onHandleDrag:function(){},updateHandle:function(){this.setLatLng(this._handled.getCorner(this._corner))},_tooltipOn:function(t){var e=this._handled.parentGroup,i=e?e.editing:this._handled.editing;if(!t.shiftKey&&(this._handled.isSelected()||!e||e.isCollected(this._handled))){var o=i._lockHandles;this._timer=setTimeout(L.bind((function(){this._timeout&&clearTimeout(this._timeout),this.getTooltip()?o.eachLayer((function(t){this!==t&&t.closeTooltip()})):this.bindTooltip("Locked!",{permanent:!0}),this.openTooltip()}),this),500)}},_tooltipOff:function(t){var e=this._handled.parentGroup,i=e?e.editing:this._handled.editing;if(!t.shiftKey&&(this._handled.isSelected()||!e||e.isCollected(this._handled))){var o=i._lockHandles;t.currentTarget===document&&o.eachLayer((function(t){t.closeTooltip()})),this._timer&&clearTimeout(this._timer),this._timeout=setTimeout(L.bind((function(){this.closeTooltip()}),this),400)}}}),L.lockHandle=function(t,e,i){return new L.LockHandle(t,e,i)}},337:function(){L.RotateHandle=L.EditHandle.extend({options:{TYPE:"rotate",icon:L.icon({iconUrl:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAHiSURBVMXBa3HbShgA0PMp/1sCCo8oCEpgTaCXgIXAJiDzyCJoAUTm4UVQAns1Y8+snWnTvJyeE16hkjDgDrfoNTMKcpC9UPiLSo8JyetkjEHxjPCMyoS199kFoz8Iv1HpMaN3qWDCHoegOKkkRwnJpRmroHgiPFEZ8IBekzEGxQtUEhKSS/fB7Ew4U+lxcGkVZG9QWWPSFAxBcdK59KApuA+yNwp2uEdx1GN25sZJZULSfAtm77SlbNjju6MvG75u+WHRWVR6rDVjMPsgwYyVZl3pLTpHkyYHOx8syMiayaJzlDTZ9YyaZNFVkiYH2ZUEBcVJJXVImuz6Js3Qofe59pq7DoOTILu+g+a288mCouk7/1iH4qTS+2QdDppbV1ZJmrnDXnPnc5UOs2Z0fUmTuyBr+krvSioJyUmQO0dZM7mepMkWnaNRkyrJB6uskTSjxY3Fll8bvmJwlDb83FJ8gMqAB80uyBY3Trb82PAfvjj6vuHnluIdKgMeNXOwctK5NKBoHitrb1RJeHRp5Ux4ojLg0aWMHGQvUOkxIWkKVsHsTPiNSo8HDC5lZIsgO6n0uMUdRvQuFQxB8UR4RmXC2vvsgtEfhL+o9JiQvE7GGBTPCK9QSUjoMWgKDthjDrIX+h/k0I7gth6N5gAAAABJRU5ErkJggg==",iconSize:[32,32],iconAnchor:[16,16]})},_onHandleDrag:function(){var t=this._handled,e=t.getCorner(this._corner),i=this.getLatLng(),o=this.calculateAngleDelta(e,i);t.rotateBy(o,"rad")},updateHandle:function(){this.setLatLng(this._handled.getCorner(this._corner))}}),L.rotateHandle=function(t,e,i){return new L.RotateHandle(t,e,i)}},350:function(){L.ScaleHandle=L.EditHandle.extend({options:{TYPE:"scale",icon:L.icon({iconUrl:"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2ZXJzaW9uPSIxLjEiIHdpZHRoPSI0NTkiIGhlaWdodD0iNDY0IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCA1MTIgNTEyIiB4bWw6c3BhY2U9InByZXNlcnZlIiBzdHlsZT0iIj48cmVjdCBpZD0iYmFja2dyb3VuZHJlY3QiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIHg9IjAiIHk9IjAiIGZpbGw9Im5vbmUiIHN0cm9rZT0ibm9uZSIgY2xhc3M9IiIgc3R5bGU9IiIvPjxnIGNsYXNzPSJjdXJyZW50TGF5ZXIiIHN0eWxlPSIiPjx0aXRsZT5MYXllciAxPC90aXRsZT48cGF0aCBkPSJNNDU5LjA0OTE1OTUzMDQ3MTM0LDg2LjkyNjIzNDUxMjU1MDAyIFYwIGgtODUuNzE0NTczMzU2MzEyMDkgdjI3LjA0MzcxNzQwMzkwNDQ1MiBIODUuNzE0NTczMzU2MzEyMDMgVjAgSDAgdjg2LjkyNjIzNDUxMjU1MDAyIGgyNS43MTQzNzIwMDY4OTM2MjYgdjI4OS43NTQxMTUwNDE4MzM0IEgwIHY4Ni45MjYyMzQ1MTI1NTAwMiBoODUuNzE0NTczMzU2MzEyMDkgdi0yNy4wNDM3MTc0MDM5MDQ0NTIgaDI4NS43MTUyNDQ1MjEwNDAzIHYyNy4wNDM3MTc0MDM5MDQ0NTIgaDg1LjcxNDU3MzM1NjMxMjA5IHYtODYuOTI2MjM0NTEyNTUwMDIgaC0yMy44MDk2MDM3MTAwODY2OSBWODYuOTI2MjM0NTEyNTUwMDIgSDQ1OS4wNDkxNTk1MzA0NzEzNCB6TTM4NC43NjMxOTU5NTUwMDA5LDEyLjU1NjAxMTY1MTgxMjc4MSBoNjEuOTA0OTY5NjQ2MjI1Mzk2IHY2Mi43ODAwNTgyNTkwNjM5MSBoLTYxLjkwNDk2OTY0NjIyNTM5NiBWMTIuNTU2MDExNjUxODEyNzgxIHpNMTIuMzgwOTkzOTI5MjQ1MDUsMTIuNTU2MDExNjUxODEyNzgxIGg2MS45MDQ5Njk2NDYyMjUzOTYgdjYyLjc4MDA1ODI1OTA2MzkxIEgxMi4zODA5OTM5MjkyNDUwNSBWMTIuNTU2MDExNjUxODEyNzgxIHpNNzQuMjg1OTYzNTc1NDcwNTMsNDUxLjA1MDU3MjQxNTEyMDY2IEgxMi4zODA5OTM5MjkyNDUwNSB2LTYyLjc4MDA1ODI1OTA2MzkxIGg2MS45MDQ5Njk2NDYyMjUzOTYgVjQ1MS4wNTA1NzI0MTUxMjA2NiB6TTQ0NS43MTU3ODE0NTI4MjI3NCw0NTEuMDUwNTcyNDE1MTIwNjYgaC02Mi44NTczNTM3OTQ2Mjg4NjQgdi02Mi43ODAwNTgyNTkwNjM5MSBoNjIuODU3MzUzNzk0NjI4ODY0IFY0NTEuMDUwNTcyNDE1MTIwNjYgek00MDcuNjIwNDE1NTE2Njg0MjYsMzc2LjY4MDM0OTU1NDM4MzQ0IGgtMzYuMTkwNTk3NjM5MzMxNzcgdjMyLjgzODc5OTcwNDc0MTEyIEg4NS43MTQ1NzMzNTYzMTIwMyB2LTMyLjgzODc5OTcwNDc0MTEyIEg0OS41MjM5NzU3MTY5ODAzMiBWODYuOTI2MjM0NTEyNTUwMDIgaDM2LjE5MDU5NzYzOTMzMTc3IFY1MC4yMjQwNDY2MDcyNTExMjUgaDI4Ny42MjAwMTI4MTc4NDcyIHYzNi43MDIxODc5MDUyOTg5IGgzNC4yODU4MjkzNDI1MjQ4MzUgVjM3Ni42ODAzNDk1NTQzODM0NCB6IiBpZD0ic3ZnXzIiIGNsYXNzPSIiIGZpbGw9IiMxYTFhZWIiIGZpbGwtb3BhY2l0eT0iMSIvPjwvZz48L3N2Zz4=",iconSize:[32,32],iconAnchor:[16,16]})},_onHandleDrag:function(){var t=this._handled,e=t._map,i=t.edgeMinWidth,o=t.getCorner(this._corner),n=this.getLatLng(),a=this._calculateScalingFactor(o,n);i||(i=50);var s=e.latLngToLayerPoint(t.getCorner(0)),r=e.latLngToLayerPoint(t.getCorner(1)),l=Math.abs(s.x-r.x),c=Math.abs(s.y-r.y);Math.sqrt(l*l+c*c)>i||a>1?t.scaleBy(a):t.scaleBy(1)},updateHandle:function(){this.setLatLng(this._handled.getCorner(this._corner))}}),L.scaleHandle=function(t,e,i){return new L.ScaleHandle(t,e,i)}},719:function(){L.distortableImage=L.DistortableImage||{},L.distortableImage=L.DistortableImage,L.DistortableImage.group_action_map={},L.DistortableImage.ControlBar=L.Toolbar2.Control.extend({}),L.distortableImage.controlBar=function(t){return new L.DistortableImage.ControlBar(t)},L.DistortableCollection.addInitHook((function(){this.ACTIONS=[L.ExportAction,L.DeleteAction,L.LockAction,L.UnlockAction],L.DistortableCollection.Edit.MODES={lock:L.LockAction,unlock:L.UnlockAction};var t=this.options.actions?this.options.actions:this.ACTIONS;this.editing=L.distortableCollection.edit(this,{actions:t})}))},93:function(){L.DistortableImage=L.DistortableImage||{},L.distortableImage=L.DistortableImage,L.DistortableImage.action_map={},L.DistortableImage.PopupBar=L.Toolbar2.Popup.extend({options:{anchor:[0,-10]},initialize:function(t,e){L.setOptions(this,e),L.Toolbar2.Popup.prototype.initialize.call(this,t,e)},addHooks:function(t,e){this.map=t,this.ov=e},tools:function(){if(this._ul)return this._ul.children},clickTool:function(t){for(var e=this.tools(),i=0;i',_symbols:"",render:function(){return this.addSymbols(this._symbols),this._svg},addSymbols:function(t){this._svg+=t}})},261:function(){L.KeymapperIconSet=L.IconSet.extend({_symbols:''})},929:function(){L.ToolbarIconSet=L.IconSet.extend({_symbols:''})},496:function(){L.Map.mergeOptions({boxCollector:!0,boxZoom:!1}),L.Map.BoxCollector=L.Map.BoxZoom.extend({initialize:function(t){this._map=t,this._container=t._container,this._pane=t._panes.overlayPane,this._resetStateTimeout=0,t.on("unload",this._destroy,this)},addHooks:function(){L.DomEvent.on(this._container,"mousedown",this._onMouseDown,this)},removeHooks:function(){L.DomEvent.off(this._container,"mousedown",this._onMouseDown,this)},moved:function(){return this._moved},_destroy:function(){L.DomUtil.remove(this._pane),delete this._pane},_resetState:function(){this._resetStateTimeout=0,this._moved=!1},_clearDeferredResetState:function(){0!==this._resetStateTimeout&&(clearTimeout(this._resetStateTimeout),this._resetStateTimeout=0)},_onMouseDown:function(t){if(!t.shiftKey||1!==t.which&&1!==t.button)return!1;this._clearDeferredResetState(),this._resetState(),L.DomUtil.disableTextSelection(),L.DomUtil.disableImageDrag(),this._startPoint=this._map.mouseEventToContainerPoint(t),L.DomEvent.on(document,{contextmenu:L.DomEvent.stop,mousemove:this._onMouseMove,mouseup:this._onMouseUp},this)},_onMouseMove:function(t){this._moved||(this._moved=!0,this._box=L.DomUtil.create("div","leaflet-zoom-box",this._container),L.DomUtil.addClass(this._container,"leaflet-crosshair"),this._map.fire("boxzoomstart")),this._point=this._map.mouseEventToContainerPoint(t),this._bounds=L.bounds(this._startPoint,this._point);var e=this._bounds.getSize();L.DomUtil.setPosition(this._box,this._bounds.min),this._box.style.width=e.x+"px",this._box.style.height=e.y+"px"},_finish:function(){this._moved&&(L.DomUtil.remove(this._box),L.DomUtil.removeClass(this._container,"leaflet-crosshair")),L.DomUtil.enableTextSelection(),L.DomUtil.enableImageDrag(),L.DomEvent.off(document,{contextmenu:L.DomEvent.stop,mousemove:this._onMouseMove,mouseup:this._onMouseUp},this)},_onMouseUp:function(t){if((1===t.which||1===t.button)&&(this._finish(),this._moved)){this._clearDeferredResetState(),this._resetStateTimeout=setTimeout(L.Util.bind(this._resetState,this),0);var e=L.latLngBounds(this._map.containerPointToLatLng(this._bounds.getBottomLeft()),this._map.containerPointToLatLng(this._bounds.getTopRight())),i=this._map.getZoom(),o=this._map.getCenter();e=this._map._latLngBoundsToNewLayerBounds(e,i,o),this._map.fire("boxcollectend",{boxCollectBounds:e})}}}),L.Map.addInitHook("addHandler","boxCollector",L.Map.BoxCollector)},291:function(){L.Map.mergeOptions({doubleClickLabels:!0}),L.Map.DoubleClickLabels=L.Map.DoubleClickZoom.extend({enable:function(){var t=this._map;return this._enabled||(t.doubleClickZoom.enabled()&&t.doubleClickZoom.disable(),this._map.fire("singleclickon"),this._enabled=!0,this.addHooks()),this},disable:function(){return this._enabled?(this._enabled=!1,this.removeHooks(),this):this},_fireIfSingle:function(t){var e=this._map,i=t.originalEvent;i&&i.shiftKey||(e._clicked+=1,this._map._clickTimeout=setTimeout((function(){1===e._clicked?(e._clicked=0,e.fire("singleclick",{type:"singleclick"})):L.Browser.touch&&i&&i.sourceCapabilities.firesTouchEvents&&e.fire("dblclick")}),250))},_onDoubleClick:function(){var t=this._map,e=t._labels;setTimeout((function(){t._clicked=0,clearTimeout(t._clickTimeout)}),0),e&&(1===e.options.opacity?(e.options.opacity=0,e.setOpacity(0)):(e.options.opacity=1,e.setOpacity(1)))}}),L.Map.addInitHook("addHandler","doubleClickLabels",L.Map.DoubleClickLabels)},752:function(){L.Map.DoubleClickZoom.include({addHooks:function(){this._map.on({click:this._fireIfSingle,dblclick:this._onDoubleClick},this)},removeHooks:function(){this._map.off({click:this._fireIfSingle,dblclick:this._onDoubleClick},this)},enable:function(){return this._enabled||this._map.doubleClickLabels&&this._map.doubleClickLabels.enabled()||(this._map.fire("singleclickon"),this._enabled=!0,this.addHooks()),this},disable:function(){return this._enabled?(this._map.fire("singleclickoff"),this._enabled=!1,this.removeHooks(),this):this},_fireIfSingle:function(t){var e=this._map,i=t.originalEvent;i&&i.shiftKey||(e._clicked+=1,this._map._clickTimeout=setTimeout((function(){1===e._clicked?(e._clicked=0,e.fire("singleclick",{type:"singleclick"})):L.Browser.touch&&i&&i.sourceCapabilities.firesTouchEvents&&e._fireDOMEvent(i,"dblclick",[e])}),250))},_onDoubleClick:function(t){var e=this._map,i=t.originalEvent;if(setTimeout((function(){e._clicked=0,clearTimeout(e._clickTimeout)}),0),!i)return!1;var o=e.getZoom(),n=e.options.zoomDelta,a=i.shiftKey?o-n:o+n;"center"===e.options.doubleClickZoom?e.setZoom(a):e.setZoomAround(t.containerPoint,a)}})},131:function(){L.Map.include({_clicked:0,addGoogleMutant:function(t){return(t=this.mutantOptions=L.extend({mutantOpacity:.8,maxZoom:24,maxNativeZoom:20,minZoom:0,labels:!0,labelOpacity:1,doubleClickLabels:!0},t)).labels||(this.mutantOptions=L.extend(this.mutantOptions,{labelOpacity:t.labels?1:void 0,doubleClickLabels:!!t.labels||void 0})),this._googleMutant=L.tileLayer("http://mt0.google.com/vt/lyrs=s&x={x}&y={y}&z={z}",{maxZoom:t.maxZoom,maxNativeZoom:t.maxNativeZoom,minZoom:t.minZoom,opacity:t.mutantOpacity}).addTo(this),t.labels?this._addLabels(t):this.doubleClickLabels=void 0,this},_addLabels:function(t){return 0!==t.labelOpacity&&1!==t.labelOpacity&&(t.labelOpacity=1),this._labels=L.tileLayer("https://stamen-tiles-{s}.a.ssl.fastly.net/toner-labels/{z}/{x}/{y}{r}.{ext}",{attribution:'Map tiles by Stamen Design, CC BY 3.0 — Map data © OpenStreetMap contributors',subdomains:"abcd",interactive:!1,opacity:t.labelOpacity,maxZoom:t.maxZoom,maxNativeZoom:t.maxNativeZoom,minZoom:t.minZoom,ext:"png"}).addTo(this),this.mutantOptions.doubleClickLabels&&this.doubleClickLabels.enable(),this}}),L.Map.addInitHook((function(){this.doubleClickLabels.disable(),this.doubleClickZoom.enable()}))},999:function(){L.DomUtil=L.extend(L.DomUtil,{initTranslation:function(t){this.translation=t},getMatrixString:function(t){var e=L.Browser.webkit3d||L.Browser.gecko3d||L.Browser.ie3d,i=[t[0],t[3],0,t[6],t[1],t[4],0,t[7],0,0,1,0,t[2],t[5],0,t[8]],o=e?"matrix3d("+i.join(",")+")":"";return e||console.log("Your browser must support 3D CSS transformsin order to use DistortableImageOverlay."),o},toggleClass:function(t,e){var i=e;return this.hasClass(t,i)?this.removeClass(t,i):this.addClass(t,i)},confirmDelete:function(){return window.confirm(this.translation.confirmImageDelete)},confirmDeletes:function(t){if(1===t)return this.confirmDelete();var e,i=this.translation.confirmImagesDeletes;return e="function"==typeof i?i(t):i,window.confirm(e)}})},85:function(){L.IconUtil={create:function(t){return/^#/.test(t)&&(t=t.replace(/^#/,"")),''},addClassToSvg:function(t,e){var i=t.querySelector("svg");i&&L.DomUtil.addClass(i,e)},toggleXlink:function(t,e,i){/^#/.test(e)||(e="#"+e),/^#/.test(i)||(i="#"+i);var o=t.querySelector("use");if(o){var n=o.getAttribute("xlink:href")===e?i:e;return o.setAttribute("xlink:href",n),n}return!1},toggleTitle:function(t,e,i){var o=t.getAttribute("title")===e?i:e;return t.setAttribute("title",o),t.hasAttribute("aria-label")&&t.setAttribute("aria-label",o),o}}},351:function(){L.ImageUtil={getCmPerPixel:function(t){var e=t._map;return 100*e.latLngToLayerPoint(t.getCorner(0)).distanceTo(e.latLngToLayerPoint(t.getCorner(1)))/t.getElement().width}}},360:function(){L.MatrixUtil={adj:function(t){return[t[4]*t[8]-t[5]*t[7],t[2]*t[7]-t[1]*t[8],t[1]*t[5]-t[2]*t[4],t[5]*t[6]-t[3]*t[8],t[0]*t[8]-t[2]*t[6],t[2]*t[3]-t[0]*t[5],t[3]*t[7]-t[4]*t[6],t[1]*t[6]-t[0]*t[7],t[0]*t[4]-t[1]*t[3]]},multmm:function(t,e){var i,o=[];for(i=0;i<3;i++)for(var n=0;n<3;n++){for(var a=0,s=0;s<3;s++)a+=t[3*i+s]*e[3*s+n];o[3*i+n]=a}return o},multmv:function(t,e){return[t[0]*e[0]+t[1]*e[1]+t[2]*e[2],t[3]*e[0]+t[4]*e[1]+t[5]*e[2],t[6]*e[0]+t[7]*e[1]+t[8]*e[2]]},multsm:function(t,e){for(var i=[],o=0,n=e.length;o2&&void 0!==arguments[2]?arguments[2]:"deg";return"deg"===i?this.radiansToDegrees(Math.atan2(e,t)):Math.atan2(e,t)},radiansToDegrees:function(t){return 180*t/Math.PI},degreesToRadians:function(t){return t*Math.PI/180}}},866:function(){L.Utils={initTranslation:function(){var t={deleteImage:"Delete Image",deleteImages:"Delete Images",distortImage:"Distort Image",dragImage:"Drag Image",exportImage:"Export Image",exportImages:"Export Images",removeBorder:"Remove Border",addBorder:"Add Border",freeRotateImage:"Free rotate Image",geolocateImage:"Geolocate Image",lockMode:"Lock Mode",lockImages:"Lock Images",makeImageOpaque:"Make Image Opaque",makeImageTransparent:"Make Image Transparent",restoreImage:"Restore Natural Image",rotateImage:"Rotate Image",scaleImage:"Scale Image",stackToFront:"Stack to Front",stackToBack:"Stack to Back",unlockImages:"Unlock Images",confirmImageDelete:"Are you sure? This image will be permanently deleted from the map.",confirmImagesDeletes:"Are you sure? These images will be permanently deleted from the map."};if(this.options.translation)for(var e in t)this.options.translation.hasOwnProperty(e)||(this.options.translation[e]=t[e]);else this.options.translation=t;L.DomUtil.initTranslation(this.options.translation)},getNestedVal:function(t,e,i){return[e,i].reduce((function(t,e){return t&&t[e]}),t)}}}};t[999](),t[85](),t[351](),t[360](),t[682](),t[866](),t[477](),t[808](),t[743](),t[988](),t[92](),t[194](),t[206](),t[789](),t[337](),t[350](),t[376](),t[261](),t[929](),t[280](),t[426](),t[114](),t[231](),t[541](),t[149](),t[74](),t[691](),t[105](),t[944](),t[954](),t[178](),t[547](),t[886](),t[129](),t[93](),t[719](),t[397](),t[428](),t[782](),t[752](),t[496](),t[291](),t[131]()}(); //# sourceMappingURL=leaflet.distortableimage.js.map \ No newline at end of file diff --git a/examples/js/select.js b/examples/js/select.js new file mode 100644 index 000000000..9acc219e0 --- /dev/null +++ b/examples/js/select.js @@ -0,0 +1,58 @@ +let map; + +(function(){ + map = L.map('map').setView([51.505, -0.09], 13); + map.addGoogleMutant(); + + map.whenReady(function() { + img = L.distortableImageOverlay('example.jpg', { + corners: [ + L.latLng(51.52, -0.14), + L.latLng(51.52,-0.10), + L.latLng(51.50, -0.14), + L.latLng(51.50,-0.10), + ], + mode: 'lock', + }); + + // create a second image + img2 = L.distortableImageOverlay('example.jpg', { + corners: [ + L.latLng(51.51, -0.20), + L.latLng(51.51,-0.16), + L.latLng(51.49, -0.21), + L.latLng(51.49,-0.17), + ], + mode: 'freeRotate', + suppressToolbar: true, + }); + + img3 = L.distortableImageOverlay('example.jpg', { + corners: [ + L.latLng(51.50, -0.13), + L.latLng(51.50,-0.09), + L.latLng(51.48, -0.14), + L.latLng(51.48,-0.10), + ], + actions: [L.DistortAction, L.FreeRotateAction, L.LockAction, L.OpacityAction, L.DeleteAction, L.StackAction], + }); + + img4 = L.distortableImageOverlay('example.jpg', { + actions: [L.ScaleAction, L.DistortAction, L.RotateAction, L.FreeRotateAction, L.LockAction, L.OpacityAction, L.DeleteAction, L.StackAction], + corners: [ + L.latLng(51.51, -0.07), + L.latLng(51.51,-0.03), + L.latLng(51.49, -0.08), + L.latLng(51.49,-0.04), + ] + }); + + imgGroup = L.distortableCollection().addTo(map); + + /* TODO: make an addLayers func */ + imgGroup.addLayer(img); + imgGroup.addLayer(img4); + imgGroup.addLayer(img2); + imgGroup.addLayer(img3); + }); +})(); diff --git a/examples/select.html b/examples/select.html index a96ef1c28..888cde8b8 100644 --- a/examples/select.html +++ b/examples/select.html @@ -13,6 +13,7 @@ + @@ -22,65 +23,5 @@
- diff --git a/src/DistortableCollection.js b/src/DistortableCollection.js index 75d43026b..d9bbceb13 100644 --- a/src/DistortableCollection.js +++ b/src/DistortableCollection.js @@ -230,6 +230,9 @@ L.DistortableCollection = L.FeatureGroup.extend({ json.images = json.images.reverse(); json.avg_cm_per_pixel = this._getAvgCmPerPixel(json.images); + var jsonImages = json.images; + savetoLocalStorage(jsonImages); + return json; }, }); @@ -237,3 +240,28 @@ L.DistortableCollection = L.FeatureGroup.extend({ L.distortableCollection = function(id, options) { return new L.DistortableCollection(id, options); }; + +function savetoLocalStorage(jsonImages) { + var result = jsonImages.map(img => ({value: img.nodes})); + var getImages = localStorage.setItem('locations', JSON.stringify(result)); + downloadFromLocalStorage(getImages); +} + +function downloadFromLocalStorage(getImages) { + var obj = localStorage.getItem('locations'); + var data = 'text/json;charset=utf-8,' + encodeURIComponent(JSON.stringify(obj, prettyJson)); + var a = document.createElement('a'); + a.href = 'data:' + data; + a.download = 'mapknitter.json'; + // a.innerHTML = 'download JSON'; + // console.log(a); + a.click(); +} + +function prettyJson(key, value) { + // return value.replace(/[^\w\s]/gi, '\n'); + // (/\n/g, "\r\n") + return value.replace(/\n/g, '\\\\n').replace(/\r/g, '\\\\r').replace(/\t/g, '\\\\t'); +} + + diff --git a/src/edit/actions/ExportAction.js b/src/edit/actions/ExportAction.js index 1421dce2b..a5d82ef30 100644 --- a/src/edit/actions/ExportAction.js +++ b/src/edit/actions/ExportAction.js @@ -47,6 +47,7 @@ L.ExportAction = L.EditAction.extend({ this.mouseLeaveHandler = this.handleMouseLeave.bind(this); L.DomEvent.on(exportTool, 'click', function() { + console.log('Inside export tool'); if (!this.isExporting) { this.isExporting = true; this.renderExportIcon(); From c5beb1eb95de1769edbcf4f2a34267d646cd5c9e Mon Sep 17 00:00:00 2001 From: segun Date: Sat, 10 Dec 2022 15:26:18 +0100 Subject: [PATCH 03/57] reverted to previous state --- dist/leaflet.distortableimage.js | 8306 +++++++++++++++++++++++++++++- src/DistortableCollection.js | 28 - 2 files changed, 8305 insertions(+), 29 deletions(-) diff --git a/dist/leaflet.distortableimage.js b/dist/leaflet.distortableimage.js index 22ff720a0..0045867d0 100644 --- a/dist/leaflet.distortableimage.js +++ b/dist/leaflet.distortableimage.js @@ -1,2 +1,8306 @@ -!function(){var t={808:function(){var t=[];function e(t,e){return e.replace(/\n/g,"\\\\n").replace(/\r/g,"\\\\r").replace(/\t/g,"\\\\t")}L.DistortableCollection=L.FeatureGroup.extend({options:{editable:!0,exportOpts:{exportStartUrl:"//export.mapknitter.org/export",statusUrl:"//export.mapknitter.org",exportUrl:"http://export.mapknitter.org/"}},initialize:function(t){L.setOptions(this,t),L.FeatureGroup.prototype.initialize.call(this,t),L.Utils.initTranslation.call(this),this.editable=this.options.editable},onAdd:function(t){L.FeatureGroup.prototype.onAdd.call(this,t),this._map=t,this.editable&&this.editing.enable(),this.on("layeradd",this._addEvents,this),this.on("layerremove",this._removeEvents,this)},onRemove:function(){this.editing&&this.editing.disable(),this.off("layeradd",this._addEvents,this),this.off("layerremove",this._removeEvents,this)},_addEvents:function(t){var e=t.layer;L.DomEvent.on(e,{dragstart:this._dragStartMultiple,drag:this._dragMultiple},this),L.DomEvent.on(e.getElement(),{mousedown:this._deselectOthers,contextmenu:this._longPressMultiSelect},this)},_removeEvents:function(t){var e=t.layer;L.DomEvent.off(e,{dragstart:this._dragStartMultiple,drag:this._dragMultiple},this),L.DomEvent.off(e.getElement(),{mousedown:this._deselectOthers,contextmenu:this._longPressMultiSelect},this)},_longPressMultiSelect:function(t){var e=this;this.editable&&(t.preventDefault(),this.eachLayer((function(i){var o=i.editing;i.getElement()===t.target&&o.enabled()&&(L.DomUtil.toggleClass(i.getElement(),"collected"),e.anyCollected()?(i.deselect(),e.editing._addToolbar()):e.editing._removeToolbar())})))},isCollected:function(t){return L.DomUtil.hasClass(t.getElement(),"collected")},anyCollected:function(){return this.getLayers().some(this.isCollected.bind(this))},_toggleCollected:function(e,i){e.shiftKey&&i.editing.enabled()&&(L.DomUtil.toggleClass(e.target,"collected"),t.every((function(t){return t._leaflet_id!==i._leaflet_id}))?t.push(i):t.splice(t.indexOf(i),1)),this.anyCollected()?i.deselect():this.editing._removeToolbar()},_deselectOthers:function(t){var e=this;this.editable&&(this.eachLayer((function(i){i.getElement()!==t.target?i.deselect():e._toggleCollected(t,i)})),t&&L.DomEvent.stopPropagation(t))},_dragStartMultiple:function(t){var e,i=t.target,o=this._map;this.isCollected(i)&&this.eachLayer((function(t){for(t._dragStartPoints={},t.deselect(),e=0;e<4;e++){var i=t.getCorner(e);t._dragStartPoints[e]=o.latLngToLayerPoint(i)}}))},_dragMultiple:function(t){var e=t.target,i=this._map;if(this.isCollected(e)){var o=i.latLngToLayerPoint(e.getCorner(0)),n=e._dragStartPoints[0].subtract(o);this._updateCollectionFromPoints(n,e)}},_toRemove:function(){var t=this;return this.getLayers().filter((function(e){var i=e.editing._mode;return t.isCollected(e)&&"lock"!==i}))},_toMove:function(t){var e=this;return this.getLayers().filter((function(i){var o=i.editing._mode;return i!==t&&e.isCollected(i)&&"lock"!==o}))},_updateCollectionFromPoints:function(t,e){var i,o=this._toMove(e),n=new L.Transformation(1,-t.x,1,-t.y);o.forEach((function(t){var e={};for(i=0;i<4;i++)e[i]=n.transform(t._dragStartPoints[i]);t.setCornersFromPoints(e)}))},_getAvgCmPerPixel:function(t){return t.reduce((function(t,e){return t+e.cm_per_pixel}),0)/t.length},generateExportJson:function(){var t,i,o,n,a,s={images:[]};return this.eachLayer((function(t){if(this.isCollected(t)){var e=t._image.src.split("/"),i=e[e.length-1],o=t.getCorners(),n=[{lat:o[0].lat,lon:o[0].lng},{lat:o[1].lat,lon:o[1].lng},{lat:o[3].lat,lon:o[3].lng},{lat:o[2].lat,lon:o[2].lng}];s.images.push({id:t._leaflet_id,src:t._image.src,width:t._image.width,height:t._image.height,image_file_name:i,nodes:n,cm_per_pixel:L.ImageUtil.getCmPerPixel(t)})}}),this),s.images=s.images.reverse(),s.avg_cm_per_pixel=this._getAvgCmPerPixel(s.images),t=s.images,a=t.map((function(t){return{value:t.nodes}})),localStorage.setItem("locations",JSON.stringify(a)),i=localStorage.getItem("locations"),o="text/json;charset=utf-8,"+encodeURIComponent(JSON.stringify(i,e)),(n=document.createElement("a")).href="data:"+o,n.download="mapknitter.json",n.click(),s}}),L.distortableCollection=function(t,e){return new L.DistortableCollection(t,e)}},477:function(){L.DistortableImageOverlay=L.ImageOverlay.extend({options:{height:200,crossOrigin:!0,edgeMinWidth:50,editable:!0,mode:"distort",selected:!1},initialize:function(t,e){L.setOptions(this,e),L.Utils.initTranslation.call(this),this.edgeMinWidth=this.options.edgeMinWidth,this.editable=this.options.editable,this._selected=this.options.selected,this._url=t,this.rotation={}},onAdd:function(t){var e=this;this._map=t,this.getElement()||this._initImage(),t.on("viewreset",this._reset,this),this.options.corners&&(this._corners=this.options.corners,t.options.zoomAnimation&&L.Browser.any3d&&t.on("zoomanim",this._animateZoom,this)),L.DomEvent.on(this.getElement(),"load",(function(){if(e.getPane().appendChild(e.getElement()),e._initImageDimensions(),e.options.rotation){var i=e.options.rotation.deg>=0?"deg":"rad";e.setAngle(e.options.rotation[i],i)}else e.rotation={deg:0,rad:0},e._reset();e._corners||t.options.zoomAnimation&&L.Browser.any3d&&t.on("zoomanim",e._animateZoom,e);var o=e._eventParents;o?(e.eP=o[Object.keys(o)[0]],e.eP.editable&&e.editing.enable()):(e.editable&&e.editing.enable(),e.eP=null)})),L.DomEvent.on(this.getElement(),"click",this.select,this),L.DomEvent.on(t,{singleclickon:this._singleClickListeners,singleclickoff:this._resetClickListeners,singleclick:this._singleClick},this),t.doubleClickZoom.enabled()||t.doubleClickLabels.enabled()||L.DomEvent.on(t,"click",this.deselect,this),this.fire("add")},onRemove:function(t){L.DomEvent.off(this.getElement(),"click",this.select,this),L.DomEvent.off(t,{singleclickon:this._singleClickListeners,singleclickoff:this._resetClickListeners,singleclick:this._singleClick},this),L.DomEvent.off(t,"click",this.deselect,this),this.editing&&this.editing.disable(),this.fire("remove"),L.ImageOverlay.prototype.onRemove.call(this,t)},_initImageDimensions:function(){var t=this._map,e=L.DomUtil.getStyle(this.getElement(),"width"),i=L.DomUtil.getStyle(this.getElement(),"height"),o=parseInt(e)/parseInt(i),n=this.options.height,a=parseInt(o*n),s=t.project(t.getCenter()),r=L.point(a,n).divideBy(2);this.options.corners?this._corners=this.options.corners:this._corners=[t.unproject(s.subtract(r)),t.unproject(s.add(L.point(r.x,-r.y))),t.unproject(s.add(L.point(-r.x,r.y))),t.unproject(s.add(r))],this._initialDimensions={center:s,offset:r,zoom:t.getZoom()},this.setBounds(L.latLngBounds(this.getCorners()))},_singleClick:function(t){"singleclick"===t.type&&this.deselect()},_singleClickListeners:function(){var t=this._map;L.DomEvent.off(t,"click",this.deselect,this),L.DomEvent.on(t,"singleclick",this.deselect,this)},_resetClickListeners:function(){var t=this._map;L.DomEvent.on(t,"click",this.deselect,this),L.DomEvent.off(t,"singleclick",this.deselect,this)},isSelected:function(){return this._selected},deselect:function(){var t=this.editing;if(t.enabled())return t._removeToolbar(),t._hideMarkers(),this._selected=!1,this.fire("deselect"),this},select:function(t){var e=this.editing,i=this.eP;if(e.enabled()){if(t&&L.DomEvent.stopPropagation(t),this._programmaticGrouping(),this._selected=!0,e._addToolbar(),e._showMarkers(),this.fire("select"),!i||!i.anyCollected())return this;this.deselect()}},_programmaticGrouping:function(){this._map.eachLayer((function(t){t instanceof L.DistortableImageOverlay&&t.deselect()}))},setCorner:function(t,e){var i=this.editing;return this._corners[t]=e,this.setBounds(L.latLngBounds(this.getCorners())),this.fire("update"),i.toolbar&&i.toolbar instanceof L.DistortableImage.PopupBar&&i._updateToolbarPos(),this.edited=!0,this},_cornerExceedsMapLats:function(t,e,i){return i.options.crs.Simple!=L.CRS.Simple&&(0===t?(o=i.project(e).y<2,n=i.project(e).y>=255):(o=i.project(e).y/t<2,n=i.project(e).y/Math.pow(2,t)>=255),o||n);var o,n},setCorners:function(t){var e=this._map,i=e.getZoom(),o=this.editing,n=0;for(var a in t)if(this._cornerExceedsMapLats(i,t[a],e))return this.setBounds(L.latLngBounds(this.getCorners())),void this.fire("update");for(var s in t)this._corners[n]=t[s],n+=1;return this.setBounds(L.latLngBounds(this.getCorners())),this.fire("update"),o.toolbar&&o.toolbar instanceof L.DistortableImage.PopupBar&&o._updateToolbarPos(),this.edited=!0,this},setCornersFromPoints:function(t){var e=this._map,i=e.getZoom(),o=this.editing,n=0;for(var a in t){var s=e.layerPointToLatLng(t[a]);if(this._cornerExceedsMapLats(i,s,e))return this.setBounds(L.latLngBounds(this.getCorners())),void this.fire("update")}for(var r in t)this._corners[n]=e.layerPointToLatLng(t[r]),n+=1;return this.setBounds(L.latLngBounds(this.getCorners())),this.fire("update"),o.toolbar&&o.toolbar instanceof L.DistortableImage.PopupBar&&o._updateToolbarPos(),this.edited=!0,this},scaleBy:function(t){var e,i,o=this._map,n=o.project(this.getCenter()),a={};if(0!==t){for(e=0;e<4;e++)i=o.project(this.getCorner(e)).subtract(n).multiplyBy(t).add(n),a[e]=o.unproject(i);return this.setCorners(a),this}},getAngle:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"deg",e=this.getElement().style[L.DomUtil.TRANSFORM].split("matrix3d")[1].slice(1,-1).split(","),i=e[0],o=e[1],n=e[4],a=e[5],s=i*a-o*n,r=L.TrigUtil.calcAngle(i,o,"rad");return s<0&&(r+=r<0?Math.PI:-Math.PI),r<0&&(r=2*Math.PI+r),"deg"===t?Math.round(L.TrigUtil.radiansToDegrees(r)):L.Util.formatNum(r,2)},setAngle:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"deg",i=this.getAngle(e),o=t-i;return this.rotateBy(o,e),this},rotateBy:function(t){var e,i,o,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"deg",a=this._map,s=a.project(this.getCenter()),r={};for("deg"===n&&(t=L.TrigUtil.degreesToRadians(t)),e=0;e<4;e++)i=a.project(this.getCorner(e)).subtract(s),o=L.point(Math.cos(t)*i.x-Math.sin(t)*i.y,Math.sin(t)*i.x+Math.cos(t)*i.y),r[e]=a.unproject(o.add(s));return this.setCorners(r),this},dragBy:function(t,e){var i,o,n=this._map,a={},s=n.project(t).subtract(n.project(e));for(i=0;i<4;i++)o=n.project(this.getCorner(i)).subtract(s),a[i]=n.unproject(o);this.setCorners(a)},restore:function(){for(var t=this._map,e=this._initialDimensions.center,i=this._initialDimensions.offset,o=this._initialDimensions.zoom,n=[e.subtract(i),e.add(L.point(i.x,-i.y)),e.add(L.point(-i.x,i.y)),e.add(i)],a=0;a<4;a++)t.unproject(n[a],o).equals(this.getCorner(a))||this.setCorner(a,t.unproject(n[a],o));return this.edited=!1,this.fire("restore"),this},_getTranslateString:function(t){var e=L.Browser.webkit3d,i=(e?",0":"")+")";return"translate"+(e?"3d":"")+"("+t.x+"px,"+t.y+"px"+i},_reset:function(){var t=this._map,e=this.getElement(),i=L.bind(t.latLngToLayerPoint,t),o=this._calculateProjectiveTransform(i),n=i(this.getCorner(0)),a=L.DomUtil.getMatrixString(o),s=this._getTranslateString(n);e._leaflet_pos=n,e.style[L.DomUtil.TRANSFORM]=[s,a].join(" "),e.style[L.DomUtil.TRANSFORM+"-origin"]="0 0 0",this.rotation.deg=this.getAngle(),this.rotation.rad=this.getAngle("rad")},_animateZoom:function(t){var e=this._map,i=this.getElement(),o=function(i){return e._latLngToNewLayerPoint(i,t.zoom,t.center)},n=this._calculateProjectiveTransform(o),a=o(this.getCorner(0)),s=L.DomUtil.getMatrixString(n),r=this._getTranslateString(a);i._leaflet_pos=a,i.style[L.DomUtil.TRANSFORM]=[r,s].join(" ")},getCorners:function(){return this._corners},getCorner:function(t){return this._corners[t]},getCenter:function(){var t=this._map,e=this.getCorners().reduce((function(e,i){return e.add(t.project(i))}),L.point(0,0));return t.unproject(e.divideBy(4))},_calculateProjectiveTransform:function(t){var e,i=t(this.getCorner(0)),o=this.getElement().offsetWidth||500,n=this.getElement().offsetHeight||375,a=[];for(e=0;e<4;e++)a.push(t(this.getCorner(e))._subtract(i));return L.MatrixUtil.general2DProjection(0,0,a[0].x,a[0].y,o,0,a[1].x,a[1].y,0,n,a[2].x,a[2].y,o,n,a[3].x,a[3].y)}}),L.distortableImageOverlay=function(t,e){return new L.DistortableImageOverlay(t,e)},L.Map.addInitHook((function(){L.DomUtil.hasClass(this.getContainer(),"ldi")||L.DomUtil.addClass(this.getContainer(),"ldi")}))},782:function(){var t=this;L.DomUtil=L.DomUtil||{},L.DistortableImage=L.DistortableImage||{},L.distortableImage=L.DistortableImage,L.DistortableImage.Keymapper=L.Handler.extend({options:{position:"topright"},initialize:function(t,e){this._map=t,L.setOptions(this,e)},addHooks:function(){this._keymapper||(this._container=this._buildContainer(),this._scrollWrapper=this._wrap(),this._toggler=this._createButton(),this._setMapper(this._container,this._scrollWrapper,this._toggler),L.DomEvent.on(this._toggler,"click",this._toggleKeymapper,this),L.DomEvent.disableClickPropagation(this._container),L.DomEvent.disableScrollPropagation(this._container))},removeHooks:function(){this._keymapper&&(L.DomEvent.off(this._toggler,"click",this._toggleKeymapper,this),L.DomUtil.remove(this._toggler),L.DomUtil.remove(this._scrollWrapper),L.DomUtil.remove(this._container),this._keymapper=!1)},_buildContainer:function(){var t=L.DomUtil.create("div","ldi-keymapper-hide");t.setAttribute("id","ldi-keymapper");var e=L.DomUtil.create("br","divider");return t.appendChild(e),t},_createButton:function(){var t=L.DomUtil.create("a","");return t.innerHTML=L.IconUtil.create("keyboard_open"),t.setAttribute("id","toggle-keymapper"),t.setAttribute("href","#"),t.setAttribute("title","Show keymap"),t.setAttribute("role","button"),t.setAttribute("aria-label","Show keymap"),t},_wrap:function(){var t=L.DomUtil.create("div","");return t.setAttribute("id","keymapper-wrapper"),t.style.display="none",t},_setMapper:function(t,e,i){this._keymapper=L.control({position:this.options.position}),this._keymapper.onAdd=function(){return t.appendChild(e),e.insertAdjacentHTML("beforeend",'
Rotate Mode
R
RotateScale Mode
r
Scale Mode
s
Distort Mode
d
Drag Mode
D
Lock (Mode) / Unlock Image
l u
Stack up / down
q a
Add / Remove Image Border
b
Toggle Opacity
o
Deselect All
esc
Delete Image(s)
delete backspace
Export Image(s)
e
'),t.appendChild(i),t},this._keymapper.addTo(this._map)},_toggleKeymapper:function(t){t.preventDefault(),this._container.className="ldi-keymapper leaflet-control"===this._container.className?"ldi-keymapper-hide leaflet-control":"ldi-keymapper leaflet-control",this._scrollWrapper.style.display="none"===this._scrollWrapper.style.display?"block":"none",this._toggler.innerHTML="close"===this._toggler.innerHTML?L.IconUtil.create("keyboard_open"):"close",L.IconUtil.toggleTitle(this._toggler,"Show keymap","Hide keymap"),L.DomUtil.toggleClass(this._toggler,"close-icon")},_injectIconSet:function(){if(!document.querySelector("#keymapper-iconset")){var t=L.DomUtil.create("div","");t.id="keymapper-iconset",t.setAttribute("hidden","hidden"),this._iconset=(new L.KeymapperIconSet).render(),t.innerHTML=this._iconset,document.querySelector(".leaflet-control-container").appendChild(t)}}}),L.DistortableImage.Keymapper.addInitHook((function(){L.DistortableImage.Keymapper.prototype._n=L.DistortableImage.Keymapper.prototype._n?L.DistortableImage.Keymapper.prototype._n+1:1,1!==L.DistortableImage.Keymapper.prototype._n||L.Browser.mobile||(t.enable(),t._injectIconSet())})),L.distortableImage.keymapper=function(t,e){return new L.DistortableImage.Keymapper(t,e)}},428:function(){L.DistortableImage=L.DistortableImage||{},L.DistortableCollection.Edit=L.Handler.extend({options:{keymap:L.distortableImage.group_action_map},initialize:function(t,e){this._group=t,this._exportOpts=t.options.exportOpts,L.setOptions(this,e),L.distortableImage.group_action_map.Escape="_decollectAll"},addHooks:function(){var t=this._group._map;this.editActions=this.options.actions,this.runExporter=L.bind(L.Utils.getNestedVal(this,"_exportOpts","exporter")||this.startExport,this),L.DomEvent.on(document,"keydown",this._onKeyDown,this),t.doubleClickZoom.enabled()||t.doubleClickLabels.enabled()||L.DomEvent.on(t,"click",this._decollectAll,this),L.DomEvent.on(t,{singleclickon:this._singleClickListeners,singleclickoff:this._resetClickListeners,singleclick:this._singleClick,boxcollectend:this._addCollections},this),this._group.editable=!0,this._group.eachLayer((function(t){return t.editing.enable()}))},removeHooks:function(){var t=this._group._map;L.DomEvent.off(document,"keydown",this._onKeyDown,this),t.doubleClickZoom.enabled()||t.doubleClickLabels.enabled()||L.DomEvent.off(t,"click",this._decollectAll,this),L.DomEvent.off(t,{singleclickon:this._singleClickListeners,singleclickoff:this._resetClickListeners,singleclick:this._singleClick,boxcollectend:this._addCollections},this),this._decollectAll(),this._group.editable=!1,this._group.eachLayer((function(t){return t.editing.disable()}))},enable:function(){return this._enabled=!0,this.addHooks(),this},disable:function(){return this._enabled=!1,this.removeHooks(),this},_onKeyDown:function(t){var e=this.options.keymap[t.key];this[e]&&this._group.anyCollected()&&this[e].call(this)},_singleClick:function(t){"singleclick"===t.type&&this._decollectAll(t)},_singleClickListeners:function(){var t=this._group._map;L.DomEvent.off(t,"click",this._decollectAll,this),L.DomEvent.on(t,"singleclick",this._decollectAll,this)},_resetClickListeners:function(){var t=this._group._map;L.DomEvent.on(t,"click",this._decollectAll,this),L.DomEvent.off(t,"singleclick",this._decollectAll,this)},_decollectAll:function(t){var e;t&&(e=t.originalEvent),e&&(e.shiftKey||e.target instanceof HTMLImageElement)||(this._group.eachLayer((function(t){L.DomUtil.removeClass(t.getElement(),"collected"),t.deselect()})),this._removeToolbar(),t&&L.DomEvent.stopPropagation(t))},_unlockGroup:function(){var t=this;this.hasTool(L.UnlockAction)&&this._group.eachLayer((function(e){t._group.isCollected(e)&&(e.editing._unlock(),e.deselect())}))},_lockGroup:function(){var t=this;this.hasTool(L.LockAction)&&this._group.eachLayer((function(e){t._group.isCollected(e)&&(e.editing._lock(),L.DomUtil.addClass(e.getElement(),"collected"))}))},_addCollections:function(t){var e=this,i=t.boxCollectBounds,o=this._group._map;this._group.eachLayer((function(t){var n=t.editing;t.isSelected()&&t.deselect();var a=o.getZoom(),s=o.getCenter(),r=L.latLngBounds(t.getCorner(2),t.getCorner(1));r=o._latLngBoundsToNewLayerBounds(r,a,s),i.intersects(r)&&n.enabled()&&(e.toolbar||e._addToolbar(),L.DomUtil.addClass(t.getElement(),"collected"))}))},_removeGroup:function(t){var e=this;if(this.hasTool(L.DeleteAction)){var i=this._group._toRemove(),o=i.length;0!==o&&(L.DomUtil.confirmDeletes(o)&&(i.forEach((function(t){e._group.removeLayer(t)})),this._group.anyCollected()||this._removeToolbar()),t&&L.DomEvent.stopPropagation(t))}},cancelExport:function(){this.customCollection||(this._exportOpts.collection=void 0),clearInterval(this.updateInterval)},_addToolbar:function(){var t=this._group,e=t._map;t.options.suppressToolbar||this.toolbar||(this.toolbar=L.distortableImage.controlBar({actions:this.editActions,position:"topleft"}).addTo(e,t))},_removeToolbar:function(){var t=this._group._map;if(!this.toolbar)return!1;t.removeLayer(this.toolbar),this.toolbar=!1},hasTool:function(t){return this.editActions.some((function(e){return e===t}))},addTool:function(t){return"leaflet-toolbar-icon"!==t.baseClass||this.hasTool(t)||(this._removeToolbar(),this.editActions.push(t),this._addToolbar()),this},removeTool:function(t){var e=this;return this.editActions.some((function(i,o){return e.editActions[o]===t&&(e._removeToolbar(),e.editActions.splice(o,1),e._addToolbar(),!0)})),this},startExport:function(){var t=this;if(this.hasTool(L.ExportAction))return new Promise((function(e){var i,o=t._exportOpts;o.resolve=e,t.updateInterval=null,t.customCollection=!!o.collection,t.customCollection||(o.collection=t._group.generateExportJson().images),o.frequency=o.frequency||3e3,o.scale=o.scale||100,o.updater=o.updater||function(n){(n=JSON.parse(n)).status_url&&(i!==n.status_url&&n.status_url.match(".json")&&(i=n.status_url),"complete"===n.status&&(clearInterval(t.updateInterval),t.customCollection||(t._exportOpts.collection=void 0),e(),null!==n.jpg&&alert("Export succeeded. "+o.exportUrl+n.jpg)),console.log(n))},o.handleStatusRes=o.handleStatusRes||function(e){i=o.statusUrl+e,t.updateInterval=setInterval((function(){var t=new Request("".concat(i,"?").concat(Date.now()),{method:"GET"});fetch(t).then((function(t){if(t.ok)return t.text()})).then(o.updater)}),o.frequency)},o.fetchStatusUrl=o.fetchStatusUrl||function(t){var e=new FormData;e.append("collection",JSON.stringify(t.collection)),e.append("scale",t.scale),e.append("upload",!0);var i={method:"POST",body:e},o=new Request(t.exportStartUrl,i);fetch(o).then((function(t){if(t.ok)return t.text()})).then(t.handleStatusRes)},o.fetchStatusUrl(o)}))}}),L.distortableCollection.edit=function(t,e){return new L.DistortableCollection.Edit(t,e)}},397:function(){L.DistortableImage=L.DistortableImage||{},L.DistortableImage.Edit=L.Handler.extend({options:{opacity:.7,outline:"1px solid red",keymap:L.distortableImage.action_map},initialize:function(t,e){this._overlay=t,this._toggledImage=!1,this._mode=t.options.mode,this._transparent=!1,this._outlined=!1,L.setOptions(this,e),L.distortableImage.action_map.Escape="_deselect"},addHooks:function(){var t=this._overlay;this.editActions=this.options.actions,t.bringToFront(),this._initModes(),this._initHandles(),this._appendHandlesandDragable(),t.isSelected()&&!t.options.suppressToolbar&&this._addToolbar(),this.parentGroup=!!t.eP&&t.eP,L.DomEvent.on(t.getElement(),{dblclick:this.nextMode},this),L.DomEvent.on(window,"keydown",this._onKeyDown,this)},removeHooks:function(){var t=this._overlay,e=this.parentGroup;for(var i in this._disableDragging(),this.toolbar&&this._removeToolbar(),this._handles)L.DomUtil.remove(i);L.DomUtil.hasClass(t.getElement(),"collected")&&L.DomUtil.removeClass(t.getElement(),"collected"),e&&!e.anyCollected()&&e.editing.toolbar&&e.editing._removeToolbar(),L.DomEvent.off(t.getElement(),{dblclick:this.nextMode},this),L.DomEvent.off(window,"keydown",this._onKeyDown,this)},disable:function(){return this._enabled?(this._overlay.deselect(),this._enabled=!1,this.removeHooks(),this):this},_initModes:function(){for(var t in this._modes={},L.DistortableImage.Edit.MODES){var e=L.DistortableImage.Edit.MODES[t];-1!==this.editActions.indexOf(e)&&(this._modes[t]=e)}this._modes[this._mode]||(this._mode=Object.keys(this._modes)[0])},_initHandles:function(){var t,e=this._overlay;for(this._dragHandles=L.layerGroup(),t=0;t<4;t++)this._dragHandles.addLayer(L.dragHandle(e,t));for(this._scaleHandles=L.layerGroup(),t=0;t<4;t++)this._scaleHandles.addLayer(L.scaleHandle(e,t));for(this._distortHandles=L.layerGroup(),t=0;t<4;t++)this._distortHandles.addLayer(L.distortHandle(e,t));for(this._rotateHandles=L.layerGroup(),t=0;t<4;t++)this._rotateHandles.addLayer(L.rotateHandle(e,t));for(this._freeRotateHandles=L.layerGroup(),t=0;t<4;t++)this._freeRotateHandles.addLayer(L.freeRotateHandle(e,t));for(this._lockHandles=L.layerGroup(),t=0;t<4;t++)this._lockHandles.addLayer(L.lockHandle(e,t,{draggable:!1}));this._handles={drag:this._dragHandles,scale:this._scaleHandles,distort:this._distortHandles,rotate:this._rotateHandles,freeRotate:this._freeRotateHandles,lock:this._lockHandles}},_appendHandlesandDragable:function(){var t=this._overlay;this._mode?(this._updateHandle(),!t.isSelected()&&this.currentHandle&&this.currentHandle.eachLayer((function(t){t.setOpacity(0),t.dragging&&t.dragging.disable()})),this.isMode("lock")||this._enableDragging()):this._enableDragging()},_onKeyDown:function(t){var e=this.options.keymap[t.key],i=this._overlay,o=this.parentGroup;o&&o.anyCollected()||void 0===this[e]||i.options.suppressToolbar||i.isSelected()&&this.toolbar&&this[e].call(this)},replaceTool:function(t,e){var i=this;return"leaflet-toolbar-icon"!==e.baseClass||this.hasTool(e)||this.editActions.some((function(o,n){if(o===t){for(var a in i._removeToolbar(),i.editActions[n]=e,i._addToolbar(),L.DistortableImage.Edit.MODES)L.DistortableImage.Edit.MODES[a]===t?(delete i._modes[a],i._nextOrNone(a)):L.DistortableImage.Edit.MODES[a]===e&&(i._modes[a]=e);return!0}})),this},addTool:function(t){if("leaflet-toolbar-icon"===t.baseClass&&!this.hasTool(t)){for(var e in this._removeToolbar(),this.editActions.push(t),this._addToolbar(),L.DistortableImage.Edit.MODES)L.DistortableImage.Edit.MODES[e]===t&&(this._modes[e]=t);this._overlay.isSelected()||this._removeToolbar()}return this},hasTool:function(t){return this.editActions.some((function(e){return e===t}))},removeTool:function(t){var e=this;return this.editActions.some((function(i,o){if(i===t){for(var n in e._removeToolbar(),e.editActions.splice(o,1),e._addToolbar(),L.DistortableImage.Edit.MODES)L.DistortableImage.Edit.MODES[n]===t&&(delete e._modes[n],e._nextOrNone(n));return!0}})),this._overlay.isSelected()||this._removeToolbar(),this},_nextOrNone:function(t){this.isMode(t)&&(Object.keys(this.getModes()).length>=1?this.nextMode():("lock"===t&&this._enableDragging(),this._mode="",this._updateHandle()))},_removeToolbar:function(){var t=this._overlay._map;this.toolbar&&(t.removeLayer(this.toolbar),this.toolbar=!1)},_enableDragging:function(){var t=this,e=this._overlay,i=e._map;this.dragging=new L.Draggable(e.getElement()),this.dragging.enable(),this.dragging.on("dragstart",(function(){e.fire("dragstart"),t._removeToolbar()})),this.dragging._updatePosition=function(){var t,o,n=e.getCorner(0),a=this._newPos.subtract(i.latLngToLayerPoint(n)),s={};for(this.fire("predrag"),o=0;o<4;o++)t=i.latLngToLayerPoint(e.getCorner(o)),s[o]=i.layerPointToLatLng(t.add(a));e.setCorners(s),e.fire("drag"),this.fire("drag")},this.dragging.on("dragend",(function(){e.fire("dragend")}))},_disableDragging:function(){this.dragging&&(this.dragging.disable(),delete this.dragging)},_dragMode:function(){this.setMode("drag")},_scaleMode:function(){this.setMode("scale")},_distortMode:function(){this.setMode("distort")},_rotateMode:function(){this.setMode("rotate")},_freeRotateMode:function(){this.setMode("freeRotate")},_toggleLockMode:function(){this.isMode("lock")?this._unlock():this._lock()},_toggleOpacity:function(){var t,e=this._overlay.getElement();this.hasTool(L.OpacityAction)&&(this._transparent=!this._transparent,t=this._transparent?this.options.opacity:1,L.DomUtil.setOpacity(e,t),e.setAttribute("opacity",t),this._refresh())},_toggleBorder:function(){var t,e=this._overlay.getElement();this.hasTool(L.BorderAction)&&(this._outlined=!this._outlined,t=this._outlined?this.options.outline:"none",e.style.outline=t,this._refresh())},_toggleOrder:function(){this._toggledImage?this._stackUp():this._stackDown()},_removeOverlay:function(){var t=this._overlay,e=this.parentGroup;!this.isMode("lock")&&this.hasTool(L.DeleteAction)&&L.DomUtil.confirmDelete()&&(this._removeToolbar(),e?e.removeLayer(t):t._map.removeLayer(t))},_getExport:function(){var t=this._overlay,e=t._map,i=t.getElement();if(this.hasTool(L.ExportAction)){var o=new Image;o.id=o.id||"tempId12345",document.body.appendChild(o),o.onload=function(){var i=o.height,n=o.width,a=e.latLngToLayerPoint(t.getCorner(0)),s=e.latLngToLayerPoint(t.getCorner(1)),r=e.latLngToLayerPoint(t.getCorner(2)),l=e.latLngToLayerPoint(t.getCorner(3));o.onload=function(){L.DomUtil.remove(o)},window&&window.hasOwnProperty("warpWebGl")&&warpWebGl(o.id,[0,0,n,0,n,i,0,i],[a.x,a.y,s.x,s.y,l.x,l.y,r.x,r.y],!0)},o.src=t.options.fullResolutionSrc||i.src}},_stackUp:function(){this._toggledImage&&this.hasTool(L.StackAction)&&(this._toggledImage=!1,this._overlay.bringToFront(),this._refresh())},_stackDown:function(){!this._toggledImage&&this.hasTool(L.StackAction)&&(this._toggledImage=!0,this._overlay.bringToBack(),this._refresh())},_unlock:function(){var t=this._overlay,e=t._map,i=this.parentGroup;this.isMode("lock")&&((!i||i.isCollected(t))&&i||this.hasTool(L.LockAction))&&(this.currentHandle&&e.removeLayer(this.currentHandle),"lock"!==t.options.mode&&this.hasMode(t.options.mode)?this._mode=t.options.mode:(this._mode="",this.currentHandle=""),this._updateHandle(),this._enableDragging(),this._refresh())},_lock:function(){var t=this._overlay,e=t._map,i=this.parentGroup;this.isMode("lock")||((!i||i.isCollected(t))&&i||this.hasTool(L.LockAction))&&(this.currentHandle&&e.removeLayer(this.currentHandle),this._mode="lock",this._updateHandle(),this._disableDragging(),this._refresh())},_deselect:function(){this._overlay.deselect()},_showMarkers:function(t){var e=this.parentGroup;this.currentHandle&&(!this.isMode("lock")&&e&&e.anyCollected()||this.currentHandle.eachLayer((function(t){t.setOpacity(1),t.dragging&&t.dragging.enable(),L.DomUtil.addClass(t.getElement(),"leaflet-interactive")})))},_hideMarkers:function(){var t=this._overlay,e=this.parentGroup;this._handles||this._initHandles(),this.currentHandle&&(this.isMode("lock")&&e&&e.isCollected(t)||this.currentHandle.eachLayer((function(t){t.setOpacity(0),t.dragging&&t.dragging.disable(),L.DomUtil.removeClass(t.getElement(),"leaflet-interactive")})))},_updateHandle:function(){var t=this._overlay._map,e=this.getMode();this.currentHandle&&t.removeLayer(this.currentHandle),this.currentHandle=""===e?"":this._handles[e],""!==this.currentHandle&&t.addLayer(this.currentHandle)},_addToolbar:function(){var t=this._overlay,e=this.parentGroup,i=t._map,o=t.getCorners(),n=-1/0;if(e&&e.anyCollected())e.editing._addToolbar();else if(!t.options.suppressToolbar&&!this.toolbar){for(var a=0;an&&(n=o[a].lat);var s=t.getCenter();s.lat=n,this.toolbar=L.distortableImage.popupBar(s,{actions:this.editActions}).addTo(i,t),t.fire("toolbar:created")}},_refresh:function(){this.toolbar&&this._removeToolbar(),this._addToolbar()},_updateToolbarPos:function(){var t=this._overlay,e=t.getCorners(),i=this.toolbar,o=-1/0;if(i&&i instanceof L.DistortableImage.PopupBar){for(var n=0;no&&(o=e[n].lat);var a=t.getCenter();a.lat=o,t.options.suppressToolbar||this.toolbar.setLatLng(a)}},hasMode:function(t){return!!this._modes[t]},getMode:function(){if(this.enabled())return this._mode},getModes:function(){return this._modes},isMode:function(t){return!!this.enabled()&&this._mode===t},setMode:function(t){var e=this._overlay,i=this.parentGroup;if(this.getMode()!==t&&this.hasMode(t)&&this.enabled())return this.toolbar&&this.toolbar.clickTool(t),this.isMode("lock")&&!this.dragging&&this._enableDragging(),this._mode=t,this.isMode("lock")&&this._disableDragging(),this._updateHandle(),this._refresh(),i&&i.isCollected(e)&&e.deselect(),this},nextMode:function(t){var e=this.getMode(),i=this.parentGroup,o=Object.keys(this.getModes()),n=o.indexOf(e),a=o[(n+1)%o.length];if(t){if(i&&i.anyCollected())return;L.DomEvent.stop(t)}return this.setMode(a)}}),L.distortableImage.edit=function(t,e){return new L.DistortableImage.Edit(t,e)}},426:function(){L.BorderAction=L.EditAction.extend({initialize:function(t,e,i){var o,n,a=e.editing,s=a._mode;a._outlined?(o="border_outer",n=e.options.translation.removeBorder):(o="border_clear",n=e.options.translation.addBorder),(i=i||{}).toolbarIcon={svg:!0,html:o,tooltip:n,className:"lock"===s?"disabled":""},L.DistortableImage.action_map.b="lock"===s?"":"_toggleBorder",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){var t=this._overlay.editing;L.IconUtil.toggleXlink(this._link,"border_clear","border_outer"),L.IconUtil.toggleTitle(this._link,"Remove Border","Add Border"),t._toggleBorder()}})},114:function(){L.DeleteAction=L.EditAction.extend({initialize:function(t,e,i){var o,n=e.editing;n instanceof L.DistortableImage.Edit?(o=e.options.translation.deleteImage,L.DistortableImage.action_map.Backspace="lock"===n._mode?"":"_removeOverlay"):(o=e.options.translation.deleteImages,L.DistortableImage.group_action_map.Backspace="lock"===n._mode?"":"_removeGroup"),(i=i||{}).toolbarIcon={svg:!0,html:"delete_forever",tooltip:o,className:"lock"===n._mode?"disabled":""},L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){var t=this._overlay.editing;t instanceof L.DistortableImage.Edit?t._removeOverlay():t._removeGroup()}})},231:function(){L.DistortAction=L.EditAction.extend({initialize:function(t,e,i){(i=i||{}).toolbarIcon={svg:!0,html:"distort",tooltip:e.options.translation.distortImage,className:"distort"},L.DistortableImage.action_map.d="_distortMode",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){this._overlay.editing._distortMode()}})},541:function(){L.DragAction=L.EditAction.extend({initialize:function(t,e,i){(i=i||{}).toolbarIcon={svg:!0,html:"drag",tooltip:e.options.translation.dragImage,className:"drag"},L.DistortableImage.action_map.D="_dragMode",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){this._overlay.editing._dragMode()}})},280:function(){L.DistortableImage=L.DistortableImage||{},L.distortableImage=L.DistortableImage,L.DistortableImage.action_map={},L.EditAction=L.Toolbar2.Action.extend({options:{toolbarIcon:{svg:!1,html:"",className:"",tooltip:""}},initialize:function(t,e,i){this._overlay=e,this._map=t,L.setOptions(this,i),L.Toolbar2.Action.prototype.initialize.call(this,i),this._injectIconSet()},_createIcon:function(t,e,i){var o=this,n=this.options.toolbarIcon,a=n.className,s=this._overlay.editing;this.toolbar=t,this._icon=L.DomUtil.create("li","",e),this._link=L.DomUtil.create("a","",this._icon),n.svg?this._link.innerHTML=L.IconUtil.create(n.html):this._link.innerHTML=n.html,this._link.setAttribute("href","#"),this._link.setAttribute("title",n.tooltip),this._link.setAttribute("role","button"),L.DomUtil.addClass(this._link,this.constructor.baseClass),a&&(L.DomUtil.addClass(this._link,a),"disabled"===a&&L.DomUtil.addClass(this._icon,a),a===s._mode?L.DomUtil.addClass(this._link,"selected-mode"):L.DomUtil.removeClass(this._link,"selected-mode")),L.DomEvent.on(this._link,"click",this.enable,this),L.DomEvent.on(this._overlay,"update",(function(){var t=o._link.innerHTML.match(/xlink:href="#restore"/);t&&1===t.length&&o._enableAction()})),this._addSubToolbar(t,this._icon,i)},_injectIconSet:function(){if(!document.querySelector("#iconset")){var t=document.createElement("div");t.id="iconset",t.setAttribute("hidden","hidden"),t.innerHTML=(new L.ToolbarIconSet).render(),document.querySelector(".leaflet-marker-pane").appendChild(t)}},_enableAction:function(){L.DomUtil.removeClass(this._link.parentElement,"disabled"),L.DomUtil.removeClass(this._link,"disabled")},_disableAction:function(){L.DomUtil.addClass(this._link.parentElement,"disabled"),L.DomUtil.addClass(this._link,"disabled")}}),L.editAction=function(t,e,i){return new L.EditAction(t,e,i)}},149:function(){L.ExportAction=L.EditAction.extend({initialize:function(t,e,i){var o,n=e.editing;this.isExporting=!1,this.mouseLeaveSkip=!0,this.isHooksExecuted=!1,n instanceof L.DistortableImage.Edit?(L.DistortableImage.action_map.e="_getExport",o=e.options.translation.exportImage):(L.DistortableImage.group_action_map.e="runExporter",o=e.options.translation.exportImages),(i=i||{}).toolbarIcon={svg:!0,html:"get_app",tooltip:o},L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){var t=this._overlay.editing;if(t instanceof L.DistortableImage.Edit)t._getExport();else if(!this.isHooksExecuted){this.isHooksExecuted=!0;var e=this._link.parentElement;this.mouseEnterHandler=this.handleMouseEnter.bind(this),this.mouseLeaveHandler=this.handleMouseLeave.bind(this),L.DomEvent.on(e,"click",(function(){if(console.log("Inside export tool"),this.isExporting){if(this.mouseLeaveSkip)return;this.resetState(),this.detachMouseEventListeners(e),t.cancelExport()}else this.isExporting=!0,this.renderExportIcon(),setTimeout(this.attachMouseEventListeners.bind(this,e),100),t.runExporter().then(function(){this.resetState(),this.detachMouseEventListeners(e)}.bind(this))}),this)}},resetState:function(){this.renderDownloadIcon(),this.isExporting=!1,this.mouseLeaveSkip=!0},attachMouseEventListeners:function(t){t.addEventListener("mouseenter",this.mouseEnterHandler),t.addEventListener("mouseleave",this.mouseLeaveHandler)},detachMouseEventListeners:function(t){t.removeEventListener("mouseenter",this.mouseEnterHandler),t.removeEventListener("mouseleave",this.mouseLeaveHandler)},handleMouseEnter:function(){this.renderCancelIcon()},handleMouseLeave:function(){this.mouseLeaveSkip?this.mouseLeaveSkip=!1:this.renderExportIcon()},renderDownloadIcon:function(){L.IconUtil.toggleXlink(this._link,"get_app","spinner"),L.IconUtil.toggleTitle(this._link,"Export Images","Loading..."),L.DomUtil.removeClass(this._link.firstChild,"loader")},renderExportIcon:function(){L.IconUtil.toggleXlink(this._link,"spinner"),L.IconUtil.toggleTitle(this._link,"Export Images","Loading..."),L.IconUtil.addClassToSvg(this._link,"loader")},renderCancelIcon:function(){L.IconUtil.toggleXlink(this._link,"cancel"),L.IconUtil.toggleTitle(this._link,"Cancel Export","Loading..."),L.DomUtil.removeClass(this._link.firstChild,"loader")}})},74:function(){L.FreeRotateAction=L.EditAction.extend({initialize:function(t,e,i){(i=i||{}).toolbarIcon={svg:!0,html:"crop_rotate",tooltip:e.options.translation.freeRotateImage,className:"freeRotate"},L.DistortableImage.action_map.f="_freeRotateMode",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){this._overlay.editing._freeRotateMode()}})},691:function(){L.GeolocateAction=L.EditAction.extend({initialize:function(t,e,i){var o=e.editing;(i=i||{}).toolbarIcon={svg:!0,html:"explore",tooltip:e.options.translation.geolocateImage,className:"lock"===o._mode?"disabled":""},L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){var t=this._overlay.getElement();EXIF.getData(t,L.EXIF(t))}})},105:function(){L.LockAction=L.EditAction.extend({initialize:function(t,e,i){var o,n,a=e.editing;a instanceof L.DistortableImage.Edit?(L.DistortableImage.action_map.u="_unlock",L.DistortableImage.action_map.l="_lock",n=e.options.translation.lockMode,o=a.isMode("lock")?"lock":"unlock"):(L.DistortableImage.group_action_map.l="_lockGroup",n=e.options.translation.lockImages,o="lock"),(i=i||{}).toolbarIcon={svg:!0,html:o,tooltip:n,className:"lock"},L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){var t=this._overlay.editing;t instanceof L.DistortableImage.Edit?t._toggleLockMode():t._lockGroup()}})},944:function(){L.OpacityAction=L.EditAction.extend({initialize:function(t,e,i){var o,n,a=e.editing,s=a._mode;a._transparent?(o="opacity_empty",n=e.options.translation.makeImageOpaque):(o="opacity",n=e.options.translation.makeImageTransparent),(i=i||{}).toolbarIcon={svg:!0,html:o,tooltip:n,className:"lock"===s?"disabled":""},L.DistortableImage.action_map.o="lock"===s?"":"_toggleOpacity",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){var t=this._overlay.editing,e=this._link;L.IconUtil.toggleXlink(e,"opacity","opacity_empty"),L.IconUtil.toggleTitle(e,"Make Image Transparent","Make Image Opaque"),t._toggleOpacity()}})},954:function(){L.RestoreAction=L.EditAction.extend({initialize:function(t,e,i){var o=L.Utils.getNestedVal(e,"editing","_mode"),n=e.edited;(i=i||{}).toolbarIcon={svg:!0,html:"restore",tooltip:e.options.translation.restoreImage,className:n&&"lock"!==o?"":"disabled"},L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){var t=this._overlay;L.DomEvent.on(t,{edit:this._enableAction,restore:this._disableAction},this),t.restore()}})},178:function(){L.RotateAction=L.EditAction.extend({initialize:function(t,e,i){(i=i||{}).toolbarIcon={svg:!0,html:"rotate",tooltip:e.options.translation.rotateImage,className:"rotate"},L.DistortableImage.action_map.r="_rotateMode",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){this._overlay.editing._rotateMode()}})},547:function(){L.ScaleAction=L.EditAction.extend({initialize:function(t,e,i){(i=i||{}).toolbarIcon={svg:!0,html:"scale",tooltip:e.options.translation.scaleImage,className:"scale"},L.DistortableImage.action_map.s="_scaleMode",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){this._overlay.editing._scaleMode()}})},886:function(){L.StackAction=L.EditAction.extend({initialize:function(t,e,i){var o,n,a=e.editing;a._toggledImage?(o="flip_to_back",n=e.options.translation.stackToFront):(o="flip_to_front",n=e.options.translation.stackToBack),(i=i||{}).toolbarIcon={svg:!0,html:o,tooltip:n,className:"lock"===a._mode?"disabled":""},L.DistortableImage.action_map.q="lock"===a._mode?"":"_stackUp",L.DistortableImage.action_map.a="lock"===a._mode?"":"_stackDown",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){var t=this._overlay.editing;L.IconUtil.toggleXlink(this._link,"flip_to_front","flip_to_back"),L.IconUtil.toggleTitle(this._link,"Stack to Front","Stack to Back"),t._toggleOrder()}})},129:function(){L.UnlockAction=L.EditAction.extend({initialize:function(t,e,i){(i=i||{}).toolbarIcon={svg:!0,html:"unlock",tooltip:e.options.translation.unlockImages},L.DistortableImage.group_action_map.u="_unlockGroup",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){this._overlay.editing._unlockGroup()}})},743:function(){L.EXIF=function(t){if(0!==Object.keys(EXIF.getAllTags(t)).length){console.log(EXIF.getAllTags(t));var e=EXIF.getAllTags(t);void 0!==e.GPSLatitude&&void 0!==e.GPSLongitude&&(e.GPSLatitude[0],e.GPSLatitude[1],e.GPSLatitude[2],e.GPSLongitude[0],e.GPSLongitude[1],e.GPSLongitude[2],e.GPSLatitudeRef,e.GPSLongitudeRef),"T"===e.GPSImgDirectionRef||"M"===e.GPSImgDirectionRef?(Math.PI,e.GPSImgDirection.numerator,e.GPSImgDirection.denominator):console.log("No compass data found"),console.log("Orientation:",e.Orientation),(6===e.Orientation||8===e.Orientation||3===e.Orientation)&&Math.PI,void 0!==e.GPSAltitude&&void 0!==e.GPSAltitudeRef&&void 0!==e.GPSAltitude&&void 0!==e.GPSAltitudeRef&&(e.GPSAltitude.numerator,e.GPSAltitude.denominator,e.GPSAltitudeRef)}else alert("EXIF initialized. Press again to view data in console.")}},92:function(){L.DistortHandle=L.EditHandle.extend({options:{TYPE:"distort",icon:L.icon({iconUrl:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAChSURBVO3BIU4DURgGwNkvL2B6AkQTLBqP4QCoSm7DDXoBLBZHDbfgICAIZjEV3YTn9uVHdMZZtcnCfI13bIzxg0emg6Nm6QVbYz3jylEsXRrvwommb49X67jFkz80fR9Mb1YxTzqiWBSLYlEsikWxKBbFolgUi2JRLIpFsSgWxaJY03fHHOu40dH07bAzWCx9Ge/TiWbpHgdsjPGNB2f/yS+7xRCyiiZPJQAAAABJRU5ErkJggg==",iconSize:[32,32],iconAnchor:[16,16]})},_onHandleDrag:function(){this._handled.setCorner(this._corner,this.getLatLng())},updateHandle:function(){this.setLatLng(this._handled.getCorner(this._corner))}}),L.distortHandle=function(t,e,i){return new L.DistortHandle(t,e,i)}},194:function(){L.DragHandle=L.EditHandle.extend({options:{TYPE:"drag",icon:L.icon({iconUrl:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAsVJREFUeNrMVztLXEEUvnNVFAVBAhY2aRKbTZEHJNpYabuNjSgYg/GxdsmPSJkUAa/ZdVEX8mgWYVutbHxAHkVskjQBuUUgBISVhCQk3wnfwMlk1rusN1wHPubOzJlzvjlz5sxc01Ma/hUEwQnwDIjqc7uvgv9YYO86qgIwCXQbdNTlQ8kcCBHgBch8TcloF6oJGr6phk6EQAkfdz3zvgDr9Mr7Fg1fptEZoM8jsmrokpfsiIFO4IIjuE2v1EDmR4LRdlR5Gh51hj8D34ABtm8YTtqna0TgklIw5CgQguKxIojEjmFROg/MKQO27NkFAB+4wAPouGUJiIvWKHwbAxX2XyWRKWkqhT+pbJntJZJuUzISW0+5hW+obxrVBsfvoH/dqCCJuU97GBh2VteLSiYvArmErT8EVoAK9Bw7enbpVYmvAQlyowYforrH5jXL2rPHI/TKONDB7u9AlavdaTBPvPmazUeQuy8f7UomUgTEwIJPEQ3sQGE/6ll2l9H/KcEzBcfWn2IclluM3DpddJxSHujlFkscbUPvmB0LHVnLrId7nlaZVkEc6QGXQI1MAwZcWmVRHeNaQwJMMiU2cwy4s7p/RJ2ckpvIQs+cIs+5GzitloLKHUV3MPREuXbTOKO91dX387gGTONxIgEWm+E61FFrpcyqXLHsEwiDjEsjAksqw5XPoL9MHVrn6QR4q+XZrDaR4RoWzq2ymafuRA/Mq1stSsHLVkcbdf9VjOcx8ZH3+SFWcCWlVPyWuUBOwUWdC1wP5NVjYiXFWLO69PZ6CRTUY6KSIoEKdf6T3IzzgHxnsyHctNBEkmn6Oob8ExUDg/ahGybd177cDjzH5xHwgDiSvoS7I/LZyvxJZj0wod7tkX5G0XVC7rEyLhfLJjBGbKoLLEfZWObyKeZ6oY82g+yf5Zn/mJyHX7PMf04z/T3/LcAAu4E6iiyJqf0AAAAASUVORK5CYII=",iconSize:[32,32],iconAnchor:[16,16]})},_onHandleDrag:function(){var t=this._handled,e=t.getCorner(this._corner),i=this.getLatLng();t.dragBy(e,i)},updateHandle:function(){this.setLatLng(this._handled.getCorner(this._corner))}}),L.dragHandle=function(t,e,i){return new L.DragHandle(t,e,i)}},988:function(){L.EditHandle=L.Marker.extend({initialize:function(t,e,i){var o=t.getCorner(e);L.setOptions(this,i),this._handled=t,this._corner=e;var n={draggable:!0,zIndexOffset:10};i&&i.hasOwnProperty("draggable")&&(n.draggable=i.draggable),L.Marker.prototype.initialize.call(this,o,n)},onAdd:function(t){L.Marker.prototype.onAdd.call(this,t),this._bindListeners(),this.updateHandle()},onRemove:function(t){this._unbindListeners(),L.Marker.prototype.onRemove.call(this,t)},_onHandleDragStart:function(){this._handled.fire("editstart")},_onHandleDragEnd:function(){this._fireEdit()},_fireEdit:function(){this._handled.edited=!0,this._handled.fire("edit")},_bindListeners:function(){this.on({contextmenu:L.DomEvent.stop,dragstart:this._onHandleDragStart,drag:this._onHandleDrag,dragend:this._onHandleDragEnd},this),this._handled._map.on("zoomend",this.updateHandle,this),this._handled.on("update",this.updateHandle,this)},_unbindListeners:function(){this.off({contextmenu:L.DomEvent.stop,dragstart:this._onHandleDragStart,drag:this._onHandleDrag,dragend:this._onHandleDragEnd},this),this._handled._map.off("zoomend",this.updateHandle,this),this._handled.off("update",this.updateHandle,this)},_calculateScalingFactor:function(t,e){var i=this._handled,o=i._map,n=o.latLngToLayerPoint(i.getCenter()),a=o.latLngToLayerPoint(t),s=o.latLngToLayerPoint(e),r=this._d2(n,a),l=this._d2(n,s);return Math.sqrt(l/r)},_d2:function(t,e){var i=t.x-e.x,o=t.y-e.y;return Math.pow(i,2)+Math.pow(o,2)},calculateAngleDelta:function(t,e){var i=this._handled,o=i._map,n=o.latLngToLayerPoint(i.getCenter()),a=o.latLngToLayerPoint(t),s=o.latLngToLayerPoint(e),r=Math.atan2(n.y-a.y,n.x-a.x);return Math.atan2(n.y-s.y,n.x-s.x)-r}})},206:function(){L.FreeRotateHandle=L.EditHandle.extend({options:{TYPE:"freeRotate",icon:L.icon({iconUrl:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAHiSURBVMXBa3HbShgA0PMp/1sCCo8oCEpgTaCXgIXAJiDzyCJoAUTm4UVQAns1Y8+snWnTvJyeE16hkjDgDrfoNTMKcpC9UPiLSo8JyetkjEHxjPCMyoS199kFoz8Iv1HpMaN3qWDCHoegOKkkRwnJpRmroHgiPFEZ8IBekzEGxQtUEhKSS/fB7Ew4U+lxcGkVZG9QWWPSFAxBcdK59KApuA+yNwp2uEdx1GN25sZJZULSfAtm77SlbNjju6MvG75u+WHRWVR6rDVjMPsgwYyVZl3pLTpHkyYHOx8syMiayaJzlDTZ9YyaZNFVkiYH2ZUEBcVJJXVImuz6Js3Qofe59pq7DoOTILu+g+a288mCouk7/1iH4qTS+2QdDppbV1ZJmrnDXnPnc5UOs2Z0fUmTuyBr+krvSioJyUmQO0dZM7mepMkWnaNRkyrJB6uskTSjxY3Fll8bvmJwlDb83FJ8gMqAB80uyBY3Trb82PAfvjj6vuHnluIdKgMeNXOwctK5NKBoHitrb1RJeHRp5Ux4ojLg0aWMHGQvUOkxIWkKVsHsTPiNSo8HDC5lZIsgO6n0uMUdRvQuFQxB8UR4RmXC2vvsgtEfhL+o9JiQvE7GGBTPCK9QSUjoMWgKDthjDrIX+h/k0I7gth6N5gAAAABJRU5ErkJggg==",iconSize:[32,32],iconAnchor:[16,16]})},_onHandleDrag:function(){var t=this._handled,e=t._map,i=t.getCorner(this._corner),o=this.getLatLng(),n=this.calculateAngleDelta(i,o),a=this._calculateScalingFactor(i,o);0!==n&&t.rotateBy(n,"rad");var s=t.edgeMinWidth;s||(s=50);var r=e.latLngToContainerPoint(t.getCorner(0)),l=e.latLngToContainerPoint(t.getCorner(1)),c=Math.abs(r.x-l.x),d=Math.abs(r.y-l.y);Math.sqrt(c*c+d*d)>s||a>1?t.scaleBy(a):t.scaleBy(1)},updateHandle:function(){this.setLatLng(this._handled.getCorner(this._corner))}}),L.freeRotateHandle=function(t,e,i){return new L.FreeRotateHandle(t,e,i)}},789:function(){L.LockHandle=L.EditHandle.extend({options:{TYPE:"lock",interactive:!1,icon:L.icon({iconUrl:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAD8SURBVO3BPU7CYAAA0AdfjIcQlRCQBG7C3gk2uIPG2RC3Dk16Gz0FTO1WZs/gwGCMP/2+xsSl7+n1er1Iz9LtRQjaPeMeO+TinLDCJV78YqjdA04YodKuxhUaPGoRxMmxwRQZSt87Yo4KExGCeAUyLLFB4bMacxywEClIU2KDKXbInTUYo8JCgoFuGoxQO5uiwY1EA91VmDqrcKeDoX8WdNNgjApvmGGLXKIgXY0xGkxQYItrrFFIEKQ5Yo4KEx9yrDFDhlKkIF6NOQ5Y+KpAhiXWKEQI4pxwiwoLPyuxwQw75FoE7fZYocFEuwI7jHCBV39gL92TXq/Xi/AOcmczZmaIMScAAAAASUVORK5CYII=",iconSize:[32,32],iconAnchor:[16,16]})},onRemove:function(t){this.unbindTooltip(),L.EditHandle.prototype.onRemove.call(this,t)},_bindListeners:function(){var t=this.getElement();L.EditHandle.prototype._bindListeners.call(this),L.DomEvent.on(t,{mousedown:this._tooltipOn,mouseup:this._tooltipOff},this),L.DomEvent.on(document,"pointerleave",this._tooltipOff,this)},_unbindListeners:function(){var t=this.getElement();L.EditHandle.prototype._bindListeners.call(this),L.DomEvent.off(t,{mousedown:this._tooltipOn,mouseup:this._tooltipOff},this),L.DomEvent.off(document,"pointerleave",this._tooltipOff,this)},_onHandleDrag:function(){},updateHandle:function(){this.setLatLng(this._handled.getCorner(this._corner))},_tooltipOn:function(t){var e=this._handled.parentGroup,i=e?e.editing:this._handled.editing;if(!t.shiftKey&&(this._handled.isSelected()||!e||e.isCollected(this._handled))){var o=i._lockHandles;this._timer=setTimeout(L.bind((function(){this._timeout&&clearTimeout(this._timeout),this.getTooltip()?o.eachLayer((function(t){this!==t&&t.closeTooltip()})):this.bindTooltip("Locked!",{permanent:!0}),this.openTooltip()}),this),500)}},_tooltipOff:function(t){var e=this._handled.parentGroup,i=e?e.editing:this._handled.editing;if(!t.shiftKey&&(this._handled.isSelected()||!e||e.isCollected(this._handled))){var o=i._lockHandles;t.currentTarget===document&&o.eachLayer((function(t){t.closeTooltip()})),this._timer&&clearTimeout(this._timer),this._timeout=setTimeout(L.bind((function(){this.closeTooltip()}),this),400)}}}),L.lockHandle=function(t,e,i){return new L.LockHandle(t,e,i)}},337:function(){L.RotateHandle=L.EditHandle.extend({options:{TYPE:"rotate",icon:L.icon({iconUrl:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAHiSURBVMXBa3HbShgA0PMp/1sCCo8oCEpgTaCXgIXAJiDzyCJoAUTm4UVQAns1Y8+snWnTvJyeE16hkjDgDrfoNTMKcpC9UPiLSo8JyetkjEHxjPCMyoS199kFoz8Iv1HpMaN3qWDCHoegOKkkRwnJpRmroHgiPFEZ8IBekzEGxQtUEhKSS/fB7Ew4U+lxcGkVZG9QWWPSFAxBcdK59KApuA+yNwp2uEdx1GN25sZJZULSfAtm77SlbNjju6MvG75u+WHRWVR6rDVjMPsgwYyVZl3pLTpHkyYHOx8syMiayaJzlDTZ9YyaZNFVkiYH2ZUEBcVJJXVImuz6Js3Qofe59pq7DoOTILu+g+a288mCouk7/1iH4qTS+2QdDppbV1ZJmrnDXnPnc5UOs2Z0fUmTuyBr+krvSioJyUmQO0dZM7mepMkWnaNRkyrJB6uskTSjxY3Fll8bvmJwlDb83FJ8gMqAB80uyBY3Trb82PAfvjj6vuHnluIdKgMeNXOwctK5NKBoHitrb1RJeHRp5Ux4ojLg0aWMHGQvUOkxIWkKVsHsTPiNSo8HDC5lZIsgO6n0uMUdRvQuFQxB8UR4RmXC2vvsgtEfhL+o9JiQvE7GGBTPCK9QSUjoMWgKDthjDrIX+h/k0I7gth6N5gAAAABJRU5ErkJggg==",iconSize:[32,32],iconAnchor:[16,16]})},_onHandleDrag:function(){var t=this._handled,e=t.getCorner(this._corner),i=this.getLatLng(),o=this.calculateAngleDelta(e,i);t.rotateBy(o,"rad")},updateHandle:function(){this.setLatLng(this._handled.getCorner(this._corner))}}),L.rotateHandle=function(t,e,i){return new L.RotateHandle(t,e,i)}},350:function(){L.ScaleHandle=L.EditHandle.extend({options:{TYPE:"scale",icon:L.icon({iconUrl:"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2ZXJzaW9uPSIxLjEiIHdpZHRoPSI0NTkiIGhlaWdodD0iNDY0IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCA1MTIgNTEyIiB4bWw6c3BhY2U9InByZXNlcnZlIiBzdHlsZT0iIj48cmVjdCBpZD0iYmFja2dyb3VuZHJlY3QiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIHg9IjAiIHk9IjAiIGZpbGw9Im5vbmUiIHN0cm9rZT0ibm9uZSIgY2xhc3M9IiIgc3R5bGU9IiIvPjxnIGNsYXNzPSJjdXJyZW50TGF5ZXIiIHN0eWxlPSIiPjx0aXRsZT5MYXllciAxPC90aXRsZT48cGF0aCBkPSJNNDU5LjA0OTE1OTUzMDQ3MTM0LDg2LjkyNjIzNDUxMjU1MDAyIFYwIGgtODUuNzE0NTczMzU2MzEyMDkgdjI3LjA0MzcxNzQwMzkwNDQ1MiBIODUuNzE0NTczMzU2MzEyMDMgVjAgSDAgdjg2LjkyNjIzNDUxMjU1MDAyIGgyNS43MTQzNzIwMDY4OTM2MjYgdjI4OS43NTQxMTUwNDE4MzM0IEgwIHY4Ni45MjYyMzQ1MTI1NTAwMiBoODUuNzE0NTczMzU2MzEyMDkgdi0yNy4wNDM3MTc0MDM5MDQ0NTIgaDI4NS43MTUyNDQ1MjEwNDAzIHYyNy4wNDM3MTc0MDM5MDQ0NTIgaDg1LjcxNDU3MzM1NjMxMjA5IHYtODYuOTI2MjM0NTEyNTUwMDIgaC0yMy44MDk2MDM3MTAwODY2OSBWODYuOTI2MjM0NTEyNTUwMDIgSDQ1OS4wNDkxNTk1MzA0NzEzNCB6TTM4NC43NjMxOTU5NTUwMDA5LDEyLjU1NjAxMTY1MTgxMjc4MSBoNjEuOTA0OTY5NjQ2MjI1Mzk2IHY2Mi43ODAwNTgyNTkwNjM5MSBoLTYxLjkwNDk2OTY0NjIyNTM5NiBWMTIuNTU2MDExNjUxODEyNzgxIHpNMTIuMzgwOTkzOTI5MjQ1MDUsMTIuNTU2MDExNjUxODEyNzgxIGg2MS45MDQ5Njk2NDYyMjUzOTYgdjYyLjc4MDA1ODI1OTA2MzkxIEgxMi4zODA5OTM5MjkyNDUwNSBWMTIuNTU2MDExNjUxODEyNzgxIHpNNzQuMjg1OTYzNTc1NDcwNTMsNDUxLjA1MDU3MjQxNTEyMDY2IEgxMi4zODA5OTM5MjkyNDUwNSB2LTYyLjc4MDA1ODI1OTA2MzkxIGg2MS45MDQ5Njk2NDYyMjUzOTYgVjQ1MS4wNTA1NzI0MTUxMjA2NiB6TTQ0NS43MTU3ODE0NTI4MjI3NCw0NTEuMDUwNTcyNDE1MTIwNjYgaC02Mi44NTczNTM3OTQ2Mjg4NjQgdi02Mi43ODAwNTgyNTkwNjM5MSBoNjIuODU3MzUzNzk0NjI4ODY0IFY0NTEuMDUwNTcyNDE1MTIwNjYgek00MDcuNjIwNDE1NTE2Njg0MjYsMzc2LjY4MDM0OTU1NDM4MzQ0IGgtMzYuMTkwNTk3NjM5MzMxNzcgdjMyLjgzODc5OTcwNDc0MTEyIEg4NS43MTQ1NzMzNTYzMTIwMyB2LTMyLjgzODc5OTcwNDc0MTEyIEg0OS41MjM5NzU3MTY5ODAzMiBWODYuOTI2MjM0NTEyNTUwMDIgaDM2LjE5MDU5NzYzOTMzMTc3IFY1MC4yMjQwNDY2MDcyNTExMjUgaDI4Ny42MjAwMTI4MTc4NDcyIHYzNi43MDIxODc5MDUyOTg5IGgzNC4yODU4MjkzNDI1MjQ4MzUgVjM3Ni42ODAzNDk1NTQzODM0NCB6IiBpZD0ic3ZnXzIiIGNsYXNzPSIiIGZpbGw9IiMxYTFhZWIiIGZpbGwtb3BhY2l0eT0iMSIvPjwvZz48L3N2Zz4=",iconSize:[32,32],iconAnchor:[16,16]})},_onHandleDrag:function(){var t=this._handled,e=t._map,i=t.edgeMinWidth,o=t.getCorner(this._corner),n=this.getLatLng(),a=this._calculateScalingFactor(o,n);i||(i=50);var s=e.latLngToLayerPoint(t.getCorner(0)),r=e.latLngToLayerPoint(t.getCorner(1)),l=Math.abs(s.x-r.x),c=Math.abs(s.y-r.y);Math.sqrt(l*l+c*c)>i||a>1?t.scaleBy(a):t.scaleBy(1)},updateHandle:function(){this.setLatLng(this._handled.getCorner(this._corner))}}),L.scaleHandle=function(t,e,i){return new L.ScaleHandle(t,e,i)}},719:function(){L.distortableImage=L.DistortableImage||{},L.distortableImage=L.DistortableImage,L.DistortableImage.group_action_map={},L.DistortableImage.ControlBar=L.Toolbar2.Control.extend({}),L.distortableImage.controlBar=function(t){return new L.DistortableImage.ControlBar(t)},L.DistortableCollection.addInitHook((function(){this.ACTIONS=[L.ExportAction,L.DeleteAction,L.LockAction,L.UnlockAction],L.DistortableCollection.Edit.MODES={lock:L.LockAction,unlock:L.UnlockAction};var t=this.options.actions?this.options.actions:this.ACTIONS;this.editing=L.distortableCollection.edit(this,{actions:t})}))},93:function(){L.DistortableImage=L.DistortableImage||{},L.distortableImage=L.DistortableImage,L.DistortableImage.action_map={},L.DistortableImage.PopupBar=L.Toolbar2.Popup.extend({options:{anchor:[0,-10]},initialize:function(t,e){L.setOptions(this,e),L.Toolbar2.Popup.prototype.initialize.call(this,t,e)},addHooks:function(t,e){this.map=t,this.ov=e},tools:function(){if(this._ul)return this._ul.children},clickTool:function(t){for(var e=this.tools(),i=0;i',_symbols:"",render:function(){return this.addSymbols(this._symbols),this._svg},addSymbols:function(t){this._svg+=t}})},261:function(){L.KeymapperIconSet=L.IconSet.extend({_symbols:''})},929:function(){L.ToolbarIconSet=L.IconSet.extend({_symbols:''})},496:function(){L.Map.mergeOptions({boxCollector:!0,boxZoom:!1}),L.Map.BoxCollector=L.Map.BoxZoom.extend({initialize:function(t){this._map=t,this._container=t._container,this._pane=t._panes.overlayPane,this._resetStateTimeout=0,t.on("unload",this._destroy,this)},addHooks:function(){L.DomEvent.on(this._container,"mousedown",this._onMouseDown,this)},removeHooks:function(){L.DomEvent.off(this._container,"mousedown",this._onMouseDown,this)},moved:function(){return this._moved},_destroy:function(){L.DomUtil.remove(this._pane),delete this._pane},_resetState:function(){this._resetStateTimeout=0,this._moved=!1},_clearDeferredResetState:function(){0!==this._resetStateTimeout&&(clearTimeout(this._resetStateTimeout),this._resetStateTimeout=0)},_onMouseDown:function(t){if(!t.shiftKey||1!==t.which&&1!==t.button)return!1;this._clearDeferredResetState(),this._resetState(),L.DomUtil.disableTextSelection(),L.DomUtil.disableImageDrag(),this._startPoint=this._map.mouseEventToContainerPoint(t),L.DomEvent.on(document,{contextmenu:L.DomEvent.stop,mousemove:this._onMouseMove,mouseup:this._onMouseUp},this)},_onMouseMove:function(t){this._moved||(this._moved=!0,this._box=L.DomUtil.create("div","leaflet-zoom-box",this._container),L.DomUtil.addClass(this._container,"leaflet-crosshair"),this._map.fire("boxzoomstart")),this._point=this._map.mouseEventToContainerPoint(t),this._bounds=L.bounds(this._startPoint,this._point);var e=this._bounds.getSize();L.DomUtil.setPosition(this._box,this._bounds.min),this._box.style.width=e.x+"px",this._box.style.height=e.y+"px"},_finish:function(){this._moved&&(L.DomUtil.remove(this._box),L.DomUtil.removeClass(this._container,"leaflet-crosshair")),L.DomUtil.enableTextSelection(),L.DomUtil.enableImageDrag(),L.DomEvent.off(document,{contextmenu:L.DomEvent.stop,mousemove:this._onMouseMove,mouseup:this._onMouseUp},this)},_onMouseUp:function(t){if((1===t.which||1===t.button)&&(this._finish(),this._moved)){this._clearDeferredResetState(),this._resetStateTimeout=setTimeout(L.Util.bind(this._resetState,this),0);var e=L.latLngBounds(this._map.containerPointToLatLng(this._bounds.getBottomLeft()),this._map.containerPointToLatLng(this._bounds.getTopRight())),i=this._map.getZoom(),o=this._map.getCenter();e=this._map._latLngBoundsToNewLayerBounds(e,i,o),this._map.fire("boxcollectend",{boxCollectBounds:e})}}}),L.Map.addInitHook("addHandler","boxCollector",L.Map.BoxCollector)},291:function(){L.Map.mergeOptions({doubleClickLabels:!0}),L.Map.DoubleClickLabels=L.Map.DoubleClickZoom.extend({enable:function(){var t=this._map;return this._enabled||(t.doubleClickZoom.enabled()&&t.doubleClickZoom.disable(),this._map.fire("singleclickon"),this._enabled=!0,this.addHooks()),this},disable:function(){return this._enabled?(this._enabled=!1,this.removeHooks(),this):this},_fireIfSingle:function(t){var e=this._map,i=t.originalEvent;i&&i.shiftKey||(e._clicked+=1,this._map._clickTimeout=setTimeout((function(){1===e._clicked?(e._clicked=0,e.fire("singleclick",{type:"singleclick"})):L.Browser.touch&&i&&i.sourceCapabilities.firesTouchEvents&&e.fire("dblclick")}),250))},_onDoubleClick:function(){var t=this._map,e=t._labels;setTimeout((function(){t._clicked=0,clearTimeout(t._clickTimeout)}),0),e&&(1===e.options.opacity?(e.options.opacity=0,e.setOpacity(0)):(e.options.opacity=1,e.setOpacity(1)))}}),L.Map.addInitHook("addHandler","doubleClickLabels",L.Map.DoubleClickLabels)},752:function(){L.Map.DoubleClickZoom.include({addHooks:function(){this._map.on({click:this._fireIfSingle,dblclick:this._onDoubleClick},this)},removeHooks:function(){this._map.off({click:this._fireIfSingle,dblclick:this._onDoubleClick},this)},enable:function(){return this._enabled||this._map.doubleClickLabels&&this._map.doubleClickLabels.enabled()||(this._map.fire("singleclickon"),this._enabled=!0,this.addHooks()),this},disable:function(){return this._enabled?(this._map.fire("singleclickoff"),this._enabled=!1,this.removeHooks(),this):this},_fireIfSingle:function(t){var e=this._map,i=t.originalEvent;i&&i.shiftKey||(e._clicked+=1,this._map._clickTimeout=setTimeout((function(){1===e._clicked?(e._clicked=0,e.fire("singleclick",{type:"singleclick"})):L.Browser.touch&&i&&i.sourceCapabilities.firesTouchEvents&&e._fireDOMEvent(i,"dblclick",[e])}),250))},_onDoubleClick:function(t){var e=this._map,i=t.originalEvent;if(setTimeout((function(){e._clicked=0,clearTimeout(e._clickTimeout)}),0),!i)return!1;var o=e.getZoom(),n=e.options.zoomDelta,a=i.shiftKey?o-n:o+n;"center"===e.options.doubleClickZoom?e.setZoom(a):e.setZoomAround(t.containerPoint,a)}})},131:function(){L.Map.include({_clicked:0,addGoogleMutant:function(t){return(t=this.mutantOptions=L.extend({mutantOpacity:.8,maxZoom:24,maxNativeZoom:20,minZoom:0,labels:!0,labelOpacity:1,doubleClickLabels:!0},t)).labels||(this.mutantOptions=L.extend(this.mutantOptions,{labelOpacity:t.labels?1:void 0,doubleClickLabels:!!t.labels||void 0})),this._googleMutant=L.tileLayer("http://mt0.google.com/vt/lyrs=s&x={x}&y={y}&z={z}",{maxZoom:t.maxZoom,maxNativeZoom:t.maxNativeZoom,minZoom:t.minZoom,opacity:t.mutantOpacity}).addTo(this),t.labels?this._addLabels(t):this.doubleClickLabels=void 0,this},_addLabels:function(t){return 0!==t.labelOpacity&&1!==t.labelOpacity&&(t.labelOpacity=1),this._labels=L.tileLayer("https://stamen-tiles-{s}.a.ssl.fastly.net/toner-labels/{z}/{x}/{y}{r}.{ext}",{attribution:'Map tiles by Stamen Design, CC BY 3.0 — Map data © OpenStreetMap contributors',subdomains:"abcd",interactive:!1,opacity:t.labelOpacity,maxZoom:t.maxZoom,maxNativeZoom:t.maxNativeZoom,minZoom:t.minZoom,ext:"png"}).addTo(this),this.mutantOptions.doubleClickLabels&&this.doubleClickLabels.enable(),this}}),L.Map.addInitHook((function(){this.doubleClickLabels.disable(),this.doubleClickZoom.enable()}))},999:function(){L.DomUtil=L.extend(L.DomUtil,{initTranslation:function(t){this.translation=t},getMatrixString:function(t){var e=L.Browser.webkit3d||L.Browser.gecko3d||L.Browser.ie3d,i=[t[0],t[3],0,t[6],t[1],t[4],0,t[7],0,0,1,0,t[2],t[5],0,t[8]],o=e?"matrix3d("+i.join(",")+")":"";return e||console.log("Your browser must support 3D CSS transformsin order to use DistortableImageOverlay."),o},toggleClass:function(t,e){var i=e;return this.hasClass(t,i)?this.removeClass(t,i):this.addClass(t,i)},confirmDelete:function(){return window.confirm(this.translation.confirmImageDelete)},confirmDeletes:function(t){if(1===t)return this.confirmDelete();var e,i=this.translation.confirmImagesDeletes;return e="function"==typeof i?i(t):i,window.confirm(e)}})},85:function(){L.IconUtil={create:function(t){return/^#/.test(t)&&(t=t.replace(/^#/,"")),''},addClassToSvg:function(t,e){var i=t.querySelector("svg");i&&L.DomUtil.addClass(i,e)},toggleXlink:function(t,e,i){/^#/.test(e)||(e="#"+e),/^#/.test(i)||(i="#"+i);var o=t.querySelector("use");if(o){var n=o.getAttribute("xlink:href")===e?i:e;return o.setAttribute("xlink:href",n),n}return!1},toggleTitle:function(t,e,i){var o=t.getAttribute("title")===e?i:e;return t.setAttribute("title",o),t.hasAttribute("aria-label")&&t.setAttribute("aria-label",o),o}}},351:function(){L.ImageUtil={getCmPerPixel:function(t){var e=t._map;return 100*e.latLngToLayerPoint(t.getCorner(0)).distanceTo(e.latLngToLayerPoint(t.getCorner(1)))/t.getElement().width}}},360:function(){L.MatrixUtil={adj:function(t){return[t[4]*t[8]-t[5]*t[7],t[2]*t[7]-t[1]*t[8],t[1]*t[5]-t[2]*t[4],t[5]*t[6]-t[3]*t[8],t[0]*t[8]-t[2]*t[6],t[2]*t[3]-t[0]*t[5],t[3]*t[7]-t[4]*t[6],t[1]*t[6]-t[0]*t[7],t[0]*t[4]-t[1]*t[3]]},multmm:function(t,e){var i,o=[];for(i=0;i<3;i++)for(var n=0;n<3;n++){for(var a=0,s=0;s<3;s++)a+=t[3*i+s]*e[3*s+n];o[3*i+n]=a}return o},multmv:function(t,e){return[t[0]*e[0]+t[1]*e[1]+t[2]*e[2],t[3]*e[0]+t[4]*e[1]+t[5]*e[2],t[6]*e[0]+t[7]*e[1]+t[8]*e[2]]},multsm:function(t,e){for(var i=[],o=0,n=e.length;o2&&void 0!==arguments[2]?arguments[2]:"deg";return"deg"===i?this.radiansToDegrees(Math.atan2(e,t)):Math.atan2(e,t)},radiansToDegrees:function(t){return 180*t/Math.PI},degreesToRadians:function(t){return t*Math.PI/180}}},866:function(){L.Utils={initTranslation:function(){var t={deleteImage:"Delete Image",deleteImages:"Delete Images",distortImage:"Distort Image",dragImage:"Drag Image",exportImage:"Export Image",exportImages:"Export Images",removeBorder:"Remove Border",addBorder:"Add Border",freeRotateImage:"Free rotate Image",geolocateImage:"Geolocate Image",lockMode:"Lock Mode",lockImages:"Lock Images",makeImageOpaque:"Make Image Opaque",makeImageTransparent:"Make Image Transparent",restoreImage:"Restore Natural Image",rotateImage:"Rotate Image",scaleImage:"Scale Image",stackToFront:"Stack to Front",stackToBack:"Stack to Back",unlockImages:"Unlock Images",confirmImageDelete:"Are you sure? This image will be permanently deleted from the map.",confirmImagesDeletes:"Are you sure? These images will be permanently deleted from the map."};if(this.options.translation)for(var e in t)this.options.translation.hasOwnProperty(e)||(this.options.translation[e]=t[e]);else this.options.translation=t;L.DomUtil.initTranslation(this.options.translation)},getNestedVal:function(t,e,i){return[e,i].reduce((function(t,e){return t&&t[e]}),t)}}}};t[999](),t[85](),t[351](),t[360](),t[682](),t[866](),t[477](),t[808](),t[743](),t[988](),t[92](),t[194](),t[206](),t[789](),t[337](),t[350](),t[376](),t[261](),t[929](),t[280](),t[426](),t[114](),t[231](),t[541](),t[149](),t[74](),t[691](),t[105](),t[944](),t[954](),t[178](),t[547](),t[886](),t[129](),t[93](),t[719](),t[397](),t[428](),t[782](),t[752](),t[496](),t[291](),t[131]()}(); +/******/ (function() { // webpackBootstrap +/******/ var __webpack_modules__ = ({ + +/***/ "./node_modules/ansi-html-community/index.js": +/*!***************************************************!*\ + !*** ./node_modules/ansi-html-community/index.js ***! + \***************************************************/ +/***/ (function(module) { + +"use strict"; + + +module.exports = ansiHTML + +// Reference to https://github.com/sindresorhus/ansi-regex +var _regANSI = /(?:(?:\u001b\[)|\u009b)(?:(?:[0-9]{1,3})?(?:(?:;[0-9]{0,3})*)?[A-M|f-m])|\u001b[A-M]/ + +var _defColors = { + reset: ['fff', '000'], // [FOREGROUD_COLOR, BACKGROUND_COLOR] + black: '000', + red: 'ff0000', + green: '209805', + yellow: 'e8bf03', + blue: '0000ff', + magenta: 'ff00ff', + cyan: '00ffee', + lightgrey: 'f0f0f0', + darkgrey: '888' +} +var _styles = { + 30: 'black', + 31: 'red', + 32: 'green', + 33: 'yellow', + 34: 'blue', + 35: 'magenta', + 36: 'cyan', + 37: 'lightgrey' +} +var _openTags = { + '1': 'font-weight:bold', // bold + '2': 'opacity:0.5', // dim + '3': '', // italic + '4': '', // underscore + '8': 'display:none', // hidden + '9': '' // delete +} +var _closeTags = { + '23': '', // reset italic + '24': '', // reset underscore + '29': '' // reset delete +} + +;[0, 21, 22, 27, 28, 39, 49].forEach(function (n) { + _closeTags[n] = '' +}) + +/** + * Converts text with ANSI color codes to HTML markup. + * @param {String} text + * @returns {*} + */ +function ansiHTML (text) { + // Returns the text if the string has no ANSI escape code. + if (!_regANSI.test(text)) { + return text + } + + // Cache opened sequence. + var ansiCodes = [] + // Replace with markup. + var ret = text.replace(/\033\[(\d+)m/g, function (match, seq) { + var ot = _openTags[seq] + if (ot) { + // If current sequence has been opened, close it. + if (!!~ansiCodes.indexOf(seq)) { // eslint-disable-line no-extra-boolean-cast + ansiCodes.pop() + return '' + } + // Open tag. + ansiCodes.push(seq) + return ot[0] === '<' ? ot : '' + } + + var ct = _closeTags[seq] + if (ct) { + // Pop sequence + ansiCodes.pop() + return ct + } + return '' + }) + + // Make sure tags are closed. + var l = ansiCodes.length + ;(l > 0) && (ret += Array(l + 1).join('')) + + return ret +} + +/** + * Customize colors. + * @param {Object} colors reference to _defColors + */ +ansiHTML.setColors = function (colors) { + if (typeof colors !== 'object') { + throw new Error('`colors` parameter must be an Object.') + } + + var _finalColors = {} + for (var key in _defColors) { + var hex = colors.hasOwnProperty(key) ? colors[key] : null + if (!hex) { + _finalColors[key] = _defColors[key] + continue + } + if ('reset' === key) { + if (typeof hex === 'string') { + hex = [hex] + } + if (!Array.isArray(hex) || hex.length === 0 || hex.some(function (h) { + return typeof h !== 'string' + })) { + throw new Error('The value of `' + key + '` property must be an Array and each item could only be a hex string, e.g.: FF0000') + } + var defHexColor = _defColors[key] + if (!hex[0]) { + hex[0] = defHexColor[0] + } + if (hex.length === 1 || !hex[1]) { + hex = [hex[0]] + hex.push(defHexColor[1]) + } + + hex = hex.slice(0, 2) + } else if (typeof hex !== 'string') { + throw new Error('The value of `' + key + '` property must be a hex string, e.g.: FF0000') + } + _finalColors[key] = hex + } + _setTags(_finalColors) +} + +/** + * Reset colors. + */ +ansiHTML.reset = function () { + _setTags(_defColors) +} + +/** + * Expose tags, including open and close. + * @type {Object} + */ +ansiHTML.tags = {} + +if (Object.defineProperty) { + Object.defineProperty(ansiHTML.tags, 'open', { + get: function () { return _openTags } + }) + Object.defineProperty(ansiHTML.tags, 'close', { + get: function () { return _closeTags } + }) +} else { + ansiHTML.tags.open = _openTags + ansiHTML.tags.close = _closeTags +} + +function _setTags (colors) { + // reset all + _openTags['0'] = 'font-weight:normal;opacity:1;color:#' + colors.reset[0] + ';background:#' + colors.reset[1] + // inverse + _openTags['7'] = 'color:#' + colors.reset[1] + ';background:#' + colors.reset[0] + // dark grey + _openTags['90'] = 'color:#' + colors.darkgrey + + for (var code in _styles) { + var color = _styles[code] + var oriColor = colors[color] || '000' + _openTags[code] = 'color:#' + oriColor + code = parseInt(code) + _openTags[(code + 10).toString()] = 'background:#' + oriColor + } +} + +ansiHTML.reset() + + +/***/ }), + +/***/ "./src/DistortableCollection.js": +/*!**************************************!*\ + !*** ./src/DistortableCollection.js ***! + \**************************************/ +/***/ (function() { + +var arr = []; +L.DistortableCollection = L.FeatureGroup.extend({ + options: { + editable: true, + exportOpts: { + exportStartUrl: '//export.mapknitter.org/export', + statusUrl: '//export.mapknitter.org', + exportUrl: 'http://export.mapknitter.org/' + } + }, + initialize: function initialize(options) { + L.setOptions(this, options); + L.FeatureGroup.prototype.initialize.call(this, options); + L.Utils.initTranslation.call(this); + this.editable = this.options.editable; + }, + onAdd: function onAdd(map) { + L.FeatureGroup.prototype.onAdd.call(this, map); + this._map = map; + + if (this.editable) { + this.editing.enable(); + } + /** + * although we have a DistortableCollection.Edit class that handles collection events to keep our code managable, + * events that need to be added on individual images are kept here to do so through `layeradd`. + */ + + + this.on('layeradd', this._addEvents, this); + this.on('layerremove', this._removeEvents, this); + }, + onRemove: function onRemove() { + if (this.editing) { + this.editing.disable(); + } + + this.off('layeradd', this._addEvents, this); + this.off('layerremove', this._removeEvents, this); + }, + _addEvents: function _addEvents(e) { + var layer = e.layer; + L.DomEvent.on(layer, { + dragstart: this._dragStartMultiple, + drag: this._dragMultiple + }, this); + L.DomEvent.on(layer.getElement(), { + mousedown: this._deselectOthers, + + /* Enable longpress for multi select for touch devices. */ + contextmenu: this._longPressMultiSelect + }, this); + }, + _removeEvents: function _removeEvents(e) { + var layer = e.layer; + L.DomEvent.off(layer, { + dragstart: this._dragStartMultiple, + drag: this._dragMultiple + }, this); + L.DomEvent.off(layer.getElement(), { + mousedown: this._deselectOthers, + contextmenu: this._longPressMultiSelect + }, this); + }, + _longPressMultiSelect: function _longPressMultiSelect(e) { + var _this = this; + + if (!this.editable) { + return; + } + + e.preventDefault(); + this.eachLayer(function (layer) { + var edit = layer.editing; + + if (layer.getElement() === e.target && edit.enabled()) { + L.DomUtil.toggleClass(layer.getElement(), 'collected'); + + if (_this.anyCollected()) { + layer.deselect(); + + _this.editing._addToolbar(); + } else { + _this.editing._removeToolbar(); + } + } + }); + }, + isCollected: function isCollected(overlay) { + return L.DomUtil.hasClass(overlay.getElement(), 'collected'); + }, + anyCollected: function anyCollected() { + var layerArr = this.getLayers(); + return layerArr.some(this.isCollected.bind(this)); + }, + _toggleCollected: function _toggleCollected(e, layer) { + if (e.shiftKey) { + /* conditional prevents disabled images from flickering multi-select mode */ + if (layer.editing.enabled()) { + L.DomUtil.toggleClass(e.target, 'collected'); // re-order layers by _leaflet_id to match their display order in UI + // add new layer to right position and avoid repitition + + var newArr = arr.every(function (each) { + return each._leaflet_id !== layer._leaflet_id; + }); + + if (newArr) { + arr.push(layer); + } else { + arr.splice(arr.indexOf(layer), 1); + } + } + } + + if (this.anyCollected()) { + layer.deselect(); + } else { + this.editing._removeToolbar(); + } + }, + _deselectOthers: function _deselectOthers(e) { + var _this2 = this; + + if (!this.editable) { + return; + } + + this.eachLayer(function (layer) { + if (layer.getElement() !== e.target) { + layer.deselect(); + } else { + _this2._toggleCollected(e, layer); + } + }); + + if (e) { + L.DomEvent.stopPropagation(e); + } + }, + _dragStartMultiple: function _dragStartMultiple(e) { + var overlay = e.target; + var map = this._map; + var i; + + if (!this.isCollected(overlay)) { + return; + } + + this.eachLayer(function (layer) { + layer._dragStartPoints = {}; + layer.deselect(); + + for (i = 0; i < 4; i++) { + var c = layer.getCorner(i); + layer._dragStartPoints[i] = map.latLngToLayerPoint(c); + } + }); + }, + _dragMultiple: function _dragMultiple(e) { + var overlay = e.target; + var map = this._map; + + if (!this.isCollected(overlay)) { + return; + } + + var topLeft = map.latLngToLayerPoint(overlay.getCorner(0)); + + var delta = overlay._dragStartPoints[0].subtract(topLeft); + + this._updateCollectionFromPoints(delta, overlay); + }, + _toRemove: function _toRemove() { + var _this3 = this; + + var layerArr = this.getLayers(); + return layerArr.filter(function (layer) { + var mode = layer.editing._mode; + return _this3.isCollected(layer) && mode !== 'lock'; + }); + }, + _toMove: function _toMove(overlay) { + var _this4 = this; + + var layerArr = this.getLayers(); + return layerArr.filter(function (layer) { + var mode = layer.editing._mode; + return layer !== overlay && _this4.isCollected(layer) && mode !== 'lock'; + }); + }, + _updateCollectionFromPoints: function _updateCollectionFromPoints(delta, overlay) { + var layersToMove = this._toMove(overlay); + + var p = new L.Transformation(1, -delta.x, 1, -delta.y); + var i; + layersToMove.forEach(function (layer) { + var movedPoints = {}; + + for (i = 0; i < 4; i++) { + movedPoints[i] = p.transform(layer._dragStartPoints[i]); + } + + layer.setCornersFromPoints(movedPoints); + }); + }, + _getAvgCmPerPixel: function _getAvgCmPerPixel(imgs) { + var reduce = imgs.reduce(function (sum, img) { + return sum + img.cm_per_pixel; + }, 0); + return reduce / imgs.length; + }, + generateExportJson: function generateExportJson() { + var json = {}; + json.images = []; + this.eachLayer(function (layer) { + if (this.isCollected(layer)) { + var sections = layer._image.src.split('/'); + + var filename = sections[sections.length - 1]; + var zc = layer.getCorners(); + var corners = [{ + lat: zc[0].lat, + lon: zc[0].lng + }, { + lat: zc[1].lat, + lon: zc[1].lng + }, { + lat: zc[3].lat, + lon: zc[3].lng + }, { + lat: zc[2].lat, + lon: zc[2].lng + }]; + json.images.push({ + id: layer._leaflet_id, + src: layer._image.src, + width: layer._image.width, + height: layer._image.height, + image_file_name: filename, + nodes: corners, + cm_per_pixel: L.ImageUtil.getCmPerPixel(layer) + }); + } + }, this); + json.images = json.images.reverse(); + json.avg_cm_per_pixel = this._getAvgCmPerPixel(json.images); + return json; + } +}); + +L.distortableCollection = function (id, options) { + return new L.DistortableCollection(id, options); +}; + +/***/ }), + +/***/ "./src/DistortableImageOverlay.js": +/*!****************************************!*\ + !*** ./src/DistortableImageOverlay.js ***! + \****************************************/ +/***/ (function() { + +L.DistortableImageOverlay = L.ImageOverlay.extend({ + options: { + height: 200, + crossOrigin: true, + // todo: find ideal number to prevent distortions during RotateScale, and make it dynamic (remove hardcoding) + edgeMinWidth: 50, + editable: true, + mode: 'distort', + selected: false + }, + initialize: function initialize(url, options) { + L.setOptions(this, options); + L.Utils.initTranslation.call(this); + this.edgeMinWidth = this.options.edgeMinWidth; + this.editable = this.options.editable; + this._selected = this.options.selected; + this._url = url; + this.rotation = {}; + }, + onAdd: function onAdd(map) { + var _this = this; + + this._map = map; + + if (!this.getElement()) { + this._initImage(); + } + + map.on('viewreset', this._reset, this); + + if (this.options.corners) { + this._corners = this.options.corners; + + if (map.options.zoomAnimation && L.Browser.any3d) { + map.on('zoomanim', this._animateZoom, this); + } + } // Have to wait for the image to load because need to access its w/h + + + L.DomEvent.on(this.getElement(), 'load', function () { + _this.getPane().appendChild(_this.getElement()); + + _this._initImageDimensions(); + + if (_this.options.rotation) { + var units = _this.options.rotation.deg >= 0 ? 'deg' : 'rad'; + + _this.setAngle(_this.options.rotation[units], units); + } else { + _this.rotation = { + deg: 0, + rad: 0 + }; + + _this._reset(); + } + /* Initialize default corners if not already set */ + + + if (!_this._corners) { + if (map.options.zoomAnimation && L.Browser.any3d) { + map.on('zoomanim', _this._animateZoom, _this); + } + } + /** if there is a featureGroup, only its editable option matters */ + + + var eventParents = _this._eventParents; + + if (eventParents) { + _this.eP = eventParents[Object.keys(eventParents)[0]]; + + if (_this.eP.editable) { + _this.editing.enable(); + } + } else { + if (_this.editable) { + _this.editing.enable(); + } + + _this.eP = null; + } + }); + L.DomEvent.on(this.getElement(), 'click', this.select, this); + L.DomEvent.on(map, { + singleclickon: this._singleClickListeners, + singleclickoff: this._resetClickListeners, + singleclick: this._singleClick + }, this); + /** + * custom events fired from DoubleClickLabels.js. Used to differentiate + * single / dblclick to not deselect images on map dblclick. + */ + + if (!(map.doubleClickZoom.enabled() || map.doubleClickLabels.enabled())) { + L.DomEvent.on(map, 'click', this.deselect, this); + } + + this.fire('add'); + }, + onRemove: function onRemove(map) { + L.DomEvent.off(this.getElement(), 'click', this.select, this); + L.DomEvent.off(map, { + singleclickon: this._singleClickListeners, + singleclickoff: this._resetClickListeners, + singleclick: this._singleClick + }, this); + L.DomEvent.off(map, 'click', this.deselect, this); + + if (this.editing) { + this.editing.disable(); + } + + this.fire('remove'); + L.ImageOverlay.prototype.onRemove.call(this, map); + }, + _initImageDimensions: function _initImageDimensions() { + var map = this._map; + var originalImageWidth = L.DomUtil.getStyle(this.getElement(), 'width'); + var originalImageHeight = L.DomUtil.getStyle(this.getElement(), 'height'); + var aspectRatio = parseInt(originalImageWidth) / parseInt(originalImageHeight); + var imageHeight = this.options.height; + var imageWidth = parseInt(aspectRatio * imageHeight); + var center = map.project(map.getCenter()); + var offset = L.point(imageWidth, imageHeight).divideBy(2); + + if (this.options.corners) { + this._corners = this.options.corners; + } else { + this._corners = [map.unproject(center.subtract(offset)), map.unproject(center.add(L.point(offset.x, -offset.y))), map.unproject(center.add(L.point(-offset.x, offset.y))), map.unproject(center.add(offset))]; + } + + this._initialDimensions = { + 'center': center, + 'offset': offset, + 'zoom': map.getZoom() + }; + this.setBounds(L.latLngBounds(this.getCorners())); + }, + _singleClick: function _singleClick(e) { + if (e.type === 'singleclick') { + this.deselect(); + } else { + return; + } + }, + _singleClickListeners: function _singleClickListeners() { + var map = this._map; + L.DomEvent.off(map, 'click', this.deselect, this); + L.DomEvent.on(map, 'singleclick', this.deselect, this); + }, + _resetClickListeners: function _resetClickListeners() { + var map = this._map; + L.DomEvent.on(map, 'click', this.deselect, this); + L.DomEvent.off(map, 'singleclick', this.deselect, this); + }, + isSelected: function isSelected() { + return this._selected; + }, + deselect: function deselect() { + var edit = this.editing; + + if (!edit.enabled()) { + return; + } + + edit._removeToolbar(); + + edit._hideMarkers(); + + this._selected = false; + this.fire('deselect'); + return this; + }, + select: function select(e) { + var edit = this.editing; + var eP = this.eP; + + if (!edit.enabled()) { + return; + } + + if (e) { + L.DomEvent.stopPropagation(e); + } // this ensures deselection of all other images, allowing us to keep collection group optional + + + this._programmaticGrouping(); + + this._selected = true; + + edit._addToolbar(); + + edit._showMarkers(); + + this.fire('select'); // we run the selection logic 1st anyway because the collection group's _addToolbar method depends on it + + if (eP && eP.anyCollected()) { + this.deselect(); + return; + } + + return this; + }, + _programmaticGrouping: function _programmaticGrouping() { + this._map.eachLayer(function (layer) { + if (layer instanceof L.DistortableImageOverlay) { + layer.deselect(); + } + }); + }, + setCorner: function setCorner(corner, latlng) { + var edit = this.editing; + this._corners[corner] = latlng; + this.setBounds(L.latLngBounds(this.getCorners())); + this.fire('update'); + + if (edit.toolbar && edit.toolbar instanceof L.DistortableImage.PopupBar) { + edit._updateToolbarPos(); + } + + this.edited = true; + return this; + }, + _cornerExceedsMapLats: function _cornerExceedsMapLats(zoom, corner, map) { + if (map.options.crs.Simple == L.CRS.Simple) { + return false; + } else { + var exceedsTop; + var exceedsBottom; + + if (zoom === 0) { + exceedsTop = map.project(corner).y < 2; + exceedsBottom = map.project(corner).y >= 255; + } else { + exceedsTop = map.project(corner).y / zoom < 2; + exceedsBottom = map.project(corner).y / Math.pow(2, zoom) >= 255; + } + + return exceedsTop || exceedsBottom; + } + }, + setCorners: function setCorners(latlngObj) { + var map = this._map; + var zoom = map.getZoom(); + var edit = this.editing; + var i = 0; // this is to fix https://github.com/publiclab/Leaflet.DistortableImage/issues/402 + + for (var k in latlngObj) { + if (this._cornerExceedsMapLats(zoom, latlngObj[k], map)) { + // calling reset / update w/ the same corners bc it prevents a marker flicker for rotate + this.setBounds(L.latLngBounds(this.getCorners())); + this.fire('update'); + return; + } + } + + for (var _k in latlngObj) { + this._corners[i] = latlngObj[_k]; + i += 1; + } + + this.setBounds(L.latLngBounds(this.getCorners())); + this.fire('update'); + + if (edit.toolbar && edit.toolbar instanceof L.DistortableImage.PopupBar) { + edit._updateToolbarPos(); + } + + this.edited = true; + return this; + }, + setCornersFromPoints: function setCornersFromPoints(pointsObj) { + var map = this._map; + var zoom = map.getZoom(); + var edit = this.editing; + var i = 0; + + for (var k in pointsObj) { + var corner = map.layerPointToLatLng(pointsObj[k]); + + if (this._cornerExceedsMapLats(zoom, corner, map)) { + // calling reset / update w/ the same corners bc it prevents a marker flicker for rotate + this.setBounds(L.latLngBounds(this.getCorners())); + this.fire('update'); + return; + } + } + + for (var _k2 in pointsObj) { + this._corners[i] = map.layerPointToLatLng(pointsObj[_k2]); + i += 1; + } + + this.setBounds(L.latLngBounds(this.getCorners())); + this.fire('update'); + + if (edit.toolbar && edit.toolbar instanceof L.DistortableImage.PopupBar) { + edit._updateToolbarPos(); + } + + this.edited = true; + return this; + }, + scaleBy: function scaleBy(scale) { + var map = this._map; + var center = map.project(this.getCenter()); + var i; + var p; + var scaledCorners = {}; + + if (scale === 0) { + return; + } + + for (i = 0; i < 4; i++) { + p = map.project(this.getCorner(i)).subtract(center).multiplyBy(scale).add(center); + scaledCorners[i] = map.unproject(p); + } + + this.setCorners(scaledCorners); + return this; + }, + getAngle: function getAngle() { + var unit = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'deg'; + var matrix = this.getElement().style[L.DomUtil.TRANSFORM].split('matrix3d')[1].slice(1, -1).split(','); + var row0x = matrix[0]; + var row0y = matrix[1]; + var row1x = matrix[4]; + var row1y = matrix[5]; + var determinant = row0x * row1y - row0y * row1x; + var angle = L.TrigUtil.calcAngle(row0x, row0y, 'rad'); + + if (determinant < 0) { + angle += angle < 0 ? Math.PI : -Math.PI; + } + + if (angle < 0) { + angle = 2 * Math.PI + angle; + } + + return unit === 'deg' ? Math.round(L.TrigUtil.radiansToDegrees(angle)) : L.Util.formatNum(angle, 2); + }, + setAngle: function setAngle(angle) { + var unit = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'deg'; + var currentAngle = this.getAngle(unit); + var angleToRotateBy = angle - currentAngle; + this.rotateBy(angleToRotateBy, unit); + return this; + }, + rotateBy: function rotateBy(angle) { + var unit = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'deg'; + var map = this._map; + var center = map.project(this.getCenter()); + var corners = {}; + var i; + var p; + var q; + + if (unit === 'deg') { + angle = L.TrigUtil.degreesToRadians(angle); + } + + for (i = 0; i < 4; i++) { + p = map.project(this.getCorner(i)).subtract(center); + q = L.point(Math.cos(angle) * p.x - Math.sin(angle) * p.y, Math.sin(angle) * p.x + Math.cos(angle) * p.y); + corners[i] = map.unproject(q.add(center)); + } + + this.setCorners(corners); + return this; + }, + dragBy: function dragBy(formerPoint, newPoint) { + var map = this._map; + var i; + var p; + var transCorners = {}; + var delta = map.project(formerPoint).subtract(map.project(newPoint)); + + for (i = 0; i < 4; i++) { + p = map.project(this.getCorner(i)).subtract(delta); + transCorners[i] = map.unproject(p); + } + + this.setCorners(transCorners); + }, + restore: function restore() { + var map = this._map; + var center = this._initialDimensions.center; + var offset = this._initialDimensions.offset; + var zoom = this._initialDimensions.zoom; + var corners = [center.subtract(offset), center.add(L.point(offset.x, -offset.y)), center.add(L.point(-offset.x, offset.y)), center.add(offset)]; + + for (var i = 0; i < 4; i++) { + if (!map.unproject(corners[i], zoom).equals(this.getCorner(i))) { + this.setCorner(i, map.unproject(corners[i], zoom)); + } + } + + this.edited = false; + this.fire('restore'); + return this; + }, + + /* Copied from Leaflet v0.7 https://github.com/Leaflet/Leaflet/blob/66282f14bcb180ec87d9818d9f3c9f75afd01b30/src/dom/DomUtil.js#L189-L199 */ + + /* since L.DomUtil.getTranslateString() is deprecated in Leaflet v1.0 */ + _getTranslateString: function _getTranslateString(point) { + // on WebKit browsers (Chrome/Safari/iOS Safari/Android) + // using translate3d instead of translate + // makes animation smoother as it ensures HW accel is used. + // Firefox 13 doesn't care + // (same speed either way), Opera 12 doesn't support translate3d + var is3d = L.Browser.webkit3d; + var open = 'translate' + (is3d ? '3d' : '') + '('; + var close = (is3d ? ',0' : '') + ')'; + return open + point.x + 'px,' + point.y + 'px' + close; + }, + _reset: function _reset() { + var map = this._map; + var image = this.getElement(); + var latLngToLayerPoint = L.bind(map.latLngToLayerPoint, map); + + var transformMatrix = this._calculateProjectiveTransform(latLngToLayerPoint); + + var topLeft = latLngToLayerPoint(this.getCorner(0)); + var warp = L.DomUtil.getMatrixString(transformMatrix); + + var translation = this._getTranslateString(topLeft); + /* See L.DomUtil.setPosition. Mainly for the purposes of L.Draggable. */ + + + image._leaflet_pos = topLeft; + image.style[L.DomUtil.TRANSFORM] = [translation, warp].join(' '); + /* Set origin to the upper-left corner rather than + * the center of the image, which is the default. + */ + + image.style[L.DomUtil.TRANSFORM + '-origin'] = '0 0 0'; + this.rotation.deg = this.getAngle(); + this.rotation.rad = this.getAngle('rad'); + }, + + /* + * Calculates the transform string that will be + * correct *at the end* of zooming. + * Leaflet then generates a CSS3 animation between the current transform and + * future transform which makes the transition appear smooth. + */ + _animateZoom: function _animateZoom(event) { + var map = this._map; + var image = this.getElement(); + + var latLngToNewLayerPoint = function latLngToNewLayerPoint(latlng) { + return map._latLngToNewLayerPoint(latlng, event.zoom, event.center); + }; + + var transformMatrix = this._calculateProjectiveTransform(latLngToNewLayerPoint); + + var topLeft = latLngToNewLayerPoint(this.getCorner(0)); + var warp = L.DomUtil.getMatrixString(transformMatrix); + + var translation = this._getTranslateString(topLeft); + /* See L.DomUtil.setPosition. Mainly for the purposes of L.Draggable. */ + + + image._leaflet_pos = topLeft; + image.style[L.DomUtil.TRANSFORM] = [translation, warp].join(' '); + }, + getCorners: function getCorners() { + return this._corners; + }, + getCorner: function getCorner(i) { + return this._corners[i]; + }, + // image (vertex) centroid calculation + getCenter: function getCenter() { + var map = this._map; + var reduce = this.getCorners().reduce(function (agg, corner) { + return agg.add(map.project(corner)); + }, L.point(0, 0)); + return map.unproject(reduce.divideBy(4)); + }, + _calculateProjectiveTransform: function _calculateProjectiveTransform(latLngToCartesian) { + /* Setting reasonable but made-up image defaults + * allow us to place images on the map before + * they've finished downloading. */ + var offset = latLngToCartesian(this.getCorner(0)); + var w = this.getElement().offsetWidth || 500; + var h = this.getElement().offsetHeight || 375; + var c = []; + var j; + /* Convert corners to container points (i.e. cartesian coordinates). */ + + for (j = 0; j < 4; j++) { + c.push(latLngToCartesian(this.getCorner(j))._subtract(offset)); + } + /* + * This matrix describes the action of + * the CSS transform on each corner of the image. + * It maps from the coordinate system centered + * at the upper left corner of the image + * to the region bounded by the latlngs in this._corners. + * For example: + * 0, 0, c[0].x, c[0].y + * says that the upper-left corner of the image + * maps to the first latlng in this._corners. + */ + + + return L.MatrixUtil.general2DProjection(0, 0, c[0].x, c[0].y, w, 0, c[1].x, c[1].y, 0, h, c[2].x, c[2].y, w, h, c[3].x, c[3].y); + } +}); + +L.distortableImageOverlay = function (id, options) { + return new L.DistortableImageOverlay(id, options); +}; + +L.Map.addInitHook(function () { + if (!L.DomUtil.hasClass(this.getContainer(), 'ldi')) { + L.DomUtil.addClass(this.getContainer(), 'ldi'); + } +}); + +/***/ }), + +/***/ "./src/components/DistortableImage.Keymapper.js": +/*!******************************************************!*\ + !*** ./src/components/DistortableImage.Keymapper.js ***! + \******************************************************/ +/***/ (function() { + +var _this = this; + +L.DomUtil = L.DomUtil || {}; +L.DistortableImage = L.DistortableImage || {}; +L.distortableImage = L.DistortableImage; +L.DistortableImage.Keymapper = L.Handler.extend({ + options: { + position: 'topright' + }, + initialize: function initialize(map, options) { + this._map = map; + L.setOptions(this, options); + }, + addHooks: function addHooks() { + if (!this._keymapper) { + this._container = this._buildContainer(); + this._scrollWrapper = this._wrap(); + this._toggler = this._createButton(); + + this._setMapper(this._container, this._scrollWrapper, this._toggler); + + L.DomEvent.on(this._toggler, 'click', this._toggleKeymapper, this); + L.DomEvent.disableClickPropagation(this._container); + L.DomEvent.disableScrollPropagation(this._container); + } + }, + removeHooks: function removeHooks() { + if (this._keymapper) { + L.DomEvent.off(this._toggler, 'click', this._toggleKeymapper, this); + L.DomUtil.remove(this._toggler); + L.DomUtil.remove(this._scrollWrapper); + L.DomUtil.remove(this._container); + this._keymapper = false; + } + }, + _buildContainer: function _buildContainer() { + var container = L.DomUtil.create('div', 'ldi-keymapper-hide'); + container.setAttribute('id', 'ldi-keymapper'); + var divider = L.DomUtil.create('br', 'divider'); + container.appendChild(divider); + return container; + }, + _createButton: function _createButton() { + var toggler = L.DomUtil.create('a', ''); + toggler.innerHTML = L.IconUtil.create('keyboard_open'); + toggler.setAttribute('id', 'toggle-keymapper'); + toggler.setAttribute('href', '#'); + toggler.setAttribute('title', 'Show keymap'); // Will force screen readers like VoiceOver to read this as "Show keymap - button" + + toggler.setAttribute('role', 'button'); + toggler.setAttribute('aria-label', 'Show keymap'); + return toggler; + }, + _wrap: function _wrap() { + var wrap = L.DomUtil.create('div', ''); + wrap.setAttribute('id', 'keymapper-wrapper'); + wrap.style.display = 'none'; + return wrap; + }, + _setMapper: function _setMapper(container, wrap, button) { + this._keymapper = L.control({ + position: this.options.position + }); + + this._keymapper.onAdd = function () { + container.appendChild(wrap); + wrap.insertAdjacentHTML('beforeend', '' + '
' + + /* eslint-disable */ + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '
Rotate Mode
R
RotateScale Mode
r
Scale Mode
s
Distort Mode
d
Drag Mode
D
Lock (Mode) / Unlock Image
l\xa0u
Stack up / down
q\xa0a
Add / Remove Image Border
b
Toggle Opacity
o
Deselect All
esc
Delete Image(s)
delete\xa0backspace
Export Image(s)
e
'); + /* eslint-enable */ + + container.appendChild(button); + return container; + }; + + this._keymapper.addTo(this._map); + }, + _toggleKeymapper: function _toggleKeymapper(e) { + e.preventDefault(); + this._container.className = this._container.className === 'ldi-keymapper leaflet-control' ? 'ldi-keymapper-hide leaflet-control' : 'ldi-keymapper leaflet-control'; + this._scrollWrapper.style.display = this._scrollWrapper.style.display === 'none' ? 'block' : 'none'; + this._toggler.innerHTML = this._toggler.innerHTML === 'close' ? L.IconUtil.create('keyboard_open') : 'close'; + L.IconUtil.toggleTitle(this._toggler, 'Show keymap', 'Hide keymap'); + L.DomUtil.toggleClass(this._toggler, 'close-icon'); + }, + _injectIconSet: function _injectIconSet() { + if (document.querySelector('#keymapper-iconset')) { + return; + } + + var el = L.DomUtil.create('div', ''); + el.id = 'keymapper-iconset'; + el.setAttribute('hidden', 'hidden'); + this._iconset = new L.KeymapperIconSet().render(); + el.innerHTML = this._iconset; + document.querySelector('.leaflet-control-container').appendChild(el); + } +}); +L.DistortableImage.Keymapper.addInitHook(function () { + L.DistortableImage.Keymapper.prototype._n = L.DistortableImage.Keymapper.prototype._n ? L.DistortableImage.Keymapper.prototype._n + 1 : 1; // dont enable keymapper for mobile + + if (L.DistortableImage.Keymapper.prototype._n === 1 && !L.Browser.mobile) { + _this.enable(); + + _this._injectIconSet(); + } +}); + +L.distortableImage.keymapper = function (map, options) { + return new L.DistortableImage.Keymapper(map, options); +}; + +/***/ }), + +/***/ "./src/edit/DistortableCollection.Edit.js": +/*!************************************************!*\ + !*** ./src/edit/DistortableCollection.Edit.js ***! + \************************************************/ +/***/ (function() { + +L.DistortableImage = L.DistortableImage || {}; // this class holds the keybindings and toolbar API for an image collection instance + +L.DistortableCollection.Edit = L.Handler.extend({ + options: { + keymap: L.distortableImage.group_action_map + }, + initialize: function initialize(group, options) { + this._group = group; + this._exportOpts = group.options.exportOpts; + L.setOptions(this, options); + L.distortableImage.group_action_map.Escape = '_decollectAll'; + }, + addHooks: function addHooks() { + var group = this._group; + var map = group._map; + this.editActions = this.options.actions; + this.runExporter = L.bind(L.Utils.getNestedVal(this, '_exportOpts', 'exporter') || this.startExport, this); + L.DomEvent.on(document, 'keydown', this._onKeyDown, this); + + if (!(map.doubleClickZoom.enabled() || map.doubleClickLabels.enabled())) { + L.DomEvent.on(map, 'click', this._decollectAll, this); + } + + L.DomEvent.on(map, { + singleclickon: this._singleClickListeners, + singleclickoff: this._resetClickListeners, + singleclick: this._singleClick, + boxcollectend: this._addCollections + }, this); + this._group.editable = true; + + this._group.eachLayer(function (layer) { + return layer.editing.enable(); + }); + }, + removeHooks: function removeHooks() { + var group = this._group; + var map = group._map; + L.DomEvent.off(document, 'keydown', this._onKeyDown, this); + + if (!(map.doubleClickZoom.enabled() || map.doubleClickLabels.enabled())) { + L.DomEvent.off(map, 'click', this._decollectAll, this); + } + + L.DomEvent.off(map, { + singleclickon: this._singleClickListeners, + singleclickoff: this._resetClickListeners, + singleclick: this._singleClick, + boxcollectend: this._addCollections + }, this); + + this._decollectAll(); + + this._group.editable = false; + + this._group.eachLayer(function (layer) { + return layer.editing.disable(); + }); + }, + enable: function enable() { + this._enabled = true; + this.addHooks(); + return this; + }, + disable: function disable() { + this._enabled = false; + this.removeHooks(); + return this; + }, + _onKeyDown: function _onKeyDown(e) { + var keymap = this.options.keymap; + var handlerName = keymap[e.key]; + + if (!this[handlerName]) { + return; + } + + if (this._group.anyCollected()) { + this[handlerName].call(this); + } + }, + _singleClick: function _singleClick(e) { + if (e.type === 'singleclick') { + this._decollectAll(e); + } else { + return; + } + }, + _singleClickListeners: function _singleClickListeners() { + var map = this._group._map; + L.DomEvent.off(map, 'click', this._decollectAll, this); + L.DomEvent.on(map, 'singleclick', this._decollectAll, this); + }, + _resetClickListeners: function _resetClickListeners() { + var map = this._group._map; + L.DomEvent.on(map, 'click', this._decollectAll, this); + L.DomEvent.off(map, 'singleclick', this._decollectAll, this); + }, + _decollectAll: function _decollectAll(e) { + var oe; + + if (e) { + oe = e.originalEvent; + } + /** + * prevents image deselection following the 'boxcollectend' event - note 'shift' must not be released until dragging is complete + * also prevents deselection following a click on a disabled img by differentiating it from the map + */ + + + if (oe && (oe.shiftKey || oe.target instanceof HTMLImageElement)) { + return; + } + + this._group.eachLayer(function (layer) { + L.DomUtil.removeClass(layer.getElement(), 'collected'); + layer.deselect(); + }); + + this._removeToolbar(); + + if (e) { + L.DomEvent.stopPropagation(e); + } + }, + _unlockGroup: function _unlockGroup() { + var _this = this; + + if (!this.hasTool(L.UnlockAction)) { + return; + } + + this._group.eachLayer(function (layer) { + if (_this._group.isCollected(layer)) { + var edit = layer.editing; + + edit._unlock(); // unlock updates the layer's handles; deselect to ensure they're hidden + + + layer.deselect(); + } + }); + }, + _lockGroup: function _lockGroup() { + var _this2 = this; + + if (!this.hasTool(L.LockAction)) { + return; + } + + this._group.eachLayer(function (layer) { + if (_this2._group.isCollected(layer)) { + var edit = layer.editing; + + edit._lock(); // map.addLayer also deselects the image, so we reselect here + + + L.DomUtil.addClass(layer.getElement(), 'collected'); + } + }); + }, + _addCollections: function _addCollections(e) { + var _this3 = this; + + var box = e.boxCollectBounds; + var map = this._group._map; + + this._group.eachLayer(function (layer) { + var edit = layer.editing; + + if (layer.isSelected()) { + layer.deselect(); + } + + var zoom = map.getZoom(); + var center = map.getCenter(); + var imgBounds = L.latLngBounds(layer.getCorner(2), layer.getCorner(1)); + imgBounds = map._latLngBoundsToNewLayerBounds(imgBounds, zoom, center); + + if (box.intersects(imgBounds) && edit.enabled()) { + if (!_this3.toolbar) { + _this3._addToolbar(); + } + + L.DomUtil.addClass(layer.getElement(), 'collected'); + } + }); + }, + _removeGroup: function _removeGroup(e) { + var _this4 = this; + + if (!this.hasTool(L.DeleteAction)) { + return; + } + + var layersToRemove = this._group._toRemove(); + + var n = layersToRemove.length; + + if (n === 0) { + return; + } + + var choice = L.DomUtil.confirmDeletes(n); + + if (choice) { + layersToRemove.forEach(function (layer) { + _this4._group.removeLayer(layer); + }); + + if (!this._group.anyCollected()) { + this._removeToolbar(); + } + } + + if (e) { + L.DomEvent.stopPropagation(e); + } + }, + cancelExport: function cancelExport() { + if (!this.customCollection) { + this._exportOpts.collection = undefined; + } + + clearInterval(this.updateInterval); + }, + _addToolbar: function _addToolbar() { + var group = this._group; + var map = group._map; + + if (group.options.suppressToolbar || this.toolbar) { + return; + } + + this.toolbar = L.distortableImage.controlBar({ + actions: this.editActions, + position: 'topleft' + }).addTo(map, group); + }, + _removeToolbar: function _removeToolbar() { + var map = this._group._map; + + if (this.toolbar) { + map.removeLayer(this.toolbar); + this.toolbar = false; + } else { + return false; + } + }, + hasTool: function hasTool(value) { + return this.editActions.some(function (action) { + return action === value; + }); + }, + addTool: function addTool(value) { + if (value.baseClass === 'leaflet-toolbar-icon' && !this.hasTool(value)) { + this._removeToolbar(); + + this.editActions.push(value); + + this._addToolbar(); + } + + return this; + }, + removeTool: function removeTool(value) { + var _this5 = this; + + this.editActions.some(function (item, idx) { + if (_this5.editActions[idx] === value) { + _this5._removeToolbar(); + + _this5.editActions.splice(idx, 1); + + _this5._addToolbar(); + + return true; + } else { + return false; + } + }); + return this; + }, + startExport: function startExport() { + var _this6 = this; + + if (!this.hasTool(L.ExportAction)) { + return; + } + + return new Promise(function (resolve) { + var opts = _this6._exportOpts; + opts.resolve = resolve; // allow resolving promise in user-defined functions, to stop spinner on completion + + var statusUrl; + _this6.updateInterval = null; // this may be overridden to update the UI to show export progress or completion + + var _defaultUpdater = function _defaultUpdater(data) { + data = JSON.parse(data); // optimization: fetch status directly from google storage: + + if (data.status_url) { + if (statusUrl !== data.status_url && data.status_url.match('.json')) { + // if (data.status_url && data.status_url.substr(0,1) === "/") { + // opts.statusUrl = opts.statusUrl + data.status_url; + // } else { + statusUrl = data.status_url; // } + } + + if (data.status === 'complete') { + clearInterval(_this6.updateInterval); + + if (!_this6.customCollection) { + _this6._exportOpts.collection = undefined; + } + + resolve(); + + if (data.jpg !== null) { + alert('Export succeeded. ' + opts.exportUrl + data.jpg); + } + } // TODO: update to clearInterval when status == "failed" if we update that in this file: + // https://github.com/publiclab/mapknitter-exporter/blob/main/lib/mapknitterExporter.rb + + + console.log(data); + } + }; // receives the URL of status.json, and starts running the updater to repeatedly fetch from status.json; + // this may be overridden to integrate with any UI + + + var _defaultHandleStatusRes = function _defaultHandleStatusRes(data) { + statusUrl = opts.statusUrl + data; // repeatedly fetch the status.json + + _this6.updateInterval = setInterval(function () { + var reqOpts = { + method: 'GET' + }; + var req = new Request("".concat(statusUrl, "?").concat(Date.now()), reqOpts); + fetch(req).then(function (res) { + if (res.ok) { + return res.text(); + } + }).then(opts.updater); + }, opts.frequency); + }; // initiate the export + + + var _defaultFetchStatusUrl = function _defaultFetchStatusUrl(mergedOpts) { + var form = new FormData(); + form.append('collection', JSON.stringify(mergedOpts.collection)); + form.append('scale', mergedOpts.scale); + form.append('upload', true); + var reqOpts = { + method: 'POST', + body: form + }; + var req = new Request(mergedOpts.exportStartUrl, reqOpts); + fetch(req).then(function (res) { + if (res.ok) { + return res.text(); + } + }).then(mergedOpts.handleStatusRes); + }; // If the user has passed collection property + + + _this6.customCollection = !!opts.collection; + + if (!_this6.customCollection) { + opts.collection = _this6._group.generateExportJson().images; + } + + opts.frequency = opts.frequency || 3000; + opts.scale = opts.scale || 100; // switch it to _getAvgCmPerPixel ! + + opts.updater = opts.updater || _defaultUpdater; + opts.handleStatusRes = opts.handleStatusRes || _defaultHandleStatusRes; + opts.fetchStatusUrl = opts.fetchStatusUrl || _defaultFetchStatusUrl; + opts.fetchStatusUrl(opts); + }); + } +}); + +L.distortableCollection.edit = function (group, options) { + return new L.DistortableCollection.Edit(group, options); +}; + +/***/ }), + +/***/ "./src/edit/DistortableImage.Edit.js": +/*!*******************************************!*\ + !*** ./src/edit/DistortableImage.Edit.js ***! + \*******************************************/ +/***/ (function() { + +L.DistortableImage = L.DistortableImage || {}; // holds the keybindings & toolbar API for an individual image instance + +L.DistortableImage.Edit = L.Handler.extend({ + options: { + opacity: 0.7, + outline: '1px solid red', + keymap: L.distortableImage.action_map + }, + initialize: function initialize(overlay, options) { + this._overlay = overlay; + this._toggledImage = false; + this._mode = overlay.options.mode; + this._transparent = false; + this._outlined = false; + L.setOptions(this, options); + L.distortableImage.action_map.Escape = '_deselect'; + }, + + /* Run on image selection. */ + addHooks: function addHooks() { + var overlay = this._overlay; + this.editActions = this.options.actions; + /* bring the selected image into view */ + + overlay.bringToFront(); + + this._initModes(); + + this._initHandles(); + + this._appendHandlesandDragable(); + + if (overlay.isSelected() && !overlay.options.suppressToolbar) { + this._addToolbar(); + } + + this.parentGroup = overlay.eP ? overlay.eP : false; + L.DomEvent.on(overlay.getElement(), { + dblclick: this.nextMode + }, this); + L.DomEvent.on(window, 'keydown', this._onKeyDown, this); + }, + + /* Run on image deselection. */ + removeHooks: function removeHooks() { + var overlay = this._overlay; + var eP = this.parentGroup; // First, check if dragging exists - it may be off due to locking + + this._disableDragging(); + + if (this.toolbar) { + this._removeToolbar(); + } + + for (var handle in this._handles) { + L.DomUtil.remove(handle); + } + /** + * ensures if you disable an image while it is multi-selected + * additional deselection logic is run + */ + + + if (L.DomUtil.hasClass(overlay.getElement(), 'collected')) { + L.DomUtil.removeClass(overlay.getElement(), 'collected'); + } + + if (eP && !eP.anyCollected() && eP.editing.toolbar) { + eP.editing._removeToolbar(); + } + + L.DomEvent.off(overlay.getElement(), { + dblclick: this.nextMode + }, this); + L.DomEvent.off(window, 'keydown', this._onKeyDown, this); + }, + disable: function disable() { + if (!this._enabled) { + return this; + } + + this._overlay.deselect(); + + this._enabled = false; + this.removeHooks(); + return this; + }, + _initModes: function _initModes() { + this._modes = {}; // passed from L.DistortablImage.PopupBar. If the mode is one + // of the current toolbar actions, adds it to this._modes + + for (var mode in L.DistortableImage.Edit.MODES) { + var action = L.DistortableImage.Edit.MODES[mode]; + + if (this.editActions.indexOf(action) !== -1) { + this._modes[mode] = action; + } + } // sets the current mode to the 1st available one if the one selected + // during initialization is not available + + + if (!this._modes[this._mode]) { + this._mode = Object.keys(this._modes)[0]; + } + }, + _initHandles: function _initHandles() { + var overlay = this._overlay; + var i; + this._dragHandles = L.layerGroup(); + + for (i = 0; i < 4; i++) { + this._dragHandles.addLayer(L.dragHandle(overlay, i)); + } + + this._scaleHandles = L.layerGroup(); + + for (i = 0; i < 4; i++) { + this._scaleHandles.addLayer(L.scaleHandle(overlay, i)); + } + + this._distortHandles = L.layerGroup(); + + for (i = 0; i < 4; i++) { + this._distortHandles.addLayer(L.distortHandle(overlay, i)); + } + + this._rotateHandles = L.layerGroup(); // individual rotate + + for (i = 0; i < 4; i++) { + this._rotateHandles.addLayer(L.rotateHandle(overlay, i)); + } // handle includes rotate AND scale + + + this._freeRotateHandles = L.layerGroup(); + + for (i = 0; i < 4; i++) { + this._freeRotateHandles.addLayer(L.freeRotateHandle(overlay, i)); + } + + this._lockHandles = L.layerGroup(); + + for (i = 0; i < 4; i++) { + this._lockHandles.addLayer(L.lockHandle(overlay, i, { + draggable: false + })); + } + + this._handles = { + drag: this._dragHandles, + scale: this._scaleHandles, + distort: this._distortHandles, + rotate: this._rotateHandles, + freeRotate: this._freeRotateHandles, + lock: this._lockHandles + }; + }, + _appendHandlesandDragable: function _appendHandlesandDragable() { + var ov = this._overlay; // won't throw error if user adds 0 mode actions to toolbar + + if (!this._mode) { + this._enableDragging(); + + return; + } + + this._updateHandle(); + + if (!ov.isSelected() && this.currentHandle) { + this.currentHandle.eachLayer(function (handle) { + handle.setOpacity(0); + + if (handle.dragging) { + handle.dragging.disable(); + } + }); + } + + if (!this.isMode('lock')) { + this._enableDragging(); + } + }, + _onKeyDown: function _onKeyDown(e) { + var keymap = this.options.keymap; + var handlerName = keymap[e.key]; + var ov = this._overlay; + var eP = this.parentGroup; + + if (eP && eP.anyCollected()) { + return; + } + + if (this[handlerName] !== undefined && !ov.options.suppressToolbar) { + if (ov.isSelected() && this.toolbar) { + this[handlerName].call(this); + } + } + }, + replaceTool: function replaceTool(old, next) { + var _this = this; + + if (next.baseClass !== 'leaflet-toolbar-icon' || this.hasTool(next)) { + return this; + } + + this.editActions.some(function (item, idx) { + if (item === old) { + _this._removeToolbar(); + + _this.editActions[idx] = next; + + _this._addToolbar(); + + for (var mode in L.DistortableImage.Edit.MODES) { + if (L.DistortableImage.Edit.MODES[mode] === old) { + delete _this._modes[mode]; + + _this._nextOrNone(mode); + } else if (L.DistortableImage.Edit.MODES[mode] === next) { + _this._modes[mode] = next; + } + } + + return true; + } + }); + return this; + }, + addTool: function addTool(value) { + if (value.baseClass === 'leaflet-toolbar-icon' && !this.hasTool(value)) { + this._removeToolbar(); + + this.editActions.push(value); + + this._addToolbar(); + + for (var mode in L.DistortableImage.Edit.MODES) { + if (L.DistortableImage.Edit.MODES[mode] === value) { + this._modes[mode] = value; + } + } + + if (!this._overlay.isSelected()) { + this._removeToolbar(); + } + } + + return this; + }, + hasTool: function hasTool(value) { + return this.editActions.some(function (action) { + return action === value; + }); + }, + removeTool: function removeTool(value) { + var _this2 = this; + + this.editActions.some(function (item, idx) { + if (item === value) { + _this2._removeToolbar(); + + _this2.editActions.splice(idx, 1); + + _this2._addToolbar(); + + for (var mode in L.DistortableImage.Edit.MODES) { + if (L.DistortableImage.Edit.MODES[mode] === value) { + delete _this2._modes[mode]; + + _this2._nextOrNone(mode); + } + } + + return true; + } + }); + + if (!this._overlay.isSelected()) { + this._removeToolbar(); + } + + return this; + }, + // set the mode to the next mode or if that was the last one set mode to '' + _nextOrNone: function _nextOrNone(mode) { + if (this.isMode(mode)) { + if (Object.keys(this.getModes()).length >= 1) { + this.nextMode(); + } else { + if (mode === 'lock') { + this._enableDragging(); + } + + this._mode = ''; + + this._updateHandle(); + } + } + }, + _removeToolbar: function _removeToolbar() { + var ov = this._overlay; + var map = ov._map; + + if (this.toolbar) { + map.removeLayer(this.toolbar); + this.toolbar = false; + } + }, + _enableDragging: function _enableDragging() { + var _this3 = this; + + var overlay = this._overlay; + var map = overlay._map; + this.dragging = new L.Draggable(overlay.getElement()); + this.dragging.enable(); + /* Hide toolbars and markers while dragging; click will re-show it */ + + this.dragging.on('dragstart', function () { + overlay.fire('dragstart'); + + _this3._removeToolbar(); + }); + /* + * Adjust default behavior of L.Draggable, which overwrites the CSS3 + * distort transformations that we set when it calls L.DomUtil.setPosition. + */ + + this.dragging._updatePosition = function () { + var topLeft = overlay.getCorner(0); + + var delta = this._newPos.subtract(map.latLngToLayerPoint(topLeft)); + + var currentPoint; + var corners = {}; + var i; + this.fire('predrag'); + + for (i = 0; i < 4; i++) { + currentPoint = map.latLngToLayerPoint(overlay.getCorner(i)); + corners[i] = map.layerPointToLatLng(currentPoint.add(delta)); + } + + overlay.setCorners(corners); + overlay.fire('drag'); + this.fire('drag'); + }; + + this.dragging.on('dragend', function () { + overlay.fire('dragend'); + }); + }, + _disableDragging: function _disableDragging() { + if (this.dragging) { + this.dragging.disable(); + delete this.dragging; + } + }, + _dragMode: function _dragMode() { + this.setMode('drag'); + }, + _scaleMode: function _scaleMode() { + this.setMode('scale'); + }, + _distortMode: function _distortMode() { + this.setMode('distort'); + }, + _rotateMode: function _rotateMode() { + this.setMode('rotate'); + }, + _freeRotateMode: function _freeRotateMode() { + this.setMode('freeRotate'); + }, + _toggleLockMode: function _toggleLockMode() { + if (this.isMode('lock')) { + this._unlock(); + } else { + this._lock(); + } + }, + _toggleOpacity: function _toggleOpacity() { + var image = this._overlay.getElement(); + + var opacity; + + if (!this.hasTool(L.OpacityAction)) { + return; + } + + this._transparent = !this._transparent; + opacity = this._transparent ? this.options.opacity : 1; + L.DomUtil.setOpacity(image, opacity); + image.setAttribute('opacity', opacity); + + this._refresh(); + }, + _toggleBorder: function _toggleBorder() { + var image = this._overlay.getElement(); + + var outline; + + if (!this.hasTool(L.BorderAction)) { + return; + } + + this._outlined = !this._outlined; + outline = this._outlined ? this.options.outline : 'none'; + image.style.outline = outline; + + this._refresh(); + }, + // compare this to using overlay zIndex + _toggleOrder: function _toggleOrder() { + if (this._toggledImage) { + this._stackUp(); + } else { + this._stackDown(); + } + }, + _removeOverlay: function _removeOverlay() { + var ov = this._overlay; + var eP = this.parentGroup; + + if (this.isMode('lock') || !this.hasTool(L.DeleteAction)) { + return; + } + + var choice = L.DomUtil.confirmDelete(); + + if (!choice) { + return; + } + + this._removeToolbar(); + + if (eP) { + eP.removeLayer(ov); + } else { + ov._map.removeLayer(ov); + } + }, + // Based on https://github.com/publiclab/mapknitter/blob/8d94132c81b3040ae0d0b4627e685ff75275b416/app/assets/javascripts/mapknitter/Map.js#L47-L82 + _getExport: function _getExport() { + var overlay = this._overlay; + var map = overlay._map; + var img = overlay.getElement(); + + if (!this.hasTool(L.ExportAction)) { + return; + } // make a new image + + + var downloadable = new Image(); + downloadable.id = downloadable.id || 'tempId12345'; + document.body.appendChild(downloadable); + + downloadable.onload = function onLoadDownloadableImage() { + var height = downloadable.height; + var width = downloadable.width; + var nw = map.latLngToLayerPoint(overlay.getCorner(0)); + var ne = map.latLngToLayerPoint(overlay.getCorner(1)); + var sw = map.latLngToLayerPoint(overlay.getCorner(2)); + var se = map.latLngToLayerPoint(overlay.getCorner(3)); // I think this is to move the image to the upper left corner, + // eslint-disable-next-line max-len + // jywarren: i think we may need these or the image goes off the edge of the canvas + // jywarren: but these seem to break the distortion math... + // jywarren: i think it should be rejiggered so it + // finds the most negative values of x and y and then + // adds those to all coordinates + // nw.x -= nw.x; + // ne.x -= nw.x; + // se.x -= nw.x; + // sw.x -= nw.x; + // nw.y -= nw.y; + // ne.y -= nw.y; + // se.y -= nw.y; + // sw.y -= nw.y; + // run once warping is complete + + downloadable.onload = function () { + L.DomUtil.remove(downloadable); + }; + + if (window && window.hasOwnProperty('warpWebGl')) { + warpWebGl(downloadable.id, [0, 0, width, 0, width, height, 0, height], [nw.x, nw.y, ne.x, ne.y, se.x, se.y, sw.x, sw.y], true // trigger download + ); + } + }; + + downloadable.src = overlay.options.fullResolutionSrc || img.src; + }, + _stackUp: function _stackUp() { + var t = this._toggledImage; + + if (!t || !this.hasTool(L.StackAction)) { + return; + } + + this._toggledImage = false; + + this._overlay.bringToFront(); + + this._refresh(); + }, + _stackDown: function _stackDown() { + var t = this._toggledImage; + + if (t || !this.hasTool(L.StackAction)) { + return; + } + + this._toggledImage = true; + + this._overlay.bringToBack(); + + this._refresh(); + }, + _unlock: function _unlock() { + var ov = this._overlay; + var map = ov._map; + var eP = this.parentGroup; + + if (!this.isMode('lock')) { + return; + } + + if (eP && !eP.isCollected(ov) || !eP) { + if (!this.hasTool(L.LockAction)) { + return; + } + } + + if (this.currentHandle) { + map.removeLayer(this.currentHandle); + } + + if (ov.options.mode === 'lock' || !this.hasMode(ov.options.mode)) { + this._mode = ''; + this.currentHandle = ''; + } else { + this._mode = ov.options.mode; + } + + this._updateHandle(); + + this._enableDragging(); + + this._refresh(); + }, + _lock: function _lock() { + var ov = this._overlay; + var map = ov._map; + var eP = this.parentGroup; + + if (this.isMode('lock')) { + return; + } + + if (eP && !eP.isCollected(ov) || !eP) { + if (!this.hasTool(L.LockAction)) { + return; + } + } + + if (this.currentHandle) { + map.removeLayer(this.currentHandle); + } + + this._mode = 'lock'; + + this._updateHandle(); + + this._disableDragging(); + + this._refresh(); + }, + _deselect: function _deselect() { + this._overlay.deselect(); + }, + _showMarkers: function _showMarkers(e) { + var eP = this.parentGroup; + + if (!this.currentHandle) { + return; + } // only markers we want in collect interface for now is lock + + + if (!this.isMode('lock') && eP && eP.anyCollected()) { + return; + } + + this.currentHandle.eachLayer(function (handle) { + handle.setOpacity(1); + + if (handle.dragging) { + handle.dragging.enable(); + } + + L.DomUtil.addClass(handle.getElement(), 'leaflet-interactive'); + }); + }, + _hideMarkers: function _hideMarkers() { + var ov = this._overlay; + var eP = this.parentGroup; // workaround for race condition w/ feature group + + if (!this._handles) { + this._initHandles(); + } + + if (!this.currentHandle) { + return; + } + + if (this.isMode('lock') && eP && eP.isCollected(ov)) { + return; + } + + this.currentHandle.eachLayer(function (handle) { + handle.setOpacity(0); + + if (handle.dragging) { + handle.dragging.disable(); + } + + L.DomUtil.removeClass(handle.getElement(), 'leaflet-interactive'); + }); + }, + _updateHandle: function _updateHandle() { + var ov = this._overlay; + var map = ov._map; + var mode = this.getMode(); + + if (this.currentHandle) { + map.removeLayer(this.currentHandle); + } + + this.currentHandle = mode === '' ? '' : this._handles[mode]; + + if (this.currentHandle !== '') { + map.addLayer(this.currentHandle); + } + }, + _addToolbar: function _addToolbar() { + var ov = this._overlay; + var eP = this.parentGroup; + var map = ov._map; // Find the topmost point on the image. + + var corners = ov.getCorners(); + var maxLat = -Infinity; + + if (eP && eP.anyCollected()) { + eP.editing._addToolbar(); + + return; + } + + if (ov.options.suppressToolbar || this.toolbar) { + return; + } + + for (var i = 0; i < corners.length; i++) { + if (corners[i].lat > maxLat) { + maxLat = corners[i].lat; + } + } // Longitude is based on the centroid of the image. + + + var raisedPoint = ov.getCenter(); + raisedPoint.lat = maxLat; + this.toolbar = L.distortableImage.popupBar(raisedPoint, { + actions: this.editActions + }).addTo(map, ov); + ov.fire('toolbar:created'); + }, + _refresh: function _refresh() { + if (this.toolbar) { + this._removeToolbar(); + } + + this._addToolbar(); + }, + _updateToolbarPos: function _updateToolbarPos() { + var overlay = this._overlay; // Find the topmost point on the image. + + var corners = overlay.getCorners(); + var toolbar = this.toolbar; + var maxLat = -Infinity; + + if (toolbar && toolbar instanceof L.DistortableImage.PopupBar) { + for (var i = 0; i < corners.length; i++) { + if (corners[i].lat > maxLat) { + maxLat = corners[i].lat; + } + } // Longitude is based on the centroid of the image. + + + var raisedPoint = overlay.getCenter(); + raisedPoint.lat = maxLat; + + if (!overlay.options.suppressToolbar) { + this.toolbar.setLatLng(raisedPoint); + } + } + }, + hasMode: function hasMode(mode) { + return !!this._modes[mode]; + }, + getMode: function getMode() { + if (!this.enabled()) { + return; + } + + return this._mode; + }, + getModes: function getModes() { + return this._modes; + }, + isMode: function isMode(mode) { + if (!this.enabled()) { + return false; + } + + return this._mode === mode; + }, + setMode: function setMode(newMode) { + var ov = this._overlay; + var eP = this.parentGroup; + var mode = this.getMode(); + + if (mode === newMode || !this.hasMode(newMode) || !this.enabled()) { + return; + } + + if (this.toolbar) { + this.toolbar.clickTool(newMode); + } + + if (this.isMode('lock') && !this.dragging) { + this._enableDragging(); + } + + this._mode = newMode; + + if (this.isMode('lock')) { + this._disableDragging(); + } + + this._updateHandle(); + + this._refresh(); + + if (eP && eP.isCollected(ov)) { + ov.deselect(); + } + + return this; + }, + + /** + * need to attach a stop to img dblclick or it will propagate to + * the map and fire the handler that shows map location labels on map dblclick. + */ + nextMode: function nextMode(e) { + var mode = this.getMode(); + var eP = this.parentGroup; + var modesArray = Object.keys(this.getModes()); + var idx = modesArray.indexOf(mode); + var nextIdx = (idx + 1) % modesArray.length; + var newMode = modesArray[nextIdx]; + + if (e) { + if (eP && eP.anyCollected()) { + return; + } + + L.DomEvent.stop(e); + } + + return this.setMode(newMode); + } +}); + +L.distortableImage.edit = function (overlay, options) { + return new L.DistortableImage.Edit(overlay, options); +}; + +/***/ }), + +/***/ "./src/edit/actions/BorderAction.js": +/*!******************************************!*\ + !*** ./src/edit/actions/BorderAction.js ***! + \******************************************/ +/***/ (function() { + +L.BorderAction = L.EditAction.extend({ + initialize: function initialize(map, overlay, options) { + var edit = overlay.editing; + var mode = edit._mode; + var use; + var tooltip; + + if (edit._outlined) { + use = 'border_outer'; + tooltip = overlay.options.translation.removeBorder; + } else { + use = 'border_clear'; + tooltip = overlay.options.translation.addBorder; + } + + options = options || {}; + options.toolbarIcon = { + svg: true, + html: use, + tooltip: tooltip, + className: mode === 'lock' ? 'disabled' : '' + }; // conditional for disabling keybindings for this action when the image is locked. + + L.DistortableImage.action_map.b = mode === 'lock' ? '' : '_toggleBorder'; + L.EditAction.prototype.initialize.call(this, map, overlay, options); + }, + addHooks: function addHooks() { + var edit = this._overlay.editing; + L.IconUtil.toggleXlink(this._link, 'border_clear', 'border_outer'); + L.IconUtil.toggleTitle(this._link, 'Remove Border', 'Add Border'); + + edit._toggleBorder(); + } +}); + +/***/ }), + +/***/ "./src/edit/actions/DeleteAction.js": +/*!******************************************!*\ + !*** ./src/edit/actions/DeleteAction.js ***! + \******************************************/ +/***/ (function() { + +L.DeleteAction = L.EditAction.extend({ + initialize: function initialize(map, overlay, options) { + var edit = overlay.editing; + var use = 'delete_forever'; + var tooltip; + /** + * we can tell whether the overlay is an instance of `L.DistortableImageOverlay` or `L.DistortableCollection` bc only + * the former should have `parentGroup` defined on it. From there we call the apporpriate keybindings and methods. + */ + + if (edit instanceof L.DistortableImage.Edit) { + tooltip = overlay.options.translation.deleteImage; // backspace windows / delete mac + + L.DistortableImage.action_map.Backspace = edit._mode === 'lock' ? '' : '_removeOverlay'; + } else { + tooltip = overlay.options.translation.deleteImages; + L.DistortableImage.group_action_map.Backspace = edit._mode === 'lock' ? '' : '_removeGroup'; + } + + options = options || {}; + options.toolbarIcon = { + svg: true, + html: use, + tooltip: tooltip, + className: edit._mode === 'lock' ? 'disabled' : '' + }; + L.EditAction.prototype.initialize.call(this, map, overlay, options); + }, + addHooks: function addHooks() { + var edit = this._overlay.editing; + + if (edit instanceof L.DistortableImage.Edit) { + edit._removeOverlay(); + } else { + edit._removeGroup(); + } + } +}); + +/***/ }), + +/***/ "./src/edit/actions/DistortAction.js": +/*!*******************************************!*\ + !*** ./src/edit/actions/DistortAction.js ***! + \*******************************************/ +/***/ (function() { + +L.DistortAction = L.EditAction.extend({ + initialize: function initialize(map, overlay, options) { + options = options || {}; + options.toolbarIcon = { + svg: true, + html: 'distort', + tooltip: overlay.options.translation.distortImage, + className: 'distort' + }; + L.DistortableImage.action_map.d = '_distortMode'; + L.EditAction.prototype.initialize.call(this, map, overlay, options); + }, + addHooks: function addHooks() { + var edit = this._overlay.editing; + + edit._distortMode(); + } +}); + +/***/ }), + +/***/ "./src/edit/actions/DragAction.js": +/*!****************************************!*\ + !*** ./src/edit/actions/DragAction.js ***! + \****************************************/ +/***/ (function() { + +L.DragAction = L.EditAction.extend({ + initialize: function initialize(map, overlay, options) { + options = options || {}; + options.toolbarIcon = { + svg: true, + html: 'drag', + tooltip: overlay.options.translation.dragImage, + className: 'drag' + }; + L.DistortableImage.action_map.D = '_dragMode'; + L.EditAction.prototype.initialize.call(this, map, overlay, options); + }, + addHooks: function addHooks() { + var edit = this._overlay.editing; + + edit._dragMode(); + } +}); + +/***/ }), + +/***/ "./src/edit/actions/EditAction.js": +/*!****************************************!*\ + !*** ./src/edit/actions/EditAction.js ***! + \****************************************/ +/***/ (function() { + +L.DistortableImage = L.DistortableImage || {}; +L.distortableImage = L.DistortableImage; +L.DistortableImage.action_map = {}; +L.EditAction = L.Toolbar2.Action.extend({ + options: { + toolbarIcon: { + svg: false, + html: '', + className: '', + tooltip: '' + } + }, + initialize: function initialize(map, overlay, options) { + this._overlay = overlay; + this._map = map; + L.setOptions(this, options); + L.Toolbar2.Action.prototype.initialize.call(this, options); + + this._injectIconSet(); + }, + _createIcon: function _createIcon(toolbar, container, args) { + var _this = this; + + var iconOptions = this.options.toolbarIcon; + var className = iconOptions.className; + var edit = this._overlay.editing; + this.toolbar = toolbar; + this._icon = L.DomUtil.create('li', '', container); + this._link = L.DomUtil.create('a', '', this._icon); + + if (iconOptions.svg) { + this._link.innerHTML = L.IconUtil.create(iconOptions.html); + } else { + this._link.innerHTML = iconOptions.html; + } + + this._link.setAttribute('href', '#'); + + this._link.setAttribute('title', iconOptions.tooltip); + + this._link.setAttribute('role', 'button'); + + L.DomUtil.addClass(this._link, this.constructor.baseClass); + + if (className) { + L.DomUtil.addClass(this._link, className); + + if (className === 'disabled') { + L.DomUtil.addClass(this._icon, className); + } + + if (className === edit._mode) { + L.DomUtil.addClass(this._link, 'selected-mode'); + } else { + L.DomUtil.removeClass(this._link, 'selected-mode'); + } + } + + L.DomEvent.on(this._link, 'click', this.enable, this); + L.DomEvent.on(this._overlay, 'update', function () { + var match = _this._link.innerHTML.match(/xlink:href="#restore"/); + + if (match && match.length === 1) { + _this._enableAction(); + } + }); + /* Add secondary toolbar */ + + this._addSubToolbar(toolbar, this._icon, args); + }, + _injectIconSet: function _injectIconSet() { + if (document.querySelector('#iconset')) { + return; + } + + var el = document.createElement('div'); + el.id = 'iconset'; + el.setAttribute('hidden', 'hidden'); + el.innerHTML = new L.ToolbarIconSet().render(); + document.querySelector('.leaflet-marker-pane').appendChild(el); + }, + _enableAction: function _enableAction() { + L.DomUtil.removeClass(this._link.parentElement, 'disabled'); + L.DomUtil.removeClass(this._link, 'disabled'); + }, + _disableAction: function _disableAction() { + L.DomUtil.addClass(this._link.parentElement, 'disabled'); + L.DomUtil.addClass(this._link, 'disabled'); + } +}); + +L.editAction = function (map, overlay, options) { + return new L.EditAction(map, overlay, options); +}; + +/***/ }), + +/***/ "./src/edit/actions/ExportAction.js": +/*!******************************************!*\ + !*** ./src/edit/actions/ExportAction.js ***! + \******************************************/ +/***/ (function() { + +L.ExportAction = L.EditAction.extend({ + // This function is executed every time we select an image + initialize: function initialize(map, overlay, options) { + var edit = overlay.editing; + var tooltip; + this.isExporting = false; + this.mouseLeaveSkip = true; + this.isHooksExecuted = false; + + if (edit instanceof L.DistortableImage.Edit) { + L.DistortableImage.action_map.e = '_getExport'; + tooltip = overlay.options.translation.exportImage; + } else { + L.DistortableImage.group_action_map.e = 'runExporter'; + tooltip = overlay.options.translation.exportImages; + } + + options = options || {}; + options.toolbarIcon = { + svg: true, + html: 'get_app', + tooltip: tooltip + }; + L.EditAction.prototype.initialize.call(this, map, overlay, options); + }, + addHooks: function addHooks() { + var edit = this._overlay.editing; + + if (edit instanceof L.DistortableImage.Edit) { + edit._getExport(); + + return; + } // Make sure that addHooks is executed only once, event listeners will handle the rest + + + if (this.isHooksExecuted) { + return; + } else { + this.isHooksExecuted = true; + } + + var exportTool = this._link.parentElement; + this.mouseEnterHandler = this.handleMouseEnter.bind(this); + this.mouseLeaveHandler = this.handleMouseLeave.bind(this); + L.DomEvent.on(exportTool, 'click', function () { + console.log('Inside export tool'); + + if (!this.isExporting) { + this.isExporting = true; + this.renderExportIcon(); + setTimeout(this.attachMouseEventListeners.bind(this, exportTool), 100); + edit.runExporter().then(function () { + this.resetState(); + this.detachMouseEventListeners(exportTool); + }.bind(this)); + } else { + // Clicking on the export icon after export has started will be ignored + if (this.mouseLeaveSkip) { + return; + } + + this.resetState(); + this.detachMouseEventListeners(exportTool); + edit.cancelExport(); + } + }, this); + }, + resetState: function resetState() { + this.renderDownloadIcon(); + this.isExporting = false; + this.mouseLeaveSkip = true; + }, + attachMouseEventListeners: function attachMouseEventListeners(element) { + element.addEventListener('mouseenter', this.mouseEnterHandler); + element.addEventListener('mouseleave', this.mouseLeaveHandler); + }, + detachMouseEventListeners: function detachMouseEventListeners(element) { + element.removeEventListener('mouseenter', this.mouseEnterHandler); + element.removeEventListener('mouseleave', this.mouseLeaveHandler); + }, + handleMouseEnter: function handleMouseEnter() { + this.renderCancelIcon(); + }, + handleMouseLeave: function handleMouseLeave() { + if (this.mouseLeaveSkip) { + this.mouseLeaveSkip = false; + } else { + this.renderExportIcon(); + } + }, + renderDownloadIcon: function renderDownloadIcon() { + L.IconUtil.toggleXlink(this._link, 'get_app', 'spinner'); + L.IconUtil.toggleTitle(this._link, 'Export Images', 'Loading...'); + L.DomUtil.removeClass(this._link.firstChild, 'loader'); + }, + renderExportIcon: function renderExportIcon() { + L.IconUtil.toggleXlink(this._link, 'spinner'); + L.IconUtil.toggleTitle(this._link, 'Export Images', 'Loading...'); + L.IconUtil.addClassToSvg(this._link, 'loader'); + }, + renderCancelIcon: function renderCancelIcon() { + L.IconUtil.toggleXlink(this._link, 'cancel'); + L.IconUtil.toggleTitle(this._link, 'Cancel Export', 'Loading...'); + L.DomUtil.removeClass(this._link.firstChild, 'loader'); + } +}); + +/***/ }), + +/***/ "./src/edit/actions/FreeRotateAction.js": +/*!**********************************************!*\ + !*** ./src/edit/actions/FreeRotateAction.js ***! + \**********************************************/ +/***/ (function() { + +L.FreeRotateAction = L.EditAction.extend({ + initialize: function initialize(map, overlay, options) { + options = options || {}; + options.toolbarIcon = { + svg: true, + html: 'crop_rotate', + tooltip: overlay.options.translation.freeRotateImage, + className: 'freeRotate' + }; + L.DistortableImage.action_map.f = '_freeRotateMode'; + L.EditAction.prototype.initialize.call(this, map, overlay, options); + }, + addHooks: function addHooks() { + var edit = this._overlay.editing; + + edit._freeRotateMode(); + } +}); + +/***/ }), + +/***/ "./src/edit/actions/GeolocateAction.js": +/*!*********************************************!*\ + !*** ./src/edit/actions/GeolocateAction.js ***! + \*********************************************/ +/***/ (function() { + +L.GeolocateAction = L.EditAction.extend({ + initialize: function initialize(map, overlay, options) { + var edit = overlay.editing; + options = options || {}; + options.toolbarIcon = { + svg: true, + html: 'explore', + tooltip: overlay.options.translation.geolocateImage, + className: edit._mode === 'lock' ? 'disabled' : '' + }; + L.EditAction.prototype.initialize.call(this, map, overlay, options); + }, + addHooks: function addHooks() { + var image = this._overlay.getElement(); + + EXIF.getData(image, L.EXIF(image)); + } +}); + +/***/ }), + +/***/ "./src/edit/actions/LockAction.js": +/*!****************************************!*\ + !*** ./src/edit/actions/LockAction.js ***! + \****************************************/ +/***/ (function() { + +L.LockAction = L.EditAction.extend({ + initialize: function initialize(map, overlay, options) { + var edit = overlay.editing; + var use; + var tooltip; + + if (edit instanceof L.DistortableImage.Edit) { + L.DistortableImage.action_map.u = '_unlock'; + L.DistortableImage.action_map.l = '_lock'; + tooltip = overlay.options.translation.lockMode; + use = edit.isMode('lock') ? 'lock' : 'unlock'; + } else { + L.DistortableImage.group_action_map.l = '_lockGroup'; + tooltip = overlay.options.translation.lockImages; + use = 'lock'; + } + + options = options || {}; + options.toolbarIcon = { + svg: true, + html: use, + tooltip: tooltip, + className: 'lock' + }; + L.EditAction.prototype.initialize.call(this, map, overlay, options); + }, + addHooks: function addHooks() { + var edit = this._overlay.editing; + + if (edit instanceof L.DistortableImage.Edit) { + edit._toggleLockMode(); + } else { + edit._lockGroup(); + } + } +}); + +/***/ }), + +/***/ "./src/edit/actions/OpacityAction.js": +/*!*******************************************!*\ + !*** ./src/edit/actions/OpacityAction.js ***! + \*******************************************/ +/***/ (function() { + +L.OpacityAction = L.EditAction.extend({ + initialize: function initialize(map, overlay, options) { + var edit = overlay.editing; + var mode = edit._mode; + var use; + var tooltip; + + if (edit._transparent) { + use = 'opacity_empty'; + tooltip = overlay.options.translation.makeImageOpaque; + } else { + use = 'opacity'; + tooltip = overlay.options.translation.makeImageTransparent; + } + + options = options || {}; + options.toolbarIcon = { + svg: true, + html: use, + tooltip: tooltip, + className: mode === 'lock' ? 'disabled' : '' + }; + L.DistortableImage.action_map.o = mode === 'lock' ? '' : '_toggleOpacity'; + L.EditAction.prototype.initialize.call(this, map, overlay, options); + }, + addHooks: function addHooks() { + var edit = this._overlay.editing; + var link = this._link; + L.IconUtil.toggleXlink(link, 'opacity', 'opacity_empty'); + L.IconUtil.toggleTitle(link, 'Make Image Transparent', 'Make Image Opaque'); + + edit._toggleOpacity(); + } +}); + +/***/ }), + +/***/ "./src/edit/actions/RestoreAction.js": +/*!*******************************************!*\ + !*** ./src/edit/actions/RestoreAction.js ***! + \*******************************************/ +/***/ (function() { + +L.RestoreAction = L.EditAction.extend({ + initialize: function initialize(map, overlay, options) { + var mode = L.Utils.getNestedVal(overlay, 'editing', '_mode'); + var edited = overlay.edited; + options = options || {}; + options.toolbarIcon = { + svg: true, + html: 'restore', + tooltip: overlay.options.translation.restoreImage, + className: edited && mode !== 'lock' ? '' : 'disabled' + }; + L.EditAction.prototype.initialize.call(this, map, overlay, options); + }, + addHooks: function addHooks() { + var ov = this._overlay; + L.DomEvent.on(ov, { + edit: this._enableAction, + restore: this._disableAction + }, this); + ov.restore(); + } +}); + +/***/ }), + +/***/ "./src/edit/actions/RotateAction.js": +/*!******************************************!*\ + !*** ./src/edit/actions/RotateAction.js ***! + \******************************************/ +/***/ (function() { + +L.RotateAction = L.EditAction.extend({ + initialize: function initialize(map, overlay, options) { + options = options || {}; + options.toolbarIcon = { + svg: true, + html: 'rotate', + tooltip: overlay.options.translation.rotateImage, + className: 'rotate' + }; + L.DistortableImage.action_map.r = '_rotateMode'; + L.EditAction.prototype.initialize.call(this, map, overlay, options); + }, + addHooks: function addHooks() { + var edit = this._overlay.editing; + + edit._rotateMode(); + } +}); + +/***/ }), + +/***/ "./src/edit/actions/ScaleAction.js": +/*!*****************************************!*\ + !*** ./src/edit/actions/ScaleAction.js ***! + \*****************************************/ +/***/ (function() { + +L.ScaleAction = L.EditAction.extend({ + initialize: function initialize(map, overlay, options) { + options = options || {}; + options.toolbarIcon = { + svg: true, + html: 'scale', + tooltip: overlay.options.translation.scaleImage, + className: 'scale' + }; + L.DistortableImage.action_map.s = '_scaleMode'; + L.EditAction.prototype.initialize.call(this, map, overlay, options); + }, + addHooks: function addHooks() { + var edit = this._overlay.editing; + + edit._scaleMode(); + } +}); + +/***/ }), + +/***/ "./src/edit/actions/StackAction.js": +/*!*****************************************!*\ + !*** ./src/edit/actions/StackAction.js ***! + \*****************************************/ +/***/ (function() { + +L.StackAction = L.EditAction.extend({ + initialize: function initialize(map, overlay, options) { + var edit = overlay.editing; + var use; + var tooltip; + + if (edit._toggledImage) { + use = 'flip_to_back'; + tooltip = overlay.options.translation.stackToFront; + } else { + use = 'flip_to_front'; + tooltip = overlay.options.translation.stackToBack; + } + + options = options || {}; + options.toolbarIcon = { + svg: true, + html: use, + tooltip: tooltip, + className: edit._mode === 'lock' ? 'disabled' : '' + }; + L.DistortableImage.action_map.q = edit._mode === 'lock' ? '' : '_stackUp'; + L.DistortableImage.action_map.a = edit._mode === 'lock' ? '' : '_stackDown'; + L.EditAction.prototype.initialize.call(this, map, overlay, options); + }, + addHooks: function addHooks() { + var edit = this._overlay.editing; + L.IconUtil.toggleXlink(this._link, 'flip_to_front', 'flip_to_back'); + L.IconUtil.toggleTitle(this._link, 'Stack to Front', 'Stack to Back'); + + edit._toggleOrder(); + } +}); + +/***/ }), + +/***/ "./src/edit/actions/UnlockAction.js": +/*!******************************************!*\ + !*** ./src/edit/actions/UnlockAction.js ***! + \******************************************/ +/***/ (function() { + +L.UnlockAction = L.EditAction.extend({ + initialize: function initialize(map, overlay, options) { + options = options || {}; + options.toolbarIcon = { + svg: true, + html: 'unlock', + tooltip: overlay.options.translation.unlockImages + }; + L.DistortableImage.group_action_map.u = '_unlockGroup'; + L.EditAction.prototype.initialize.call(this, map, overlay, options); + }, + addHooks: function addHooks() { + var edit = this._overlay.editing; + + edit._unlockGroup(); + } +}); + +/***/ }), + +/***/ "./src/edit/getEXIFdata.js": +/*!*********************************!*\ + !*** ./src/edit/getEXIFdata.js ***! + \*********************************/ +/***/ (function() { + +/* eslint-disable no-unused-vars */ +L.EXIF = function getEXIFdata(img) { + if (Object.keys(EXIF.getAllTags(img)).length !== 0) { + console.log(EXIF.getAllTags(img)); + var GPS = EXIF.getAllTags(img); + var altitude; + /* If the lat/lng is available. */ + + if (typeof GPS.GPSLatitude !== 'undefined' && typeof GPS.GPSLongitude !== 'undefined') { + // sadly, encoded in [degrees,minutes,seconds] + // primitive value = GPS.GPSLatitude[x].numerator + var lat = GPS.GPSLatitude[0] + GPS.GPSLatitude[1] / 60 + GPS.GPSLatitude[2] / 3600; + var lng = GPS.GPSLongitude[0] + GPS.GPSLongitude[1] / 60 + GPS.GPSLongitude[2] / 3600; + + if (GPS.GPSLatitudeRef !== 'N') { + lat = lat * -1; + } + + if (GPS.GPSLongitudeRef === 'W') { + lng = lng * -1; + } + } // Attempt to use GPS compass heading; will require + // some trig to calc corner points, which you can find below: + + + var angle = 0; // "T" refers to "True north", so -90. + + if (GPS.GPSImgDirectionRef === 'T') { + angle = Math.PI / 180 * (GPS.GPSImgDirection.numerator / GPS.GPSImgDirection.denominator - 90); // "M" refers to "Magnetic north" + } else if (GPS.GPSImgDirectionRef === 'M') { + angle = Math.PI / 180 * (GPS.GPSImgDirection.numerator / GPS.GPSImgDirection.denominator - 90); + } else { + console.log('No compass data found'); + } + + console.log('Orientation:', GPS.Orientation); + /* If there is orientation data -- i.e. landscape/portrait etc */ + + if (GPS.Orientation === 6) { + // CCW + angle += Math.PI / 180 * -90; + } else if (GPS.Orientation === 8) { + // CW + angle += Math.PI / 180 * 90; + } else if (GPS.Orientation === 3) { + // 180 + angle += Math.PI / 180 * 180; + } + /* If there is altitude data */ + + + if (typeof GPS.GPSAltitude !== 'undefined' && typeof GPS.GPSAltitudeRef !== 'undefined') { + // Attempt to use GPS altitude: + // (may eventually need to find EXIF field of view for correction) + if (typeof GPS.GPSAltitude !== 'undefined' && typeof GPS.GPSAltitudeRef !== 'undefined') { + altitude = GPS.GPSAltitude.numerator / GPS.GPSAltitude.denominator + GPS.GPSAltitudeRef; + } else { + altitude = 0; // none + } + } + } else { + alert('EXIF initialized. Press again to view data in console.'); + } +}; + +/***/ }), + +/***/ "./src/edit/handles/DistortHandle.js": +/*!*******************************************!*\ + !*** ./src/edit/handles/DistortHandle.js ***! + \*******************************************/ +/***/ (function() { + +L.DistortHandle = L.EditHandle.extend({ + options: { + TYPE: 'distort', + icon: L.icon({ + iconUrl: // eslint-disable-next-line max-len + 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAChSURBVO3BIU4DURgGwNkvL2B6AkQTLBqP4QCoSm7DDXoBLBZHDbfgICAIZjEV3YTn9uVHdMZZtcnCfI13bIzxg0emg6Nm6QVbYz3jylEsXRrvwommb49X67jFkz80fR9Mb1YxTzqiWBSLYlEsikWxKBbFolgUi2JRLIpFsSgWxaJY03fHHOu40dH07bAzWCx9Ge/TiWbpHgdsjPGNB2f/yS+7xRCyiiZPJQAAAABJRU5ErkJggg==', + iconSize: [32, 32], + iconAnchor: [16, 16] + }) + }, + _onHandleDrag: function _onHandleDrag() { + var overlay = this._handled; + overlay.setCorner(this._corner, this.getLatLng()); + }, + updateHandle: function updateHandle() { + this.setLatLng(this._handled.getCorner(this._corner)); + } +}); + +L.distortHandle = function (overlay, idx, options) { + return new L.DistortHandle(overlay, idx, options); +}; + +/***/ }), + +/***/ "./src/edit/handles/DragHandle.js": +/*!****************************************!*\ + !*** ./src/edit/handles/DragHandle.js ***! + \****************************************/ +/***/ (function() { + +L.DragHandle = L.EditHandle.extend({ + options: { + TYPE: 'drag', + icon: L.icon({ + // eslint-disable-next-line max-len + iconUrl: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAsVJREFUeNrMVztLXEEUvnNVFAVBAhY2aRKbTZEHJNpYabuNjSgYg/GxdsmPSJkUAa/ZdVEX8mgWYVutbHxAHkVskjQBuUUgBISVhCQk3wnfwMlk1rusN1wHPubOzJlzvjlz5sxc01Ma/hUEwQnwDIjqc7uvgv9YYO86qgIwCXQbdNTlQ8kcCBHgBch8TcloF6oJGr6phk6EQAkfdz3zvgDr9Mr7Fg1fptEZoM8jsmrokpfsiIFO4IIjuE2v1EDmR4LRdlR5Gh51hj8D34ABtm8YTtqna0TgklIw5CgQguKxIojEjmFROg/MKQO27NkFAB+4wAPouGUJiIvWKHwbAxX2XyWRKWkqhT+pbJntJZJuUzISW0+5hW+obxrVBsfvoH/dqCCJuU97GBh2VteLSiYvArmErT8EVoAK9Bw7enbpVYmvAQlyowYforrH5jXL2rPHI/TKONDB7u9AlavdaTBPvPmazUeQuy8f7UomUgTEwIJPEQ3sQGE/6ll2l9H/KcEzBcfWn2IclluM3DpddJxSHujlFkscbUPvmB0LHVnLrId7nlaZVkEc6QGXQI1MAwZcWmVRHeNaQwJMMiU2cwy4s7p/RJ2ckpvIQs+cIs+5GzitloLKHUV3MPREuXbTOKO91dX387gGTONxIgEWm+E61FFrpcyqXLHsEwiDjEsjAksqw5XPoL9MHVrn6QR4q+XZrDaR4RoWzq2ymafuRA/Mq1stSsHLVkcbdf9VjOcx8ZH3+SFWcCWlVPyWuUBOwUWdC1wP5NVjYiXFWLO69PZ6CRTUY6KSIoEKdf6T3IzzgHxnsyHctNBEkmn6Oob8ExUDg/ahGybd177cDjzH5xHwgDiSvoS7I/LZyvxJZj0wod7tkX5G0XVC7rEyLhfLJjBGbKoLLEfZWObyKeZ6oY82g+yf5Zn/mJyHX7PMf04z/T3/LcAAu4E6iiyJqf0AAAAASUVORK5CYII=', + iconSize: [32, 32], + iconAnchor: [16, 16] + }) + }, + _onHandleDrag: function _onHandleDrag() { + var overlay = this._handled; + var formerLatLng = overlay.getCorner(this._corner); + var newLatLng = this.getLatLng(); + overlay.dragBy(formerLatLng, newLatLng); + }, + updateHandle: function updateHandle() { + this.setLatLng(this._handled.getCorner(this._corner)); + } +}); + +L.dragHandle = function (overlay, idx, options) { + return new L.DragHandle(overlay, idx, options); +}; + +/***/ }), + +/***/ "./src/edit/handles/EditHandle.js": +/*!****************************************!*\ + !*** ./src/edit/handles/EditHandle.js ***! + \****************************************/ +/***/ (function() { + +L.EditHandle = L.Marker.extend({ + initialize: function initialize(overlay, corner, options) { + var latlng = overlay.getCorner(corner); + L.setOptions(this, options); + this._handled = overlay; + this._corner = corner; + var markerOptions = { + draggable: true, + zIndexOffset: 10 + }; + + if (options && options.hasOwnProperty('draggable')) { + markerOptions.draggable = options.draggable; + } + + L.Marker.prototype.initialize.call(this, latlng, markerOptions); + }, + onAdd: function onAdd(map) { + L.Marker.prototype.onAdd.call(this, map); + + this._bindListeners(); + + this.updateHandle(); + }, + onRemove: function onRemove(map) { + this._unbindListeners(); + + L.Marker.prototype.onRemove.call(this, map); + }, + _onHandleDragStart: function _onHandleDragStart() { + this._handled.fire('editstart'); + }, + _onHandleDragEnd: function _onHandleDragEnd() { + this._fireEdit(); + }, + _fireEdit: function _fireEdit() { + this._handled.edited = true; + + this._handled.fire('edit'); + }, + _bindListeners: function _bindListeners() { + this.on({ + contextmenu: L.DomEvent.stop, + dragstart: this._onHandleDragStart, + drag: this._onHandleDrag, + dragend: this._onHandleDragEnd + }, this); + + this._handled._map.on('zoomend', this.updateHandle, this); + + this._handled.on('update', this.updateHandle, this); + }, + _unbindListeners: function _unbindListeners() { + this.off({ + contextmenu: L.DomEvent.stop, + dragstart: this._onHandleDragStart, + drag: this._onHandleDrag, + dragend: this._onHandleDragEnd + }, this); + + this._handled._map.off('zoomend', this.updateHandle, this); + + this._handled.off('update', this.updateHandle, this); + }, + + /* Takes two latlngs and calculates the scaling difference. */ + _calculateScalingFactor: function _calculateScalingFactor(latlngA, latlngB) { + var overlay = this._handled; + var map = overlay._map; + var centerPoint = map.latLngToLayerPoint(overlay.getCenter()); + var formerPoint = map.latLngToLayerPoint(latlngA); + var newPoint = map.latLngToLayerPoint(latlngB); + + var formerRadiusSquared = this._d2(centerPoint, formerPoint); + + var newRadiusSquared = this._d2(centerPoint, newPoint); + + return Math.sqrt(newRadiusSquared / formerRadiusSquared); + }, + + /* Distance between two points in cartesian space, squared (distance formula). */ + _d2: function _d2(a, b) { + var dx = a.x - b.x; + var dy = a.y - b.y; + return Math.pow(dx, 2) + Math.pow(dy, 2); + }, + + /* Takes two latlngs and calculates the angle between them. */ + calculateAngleDelta: function calculateAngleDelta(latlngA, latlngB) { + var overlay = this._handled; + var map = overlay._map; + var centerPoint = map.latLngToLayerPoint(overlay.getCenter()); + var formerPoint = map.latLngToLayerPoint(latlngA); + var newPoint = map.latLngToLayerPoint(latlngB); + var initialAngle = Math.atan2(centerPoint.y - formerPoint.y, centerPoint.x - formerPoint.x); + var newAngle = Math.atan2(centerPoint.y - newPoint.y, centerPoint.x - newPoint.x); + return newAngle - initialAngle; + } +}); + +/***/ }), + +/***/ "./src/edit/handles/FreeRotateHandle.js": +/*!**********************************************!*\ + !*** ./src/edit/handles/FreeRotateHandle.js ***! + \**********************************************/ +/***/ (function() { + +L.FreeRotateHandle = L.EditHandle.extend({ + options: { + TYPE: 'freeRotate', + icon: L.icon({ + iconUrl: // eslint-disable-next-line max-len + 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAHiSURBVMXBa3HbShgA0PMp/1sCCo8oCEpgTaCXgIXAJiDzyCJoAUTm4UVQAns1Y8+snWnTvJyeE16hkjDgDrfoNTMKcpC9UPiLSo8JyetkjEHxjPCMyoS199kFoz8Iv1HpMaN3qWDCHoegOKkkRwnJpRmroHgiPFEZ8IBekzEGxQtUEhKSS/fB7Ew4U+lxcGkVZG9QWWPSFAxBcdK59KApuA+yNwp2uEdx1GN25sZJZULSfAtm77SlbNjju6MvG75u+WHRWVR6rDVjMPsgwYyVZl3pLTpHkyYHOx8syMiayaJzlDTZ9YyaZNFVkiYH2ZUEBcVJJXVImuz6Js3Qofe59pq7DoOTILu+g+a288mCouk7/1iH4qTS+2QdDppbV1ZJmrnDXnPnc5UOs2Z0fUmTuyBr+krvSioJyUmQO0dZM7mepMkWnaNRkyrJB6uskTSjxY3Fll8bvmJwlDb83FJ8gMqAB80uyBY3Trb82PAfvjj6vuHnluIdKgMeNXOwctK5NKBoHitrb1RJeHRp5Ux4ojLg0aWMHGQvUOkxIWkKVsHsTPiNSo8HDC5lZIsgO6n0uMUdRvQuFQxB8UR4RmXC2vvsgtEfhL+o9JiQvE7GGBTPCK9QSUjoMWgKDthjDrIX+h/k0I7gth6N5gAAAABJRU5ErkJggg==', + iconSize: [32, 32], + iconAnchor: [16, 16] + }) + }, + _onHandleDrag: function _onHandleDrag() { + var overlay = this._handled; + var map = overlay._map; + var formerLatLng = overlay.getCorner(this._corner); + var newLatLng = this.getLatLng(); + var angle = this.calculateAngleDelta(formerLatLng, newLatLng); + + var scale = this._calculateScalingFactor(formerLatLng, newLatLng); + + if (angle !== 0) { + overlay.rotateBy(angle, 'rad'); + } + + var edgeMinWidth = overlay.edgeMinWidth; + + if (!edgeMinWidth) { + edgeMinWidth = 50; + } + /* just in case */ + + + var corner1 = map.latLngToContainerPoint(overlay.getCorner(0)); + var corner2 = map.latLngToContainerPoint(overlay.getCorner(1)); + var w = Math.abs(corner1.x - corner2.x); + var h = Math.abs(corner1.y - corner2.y); + var distance = Math.sqrt(w * w + h * h); + + if (distance > edgeMinWidth || scale > 1) { + overlay.scaleBy(scale); + } else { + overlay.scaleBy(1); + } + }, + updateHandle: function updateHandle() { + this.setLatLng(this._handled.getCorner(this._corner)); + } +}); + +L.freeRotateHandle = function (overlay, idx, options) { + return new L.FreeRotateHandle(overlay, idx, options); +}; + +/***/ }), + +/***/ "./src/edit/handles/LockHandle.js": +/*!****************************************!*\ + !*** ./src/edit/handles/LockHandle.js ***! + \****************************************/ +/***/ (function() { + +L.LockHandle = L.EditHandle.extend({ + options: { + TYPE: 'lock', + interactive: false, + icon: L.icon({ + // eslint-disable-next-line max-len + iconUrl: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAD8SURBVO3BPU7CYAAA0AdfjIcQlRCQBG7C3gk2uIPG2RC3Dk16Gz0FTO1WZs/gwGCMP/2+xsSl7+n1er1Iz9LtRQjaPeMeO+TinLDCJV78YqjdA04YodKuxhUaPGoRxMmxwRQZSt87Yo4KExGCeAUyLLFB4bMacxywEClIU2KDKXbInTUYo8JCgoFuGoxQO5uiwY1EA91VmDqrcKeDoX8WdNNgjApvmGGLXKIgXY0xGkxQYItrrFFIEKQ5Yo4KEx9yrDFDhlKkIF6NOQ5Y+KpAhiXWKEQI4pxwiwoLPyuxwQw75FoE7fZYocFEuwI7jHCBV39gL92TXq/Xi/AOcmczZmaIMScAAAAASUVORK5CYII=', + iconSize: [32, 32], + iconAnchor: [16, 16] + }) + }, + onRemove: function onRemove(map) { + this.unbindTooltip(); + L.EditHandle.prototype.onRemove.call(this, map); + }, + _bindListeners: function _bindListeners() { + var icon = this.getElement(); + + L.EditHandle.prototype._bindListeners.call(this); + + L.DomEvent.on(icon, { + mousedown: this._tooltipOn, + mouseup: this._tooltipOff + }, this); + L.DomEvent.on(document, 'pointerleave', this._tooltipOff, this); + }, + _unbindListeners: function _unbindListeners() { + var icon = this.getElement(); + + L.EditHandle.prototype._bindListeners.call(this); + + L.DomEvent.off(icon, { + mousedown: this._tooltipOn, + mouseup: this._tooltipOff + }, this); + L.DomEvent.off(document, 'pointerleave', this._tooltipOff, this); + }, + + /* cannot be dragged */ + _onHandleDrag: function _onHandleDrag() {}, + updateHandle: function updateHandle() { + this.setLatLng(this._handled.getCorner(this._corner)); + }, + _tooltipOn: function _tooltipOn(e) { + var eP = this._handled.parentGroup; + var edit = eP ? eP.editing : this._handled.editing; + + if (e.shiftKey) { + return; + } + + if (!this._handled.isSelected() && eP && !eP.isCollected(this._handled)) { + return; + } + + var handlesArr = edit._lockHandles; + this._timer = setTimeout(L.bind(function () { + if (this._timeout) { + clearTimeout(this._timeout); + } + + if (!this.getTooltip()) { + this.bindTooltip('Locked!', { + permanent: true + }); + } else { + handlesArr.eachLayer(function (handle) { + if (this !== handle) { + handle.closeTooltip(); + } + }); + } + + this.openTooltip(); + }, this), 500); + }, + _tooltipOff: function _tooltipOff(e) { + var eP = this._handled.parentGroup; + var edit = eP ? eP.editing : this._handled.editing; + + if (e.shiftKey) { + return; + } + + if (!this._handled.isSelected() && eP && !eP.isCollected(this._handled)) { + return; + } + + var handlesArr = edit._lockHandles; + + if (e.currentTarget === document) { + handlesArr.eachLayer(function (handle) { + handle.closeTooltip(); + }); + } + + if (this._timer) { + clearTimeout(this._timer); + } + + this._timeout = setTimeout(L.bind(function () { + this.closeTooltip(); + }, this), 400); + } +}); + +L.lockHandle = function (overlay, idx, options) { + return new L.LockHandle(overlay, idx, options); +}; + +/***/ }), + +/***/ "./src/edit/handles/RotateHandle.js": +/*!******************************************!*\ + !*** ./src/edit/handles/RotateHandle.js ***! + \******************************************/ +/***/ (function() { + +L.RotateHandle = L.EditHandle.extend({ + options: { + TYPE: 'rotate', + icon: L.icon({ + iconUrl: // eslint-disable-next-line max-len + 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAHiSURBVMXBa3HbShgA0PMp/1sCCo8oCEpgTaCXgIXAJiDzyCJoAUTm4UVQAns1Y8+snWnTvJyeE16hkjDgDrfoNTMKcpC9UPiLSo8JyetkjEHxjPCMyoS199kFoz8Iv1HpMaN3qWDCHoegOKkkRwnJpRmroHgiPFEZ8IBekzEGxQtUEhKSS/fB7Ew4U+lxcGkVZG9QWWPSFAxBcdK59KApuA+yNwp2uEdx1GN25sZJZULSfAtm77SlbNjju6MvG75u+WHRWVR6rDVjMPsgwYyVZl3pLTpHkyYHOx8syMiayaJzlDTZ9YyaZNFVkiYH2ZUEBcVJJXVImuz6Js3Qofe59pq7DoOTILu+g+a288mCouk7/1iH4qTS+2QdDppbV1ZJmrnDXnPnc5UOs2Z0fUmTuyBr+krvSioJyUmQO0dZM7mepMkWnaNRkyrJB6uskTSjxY3Fll8bvmJwlDb83FJ8gMqAB80uyBY3Trb82PAfvjj6vuHnluIdKgMeNXOwctK5NKBoHitrb1RJeHRp5Ux4ojLg0aWMHGQvUOkxIWkKVsHsTPiNSo8HDC5lZIsgO6n0uMUdRvQuFQxB8UR4RmXC2vvsgtEfhL+o9JiQvE7GGBTPCK9QSUjoMWgKDthjDrIX+h/k0I7gth6N5gAAAABJRU5ErkJggg==', + iconSize: [32, 32], + iconAnchor: [16, 16] + }) + }, + _onHandleDrag: function _onHandleDrag() { + var overlay = this._handled; + var formerLatLng = overlay.getCorner(this._corner); + var newLatLng = this.getLatLng(); + var angle = this.calculateAngleDelta(formerLatLng, newLatLng); + /* + * running rotation logic even for an angle delta of 0 + * prevents a small, occasional marker flicker + */ + + overlay.rotateBy(angle, 'rad'); + }, + updateHandle: function updateHandle() { + this.setLatLng(this._handled.getCorner(this._corner)); + } +}); + +L.rotateHandle = function (overlay, idx, options) { + return new L.RotateHandle(overlay, idx, options); +}; + +/***/ }), + +/***/ "./src/edit/handles/ScaleHandle.js": +/*!*****************************************!*\ + !*** ./src/edit/handles/ScaleHandle.js ***! + \*****************************************/ +/***/ (function() { + +L.ScaleHandle = L.EditHandle.extend({ + options: { + TYPE: 'scale', + icon: L.icon({ + iconUrl: // eslint-disable-next-line max-len + 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2ZXJzaW9uPSIxLjEiIHdpZHRoPSI0NTkiIGhlaWdodD0iNDY0IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCA1MTIgNTEyIiB4bWw6c3BhY2U9InByZXNlcnZlIiBzdHlsZT0iIj48cmVjdCBpZD0iYmFja2dyb3VuZHJlY3QiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIHg9IjAiIHk9IjAiIGZpbGw9Im5vbmUiIHN0cm9rZT0ibm9uZSIgY2xhc3M9IiIgc3R5bGU9IiIvPjxnIGNsYXNzPSJjdXJyZW50TGF5ZXIiIHN0eWxlPSIiPjx0aXRsZT5MYXllciAxPC90aXRsZT48cGF0aCBkPSJNNDU5LjA0OTE1OTUzMDQ3MTM0LDg2LjkyNjIzNDUxMjU1MDAyIFYwIGgtODUuNzE0NTczMzU2MzEyMDkgdjI3LjA0MzcxNzQwMzkwNDQ1MiBIODUuNzE0NTczMzU2MzEyMDMgVjAgSDAgdjg2LjkyNjIzNDUxMjU1MDAyIGgyNS43MTQzNzIwMDY4OTM2MjYgdjI4OS43NTQxMTUwNDE4MzM0IEgwIHY4Ni45MjYyMzQ1MTI1NTAwMiBoODUuNzE0NTczMzU2MzEyMDkgdi0yNy4wNDM3MTc0MDM5MDQ0NTIgaDI4NS43MTUyNDQ1MjEwNDAzIHYyNy4wNDM3MTc0MDM5MDQ0NTIgaDg1LjcxNDU3MzM1NjMxMjA5IHYtODYuOTI2MjM0NTEyNTUwMDIgaC0yMy44MDk2MDM3MTAwODY2OSBWODYuOTI2MjM0NTEyNTUwMDIgSDQ1OS4wNDkxNTk1MzA0NzEzNCB6TTM4NC43NjMxOTU5NTUwMDA5LDEyLjU1NjAxMTY1MTgxMjc4MSBoNjEuOTA0OTY5NjQ2MjI1Mzk2IHY2Mi43ODAwNTgyNTkwNjM5MSBoLTYxLjkwNDk2OTY0NjIyNTM5NiBWMTIuNTU2MDExNjUxODEyNzgxIHpNMTIuMzgwOTkzOTI5MjQ1MDUsMTIuNTU2MDExNjUxODEyNzgxIGg2MS45MDQ5Njk2NDYyMjUzOTYgdjYyLjc4MDA1ODI1OTA2MzkxIEgxMi4zODA5OTM5MjkyNDUwNSBWMTIuNTU2MDExNjUxODEyNzgxIHpNNzQuMjg1OTYzNTc1NDcwNTMsNDUxLjA1MDU3MjQxNTEyMDY2IEgxMi4zODA5OTM5MjkyNDUwNSB2LTYyLjc4MDA1ODI1OTA2MzkxIGg2MS45MDQ5Njk2NDYyMjUzOTYgVjQ1MS4wNTA1NzI0MTUxMjA2NiB6TTQ0NS43MTU3ODE0NTI4MjI3NCw0NTEuMDUwNTcyNDE1MTIwNjYgaC02Mi44NTczNTM3OTQ2Mjg4NjQgdi02Mi43ODAwNTgyNTkwNjM5MSBoNjIuODU3MzUzNzk0NjI4ODY0IFY0NTEuMDUwNTcyNDE1MTIwNjYgek00MDcuNjIwNDE1NTE2Njg0MjYsMzc2LjY4MDM0OTU1NDM4MzQ0IGgtMzYuMTkwNTk3NjM5MzMxNzcgdjMyLjgzODc5OTcwNDc0MTEyIEg4NS43MTQ1NzMzNTYzMTIwMyB2LTMyLjgzODc5OTcwNDc0MTEyIEg0OS41MjM5NzU3MTY5ODAzMiBWODYuOTI2MjM0NTEyNTUwMDIgaDM2LjE5MDU5NzYzOTMzMTc3IFY1MC4yMjQwNDY2MDcyNTExMjUgaDI4Ny42MjAwMTI4MTc4NDcyIHYzNi43MDIxODc5MDUyOTg5IGgzNC4yODU4MjkzNDI1MjQ4MzUgVjM3Ni42ODAzNDk1NTQzODM0NCB6IiBpZD0ic3ZnXzIiIGNsYXNzPSIiIGZpbGw9IiMxYTFhZWIiIGZpbGwtb3BhY2l0eT0iMSIvPjwvZz48L3N2Zz4=', + iconSize: [32, 32], + iconAnchor: [16, 16] + }) + }, + _onHandleDrag: function _onHandleDrag() { + var overlay = this._handled; + var map = overlay._map; + var edgeMinWidth = overlay.edgeMinWidth; + var formerLatLng = overlay.getCorner(this._corner); + var newLatLng = this.getLatLng(); + + var scale = this._calculateScalingFactor(formerLatLng, newLatLng); + /* + * checks whether the "edgeMinWidth" property is set and tracks the minimum edge length; + * this enables preventing scaling to zero, but we might also add an overall scale limit + */ + + + if (!edgeMinWidth) { + edgeMinWidth = 50; + } + /* just in case */ + + + var corner1 = map.latLngToLayerPoint(overlay.getCorner(0)); + var corner2 = map.latLngToLayerPoint(overlay.getCorner(1)); + var w = Math.abs(corner1.x - corner2.x); + var h = Math.abs(corner1.y - corner2.y); + var distance = Math.sqrt(w * w + h * h); + + if (distance > edgeMinWidth || scale > 1) { + overlay.scaleBy(scale); + /* + * running scale logic even for a scale ratio of 1 + * prevents a small, occasional marker flicker + */ + } else { + overlay.scaleBy(1); + } + }, + updateHandle: function updateHandle() { + this.setLatLng(this._handled.getCorner(this._corner)); + } +}); + +L.scaleHandle = function (overlay, idx, options) { + return new L.ScaleHandle(overlay, idx, options); +}; + +/***/ }), + +/***/ "./src/edit/toolbars/DistortableImage.ControlBar.js": +/*!**********************************************************!*\ + !*** ./src/edit/toolbars/DistortableImage.ControlBar.js ***! + \**********************************************************/ +/***/ (function() { + +L.distortableImage = L.DistortableImage || {}; +L.distortableImage = L.DistortableImage; +L.DistortableImage.group_action_map = {}; +L.DistortableImage.ControlBar = L.Toolbar2.Control.extend({}); + +L.distortableImage.controlBar = function (options) { + return new L.DistortableImage.ControlBar(options); +}; +/** addInitHooks run before onAdd */ + + +L.DistortableCollection.addInitHook(function () { + /** Default actions */ + this.ACTIONS = [L.ExportAction, L.DeleteAction, L.LockAction, L.UnlockAction]; // all possible modes + + L.DistortableCollection.Edit.MODES = { + lock: L.LockAction, + unlock: L.UnlockAction + }; + var a = this.options.actions ? this.options.actions : this.ACTIONS; + this.editing = L.distortableCollection.edit(this, { + actions: a + }); +}); + +/***/ }), + +/***/ "./src/edit/toolbars/DistortableImage.PopupBar.js": +/*!********************************************************!*\ + !*** ./src/edit/toolbars/DistortableImage.PopupBar.js ***! + \********************************************************/ +/***/ (function() { + +L.DistortableImage = L.DistortableImage || {}; +L.distortableImage = L.DistortableImage; +L.DistortableImage.action_map = {}; +L.DistortableImage.PopupBar = L.Toolbar2.Popup.extend({ + options: { + anchor: [0, -10] + }, + initialize: function initialize(latlng, options) { + L.setOptions(this, options); + L.Toolbar2.Popup.prototype.initialize.call(this, latlng, options); + }, + addHooks: function addHooks(map, ov) { + this.map = map; + this.ov = ov; + }, + tools: function tools() { + if (this._ul) { + return this._ul.children; + } + }, + clickTool: function clickTool(name) { + var tools = this.tools(); + + for (var i = 0; i < tools.length; i++) { + var tool = tools.item(i).children[0]; + + if (L.DomUtil.hasClass(tool, name)) { + tool.click(); + return tool; + } + } + + return false; + } +}); + +L.distortableImage.popupBar = function (latlng, options) { + return new L.DistortableImage.PopupBar(latlng, options); +}; + +L.DistortableImageOverlay.addInitHook(function () { + /** Default actions */ + this.ACTIONS = [L.DragAction, L.ScaleAction, L.DistortAction, L.RotateAction, L.FreeRotateAction, L.LockAction, L.OpacityAction, L.BorderAction, L.ExportAction, L.DeleteAction]; // all possible modes + + L.DistortableImage.Edit.MODES = { + drag: L.DragAction, + scale: L.ScaleAction, + distort: L.DistortAction, + rotate: L.RotateAction, + freeRotate: L.FreeRotateAction, + lock: L.LockAction + }; + var a = this.options.actions ? this.options.actions : this.ACTIONS; + this.editing = L.distortableImage.edit(this, { + actions: a + }); +}); + +/***/ }), + +/***/ "./src/iconsets/IconSet.js": +/*!*********************************!*\ + !*** ./src/iconsets/IconSet.js ***! + \*********************************/ +/***/ (function() { + +/* this is the baseclass other IconSets inherit from, +* we don't use it directly */ +L.IconSet = L.Class.extend({ + _svg: '', + _symbols: '', + render: function render() { + this.addSymbols(this._symbols); + return this._svg; + }, + addSymbols: function addSymbols(symbols) { + this._svg += symbols; + } +}); + +/***/ }), + +/***/ "./src/iconsets/KeymapperIconSet.js": +/*!******************************************!*\ + !*** ./src/iconsets/KeymapperIconSet.js ***! + \******************************************/ +/***/ (function() { + +L.KeymapperIconSet = L.IconSet.extend({ + _symbols: // eslint-disable-next-line max-len + '' +}); + +/***/ }), + +/***/ "./src/iconsets/ToolbarIconSet.js": +/*!****************************************!*\ + !*** ./src/iconsets/ToolbarIconSet.js ***! + \****************************************/ +/***/ (function() { + +/* eslint-disable max-len */ +L.ToolbarIconSet = L.IconSet.extend({ + _symbols: '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' +}); + +/***/ }), + +/***/ "./src/mapmixins/BoxCollector.js": +/*!***************************************!*\ + !*** ./src/mapmixins/BoxCollector.js ***! + \***************************************/ +/***/ (function() { + +L.Map.mergeOptions({ + boxCollector: true, + boxZoom: false +}); +/** + * primarily Leaflet 1.5.1 source code. Overriden so that it's a collection box used with + * our `L.DistortableCollection` class instead of a zoom box. + * */ + +L.Map.BoxCollector = L.Map.BoxZoom.extend({ + initialize: function initialize(map) { + this._map = map; + this._container = map._container; + this._pane = map._panes.overlayPane; + this._resetStateTimeout = 0; + map.on('unload', this._destroy, this); + }, + addHooks: function addHooks() { + L.DomEvent.on(this._container, 'mousedown', this._onMouseDown, this); + }, + removeHooks: function removeHooks() { + L.DomEvent.off(this._container, 'mousedown', this._onMouseDown, this); + }, + moved: function moved() { + return this._moved; + }, + _destroy: function _destroy() { + L.DomUtil.remove(this._pane); + delete this._pane; + }, + _resetState: function _resetState() { + this._resetStateTimeout = 0; + this._moved = false; + }, + _clearDeferredResetState: function _clearDeferredResetState() { + if (this._resetStateTimeout !== 0) { + clearTimeout(this._resetStateTimeout); + this._resetStateTimeout = 0; + } + }, + _onMouseDown: function _onMouseDown(e) { + if (!e.shiftKey || e.which !== 1 && e.button !== 1) { + return false; + } // Clear the deferred resetState if it hasn't executed yet, otherwise it + // will interrupt the interaction and orphan a box element in the container. + + + this._clearDeferredResetState(); + + this._resetState(); + + L.DomUtil.disableTextSelection(); + L.DomUtil.disableImageDrag(); + this._startPoint = this._map.mouseEventToContainerPoint(e); + L.DomEvent.on(document, { + contextmenu: L.DomEvent.stop, + mousemove: this._onMouseMove, + mouseup: this._onMouseUp + }, this); + }, + _onMouseMove: function _onMouseMove(e) { + if (!this._moved) { + this._moved = true; + this._box = L.DomUtil.create('div', 'leaflet-zoom-box', this._container); + L.DomUtil.addClass(this._container, 'leaflet-crosshair'); + + this._map.fire('boxzoomstart'); + } + + this._point = this._map.mouseEventToContainerPoint(e); + this._bounds = L.bounds(this._startPoint, this._point); + + var size = this._bounds.getSize(); + + L.DomUtil.setPosition(this._box, this._bounds.min); + this._box.style.width = size.x + 'px'; + this._box.style.height = size.y + 'px'; + }, + _finish: function _finish() { + if (this._moved) { + L.DomUtil.remove(this._box); + L.DomUtil.removeClass(this._container, 'leaflet-crosshair'); + } + + L.DomUtil.enableTextSelection(); + L.DomUtil.enableImageDrag(); + L.DomEvent.off(document, { + contextmenu: L.DomEvent.stop, + mousemove: this._onMouseMove, + mouseup: this._onMouseUp + }, this); + }, + _onMouseUp: function _onMouseUp(e) { + if (e.which !== 1 && e.button !== 1) { + return; + } + + this._finish(); + + if (!this._moved) { + return; + } // Postpone to next JS tick so internal click event handling + // still see it as "moved". + + + this._clearDeferredResetState(); + + this._resetStateTimeout = setTimeout(L.Util.bind(this._resetState, this), 0); + var bounds = L.latLngBounds(this._map.containerPointToLatLng(this._bounds.getBottomLeft()), this._map.containerPointToLatLng(this._bounds.getTopRight())); + + var zoom = this._map.getZoom(); + + var center = this._map.getCenter(); // calls the `project` method but 1st updates the pixel origin - see https://github.com/publiclab/Leaflet.DistortableImage/pull/344 + + + bounds = this._map._latLngBoundsToNewLayerBounds(bounds, zoom, center); + + this._map.fire('boxcollectend', { + boxCollectBounds: bounds + }); + } +}); +L.Map.addInitHook('addHandler', 'boxCollector', L.Map.BoxCollector); + +/***/ }), + +/***/ "./src/mapmixins/DoubleClickLabels.js": +/*!********************************************!*\ + !*** ./src/mapmixins/DoubleClickLabels.js ***! + \********************************************/ +/***/ (function() { + +L.Map.mergeOptions({ + doubleClickLabels: true +}); +/** + * The `doubleClickLabels` handler replaces `doubleClickZoom` by default if `#addGoogleMutant` + * is used unless the options 'labels: false' or 'doubleClickZoom: false` were passed to it. + */ + +L.Map.DoubleClickLabels = L.Map.DoubleClickZoom.extend({ + enable: function enable() { + var map = this._map; + + if (this._enabled) { + return this; + } // disable 'doubleClickZoom' if 'doubleClickLabels' is enabled. + + + if (map.doubleClickZoom.enabled()) { + map.doubleClickZoom.disable(); + } + + this._map.fire('singleclickon'); + + this._enabled = true; + this.addHooks(); + return this; + }, + disable: function disable() { + if (!this._enabled) { + return this; + } + + this._enabled = false; + this.removeHooks(); + return this; + }, + _fireIfSingle: function _fireIfSingle(e) { + var map = this._map; + var oe = e.originalEvent; // prevents deselection in case of box selector + + if (oe && oe.shiftKey) { + return; + } + + map._clicked += 1; + this._map._clickTimeout = setTimeout(function () { + if (map._clicked === 1) { + map._clicked = 0; + map.fire('singleclick', { + type: 'singleclick' + }); + } else { + // manually fire doubleclick event only for touch screens that don't natively fire it + if (L.Browser.touch && oe && oe.sourceCapabilities.firesTouchEvents) { + map.fire('dblclick'); + } + } + }, 250); + }, + _onDoubleClick: function _onDoubleClick() { + var map = this._map; + var labels = map._labels; + setTimeout(function () { + map._clicked = 0; + clearTimeout(map._clickTimeout); + }, 0); + + if (!labels) { + return; + } + + if (labels.options.opacity === 1) { + labels.options.opacity = 0; + labels.setOpacity(0); + } else { + labels.options.opacity = 1; + labels.setOpacity(1); + } + } +}); +L.Map.addInitHook('addHandler', 'doubleClickLabels', L.Map.DoubleClickLabels); + +/***/ }), + +/***/ "./src/mapmixins/DoubleClickZoom.js": +/*!******************************************!*\ + !*** ./src/mapmixins/DoubleClickZoom.js ***! + \******************************************/ +/***/ (function() { + +/** + * `L.Map.DoubleClickZoom` from leaflet 1.5.1, overrwritten so that it + * 1) Fires a `singleclick` event to avoid deselecting images on `dblclick`. + * 2) Maintains a mutually exclusive relationship with the map's `DoubleClickLabels` handler + */ +L.Map.DoubleClickZoom.include({ + addHooks: function addHooks() { + this._map.on({ + click: this._fireIfSingle, + dblclick: this._onDoubleClick + }, this); + }, + removeHooks: function removeHooks() { + this._map.off({ + click: this._fireIfSingle, + dblclick: this._onDoubleClick + }, this); + }, + enable: function enable() { + if (this._enabled) { + return this; + } // don't enable 'doubleClickZoom' unless 'doubleClickLabels' is disabled first + + + if (this._map.doubleClickLabels) { + if (this._map.doubleClickLabels.enabled()) { + return this; + } + } // signify to collection/instance classes to turn on 'singleclick' listeners + + + this._map.fire('singleclickon'); + + this._enabled = true; + this.addHooks(); + return this; + }, + disable: function disable() { + if (!this._enabled) { + return this; + } // signify to collection/instance safe to swap 'singleclick' listeners with 'click' listeners. + + + this._map.fire('singleclickoff'); + + this._enabled = false; + this.removeHooks(); + return this; + }, + _fireIfSingle: function _fireIfSingle(e) { + var map = this._map; + var oe = e.originalEvent; // prevents deselection in case of box selector + + if (oe && oe.shiftKey) { + return; + } + + map._clicked += 1; + this._map._clickTimeout = setTimeout(function () { + if (map._clicked === 1) { + map._clicked = 0; + map.fire('singleclick', { + type: 'singleclick' + }); + } else { + // manually fire doubleclick event only for touch screens that don't natively fire it + if (L.Browser.touch && oe && oe.sourceCapabilities.firesTouchEvents) { + /* in `DoubleClickLabels.js`, we just do map.fire('dblclick') bc `_onDoublClick` doesn't use the + passed "e" (for now). To generate a 'real' DOM event that will have all of its corresponding core + properties (originalEvent, latlng, etc.), use Leaflet's `#map._fireDOMEvent` (Leaflet 1.5.1 source) */ + map._fireDOMEvent(oe, 'dblclick', [map]); + } + } + }, 250); + }, + _onDoubleClick: function _onDoubleClick(e) { + var map = this._map; + var oe = e.originalEvent; + setTimeout(function () { + map._clicked = 0; + clearTimeout(map._clickTimeout); + }, 0); + + if (!oe) { + return false; + } + + var oldZoom = map.getZoom(); + var delta = map.options.zoomDelta; + var zoom = oe.shiftKey ? oldZoom - delta : oldZoom + delta; + + if (map.options.doubleClickZoom === 'center') { + map.setZoom(zoom); + } else { + map.setZoomAround(e.containerPoint, zoom); + } + } +}); + +/***/ }), + +/***/ "./src/mapmixins/MapMixins.js": +/*!************************************!*\ + !*** ./src/mapmixins/MapMixins.js ***! + \************************************/ +/***/ (function() { + +/* eslint-disable max-len */ +L.Map.include({ + _clicked: 0, + addGoogleMutant: function addGoogleMutant(opts) { + var url = 'http://mt0.google.com/vt/lyrs=s&x={x}&y={y}&z={z}'; + opts = this.mutantOptions = L.extend({ + mutantOpacity: 0.8, + maxZoom: 24, + maxNativeZoom: 20, + minZoom: 0, + labels: true, + labelOpacity: 1, + doubleClickLabels: true + }, opts); + + if (!opts.labels) { + this.mutantOptions = L.extend(this.mutantOptions, { + labelOpacity: opts.labels ? 1 : undefined, + doubleClickLabels: opts.labels ? true : undefined + }); + } + + this._googleMutant = L.tileLayer(url, { + maxZoom: opts.maxZoom, + maxNativeZoom: opts.maxNativeZoom, + minZoom: opts.minZoom, + opacity: opts.mutantOpacity + }).addTo(this); + + if (opts.labels) { + this._addLabels(opts); + } // shouldn't have this handler at all if there are no labels to toggle + else { + this.doubleClickLabels = undefined; + } + + return this; + }, + _addLabels: function _addLabels(opts) { + var url = 'https://stamen-tiles-{s}.a.ssl.fastly.net/toner-labels/{z}/{x}/{y}{r}.{ext}'; + + if (opts.labelOpacity !== 0 && opts.labelOpacity !== 1) { + opts.labelOpacity = 1; + } + + this._labels = L.tileLayer(url, { + attribution: 'Map tiles by Stamen Design, CC BY 3.0 — Map data © OpenStreetMap contributors', + subdomains: 'abcd', + interactive: false, + opacity: opts.labelOpacity, + maxZoom: opts.maxZoom, + maxNativeZoom: opts.maxNativeZoom, + minZoom: opts.minZoom, + ext: 'png' + }).addTo(this); + + if (this.mutantOptions.doubleClickLabels) { + this.doubleClickLabels.enable(); + } + + return this; + } +}); // start off with doubleClickZoom enabled, doubleClickLabels can later be enabled instead +// during initialization + +L.Map.addInitHook(function () { + this.doubleClickLabels.disable(); + this.doubleClickZoom.enable(); +}); + +/***/ }), + +/***/ "./src/util/DomUtil.js": +/*!*****************************!*\ + !*** ./src/util/DomUtil.js ***! + \*****************************/ +/***/ (function() { + +L.DomUtil = L.extend(L.DomUtil, { + initTranslation: function initTranslation(obj) { + this.translation = obj; + }, + getMatrixString: function getMatrixString(m) { + var is3d = L.Browser.webkit3d || L.Browser.gecko3d || L.Browser.ie3d; + /* + * Since matrix3d takes a 4*4 matrix, we add in an empty row and column, + * which act as the identity on the z-axis. + * See: + * http://franklinta.com/2014/09/08/computing-css-matrix3d-transforms/ + * https://developer.mozilla.org/en-US/docs/Web/CSS/transform-function#M.C3.B6bius'_homogeneous_coordinates_in_projective_geometry + */ + + var matrix = [m[0], m[3], 0, m[6], m[1], m[4], 0, m[7], 0, 0, 1, 0, m[2], m[5], 0, m[8]]; + var str = is3d ? 'matrix3d(' + matrix.join(',') + ')' : ''; + + if (!is3d) { + console.log('Your browser must support 3D CSS transforms' + 'in order to use DistortableImageOverlay.'); + } + + return str; + }, + toggleClass: function toggleClass(el, className) { + var c = className; + return this.hasClass(el, c) ? this.removeClass(el, c) : this.addClass(el, c); + }, + confirmDelete: function confirmDelete() { + return window.confirm(this.translation.confirmImageDelete); + }, + confirmDeletes: function confirmDeletes(n) { + if (n === 1) { + return this.confirmDelete(); + } + + var translation = this.translation.confirmImagesDeletes; + var warningMsg = ''; + + if (typeof translation === 'function') { + warningMsg = translation(n); + } else { + warningMsg = translation; + } + + return window.confirm(warningMsg); + } +}); + +/***/ }), + +/***/ "./src/util/IconUtil.js": +/*!******************************!*\ + !*** ./src/util/IconUtil.js ***! + \******************************/ +/***/ (function() { + +L.IconUtil = { + /* creates an svg elemenet with built in accessibility properties + * and standardized classes for styling, takes in the fragment + * identifier (id) of the symbol to reference. note for symplicity + * we allow providing the icon target with or without the '#' prefix + */ + create: function create(ref) { + if (/^#/.test(ref)) { + ref = ref.replace(/^#/, ''); + } + + return '' + '' + ''; + }, + addClassToSvg: function addClassToSvg(container, loader) { + var svg = container.querySelector('svg'); + + if (svg) { + L.DomUtil.addClass(svg, loader); + } + }, + // finds the use element and toggles its icon reference + toggleXlink: function toggleXlink(container, ref1, ref2) { + if (!/^#/.test(ref1)) { + ref1 = '#' + ref1; + } + + if (!/^#/.test(ref2)) { + ref2 = '#' + ref2; + } + + var use = container.querySelector('use'); + + if (use) { + var toggled = use.getAttribute('xlink:href') === ref1 ? ref2 : ref1; + use.setAttribute('xlink:href', toggled); + return toggled; + } + + return false; + }, + toggleTitle: function toggleTitle(container, title1, title2) { + var toggled = container.getAttribute('title') === title1 ? title2 : title1; + container.setAttribute('title', toggled); + + if (container.hasAttribute('aria-label')) { + container.setAttribute('aria-label', toggled); + } + + return toggled; + } +}; + +/***/ }), + +/***/ "./src/util/ImageUtil.js": +/*!*******************************!*\ + !*** ./src/util/ImageUtil.js ***! + \*******************************/ +/***/ (function() { + +L.ImageUtil = { + getCmPerPixel: function getCmPerPixel(overlay) { + var map = overlay._map; + var dist = map.latLngToLayerPoint(overlay.getCorner(0)).distanceTo(map.latLngToLayerPoint(overlay.getCorner(1))); + return dist * 100 / overlay.getElement().width; + } +}; + +/***/ }), + +/***/ "./src/util/MatrixUtil.js": +/*!********************************!*\ + !*** ./src/util/MatrixUtil.js ***! + \********************************/ +/***/ (function() { + +L.MatrixUtil = { + // Compute the adjugate of m + adj: function adj(m) { + return [m[4] * m[8] - m[5] * m[7], m[2] * m[7] - m[1] * m[8], m[1] * m[5] - m[2] * m[4], m[5] * m[6] - m[3] * m[8], m[0] * m[8] - m[2] * m[6], m[2] * m[3] - m[0] * m[5], m[3] * m[7] - m[4] * m[6], m[1] * m[6] - m[0] * m[7], m[0] * m[4] - m[1] * m[3]]; + }, + // multiply two 3*3 matrices + multmm: function multmm(a, b) { + var c = []; + var i; + + for (i = 0; i < 3; i++) { + for (var j = 0; j < 3; j++) { + var cij = 0; + + for (var k = 0; k < 3; k++) { + cij += a[3 * i + k] * b[3 * k + j]; + } + + c[3 * i + j] = cij; + } + } + + return c; + }, + // multiply a 3*3 matrix and a 3-vector + multmv: function multmv(m, v) { + return [m[0] * v[0] + m[1] * v[1] + m[2] * v[2], m[3] * v[0] + m[4] * v[1] + m[5] * v[2], m[6] * v[0] + m[7] * v[1] + m[8] * v[2]]; + }, + // multiply a scalar and a 3*3 matrix + multsm: function multsm(s, m) { + var matrix = []; + + for (var i = 0, l = m.length; i < l; i++) { + matrix.push(s * m[i]); + } + + return matrix; + }, + basisToPoints: function basisToPoints(x1, y1, x2, y2, x3, y3, x4, y4) { + var m = [x1, x2, x3, y1, y2, y3, 1, 1, 1]; + var v = L.MatrixUtil.multmv(L.MatrixUtil.adj(m), [x4, y4, 1]); + return L.MatrixUtil.multmm(m, [v[0], 0, 0, 0, v[1], 0, 0, 0, v[2]]); + }, + project: function project(m, x, y) { + var v = L.MatrixUtil.multmv(m, [x, y, 1]); + return [v[0] / v[2], v[1] / v[2]]; + }, + general2DProjection: function general2DProjection(x1s, y1s, x1d, y1d, x2s, y2s, x2d, y2d, x3s, y3s, x3d, y3d, x4s, y4s, x4d, y4d) { + var s = L.MatrixUtil.basisToPoints(x1s, y1s, x2s, y2s, x3s, y3s, x4s, y4s); + var d = L.MatrixUtil.basisToPoints(x1d, y1d, x2d, y2d, x3d, y3d, x4d, y4d); + var m = L.MatrixUtil.multmm(d, L.MatrixUtil.adj(s)); // Normalize to the unique matrix with m[8] == 1. + // See: http://franklinta.com/2014/09/08/computing-css-matrix3d-transforms/ + + return L.MatrixUtil.multsm(1 / m[8], m); + } +}; + +/***/ }), + +/***/ "./src/util/TrigUtil.js": +/*!******************************!*\ + !*** ./src/util/TrigUtil.js ***! + \******************************/ +/***/ (function() { + +L.TrigUtil = { + calcAngle: function calcAngle(x, y) { + var unit = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'deg'; + return unit === 'deg' ? this.radiansToDegrees(Math.atan2(y, x)) : Math.atan2(y, x); + }, + radiansToDegrees: function radiansToDegrees(angle) { + return angle * 180 / Math.PI; + }, + degreesToRadians: function degreesToRadians(angle) { + return angle * Math.PI / 180; + } +}; + +/***/ }), + +/***/ "./src/util/Utils.js": +/*!***************************!*\ + !*** ./src/util/Utils.js ***! + \***************************/ +/***/ (function() { + +L.Utils = { + initTranslation: function initTranslation() { + var translation = { + deleteImage: 'Delete Image', + deleteImages: 'Delete Images', + distortImage: 'Distort Image', + dragImage: 'Drag Image', + exportImage: 'Export Image', + exportImages: 'Export Images', + removeBorder: 'Remove Border', + addBorder: 'Add Border', + freeRotateImage: 'Free rotate Image', + geolocateImage: 'Geolocate Image', + lockMode: 'Lock Mode', + lockImages: 'Lock Images', + makeImageOpaque: 'Make Image Opaque', + makeImageTransparent: 'Make Image Transparent', + restoreImage: 'Restore Natural Image', + rotateImage: 'Rotate Image', + scaleImage: 'Scale Image', + stackToFront: 'Stack to Front', + stackToBack: 'Stack to Back', + unlockImages: 'Unlock Images', + confirmImageDelete: 'Are you sure? This image will be permanently deleted from the map.', + confirmImagesDeletes: 'Are you sure? These images will be permanently deleted from the map.' + }; + + if (!this.options.translation) { + this.options.translation = translation; + } else { + // If the translation for a word is not specified, fallback to English. + for (var key in translation) { + if (!this.options.translation.hasOwnProperty(key)) { + this.options.translation[key] = translation[key]; + } + } + } + + L.DomUtil.initTranslation(this.options.translation); + }, + getNestedVal: function getNestedVal(obj, key, nestedKey) { + var dig = [key, nestedKey]; + return dig.reduce(function (obj, k) { + return obj && obj[k]; + }, obj); + } +}; + +/***/ }), + +/***/ "./node_modules/events/events.js": +/*!***************************************!*\ + !*** ./node_modules/events/events.js ***! + \***************************************/ +/***/ (function(module) { + +"use strict"; +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + + + +var R = typeof Reflect === 'object' ? Reflect : null +var ReflectApply = R && typeof R.apply === 'function' + ? R.apply + : function ReflectApply(target, receiver, args) { + return Function.prototype.apply.call(target, receiver, args); + } + +var ReflectOwnKeys +if (R && typeof R.ownKeys === 'function') { + ReflectOwnKeys = R.ownKeys +} else if (Object.getOwnPropertySymbols) { + ReflectOwnKeys = function ReflectOwnKeys(target) { + return Object.getOwnPropertyNames(target) + .concat(Object.getOwnPropertySymbols(target)); + }; +} else { + ReflectOwnKeys = function ReflectOwnKeys(target) { + return Object.getOwnPropertyNames(target); + }; +} + +function ProcessEmitWarning(warning) { + if (console && console.warn) console.warn(warning); +} + +var NumberIsNaN = Number.isNaN || function NumberIsNaN(value) { + return value !== value; +} + +function EventEmitter() { + EventEmitter.init.call(this); +} +module.exports = EventEmitter; +module.exports.once = once; + +// Backwards-compat with node 0.10.x +EventEmitter.EventEmitter = EventEmitter; + +EventEmitter.prototype._events = undefined; +EventEmitter.prototype._eventsCount = 0; +EventEmitter.prototype._maxListeners = undefined; + +// By default EventEmitters will print a warning if more than 10 listeners are +// added to it. This is a useful default which helps finding memory leaks. +var defaultMaxListeners = 10; + +function checkListener(listener) { + if (typeof listener !== 'function') { + throw new TypeError('The "listener" argument must be of type Function. Received type ' + typeof listener); + } +} + +Object.defineProperty(EventEmitter, 'defaultMaxListeners', { + enumerable: true, + get: function() { + return defaultMaxListeners; + }, + set: function(arg) { + if (typeof arg !== 'number' || arg < 0 || NumberIsNaN(arg)) { + throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received ' + arg + '.'); + } + defaultMaxListeners = arg; + } +}); + +EventEmitter.init = function() { + + if (this._events === undefined || + this._events === Object.getPrototypeOf(this)._events) { + this._events = Object.create(null); + this._eventsCount = 0; + } + + this._maxListeners = this._maxListeners || undefined; +}; + +// Obviously not all Emitters should be limited to 10. This function allows +// that to be increased. Set to zero for unlimited. +EventEmitter.prototype.setMaxListeners = function setMaxListeners(n) { + if (typeof n !== 'number' || n < 0 || NumberIsNaN(n)) { + throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received ' + n + '.'); + } + this._maxListeners = n; + return this; +}; + +function _getMaxListeners(that) { + if (that._maxListeners === undefined) + return EventEmitter.defaultMaxListeners; + return that._maxListeners; +} + +EventEmitter.prototype.getMaxListeners = function getMaxListeners() { + return _getMaxListeners(this); +}; + +EventEmitter.prototype.emit = function emit(type) { + var args = []; + for (var i = 1; i < arguments.length; i++) args.push(arguments[i]); + var doError = (type === 'error'); + + var events = this._events; + if (events !== undefined) + doError = (doError && events.error === undefined); + else if (!doError) + return false; + + // If there is no 'error' event listener then throw. + if (doError) { + var er; + if (args.length > 0) + er = args[0]; + if (er instanceof Error) { + // Note: The comments on the `throw` lines are intentional, they show + // up in Node's output if this results in an unhandled exception. + throw er; // Unhandled 'error' event + } + // At least give some kind of context to the user + var err = new Error('Unhandled error.' + (er ? ' (' + er.message + ')' : '')); + err.context = er; + throw err; // Unhandled 'error' event + } + + var handler = events[type]; + + if (handler === undefined) + return false; + + if (typeof handler === 'function') { + ReflectApply(handler, this, args); + } else { + var len = handler.length; + var listeners = arrayClone(handler, len); + for (var i = 0; i < len; ++i) + ReflectApply(listeners[i], this, args); + } + + return true; +}; + +function _addListener(target, type, listener, prepend) { + var m; + var events; + var existing; + + checkListener(listener); + + events = target._events; + if (events === undefined) { + events = target._events = Object.create(null); + target._eventsCount = 0; + } else { + // To avoid recursion in the case that type === "newListener"! Before + // adding it to the listeners, first emit "newListener". + if (events.newListener !== undefined) { + target.emit('newListener', type, + listener.listener ? listener.listener : listener); + + // Re-assign `events` because a newListener handler could have caused the + // this._events to be assigned to a new object + events = target._events; + } + existing = events[type]; + } + + if (existing === undefined) { + // Optimize the case of one listener. Don't need the extra array object. + existing = events[type] = listener; + ++target._eventsCount; + } else { + if (typeof existing === 'function') { + // Adding the second element, need to change to array. + existing = events[type] = + prepend ? [listener, existing] : [existing, listener]; + // If we've already got an array, just append. + } else if (prepend) { + existing.unshift(listener); + } else { + existing.push(listener); + } + + // Check for listener leak + m = _getMaxListeners(target); + if (m > 0 && existing.length > m && !existing.warned) { + existing.warned = true; + // No error code for this since it is a Warning + // eslint-disable-next-line no-restricted-syntax + var w = new Error('Possible EventEmitter memory leak detected. ' + + existing.length + ' ' + String(type) + ' listeners ' + + 'added. Use emitter.setMaxListeners() to ' + + 'increase limit'); + w.name = 'MaxListenersExceededWarning'; + w.emitter = target; + w.type = type; + w.count = existing.length; + ProcessEmitWarning(w); + } + } + + return target; +} + +EventEmitter.prototype.addListener = function addListener(type, listener) { + return _addListener(this, type, listener, false); +}; + +EventEmitter.prototype.on = EventEmitter.prototype.addListener; + +EventEmitter.prototype.prependListener = + function prependListener(type, listener) { + return _addListener(this, type, listener, true); + }; + +function onceWrapper() { + if (!this.fired) { + this.target.removeListener(this.type, this.wrapFn); + this.fired = true; + if (arguments.length === 0) + return this.listener.call(this.target); + return this.listener.apply(this.target, arguments); + } +} + +function _onceWrap(target, type, listener) { + var state = { fired: false, wrapFn: undefined, target: target, type: type, listener: listener }; + var wrapped = onceWrapper.bind(state); + wrapped.listener = listener; + state.wrapFn = wrapped; + return wrapped; +} + +EventEmitter.prototype.once = function once(type, listener) { + checkListener(listener); + this.on(type, _onceWrap(this, type, listener)); + return this; +}; + +EventEmitter.prototype.prependOnceListener = + function prependOnceListener(type, listener) { + checkListener(listener); + this.prependListener(type, _onceWrap(this, type, listener)); + return this; + }; + +// Emits a 'removeListener' event if and only if the listener was removed. +EventEmitter.prototype.removeListener = + function removeListener(type, listener) { + var list, events, position, i, originalListener; + + checkListener(listener); + + events = this._events; + if (events === undefined) + return this; + + list = events[type]; + if (list === undefined) + return this; + + if (list === listener || list.listener === listener) { + if (--this._eventsCount === 0) + this._events = Object.create(null); + else { + delete events[type]; + if (events.removeListener) + this.emit('removeListener', type, list.listener || listener); + } + } else if (typeof list !== 'function') { + position = -1; + + for (i = list.length - 1; i >= 0; i--) { + if (list[i] === listener || list[i].listener === listener) { + originalListener = list[i].listener; + position = i; + break; + } + } + + if (position < 0) + return this; + + if (position === 0) + list.shift(); + else { + spliceOne(list, position); + } + + if (list.length === 1) + events[type] = list[0]; + + if (events.removeListener !== undefined) + this.emit('removeListener', type, originalListener || listener); + } + + return this; + }; + +EventEmitter.prototype.off = EventEmitter.prototype.removeListener; + +EventEmitter.prototype.removeAllListeners = + function removeAllListeners(type) { + var listeners, events, i; + + events = this._events; + if (events === undefined) + return this; + + // not listening for removeListener, no need to emit + if (events.removeListener === undefined) { + if (arguments.length === 0) { + this._events = Object.create(null); + this._eventsCount = 0; + } else if (events[type] !== undefined) { + if (--this._eventsCount === 0) + this._events = Object.create(null); + else + delete events[type]; + } + return this; + } + + // emit removeListener for all listeners on all events + if (arguments.length === 0) { + var keys = Object.keys(events); + var key; + for (i = 0; i < keys.length; ++i) { + key = keys[i]; + if (key === 'removeListener') continue; + this.removeAllListeners(key); + } + this.removeAllListeners('removeListener'); + this._events = Object.create(null); + this._eventsCount = 0; + return this; + } + + listeners = events[type]; + + if (typeof listeners === 'function') { + this.removeListener(type, listeners); + } else if (listeners !== undefined) { + // LIFO order + for (i = listeners.length - 1; i >= 0; i--) { + this.removeListener(type, listeners[i]); + } + } + + return this; + }; + +function _listeners(target, type, unwrap) { + var events = target._events; + + if (events === undefined) + return []; + + var evlistener = events[type]; + if (evlistener === undefined) + return []; + + if (typeof evlistener === 'function') + return unwrap ? [evlistener.listener || evlistener] : [evlistener]; + + return unwrap ? + unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length); +} + +EventEmitter.prototype.listeners = function listeners(type) { + return _listeners(this, type, true); +}; + +EventEmitter.prototype.rawListeners = function rawListeners(type) { + return _listeners(this, type, false); +}; + +EventEmitter.listenerCount = function(emitter, type) { + if (typeof emitter.listenerCount === 'function') { + return emitter.listenerCount(type); + } else { + return listenerCount.call(emitter, type); + } +}; + +EventEmitter.prototype.listenerCount = listenerCount; +function listenerCount(type) { + var events = this._events; + + if (events !== undefined) { + var evlistener = events[type]; + + if (typeof evlistener === 'function') { + return 1; + } else if (evlistener !== undefined) { + return evlistener.length; + } + } + + return 0; +} + +EventEmitter.prototype.eventNames = function eventNames() { + return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : []; +}; + +function arrayClone(arr, n) { + var copy = new Array(n); + for (var i = 0; i < n; ++i) + copy[i] = arr[i]; + return copy; +} + +function spliceOne(list, index) { + for (; index + 1 < list.length; index++) + list[index] = list[index + 1]; + list.pop(); +} + +function unwrapListeners(arr) { + var ret = new Array(arr.length); + for (var i = 0; i < ret.length; ++i) { + ret[i] = arr[i].listener || arr[i]; + } + return ret; +} + +function once(emitter, name) { + return new Promise(function (resolve, reject) { + function errorListener(err) { + emitter.removeListener(name, resolver); + reject(err); + } + + function resolver() { + if (typeof emitter.removeListener === 'function') { + emitter.removeListener('error', errorListener); + } + resolve([].slice.call(arguments)); + }; + + eventTargetAgnosticAddListener(emitter, name, resolver, { once: true }); + if (name !== 'error') { + addErrorHandlerIfEventEmitter(emitter, errorListener, { once: true }); + } + }); +} + +function addErrorHandlerIfEventEmitter(emitter, handler, flags) { + if (typeof emitter.on === 'function') { + eventTargetAgnosticAddListener(emitter, 'error', handler, flags); + } +} + +function eventTargetAgnosticAddListener(emitter, name, listener, flags) { + if (typeof emitter.on === 'function') { + if (flags.once) { + emitter.once(name, listener); + } else { + emitter.on(name, listener); + } + } else if (typeof emitter.addEventListener === 'function') { + // EventTarget does not have `error` event semantics like Node + // EventEmitters, we do not listen for `error` events here. + emitter.addEventListener(name, function wrapListener(arg) { + // IE does not have builtin `{ once: true }` support so we + // have to do it manually. + if (flags.once) { + emitter.removeEventListener(name, wrapListener); + } + listener(arg); + }); + } else { + throw new TypeError('The "emitter" argument must be of type EventEmitter. Received type ' + typeof emitter); + } +} + + +/***/ }), + +/***/ "./node_modules/html-entities/lib/index.js": +/*!*************************************************!*\ + !*** ./node_modules/html-entities/lib/index.js ***! + \*************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +var __assign = (this && this.__assign) || function () { + __assign = Object.assign || function(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +var named_references_1 = __webpack_require__(/*! ./named-references */ "./node_modules/html-entities/lib/named-references.js"); +var numeric_unicode_map_1 = __webpack_require__(/*! ./numeric-unicode-map */ "./node_modules/html-entities/lib/numeric-unicode-map.js"); +var surrogate_pairs_1 = __webpack_require__(/*! ./surrogate-pairs */ "./node_modules/html-entities/lib/surrogate-pairs.js"); +var allNamedReferences = __assign(__assign({}, named_references_1.namedReferences), { all: named_references_1.namedReferences.html5 }); +var encodeRegExps = { + specialChars: /[<>'"&]/g, + nonAscii: /(?:[<>'"&\u0080-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])/g, + nonAsciiPrintable: /(?:[<>'"&\x01-\x08\x11-\x15\x17-\x1F\x7f-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])/g, + extensive: /(?:[\x01-\x0c\x0e-\x1f\x21-\x2c\x2e-\x2f\x3a-\x40\x5b-\x60\x7b-\x7d\x7f-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])/g +}; +var defaultEncodeOptions = { + mode: 'specialChars', + level: 'all', + numeric: 'decimal' +}; +/** Encodes all the necessary (specified by `level`) characters in the text */ +function encode(text, _a) { + var _b = _a === void 0 ? defaultEncodeOptions : _a, _c = _b.mode, mode = _c === void 0 ? 'specialChars' : _c, _d = _b.numeric, numeric = _d === void 0 ? 'decimal' : _d, _e = _b.level, level = _e === void 0 ? 'all' : _e; + if (!text) { + return ''; + } + var encodeRegExp = encodeRegExps[mode]; + var references = allNamedReferences[level].characters; + var isHex = numeric === 'hexadecimal'; + encodeRegExp.lastIndex = 0; + var _b = encodeRegExp.exec(text); + var _c; + if (_b) { + _c = ''; + var _d = 0; + do { + if (_d !== _b.index) { + _c += text.substring(_d, _b.index); + } + var _e = _b[0]; + var result_1 = references[_e]; + if (!result_1) { + var code_1 = _e.length > 1 ? surrogate_pairs_1.getCodePoint(_e, 0) : _e.charCodeAt(0); + result_1 = (isHex ? '&#x' + code_1.toString(16) : '&#' + code_1) + ';'; + } + _c += result_1; + _d = _b.index + _e.length; + } while ((_b = encodeRegExp.exec(text))); + if (_d !== text.length) { + _c += text.substring(_d); + } + } + else { + _c = + text; + } + return _c; +} +exports.encode = encode; +var defaultDecodeOptions = { + scope: 'body', + level: 'all' +}; +var strict = /&(?:#\d+|#[xX][\da-fA-F]+|[0-9a-zA-Z]+);/g; +var attribute = /&(?:#\d+|#[xX][\da-fA-F]+|[0-9a-zA-Z]+)[;=]?/g; +var baseDecodeRegExps = { + xml: { + strict: strict, + attribute: attribute, + body: named_references_1.bodyRegExps.xml + }, + html4: { + strict: strict, + attribute: attribute, + body: named_references_1.bodyRegExps.html4 + }, + html5: { + strict: strict, + attribute: attribute, + body: named_references_1.bodyRegExps.html5 + } +}; +var decodeRegExps = __assign(__assign({}, baseDecodeRegExps), { all: baseDecodeRegExps.html5 }); +var fromCharCode = String.fromCharCode; +var outOfBoundsChar = fromCharCode(65533); +var defaultDecodeEntityOptions = { + level: 'all' +}; +/** Decodes a single entity */ +function decodeEntity(entity, _a) { + var _b = (_a === void 0 ? defaultDecodeEntityOptions : _a).level, level = _b === void 0 ? 'all' : _b; + if (!entity) { + return ''; + } + var _b = entity; + var decodeEntityLastChar_1 = entity[entity.length - 1]; + if (false) {} + else if (false) {} + else { + var decodeResultByReference_1 = allNamedReferences[level].entities[entity]; + if (decodeResultByReference_1) { + _b = decodeResultByReference_1; + } + else if (entity[0] === '&' && entity[1] === '#') { + var decodeSecondChar_1 = entity[2]; + var decodeCode_1 = decodeSecondChar_1 == 'x' || decodeSecondChar_1 == 'X' + ? parseInt(entity.substr(3), 16) + : parseInt(entity.substr(2)); + _b = + decodeCode_1 >= 0x10ffff + ? outOfBoundsChar + : decodeCode_1 > 65535 + ? surrogate_pairs_1.fromCodePoint(decodeCode_1) + : fromCharCode(numeric_unicode_map_1.numericUnicodeMap[decodeCode_1] || decodeCode_1); + } + } + return _b; +} +exports.decodeEntity = decodeEntity; +/** Decodes all entities in the text */ +function decode(text, _a) { + var decodeSecondChar_1 = _a === void 0 ? defaultDecodeOptions : _a, decodeCode_1 = decodeSecondChar_1.level, level = decodeCode_1 === void 0 ? 'all' : decodeCode_1, _b = decodeSecondChar_1.scope, scope = _b === void 0 ? level === 'xml' ? 'strict' : 'body' : _b; + if (!text) { + return ''; + } + var decodeRegExp = decodeRegExps[level][scope]; + var references = allNamedReferences[level].entities; + var isAttribute = scope === 'attribute'; + var isStrict = scope === 'strict'; + decodeRegExp.lastIndex = 0; + var replaceMatch_1 = decodeRegExp.exec(text); + var replaceResult_1; + if (replaceMatch_1) { + replaceResult_1 = ''; + var replaceLastIndex_1 = 0; + do { + if (replaceLastIndex_1 !== replaceMatch_1.index) { + replaceResult_1 += text.substring(replaceLastIndex_1, replaceMatch_1.index); + } + var replaceInput_1 = replaceMatch_1[0]; + var decodeResult_1 = replaceInput_1; + var decodeEntityLastChar_2 = replaceInput_1[replaceInput_1.length - 1]; + if (isAttribute + && decodeEntityLastChar_2 === '=') { + decodeResult_1 = replaceInput_1; + } + else if (isStrict + && decodeEntityLastChar_2 !== ';') { + decodeResult_1 = replaceInput_1; + } + else { + var decodeResultByReference_2 = references[replaceInput_1]; + if (decodeResultByReference_2) { + decodeResult_1 = decodeResultByReference_2; + } + else if (replaceInput_1[0] === '&' && replaceInput_1[1] === '#') { + var decodeSecondChar_2 = replaceInput_1[2]; + var decodeCode_2 = decodeSecondChar_2 == 'x' || decodeSecondChar_2 == 'X' + ? parseInt(replaceInput_1.substr(3), 16) + : parseInt(replaceInput_1.substr(2)); + decodeResult_1 = + decodeCode_2 >= 0x10ffff + ? outOfBoundsChar + : decodeCode_2 > 65535 + ? surrogate_pairs_1.fromCodePoint(decodeCode_2) + : fromCharCode(numeric_unicode_map_1.numericUnicodeMap[decodeCode_2] || decodeCode_2); + } + } + replaceResult_1 += decodeResult_1; + replaceLastIndex_1 = replaceMatch_1.index + replaceInput_1.length; + } while ((replaceMatch_1 = decodeRegExp.exec(text))); + if (replaceLastIndex_1 !== text.length) { + replaceResult_1 += text.substring(replaceLastIndex_1); + } + } + else { + replaceResult_1 = + text; + } + return replaceResult_1; +} +exports.decode = decode; + + +/***/ }), + +/***/ "./node_modules/html-entities/lib/named-references.js": +/*!************************************************************!*\ + !*** ./node_modules/html-entities/lib/named-references.js ***! + \************************************************************/ +/***/ (function(__unused_webpack_module, exports) { + +"use strict"; +Object.defineProperty(exports, "__esModule", ({value:true}));exports.bodyRegExps={xml:/&(?:#\d+|#[xX][\da-fA-F]+|[0-9a-zA-Z]+);?/g,html4:/&(?:nbsp|iexcl|cent|pound|curren|yen|brvbar|sect|uml|copy|ordf|laquo|not|shy|reg|macr|deg|plusmn|sup2|sup3|acute|micro|para|middot|cedil|sup1|ordm|raquo|frac14|frac12|frac34|iquest|Agrave|Aacute|Acirc|Atilde|Auml|Aring|AElig|Ccedil|Egrave|Eacute|Ecirc|Euml|Igrave|Iacute|Icirc|Iuml|ETH|Ntilde|Ograve|Oacute|Ocirc|Otilde|Ouml|times|Oslash|Ugrave|Uacute|Ucirc|Uuml|Yacute|THORN|szlig|agrave|aacute|acirc|atilde|auml|aring|aelig|ccedil|egrave|eacute|ecirc|euml|igrave|iacute|icirc|iuml|eth|ntilde|ograve|oacute|ocirc|otilde|ouml|divide|oslash|ugrave|uacute|ucirc|uuml|yacute|thorn|yuml|quot|amp|lt|gt|#\d+|#[xX][\da-fA-F]+|[0-9a-zA-Z]+);?/g,html5:/&(?:AElig|AMP|Aacute|Acirc|Agrave|Aring|Atilde|Auml|COPY|Ccedil|ETH|Eacute|Ecirc|Egrave|Euml|GT|Iacute|Icirc|Igrave|Iuml|LT|Ntilde|Oacute|Ocirc|Ograve|Oslash|Otilde|Ouml|QUOT|REG|THORN|Uacute|Ucirc|Ugrave|Uuml|Yacute|aacute|acirc|acute|aelig|agrave|amp|aring|atilde|auml|brvbar|ccedil|cedil|cent|copy|curren|deg|divide|eacute|ecirc|egrave|eth|euml|frac12|frac14|frac34|gt|iacute|icirc|iexcl|igrave|iquest|iuml|laquo|lt|macr|micro|middot|nbsp|not|ntilde|oacute|ocirc|ograve|ordf|ordm|oslash|otilde|ouml|para|plusmn|pound|quot|raquo|reg|sect|shy|sup1|sup2|sup3|szlig|thorn|times|uacute|ucirc|ugrave|uml|uuml|yacute|yen|yuml|#\d+|#[xX][\da-fA-F]+|[0-9a-zA-Z]+);?/g};exports.namedReferences={xml:{entities:{"<":"<",">":">",""":'"',"'":"'","&":"&"},characters:{"<":"<",">":">",'"':""","'":"'","&":"&"}},html4:{entities:{"'":"'"," ":" "," ":" ","¡":"¡","¡":"¡","¢":"¢","¢":"¢","£":"£","£":"£","¤":"¤","¤":"¤","¥":"¥","¥":"¥","¦":"¦","¦":"¦","§":"§","§":"§","¨":"¨","¨":"¨","©":"©","©":"©","ª":"ª","ª":"ª","«":"«","«":"«","¬":"¬","¬":"¬","­":"­","­":"­","®":"®","®":"®","¯":"¯","¯":"¯","°":"°","°":"°","±":"±","±":"±","²":"²","²":"²","³":"³","³":"³","´":"´","´":"´","µ":"µ","µ":"µ","¶":"¶","¶":"¶","·":"·","·":"·","¸":"¸","¸":"¸","¹":"¹","¹":"¹","º":"º","º":"º","»":"»","»":"»","¼":"¼","¼":"¼","½":"½","½":"½","¾":"¾","¾":"¾","¿":"¿","¿":"¿","À":"À","À":"À","Á":"Á","Á":"Á","Â":"Â","Â":"Â","Ã":"Ã","Ã":"Ã","Ä":"Ä","Ä":"Ä","Å":"Å","Å":"Å","Æ":"Æ","Æ":"Æ","Ç":"Ç","Ç":"Ç","È":"È","È":"È","É":"É","É":"É","Ê":"Ê","Ê":"Ê","Ë":"Ë","Ë":"Ë","Ì":"Ì","Ì":"Ì","Í":"Í","Í":"Í","Î":"Î","Î":"Î","Ï":"Ï","Ï":"Ï","Ð":"Ð","Ð":"Ð","Ñ":"Ñ","Ñ":"Ñ","Ò":"Ò","Ò":"Ò","Ó":"Ó","Ó":"Ó","Ô":"Ô","Ô":"Ô","Õ":"Õ","Õ":"Õ","Ö":"Ö","Ö":"Ö","×":"×","×":"×","Ø":"Ø","Ø":"Ø","Ù":"Ù","Ù":"Ù","Ú":"Ú","Ú":"Ú","Û":"Û","Û":"Û","Ü":"Ü","Ü":"Ü","Ý":"Ý","Ý":"Ý","Þ":"Þ","Þ":"Þ","ß":"ß","ß":"ß","à":"à","à":"à","á":"á","á":"á","â":"â","â":"â","ã":"ã","ã":"ã","ä":"ä","ä":"ä","å":"å","å":"å","æ":"æ","æ":"æ","ç":"ç","ç":"ç","è":"è","è":"è","é":"é","é":"é","ê":"ê","ê":"ê","ë":"ë","ë":"ë","ì":"ì","ì":"ì","í":"í","í":"í","î":"î","î":"î","ï":"ï","ï":"ï","ð":"ð","ð":"ð","ñ":"ñ","ñ":"ñ","ò":"ò","ò":"ò","ó":"ó","ó":"ó","ô":"ô","ô":"ô","õ":"õ","õ":"õ","ö":"ö","ö":"ö","÷":"÷","÷":"÷","ø":"ø","ø":"ø","ù":"ù","ù":"ù","ú":"ú","ú":"ú","û":"û","û":"û","ü":"ü","ü":"ü","ý":"ý","ý":"ý","þ":"þ","þ":"þ","ÿ":"ÿ","ÿ":"ÿ",""":'"',""":'"',"&":"&","&":"&","<":"<","<":"<",">":">",">":">","Œ":"Œ","œ":"œ","Š":"Š","š":"š","Ÿ":"Ÿ","ˆ":"ˆ","˜":"˜"," ":" "," ":" "," ":" ","‌":"‌","‍":"‍","‎":"‎","‏":"‏","–":"–","—":"—","‘":"‘","’":"’","‚":"‚","“":"“","”":"”","„":"„","†":"†","‡":"‡","‰":"‰","‹":"‹","›":"›","€":"€","ƒ":"ƒ","Α":"Α","Β":"Β","Γ":"Γ","Δ":"Δ","Ε":"Ε","Ζ":"Ζ","Η":"Η","Θ":"Θ","Ι":"Ι","Κ":"Κ","Λ":"Λ","Μ":"Μ","Ν":"Ν","Ξ":"Ξ","Ο":"Ο","Π":"Π","Ρ":"Ρ","Σ":"Σ","Τ":"Τ","Υ":"Υ","Φ":"Φ","Χ":"Χ","Ψ":"Ψ","Ω":"Ω","α":"α","β":"β","γ":"γ","δ":"δ","ε":"ε","ζ":"ζ","η":"η","θ":"θ","ι":"ι","κ":"κ","λ":"λ","μ":"μ","ν":"ν","ξ":"ξ","ο":"ο","π":"π","ρ":"ρ","ς":"ς","σ":"σ","τ":"τ","υ":"υ","φ":"φ","χ":"χ","ψ":"ψ","ω":"ω","ϑ":"ϑ","ϒ":"ϒ","ϖ":"ϖ","•":"•","…":"…","′":"′","″":"″","‾":"‾","⁄":"⁄","℘":"℘","ℑ":"ℑ","ℜ":"ℜ","™":"™","ℵ":"ℵ","←":"←","↑":"↑","→":"→","↓":"↓","↔":"↔","↵":"↵","⇐":"⇐","⇑":"⇑","⇒":"⇒","⇓":"⇓","⇔":"⇔","∀":"∀","∂":"∂","∃":"∃","∅":"∅","∇":"∇","∈":"∈","∉":"∉","∋":"∋","∏":"∏","∑":"∑","−":"−","∗":"∗","√":"√","∝":"∝","∞":"∞","∠":"∠","∧":"∧","∨":"∨","∩":"∩","∪":"∪","∫":"∫","∴":"∴","∼":"∼","≅":"≅","≈":"≈","≠":"≠","≡":"≡","≤":"≤","≥":"≥","⊂":"⊂","⊃":"⊃","⊄":"⊄","⊆":"⊆","⊇":"⊇","⊕":"⊕","⊗":"⊗","⊥":"⊥","⋅":"⋅","⌈":"⌈","⌉":"⌉","⌊":"⌊","⌋":"⌋","⟨":"〈","⟩":"〉","◊":"◊","♠":"♠","♣":"♣","♥":"♥","♦":"♦"},characters:{"'":"'"," ":" ","¡":"¡","¢":"¢","£":"£","¤":"¤","¥":"¥","¦":"¦","§":"§","¨":"¨","©":"©","ª":"ª","«":"«","¬":"¬","­":"­","®":"®","¯":"¯","°":"°","±":"±","²":"²","³":"³","´":"´","µ":"µ","¶":"¶","·":"·","¸":"¸","¹":"¹","º":"º","»":"»","¼":"¼","½":"½","¾":"¾","¿":"¿","À":"À","Á":"Á","Â":"Â","Ã":"Ã","Ä":"Ä","Å":"Å","Æ":"Æ","Ç":"Ç","È":"È","É":"É","Ê":"Ê","Ë":"Ë","Ì":"Ì","Í":"Í","Î":"Î","Ï":"Ï","Ð":"Ð","Ñ":"Ñ","Ò":"Ò","Ó":"Ó","Ô":"Ô","Õ":"Õ","Ö":"Ö","×":"×","Ø":"Ø","Ù":"Ù","Ú":"Ú","Û":"Û","Ü":"Ü","Ý":"Ý","Þ":"Þ","ß":"ß","à":"à","á":"á","â":"â","ã":"ã","ä":"ä","å":"å","æ":"æ","ç":"ç","è":"è","é":"é","ê":"ê","ë":"ë","ì":"ì","í":"í","î":"î","ï":"ï","ð":"ð","ñ":"ñ","ò":"ò","ó":"ó","ô":"ô","õ":"õ","ö":"ö","÷":"÷","ø":"ø","ù":"ù","ú":"ú","û":"û","ü":"ü","ý":"ý","þ":"þ","ÿ":"ÿ",'"':""","&":"&","<":"<",">":">","Œ":"Œ","œ":"œ","Š":"Š","š":"š","Ÿ":"Ÿ","ˆ":"ˆ","˜":"˜"," ":" "," ":" "," ":" ","‌":"‌","‍":"‍","‎":"‎","‏":"‏","–":"–","—":"—","‘":"‘","’":"’","‚":"‚","“":"“","”":"”","„":"„","†":"†","‡":"‡","‰":"‰","‹":"‹","›":"›","€":"€","ƒ":"ƒ","Α":"Α","Β":"Β","Γ":"Γ","Δ":"Δ","Ε":"Ε","Ζ":"Ζ","Η":"Η","Θ":"Θ","Ι":"Ι","Κ":"Κ","Λ":"Λ","Μ":"Μ","Ν":"Ν","Ξ":"Ξ","Ο":"Ο","Π":"Π","Ρ":"Ρ","Σ":"Σ","Τ":"Τ","Υ":"Υ","Φ":"Φ","Χ":"Χ","Ψ":"Ψ","Ω":"Ω","α":"α","β":"β","γ":"γ","δ":"δ","ε":"ε","ζ":"ζ","η":"η","θ":"θ","ι":"ι","κ":"κ","λ":"λ","μ":"μ","ν":"ν","ξ":"ξ","ο":"ο","π":"π","ρ":"ρ","ς":"ς","σ":"σ","τ":"τ","υ":"υ","φ":"φ","χ":"χ","ψ":"ψ","ω":"ω","ϑ":"ϑ","ϒ":"ϒ","ϖ":"ϖ","•":"•","…":"…","′":"′","″":"″","‾":"‾","⁄":"⁄","℘":"℘","ℑ":"ℑ","ℜ":"ℜ","™":"™","ℵ":"ℵ","←":"←","↑":"↑","→":"→","↓":"↓","↔":"↔","↵":"↵","⇐":"⇐","⇑":"⇑","⇒":"⇒","⇓":"⇓","⇔":"⇔","∀":"∀","∂":"∂","∃":"∃","∅":"∅","∇":"∇","∈":"∈","∉":"∉","∋":"∋","∏":"∏","∑":"∑","−":"−","∗":"∗","√":"√","∝":"∝","∞":"∞","∠":"∠","∧":"∧","∨":"∨","∩":"∩","∪":"∪","∫":"∫","∴":"∴","∼":"∼","≅":"≅","≈":"≈","≠":"≠","≡":"≡","≤":"≤","≥":"≥","⊂":"⊂","⊃":"⊃","⊄":"⊄","⊆":"⊆","⊇":"⊇","⊕":"⊕","⊗":"⊗","⊥":"⊥","⋅":"⋅","⌈":"⌈","⌉":"⌉","⌊":"⌊","⌋":"⌋","〈":"⟨","〉":"⟩","◊":"◊","♠":"♠","♣":"♣","♥":"♥","♦":"♦"}},html5:{entities:{"Æ":"Æ","Æ":"Æ","&":"&","&":"&","Á":"Á","Á":"Á","Ă":"Ă","Â":"Â","Â":"Â","А":"А","𝔄":"𝔄","À":"À","À":"À","Α":"Α","Ā":"Ā","⩓":"⩓","Ą":"Ą","𝔸":"𝔸","⁡":"⁡","Å":"Å","Å":"Å","𝒜":"𝒜","≔":"≔","Ã":"Ã","Ã":"Ã","Ä":"Ä","Ä":"Ä","∖":"∖","⫧":"⫧","⌆":"⌆","Б":"Б","∵":"∵","ℬ":"ℬ","Β":"Β","𝔅":"𝔅","𝔹":"𝔹","˘":"˘","ℬ":"ℬ","≎":"≎","Ч":"Ч","©":"©","©":"©","Ć":"Ć","⋒":"⋒","ⅅ":"ⅅ","ℭ":"ℭ","Č":"Č","Ç":"Ç","Ç":"Ç","Ĉ":"Ĉ","∰":"∰","Ċ":"Ċ","¸":"¸","·":"·","ℭ":"ℭ","Χ":"Χ","⊙":"⊙","⊖":"⊖","⊕":"⊕","⊗":"⊗","∲":"∲","”":"”","’":"’","∷":"∷","⩴":"⩴","≡":"≡","∯":"∯","∮":"∮","ℂ":"ℂ","∐":"∐","∳":"∳","⨯":"⨯","𝒞":"𝒞","⋓":"⋓","≍":"≍","ⅅ":"ⅅ","⤑":"⤑","Ђ":"Ђ","Ѕ":"Ѕ","Џ":"Џ","‡":"‡","↡":"↡","⫤":"⫤","Ď":"Ď","Д":"Д","∇":"∇","Δ":"Δ","𝔇":"𝔇","´":"´","˙":"˙","˝":"˝","`":"`","˜":"˜","⋄":"⋄","ⅆ":"ⅆ","𝔻":"𝔻","¨":"¨","⃜":"⃜","≐":"≐","∯":"∯","¨":"¨","⇓":"⇓","⇐":"⇐","⇔":"⇔","⫤":"⫤","⟸":"⟸","⟺":"⟺","⟹":"⟹","⇒":"⇒","⊨":"⊨","⇑":"⇑","⇕":"⇕","∥":"∥","↓":"↓","⤓":"⤓","⇵":"⇵","̑":"̑","⥐":"⥐","⥞":"⥞","↽":"↽","⥖":"⥖","⥟":"⥟","⇁":"⇁","⥗":"⥗","⊤":"⊤","↧":"↧","⇓":"⇓","𝒟":"𝒟","Đ":"Đ","Ŋ":"Ŋ","Ð":"Ð","Ð":"Ð","É":"É","É":"É","Ě":"Ě","Ê":"Ê","Ê":"Ê","Э":"Э","Ė":"Ė","𝔈":"𝔈","È":"È","È":"È","∈":"∈","Ē":"Ē","◻":"◻","▫":"▫","Ę":"Ę","𝔼":"𝔼","Ε":"Ε","⩵":"⩵","≂":"≂","⇌":"⇌","ℰ":"ℰ","⩳":"⩳","Η":"Η","Ë":"Ë","Ë":"Ë","∃":"∃","ⅇ":"ⅇ","Ф":"Ф","𝔉":"𝔉","◼":"◼","▪":"▪","𝔽":"𝔽","∀":"∀","ℱ":"ℱ","ℱ":"ℱ","Ѓ":"Ѓ",">":">",">":">","Γ":"Γ","Ϝ":"Ϝ","Ğ":"Ğ","Ģ":"Ģ","Ĝ":"Ĝ","Г":"Г","Ġ":"Ġ","𝔊":"𝔊","⋙":"⋙","𝔾":"𝔾","≥":"≥","⋛":"⋛","≧":"≧","⪢":"⪢","≷":"≷","⩾":"⩾","≳":"≳","𝒢":"𝒢","≫":"≫","Ъ":"Ъ","ˇ":"ˇ","^":"^","Ĥ":"Ĥ","ℌ":"ℌ","ℋ":"ℋ","ℍ":"ℍ","─":"─","ℋ":"ℋ","Ħ":"Ħ","≎":"≎","≏":"≏","Е":"Е","IJ":"IJ","Ё":"Ё","Í":"Í","Í":"Í","Î":"Î","Î":"Î","И":"И","İ":"İ","ℑ":"ℑ","Ì":"Ì","Ì":"Ì","ℑ":"ℑ","Ī":"Ī","ⅈ":"ⅈ","⇒":"⇒","∬":"∬","∫":"∫","⋂":"⋂","⁣":"⁣","⁢":"⁢","Į":"Į","𝕀":"𝕀","Ι":"Ι","ℐ":"ℐ","Ĩ":"Ĩ","І":"І","Ï":"Ï","Ï":"Ï","Ĵ":"Ĵ","Й":"Й","𝔍":"𝔍","𝕁":"𝕁","𝒥":"𝒥","Ј":"Ј","Є":"Є","Х":"Х","Ќ":"Ќ","Κ":"Κ","Ķ":"Ķ","К":"К","𝔎":"𝔎","𝕂":"𝕂","𝒦":"𝒦","Љ":"Љ","<":"<","<":"<","Ĺ":"Ĺ","Λ":"Λ","⟪":"⟪","ℒ":"ℒ","↞":"↞","Ľ":"Ľ","Ļ":"Ļ","Л":"Л","⟨":"⟨","←":"←","⇤":"⇤","⇆":"⇆","⌈":"⌈","⟦":"⟦","⥡":"⥡","⇃":"⇃","⥙":"⥙","⌊":"⌊","↔":"↔","⥎":"⥎","⊣":"⊣","↤":"↤","⥚":"⥚","⊲":"⊲","⧏":"⧏","⊴":"⊴","⥑":"⥑","⥠":"⥠","↿":"↿","⥘":"⥘","↼":"↼","⥒":"⥒","⇐":"⇐","⇔":"⇔","⋚":"⋚","≦":"≦","≶":"≶","⪡":"⪡","⩽":"⩽","≲":"≲","𝔏":"𝔏","⋘":"⋘","⇚":"⇚","Ŀ":"Ŀ","⟵":"⟵","⟷":"⟷","⟶":"⟶","⟸":"⟸","⟺":"⟺","⟹":"⟹","𝕃":"𝕃","↙":"↙","↘":"↘","ℒ":"ℒ","↰":"↰","Ł":"Ł","≪":"≪","⤅":"⤅","М":"М"," ":" ","ℳ":"ℳ","𝔐":"𝔐","∓":"∓","𝕄":"𝕄","ℳ":"ℳ","Μ":"Μ","Њ":"Њ","Ń":"Ń","Ň":"Ň","Ņ":"Ņ","Н":"Н","​":"​","​":"​","​":"​","​":"​","≫":"≫","≪":"≪"," ":"\n","𝔑":"𝔑","⁠":"⁠"," ":" ","ℕ":"ℕ","⫬":"⫬","≢":"≢","≭":"≭","∦":"∦","∉":"∉","≠":"≠","≂̸":"≂̸","∄":"∄","≯":"≯","≱":"≱","≧̸":"≧̸","≫̸":"≫̸","≹":"≹","⩾̸":"⩾̸","≵":"≵","≎̸":"≎̸","≏̸":"≏̸","⋪":"⋪","⧏̸":"⧏̸","⋬":"⋬","≮":"≮","≰":"≰","≸":"≸","≪̸":"≪̸","⩽̸":"⩽̸","≴":"≴","⪢̸":"⪢̸","⪡̸":"⪡̸","⊀":"⊀","⪯̸":"⪯̸","⋠":"⋠","∌":"∌","⋫":"⋫","⧐̸":"⧐̸","⋭":"⋭","⊏̸":"⊏̸","⋢":"⋢","⊐̸":"⊐̸","⋣":"⋣","⊂⃒":"⊂⃒","⊈":"⊈","⊁":"⊁","⪰̸":"⪰̸","⋡":"⋡","≿̸":"≿̸","⊃⃒":"⊃⃒","⊉":"⊉","≁":"≁","≄":"≄","≇":"≇","≉":"≉","∤":"∤","𝒩":"𝒩","Ñ":"Ñ","Ñ":"Ñ","Ν":"Ν","Œ":"Œ","Ó":"Ó","Ó":"Ó","Ô":"Ô","Ô":"Ô","О":"О","Ő":"Ő","𝔒":"𝔒","Ò":"Ò","Ò":"Ò","Ō":"Ō","Ω":"Ω","Ο":"Ο","𝕆":"𝕆","“":"“","‘":"‘","⩔":"⩔","𝒪":"𝒪","Ø":"Ø","Ø":"Ø","Õ":"Õ","Õ":"Õ","⨷":"⨷","Ö":"Ö","Ö":"Ö","‾":"‾","⏞":"⏞","⎴":"⎴","⏜":"⏜","∂":"∂","П":"П","𝔓":"𝔓","Φ":"Φ","Π":"Π","±":"±","ℌ":"ℌ","ℙ":"ℙ","⪻":"⪻","≺":"≺","⪯":"⪯","≼":"≼","≾":"≾","″":"″","∏":"∏","∷":"∷","∝":"∝","𝒫":"𝒫","Ψ":"Ψ",""":'"',""":'"',"𝔔":"𝔔","ℚ":"ℚ","𝒬":"𝒬","⤐":"⤐","®":"®","®":"®","Ŕ":"Ŕ","⟫":"⟫","↠":"↠","⤖":"⤖","Ř":"Ř","Ŗ":"Ŗ","Р":"Р","ℜ":"ℜ","∋":"∋","⇋":"⇋","⥯":"⥯","ℜ":"ℜ","Ρ":"Ρ","⟩":"⟩","→":"→","⇥":"⇥","⇄":"⇄","⌉":"⌉","⟧":"⟧","⥝":"⥝","⇂":"⇂","⥕":"⥕","⌋":"⌋","⊢":"⊢","↦":"↦","⥛":"⥛","⊳":"⊳","⧐":"⧐","⊵":"⊵","⥏":"⥏","⥜":"⥜","↾":"↾","⥔":"⥔","⇀":"⇀","⥓":"⥓","⇒":"⇒","ℝ":"ℝ","⥰":"⥰","⇛":"⇛","ℛ":"ℛ","↱":"↱","⧴":"⧴","Щ":"Щ","Ш":"Ш","Ь":"Ь","Ś":"Ś","⪼":"⪼","Š":"Š","Ş":"Ş","Ŝ":"Ŝ","С":"С","𝔖":"𝔖","↓":"↓","←":"←","→":"→","↑":"↑","Σ":"Σ","∘":"∘","𝕊":"𝕊","√":"√","□":"□","⊓":"⊓","⊏":"⊏","⊑":"⊑","⊐":"⊐","⊒":"⊒","⊔":"⊔","𝒮":"𝒮","⋆":"⋆","⋐":"⋐","⋐":"⋐","⊆":"⊆","≻":"≻","⪰":"⪰","≽":"≽","≿":"≿","∋":"∋","∑":"∑","⋑":"⋑","⊃":"⊃","⊇":"⊇","⋑":"⋑","Þ":"Þ","Þ":"Þ","™":"™","Ћ":"Ћ","Ц":"Ц"," ":"\t","Τ":"Τ","Ť":"Ť","Ţ":"Ţ","Т":"Т","𝔗":"𝔗","∴":"∴","Θ":"Θ","  ":"  "," ":" ","∼":"∼","≃":"≃","≅":"≅","≈":"≈","𝕋":"𝕋","⃛":"⃛","𝒯":"𝒯","Ŧ":"Ŧ","Ú":"Ú","Ú":"Ú","↟":"↟","⥉":"⥉","Ў":"Ў","Ŭ":"Ŭ","Û":"Û","Û":"Û","У":"У","Ű":"Ű","𝔘":"𝔘","Ù":"Ù","Ù":"Ù","Ū":"Ū","_":"_","⏟":"⏟","⎵":"⎵","⏝":"⏝","⋃":"⋃","⊎":"⊎","Ų":"Ų","𝕌":"𝕌","↑":"↑","⤒":"⤒","⇅":"⇅","↕":"↕","⥮":"⥮","⊥":"⊥","↥":"↥","⇑":"⇑","⇕":"⇕","↖":"↖","↗":"↗","ϒ":"ϒ","Υ":"Υ","Ů":"Ů","𝒰":"𝒰","Ũ":"Ũ","Ü":"Ü","Ü":"Ü","⊫":"⊫","⫫":"⫫","В":"В","⊩":"⊩","⫦":"⫦","⋁":"⋁","‖":"‖","‖":"‖","∣":"∣","|":"|","❘":"❘","≀":"≀"," ":" ","𝔙":"𝔙","𝕍":"𝕍","𝒱":"𝒱","⊪":"⊪","Ŵ":"Ŵ","⋀":"⋀","𝔚":"𝔚","𝕎":"𝕎","𝒲":"𝒲","𝔛":"𝔛","Ξ":"Ξ","𝕏":"𝕏","𝒳":"𝒳","Я":"Я","Ї":"Ї","Ю":"Ю","Ý":"Ý","Ý":"Ý","Ŷ":"Ŷ","Ы":"Ы","𝔜":"𝔜","𝕐":"𝕐","𝒴":"𝒴","Ÿ":"Ÿ","Ж":"Ж","Ź":"Ź","Ž":"Ž","З":"З","Ż":"Ż","​":"​","Ζ":"Ζ","ℨ":"ℨ","ℤ":"ℤ","𝒵":"𝒵","á":"á","á":"á","ă":"ă","∾":"∾","∾̳":"∾̳","∿":"∿","â":"â","â":"â","´":"´","´":"´","а":"а","æ":"æ","æ":"æ","⁡":"⁡","𝔞":"𝔞","à":"à","à":"à","ℵ":"ℵ","ℵ":"ℵ","α":"α","ā":"ā","⨿":"⨿","&":"&","&":"&","∧":"∧","⩕":"⩕","⩜":"⩜","⩘":"⩘","⩚":"⩚","∠":"∠","⦤":"⦤","∠":"∠","∡":"∡","⦨":"⦨","⦩":"⦩","⦪":"⦪","⦫":"⦫","⦬":"⦬","⦭":"⦭","⦮":"⦮","⦯":"⦯","∟":"∟","⊾":"⊾","⦝":"⦝","∢":"∢","Å":"Å","⍼":"⍼","ą":"ą","𝕒":"𝕒","≈":"≈","⩰":"⩰","⩯":"⩯","≊":"≊","≋":"≋","'":"'","≈":"≈","≊":"≊","å":"å","å":"å","𝒶":"𝒶","*":"*","≈":"≈","≍":"≍","ã":"ã","ã":"ã","ä":"ä","ä":"ä","∳":"∳","⨑":"⨑","⫭":"⫭","≌":"≌","϶":"϶","‵":"‵","∽":"∽","⋍":"⋍","⊽":"⊽","⌅":"⌅","⌅":"⌅","⎵":"⎵","⎶":"⎶","≌":"≌","б":"б","„":"„","∵":"∵","∵":"∵","⦰":"⦰","϶":"϶","ℬ":"ℬ","β":"β","ℶ":"ℶ","≬":"≬","𝔟":"𝔟","⋂":"⋂","◯":"◯","⋃":"⋃","⨀":"⨀","⨁":"⨁","⨂":"⨂","⨆":"⨆","★":"★","▽":"▽","△":"△","⨄":"⨄","⋁":"⋁","⋀":"⋀","⤍":"⤍","⧫":"⧫","▪":"▪","▴":"▴","▾":"▾","◂":"◂","▸":"▸","␣":"␣","▒":"▒","░":"░","▓":"▓","█":"█","=⃥":"=⃥","≡⃥":"≡⃥","⌐":"⌐","𝕓":"𝕓","⊥":"⊥","⊥":"⊥","⋈":"⋈","╗":"╗","╔":"╔","╖":"╖","╓":"╓","═":"═","╦":"╦","╩":"╩","╤":"╤","╧":"╧","╝":"╝","╚":"╚","╜":"╜","╙":"╙","║":"║","╬":"╬","╣":"╣","╠":"╠","╫":"╫","╢":"╢","╟":"╟","⧉":"⧉","╕":"╕","╒":"╒","┐":"┐","┌":"┌","─":"─","╥":"╥","╨":"╨","┬":"┬","┴":"┴","⊟":"⊟","⊞":"⊞","⊠":"⊠","╛":"╛","╘":"╘","┘":"┘","└":"└","│":"│","╪":"╪","╡":"╡","╞":"╞","┼":"┼","┤":"┤","├":"├","‵":"‵","˘":"˘","¦":"¦","¦":"¦","𝒷":"𝒷","⁏":"⁏","∽":"∽","⋍":"⋍","\":"\\","⧅":"⧅","⟈":"⟈","•":"•","•":"•","≎":"≎","⪮":"⪮","≏":"≏","≏":"≏","ć":"ć","∩":"∩","⩄":"⩄","⩉":"⩉","⩋":"⩋","⩇":"⩇","⩀":"⩀","∩︀":"∩︀","⁁":"⁁","ˇ":"ˇ","⩍":"⩍","č":"č","ç":"ç","ç":"ç","ĉ":"ĉ","⩌":"⩌","⩐":"⩐","ċ":"ċ","¸":"¸","¸":"¸","⦲":"⦲","¢":"¢","¢":"¢","·":"·","𝔠":"𝔠","ч":"ч","✓":"✓","✓":"✓","χ":"χ","○":"○","⧃":"⧃","ˆ":"ˆ","≗":"≗","↺":"↺","↻":"↻","®":"®","Ⓢ":"Ⓢ","⊛":"⊛","⊚":"⊚","⊝":"⊝","≗":"≗","⨐":"⨐","⫯":"⫯","⧂":"⧂","♣":"♣","♣":"♣",":":":","≔":"≔","≔":"≔",",":",","@":"@","∁":"∁","∘":"∘","∁":"∁","ℂ":"ℂ","≅":"≅","⩭":"⩭","∮":"∮","𝕔":"𝕔","∐":"∐","©":"©","©":"©","℗":"℗","↵":"↵","✗":"✗","𝒸":"𝒸","⫏":"⫏","⫑":"⫑","⫐":"⫐","⫒":"⫒","⋯":"⋯","⤸":"⤸","⤵":"⤵","⋞":"⋞","⋟":"⋟","↶":"↶","⤽":"⤽","∪":"∪","⩈":"⩈","⩆":"⩆","⩊":"⩊","⊍":"⊍","⩅":"⩅","∪︀":"∪︀","↷":"↷","⤼":"⤼","⋞":"⋞","⋟":"⋟","⋎":"⋎","⋏":"⋏","¤":"¤","¤":"¤","↶":"↶","↷":"↷","⋎":"⋎","⋏":"⋏","∲":"∲","∱":"∱","⌭":"⌭","⇓":"⇓","⥥":"⥥","†":"†","ℸ":"ℸ","↓":"↓","‐":"‐","⊣":"⊣","⤏":"⤏","˝":"˝","ď":"ď","д":"д","ⅆ":"ⅆ","‡":"‡","⇊":"⇊","⩷":"⩷","°":"°","°":"°","δ":"δ","⦱":"⦱","⥿":"⥿","𝔡":"𝔡","⇃":"⇃","⇂":"⇂","⋄":"⋄","⋄":"⋄","♦":"♦","♦":"♦","¨":"¨","ϝ":"ϝ","⋲":"⋲","÷":"÷","÷":"÷","÷":"÷","⋇":"⋇","⋇":"⋇","ђ":"ђ","⌞":"⌞","⌍":"⌍","$":"$","𝕕":"𝕕","˙":"˙","≐":"≐","≑":"≑","∸":"∸","∔":"∔","⊡":"⊡","⌆":"⌆","↓":"↓","⇊":"⇊","⇃":"⇃","⇂":"⇂","⤐":"⤐","⌟":"⌟","⌌":"⌌","𝒹":"𝒹","ѕ":"ѕ","⧶":"⧶","đ":"đ","⋱":"⋱","▿":"▿","▾":"▾","⇵":"⇵","⥯":"⥯","⦦":"⦦","џ":"џ","⟿":"⟿","⩷":"⩷","≑":"≑","é":"é","é":"é","⩮":"⩮","ě":"ě","≖":"≖","ê":"ê","ê":"ê","≕":"≕","э":"э","ė":"ė","ⅇ":"ⅇ","≒":"≒","𝔢":"𝔢","⪚":"⪚","è":"è","è":"è","⪖":"⪖","⪘":"⪘","⪙":"⪙","⏧":"⏧","ℓ":"ℓ","⪕":"⪕","⪗":"⪗","ē":"ē","∅":"∅","∅":"∅","∅":"∅"," ":" "," ":" "," ":" ","ŋ":"ŋ"," ":" ","ę":"ę","𝕖":"𝕖","⋕":"⋕","⧣":"⧣","⩱":"⩱","ε":"ε","ε":"ε","ϵ":"ϵ","≖":"≖","≕":"≕","≂":"≂","⪖":"⪖","⪕":"⪕","=":"=","≟":"≟","≡":"≡","⩸":"⩸","⧥":"⧥","≓":"≓","⥱":"⥱","ℯ":"ℯ","≐":"≐","≂":"≂","η":"η","ð":"ð","ð":"ð","ë":"ë","ë":"ë","€":"€","!":"!","∃":"∃","ℰ":"ℰ","ⅇ":"ⅇ","≒":"≒","ф":"ф","♀":"♀","ffi":"ffi","ff":"ff","ffl":"ffl","𝔣":"𝔣","fi":"fi","fj":"fj","♭":"♭","fl":"fl","▱":"▱","ƒ":"ƒ","𝕗":"𝕗","∀":"∀","⋔":"⋔","⫙":"⫙","⨍":"⨍","½":"½","½":"½","⅓":"⅓","¼":"¼","¼":"¼","⅕":"⅕","⅙":"⅙","⅛":"⅛","⅔":"⅔","⅖":"⅖","¾":"¾","¾":"¾","⅗":"⅗","⅜":"⅜","⅘":"⅘","⅚":"⅚","⅝":"⅝","⅞":"⅞","⁄":"⁄","⌢":"⌢","𝒻":"𝒻","≧":"≧","⪌":"⪌","ǵ":"ǵ","γ":"γ","ϝ":"ϝ","⪆":"⪆","ğ":"ğ","ĝ":"ĝ","г":"г","ġ":"ġ","≥":"≥","⋛":"⋛","≥":"≥","≧":"≧","⩾":"⩾","⩾":"⩾","⪩":"⪩","⪀":"⪀","⪂":"⪂","⪄":"⪄","⋛︀":"⋛︀","⪔":"⪔","𝔤":"𝔤","≫":"≫","⋙":"⋙","ℷ":"ℷ","ѓ":"ѓ","≷":"≷","⪒":"⪒","⪥":"⪥","⪤":"⪤","≩":"≩","⪊":"⪊","⪊":"⪊","⪈":"⪈","⪈":"⪈","≩":"≩","⋧":"⋧","𝕘":"𝕘","`":"`","ℊ":"ℊ","≳":"≳","⪎":"⪎","⪐":"⪐",">":">",">":">","⪧":"⪧","⩺":"⩺","⋗":"⋗","⦕":"⦕","⩼":"⩼","⪆":"⪆","⥸":"⥸","⋗":"⋗","⋛":"⋛","⪌":"⪌","≷":"≷","≳":"≳","≩︀":"≩︀","≩︀":"≩︀","⇔":"⇔"," ":" ","½":"½","ℋ":"ℋ","ъ":"ъ","↔":"↔","⥈":"⥈","↭":"↭","ℏ":"ℏ","ĥ":"ĥ","♥":"♥","♥":"♥","…":"…","⊹":"⊹","𝔥":"𝔥","⤥":"⤥","⤦":"⤦","⇿":"⇿","∻":"∻","↩":"↩","↪":"↪","𝕙":"𝕙","―":"―","𝒽":"𝒽","ℏ":"ℏ","ħ":"ħ","⁃":"⁃","‐":"‐","í":"í","í":"í","⁣":"⁣","î":"î","î":"î","и":"и","е":"е","¡":"¡","¡":"¡","⇔":"⇔","𝔦":"𝔦","ì":"ì","ì":"ì","ⅈ":"ⅈ","⨌":"⨌","∭":"∭","⧜":"⧜","℩":"℩","ij":"ij","ī":"ī","ℑ":"ℑ","ℐ":"ℐ","ℑ":"ℑ","ı":"ı","⊷":"⊷","Ƶ":"Ƶ","∈":"∈","℅":"℅","∞":"∞","⧝":"⧝","ı":"ı","∫":"∫","⊺":"⊺","ℤ":"ℤ","⊺":"⊺","⨗":"⨗","⨼":"⨼","ё":"ё","į":"į","𝕚":"𝕚","ι":"ι","⨼":"⨼","¿":"¿","¿":"¿","𝒾":"𝒾","∈":"∈","⋹":"⋹","⋵":"⋵","⋴":"⋴","⋳":"⋳","∈":"∈","⁢":"⁢","ĩ":"ĩ","і":"і","ï":"ï","ï":"ï","ĵ":"ĵ","й":"й","𝔧":"𝔧","ȷ":"ȷ","𝕛":"𝕛","𝒿":"𝒿","ј":"ј","є":"є","κ":"κ","ϰ":"ϰ","ķ":"ķ","к":"к","𝔨":"𝔨","ĸ":"ĸ","х":"х","ќ":"ќ","𝕜":"𝕜","𝓀":"𝓀","⇚":"⇚","⇐":"⇐","⤛":"⤛","⤎":"⤎","≦":"≦","⪋":"⪋","⥢":"⥢","ĺ":"ĺ","⦴":"⦴","ℒ":"ℒ","λ":"λ","⟨":"⟨","⦑":"⦑","⟨":"⟨","⪅":"⪅","«":"«","«":"«","←":"←","⇤":"⇤","⤟":"⤟","⤝":"⤝","↩":"↩","↫":"↫","⤹":"⤹","⥳":"⥳","↢":"↢","⪫":"⪫","⤙":"⤙","⪭":"⪭","⪭︀":"⪭︀","⤌":"⤌","❲":"❲","{":"{","[":"[","⦋":"⦋","⦏":"⦏","⦍":"⦍","ľ":"ľ","ļ":"ļ","⌈":"⌈","{":"{","л":"л","⤶":"⤶","“":"“","„":"„","⥧":"⥧","⥋":"⥋","↲":"↲","≤":"≤","←":"←","↢":"↢","↽":"↽","↼":"↼","⇇":"⇇","↔":"↔","⇆":"⇆","⇋":"⇋","↭":"↭","⋋":"⋋","⋚":"⋚","≤":"≤","≦":"≦","⩽":"⩽","⩽":"⩽","⪨":"⪨","⩿":"⩿","⪁":"⪁","⪃":"⪃","⋚︀":"⋚︀","⪓":"⪓","⪅":"⪅","⋖":"⋖","⋚":"⋚","⪋":"⪋","≶":"≶","≲":"≲","⥼":"⥼","⌊":"⌊","𝔩":"𝔩","≶":"≶","⪑":"⪑","↽":"↽","↼":"↼","⥪":"⥪","▄":"▄","љ":"љ","≪":"≪","⇇":"⇇","⌞":"⌞","⥫":"⥫","◺":"◺","ŀ":"ŀ","⎰":"⎰","⎰":"⎰","≨":"≨","⪉":"⪉","⪉":"⪉","⪇":"⪇","⪇":"⪇","≨":"≨","⋦":"⋦","⟬":"⟬","⇽":"⇽","⟦":"⟦","⟵":"⟵","⟷":"⟷","⟼":"⟼","⟶":"⟶","↫":"↫","↬":"↬","⦅":"⦅","𝕝":"𝕝","⨭":"⨭","⨴":"⨴","∗":"∗","_":"_","◊":"◊","◊":"◊","⧫":"⧫","(":"(","⦓":"⦓","⇆":"⇆","⌟":"⌟","⇋":"⇋","⥭":"⥭","‎":"‎","⊿":"⊿","‹":"‹","𝓁":"𝓁","↰":"↰","≲":"≲","⪍":"⪍","⪏":"⪏","[":"[","‘":"‘","‚":"‚","ł":"ł","<":"<","<":"<","⪦":"⪦","⩹":"⩹","⋖":"⋖","⋋":"⋋","⋉":"⋉","⥶":"⥶","⩻":"⩻","⦖":"⦖","◃":"◃","⊴":"⊴","◂":"◂","⥊":"⥊","⥦":"⥦","≨︀":"≨︀","≨︀":"≨︀","∺":"∺","¯":"¯","¯":"¯","♂":"♂","✠":"✠","✠":"✠","↦":"↦","↦":"↦","↧":"↧","↤":"↤","↥":"↥","▮":"▮","⨩":"⨩","м":"м","—":"—","∡":"∡","𝔪":"𝔪","℧":"℧","µ":"µ","µ":"µ","∣":"∣","*":"*","⫰":"⫰","·":"·","·":"·","−":"−","⊟":"⊟","∸":"∸","⨪":"⨪","⫛":"⫛","…":"…","∓":"∓","⊧":"⊧","𝕞":"𝕞","∓":"∓","𝓂":"𝓂","∾":"∾","μ":"μ","⊸":"⊸","⊸":"⊸","⋙̸":"⋙̸","≫⃒":"≫⃒","≫̸":"≫̸","⇍":"⇍","⇎":"⇎","⋘̸":"⋘̸","≪⃒":"≪⃒","≪̸":"≪̸","⇏":"⇏","⊯":"⊯","⊮":"⊮","∇":"∇","ń":"ń","∠⃒":"∠⃒","≉":"≉","⩰̸":"⩰̸","≋̸":"≋̸","ʼn":"ʼn","≉":"≉","♮":"♮","♮":"♮","ℕ":"ℕ"," ":" "," ":" ","≎̸":"≎̸","≏̸":"≏̸","⩃":"⩃","ň":"ň","ņ":"ņ","≇":"≇","⩭̸":"⩭̸","⩂":"⩂","н":"н","–":"–","≠":"≠","⇗":"⇗","⤤":"⤤","↗":"↗","↗":"↗","≐̸":"≐̸","≢":"≢","⤨":"⤨","≂̸":"≂̸","∄":"∄","∄":"∄","𝔫":"𝔫","≧̸":"≧̸","≱":"≱","≱":"≱","≧̸":"≧̸","⩾̸":"⩾̸","⩾̸":"⩾̸","≵":"≵","≯":"≯","≯":"≯","⇎":"⇎","↮":"↮","⫲":"⫲","∋":"∋","⋼":"⋼","⋺":"⋺","∋":"∋","њ":"њ","⇍":"⇍","≦̸":"≦̸","↚":"↚","‥":"‥","≰":"≰","↚":"↚","↮":"↮","≰":"≰","≦̸":"≦̸","⩽̸":"⩽̸","⩽̸":"⩽̸","≮":"≮","≴":"≴","≮":"≮","⋪":"⋪","⋬":"⋬","∤":"∤","𝕟":"𝕟","¬":"¬","¬":"¬","∉":"∉","⋹̸":"⋹̸","⋵̸":"⋵̸","∉":"∉","⋷":"⋷","⋶":"⋶","∌":"∌","∌":"∌","⋾":"⋾","⋽":"⋽","∦":"∦","∦":"∦","⫽⃥":"⫽⃥","∂̸":"∂̸","⨔":"⨔","⊀":"⊀","⋠":"⋠","⪯̸":"⪯̸","⊀":"⊀","⪯̸":"⪯̸","⇏":"⇏","↛":"↛","⤳̸":"⤳̸","↝̸":"↝̸","↛":"↛","⋫":"⋫","⋭":"⋭","⊁":"⊁","⋡":"⋡","⪰̸":"⪰̸","𝓃":"𝓃","∤":"∤","∦":"∦","≁":"≁","≄":"≄","≄":"≄","∤":"∤","∦":"∦","⋢":"⋢","⋣":"⋣","⊄":"⊄","⫅̸":"⫅̸","⊈":"⊈","⊂⃒":"⊂⃒","⊈":"⊈","⫅̸":"⫅̸","⊁":"⊁","⪰̸":"⪰̸","⊅":"⊅","⫆̸":"⫆̸","⊉":"⊉","⊃⃒":"⊃⃒","⊉":"⊉","⫆̸":"⫆̸","≹":"≹","ñ":"ñ","ñ":"ñ","≸":"≸","⋪":"⋪","⋬":"⋬","⋫":"⋫","⋭":"⋭","ν":"ν","#":"#","№":"№"," ":" ","⊭":"⊭","⤄":"⤄","≍⃒":"≍⃒","⊬":"⊬","≥⃒":"≥⃒",">⃒":">⃒","⧞":"⧞","⤂":"⤂","≤⃒":"≤⃒","<⃒":"<⃒","⊴⃒":"⊴⃒","⤃":"⤃","⊵⃒":"⊵⃒","∼⃒":"∼⃒","⇖":"⇖","⤣":"⤣","↖":"↖","↖":"↖","⤧":"⤧","Ⓢ":"Ⓢ","ó":"ó","ó":"ó","⊛":"⊛","⊚":"⊚","ô":"ô","ô":"ô","о":"о","⊝":"⊝","ő":"ő","⨸":"⨸","⊙":"⊙","⦼":"⦼","œ":"œ","⦿":"⦿","𝔬":"𝔬","˛":"˛","ò":"ò","ò":"ò","⧁":"⧁","⦵":"⦵","Ω":"Ω","∮":"∮","↺":"↺","⦾":"⦾","⦻":"⦻","‾":"‾","⧀":"⧀","ō":"ō","ω":"ω","ο":"ο","⦶":"⦶","⊖":"⊖","𝕠":"𝕠","⦷":"⦷","⦹":"⦹","⊕":"⊕","∨":"∨","↻":"↻","⩝":"⩝","ℴ":"ℴ","ℴ":"ℴ","ª":"ª","ª":"ª","º":"º","º":"º","⊶":"⊶","⩖":"⩖","⩗":"⩗","⩛":"⩛","ℴ":"ℴ","ø":"ø","ø":"ø","⊘":"⊘","õ":"õ","õ":"õ","⊗":"⊗","⨶":"⨶","ö":"ö","ö":"ö","⌽":"⌽","∥":"∥","¶":"¶","¶":"¶","∥":"∥","⫳":"⫳","⫽":"⫽","∂":"∂","п":"п","%":"%",".":".","‰":"‰","⊥":"⊥","‱":"‱","𝔭":"𝔭","φ":"φ","ϕ":"ϕ","ℳ":"ℳ","☎":"☎","π":"π","⋔":"⋔","ϖ":"ϖ","ℏ":"ℏ","ℎ":"ℎ","ℏ":"ℏ","+":"+","⨣":"⨣","⊞":"⊞","⨢":"⨢","∔":"∔","⨥":"⨥","⩲":"⩲","±":"±","±":"±","⨦":"⨦","⨧":"⨧","±":"±","⨕":"⨕","𝕡":"𝕡","£":"£","£":"£","≺":"≺","⪳":"⪳","⪷":"⪷","≼":"≼","⪯":"⪯","≺":"≺","⪷":"⪷","≼":"≼","⪯":"⪯","⪹":"⪹","⪵":"⪵","⋨":"⋨","≾":"≾","′":"′","ℙ":"ℙ","⪵":"⪵","⪹":"⪹","⋨":"⋨","∏":"∏","⌮":"⌮","⌒":"⌒","⌓":"⌓","∝":"∝","∝":"∝","≾":"≾","⊰":"⊰","𝓅":"𝓅","ψ":"ψ"," ":" ","𝔮":"𝔮","⨌":"⨌","𝕢":"𝕢","⁗":"⁗","𝓆":"𝓆","ℍ":"ℍ","⨖":"⨖","?":"?","≟":"≟",""":'"',""":'"',"⇛":"⇛","⇒":"⇒","⤜":"⤜","⤏":"⤏","⥤":"⥤","∽̱":"∽̱","ŕ":"ŕ","√":"√","⦳":"⦳","⟩":"⟩","⦒":"⦒","⦥":"⦥","⟩":"⟩","»":"»","»":"»","→":"→","⥵":"⥵","⇥":"⇥","⤠":"⤠","⤳":"⤳","⤞":"⤞","↪":"↪","↬":"↬","⥅":"⥅","⥴":"⥴","↣":"↣","↝":"↝","⤚":"⤚","∶":"∶","ℚ":"ℚ","⤍":"⤍","❳":"❳","}":"}","]":"]","⦌":"⦌","⦎":"⦎","⦐":"⦐","ř":"ř","ŗ":"ŗ","⌉":"⌉","}":"}","р":"р","⤷":"⤷","⥩":"⥩","”":"”","”":"”","↳":"↳","ℜ":"ℜ","ℛ":"ℛ","ℜ":"ℜ","ℝ":"ℝ","▭":"▭","®":"®","®":"®","⥽":"⥽","⌋":"⌋","𝔯":"𝔯","⇁":"⇁","⇀":"⇀","⥬":"⥬","ρ":"ρ","ϱ":"ϱ","→":"→","↣":"↣","⇁":"⇁","⇀":"⇀","⇄":"⇄","⇌":"⇌","⇉":"⇉","↝":"↝","⋌":"⋌","˚":"˚","≓":"≓","⇄":"⇄","⇌":"⇌","‏":"‏","⎱":"⎱","⎱":"⎱","⫮":"⫮","⟭":"⟭","⇾":"⇾","⟧":"⟧","⦆":"⦆","𝕣":"𝕣","⨮":"⨮","⨵":"⨵",")":")","⦔":"⦔","⨒":"⨒","⇉":"⇉","›":"›","𝓇":"𝓇","↱":"↱","]":"]","’":"’","’":"’","⋌":"⋌","⋊":"⋊","▹":"▹","⊵":"⊵","▸":"▸","⧎":"⧎","⥨":"⥨","℞":"℞","ś":"ś","‚":"‚","≻":"≻","⪴":"⪴","⪸":"⪸","š":"š","≽":"≽","⪰":"⪰","ş":"ş","ŝ":"ŝ","⪶":"⪶","⪺":"⪺","⋩":"⋩","⨓":"⨓","≿":"≿","с":"с","⋅":"⋅","⊡":"⊡","⩦":"⩦","⇘":"⇘","⤥":"⤥","↘":"↘","↘":"↘","§":"§","§":"§",";":";","⤩":"⤩","∖":"∖","∖":"∖","✶":"✶","𝔰":"𝔰","⌢":"⌢","♯":"♯","щ":"щ","ш":"ш","∣":"∣","∥":"∥","­":"­","­":"­","σ":"σ","ς":"ς","ς":"ς","∼":"∼","⩪":"⩪","≃":"≃","≃":"≃","⪞":"⪞","⪠":"⪠","⪝":"⪝","⪟":"⪟","≆":"≆","⨤":"⨤","⥲":"⥲","←":"←","∖":"∖","⨳":"⨳","⧤":"⧤","∣":"∣","⌣":"⌣","⪪":"⪪","⪬":"⪬","⪬︀":"⪬︀","ь":"ь","/":"/","⧄":"⧄","⌿":"⌿","𝕤":"𝕤","♠":"♠","♠":"♠","∥":"∥","⊓":"⊓","⊓︀":"⊓︀","⊔":"⊔","⊔︀":"⊔︀","⊏":"⊏","⊑":"⊑","⊏":"⊏","⊑":"⊑","⊐":"⊐","⊒":"⊒","⊐":"⊐","⊒":"⊒","□":"□","□":"□","▪":"▪","▪":"▪","→":"→","𝓈":"𝓈","∖":"∖","⌣":"⌣","⋆":"⋆","☆":"☆","★":"★","ϵ":"ϵ","ϕ":"ϕ","¯":"¯","⊂":"⊂","⫅":"⫅","⪽":"⪽","⊆":"⊆","⫃":"⫃","⫁":"⫁","⫋":"⫋","⊊":"⊊","⪿":"⪿","⥹":"⥹","⊂":"⊂","⊆":"⊆","⫅":"⫅","⊊":"⊊","⫋":"⫋","⫇":"⫇","⫕":"⫕","⫓":"⫓","≻":"≻","⪸":"⪸","≽":"≽","⪰":"⪰","⪺":"⪺","⪶":"⪶","⋩":"⋩","≿":"≿","∑":"∑","♪":"♪","¹":"¹","¹":"¹","²":"²","²":"²","³":"³","³":"³","⊃":"⊃","⫆":"⫆","⪾":"⪾","⫘":"⫘","⊇":"⊇","⫄":"⫄","⟉":"⟉","⫗":"⫗","⥻":"⥻","⫂":"⫂","⫌":"⫌","⊋":"⊋","⫀":"⫀","⊃":"⊃","⊇":"⊇","⫆":"⫆","⊋":"⊋","⫌":"⫌","⫈":"⫈","⫔":"⫔","⫖":"⫖","⇙":"⇙","⤦":"⤦","↙":"↙","↙":"↙","⤪":"⤪","ß":"ß","ß":"ß","⌖":"⌖","τ":"τ","⎴":"⎴","ť":"ť","ţ":"ţ","т":"т","⃛":"⃛","⌕":"⌕","𝔱":"𝔱","∴":"∴","∴":"∴","θ":"θ","ϑ":"ϑ","ϑ":"ϑ","≈":"≈","∼":"∼"," ":" ","≈":"≈","∼":"∼","þ":"þ","þ":"þ","˜":"˜","×":"×","×":"×","⊠":"⊠","⨱":"⨱","⨰":"⨰","∭":"∭","⤨":"⤨","⊤":"⊤","⌶":"⌶","⫱":"⫱","𝕥":"𝕥","⫚":"⫚","⤩":"⤩","‴":"‴","™":"™","▵":"▵","▿":"▿","◃":"◃","⊴":"⊴","≜":"≜","▹":"▹","⊵":"⊵","◬":"◬","≜":"≜","⨺":"⨺","⨹":"⨹","⧍":"⧍","⨻":"⨻","⏢":"⏢","𝓉":"𝓉","ц":"ц","ћ":"ћ","ŧ":"ŧ","≬":"≬","↞":"↞","↠":"↠","⇑":"⇑","⥣":"⥣","ú":"ú","ú":"ú","↑":"↑","ў":"ў","ŭ":"ŭ","û":"û","û":"û","у":"у","⇅":"⇅","ű":"ű","⥮":"⥮","⥾":"⥾","𝔲":"𝔲","ù":"ù","ù":"ù","↿":"↿","↾":"↾","▀":"▀","⌜":"⌜","⌜":"⌜","⌏":"⌏","◸":"◸","ū":"ū","¨":"¨","¨":"¨","ų":"ų","𝕦":"𝕦","↑":"↑","↕":"↕","↿":"↿","↾":"↾","⊎":"⊎","υ":"υ","ϒ":"ϒ","υ":"υ","⇈":"⇈","⌝":"⌝","⌝":"⌝","⌎":"⌎","ů":"ů","◹":"◹","𝓊":"𝓊","⋰":"⋰","ũ":"ũ","▵":"▵","▴":"▴","⇈":"⇈","ü":"ü","ü":"ü","⦧":"⦧","⇕":"⇕","⫨":"⫨","⫩":"⫩","⊨":"⊨","⦜":"⦜","ϵ":"ϵ","ϰ":"ϰ","∅":"∅","ϕ":"ϕ","ϖ":"ϖ","∝":"∝","↕":"↕","ϱ":"ϱ","ς":"ς","⊊︀":"⊊︀","⫋︀":"⫋︀","⊋︀":"⊋︀","⫌︀":"⫌︀","ϑ":"ϑ","⊲":"⊲","⊳":"⊳","в":"в","⊢":"⊢","∨":"∨","⊻":"⊻","≚":"≚","⋮":"⋮","|":"|","|":"|","𝔳":"𝔳","⊲":"⊲","⊂⃒":"⊂⃒","⊃⃒":"⊃⃒","𝕧":"𝕧","∝":"∝","⊳":"⊳","𝓋":"𝓋","⫋︀":"⫋︀","⊊︀":"⊊︀","⫌︀":"⫌︀","⊋︀":"⊋︀","⦚":"⦚","ŵ":"ŵ","⩟":"⩟","∧":"∧","≙":"≙","℘":"℘","𝔴":"𝔴","𝕨":"𝕨","℘":"℘","≀":"≀","≀":"≀","𝓌":"𝓌","⋂":"⋂","◯":"◯","⋃":"⋃","▽":"▽","𝔵":"𝔵","⟺":"⟺","⟷":"⟷","ξ":"ξ","⟸":"⟸","⟵":"⟵","⟼":"⟼","⋻":"⋻","⨀":"⨀","𝕩":"𝕩","⨁":"⨁","⨂":"⨂","⟹":"⟹","⟶":"⟶","𝓍":"𝓍","⨆":"⨆","⨄":"⨄","△":"△","⋁":"⋁","⋀":"⋀","ý":"ý","ý":"ý","я":"я","ŷ":"ŷ","ы":"ы","¥":"¥","¥":"¥","𝔶":"𝔶","ї":"ї","𝕪":"𝕪","𝓎":"𝓎","ю":"ю","ÿ":"ÿ","ÿ":"ÿ","ź":"ź","ž":"ž","з":"з","ż":"ż","ℨ":"ℨ","ζ":"ζ","𝔷":"𝔷","ж":"ж","⇝":"⇝","𝕫":"𝕫","𝓏":"𝓏","‍":"‍","‌":"‌"},characters:{"Æ":"Æ","&":"&","Á":"Á","Ă":"Ă","Â":"Â","А":"А","𝔄":"𝔄","À":"À","Α":"Α","Ā":"Ā","⩓":"⩓","Ą":"Ą","𝔸":"𝔸","⁡":"⁡","Å":"Å","𝒜":"𝒜","≔":"≔","Ã":"Ã","Ä":"Ä","∖":"∖","⫧":"⫧","⌆":"⌆","Б":"Б","∵":"∵","ℬ":"ℬ","Β":"Β","𝔅":"𝔅","𝔹":"𝔹","˘":"˘","≎":"≎","Ч":"Ч","©":"©","Ć":"Ć","⋒":"⋒","ⅅ":"ⅅ","ℭ":"ℭ","Č":"Č","Ç":"Ç","Ĉ":"Ĉ","∰":"∰","Ċ":"Ċ","¸":"¸","·":"·","Χ":"Χ","⊙":"⊙","⊖":"⊖","⊕":"⊕","⊗":"⊗","∲":"∲","”":"”","’":"’","∷":"∷","⩴":"⩴","≡":"≡","∯":"∯","∮":"∮","ℂ":"ℂ","∐":"∐","∳":"∳","⨯":"⨯","𝒞":"𝒞","⋓":"⋓","≍":"≍","⤑":"⤑","Ђ":"Ђ","Ѕ":"Ѕ","Џ":"Џ","‡":"‡","↡":"↡","⫤":"⫤","Ď":"Ď","Д":"Д","∇":"∇","Δ":"Δ","𝔇":"𝔇","´":"´","˙":"˙","˝":"˝","`":"`","˜":"˜","⋄":"⋄","ⅆ":"ⅆ","𝔻":"𝔻","¨":"¨","⃜":"⃜","≐":"≐","⇓":"⇓","⇐":"⇐","⇔":"⇔","⟸":"⟸","⟺":"⟺","⟹":"⟹","⇒":"⇒","⊨":"⊨","⇑":"⇑","⇕":"⇕","∥":"∥","↓":"↓","⤓":"⤓","⇵":"⇵","̑":"̑","⥐":"⥐","⥞":"⥞","↽":"↽","⥖":"⥖","⥟":"⥟","⇁":"⇁","⥗":"⥗","⊤":"⊤","↧":"↧","𝒟":"𝒟","Đ":"Đ","Ŋ":"Ŋ","Ð":"Ð","É":"É","Ě":"Ě","Ê":"Ê","Э":"Э","Ė":"Ė","𝔈":"𝔈","È":"È","∈":"∈","Ē":"Ē","◻":"◻","▫":"▫","Ę":"Ę","𝔼":"𝔼","Ε":"Ε","⩵":"⩵","≂":"≂","⇌":"⇌","ℰ":"ℰ","⩳":"⩳","Η":"Η","Ë":"Ë","∃":"∃","ⅇ":"ⅇ","Ф":"Ф","𝔉":"𝔉","◼":"◼","▪":"▪","𝔽":"𝔽","∀":"∀","ℱ":"ℱ","Ѓ":"Ѓ",">":">","Γ":"Γ","Ϝ":"Ϝ","Ğ":"Ğ","Ģ":"Ģ","Ĝ":"Ĝ","Г":"Г","Ġ":"Ġ","𝔊":"𝔊","⋙":"⋙","𝔾":"𝔾","≥":"≥","⋛":"⋛","≧":"≧","⪢":"⪢","≷":"≷","⩾":"⩾","≳":"≳","𝒢":"𝒢","≫":"≫","Ъ":"Ъ","ˇ":"ˇ","^":"^","Ĥ":"Ĥ","ℌ":"ℌ","ℋ":"ℋ","ℍ":"ℍ","─":"─","Ħ":"Ħ","≏":"≏","Е":"Е","IJ":"IJ","Ё":"Ё","Í":"Í","Î":"Î","И":"И","İ":"İ","ℑ":"ℑ","Ì":"Ì","Ī":"Ī","ⅈ":"ⅈ","∬":"∬","∫":"∫","⋂":"⋂","⁣":"⁣","⁢":"⁢","Į":"Į","𝕀":"𝕀","Ι":"Ι","ℐ":"ℐ","Ĩ":"Ĩ","І":"І","Ï":"Ï","Ĵ":"Ĵ","Й":"Й","𝔍":"𝔍","𝕁":"𝕁","𝒥":"𝒥","Ј":"Ј","Є":"Є","Х":"Х","Ќ":"Ќ","Κ":"Κ","Ķ":"Ķ","К":"К","𝔎":"𝔎","𝕂":"𝕂","𝒦":"𝒦","Љ":"Љ","<":"<","Ĺ":"Ĺ","Λ":"Λ","⟪":"⟪","ℒ":"ℒ","↞":"↞","Ľ":"Ľ","Ļ":"Ļ","Л":"Л","⟨":"⟨","←":"←","⇤":"⇤","⇆":"⇆","⌈":"⌈","⟦":"⟦","⥡":"⥡","⇃":"⇃","⥙":"⥙","⌊":"⌊","↔":"↔","⥎":"⥎","⊣":"⊣","↤":"↤","⥚":"⥚","⊲":"⊲","⧏":"⧏","⊴":"⊴","⥑":"⥑","⥠":"⥠","↿":"↿","⥘":"⥘","↼":"↼","⥒":"⥒","⋚":"⋚","≦":"≦","≶":"≶","⪡":"⪡","⩽":"⩽","≲":"≲","𝔏":"𝔏","⋘":"⋘","⇚":"⇚","Ŀ":"Ŀ","⟵":"⟵","⟷":"⟷","⟶":"⟶","𝕃":"𝕃","↙":"↙","↘":"↘","↰":"↰","Ł":"Ł","≪":"≪","⤅":"⤅","М":"М"," ":" ","ℳ":"ℳ","𝔐":"𝔐","∓":"∓","𝕄":"𝕄","Μ":"Μ","Њ":"Њ","Ń":"Ń","Ň":"Ň","Ņ":"Ņ","Н":"Н","​":"​","\n":" ","𝔑":"𝔑","⁠":"⁠"," ":" ","ℕ":"ℕ","⫬":"⫬","≢":"≢","≭":"≭","∦":"∦","∉":"∉","≠":"≠","≂̸":"≂̸","∄":"∄","≯":"≯","≱":"≱","≧̸":"≧̸","≫̸":"≫̸","≹":"≹","⩾̸":"⩾̸","≵":"≵","≎̸":"≎̸","≏̸":"≏̸","⋪":"⋪","⧏̸":"⧏̸","⋬":"⋬","≮":"≮","≰":"≰","≸":"≸","≪̸":"≪̸","⩽̸":"⩽̸","≴":"≴","⪢̸":"⪢̸","⪡̸":"⪡̸","⊀":"⊀","⪯̸":"⪯̸","⋠":"⋠","∌":"∌","⋫":"⋫","⧐̸":"⧐̸","⋭":"⋭","⊏̸":"⊏̸","⋢":"⋢","⊐̸":"⊐̸","⋣":"⋣","⊂⃒":"⊂⃒","⊈":"⊈","⊁":"⊁","⪰̸":"⪰̸","⋡":"⋡","≿̸":"≿̸","⊃⃒":"⊃⃒","⊉":"⊉","≁":"≁","≄":"≄","≇":"≇","≉":"≉","∤":"∤","𝒩":"𝒩","Ñ":"Ñ","Ν":"Ν","Œ":"Œ","Ó":"Ó","Ô":"Ô","О":"О","Ő":"Ő","𝔒":"𝔒","Ò":"Ò","Ō":"Ō","Ω":"Ω","Ο":"Ο","𝕆":"𝕆","“":"“","‘":"‘","⩔":"⩔","𝒪":"𝒪","Ø":"Ø","Õ":"Õ","⨷":"⨷","Ö":"Ö","‾":"‾","⏞":"⏞","⎴":"⎴","⏜":"⏜","∂":"∂","П":"П","𝔓":"𝔓","Φ":"Φ","Π":"Π","±":"±","ℙ":"ℙ","⪻":"⪻","≺":"≺","⪯":"⪯","≼":"≼","≾":"≾","″":"″","∏":"∏","∝":"∝","𝒫":"𝒫","Ψ":"Ψ",'"':""","𝔔":"𝔔","ℚ":"ℚ","𝒬":"𝒬","⤐":"⤐","®":"®","Ŕ":"Ŕ","⟫":"⟫","↠":"↠","⤖":"⤖","Ř":"Ř","Ŗ":"Ŗ","Р":"Р","ℜ":"ℜ","∋":"∋","⇋":"⇋","⥯":"⥯","Ρ":"Ρ","⟩":"⟩","→":"→","⇥":"⇥","⇄":"⇄","⌉":"⌉","⟧":"⟧","⥝":"⥝","⇂":"⇂","⥕":"⥕","⌋":"⌋","⊢":"⊢","↦":"↦","⥛":"⥛","⊳":"⊳","⧐":"⧐","⊵":"⊵","⥏":"⥏","⥜":"⥜","↾":"↾","⥔":"⥔","⇀":"⇀","⥓":"⥓","ℝ":"ℝ","⥰":"⥰","⇛":"⇛","ℛ":"ℛ","↱":"↱","⧴":"⧴","Щ":"Щ","Ш":"Ш","Ь":"Ь","Ś":"Ś","⪼":"⪼","Š":"Š","Ş":"Ş","Ŝ":"Ŝ","С":"С","𝔖":"𝔖","↑":"↑","Σ":"Σ","∘":"∘","𝕊":"𝕊","√":"√","□":"□","⊓":"⊓","⊏":"⊏","⊑":"⊑","⊐":"⊐","⊒":"⊒","⊔":"⊔","𝒮":"𝒮","⋆":"⋆","⋐":"⋐","⊆":"⊆","≻":"≻","⪰":"⪰","≽":"≽","≿":"≿","∑":"∑","⋑":"⋑","⊃":"⊃","⊇":"⊇","Þ":"Þ","™":"™","Ћ":"Ћ","Ц":"Ц","\t":" ","Τ":"Τ","Ť":"Ť","Ţ":"Ţ","Т":"Т","𝔗":"𝔗","∴":"∴","Θ":"Θ","  ":"  "," ":" ","∼":"∼","≃":"≃","≅":"≅","≈":"≈","𝕋":"𝕋","⃛":"⃛","𝒯":"𝒯","Ŧ":"Ŧ","Ú":"Ú","↟":"↟","⥉":"⥉","Ў":"Ў","Ŭ":"Ŭ","Û":"Û","У":"У","Ű":"Ű","𝔘":"𝔘","Ù":"Ù","Ū":"Ū",_:"_","⏟":"⏟","⎵":"⎵","⏝":"⏝","⋃":"⋃","⊎":"⊎","Ų":"Ų","𝕌":"𝕌","⤒":"⤒","⇅":"⇅","↕":"↕","⥮":"⥮","⊥":"⊥","↥":"↥","↖":"↖","↗":"↗","ϒ":"ϒ","Υ":"Υ","Ů":"Ů","𝒰":"𝒰","Ũ":"Ũ","Ü":"Ü","⊫":"⊫","⫫":"⫫","В":"В","⊩":"⊩","⫦":"⫦","⋁":"⋁","‖":"‖","∣":"∣","|":"|","❘":"❘","≀":"≀"," ":" ","𝔙":"𝔙","𝕍":"𝕍","𝒱":"𝒱","⊪":"⊪","Ŵ":"Ŵ","⋀":"⋀","𝔚":"𝔚","𝕎":"𝕎","𝒲":"𝒲","𝔛":"𝔛","Ξ":"Ξ","𝕏":"𝕏","𝒳":"𝒳","Я":"Я","Ї":"Ї","Ю":"Ю","Ý":"Ý","Ŷ":"Ŷ","Ы":"Ы","𝔜":"𝔜","𝕐":"𝕐","𝒴":"𝒴","Ÿ":"Ÿ","Ж":"Ж","Ź":"Ź","Ž":"Ž","З":"З","Ż":"Ż","Ζ":"Ζ","ℨ":"ℨ","ℤ":"ℤ","𝒵":"𝒵","á":"á","ă":"ă","∾":"∾","∾̳":"∾̳","∿":"∿","â":"â","а":"а","æ":"æ","𝔞":"𝔞","à":"à","ℵ":"ℵ","α":"α","ā":"ā","⨿":"⨿","∧":"∧","⩕":"⩕","⩜":"⩜","⩘":"⩘","⩚":"⩚","∠":"∠","⦤":"⦤","∡":"∡","⦨":"⦨","⦩":"⦩","⦪":"⦪","⦫":"⦫","⦬":"⦬","⦭":"⦭","⦮":"⦮","⦯":"⦯","∟":"∟","⊾":"⊾","⦝":"⦝","∢":"∢","⍼":"⍼","ą":"ą","𝕒":"𝕒","⩰":"⩰","⩯":"⩯","≊":"≊","≋":"≋","'":"'","å":"å","𝒶":"𝒶","*":"*","ã":"ã","ä":"ä","⨑":"⨑","⫭":"⫭","≌":"≌","϶":"϶","‵":"‵","∽":"∽","⋍":"⋍","⊽":"⊽","⌅":"⌅","⎶":"⎶","б":"б","„":"„","⦰":"⦰","β":"β","ℶ":"ℶ","≬":"≬","𝔟":"𝔟","◯":"◯","⨀":"⨀","⨁":"⨁","⨂":"⨂","⨆":"⨆","★":"★","▽":"▽","△":"△","⨄":"⨄","⤍":"⤍","⧫":"⧫","▴":"▴","▾":"▾","◂":"◂","▸":"▸","␣":"␣","▒":"▒","░":"░","▓":"▓","█":"█","=⃥":"=⃥","≡⃥":"≡⃥","⌐":"⌐","𝕓":"𝕓","⋈":"⋈","╗":"╗","╔":"╔","╖":"╖","╓":"╓","═":"═","╦":"╦","╩":"╩","╤":"╤","╧":"╧","╝":"╝","╚":"╚","╜":"╜","╙":"╙","║":"║","╬":"╬","╣":"╣","╠":"╠","╫":"╫","╢":"╢","╟":"╟","⧉":"⧉","╕":"╕","╒":"╒","┐":"┐","┌":"┌","╥":"╥","╨":"╨","┬":"┬","┴":"┴","⊟":"⊟","⊞":"⊞","⊠":"⊠","╛":"╛","╘":"╘","┘":"┘","└":"└","│":"│","╪":"╪","╡":"╡","╞":"╞","┼":"┼","┤":"┤","├":"├","¦":"¦","𝒷":"𝒷","⁏":"⁏","\\":"\","⧅":"⧅","⟈":"⟈","•":"•","⪮":"⪮","ć":"ć","∩":"∩","⩄":"⩄","⩉":"⩉","⩋":"⩋","⩇":"⩇","⩀":"⩀","∩︀":"∩︀","⁁":"⁁","⩍":"⩍","č":"č","ç":"ç","ĉ":"ĉ","⩌":"⩌","⩐":"⩐","ċ":"ċ","⦲":"⦲","¢":"¢","𝔠":"𝔠","ч":"ч","✓":"✓","χ":"χ","○":"○","⧃":"⧃","ˆ":"ˆ","≗":"≗","↺":"↺","↻":"↻","Ⓢ":"Ⓢ","⊛":"⊛","⊚":"⊚","⊝":"⊝","⨐":"⨐","⫯":"⫯","⧂":"⧂","♣":"♣",":":":",",":",","@":"@","∁":"∁","⩭":"⩭","𝕔":"𝕔","℗":"℗","↵":"↵","✗":"✗","𝒸":"𝒸","⫏":"⫏","⫑":"⫑","⫐":"⫐","⫒":"⫒","⋯":"⋯","⤸":"⤸","⤵":"⤵","⋞":"⋞","⋟":"⋟","↶":"↶","⤽":"⤽","∪":"∪","⩈":"⩈","⩆":"⩆","⩊":"⩊","⊍":"⊍","⩅":"⩅","∪︀":"∪︀","↷":"↷","⤼":"⤼","⋎":"⋎","⋏":"⋏","¤":"¤","∱":"∱","⌭":"⌭","⥥":"⥥","†":"†","ℸ":"ℸ","‐":"‐","⤏":"⤏","ď":"ď","д":"д","⇊":"⇊","⩷":"⩷","°":"°","δ":"δ","⦱":"⦱","⥿":"⥿","𝔡":"𝔡","♦":"♦","ϝ":"ϝ","⋲":"⋲","÷":"÷","⋇":"⋇","ђ":"ђ","⌞":"⌞","⌍":"⌍",$:"$","𝕕":"𝕕","≑":"≑","∸":"∸","∔":"∔","⊡":"⊡","⌟":"⌟","⌌":"⌌","𝒹":"𝒹","ѕ":"ѕ","⧶":"⧶","đ":"đ","⋱":"⋱","▿":"▿","⦦":"⦦","џ":"џ","⟿":"⟿","é":"é","⩮":"⩮","ě":"ě","≖":"≖","ê":"ê","≕":"≕","э":"э","ė":"ė","≒":"≒","𝔢":"𝔢","⪚":"⪚","è":"è","⪖":"⪖","⪘":"⪘","⪙":"⪙","⏧":"⏧","ℓ":"ℓ","⪕":"⪕","⪗":"⪗","ē":"ē","∅":"∅"," ":" "," ":" "," ":" ","ŋ":"ŋ"," ":" ","ę":"ę","𝕖":"𝕖","⋕":"⋕","⧣":"⧣","⩱":"⩱","ε":"ε","ϵ":"ϵ","=":"=","≟":"≟","⩸":"⩸","⧥":"⧥","≓":"≓","⥱":"⥱","ℯ":"ℯ","η":"η","ð":"ð","ë":"ë","€":"€","!":"!","ф":"ф","♀":"♀","ffi":"ffi","ff":"ff","ffl":"ffl","𝔣":"𝔣","fi":"fi",fj:"fj","♭":"♭","fl":"fl","▱":"▱","ƒ":"ƒ","𝕗":"𝕗","⋔":"⋔","⫙":"⫙","⨍":"⨍","½":"½","⅓":"⅓","¼":"¼","⅕":"⅕","⅙":"⅙","⅛":"⅛","⅔":"⅔","⅖":"⅖","¾":"¾","⅗":"⅗","⅜":"⅜","⅘":"⅘","⅚":"⅚","⅝":"⅝","⅞":"⅞","⁄":"⁄","⌢":"⌢","𝒻":"𝒻","⪌":"⪌","ǵ":"ǵ","γ":"γ","⪆":"⪆","ğ":"ğ","ĝ":"ĝ","г":"г","ġ":"ġ","⪩":"⪩","⪀":"⪀","⪂":"⪂","⪄":"⪄","⋛︀":"⋛︀","⪔":"⪔","𝔤":"𝔤","ℷ":"ℷ","ѓ":"ѓ","⪒":"⪒","⪥":"⪥","⪤":"⪤","≩":"≩","⪊":"⪊","⪈":"⪈","⋧":"⋧","𝕘":"𝕘","ℊ":"ℊ","⪎":"⪎","⪐":"⪐","⪧":"⪧","⩺":"⩺","⋗":"⋗","⦕":"⦕","⩼":"⩼","⥸":"⥸","≩︀":"≩︀","ъ":"ъ","⥈":"⥈","↭":"↭","ℏ":"ℏ","ĥ":"ĥ","♥":"♥","…":"…","⊹":"⊹","𝔥":"𝔥","⤥":"⤥","⤦":"⤦","⇿":"⇿","∻":"∻","↩":"↩","↪":"↪","𝕙":"𝕙","―":"―","𝒽":"𝒽","ħ":"ħ","⁃":"⁃","í":"í","î":"î","и":"и","е":"е","¡":"¡","𝔦":"𝔦","ì":"ì","⨌":"⨌","∭":"∭","⧜":"⧜","℩":"℩","ij":"ij","ī":"ī","ı":"ı","⊷":"⊷","Ƶ":"Ƶ","℅":"℅","∞":"∞","⧝":"⧝","⊺":"⊺","⨗":"⨗","⨼":"⨼","ё":"ё","į":"į","𝕚":"𝕚","ι":"ι","¿":"¿","𝒾":"𝒾","⋹":"⋹","⋵":"⋵","⋴":"⋴","⋳":"⋳","ĩ":"ĩ","і":"і","ï":"ï","ĵ":"ĵ","й":"й","𝔧":"𝔧","ȷ":"ȷ","𝕛":"𝕛","𝒿":"𝒿","ј":"ј","є":"є","κ":"κ","ϰ":"ϰ","ķ":"ķ","к":"к","𝔨":"𝔨","ĸ":"ĸ","х":"х","ќ":"ќ","𝕜":"𝕜","𝓀":"𝓀","⤛":"⤛","⤎":"⤎","⪋":"⪋","⥢":"⥢","ĺ":"ĺ","⦴":"⦴","λ":"λ","⦑":"⦑","⪅":"⪅","«":"«","⤟":"⤟","⤝":"⤝","↫":"↫","⤹":"⤹","⥳":"⥳","↢":"↢","⪫":"⪫","⤙":"⤙","⪭":"⪭","⪭︀":"⪭︀","⤌":"⤌","❲":"❲","{":"{","[":"[","⦋":"⦋","⦏":"⦏","⦍":"⦍","ľ":"ľ","ļ":"ļ","л":"л","⤶":"⤶","⥧":"⥧","⥋":"⥋","↲":"↲","≤":"≤","⇇":"⇇","⋋":"⋋","⪨":"⪨","⩿":"⩿","⪁":"⪁","⪃":"⪃","⋚︀":"⋚︀","⪓":"⪓","⋖":"⋖","⥼":"⥼","𝔩":"𝔩","⪑":"⪑","⥪":"⥪","▄":"▄","љ":"љ","⥫":"⥫","◺":"◺","ŀ":"ŀ","⎰":"⎰","≨":"≨","⪉":"⪉","⪇":"⪇","⋦":"⋦","⟬":"⟬","⇽":"⇽","⟼":"⟼","↬":"↬","⦅":"⦅","𝕝":"𝕝","⨭":"⨭","⨴":"⨴","∗":"∗","◊":"◊","(":"(","⦓":"⦓","⥭":"⥭","‎":"‎","⊿":"⊿","‹":"‹","𝓁":"𝓁","⪍":"⪍","⪏":"⪏","‚":"‚","ł":"ł","⪦":"⪦","⩹":"⩹","⋉":"⋉","⥶":"⥶","⩻":"⩻","⦖":"⦖","◃":"◃","⥊":"⥊","⥦":"⥦","≨︀":"≨︀","∺":"∺","¯":"¯","♂":"♂","✠":"✠","▮":"▮","⨩":"⨩","м":"м","—":"—","𝔪":"𝔪","℧":"℧","µ":"µ","⫰":"⫰","−":"−","⨪":"⨪","⫛":"⫛","⊧":"⊧","𝕞":"𝕞","𝓂":"𝓂","μ":"μ","⊸":"⊸","⋙̸":"⋙̸","≫⃒":"≫⃒","⇍":"⇍","⇎":"⇎","⋘̸":"⋘̸","≪⃒":"≪⃒","⇏":"⇏","⊯":"⊯","⊮":"⊮","ń":"ń","∠⃒":"∠⃒","⩰̸":"⩰̸","≋̸":"≋̸","ʼn":"ʼn","♮":"♮","⩃":"⩃","ň":"ň","ņ":"ņ","⩭̸":"⩭̸","⩂":"⩂","н":"н","–":"–","⇗":"⇗","⤤":"⤤","≐̸":"≐̸","⤨":"⤨","𝔫":"𝔫","↮":"↮","⫲":"⫲","⋼":"⋼","⋺":"⋺","њ":"њ","≦̸":"≦̸","↚":"↚","‥":"‥","𝕟":"𝕟","¬":"¬","⋹̸":"⋹̸","⋵̸":"⋵̸","⋷":"⋷","⋶":"⋶","⋾":"⋾","⋽":"⋽","⫽⃥":"⫽⃥","∂̸":"∂̸","⨔":"⨔","↛":"↛","⤳̸":"⤳̸","↝̸":"↝̸","𝓃":"𝓃","⊄":"⊄","⫅̸":"⫅̸","⊅":"⊅","⫆̸":"⫆̸","ñ":"ñ","ν":"ν","#":"#","№":"№"," ":" ","⊭":"⊭","⤄":"⤄","≍⃒":"≍⃒","⊬":"⊬","≥⃒":"≥⃒",">⃒":">⃒","⧞":"⧞","⤂":"⤂","≤⃒":"≤⃒","<⃒":"<⃒","⊴⃒":"⊴⃒","⤃":"⤃","⊵⃒":"⊵⃒","∼⃒":"∼⃒","⇖":"⇖","⤣":"⤣","⤧":"⤧","ó":"ó","ô":"ô","о":"о","ő":"ő","⨸":"⨸","⦼":"⦼","œ":"œ","⦿":"⦿","𝔬":"𝔬","˛":"˛","ò":"ò","⧁":"⧁","⦵":"⦵","⦾":"⦾","⦻":"⦻","⧀":"⧀","ō":"ō","ω":"ω","ο":"ο","⦶":"⦶","𝕠":"𝕠","⦷":"⦷","⦹":"⦹","∨":"∨","⩝":"⩝","ℴ":"ℴ","ª":"ª","º":"º","⊶":"⊶","⩖":"⩖","⩗":"⩗","⩛":"⩛","ø":"ø","⊘":"⊘","õ":"õ","⨶":"⨶","ö":"ö","⌽":"⌽","¶":"¶","⫳":"⫳","⫽":"⫽","п":"п","%":"%",".":".","‰":"‰","‱":"‱","𝔭":"𝔭","φ":"φ","ϕ":"ϕ","☎":"☎","π":"π","ϖ":"ϖ","ℎ":"ℎ","+":"+","⨣":"⨣","⨢":"⨢","⨥":"⨥","⩲":"⩲","⨦":"⨦","⨧":"⨧","⨕":"⨕","𝕡":"𝕡","£":"£","⪳":"⪳","⪷":"⪷","⪹":"⪹","⪵":"⪵","⋨":"⋨","′":"′","⌮":"⌮","⌒":"⌒","⌓":"⌓","⊰":"⊰","𝓅":"𝓅","ψ":"ψ"," ":" ","𝔮":"𝔮","𝕢":"𝕢","⁗":"⁗","𝓆":"𝓆","⨖":"⨖","?":"?","⤜":"⤜","⥤":"⥤","∽̱":"∽̱","ŕ":"ŕ","⦳":"⦳","⦒":"⦒","⦥":"⦥","»":"»","⥵":"⥵","⤠":"⤠","⤳":"⤳","⤞":"⤞","⥅":"⥅","⥴":"⥴","↣":"↣","↝":"↝","⤚":"⤚","∶":"∶","❳":"❳","}":"}","]":"]","⦌":"⦌","⦎":"⦎","⦐":"⦐","ř":"ř","ŗ":"ŗ","р":"р","⤷":"⤷","⥩":"⥩","↳":"↳","▭":"▭","⥽":"⥽","𝔯":"𝔯","⥬":"⥬","ρ":"ρ","ϱ":"ϱ","⇉":"⇉","⋌":"⋌","˚":"˚","‏":"‏","⎱":"⎱","⫮":"⫮","⟭":"⟭","⇾":"⇾","⦆":"⦆","𝕣":"𝕣","⨮":"⨮","⨵":"⨵",")":")","⦔":"⦔","⨒":"⨒","›":"›","𝓇":"𝓇","⋊":"⋊","▹":"▹","⧎":"⧎","⥨":"⥨","℞":"℞","ś":"ś","⪴":"⪴","⪸":"⪸","š":"š","ş":"ş","ŝ":"ŝ","⪶":"⪶","⪺":"⪺","⋩":"⋩","⨓":"⨓","с":"с","⋅":"⋅","⩦":"⩦","⇘":"⇘","§":"§",";":";","⤩":"⤩","✶":"✶","𝔰":"𝔰","♯":"♯","щ":"щ","ш":"ш","­":"­","σ":"σ","ς":"ς","⩪":"⩪","⪞":"⪞","⪠":"⪠","⪝":"⪝","⪟":"⪟","≆":"≆","⨤":"⨤","⥲":"⥲","⨳":"⨳","⧤":"⧤","⌣":"⌣","⪪":"⪪","⪬":"⪬","⪬︀":"⪬︀","ь":"ь","/":"/","⧄":"⧄","⌿":"⌿","𝕤":"𝕤","♠":"♠","⊓︀":"⊓︀","⊔︀":"⊔︀","𝓈":"𝓈","☆":"☆","⊂":"⊂","⫅":"⫅","⪽":"⪽","⫃":"⫃","⫁":"⫁","⫋":"⫋","⊊":"⊊","⪿":"⪿","⥹":"⥹","⫇":"⫇","⫕":"⫕","⫓":"⫓","♪":"♪","¹":"¹","²":"²","³":"³","⫆":"⫆","⪾":"⪾","⫘":"⫘","⫄":"⫄","⟉":"⟉","⫗":"⫗","⥻":"⥻","⫂":"⫂","⫌":"⫌","⊋":"⊋","⫀":"⫀","⫈":"⫈","⫔":"⫔","⫖":"⫖","⇙":"⇙","⤪":"⤪","ß":"ß","⌖":"⌖","τ":"τ","ť":"ť","ţ":"ţ","т":"т","⌕":"⌕","𝔱":"𝔱","θ":"θ","ϑ":"ϑ","þ":"þ","×":"×","⨱":"⨱","⨰":"⨰","⌶":"⌶","⫱":"⫱","𝕥":"𝕥","⫚":"⫚","‴":"‴","▵":"▵","≜":"≜","◬":"◬","⨺":"⨺","⨹":"⨹","⧍":"⧍","⨻":"⨻","⏢":"⏢","𝓉":"𝓉","ц":"ц","ћ":"ћ","ŧ":"ŧ","⥣":"⥣","ú":"ú","ў":"ў","ŭ":"ŭ","û":"û","у":"у","ű":"ű","⥾":"⥾","𝔲":"𝔲","ù":"ù","▀":"▀","⌜":"⌜","⌏":"⌏","◸":"◸","ū":"ū","ų":"ų","𝕦":"𝕦","υ":"υ","⇈":"⇈","⌝":"⌝","⌎":"⌎","ů":"ů","◹":"◹","𝓊":"𝓊","⋰":"⋰","ũ":"ũ","ü":"ü","⦧":"⦧","⫨":"⫨","⫩":"⫩","⦜":"⦜","⊊︀":"⊊︀","⫋︀":"⫋︀","⊋︀":"⊋︀","⫌︀":"⫌︀","в":"в","⊻":"⊻","≚":"≚","⋮":"⋮","𝔳":"𝔳","𝕧":"𝕧","𝓋":"𝓋","⦚":"⦚","ŵ":"ŵ","⩟":"⩟","≙":"≙","℘":"℘","𝔴":"𝔴","𝕨":"𝕨","𝓌":"𝓌","𝔵":"𝔵","ξ":"ξ","⋻":"⋻","𝕩":"𝕩","𝓍":"𝓍","ý":"ý","я":"я","ŷ":"ŷ","ы":"ы","¥":"¥","𝔶":"𝔶","ї":"ї","𝕪":"𝕪","𝓎":"𝓎","ю":"ю","ÿ":"ÿ","ź":"ź","ž":"ž","з":"з","ż":"ż","ζ":"ζ","𝔷":"𝔷","ж":"ж","⇝":"⇝","𝕫":"𝕫","𝓏":"𝓏","‍":"‍","‌":"‌"}}}; + +/***/ }), + +/***/ "./node_modules/html-entities/lib/numeric-unicode-map.js": +/*!***************************************************************!*\ + !*** ./node_modules/html-entities/lib/numeric-unicode-map.js ***! + \***************************************************************/ +/***/ (function(__unused_webpack_module, exports) { + +"use strict"; +Object.defineProperty(exports, "__esModule", ({value:true}));exports.numericUnicodeMap={0:65533,128:8364,130:8218,131:402,132:8222,133:8230,134:8224,135:8225,136:710,137:8240,138:352,139:8249,140:338,142:381,145:8216,146:8217,147:8220,148:8221,149:8226,150:8211,151:8212,152:732,153:8482,154:353,155:8250,156:339,158:382,159:376}; + +/***/ }), + +/***/ "./node_modules/html-entities/lib/surrogate-pairs.js": +/*!***********************************************************!*\ + !*** ./node_modules/html-entities/lib/surrogate-pairs.js ***! + \***********************************************************/ +/***/ (function(__unused_webpack_module, exports) { + +"use strict"; +Object.defineProperty(exports, "__esModule", ({value:true}));exports.fromCodePoint=String.fromCodePoint||function(astralCodePoint){return String.fromCharCode(Math.floor((astralCodePoint-65536)/1024)+55296,(astralCodePoint-65536)%1024+56320)};exports.getCodePoint=String.prototype.codePointAt?function(input,position){return input.codePointAt(position)}:function(input,position){return(input.charCodeAt(position)-55296)*1024+input.charCodeAt(position+1)-56320+65536};exports.highSurrogateFrom=55296;exports.highSurrogateTo=56319; + +/***/ }), + +/***/ "./node_modules/webpack-dev-server/client/clients/WebSocketClient.js": +/*!***************************************************************************!*\ + !*** ./node_modules/webpack-dev-server/client/clients/WebSocketClient.js ***! + \***************************************************************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": function() { return /* binding */ WebSocketClient; } +/* harmony export */ }); +/* harmony import */ var _utils_log_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils/log.js */ "./node_modules/webpack-dev-server/client/utils/log.js"); +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + + + +var WebSocketClient = /*#__PURE__*/function () { + /** + * @param {string} url + */ + function WebSocketClient(url) { + _classCallCheck(this, WebSocketClient); + + this.client = new WebSocket(url); + + this.client.onerror = function (error) { + _utils_log_js__WEBPACK_IMPORTED_MODULE_0__.log.error(error); + }; + } + /** + * @param {(...args: any[]) => void} f + */ + + + _createClass(WebSocketClient, [{ + key: "onOpen", + value: function onOpen(f) { + this.client.onopen = f; + } + /** + * @param {(...args: any[]) => void} f + */ + + }, { + key: "onClose", + value: function onClose(f) { + this.client.onclose = f; + } // call f with the message string as the first argument + + /** + * @param {(...args: any[]) => void} f + */ + + }, { + key: "onMessage", + value: function onMessage(f) { + this.client.onmessage = function (e) { + f(e.data); + }; + } + }]); + + return WebSocketClient; +}(); + + + +/***/ }), + +/***/ "./node_modules/webpack-dev-server/client/index.js?protocol=ws%3A&hostname=localhost&port=8081&pathname=%2Fws&logging=none&reconnect=10": +/*!**********************************************************************************************************************************************!*\ + !*** ./node_modules/webpack-dev-server/client/index.js?protocol=ws%3A&hostname=localhost&port=8081&pathname=%2Fws&logging=none&reconnect=10 ***! + \**********************************************************************************************************************************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +"use strict"; +var __resourceQuery = "?protocol=ws%3A&hostname=localhost&port=8081&pathname=%2Fws&logging=none&reconnect=10"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var webpack_hot_log_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! webpack/hot/log.js */ "./node_modules/webpack/hot/log.js"); +/* harmony import */ var webpack_hot_log_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(webpack_hot_log_js__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var _utils_stripAnsi_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils/stripAnsi.js */ "./node_modules/webpack-dev-server/client/utils/stripAnsi.js"); +/* harmony import */ var _utils_parseURL_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utils/parseURL.js */ "./node_modules/webpack-dev-server/client/utils/parseURL.js"); +/* harmony import */ var _socket_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./socket.js */ "./node_modules/webpack-dev-server/client/socket.js"); +/* harmony import */ var _overlay_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./overlay.js */ "./node_modules/webpack-dev-server/client/overlay.js"); +/* harmony import */ var _utils_log_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./utils/log.js */ "./node_modules/webpack-dev-server/client/utils/log.js"); +/* harmony import */ var _utils_sendMessage_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./utils/sendMessage.js */ "./node_modules/webpack-dev-server/client/utils/sendMessage.js"); +/* harmony import */ var _utils_reloadApp_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./utils/reloadApp.js */ "./node_modules/webpack-dev-server/client/utils/reloadApp.js"); +/* harmony import */ var _utils_createSocketURL_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./utils/createSocketURL.js */ "./node_modules/webpack-dev-server/client/utils/createSocketURL.js"); +/* global __resourceQuery, __webpack_hash__ */ +/// + + + + + + + + + +/** + * @typedef {Object} Options + * @property {boolean} hot + * @property {boolean} liveReload + * @property {boolean} progress + * @property {boolean | { warnings?: boolean, errors?: boolean, trustedTypesPolicyName?: string }} overlay + * @property {string} [logging] + * @property {number} [reconnect] + */ + +/** + * @typedef {Object} Status + * @property {boolean} isUnloading + * @property {string} currentHash + * @property {string} [previousHash] + */ + +/** + * @type {Status} + */ + +var status = { + isUnloading: false, + // TODO Workaround for webpack v4, `__webpack_hash__` is not replaced without HotModuleReplacement + // eslint-disable-next-line camelcase + currentHash: true ? __webpack_require__.h() : 0 +}; +/** @type {Options} */ + +var options = { + hot: false, + liveReload: false, + progress: false, + overlay: false +}; +var parsedResourceQuery = (0,_utils_parseURL_js__WEBPACK_IMPORTED_MODULE_2__["default"])(__resourceQuery); + +if (parsedResourceQuery.hot === "true") { + options.hot = true; + _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.info("Hot Module Replacement enabled."); +} + +if (parsedResourceQuery["live-reload"] === "true") { + options.liveReload = true; + _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.info("Live Reloading enabled."); +} + +if (parsedResourceQuery.logging) { + options.logging = parsedResourceQuery.logging; +} + +if (typeof parsedResourceQuery.reconnect !== "undefined") { + options.reconnect = Number(parsedResourceQuery.reconnect); +} +/** + * @param {string} level + */ + + +function setAllLogLevel(level) { + // This is needed because the HMR logger operate separately from dev server logger + webpack_hot_log_js__WEBPACK_IMPORTED_MODULE_0___default().setLogLevel(level === "verbose" || level === "log" ? "info" : level); + (0,_utils_log_js__WEBPACK_IMPORTED_MODULE_5__.setLogLevel)(level); +} + +if (options.logging) { + setAllLogLevel(options.logging); +} + +self.addEventListener("beforeunload", function () { + status.isUnloading = true; +}); +var onSocketMessage = { + hot: function hot() { + if (parsedResourceQuery.hot === "false") { + return; + } + + options.hot = true; + _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.info("Hot Module Replacement enabled."); + }, + liveReload: function liveReload() { + if (parsedResourceQuery["live-reload"] === "false") { + return; + } + + options.liveReload = true; + _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.info("Live Reloading enabled."); + }, + invalid: function invalid() { + _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.info("App updated. Recompiling..."); // Fixes #1042. overlay doesn't clear if errors are fixed but warnings remain. + + if (options.overlay) { + (0,_overlay_js__WEBPACK_IMPORTED_MODULE_4__.hide)(); + } + + (0,_utils_sendMessage_js__WEBPACK_IMPORTED_MODULE_6__["default"])("Invalid"); + }, + + /** + * @param {string} hash + */ + hash: function hash(_hash) { + status.previousHash = status.currentHash; + status.currentHash = _hash; + }, + logging: setAllLogLevel, + + /** + * @param {boolean} value + */ + overlay: function overlay(value) { + if (typeof document === "undefined") { + return; + } + + options.overlay = value; + }, + + /** + * @param {number} value + */ + reconnect: function reconnect(value) { + if (parsedResourceQuery.reconnect === "false") { + return; + } + + options.reconnect = value; + }, + + /** + * @param {boolean} value + */ + progress: function progress(value) { + options.progress = value; + }, + + /** + * @param {{ pluginName?: string, percent: number, msg: string }} data + */ + "progress-update": function progressUpdate(data) { + if (options.progress) { + _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.info("".concat(data.pluginName ? "[".concat(data.pluginName, "] ") : "").concat(data.percent, "% - ").concat(data.msg, ".")); + } + + (0,_utils_sendMessage_js__WEBPACK_IMPORTED_MODULE_6__["default"])("Progress", data); + }, + "still-ok": function stillOk() { + _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.info("Nothing changed."); + + if (options.overlay) { + (0,_overlay_js__WEBPACK_IMPORTED_MODULE_4__.hide)(); + } + + (0,_utils_sendMessage_js__WEBPACK_IMPORTED_MODULE_6__["default"])("StillOk"); + }, + ok: function ok() { + (0,_utils_sendMessage_js__WEBPACK_IMPORTED_MODULE_6__["default"])("Ok"); + + if (options.overlay) { + (0,_overlay_js__WEBPACK_IMPORTED_MODULE_4__.hide)(); + } + + (0,_utils_reloadApp_js__WEBPACK_IMPORTED_MODULE_7__["default"])(options, status); + }, + // TODO: remove in v5 in favor of 'static-changed' + + /** + * @param {string} file + */ + "content-changed": function contentChanged(file) { + _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.info("".concat(file ? "\"".concat(file, "\"") : "Content", " from static directory was changed. Reloading...")); + self.location.reload(); + }, + + /** + * @param {string} file + */ + "static-changed": function staticChanged(file) { + _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.info("".concat(file ? "\"".concat(file, "\"") : "Content", " from static directory was changed. Reloading...")); + self.location.reload(); + }, + + /** + * @param {Error[]} warnings + * @param {any} params + */ + warnings: function warnings(_warnings, params) { + _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.warn("Warnings while compiling."); + + var printableWarnings = _warnings.map(function (error) { + var _formatProblem = (0,_overlay_js__WEBPACK_IMPORTED_MODULE_4__.formatProblem)("warning", error), + header = _formatProblem.header, + body = _formatProblem.body; + + return "".concat(header, "\n").concat((0,_utils_stripAnsi_js__WEBPACK_IMPORTED_MODULE_1__["default"])(body)); + }); + + (0,_utils_sendMessage_js__WEBPACK_IMPORTED_MODULE_6__["default"])("Warnings", printableWarnings); + + for (var i = 0; i < printableWarnings.length; i++) { + _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.warn(printableWarnings[i]); + } + + var needShowOverlayForWarnings = typeof options.overlay === "boolean" ? options.overlay : options.overlay && options.overlay.warnings; + + if (needShowOverlayForWarnings) { + var trustedTypesPolicyName = typeof options.overlay === "object" && options.overlay.trustedTypesPolicyName; + (0,_overlay_js__WEBPACK_IMPORTED_MODULE_4__.show)("warning", _warnings, trustedTypesPolicyName || null); + } + + if (params && params.preventReloading) { + return; + } + + (0,_utils_reloadApp_js__WEBPACK_IMPORTED_MODULE_7__["default"])(options, status); + }, + + /** + * @param {Error[]} errors + */ + errors: function errors(_errors) { + _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.error("Errors while compiling. Reload prevented."); + + var printableErrors = _errors.map(function (error) { + var _formatProblem2 = (0,_overlay_js__WEBPACK_IMPORTED_MODULE_4__.formatProblem)("error", error), + header = _formatProblem2.header, + body = _formatProblem2.body; + + return "".concat(header, "\n").concat((0,_utils_stripAnsi_js__WEBPACK_IMPORTED_MODULE_1__["default"])(body)); + }); + + (0,_utils_sendMessage_js__WEBPACK_IMPORTED_MODULE_6__["default"])("Errors", printableErrors); + + for (var i = 0; i < printableErrors.length; i++) { + _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.error(printableErrors[i]); + } + + var needShowOverlayForErrors = typeof options.overlay === "boolean" ? options.overlay : options.overlay && options.overlay.errors; + + if (needShowOverlayForErrors) { + var trustedTypesPolicyName = typeof options.overlay === "object" && options.overlay.trustedTypesPolicyName; + (0,_overlay_js__WEBPACK_IMPORTED_MODULE_4__.show)("error", _errors, trustedTypesPolicyName || null); + } + }, + + /** + * @param {Error} error + */ + error: function error(_error) { + _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.error(_error); + }, + close: function close() { + _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.info("Disconnected!"); + + if (options.overlay) { + (0,_overlay_js__WEBPACK_IMPORTED_MODULE_4__.hide)(); + } + + (0,_utils_sendMessage_js__WEBPACK_IMPORTED_MODULE_6__["default"])("Close"); + } +}; +var socketURL = (0,_utils_createSocketURL_js__WEBPACK_IMPORTED_MODULE_8__["default"])(parsedResourceQuery); +(0,_socket_js__WEBPACK_IMPORTED_MODULE_3__["default"])(socketURL, onSocketMessage, options.reconnect); + +/***/ }), + +/***/ "./node_modules/webpack-dev-server/client/modules/logger/index.js": +/*!************************************************************************!*\ + !*** ./node_modules/webpack-dev-server/client/modules/logger/index.js ***! + \************************************************************************/ +/***/ (function(__unused_webpack_module, exports) { + +/******/ (function() { // webpackBootstrap +/******/ "use strict"; +/******/ var __webpack_modules__ = ({ + +/***/ "./client-src/modules/logger/SyncBailHookFake.js": +/*!*******************************************************!*\ + !*** ./client-src/modules/logger/SyncBailHookFake.js ***! + \*******************************************************/ +/***/ (function(module) { + + +/** + * Client stub for tapable SyncBailHook + */ + +module.exports = function clientTapableSyncBailHook() { + return { + call: function call() {} + }; +}; + +/***/ }), + +/***/ "./node_modules/webpack/lib/logging/Logger.js": +/*!****************************************************!*\ + !*** ./node_modules/webpack/lib/logging/Logger.js ***! + \****************************************************/ +/***/ (function(__unused_webpack_module, exports) { + +/* + MIT License http://www.opensource.org/licenses/mit-license.php + Author Tobias Koppers @sokra +*/ + + +function _toConsumableArray(arr) { + return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); +} + +function _nonIterableSpread() { + throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); +} + +function _unsupportedIterableToArray(o, minLen) { + if (!o) return; + if (typeof o === "string") return _arrayLikeToArray(o, minLen); + var n = Object.prototype.toString.call(o).slice(8, -1); + if (n === "Object" && o.constructor) n = o.constructor.name; + if (n === "Map" || n === "Set") return Array.from(o); + if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); +} + +function _iterableToArray(iter) { + if (typeof (typeof Symbol !== "undefined" ? Symbol : function (i) { return i; }) !== "undefined" && iter[(typeof Symbol !== "undefined" ? Symbol : function (i) { return i; }).iterator] != null || iter["@@iterator"] != null) return Array.from(iter); +} + +function _arrayWithoutHoles(arr) { + if (Array.isArray(arr)) return _arrayLikeToArray(arr); +} + +function _arrayLikeToArray(arr, len) { + if (len == null || len > arr.length) len = arr.length; + + for (var i = 0, arr2 = new Array(len); i < len; i++) { + arr2[i] = arr[i]; + } + + return arr2; +} + +function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } +} + +function _defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } +} + +function _createClass(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties(Constructor.prototype, protoProps); + if (staticProps) _defineProperties(Constructor, staticProps); + Object.defineProperty(Constructor, "prototype", { + writable: false + }); + return Constructor; +} + +var LogType = Object.freeze({ + error: + /** @type {"error"} */ + "error", + // message, c style arguments + warn: + /** @type {"warn"} */ + "warn", + // message, c style arguments + info: + /** @type {"info"} */ + "info", + // message, c style arguments + log: + /** @type {"log"} */ + "log", + // message, c style arguments + debug: + /** @type {"debug"} */ + "debug", + // message, c style arguments + trace: + /** @type {"trace"} */ + "trace", + // no arguments + group: + /** @type {"group"} */ + "group", + // [label] + groupCollapsed: + /** @type {"groupCollapsed"} */ + "groupCollapsed", + // [label] + groupEnd: + /** @type {"groupEnd"} */ + "groupEnd", + // [label] + profile: + /** @type {"profile"} */ + "profile", + // [profileName] + profileEnd: + /** @type {"profileEnd"} */ + "profileEnd", + // [profileName] + time: + /** @type {"time"} */ + "time", + // name, time as [seconds, nanoseconds] + clear: + /** @type {"clear"} */ + "clear", + // no arguments + status: + /** @type {"status"} */ + "status" // message, arguments + +}); +exports.LogType = LogType; +/** @typedef {typeof LogType[keyof typeof LogType]} LogTypeEnum */ + +var LOG_SYMBOL = (typeof Symbol !== "undefined" ? Symbol : function (i) { return i; })("webpack logger raw log method"); +var TIMERS_SYMBOL = (typeof Symbol !== "undefined" ? Symbol : function (i) { return i; })("webpack logger times"); +var TIMERS_AGGREGATES_SYMBOL = (typeof Symbol !== "undefined" ? Symbol : function (i) { return i; })("webpack logger aggregated times"); + +var WebpackLogger = /*#__PURE__*/function () { + /** + * @param {function(LogTypeEnum, any[]=): void} log log function + * @param {function(string | function(): string): WebpackLogger} getChildLogger function to create child logger + */ + function WebpackLogger(log, getChildLogger) { + _classCallCheck(this, WebpackLogger); + + this[LOG_SYMBOL] = log; + this.getChildLogger = getChildLogger; + } + + _createClass(WebpackLogger, [{ + key: "error", + value: function error() { + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + this[LOG_SYMBOL](LogType.error, args); + } + }, { + key: "warn", + value: function warn() { + for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { + args[_key2] = arguments[_key2]; + } + + this[LOG_SYMBOL](LogType.warn, args); + } + }, { + key: "info", + value: function info() { + for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) { + args[_key3] = arguments[_key3]; + } + + this[LOG_SYMBOL](LogType.info, args); + } + }, { + key: "log", + value: function log() { + for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) { + args[_key4] = arguments[_key4]; + } + + this[LOG_SYMBOL](LogType.log, args); + } + }, { + key: "debug", + value: function debug() { + for (var _len5 = arguments.length, args = new Array(_len5), _key5 = 0; _key5 < _len5; _key5++) { + args[_key5] = arguments[_key5]; + } + + this[LOG_SYMBOL](LogType.debug, args); + } + }, { + key: "assert", + value: function assert(assertion) { + if (!assertion) { + for (var _len6 = arguments.length, args = new Array(_len6 > 1 ? _len6 - 1 : 0), _key6 = 1; _key6 < _len6; _key6++) { + args[_key6 - 1] = arguments[_key6]; + } + + this[LOG_SYMBOL](LogType.error, args); + } + } + }, { + key: "trace", + value: function trace() { + this[LOG_SYMBOL](LogType.trace, ["Trace"]); + } + }, { + key: "clear", + value: function clear() { + this[LOG_SYMBOL](LogType.clear); + } + }, { + key: "status", + value: function status() { + for (var _len7 = arguments.length, args = new Array(_len7), _key7 = 0; _key7 < _len7; _key7++) { + args[_key7] = arguments[_key7]; + } + + this[LOG_SYMBOL](LogType.status, args); + } + }, { + key: "group", + value: function group() { + for (var _len8 = arguments.length, args = new Array(_len8), _key8 = 0; _key8 < _len8; _key8++) { + args[_key8] = arguments[_key8]; + } + + this[LOG_SYMBOL](LogType.group, args); + } + }, { + key: "groupCollapsed", + value: function groupCollapsed() { + for (var _len9 = arguments.length, args = new Array(_len9), _key9 = 0; _key9 < _len9; _key9++) { + args[_key9] = arguments[_key9]; + } + + this[LOG_SYMBOL](LogType.groupCollapsed, args); + } + }, { + key: "groupEnd", + value: function groupEnd() { + for (var _len10 = arguments.length, args = new Array(_len10), _key10 = 0; _key10 < _len10; _key10++) { + args[_key10] = arguments[_key10]; + } + + this[LOG_SYMBOL](LogType.groupEnd, args); + } + }, { + key: "profile", + value: function profile(label) { + this[LOG_SYMBOL](LogType.profile, [label]); + } + }, { + key: "profileEnd", + value: function profileEnd(label) { + this[LOG_SYMBOL](LogType.profileEnd, [label]); + } + }, { + key: "time", + value: function time(label) { + this[TIMERS_SYMBOL] = this[TIMERS_SYMBOL] || new Map(); + this[TIMERS_SYMBOL].set(label, process.hrtime()); + } + }, { + key: "timeLog", + value: function timeLog(label) { + var prev = this[TIMERS_SYMBOL] && this[TIMERS_SYMBOL].get(label); + + if (!prev) { + throw new Error("No such label '".concat(label, "' for WebpackLogger.timeLog()")); + } + + var time = process.hrtime(prev); + this[LOG_SYMBOL](LogType.time, [label].concat(_toConsumableArray(time))); + } + }, { + key: "timeEnd", + value: function timeEnd(label) { + var prev = this[TIMERS_SYMBOL] && this[TIMERS_SYMBOL].get(label); + + if (!prev) { + throw new Error("No such label '".concat(label, "' for WebpackLogger.timeEnd()")); + } + + var time = process.hrtime(prev); + this[TIMERS_SYMBOL].delete(label); + this[LOG_SYMBOL](LogType.time, [label].concat(_toConsumableArray(time))); + } + }, { + key: "timeAggregate", + value: function timeAggregate(label) { + var prev = this[TIMERS_SYMBOL] && this[TIMERS_SYMBOL].get(label); + + if (!prev) { + throw new Error("No such label '".concat(label, "' for WebpackLogger.timeAggregate()")); + } + + var time = process.hrtime(prev); + this[TIMERS_SYMBOL].delete(label); + this[TIMERS_AGGREGATES_SYMBOL] = this[TIMERS_AGGREGATES_SYMBOL] || new Map(); + var current = this[TIMERS_AGGREGATES_SYMBOL].get(label); + + if (current !== undefined) { + if (time[1] + current[1] > 1e9) { + time[0] += current[0] + 1; + time[1] = time[1] - 1e9 + current[1]; + } else { + time[0] += current[0]; + time[1] += current[1]; + } + } + + this[TIMERS_AGGREGATES_SYMBOL].set(label, time); + } + }, { + key: "timeAggregateEnd", + value: function timeAggregateEnd(label) { + if (this[TIMERS_AGGREGATES_SYMBOL] === undefined) return; + var time = this[TIMERS_AGGREGATES_SYMBOL].get(label); + if (time === undefined) return; + this[TIMERS_AGGREGATES_SYMBOL].delete(label); + this[LOG_SYMBOL](LogType.time, [label].concat(_toConsumableArray(time))); + } + }]); + + return WebpackLogger; +}(); + +exports.Logger = WebpackLogger; + +/***/ }), + +/***/ "./node_modules/webpack/lib/logging/createConsoleLogger.js": +/*!*****************************************************************!*\ + !*** ./node_modules/webpack/lib/logging/createConsoleLogger.js ***! + \*****************************************************************/ +/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_10785__) { + +/* + MIT License http://www.opensource.org/licenses/mit-license.php + Author Tobias Koppers @sokra +*/ + + +function _toConsumableArray(arr) { + return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); +} + +function _nonIterableSpread() { + throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); +} + +function _unsupportedIterableToArray(o, minLen) { + if (!o) return; + if (typeof o === "string") return _arrayLikeToArray(o, minLen); + var n = Object.prototype.toString.call(o).slice(8, -1); + if (n === "Object" && o.constructor) n = o.constructor.name; + if (n === "Map" || n === "Set") return Array.from(o); + if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); +} + +function _iterableToArray(iter) { + if (typeof (typeof Symbol !== "undefined" ? Symbol : function (i) { return i; }) !== "undefined" && iter[(typeof Symbol !== "undefined" ? Symbol : function (i) { return i; }).iterator] != null || iter["@@iterator"] != null) return Array.from(iter); +} + +function _arrayWithoutHoles(arr) { + if (Array.isArray(arr)) return _arrayLikeToArray(arr); +} + +function _arrayLikeToArray(arr, len) { + if (len == null || len > arr.length) len = arr.length; + + for (var i = 0, arr2 = new Array(len); i < len; i++) { + arr2[i] = arr[i]; + } + + return arr2; +} + +var _require = __nested_webpack_require_10785__(/*! ./Logger */ "./node_modules/webpack/lib/logging/Logger.js"), + LogType = _require.LogType; +/** @typedef {import("../../declarations/WebpackOptions").FilterItemTypes} FilterItemTypes */ + +/** @typedef {import("../../declarations/WebpackOptions").FilterTypes} FilterTypes */ + +/** @typedef {import("./Logger").LogTypeEnum} LogTypeEnum */ + +/** @typedef {function(string): boolean} FilterFunction */ + +/** + * @typedef {Object} LoggerConsole + * @property {function(): void} clear + * @property {function(): void} trace + * @property {(...args: any[]) => void} info + * @property {(...args: any[]) => void} log + * @property {(...args: any[]) => void} warn + * @property {(...args: any[]) => void} error + * @property {(...args: any[]) => void=} debug + * @property {(...args: any[]) => void=} group + * @property {(...args: any[]) => void=} groupCollapsed + * @property {(...args: any[]) => void=} groupEnd + * @property {(...args: any[]) => void=} status + * @property {(...args: any[]) => void=} profile + * @property {(...args: any[]) => void=} profileEnd + * @property {(...args: any[]) => void=} logTime + */ + +/** + * @typedef {Object} LoggerOptions + * @property {false|true|"none"|"error"|"warn"|"info"|"log"|"verbose"} level loglevel + * @property {FilterTypes|boolean} debug filter for debug logging + * @property {LoggerConsole} console the console to log to + */ + +/** + * @param {FilterItemTypes} item an input item + * @returns {FilterFunction} filter function + */ + + +var filterToFunction = function filterToFunction(item) { + if (typeof item === "string") { + var regExp = new RegExp("[\\\\/]".concat(item.replace( // eslint-disable-next-line no-useless-escape + /[-[\]{}()*+?.\\^$|]/g, "\\$&"), "([\\\\/]|$|!|\\?)")); + return function (ident) { + return regExp.test(ident); + }; + } + + if (item && typeof item === "object" && typeof item.test === "function") { + return function (ident) { + return item.test(ident); + }; + } + + if (typeof item === "function") { + return item; + } + + if (typeof item === "boolean") { + return function () { + return item; + }; + } +}; +/** + * @enum {number} + */ + + +var LogLevel = { + none: 6, + false: 6, + error: 5, + warn: 4, + info: 3, + log: 2, + true: 2, + verbose: 1 +}; +/** + * @param {LoggerOptions} options options object + * @returns {function(string, LogTypeEnum, any[]): void} logging function + */ + +module.exports = function (_ref) { + var _ref$level = _ref.level, + level = _ref$level === void 0 ? "info" : _ref$level, + _ref$debug = _ref.debug, + debug = _ref$debug === void 0 ? false : _ref$debug, + console = _ref.console; + var debugFilters = typeof debug === "boolean" ? [function () { + return debug; + }] : + /** @type {FilterItemTypes[]} */ + [].concat(debug).map(filterToFunction); + /** @type {number} */ + + var loglevel = LogLevel["".concat(level)] || 0; + /** + * @param {string} name name of the logger + * @param {LogTypeEnum} type type of the log entry + * @param {any[]} args arguments of the log entry + * @returns {void} + */ + + var logger = function logger(name, type, args) { + var labeledArgs = function labeledArgs() { + if (Array.isArray(args)) { + if (args.length > 0 && typeof args[0] === "string") { + return ["[".concat(name, "] ").concat(args[0])].concat(_toConsumableArray(args.slice(1))); + } else { + return ["[".concat(name, "]")].concat(_toConsumableArray(args)); + } + } else { + return []; + } + }; + + var debug = debugFilters.some(function (f) { + return f(name); + }); + + switch (type) { + case LogType.debug: + if (!debug) return; // eslint-disable-next-line node/no-unsupported-features/node-builtins + + if (typeof console.debug === "function") { + // eslint-disable-next-line node/no-unsupported-features/node-builtins + console.debug.apply(console, _toConsumableArray(labeledArgs())); + } else { + console.log.apply(console, _toConsumableArray(labeledArgs())); + } + + break; + + case LogType.log: + if (!debug && loglevel > LogLevel.log) return; + console.log.apply(console, _toConsumableArray(labeledArgs())); + break; + + case LogType.info: + if (!debug && loglevel > LogLevel.info) return; + console.info.apply(console, _toConsumableArray(labeledArgs())); + break; + + case LogType.warn: + if (!debug && loglevel > LogLevel.warn) return; + console.warn.apply(console, _toConsumableArray(labeledArgs())); + break; + + case LogType.error: + if (!debug && loglevel > LogLevel.error) return; + console.error.apply(console, _toConsumableArray(labeledArgs())); + break; + + case LogType.trace: + if (!debug) return; + console.trace(); + break; + + case LogType.groupCollapsed: + if (!debug && loglevel > LogLevel.log) return; + + if (!debug && loglevel > LogLevel.verbose) { + // eslint-disable-next-line node/no-unsupported-features/node-builtins + if (typeof console.groupCollapsed === "function") { + // eslint-disable-next-line node/no-unsupported-features/node-builtins + console.groupCollapsed.apply(console, _toConsumableArray(labeledArgs())); + } else { + console.log.apply(console, _toConsumableArray(labeledArgs())); + } + + break; + } + + // falls through + + case LogType.group: + if (!debug && loglevel > LogLevel.log) return; // eslint-disable-next-line node/no-unsupported-features/node-builtins + + if (typeof console.group === "function") { + // eslint-disable-next-line node/no-unsupported-features/node-builtins + console.group.apply(console, _toConsumableArray(labeledArgs())); + } else { + console.log.apply(console, _toConsumableArray(labeledArgs())); + } + + break; + + case LogType.groupEnd: + if (!debug && loglevel > LogLevel.log) return; // eslint-disable-next-line node/no-unsupported-features/node-builtins + + if (typeof console.groupEnd === "function") { + // eslint-disable-next-line node/no-unsupported-features/node-builtins + console.groupEnd(); + } + + break; + + case LogType.time: + { + if (!debug && loglevel > LogLevel.log) return; + var ms = args[1] * 1000 + args[2] / 1000000; + var msg = "[".concat(name, "] ").concat(args[0], ": ").concat(ms, " ms"); + + if (typeof console.logTime === "function") { + console.logTime(msg); + } else { + console.log(msg); + } + + break; + } + + case LogType.profile: + // eslint-disable-next-line node/no-unsupported-features/node-builtins + if (typeof console.profile === "function") { + // eslint-disable-next-line node/no-unsupported-features/node-builtins + console.profile.apply(console, _toConsumableArray(labeledArgs())); + } + + break; + + case LogType.profileEnd: + // eslint-disable-next-line node/no-unsupported-features/node-builtins + if (typeof console.profileEnd === "function") { + // eslint-disable-next-line node/no-unsupported-features/node-builtins + console.profileEnd.apply(console, _toConsumableArray(labeledArgs())); + } + + break; + + case LogType.clear: + if (!debug && loglevel > LogLevel.log) return; // eslint-disable-next-line node/no-unsupported-features/node-builtins + + if (typeof console.clear === "function") { + // eslint-disable-next-line node/no-unsupported-features/node-builtins + console.clear(); + } + + break; + + case LogType.status: + if (!debug && loglevel > LogLevel.info) return; + + if (typeof console.status === "function") { + if (args.length === 0) { + console.status(); + } else { + console.status.apply(console, _toConsumableArray(labeledArgs())); + } + } else { + if (args.length !== 0) { + console.info.apply(console, _toConsumableArray(labeledArgs())); + } + } + + break; + + default: + throw new Error("Unexpected LogType ".concat(type)); + } + }; + + return logger; +}; + +/***/ }), + +/***/ "./node_modules/webpack/lib/logging/runtime.js": +/*!*****************************************************!*\ + !*** ./node_modules/webpack/lib/logging/runtime.js ***! + \*****************************************************/ +/***/ (function(__unused_webpack_module, exports, __nested_webpack_require_20872__) { + +/* + MIT License http://www.opensource.org/licenses/mit-license.php + Author Tobias Koppers @sokra +*/ + + +function _extends() { + _extends = Object.assign ? Object.assign.bind() : function (target) { + for (var i = 1; i < arguments.length; i++) { + var source = arguments[i]; + + for (var key in source) { + if (Object.prototype.hasOwnProperty.call(source, key)) { + target[key] = source[key]; + } + } + } + + return target; + }; + return _extends.apply(this, arguments); +} + +var SyncBailHook = __nested_webpack_require_20872__(/*! tapable/lib/SyncBailHook */ "./client-src/modules/logger/SyncBailHookFake.js"); + +var _require = __nested_webpack_require_20872__(/*! ./Logger */ "./node_modules/webpack/lib/logging/Logger.js"), + Logger = _require.Logger; + +var createConsoleLogger = __nested_webpack_require_20872__(/*! ./createConsoleLogger */ "./node_modules/webpack/lib/logging/createConsoleLogger.js"); +/** @type {createConsoleLogger.LoggerOptions} */ + + +var currentDefaultLoggerOptions = { + level: "info", + debug: false, + console: console +}; +var currentDefaultLogger = createConsoleLogger(currentDefaultLoggerOptions); +/** + * @param {string} name name of the logger + * @returns {Logger} a logger + */ + +exports.getLogger = function (name) { + return new Logger(function (type, args) { + if (exports.hooks.log.call(name, type, args) === undefined) { + currentDefaultLogger(name, type, args); + } + }, function (childName) { + return exports.getLogger("".concat(name, "/").concat(childName)); + }); +}; +/** + * @param {createConsoleLogger.LoggerOptions} options new options, merge with old options + * @returns {void} + */ + + +exports.configureDefaultLogger = function (options) { + _extends(currentDefaultLoggerOptions, options); + + currentDefaultLogger = createConsoleLogger(currentDefaultLoggerOptions); +}; + +exports.hooks = { + log: new SyncBailHook(["origin", "type", "args"]) +}; + +/***/ }) + +/******/ }); +/************************************************************************/ +/******/ // The module cache +/******/ var __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __nested_webpack_require_23009__(moduleId) { +/******/ // Check if module is in cache +/******/ var cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ __webpack_modules__[moduleId](module, module.exports, __nested_webpack_require_23009__); +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/define property getters */ +/******/ !function() { +/******/ // define getter functions for harmony exports +/******/ __nested_webpack_require_23009__.d = function(exports, definition) { +/******/ for(var key in definition) { +/******/ if(__nested_webpack_require_23009__.o(definition, key) && !__nested_webpack_require_23009__.o(exports, key)) { +/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); +/******/ } +/******/ } +/******/ }; +/******/ }(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ !function() { +/******/ __nested_webpack_require_23009__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); } +/******/ }(); +/******/ +/******/ /* webpack/runtime/make namespace object */ +/******/ !function() { +/******/ // define __esModule on exports +/******/ __nested_webpack_require_23009__.r = function(exports) { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ }(); +/******/ +/************************************************************************/ +var __webpack_exports__ = {}; +// This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk. +!function() { +/*!********************************************!*\ + !*** ./client-src/modules/logger/index.js ***! + \********************************************/ +__nested_webpack_require_23009__.r(__webpack_exports__); +/* harmony export */ __nested_webpack_require_23009__.d(__webpack_exports__, { +/* harmony export */ "default": function() { return /* reexport default export from named module */ webpack_lib_logging_runtime_js__WEBPACK_IMPORTED_MODULE_0__; } +/* harmony export */ }); +/* harmony import */ var webpack_lib_logging_runtime_js__WEBPACK_IMPORTED_MODULE_0__ = __nested_webpack_require_23009__(/*! webpack/lib/logging/runtime.js */ "./node_modules/webpack/lib/logging/runtime.js"); + +}(); +var __webpack_export_target__ = exports; +for(var i in __webpack_exports__) __webpack_export_target__[i] = __webpack_exports__[i]; +if(__webpack_exports__.__esModule) Object.defineProperty(__webpack_export_target__, "__esModule", { value: true }); +/******/ })() +; + +/***/ }), + +/***/ "./node_modules/webpack-dev-server/client/overlay.js": +/*!***********************************************************!*\ + !*** ./node_modules/webpack-dev-server/client/overlay.js ***! + \***********************************************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "formatProblem": function() { return /* binding */ formatProblem; }, +/* harmony export */ "hide": function() { return /* binding */ hide; }, +/* harmony export */ "show": function() { return /* binding */ show; } +/* harmony export */ }); +/* harmony import */ var ansi_html_community__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ansi-html-community */ "./node_modules/ansi-html-community/index.js"); +/* harmony import */ var ansi_html_community__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(ansi_html_community__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var html_entities__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! html-entities */ "./node_modules/html-entities/lib/index.js"); +/* harmony import */ var html_entities__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(html_entities__WEBPACK_IMPORTED_MODULE_1__); +// The error overlay is inspired (and mostly copied) from Create React App (https://github.com/facebookincubator/create-react-app) +// They, in turn, got inspired by webpack-hot-middleware (https://github.com/glenjamin/webpack-hot-middleware). + + +var colors = { + reset: ["transparent", "transparent"], + black: "181818", + red: "E36049", + green: "B3CB74", + yellow: "FFD080", + blue: "7CAFC2", + magenta: "7FACCA", + cyan: "C3C2EF", + lightgrey: "EBE7E3", + darkgrey: "6D7891" +}; +/** @type {HTMLIFrameElement | null | undefined} */ + +var iframeContainerElement; +/** @type {HTMLDivElement | null | undefined} */ + +var containerElement; +/** @type {Array<(element: HTMLDivElement) => void>} */ + +var onLoadQueue = []; +/** @type {TrustedTypePolicy | undefined} */ + +var overlayTrustedTypesPolicy; +ansi_html_community__WEBPACK_IMPORTED_MODULE_0___default().setColors(colors); +/** + * @param {string | null} trustedTypesPolicyName + */ + +function createContainer(trustedTypesPolicyName) { + // Enable Trusted Types if they are available in the current browser. + if (window.trustedTypes) { + overlayTrustedTypesPolicy = window.trustedTypes.createPolicy(trustedTypesPolicyName || "webpack-dev-server#overlay", { + createHTML: function createHTML(value) { + return value; + } + }); + } + + iframeContainerElement = document.createElement("iframe"); + iframeContainerElement.id = "webpack-dev-server-client-overlay"; + iframeContainerElement.src = "about:blank"; + iframeContainerElement.style.position = "fixed"; + iframeContainerElement.style.left = 0; + iframeContainerElement.style.top = 0; + iframeContainerElement.style.right = 0; + iframeContainerElement.style.bottom = 0; + iframeContainerElement.style.width = "100vw"; + iframeContainerElement.style.height = "100vh"; + iframeContainerElement.style.border = "none"; + iframeContainerElement.style.zIndex = 9999999999; + + iframeContainerElement.onload = function () { + containerElement = + /** @type {Document} */ + + /** @type {HTMLIFrameElement} */ + iframeContainerElement.contentDocument.createElement("div"); + containerElement.id = "webpack-dev-server-client-overlay-div"; + containerElement.style.position = "fixed"; + containerElement.style.boxSizing = "border-box"; + containerElement.style.left = 0; + containerElement.style.top = 0; + containerElement.style.right = 0; + containerElement.style.bottom = 0; + containerElement.style.width = "100vw"; + containerElement.style.height = "100vh"; + containerElement.style.backgroundColor = "rgba(0, 0, 0, 0.85)"; + containerElement.style.color = "#E8E8E8"; + containerElement.style.fontFamily = "Menlo, Consolas, monospace"; + containerElement.style.fontSize = "large"; + containerElement.style.padding = "2rem"; + containerElement.style.lineHeight = "1.2"; + containerElement.style.whiteSpace = "pre-wrap"; + containerElement.style.overflow = "auto"; + var headerElement = document.createElement("span"); + headerElement.innerText = "Compiled with problems:"; + var closeButtonElement = document.createElement("button"); + closeButtonElement.innerText = "X"; + closeButtonElement.style.background = "transparent"; + closeButtonElement.style.border = "none"; + closeButtonElement.style.fontSize = "20px"; + closeButtonElement.style.fontWeight = "bold"; + closeButtonElement.style.color = "white"; + closeButtonElement.style.cursor = "pointer"; + closeButtonElement.style.cssFloat = "right"; // @ts-ignore + + closeButtonElement.style.styleFloat = "right"; + closeButtonElement.addEventListener("click", function () { + hide(); + }); + containerElement.appendChild(headerElement); + containerElement.appendChild(closeButtonElement); + containerElement.appendChild(document.createElement("br")); + containerElement.appendChild(document.createElement("br")); + /** @type {Document} */ + + /** @type {HTMLIFrameElement} */ + iframeContainerElement.contentDocument.body.appendChild(containerElement); + onLoadQueue.forEach(function (onLoad) { + onLoad( + /** @type {HTMLDivElement} */ + containerElement); + }); + onLoadQueue = []; + /** @type {HTMLIFrameElement} */ + + iframeContainerElement.onload = null; + }; + + document.body.appendChild(iframeContainerElement); +} +/** + * @param {(element: HTMLDivElement) => void} callback + * @param {string | null} trustedTypesPolicyName + */ + + +function ensureOverlayExists(callback, trustedTypesPolicyName) { + if (containerElement) { + // Everything is ready, call the callback right away. + callback(containerElement); + return; + } + + onLoadQueue.push(callback); + + if (iframeContainerElement) { + return; + } + + createContainer(trustedTypesPolicyName); +} // Successful compilation. + + +function hide() { + if (!iframeContainerElement) { + return; + } // Clean up and reset internal state. + + + document.body.removeChild(iframeContainerElement); + iframeContainerElement = null; + containerElement = null; +} +/** + * @param {string} type + * @param {string | { file?: string, moduleName?: string, loc?: string, message?: string }} item + * @returns {{ header: string, body: string }} + */ + + +function formatProblem(type, item) { + var header = type === "warning" ? "WARNING" : "ERROR"; + var body = ""; + + if (typeof item === "string") { + body += item; + } else { + var file = item.file || ""; // eslint-disable-next-line no-nested-ternary + + var moduleName = item.moduleName ? item.moduleName.indexOf("!") !== -1 ? "".concat(item.moduleName.replace(/^(\s|\S)*!/, ""), " (").concat(item.moduleName, ")") : "".concat(item.moduleName) : ""; + var loc = item.loc; + header += "".concat(moduleName || file ? " in ".concat(moduleName ? "".concat(moduleName).concat(file ? " (".concat(file, ")") : "") : file).concat(loc ? " ".concat(loc) : "") : ""); + body += item.message || ""; + } + + return { + header: header, + body: body + }; +} // Compilation with errors (e.g. syntax error or missing modules). + +/** + * @param {string} type + * @param {Array} messages + * @param {string | null} trustedTypesPolicyName + */ + + +function show(type, messages, trustedTypesPolicyName) { + ensureOverlayExists(function () { + messages.forEach(function (message) { + var entryElement = document.createElement("div"); + var typeElement = document.createElement("span"); + + var _formatProblem = formatProblem(type, message), + header = _formatProblem.header, + body = _formatProblem.body; + + typeElement.innerText = header; + typeElement.style.color = "#".concat(colors.red); // Make it look similar to our terminal. + + var text = ansi_html_community__WEBPACK_IMPORTED_MODULE_0___default()((0,html_entities__WEBPACK_IMPORTED_MODULE_1__.encode)(body)); + var messageTextNode = document.createElement("div"); + messageTextNode.innerHTML = overlayTrustedTypesPolicy ? overlayTrustedTypesPolicy.createHTML(text) : text; + entryElement.appendChild(typeElement); + entryElement.appendChild(document.createElement("br")); + entryElement.appendChild(document.createElement("br")); + entryElement.appendChild(messageTextNode); + entryElement.appendChild(document.createElement("br")); + entryElement.appendChild(document.createElement("br")); + /** @type {HTMLDivElement} */ + + containerElement.appendChild(entryElement); + }); + }, trustedTypesPolicyName); +} + + + +/***/ }), + +/***/ "./node_modules/webpack-dev-server/client/socket.js": +/*!**********************************************************!*\ + !*** ./node_modules/webpack-dev-server/client/socket.js ***! + \**********************************************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "client": function() { return /* binding */ client; } +/* harmony export */ }); +/* harmony import */ var _clients_WebSocketClient_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./clients/WebSocketClient.js */ "./node_modules/webpack-dev-server/client/clients/WebSocketClient.js"); +/* harmony import */ var _utils_log_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils/log.js */ "./node_modules/webpack-dev-server/client/utils/log.js"); +/* provided dependency */ var __webpack_dev_server_client__ = __webpack_require__(/*! ./node_modules/webpack-dev-server/client/clients/WebSocketClient.js */ "./node_modules/webpack-dev-server/client/clients/WebSocketClient.js"); +/* global __webpack_dev_server_client__ */ + + // this WebsocketClient is here as a default fallback, in case the client is not injected + +/* eslint-disable camelcase */ + +var Client = // eslint-disable-next-line no-nested-ternary +typeof __webpack_dev_server_client__ !== "undefined" ? typeof __webpack_dev_server_client__.default !== "undefined" ? __webpack_dev_server_client__.default : __webpack_dev_server_client__ : _clients_WebSocketClient_js__WEBPACK_IMPORTED_MODULE_0__["default"]; +/* eslint-enable camelcase */ + +var retries = 0; +var maxRetries = 10; // Initialized client is exported so external consumers can utilize the same instance +// It is mutable to enforce singleton +// eslint-disable-next-line import/no-mutable-exports + +var client = null; +/** + * @param {string} url + * @param {{ [handler: string]: (data?: any, params?: any) => any }} handlers + * @param {number} [reconnect] + */ + +var socket = function initSocket(url, handlers, reconnect) { + client = new Client(url); + client.onOpen(function () { + retries = 0; + + if (typeof reconnect !== "undefined") { + maxRetries = reconnect; + } + }); + client.onClose(function () { + if (retries === 0) { + handlers.close(); + } // Try to reconnect. + + + client = null; // After 10 retries stop trying, to prevent logspam. + + if (retries < maxRetries) { + // Exponentially increase timeout to reconnect. + // Respectfully copied from the package `got`. + // eslint-disable-next-line no-restricted-properties + var retryInMs = 1000 * Math.pow(2, retries) + Math.random() * 100; + retries += 1; + _utils_log_js__WEBPACK_IMPORTED_MODULE_1__.log.info("Trying to reconnect..."); + setTimeout(function () { + socket(url, handlers, reconnect); + }, retryInMs); + } + }); + client.onMessage( + /** + * @param {any} data + */ + function (data) { + var message = JSON.parse(data); + + if (handlers[message.type]) { + handlers[message.type](message.data, message.params); + } + }); +}; + +/* harmony default export */ __webpack_exports__["default"] = (socket); + +/***/ }), + +/***/ "./node_modules/webpack-dev-server/client/utils/createSocketURL.js": +/*!*************************************************************************!*\ + !*** ./node_modules/webpack-dev-server/client/utils/createSocketURL.js ***! + \*************************************************************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/** + * @param {{ protocol?: string, auth?: string, hostname?: string, port?: string, pathname?: string, search?: string, hash?: string, slashes?: boolean }} objURL + * @returns {string} + */ +function format(objURL) { + var protocol = objURL.protocol || ""; + + if (protocol && protocol.substr(-1) !== ":") { + protocol += ":"; + } + + var auth = objURL.auth || ""; + + if (auth) { + auth = encodeURIComponent(auth); + auth = auth.replace(/%3A/i, ":"); + auth += "@"; + } + + var host = ""; + + if (objURL.hostname) { + host = auth + (objURL.hostname.indexOf(":") === -1 ? objURL.hostname : "[".concat(objURL.hostname, "]")); + + if (objURL.port) { + host += ":".concat(objURL.port); + } + } + + var pathname = objURL.pathname || ""; + + if (objURL.slashes) { + host = "//".concat(host || ""); + + if (pathname && pathname.charAt(0) !== "/") { + pathname = "/".concat(pathname); + } + } else if (!host) { + host = ""; + } + + var search = objURL.search || ""; + + if (search && search.charAt(0) !== "?") { + search = "?".concat(search); + } + + var hash = objURL.hash || ""; + + if (hash && hash.charAt(0) !== "#") { + hash = "#".concat(hash); + } + + pathname = pathname.replace(/[?#]/g, + /** + * @param {string} match + * @returns {string} + */ + function (match) { + return encodeURIComponent(match); + }); + search = search.replace("#", "%23"); + return "".concat(protocol).concat(host).concat(pathname).concat(search).concat(hash); +} +/** + * @param {URL & { fromCurrentScript?: boolean }} parsedURL + * @returns {string} + */ + + +function createSocketURL(parsedURL) { + var hostname = parsedURL.hostname; // Node.js module parses it as `::` + // `new URL(urlString, [baseURLString])` parses it as '[::]' + + var isInAddrAny = hostname === "0.0.0.0" || hostname === "::" || hostname === "[::]"; // why do we need this check? + // hostname n/a for file protocol (example, when using electron, ionic) + // see: https://github.com/webpack/webpack-dev-server/pull/384 + + if (isInAddrAny && self.location.hostname && self.location.protocol.indexOf("http") === 0) { + hostname = self.location.hostname; + } + + var socketURLProtocol = parsedURL.protocol || self.location.protocol; // When https is used in the app, secure web sockets are always necessary because the browser doesn't accept non-secure web sockets. + + if (socketURLProtocol === "auto:" || hostname && isInAddrAny && self.location.protocol === "https:") { + socketURLProtocol = self.location.protocol; + } + + socketURLProtocol = socketURLProtocol.replace(/^(?:http|.+-extension|file)/i, "ws"); + var socketURLAuth = ""; // `new URL(urlString, [baseURLstring])` doesn't have `auth` property + // Parse authentication credentials in case we need them + + if (parsedURL.username) { + socketURLAuth = parsedURL.username; // Since HTTP basic authentication does not allow empty username, + // we only include password if the username is not empty. + + if (parsedURL.password) { + // Result: : + socketURLAuth = socketURLAuth.concat(":", parsedURL.password); + } + } // In case the host is a raw IPv6 address, it can be enclosed in + // the brackets as the brackets are needed in the final URL string. + // Need to remove those as url.format blindly adds its own set of brackets + // if the host string contains colons. That would lead to non-working + // double brackets (e.g. [[::]]) host + // + // All of these web socket url params are optionally passed in through resourceQuery, + // so we need to fall back to the default if they are not provided + + + var socketURLHostname = (hostname || self.location.hostname || "localhost").replace(/^\[(.*)\]$/, "$1"); + var socketURLPort = parsedURL.port; + + if (!socketURLPort || socketURLPort === "0") { + socketURLPort = self.location.port; + } // If path is provided it'll be passed in via the resourceQuery as a + // query param so it has to be parsed out of the querystring in order for the + // client to open the socket to the correct location. + + + var socketURLPathname = "/ws"; + + if (parsedURL.pathname && !parsedURL.fromCurrentScript) { + socketURLPathname = parsedURL.pathname; + } + + return format({ + protocol: socketURLProtocol, + auth: socketURLAuth, + hostname: socketURLHostname, + port: socketURLPort, + pathname: socketURLPathname, + slashes: true + }); +} + +/* harmony default export */ __webpack_exports__["default"] = (createSocketURL); + +/***/ }), + +/***/ "./node_modules/webpack-dev-server/client/utils/getCurrentScriptSource.js": +/*!********************************************************************************!*\ + !*** ./node_modules/webpack-dev-server/client/utils/getCurrentScriptSource.js ***! + \********************************************************************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/** + * @returns {string} + */ +function getCurrentScriptSource() { + // `document.currentScript` is the most accurate way to find the current script, + // but is not supported in all browsers. + if (document.currentScript) { + return document.currentScript.getAttribute("src"); + } // Fallback to getting all scripts running in the document. + + + var scriptElements = document.scripts || []; + var scriptElementsWithSrc = Array.prototype.filter.call(scriptElements, function (element) { + return element.getAttribute("src"); + }); + + if (scriptElementsWithSrc.length > 0) { + var currentScript = scriptElementsWithSrc[scriptElementsWithSrc.length - 1]; + return currentScript.getAttribute("src"); + } // Fail as there was no script to use. + + + throw new Error("[webpack-dev-server] Failed to get current script source."); +} + +/* harmony default export */ __webpack_exports__["default"] = (getCurrentScriptSource); + +/***/ }), + +/***/ "./node_modules/webpack-dev-server/client/utils/log.js": +/*!*************************************************************!*\ + !*** ./node_modules/webpack-dev-server/client/utils/log.js ***! + \*************************************************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "log": function() { return /* binding */ log; }, +/* harmony export */ "setLogLevel": function() { return /* binding */ setLogLevel; } +/* harmony export */ }); +/* harmony import */ var _modules_logger_index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/logger/index.js */ "./node_modules/webpack-dev-server/client/modules/logger/index.js"); +/* harmony import */ var _modules_logger_index_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_modules_logger_index_js__WEBPACK_IMPORTED_MODULE_0__); + +var name = "webpack-dev-server"; // default level is set on the client side, so it does not need +// to be set by the CLI or API + +var defaultLevel = "info"; // options new options, merge with old options + +/** + * @param {false | true | "none" | "error" | "warn" | "info" | "log" | "verbose"} level + * @returns {void} + */ + +function setLogLevel(level) { + _modules_logger_index_js__WEBPACK_IMPORTED_MODULE_0___default().configureDefaultLogger({ + level: level + }); +} + +setLogLevel(defaultLevel); +var log = _modules_logger_index_js__WEBPACK_IMPORTED_MODULE_0___default().getLogger(name); + + +/***/ }), + +/***/ "./node_modules/webpack-dev-server/client/utils/parseURL.js": +/*!******************************************************************!*\ + !*** ./node_modules/webpack-dev-server/client/utils/parseURL.js ***! + \******************************************************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _getCurrentScriptSource_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getCurrentScriptSource.js */ "./node_modules/webpack-dev-server/client/utils/getCurrentScriptSource.js"); + +/** + * @param {string} resourceQuery + * @returns {{ [key: string]: string | boolean }} + */ + +function parseURL(resourceQuery) { + /** @type {{ [key: string]: string }} */ + var options = {}; + + if (typeof resourceQuery === "string" && resourceQuery !== "") { + var searchParams = resourceQuery.slice(1).split("&"); + + for (var i = 0; i < searchParams.length; i++) { + var pair = searchParams[i].split("="); + options[pair[0]] = decodeURIComponent(pair[1]); + } + } else { + // Else, get the url from the @@ -21,25 +22,6 @@
+ - From 2961a5f85ce487a82d6ad547a796a2d66cf7fa2e Mon Sep 17 00:00:00 2001 From: segun Date: Sat, 10 Dec 2022 19:06:52 +0100 Subject: [PATCH 07/57] fix more indentation issues --- examples/js/export.js | 208 +++++++++++++++++++-------------------- examples/js/listeners.js | 18 ++-- examples/js/select.js | 125 ++++++++--------------- 3 files changed, 155 insertions(+), 196 deletions(-) diff --git a/examples/js/export.js b/examples/js/export.js index 3022fd439..4891e3983 100644 --- a/examples/js/export.js +++ b/examples/js/export.js @@ -1,117 +1,117 @@ - let map; +let map; - (function() { - map = L.map('map').setView([51.505, -0.13], 13); - map.addGoogleMutant(); +(function() { + map = L.map('map').setView([51.505, -0.13], 13); + map.addGoogleMutant(); - map.whenReady(function() { - img = L.distortableImageOverlay('example.jpg', { - corners: [ - L.latLng(51.52, -0.14), - L.latLng(51.52,-0.10), - L.latLng(51.50, -0.14), - L.latLng(51.50,-0.10), - ], - mode: 'lock', - }); + map.whenReady(function() { + img = L.distortableImageOverlay('example.jpg', { + corners: [ + L.latLng(51.52, -0.14), + L.latLng(51.52, -0.10), + L.latLng(51.50, -0.14), + L.latLng(51.50, -0.10), + ], + mode: 'lock', + }); - // create a second image - img2 = L.distortableImageOverlay('example.jpg', { - corners: [ - L.latLng(51.51, -0.20), - L.latLng(51.51, -0.16), - L.latLng(51.49, -0.21), - L.latLng(51.49, -0.17), - ], - mode: 'freeRotate', - suppressToolbar: true, - }); + // create a second image + img2 = L.distortableImageOverlay('example.jpg', { + corners: [ + L.latLng(51.51, -0.20), + L.latLng(51.51, -0.16), + L.latLng(51.49, -0.21), + L.latLng(51.49, -0.17), + ], + mode: 'freeRotate', + suppressToolbar: true, + }); - let json = [{"nodes":[ - { "lat": "41.8200378187", "lon": "-71.4034409085" }, - { "lat": "41.8199873593", "lon": "-71.4030021564" }, - { "lat": "41.8196229772", "lon": "-71.4029728831" }, - {"lat":"41.8198214546","lon":"-71.4034614433"} - ], - "cm_per_pixel": 23.0934, - "src": "https://s3.amazonaws.com/grassrootsmapping/warpables/312455/test.png"}, - {"nodes": [ - { "lat": "41.819898342", "lon": "-71.4035387139" }, - { "lat": "41.819898342", "lon": "-71.4028493862" }, - { "lat": "41.8195005594", "lon": "-71.4028493862" }, - { "lat": "41.8195005594", "lon": "-71.4035387139" } - ], - "cm_per_pixel": 35.8578, - "src": "https://s3.amazonaws.com/grassrootsmapping/warpables/320983/test.png"} - ]; + let json = [{'nodes': [ + {'lat': '41.8200378187', 'lon': '-71.4034409085'}, + {'lat': '41.8199873593', 'lon': '-71.4030021564'}, + {'lat': '41.8196229772', 'lon': '-71.4029728831'}, + {'lat': '41.8198214546', 'lon': '-71.4034614433'}, + ], + 'cm_per_pixel': 23.0934, + 'src': 'https://s3.amazonaws.com/grassrootsmapping/warpables/312455/test.png'}, + {'nodes': [ + {'lat': '41.819898342', 'lon': '-71.4035387139'}, + {'lat': '41.819898342', 'lon': '-71.4028493862'}, + {'lat': '41.8195005594', 'lon': '-71.4028493862'}, + {'lat': '41.8195005594', 'lon': '-71.4035387139'}, + ], + 'cm_per_pixel': 35.8578, + 'src': 'https://s3.amazonaws.com/grassrootsmapping/warpables/320983/test.png'}, + ]; - // customize the function that starts up the export - const fetchStatusUrl = (mergedOpts) => { - const form = new FormData(); - form.append('collection', JSON.stringify(mergedOpts.collection)); - form.append('scale', prompt("Choose a scale or use the default (cm per pixel):", 100) || mergedOpts.scale); - form.append('upload', true); + // customize the function that starts up the export + const fetchStatusUrl = (mergedOpts) => { + const form = new FormData(); + form.append('collection', JSON.stringify(mergedOpts.collection)); + form.append('scale', prompt('Choose a scale or use the default (cm per pixel):', 100) || mergedOpts.scale); + form.append('upload', true); - const reqOpts = { method: 'POST', body: form }; - const req = new Request(mergedOpts.exportStartUrl, reqOpts); + const reqOpts = {method: 'POST', body: form}; + const req = new Request(mergedOpts.exportStartUrl, reqOpts); - fetch(req).then((res) => { - if (res.ok) { - return res.text(); - } - }).then(mergedOpts.handleStatusRes); - }; + fetch(req).then((res) => { + if (res.ok) { + return res.text(); + } + }).then(mergedOpts.handleStatusRes); + }; - // receives the URL of status.json, and starts running the updater to repeatedly fetch from status.json; - // this may be overridden to integrate with any UI - const handleStatusRes = (data) => { - statusUrl = data.split('please visit, ')[1]; + // receives the URL of status.json, and starts running the updater to repeatedly fetch from status.json; + // this may be overridden to integrate with any UI + const handleStatusRes = (data) => { + statusUrl = data.split('please visit, ')[1]; - /* - if we are getting status updates, repeatedly fetch the status.json: - this.updateInterval = setInterval(() => { - const reqOpts = {method: 'GET'}; - const req = new Request(`${data}?${Date.now()}`, reqOpts); - fetch(req).then((res) => { - if (res.ok) { - return res.text(); - } - }).then(opts.updater); - }, opts.frequency); - */ + /* + if we are getting status updates, repeatedly fetch the status.json: + this.updateInterval = setInterval(() => { + const reqOpts = {method: 'GET'}; + const req = new Request(`${data}?${Date.now()}`, reqOpts); + fetch(req).then((res) => { + if (res.ok) { + return res.text(); + } + }).then(opts.updater); + }, opts.frequency); + */ - // but in this example, we're not; we just get the URL of the finished image; - // we should initiate the download? - window.location = statusUrl; - }; - // initialize the collection: - imgGroup = L.distortableCollection({ - exportOpts: { - collection: json, // here we override the image data sent with a custom set - fetchStatusUrl: fetchStatusUrl, - handleStatusRes: handleStatusRes, - exportUrl: '//34.74.118.242/api/v2/export/', // used to - exportStartUrl: '//34.74.118.242/api/v2/export/', // used to initiate the export + // but in this example, we're not; we just get the URL of the finished image; + // we should initiate the download? + window.location = statusUrl; + }; + // initialize the collection: + imgGroup = L.distortableCollection({ + exportOpts: { + collection: json, // here we override the image data sent with a custom set + fetchStatusUrl: fetchStatusUrl, + handleStatusRes: handleStatusRes, + exportUrl: '//34.74.118.242/api/v2/export/', // used to + exportStartUrl: '//34.74.118.242/api/v2/export/', // used to initiate the export - // From this alternative exporter, we'll get a response like: - // "Your Image is exporting, to load Image please visit, http://34.74.118.242/api/v2/status/?pid=3d8233faa2ade0f0cee400fba1170890-7153" - // So, we can splice like this: response.split("please visit, ")[1] - // and get http://34.74.118.242/api/v2/status/?pid=3d8233faa2ade0f0cee400fba1170890-7153 - // Noting, however, later we will expect to get a full Google Cloud Storage URL. + // From this alternative exporter, we'll get a response like: + // "Your Image is exporting, to load Image please visit, http://34.74.118.242/api/v2/status/?pid=3d8233faa2ade0f0cee400fba1170890-7153" + // So, we can splice like this: response.split("please visit, ")[1] + // and get http://34.74.118.242/api/v2/status/?pid=3d8233faa2ade0f0cee400fba1170890-7153 + // Noting, however, later we will expect to get a full Google Cloud Storage URL. - // remaining defaults are as follows, in /src/edit/DistortableCollection.Edit.js: - // collection = opts.collection || this._group.generateExportJson(); - // frequency = opts.frequency || 3000; - // scale = opts.scale || 100; // switch it to _getAvgCmPerPixel ! - // updater: function(json) {} // a function to handle the result of repeated fetching of the status.json file - // fetchStatusUrl = opts.fetchStatusUrl || _defaultFetchStatusUrl; - // handleStatusRes = opts.handleStatusRes || _defaultHandleStatusRes; - // exportStartUrl = opts.exportStartUrl || '//export.mapknitter.org/export'; - // exportUrl = opts.exportUrl || 'http://export.mapknitter.org/'; - }, - }).addTo(map); + // remaining defaults are as follows, in /src/edit/DistortableCollection.Edit.js: + // collection = opts.collection || this._group.generateExportJson(); + // frequency = opts.frequency || 3000; + // scale = opts.scale || 100; // switch it to _getAvgCmPerPixel ! + // updater: function(json) {} // a function to handle the result of repeated fetching of the status.json file + // fetchStatusUrl = opts.fetchStatusUrl || _defaultFetchStatusUrl; + // handleStatusRes = opts.handleStatusRes || _defaultHandleStatusRes; + // exportStartUrl = opts.exportStartUrl || '//export.mapknitter.org/export'; + // exportUrl = opts.exportUrl || 'http://export.mapknitter.org/'; + }, + }).addTo(map); - imgGroup.addLayer(img); - imgGroup.addLayer(img2); - }); - })(); \ No newline at end of file + imgGroup.addLayer(img); + imgGroup.addLayer(img2); + }); +})(); diff --git a/examples/js/listeners.js b/examples/js/listeners.js index 02ddd6169..39a96829e 100644 --- a/examples/js/listeners.js +++ b/examples/js/listeners.js @@ -1,18 +1,18 @@ let map; -(function(){ - map = L.map('map').setView([51.505, -0.09], 13); - map.addGoogleMutant(); +(function() { + map = L.map('map').setView([51.505, -0.09], 13); + map.addGoogleMutant(); - map.whenReady(function() { + map.whenReady(function() { img = L.distortableImageOverlay('example.jpg', { - selected: true, + selected: true, }).addTo(map); // Wait until image is loaded before setting up DOM element listeners L.DomEvent.on(img.getElement(), 'load', function() { - L.DomEvent.on(img, 'edit', function() { alert('edited'); }); - L.DomEvent.on(img.getElement(), 'mouseup touchend', function() { alert('edited'); }); + L.DomEvent.on(img, 'edit', function() { alert('edited'); }); + L.DomEvent.on(img.getElement(), 'mouseup touchend', function() { alert('edited'); }); }); - }); -})(); \ No newline at end of file + }); +})(); diff --git a/examples/js/select.js b/examples/js/select.js index f4b1d5a60..9b2639d1d 100644 --- a/examples/js/select.js +++ b/examples/js/select.js @@ -1,50 +1,66 @@ let map; -(function(){ - map = L.map('map').setView([51.505, -0.09], 13); - map.addGoogleMutant(); +(function() { + map = L.map('map').setView([51.505, -0.09], 13); + map.addGoogleMutant(); - map.whenReady(function() { + map.whenReady(function() { img = L.distortableImageOverlay('example.jpg', { - corners: [ + corners: [ L.latLng(51.52, -0.14), - L.latLng(51.52,-0.10), + L.latLng(51.52, -0.10), L.latLng(51.50, -0.14), - L.latLng(51.50,-0.10), - ], - mode: 'lock', + L.latLng(51.50, -0.10), + ], + mode: 'lock', }); // create a second image img2 = L.distortableImageOverlay('example.jpg', { - corners: [ + corners: [ L.latLng(51.51, -0.20), - L.latLng(51.51,-0.16), + L.latLng(51.51, -0.16), L.latLng(51.49, -0.21), - L.latLng(51.49,-0.17), - ], - mode: 'freeRotate', - suppressToolbar: true, + L.latLng(51.49, -0.17), + ], + mode: 'freeRotate', + suppressToolbar: true, }); img3 = L.distortableImageOverlay('example.jpg', { - corners: [ + corners: [ L.latLng(51.50, -0.13), - L.latLng(51.50,-0.09), + L.latLng(51.50, -0.09), L.latLng(51.48, -0.14), - L.latLng(51.48,-0.10), - ], - actions: [L.DistortAction, L.FreeRotateAction, L.LockAction, L.OpacityAction, L.DeleteAction, L.StackAction], + L.latLng(51.48, -0.10), + ], + actions: [ + L.DistortAction, + L.FreeRotateAction, + L.LockAction, + L.OpacityAction, + L.DeleteAction, + L.StackAction, + ], }); img4 = L.distortableImageOverlay('example.jpg', { - actions: [L.ScaleAction, L.DistortAction, L.RotateAction, L.FreeRotateAction, L.LockAction, L.OpacityAction, L.DeleteAction, L.StackAction], - corners: [ + actions: [ + L.ScaleAction, + L.DistortAction, + L.RotateAction, + L.FreeRotateAction, + L.LockAction, + L.OpacityAction, + L.DeleteAction, + L.StackAction, + ], + corners: [ L.latLng(51.51, -0.07), - L.latLng(51.51,-0.03), + L.latLng(51.51, -0.03), L.latLng(51.49, -0.08), - L.latLng(51.49,-0.04), - ] + L.latLng(51.49, -0.04), + ], }); imgGroup = L.distortableCollection().addTo(map); @@ -54,64 +70,7 @@ let map; imgGroup.addLayer(img4); imgGroup.addLayer(img2); imgGroup.addLayer(img3); - }); + }); })(); -======= - let map; - - (function(){ - map = L.map('map').setView([51.505, -0.09], 13); - map.addGoogleMutant(); - - map.whenReady(function() { - img = L.distortableImageOverlay('example.jpg', { - corners: [ - L.latLng(51.52, -0.14), - L.latLng(51.52,-0.10), - L.latLng(51.50, -0.14), - L.latLng(51.50,-0.10), - ], - mode: 'lock', - }); - - // create a second image - img2 = L.distortableImageOverlay('example.jpg', { - corners: [ - L.latLng(51.51, -0.20), - L.latLng(51.51,-0.16), - L.latLng(51.49, -0.21), - L.latLng(51.49,-0.17), - ], - mode: 'freeRotate', - suppressToolbar: true, - }); - - img3 = L.distortableImageOverlay('example.jpg', { - corners: [ - L.latLng(51.50, -0.13), - L.latLng(51.50,-0.09), - L.latLng(51.48, -0.14), - L.latLng(51.48,-0.10), - ], - actions: [L.DistortAction, L.FreeRotateAction, L.LockAction, L.OpacityAction, L.DeleteAction], - }); - - img4 = L.distortableImageOverlay('example.jpg', { - actions: [L.ScaleAction, L.DistortAction, L.RotateAction, L.FreeRotateAction, L.LockAction, L.OpacityAction, L.DeleteAction], - corners: [ - L.latLng(51.51, -0.07), - L.latLng(51.51,-0.03), - L.latLng(51.49, -0.08), - L.latLng(51.49,-0.04), - ], - }); - imgGroup = L.distortableCollection().addTo(map); - /* TODO: make an addLayers func */ - imgGroup.addLayer(img); - imgGroup.addLayer(img2); - imgGroup.addLayer(img3); - imgGroup.addLayer(img4); - }); - })(); From 1d8fe70c0f6422bebef0d44aa613210fafb940d4 Mon Sep 17 00:00:00 2001 From: segun Date: Thu, 15 Dec 2022 11:42:14 +0100 Subject: [PATCH 08/57] placeholder update --- examples/js/archive.js | 1 + 1 file changed, 1 insertion(+) diff --git a/examples/js/archive.js b/examples/js/archive.js index 3302dca91..a98bcc194 100644 --- a/examples/js/archive.js +++ b/examples/js/archive.js @@ -1,3 +1,4 @@ +// Extension in progress let map; const welcomeModal = document.getElementById('welcomeModal'); const sidebar = document.getElementById('offcanvasRight'); From 82d297ed08b5652748cfc127d6d97638d6da40e2 Mon Sep 17 00:00:00 2001 From: segun Date: Thu, 15 Dec 2022 15:11:37 +0100 Subject: [PATCH 09/57] updated to support restoring welcomemodal --- examples/archive.html | 2 ++ examples/js/archive.js | 7 ++++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/examples/archive.html b/examples/archive.html index cd4d914b7..ad5c4f39c 100644 --- a/examples/archive.html +++ b/examples/archive.html @@ -59,9 +59,11 @@
+

Images

+

diff --git a/examples/js/archive.js b/examples/js/archive.js index a98bcc194..f4876d866 100644 --- a/examples/js/archive.js +++ b/examples/js/archive.js @@ -1,6 +1,6 @@ -// Extension in progress let map; const welcomeModal = document.getElementById('welcomeModal'); +const restoreWelcomeModal = document.getElementById('restoreWelcomeModal'); const sidebar = document.getElementById('offcanvasRight'); const form = document.getElementById('form'); const input = document.getElementById('input'); @@ -112,6 +112,11 @@ welcomeModal.addEventListener('hidden.bs.modal', (event) => { new bootstrap.Offcanvas(sidebar).show(); }); +restoreWelcomeModal.addEventListener('click', (event) => { + bootstrap.Modal.getInstance(welcomeModal).show(); + input.value=''; +}); + map.addEventListener('click', (event) => { sidebar.classList.remove('show'); }); From 72e37adcc67bdfd2e9cb0d9f47c51c438ec01a1f Mon Sep 17 00:00:00 2001 From: segun Date: Thu, 15 Dec 2022 16:19:29 +0100 Subject: [PATCH 10/57] rename id on welcomemodal --- examples/archive.html | 1 - examples/js/archive.js | 10 ++++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/examples/archive.html b/examples/archive.html index 7aa670390..c8732c35a 100644 --- a/examples/archive.html +++ b/examples/archive.html @@ -62,7 +62,6 @@
-

Images

diff --git a/examples/js/archive.js b/examples/js/archive.js index f4876d866..cf54dad40 100644 --- a/examples/js/archive.js +++ b/examples/js/archive.js @@ -1,6 +1,6 @@ let map; const welcomeModal = document.getElementById('welcomeModal'); -const restoreWelcomeModal = document.getElementById('restoreWelcomeModal'); +const restoreWelcomeModal = document.getElementById('restoreWelcomeModalBtn'); const sidebar = document.getElementById('offcanvasRight'); const form = document.getElementById('form'); const input = document.getElementById('input'); @@ -32,9 +32,9 @@ form.addEventListener('submit', (event) => { extractKey(); }); -welcomeModal.addEventListener('hidden.bs.modal', (event) => { - new bootstrap.Offcanvas(sidebar).show(); -}); +// welcomeModal.addEventListener('hidden.bs.modal', (event) => { +// new bootstrap.Offcanvas(sidebar).show(); +// }); function extractKey() { let getUrl; @@ -110,6 +110,7 @@ function showImages(getUrl) { welcomeModal.addEventListener('hidden.bs.modal', (event) => { new bootstrap.Offcanvas(sidebar).show(); + // new bootstrap.Offcanvas(sidebar).show(); }); restoreWelcomeModal.addEventListener('click', (event) => { @@ -122,6 +123,7 @@ map.addEventListener('click', (event) => { }); mapToggle.addEventListener('click', (event) => { + // bootstrap.Offcanvas(sidebar).show(); new bootstrap.Offcanvas(sidebar).show(); }); From 4677c2ccee2cec2f1ec68c2681c4a8ece996a76c Mon Sep 17 00:00:00 2001 From: segun Date: Thu, 15 Dec 2022 16:30:36 +0100 Subject: [PATCH 11/57] update --- examples/archive.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/archive.html b/examples/archive.html index c8732c35a..d27604f1c 100644 --- a/examples/archive.html +++ b/examples/archive.html @@ -65,7 +65,7 @@

Images

- +

From 383c072a6b77188c234622380daeaa7846e64114 Mon Sep 17 00:00:00 2001 From: segun Date: Thu, 15 Dec 2022 16:37:50 +0100 Subject: [PATCH 12/57] removed makeshift commenting --- examples/js/archive.js | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/examples/js/archive.js b/examples/js/archive.js index cf54dad40..cc99d9371 100644 --- a/examples/js/archive.js +++ b/examples/js/archive.js @@ -32,9 +32,9 @@ form.addEventListener('submit', (event) => { extractKey(); }); -// welcomeModal.addEventListener('hidden.bs.modal', (event) => { -// new bootstrap.Offcanvas(sidebar).show(); -// }); +welcomeModal.addEventListener('hidden.bs.modal', (event) => { + new bootstrap.Offcanvas(sidebar).show(); +}); function extractKey() { let getUrl; @@ -110,7 +110,6 @@ function showImages(getUrl) { welcomeModal.addEventListener('hidden.bs.modal', (event) => { new bootstrap.Offcanvas(sidebar).show(); - // new bootstrap.Offcanvas(sidebar).show(); }); restoreWelcomeModal.addEventListener('click', (event) => { @@ -123,7 +122,6 @@ map.addEventListener('click', (event) => { }); mapToggle.addEventListener('click', (event) => { - // bootstrap.Offcanvas(sidebar).show(); new bootstrap.Offcanvas(sidebar).show(); }); From 6e1b5f3fbce304692776ceea4ce9255578263add Mon Sep 17 00:00:00 2001 From: segun Date: Sat, 17 Dec 2022 13:09:31 +0100 Subject: [PATCH 13/57] removed duplicate code in archive.js --- examples/js/archive.js | 4 ---- 1 file changed, 4 deletions(-) diff --git a/examples/js/archive.js b/examples/js/archive.js index cc99d9371..3ec567265 100644 --- a/examples/js/archive.js +++ b/examples/js/archive.js @@ -32,10 +32,6 @@ form.addEventListener('submit', (event) => { extractKey(); }); -welcomeModal.addEventListener('hidden.bs.modal', (event) => { - new bootstrap.Offcanvas(sidebar).show(); -}); - function extractKey() { let getUrl; if (!input.value.includes('archive.org/details/') && !input.value.includes('https://')) From 88cf6ca5239f25593c6282b5d464c76f752fe100 Mon Sep 17 00:00:00 2001 From: segun Date: Sat, 17 Dec 2022 14:35:48 +0100 Subject: [PATCH 14/57] fixed issue on geosearch bar --- examples/js/archive.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/examples/js/archive.js b/examples/js/archive.js index 3ec567265..38d674452 100644 --- a/examples/js/archive.js +++ b/examples/js/archive.js @@ -1,5 +1,6 @@ let map; const welcomeModal = document.getElementById('welcomeModal'); +const tileMap = document.getElementById('map'); const restoreWelcomeModal = document.getElementById('restoreWelcomeModalBtn'); const sidebar = document.getElementById('offcanvasRight'); const form = document.getElementById('form'); @@ -113,14 +114,14 @@ restoreWelcomeModal.addEventListener('click', (event) => { input.value=''; }); -map.addEventListener('click', (event) => { - sidebar.classList.remove('show'); -}); - mapToggle.addEventListener('click', (event) => { new bootstrap.Offcanvas(sidebar).show(); }); +tileMap.addEventListener('click', (event) => { + bootstrap.Offcanvas.getInstance(sidebar).hide(); +}); + document.addEventListener('click', (event) => { if (event.target.classList.contains('place-button')) { const imageURL = event.target.previousElementSibling.src; From 1fc0c1c28c37ebb51760ff3b4cea07cacbb81bd2 Mon Sep 17 00:00:00 2001 From: segun Date: Thu, 29 Dec 2022 14:57:42 +0100 Subject: [PATCH 15/57] tooltip feature built for index.js --- dist/leaflet.distortableimage.js | 56 ++++++++++++++++++++++++++--- examples/js/archive.js | 11 ++++++ src/DistortableImageOverlay.js | 62 ++++++++++++++++++++++++++++++++ 3 files changed, 124 insertions(+), 5 deletions(-) diff --git a/dist/leaflet.distortableimage.js b/dist/leaflet.distortableimage.js index 38b45f3eb..4dfa9b7e3 100644 --- a/dist/leaflet.distortableimage.js +++ b/dist/leaflet.distortableimage.js @@ -464,7 +464,9 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ edgeMinWidth: 50, editable: true, mode: 'distort', - selected: false + selected: false, + // - SEGUN ------------------------------------------------------------------------------------------------------------------------------ + interactive: true }, initialize: function initialize(url, options) { L.setOptions(this, options); @@ -473,7 +475,9 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ this.editable = this.options.editable; this._selected = this.options.selected; this._url = url; - this.rotation = {}; + this.rotation = {}; // SEGUN ------------------------------------------------------------------------------------------------------------------------------ + + this.interactive = this.options.interactive; }, onAdd: function onAdd(map) { var _this = this; @@ -554,9 +558,45 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ L.DomEvent.on(map, 'click', this.deselect, this); } - this.fire('add'); + this.fire('add'); // SEGUN ------------------------------------------------------------------------------------------------------------------------------ + // OPTION 1 + // let cursorX = 0; + + var cursorY = 0; // store previous values of x and y coordinates + + var index = 0; + var prevXval = []; + var prevYval = []; + var newPosX = 0; + L.DomEvent.on(this.getElement(), 'mouseover mousemove', // {mouseover: onMouseOver, mousemove: onMouseMove}, + function (ev) { + console.log('mouseOVER_DONE'); + console.log('mousemove_DONE'); + console.log('CursorLatLngOnImageOverlay - x-axis:', ev.x); + console.log('CursorLatLngOnImageOverlay - y-axis:', ev.y); + cursorX = ev.x; + cursorY = ev.y; + prevXval[index] = ev.x; + prevYval[index] = ev.y; + newPosX = prevXval[index - 1] - prevXval[index]; + ++index; // this.bindTooltip('Map of Port Harcourt', {sticky: true, direction: top, offset: L.point([cursorX - 920, cursorY - 500])}).openTooltip(); // {permanent: true, sticky: true, interactive: true} + + _this.bindTooltip('Map of Port Harcourt', { + sticky: true, + direction: top, + offset: L.point([newPosX, cursorY - 500]) + }).openTooltip(); // {permanent: true, sticky: true, interactive: true} + + }, this); + L.DomEvent.on(this.getElement(), 'mouseout', function () { + console.log('mouseOUT_DONE'); + + _this.closeTooltip(); + }, this); // ENDS ------------------------------------------------------------------------------------------------------------------------------ }, onRemove: function onRemove(map) { + var _this2 = this; + L.DomEvent.off(this.getElement(), 'click', this.select, this); L.DomEvent.off(map, { singleclickon: this._singleClickListeners, @@ -570,7 +610,13 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ } this.fire('remove'); - L.ImageOverlay.prototype.onRemove.call(this, map); + L.ImageOverlay.prototype.onRemove.call(this, map); // SEGUN ------------------------------------------------------------------------------------------------------------------------------ + + L.DomEvent.off(this.getElement(), 'mouseover', function () { + console.log('MouseoverENDED'); + + _this2.unbindTooltip(); + }, this); // ENDS ------------------------------------------------------------------------------------------------------------------------------ }, _initImageDimensions: function _initImageDimensions() { var map = this._map; @@ -7269,7 +7315,7 @@ module.exports.formatError = function (err) { /******/ /******/ /* webpack/runtime/getFullHash */ /******/ !function() { -/******/ __webpack_require__.h = function() { return "e74ca99591694a12fb9d"; } +/******/ __webpack_require__.h = function() { return "9cb223fc0c24072c24f2"; } /******/ }(); /******/ /******/ /* webpack/runtime/hasOwnProperty shorthand */ diff --git a/examples/js/archive.js b/examples/js/archive.js index 38d674452..815032800 100644 --- a/examples/js/archive.js +++ b/examples/js/archive.js @@ -1,4 +1,5 @@ let map; +// const imageOverlaytooltipText; const welcomeModal = document.getElementById('welcomeModal'); const tileMap = document.getElementById('map'); const restoreWelcomeModal = document.getElementById('restoreWelcomeModalBtn'); @@ -91,6 +92,11 @@ function showImages(getUrl) { if (response.data.files && response.data.files.length != 0) { response.data.files.forEach((file) => { renderImages(file, url); + // SEGUN --------------------------------------------------------------------------------------------------------------------------- + // console.log('Test-check'); + // console.log(response.data.metadata.description); + // imageOverlaytooltipText = response.data.metadata.description; - Uncomment to pass + // SEGUN ------------------------------------------------------------------------------------------------------------------------------ }); responseText.innerHTML = imageCount ? `${imageCount} image(s) fetched successfully from ${fetchedFrom.innerHTML}.` : 'No images found in the link provided...'; } else { @@ -122,6 +128,7 @@ tileMap.addEventListener('click', (event) => { bootstrap.Offcanvas.getInstance(sidebar).hide(); }); + document.addEventListener('click', (event) => { if (event.target.classList.contains('place-button')) { const imageURL = event.target.previousElementSibling.src; @@ -129,3 +136,7 @@ document.addEventListener('click', (event) => { map.imgGroup.addLayer(image); } }); + +// SEGUN ------------------------------------------------------------------------------------------------------------------------------ + + diff --git a/src/DistortableImageOverlay.js b/src/DistortableImageOverlay.js index dc79e03d7..5c2f03d25 100644 --- a/src/DistortableImageOverlay.js +++ b/src/DistortableImageOverlay.js @@ -8,6 +8,8 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ editable: true, mode: 'distort', selected: false, + // - SEGUN ------------------------------------------------------------------------------------------------------------------------------ + interactive: true, }, initialize(url, options) { @@ -19,6 +21,8 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ this._selected = this.options.selected; this._url = url; this.rotation = {}; + // SEGUN ------------------------------------------------------------------------------------------------------------------------------ + this.interactive = this.options.interactive; }, onAdd(map) { @@ -81,6 +85,53 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ } this.fire('add'); + + // SEGUN ------------------------------------------------------------------------------------------------------------------------------ + // OPTION 1 + // let cursorX = 0; + let cursorY = 0; + + // store previous values of x and y coordinates + let index = 0; + let prevXval = []; + let prevYval = []; + let newPosX = 0; + + + L.DomEvent.on( + this.getElement(), + 'mouseover mousemove', + // {mouseover: onMouseOver, mousemove: onMouseMove}, + (ev) => { + console.log('mouseOVER_DONE'); + console.log('mousemove_DONE'); + console.log('CursorLatLngOnImageOverlay - x-axis:', ev.x); + console.log('CursorLatLngOnImageOverlay - y-axis:', ev.y); + cursorX = ev.x; + cursorY = ev.y; + + prevXval[index] = ev.x; + prevYval[index] = ev.y; + + newPosX = prevXval[index-1] - prevXval[index]; + ++index; + + // this.bindTooltip('Map of Port Harcourt', {sticky: true, direction: top, offset: L.point([cursorX - 920, cursorY - 500])}).openTooltip(); // {permanent: true, sticky: true, interactive: true} + this.bindTooltip('Map of Port Harcourt', {sticky: true, direction: top, offset: L.point([newPosX, cursorY - 500])}).openTooltip(); // {permanent: true, sticky: true, interactive: true} + }, + this + ); + + L.DomEvent.on( + this.getElement(), + 'mouseout', + () => { + console.log('mouseOUT_DONE'); + this.closeTooltip(); + }, + this + ); + // ENDS ------------------------------------------------------------------------------------------------------------------------------ }, onRemove(map) { @@ -96,6 +147,17 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ this.fire('remove'); L.ImageOverlay.prototype.onRemove.call(this, map); + + // SEGUN ------------------------------------------------------------------------------------------------------------------------------ + L.DomEvent.off(this.getElement(), + 'mouseover', + () => { + console.log('MouseoverENDED'); + this.unbindTooltip(); + }, + this + ); + // ENDS ------------------------------------------------------------------------------------------------------------------------------ }, _initImageDimensions() { From fbf910a0e54d07f80db090c4a09168e9bc5eb97e Mon Sep 17 00:00:00 2001 From: segun Date: Thu, 29 Dec 2022 19:27:14 +0100 Subject: [PATCH 16/57] tooltip feature rigged up for archive.js & index.js --- .gitignore | 1 + dist/leaflet.distortableimage.js | 96 ++++++++++++++------------- examples/js/archive.js | 17 ++--- examples/js/index.js | 1 + src/DistortableImageOverlay.js | 107 +++++++++++++++---------------- 5 files changed, 108 insertions(+), 114 deletions(-) diff --git a/.gitignore b/.gitignore index b407d3097..9531bf3b6 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ node_modules coverage todo.txt +observation.txt *.swp *.swo package-lock.json diff --git a/dist/leaflet.distortableimage.js b/dist/leaflet.distortableimage.js index 4dfa9b7e3..06af218de 100644 --- a/dist/leaflet.distortableimage.js +++ b/dist/leaflet.distortableimage.js @@ -465,8 +465,10 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ editable: true, mode: 'distort', selected: false, - // - SEGUN ------------------------------------------------------------------------------------------------------------------------------ - interactive: true + // SEGUN ------------------------------------------------------------------------------------------------------------------------------ + interactive: true, + tooltipText: 'Unknow image' // SEGUN ------------------------------------------------------------------------------------------------------------------------------ + }, initialize: function initialize(url, options) { L.setOptions(this, options); @@ -478,6 +480,7 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ this.rotation = {}; // SEGUN ------------------------------------------------------------------------------------------------------------------------------ this.interactive = this.options.interactive; + this.tooltipText = options.tooltipText; // SEGUN ------------------------------------------------------------------------------------------------------------------------------ }, onAdd: function onAdd(map) { var _this = this; @@ -559,44 +562,11 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ } this.fire('add'); // SEGUN ------------------------------------------------------------------------------------------------------------------------------ - // OPTION 1 - // let cursorX = 0; - - var cursorY = 0; // store previous values of x and y coordinates - - var index = 0; - var prevXval = []; - var prevYval = []; - var newPosX = 0; - L.DomEvent.on(this.getElement(), 'mouseover mousemove', // {mouseover: onMouseOver, mousemove: onMouseMove}, - function (ev) { - console.log('mouseOVER_DONE'); - console.log('mousemove_DONE'); - console.log('CursorLatLngOnImageOverlay - x-axis:', ev.x); - console.log('CursorLatLngOnImageOverlay - y-axis:', ev.y); - cursorX = ev.x; - cursorY = ev.y; - prevXval[index] = ev.x; - prevYval[index] = ev.y; - newPosX = prevXval[index - 1] - prevXval[index]; - ++index; // this.bindTooltip('Map of Port Harcourt', {sticky: true, direction: top, offset: L.point([cursorX - 920, cursorY - 500])}).openTooltip(); // {permanent: true, sticky: true, interactive: true} - - _this.bindTooltip('Map of Port Harcourt', { - sticky: true, - direction: top, - offset: L.point([newPosX, cursorY - 500]) - }).openTooltip(); // {permanent: true, sticky: true, interactive: true} - }, this); - L.DomEvent.on(this.getElement(), 'mouseout', function () { - console.log('mouseOUT_DONE'); - - _this.closeTooltip(); - }, this); // ENDS ------------------------------------------------------------------------------------------------------------------------------ + L.DomEvent.on(this.getElement(), 'mouseover mousemove', this._activateTooltip, this); + L.DomEvent.on(this.getElement(), 'mouseout', this._closeTooltip, this); }, onRemove: function onRemove(map) { - var _this2 = this; - L.DomEvent.off(this.getElement(), 'click', this.select, this); L.DomEvent.off(map, { singleclickon: this._singleClickListeners, @@ -610,13 +580,9 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ } this.fire('remove'); - L.ImageOverlay.prototype.onRemove.call(this, map); // SEGUN ------------------------------------------------------------------------------------------------------------------------------ + L.ImageOverlay.prototype.onRemove.call(this, map); // SEGUN ----------------------------------------------------------------------------------------------------------------------------- - L.DomEvent.off(this.getElement(), 'mouseover', function () { - console.log('MouseoverENDED'); - - _this2.unbindTooltip(); - }, this); // ENDS ------------------------------------------------------------------------------------------------------------------------------ + L.DomEvent.off(this.getElement(), 'mouseover', this._deactivateTooltip, this); // ENDS ------------------------------------------------------------------------------------------------------------------------------ }, _initImageDimensions: function _initImageDimensions() { var map = this._map; @@ -659,7 +625,7 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ L.DomEvent.off(map, 'singleclick', this.deselect, this); }, isSelected: function isSelected() { - return this._selected; + return this._selected; // this._selected }, deselect: function deselect() { var edit = this.editing; @@ -744,6 +710,43 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ return exceedsTop || exceedsBottom; } }, + // SEGUN ------------------------------------------------------------------------------------------------------------------------------- + // Work in progress on this function + _activateTooltip: function _activateTooltip(ev) { + var index = 0; + var xAxis = []; // stores previous values of x coordinate + + var yAxis = []; // stores previous values of y coordinate, may be needed later + // let newPosX = 0; + + if (!this._selected) { + // Consider using "if (!this.selected)" instead + // console.log('mouseOVER_DONE/mouseMOVE_DONE-TOOLTIP-ACTIVATED'); // To be deleted + // console.log('x-axis:', ev.x); // To be deleted + // console.log('y-axis:', ev.y); // To be deleted + xAxis[index] = ev.x; + yAxis[index] = ev.y; // May be needed later + // newPosX = xAxis[index-1] - xAxis[index]; // - works but not perfect + // newPosX = (xAxis[index-1] - xAxis[index]) - ((xAxis[index])/4); // - better than above but not perfect + // newPosX =(xAxis[index-1] - xAxis[index]) - (xAxis[index] - this.imageWidth); // - works but no perfect + + ++index; + this.bindTooltip(this.tooltipText, { + sticky: true, + direction: 'top', + offset: L.point([ev.x - 700, ev.y - 500]) + }).openTooltip(); // POC only, work still in progress on this - hardcoded, works not perfect yet + } + }, + _closeTooltip: function _closeTooltip() { + // console.log('mouseOUT_DONE-TOOLTIP-CLOSED'); // To be deleted + this.closeTooltip(); + }, + _deactivateTooltip: function _deactivateTooltip() { + // console.log('MouseoverENDED & mousemoveENDED-TOOLTIP-DEACTIVATED'); - To be deleted + this.unbindTooltip(); + }, + // ENDS ------------------------------------------------------------------------------------------------------------------------------ setCorners: function setCorners(latlngObj) { var map = this._map; var zoom = map.getZoom(); @@ -1017,7 +1020,8 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ }); L.distortableImageOverlay = function (id, options) { - return new L.DistortableImageOverlay(id, options); + // remove temp + return new L.DistortableImageOverlay(id, options); // remove temp }; L.Map.addInitHook(function () { @@ -7315,7 +7319,7 @@ module.exports.formatError = function (err) { /******/ /******/ /* webpack/runtime/getFullHash */ /******/ !function() { -/******/ __webpack_require__.h = function() { return "9cb223fc0c24072c24f2"; } +/******/ __webpack_require__.h = function() { return "62d7c36f7dc3388929e9"; } /******/ }(); /******/ /******/ /* webpack/runtime/hasOwnProperty shorthand */ diff --git a/examples/js/archive.js b/examples/js/archive.js index 815032800..e25ad1872 100644 --- a/examples/js/archive.js +++ b/examples/js/archive.js @@ -1,5 +1,5 @@ let map; -// const imageOverlaytooltipText; +let imageOverlaytooltipText; const welcomeModal = document.getElementById('welcomeModal'); const tileMap = document.getElementById('map'); const restoreWelcomeModal = document.getElementById('restoreWelcomeModalBtn'); @@ -92,11 +92,7 @@ function showImages(getUrl) { if (response.data.files && response.data.files.length != 0) { response.data.files.forEach((file) => { renderImages(file, url); - // SEGUN --------------------------------------------------------------------------------------------------------------------------- - // console.log('Test-check'); - // console.log(response.data.metadata.description); - // imageOverlaytooltipText = response.data.metadata.description; - Uncomment to pass - // SEGUN ------------------------------------------------------------------------------------------------------------------------------ + imageOverlaytooltipText = response.data.metadata.description; // <= SEGUN }); responseText.innerHTML = imageCount ? `${imageCount} image(s) fetched successfully from ${fetchedFrom.innerHTML}.` : 'No images found in the link provided...'; } else { @@ -132,11 +128,10 @@ tileMap.addEventListener('click', (event) => { document.addEventListener('click', (event) => { if (event.target.classList.contains('place-button')) { const imageURL = event.target.previousElementSibling.src; - const image = L.distortableImageOverlay(imageURL); + const image = L.distortableImageOverlay( // <= SEGUN + imageURL, + {tooltipText: imageOverlaytooltipText} + ); map.imgGroup.addLayer(image); } }); - -// SEGUN ------------------------------------------------------------------------------------------------------------------------------ - - diff --git a/examples/js/index.js b/examples/js/index.js index bfea75aec..182894360 100644 --- a/examples/js/index.js +++ b/examples/js/index.js @@ -8,6 +8,7 @@ let map; img = L.distortableImageOverlay('example.jpg', { selected: true, fullResolutionSrc: 'large.jpg', + tooltipText: 'Aerial map of NY', // is it actually New York?? ...hardcoded into place since it's for example purposes only }).addTo(map); }); })(); diff --git a/src/DistortableImageOverlay.js b/src/DistortableImageOverlay.js index 5c2f03d25..d1aaef899 100644 --- a/src/DistortableImageOverlay.js +++ b/src/DistortableImageOverlay.js @@ -8,8 +8,10 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ editable: true, mode: 'distort', selected: false, - // - SEGUN ------------------------------------------------------------------------------------------------------------------------------ + // SEGUN ------------------------------------------------------------------------------------------------------------------------------ interactive: true, + tooltipText: 'Unknow image', + // SEGUN ------------------------------------------------------------------------------------------------------------------------------ }, initialize(url, options) { @@ -23,6 +25,8 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ this.rotation = {}; // SEGUN ------------------------------------------------------------------------------------------------------------------------------ this.interactive = this.options.interactive; + this.tooltipText = options.tooltipText; + // SEGUN ------------------------------------------------------------------------------------------------------------------------------ }, onAdd(map) { @@ -87,51 +91,9 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ this.fire('add'); // SEGUN ------------------------------------------------------------------------------------------------------------------------------ - // OPTION 1 - // let cursorX = 0; - let cursorY = 0; + L.DomEvent.on(this.getElement(), 'mouseover mousemove', this._activateTooltip, this); - // store previous values of x and y coordinates - let index = 0; - let prevXval = []; - let prevYval = []; - let newPosX = 0; - - - L.DomEvent.on( - this.getElement(), - 'mouseover mousemove', - // {mouseover: onMouseOver, mousemove: onMouseMove}, - (ev) => { - console.log('mouseOVER_DONE'); - console.log('mousemove_DONE'); - console.log('CursorLatLngOnImageOverlay - x-axis:', ev.x); - console.log('CursorLatLngOnImageOverlay - y-axis:', ev.y); - cursorX = ev.x; - cursorY = ev.y; - - prevXval[index] = ev.x; - prevYval[index] = ev.y; - - newPosX = prevXval[index-1] - prevXval[index]; - ++index; - - // this.bindTooltip('Map of Port Harcourt', {sticky: true, direction: top, offset: L.point([cursorX - 920, cursorY - 500])}).openTooltip(); // {permanent: true, sticky: true, interactive: true} - this.bindTooltip('Map of Port Harcourt', {sticky: true, direction: top, offset: L.point([newPosX, cursorY - 500])}).openTooltip(); // {permanent: true, sticky: true, interactive: true} - }, - this - ); - - L.DomEvent.on( - this.getElement(), - 'mouseout', - () => { - console.log('mouseOUT_DONE'); - this.closeTooltip(); - }, - this - ); - // ENDS ------------------------------------------------------------------------------------------------------------------------------ + L.DomEvent.on(this.getElement(), 'mouseout', this._closeTooltip, this); }, onRemove(map) { @@ -148,15 +110,8 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ L.ImageOverlay.prototype.onRemove.call(this, map); - // SEGUN ------------------------------------------------------------------------------------------------------------------------------ - L.DomEvent.off(this.getElement(), - 'mouseover', - () => { - console.log('MouseoverENDED'); - this.unbindTooltip(); - }, - this - ); + // SEGUN ----------------------------------------------------------------------------------------------------------------------------- + L.DomEvent.off(this.getElement(), 'mouseover', this._deactivateTooltip, this); // ENDS ------------------------------------------------------------------------------------------------------------------------------ }, @@ -208,7 +163,7 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ }, isSelected() { - return this._selected; + return this._selected; // this._selected }, deselect() { @@ -289,6 +244,44 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ } }, + // SEGUN ------------------------------------------------------------------------------------------------------------------------------- + // Work in progress on this function + _activateTooltip(ev) { + let index = 0; + const xAxis = []; // stores previous values of x coordinate + const yAxis = []; // stores previous values of y coordinate, may be needed later + // let newPosX = 0; + + if (!this._selected) { // Consider using "if (!this.selected)" instead + // console.log('mouseOVER_DONE/mouseMOVE_DONE-TOOLTIP-ACTIVATED'); // To be deleted + // console.log('x-axis:', ev.x); // To be deleted + // console.log('y-axis:', ev.y); // To be deleted + + xAxis[index] = ev.x; + yAxis[index] = ev.y; // May be needed later + + // newPosX = xAxis[index-1] - xAxis[index]; // - works but not perfect + // newPosX = (xAxis[index-1] - xAxis[index]) - ((xAxis[index])/4); // - better than above but not perfect + // newPosX =(xAxis[index-1] - xAxis[index]) - (xAxis[index] - this.imageWidth); // - works but no perfect + ++index; + + this.bindTooltip( + this.tooltipText, + {sticky: true, direction: 'top', offset: L.point([ev.x - 700, ev.y - 500])}).openTooltip(); // POC only, work still in progress on this - hardcoded, works not perfect yet + } + }, + + _closeTooltip() { + // console.log('mouseOUT_DONE-TOOLTIP-CLOSED'); // To be deleted + this.closeTooltip(); + }, + + _deactivateTooltip() { + // console.log('MouseoverENDED & mousemoveENDED-TOOLTIP-DEACTIVATED'); - To be deleted + this.unbindTooltip(); + }, + // ENDS ------------------------------------------------------------------------------------------------------------------------------ + setCorners(latlngObj) { const map = this._map; const zoom = map.getZoom(); @@ -596,8 +589,8 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ }, }); -L.distortableImageOverlay = function(id, options) { - return new L.DistortableImageOverlay(id, options); +L.distortableImageOverlay = function(id, options) { // remove temp + return new L.DistortableImageOverlay(id, options); // remove temp }; L.Map.addInitHook(function() { From fa51b78ad360becf523f01a60c578b8d15c0304e Mon Sep 17 00:00:00 2001 From: segun Date: Thu, 29 Dec 2022 21:08:35 +0100 Subject: [PATCH 17/57] updates --- dist/leaflet.distortableimage.js | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/dist/leaflet.distortableimage.js b/dist/leaflet.distortableimage.js index 06af218de..97658f24a 100644 --- a/dist/leaflet.distortableimage.js +++ b/dist/leaflet.distortableimage.js @@ -1933,14 +1933,12 @@ L.DistortableImage.Edit = L.Handler.extend({ _toggleOpacity: function _toggleOpacity() { var image = this._overlay.getElement(); - var opacity; - if (!this.hasTool(L.OpacityAction)) { return; } this._transparent = !this._transparent; - opacity = this._transparent ? this.options.opacity : 1; + var opacity = this._transparent ? this.options.opacity : 1; L.DomUtil.setOpacity(image, opacity); image.setAttribute('opacity', opacity); @@ -1949,14 +1947,12 @@ L.DistortableImage.Edit = L.Handler.extend({ _toggleBorder: function _toggleBorder() { var image = this._overlay.getElement(); - var outline; - if (!this.hasTool(L.BorderAction)) { return; } this._outlined = !this._outlined; - outline = this._outlined ? this.options.outline : 'none'; + var outline = this._outlined ? this.options.outline : 'none'; image.style.outline = outline; this._refresh(); @@ -7319,7 +7315,7 @@ module.exports.formatError = function (err) { /******/ /******/ /* webpack/runtime/getFullHash */ /******/ !function() { -/******/ __webpack_require__.h = function() { return "62d7c36f7dc3388929e9"; } +/******/ __webpack_require__.h = function() { return "5590e22c76a70748cc3f"; } /******/ }(); /******/ /******/ /* webpack/runtime/hasOwnProperty shorthand */ From 97e2a8970e8081a246841967babfc3d0f87fee1b Mon Sep 17 00:00:00 2001 From: segun Date: Thu, 29 Dec 2022 22:07:37 +0100 Subject: [PATCH 18/57] update on tooltip feature --- src/DistortableImageOverlay.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/DistortableImageOverlay.js b/src/DistortableImageOverlay.js index d1aaef899..cc0b19de9 100644 --- a/src/DistortableImageOverlay.js +++ b/src/DistortableImageOverlay.js @@ -10,7 +10,7 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ selected: false, // SEGUN ------------------------------------------------------------------------------------------------------------------------------ interactive: true, - tooltipText: 'Unknow image', + tooltipText: 'Unknow image', // default tooltipText // SEGUN ------------------------------------------------------------------------------------------------------------------------------ }, From 0c47683da34592640a082654db4f8e92aa899634 Mon Sep 17 00:00:00 2001 From: segun Date: Thu, 29 Dec 2022 23:26:35 +0100 Subject: [PATCH 19/57] enabled tooltip feature on more sourcefiles --- dist/leaflet.distortableimage.js | 5 +++-- examples/js/archive.js | 4 ---- examples/js/export.js | 2 ++ examples/js/listeners.js | 1 + examples/js/local.js | 1 + examples/js/select.js | 4 ++++ 6 files changed, 11 insertions(+), 6 deletions(-) diff --git a/dist/leaflet.distortableimage.js b/dist/leaflet.distortableimage.js index 97658f24a..2edcf551a 100644 --- a/dist/leaflet.distortableimage.js +++ b/dist/leaflet.distortableimage.js @@ -467,7 +467,8 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ selected: false, // SEGUN ------------------------------------------------------------------------------------------------------------------------------ interactive: true, - tooltipText: 'Unknow image' // SEGUN ------------------------------------------------------------------------------------------------------------------------------ + tooltipText: 'Unknow image' // default tooltipText + // SEGUN ------------------------------------------------------------------------------------------------------------------------------ }, initialize: function initialize(url, options) { @@ -7315,7 +7316,7 @@ module.exports.formatError = function (err) { /******/ /******/ /* webpack/runtime/getFullHash */ /******/ !function() { -/******/ __webpack_require__.h = function() { return "5590e22c76a70748cc3f"; } +/******/ __webpack_require__.h = function() { return "f2ac3d8112acfafcb3f8"; } /******/ }(); /******/ /******/ /* webpack/runtime/hasOwnProperty shorthand */ diff --git a/examples/js/archive.js b/examples/js/archive.js index a390ee207..ec0aa86e7 100644 --- a/examples/js/archive.js +++ b/examples/js/archive.js @@ -124,10 +124,6 @@ tileMap.addEventListener('click', (event) => { bootstrap.Offcanvas.getInstance(sidebar).hide(); }); -<<<<<<< HEAD - -======= ->>>>>>> 008785ce8d7e04babeccdaf7aaf0a4d8b64b4bcb document.addEventListener('click', (event) => { if (event.target.classList.contains('place-button')) { const imageURL = event.target.previousElementSibling.src; diff --git a/examples/js/export.js b/examples/js/export.js index 4891e3983..c172a6fd7 100644 --- a/examples/js/export.js +++ b/examples/js/export.js @@ -13,6 +13,7 @@ let map; L.latLng(51.50, -0.10), ], mode: 'lock', + tooltipText: 'Aerial map of NY', // hardcoded since it's for example purposes only }); // create a second image @@ -25,6 +26,7 @@ let map; ], mode: 'freeRotate', suppressToolbar: true, + tooltipText: 'Aerial map of NY', // hardcoded since it's for example purposes only }); let json = [{'nodes': [ diff --git a/examples/js/listeners.js b/examples/js/listeners.js index 39a96829e..67224c641 100644 --- a/examples/js/listeners.js +++ b/examples/js/listeners.js @@ -7,6 +7,7 @@ let map; map.whenReady(function() { img = L.distortableImageOverlay('example.jpg', { selected: true, + tooltipText: 'Aerial map of NY', // hardcoded since it's for example purposes only }).addTo(map); // Wait until image is loaded before setting up DOM element listeners diff --git a/examples/js/local.js b/examples/js/local.js index 1d3144792..913db6b31 100644 --- a/examples/js/local.js +++ b/examples/js/local.js @@ -39,6 +39,7 @@ const loadMap = (image) => { img = L.distortableImageOverlay(image, { selected: true, fullResolutionSrc: 'large.jpg', + tooltipText: 'Map of NY', // If needed, consider using dynamic value for key 'tooltipText' }).addTo(map); }); }; diff --git a/examples/js/select.js b/examples/js/select.js index 9b2639d1d..939d772cf 100644 --- a/examples/js/select.js +++ b/examples/js/select.js @@ -13,6 +13,7 @@ let map; L.latLng(51.50, -0.10), ], mode: 'lock', + tooltipText: 'Map of NY', // If needed, consider using dynamic value for key 'tooltipText' }); // create a second image @@ -25,6 +26,7 @@ let map; ], mode: 'freeRotate', suppressToolbar: true, + tooltipText: 'Map of NY', // If needed, consider using dynamic value for key 'tooltipText' }); img3 = L.distortableImageOverlay('example.jpg', { @@ -42,6 +44,7 @@ let map; L.DeleteAction, L.StackAction, ], + tooltipText: 'Map of NY', // If needed, consider using dynamic value for key 'tooltipText' }); img4 = L.distortableImageOverlay('example.jpg', { @@ -61,6 +64,7 @@ let map; L.latLng(51.49, -0.08), L.latLng(51.49, -0.04), ], + tooltipText: 'Map of NY', // If needed, consider using dynamic value for key 'tooltipText' }); imgGroup = L.distortableCollection().addTo(map); From 15390ae7a4e82dc15e59d119ac0809467f0a353e Mon Sep 17 00:00:00 2001 From: segun Date: Thu, 5 Jan 2023 12:10:39 +0100 Subject: [PATCH 20/57] tooltip feature implemented using alternative approach --- dist/leaflet.distortableimage.js | 54 +++++++++++++++++++++++++------- examples/archive.css | 21 +++++++++++++ examples/archive.html | 3 ++ examples/js/archive.js | 36 ++++++++++++++++++++- examples/js/local.js | 1 + src/DistortableImageOverlay.js | 43 +++++++++++++++++++++---- 6 files changed, 140 insertions(+), 18 deletions(-) create mode 100644 examples/archive.css diff --git a/dist/leaflet.distortableimage.js b/dist/leaflet.distortableimage.js index 2edcf551a..da4266f57 100644 --- a/dist/leaflet.distortableimage.js +++ b/dist/leaflet.distortableimage.js @@ -563,9 +563,9 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ } this.fire('add'); // SEGUN ------------------------------------------------------------------------------------------------------------------------------ - - L.DomEvent.on(this.getElement(), 'mouseover mousemove', this._activateTooltip, this); - L.DomEvent.on(this.getElement(), 'mouseout', this._closeTooltip, this); + // *L.DomEvent.on(this.getElement(), 'mouseover mousemove', this._activateTooltip, this); + // L.DomEvent.on(this.getElement(), 'mousemove', this._activateTooltip, this); + // *L.DomEvent.on(this.getElement(), 'mouseout', this._closeTooltip, this); }, onRemove: function onRemove(map) { L.DomEvent.off(this.getElement(), 'click', this.select, this); @@ -711,7 +711,11 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ return exceedsTop || exceedsBottom; } }, - // SEGUN ------------------------------------------------------------------------------------------------------------------------------- + // // OPTION 2 ------------------------------------------------------------------------------------------------------------------------------- + // _activateTooltip(ev) { + // // console.log('latlong at center', this.getCenter()); + // }, + // OPTION 1 SEGUN ------------------------------------------------------------------------------------------------------------------------------- // Work in progress on this function _activateTooltip: function _activateTooltip(ev) { var index = 0; @@ -723,20 +727,48 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ if (!this._selected) { // Consider using "if (!this.selected)" instead // console.log('mouseOVER_DONE/mouseMOVE_DONE-TOOLTIP-ACTIVATED'); // To be deleted - // console.log('x-axis:', ev.x); // To be deleted - // console.log('y-axis:', ev.y); // To be deleted + console.log('ev:', ev); // To be deleted + + console.log('x-axis:', ev.x); // To be deleted + + console.log('y-axis:', ev.y); // To be deleted + xAxis[index] = ev.x; yAxis[index] = ev.y; // May be needed later // newPosX = xAxis[index-1] - xAxis[index]; // - works but not perfect // newPosX = (xAxis[index-1] - xAxis[index]) - ((xAxis[index])/4); // - better than above but not perfect // newPosX =(xAxis[index-1] - xAxis[index]) - (xAxis[index] - this.imageWidth); // - works but no perfect - ++index; - this.bindTooltip(this.tooltipText, { + /* + 248,373 541,373 --> x, y -- x diff = 293 + 249,562 541,561 --> x, y -- x diff = 292 + */ + // newPosX = ev.x + (ev.y/12); + + ++index; // Calculate + // if (index != 0) { + // if ((xAxis[index] > xAxis[index-1]) && ((yAxis[index] > yAxis[index-1]))) { // cursor moves right-up + // newPosX = xAxis[index] - xAxis[index-1]; + // } else if ((xAxis[index] > xAxis[index-1]) && ((yAxis[index] > yAxis[index-1]))) { // cursor moves right-down + // // newPosX - (xAxis[index-1] - xAxis[index]); + // } + // // newPosX = (ev.x + (xAxis[index-1] - ev.x)) - 700; + // // newPosY = (ev.y + (yAxis[index-1] - ev.y)) - 500; + // // newPosX = (xAxis[index-1] - ev.x) - 700; + // // newPosY = (yAxis[index-1] - ev.y) - 500; + // } + + if (index != 0) { + newPosX = ev.x - (ev.x - xAxis[index - 1]) + 10; + newPosY = ev.y - (ev.x - xAxis[index - 1]) + 30; + } + + this.bindTooltip(this.tooltipText, // {sticky: true, direction: 'top', offset: L.point([newPosX, newPosY])}).openTooltip(); + { sticky: true, direction: 'top', - offset: L.point([ev.x - 700, ev.y - 500]) - }).openTooltip(); // POC only, work still in progress on this - hardcoded, works not perfect yet + offset: L.point([ev.x, ev.y]) + }).openTooltip(); // {sticky: true, direction: 'top', offset: L.point([ev.x - 700, ev.y - 500])}).openTooltip(); // POC only, work still in progress on this - hardcoded, works not perfect yet } }, _closeTooltip: function _closeTooltip() { @@ -7316,7 +7348,7 @@ module.exports.formatError = function (err) { /******/ /******/ /* webpack/runtime/getFullHash */ /******/ !function() { -/******/ __webpack_require__.h = function() { return "f2ac3d8112acfafcb3f8"; } +/******/ __webpack_require__.h = function() { return "493561d37cd0443213e3"; } /******/ }(); /******/ /******/ /* webpack/runtime/hasOwnProperty shorthand */ diff --git a/examples/archive.css b/examples/archive.css new file mode 100644 index 000000000..96f6bed83 --- /dev/null +++ b/examples/archive.css @@ -0,0 +1,21 @@ +.distortableImageTooltip { + position: relative; + display: inline-block; + border-bottom: 1px white; + z-index: 1800; + position: absolute; +} + +/* .tooltipText { + width: 120px; + bottom: 100%; + left: 50%; + margin-left: -60px; + visibility: hidden; + background-color: #fff; + color: red; + text-align: center; + padding: 5px 0; + border-radius: 6px; +} */ + diff --git a/examples/archive.html b/examples/archive.html index d27604f1c..cceb48b7c 100644 --- a/examples/archive.html +++ b/examples/archive.html @@ -12,6 +12,7 @@ + @@ -61,6 +62,8 @@
+ +
diff --git a/examples/js/archive.js b/examples/js/archive.js index ec0aa86e7..4512bf881 100644 --- a/examples/js/archive.js +++ b/examples/js/archive.js @@ -1,4 +1,5 @@ let map; +// let image; let imageOverlaytooltipText; const welcomeModal = document.getElementById('welcomeModal'); const tileMap = document.getElementById('map'); @@ -9,6 +10,9 @@ const input = document.getElementById('input'); const responseText = document.getElementById('response'); const imageContainer = document.getElementById('imgContainer'); const mapToggle = document.getElementById('mapToggle'); +const imageOverlaytooltip = document.getElementById('imageOverlaytooltip'); +const tooltipText = document.getElementById('tooltiptext'); + const setupMap = () => { map = L.map('map').setView([51.505, -0.09], 13); @@ -124,13 +128,43 @@ tileMap.addEventListener('click', (event) => { bootstrap.Offcanvas.getInstance(sidebar).hide(); }); +// --------------------------------------------------------------------------------------------- +// OPTION 1 - Runs independently of OPTION 2 document.addEventListener('click', (event) => { if (event.target.classList.contains('place-button')) { const imageURL = event.target.previousElementSibling.src; - const image = L.distortableImageOverlay( // <= SEGUN + // const image = L.distortableImageOverlay( + image = L.distortableImageOverlay( // <= SEGUN imageURL, {tooltipText: imageOverlaytooltipText} ); map.imgGroup.addLayer(image); } }); + +// --------------------------------------------------------------------------------------------- +// OPTION 2.1 - To run this option, uncomment OPTION 1 above too as well +document.addEventListener('mousemove', (event) => { + if (event.target.classList.contains('leaflet-image-layer')) { + if (!image.isSelected()) { + const xPos = event.layerX; + const yPos = event.layerY; + + tooltipText.textContent = imageOverlaytooltipText; + imageOverlaytooltip.style.position = 'absolute'; + imageOverlaytooltip.style.left = (xPos - 60) +'px'; + imageOverlaytooltip.style.top = (yPos - 40) +'px'; + imageOverlaytooltip.hidden = false; + } + + if (image.isSelected()) { + imageOverlaytooltip.hidden = true; + } + } +}); + +document.addEventListener('mouseout', (event) => { + if (event.target.classList.contains('leaflet-image-layer')) { + imageOverlaytooltip.hidden = true; + } +}); diff --git a/examples/js/local.js b/examples/js/local.js index 913db6b31..6bfe8285b 100644 --- a/examples/js/local.js +++ b/examples/js/local.js @@ -42,6 +42,7 @@ const loadMap = (image) => { tooltipText: 'Map of NY', // If needed, consider using dynamic value for key 'tooltipText' }).addTo(map); }); + console.log('Image from local.js', img); }; const handleDrop = (e) => { diff --git a/src/DistortableImageOverlay.js b/src/DistortableImageOverlay.js index cc0b19de9..4a38326b3 100644 --- a/src/DistortableImageOverlay.js +++ b/src/DistortableImageOverlay.js @@ -91,9 +91,10 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ this.fire('add'); // SEGUN ------------------------------------------------------------------------------------------------------------------------------ - L.DomEvent.on(this.getElement(), 'mouseover mousemove', this._activateTooltip, this); + // *L.DomEvent.on(this.getElement(), 'mouseover mousemove', this._activateTooltip, this); + // L.DomEvent.on(this.getElement(), 'mousemove', this._activateTooltip, this); - L.DomEvent.on(this.getElement(), 'mouseout', this._closeTooltip, this); + // *L.DomEvent.on(this.getElement(), 'mouseout', this._closeTooltip, this); }, onRemove(map) { @@ -244,7 +245,12 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ } }, - // SEGUN ------------------------------------------------------------------------------------------------------------------------------- + // // OPTION 2 ------------------------------------------------------------------------------------------------------------------------------- + // _activateTooltip(ev) { + // // console.log('latlong at center', this.getCenter()); + // }, + + // OPTION 1 SEGUN ------------------------------------------------------------------------------------------------------------------------------- // Work in progress on this function _activateTooltip(ev) { let index = 0; @@ -254,8 +260,9 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ if (!this._selected) { // Consider using "if (!this.selected)" instead // console.log('mouseOVER_DONE/mouseMOVE_DONE-TOOLTIP-ACTIVATED'); // To be deleted - // console.log('x-axis:', ev.x); // To be deleted - // console.log('y-axis:', ev.y); // To be deleted + console.log('ev:', ev); // To be deleted + console.log('x-axis:', ev.x); // To be deleted + console.log('y-axis:', ev.y); // To be deleted xAxis[index] = ev.x; yAxis[index] = ev.y; // May be needed later @@ -263,11 +270,35 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ // newPosX = xAxis[index-1] - xAxis[index]; // - works but not perfect // newPosX = (xAxis[index-1] - xAxis[index]) - ((xAxis[index])/4); // - better than above but not perfect // newPosX =(xAxis[index-1] - xAxis[index]) - (xAxis[index] - this.imageWidth); // - works but no perfect + /* + 248,373 541,373 --> x, y -- x diff = 293 + 249,562 541,561 --> x, y -- x diff = 292 + */ + + // newPosX = ev.x + (ev.y/12); ++index; + // Calculate + // if (index != 0) { + // if ((xAxis[index] > xAxis[index-1]) && ((yAxis[index] > yAxis[index-1]))) { // cursor moves right-up + // newPosX = xAxis[index] - xAxis[index-1]; + // } else if ((xAxis[index] > xAxis[index-1]) && ((yAxis[index] > yAxis[index-1]))) { // cursor moves right-down + // // newPosX - (xAxis[index-1] - xAxis[index]); + // } + // // newPosX = (ev.x + (xAxis[index-1] - ev.x)) - 700; + // // newPosY = (ev.y + (yAxis[index-1] - ev.y)) - 500; + // // newPosX = (xAxis[index-1] - ev.x) - 700; + // // newPosY = (yAxis[index-1] - ev.y) - 500; + // } + if (index != 0) { + newPosX = (ev.x - (ev.x - xAxis[index-1])) + 10; + newPosY = (ev.y - (ev.x - xAxis[index-1])) + 30; + } this.bindTooltip( this.tooltipText, - {sticky: true, direction: 'top', offset: L.point([ev.x - 700, ev.y - 500])}).openTooltip(); // POC only, work still in progress on this - hardcoded, works not perfect yet + // {sticky: true, direction: 'top', offset: L.point([newPosX, newPosY])}).openTooltip(); + {sticky: true, direction: 'top', offset: L.point([ev.x, ev.y])}).openTooltip(); + // {sticky: true, direction: 'top', offset: L.point([ev.x - 700, ev.y - 500])}).openTooltip(); // POC only, work still in progress on this - hardcoded, works not perfect yet } }, From ed68ed6ba7e879c76bf64161b95ea542bcf148c5 Mon Sep 17 00:00:00 2001 From: segun Date: Thu, 5 Jan 2023 13:21:30 +0100 Subject: [PATCH 21/57] update --- dist/leaflet.distortableimage.js | 7 +++++-- examples/js/archive.js | 7 +++++++ examples/js/export.js | 2 -- examples/js/listeners.js | 1 - examples/js/local.js | 1 - examples/js/select.js | 4 ---- 6 files changed, 12 insertions(+), 10 deletions(-) diff --git a/dist/leaflet.distortableimage.js b/dist/leaflet.distortableimage.js index da4266f57..9993fe320 100644 --- a/dist/leaflet.distortableimage.js +++ b/dist/leaflet.distortableimage.js @@ -467,8 +467,7 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ selected: false, // SEGUN ------------------------------------------------------------------------------------------------------------------------------ interactive: true, - tooltipText: 'Unknow image' // default tooltipText - // SEGUN ------------------------------------------------------------------------------------------------------------------------------ + tooltipText: 'Unknow image' // SEGUN ------------------------------------------------------------------------------------------------------------------------------ }, initialize: function initialize(url, options) { @@ -7348,7 +7347,11 @@ module.exports.formatError = function (err) { /******/ /******/ /* webpack/runtime/getFullHash */ /******/ !function() { +<<<<<<< HEAD /******/ __webpack_require__.h = function() { return "493561d37cd0443213e3"; } +======= +/******/ __webpack_require__.h = function() { return "5590e22c76a70748cc3f"; } +>>>>>>> parent of 0c47683 (enabled tooltip feature on more sourcefiles) /******/ }(); /******/ /******/ /* webpack/runtime/hasOwnProperty shorthand */ diff --git a/examples/js/archive.js b/examples/js/archive.js index 4512bf881..8cbf06c0c 100644 --- a/examples/js/archive.js +++ b/examples/js/archive.js @@ -128,8 +128,15 @@ tileMap.addEventListener('click', (event) => { bootstrap.Offcanvas.getInstance(sidebar).hide(); }); +<<<<<<< HEAD // --------------------------------------------------------------------------------------------- // OPTION 1 - Runs independently of OPTION 2 +======= +<<<<<<< HEAD + +======= +>>>>>>> 008785ce8d7e04babeccdaf7aaf0a4d8b64b4bcb +>>>>>>> parent of 0c47683 (enabled tooltip feature on more sourcefiles) document.addEventListener('click', (event) => { if (event.target.classList.contains('place-button')) { const imageURL = event.target.previousElementSibling.src; diff --git a/examples/js/export.js b/examples/js/export.js index c172a6fd7..4891e3983 100644 --- a/examples/js/export.js +++ b/examples/js/export.js @@ -13,7 +13,6 @@ let map; L.latLng(51.50, -0.10), ], mode: 'lock', - tooltipText: 'Aerial map of NY', // hardcoded since it's for example purposes only }); // create a second image @@ -26,7 +25,6 @@ let map; ], mode: 'freeRotate', suppressToolbar: true, - tooltipText: 'Aerial map of NY', // hardcoded since it's for example purposes only }); let json = [{'nodes': [ diff --git a/examples/js/listeners.js b/examples/js/listeners.js index 67224c641..39a96829e 100644 --- a/examples/js/listeners.js +++ b/examples/js/listeners.js @@ -7,7 +7,6 @@ let map; map.whenReady(function() { img = L.distortableImageOverlay('example.jpg', { selected: true, - tooltipText: 'Aerial map of NY', // hardcoded since it's for example purposes only }).addTo(map); // Wait until image is loaded before setting up DOM element listeners diff --git a/examples/js/local.js b/examples/js/local.js index 6bfe8285b..346b31965 100644 --- a/examples/js/local.js +++ b/examples/js/local.js @@ -39,7 +39,6 @@ const loadMap = (image) => { img = L.distortableImageOverlay(image, { selected: true, fullResolutionSrc: 'large.jpg', - tooltipText: 'Map of NY', // If needed, consider using dynamic value for key 'tooltipText' }).addTo(map); }); console.log('Image from local.js', img); diff --git a/examples/js/select.js b/examples/js/select.js index 939d772cf..9b2639d1d 100644 --- a/examples/js/select.js +++ b/examples/js/select.js @@ -13,7 +13,6 @@ let map; L.latLng(51.50, -0.10), ], mode: 'lock', - tooltipText: 'Map of NY', // If needed, consider using dynamic value for key 'tooltipText' }); // create a second image @@ -26,7 +25,6 @@ let map; ], mode: 'freeRotate', suppressToolbar: true, - tooltipText: 'Map of NY', // If needed, consider using dynamic value for key 'tooltipText' }); img3 = L.distortableImageOverlay('example.jpg', { @@ -44,7 +42,6 @@ let map; L.DeleteAction, L.StackAction, ], - tooltipText: 'Map of NY', // If needed, consider using dynamic value for key 'tooltipText' }); img4 = L.distortableImageOverlay('example.jpg', { @@ -64,7 +61,6 @@ let map; L.latLng(51.49, -0.08), L.latLng(51.49, -0.04), ], - tooltipText: 'Map of NY', // If needed, consider using dynamic value for key 'tooltipText' }); imgGroup = L.distortableCollection().addTo(map); From a2eac1bdc92b6d6ed894c67e1352e68038ae3257 Mon Sep 17 00:00:00 2001 From: segun Date: Thu, 5 Jan 2023 13:35:35 +0100 Subject: [PATCH 22/57] update --- dist/leaflet.distortableimage.js | 7 ++----- examples/js/archive.js | 7 ------- examples/js/export.js | 2 ++ examples/js/listeners.js | 1 + examples/js/local.js | 1 + examples/js/select.js | 4 ++++ 6 files changed, 10 insertions(+), 12 deletions(-) diff --git a/dist/leaflet.distortableimage.js b/dist/leaflet.distortableimage.js index 9993fe320..da4266f57 100644 --- a/dist/leaflet.distortableimage.js +++ b/dist/leaflet.distortableimage.js @@ -467,7 +467,8 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ selected: false, // SEGUN ------------------------------------------------------------------------------------------------------------------------------ interactive: true, - tooltipText: 'Unknow image' // SEGUN ------------------------------------------------------------------------------------------------------------------------------ + tooltipText: 'Unknow image' // default tooltipText + // SEGUN ------------------------------------------------------------------------------------------------------------------------------ }, initialize: function initialize(url, options) { @@ -7347,11 +7348,7 @@ module.exports.formatError = function (err) { /******/ /******/ /* webpack/runtime/getFullHash */ /******/ !function() { -<<<<<<< HEAD /******/ __webpack_require__.h = function() { return "493561d37cd0443213e3"; } -======= -/******/ __webpack_require__.h = function() { return "5590e22c76a70748cc3f"; } ->>>>>>> parent of 0c47683 (enabled tooltip feature on more sourcefiles) /******/ }(); /******/ /******/ /* webpack/runtime/hasOwnProperty shorthand */ diff --git a/examples/js/archive.js b/examples/js/archive.js index 8cbf06c0c..4512bf881 100644 --- a/examples/js/archive.js +++ b/examples/js/archive.js @@ -128,15 +128,8 @@ tileMap.addEventListener('click', (event) => { bootstrap.Offcanvas.getInstance(sidebar).hide(); }); -<<<<<<< HEAD // --------------------------------------------------------------------------------------------- // OPTION 1 - Runs independently of OPTION 2 -======= -<<<<<<< HEAD - -======= ->>>>>>> 008785ce8d7e04babeccdaf7aaf0a4d8b64b4bcb ->>>>>>> parent of 0c47683 (enabled tooltip feature on more sourcefiles) document.addEventListener('click', (event) => { if (event.target.classList.contains('place-button')) { const imageURL = event.target.previousElementSibling.src; diff --git a/examples/js/export.js b/examples/js/export.js index 4891e3983..c172a6fd7 100644 --- a/examples/js/export.js +++ b/examples/js/export.js @@ -13,6 +13,7 @@ let map; L.latLng(51.50, -0.10), ], mode: 'lock', + tooltipText: 'Aerial map of NY', // hardcoded since it's for example purposes only }); // create a second image @@ -25,6 +26,7 @@ let map; ], mode: 'freeRotate', suppressToolbar: true, + tooltipText: 'Aerial map of NY', // hardcoded since it's for example purposes only }); let json = [{'nodes': [ diff --git a/examples/js/listeners.js b/examples/js/listeners.js index 39a96829e..67224c641 100644 --- a/examples/js/listeners.js +++ b/examples/js/listeners.js @@ -7,6 +7,7 @@ let map; map.whenReady(function() { img = L.distortableImageOverlay('example.jpg', { selected: true, + tooltipText: 'Aerial map of NY', // hardcoded since it's for example purposes only }).addTo(map); // Wait until image is loaded before setting up DOM element listeners diff --git a/examples/js/local.js b/examples/js/local.js index 346b31965..6bfe8285b 100644 --- a/examples/js/local.js +++ b/examples/js/local.js @@ -39,6 +39,7 @@ const loadMap = (image) => { img = L.distortableImageOverlay(image, { selected: true, fullResolutionSrc: 'large.jpg', + tooltipText: 'Map of NY', // If needed, consider using dynamic value for key 'tooltipText' }).addTo(map); }); console.log('Image from local.js', img); diff --git a/examples/js/select.js b/examples/js/select.js index 9b2639d1d..939d772cf 100644 --- a/examples/js/select.js +++ b/examples/js/select.js @@ -13,6 +13,7 @@ let map; L.latLng(51.50, -0.10), ], mode: 'lock', + tooltipText: 'Map of NY', // If needed, consider using dynamic value for key 'tooltipText' }); // create a second image @@ -25,6 +26,7 @@ let map; ], mode: 'freeRotate', suppressToolbar: true, + tooltipText: 'Map of NY', // If needed, consider using dynamic value for key 'tooltipText' }); img3 = L.distortableImageOverlay('example.jpg', { @@ -42,6 +44,7 @@ let map; L.DeleteAction, L.StackAction, ], + tooltipText: 'Map of NY', // If needed, consider using dynamic value for key 'tooltipText' }); img4 = L.distortableImageOverlay('example.jpg', { @@ -61,6 +64,7 @@ let map; L.latLng(51.49, -0.08), L.latLng(51.49, -0.04), ], + tooltipText: 'Map of NY', // If needed, consider using dynamic value for key 'tooltipText' }); imgGroup = L.distortableCollection().addTo(map); From 4b11af9ec7481a83b1769563de9c5d1d403f4aea Mon Sep 17 00:00:00 2001 From: segun Date: Thu, 5 Jan 2023 13:39:18 +0100 Subject: [PATCH 23/57] update --- dist/leaflet.distortableimage.js | 54 +++++++------------------------- examples/archive.css | 21 ------------- examples/archive.html | 3 -- examples/js/archive.js | 36 +-------------------- examples/js/local.js | 1 - src/DistortableImageOverlay.js | 43 ++++--------------------- 6 files changed, 18 insertions(+), 140 deletions(-) delete mode 100644 examples/archive.css diff --git a/dist/leaflet.distortableimage.js b/dist/leaflet.distortableimage.js index da4266f57..2edcf551a 100644 --- a/dist/leaflet.distortableimage.js +++ b/dist/leaflet.distortableimage.js @@ -563,9 +563,9 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ } this.fire('add'); // SEGUN ------------------------------------------------------------------------------------------------------------------------------ - // *L.DomEvent.on(this.getElement(), 'mouseover mousemove', this._activateTooltip, this); - // L.DomEvent.on(this.getElement(), 'mousemove', this._activateTooltip, this); - // *L.DomEvent.on(this.getElement(), 'mouseout', this._closeTooltip, this); + + L.DomEvent.on(this.getElement(), 'mouseover mousemove', this._activateTooltip, this); + L.DomEvent.on(this.getElement(), 'mouseout', this._closeTooltip, this); }, onRemove: function onRemove(map) { L.DomEvent.off(this.getElement(), 'click', this.select, this); @@ -711,11 +711,7 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ return exceedsTop || exceedsBottom; } }, - // // OPTION 2 ------------------------------------------------------------------------------------------------------------------------------- - // _activateTooltip(ev) { - // // console.log('latlong at center', this.getCenter()); - // }, - // OPTION 1 SEGUN ------------------------------------------------------------------------------------------------------------------------------- + // SEGUN ------------------------------------------------------------------------------------------------------------------------------- // Work in progress on this function _activateTooltip: function _activateTooltip(ev) { var index = 0; @@ -727,48 +723,20 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ if (!this._selected) { // Consider using "if (!this.selected)" instead // console.log('mouseOVER_DONE/mouseMOVE_DONE-TOOLTIP-ACTIVATED'); // To be deleted - console.log('ev:', ev); // To be deleted - - console.log('x-axis:', ev.x); // To be deleted - - console.log('y-axis:', ev.y); // To be deleted - + // console.log('x-axis:', ev.x); // To be deleted + // console.log('y-axis:', ev.y); // To be deleted xAxis[index] = ev.x; yAxis[index] = ev.y; // May be needed later // newPosX = xAxis[index-1] - xAxis[index]; // - works but not perfect // newPosX = (xAxis[index-1] - xAxis[index]) - ((xAxis[index])/4); // - better than above but not perfect // newPosX =(xAxis[index-1] - xAxis[index]) - (xAxis[index] - this.imageWidth); // - works but no perfect - /* - 248,373 541,373 --> x, y -- x diff = 293 - 249,562 541,561 --> x, y -- x diff = 292 - */ - // newPosX = ev.x + (ev.y/12); - - ++index; // Calculate - // if (index != 0) { - // if ((xAxis[index] > xAxis[index-1]) && ((yAxis[index] > yAxis[index-1]))) { // cursor moves right-up - // newPosX = xAxis[index] - xAxis[index-1]; - // } else if ((xAxis[index] > xAxis[index-1]) && ((yAxis[index] > yAxis[index-1]))) { // cursor moves right-down - // // newPosX - (xAxis[index-1] - xAxis[index]); - // } - // // newPosX = (ev.x + (xAxis[index-1] - ev.x)) - 700; - // // newPosY = (ev.y + (yAxis[index-1] - ev.y)) - 500; - // // newPosX = (xAxis[index-1] - ev.x) - 700; - // // newPosY = (yAxis[index-1] - ev.y) - 500; - // } - - if (index != 0) { - newPosX = ev.x - (ev.x - xAxis[index - 1]) + 10; - newPosY = ev.y - (ev.x - xAxis[index - 1]) + 30; - } - - this.bindTooltip(this.tooltipText, // {sticky: true, direction: 'top', offset: L.point([newPosX, newPosY])}).openTooltip(); - { + ++index; + this.bindTooltip(this.tooltipText, { sticky: true, direction: 'top', - offset: L.point([ev.x, ev.y]) - }).openTooltip(); // {sticky: true, direction: 'top', offset: L.point([ev.x - 700, ev.y - 500])}).openTooltip(); // POC only, work still in progress on this - hardcoded, works not perfect yet + offset: L.point([ev.x - 700, ev.y - 500]) + }).openTooltip(); // POC only, work still in progress on this - hardcoded, works not perfect yet } }, _closeTooltip: function _closeTooltip() { @@ -7348,7 +7316,7 @@ module.exports.formatError = function (err) { /******/ /******/ /* webpack/runtime/getFullHash */ /******/ !function() { -/******/ __webpack_require__.h = function() { return "493561d37cd0443213e3"; } +/******/ __webpack_require__.h = function() { return "f2ac3d8112acfafcb3f8"; } /******/ }(); /******/ /******/ /* webpack/runtime/hasOwnProperty shorthand */ diff --git a/examples/archive.css b/examples/archive.css deleted file mode 100644 index 96f6bed83..000000000 --- a/examples/archive.css +++ /dev/null @@ -1,21 +0,0 @@ -.distortableImageTooltip { - position: relative; - display: inline-block; - border-bottom: 1px white; - z-index: 1800; - position: absolute; -} - -/* .tooltipText { - width: 120px; - bottom: 100%; - left: 50%; - margin-left: -60px; - visibility: hidden; - background-color: #fff; - color: red; - text-align: center; - padding: 5px 0; - border-radius: 6px; -} */ - diff --git a/examples/archive.html b/examples/archive.html index cceb48b7c..d27604f1c 100644 --- a/examples/archive.html +++ b/examples/archive.html @@ -12,7 +12,6 @@ - @@ -62,8 +61,6 @@
- -
diff --git a/examples/js/archive.js b/examples/js/archive.js index 4512bf881..ec0aa86e7 100644 --- a/examples/js/archive.js +++ b/examples/js/archive.js @@ -1,5 +1,4 @@ let map; -// let image; let imageOverlaytooltipText; const welcomeModal = document.getElementById('welcomeModal'); const tileMap = document.getElementById('map'); @@ -10,9 +9,6 @@ const input = document.getElementById('input'); const responseText = document.getElementById('response'); const imageContainer = document.getElementById('imgContainer'); const mapToggle = document.getElementById('mapToggle'); -const imageOverlaytooltip = document.getElementById('imageOverlaytooltip'); -const tooltipText = document.getElementById('tooltiptext'); - const setupMap = () => { map = L.map('map').setView([51.505, -0.09], 13); @@ -128,43 +124,13 @@ tileMap.addEventListener('click', (event) => { bootstrap.Offcanvas.getInstance(sidebar).hide(); }); -// --------------------------------------------------------------------------------------------- -// OPTION 1 - Runs independently of OPTION 2 document.addEventListener('click', (event) => { if (event.target.classList.contains('place-button')) { const imageURL = event.target.previousElementSibling.src; - // const image = L.distortableImageOverlay( - image = L.distortableImageOverlay( // <= SEGUN + const image = L.distortableImageOverlay( // <= SEGUN imageURL, {tooltipText: imageOverlaytooltipText} ); map.imgGroup.addLayer(image); } }); - -// --------------------------------------------------------------------------------------------- -// OPTION 2.1 - To run this option, uncomment OPTION 1 above too as well -document.addEventListener('mousemove', (event) => { - if (event.target.classList.contains('leaflet-image-layer')) { - if (!image.isSelected()) { - const xPos = event.layerX; - const yPos = event.layerY; - - tooltipText.textContent = imageOverlaytooltipText; - imageOverlaytooltip.style.position = 'absolute'; - imageOverlaytooltip.style.left = (xPos - 60) +'px'; - imageOverlaytooltip.style.top = (yPos - 40) +'px'; - imageOverlaytooltip.hidden = false; - } - - if (image.isSelected()) { - imageOverlaytooltip.hidden = true; - } - } -}); - -document.addEventListener('mouseout', (event) => { - if (event.target.classList.contains('leaflet-image-layer')) { - imageOverlaytooltip.hidden = true; - } -}); diff --git a/examples/js/local.js b/examples/js/local.js index 6bfe8285b..913db6b31 100644 --- a/examples/js/local.js +++ b/examples/js/local.js @@ -42,7 +42,6 @@ const loadMap = (image) => { tooltipText: 'Map of NY', // If needed, consider using dynamic value for key 'tooltipText' }).addTo(map); }); - console.log('Image from local.js', img); }; const handleDrop = (e) => { diff --git a/src/DistortableImageOverlay.js b/src/DistortableImageOverlay.js index 4a38326b3..cc0b19de9 100644 --- a/src/DistortableImageOverlay.js +++ b/src/DistortableImageOverlay.js @@ -91,10 +91,9 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ this.fire('add'); // SEGUN ------------------------------------------------------------------------------------------------------------------------------ - // *L.DomEvent.on(this.getElement(), 'mouseover mousemove', this._activateTooltip, this); - // L.DomEvent.on(this.getElement(), 'mousemove', this._activateTooltip, this); + L.DomEvent.on(this.getElement(), 'mouseover mousemove', this._activateTooltip, this); - // *L.DomEvent.on(this.getElement(), 'mouseout', this._closeTooltip, this); + L.DomEvent.on(this.getElement(), 'mouseout', this._closeTooltip, this); }, onRemove(map) { @@ -245,12 +244,7 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ } }, - // // OPTION 2 ------------------------------------------------------------------------------------------------------------------------------- - // _activateTooltip(ev) { - // // console.log('latlong at center', this.getCenter()); - // }, - - // OPTION 1 SEGUN ------------------------------------------------------------------------------------------------------------------------------- + // SEGUN ------------------------------------------------------------------------------------------------------------------------------- // Work in progress on this function _activateTooltip(ev) { let index = 0; @@ -260,9 +254,8 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ if (!this._selected) { // Consider using "if (!this.selected)" instead // console.log('mouseOVER_DONE/mouseMOVE_DONE-TOOLTIP-ACTIVATED'); // To be deleted - console.log('ev:', ev); // To be deleted - console.log('x-axis:', ev.x); // To be deleted - console.log('y-axis:', ev.y); // To be deleted + // console.log('x-axis:', ev.x); // To be deleted + // console.log('y-axis:', ev.y); // To be deleted xAxis[index] = ev.x; yAxis[index] = ev.y; // May be needed later @@ -270,35 +263,11 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ // newPosX = xAxis[index-1] - xAxis[index]; // - works but not perfect // newPosX = (xAxis[index-1] - xAxis[index]) - ((xAxis[index])/4); // - better than above but not perfect // newPosX =(xAxis[index-1] - xAxis[index]) - (xAxis[index] - this.imageWidth); // - works but no perfect - /* - 248,373 541,373 --> x, y -- x diff = 293 - 249,562 541,561 --> x, y -- x diff = 292 - */ - - // newPosX = ev.x + (ev.y/12); ++index; - // Calculate - // if (index != 0) { - // if ((xAxis[index] > xAxis[index-1]) && ((yAxis[index] > yAxis[index-1]))) { // cursor moves right-up - // newPosX = xAxis[index] - xAxis[index-1]; - // } else if ((xAxis[index] > xAxis[index-1]) && ((yAxis[index] > yAxis[index-1]))) { // cursor moves right-down - // // newPosX - (xAxis[index-1] - xAxis[index]); - // } - // // newPosX = (ev.x + (xAxis[index-1] - ev.x)) - 700; - // // newPosY = (ev.y + (yAxis[index-1] - ev.y)) - 500; - // // newPosX = (xAxis[index-1] - ev.x) - 700; - // // newPosY = (yAxis[index-1] - ev.y) - 500; - // } - if (index != 0) { - newPosX = (ev.x - (ev.x - xAxis[index-1])) + 10; - newPosY = (ev.y - (ev.x - xAxis[index-1])) + 30; - } this.bindTooltip( this.tooltipText, - // {sticky: true, direction: 'top', offset: L.point([newPosX, newPosY])}).openTooltip(); - {sticky: true, direction: 'top', offset: L.point([ev.x, ev.y])}).openTooltip(); - // {sticky: true, direction: 'top', offset: L.point([ev.x - 700, ev.y - 500])}).openTooltip(); // POC only, work still in progress on this - hardcoded, works not perfect yet + {sticky: true, direction: 'top', offset: L.point([ev.x - 700, ev.y - 500])}).openTooltip(); // POC only, work still in progress on this - hardcoded, works not perfect yet } }, From 36a8bc965a003a810695f640ee4a8252b63e44b5 Mon Sep 17 00:00:00 2001 From: segun Date: Thu, 5 Jan 2023 13:43:25 +0100 Subject: [PATCH 24/57] update --- dist/leaflet.distortableimage.js | 5 ++--- examples/js/archive.js | 4 ++++ examples/js/export.js | 2 -- examples/js/listeners.js | 1 - examples/js/local.js | 1 - examples/js/select.js | 4 ---- 6 files changed, 6 insertions(+), 11 deletions(-) diff --git a/dist/leaflet.distortableimage.js b/dist/leaflet.distortableimage.js index 2edcf551a..97658f24a 100644 --- a/dist/leaflet.distortableimage.js +++ b/dist/leaflet.distortableimage.js @@ -467,8 +467,7 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ selected: false, // SEGUN ------------------------------------------------------------------------------------------------------------------------------ interactive: true, - tooltipText: 'Unknow image' // default tooltipText - // SEGUN ------------------------------------------------------------------------------------------------------------------------------ + tooltipText: 'Unknow image' // SEGUN ------------------------------------------------------------------------------------------------------------------------------ }, initialize: function initialize(url, options) { @@ -7316,7 +7315,7 @@ module.exports.formatError = function (err) { /******/ /******/ /* webpack/runtime/getFullHash */ /******/ !function() { -/******/ __webpack_require__.h = function() { return "f2ac3d8112acfafcb3f8"; } +/******/ __webpack_require__.h = function() { return "5590e22c76a70748cc3f"; } /******/ }(); /******/ /******/ /* webpack/runtime/hasOwnProperty shorthand */ diff --git a/examples/js/archive.js b/examples/js/archive.js index ec0aa86e7..a390ee207 100644 --- a/examples/js/archive.js +++ b/examples/js/archive.js @@ -124,6 +124,10 @@ tileMap.addEventListener('click', (event) => { bootstrap.Offcanvas.getInstance(sidebar).hide(); }); +<<<<<<< HEAD + +======= +>>>>>>> 008785ce8d7e04babeccdaf7aaf0a4d8b64b4bcb document.addEventListener('click', (event) => { if (event.target.classList.contains('place-button')) { const imageURL = event.target.previousElementSibling.src; diff --git a/examples/js/export.js b/examples/js/export.js index c172a6fd7..4891e3983 100644 --- a/examples/js/export.js +++ b/examples/js/export.js @@ -13,7 +13,6 @@ let map; L.latLng(51.50, -0.10), ], mode: 'lock', - tooltipText: 'Aerial map of NY', // hardcoded since it's for example purposes only }); // create a second image @@ -26,7 +25,6 @@ let map; ], mode: 'freeRotate', suppressToolbar: true, - tooltipText: 'Aerial map of NY', // hardcoded since it's for example purposes only }); let json = [{'nodes': [ diff --git a/examples/js/listeners.js b/examples/js/listeners.js index 67224c641..39a96829e 100644 --- a/examples/js/listeners.js +++ b/examples/js/listeners.js @@ -7,7 +7,6 @@ let map; map.whenReady(function() { img = L.distortableImageOverlay('example.jpg', { selected: true, - tooltipText: 'Aerial map of NY', // hardcoded since it's for example purposes only }).addTo(map); // Wait until image is loaded before setting up DOM element listeners diff --git a/examples/js/local.js b/examples/js/local.js index 913db6b31..1d3144792 100644 --- a/examples/js/local.js +++ b/examples/js/local.js @@ -39,7 +39,6 @@ const loadMap = (image) => { img = L.distortableImageOverlay(image, { selected: true, fullResolutionSrc: 'large.jpg', - tooltipText: 'Map of NY', // If needed, consider using dynamic value for key 'tooltipText' }).addTo(map); }); }; diff --git a/examples/js/select.js b/examples/js/select.js index 939d772cf..9b2639d1d 100644 --- a/examples/js/select.js +++ b/examples/js/select.js @@ -13,7 +13,6 @@ let map; L.latLng(51.50, -0.10), ], mode: 'lock', - tooltipText: 'Map of NY', // If needed, consider using dynamic value for key 'tooltipText' }); // create a second image @@ -26,7 +25,6 @@ let map; ], mode: 'freeRotate', suppressToolbar: true, - tooltipText: 'Map of NY', // If needed, consider using dynamic value for key 'tooltipText' }); img3 = L.distortableImageOverlay('example.jpg', { @@ -44,7 +42,6 @@ let map; L.DeleteAction, L.StackAction, ], - tooltipText: 'Map of NY', // If needed, consider using dynamic value for key 'tooltipText' }); img4 = L.distortableImageOverlay('example.jpg', { @@ -64,7 +61,6 @@ let map; L.latLng(51.49, -0.08), L.latLng(51.49, -0.04), ], - tooltipText: 'Map of NY', // If needed, consider using dynamic value for key 'tooltipText' }); imgGroup = L.distortableCollection().addTo(map); From 82fe23d703679434eb12dc404929754edea8fadb Mon Sep 17 00:00:00 2001 From: segun Date: Thu, 5 Jan 2023 13:45:06 +0100 Subject: [PATCH 25/57] update --- examples/js/archive.js | 4 ---- 1 file changed, 4 deletions(-) diff --git a/examples/js/archive.js b/examples/js/archive.js index a390ee207..ec0aa86e7 100644 --- a/examples/js/archive.js +++ b/examples/js/archive.js @@ -124,10 +124,6 @@ tileMap.addEventListener('click', (event) => { bootstrap.Offcanvas.getInstance(sidebar).hide(); }); -<<<<<<< HEAD - -======= ->>>>>>> 008785ce8d7e04babeccdaf7aaf0a4d8b64b4bcb document.addEventListener('click', (event) => { if (event.target.classList.contains('place-button')) { const imageURL = event.target.previousElementSibling.src; From ae7160c08e6efa44bd9fdcab23d5b9006774517c Mon Sep 17 00:00:00 2001 From: segun Date: Thu, 5 Jan 2023 13:54:18 +0100 Subject: [PATCH 26/57] new update --- dist/leaflet.distortableimage.js | 8350 +----------------------------- examples/js/export.js | 2 + examples/js/listeners.js | 1 + examples/js/local.js | 1 + examples/js/select.js | 4 + 5 files changed, 9 insertions(+), 8349 deletions(-) diff --git a/dist/leaflet.distortableimage.js b/dist/leaflet.distortableimage.js index 97658f24a..766d17198 100644 --- a/dist/leaflet.distortableimage.js +++ b/dist/leaflet.distortableimage.js @@ -1,8350 +1,2 @@ -/******/ (function() { // webpackBootstrap -/******/ var __webpack_modules__ = ({ - -/***/ "./node_modules/ansi-html-community/index.js": -/*!***************************************************!*\ - !*** ./node_modules/ansi-html-community/index.js ***! - \***************************************************/ -/***/ (function(module) { - -"use strict"; - - -module.exports = ansiHTML - -// Reference to https://github.com/sindresorhus/ansi-regex -var _regANSI = /(?:(?:\u001b\[)|\u009b)(?:(?:[0-9]{1,3})?(?:(?:;[0-9]{0,3})*)?[A-M|f-m])|\u001b[A-M]/ - -var _defColors = { - reset: ['fff', '000'], // [FOREGROUD_COLOR, BACKGROUND_COLOR] - black: '000', - red: 'ff0000', - green: '209805', - yellow: 'e8bf03', - blue: '0000ff', - magenta: 'ff00ff', - cyan: '00ffee', - lightgrey: 'f0f0f0', - darkgrey: '888' -} -var _styles = { - 30: 'black', - 31: 'red', - 32: 'green', - 33: 'yellow', - 34: 'blue', - 35: 'magenta', - 36: 'cyan', - 37: 'lightgrey' -} -var _openTags = { - '1': 'font-weight:bold', // bold - '2': 'opacity:0.5', // dim - '3': '', // italic - '4': '', // underscore - '8': 'display:none', // hidden - '9': '' // delete -} -var _closeTags = { - '23': '', // reset italic - '24': '', // reset underscore - '29': '' // reset delete -} - -;[0, 21, 22, 27, 28, 39, 49].forEach(function (n) { - _closeTags[n] = '' -}) - -/** - * Converts text with ANSI color codes to HTML markup. - * @param {String} text - * @returns {*} - */ -function ansiHTML (text) { - // Returns the text if the string has no ANSI escape code. - if (!_regANSI.test(text)) { - return text - } - - // Cache opened sequence. - var ansiCodes = [] - // Replace with markup. - var ret = text.replace(/\033\[(\d+)m/g, function (match, seq) { - var ot = _openTags[seq] - if (ot) { - // If current sequence has been opened, close it. - if (!!~ansiCodes.indexOf(seq)) { // eslint-disable-line no-extra-boolean-cast - ansiCodes.pop() - return '' - } - // Open tag. - ansiCodes.push(seq) - return ot[0] === '<' ? ot : '' - } - - var ct = _closeTags[seq] - if (ct) { - // Pop sequence - ansiCodes.pop() - return ct - } - return '' - }) - - // Make sure tags are closed. - var l = ansiCodes.length - ;(l > 0) && (ret += Array(l + 1).join('')) - - return ret -} - -/** - * Customize colors. - * @param {Object} colors reference to _defColors - */ -ansiHTML.setColors = function (colors) { - if (typeof colors !== 'object') { - throw new Error('`colors` parameter must be an Object.') - } - - var _finalColors = {} - for (var key in _defColors) { - var hex = colors.hasOwnProperty(key) ? colors[key] : null - if (!hex) { - _finalColors[key] = _defColors[key] - continue - } - if ('reset' === key) { - if (typeof hex === 'string') { - hex = [hex] - } - if (!Array.isArray(hex) || hex.length === 0 || hex.some(function (h) { - return typeof h !== 'string' - })) { - throw new Error('The value of `' + key + '` property must be an Array and each item could only be a hex string, e.g.: FF0000') - } - var defHexColor = _defColors[key] - if (!hex[0]) { - hex[0] = defHexColor[0] - } - if (hex.length === 1 || !hex[1]) { - hex = [hex[0]] - hex.push(defHexColor[1]) - } - - hex = hex.slice(0, 2) - } else if (typeof hex !== 'string') { - throw new Error('The value of `' + key + '` property must be a hex string, e.g.: FF0000') - } - _finalColors[key] = hex - } - _setTags(_finalColors) -} - -/** - * Reset colors. - */ -ansiHTML.reset = function () { - _setTags(_defColors) -} - -/** - * Expose tags, including open and close. - * @type {Object} - */ -ansiHTML.tags = {} - -if (Object.defineProperty) { - Object.defineProperty(ansiHTML.tags, 'open', { - get: function () { return _openTags } - }) - Object.defineProperty(ansiHTML.tags, 'close', { - get: function () { return _closeTags } - }) -} else { - ansiHTML.tags.open = _openTags - ansiHTML.tags.close = _closeTags -} - -function _setTags (colors) { - // reset all - _openTags['0'] = 'font-weight:normal;opacity:1;color:#' + colors.reset[0] + ';background:#' + colors.reset[1] - // inverse - _openTags['7'] = 'color:#' + colors.reset[1] + ';background:#' + colors.reset[0] - // dark grey - _openTags['90'] = 'color:#' + colors.darkgrey - - for (var code in _styles) { - var color = _styles[code] - var oriColor = colors[color] || '000' - _openTags[code] = 'color:#' + oriColor - code = parseInt(code) - _openTags[(code + 10).toString()] = 'background:#' + oriColor - } -} - -ansiHTML.reset() - - -/***/ }), - -/***/ "./src/DistortableCollection.js": -/*!**************************************!*\ - !*** ./src/DistortableCollection.js ***! - \**************************************/ -/***/ (function() { - -var arr = []; -L.DistortableCollection = L.FeatureGroup.extend({ - options: { - editable: true, - exportOpts: { - exportStartUrl: '//export.mapknitter.org/export', - statusUrl: '//export.mapknitter.org', - exportUrl: 'http://export.mapknitter.org/' - } - }, - initialize: function initialize(options) { - L.setOptions(this, options); - L.FeatureGroup.prototype.initialize.call(this, options); - L.Utils.initTranslation.call(this); - this.editable = this.options.editable; - }, - onAdd: function onAdd(map) { - L.FeatureGroup.prototype.onAdd.call(this, map); - this._map = map; - - if (this.editable) { - this.editing.enable(); - } - /** - * although we have a DistortableCollection.Edit class that handles collection events to keep our code managable, - * events that need to be added on individual images are kept here to do so through `layeradd`. - */ - - - this.on('layeradd', this._addEvents, this); - this.on('layerremove', this._removeEvents, this); - }, - onRemove: function onRemove() { - if (this.editing) { - this.editing.disable(); - } - - this.off('layeradd', this._addEvents, this); - this.off('layerremove', this._removeEvents, this); - }, - _addEvents: function _addEvents(e) { - var layer = e.layer; - L.DomEvent.on(layer, { - dragstart: this._dragStartMultiple, - drag: this._dragMultiple - }, this); - L.DomEvent.on(layer.getElement(), { - mousedown: this._deselectOthers, - - /* Enable longpress for multi select for touch devices. */ - contextmenu: this._longPressMultiSelect - }, this); - }, - _removeEvents: function _removeEvents(e) { - var layer = e.layer; - L.DomEvent.off(layer, { - dragstart: this._dragStartMultiple, - drag: this._dragMultiple - }, this); - L.DomEvent.off(layer.getElement(), { - mousedown: this._deselectOthers, - contextmenu: this._longPressMultiSelect - }, this); - }, - _longPressMultiSelect: function _longPressMultiSelect(e) { - var _this = this; - - if (!this.editable) { - return; - } - - e.preventDefault(); - this.eachLayer(function (layer) { - var edit = layer.editing; - - if (layer.getElement() === e.target && edit.enabled()) { - L.DomUtil.toggleClass(layer.getElement(), 'collected'); - - if (_this.anyCollected()) { - layer.deselect(); - - _this.editing._addToolbar(); - } else { - _this.editing._removeToolbar(); - } - } - }); - }, - isCollected: function isCollected(overlay) { - return L.DomUtil.hasClass(overlay.getElement(), 'collected'); - }, - anyCollected: function anyCollected() { - var layerArr = this.getLayers(); - return layerArr.some(this.isCollected.bind(this)); - }, - _toggleCollected: function _toggleCollected(e, layer) { - if (e.shiftKey) { - /* conditional prevents disabled images from flickering multi-select mode */ - if (layer.editing.enabled()) { - L.DomUtil.toggleClass(e.target, 'collected'); // re-order layers by _leaflet_id to match their display order in UI - // add new layer to right position and avoid repitition - - var newArr = arr.every(function (each) { - return each._leaflet_id !== layer._leaflet_id; - }); - - if (newArr) { - arr.push(layer); - } else { - arr.splice(arr.indexOf(layer), 1); - } - } - } - - if (this.anyCollected()) { - layer.deselect(); - } else { - this.editing._removeToolbar(); - } - }, - _deselectOthers: function _deselectOthers(e) { - var _this2 = this; - - if (!this.editable) { - return; - } - - this.eachLayer(function (layer) { - if (layer.getElement() !== e.target) { - layer.deselect(); - } else { - _this2._toggleCollected(e, layer); - } - }); - - if (e) { - L.DomEvent.stopPropagation(e); - } - }, - _dragStartMultiple: function _dragStartMultiple(e) { - var overlay = e.target; - var map = this._map; - var i; - - if (!this.isCollected(overlay)) { - return; - } - - this.eachLayer(function (layer) { - layer._dragStartPoints = {}; - layer.deselect(); - - for (i = 0; i < 4; i++) { - var c = layer.getCorner(i); - layer._dragStartPoints[i] = map.latLngToLayerPoint(c); - } - }); - }, - _dragMultiple: function _dragMultiple(e) { - var overlay = e.target; - var map = this._map; - - if (!this.isCollected(overlay)) { - return; - } - - var topLeft = map.latLngToLayerPoint(overlay.getCorner(0)); - - var delta = overlay._dragStartPoints[0].subtract(topLeft); - - this._updateCollectionFromPoints(delta, overlay); - }, - _toRemove: function _toRemove() { - var _this3 = this; - - var layerArr = this.getLayers(); - return layerArr.filter(function (layer) { - var mode = layer.editing._mode; - return _this3.isCollected(layer) && mode !== 'lock'; - }); - }, - _toMove: function _toMove(overlay) { - var _this4 = this; - - var layerArr = this.getLayers(); - return layerArr.filter(function (layer) { - var mode = layer.editing._mode; - return layer !== overlay && _this4.isCollected(layer) && mode !== 'lock'; - }); - }, - _updateCollectionFromPoints: function _updateCollectionFromPoints(delta, overlay) { - var layersToMove = this._toMove(overlay); - - var p = new L.Transformation(1, -delta.x, 1, -delta.y); - var i; - layersToMove.forEach(function (layer) { - var movedPoints = {}; - - for (i = 0; i < 4; i++) { - movedPoints[i] = p.transform(layer._dragStartPoints[i]); - } - - layer.setCornersFromPoints(movedPoints); - }); - }, - _getAvgCmPerPixel: function _getAvgCmPerPixel(imgs) { - var reduce = imgs.reduce(function (sum, img) { - return sum + img.cm_per_pixel; - }, 0); - return reduce / imgs.length; - }, - generateExportJson: function generateExportJson() { - var json = {}; - json.images = []; - this.eachLayer(function (layer) { - if (this.isCollected(layer)) { - var sections = layer._image.src.split('/'); - - var filename = sections[sections.length - 1]; - var zc = layer.getCorners(); - var corners = [{ - lat: zc[0].lat, - lon: zc[0].lng - }, { - lat: zc[1].lat, - lon: zc[1].lng - }, { - lat: zc[3].lat, - lon: zc[3].lng - }, { - lat: zc[2].lat, - lon: zc[2].lng - }]; - json.images.push({ - id: layer._leaflet_id, - src: layer._image.src, - width: layer._image.width, - height: layer._image.height, - image_file_name: filename, - nodes: corners, - cm_per_pixel: L.ImageUtil.getCmPerPixel(layer) - }); - } - }, this); - json.images = json.images.reverse(); - json.avg_cm_per_pixel = this._getAvgCmPerPixel(json.images); - return json; - } -}); - -L.distortableCollection = function (id, options) { - return new L.DistortableCollection(id, options); -}; - -/***/ }), - -/***/ "./src/DistortableImageOverlay.js": -/*!****************************************!*\ - !*** ./src/DistortableImageOverlay.js ***! - \****************************************/ -/***/ (function() { - -L.DistortableImageOverlay = L.ImageOverlay.extend({ - options: { - height: 200, - crossOrigin: true, - // todo: find ideal number to prevent distortions during RotateScale, and make it dynamic (remove hardcoding) - edgeMinWidth: 50, - editable: true, - mode: 'distort', - selected: false, - // SEGUN ------------------------------------------------------------------------------------------------------------------------------ - interactive: true, - tooltipText: 'Unknow image' // SEGUN ------------------------------------------------------------------------------------------------------------------------------ - - }, - initialize: function initialize(url, options) { - L.setOptions(this, options); - L.Utils.initTranslation.call(this); - this.edgeMinWidth = this.options.edgeMinWidth; - this.editable = this.options.editable; - this._selected = this.options.selected; - this._url = url; - this.rotation = {}; // SEGUN ------------------------------------------------------------------------------------------------------------------------------ - - this.interactive = this.options.interactive; - this.tooltipText = options.tooltipText; // SEGUN ------------------------------------------------------------------------------------------------------------------------------ - }, - onAdd: function onAdd(map) { - var _this = this; - - this._map = map; - - if (!this.getElement()) { - this._initImage(); - } - - map.on('viewreset', this._reset, this); - - if (this.options.corners) { - this._corners = this.options.corners; - - if (map.options.zoomAnimation && L.Browser.any3d) { - map.on('zoomanim', this._animateZoom, this); - } - } // Have to wait for the image to load because need to access its w/h - - - L.DomEvent.on(this.getElement(), 'load', function () { - _this.getPane().appendChild(_this.getElement()); - - _this._initImageDimensions(); - - if (_this.options.rotation) { - var units = _this.options.rotation.deg >= 0 ? 'deg' : 'rad'; - - _this.setAngle(_this.options.rotation[units], units); - } else { - _this.rotation = { - deg: 0, - rad: 0 - }; - - _this._reset(); - } - /* Initialize default corners if not already set */ - - - if (!_this._corners) { - if (map.options.zoomAnimation && L.Browser.any3d) { - map.on('zoomanim', _this._animateZoom, _this); - } - } - /** if there is a featureGroup, only its editable option matters */ - - - var eventParents = _this._eventParents; - - if (eventParents) { - _this.eP = eventParents[Object.keys(eventParents)[0]]; - - if (_this.eP.editable) { - _this.editing.enable(); - } - } else { - if (_this.editable) { - _this.editing.enable(); - } - - _this.eP = null; - } - }); - L.DomEvent.on(this.getElement(), 'click', this.select, this); - L.DomEvent.on(map, { - singleclickon: this._singleClickListeners, - singleclickoff: this._resetClickListeners, - singleclick: this._singleClick - }, this); - /** - * custom events fired from DoubleClickLabels.js. Used to differentiate - * single / dblclick to not deselect images on map dblclick. - */ - - if (!(map.doubleClickZoom.enabled() || map.doubleClickLabels.enabled())) { - L.DomEvent.on(map, 'click', this.deselect, this); - } - - this.fire('add'); // SEGUN ------------------------------------------------------------------------------------------------------------------------------ - - L.DomEvent.on(this.getElement(), 'mouseover mousemove', this._activateTooltip, this); - L.DomEvent.on(this.getElement(), 'mouseout', this._closeTooltip, this); - }, - onRemove: function onRemove(map) { - L.DomEvent.off(this.getElement(), 'click', this.select, this); - L.DomEvent.off(map, { - singleclickon: this._singleClickListeners, - singleclickoff: this._resetClickListeners, - singleclick: this._singleClick - }, this); - L.DomEvent.off(map, 'click', this.deselect, this); - - if (this.editing) { - this.editing.disable(); - } - - this.fire('remove'); - L.ImageOverlay.prototype.onRemove.call(this, map); // SEGUN ----------------------------------------------------------------------------------------------------------------------------- - - L.DomEvent.off(this.getElement(), 'mouseover', this._deactivateTooltip, this); // ENDS ------------------------------------------------------------------------------------------------------------------------------ - }, - _initImageDimensions: function _initImageDimensions() { - var map = this._map; - var originalImageWidth = L.DomUtil.getStyle(this.getElement(), 'width'); - var originalImageHeight = L.DomUtil.getStyle(this.getElement(), 'height'); - var aspectRatio = parseInt(originalImageWidth) / parseInt(originalImageHeight); - var imageHeight = this.options.height; - var imageWidth = parseInt(aspectRatio * imageHeight); - var center = map.project(map.getCenter()); - var offset = L.point(imageWidth, imageHeight).divideBy(2); - - if (this.options.corners) { - this._corners = this.options.corners; - } else { - this._corners = [map.unproject(center.subtract(offset)), map.unproject(center.add(L.point(offset.x, -offset.y))), map.unproject(center.add(L.point(-offset.x, offset.y))), map.unproject(center.add(offset))]; - } - - this._initialDimensions = { - 'center': center, - 'offset': offset, - 'zoom': map.getZoom() - }; - this.setBounds(L.latLngBounds(this.getCorners())); - }, - _singleClick: function _singleClick(e) { - if (e.type === 'singleclick') { - this.deselect(); - } else { - return; - } - }, - _singleClickListeners: function _singleClickListeners() { - var map = this._map; - L.DomEvent.off(map, 'click', this.deselect, this); - L.DomEvent.on(map, 'singleclick', this.deselect, this); - }, - _resetClickListeners: function _resetClickListeners() { - var map = this._map; - L.DomEvent.on(map, 'click', this.deselect, this); - L.DomEvent.off(map, 'singleclick', this.deselect, this); - }, - isSelected: function isSelected() { - return this._selected; // this._selected - }, - deselect: function deselect() { - var edit = this.editing; - - if (!edit.enabled()) { - return; - } - - edit._removeToolbar(); - - edit._hideMarkers(); - - this._selected = false; - this.fire('deselect'); - return this; - }, - select: function select(e) { - var edit = this.editing; - var eP = this.eP; - - if (!edit.enabled()) { - return; - } - - if (e) { - L.DomEvent.stopPropagation(e); - } // this ensures deselection of all other images, allowing us to keep collection group optional - - - this._programmaticGrouping(); - - this._selected = true; - - edit._addToolbar(); - - edit._showMarkers(); - - this.fire('select'); // we run the selection logic 1st anyway because the collection group's _addToolbar method depends on it - - if (eP && eP.anyCollected()) { - this.deselect(); - return; - } - - return this; - }, - _programmaticGrouping: function _programmaticGrouping() { - this._map.eachLayer(function (layer) { - if (layer instanceof L.DistortableImageOverlay) { - layer.deselect(); - } - }); - }, - setCorner: function setCorner(corner, latlng) { - var edit = this.editing; - this._corners[corner] = latlng; - this.setBounds(L.latLngBounds(this.getCorners())); - this.fire('update'); - - if (edit.toolbar && edit.toolbar instanceof L.DistortableImage.PopupBar) { - edit._updateToolbarPos(); - } - - this.edited = true; - return this; - }, - _cornerExceedsMapLats: function _cornerExceedsMapLats(zoom, corner, map) { - if (map.options.crs.Simple == L.CRS.Simple) { - return false; - } else { - var exceedsTop; - var exceedsBottom; - - if (zoom === 0) { - exceedsTop = map.project(corner).y < 2; - exceedsBottom = map.project(corner).y >= 255; - } else { - exceedsTop = map.project(corner).y / zoom < 2; - exceedsBottom = map.project(corner).y / Math.pow(2, zoom) >= 255; - } - - return exceedsTop || exceedsBottom; - } - }, - // SEGUN ------------------------------------------------------------------------------------------------------------------------------- - // Work in progress on this function - _activateTooltip: function _activateTooltip(ev) { - var index = 0; - var xAxis = []; // stores previous values of x coordinate - - var yAxis = []; // stores previous values of y coordinate, may be needed later - // let newPosX = 0; - - if (!this._selected) { - // Consider using "if (!this.selected)" instead - // console.log('mouseOVER_DONE/mouseMOVE_DONE-TOOLTIP-ACTIVATED'); // To be deleted - // console.log('x-axis:', ev.x); // To be deleted - // console.log('y-axis:', ev.y); // To be deleted - xAxis[index] = ev.x; - yAxis[index] = ev.y; // May be needed later - // newPosX = xAxis[index-1] - xAxis[index]; // - works but not perfect - // newPosX = (xAxis[index-1] - xAxis[index]) - ((xAxis[index])/4); // - better than above but not perfect - // newPosX =(xAxis[index-1] - xAxis[index]) - (xAxis[index] - this.imageWidth); // - works but no perfect - - ++index; - this.bindTooltip(this.tooltipText, { - sticky: true, - direction: 'top', - offset: L.point([ev.x - 700, ev.y - 500]) - }).openTooltip(); // POC only, work still in progress on this - hardcoded, works not perfect yet - } - }, - _closeTooltip: function _closeTooltip() { - // console.log('mouseOUT_DONE-TOOLTIP-CLOSED'); // To be deleted - this.closeTooltip(); - }, - _deactivateTooltip: function _deactivateTooltip() { - // console.log('MouseoverENDED & mousemoveENDED-TOOLTIP-DEACTIVATED'); - To be deleted - this.unbindTooltip(); - }, - // ENDS ------------------------------------------------------------------------------------------------------------------------------ - setCorners: function setCorners(latlngObj) { - var map = this._map; - var zoom = map.getZoom(); - var edit = this.editing; - var i = 0; // this is to fix https://github.com/publiclab/Leaflet.DistortableImage/issues/402 - - for (var k in latlngObj) { - if (this._cornerExceedsMapLats(zoom, latlngObj[k], map)) { - // calling reset / update w/ the same corners bc it prevents a marker flicker for rotate - this.setBounds(L.latLngBounds(this.getCorners())); - this.fire('update'); - return; - } - } - - for (var _k in latlngObj) { - this._corners[i] = latlngObj[_k]; - i += 1; - } - - this.setBounds(L.latLngBounds(this.getCorners())); - this.fire('update'); - - if (edit.toolbar && edit.toolbar instanceof L.DistortableImage.PopupBar) { - edit._updateToolbarPos(); - } - - this.edited = true; - return this; - }, - setCornersFromPoints: function setCornersFromPoints(pointsObj) { - var map = this._map; - var zoom = map.getZoom(); - var edit = this.editing; - var i = 0; - - for (var k in pointsObj) { - var corner = map.layerPointToLatLng(pointsObj[k]); - - if (this._cornerExceedsMapLats(zoom, corner, map)) { - // calling reset / update w/ the same corners bc it prevents a marker flicker for rotate - this.setBounds(L.latLngBounds(this.getCorners())); - this.fire('update'); - return; - } - } - - for (var _k2 in pointsObj) { - this._corners[i] = map.layerPointToLatLng(pointsObj[_k2]); - i += 1; - } - - this.setBounds(L.latLngBounds(this.getCorners())); - this.fire('update'); - - if (edit.toolbar && edit.toolbar instanceof L.DistortableImage.PopupBar) { - edit._updateToolbarPos(); - } - - this.edited = true; - return this; - }, - scaleBy: function scaleBy(scale) { - var map = this._map; - var center = map.project(this.getCenter()); - var i; - var p; - var scaledCorners = {}; - - if (scale === 0) { - return; - } - - for (i = 0; i < 4; i++) { - p = map.project(this.getCorner(i)).subtract(center).multiplyBy(scale).add(center); - scaledCorners[i] = map.unproject(p); - } - - this.setCorners(scaledCorners); - return this; - }, - getAngle: function getAngle() { - var unit = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'deg'; - var matrix = this.getElement().style[L.DomUtil.TRANSFORM].split('matrix3d')[1].slice(1, -1).split(','); - var row0x = matrix[0]; - var row0y = matrix[1]; - var row1x = matrix[4]; - var row1y = matrix[5]; - var determinant = row0x * row1y - row0y * row1x; - var angle = L.TrigUtil.calcAngle(row0x, row0y, 'rad'); - - if (determinant < 0) { - angle += angle < 0 ? Math.PI : -Math.PI; - } - - if (angle < 0) { - angle = 2 * Math.PI + angle; - } - - return unit === 'deg' ? Math.round(L.TrigUtil.radiansToDegrees(angle)) : L.Util.formatNum(angle, 2); - }, - setAngle: function setAngle(angle) { - var unit = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'deg'; - var currentAngle = this.getAngle(unit); - var angleToRotateBy = angle - currentAngle; - this.rotateBy(angleToRotateBy, unit); - return this; - }, - rotateBy: function rotateBy(angle) { - var unit = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'deg'; - var map = this._map; - var center = map.project(this.getCenter()); - var corners = {}; - var i; - var p; - var q; - - if (unit === 'deg') { - angle = L.TrigUtil.degreesToRadians(angle); - } - - for (i = 0; i < 4; i++) { - p = map.project(this.getCorner(i)).subtract(center); - q = L.point(Math.cos(angle) * p.x - Math.sin(angle) * p.y, Math.sin(angle) * p.x + Math.cos(angle) * p.y); - corners[i] = map.unproject(q.add(center)); - } - - this.setCorners(corners); - return this; - }, - dragBy: function dragBy(formerPoint, newPoint) { - var map = this._map; - var i; - var p; - var transCorners = {}; - var delta = map.project(formerPoint).subtract(map.project(newPoint)); - - for (i = 0; i < 4; i++) { - p = map.project(this.getCorner(i)).subtract(delta); - transCorners[i] = map.unproject(p); - } - - this.setCorners(transCorners); - }, - restore: function restore() { - var map = this._map; - var center = this._initialDimensions.center; - var offset = this._initialDimensions.offset; - var zoom = this._initialDimensions.zoom; - var corners = [center.subtract(offset), center.add(L.point(offset.x, -offset.y)), center.add(L.point(-offset.x, offset.y)), center.add(offset)]; - - for (var i = 0; i < 4; i++) { - if (!map.unproject(corners[i], zoom).equals(this.getCorner(i))) { - this.setCorner(i, map.unproject(corners[i], zoom)); - } - } - - this.edited = false; - this.fire('restore'); - return this; - }, - - /* Copied from Leaflet v0.7 https://github.com/Leaflet/Leaflet/blob/66282f14bcb180ec87d9818d9f3c9f75afd01b30/src/dom/DomUtil.js#L189-L199 */ - - /* since L.DomUtil.getTranslateString() is deprecated in Leaflet v1.0 */ - _getTranslateString: function _getTranslateString(point) { - // on WebKit browsers (Chrome/Safari/iOS Safari/Android) - // using translate3d instead of translate - // makes animation smoother as it ensures HW accel is used. - // Firefox 13 doesn't care - // (same speed either way), Opera 12 doesn't support translate3d - var is3d = L.Browser.webkit3d; - var open = 'translate' + (is3d ? '3d' : '') + '('; - var close = (is3d ? ',0' : '') + ')'; - return open + point.x + 'px,' + point.y + 'px' + close; - }, - _reset: function _reset() { - var map = this._map; - var image = this.getElement(); - var latLngToLayerPoint = L.bind(map.latLngToLayerPoint, map); - - var transformMatrix = this._calculateProjectiveTransform(latLngToLayerPoint); - - var topLeft = latLngToLayerPoint(this.getCorner(0)); - var warp = L.DomUtil.getMatrixString(transformMatrix); - - var translation = this._getTranslateString(topLeft); - /* See L.DomUtil.setPosition. Mainly for the purposes of L.Draggable. */ - - - image._leaflet_pos = topLeft; - image.style[L.DomUtil.TRANSFORM] = [translation, warp].join(' '); - /* Set origin to the upper-left corner rather than - * the center of the image, which is the default. - */ - - image.style[L.DomUtil.TRANSFORM + '-origin'] = '0 0 0'; - this.rotation.deg = this.getAngle(); - this.rotation.rad = this.getAngle('rad'); - }, - - /* - * Calculates the transform string that will be - * correct *at the end* of zooming. - * Leaflet then generates a CSS3 animation between the current transform and - * future transform which makes the transition appear smooth. - */ - _animateZoom: function _animateZoom(event) { - var map = this._map; - var image = this.getElement(); - - var latLngToNewLayerPoint = function latLngToNewLayerPoint(latlng) { - return map._latLngToNewLayerPoint(latlng, event.zoom, event.center); - }; - - var transformMatrix = this._calculateProjectiveTransform(latLngToNewLayerPoint); - - var topLeft = latLngToNewLayerPoint(this.getCorner(0)); - var warp = L.DomUtil.getMatrixString(transformMatrix); - - var translation = this._getTranslateString(topLeft); - /* See L.DomUtil.setPosition. Mainly for the purposes of L.Draggable. */ - - - image._leaflet_pos = topLeft; - image.style[L.DomUtil.TRANSFORM] = [translation, warp].join(' '); - }, - getCorners: function getCorners() { - return this._corners; - }, - getCorner: function getCorner(i) { - return this._corners[i]; - }, - // image (vertex) centroid calculation - getCenter: function getCenter() { - var map = this._map; - var reduce = this.getCorners().reduce(function (agg, corner) { - return agg.add(map.project(corner)); - }, L.point(0, 0)); - return map.unproject(reduce.divideBy(4)); - }, - _calculateProjectiveTransform: function _calculateProjectiveTransform(latLngToCartesian) { - /* Setting reasonable but made-up image defaults - * allow us to place images on the map before - * they've finished downloading. */ - var offset = latLngToCartesian(this.getCorner(0)); - var w = this.getElement().offsetWidth || 500; - var h = this.getElement().offsetHeight || 375; - var c = []; - var j; - /* Convert corners to container points (i.e. cartesian coordinates). */ - - for (j = 0; j < 4; j++) { - c.push(latLngToCartesian(this.getCorner(j))._subtract(offset)); - } - /* - * This matrix describes the action of - * the CSS transform on each corner of the image. - * It maps from the coordinate system centered - * at the upper left corner of the image - * to the region bounded by the latlngs in this._corners. - * For example: - * 0, 0, c[0].x, c[0].y - * says that the upper-left corner of the image - * maps to the first latlng in this._corners. - */ - - - return L.MatrixUtil.general2DProjection(0, 0, c[0].x, c[0].y, w, 0, c[1].x, c[1].y, 0, h, c[2].x, c[2].y, w, h, c[3].x, c[3].y); - } -}); - -L.distortableImageOverlay = function (id, options) { - // remove temp - return new L.DistortableImageOverlay(id, options); // remove temp -}; - -L.Map.addInitHook(function () { - if (!L.DomUtil.hasClass(this.getContainer(), 'ldi')) { - L.DomUtil.addClass(this.getContainer(), 'ldi'); - } -}); - -/***/ }), - -/***/ "./src/components/DistortableImage.Keymapper.js": -/*!******************************************************!*\ - !*** ./src/components/DistortableImage.Keymapper.js ***! - \******************************************************/ -/***/ (function() { - -var _this = this; - -L.DomUtil = L.DomUtil || {}; -L.DistortableImage = L.DistortableImage || {}; -L.distortableImage = L.DistortableImage; -L.DistortableImage.Keymapper = L.Handler.extend({ - options: { - position: 'topright' - }, - initialize: function initialize(map, options) { - this._map = map; - L.setOptions(this, options); - }, - addHooks: function addHooks() { - if (!this._keymapper) { - this._container = this._buildContainer(); - this._scrollWrapper = this._wrap(); - this._toggler = this._createButton(); - - this._setMapper(this._container, this._scrollWrapper, this._toggler); - - L.DomEvent.on(this._toggler, 'click', this._toggleKeymapper, this); - L.DomEvent.disableClickPropagation(this._container); - L.DomEvent.disableScrollPropagation(this._container); - } - }, - removeHooks: function removeHooks() { - if (this._keymapper) { - L.DomEvent.off(this._toggler, 'click', this._toggleKeymapper, this); - L.DomUtil.remove(this._toggler); - L.DomUtil.remove(this._scrollWrapper); - L.DomUtil.remove(this._container); - this._keymapper = false; - } - }, - _buildContainer: function _buildContainer() { - var container = L.DomUtil.create('div', 'ldi-keymapper-hide'); - container.setAttribute('id', 'ldi-keymapper'); - var divider = L.DomUtil.create('br', 'divider'); - container.appendChild(divider); - return container; - }, - _createButton: function _createButton() { - var toggler = L.DomUtil.create('a', ''); - toggler.innerHTML = L.IconUtil.create('keyboard_open'); - toggler.setAttribute('id', 'toggle-keymapper'); - toggler.setAttribute('href', '#'); - toggler.setAttribute('title', 'Show keymap'); // Will force screen readers like VoiceOver to read this as "Show keymap - button" - - toggler.setAttribute('role', 'button'); - toggler.setAttribute('aria-label', 'Show keymap'); - return toggler; - }, - _wrap: function _wrap() { - var wrap = L.DomUtil.create('div', ''); - wrap.setAttribute('id', 'keymapper-wrapper'); - wrap.style.display = 'none'; - return wrap; - }, - _setMapper: function _setMapper(container, wrap, button) { - this._keymapper = L.control({ - position: this.options.position - }); - - this._keymapper.onAdd = function () { - container.appendChild(wrap); - wrap.insertAdjacentHTML('beforeend', '' + '
' + - /* eslint-disable */ - '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '
Rotate Mode
R
RotateScale Mode
r
Scale Mode
s
Distort Mode
d
Drag Mode
D
Lock (Mode) / Unlock Image
l\xa0u
Stack up / down
q\xa0a
Add / Remove Image Border
b
Toggle Opacity
o
Deselect All
esc
Delete Image(s)
delete\xa0backspace
Export Image(s)
e
'); - /* eslint-enable */ - - container.appendChild(button); - return container; - }; - - this._keymapper.addTo(this._map); - }, - _toggleKeymapper: function _toggleKeymapper(e) { - e.preventDefault(); - this._container.className = this._container.className === 'ldi-keymapper leaflet-control' ? 'ldi-keymapper-hide leaflet-control' : 'ldi-keymapper leaflet-control'; - this._scrollWrapper.style.display = this._scrollWrapper.style.display === 'none' ? 'block' : 'none'; - this._toggler.innerHTML = this._toggler.innerHTML === 'close' ? L.IconUtil.create('keyboard_open') : 'close'; - L.IconUtil.toggleTitle(this._toggler, 'Show keymap', 'Hide keymap'); - L.DomUtil.toggleClass(this._toggler, 'close-icon'); - }, - _injectIconSet: function _injectIconSet() { - if (document.querySelector('#keymapper-iconset')) { - return; - } - - var el = L.DomUtil.create('div', ''); - el.id = 'keymapper-iconset'; - el.setAttribute('hidden', 'hidden'); - this._iconset = new L.KeymapperIconSet().render(); - el.innerHTML = this._iconset; - document.querySelector('.leaflet-control-container').appendChild(el); - } -}); -L.DistortableImage.Keymapper.addInitHook(function () { - L.DistortableImage.Keymapper.prototype._n = L.DistortableImage.Keymapper.prototype._n ? L.DistortableImage.Keymapper.prototype._n + 1 : 1; // dont enable keymapper for mobile - - if (L.DistortableImage.Keymapper.prototype._n === 1 && !L.Browser.mobile) { - _this.enable(); - - _this._injectIconSet(); - } -}); - -L.distortableImage.keymapper = function (map, options) { - return new L.DistortableImage.Keymapper(map, options); -}; - -/***/ }), - -/***/ "./src/edit/DistortableCollection.Edit.js": -/*!************************************************!*\ - !*** ./src/edit/DistortableCollection.Edit.js ***! - \************************************************/ -/***/ (function() { - -L.DistortableImage = L.DistortableImage || {}; // this class holds the keybindings and toolbar API for an image collection instance - -L.DistortableCollection.Edit = L.Handler.extend({ - options: { - keymap: L.distortableImage.group_action_map - }, - initialize: function initialize(group, options) { - this._group = group; - this._exportOpts = group.options.exportOpts; - L.setOptions(this, options); - L.distortableImage.group_action_map.Escape = '_decollectAll'; - }, - addHooks: function addHooks() { - var group = this._group; - var map = group._map; - this.editActions = this.options.actions; - this.runExporter = L.bind(L.Utils.getNestedVal(this, '_exportOpts', 'exporter') || this.startExport, this); - L.DomEvent.on(document, 'keydown', this._onKeyDown, this); - - if (!(map.doubleClickZoom.enabled() || map.doubleClickLabels.enabled())) { - L.DomEvent.on(map, 'click', this._decollectAll, this); - } - - L.DomEvent.on(map, { - singleclickon: this._singleClickListeners, - singleclickoff: this._resetClickListeners, - singleclick: this._singleClick, - boxcollectend: this._addCollections - }, this); - this._group.editable = true; - - this._group.eachLayer(function (layer) { - return layer.editing.enable(); - }); - }, - removeHooks: function removeHooks() { - var group = this._group; - var map = group._map; - L.DomEvent.off(document, 'keydown', this._onKeyDown, this); - - if (!(map.doubleClickZoom.enabled() || map.doubleClickLabels.enabled())) { - L.DomEvent.off(map, 'click', this._decollectAll, this); - } - - L.DomEvent.off(map, { - singleclickon: this._singleClickListeners, - singleclickoff: this._resetClickListeners, - singleclick: this._singleClick, - boxcollectend: this._addCollections - }, this); - - this._decollectAll(); - - this._group.editable = false; - - this._group.eachLayer(function (layer) { - return layer.editing.disable(); - }); - }, - enable: function enable() { - this._enabled = true; - this.addHooks(); - return this; - }, - disable: function disable() { - this._enabled = false; - this.removeHooks(); - return this; - }, - _onKeyDown: function _onKeyDown(e) { - var keymap = this.options.keymap; - var handlerName = keymap[e.key]; - - if (!this[handlerName]) { - return; - } - - if (this._group.anyCollected()) { - this[handlerName].call(this); - } - }, - _singleClick: function _singleClick(e) { - if (e.type === 'singleclick') { - this._decollectAll(e); - } else { - return; - } - }, - _singleClickListeners: function _singleClickListeners() { - var map = this._group._map; - L.DomEvent.off(map, 'click', this._decollectAll, this); - L.DomEvent.on(map, 'singleclick', this._decollectAll, this); - }, - _resetClickListeners: function _resetClickListeners() { - var map = this._group._map; - L.DomEvent.on(map, 'click', this._decollectAll, this); - L.DomEvent.off(map, 'singleclick', this._decollectAll, this); - }, - _decollectAll: function _decollectAll(e) { - var oe; - - if (e) { - oe = e.originalEvent; - } - /** - * prevents image deselection following the 'boxcollectend' event - note 'shift' must not be released until dragging is complete - * also prevents deselection following a click on a disabled img by differentiating it from the map - */ - - - if (oe && (oe.shiftKey || oe.target instanceof HTMLImageElement)) { - return; - } - - this._group.eachLayer(function (layer) { - L.DomUtil.removeClass(layer.getElement(), 'collected'); - layer.deselect(); - }); - - this._removeToolbar(); - - if (e) { - L.DomEvent.stopPropagation(e); - } - }, - _unlockGroup: function _unlockGroup() { - var _this = this; - - if (!this.hasTool(L.UnlockAction)) { - return; - } - - this._group.eachLayer(function (layer) { - if (_this._group.isCollected(layer)) { - var edit = layer.editing; - - edit._unlock(); // unlock updates the layer's handles; deselect to ensure they're hidden - - - layer.deselect(); - } - }); - }, - _lockGroup: function _lockGroup() { - var _this2 = this; - - if (!this.hasTool(L.LockAction)) { - return; - } - - this._group.eachLayer(function (layer) { - if (_this2._group.isCollected(layer)) { - var edit = layer.editing; - - edit._lock(); // map.addLayer also deselects the image, so we reselect here - - - L.DomUtil.addClass(layer.getElement(), 'collected'); - } - }); - }, - _addCollections: function _addCollections(e) { - var _this3 = this; - - var box = e.boxCollectBounds; - var map = this._group._map; - - this._group.eachLayer(function (layer) { - var edit = layer.editing; - - if (layer.isSelected()) { - layer.deselect(); - } - - var zoom = map.getZoom(); - var center = map.getCenter(); - var imgBounds = L.latLngBounds(layer.getCorner(2), layer.getCorner(1)); - imgBounds = map._latLngBoundsToNewLayerBounds(imgBounds, zoom, center); - - if (box.intersects(imgBounds) && edit.enabled()) { - if (!_this3.toolbar) { - _this3._addToolbar(); - } - - L.DomUtil.addClass(layer.getElement(), 'collected'); - } - }); - }, - _removeGroup: function _removeGroup(e) { - var _this4 = this; - - if (!this.hasTool(L.DeleteAction)) { - return; - } - - var layersToRemove = this._group._toRemove(); - - var n = layersToRemove.length; - - if (n === 0) { - return; - } - - var choice = L.DomUtil.confirmDeletes(n); - - if (choice) { - layersToRemove.forEach(function (layer) { - _this4._group.removeLayer(layer); - }); - - if (!this._group.anyCollected()) { - this._removeToolbar(); - } - } - - if (e) { - L.DomEvent.stopPropagation(e); - } - }, - cancelExport: function cancelExport() { - if (!this.customCollection) { - this._exportOpts.collection = undefined; - } - - clearInterval(this.updateInterval); - }, - _addToolbar: function _addToolbar() { - var group = this._group; - var map = group._map; - - if (group.options.suppressToolbar || this.toolbar) { - return; - } - - this.toolbar = L.distortableImage.controlBar({ - actions: this.editActions, - position: 'topleft' - }).addTo(map, group); - }, - _removeToolbar: function _removeToolbar() { - var map = this._group._map; - - if (this.toolbar) { - map.removeLayer(this.toolbar); - this.toolbar = false; - } else { - return false; - } - }, - hasTool: function hasTool(value) { - return this.editActions.some(function (action) { - return action === value; - }); - }, - addTool: function addTool(value) { - if (value.baseClass === 'leaflet-toolbar-icon' && !this.hasTool(value)) { - this._removeToolbar(); - - this.editActions.push(value); - - this._addToolbar(); - } - - return this; - }, - removeTool: function removeTool(value) { - var _this5 = this; - - this.editActions.some(function (item, idx) { - if (_this5.editActions[idx] === value) { - _this5._removeToolbar(); - - _this5.editActions.splice(idx, 1); - - _this5._addToolbar(); - - return true; - } else { - return false; - } - }); - return this; - }, - startExport: function startExport() { - var _this6 = this; - - if (!this.hasTool(L.ExportAction)) { - return; - } - - return new Promise(function (resolve) { - var opts = _this6._exportOpts; - opts.resolve = resolve; // allow resolving promise in user-defined functions, to stop spinner on completion - - var statusUrl; - _this6.updateInterval = null; // this may be overridden to update the UI to show export progress or completion - - var _defaultUpdater = function _defaultUpdater(data) { - data = JSON.parse(data); // optimization: fetch status directly from google storage: - - if (data.status_url) { - if (statusUrl !== data.status_url && data.status_url.match('.json')) { - // if (data.status_url && data.status_url.substr(0,1) === "/") { - // opts.statusUrl = opts.statusUrl + data.status_url; - // } else { - statusUrl = data.status_url; // } - } - - if (data.status === 'complete') { - clearInterval(_this6.updateInterval); - - if (!_this6.customCollection) { - _this6._exportOpts.collection = undefined; - } - - resolve(); - - if (data.jpg !== null) { - alert('Export succeeded. ' + opts.exportUrl + data.jpg); - } - } // TODO: update to clearInterval when status == "failed" if we update that in this file: - // https://github.com/publiclab/mapknitter-exporter/blob/main/lib/mapknitterExporter.rb - - - console.log(data); - } - }; // receives the URL of status.json, and starts running the updater to repeatedly fetch from status.json; - // this may be overridden to integrate with any UI - - - var _defaultHandleStatusRes = function _defaultHandleStatusRes(data) { - statusUrl = opts.statusUrl + data; // repeatedly fetch the status.json - - _this6.updateInterval = setInterval(function () { - var reqOpts = { - method: 'GET' - }; - var req = new Request("".concat(statusUrl, "?").concat(Date.now()), reqOpts); - fetch(req).then(function (res) { - if (res.ok) { - return res.text(); - } - }).then(opts.updater); - }, opts.frequency); - }; // initiate the export - - - var _defaultFetchStatusUrl = function _defaultFetchStatusUrl(mergedOpts) { - var form = new FormData(); - form.append('collection', JSON.stringify(mergedOpts.collection)); - form.append('scale', mergedOpts.scale); - form.append('upload', true); - var reqOpts = { - method: 'POST', - body: form - }; - var req = new Request(mergedOpts.exportStartUrl, reqOpts); - fetch(req).then(function (res) { - if (res.ok) { - return res.text(); - } - }).then(mergedOpts.handleStatusRes); - }; // If the user has passed collection property - - - _this6.customCollection = !!opts.collection; - - if (!_this6.customCollection) { - opts.collection = _this6._group.generateExportJson().images; - } - - opts.frequency = opts.frequency || 3000; - opts.scale = opts.scale || 100; // switch it to _getAvgCmPerPixel ! - - opts.updater = opts.updater || _defaultUpdater; - opts.handleStatusRes = opts.handleStatusRes || _defaultHandleStatusRes; - opts.fetchStatusUrl = opts.fetchStatusUrl || _defaultFetchStatusUrl; - opts.fetchStatusUrl(opts); - }); - } -}); - -L.distortableCollection.edit = function (group, options) { - return new L.DistortableCollection.Edit(group, options); -}; - -/***/ }), - -/***/ "./src/edit/DistortableImage.Edit.js": -/*!*******************************************!*\ - !*** ./src/edit/DistortableImage.Edit.js ***! - \*******************************************/ -/***/ (function() { - -L.DistortableImage = L.DistortableImage || {}; // holds the keybindings & toolbar API for an individual image instance - -L.DistortableImage.Edit = L.Handler.extend({ - options: { - opacity: 0.7, - outline: '1px solid red', - keymap: L.distortableImage.action_map - }, - initialize: function initialize(overlay, options) { - this._overlay = overlay; - this._toggledImage = false; - this._mode = overlay.options.mode; - this._transparent = false; - this._outlined = false; - L.setOptions(this, options); - L.distortableImage.action_map.Escape = '_deselect'; - }, - - /* Run on image selection. */ - addHooks: function addHooks() { - var overlay = this._overlay; - this.editActions = this.options.actions; - /* bring the selected image into view */ - - overlay.bringToFront(); - - this._initModes(); - - this._initHandles(); - - this._appendHandlesandDragable(); - - if (overlay.isSelected() && !overlay.options.suppressToolbar) { - this._addToolbar(); - } - - this.parentGroup = overlay.eP ? overlay.eP : false; - L.DomEvent.on(overlay.getElement(), { - dblclick: this.nextMode - }, this); - L.DomEvent.on(window, 'keydown', this._onKeyDown, this); - }, - - /* Run on image deselection. */ - removeHooks: function removeHooks() { - var overlay = this._overlay; - var eP = this.parentGroup; // First, check if dragging exists - it may be off due to locking - - this._disableDragging(); - - if (this.toolbar) { - this._removeToolbar(); - } - - for (var handle in this._handles) { - L.DomUtil.remove(handle); - } - /** - * ensures if you disable an image while it is multi-selected - * additional deselection logic is run - */ - - - if (L.DomUtil.hasClass(overlay.getElement(), 'collected')) { - L.DomUtil.removeClass(overlay.getElement(), 'collected'); - } - - if (eP && !eP.anyCollected() && eP.editing.toolbar) { - eP.editing._removeToolbar(); - } - - L.DomEvent.off(overlay.getElement(), { - dblclick: this.nextMode - }, this); - L.DomEvent.off(window, 'keydown', this._onKeyDown, this); - }, - disable: function disable() { - if (!this._enabled) { - return this; - } - - this._overlay.deselect(); - - this._enabled = false; - this.removeHooks(); - return this; - }, - _initModes: function _initModes() { - this._modes = {}; // passed from L.DistortablImage.PopupBar. If the mode is one - // of the current toolbar actions, adds it to this._modes - - for (var mode in L.DistortableImage.Edit.MODES) { - var action = L.DistortableImage.Edit.MODES[mode]; - - if (this.editActions.indexOf(action) !== -1) { - this._modes[mode] = action; - } - } // sets the current mode to the 1st available one if the one selected - // during initialization is not available - - - if (!this._modes[this._mode]) { - this._mode = Object.keys(this._modes)[0]; - } - }, - _initHandles: function _initHandles() { - var overlay = this._overlay; - var i; - this._dragHandles = L.layerGroup(); - - for (i = 0; i < 4; i++) { - this._dragHandles.addLayer(L.dragHandle(overlay, i)); - } - - this._scaleHandles = L.layerGroup(); - - for (i = 0; i < 4; i++) { - this._scaleHandles.addLayer(L.scaleHandle(overlay, i)); - } - - this._distortHandles = L.layerGroup(); - - for (i = 0; i < 4; i++) { - this._distortHandles.addLayer(L.distortHandle(overlay, i)); - } - - this._rotateHandles = L.layerGroup(); // individual rotate - - for (i = 0; i < 4; i++) { - this._rotateHandles.addLayer(L.rotateHandle(overlay, i)); - } // handle includes rotate AND scale - - - this._freeRotateHandles = L.layerGroup(); - - for (i = 0; i < 4; i++) { - this._freeRotateHandles.addLayer(L.freeRotateHandle(overlay, i)); - } - - this._lockHandles = L.layerGroup(); - - for (i = 0; i < 4; i++) { - this._lockHandles.addLayer(L.lockHandle(overlay, i, { - draggable: false - })); - } - - this._handles = { - drag: this._dragHandles, - scale: this._scaleHandles, - distort: this._distortHandles, - rotate: this._rotateHandles, - freeRotate: this._freeRotateHandles, - lock: this._lockHandles - }; - }, - _appendHandlesandDragable: function _appendHandlesandDragable() { - var ov = this._overlay; // won't throw error if user adds 0 mode actions to toolbar - - if (!this._mode) { - this._enableDragging(); - - return; - } - - this._updateHandle(); - - if (!ov.isSelected() && this.currentHandle) { - this.currentHandle.eachLayer(function (handle) { - handle.setOpacity(0); - - if (handle.dragging) { - handle.dragging.disable(); - } - }); - } - - if (!this.isMode('lock')) { - this._enableDragging(); - } - }, - _onKeyDown: function _onKeyDown(e) { - var keymap = this.options.keymap; - var handlerName = keymap[e.key]; - var ov = this._overlay; - var eP = this.parentGroup; - - if (eP && eP.anyCollected()) { - return; - } - - if (this[handlerName] !== undefined && !ov.options.suppressToolbar) { - if (ov.isSelected() && this.toolbar) { - this[handlerName].call(this); - } - } - }, - replaceTool: function replaceTool(old, next) { - var _this = this; - - if (next.baseClass !== 'leaflet-toolbar-icon' || this.hasTool(next)) { - return this; - } - - this.editActions.some(function (item, idx) { - if (item === old) { - _this._removeToolbar(); - - _this.editActions[idx] = next; - - _this._addToolbar(); - - for (var mode in L.DistortableImage.Edit.MODES) { - if (L.DistortableImage.Edit.MODES[mode] === old) { - delete _this._modes[mode]; - - _this._nextOrNone(mode); - } else if (L.DistortableImage.Edit.MODES[mode] === next) { - _this._modes[mode] = next; - } - } - - return true; - } - }); - return this; - }, - addTool: function addTool(value) { - if (value.baseClass === 'leaflet-toolbar-icon' && !this.hasTool(value)) { - this._removeToolbar(); - - this.editActions.push(value); - - this._addToolbar(); - - for (var mode in L.DistortableImage.Edit.MODES) { - if (L.DistortableImage.Edit.MODES[mode] === value) { - this._modes[mode] = value; - } - } - - if (!this._overlay.isSelected()) { - this._removeToolbar(); - } - } - - return this; - }, - hasTool: function hasTool(value) { - return this.editActions.some(function (action) { - return action === value; - }); - }, - removeTool: function removeTool(value) { - var _this2 = this; - - this.editActions.some(function (item, idx) { - if (item === value) { - _this2._removeToolbar(); - - _this2.editActions.splice(idx, 1); - - _this2._addToolbar(); - - for (var mode in L.DistortableImage.Edit.MODES) { - if (L.DistortableImage.Edit.MODES[mode] === value) { - delete _this2._modes[mode]; - - _this2._nextOrNone(mode); - } - } - - return true; - } - }); - - if (!this._overlay.isSelected()) { - this._removeToolbar(); - } - - return this; - }, - // set the mode to the next mode or if that was the last one set mode to '' - _nextOrNone: function _nextOrNone(mode) { - if (this.isMode(mode)) { - if (Object.keys(this.getModes()).length >= 1) { - this.nextMode(); - } else { - if (mode === 'lock') { - this._enableDragging(); - } - - this._mode = ''; - - this._updateHandle(); - } - } - }, - _removeToolbar: function _removeToolbar() { - var ov = this._overlay; - var map = ov._map; - - if (this.toolbar) { - map.removeLayer(this.toolbar); - this.toolbar = false; - } - }, - _enableDragging: function _enableDragging() { - var _this3 = this; - - var overlay = this._overlay; - var map = overlay._map; - this.dragging = new L.Draggable(overlay.getElement()); - this.dragging.enable(); - /* Hide toolbars and markers while dragging; click will re-show it */ - - this.dragging.on('dragstart', function () { - overlay.fire('dragstart'); - - _this3._removeToolbar(); - }); - /* - * Adjust default behavior of L.Draggable, which overwrites the CSS3 - * distort transformations that we set when it calls L.DomUtil.setPosition. - */ - - this.dragging._updatePosition = function () { - var topLeft = overlay.getCorner(0); - - var delta = this._newPos.subtract(map.latLngToLayerPoint(topLeft)); - - var currentPoint; - var corners = {}; - var i; - this.fire('predrag'); - - for (i = 0; i < 4; i++) { - currentPoint = map.latLngToLayerPoint(overlay.getCorner(i)); - corners[i] = map.layerPointToLatLng(currentPoint.add(delta)); - } - - overlay.setCorners(corners); - overlay.fire('drag'); - this.fire('drag'); - }; - - this.dragging.on('dragend', function () { - overlay.fire('dragend'); - }); - }, - _disableDragging: function _disableDragging() { - if (this.dragging) { - this.dragging.disable(); - delete this.dragging; - } - }, - _dragMode: function _dragMode() { - this.setMode('drag'); - }, - _scaleMode: function _scaleMode() { - this.setMode('scale'); - }, - _distortMode: function _distortMode() { - this.setMode('distort'); - }, - _rotateMode: function _rotateMode() { - this.setMode('rotate'); - }, - _freeRotateMode: function _freeRotateMode() { - this.setMode('freeRotate'); - }, - _toggleLockMode: function _toggleLockMode() { - if (this.isMode('lock')) { - this._unlock(); - } else { - this._lock(); - } - }, - _toggleOpacity: function _toggleOpacity() { - var image = this._overlay.getElement(); - - if (!this.hasTool(L.OpacityAction)) { - return; - } - - this._transparent = !this._transparent; - var opacity = this._transparent ? this.options.opacity : 1; - L.DomUtil.setOpacity(image, opacity); - image.setAttribute('opacity', opacity); - - this._refresh(); - }, - _toggleBorder: function _toggleBorder() { - var image = this._overlay.getElement(); - - if (!this.hasTool(L.BorderAction)) { - return; - } - - this._outlined = !this._outlined; - var outline = this._outlined ? this.options.outline : 'none'; - image.style.outline = outline; - - this._refresh(); - }, - // compare this to using overlay zIndex - _toggleOrder: function _toggleOrder() { - if (this._toggledImage) { - this._stackUp(); - } else { - this._stackDown(); - } - }, - _removeOverlay: function _removeOverlay() { - var ov = this._overlay; - var eP = this.parentGroup; - - if (this.isMode('lock') || !this.hasTool(L.DeleteAction)) { - return; - } - - var choice = L.DomUtil.confirmDelete(); - - if (!choice) { - return; - } - - this._removeToolbar(); - - if (eP) { - eP.removeLayer(ov); - } else { - ov._map.removeLayer(ov); - } - }, - // Based on https://github.com/publiclab/mapknitter/blob/8d94132c81b3040ae0d0b4627e685ff75275b416/app/assets/javascripts/mapknitter/Map.js#L47-L82 - _getExport: function _getExport() { - var overlay = this._overlay; - var map = overlay._map; - var img = overlay.getElement(); - - if (!this.hasTool(L.ExportAction)) { - return; - } // make a new image - - - var downloadable = new Image(); - downloadable.id = downloadable.id || 'tempId12345'; - document.body.appendChild(downloadable); - - downloadable.onload = function onLoadDownloadableImage() { - var height = downloadable.height; - var width = downloadable.width; - var nw = map.latLngToLayerPoint(overlay.getCorner(0)); - var ne = map.latLngToLayerPoint(overlay.getCorner(1)); - var sw = map.latLngToLayerPoint(overlay.getCorner(2)); - var se = map.latLngToLayerPoint(overlay.getCorner(3)); // I think this is to move the image to the upper left corner, - // eslint-disable-next-line max-len - // jywarren: i think we may need these or the image goes off the edge of the canvas - // jywarren: but these seem to break the distortion math... - // jywarren: i think it should be rejiggered so it - // finds the most negative values of x and y and then - // adds those to all coordinates - // nw.x -= nw.x; - // ne.x -= nw.x; - // se.x -= nw.x; - // sw.x -= nw.x; - // nw.y -= nw.y; - // ne.y -= nw.y; - // se.y -= nw.y; - // sw.y -= nw.y; - // run once warping is complete - - downloadable.onload = function () { - L.DomUtil.remove(downloadable); - }; - - if (window && window.hasOwnProperty('warpWebGl')) { - warpWebGl(downloadable.id, [0, 0, width, 0, width, height, 0, height], [nw.x, nw.y, ne.x, ne.y, se.x, se.y, sw.x, sw.y], true // trigger download - ); - } - }; - - downloadable.src = overlay.options.fullResolutionSrc || img.src; - }, - _stackUp: function _stackUp() { - var t = this._toggledImage; - - if (!t || !this.hasTool(L.StackAction)) { - return; - } - - this._toggledImage = false; - - this._overlay.bringToFront(); - - this._refresh(); - }, - _stackDown: function _stackDown() { - var t = this._toggledImage; - - if (t || !this.hasTool(L.StackAction)) { - return; - } - - this._toggledImage = true; - - this._overlay.bringToBack(); - - this._refresh(); - }, - _unlock: function _unlock() { - var ov = this._overlay; - var map = ov._map; - var eP = this.parentGroup; - - if (!this.isMode('lock')) { - return; - } - - if (eP && !eP.isCollected(ov) || !eP) { - if (!this.hasTool(L.LockAction)) { - return; - } - } - - if (this.currentHandle) { - map.removeLayer(this.currentHandle); - } - - if (ov.options.mode === 'lock' || !this.hasMode(ov.options.mode)) { - this._mode = ''; - this.currentHandle = ''; - } else { - this._mode = ov.options.mode; - } - - this._updateHandle(); - - this._enableDragging(); - - this._refresh(); - }, - _lock: function _lock() { - var ov = this._overlay; - var map = ov._map; - var eP = this.parentGroup; - - if (this.isMode('lock')) { - return; - } - - if (eP && !eP.isCollected(ov) || !eP) { - if (!this.hasTool(L.LockAction)) { - return; - } - } - - if (this.currentHandle) { - map.removeLayer(this.currentHandle); - } - - this._mode = 'lock'; - - this._updateHandle(); - - this._disableDragging(); - - this._refresh(); - }, - _deselect: function _deselect() { - this._overlay.deselect(); - }, - _showMarkers: function _showMarkers(e) { - var eP = this.parentGroup; - - if (!this.currentHandle) { - return; - } // only markers we want in collect interface for now is lock - - - if (!this.isMode('lock') && eP && eP.anyCollected()) { - return; - } - - this.currentHandle.eachLayer(function (handle) { - handle.setOpacity(1); - - if (handle.dragging) { - handle.dragging.enable(); - } - - L.DomUtil.addClass(handle.getElement(), 'leaflet-interactive'); - }); - }, - _hideMarkers: function _hideMarkers() { - var ov = this._overlay; - var eP = this.parentGroup; // workaround for race condition w/ feature group - - if (!this._handles) { - this._initHandles(); - } - - if (!this.currentHandle) { - return; - } - - if (this.isMode('lock') && eP && eP.isCollected(ov)) { - return; - } - - this.currentHandle.eachLayer(function (handle) { - handle.setOpacity(0); - - if (handle.dragging) { - handle.dragging.disable(); - } - - L.DomUtil.removeClass(handle.getElement(), 'leaflet-interactive'); - }); - }, - _updateHandle: function _updateHandle() { - var ov = this._overlay; - var map = ov._map; - var mode = this.getMode(); - - if (this.currentHandle) { - map.removeLayer(this.currentHandle); - } - - this.currentHandle = mode === '' ? '' : this._handles[mode]; - - if (this.currentHandle !== '') { - map.addLayer(this.currentHandle); - } - }, - _addToolbar: function _addToolbar() { - var ov = this._overlay; - var eP = this.parentGroup; - var map = ov._map; // Find the topmost point on the image. - - var corners = ov.getCorners(); - var maxLat = -Infinity; - - if (eP && eP.anyCollected()) { - eP.editing._addToolbar(); - - return; - } - - if (ov.options.suppressToolbar || this.toolbar) { - return; - } - - for (var i = 0; i < corners.length; i++) { - if (corners[i].lat > maxLat) { - maxLat = corners[i].lat; - } - } // Longitude is based on the centroid of the image. - - - var raisedPoint = ov.getCenter(); - raisedPoint.lat = maxLat; - this.toolbar = L.distortableImage.popupBar(raisedPoint, { - actions: this.editActions - }).addTo(map, ov); - ov.fire('toolbar:created'); - }, - _refresh: function _refresh() { - if (this.toolbar) { - this._removeToolbar(); - } - - this._addToolbar(); - }, - _updateToolbarPos: function _updateToolbarPos() { - var overlay = this._overlay; // Find the topmost point on the image. - - var corners = overlay.getCorners(); - var toolbar = this.toolbar; - var maxLat = -Infinity; - - if (toolbar && toolbar instanceof L.DistortableImage.PopupBar) { - for (var i = 0; i < corners.length; i++) { - if (corners[i].lat > maxLat) { - maxLat = corners[i].lat; - } - } // Longitude is based on the centroid of the image. - - - var raisedPoint = overlay.getCenter(); - raisedPoint.lat = maxLat; - - if (!overlay.options.suppressToolbar) { - this.toolbar.setLatLng(raisedPoint); - } - } - }, - hasMode: function hasMode(mode) { - return !!this._modes[mode]; - }, - getMode: function getMode() { - if (!this.enabled()) { - return; - } - - return this._mode; - }, - getModes: function getModes() { - return this._modes; - }, - isMode: function isMode(mode) { - if (!this.enabled()) { - return false; - } - - return this._mode === mode; - }, - setMode: function setMode(newMode) { - var ov = this._overlay; - var eP = this.parentGroup; - var mode = this.getMode(); - - if (mode === newMode || !this.hasMode(newMode) || !this.enabled()) { - return; - } - - if (this.toolbar) { - this.toolbar.clickTool(newMode); - } - - if (this.isMode('lock') && !this.dragging) { - this._enableDragging(); - } - - this._mode = newMode; - - if (this.isMode('lock')) { - this._disableDragging(); - } - - this._updateHandle(); - - this._refresh(); - - if (eP && eP.isCollected(ov)) { - ov.deselect(); - } - - return this; - }, - - /** - * need to attach a stop to img dblclick or it will propagate to - * the map and fire the handler that shows map location labels on map dblclick. - */ - nextMode: function nextMode(e) { - var mode = this.getMode(); - var eP = this.parentGroup; - var modesArray = Object.keys(this.getModes()); - var idx = modesArray.indexOf(mode); - var nextIdx = (idx + 1) % modesArray.length; - var newMode = modesArray[nextIdx]; - - if (e) { - if (eP && eP.anyCollected()) { - return; - } - - L.DomEvent.stop(e); - } - - return this.setMode(newMode); - } -}); - -L.distortableImage.edit = function (overlay, options) { - return new L.DistortableImage.Edit(overlay, options); -}; - -/***/ }), - -/***/ "./src/edit/actions/BorderAction.js": -/*!******************************************!*\ - !*** ./src/edit/actions/BorderAction.js ***! - \******************************************/ -/***/ (function() { - -L.BorderAction = L.EditAction.extend({ - initialize: function initialize(map, overlay, options) { - var edit = overlay.editing; - var mode = edit._mode; - var use; - var tooltip; - - if (edit._outlined) { - use = 'border_outer'; - tooltip = overlay.options.translation.removeBorder; - } else { - use = 'border_clear'; - tooltip = overlay.options.translation.addBorder; - } - - options = options || {}; - options.toolbarIcon = { - svg: true, - html: use, - tooltip: tooltip, - className: mode === 'lock' ? 'disabled' : '' - }; // conditional for disabling keybindings for this action when the image is locked. - - L.DistortableImage.action_map.b = mode === 'lock' ? '' : '_toggleBorder'; - L.EditAction.prototype.initialize.call(this, map, overlay, options); - }, - addHooks: function addHooks() { - var edit = this._overlay.editing; - L.IconUtil.toggleXlink(this._link, 'border_clear', 'border_outer'); - L.IconUtil.toggleTitle(this._link, 'Remove Border', 'Add Border'); - - edit._toggleBorder(); - } -}); - -/***/ }), - -/***/ "./src/edit/actions/DeleteAction.js": -/*!******************************************!*\ - !*** ./src/edit/actions/DeleteAction.js ***! - \******************************************/ -/***/ (function() { - -L.DeleteAction = L.EditAction.extend({ - initialize: function initialize(map, overlay, options) { - var edit = overlay.editing; - var use = 'delete_forever'; - var tooltip; - /** - * we can tell whether the overlay is an instance of `L.DistortableImageOverlay` or `L.DistortableCollection` bc only - * the former should have `parentGroup` defined on it. From there we call the apporpriate keybindings and methods. - */ - - if (edit instanceof L.DistortableImage.Edit) { - tooltip = overlay.options.translation.deleteImage; // backspace windows / delete mac - - L.DistortableImage.action_map.Backspace = edit._mode === 'lock' ? '' : '_removeOverlay'; - } else { - tooltip = overlay.options.translation.deleteImages; - L.DistortableImage.group_action_map.Backspace = edit._mode === 'lock' ? '' : '_removeGroup'; - } - - options = options || {}; - options.toolbarIcon = { - svg: true, - html: use, - tooltip: tooltip, - className: edit._mode === 'lock' ? 'disabled' : '' - }; - L.EditAction.prototype.initialize.call(this, map, overlay, options); - }, - addHooks: function addHooks() { - var edit = this._overlay.editing; - - if (edit instanceof L.DistortableImage.Edit) { - edit._removeOverlay(); - } else { - edit._removeGroup(); - } - } -}); - -/***/ }), - -/***/ "./src/edit/actions/DistortAction.js": -/*!*******************************************!*\ - !*** ./src/edit/actions/DistortAction.js ***! - \*******************************************/ -/***/ (function() { - -L.DistortAction = L.EditAction.extend({ - initialize: function initialize(map, overlay, options) { - options = options || {}; - options.toolbarIcon = { - svg: true, - html: 'distort', - tooltip: overlay.options.translation.distortImage, - className: 'distort' - }; - L.DistortableImage.action_map.d = '_distortMode'; - L.EditAction.prototype.initialize.call(this, map, overlay, options); - }, - addHooks: function addHooks() { - var edit = this._overlay.editing; - - edit._distortMode(); - } -}); - -/***/ }), - -/***/ "./src/edit/actions/DragAction.js": -/*!****************************************!*\ - !*** ./src/edit/actions/DragAction.js ***! - \****************************************/ -/***/ (function() { - -L.DragAction = L.EditAction.extend({ - initialize: function initialize(map, overlay, options) { - options = options || {}; - options.toolbarIcon = { - svg: true, - html: 'drag', - tooltip: overlay.options.translation.dragImage, - className: 'drag' - }; - L.DistortableImage.action_map.D = '_dragMode'; - L.EditAction.prototype.initialize.call(this, map, overlay, options); - }, - addHooks: function addHooks() { - var edit = this._overlay.editing; - - edit._dragMode(); - } -}); - -/***/ }), - -/***/ "./src/edit/actions/EditAction.js": -/*!****************************************!*\ - !*** ./src/edit/actions/EditAction.js ***! - \****************************************/ -/***/ (function() { - -L.DistortableImage = L.DistortableImage || {}; -L.distortableImage = L.DistortableImage; -L.DistortableImage.action_map = {}; -L.EditAction = L.Toolbar2.Action.extend({ - options: { - toolbarIcon: { - svg: false, - html: '', - className: '', - tooltip: '' - } - }, - initialize: function initialize(map, overlay, options) { - this._overlay = overlay; - this._map = map; - L.setOptions(this, options); - L.Toolbar2.Action.prototype.initialize.call(this, options); - - this._injectIconSet(); - }, - _createIcon: function _createIcon(toolbar, container, args) { - var _this = this; - - var iconOptions = this.options.toolbarIcon; - var className = iconOptions.className; - var edit = this._overlay.editing; - this.toolbar = toolbar; - this._icon = L.DomUtil.create('li', '', container); - this._link = L.DomUtil.create('a', '', this._icon); - - if (iconOptions.svg) { - this._link.innerHTML = L.IconUtil.create(iconOptions.html); - } else { - this._link.innerHTML = iconOptions.html; - } - - this._link.setAttribute('href', '#'); - - this._link.setAttribute('title', iconOptions.tooltip); - - this._link.setAttribute('role', 'button'); - - L.DomUtil.addClass(this._link, this.constructor.baseClass); - - if (className) { - L.DomUtil.addClass(this._link, className); - - if (className === 'disabled') { - L.DomUtil.addClass(this._icon, className); - } - - if (className === edit._mode) { - L.DomUtil.addClass(this._link, 'selected-mode'); - } else { - L.DomUtil.removeClass(this._link, 'selected-mode'); - } - } - - L.DomEvent.on(this._link, 'click', this.enable, this); - L.DomEvent.on(this._overlay, 'update', function () { - var match = _this._link.innerHTML.match(/xlink:href="#restore"/); - - if (match && match.length === 1) { - _this._enableAction(); - } - }); - /* Add secondary toolbar */ - - this._addSubToolbar(toolbar, this._icon, args); - }, - _injectIconSet: function _injectIconSet() { - if (document.querySelector('#iconset')) { - return; - } - - var el = document.createElement('div'); - el.id = 'iconset'; - el.setAttribute('hidden', 'hidden'); - el.innerHTML = new L.ToolbarIconSet().render(); - document.querySelector('.leaflet-marker-pane').appendChild(el); - }, - _enableAction: function _enableAction() { - L.DomUtil.removeClass(this._link.parentElement, 'disabled'); - L.DomUtil.removeClass(this._link, 'disabled'); - }, - _disableAction: function _disableAction() { - L.DomUtil.addClass(this._link.parentElement, 'disabled'); - L.DomUtil.addClass(this._link, 'disabled'); - } -}); - -L.editAction = function (map, overlay, options) { - return new L.EditAction(map, overlay, options); -}; - -/***/ }), - -/***/ "./src/edit/actions/ExportAction.js": -/*!******************************************!*\ - !*** ./src/edit/actions/ExportAction.js ***! - \******************************************/ -/***/ (function() { - -L.ExportAction = L.EditAction.extend({ - // This function is executed every time we select an image - initialize: function initialize(map, overlay, options) { - var edit = overlay.editing; - var tooltip; - this.isExporting = false; - this.mouseLeaveSkip = true; - this.isHooksExecuted = false; - - if (edit instanceof L.DistortableImage.Edit) { - L.DistortableImage.action_map.e = '_getExport'; - tooltip = overlay.options.translation.exportImage; - } else { - L.DistortableImage.group_action_map.e = 'runExporter'; - tooltip = overlay.options.translation.exportImages; - } - - options = options || {}; - options.toolbarIcon = { - svg: true, - html: 'get_app', - tooltip: tooltip - }; - L.EditAction.prototype.initialize.call(this, map, overlay, options); - }, - addHooks: function addHooks() { - var edit = this._overlay.editing; - - if (edit instanceof L.DistortableImage.Edit) { - edit._getExport(); - - return; - } // Make sure that addHooks is executed only once, event listeners will handle the rest - - - if (this.isHooksExecuted) { - return; - } else { - this.isHooksExecuted = true; - } - - var exportTool = this._link.parentElement; - this.mouseEnterHandler = this.handleMouseEnter.bind(this); - this.mouseLeaveHandler = this.handleMouseLeave.bind(this); - L.DomEvent.on(exportTool, 'click', function () { - if (!this.isExporting) { - this.isExporting = true; - this.renderExportIcon(); - setTimeout(this.attachMouseEventListeners.bind(this, exportTool), 100); - edit.runExporter().then(function () { - this.resetState(); - this.detachMouseEventListeners(exportTool); - }.bind(this)); - } else { - // Clicking on the export icon after export has started will be ignored - if (this.mouseLeaveSkip) { - return; - } - - this.resetState(); - this.detachMouseEventListeners(exportTool); - edit.cancelExport(); - } - }, this); - }, - resetState: function resetState() { - this.renderDownloadIcon(); - this.isExporting = false; - this.mouseLeaveSkip = true; - }, - attachMouseEventListeners: function attachMouseEventListeners(element) { - element.addEventListener('mouseenter', this.mouseEnterHandler); - element.addEventListener('mouseleave', this.mouseLeaveHandler); - }, - detachMouseEventListeners: function detachMouseEventListeners(element) { - element.removeEventListener('mouseenter', this.mouseEnterHandler); - element.removeEventListener('mouseleave', this.mouseLeaveHandler); - }, - handleMouseEnter: function handleMouseEnter() { - this.renderCancelIcon(); - }, - handleMouseLeave: function handleMouseLeave() { - if (this.mouseLeaveSkip) { - this.mouseLeaveSkip = false; - } else { - this.renderExportIcon(); - } - }, - renderDownloadIcon: function renderDownloadIcon() { - L.IconUtil.toggleXlink(this._link, 'get_app', 'spinner'); - L.IconUtil.toggleTitle(this._link, 'Export Images', 'Loading...'); - L.DomUtil.removeClass(this._link.firstChild, 'loader'); - }, - renderExportIcon: function renderExportIcon() { - L.IconUtil.toggleXlink(this._link, 'spinner'); - L.IconUtil.toggleTitle(this._link, 'Export Images', 'Loading...'); - L.IconUtil.addClassToSvg(this._link, 'loader'); - }, - renderCancelIcon: function renderCancelIcon() { - L.IconUtil.toggleXlink(this._link, 'cancel'); - L.IconUtil.toggleTitle(this._link, 'Cancel Export', 'Loading...'); - L.DomUtil.removeClass(this._link.firstChild, 'loader'); - } -}); - -/***/ }), - -/***/ "./src/edit/actions/FreeRotateAction.js": -/*!**********************************************!*\ - !*** ./src/edit/actions/FreeRotateAction.js ***! - \**********************************************/ -/***/ (function() { - -L.FreeRotateAction = L.EditAction.extend({ - initialize: function initialize(map, overlay, options) { - options = options || {}; - options.toolbarIcon = { - svg: true, - html: 'crop_rotate', - tooltip: overlay.options.translation.freeRotateImage, - className: 'freeRotate' - }; - L.DistortableImage.action_map.f = '_freeRotateMode'; - L.EditAction.prototype.initialize.call(this, map, overlay, options); - }, - addHooks: function addHooks() { - var edit = this._overlay.editing; - - edit._freeRotateMode(); - } -}); - -/***/ }), - -/***/ "./src/edit/actions/GeolocateAction.js": -/*!*********************************************!*\ - !*** ./src/edit/actions/GeolocateAction.js ***! - \*********************************************/ -/***/ (function() { - -L.GeolocateAction = L.EditAction.extend({ - initialize: function initialize(map, overlay, options) { - var edit = overlay.editing; - options = options || {}; - options.toolbarIcon = { - svg: true, - html: 'explore', - tooltip: overlay.options.translation.geolocateImage, - className: edit._mode === 'lock' ? 'disabled' : '' - }; - L.EditAction.prototype.initialize.call(this, map, overlay, options); - }, - addHooks: function addHooks() { - var image = this._overlay.getElement(); - - EXIF.getData(image, L.EXIF(image)); - } -}); - -/***/ }), - -/***/ "./src/edit/actions/LockAction.js": -/*!****************************************!*\ - !*** ./src/edit/actions/LockAction.js ***! - \****************************************/ -/***/ (function() { - -L.LockAction = L.EditAction.extend({ - initialize: function initialize(map, overlay, options) { - var edit = overlay.editing; - var use; - var tooltip; - - if (edit instanceof L.DistortableImage.Edit) { - L.DistortableImage.action_map.u = '_unlock'; - L.DistortableImage.action_map.l = '_lock'; - tooltip = overlay.options.translation.lockMode; - use = edit.isMode('lock') ? 'lock' : 'unlock'; - } else { - L.DistortableImage.group_action_map.l = '_lockGroup'; - tooltip = overlay.options.translation.lockImages; - use = 'lock'; - } - - options = options || {}; - options.toolbarIcon = { - svg: true, - html: use, - tooltip: tooltip, - className: 'lock' - }; - L.EditAction.prototype.initialize.call(this, map, overlay, options); - }, - addHooks: function addHooks() { - var edit = this._overlay.editing; - - if (edit instanceof L.DistortableImage.Edit) { - edit._toggleLockMode(); - } else { - edit._lockGroup(); - } - } -}); - -/***/ }), - -/***/ "./src/edit/actions/OpacityAction.js": -/*!*******************************************!*\ - !*** ./src/edit/actions/OpacityAction.js ***! - \*******************************************/ -/***/ (function() { - -L.OpacityAction = L.EditAction.extend({ - initialize: function initialize(map, overlay, options) { - var edit = overlay.editing; - var mode = edit._mode; - var use; - var tooltip; - - if (edit._transparent) { - use = 'opacity_empty'; - tooltip = overlay.options.translation.makeImageOpaque; - } else { - use = 'opacity'; - tooltip = overlay.options.translation.makeImageTransparent; - } - - options = options || {}; - options.toolbarIcon = { - svg: true, - html: use, - tooltip: tooltip, - className: mode === 'lock' ? 'disabled' : '' - }; - L.DistortableImage.action_map.o = mode === 'lock' ? '' : '_toggleOpacity'; - L.EditAction.prototype.initialize.call(this, map, overlay, options); - }, - addHooks: function addHooks() { - var edit = this._overlay.editing; - var link = this._link; - L.IconUtil.toggleXlink(link, 'opacity', 'opacity_empty'); - L.IconUtil.toggleTitle(link, 'Make Image Transparent', 'Make Image Opaque'); - - edit._toggleOpacity(); - } -}); - -/***/ }), - -/***/ "./src/edit/actions/RestoreAction.js": -/*!*******************************************!*\ - !*** ./src/edit/actions/RestoreAction.js ***! - \*******************************************/ -/***/ (function() { - -L.RestoreAction = L.EditAction.extend({ - initialize: function initialize(map, overlay, options) { - var mode = L.Utils.getNestedVal(overlay, 'editing', '_mode'); - var edited = overlay.edited; - options = options || {}; - options.toolbarIcon = { - svg: true, - html: 'restore', - tooltip: overlay.options.translation.restoreImage, - className: edited && mode !== 'lock' ? '' : 'disabled' - }; - L.EditAction.prototype.initialize.call(this, map, overlay, options); - }, - addHooks: function addHooks() { - var ov = this._overlay; - L.DomEvent.on(ov, { - edit: this._enableAction, - restore: this._disableAction - }, this); - ov.restore(); - } -}); - -/***/ }), - -/***/ "./src/edit/actions/RotateAction.js": -/*!******************************************!*\ - !*** ./src/edit/actions/RotateAction.js ***! - \******************************************/ -/***/ (function() { - -L.RotateAction = L.EditAction.extend({ - initialize: function initialize(map, overlay, options) { - options = options || {}; - options.toolbarIcon = { - svg: true, - html: 'rotate', - tooltip: overlay.options.translation.rotateImage, - className: 'rotate' - }; - L.DistortableImage.action_map.r = '_rotateMode'; - L.EditAction.prototype.initialize.call(this, map, overlay, options); - }, - addHooks: function addHooks() { - var edit = this._overlay.editing; - - edit._rotateMode(); - } -}); - -/***/ }), - -/***/ "./src/edit/actions/ScaleAction.js": -/*!*****************************************!*\ - !*** ./src/edit/actions/ScaleAction.js ***! - \*****************************************/ -/***/ (function() { - -L.ScaleAction = L.EditAction.extend({ - initialize: function initialize(map, overlay, options) { - options = options || {}; - options.toolbarIcon = { - svg: true, - html: 'scale', - tooltip: overlay.options.translation.scaleImage, - className: 'scale' - }; - L.DistortableImage.action_map.s = '_scaleMode'; - L.EditAction.prototype.initialize.call(this, map, overlay, options); - }, - addHooks: function addHooks() { - var edit = this._overlay.editing; - - edit._scaleMode(); - } -}); - -/***/ }), - -/***/ "./src/edit/actions/StackAction.js": -/*!*****************************************!*\ - !*** ./src/edit/actions/StackAction.js ***! - \*****************************************/ -/***/ (function() { - -L.StackAction = L.EditAction.extend({ - initialize: function initialize(map, overlay, options) { - var edit = overlay.editing; - var use; - var tooltip; - - if (edit._toggledImage) { - use = 'flip_to_back'; - tooltip = overlay.options.translation.stackToFront; - } else { - use = 'flip_to_front'; - tooltip = overlay.options.translation.stackToBack; - } - - options = options || {}; - options.toolbarIcon = { - svg: true, - html: use, - tooltip: tooltip, - className: edit._mode === 'lock' ? 'disabled' : '' - }; - L.DistortableImage.action_map.q = edit._mode === 'lock' ? '' : '_stackUp'; - L.DistortableImage.action_map.a = edit._mode === 'lock' ? '' : '_stackDown'; - L.EditAction.prototype.initialize.call(this, map, overlay, options); - }, - addHooks: function addHooks() { - var edit = this._overlay.editing; - L.IconUtil.toggleXlink(this._link, 'flip_to_front', 'flip_to_back'); - L.IconUtil.toggleTitle(this._link, 'Stack to Front', 'Stack to Back'); - - edit._toggleOrder(); - } -}); - -/***/ }), - -/***/ "./src/edit/actions/UnlockAction.js": -/*!******************************************!*\ - !*** ./src/edit/actions/UnlockAction.js ***! - \******************************************/ -/***/ (function() { - -L.UnlockAction = L.EditAction.extend({ - initialize: function initialize(map, overlay, options) { - options = options || {}; - options.toolbarIcon = { - svg: true, - html: 'unlock', - tooltip: overlay.options.translation.unlockImages - }; - L.DistortableImage.group_action_map.u = '_unlockGroup'; - L.EditAction.prototype.initialize.call(this, map, overlay, options); - }, - addHooks: function addHooks() { - var edit = this._overlay.editing; - - edit._unlockGroup(); - } -}); - -/***/ }), - -/***/ "./src/edit/getEXIFdata.js": -/*!*********************************!*\ - !*** ./src/edit/getEXIFdata.js ***! - \*********************************/ -/***/ (function() { - -/* eslint-disable no-unused-vars */ -L.EXIF = function getEXIFdata(img) { - if (Object.keys(EXIF.getAllTags(img)).length !== 0) { - console.log(EXIF.getAllTags(img)); - var GPS = EXIF.getAllTags(img); - var altitude; - /* If the lat/lng is available. */ - - if (typeof GPS.GPSLatitude !== 'undefined' && typeof GPS.GPSLongitude !== 'undefined') { - // sadly, encoded in [degrees,minutes,seconds] - // primitive value = GPS.GPSLatitude[x].numerator - var lat = GPS.GPSLatitude[0] + GPS.GPSLatitude[1] / 60 + GPS.GPSLatitude[2] / 3600; - var lng = GPS.GPSLongitude[0] + GPS.GPSLongitude[1] / 60 + GPS.GPSLongitude[2] / 3600; - - if (GPS.GPSLatitudeRef !== 'N') { - lat = lat * -1; - } - - if (GPS.GPSLongitudeRef === 'W') { - lng = lng * -1; - } - } // Attempt to use GPS compass heading; will require - // some trig to calc corner points, which you can find below: - - - var angle = 0; // "T" refers to "True north", so -90. - - if (GPS.GPSImgDirectionRef === 'T') { - angle = Math.PI / 180 * (GPS.GPSImgDirection.numerator / GPS.GPSImgDirection.denominator - 90); // "M" refers to "Magnetic north" - } else if (GPS.GPSImgDirectionRef === 'M') { - angle = Math.PI / 180 * (GPS.GPSImgDirection.numerator / GPS.GPSImgDirection.denominator - 90); - } else { - console.log('No compass data found'); - } - - console.log('Orientation:', GPS.Orientation); - /* If there is orientation data -- i.e. landscape/portrait etc */ - - if (GPS.Orientation === 6) { - // CCW - angle += Math.PI / 180 * -90; - } else if (GPS.Orientation === 8) { - // CW - angle += Math.PI / 180 * 90; - } else if (GPS.Orientation === 3) { - // 180 - angle += Math.PI / 180 * 180; - } - /* If there is altitude data */ - - - if (typeof GPS.GPSAltitude !== 'undefined' && typeof GPS.GPSAltitudeRef !== 'undefined') { - // Attempt to use GPS altitude: - // (may eventually need to find EXIF field of view for correction) - if (typeof GPS.GPSAltitude !== 'undefined' && typeof GPS.GPSAltitudeRef !== 'undefined') { - altitude = GPS.GPSAltitude.numerator / GPS.GPSAltitude.denominator + GPS.GPSAltitudeRef; - } else { - altitude = 0; // none - } - } - } else { - alert('EXIF initialized. Press again to view data in console.'); - } -}; - -/***/ }), - -/***/ "./src/edit/handles/DistortHandle.js": -/*!*******************************************!*\ - !*** ./src/edit/handles/DistortHandle.js ***! - \*******************************************/ -/***/ (function() { - -L.DistortHandle = L.EditHandle.extend({ - options: { - TYPE: 'distort', - icon: L.icon({ - iconUrl: // eslint-disable-next-line max-len - 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAChSURBVO3BIU4DURgGwNkvL2B6AkQTLBqP4QCoSm7DDXoBLBZHDbfgICAIZjEV3YTn9uVHdMZZtcnCfI13bIzxg0emg6Nm6QVbYz3jylEsXRrvwommb49X67jFkz80fR9Mb1YxTzqiWBSLYlEsikWxKBbFolgUi2JRLIpFsSgWxaJY03fHHOu40dH07bAzWCx9Ge/TiWbpHgdsjPGNB2f/yS+7xRCyiiZPJQAAAABJRU5ErkJggg==', - iconSize: [32, 32], - iconAnchor: [16, 16] - }) - }, - _onHandleDrag: function _onHandleDrag() { - var overlay = this._handled; - overlay.setCorner(this._corner, this.getLatLng()); - }, - updateHandle: function updateHandle() { - this.setLatLng(this._handled.getCorner(this._corner)); - } -}); - -L.distortHandle = function (overlay, idx, options) { - return new L.DistortHandle(overlay, idx, options); -}; - -/***/ }), - -/***/ "./src/edit/handles/DragHandle.js": -/*!****************************************!*\ - !*** ./src/edit/handles/DragHandle.js ***! - \****************************************/ -/***/ (function() { - -L.DragHandle = L.EditHandle.extend({ - options: { - TYPE: 'drag', - icon: L.icon({ - // eslint-disable-next-line max-len - iconUrl: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAsVJREFUeNrMVztLXEEUvnNVFAVBAhY2aRKbTZEHJNpYabuNjSgYg/GxdsmPSJkUAa/ZdVEX8mgWYVutbHxAHkVskjQBuUUgBISVhCQk3wnfwMlk1rusN1wHPubOzJlzvjlz5sxc01Ma/hUEwQnwDIjqc7uvgv9YYO86qgIwCXQbdNTlQ8kcCBHgBch8TcloF6oJGr6phk6EQAkfdz3zvgDr9Mr7Fg1fptEZoM8jsmrokpfsiIFO4IIjuE2v1EDmR4LRdlR5Gh51hj8D34ABtm8YTtqna0TgklIw5CgQguKxIojEjmFROg/MKQO27NkFAB+4wAPouGUJiIvWKHwbAxX2XyWRKWkqhT+pbJntJZJuUzISW0+5hW+obxrVBsfvoH/dqCCJuU97GBh2VteLSiYvArmErT8EVoAK9Bw7enbpVYmvAQlyowYforrH5jXL2rPHI/TKONDB7u9AlavdaTBPvPmazUeQuy8f7UomUgTEwIJPEQ3sQGE/6ll2l9H/KcEzBcfWn2IclluM3DpddJxSHujlFkscbUPvmB0LHVnLrId7nlaZVkEc6QGXQI1MAwZcWmVRHeNaQwJMMiU2cwy4s7p/RJ2ckpvIQs+cIs+5GzitloLKHUV3MPREuXbTOKO91dX387gGTONxIgEWm+E61FFrpcyqXLHsEwiDjEsjAksqw5XPoL9MHVrn6QR4q+XZrDaR4RoWzq2ymafuRA/Mq1stSsHLVkcbdf9VjOcx8ZH3+SFWcCWlVPyWuUBOwUWdC1wP5NVjYiXFWLO69PZ6CRTUY6KSIoEKdf6T3IzzgHxnsyHctNBEkmn6Oob8ExUDg/ahGybd177cDjzH5xHwgDiSvoS7I/LZyvxJZj0wod7tkX5G0XVC7rEyLhfLJjBGbKoLLEfZWObyKeZ6oY82g+yf5Zn/mJyHX7PMf04z/T3/LcAAu4E6iiyJqf0AAAAASUVORK5CYII=', - iconSize: [32, 32], - iconAnchor: [16, 16] - }) - }, - _onHandleDrag: function _onHandleDrag() { - var overlay = this._handled; - var formerLatLng = overlay.getCorner(this._corner); - var newLatLng = this.getLatLng(); - overlay.dragBy(formerLatLng, newLatLng); - }, - updateHandle: function updateHandle() { - this.setLatLng(this._handled.getCorner(this._corner)); - } -}); - -L.dragHandle = function (overlay, idx, options) { - return new L.DragHandle(overlay, idx, options); -}; - -/***/ }), - -/***/ "./src/edit/handles/EditHandle.js": -/*!****************************************!*\ - !*** ./src/edit/handles/EditHandle.js ***! - \****************************************/ -/***/ (function() { - -L.EditHandle = L.Marker.extend({ - initialize: function initialize(overlay, corner, options) { - var latlng = overlay.getCorner(corner); - L.setOptions(this, options); - this._handled = overlay; - this._corner = corner; - var markerOptions = { - draggable: true, - zIndexOffset: 10 - }; - - if (options && options.hasOwnProperty('draggable')) { - markerOptions.draggable = options.draggable; - } - - L.Marker.prototype.initialize.call(this, latlng, markerOptions); - }, - onAdd: function onAdd(map) { - L.Marker.prototype.onAdd.call(this, map); - - this._bindListeners(); - - this.updateHandle(); - }, - onRemove: function onRemove(map) { - this._unbindListeners(); - - L.Marker.prototype.onRemove.call(this, map); - }, - _onHandleDragStart: function _onHandleDragStart() { - this._handled.fire('editstart'); - }, - _onHandleDragEnd: function _onHandleDragEnd() { - this._fireEdit(); - }, - _fireEdit: function _fireEdit() { - this._handled.edited = true; - - this._handled.fire('edit'); - }, - _bindListeners: function _bindListeners() { - this.on({ - contextmenu: L.DomEvent.stop, - dragstart: this._onHandleDragStart, - drag: this._onHandleDrag, - dragend: this._onHandleDragEnd - }, this); - - this._handled._map.on('zoomend', this.updateHandle, this); - - this._handled.on('update', this.updateHandle, this); - }, - _unbindListeners: function _unbindListeners() { - this.off({ - contextmenu: L.DomEvent.stop, - dragstart: this._onHandleDragStart, - drag: this._onHandleDrag, - dragend: this._onHandleDragEnd - }, this); - - this._handled._map.off('zoomend', this.updateHandle, this); - - this._handled.off('update', this.updateHandle, this); - }, - - /* Takes two latlngs and calculates the scaling difference. */ - _calculateScalingFactor: function _calculateScalingFactor(latlngA, latlngB) { - var overlay = this._handled; - var map = overlay._map; - var centerPoint = map.latLngToLayerPoint(overlay.getCenter()); - var formerPoint = map.latLngToLayerPoint(latlngA); - var newPoint = map.latLngToLayerPoint(latlngB); - - var formerRadiusSquared = this._d2(centerPoint, formerPoint); - - var newRadiusSquared = this._d2(centerPoint, newPoint); - - return Math.sqrt(newRadiusSquared / formerRadiusSquared); - }, - - /* Distance between two points in cartesian space, squared (distance formula). */ - _d2: function _d2(a, b) { - var dx = a.x - b.x; - var dy = a.y - b.y; - return Math.pow(dx, 2) + Math.pow(dy, 2); - }, - - /* Takes two latlngs and calculates the angle between them. */ - calculateAngleDelta: function calculateAngleDelta(latlngA, latlngB) { - var overlay = this._handled; - var map = overlay._map; - var centerPoint = map.latLngToLayerPoint(overlay.getCenter()); - var formerPoint = map.latLngToLayerPoint(latlngA); - var newPoint = map.latLngToLayerPoint(latlngB); - var initialAngle = Math.atan2(centerPoint.y - formerPoint.y, centerPoint.x - formerPoint.x); - var newAngle = Math.atan2(centerPoint.y - newPoint.y, centerPoint.x - newPoint.x); - return newAngle - initialAngle; - } -}); - -/***/ }), - -/***/ "./src/edit/handles/FreeRotateHandle.js": -/*!**********************************************!*\ - !*** ./src/edit/handles/FreeRotateHandle.js ***! - \**********************************************/ -/***/ (function() { - -L.FreeRotateHandle = L.EditHandle.extend({ - options: { - TYPE: 'freeRotate', - icon: L.icon({ - iconUrl: // eslint-disable-next-line max-len - 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAHiSURBVMXBa3HbShgA0PMp/1sCCo8oCEpgTaCXgIXAJiDzyCJoAUTm4UVQAns1Y8+snWnTvJyeE16hkjDgDrfoNTMKcpC9UPiLSo8JyetkjEHxjPCMyoS199kFoz8Iv1HpMaN3qWDCHoegOKkkRwnJpRmroHgiPFEZ8IBekzEGxQtUEhKSS/fB7Ew4U+lxcGkVZG9QWWPSFAxBcdK59KApuA+yNwp2uEdx1GN25sZJZULSfAtm77SlbNjju6MvG75u+WHRWVR6rDVjMPsgwYyVZl3pLTpHkyYHOx8syMiayaJzlDTZ9YyaZNFVkiYH2ZUEBcVJJXVImuz6Js3Qofe59pq7DoOTILu+g+a288mCouk7/1iH4qTS+2QdDppbV1ZJmrnDXnPnc5UOs2Z0fUmTuyBr+krvSioJyUmQO0dZM7mepMkWnaNRkyrJB6uskTSjxY3Fll8bvmJwlDb83FJ8gMqAB80uyBY3Trb82PAfvjj6vuHnluIdKgMeNXOwctK5NKBoHitrb1RJeHRp5Ux4ojLg0aWMHGQvUOkxIWkKVsHsTPiNSo8HDC5lZIsgO6n0uMUdRvQuFQxB8UR4RmXC2vvsgtEfhL+o9JiQvE7GGBTPCK9QSUjoMWgKDthjDrIX+h/k0I7gth6N5gAAAABJRU5ErkJggg==', - iconSize: [32, 32], - iconAnchor: [16, 16] - }) - }, - _onHandleDrag: function _onHandleDrag() { - var overlay = this._handled; - var map = overlay._map; - var formerLatLng = overlay.getCorner(this._corner); - var newLatLng = this.getLatLng(); - var angle = this.calculateAngleDelta(formerLatLng, newLatLng); - - var scale = this._calculateScalingFactor(formerLatLng, newLatLng); - - if (angle !== 0) { - overlay.rotateBy(angle, 'rad'); - } - - var edgeMinWidth = overlay.edgeMinWidth; - - if (!edgeMinWidth) { - edgeMinWidth = 50; - } - /* just in case */ - - - var corner1 = map.latLngToContainerPoint(overlay.getCorner(0)); - var corner2 = map.latLngToContainerPoint(overlay.getCorner(1)); - var w = Math.abs(corner1.x - corner2.x); - var h = Math.abs(corner1.y - corner2.y); - var distance = Math.sqrt(w * w + h * h); - - if (distance > edgeMinWidth || scale > 1) { - overlay.scaleBy(scale); - } else { - overlay.scaleBy(1); - } - }, - updateHandle: function updateHandle() { - this.setLatLng(this._handled.getCorner(this._corner)); - } -}); - -L.freeRotateHandle = function (overlay, idx, options) { - return new L.FreeRotateHandle(overlay, idx, options); -}; - -/***/ }), - -/***/ "./src/edit/handles/LockHandle.js": -/*!****************************************!*\ - !*** ./src/edit/handles/LockHandle.js ***! - \****************************************/ -/***/ (function() { - -L.LockHandle = L.EditHandle.extend({ - options: { - TYPE: 'lock', - interactive: false, - icon: L.icon({ - // eslint-disable-next-line max-len - iconUrl: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAD8SURBVO3BPU7CYAAA0AdfjIcQlRCQBG7C3gk2uIPG2RC3Dk16Gz0FTO1WZs/gwGCMP/2+xsSl7+n1er1Iz9LtRQjaPeMeO+TinLDCJV78YqjdA04YodKuxhUaPGoRxMmxwRQZSt87Yo4KExGCeAUyLLFB4bMacxywEClIU2KDKXbInTUYo8JCgoFuGoxQO5uiwY1EA91VmDqrcKeDoX8WdNNgjApvmGGLXKIgXY0xGkxQYItrrFFIEKQ5Yo4KEx9yrDFDhlKkIF6NOQ5Y+KpAhiXWKEQI4pxwiwoLPyuxwQw75FoE7fZYocFEuwI7jHCBV39gL92TXq/Xi/AOcmczZmaIMScAAAAASUVORK5CYII=', - iconSize: [32, 32], - iconAnchor: [16, 16] - }) - }, - onRemove: function onRemove(map) { - this.unbindTooltip(); - L.EditHandle.prototype.onRemove.call(this, map); - }, - _bindListeners: function _bindListeners() { - var icon = this.getElement(); - - L.EditHandle.prototype._bindListeners.call(this); - - L.DomEvent.on(icon, { - mousedown: this._tooltipOn, - mouseup: this._tooltipOff - }, this); - L.DomEvent.on(document, 'pointerleave', this._tooltipOff, this); - }, - _unbindListeners: function _unbindListeners() { - var icon = this.getElement(); - - L.EditHandle.prototype._bindListeners.call(this); - - L.DomEvent.off(icon, { - mousedown: this._tooltipOn, - mouseup: this._tooltipOff - }, this); - L.DomEvent.off(document, 'pointerleave', this._tooltipOff, this); - }, - - /* cannot be dragged */ - _onHandleDrag: function _onHandleDrag() {}, - updateHandle: function updateHandle() { - this.setLatLng(this._handled.getCorner(this._corner)); - }, - _tooltipOn: function _tooltipOn(e) { - var eP = this._handled.parentGroup; - var edit = eP ? eP.editing : this._handled.editing; - - if (e.shiftKey) { - return; - } - - if (!this._handled.isSelected() && eP && !eP.isCollected(this._handled)) { - return; - } - - var handlesArr = edit._lockHandles; - this._timer = setTimeout(L.bind(function () { - if (this._timeout) { - clearTimeout(this._timeout); - } - - if (!this.getTooltip()) { - this.bindTooltip('Locked!', { - permanent: true - }); - } else { - handlesArr.eachLayer(function (handle) { - if (this !== handle) { - handle.closeTooltip(); - } - }); - } - - this.openTooltip(); - }, this), 500); - }, - _tooltipOff: function _tooltipOff(e) { - var eP = this._handled.parentGroup; - var edit = eP ? eP.editing : this._handled.editing; - - if (e.shiftKey) { - return; - } - - if (!this._handled.isSelected() && eP && !eP.isCollected(this._handled)) { - return; - } - - var handlesArr = edit._lockHandles; - - if (e.currentTarget === document) { - handlesArr.eachLayer(function (handle) { - handle.closeTooltip(); - }); - } - - if (this._timer) { - clearTimeout(this._timer); - } - - this._timeout = setTimeout(L.bind(function () { - this.closeTooltip(); - }, this), 400); - } -}); - -L.lockHandle = function (overlay, idx, options) { - return new L.LockHandle(overlay, idx, options); -}; - -/***/ }), - -/***/ "./src/edit/handles/RotateHandle.js": -/*!******************************************!*\ - !*** ./src/edit/handles/RotateHandle.js ***! - \******************************************/ -/***/ (function() { - -L.RotateHandle = L.EditHandle.extend({ - options: { - TYPE: 'rotate', - icon: L.icon({ - iconUrl: // eslint-disable-next-line max-len - 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAHiSURBVMXBa3HbShgA0PMp/1sCCo8oCEpgTaCXgIXAJiDzyCJoAUTm4UVQAns1Y8+snWnTvJyeE16hkjDgDrfoNTMKcpC9UPiLSo8JyetkjEHxjPCMyoS199kFoz8Iv1HpMaN3qWDCHoegOKkkRwnJpRmroHgiPFEZ8IBekzEGxQtUEhKSS/fB7Ew4U+lxcGkVZG9QWWPSFAxBcdK59KApuA+yNwp2uEdx1GN25sZJZULSfAtm77SlbNjju6MvG75u+WHRWVR6rDVjMPsgwYyVZl3pLTpHkyYHOx8syMiayaJzlDTZ9YyaZNFVkiYH2ZUEBcVJJXVImuz6Js3Qofe59pq7DoOTILu+g+a288mCouk7/1iH4qTS+2QdDppbV1ZJmrnDXnPnc5UOs2Z0fUmTuyBr+krvSioJyUmQO0dZM7mepMkWnaNRkyrJB6uskTSjxY3Fll8bvmJwlDb83FJ8gMqAB80uyBY3Trb82PAfvjj6vuHnluIdKgMeNXOwctK5NKBoHitrb1RJeHRp5Ux4ojLg0aWMHGQvUOkxIWkKVsHsTPiNSo8HDC5lZIsgO6n0uMUdRvQuFQxB8UR4RmXC2vvsgtEfhL+o9JiQvE7GGBTPCK9QSUjoMWgKDthjDrIX+h/k0I7gth6N5gAAAABJRU5ErkJggg==', - iconSize: [32, 32], - iconAnchor: [16, 16] - }) - }, - _onHandleDrag: function _onHandleDrag() { - var overlay = this._handled; - var formerLatLng = overlay.getCorner(this._corner); - var newLatLng = this.getLatLng(); - var angle = this.calculateAngleDelta(formerLatLng, newLatLng); - /* - * running rotation logic even for an angle delta of 0 - * prevents a small, occasional marker flicker - */ - - overlay.rotateBy(angle, 'rad'); - }, - updateHandle: function updateHandle() { - this.setLatLng(this._handled.getCorner(this._corner)); - } -}); - -L.rotateHandle = function (overlay, idx, options) { - return new L.RotateHandle(overlay, idx, options); -}; - -/***/ }), - -/***/ "./src/edit/handles/ScaleHandle.js": -/*!*****************************************!*\ - !*** ./src/edit/handles/ScaleHandle.js ***! - \*****************************************/ -/***/ (function() { - -L.ScaleHandle = L.EditHandle.extend({ - options: { - TYPE: 'scale', - icon: L.icon({ - iconUrl: // eslint-disable-next-line max-len - 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2ZXJzaW9uPSIxLjEiIHdpZHRoPSI0NTkiIGhlaWdodD0iNDY0IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCA1MTIgNTEyIiB4bWw6c3BhY2U9InByZXNlcnZlIiBzdHlsZT0iIj48cmVjdCBpZD0iYmFja2dyb3VuZHJlY3QiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIHg9IjAiIHk9IjAiIGZpbGw9Im5vbmUiIHN0cm9rZT0ibm9uZSIgY2xhc3M9IiIgc3R5bGU9IiIvPjxnIGNsYXNzPSJjdXJyZW50TGF5ZXIiIHN0eWxlPSIiPjx0aXRsZT5MYXllciAxPC90aXRsZT48cGF0aCBkPSJNNDU5LjA0OTE1OTUzMDQ3MTM0LDg2LjkyNjIzNDUxMjU1MDAyIFYwIGgtODUuNzE0NTczMzU2MzEyMDkgdjI3LjA0MzcxNzQwMzkwNDQ1MiBIODUuNzE0NTczMzU2MzEyMDMgVjAgSDAgdjg2LjkyNjIzNDUxMjU1MDAyIGgyNS43MTQzNzIwMDY4OTM2MjYgdjI4OS43NTQxMTUwNDE4MzM0IEgwIHY4Ni45MjYyMzQ1MTI1NTAwMiBoODUuNzE0NTczMzU2MzEyMDkgdi0yNy4wNDM3MTc0MDM5MDQ0NTIgaDI4NS43MTUyNDQ1MjEwNDAzIHYyNy4wNDM3MTc0MDM5MDQ0NTIgaDg1LjcxNDU3MzM1NjMxMjA5IHYtODYuOTI2MjM0NTEyNTUwMDIgaC0yMy44MDk2MDM3MTAwODY2OSBWODYuOTI2MjM0NTEyNTUwMDIgSDQ1OS4wNDkxNTk1MzA0NzEzNCB6TTM4NC43NjMxOTU5NTUwMDA5LDEyLjU1NjAxMTY1MTgxMjc4MSBoNjEuOTA0OTY5NjQ2MjI1Mzk2IHY2Mi43ODAwNTgyNTkwNjM5MSBoLTYxLjkwNDk2OTY0NjIyNTM5NiBWMTIuNTU2MDExNjUxODEyNzgxIHpNMTIuMzgwOTkzOTI5MjQ1MDUsMTIuNTU2MDExNjUxODEyNzgxIGg2MS45MDQ5Njk2NDYyMjUzOTYgdjYyLjc4MDA1ODI1OTA2MzkxIEgxMi4zODA5OTM5MjkyNDUwNSBWMTIuNTU2MDExNjUxODEyNzgxIHpNNzQuMjg1OTYzNTc1NDcwNTMsNDUxLjA1MDU3MjQxNTEyMDY2IEgxMi4zODA5OTM5MjkyNDUwNSB2LTYyLjc4MDA1ODI1OTA2MzkxIGg2MS45MDQ5Njk2NDYyMjUzOTYgVjQ1MS4wNTA1NzI0MTUxMjA2NiB6TTQ0NS43MTU3ODE0NTI4MjI3NCw0NTEuMDUwNTcyNDE1MTIwNjYgaC02Mi44NTczNTM3OTQ2Mjg4NjQgdi02Mi43ODAwNTgyNTkwNjM5MSBoNjIuODU3MzUzNzk0NjI4ODY0IFY0NTEuMDUwNTcyNDE1MTIwNjYgek00MDcuNjIwNDE1NTE2Njg0MjYsMzc2LjY4MDM0OTU1NDM4MzQ0IGgtMzYuMTkwNTk3NjM5MzMxNzcgdjMyLjgzODc5OTcwNDc0MTEyIEg4NS43MTQ1NzMzNTYzMTIwMyB2LTMyLjgzODc5OTcwNDc0MTEyIEg0OS41MjM5NzU3MTY5ODAzMiBWODYuOTI2MjM0NTEyNTUwMDIgaDM2LjE5MDU5NzYzOTMzMTc3IFY1MC4yMjQwNDY2MDcyNTExMjUgaDI4Ny42MjAwMTI4MTc4NDcyIHYzNi43MDIxODc5MDUyOTg5IGgzNC4yODU4MjkzNDI1MjQ4MzUgVjM3Ni42ODAzNDk1NTQzODM0NCB6IiBpZD0ic3ZnXzIiIGNsYXNzPSIiIGZpbGw9IiMxYTFhZWIiIGZpbGwtb3BhY2l0eT0iMSIvPjwvZz48L3N2Zz4=', - iconSize: [32, 32], - iconAnchor: [16, 16] - }) - }, - _onHandleDrag: function _onHandleDrag() { - var overlay = this._handled; - var map = overlay._map; - var edgeMinWidth = overlay.edgeMinWidth; - var formerLatLng = overlay.getCorner(this._corner); - var newLatLng = this.getLatLng(); - - var scale = this._calculateScalingFactor(formerLatLng, newLatLng); - /* - * checks whether the "edgeMinWidth" property is set and tracks the minimum edge length; - * this enables preventing scaling to zero, but we might also add an overall scale limit - */ - - - if (!edgeMinWidth) { - edgeMinWidth = 50; - } - /* just in case */ - - - var corner1 = map.latLngToLayerPoint(overlay.getCorner(0)); - var corner2 = map.latLngToLayerPoint(overlay.getCorner(1)); - var w = Math.abs(corner1.x - corner2.x); - var h = Math.abs(corner1.y - corner2.y); - var distance = Math.sqrt(w * w + h * h); - - if (distance > edgeMinWidth || scale > 1) { - overlay.scaleBy(scale); - /* - * running scale logic even for a scale ratio of 1 - * prevents a small, occasional marker flicker - */ - } else { - overlay.scaleBy(1); - } - }, - updateHandle: function updateHandle() { - this.setLatLng(this._handled.getCorner(this._corner)); - } -}); - -L.scaleHandle = function (overlay, idx, options) { - return new L.ScaleHandle(overlay, idx, options); -}; - -/***/ }), - -/***/ "./src/edit/toolbars/DistortableImage.ControlBar.js": -/*!**********************************************************!*\ - !*** ./src/edit/toolbars/DistortableImage.ControlBar.js ***! - \**********************************************************/ -/***/ (function() { - -L.distortableImage = L.DistortableImage || {}; -L.distortableImage = L.DistortableImage; -L.DistortableImage.group_action_map = {}; -L.DistortableImage.ControlBar = L.Toolbar2.Control.extend({}); - -L.distortableImage.controlBar = function (options) { - return new L.DistortableImage.ControlBar(options); -}; -/** addInitHooks run before onAdd */ - - -L.DistortableCollection.addInitHook(function () { - /** Default actions */ - this.ACTIONS = [L.ExportAction, L.DeleteAction, L.LockAction, L.UnlockAction]; // all possible modes - - L.DistortableCollection.Edit.MODES = { - lock: L.LockAction, - unlock: L.UnlockAction - }; - var a = this.options.actions ? this.options.actions : this.ACTIONS; - this.editing = L.distortableCollection.edit(this, { - actions: a - }); -}); - -/***/ }), - -/***/ "./src/edit/toolbars/DistortableImage.PopupBar.js": -/*!********************************************************!*\ - !*** ./src/edit/toolbars/DistortableImage.PopupBar.js ***! - \********************************************************/ -/***/ (function() { - -L.DistortableImage = L.DistortableImage || {}; -L.distortableImage = L.DistortableImage; -L.DistortableImage.action_map = {}; -L.DistortableImage.PopupBar = L.Toolbar2.Popup.extend({ - options: { - anchor: [0, -10] - }, - initialize: function initialize(latlng, options) { - L.setOptions(this, options); - L.Toolbar2.Popup.prototype.initialize.call(this, latlng, options); - }, - addHooks: function addHooks(map, ov) { - this.map = map; - this.ov = ov; - }, - tools: function tools() { - if (this._ul) { - return this._ul.children; - } - }, - clickTool: function clickTool(name) { - var tools = this.tools(); - - for (var i = 0; i < tools.length; i++) { - var tool = tools.item(i).children[0]; - - if (L.DomUtil.hasClass(tool, name)) { - tool.click(); - return tool; - } - } - - return false; - } -}); - -L.distortableImage.popupBar = function (latlng, options) { - return new L.DistortableImage.PopupBar(latlng, options); -}; - -L.DistortableImageOverlay.addInitHook(function () { - /** Default actions */ - this.ACTIONS = [L.DragAction, L.ScaleAction, L.DistortAction, L.RotateAction, L.FreeRotateAction, L.LockAction, L.OpacityAction, L.BorderAction, L.ExportAction, L.DeleteAction]; // all possible modes - - L.DistortableImage.Edit.MODES = { - drag: L.DragAction, - scale: L.ScaleAction, - distort: L.DistortAction, - rotate: L.RotateAction, - freeRotate: L.FreeRotateAction, - lock: L.LockAction - }; - var a = this.options.actions ? this.options.actions : this.ACTIONS; - this.editing = L.distortableImage.edit(this, { - actions: a - }); -}); - -/***/ }), - -/***/ "./src/iconsets/IconSet.js": -/*!*********************************!*\ - !*** ./src/iconsets/IconSet.js ***! - \*********************************/ -/***/ (function() { - -/* this is the baseclass other IconSets inherit from, -* we don't use it directly */ -L.IconSet = L.Class.extend({ - _svg: '', - _symbols: '', - render: function render() { - this.addSymbols(this._symbols); - return this._svg; - }, - addSymbols: function addSymbols(symbols) { - this._svg += symbols; - } -}); - -/***/ }), - -/***/ "./src/iconsets/KeymapperIconSet.js": -/*!******************************************!*\ - !*** ./src/iconsets/KeymapperIconSet.js ***! - \******************************************/ -/***/ (function() { - -L.KeymapperIconSet = L.IconSet.extend({ - _symbols: // eslint-disable-next-line max-len - '' -}); - -/***/ }), - -/***/ "./src/iconsets/ToolbarIconSet.js": -/*!****************************************!*\ - !*** ./src/iconsets/ToolbarIconSet.js ***! - \****************************************/ -/***/ (function() { - -/* eslint-disable max-len */ -L.ToolbarIconSet = L.IconSet.extend({ - _symbols: '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' -}); - -/***/ }), - -/***/ "./src/mapmixins/BoxCollector.js": -/*!***************************************!*\ - !*** ./src/mapmixins/BoxCollector.js ***! - \***************************************/ -/***/ (function() { - -L.Map.mergeOptions({ - boxCollector: true, - boxZoom: false -}); -/** - * primarily Leaflet 1.5.1 source code. Overriden so that it's a collection box used with - * our `L.DistortableCollection` class instead of a zoom box. - * */ - -L.Map.BoxCollector = L.Map.BoxZoom.extend({ - initialize: function initialize(map) { - this._map = map; - this._container = map._container; - this._pane = map._panes.overlayPane; - this._resetStateTimeout = 0; - map.on('unload', this._destroy, this); - }, - addHooks: function addHooks() { - L.DomEvent.on(this._container, 'mousedown', this._onMouseDown, this); - }, - removeHooks: function removeHooks() { - L.DomEvent.off(this._container, 'mousedown', this._onMouseDown, this); - }, - moved: function moved() { - return this._moved; - }, - _destroy: function _destroy() { - L.DomUtil.remove(this._pane); - delete this._pane; - }, - _resetState: function _resetState() { - this._resetStateTimeout = 0; - this._moved = false; - }, - _clearDeferredResetState: function _clearDeferredResetState() { - if (this._resetStateTimeout !== 0) { - clearTimeout(this._resetStateTimeout); - this._resetStateTimeout = 0; - } - }, - _onMouseDown: function _onMouseDown(e) { - if (!e.shiftKey || e.which !== 1 && e.button !== 1) { - return false; - } // Clear the deferred resetState if it hasn't executed yet, otherwise it - // will interrupt the interaction and orphan a box element in the container. - - - this._clearDeferredResetState(); - - this._resetState(); - - L.DomUtil.disableTextSelection(); - L.DomUtil.disableImageDrag(); - this._startPoint = this._map.mouseEventToContainerPoint(e); - L.DomEvent.on(document, { - contextmenu: L.DomEvent.stop, - mousemove: this._onMouseMove, - mouseup: this._onMouseUp - }, this); - }, - _onMouseMove: function _onMouseMove(e) { - if (!this._moved) { - this._moved = true; - this._box = L.DomUtil.create('div', 'leaflet-zoom-box', this._container); - L.DomUtil.addClass(this._container, 'leaflet-crosshair'); - - this._map.fire('boxzoomstart'); - } - - this._point = this._map.mouseEventToContainerPoint(e); - this._bounds = L.bounds(this._startPoint, this._point); - - var size = this._bounds.getSize(); - - L.DomUtil.setPosition(this._box, this._bounds.min); - this._box.style.width = size.x + 'px'; - this._box.style.height = size.y + 'px'; - }, - _finish: function _finish() { - if (this._moved) { - L.DomUtil.remove(this._box); - L.DomUtil.removeClass(this._container, 'leaflet-crosshair'); - } - - L.DomUtil.enableTextSelection(); - L.DomUtil.enableImageDrag(); - L.DomEvent.off(document, { - contextmenu: L.DomEvent.stop, - mousemove: this._onMouseMove, - mouseup: this._onMouseUp - }, this); - }, - _onMouseUp: function _onMouseUp(e) { - if (e.which !== 1 && e.button !== 1) { - return; - } - - this._finish(); - - if (!this._moved) { - return; - } // Postpone to next JS tick so internal click event handling - // still see it as "moved". - - - this._clearDeferredResetState(); - - this._resetStateTimeout = setTimeout(L.Util.bind(this._resetState, this), 0); - var bounds = L.latLngBounds(this._map.containerPointToLatLng(this._bounds.getBottomLeft()), this._map.containerPointToLatLng(this._bounds.getTopRight())); - - var zoom = this._map.getZoom(); - - var center = this._map.getCenter(); // calls the `project` method but 1st updates the pixel origin - see https://github.com/publiclab/Leaflet.DistortableImage/pull/344 - - - bounds = this._map._latLngBoundsToNewLayerBounds(bounds, zoom, center); - - this._map.fire('boxcollectend', { - boxCollectBounds: bounds - }); - } -}); -L.Map.addInitHook('addHandler', 'boxCollector', L.Map.BoxCollector); - -/***/ }), - -/***/ "./src/mapmixins/DoubleClickLabels.js": -/*!********************************************!*\ - !*** ./src/mapmixins/DoubleClickLabels.js ***! - \********************************************/ -/***/ (function() { - -L.Map.mergeOptions({ - doubleClickLabels: true -}); -/** - * The `doubleClickLabels` handler replaces `doubleClickZoom` by default if `#addGoogleMutant` - * is used unless the options 'labels: false' or 'doubleClickZoom: false` were passed to it. - */ - -L.Map.DoubleClickLabels = L.Map.DoubleClickZoom.extend({ - enable: function enable() { - var map = this._map; - - if (this._enabled) { - return this; - } // disable 'doubleClickZoom' if 'doubleClickLabels' is enabled. - - - if (map.doubleClickZoom.enabled()) { - map.doubleClickZoom.disable(); - } - - this._map.fire('singleclickon'); - - this._enabled = true; - this.addHooks(); - return this; - }, - disable: function disable() { - if (!this._enabled) { - return this; - } - - this._enabled = false; - this.removeHooks(); - return this; - }, - _fireIfSingle: function _fireIfSingle(e) { - var map = this._map; - var oe = e.originalEvent; // prevents deselection in case of box selector - - if (oe && oe.shiftKey) { - return; - } - - map._clicked += 1; - this._map._clickTimeout = setTimeout(function () { - if (map._clicked === 1) { - map._clicked = 0; - map.fire('singleclick', { - type: 'singleclick' - }); - } else { - // manually fire doubleclick event only for touch screens that don't natively fire it - if (L.Browser.touch && oe && oe.sourceCapabilities.firesTouchEvents) { - map.fire('dblclick'); - } - } - }, 250); - }, - _onDoubleClick: function _onDoubleClick() { - var map = this._map; - var labels = map._labels; - setTimeout(function () { - map._clicked = 0; - clearTimeout(map._clickTimeout); - }, 0); - - if (!labels) { - return; - } - - if (labels.options.opacity === 1) { - labels.options.opacity = 0; - labels.setOpacity(0); - } else { - labels.options.opacity = 1; - labels.setOpacity(1); - } - } -}); -L.Map.addInitHook('addHandler', 'doubleClickLabels', L.Map.DoubleClickLabels); - -/***/ }), - -/***/ "./src/mapmixins/DoubleClickZoom.js": -/*!******************************************!*\ - !*** ./src/mapmixins/DoubleClickZoom.js ***! - \******************************************/ -/***/ (function() { - -/** - * `L.Map.DoubleClickZoom` from leaflet 1.5.1, overrwritten so that it - * 1) Fires a `singleclick` event to avoid deselecting images on `dblclick`. - * 2) Maintains a mutually exclusive relationship with the map's `DoubleClickLabels` handler - */ -L.Map.DoubleClickZoom.include({ - addHooks: function addHooks() { - this._map.on({ - click: this._fireIfSingle, - dblclick: this._onDoubleClick - }, this); - }, - removeHooks: function removeHooks() { - this._map.off({ - click: this._fireIfSingle, - dblclick: this._onDoubleClick - }, this); - }, - enable: function enable() { - if (this._enabled) { - return this; - } // don't enable 'doubleClickZoom' unless 'doubleClickLabels' is disabled first - - - if (this._map.doubleClickLabels) { - if (this._map.doubleClickLabels.enabled()) { - return this; - } - } // signify to collection/instance classes to turn on 'singleclick' listeners - - - this._map.fire('singleclickon'); - - this._enabled = true; - this.addHooks(); - return this; - }, - disable: function disable() { - if (!this._enabled) { - return this; - } // signify to collection/instance safe to swap 'singleclick' listeners with 'click' listeners. - - - this._map.fire('singleclickoff'); - - this._enabled = false; - this.removeHooks(); - return this; - }, - _fireIfSingle: function _fireIfSingle(e) { - var map = this._map; - var oe = e.originalEvent; // prevents deselection in case of box selector - - if (oe && oe.shiftKey) { - return; - } - - map._clicked += 1; - this._map._clickTimeout = setTimeout(function () { - if (map._clicked === 1) { - map._clicked = 0; - map.fire('singleclick', { - type: 'singleclick' - }); - } else { - // manually fire doubleclick event only for touch screens that don't natively fire it - if (L.Browser.touch && oe && oe.sourceCapabilities.firesTouchEvents) { - /* in `DoubleClickLabels.js`, we just do map.fire('dblclick') bc `_onDoublClick` doesn't use the - passed "e" (for now). To generate a 'real' DOM event that will have all of its corresponding core - properties (originalEvent, latlng, etc.), use Leaflet's `#map._fireDOMEvent` (Leaflet 1.5.1 source) */ - map._fireDOMEvent(oe, 'dblclick', [map]); - } - } - }, 250); - }, - _onDoubleClick: function _onDoubleClick(e) { - var map = this._map; - var oe = e.originalEvent; - setTimeout(function () { - map._clicked = 0; - clearTimeout(map._clickTimeout); - }, 0); - - if (!oe) { - return false; - } - - var oldZoom = map.getZoom(); - var delta = map.options.zoomDelta; - var zoom = oe.shiftKey ? oldZoom - delta : oldZoom + delta; - - if (map.options.doubleClickZoom === 'center') { - map.setZoom(zoom); - } else { - map.setZoomAround(e.containerPoint, zoom); - } - } -}); - -/***/ }), - -/***/ "./src/mapmixins/MapMixins.js": -/*!************************************!*\ - !*** ./src/mapmixins/MapMixins.js ***! - \************************************/ -/***/ (function() { - -/* eslint-disable max-len */ -L.Map.include({ - _clicked: 0, - addGoogleMutant: function addGoogleMutant(opts) { - var url = 'http://mt0.google.com/vt/lyrs=s&x={x}&y={y}&z={z}'; - opts = this.mutantOptions = L.extend({ - mutantOpacity: 0.8, - maxZoom: 24, - maxNativeZoom: 20, - minZoom: 0, - labels: true, - labelOpacity: 1, - doubleClickLabels: true - }, opts); - - if (!opts.labels) { - this.mutantOptions = L.extend(this.mutantOptions, { - labelOpacity: opts.labels ? 1 : undefined, - doubleClickLabels: opts.labels ? true : undefined - }); - } - - this._googleMutant = L.tileLayer(url, { - maxZoom: opts.maxZoom, - maxNativeZoom: opts.maxNativeZoom, - minZoom: opts.minZoom, - opacity: opts.mutantOpacity - }).addTo(this); - - if (opts.labels) { - this._addLabels(opts); - } // shouldn't have this handler at all if there are no labels to toggle - else { - this.doubleClickLabels = undefined; - } - - return this; - }, - _addLabels: function _addLabels(opts) { - var url = 'https://stamen-tiles-{s}.a.ssl.fastly.net/toner-labels/{z}/{x}/{y}{r}.{ext}'; - - if (opts.labelOpacity !== 0 && opts.labelOpacity !== 1) { - opts.labelOpacity = 1; - } - - this._labels = L.tileLayer(url, { - attribution: 'Map tiles by Stamen Design, CC BY 3.0 — Map data © OpenStreetMap contributors', - subdomains: 'abcd', - interactive: false, - opacity: opts.labelOpacity, - maxZoom: opts.maxZoom, - maxNativeZoom: opts.maxNativeZoom, - minZoom: opts.minZoom, - ext: 'png' - }).addTo(this); - - if (this.mutantOptions.doubleClickLabels) { - this.doubleClickLabels.enable(); - } - - return this; - } -}); // start off with doubleClickZoom enabled, doubleClickLabels can later be enabled instead -// during initialization - -L.Map.addInitHook(function () { - this.doubleClickLabels.disable(); - this.doubleClickZoom.enable(); -}); - -/***/ }), - -/***/ "./src/util/DomUtil.js": -/*!*****************************!*\ - !*** ./src/util/DomUtil.js ***! - \*****************************/ -/***/ (function() { - -L.DomUtil = L.extend(L.DomUtil, { - initTranslation: function initTranslation(obj) { - this.translation = obj; - }, - getMatrixString: function getMatrixString(m) { - var is3d = L.Browser.webkit3d || L.Browser.gecko3d || L.Browser.ie3d; - /* - * Since matrix3d takes a 4*4 matrix, we add in an empty row and column, - * which act as the identity on the z-axis. - * See: - * http://franklinta.com/2014/09/08/computing-css-matrix3d-transforms/ - * https://developer.mozilla.org/en-US/docs/Web/CSS/transform-function#M.C3.B6bius'_homogeneous_coordinates_in_projective_geometry - */ - - var matrix = [m[0], m[3], 0, m[6], m[1], m[4], 0, m[7], 0, 0, 1, 0, m[2], m[5], 0, m[8]]; - var str = is3d ? 'matrix3d(' + matrix.join(',') + ')' : ''; - - if (!is3d) { - console.log('Your browser must support 3D CSS transforms' + 'in order to use DistortableImageOverlay.'); - } - - return str; - }, - toggleClass: function toggleClass(el, className) { - var c = className; - return this.hasClass(el, c) ? this.removeClass(el, c) : this.addClass(el, c); - }, - confirmDelete: function confirmDelete() { - return window.confirm(this.translation.confirmImageDelete); - }, - confirmDeletes: function confirmDeletes(n) { - if (n === 1) { - return this.confirmDelete(); - } - - var translation = this.translation.confirmImagesDeletes; - var warningMsg = ''; - - if (typeof translation === 'function') { - warningMsg = translation(n); - } else { - warningMsg = translation; - } - - return window.confirm(warningMsg); - } -}); - -/***/ }), - -/***/ "./src/util/IconUtil.js": -/*!******************************!*\ - !*** ./src/util/IconUtil.js ***! - \******************************/ -/***/ (function() { - -L.IconUtil = { - /* creates an svg elemenet with built in accessibility properties - * and standardized classes for styling, takes in the fragment - * identifier (id) of the symbol to reference. note for symplicity - * we allow providing the icon target with or without the '#' prefix - */ - create: function create(ref) { - if (/^#/.test(ref)) { - ref = ref.replace(/^#/, ''); - } - - return '' + '' + ''; - }, - addClassToSvg: function addClassToSvg(container, loader) { - var svg = container.querySelector('svg'); - - if (svg) { - L.DomUtil.addClass(svg, loader); - } - }, - // finds the use element and toggles its icon reference - toggleXlink: function toggleXlink(container, ref1, ref2) { - if (!/^#/.test(ref1)) { - ref1 = '#' + ref1; - } - - if (!/^#/.test(ref2)) { - ref2 = '#' + ref2; - } - - var use = container.querySelector('use'); - - if (use) { - var toggled = use.getAttribute('xlink:href') === ref1 ? ref2 : ref1; - use.setAttribute('xlink:href', toggled); - return toggled; - } - - return false; - }, - toggleTitle: function toggleTitle(container, title1, title2) { - var toggled = container.getAttribute('title') === title1 ? title2 : title1; - container.setAttribute('title', toggled); - - if (container.hasAttribute('aria-label')) { - container.setAttribute('aria-label', toggled); - } - - return toggled; - } -}; - -/***/ }), - -/***/ "./src/util/ImageUtil.js": -/*!*******************************!*\ - !*** ./src/util/ImageUtil.js ***! - \*******************************/ -/***/ (function() { - -L.ImageUtil = { - getCmPerPixel: function getCmPerPixel(overlay) { - var map = overlay._map; - var dist = map.latLngToLayerPoint(overlay.getCorner(0)).distanceTo(map.latLngToLayerPoint(overlay.getCorner(1))); - return dist * 100 / overlay.getElement().width; - } -}; - -/***/ }), - -/***/ "./src/util/MatrixUtil.js": -/*!********************************!*\ - !*** ./src/util/MatrixUtil.js ***! - \********************************/ -/***/ (function() { - -L.MatrixUtil = { - // Compute the adjugate of m - adj: function adj(m) { - return [m[4] * m[8] - m[5] * m[7], m[2] * m[7] - m[1] * m[8], m[1] * m[5] - m[2] * m[4], m[5] * m[6] - m[3] * m[8], m[0] * m[8] - m[2] * m[6], m[2] * m[3] - m[0] * m[5], m[3] * m[7] - m[4] * m[6], m[1] * m[6] - m[0] * m[7], m[0] * m[4] - m[1] * m[3]]; - }, - // multiply two 3*3 matrices - multmm: function multmm(a, b) { - var c = []; - var i; - - for (i = 0; i < 3; i++) { - for (var j = 0; j < 3; j++) { - var cij = 0; - - for (var k = 0; k < 3; k++) { - cij += a[3 * i + k] * b[3 * k + j]; - } - - c[3 * i + j] = cij; - } - } - - return c; - }, - // multiply a 3*3 matrix and a 3-vector - multmv: function multmv(m, v) { - return [m[0] * v[0] + m[1] * v[1] + m[2] * v[2], m[3] * v[0] + m[4] * v[1] + m[5] * v[2], m[6] * v[0] + m[7] * v[1] + m[8] * v[2]]; - }, - // multiply a scalar and a 3*3 matrix - multsm: function multsm(s, m) { - var matrix = []; - - for (var i = 0, l = m.length; i < l; i++) { - matrix.push(s * m[i]); - } - - return matrix; - }, - basisToPoints: function basisToPoints(x1, y1, x2, y2, x3, y3, x4, y4) { - var m = [x1, x2, x3, y1, y2, y3, 1, 1, 1]; - var v = L.MatrixUtil.multmv(L.MatrixUtil.adj(m), [x4, y4, 1]); - return L.MatrixUtil.multmm(m, [v[0], 0, 0, 0, v[1], 0, 0, 0, v[2]]); - }, - project: function project(m, x, y) { - var v = L.MatrixUtil.multmv(m, [x, y, 1]); - return [v[0] / v[2], v[1] / v[2]]; - }, - general2DProjection: function general2DProjection(x1s, y1s, x1d, y1d, x2s, y2s, x2d, y2d, x3s, y3s, x3d, y3d, x4s, y4s, x4d, y4d) { - var s = L.MatrixUtil.basisToPoints(x1s, y1s, x2s, y2s, x3s, y3s, x4s, y4s); - var d = L.MatrixUtil.basisToPoints(x1d, y1d, x2d, y2d, x3d, y3d, x4d, y4d); - var m = L.MatrixUtil.multmm(d, L.MatrixUtil.adj(s)); // Normalize to the unique matrix with m[8] == 1. - // See: http://franklinta.com/2014/09/08/computing-css-matrix3d-transforms/ - - return L.MatrixUtil.multsm(1 / m[8], m); - } -}; - -/***/ }), - -/***/ "./src/util/TrigUtil.js": -/*!******************************!*\ - !*** ./src/util/TrigUtil.js ***! - \******************************/ -/***/ (function() { - -L.TrigUtil = { - calcAngle: function calcAngle(x, y) { - var unit = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'deg'; - return unit === 'deg' ? this.radiansToDegrees(Math.atan2(y, x)) : Math.atan2(y, x); - }, - radiansToDegrees: function radiansToDegrees(angle) { - return angle * 180 / Math.PI; - }, - degreesToRadians: function degreesToRadians(angle) { - return angle * Math.PI / 180; - } -}; - -/***/ }), - -/***/ "./src/util/Utils.js": -/*!***************************!*\ - !*** ./src/util/Utils.js ***! - \***************************/ -/***/ (function() { - -L.Utils = { - initTranslation: function initTranslation() { - var translation = { - deleteImage: 'Delete Image', - deleteImages: 'Delete Images', - distortImage: 'Distort Image', - dragImage: 'Drag Image', - exportImage: 'Export Image', - exportImages: 'Export Images', - removeBorder: 'Remove Border', - addBorder: 'Add Border', - freeRotateImage: 'Free rotate Image', - geolocateImage: 'Geolocate Image', - lockMode: 'Lock Mode', - lockImages: 'Lock Images', - makeImageOpaque: 'Make Image Opaque', - makeImageTransparent: 'Make Image Transparent', - restoreImage: 'Restore Natural Image', - rotateImage: 'Rotate Image', - scaleImage: 'Scale Image', - stackToFront: 'Stack to Front', - stackToBack: 'Stack to Back', - unlockImages: 'Unlock Images', - confirmImageDelete: 'Are you sure? This image will be permanently deleted from the map.', - confirmImagesDeletes: 'Are you sure? These images will be permanently deleted from the map.' - }; - - if (!this.options.translation) { - this.options.translation = translation; - } else { - // If the translation for a word is not specified, fallback to English. - for (var key in translation) { - if (!this.options.translation.hasOwnProperty(key)) { - this.options.translation[key] = translation[key]; - } - } - } - - L.DomUtil.initTranslation(this.options.translation); - }, - getNestedVal: function getNestedVal(obj, key, nestedKey) { - var dig = [key, nestedKey]; - return dig.reduce(function (obj, k) { - return obj && obj[k]; - }, obj); - } -}; - -/***/ }), - -/***/ "./node_modules/events/events.js": -/*!***************************************!*\ - !*** ./node_modules/events/events.js ***! - \***************************************/ -/***/ (function(module) { - -"use strict"; -// Copyright Joyent, Inc. and other Node contributors. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to permit -// persons to whom the Software is furnished to do so, subject to the -// following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -// USE OR OTHER DEALINGS IN THE SOFTWARE. - - - -var R = typeof Reflect === 'object' ? Reflect : null -var ReflectApply = R && typeof R.apply === 'function' - ? R.apply - : function ReflectApply(target, receiver, args) { - return Function.prototype.apply.call(target, receiver, args); - } - -var ReflectOwnKeys -if (R && typeof R.ownKeys === 'function') { - ReflectOwnKeys = R.ownKeys -} else if (Object.getOwnPropertySymbols) { - ReflectOwnKeys = function ReflectOwnKeys(target) { - return Object.getOwnPropertyNames(target) - .concat(Object.getOwnPropertySymbols(target)); - }; -} else { - ReflectOwnKeys = function ReflectOwnKeys(target) { - return Object.getOwnPropertyNames(target); - }; -} - -function ProcessEmitWarning(warning) { - if (console && console.warn) console.warn(warning); -} - -var NumberIsNaN = Number.isNaN || function NumberIsNaN(value) { - return value !== value; -} - -function EventEmitter() { - EventEmitter.init.call(this); -} -module.exports = EventEmitter; -module.exports.once = once; - -// Backwards-compat with node 0.10.x -EventEmitter.EventEmitter = EventEmitter; - -EventEmitter.prototype._events = undefined; -EventEmitter.prototype._eventsCount = 0; -EventEmitter.prototype._maxListeners = undefined; - -// By default EventEmitters will print a warning if more than 10 listeners are -// added to it. This is a useful default which helps finding memory leaks. -var defaultMaxListeners = 10; - -function checkListener(listener) { - if (typeof listener !== 'function') { - throw new TypeError('The "listener" argument must be of type Function. Received type ' + typeof listener); - } -} - -Object.defineProperty(EventEmitter, 'defaultMaxListeners', { - enumerable: true, - get: function() { - return defaultMaxListeners; - }, - set: function(arg) { - if (typeof arg !== 'number' || arg < 0 || NumberIsNaN(arg)) { - throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received ' + arg + '.'); - } - defaultMaxListeners = arg; - } -}); - -EventEmitter.init = function() { - - if (this._events === undefined || - this._events === Object.getPrototypeOf(this)._events) { - this._events = Object.create(null); - this._eventsCount = 0; - } - - this._maxListeners = this._maxListeners || undefined; -}; - -// Obviously not all Emitters should be limited to 10. This function allows -// that to be increased. Set to zero for unlimited. -EventEmitter.prototype.setMaxListeners = function setMaxListeners(n) { - if (typeof n !== 'number' || n < 0 || NumberIsNaN(n)) { - throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received ' + n + '.'); - } - this._maxListeners = n; - return this; -}; - -function _getMaxListeners(that) { - if (that._maxListeners === undefined) - return EventEmitter.defaultMaxListeners; - return that._maxListeners; -} - -EventEmitter.prototype.getMaxListeners = function getMaxListeners() { - return _getMaxListeners(this); -}; - -EventEmitter.prototype.emit = function emit(type) { - var args = []; - for (var i = 1; i < arguments.length; i++) args.push(arguments[i]); - var doError = (type === 'error'); - - var events = this._events; - if (events !== undefined) - doError = (doError && events.error === undefined); - else if (!doError) - return false; - - // If there is no 'error' event listener then throw. - if (doError) { - var er; - if (args.length > 0) - er = args[0]; - if (er instanceof Error) { - // Note: The comments on the `throw` lines are intentional, they show - // up in Node's output if this results in an unhandled exception. - throw er; // Unhandled 'error' event - } - // At least give some kind of context to the user - var err = new Error('Unhandled error.' + (er ? ' (' + er.message + ')' : '')); - err.context = er; - throw err; // Unhandled 'error' event - } - - var handler = events[type]; - - if (handler === undefined) - return false; - - if (typeof handler === 'function') { - ReflectApply(handler, this, args); - } else { - var len = handler.length; - var listeners = arrayClone(handler, len); - for (var i = 0; i < len; ++i) - ReflectApply(listeners[i], this, args); - } - - return true; -}; - -function _addListener(target, type, listener, prepend) { - var m; - var events; - var existing; - - checkListener(listener); - - events = target._events; - if (events === undefined) { - events = target._events = Object.create(null); - target._eventsCount = 0; - } else { - // To avoid recursion in the case that type === "newListener"! Before - // adding it to the listeners, first emit "newListener". - if (events.newListener !== undefined) { - target.emit('newListener', type, - listener.listener ? listener.listener : listener); - - // Re-assign `events` because a newListener handler could have caused the - // this._events to be assigned to a new object - events = target._events; - } - existing = events[type]; - } - - if (existing === undefined) { - // Optimize the case of one listener. Don't need the extra array object. - existing = events[type] = listener; - ++target._eventsCount; - } else { - if (typeof existing === 'function') { - // Adding the second element, need to change to array. - existing = events[type] = - prepend ? [listener, existing] : [existing, listener]; - // If we've already got an array, just append. - } else if (prepend) { - existing.unshift(listener); - } else { - existing.push(listener); - } - - // Check for listener leak - m = _getMaxListeners(target); - if (m > 0 && existing.length > m && !existing.warned) { - existing.warned = true; - // No error code for this since it is a Warning - // eslint-disable-next-line no-restricted-syntax - var w = new Error('Possible EventEmitter memory leak detected. ' + - existing.length + ' ' + String(type) + ' listeners ' + - 'added. Use emitter.setMaxListeners() to ' + - 'increase limit'); - w.name = 'MaxListenersExceededWarning'; - w.emitter = target; - w.type = type; - w.count = existing.length; - ProcessEmitWarning(w); - } - } - - return target; -} - -EventEmitter.prototype.addListener = function addListener(type, listener) { - return _addListener(this, type, listener, false); -}; - -EventEmitter.prototype.on = EventEmitter.prototype.addListener; - -EventEmitter.prototype.prependListener = - function prependListener(type, listener) { - return _addListener(this, type, listener, true); - }; - -function onceWrapper() { - if (!this.fired) { - this.target.removeListener(this.type, this.wrapFn); - this.fired = true; - if (arguments.length === 0) - return this.listener.call(this.target); - return this.listener.apply(this.target, arguments); - } -} - -function _onceWrap(target, type, listener) { - var state = { fired: false, wrapFn: undefined, target: target, type: type, listener: listener }; - var wrapped = onceWrapper.bind(state); - wrapped.listener = listener; - state.wrapFn = wrapped; - return wrapped; -} - -EventEmitter.prototype.once = function once(type, listener) { - checkListener(listener); - this.on(type, _onceWrap(this, type, listener)); - return this; -}; - -EventEmitter.prototype.prependOnceListener = - function prependOnceListener(type, listener) { - checkListener(listener); - this.prependListener(type, _onceWrap(this, type, listener)); - return this; - }; - -// Emits a 'removeListener' event if and only if the listener was removed. -EventEmitter.prototype.removeListener = - function removeListener(type, listener) { - var list, events, position, i, originalListener; - - checkListener(listener); - - events = this._events; - if (events === undefined) - return this; - - list = events[type]; - if (list === undefined) - return this; - - if (list === listener || list.listener === listener) { - if (--this._eventsCount === 0) - this._events = Object.create(null); - else { - delete events[type]; - if (events.removeListener) - this.emit('removeListener', type, list.listener || listener); - } - } else if (typeof list !== 'function') { - position = -1; - - for (i = list.length - 1; i >= 0; i--) { - if (list[i] === listener || list[i].listener === listener) { - originalListener = list[i].listener; - position = i; - break; - } - } - - if (position < 0) - return this; - - if (position === 0) - list.shift(); - else { - spliceOne(list, position); - } - - if (list.length === 1) - events[type] = list[0]; - - if (events.removeListener !== undefined) - this.emit('removeListener', type, originalListener || listener); - } - - return this; - }; - -EventEmitter.prototype.off = EventEmitter.prototype.removeListener; - -EventEmitter.prototype.removeAllListeners = - function removeAllListeners(type) { - var listeners, events, i; - - events = this._events; - if (events === undefined) - return this; - - // not listening for removeListener, no need to emit - if (events.removeListener === undefined) { - if (arguments.length === 0) { - this._events = Object.create(null); - this._eventsCount = 0; - } else if (events[type] !== undefined) { - if (--this._eventsCount === 0) - this._events = Object.create(null); - else - delete events[type]; - } - return this; - } - - // emit removeListener for all listeners on all events - if (arguments.length === 0) { - var keys = Object.keys(events); - var key; - for (i = 0; i < keys.length; ++i) { - key = keys[i]; - if (key === 'removeListener') continue; - this.removeAllListeners(key); - } - this.removeAllListeners('removeListener'); - this._events = Object.create(null); - this._eventsCount = 0; - return this; - } - - listeners = events[type]; - - if (typeof listeners === 'function') { - this.removeListener(type, listeners); - } else if (listeners !== undefined) { - // LIFO order - for (i = listeners.length - 1; i >= 0; i--) { - this.removeListener(type, listeners[i]); - } - } - - return this; - }; - -function _listeners(target, type, unwrap) { - var events = target._events; - - if (events === undefined) - return []; - - var evlistener = events[type]; - if (evlistener === undefined) - return []; - - if (typeof evlistener === 'function') - return unwrap ? [evlistener.listener || evlistener] : [evlistener]; - - return unwrap ? - unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length); -} - -EventEmitter.prototype.listeners = function listeners(type) { - return _listeners(this, type, true); -}; - -EventEmitter.prototype.rawListeners = function rawListeners(type) { - return _listeners(this, type, false); -}; - -EventEmitter.listenerCount = function(emitter, type) { - if (typeof emitter.listenerCount === 'function') { - return emitter.listenerCount(type); - } else { - return listenerCount.call(emitter, type); - } -}; - -EventEmitter.prototype.listenerCount = listenerCount; -function listenerCount(type) { - var events = this._events; - - if (events !== undefined) { - var evlistener = events[type]; - - if (typeof evlistener === 'function') { - return 1; - } else if (evlistener !== undefined) { - return evlistener.length; - } - } - - return 0; -} - -EventEmitter.prototype.eventNames = function eventNames() { - return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : []; -}; - -function arrayClone(arr, n) { - var copy = new Array(n); - for (var i = 0; i < n; ++i) - copy[i] = arr[i]; - return copy; -} - -function spliceOne(list, index) { - for (; index + 1 < list.length; index++) - list[index] = list[index + 1]; - list.pop(); -} - -function unwrapListeners(arr) { - var ret = new Array(arr.length); - for (var i = 0; i < ret.length; ++i) { - ret[i] = arr[i].listener || arr[i]; - } - return ret; -} - -function once(emitter, name) { - return new Promise(function (resolve, reject) { - function errorListener(err) { - emitter.removeListener(name, resolver); - reject(err); - } - - function resolver() { - if (typeof emitter.removeListener === 'function') { - emitter.removeListener('error', errorListener); - } - resolve([].slice.call(arguments)); - }; - - eventTargetAgnosticAddListener(emitter, name, resolver, { once: true }); - if (name !== 'error') { - addErrorHandlerIfEventEmitter(emitter, errorListener, { once: true }); - } - }); -} - -function addErrorHandlerIfEventEmitter(emitter, handler, flags) { - if (typeof emitter.on === 'function') { - eventTargetAgnosticAddListener(emitter, 'error', handler, flags); - } -} - -function eventTargetAgnosticAddListener(emitter, name, listener, flags) { - if (typeof emitter.on === 'function') { - if (flags.once) { - emitter.once(name, listener); - } else { - emitter.on(name, listener); - } - } else if (typeof emitter.addEventListener === 'function') { - // EventTarget does not have `error` event semantics like Node - // EventEmitters, we do not listen for `error` events here. - emitter.addEventListener(name, function wrapListener(arg) { - // IE does not have builtin `{ once: true }` support so we - // have to do it manually. - if (flags.once) { - emitter.removeEventListener(name, wrapListener); - } - listener(arg); - }); - } else { - throw new TypeError('The "emitter" argument must be of type EventEmitter. Received type ' + typeof emitter); - } -} - - -/***/ }), - -/***/ "./node_modules/html-entities/lib/index.js": -/*!*************************************************!*\ - !*** ./node_modules/html-entities/lib/index.js ***! - \*************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - -"use strict"; - -var __assign = (this && this.__assign) || function () { - __assign = Object.assign || function(t) { - for (var s, i = 1, n = arguments.length; i < n; i++) { - s = arguments[i]; - for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) - t[p] = s[p]; - } - return t; - }; - return __assign.apply(this, arguments); -}; -Object.defineProperty(exports, "__esModule", ({ value: true })); -var named_references_1 = __webpack_require__(/*! ./named-references */ "./node_modules/html-entities/lib/named-references.js"); -var numeric_unicode_map_1 = __webpack_require__(/*! ./numeric-unicode-map */ "./node_modules/html-entities/lib/numeric-unicode-map.js"); -var surrogate_pairs_1 = __webpack_require__(/*! ./surrogate-pairs */ "./node_modules/html-entities/lib/surrogate-pairs.js"); -var allNamedReferences = __assign(__assign({}, named_references_1.namedReferences), { all: named_references_1.namedReferences.html5 }); -var encodeRegExps = { - specialChars: /[<>'"&]/g, - nonAscii: /(?:[<>'"&\u0080-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])/g, - nonAsciiPrintable: /(?:[<>'"&\x01-\x08\x11-\x15\x17-\x1F\x7f-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])/g, - extensive: /(?:[\x01-\x0c\x0e-\x1f\x21-\x2c\x2e-\x2f\x3a-\x40\x5b-\x60\x7b-\x7d\x7f-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])/g -}; -var defaultEncodeOptions = { - mode: 'specialChars', - level: 'all', - numeric: 'decimal' -}; -/** Encodes all the necessary (specified by `level`) characters in the text */ -function encode(text, _a) { - var _b = _a === void 0 ? defaultEncodeOptions : _a, _c = _b.mode, mode = _c === void 0 ? 'specialChars' : _c, _d = _b.numeric, numeric = _d === void 0 ? 'decimal' : _d, _e = _b.level, level = _e === void 0 ? 'all' : _e; - if (!text) { - return ''; - } - var encodeRegExp = encodeRegExps[mode]; - var references = allNamedReferences[level].characters; - var isHex = numeric === 'hexadecimal'; - encodeRegExp.lastIndex = 0; - var _b = encodeRegExp.exec(text); - var _c; - if (_b) { - _c = ''; - var _d = 0; - do { - if (_d !== _b.index) { - _c += text.substring(_d, _b.index); - } - var _e = _b[0]; - var result_1 = references[_e]; - if (!result_1) { - var code_1 = _e.length > 1 ? surrogate_pairs_1.getCodePoint(_e, 0) : _e.charCodeAt(0); - result_1 = (isHex ? '&#x' + code_1.toString(16) : '&#' + code_1) + ';'; - } - _c += result_1; - _d = _b.index + _e.length; - } while ((_b = encodeRegExp.exec(text))); - if (_d !== text.length) { - _c += text.substring(_d); - } - } - else { - _c = - text; - } - return _c; -} -exports.encode = encode; -var defaultDecodeOptions = { - scope: 'body', - level: 'all' -}; -var strict = /&(?:#\d+|#[xX][\da-fA-F]+|[0-9a-zA-Z]+);/g; -var attribute = /&(?:#\d+|#[xX][\da-fA-F]+|[0-9a-zA-Z]+)[;=]?/g; -var baseDecodeRegExps = { - xml: { - strict: strict, - attribute: attribute, - body: named_references_1.bodyRegExps.xml - }, - html4: { - strict: strict, - attribute: attribute, - body: named_references_1.bodyRegExps.html4 - }, - html5: { - strict: strict, - attribute: attribute, - body: named_references_1.bodyRegExps.html5 - } -}; -var decodeRegExps = __assign(__assign({}, baseDecodeRegExps), { all: baseDecodeRegExps.html5 }); -var fromCharCode = String.fromCharCode; -var outOfBoundsChar = fromCharCode(65533); -var defaultDecodeEntityOptions = { - level: 'all' -}; -/** Decodes a single entity */ -function decodeEntity(entity, _a) { - var _b = (_a === void 0 ? defaultDecodeEntityOptions : _a).level, level = _b === void 0 ? 'all' : _b; - if (!entity) { - return ''; - } - var _b = entity; - var decodeEntityLastChar_1 = entity[entity.length - 1]; - if (false) {} - else if (false) {} - else { - var decodeResultByReference_1 = allNamedReferences[level].entities[entity]; - if (decodeResultByReference_1) { - _b = decodeResultByReference_1; - } - else if (entity[0] === '&' && entity[1] === '#') { - var decodeSecondChar_1 = entity[2]; - var decodeCode_1 = decodeSecondChar_1 == 'x' || decodeSecondChar_1 == 'X' - ? parseInt(entity.substr(3), 16) - : parseInt(entity.substr(2)); - _b = - decodeCode_1 >= 0x10ffff - ? outOfBoundsChar - : decodeCode_1 > 65535 - ? surrogate_pairs_1.fromCodePoint(decodeCode_1) - : fromCharCode(numeric_unicode_map_1.numericUnicodeMap[decodeCode_1] || decodeCode_1); - } - } - return _b; -} -exports.decodeEntity = decodeEntity; -/** Decodes all entities in the text */ -function decode(text, _a) { - var decodeSecondChar_1 = _a === void 0 ? defaultDecodeOptions : _a, decodeCode_1 = decodeSecondChar_1.level, level = decodeCode_1 === void 0 ? 'all' : decodeCode_1, _b = decodeSecondChar_1.scope, scope = _b === void 0 ? level === 'xml' ? 'strict' : 'body' : _b; - if (!text) { - return ''; - } - var decodeRegExp = decodeRegExps[level][scope]; - var references = allNamedReferences[level].entities; - var isAttribute = scope === 'attribute'; - var isStrict = scope === 'strict'; - decodeRegExp.lastIndex = 0; - var replaceMatch_1 = decodeRegExp.exec(text); - var replaceResult_1; - if (replaceMatch_1) { - replaceResult_1 = ''; - var replaceLastIndex_1 = 0; - do { - if (replaceLastIndex_1 !== replaceMatch_1.index) { - replaceResult_1 += text.substring(replaceLastIndex_1, replaceMatch_1.index); - } - var replaceInput_1 = replaceMatch_1[0]; - var decodeResult_1 = replaceInput_1; - var decodeEntityLastChar_2 = replaceInput_1[replaceInput_1.length - 1]; - if (isAttribute - && decodeEntityLastChar_2 === '=') { - decodeResult_1 = replaceInput_1; - } - else if (isStrict - && decodeEntityLastChar_2 !== ';') { - decodeResult_1 = replaceInput_1; - } - else { - var decodeResultByReference_2 = references[replaceInput_1]; - if (decodeResultByReference_2) { - decodeResult_1 = decodeResultByReference_2; - } - else if (replaceInput_1[0] === '&' && replaceInput_1[1] === '#') { - var decodeSecondChar_2 = replaceInput_1[2]; - var decodeCode_2 = decodeSecondChar_2 == 'x' || decodeSecondChar_2 == 'X' - ? parseInt(replaceInput_1.substr(3), 16) - : parseInt(replaceInput_1.substr(2)); - decodeResult_1 = - decodeCode_2 >= 0x10ffff - ? outOfBoundsChar - : decodeCode_2 > 65535 - ? surrogate_pairs_1.fromCodePoint(decodeCode_2) - : fromCharCode(numeric_unicode_map_1.numericUnicodeMap[decodeCode_2] || decodeCode_2); - } - } - replaceResult_1 += decodeResult_1; - replaceLastIndex_1 = replaceMatch_1.index + replaceInput_1.length; - } while ((replaceMatch_1 = decodeRegExp.exec(text))); - if (replaceLastIndex_1 !== text.length) { - replaceResult_1 += text.substring(replaceLastIndex_1); - } - } - else { - replaceResult_1 = - text; - } - return replaceResult_1; -} -exports.decode = decode; - - -/***/ }), - -/***/ "./node_modules/html-entities/lib/named-references.js": -/*!************************************************************!*\ - !*** ./node_modules/html-entities/lib/named-references.js ***! - \************************************************************/ -/***/ (function(__unused_webpack_module, exports) { - -"use strict"; -Object.defineProperty(exports, "__esModule", ({value:true}));exports.bodyRegExps={xml:/&(?:#\d+|#[xX][\da-fA-F]+|[0-9a-zA-Z]+);?/g,html4:/&(?:nbsp|iexcl|cent|pound|curren|yen|brvbar|sect|uml|copy|ordf|laquo|not|shy|reg|macr|deg|plusmn|sup2|sup3|acute|micro|para|middot|cedil|sup1|ordm|raquo|frac14|frac12|frac34|iquest|Agrave|Aacute|Acirc|Atilde|Auml|Aring|AElig|Ccedil|Egrave|Eacute|Ecirc|Euml|Igrave|Iacute|Icirc|Iuml|ETH|Ntilde|Ograve|Oacute|Ocirc|Otilde|Ouml|times|Oslash|Ugrave|Uacute|Ucirc|Uuml|Yacute|THORN|szlig|agrave|aacute|acirc|atilde|auml|aring|aelig|ccedil|egrave|eacute|ecirc|euml|igrave|iacute|icirc|iuml|eth|ntilde|ograve|oacute|ocirc|otilde|ouml|divide|oslash|ugrave|uacute|ucirc|uuml|yacute|thorn|yuml|quot|amp|lt|gt|#\d+|#[xX][\da-fA-F]+|[0-9a-zA-Z]+);?/g,html5:/&(?:AElig|AMP|Aacute|Acirc|Agrave|Aring|Atilde|Auml|COPY|Ccedil|ETH|Eacute|Ecirc|Egrave|Euml|GT|Iacute|Icirc|Igrave|Iuml|LT|Ntilde|Oacute|Ocirc|Ograve|Oslash|Otilde|Ouml|QUOT|REG|THORN|Uacute|Ucirc|Ugrave|Uuml|Yacute|aacute|acirc|acute|aelig|agrave|amp|aring|atilde|auml|brvbar|ccedil|cedil|cent|copy|curren|deg|divide|eacute|ecirc|egrave|eth|euml|frac12|frac14|frac34|gt|iacute|icirc|iexcl|igrave|iquest|iuml|laquo|lt|macr|micro|middot|nbsp|not|ntilde|oacute|ocirc|ograve|ordf|ordm|oslash|otilde|ouml|para|plusmn|pound|quot|raquo|reg|sect|shy|sup1|sup2|sup3|szlig|thorn|times|uacute|ucirc|ugrave|uml|uuml|yacute|yen|yuml|#\d+|#[xX][\da-fA-F]+|[0-9a-zA-Z]+);?/g};exports.namedReferences={xml:{entities:{"<":"<",">":">",""":'"',"'":"'","&":"&"},characters:{"<":"<",">":">",'"':""","'":"'","&":"&"}},html4:{entities:{"'":"'"," ":" "," ":" ","¡":"¡","¡":"¡","¢":"¢","¢":"¢","£":"£","£":"£","¤":"¤","¤":"¤","¥":"¥","¥":"¥","¦":"¦","¦":"¦","§":"§","§":"§","¨":"¨","¨":"¨","©":"©","©":"©","ª":"ª","ª":"ª","«":"«","«":"«","¬":"¬","¬":"¬","­":"­","­":"­","®":"®","®":"®","¯":"¯","¯":"¯","°":"°","°":"°","±":"±","±":"±","²":"²","²":"²","³":"³","³":"³","´":"´","´":"´","µ":"µ","µ":"µ","¶":"¶","¶":"¶","·":"·","·":"·","¸":"¸","¸":"¸","¹":"¹","¹":"¹","º":"º","º":"º","»":"»","»":"»","¼":"¼","¼":"¼","½":"½","½":"½","¾":"¾","¾":"¾","¿":"¿","¿":"¿","À":"À","À":"À","Á":"Á","Á":"Á","Â":"Â","Â":"Â","Ã":"Ã","Ã":"Ã","Ä":"Ä","Ä":"Ä","Å":"Å","Å":"Å","Æ":"Æ","Æ":"Æ","Ç":"Ç","Ç":"Ç","È":"È","È":"È","É":"É","É":"É","Ê":"Ê","Ê":"Ê","Ë":"Ë","Ë":"Ë","Ì":"Ì","Ì":"Ì","Í":"Í","Í":"Í","Î":"Î","Î":"Î","Ï":"Ï","Ï":"Ï","Ð":"Ð","Ð":"Ð","Ñ":"Ñ","Ñ":"Ñ","Ò":"Ò","Ò":"Ò","Ó":"Ó","Ó":"Ó","Ô":"Ô","Ô":"Ô","Õ":"Õ","Õ":"Õ","Ö":"Ö","Ö":"Ö","×":"×","×":"×","Ø":"Ø","Ø":"Ø","Ù":"Ù","Ù":"Ù","Ú":"Ú","Ú":"Ú","Û":"Û","Û":"Û","Ü":"Ü","Ü":"Ü","Ý":"Ý","Ý":"Ý","Þ":"Þ","Þ":"Þ","ß":"ß","ß":"ß","à":"à","à":"à","á":"á","á":"á","â":"â","â":"â","ã":"ã","ã":"ã","ä":"ä","ä":"ä","å":"å","å":"å","æ":"æ","æ":"æ","ç":"ç","ç":"ç","è":"è","è":"è","é":"é","é":"é","ê":"ê","ê":"ê","ë":"ë","ë":"ë","ì":"ì","ì":"ì","í":"í","í":"í","î":"î","î":"î","ï":"ï","ï":"ï","ð":"ð","ð":"ð","ñ":"ñ","ñ":"ñ","ò":"ò","ò":"ò","ó":"ó","ó":"ó","ô":"ô","ô":"ô","õ":"õ","õ":"õ","ö":"ö","ö":"ö","÷":"÷","÷":"÷","ø":"ø","ø":"ø","ù":"ù","ù":"ù","ú":"ú","ú":"ú","û":"û","û":"û","ü":"ü","ü":"ü","ý":"ý","ý":"ý","þ":"þ","þ":"þ","ÿ":"ÿ","ÿ":"ÿ",""":'"',""":'"',"&":"&","&":"&","<":"<","<":"<",">":">",">":">","Œ":"Œ","œ":"œ","Š":"Š","š":"š","Ÿ":"Ÿ","ˆ":"ˆ","˜":"˜"," ":" "," ":" "," ":" ","‌":"‌","‍":"‍","‎":"‎","‏":"‏","–":"–","—":"—","‘":"‘","’":"’","‚":"‚","“":"“","”":"”","„":"„","†":"†","‡":"‡","‰":"‰","‹":"‹","›":"›","€":"€","ƒ":"ƒ","Α":"Α","Β":"Β","Γ":"Γ","Δ":"Δ","Ε":"Ε","Ζ":"Ζ","Η":"Η","Θ":"Θ","Ι":"Ι","Κ":"Κ","Λ":"Λ","Μ":"Μ","Ν":"Ν","Ξ":"Ξ","Ο":"Ο","Π":"Π","Ρ":"Ρ","Σ":"Σ","Τ":"Τ","Υ":"Υ","Φ":"Φ","Χ":"Χ","Ψ":"Ψ","Ω":"Ω","α":"α","β":"β","γ":"γ","δ":"δ","ε":"ε","ζ":"ζ","η":"η","θ":"θ","ι":"ι","κ":"κ","λ":"λ","μ":"μ","ν":"ν","ξ":"ξ","ο":"ο","π":"π","ρ":"ρ","ς":"ς","σ":"σ","τ":"τ","υ":"υ","φ":"φ","χ":"χ","ψ":"ψ","ω":"ω","ϑ":"ϑ","ϒ":"ϒ","ϖ":"ϖ","•":"•","…":"…","′":"′","″":"″","‾":"‾","⁄":"⁄","℘":"℘","ℑ":"ℑ","ℜ":"ℜ","™":"™","ℵ":"ℵ","←":"←","↑":"↑","→":"→","↓":"↓","↔":"↔","↵":"↵","⇐":"⇐","⇑":"⇑","⇒":"⇒","⇓":"⇓","⇔":"⇔","∀":"∀","∂":"∂","∃":"∃","∅":"∅","∇":"∇","∈":"∈","∉":"∉","∋":"∋","∏":"∏","∑":"∑","−":"−","∗":"∗","√":"√","∝":"∝","∞":"∞","∠":"∠","∧":"∧","∨":"∨","∩":"∩","∪":"∪","∫":"∫","∴":"∴","∼":"∼","≅":"≅","≈":"≈","≠":"≠","≡":"≡","≤":"≤","≥":"≥","⊂":"⊂","⊃":"⊃","⊄":"⊄","⊆":"⊆","⊇":"⊇","⊕":"⊕","⊗":"⊗","⊥":"⊥","⋅":"⋅","⌈":"⌈","⌉":"⌉","⌊":"⌊","⌋":"⌋","⟨":"〈","⟩":"〉","◊":"◊","♠":"♠","♣":"♣","♥":"♥","♦":"♦"},characters:{"'":"'"," ":" ","¡":"¡","¢":"¢","£":"£","¤":"¤","¥":"¥","¦":"¦","§":"§","¨":"¨","©":"©","ª":"ª","«":"«","¬":"¬","­":"­","®":"®","¯":"¯","°":"°","±":"±","²":"²","³":"³","´":"´","µ":"µ","¶":"¶","·":"·","¸":"¸","¹":"¹","º":"º","»":"»","¼":"¼","½":"½","¾":"¾","¿":"¿","À":"À","Á":"Á","Â":"Â","Ã":"Ã","Ä":"Ä","Å":"Å","Æ":"Æ","Ç":"Ç","È":"È","É":"É","Ê":"Ê","Ë":"Ë","Ì":"Ì","Í":"Í","Î":"Î","Ï":"Ï","Ð":"Ð","Ñ":"Ñ","Ò":"Ò","Ó":"Ó","Ô":"Ô","Õ":"Õ","Ö":"Ö","×":"×","Ø":"Ø","Ù":"Ù","Ú":"Ú","Û":"Û","Ü":"Ü","Ý":"Ý","Þ":"Þ","ß":"ß","à":"à","á":"á","â":"â","ã":"ã","ä":"ä","å":"å","æ":"æ","ç":"ç","è":"è","é":"é","ê":"ê","ë":"ë","ì":"ì","í":"í","î":"î","ï":"ï","ð":"ð","ñ":"ñ","ò":"ò","ó":"ó","ô":"ô","õ":"õ","ö":"ö","÷":"÷","ø":"ø","ù":"ù","ú":"ú","û":"û","ü":"ü","ý":"ý","þ":"þ","ÿ":"ÿ",'"':""","&":"&","<":"<",">":">","Œ":"Œ","œ":"œ","Š":"Š","š":"š","Ÿ":"Ÿ","ˆ":"ˆ","˜":"˜"," ":" "," ":" "," ":" ","‌":"‌","‍":"‍","‎":"‎","‏":"‏","–":"–","—":"—","‘":"‘","’":"’","‚":"‚","“":"“","”":"”","„":"„","†":"†","‡":"‡","‰":"‰","‹":"‹","›":"›","€":"€","ƒ":"ƒ","Α":"Α","Β":"Β","Γ":"Γ","Δ":"Δ","Ε":"Ε","Ζ":"Ζ","Η":"Η","Θ":"Θ","Ι":"Ι","Κ":"Κ","Λ":"Λ","Μ":"Μ","Ν":"Ν","Ξ":"Ξ","Ο":"Ο","Π":"Π","Ρ":"Ρ","Σ":"Σ","Τ":"Τ","Υ":"Υ","Φ":"Φ","Χ":"Χ","Ψ":"Ψ","Ω":"Ω","α":"α","β":"β","γ":"γ","δ":"δ","ε":"ε","ζ":"ζ","η":"η","θ":"θ","ι":"ι","κ":"κ","λ":"λ","μ":"μ","ν":"ν","ξ":"ξ","ο":"ο","π":"π","ρ":"ρ","ς":"ς","σ":"σ","τ":"τ","υ":"υ","φ":"φ","χ":"χ","ψ":"ψ","ω":"ω","ϑ":"ϑ","ϒ":"ϒ","ϖ":"ϖ","•":"•","…":"…","′":"′","″":"″","‾":"‾","⁄":"⁄","℘":"℘","ℑ":"ℑ","ℜ":"ℜ","™":"™","ℵ":"ℵ","←":"←","↑":"↑","→":"→","↓":"↓","↔":"↔","↵":"↵","⇐":"⇐","⇑":"⇑","⇒":"⇒","⇓":"⇓","⇔":"⇔","∀":"∀","∂":"∂","∃":"∃","∅":"∅","∇":"∇","∈":"∈","∉":"∉","∋":"∋","∏":"∏","∑":"∑","−":"−","∗":"∗","√":"√","∝":"∝","∞":"∞","∠":"∠","∧":"∧","∨":"∨","∩":"∩","∪":"∪","∫":"∫","∴":"∴","∼":"∼","≅":"≅","≈":"≈","≠":"≠","≡":"≡","≤":"≤","≥":"≥","⊂":"⊂","⊃":"⊃","⊄":"⊄","⊆":"⊆","⊇":"⊇","⊕":"⊕","⊗":"⊗","⊥":"⊥","⋅":"⋅","⌈":"⌈","⌉":"⌉","⌊":"⌊","⌋":"⌋","〈":"⟨","〉":"⟩","◊":"◊","♠":"♠","♣":"♣","♥":"♥","♦":"♦"}},html5:{entities:{"Æ":"Æ","Æ":"Æ","&":"&","&":"&","Á":"Á","Á":"Á","Ă":"Ă","Â":"Â","Â":"Â","А":"А","𝔄":"𝔄","À":"À","À":"À","Α":"Α","Ā":"Ā","⩓":"⩓","Ą":"Ą","𝔸":"𝔸","⁡":"⁡","Å":"Å","Å":"Å","𝒜":"𝒜","≔":"≔","Ã":"Ã","Ã":"Ã","Ä":"Ä","Ä":"Ä","∖":"∖","⫧":"⫧","⌆":"⌆","Б":"Б","∵":"∵","ℬ":"ℬ","Β":"Β","𝔅":"𝔅","𝔹":"𝔹","˘":"˘","ℬ":"ℬ","≎":"≎","Ч":"Ч","©":"©","©":"©","Ć":"Ć","⋒":"⋒","ⅅ":"ⅅ","ℭ":"ℭ","Č":"Č","Ç":"Ç","Ç":"Ç","Ĉ":"Ĉ","∰":"∰","Ċ":"Ċ","¸":"¸","·":"·","ℭ":"ℭ","Χ":"Χ","⊙":"⊙","⊖":"⊖","⊕":"⊕","⊗":"⊗","∲":"∲","”":"”","’":"’","∷":"∷","⩴":"⩴","≡":"≡","∯":"∯","∮":"∮","ℂ":"ℂ","∐":"∐","∳":"∳","⨯":"⨯","𝒞":"𝒞","⋓":"⋓","≍":"≍","ⅅ":"ⅅ","⤑":"⤑","Ђ":"Ђ","Ѕ":"Ѕ","Џ":"Џ","‡":"‡","↡":"↡","⫤":"⫤","Ď":"Ď","Д":"Д","∇":"∇","Δ":"Δ","𝔇":"𝔇","´":"´","˙":"˙","˝":"˝","`":"`","˜":"˜","⋄":"⋄","ⅆ":"ⅆ","𝔻":"𝔻","¨":"¨","⃜":"⃜","≐":"≐","∯":"∯","¨":"¨","⇓":"⇓","⇐":"⇐","⇔":"⇔","⫤":"⫤","⟸":"⟸","⟺":"⟺","⟹":"⟹","⇒":"⇒","⊨":"⊨","⇑":"⇑","⇕":"⇕","∥":"∥","↓":"↓","⤓":"⤓","⇵":"⇵","̑":"̑","⥐":"⥐","⥞":"⥞","↽":"↽","⥖":"⥖","⥟":"⥟","⇁":"⇁","⥗":"⥗","⊤":"⊤","↧":"↧","⇓":"⇓","𝒟":"𝒟","Đ":"Đ","Ŋ":"Ŋ","Ð":"Ð","Ð":"Ð","É":"É","É":"É","Ě":"Ě","Ê":"Ê","Ê":"Ê","Э":"Э","Ė":"Ė","𝔈":"𝔈","È":"È","È":"È","∈":"∈","Ē":"Ē","◻":"◻","▫":"▫","Ę":"Ę","𝔼":"𝔼","Ε":"Ε","⩵":"⩵","≂":"≂","⇌":"⇌","ℰ":"ℰ","⩳":"⩳","Η":"Η","Ë":"Ë","Ë":"Ë","∃":"∃","ⅇ":"ⅇ","Ф":"Ф","𝔉":"𝔉","◼":"◼","▪":"▪","𝔽":"𝔽","∀":"∀","ℱ":"ℱ","ℱ":"ℱ","Ѓ":"Ѓ",">":">",">":">","Γ":"Γ","Ϝ":"Ϝ","Ğ":"Ğ","Ģ":"Ģ","Ĝ":"Ĝ","Г":"Г","Ġ":"Ġ","𝔊":"𝔊","⋙":"⋙","𝔾":"𝔾","≥":"≥","⋛":"⋛","≧":"≧","⪢":"⪢","≷":"≷","⩾":"⩾","≳":"≳","𝒢":"𝒢","≫":"≫","Ъ":"Ъ","ˇ":"ˇ","^":"^","Ĥ":"Ĥ","ℌ":"ℌ","ℋ":"ℋ","ℍ":"ℍ","─":"─","ℋ":"ℋ","Ħ":"Ħ","≎":"≎","≏":"≏","Е":"Е","IJ":"IJ","Ё":"Ё","Í":"Í","Í":"Í","Î":"Î","Î":"Î","И":"И","İ":"İ","ℑ":"ℑ","Ì":"Ì","Ì":"Ì","ℑ":"ℑ","Ī":"Ī","ⅈ":"ⅈ","⇒":"⇒","∬":"∬","∫":"∫","⋂":"⋂","⁣":"⁣","⁢":"⁢","Į":"Į","𝕀":"𝕀","Ι":"Ι","ℐ":"ℐ","Ĩ":"Ĩ","І":"І","Ï":"Ï","Ï":"Ï","Ĵ":"Ĵ","Й":"Й","𝔍":"𝔍","𝕁":"𝕁","𝒥":"𝒥","Ј":"Ј","Є":"Є","Х":"Х","Ќ":"Ќ","Κ":"Κ","Ķ":"Ķ","К":"К","𝔎":"𝔎","𝕂":"𝕂","𝒦":"𝒦","Љ":"Љ","<":"<","<":"<","Ĺ":"Ĺ","Λ":"Λ","⟪":"⟪","ℒ":"ℒ","↞":"↞","Ľ":"Ľ","Ļ":"Ļ","Л":"Л","⟨":"⟨","←":"←","⇤":"⇤","⇆":"⇆","⌈":"⌈","⟦":"⟦","⥡":"⥡","⇃":"⇃","⥙":"⥙","⌊":"⌊","↔":"↔","⥎":"⥎","⊣":"⊣","↤":"↤","⥚":"⥚","⊲":"⊲","⧏":"⧏","⊴":"⊴","⥑":"⥑","⥠":"⥠","↿":"↿","⥘":"⥘","↼":"↼","⥒":"⥒","⇐":"⇐","⇔":"⇔","⋚":"⋚","≦":"≦","≶":"≶","⪡":"⪡","⩽":"⩽","≲":"≲","𝔏":"𝔏","⋘":"⋘","⇚":"⇚","Ŀ":"Ŀ","⟵":"⟵","⟷":"⟷","⟶":"⟶","⟸":"⟸","⟺":"⟺","⟹":"⟹","𝕃":"𝕃","↙":"↙","↘":"↘","ℒ":"ℒ","↰":"↰","Ł":"Ł","≪":"≪","⤅":"⤅","М":"М"," ":" ","ℳ":"ℳ","𝔐":"𝔐","∓":"∓","𝕄":"𝕄","ℳ":"ℳ","Μ":"Μ","Њ":"Њ","Ń":"Ń","Ň":"Ň","Ņ":"Ņ","Н":"Н","​":"​","​":"​","​":"​","​":"​","≫":"≫","≪":"≪"," ":"\n","𝔑":"𝔑","⁠":"⁠"," ":" ","ℕ":"ℕ","⫬":"⫬","≢":"≢","≭":"≭","∦":"∦","∉":"∉","≠":"≠","≂̸":"≂̸","∄":"∄","≯":"≯","≱":"≱","≧̸":"≧̸","≫̸":"≫̸","≹":"≹","⩾̸":"⩾̸","≵":"≵","≎̸":"≎̸","≏̸":"≏̸","⋪":"⋪","⧏̸":"⧏̸","⋬":"⋬","≮":"≮","≰":"≰","≸":"≸","≪̸":"≪̸","⩽̸":"⩽̸","≴":"≴","⪢̸":"⪢̸","⪡̸":"⪡̸","⊀":"⊀","⪯̸":"⪯̸","⋠":"⋠","∌":"∌","⋫":"⋫","⧐̸":"⧐̸","⋭":"⋭","⊏̸":"⊏̸","⋢":"⋢","⊐̸":"⊐̸","⋣":"⋣","⊂⃒":"⊂⃒","⊈":"⊈","⊁":"⊁","⪰̸":"⪰̸","⋡":"⋡","≿̸":"≿̸","⊃⃒":"⊃⃒","⊉":"⊉","≁":"≁","≄":"≄","≇":"≇","≉":"≉","∤":"∤","𝒩":"𝒩","Ñ":"Ñ","Ñ":"Ñ","Ν":"Ν","Œ":"Œ","Ó":"Ó","Ó":"Ó","Ô":"Ô","Ô":"Ô","О":"О","Ő":"Ő","𝔒":"𝔒","Ò":"Ò","Ò":"Ò","Ō":"Ō","Ω":"Ω","Ο":"Ο","𝕆":"𝕆","“":"“","‘":"‘","⩔":"⩔","𝒪":"𝒪","Ø":"Ø","Ø":"Ø","Õ":"Õ","Õ":"Õ","⨷":"⨷","Ö":"Ö","Ö":"Ö","‾":"‾","⏞":"⏞","⎴":"⎴","⏜":"⏜","∂":"∂","П":"П","𝔓":"𝔓","Φ":"Φ","Π":"Π","±":"±","ℌ":"ℌ","ℙ":"ℙ","⪻":"⪻","≺":"≺","⪯":"⪯","≼":"≼","≾":"≾","″":"″","∏":"∏","∷":"∷","∝":"∝","𝒫":"𝒫","Ψ":"Ψ",""":'"',""":'"',"𝔔":"𝔔","ℚ":"ℚ","𝒬":"𝒬","⤐":"⤐","®":"®","®":"®","Ŕ":"Ŕ","⟫":"⟫","↠":"↠","⤖":"⤖","Ř":"Ř","Ŗ":"Ŗ","Р":"Р","ℜ":"ℜ","∋":"∋","⇋":"⇋","⥯":"⥯","ℜ":"ℜ","Ρ":"Ρ","⟩":"⟩","→":"→","⇥":"⇥","⇄":"⇄","⌉":"⌉","⟧":"⟧","⥝":"⥝","⇂":"⇂","⥕":"⥕","⌋":"⌋","⊢":"⊢","↦":"↦","⥛":"⥛","⊳":"⊳","⧐":"⧐","⊵":"⊵","⥏":"⥏","⥜":"⥜","↾":"↾","⥔":"⥔","⇀":"⇀","⥓":"⥓","⇒":"⇒","ℝ":"ℝ","⥰":"⥰","⇛":"⇛","ℛ":"ℛ","↱":"↱","⧴":"⧴","Щ":"Щ","Ш":"Ш","Ь":"Ь","Ś":"Ś","⪼":"⪼","Š":"Š","Ş":"Ş","Ŝ":"Ŝ","С":"С","𝔖":"𝔖","↓":"↓","←":"←","→":"→","↑":"↑","Σ":"Σ","∘":"∘","𝕊":"𝕊","√":"√","□":"□","⊓":"⊓","⊏":"⊏","⊑":"⊑","⊐":"⊐","⊒":"⊒","⊔":"⊔","𝒮":"𝒮","⋆":"⋆","⋐":"⋐","⋐":"⋐","⊆":"⊆","≻":"≻","⪰":"⪰","≽":"≽","≿":"≿","∋":"∋","∑":"∑","⋑":"⋑","⊃":"⊃","⊇":"⊇","⋑":"⋑","Þ":"Þ","Þ":"Þ","™":"™","Ћ":"Ћ","Ц":"Ц"," ":"\t","Τ":"Τ","Ť":"Ť","Ţ":"Ţ","Т":"Т","𝔗":"𝔗","∴":"∴","Θ":"Θ","  ":"  "," ":" ","∼":"∼","≃":"≃","≅":"≅","≈":"≈","𝕋":"𝕋","⃛":"⃛","𝒯":"𝒯","Ŧ":"Ŧ","Ú":"Ú","Ú":"Ú","↟":"↟","⥉":"⥉","Ў":"Ў","Ŭ":"Ŭ","Û":"Û","Û":"Û","У":"У","Ű":"Ű","𝔘":"𝔘","Ù":"Ù","Ù":"Ù","Ū":"Ū","_":"_","⏟":"⏟","⎵":"⎵","⏝":"⏝","⋃":"⋃","⊎":"⊎","Ų":"Ų","𝕌":"𝕌","↑":"↑","⤒":"⤒","⇅":"⇅","↕":"↕","⥮":"⥮","⊥":"⊥","↥":"↥","⇑":"⇑","⇕":"⇕","↖":"↖","↗":"↗","ϒ":"ϒ","Υ":"Υ","Ů":"Ů","𝒰":"𝒰","Ũ":"Ũ","Ü":"Ü","Ü":"Ü","⊫":"⊫","⫫":"⫫","В":"В","⊩":"⊩","⫦":"⫦","⋁":"⋁","‖":"‖","‖":"‖","∣":"∣","|":"|","❘":"❘","≀":"≀"," ":" ","𝔙":"𝔙","𝕍":"𝕍","𝒱":"𝒱","⊪":"⊪","Ŵ":"Ŵ","⋀":"⋀","𝔚":"𝔚","𝕎":"𝕎","𝒲":"𝒲","𝔛":"𝔛","Ξ":"Ξ","𝕏":"𝕏","𝒳":"𝒳","Я":"Я","Ї":"Ї","Ю":"Ю","Ý":"Ý","Ý":"Ý","Ŷ":"Ŷ","Ы":"Ы","𝔜":"𝔜","𝕐":"𝕐","𝒴":"𝒴","Ÿ":"Ÿ","Ж":"Ж","Ź":"Ź","Ž":"Ž","З":"З","Ż":"Ż","​":"​","Ζ":"Ζ","ℨ":"ℨ","ℤ":"ℤ","𝒵":"𝒵","á":"á","á":"á","ă":"ă","∾":"∾","∾̳":"∾̳","∿":"∿","â":"â","â":"â","´":"´","´":"´","а":"а","æ":"æ","æ":"æ","⁡":"⁡","𝔞":"𝔞","à":"à","à":"à","ℵ":"ℵ","ℵ":"ℵ","α":"α","ā":"ā","⨿":"⨿","&":"&","&":"&","∧":"∧","⩕":"⩕","⩜":"⩜","⩘":"⩘","⩚":"⩚","∠":"∠","⦤":"⦤","∠":"∠","∡":"∡","⦨":"⦨","⦩":"⦩","⦪":"⦪","⦫":"⦫","⦬":"⦬","⦭":"⦭","⦮":"⦮","⦯":"⦯","∟":"∟","⊾":"⊾","⦝":"⦝","∢":"∢","Å":"Å","⍼":"⍼","ą":"ą","𝕒":"𝕒","≈":"≈","⩰":"⩰","⩯":"⩯","≊":"≊","≋":"≋","'":"'","≈":"≈","≊":"≊","å":"å","å":"å","𝒶":"𝒶","*":"*","≈":"≈","≍":"≍","ã":"ã","ã":"ã","ä":"ä","ä":"ä","∳":"∳","⨑":"⨑","⫭":"⫭","≌":"≌","϶":"϶","‵":"‵","∽":"∽","⋍":"⋍","⊽":"⊽","⌅":"⌅","⌅":"⌅","⎵":"⎵","⎶":"⎶","≌":"≌","б":"б","„":"„","∵":"∵","∵":"∵","⦰":"⦰","϶":"϶","ℬ":"ℬ","β":"β","ℶ":"ℶ","≬":"≬","𝔟":"𝔟","⋂":"⋂","◯":"◯","⋃":"⋃","⨀":"⨀","⨁":"⨁","⨂":"⨂","⨆":"⨆","★":"★","▽":"▽","△":"△","⨄":"⨄","⋁":"⋁","⋀":"⋀","⤍":"⤍","⧫":"⧫","▪":"▪","▴":"▴","▾":"▾","◂":"◂","▸":"▸","␣":"␣","▒":"▒","░":"░","▓":"▓","█":"█","=⃥":"=⃥","≡⃥":"≡⃥","⌐":"⌐","𝕓":"𝕓","⊥":"⊥","⊥":"⊥","⋈":"⋈","╗":"╗","╔":"╔","╖":"╖","╓":"╓","═":"═","╦":"╦","╩":"╩","╤":"╤","╧":"╧","╝":"╝","╚":"╚","╜":"╜","╙":"╙","║":"║","╬":"╬","╣":"╣","╠":"╠","╫":"╫","╢":"╢","╟":"╟","⧉":"⧉","╕":"╕","╒":"╒","┐":"┐","┌":"┌","─":"─","╥":"╥","╨":"╨","┬":"┬","┴":"┴","⊟":"⊟","⊞":"⊞","⊠":"⊠","╛":"╛","╘":"╘","┘":"┘","└":"└","│":"│","╪":"╪","╡":"╡","╞":"╞","┼":"┼","┤":"┤","├":"├","‵":"‵","˘":"˘","¦":"¦","¦":"¦","𝒷":"𝒷","⁏":"⁏","∽":"∽","⋍":"⋍","\":"\\","⧅":"⧅","⟈":"⟈","•":"•","•":"•","≎":"≎","⪮":"⪮","≏":"≏","≏":"≏","ć":"ć","∩":"∩","⩄":"⩄","⩉":"⩉","⩋":"⩋","⩇":"⩇","⩀":"⩀","∩︀":"∩︀","⁁":"⁁","ˇ":"ˇ","⩍":"⩍","č":"č","ç":"ç","ç":"ç","ĉ":"ĉ","⩌":"⩌","⩐":"⩐","ċ":"ċ","¸":"¸","¸":"¸","⦲":"⦲","¢":"¢","¢":"¢","·":"·","𝔠":"𝔠","ч":"ч","✓":"✓","✓":"✓","χ":"χ","○":"○","⧃":"⧃","ˆ":"ˆ","≗":"≗","↺":"↺","↻":"↻","®":"®","Ⓢ":"Ⓢ","⊛":"⊛","⊚":"⊚","⊝":"⊝","≗":"≗","⨐":"⨐","⫯":"⫯","⧂":"⧂","♣":"♣","♣":"♣",":":":","≔":"≔","≔":"≔",",":",","@":"@","∁":"∁","∘":"∘","∁":"∁","ℂ":"ℂ","≅":"≅","⩭":"⩭","∮":"∮","𝕔":"𝕔","∐":"∐","©":"©","©":"©","℗":"℗","↵":"↵","✗":"✗","𝒸":"𝒸","⫏":"⫏","⫑":"⫑","⫐":"⫐","⫒":"⫒","⋯":"⋯","⤸":"⤸","⤵":"⤵","⋞":"⋞","⋟":"⋟","↶":"↶","⤽":"⤽","∪":"∪","⩈":"⩈","⩆":"⩆","⩊":"⩊","⊍":"⊍","⩅":"⩅","∪︀":"∪︀","↷":"↷","⤼":"⤼","⋞":"⋞","⋟":"⋟","⋎":"⋎","⋏":"⋏","¤":"¤","¤":"¤","↶":"↶","↷":"↷","⋎":"⋎","⋏":"⋏","∲":"∲","∱":"∱","⌭":"⌭","⇓":"⇓","⥥":"⥥","†":"†","ℸ":"ℸ","↓":"↓","‐":"‐","⊣":"⊣","⤏":"⤏","˝":"˝","ď":"ď","д":"д","ⅆ":"ⅆ","‡":"‡","⇊":"⇊","⩷":"⩷","°":"°","°":"°","δ":"δ","⦱":"⦱","⥿":"⥿","𝔡":"𝔡","⇃":"⇃","⇂":"⇂","⋄":"⋄","⋄":"⋄","♦":"♦","♦":"♦","¨":"¨","ϝ":"ϝ","⋲":"⋲","÷":"÷","÷":"÷","÷":"÷","⋇":"⋇","⋇":"⋇","ђ":"ђ","⌞":"⌞","⌍":"⌍","$":"$","𝕕":"𝕕","˙":"˙","≐":"≐","≑":"≑","∸":"∸","∔":"∔","⊡":"⊡","⌆":"⌆","↓":"↓","⇊":"⇊","⇃":"⇃","⇂":"⇂","⤐":"⤐","⌟":"⌟","⌌":"⌌","𝒹":"𝒹","ѕ":"ѕ","⧶":"⧶","đ":"đ","⋱":"⋱","▿":"▿","▾":"▾","⇵":"⇵","⥯":"⥯","⦦":"⦦","џ":"џ","⟿":"⟿","⩷":"⩷","≑":"≑","é":"é","é":"é","⩮":"⩮","ě":"ě","≖":"≖","ê":"ê","ê":"ê","≕":"≕","э":"э","ė":"ė","ⅇ":"ⅇ","≒":"≒","𝔢":"𝔢","⪚":"⪚","è":"è","è":"è","⪖":"⪖","⪘":"⪘","⪙":"⪙","⏧":"⏧","ℓ":"ℓ","⪕":"⪕","⪗":"⪗","ē":"ē","∅":"∅","∅":"∅","∅":"∅"," ":" "," ":" "," ":" ","ŋ":"ŋ"," ":" ","ę":"ę","𝕖":"𝕖","⋕":"⋕","⧣":"⧣","⩱":"⩱","ε":"ε","ε":"ε","ϵ":"ϵ","≖":"≖","≕":"≕","≂":"≂","⪖":"⪖","⪕":"⪕","=":"=","≟":"≟","≡":"≡","⩸":"⩸","⧥":"⧥","≓":"≓","⥱":"⥱","ℯ":"ℯ","≐":"≐","≂":"≂","η":"η","ð":"ð","ð":"ð","ë":"ë","ë":"ë","€":"€","!":"!","∃":"∃","ℰ":"ℰ","ⅇ":"ⅇ","≒":"≒","ф":"ф","♀":"♀","ffi":"ffi","ff":"ff","ffl":"ffl","𝔣":"𝔣","fi":"fi","fj":"fj","♭":"♭","fl":"fl","▱":"▱","ƒ":"ƒ","𝕗":"𝕗","∀":"∀","⋔":"⋔","⫙":"⫙","⨍":"⨍","½":"½","½":"½","⅓":"⅓","¼":"¼","¼":"¼","⅕":"⅕","⅙":"⅙","⅛":"⅛","⅔":"⅔","⅖":"⅖","¾":"¾","¾":"¾","⅗":"⅗","⅜":"⅜","⅘":"⅘","⅚":"⅚","⅝":"⅝","⅞":"⅞","⁄":"⁄","⌢":"⌢","𝒻":"𝒻","≧":"≧","⪌":"⪌","ǵ":"ǵ","γ":"γ","ϝ":"ϝ","⪆":"⪆","ğ":"ğ","ĝ":"ĝ","г":"г","ġ":"ġ","≥":"≥","⋛":"⋛","≥":"≥","≧":"≧","⩾":"⩾","⩾":"⩾","⪩":"⪩","⪀":"⪀","⪂":"⪂","⪄":"⪄","⋛︀":"⋛︀","⪔":"⪔","𝔤":"𝔤","≫":"≫","⋙":"⋙","ℷ":"ℷ","ѓ":"ѓ","≷":"≷","⪒":"⪒","⪥":"⪥","⪤":"⪤","≩":"≩","⪊":"⪊","⪊":"⪊","⪈":"⪈","⪈":"⪈","≩":"≩","⋧":"⋧","𝕘":"𝕘","`":"`","ℊ":"ℊ","≳":"≳","⪎":"⪎","⪐":"⪐",">":">",">":">","⪧":"⪧","⩺":"⩺","⋗":"⋗","⦕":"⦕","⩼":"⩼","⪆":"⪆","⥸":"⥸","⋗":"⋗","⋛":"⋛","⪌":"⪌","≷":"≷","≳":"≳","≩︀":"≩︀","≩︀":"≩︀","⇔":"⇔"," ":" ","½":"½","ℋ":"ℋ","ъ":"ъ","↔":"↔","⥈":"⥈","↭":"↭","ℏ":"ℏ","ĥ":"ĥ","♥":"♥","♥":"♥","…":"…","⊹":"⊹","𝔥":"𝔥","⤥":"⤥","⤦":"⤦","⇿":"⇿","∻":"∻","↩":"↩","↪":"↪","𝕙":"𝕙","―":"―","𝒽":"𝒽","ℏ":"ℏ","ħ":"ħ","⁃":"⁃","‐":"‐","í":"í","í":"í","⁣":"⁣","î":"î","î":"î","и":"и","е":"е","¡":"¡","¡":"¡","⇔":"⇔","𝔦":"𝔦","ì":"ì","ì":"ì","ⅈ":"ⅈ","⨌":"⨌","∭":"∭","⧜":"⧜","℩":"℩","ij":"ij","ī":"ī","ℑ":"ℑ","ℐ":"ℐ","ℑ":"ℑ","ı":"ı","⊷":"⊷","Ƶ":"Ƶ","∈":"∈","℅":"℅","∞":"∞","⧝":"⧝","ı":"ı","∫":"∫","⊺":"⊺","ℤ":"ℤ","⊺":"⊺","⨗":"⨗","⨼":"⨼","ё":"ё","į":"į","𝕚":"𝕚","ι":"ι","⨼":"⨼","¿":"¿","¿":"¿","𝒾":"𝒾","∈":"∈","⋹":"⋹","⋵":"⋵","⋴":"⋴","⋳":"⋳","∈":"∈","⁢":"⁢","ĩ":"ĩ","і":"і","ï":"ï","ï":"ï","ĵ":"ĵ","й":"й","𝔧":"𝔧","ȷ":"ȷ","𝕛":"𝕛","𝒿":"𝒿","ј":"ј","є":"є","κ":"κ","ϰ":"ϰ","ķ":"ķ","к":"к","𝔨":"𝔨","ĸ":"ĸ","х":"х","ќ":"ќ","𝕜":"𝕜","𝓀":"𝓀","⇚":"⇚","⇐":"⇐","⤛":"⤛","⤎":"⤎","≦":"≦","⪋":"⪋","⥢":"⥢","ĺ":"ĺ","⦴":"⦴","ℒ":"ℒ","λ":"λ","⟨":"⟨","⦑":"⦑","⟨":"⟨","⪅":"⪅","«":"«","«":"«","←":"←","⇤":"⇤","⤟":"⤟","⤝":"⤝","↩":"↩","↫":"↫","⤹":"⤹","⥳":"⥳","↢":"↢","⪫":"⪫","⤙":"⤙","⪭":"⪭","⪭︀":"⪭︀","⤌":"⤌","❲":"❲","{":"{","[":"[","⦋":"⦋","⦏":"⦏","⦍":"⦍","ľ":"ľ","ļ":"ļ","⌈":"⌈","{":"{","л":"л","⤶":"⤶","“":"“","„":"„","⥧":"⥧","⥋":"⥋","↲":"↲","≤":"≤","←":"←","↢":"↢","↽":"↽","↼":"↼","⇇":"⇇","↔":"↔","⇆":"⇆","⇋":"⇋","↭":"↭","⋋":"⋋","⋚":"⋚","≤":"≤","≦":"≦","⩽":"⩽","⩽":"⩽","⪨":"⪨","⩿":"⩿","⪁":"⪁","⪃":"⪃","⋚︀":"⋚︀","⪓":"⪓","⪅":"⪅","⋖":"⋖","⋚":"⋚","⪋":"⪋","≶":"≶","≲":"≲","⥼":"⥼","⌊":"⌊","𝔩":"𝔩","≶":"≶","⪑":"⪑","↽":"↽","↼":"↼","⥪":"⥪","▄":"▄","љ":"љ","≪":"≪","⇇":"⇇","⌞":"⌞","⥫":"⥫","◺":"◺","ŀ":"ŀ","⎰":"⎰","⎰":"⎰","≨":"≨","⪉":"⪉","⪉":"⪉","⪇":"⪇","⪇":"⪇","≨":"≨","⋦":"⋦","⟬":"⟬","⇽":"⇽","⟦":"⟦","⟵":"⟵","⟷":"⟷","⟼":"⟼","⟶":"⟶","↫":"↫","↬":"↬","⦅":"⦅","𝕝":"𝕝","⨭":"⨭","⨴":"⨴","∗":"∗","_":"_","◊":"◊","◊":"◊","⧫":"⧫","(":"(","⦓":"⦓","⇆":"⇆","⌟":"⌟","⇋":"⇋","⥭":"⥭","‎":"‎","⊿":"⊿","‹":"‹","𝓁":"𝓁","↰":"↰","≲":"≲","⪍":"⪍","⪏":"⪏","[":"[","‘":"‘","‚":"‚","ł":"ł","<":"<","<":"<","⪦":"⪦","⩹":"⩹","⋖":"⋖","⋋":"⋋","⋉":"⋉","⥶":"⥶","⩻":"⩻","⦖":"⦖","◃":"◃","⊴":"⊴","◂":"◂","⥊":"⥊","⥦":"⥦","≨︀":"≨︀","≨︀":"≨︀","∺":"∺","¯":"¯","¯":"¯","♂":"♂","✠":"✠","✠":"✠","↦":"↦","↦":"↦","↧":"↧","↤":"↤","↥":"↥","▮":"▮","⨩":"⨩","м":"м","—":"—","∡":"∡","𝔪":"𝔪","℧":"℧","µ":"µ","µ":"µ","∣":"∣","*":"*","⫰":"⫰","·":"·","·":"·","−":"−","⊟":"⊟","∸":"∸","⨪":"⨪","⫛":"⫛","…":"…","∓":"∓","⊧":"⊧","𝕞":"𝕞","∓":"∓","𝓂":"𝓂","∾":"∾","μ":"μ","⊸":"⊸","⊸":"⊸","⋙̸":"⋙̸","≫⃒":"≫⃒","≫̸":"≫̸","⇍":"⇍","⇎":"⇎","⋘̸":"⋘̸","≪⃒":"≪⃒","≪̸":"≪̸","⇏":"⇏","⊯":"⊯","⊮":"⊮","∇":"∇","ń":"ń","∠⃒":"∠⃒","≉":"≉","⩰̸":"⩰̸","≋̸":"≋̸","ʼn":"ʼn","≉":"≉","♮":"♮","♮":"♮","ℕ":"ℕ"," ":" "," ":" ","≎̸":"≎̸","≏̸":"≏̸","⩃":"⩃","ň":"ň","ņ":"ņ","≇":"≇","⩭̸":"⩭̸","⩂":"⩂","н":"н","–":"–","≠":"≠","⇗":"⇗","⤤":"⤤","↗":"↗","↗":"↗","≐̸":"≐̸","≢":"≢","⤨":"⤨","≂̸":"≂̸","∄":"∄","∄":"∄","𝔫":"𝔫","≧̸":"≧̸","≱":"≱","≱":"≱","≧̸":"≧̸","⩾̸":"⩾̸","⩾̸":"⩾̸","≵":"≵","≯":"≯","≯":"≯","⇎":"⇎","↮":"↮","⫲":"⫲","∋":"∋","⋼":"⋼","⋺":"⋺","∋":"∋","њ":"њ","⇍":"⇍","≦̸":"≦̸","↚":"↚","‥":"‥","≰":"≰","↚":"↚","↮":"↮","≰":"≰","≦̸":"≦̸","⩽̸":"⩽̸","⩽̸":"⩽̸","≮":"≮","≴":"≴","≮":"≮","⋪":"⋪","⋬":"⋬","∤":"∤","𝕟":"𝕟","¬":"¬","¬":"¬","∉":"∉","⋹̸":"⋹̸","⋵̸":"⋵̸","∉":"∉","⋷":"⋷","⋶":"⋶","∌":"∌","∌":"∌","⋾":"⋾","⋽":"⋽","∦":"∦","∦":"∦","⫽⃥":"⫽⃥","∂̸":"∂̸","⨔":"⨔","⊀":"⊀","⋠":"⋠","⪯̸":"⪯̸","⊀":"⊀","⪯̸":"⪯̸","⇏":"⇏","↛":"↛","⤳̸":"⤳̸","↝̸":"↝̸","↛":"↛","⋫":"⋫","⋭":"⋭","⊁":"⊁","⋡":"⋡","⪰̸":"⪰̸","𝓃":"𝓃","∤":"∤","∦":"∦","≁":"≁","≄":"≄","≄":"≄","∤":"∤","∦":"∦","⋢":"⋢","⋣":"⋣","⊄":"⊄","⫅̸":"⫅̸","⊈":"⊈","⊂⃒":"⊂⃒","⊈":"⊈","⫅̸":"⫅̸","⊁":"⊁","⪰̸":"⪰̸","⊅":"⊅","⫆̸":"⫆̸","⊉":"⊉","⊃⃒":"⊃⃒","⊉":"⊉","⫆̸":"⫆̸","≹":"≹","ñ":"ñ","ñ":"ñ","≸":"≸","⋪":"⋪","⋬":"⋬","⋫":"⋫","⋭":"⋭","ν":"ν","#":"#","№":"№"," ":" ","⊭":"⊭","⤄":"⤄","≍⃒":"≍⃒","⊬":"⊬","≥⃒":"≥⃒",">⃒":">⃒","⧞":"⧞","⤂":"⤂","≤⃒":"≤⃒","<⃒":"<⃒","⊴⃒":"⊴⃒","⤃":"⤃","⊵⃒":"⊵⃒","∼⃒":"∼⃒","⇖":"⇖","⤣":"⤣","↖":"↖","↖":"↖","⤧":"⤧","Ⓢ":"Ⓢ","ó":"ó","ó":"ó","⊛":"⊛","⊚":"⊚","ô":"ô","ô":"ô","о":"о","⊝":"⊝","ő":"ő","⨸":"⨸","⊙":"⊙","⦼":"⦼","œ":"œ","⦿":"⦿","𝔬":"𝔬","˛":"˛","ò":"ò","ò":"ò","⧁":"⧁","⦵":"⦵","Ω":"Ω","∮":"∮","↺":"↺","⦾":"⦾","⦻":"⦻","‾":"‾","⧀":"⧀","ō":"ō","ω":"ω","ο":"ο","⦶":"⦶","⊖":"⊖","𝕠":"𝕠","⦷":"⦷","⦹":"⦹","⊕":"⊕","∨":"∨","↻":"↻","⩝":"⩝","ℴ":"ℴ","ℴ":"ℴ","ª":"ª","ª":"ª","º":"º","º":"º","⊶":"⊶","⩖":"⩖","⩗":"⩗","⩛":"⩛","ℴ":"ℴ","ø":"ø","ø":"ø","⊘":"⊘","õ":"õ","õ":"õ","⊗":"⊗","⨶":"⨶","ö":"ö","ö":"ö","⌽":"⌽","∥":"∥","¶":"¶","¶":"¶","∥":"∥","⫳":"⫳","⫽":"⫽","∂":"∂","п":"п","%":"%",".":".","‰":"‰","⊥":"⊥","‱":"‱","𝔭":"𝔭","φ":"φ","ϕ":"ϕ","ℳ":"ℳ","☎":"☎","π":"π","⋔":"⋔","ϖ":"ϖ","ℏ":"ℏ","ℎ":"ℎ","ℏ":"ℏ","+":"+","⨣":"⨣","⊞":"⊞","⨢":"⨢","∔":"∔","⨥":"⨥","⩲":"⩲","±":"±","±":"±","⨦":"⨦","⨧":"⨧","±":"±","⨕":"⨕","𝕡":"𝕡","£":"£","£":"£","≺":"≺","⪳":"⪳","⪷":"⪷","≼":"≼","⪯":"⪯","≺":"≺","⪷":"⪷","≼":"≼","⪯":"⪯","⪹":"⪹","⪵":"⪵","⋨":"⋨","≾":"≾","′":"′","ℙ":"ℙ","⪵":"⪵","⪹":"⪹","⋨":"⋨","∏":"∏","⌮":"⌮","⌒":"⌒","⌓":"⌓","∝":"∝","∝":"∝","≾":"≾","⊰":"⊰","𝓅":"𝓅","ψ":"ψ"," ":" ","𝔮":"𝔮","⨌":"⨌","𝕢":"𝕢","⁗":"⁗","𝓆":"𝓆","ℍ":"ℍ","⨖":"⨖","?":"?","≟":"≟",""":'"',""":'"',"⇛":"⇛","⇒":"⇒","⤜":"⤜","⤏":"⤏","⥤":"⥤","∽̱":"∽̱","ŕ":"ŕ","√":"√","⦳":"⦳","⟩":"⟩","⦒":"⦒","⦥":"⦥","⟩":"⟩","»":"»","»":"»","→":"→","⥵":"⥵","⇥":"⇥","⤠":"⤠","⤳":"⤳","⤞":"⤞","↪":"↪","↬":"↬","⥅":"⥅","⥴":"⥴","↣":"↣","↝":"↝","⤚":"⤚","∶":"∶","ℚ":"ℚ","⤍":"⤍","❳":"❳","}":"}","]":"]","⦌":"⦌","⦎":"⦎","⦐":"⦐","ř":"ř","ŗ":"ŗ","⌉":"⌉","}":"}","р":"р","⤷":"⤷","⥩":"⥩","”":"”","”":"”","↳":"↳","ℜ":"ℜ","ℛ":"ℛ","ℜ":"ℜ","ℝ":"ℝ","▭":"▭","®":"®","®":"®","⥽":"⥽","⌋":"⌋","𝔯":"𝔯","⇁":"⇁","⇀":"⇀","⥬":"⥬","ρ":"ρ","ϱ":"ϱ","→":"→","↣":"↣","⇁":"⇁","⇀":"⇀","⇄":"⇄","⇌":"⇌","⇉":"⇉","↝":"↝","⋌":"⋌","˚":"˚","≓":"≓","⇄":"⇄","⇌":"⇌","‏":"‏","⎱":"⎱","⎱":"⎱","⫮":"⫮","⟭":"⟭","⇾":"⇾","⟧":"⟧","⦆":"⦆","𝕣":"𝕣","⨮":"⨮","⨵":"⨵",")":")","⦔":"⦔","⨒":"⨒","⇉":"⇉","›":"›","𝓇":"𝓇","↱":"↱","]":"]","’":"’","’":"’","⋌":"⋌","⋊":"⋊","▹":"▹","⊵":"⊵","▸":"▸","⧎":"⧎","⥨":"⥨","℞":"℞","ś":"ś","‚":"‚","≻":"≻","⪴":"⪴","⪸":"⪸","š":"š","≽":"≽","⪰":"⪰","ş":"ş","ŝ":"ŝ","⪶":"⪶","⪺":"⪺","⋩":"⋩","⨓":"⨓","≿":"≿","с":"с","⋅":"⋅","⊡":"⊡","⩦":"⩦","⇘":"⇘","⤥":"⤥","↘":"↘","↘":"↘","§":"§","§":"§",";":";","⤩":"⤩","∖":"∖","∖":"∖","✶":"✶","𝔰":"𝔰","⌢":"⌢","♯":"♯","щ":"щ","ш":"ш","∣":"∣","∥":"∥","­":"­","­":"­","σ":"σ","ς":"ς","ς":"ς","∼":"∼","⩪":"⩪","≃":"≃","≃":"≃","⪞":"⪞","⪠":"⪠","⪝":"⪝","⪟":"⪟","≆":"≆","⨤":"⨤","⥲":"⥲","←":"←","∖":"∖","⨳":"⨳","⧤":"⧤","∣":"∣","⌣":"⌣","⪪":"⪪","⪬":"⪬","⪬︀":"⪬︀","ь":"ь","/":"/","⧄":"⧄","⌿":"⌿","𝕤":"𝕤","♠":"♠","♠":"♠","∥":"∥","⊓":"⊓","⊓︀":"⊓︀","⊔":"⊔","⊔︀":"⊔︀","⊏":"⊏","⊑":"⊑","⊏":"⊏","⊑":"⊑","⊐":"⊐","⊒":"⊒","⊐":"⊐","⊒":"⊒","□":"□","□":"□","▪":"▪","▪":"▪","→":"→","𝓈":"𝓈","∖":"∖","⌣":"⌣","⋆":"⋆","☆":"☆","★":"★","ϵ":"ϵ","ϕ":"ϕ","¯":"¯","⊂":"⊂","⫅":"⫅","⪽":"⪽","⊆":"⊆","⫃":"⫃","⫁":"⫁","⫋":"⫋","⊊":"⊊","⪿":"⪿","⥹":"⥹","⊂":"⊂","⊆":"⊆","⫅":"⫅","⊊":"⊊","⫋":"⫋","⫇":"⫇","⫕":"⫕","⫓":"⫓","≻":"≻","⪸":"⪸","≽":"≽","⪰":"⪰","⪺":"⪺","⪶":"⪶","⋩":"⋩","≿":"≿","∑":"∑","♪":"♪","¹":"¹","¹":"¹","²":"²","²":"²","³":"³","³":"³","⊃":"⊃","⫆":"⫆","⪾":"⪾","⫘":"⫘","⊇":"⊇","⫄":"⫄","⟉":"⟉","⫗":"⫗","⥻":"⥻","⫂":"⫂","⫌":"⫌","⊋":"⊋","⫀":"⫀","⊃":"⊃","⊇":"⊇","⫆":"⫆","⊋":"⊋","⫌":"⫌","⫈":"⫈","⫔":"⫔","⫖":"⫖","⇙":"⇙","⤦":"⤦","↙":"↙","↙":"↙","⤪":"⤪","ß":"ß","ß":"ß","⌖":"⌖","τ":"τ","⎴":"⎴","ť":"ť","ţ":"ţ","т":"т","⃛":"⃛","⌕":"⌕","𝔱":"𝔱","∴":"∴","∴":"∴","θ":"θ","ϑ":"ϑ","ϑ":"ϑ","≈":"≈","∼":"∼"," ":" ","≈":"≈","∼":"∼","þ":"þ","þ":"þ","˜":"˜","×":"×","×":"×","⊠":"⊠","⨱":"⨱","⨰":"⨰","∭":"∭","⤨":"⤨","⊤":"⊤","⌶":"⌶","⫱":"⫱","𝕥":"𝕥","⫚":"⫚","⤩":"⤩","‴":"‴","™":"™","▵":"▵","▿":"▿","◃":"◃","⊴":"⊴","≜":"≜","▹":"▹","⊵":"⊵","◬":"◬","≜":"≜","⨺":"⨺","⨹":"⨹","⧍":"⧍","⨻":"⨻","⏢":"⏢","𝓉":"𝓉","ц":"ц","ћ":"ћ","ŧ":"ŧ","≬":"≬","↞":"↞","↠":"↠","⇑":"⇑","⥣":"⥣","ú":"ú","ú":"ú","↑":"↑","ў":"ў","ŭ":"ŭ","û":"û","û":"û","у":"у","⇅":"⇅","ű":"ű","⥮":"⥮","⥾":"⥾","𝔲":"𝔲","ù":"ù","ù":"ù","↿":"↿","↾":"↾","▀":"▀","⌜":"⌜","⌜":"⌜","⌏":"⌏","◸":"◸","ū":"ū","¨":"¨","¨":"¨","ų":"ų","𝕦":"𝕦","↑":"↑","↕":"↕","↿":"↿","↾":"↾","⊎":"⊎","υ":"υ","ϒ":"ϒ","υ":"υ","⇈":"⇈","⌝":"⌝","⌝":"⌝","⌎":"⌎","ů":"ů","◹":"◹","𝓊":"𝓊","⋰":"⋰","ũ":"ũ","▵":"▵","▴":"▴","⇈":"⇈","ü":"ü","ü":"ü","⦧":"⦧","⇕":"⇕","⫨":"⫨","⫩":"⫩","⊨":"⊨","⦜":"⦜","ϵ":"ϵ","ϰ":"ϰ","∅":"∅","ϕ":"ϕ","ϖ":"ϖ","∝":"∝","↕":"↕","ϱ":"ϱ","ς":"ς","⊊︀":"⊊︀","⫋︀":"⫋︀","⊋︀":"⊋︀","⫌︀":"⫌︀","ϑ":"ϑ","⊲":"⊲","⊳":"⊳","в":"в","⊢":"⊢","∨":"∨","⊻":"⊻","≚":"≚","⋮":"⋮","|":"|","|":"|","𝔳":"𝔳","⊲":"⊲","⊂⃒":"⊂⃒","⊃⃒":"⊃⃒","𝕧":"𝕧","∝":"∝","⊳":"⊳","𝓋":"𝓋","⫋︀":"⫋︀","⊊︀":"⊊︀","⫌︀":"⫌︀","⊋︀":"⊋︀","⦚":"⦚","ŵ":"ŵ","⩟":"⩟","∧":"∧","≙":"≙","℘":"℘","𝔴":"𝔴","𝕨":"𝕨","℘":"℘","≀":"≀","≀":"≀","𝓌":"𝓌","⋂":"⋂","◯":"◯","⋃":"⋃","▽":"▽","𝔵":"𝔵","⟺":"⟺","⟷":"⟷","ξ":"ξ","⟸":"⟸","⟵":"⟵","⟼":"⟼","⋻":"⋻","⨀":"⨀","𝕩":"𝕩","⨁":"⨁","⨂":"⨂","⟹":"⟹","⟶":"⟶","𝓍":"𝓍","⨆":"⨆","⨄":"⨄","△":"△","⋁":"⋁","⋀":"⋀","ý":"ý","ý":"ý","я":"я","ŷ":"ŷ","ы":"ы","¥":"¥","¥":"¥","𝔶":"𝔶","ї":"ї","𝕪":"𝕪","𝓎":"𝓎","ю":"ю","ÿ":"ÿ","ÿ":"ÿ","ź":"ź","ž":"ž","з":"з","ż":"ż","ℨ":"ℨ","ζ":"ζ","𝔷":"𝔷","ж":"ж","⇝":"⇝","𝕫":"𝕫","𝓏":"𝓏","‍":"‍","‌":"‌"},characters:{"Æ":"Æ","&":"&","Á":"Á","Ă":"Ă","Â":"Â","А":"А","𝔄":"𝔄","À":"À","Α":"Α","Ā":"Ā","⩓":"⩓","Ą":"Ą","𝔸":"𝔸","⁡":"⁡","Å":"Å","𝒜":"𝒜","≔":"≔","Ã":"Ã","Ä":"Ä","∖":"∖","⫧":"⫧","⌆":"⌆","Б":"Б","∵":"∵","ℬ":"ℬ","Β":"Β","𝔅":"𝔅","𝔹":"𝔹","˘":"˘","≎":"≎","Ч":"Ч","©":"©","Ć":"Ć","⋒":"⋒","ⅅ":"ⅅ","ℭ":"ℭ","Č":"Č","Ç":"Ç","Ĉ":"Ĉ","∰":"∰","Ċ":"Ċ","¸":"¸","·":"·","Χ":"Χ","⊙":"⊙","⊖":"⊖","⊕":"⊕","⊗":"⊗","∲":"∲","”":"”","’":"’","∷":"∷","⩴":"⩴","≡":"≡","∯":"∯","∮":"∮","ℂ":"ℂ","∐":"∐","∳":"∳","⨯":"⨯","𝒞":"𝒞","⋓":"⋓","≍":"≍","⤑":"⤑","Ђ":"Ђ","Ѕ":"Ѕ","Џ":"Џ","‡":"‡","↡":"↡","⫤":"⫤","Ď":"Ď","Д":"Д","∇":"∇","Δ":"Δ","𝔇":"𝔇","´":"´","˙":"˙","˝":"˝","`":"`","˜":"˜","⋄":"⋄","ⅆ":"ⅆ","𝔻":"𝔻","¨":"¨","⃜":"⃜","≐":"≐","⇓":"⇓","⇐":"⇐","⇔":"⇔","⟸":"⟸","⟺":"⟺","⟹":"⟹","⇒":"⇒","⊨":"⊨","⇑":"⇑","⇕":"⇕","∥":"∥","↓":"↓","⤓":"⤓","⇵":"⇵","̑":"̑","⥐":"⥐","⥞":"⥞","↽":"↽","⥖":"⥖","⥟":"⥟","⇁":"⇁","⥗":"⥗","⊤":"⊤","↧":"↧","𝒟":"𝒟","Đ":"Đ","Ŋ":"Ŋ","Ð":"Ð","É":"É","Ě":"Ě","Ê":"Ê","Э":"Э","Ė":"Ė","𝔈":"𝔈","È":"È","∈":"∈","Ē":"Ē","◻":"◻","▫":"▫","Ę":"Ę","𝔼":"𝔼","Ε":"Ε","⩵":"⩵","≂":"≂","⇌":"⇌","ℰ":"ℰ","⩳":"⩳","Η":"Η","Ë":"Ë","∃":"∃","ⅇ":"ⅇ","Ф":"Ф","𝔉":"𝔉","◼":"◼","▪":"▪","𝔽":"𝔽","∀":"∀","ℱ":"ℱ","Ѓ":"Ѓ",">":">","Γ":"Γ","Ϝ":"Ϝ","Ğ":"Ğ","Ģ":"Ģ","Ĝ":"Ĝ","Г":"Г","Ġ":"Ġ","𝔊":"𝔊","⋙":"⋙","𝔾":"𝔾","≥":"≥","⋛":"⋛","≧":"≧","⪢":"⪢","≷":"≷","⩾":"⩾","≳":"≳","𝒢":"𝒢","≫":"≫","Ъ":"Ъ","ˇ":"ˇ","^":"^","Ĥ":"Ĥ","ℌ":"ℌ","ℋ":"ℋ","ℍ":"ℍ","─":"─","Ħ":"Ħ","≏":"≏","Е":"Е","IJ":"IJ","Ё":"Ё","Í":"Í","Î":"Î","И":"И","İ":"İ","ℑ":"ℑ","Ì":"Ì","Ī":"Ī","ⅈ":"ⅈ","∬":"∬","∫":"∫","⋂":"⋂","⁣":"⁣","⁢":"⁢","Į":"Į","𝕀":"𝕀","Ι":"Ι","ℐ":"ℐ","Ĩ":"Ĩ","І":"І","Ï":"Ï","Ĵ":"Ĵ","Й":"Й","𝔍":"𝔍","𝕁":"𝕁","𝒥":"𝒥","Ј":"Ј","Є":"Є","Х":"Х","Ќ":"Ќ","Κ":"Κ","Ķ":"Ķ","К":"К","𝔎":"𝔎","𝕂":"𝕂","𝒦":"𝒦","Љ":"Љ","<":"<","Ĺ":"Ĺ","Λ":"Λ","⟪":"⟪","ℒ":"ℒ","↞":"↞","Ľ":"Ľ","Ļ":"Ļ","Л":"Л","⟨":"⟨","←":"←","⇤":"⇤","⇆":"⇆","⌈":"⌈","⟦":"⟦","⥡":"⥡","⇃":"⇃","⥙":"⥙","⌊":"⌊","↔":"↔","⥎":"⥎","⊣":"⊣","↤":"↤","⥚":"⥚","⊲":"⊲","⧏":"⧏","⊴":"⊴","⥑":"⥑","⥠":"⥠","↿":"↿","⥘":"⥘","↼":"↼","⥒":"⥒","⋚":"⋚","≦":"≦","≶":"≶","⪡":"⪡","⩽":"⩽","≲":"≲","𝔏":"𝔏","⋘":"⋘","⇚":"⇚","Ŀ":"Ŀ","⟵":"⟵","⟷":"⟷","⟶":"⟶","𝕃":"𝕃","↙":"↙","↘":"↘","↰":"↰","Ł":"Ł","≪":"≪","⤅":"⤅","М":"М"," ":" ","ℳ":"ℳ","𝔐":"𝔐","∓":"∓","𝕄":"𝕄","Μ":"Μ","Њ":"Њ","Ń":"Ń","Ň":"Ň","Ņ":"Ņ","Н":"Н","​":"​","\n":" ","𝔑":"𝔑","⁠":"⁠"," ":" ","ℕ":"ℕ","⫬":"⫬","≢":"≢","≭":"≭","∦":"∦","∉":"∉","≠":"≠","≂̸":"≂̸","∄":"∄","≯":"≯","≱":"≱","≧̸":"≧̸","≫̸":"≫̸","≹":"≹","⩾̸":"⩾̸","≵":"≵","≎̸":"≎̸","≏̸":"≏̸","⋪":"⋪","⧏̸":"⧏̸","⋬":"⋬","≮":"≮","≰":"≰","≸":"≸","≪̸":"≪̸","⩽̸":"⩽̸","≴":"≴","⪢̸":"⪢̸","⪡̸":"⪡̸","⊀":"⊀","⪯̸":"⪯̸","⋠":"⋠","∌":"∌","⋫":"⋫","⧐̸":"⧐̸","⋭":"⋭","⊏̸":"⊏̸","⋢":"⋢","⊐̸":"⊐̸","⋣":"⋣","⊂⃒":"⊂⃒","⊈":"⊈","⊁":"⊁","⪰̸":"⪰̸","⋡":"⋡","≿̸":"≿̸","⊃⃒":"⊃⃒","⊉":"⊉","≁":"≁","≄":"≄","≇":"≇","≉":"≉","∤":"∤","𝒩":"𝒩","Ñ":"Ñ","Ν":"Ν","Œ":"Œ","Ó":"Ó","Ô":"Ô","О":"О","Ő":"Ő","𝔒":"𝔒","Ò":"Ò","Ō":"Ō","Ω":"Ω","Ο":"Ο","𝕆":"𝕆","“":"“","‘":"‘","⩔":"⩔","𝒪":"𝒪","Ø":"Ø","Õ":"Õ","⨷":"⨷","Ö":"Ö","‾":"‾","⏞":"⏞","⎴":"⎴","⏜":"⏜","∂":"∂","П":"П","𝔓":"𝔓","Φ":"Φ","Π":"Π","±":"±","ℙ":"ℙ","⪻":"⪻","≺":"≺","⪯":"⪯","≼":"≼","≾":"≾","″":"″","∏":"∏","∝":"∝","𝒫":"𝒫","Ψ":"Ψ",'"':""","𝔔":"𝔔","ℚ":"ℚ","𝒬":"𝒬","⤐":"⤐","®":"®","Ŕ":"Ŕ","⟫":"⟫","↠":"↠","⤖":"⤖","Ř":"Ř","Ŗ":"Ŗ","Р":"Р","ℜ":"ℜ","∋":"∋","⇋":"⇋","⥯":"⥯","Ρ":"Ρ","⟩":"⟩","→":"→","⇥":"⇥","⇄":"⇄","⌉":"⌉","⟧":"⟧","⥝":"⥝","⇂":"⇂","⥕":"⥕","⌋":"⌋","⊢":"⊢","↦":"↦","⥛":"⥛","⊳":"⊳","⧐":"⧐","⊵":"⊵","⥏":"⥏","⥜":"⥜","↾":"↾","⥔":"⥔","⇀":"⇀","⥓":"⥓","ℝ":"ℝ","⥰":"⥰","⇛":"⇛","ℛ":"ℛ","↱":"↱","⧴":"⧴","Щ":"Щ","Ш":"Ш","Ь":"Ь","Ś":"Ś","⪼":"⪼","Š":"Š","Ş":"Ş","Ŝ":"Ŝ","С":"С","𝔖":"𝔖","↑":"↑","Σ":"Σ","∘":"∘","𝕊":"𝕊","√":"√","□":"□","⊓":"⊓","⊏":"⊏","⊑":"⊑","⊐":"⊐","⊒":"⊒","⊔":"⊔","𝒮":"𝒮","⋆":"⋆","⋐":"⋐","⊆":"⊆","≻":"≻","⪰":"⪰","≽":"≽","≿":"≿","∑":"∑","⋑":"⋑","⊃":"⊃","⊇":"⊇","Þ":"Þ","™":"™","Ћ":"Ћ","Ц":"Ц","\t":" ","Τ":"Τ","Ť":"Ť","Ţ":"Ţ","Т":"Т","𝔗":"𝔗","∴":"∴","Θ":"Θ","  ":"  "," ":" ","∼":"∼","≃":"≃","≅":"≅","≈":"≈","𝕋":"𝕋","⃛":"⃛","𝒯":"𝒯","Ŧ":"Ŧ","Ú":"Ú","↟":"↟","⥉":"⥉","Ў":"Ў","Ŭ":"Ŭ","Û":"Û","У":"У","Ű":"Ű","𝔘":"𝔘","Ù":"Ù","Ū":"Ū",_:"_","⏟":"⏟","⎵":"⎵","⏝":"⏝","⋃":"⋃","⊎":"⊎","Ų":"Ų","𝕌":"𝕌","⤒":"⤒","⇅":"⇅","↕":"↕","⥮":"⥮","⊥":"⊥","↥":"↥","↖":"↖","↗":"↗","ϒ":"ϒ","Υ":"Υ","Ů":"Ů","𝒰":"𝒰","Ũ":"Ũ","Ü":"Ü","⊫":"⊫","⫫":"⫫","В":"В","⊩":"⊩","⫦":"⫦","⋁":"⋁","‖":"‖","∣":"∣","|":"|","❘":"❘","≀":"≀"," ":" ","𝔙":"𝔙","𝕍":"𝕍","𝒱":"𝒱","⊪":"⊪","Ŵ":"Ŵ","⋀":"⋀","𝔚":"𝔚","𝕎":"𝕎","𝒲":"𝒲","𝔛":"𝔛","Ξ":"Ξ","𝕏":"𝕏","𝒳":"𝒳","Я":"Я","Ї":"Ї","Ю":"Ю","Ý":"Ý","Ŷ":"Ŷ","Ы":"Ы","𝔜":"𝔜","𝕐":"𝕐","𝒴":"𝒴","Ÿ":"Ÿ","Ж":"Ж","Ź":"Ź","Ž":"Ž","З":"З","Ż":"Ż","Ζ":"Ζ","ℨ":"ℨ","ℤ":"ℤ","𝒵":"𝒵","á":"á","ă":"ă","∾":"∾","∾̳":"∾̳","∿":"∿","â":"â","а":"а","æ":"æ","𝔞":"𝔞","à":"à","ℵ":"ℵ","α":"α","ā":"ā","⨿":"⨿","∧":"∧","⩕":"⩕","⩜":"⩜","⩘":"⩘","⩚":"⩚","∠":"∠","⦤":"⦤","∡":"∡","⦨":"⦨","⦩":"⦩","⦪":"⦪","⦫":"⦫","⦬":"⦬","⦭":"⦭","⦮":"⦮","⦯":"⦯","∟":"∟","⊾":"⊾","⦝":"⦝","∢":"∢","⍼":"⍼","ą":"ą","𝕒":"𝕒","⩰":"⩰","⩯":"⩯","≊":"≊","≋":"≋","'":"'","å":"å","𝒶":"𝒶","*":"*","ã":"ã","ä":"ä","⨑":"⨑","⫭":"⫭","≌":"≌","϶":"϶","‵":"‵","∽":"∽","⋍":"⋍","⊽":"⊽","⌅":"⌅","⎶":"⎶","б":"б","„":"„","⦰":"⦰","β":"β","ℶ":"ℶ","≬":"≬","𝔟":"𝔟","◯":"◯","⨀":"⨀","⨁":"⨁","⨂":"⨂","⨆":"⨆","★":"★","▽":"▽","△":"△","⨄":"⨄","⤍":"⤍","⧫":"⧫","▴":"▴","▾":"▾","◂":"◂","▸":"▸","␣":"␣","▒":"▒","░":"░","▓":"▓","█":"█","=⃥":"=⃥","≡⃥":"≡⃥","⌐":"⌐","𝕓":"𝕓","⋈":"⋈","╗":"╗","╔":"╔","╖":"╖","╓":"╓","═":"═","╦":"╦","╩":"╩","╤":"╤","╧":"╧","╝":"╝","╚":"╚","╜":"╜","╙":"╙","║":"║","╬":"╬","╣":"╣","╠":"╠","╫":"╫","╢":"╢","╟":"╟","⧉":"⧉","╕":"╕","╒":"╒","┐":"┐","┌":"┌","╥":"╥","╨":"╨","┬":"┬","┴":"┴","⊟":"⊟","⊞":"⊞","⊠":"⊠","╛":"╛","╘":"╘","┘":"┘","└":"└","│":"│","╪":"╪","╡":"╡","╞":"╞","┼":"┼","┤":"┤","├":"├","¦":"¦","𝒷":"𝒷","⁏":"⁏","\\":"\","⧅":"⧅","⟈":"⟈","•":"•","⪮":"⪮","ć":"ć","∩":"∩","⩄":"⩄","⩉":"⩉","⩋":"⩋","⩇":"⩇","⩀":"⩀","∩︀":"∩︀","⁁":"⁁","⩍":"⩍","č":"č","ç":"ç","ĉ":"ĉ","⩌":"⩌","⩐":"⩐","ċ":"ċ","⦲":"⦲","¢":"¢","𝔠":"𝔠","ч":"ч","✓":"✓","χ":"χ","○":"○","⧃":"⧃","ˆ":"ˆ","≗":"≗","↺":"↺","↻":"↻","Ⓢ":"Ⓢ","⊛":"⊛","⊚":"⊚","⊝":"⊝","⨐":"⨐","⫯":"⫯","⧂":"⧂","♣":"♣",":":":",",":",","@":"@","∁":"∁","⩭":"⩭","𝕔":"𝕔","℗":"℗","↵":"↵","✗":"✗","𝒸":"𝒸","⫏":"⫏","⫑":"⫑","⫐":"⫐","⫒":"⫒","⋯":"⋯","⤸":"⤸","⤵":"⤵","⋞":"⋞","⋟":"⋟","↶":"↶","⤽":"⤽","∪":"∪","⩈":"⩈","⩆":"⩆","⩊":"⩊","⊍":"⊍","⩅":"⩅","∪︀":"∪︀","↷":"↷","⤼":"⤼","⋎":"⋎","⋏":"⋏","¤":"¤","∱":"∱","⌭":"⌭","⥥":"⥥","†":"†","ℸ":"ℸ","‐":"‐","⤏":"⤏","ď":"ď","д":"д","⇊":"⇊","⩷":"⩷","°":"°","δ":"δ","⦱":"⦱","⥿":"⥿","𝔡":"𝔡","♦":"♦","ϝ":"ϝ","⋲":"⋲","÷":"÷","⋇":"⋇","ђ":"ђ","⌞":"⌞","⌍":"⌍",$:"$","𝕕":"𝕕","≑":"≑","∸":"∸","∔":"∔","⊡":"⊡","⌟":"⌟","⌌":"⌌","𝒹":"𝒹","ѕ":"ѕ","⧶":"⧶","đ":"đ","⋱":"⋱","▿":"▿","⦦":"⦦","џ":"џ","⟿":"⟿","é":"é","⩮":"⩮","ě":"ě","≖":"≖","ê":"ê","≕":"≕","э":"э","ė":"ė","≒":"≒","𝔢":"𝔢","⪚":"⪚","è":"è","⪖":"⪖","⪘":"⪘","⪙":"⪙","⏧":"⏧","ℓ":"ℓ","⪕":"⪕","⪗":"⪗","ē":"ē","∅":"∅"," ":" "," ":" "," ":" ","ŋ":"ŋ"," ":" ","ę":"ę","𝕖":"𝕖","⋕":"⋕","⧣":"⧣","⩱":"⩱","ε":"ε","ϵ":"ϵ","=":"=","≟":"≟","⩸":"⩸","⧥":"⧥","≓":"≓","⥱":"⥱","ℯ":"ℯ","η":"η","ð":"ð","ë":"ë","€":"€","!":"!","ф":"ф","♀":"♀","ffi":"ffi","ff":"ff","ffl":"ffl","𝔣":"𝔣","fi":"fi",fj:"fj","♭":"♭","fl":"fl","▱":"▱","ƒ":"ƒ","𝕗":"𝕗","⋔":"⋔","⫙":"⫙","⨍":"⨍","½":"½","⅓":"⅓","¼":"¼","⅕":"⅕","⅙":"⅙","⅛":"⅛","⅔":"⅔","⅖":"⅖","¾":"¾","⅗":"⅗","⅜":"⅜","⅘":"⅘","⅚":"⅚","⅝":"⅝","⅞":"⅞","⁄":"⁄","⌢":"⌢","𝒻":"𝒻","⪌":"⪌","ǵ":"ǵ","γ":"γ","⪆":"⪆","ğ":"ğ","ĝ":"ĝ","г":"г","ġ":"ġ","⪩":"⪩","⪀":"⪀","⪂":"⪂","⪄":"⪄","⋛︀":"⋛︀","⪔":"⪔","𝔤":"𝔤","ℷ":"ℷ","ѓ":"ѓ","⪒":"⪒","⪥":"⪥","⪤":"⪤","≩":"≩","⪊":"⪊","⪈":"⪈","⋧":"⋧","𝕘":"𝕘","ℊ":"ℊ","⪎":"⪎","⪐":"⪐","⪧":"⪧","⩺":"⩺","⋗":"⋗","⦕":"⦕","⩼":"⩼","⥸":"⥸","≩︀":"≩︀","ъ":"ъ","⥈":"⥈","↭":"↭","ℏ":"ℏ","ĥ":"ĥ","♥":"♥","…":"…","⊹":"⊹","𝔥":"𝔥","⤥":"⤥","⤦":"⤦","⇿":"⇿","∻":"∻","↩":"↩","↪":"↪","𝕙":"𝕙","―":"―","𝒽":"𝒽","ħ":"ħ","⁃":"⁃","í":"í","î":"î","и":"и","е":"е","¡":"¡","𝔦":"𝔦","ì":"ì","⨌":"⨌","∭":"∭","⧜":"⧜","℩":"℩","ij":"ij","ī":"ī","ı":"ı","⊷":"⊷","Ƶ":"Ƶ","℅":"℅","∞":"∞","⧝":"⧝","⊺":"⊺","⨗":"⨗","⨼":"⨼","ё":"ё","į":"į","𝕚":"𝕚","ι":"ι","¿":"¿","𝒾":"𝒾","⋹":"⋹","⋵":"⋵","⋴":"⋴","⋳":"⋳","ĩ":"ĩ","і":"і","ï":"ï","ĵ":"ĵ","й":"й","𝔧":"𝔧","ȷ":"ȷ","𝕛":"𝕛","𝒿":"𝒿","ј":"ј","є":"є","κ":"κ","ϰ":"ϰ","ķ":"ķ","к":"к","𝔨":"𝔨","ĸ":"ĸ","х":"х","ќ":"ќ","𝕜":"𝕜","𝓀":"𝓀","⤛":"⤛","⤎":"⤎","⪋":"⪋","⥢":"⥢","ĺ":"ĺ","⦴":"⦴","λ":"λ","⦑":"⦑","⪅":"⪅","«":"«","⤟":"⤟","⤝":"⤝","↫":"↫","⤹":"⤹","⥳":"⥳","↢":"↢","⪫":"⪫","⤙":"⤙","⪭":"⪭","⪭︀":"⪭︀","⤌":"⤌","❲":"❲","{":"{","[":"[","⦋":"⦋","⦏":"⦏","⦍":"⦍","ľ":"ľ","ļ":"ļ","л":"л","⤶":"⤶","⥧":"⥧","⥋":"⥋","↲":"↲","≤":"≤","⇇":"⇇","⋋":"⋋","⪨":"⪨","⩿":"⩿","⪁":"⪁","⪃":"⪃","⋚︀":"⋚︀","⪓":"⪓","⋖":"⋖","⥼":"⥼","𝔩":"𝔩","⪑":"⪑","⥪":"⥪","▄":"▄","љ":"љ","⥫":"⥫","◺":"◺","ŀ":"ŀ","⎰":"⎰","≨":"≨","⪉":"⪉","⪇":"⪇","⋦":"⋦","⟬":"⟬","⇽":"⇽","⟼":"⟼","↬":"↬","⦅":"⦅","𝕝":"𝕝","⨭":"⨭","⨴":"⨴","∗":"∗","◊":"◊","(":"(","⦓":"⦓","⥭":"⥭","‎":"‎","⊿":"⊿","‹":"‹","𝓁":"𝓁","⪍":"⪍","⪏":"⪏","‚":"‚","ł":"ł","⪦":"⪦","⩹":"⩹","⋉":"⋉","⥶":"⥶","⩻":"⩻","⦖":"⦖","◃":"◃","⥊":"⥊","⥦":"⥦","≨︀":"≨︀","∺":"∺","¯":"¯","♂":"♂","✠":"✠","▮":"▮","⨩":"⨩","м":"м","—":"—","𝔪":"𝔪","℧":"℧","µ":"µ","⫰":"⫰","−":"−","⨪":"⨪","⫛":"⫛","⊧":"⊧","𝕞":"𝕞","𝓂":"𝓂","μ":"μ","⊸":"⊸","⋙̸":"⋙̸","≫⃒":"≫⃒","⇍":"⇍","⇎":"⇎","⋘̸":"⋘̸","≪⃒":"≪⃒","⇏":"⇏","⊯":"⊯","⊮":"⊮","ń":"ń","∠⃒":"∠⃒","⩰̸":"⩰̸","≋̸":"≋̸","ʼn":"ʼn","♮":"♮","⩃":"⩃","ň":"ň","ņ":"ņ","⩭̸":"⩭̸","⩂":"⩂","н":"н","–":"–","⇗":"⇗","⤤":"⤤","≐̸":"≐̸","⤨":"⤨","𝔫":"𝔫","↮":"↮","⫲":"⫲","⋼":"⋼","⋺":"⋺","њ":"њ","≦̸":"≦̸","↚":"↚","‥":"‥","𝕟":"𝕟","¬":"¬","⋹̸":"⋹̸","⋵̸":"⋵̸","⋷":"⋷","⋶":"⋶","⋾":"⋾","⋽":"⋽","⫽⃥":"⫽⃥","∂̸":"∂̸","⨔":"⨔","↛":"↛","⤳̸":"⤳̸","↝̸":"↝̸","𝓃":"𝓃","⊄":"⊄","⫅̸":"⫅̸","⊅":"⊅","⫆̸":"⫆̸","ñ":"ñ","ν":"ν","#":"#","№":"№"," ":" ","⊭":"⊭","⤄":"⤄","≍⃒":"≍⃒","⊬":"⊬","≥⃒":"≥⃒",">⃒":">⃒","⧞":"⧞","⤂":"⤂","≤⃒":"≤⃒","<⃒":"<⃒","⊴⃒":"⊴⃒","⤃":"⤃","⊵⃒":"⊵⃒","∼⃒":"∼⃒","⇖":"⇖","⤣":"⤣","⤧":"⤧","ó":"ó","ô":"ô","о":"о","ő":"ő","⨸":"⨸","⦼":"⦼","œ":"œ","⦿":"⦿","𝔬":"𝔬","˛":"˛","ò":"ò","⧁":"⧁","⦵":"⦵","⦾":"⦾","⦻":"⦻","⧀":"⧀","ō":"ō","ω":"ω","ο":"ο","⦶":"⦶","𝕠":"𝕠","⦷":"⦷","⦹":"⦹","∨":"∨","⩝":"⩝","ℴ":"ℴ","ª":"ª","º":"º","⊶":"⊶","⩖":"⩖","⩗":"⩗","⩛":"⩛","ø":"ø","⊘":"⊘","õ":"õ","⨶":"⨶","ö":"ö","⌽":"⌽","¶":"¶","⫳":"⫳","⫽":"⫽","п":"п","%":"%",".":".","‰":"‰","‱":"‱","𝔭":"𝔭","φ":"φ","ϕ":"ϕ","☎":"☎","π":"π","ϖ":"ϖ","ℎ":"ℎ","+":"+","⨣":"⨣","⨢":"⨢","⨥":"⨥","⩲":"⩲","⨦":"⨦","⨧":"⨧","⨕":"⨕","𝕡":"𝕡","£":"£","⪳":"⪳","⪷":"⪷","⪹":"⪹","⪵":"⪵","⋨":"⋨","′":"′","⌮":"⌮","⌒":"⌒","⌓":"⌓","⊰":"⊰","𝓅":"𝓅","ψ":"ψ"," ":" ","𝔮":"𝔮","𝕢":"𝕢","⁗":"⁗","𝓆":"𝓆","⨖":"⨖","?":"?","⤜":"⤜","⥤":"⥤","∽̱":"∽̱","ŕ":"ŕ","⦳":"⦳","⦒":"⦒","⦥":"⦥","»":"»","⥵":"⥵","⤠":"⤠","⤳":"⤳","⤞":"⤞","⥅":"⥅","⥴":"⥴","↣":"↣","↝":"↝","⤚":"⤚","∶":"∶","❳":"❳","}":"}","]":"]","⦌":"⦌","⦎":"⦎","⦐":"⦐","ř":"ř","ŗ":"ŗ","р":"р","⤷":"⤷","⥩":"⥩","↳":"↳","▭":"▭","⥽":"⥽","𝔯":"𝔯","⥬":"⥬","ρ":"ρ","ϱ":"ϱ","⇉":"⇉","⋌":"⋌","˚":"˚","‏":"‏","⎱":"⎱","⫮":"⫮","⟭":"⟭","⇾":"⇾","⦆":"⦆","𝕣":"𝕣","⨮":"⨮","⨵":"⨵",")":")","⦔":"⦔","⨒":"⨒","›":"›","𝓇":"𝓇","⋊":"⋊","▹":"▹","⧎":"⧎","⥨":"⥨","℞":"℞","ś":"ś","⪴":"⪴","⪸":"⪸","š":"š","ş":"ş","ŝ":"ŝ","⪶":"⪶","⪺":"⪺","⋩":"⋩","⨓":"⨓","с":"с","⋅":"⋅","⩦":"⩦","⇘":"⇘","§":"§",";":";","⤩":"⤩","✶":"✶","𝔰":"𝔰","♯":"♯","щ":"щ","ш":"ш","­":"­","σ":"σ","ς":"ς","⩪":"⩪","⪞":"⪞","⪠":"⪠","⪝":"⪝","⪟":"⪟","≆":"≆","⨤":"⨤","⥲":"⥲","⨳":"⨳","⧤":"⧤","⌣":"⌣","⪪":"⪪","⪬":"⪬","⪬︀":"⪬︀","ь":"ь","/":"/","⧄":"⧄","⌿":"⌿","𝕤":"𝕤","♠":"♠","⊓︀":"⊓︀","⊔︀":"⊔︀","𝓈":"𝓈","☆":"☆","⊂":"⊂","⫅":"⫅","⪽":"⪽","⫃":"⫃","⫁":"⫁","⫋":"⫋","⊊":"⊊","⪿":"⪿","⥹":"⥹","⫇":"⫇","⫕":"⫕","⫓":"⫓","♪":"♪","¹":"¹","²":"²","³":"³","⫆":"⫆","⪾":"⪾","⫘":"⫘","⫄":"⫄","⟉":"⟉","⫗":"⫗","⥻":"⥻","⫂":"⫂","⫌":"⫌","⊋":"⊋","⫀":"⫀","⫈":"⫈","⫔":"⫔","⫖":"⫖","⇙":"⇙","⤪":"⤪","ß":"ß","⌖":"⌖","τ":"τ","ť":"ť","ţ":"ţ","т":"т","⌕":"⌕","𝔱":"𝔱","θ":"θ","ϑ":"ϑ","þ":"þ","×":"×","⨱":"⨱","⨰":"⨰","⌶":"⌶","⫱":"⫱","𝕥":"𝕥","⫚":"⫚","‴":"‴","▵":"▵","≜":"≜","◬":"◬","⨺":"⨺","⨹":"⨹","⧍":"⧍","⨻":"⨻","⏢":"⏢","𝓉":"𝓉","ц":"ц","ћ":"ћ","ŧ":"ŧ","⥣":"⥣","ú":"ú","ў":"ў","ŭ":"ŭ","û":"û","у":"у","ű":"ű","⥾":"⥾","𝔲":"𝔲","ù":"ù","▀":"▀","⌜":"⌜","⌏":"⌏","◸":"◸","ū":"ū","ų":"ų","𝕦":"𝕦","υ":"υ","⇈":"⇈","⌝":"⌝","⌎":"⌎","ů":"ů","◹":"◹","𝓊":"𝓊","⋰":"⋰","ũ":"ũ","ü":"ü","⦧":"⦧","⫨":"⫨","⫩":"⫩","⦜":"⦜","⊊︀":"⊊︀","⫋︀":"⫋︀","⊋︀":"⊋︀","⫌︀":"⫌︀","в":"в","⊻":"⊻","≚":"≚","⋮":"⋮","𝔳":"𝔳","𝕧":"𝕧","𝓋":"𝓋","⦚":"⦚","ŵ":"ŵ","⩟":"⩟","≙":"≙","℘":"℘","𝔴":"𝔴","𝕨":"𝕨","𝓌":"𝓌","𝔵":"𝔵","ξ":"ξ","⋻":"⋻","𝕩":"𝕩","𝓍":"𝓍","ý":"ý","я":"я","ŷ":"ŷ","ы":"ы","¥":"¥","𝔶":"𝔶","ї":"ї","𝕪":"𝕪","𝓎":"𝓎","ю":"ю","ÿ":"ÿ","ź":"ź","ž":"ž","з":"з","ż":"ż","ζ":"ζ","𝔷":"𝔷","ж":"ж","⇝":"⇝","𝕫":"𝕫","𝓏":"𝓏","‍":"‍","‌":"‌"}}}; - -/***/ }), - -/***/ "./node_modules/html-entities/lib/numeric-unicode-map.js": -/*!***************************************************************!*\ - !*** ./node_modules/html-entities/lib/numeric-unicode-map.js ***! - \***************************************************************/ -/***/ (function(__unused_webpack_module, exports) { - -"use strict"; -Object.defineProperty(exports, "__esModule", ({value:true}));exports.numericUnicodeMap={0:65533,128:8364,130:8218,131:402,132:8222,133:8230,134:8224,135:8225,136:710,137:8240,138:352,139:8249,140:338,142:381,145:8216,146:8217,147:8220,148:8221,149:8226,150:8211,151:8212,152:732,153:8482,154:353,155:8250,156:339,158:382,159:376}; - -/***/ }), - -/***/ "./node_modules/html-entities/lib/surrogate-pairs.js": -/*!***********************************************************!*\ - !*** ./node_modules/html-entities/lib/surrogate-pairs.js ***! - \***********************************************************/ -/***/ (function(__unused_webpack_module, exports) { - -"use strict"; -Object.defineProperty(exports, "__esModule", ({value:true}));exports.fromCodePoint=String.fromCodePoint||function(astralCodePoint){return String.fromCharCode(Math.floor((astralCodePoint-65536)/1024)+55296,(astralCodePoint-65536)%1024+56320)};exports.getCodePoint=String.prototype.codePointAt?function(input,position){return input.codePointAt(position)}:function(input,position){return(input.charCodeAt(position)-55296)*1024+input.charCodeAt(position+1)-56320+65536};exports.highSurrogateFrom=55296;exports.highSurrogateTo=56319; - -/***/ }), - -/***/ "./node_modules/webpack-dev-server/client/clients/WebSocketClient.js": -/*!***************************************************************************!*\ - !*** ./node_modules/webpack-dev-server/client/clients/WebSocketClient.js ***! - \***************************************************************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ WebSocketClient; } -/* harmony export */ }); -/* harmony import */ var _utils_log_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils/log.js */ "./node_modules/webpack-dev-server/client/utils/log.js"); -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } - -function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } - - - -var WebSocketClient = /*#__PURE__*/function () { - /** - * @param {string} url - */ - function WebSocketClient(url) { - _classCallCheck(this, WebSocketClient); - - this.client = new WebSocket(url); - - this.client.onerror = function (error) { - _utils_log_js__WEBPACK_IMPORTED_MODULE_0__.log.error(error); - }; - } - /** - * @param {(...args: any[]) => void} f - */ - - - _createClass(WebSocketClient, [{ - key: "onOpen", - value: function onOpen(f) { - this.client.onopen = f; - } - /** - * @param {(...args: any[]) => void} f - */ - - }, { - key: "onClose", - value: function onClose(f) { - this.client.onclose = f; - } // call f with the message string as the first argument - - /** - * @param {(...args: any[]) => void} f - */ - - }, { - key: "onMessage", - value: function onMessage(f) { - this.client.onmessage = function (e) { - f(e.data); - }; - } - }]); - - return WebSocketClient; -}(); - - - -/***/ }), - -/***/ "./node_modules/webpack-dev-server/client/index.js?protocol=ws%3A&hostname=localhost&port=8081&pathname=%2Fws&logging=none&reconnect=10": -/*!**********************************************************************************************************************************************!*\ - !*** ./node_modules/webpack-dev-server/client/index.js?protocol=ws%3A&hostname=localhost&port=8081&pathname=%2Fws&logging=none&reconnect=10 ***! - \**********************************************************************************************************************************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { - -"use strict"; -var __resourceQuery = "?protocol=ws%3A&hostname=localhost&port=8081&pathname=%2Fws&logging=none&reconnect=10"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var webpack_hot_log_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! webpack/hot/log.js */ "./node_modules/webpack/hot/log.js"); -/* harmony import */ var webpack_hot_log_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(webpack_hot_log_js__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _utils_stripAnsi_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils/stripAnsi.js */ "./node_modules/webpack-dev-server/client/utils/stripAnsi.js"); -/* harmony import */ var _utils_parseURL_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utils/parseURL.js */ "./node_modules/webpack-dev-server/client/utils/parseURL.js"); -/* harmony import */ var _socket_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./socket.js */ "./node_modules/webpack-dev-server/client/socket.js"); -/* harmony import */ var _overlay_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./overlay.js */ "./node_modules/webpack-dev-server/client/overlay.js"); -/* harmony import */ var _utils_log_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./utils/log.js */ "./node_modules/webpack-dev-server/client/utils/log.js"); -/* harmony import */ var _utils_sendMessage_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./utils/sendMessage.js */ "./node_modules/webpack-dev-server/client/utils/sendMessage.js"); -/* harmony import */ var _utils_reloadApp_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./utils/reloadApp.js */ "./node_modules/webpack-dev-server/client/utils/reloadApp.js"); -/* harmony import */ var _utils_createSocketURL_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./utils/createSocketURL.js */ "./node_modules/webpack-dev-server/client/utils/createSocketURL.js"); -/* global __resourceQuery, __webpack_hash__ */ -/// - - - - - - - - - -/** - * @typedef {Object} Options - * @property {boolean} hot - * @property {boolean} liveReload - * @property {boolean} progress - * @property {boolean | { warnings?: boolean, errors?: boolean, trustedTypesPolicyName?: string }} overlay - * @property {string} [logging] - * @property {number} [reconnect] - */ - -/** - * @typedef {Object} Status - * @property {boolean} isUnloading - * @property {string} currentHash - * @property {string} [previousHash] - */ - -/** - * @type {Status} - */ - -var status = { - isUnloading: false, - // TODO Workaround for webpack v4, `__webpack_hash__` is not replaced without HotModuleReplacement - // eslint-disable-next-line camelcase - currentHash: true ? __webpack_require__.h() : 0 -}; -/** @type {Options} */ - -var options = { - hot: false, - liveReload: false, - progress: false, - overlay: false -}; -var parsedResourceQuery = (0,_utils_parseURL_js__WEBPACK_IMPORTED_MODULE_2__["default"])(__resourceQuery); - -if (parsedResourceQuery.hot === "true") { - options.hot = true; - _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.info("Hot Module Replacement enabled."); -} - -if (parsedResourceQuery["live-reload"] === "true") { - options.liveReload = true; - _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.info("Live Reloading enabled."); -} - -if (parsedResourceQuery.logging) { - options.logging = parsedResourceQuery.logging; -} - -if (typeof parsedResourceQuery.reconnect !== "undefined") { - options.reconnect = Number(parsedResourceQuery.reconnect); -} -/** - * @param {string} level - */ - - -function setAllLogLevel(level) { - // This is needed because the HMR logger operate separately from dev server logger - webpack_hot_log_js__WEBPACK_IMPORTED_MODULE_0___default().setLogLevel(level === "verbose" || level === "log" ? "info" : level); - (0,_utils_log_js__WEBPACK_IMPORTED_MODULE_5__.setLogLevel)(level); -} - -if (options.logging) { - setAllLogLevel(options.logging); -} - -self.addEventListener("beforeunload", function () { - status.isUnloading = true; -}); -var onSocketMessage = { - hot: function hot() { - if (parsedResourceQuery.hot === "false") { - return; - } - - options.hot = true; - _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.info("Hot Module Replacement enabled."); - }, - liveReload: function liveReload() { - if (parsedResourceQuery["live-reload"] === "false") { - return; - } - - options.liveReload = true; - _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.info("Live Reloading enabled."); - }, - invalid: function invalid() { - _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.info("App updated. Recompiling..."); // Fixes #1042. overlay doesn't clear if errors are fixed but warnings remain. - - if (options.overlay) { - (0,_overlay_js__WEBPACK_IMPORTED_MODULE_4__.hide)(); - } - - (0,_utils_sendMessage_js__WEBPACK_IMPORTED_MODULE_6__["default"])("Invalid"); - }, - - /** - * @param {string} hash - */ - hash: function hash(_hash) { - status.previousHash = status.currentHash; - status.currentHash = _hash; - }, - logging: setAllLogLevel, - - /** - * @param {boolean} value - */ - overlay: function overlay(value) { - if (typeof document === "undefined") { - return; - } - - options.overlay = value; - }, - - /** - * @param {number} value - */ - reconnect: function reconnect(value) { - if (parsedResourceQuery.reconnect === "false") { - return; - } - - options.reconnect = value; - }, - - /** - * @param {boolean} value - */ - progress: function progress(value) { - options.progress = value; - }, - - /** - * @param {{ pluginName?: string, percent: number, msg: string }} data - */ - "progress-update": function progressUpdate(data) { - if (options.progress) { - _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.info("".concat(data.pluginName ? "[".concat(data.pluginName, "] ") : "").concat(data.percent, "% - ").concat(data.msg, ".")); - } - - (0,_utils_sendMessage_js__WEBPACK_IMPORTED_MODULE_6__["default"])("Progress", data); - }, - "still-ok": function stillOk() { - _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.info("Nothing changed."); - - if (options.overlay) { - (0,_overlay_js__WEBPACK_IMPORTED_MODULE_4__.hide)(); - } - - (0,_utils_sendMessage_js__WEBPACK_IMPORTED_MODULE_6__["default"])("StillOk"); - }, - ok: function ok() { - (0,_utils_sendMessage_js__WEBPACK_IMPORTED_MODULE_6__["default"])("Ok"); - - if (options.overlay) { - (0,_overlay_js__WEBPACK_IMPORTED_MODULE_4__.hide)(); - } - - (0,_utils_reloadApp_js__WEBPACK_IMPORTED_MODULE_7__["default"])(options, status); - }, - // TODO: remove in v5 in favor of 'static-changed' - - /** - * @param {string} file - */ - "content-changed": function contentChanged(file) { - _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.info("".concat(file ? "\"".concat(file, "\"") : "Content", " from static directory was changed. Reloading...")); - self.location.reload(); - }, - - /** - * @param {string} file - */ - "static-changed": function staticChanged(file) { - _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.info("".concat(file ? "\"".concat(file, "\"") : "Content", " from static directory was changed. Reloading...")); - self.location.reload(); - }, - - /** - * @param {Error[]} warnings - * @param {any} params - */ - warnings: function warnings(_warnings, params) { - _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.warn("Warnings while compiling."); - - var printableWarnings = _warnings.map(function (error) { - var _formatProblem = (0,_overlay_js__WEBPACK_IMPORTED_MODULE_4__.formatProblem)("warning", error), - header = _formatProblem.header, - body = _formatProblem.body; - - return "".concat(header, "\n").concat((0,_utils_stripAnsi_js__WEBPACK_IMPORTED_MODULE_1__["default"])(body)); - }); - - (0,_utils_sendMessage_js__WEBPACK_IMPORTED_MODULE_6__["default"])("Warnings", printableWarnings); - - for (var i = 0; i < printableWarnings.length; i++) { - _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.warn(printableWarnings[i]); - } - - var needShowOverlayForWarnings = typeof options.overlay === "boolean" ? options.overlay : options.overlay && options.overlay.warnings; - - if (needShowOverlayForWarnings) { - var trustedTypesPolicyName = typeof options.overlay === "object" && options.overlay.trustedTypesPolicyName; - (0,_overlay_js__WEBPACK_IMPORTED_MODULE_4__.show)("warning", _warnings, trustedTypesPolicyName || null); - } - - if (params && params.preventReloading) { - return; - } - - (0,_utils_reloadApp_js__WEBPACK_IMPORTED_MODULE_7__["default"])(options, status); - }, - - /** - * @param {Error[]} errors - */ - errors: function errors(_errors) { - _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.error("Errors while compiling. Reload prevented."); - - var printableErrors = _errors.map(function (error) { - var _formatProblem2 = (0,_overlay_js__WEBPACK_IMPORTED_MODULE_4__.formatProblem)("error", error), - header = _formatProblem2.header, - body = _formatProblem2.body; - - return "".concat(header, "\n").concat((0,_utils_stripAnsi_js__WEBPACK_IMPORTED_MODULE_1__["default"])(body)); - }); - - (0,_utils_sendMessage_js__WEBPACK_IMPORTED_MODULE_6__["default"])("Errors", printableErrors); - - for (var i = 0; i < printableErrors.length; i++) { - _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.error(printableErrors[i]); - } - - var needShowOverlayForErrors = typeof options.overlay === "boolean" ? options.overlay : options.overlay && options.overlay.errors; - - if (needShowOverlayForErrors) { - var trustedTypesPolicyName = typeof options.overlay === "object" && options.overlay.trustedTypesPolicyName; - (0,_overlay_js__WEBPACK_IMPORTED_MODULE_4__.show)("error", _errors, trustedTypesPolicyName || null); - } - }, - - /** - * @param {Error} error - */ - error: function error(_error) { - _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.error(_error); - }, - close: function close() { - _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.info("Disconnected!"); - - if (options.overlay) { - (0,_overlay_js__WEBPACK_IMPORTED_MODULE_4__.hide)(); - } - - (0,_utils_sendMessage_js__WEBPACK_IMPORTED_MODULE_6__["default"])("Close"); - } -}; -var socketURL = (0,_utils_createSocketURL_js__WEBPACK_IMPORTED_MODULE_8__["default"])(parsedResourceQuery); -(0,_socket_js__WEBPACK_IMPORTED_MODULE_3__["default"])(socketURL, onSocketMessage, options.reconnect); - -/***/ }), - -/***/ "./node_modules/webpack-dev-server/client/modules/logger/index.js": -/*!************************************************************************!*\ - !*** ./node_modules/webpack-dev-server/client/modules/logger/index.js ***! - \************************************************************************/ -/***/ (function(__unused_webpack_module, exports) { - -/******/ (function() { // webpackBootstrap -/******/ "use strict"; -/******/ var __webpack_modules__ = ({ - -/***/ "./client-src/modules/logger/SyncBailHookFake.js": -/*!*******************************************************!*\ - !*** ./client-src/modules/logger/SyncBailHookFake.js ***! - \*******************************************************/ -/***/ (function(module) { - - -/** - * Client stub for tapable SyncBailHook - */ - -module.exports = function clientTapableSyncBailHook() { - return { - call: function call() {} - }; -}; - -/***/ }), - -/***/ "./node_modules/webpack/lib/logging/Logger.js": -/*!****************************************************!*\ - !*** ./node_modules/webpack/lib/logging/Logger.js ***! - \****************************************************/ -/***/ (function(__unused_webpack_module, exports) { - -/* - MIT License http://www.opensource.org/licenses/mit-license.php - Author Tobias Koppers @sokra -*/ - - -function _toConsumableArray(arr) { - return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); -} - -function _nonIterableSpread() { - throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); -} - -function _unsupportedIterableToArray(o, minLen) { - if (!o) return; - if (typeof o === "string") return _arrayLikeToArray(o, minLen); - var n = Object.prototype.toString.call(o).slice(8, -1); - if (n === "Object" && o.constructor) n = o.constructor.name; - if (n === "Map" || n === "Set") return Array.from(o); - if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); -} - -function _iterableToArray(iter) { - if (typeof (typeof Symbol !== "undefined" ? Symbol : function (i) { return i; }) !== "undefined" && iter[(typeof Symbol !== "undefined" ? Symbol : function (i) { return i; }).iterator] != null || iter["@@iterator"] != null) return Array.from(iter); -} - -function _arrayWithoutHoles(arr) { - if (Array.isArray(arr)) return _arrayLikeToArray(arr); -} - -function _arrayLikeToArray(arr, len) { - if (len == null || len > arr.length) len = arr.length; - - for (var i = 0, arr2 = new Array(len); i < len; i++) { - arr2[i] = arr[i]; - } - - return arr2; -} - -function _classCallCheck(instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a function"); - } -} - -function _defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i]; - descriptor.enumerable = descriptor.enumerable || false; - descriptor.configurable = true; - if ("value" in descriptor) descriptor.writable = true; - Object.defineProperty(target, descriptor.key, descriptor); - } -} - -function _createClass(Constructor, protoProps, staticProps) { - if (protoProps) _defineProperties(Constructor.prototype, protoProps); - if (staticProps) _defineProperties(Constructor, staticProps); - Object.defineProperty(Constructor, "prototype", { - writable: false - }); - return Constructor; -} - -var LogType = Object.freeze({ - error: - /** @type {"error"} */ - "error", - // message, c style arguments - warn: - /** @type {"warn"} */ - "warn", - // message, c style arguments - info: - /** @type {"info"} */ - "info", - // message, c style arguments - log: - /** @type {"log"} */ - "log", - // message, c style arguments - debug: - /** @type {"debug"} */ - "debug", - // message, c style arguments - trace: - /** @type {"trace"} */ - "trace", - // no arguments - group: - /** @type {"group"} */ - "group", - // [label] - groupCollapsed: - /** @type {"groupCollapsed"} */ - "groupCollapsed", - // [label] - groupEnd: - /** @type {"groupEnd"} */ - "groupEnd", - // [label] - profile: - /** @type {"profile"} */ - "profile", - // [profileName] - profileEnd: - /** @type {"profileEnd"} */ - "profileEnd", - // [profileName] - time: - /** @type {"time"} */ - "time", - // name, time as [seconds, nanoseconds] - clear: - /** @type {"clear"} */ - "clear", - // no arguments - status: - /** @type {"status"} */ - "status" // message, arguments - -}); -exports.LogType = LogType; -/** @typedef {typeof LogType[keyof typeof LogType]} LogTypeEnum */ - -var LOG_SYMBOL = (typeof Symbol !== "undefined" ? Symbol : function (i) { return i; })("webpack logger raw log method"); -var TIMERS_SYMBOL = (typeof Symbol !== "undefined" ? Symbol : function (i) { return i; })("webpack logger times"); -var TIMERS_AGGREGATES_SYMBOL = (typeof Symbol !== "undefined" ? Symbol : function (i) { return i; })("webpack logger aggregated times"); - -var WebpackLogger = /*#__PURE__*/function () { - /** - * @param {function(LogTypeEnum, any[]=): void} log log function - * @param {function(string | function(): string): WebpackLogger} getChildLogger function to create child logger - */ - function WebpackLogger(log, getChildLogger) { - _classCallCheck(this, WebpackLogger); - - this[LOG_SYMBOL] = log; - this.getChildLogger = getChildLogger; - } - - _createClass(WebpackLogger, [{ - key: "error", - value: function error() { - for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { - args[_key] = arguments[_key]; - } - - this[LOG_SYMBOL](LogType.error, args); - } - }, { - key: "warn", - value: function warn() { - for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { - args[_key2] = arguments[_key2]; - } - - this[LOG_SYMBOL](LogType.warn, args); - } - }, { - key: "info", - value: function info() { - for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) { - args[_key3] = arguments[_key3]; - } - - this[LOG_SYMBOL](LogType.info, args); - } - }, { - key: "log", - value: function log() { - for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) { - args[_key4] = arguments[_key4]; - } - - this[LOG_SYMBOL](LogType.log, args); - } - }, { - key: "debug", - value: function debug() { - for (var _len5 = arguments.length, args = new Array(_len5), _key5 = 0; _key5 < _len5; _key5++) { - args[_key5] = arguments[_key5]; - } - - this[LOG_SYMBOL](LogType.debug, args); - } - }, { - key: "assert", - value: function assert(assertion) { - if (!assertion) { - for (var _len6 = arguments.length, args = new Array(_len6 > 1 ? _len6 - 1 : 0), _key6 = 1; _key6 < _len6; _key6++) { - args[_key6 - 1] = arguments[_key6]; - } - - this[LOG_SYMBOL](LogType.error, args); - } - } - }, { - key: "trace", - value: function trace() { - this[LOG_SYMBOL](LogType.trace, ["Trace"]); - } - }, { - key: "clear", - value: function clear() { - this[LOG_SYMBOL](LogType.clear); - } - }, { - key: "status", - value: function status() { - for (var _len7 = arguments.length, args = new Array(_len7), _key7 = 0; _key7 < _len7; _key7++) { - args[_key7] = arguments[_key7]; - } - - this[LOG_SYMBOL](LogType.status, args); - } - }, { - key: "group", - value: function group() { - for (var _len8 = arguments.length, args = new Array(_len8), _key8 = 0; _key8 < _len8; _key8++) { - args[_key8] = arguments[_key8]; - } - - this[LOG_SYMBOL](LogType.group, args); - } - }, { - key: "groupCollapsed", - value: function groupCollapsed() { - for (var _len9 = arguments.length, args = new Array(_len9), _key9 = 0; _key9 < _len9; _key9++) { - args[_key9] = arguments[_key9]; - } - - this[LOG_SYMBOL](LogType.groupCollapsed, args); - } - }, { - key: "groupEnd", - value: function groupEnd() { - for (var _len10 = arguments.length, args = new Array(_len10), _key10 = 0; _key10 < _len10; _key10++) { - args[_key10] = arguments[_key10]; - } - - this[LOG_SYMBOL](LogType.groupEnd, args); - } - }, { - key: "profile", - value: function profile(label) { - this[LOG_SYMBOL](LogType.profile, [label]); - } - }, { - key: "profileEnd", - value: function profileEnd(label) { - this[LOG_SYMBOL](LogType.profileEnd, [label]); - } - }, { - key: "time", - value: function time(label) { - this[TIMERS_SYMBOL] = this[TIMERS_SYMBOL] || new Map(); - this[TIMERS_SYMBOL].set(label, process.hrtime()); - } - }, { - key: "timeLog", - value: function timeLog(label) { - var prev = this[TIMERS_SYMBOL] && this[TIMERS_SYMBOL].get(label); - - if (!prev) { - throw new Error("No such label '".concat(label, "' for WebpackLogger.timeLog()")); - } - - var time = process.hrtime(prev); - this[LOG_SYMBOL](LogType.time, [label].concat(_toConsumableArray(time))); - } - }, { - key: "timeEnd", - value: function timeEnd(label) { - var prev = this[TIMERS_SYMBOL] && this[TIMERS_SYMBOL].get(label); - - if (!prev) { - throw new Error("No such label '".concat(label, "' for WebpackLogger.timeEnd()")); - } - - var time = process.hrtime(prev); - this[TIMERS_SYMBOL].delete(label); - this[LOG_SYMBOL](LogType.time, [label].concat(_toConsumableArray(time))); - } - }, { - key: "timeAggregate", - value: function timeAggregate(label) { - var prev = this[TIMERS_SYMBOL] && this[TIMERS_SYMBOL].get(label); - - if (!prev) { - throw new Error("No such label '".concat(label, "' for WebpackLogger.timeAggregate()")); - } - - var time = process.hrtime(prev); - this[TIMERS_SYMBOL].delete(label); - this[TIMERS_AGGREGATES_SYMBOL] = this[TIMERS_AGGREGATES_SYMBOL] || new Map(); - var current = this[TIMERS_AGGREGATES_SYMBOL].get(label); - - if (current !== undefined) { - if (time[1] + current[1] > 1e9) { - time[0] += current[0] + 1; - time[1] = time[1] - 1e9 + current[1]; - } else { - time[0] += current[0]; - time[1] += current[1]; - } - } - - this[TIMERS_AGGREGATES_SYMBOL].set(label, time); - } - }, { - key: "timeAggregateEnd", - value: function timeAggregateEnd(label) { - if (this[TIMERS_AGGREGATES_SYMBOL] === undefined) return; - var time = this[TIMERS_AGGREGATES_SYMBOL].get(label); - if (time === undefined) return; - this[TIMERS_AGGREGATES_SYMBOL].delete(label); - this[LOG_SYMBOL](LogType.time, [label].concat(_toConsumableArray(time))); - } - }]); - - return WebpackLogger; -}(); - -exports.Logger = WebpackLogger; - -/***/ }), - -/***/ "./node_modules/webpack/lib/logging/createConsoleLogger.js": -/*!*****************************************************************!*\ - !*** ./node_modules/webpack/lib/logging/createConsoleLogger.js ***! - \*****************************************************************/ -/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_10785__) { - -/* - MIT License http://www.opensource.org/licenses/mit-license.php - Author Tobias Koppers @sokra -*/ - - -function _toConsumableArray(arr) { - return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); -} - -function _nonIterableSpread() { - throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); -} - -function _unsupportedIterableToArray(o, minLen) { - if (!o) return; - if (typeof o === "string") return _arrayLikeToArray(o, minLen); - var n = Object.prototype.toString.call(o).slice(8, -1); - if (n === "Object" && o.constructor) n = o.constructor.name; - if (n === "Map" || n === "Set") return Array.from(o); - if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); -} - -function _iterableToArray(iter) { - if (typeof (typeof Symbol !== "undefined" ? Symbol : function (i) { return i; }) !== "undefined" && iter[(typeof Symbol !== "undefined" ? Symbol : function (i) { return i; }).iterator] != null || iter["@@iterator"] != null) return Array.from(iter); -} - -function _arrayWithoutHoles(arr) { - if (Array.isArray(arr)) return _arrayLikeToArray(arr); -} - -function _arrayLikeToArray(arr, len) { - if (len == null || len > arr.length) len = arr.length; - - for (var i = 0, arr2 = new Array(len); i < len; i++) { - arr2[i] = arr[i]; - } - - return arr2; -} - -var _require = __nested_webpack_require_10785__(/*! ./Logger */ "./node_modules/webpack/lib/logging/Logger.js"), - LogType = _require.LogType; -/** @typedef {import("../../declarations/WebpackOptions").FilterItemTypes} FilterItemTypes */ - -/** @typedef {import("../../declarations/WebpackOptions").FilterTypes} FilterTypes */ - -/** @typedef {import("./Logger").LogTypeEnum} LogTypeEnum */ - -/** @typedef {function(string): boolean} FilterFunction */ - -/** - * @typedef {Object} LoggerConsole - * @property {function(): void} clear - * @property {function(): void} trace - * @property {(...args: any[]) => void} info - * @property {(...args: any[]) => void} log - * @property {(...args: any[]) => void} warn - * @property {(...args: any[]) => void} error - * @property {(...args: any[]) => void=} debug - * @property {(...args: any[]) => void=} group - * @property {(...args: any[]) => void=} groupCollapsed - * @property {(...args: any[]) => void=} groupEnd - * @property {(...args: any[]) => void=} status - * @property {(...args: any[]) => void=} profile - * @property {(...args: any[]) => void=} profileEnd - * @property {(...args: any[]) => void=} logTime - */ - -/** - * @typedef {Object} LoggerOptions - * @property {false|true|"none"|"error"|"warn"|"info"|"log"|"verbose"} level loglevel - * @property {FilterTypes|boolean} debug filter for debug logging - * @property {LoggerConsole} console the console to log to - */ - -/** - * @param {FilterItemTypes} item an input item - * @returns {FilterFunction} filter function - */ - - -var filterToFunction = function filterToFunction(item) { - if (typeof item === "string") { - var regExp = new RegExp("[\\\\/]".concat(item.replace( // eslint-disable-next-line no-useless-escape - /[-[\]{}()*+?.\\^$|]/g, "\\$&"), "([\\\\/]|$|!|\\?)")); - return function (ident) { - return regExp.test(ident); - }; - } - - if (item && typeof item === "object" && typeof item.test === "function") { - return function (ident) { - return item.test(ident); - }; - } - - if (typeof item === "function") { - return item; - } - - if (typeof item === "boolean") { - return function () { - return item; - }; - } -}; -/** - * @enum {number} - */ - - -var LogLevel = { - none: 6, - false: 6, - error: 5, - warn: 4, - info: 3, - log: 2, - true: 2, - verbose: 1 -}; -/** - * @param {LoggerOptions} options options object - * @returns {function(string, LogTypeEnum, any[]): void} logging function - */ - -module.exports = function (_ref) { - var _ref$level = _ref.level, - level = _ref$level === void 0 ? "info" : _ref$level, - _ref$debug = _ref.debug, - debug = _ref$debug === void 0 ? false : _ref$debug, - console = _ref.console; - var debugFilters = typeof debug === "boolean" ? [function () { - return debug; - }] : - /** @type {FilterItemTypes[]} */ - [].concat(debug).map(filterToFunction); - /** @type {number} */ - - var loglevel = LogLevel["".concat(level)] || 0; - /** - * @param {string} name name of the logger - * @param {LogTypeEnum} type type of the log entry - * @param {any[]} args arguments of the log entry - * @returns {void} - */ - - var logger = function logger(name, type, args) { - var labeledArgs = function labeledArgs() { - if (Array.isArray(args)) { - if (args.length > 0 && typeof args[0] === "string") { - return ["[".concat(name, "] ").concat(args[0])].concat(_toConsumableArray(args.slice(1))); - } else { - return ["[".concat(name, "]")].concat(_toConsumableArray(args)); - } - } else { - return []; - } - }; - - var debug = debugFilters.some(function (f) { - return f(name); - }); - - switch (type) { - case LogType.debug: - if (!debug) return; // eslint-disable-next-line node/no-unsupported-features/node-builtins - - if (typeof console.debug === "function") { - // eslint-disable-next-line node/no-unsupported-features/node-builtins - console.debug.apply(console, _toConsumableArray(labeledArgs())); - } else { - console.log.apply(console, _toConsumableArray(labeledArgs())); - } - - break; - - case LogType.log: - if (!debug && loglevel > LogLevel.log) return; - console.log.apply(console, _toConsumableArray(labeledArgs())); - break; - - case LogType.info: - if (!debug && loglevel > LogLevel.info) return; - console.info.apply(console, _toConsumableArray(labeledArgs())); - break; - - case LogType.warn: - if (!debug && loglevel > LogLevel.warn) return; - console.warn.apply(console, _toConsumableArray(labeledArgs())); - break; - - case LogType.error: - if (!debug && loglevel > LogLevel.error) return; - console.error.apply(console, _toConsumableArray(labeledArgs())); - break; - - case LogType.trace: - if (!debug) return; - console.trace(); - break; - - case LogType.groupCollapsed: - if (!debug && loglevel > LogLevel.log) return; - - if (!debug && loglevel > LogLevel.verbose) { - // eslint-disable-next-line node/no-unsupported-features/node-builtins - if (typeof console.groupCollapsed === "function") { - // eslint-disable-next-line node/no-unsupported-features/node-builtins - console.groupCollapsed.apply(console, _toConsumableArray(labeledArgs())); - } else { - console.log.apply(console, _toConsumableArray(labeledArgs())); - } - - break; - } - - // falls through - - case LogType.group: - if (!debug && loglevel > LogLevel.log) return; // eslint-disable-next-line node/no-unsupported-features/node-builtins - - if (typeof console.group === "function") { - // eslint-disable-next-line node/no-unsupported-features/node-builtins - console.group.apply(console, _toConsumableArray(labeledArgs())); - } else { - console.log.apply(console, _toConsumableArray(labeledArgs())); - } - - break; - - case LogType.groupEnd: - if (!debug && loglevel > LogLevel.log) return; // eslint-disable-next-line node/no-unsupported-features/node-builtins - - if (typeof console.groupEnd === "function") { - // eslint-disable-next-line node/no-unsupported-features/node-builtins - console.groupEnd(); - } - - break; - - case LogType.time: - { - if (!debug && loglevel > LogLevel.log) return; - var ms = args[1] * 1000 + args[2] / 1000000; - var msg = "[".concat(name, "] ").concat(args[0], ": ").concat(ms, " ms"); - - if (typeof console.logTime === "function") { - console.logTime(msg); - } else { - console.log(msg); - } - - break; - } - - case LogType.profile: - // eslint-disable-next-line node/no-unsupported-features/node-builtins - if (typeof console.profile === "function") { - // eslint-disable-next-line node/no-unsupported-features/node-builtins - console.profile.apply(console, _toConsumableArray(labeledArgs())); - } - - break; - - case LogType.profileEnd: - // eslint-disable-next-line node/no-unsupported-features/node-builtins - if (typeof console.profileEnd === "function") { - // eslint-disable-next-line node/no-unsupported-features/node-builtins - console.profileEnd.apply(console, _toConsumableArray(labeledArgs())); - } - - break; - - case LogType.clear: - if (!debug && loglevel > LogLevel.log) return; // eslint-disable-next-line node/no-unsupported-features/node-builtins - - if (typeof console.clear === "function") { - // eslint-disable-next-line node/no-unsupported-features/node-builtins - console.clear(); - } - - break; - - case LogType.status: - if (!debug && loglevel > LogLevel.info) return; - - if (typeof console.status === "function") { - if (args.length === 0) { - console.status(); - } else { - console.status.apply(console, _toConsumableArray(labeledArgs())); - } - } else { - if (args.length !== 0) { - console.info.apply(console, _toConsumableArray(labeledArgs())); - } - } - - break; - - default: - throw new Error("Unexpected LogType ".concat(type)); - } - }; - - return logger; -}; - -/***/ }), - -/***/ "./node_modules/webpack/lib/logging/runtime.js": -/*!*****************************************************!*\ - !*** ./node_modules/webpack/lib/logging/runtime.js ***! - \*****************************************************/ -/***/ (function(__unused_webpack_module, exports, __nested_webpack_require_20872__) { - -/* - MIT License http://www.opensource.org/licenses/mit-license.php - Author Tobias Koppers @sokra -*/ - - -function _extends() { - _extends = Object.assign ? Object.assign.bind() : function (target) { - for (var i = 1; i < arguments.length; i++) { - var source = arguments[i]; - - for (var key in source) { - if (Object.prototype.hasOwnProperty.call(source, key)) { - target[key] = source[key]; - } - } - } - - return target; - }; - return _extends.apply(this, arguments); -} - -var SyncBailHook = __nested_webpack_require_20872__(/*! tapable/lib/SyncBailHook */ "./client-src/modules/logger/SyncBailHookFake.js"); - -var _require = __nested_webpack_require_20872__(/*! ./Logger */ "./node_modules/webpack/lib/logging/Logger.js"), - Logger = _require.Logger; - -var createConsoleLogger = __nested_webpack_require_20872__(/*! ./createConsoleLogger */ "./node_modules/webpack/lib/logging/createConsoleLogger.js"); -/** @type {createConsoleLogger.LoggerOptions} */ - - -var currentDefaultLoggerOptions = { - level: "info", - debug: false, - console: console -}; -var currentDefaultLogger = createConsoleLogger(currentDefaultLoggerOptions); -/** - * @param {string} name name of the logger - * @returns {Logger} a logger - */ - -exports.getLogger = function (name) { - return new Logger(function (type, args) { - if (exports.hooks.log.call(name, type, args) === undefined) { - currentDefaultLogger(name, type, args); - } - }, function (childName) { - return exports.getLogger("".concat(name, "/").concat(childName)); - }); -}; -/** - * @param {createConsoleLogger.LoggerOptions} options new options, merge with old options - * @returns {void} - */ - - -exports.configureDefaultLogger = function (options) { - _extends(currentDefaultLoggerOptions, options); - - currentDefaultLogger = createConsoleLogger(currentDefaultLoggerOptions); -}; - -exports.hooks = { - log: new SyncBailHook(["origin", "type", "args"]) -}; - -/***/ }) - -/******/ }); -/************************************************************************/ -/******/ // The module cache -/******/ var __webpack_module_cache__ = {}; -/******/ -/******/ // The require function -/******/ function __nested_webpack_require_23009__(moduleId) { -/******/ // Check if module is in cache -/******/ var cachedModule = __webpack_module_cache__[moduleId]; -/******/ if (cachedModule !== undefined) { -/******/ return cachedModule.exports; -/******/ } -/******/ // Create a new module (and put it into the cache) -/******/ var module = __webpack_module_cache__[moduleId] = { -/******/ // no module.id needed -/******/ // no module.loaded needed -/******/ exports: {} -/******/ }; -/******/ -/******/ // Execute the module function -/******/ __webpack_modules__[moduleId](module, module.exports, __nested_webpack_require_23009__); -/******/ -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } -/******/ -/************************************************************************/ -/******/ /* webpack/runtime/define property getters */ -/******/ !function() { -/******/ // define getter functions for harmony exports -/******/ __nested_webpack_require_23009__.d = function(exports, definition) { -/******/ for(var key in definition) { -/******/ if(__nested_webpack_require_23009__.o(definition, key) && !__nested_webpack_require_23009__.o(exports, key)) { -/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); -/******/ } -/******/ } -/******/ }; -/******/ }(); -/******/ -/******/ /* webpack/runtime/hasOwnProperty shorthand */ -/******/ !function() { -/******/ __nested_webpack_require_23009__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); } -/******/ }(); -/******/ -/******/ /* webpack/runtime/make namespace object */ -/******/ !function() { -/******/ // define __esModule on exports -/******/ __nested_webpack_require_23009__.r = function(exports) { -/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { -/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); -/******/ } -/******/ Object.defineProperty(exports, '__esModule', { value: true }); -/******/ }; -/******/ }(); -/******/ -/************************************************************************/ -var __webpack_exports__ = {}; -// This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk. -!function() { -/*!********************************************!*\ - !*** ./client-src/modules/logger/index.js ***! - \********************************************/ -__nested_webpack_require_23009__.r(__webpack_exports__); -/* harmony export */ __nested_webpack_require_23009__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* reexport default export from named module */ webpack_lib_logging_runtime_js__WEBPACK_IMPORTED_MODULE_0__; } -/* harmony export */ }); -/* harmony import */ var webpack_lib_logging_runtime_js__WEBPACK_IMPORTED_MODULE_0__ = __nested_webpack_require_23009__(/*! webpack/lib/logging/runtime.js */ "./node_modules/webpack/lib/logging/runtime.js"); - -}(); -var __webpack_export_target__ = exports; -for(var i in __webpack_exports__) __webpack_export_target__[i] = __webpack_exports__[i]; -if(__webpack_exports__.__esModule) Object.defineProperty(__webpack_export_target__, "__esModule", { value: true }); -/******/ })() -; - -/***/ }), - -/***/ "./node_modules/webpack-dev-server/client/overlay.js": -/*!***********************************************************!*\ - !*** ./node_modules/webpack-dev-server/client/overlay.js ***! - \***********************************************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "formatProblem": function() { return /* binding */ formatProblem; }, -/* harmony export */ "hide": function() { return /* binding */ hide; }, -/* harmony export */ "show": function() { return /* binding */ show; } -/* harmony export */ }); -/* harmony import */ var ansi_html_community__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ansi-html-community */ "./node_modules/ansi-html-community/index.js"); -/* harmony import */ var ansi_html_community__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(ansi_html_community__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var html_entities__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! html-entities */ "./node_modules/html-entities/lib/index.js"); -/* harmony import */ var html_entities__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(html_entities__WEBPACK_IMPORTED_MODULE_1__); -// The error overlay is inspired (and mostly copied) from Create React App (https://github.com/facebookincubator/create-react-app) -// They, in turn, got inspired by webpack-hot-middleware (https://github.com/glenjamin/webpack-hot-middleware). - - -var colors = { - reset: ["transparent", "transparent"], - black: "181818", - red: "E36049", - green: "B3CB74", - yellow: "FFD080", - blue: "7CAFC2", - magenta: "7FACCA", - cyan: "C3C2EF", - lightgrey: "EBE7E3", - darkgrey: "6D7891" -}; -/** @type {HTMLIFrameElement | null | undefined} */ - -var iframeContainerElement; -/** @type {HTMLDivElement | null | undefined} */ - -var containerElement; -/** @type {Array<(element: HTMLDivElement) => void>} */ - -var onLoadQueue = []; -/** @type {TrustedTypePolicy | undefined} */ - -var overlayTrustedTypesPolicy; -ansi_html_community__WEBPACK_IMPORTED_MODULE_0___default().setColors(colors); -/** - * @param {string | null} trustedTypesPolicyName - */ - -function createContainer(trustedTypesPolicyName) { - // Enable Trusted Types if they are available in the current browser. - if (window.trustedTypes) { - overlayTrustedTypesPolicy = window.trustedTypes.createPolicy(trustedTypesPolicyName || "webpack-dev-server#overlay", { - createHTML: function createHTML(value) { - return value; - } - }); - } - - iframeContainerElement = document.createElement("iframe"); - iframeContainerElement.id = "webpack-dev-server-client-overlay"; - iframeContainerElement.src = "about:blank"; - iframeContainerElement.style.position = "fixed"; - iframeContainerElement.style.left = 0; - iframeContainerElement.style.top = 0; - iframeContainerElement.style.right = 0; - iframeContainerElement.style.bottom = 0; - iframeContainerElement.style.width = "100vw"; - iframeContainerElement.style.height = "100vh"; - iframeContainerElement.style.border = "none"; - iframeContainerElement.style.zIndex = 9999999999; - - iframeContainerElement.onload = function () { - containerElement = - /** @type {Document} */ - - /** @type {HTMLIFrameElement} */ - iframeContainerElement.contentDocument.createElement("div"); - containerElement.id = "webpack-dev-server-client-overlay-div"; - containerElement.style.position = "fixed"; - containerElement.style.boxSizing = "border-box"; - containerElement.style.left = 0; - containerElement.style.top = 0; - containerElement.style.right = 0; - containerElement.style.bottom = 0; - containerElement.style.width = "100vw"; - containerElement.style.height = "100vh"; - containerElement.style.backgroundColor = "rgba(0, 0, 0, 0.85)"; - containerElement.style.color = "#E8E8E8"; - containerElement.style.fontFamily = "Menlo, Consolas, monospace"; - containerElement.style.fontSize = "large"; - containerElement.style.padding = "2rem"; - containerElement.style.lineHeight = "1.2"; - containerElement.style.whiteSpace = "pre-wrap"; - containerElement.style.overflow = "auto"; - var headerElement = document.createElement("span"); - headerElement.innerText = "Compiled with problems:"; - var closeButtonElement = document.createElement("button"); - closeButtonElement.innerText = "X"; - closeButtonElement.style.background = "transparent"; - closeButtonElement.style.border = "none"; - closeButtonElement.style.fontSize = "20px"; - closeButtonElement.style.fontWeight = "bold"; - closeButtonElement.style.color = "white"; - closeButtonElement.style.cursor = "pointer"; - closeButtonElement.style.cssFloat = "right"; // @ts-ignore - - closeButtonElement.style.styleFloat = "right"; - closeButtonElement.addEventListener("click", function () { - hide(); - }); - containerElement.appendChild(headerElement); - containerElement.appendChild(closeButtonElement); - containerElement.appendChild(document.createElement("br")); - containerElement.appendChild(document.createElement("br")); - /** @type {Document} */ - - /** @type {HTMLIFrameElement} */ - iframeContainerElement.contentDocument.body.appendChild(containerElement); - onLoadQueue.forEach(function (onLoad) { - onLoad( - /** @type {HTMLDivElement} */ - containerElement); - }); - onLoadQueue = []; - /** @type {HTMLIFrameElement} */ - - iframeContainerElement.onload = null; - }; - - document.body.appendChild(iframeContainerElement); -} -/** - * @param {(element: HTMLDivElement) => void} callback - * @param {string | null} trustedTypesPolicyName - */ - - -function ensureOverlayExists(callback, trustedTypesPolicyName) { - if (containerElement) { - // Everything is ready, call the callback right away. - callback(containerElement); - return; - } - - onLoadQueue.push(callback); - - if (iframeContainerElement) { - return; - } - - createContainer(trustedTypesPolicyName); -} // Successful compilation. - - -function hide() { - if (!iframeContainerElement) { - return; - } // Clean up and reset internal state. - - - document.body.removeChild(iframeContainerElement); - iframeContainerElement = null; - containerElement = null; -} -/** - * @param {string} type - * @param {string | { file?: string, moduleName?: string, loc?: string, message?: string }} item - * @returns {{ header: string, body: string }} - */ - - -function formatProblem(type, item) { - var header = type === "warning" ? "WARNING" : "ERROR"; - var body = ""; - - if (typeof item === "string") { - body += item; - } else { - var file = item.file || ""; // eslint-disable-next-line no-nested-ternary - - var moduleName = item.moduleName ? item.moduleName.indexOf("!") !== -1 ? "".concat(item.moduleName.replace(/^(\s|\S)*!/, ""), " (").concat(item.moduleName, ")") : "".concat(item.moduleName) : ""; - var loc = item.loc; - header += "".concat(moduleName || file ? " in ".concat(moduleName ? "".concat(moduleName).concat(file ? " (".concat(file, ")") : "") : file).concat(loc ? " ".concat(loc) : "") : ""); - body += item.message || ""; - } - - return { - header: header, - body: body - }; -} // Compilation with errors (e.g. syntax error or missing modules). - -/** - * @param {string} type - * @param {Array} messages - * @param {string | null} trustedTypesPolicyName - */ - - -function show(type, messages, trustedTypesPolicyName) { - ensureOverlayExists(function () { - messages.forEach(function (message) { - var entryElement = document.createElement("div"); - var typeElement = document.createElement("span"); - - var _formatProblem = formatProblem(type, message), - header = _formatProblem.header, - body = _formatProblem.body; - - typeElement.innerText = header; - typeElement.style.color = "#".concat(colors.red); // Make it look similar to our terminal. - - var text = ansi_html_community__WEBPACK_IMPORTED_MODULE_0___default()((0,html_entities__WEBPACK_IMPORTED_MODULE_1__.encode)(body)); - var messageTextNode = document.createElement("div"); - messageTextNode.innerHTML = overlayTrustedTypesPolicy ? overlayTrustedTypesPolicy.createHTML(text) : text; - entryElement.appendChild(typeElement); - entryElement.appendChild(document.createElement("br")); - entryElement.appendChild(document.createElement("br")); - entryElement.appendChild(messageTextNode); - entryElement.appendChild(document.createElement("br")); - entryElement.appendChild(document.createElement("br")); - /** @type {HTMLDivElement} */ - - containerElement.appendChild(entryElement); - }); - }, trustedTypesPolicyName); -} - - - -/***/ }), - -/***/ "./node_modules/webpack-dev-server/client/socket.js": -/*!**********************************************************!*\ - !*** ./node_modules/webpack-dev-server/client/socket.js ***! - \**********************************************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "client": function() { return /* binding */ client; } -/* harmony export */ }); -/* harmony import */ var _clients_WebSocketClient_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./clients/WebSocketClient.js */ "./node_modules/webpack-dev-server/client/clients/WebSocketClient.js"); -/* harmony import */ var _utils_log_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils/log.js */ "./node_modules/webpack-dev-server/client/utils/log.js"); -/* provided dependency */ var __webpack_dev_server_client__ = __webpack_require__(/*! ./node_modules/webpack-dev-server/client/clients/WebSocketClient.js */ "./node_modules/webpack-dev-server/client/clients/WebSocketClient.js"); -/* global __webpack_dev_server_client__ */ - - // this WebsocketClient is here as a default fallback, in case the client is not injected - -/* eslint-disable camelcase */ - -var Client = // eslint-disable-next-line no-nested-ternary -typeof __webpack_dev_server_client__ !== "undefined" ? typeof __webpack_dev_server_client__.default !== "undefined" ? __webpack_dev_server_client__.default : __webpack_dev_server_client__ : _clients_WebSocketClient_js__WEBPACK_IMPORTED_MODULE_0__["default"]; -/* eslint-enable camelcase */ - -var retries = 0; -var maxRetries = 10; // Initialized client is exported so external consumers can utilize the same instance -// It is mutable to enforce singleton -// eslint-disable-next-line import/no-mutable-exports - -var client = null; -/** - * @param {string} url - * @param {{ [handler: string]: (data?: any, params?: any) => any }} handlers - * @param {number} [reconnect] - */ - -var socket = function initSocket(url, handlers, reconnect) { - client = new Client(url); - client.onOpen(function () { - retries = 0; - - if (typeof reconnect !== "undefined") { - maxRetries = reconnect; - } - }); - client.onClose(function () { - if (retries === 0) { - handlers.close(); - } // Try to reconnect. - - - client = null; // After 10 retries stop trying, to prevent logspam. - - if (retries < maxRetries) { - // Exponentially increase timeout to reconnect. - // Respectfully copied from the package `got`. - // eslint-disable-next-line no-restricted-properties - var retryInMs = 1000 * Math.pow(2, retries) + Math.random() * 100; - retries += 1; - _utils_log_js__WEBPACK_IMPORTED_MODULE_1__.log.info("Trying to reconnect..."); - setTimeout(function () { - socket(url, handlers, reconnect); - }, retryInMs); - } - }); - client.onMessage( - /** - * @param {any} data - */ - function (data) { - var message = JSON.parse(data); - - if (handlers[message.type]) { - handlers[message.type](message.data, message.params); - } - }); -}; - -/* harmony default export */ __webpack_exports__["default"] = (socket); - -/***/ }), - -/***/ "./node_modules/webpack-dev-server/client/utils/createSocketURL.js": -/*!*************************************************************************!*\ - !*** ./node_modules/webpack-dev-server/client/utils/createSocketURL.js ***! - \*************************************************************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/** - * @param {{ protocol?: string, auth?: string, hostname?: string, port?: string, pathname?: string, search?: string, hash?: string, slashes?: boolean }} objURL - * @returns {string} - */ -function format(objURL) { - var protocol = objURL.protocol || ""; - - if (protocol && protocol.substr(-1) !== ":") { - protocol += ":"; - } - - var auth = objURL.auth || ""; - - if (auth) { - auth = encodeURIComponent(auth); - auth = auth.replace(/%3A/i, ":"); - auth += "@"; - } - - var host = ""; - - if (objURL.hostname) { - host = auth + (objURL.hostname.indexOf(":") === -1 ? objURL.hostname : "[".concat(objURL.hostname, "]")); - - if (objURL.port) { - host += ":".concat(objURL.port); - } - } - - var pathname = objURL.pathname || ""; - - if (objURL.slashes) { - host = "//".concat(host || ""); - - if (pathname && pathname.charAt(0) !== "/") { - pathname = "/".concat(pathname); - } - } else if (!host) { - host = ""; - } - - var search = objURL.search || ""; - - if (search && search.charAt(0) !== "?") { - search = "?".concat(search); - } - - var hash = objURL.hash || ""; - - if (hash && hash.charAt(0) !== "#") { - hash = "#".concat(hash); - } - - pathname = pathname.replace(/[?#]/g, - /** - * @param {string} match - * @returns {string} - */ - function (match) { - return encodeURIComponent(match); - }); - search = search.replace("#", "%23"); - return "".concat(protocol).concat(host).concat(pathname).concat(search).concat(hash); -} -/** - * @param {URL & { fromCurrentScript?: boolean }} parsedURL - * @returns {string} - */ - - -function createSocketURL(parsedURL) { - var hostname = parsedURL.hostname; // Node.js module parses it as `::` - // `new URL(urlString, [baseURLString])` parses it as '[::]' - - var isInAddrAny = hostname === "0.0.0.0" || hostname === "::" || hostname === "[::]"; // why do we need this check? - // hostname n/a for file protocol (example, when using electron, ionic) - // see: https://github.com/webpack/webpack-dev-server/pull/384 - - if (isInAddrAny && self.location.hostname && self.location.protocol.indexOf("http") === 0) { - hostname = self.location.hostname; - } - - var socketURLProtocol = parsedURL.protocol || self.location.protocol; // When https is used in the app, secure web sockets are always necessary because the browser doesn't accept non-secure web sockets. - - if (socketURLProtocol === "auto:" || hostname && isInAddrAny && self.location.protocol === "https:") { - socketURLProtocol = self.location.protocol; - } - - socketURLProtocol = socketURLProtocol.replace(/^(?:http|.+-extension|file)/i, "ws"); - var socketURLAuth = ""; // `new URL(urlString, [baseURLstring])` doesn't have `auth` property - // Parse authentication credentials in case we need them - - if (parsedURL.username) { - socketURLAuth = parsedURL.username; // Since HTTP basic authentication does not allow empty username, - // we only include password if the username is not empty. - - if (parsedURL.password) { - // Result: : - socketURLAuth = socketURLAuth.concat(":", parsedURL.password); - } - } // In case the host is a raw IPv6 address, it can be enclosed in - // the brackets as the brackets are needed in the final URL string. - // Need to remove those as url.format blindly adds its own set of brackets - // if the host string contains colons. That would lead to non-working - // double brackets (e.g. [[::]]) host - // - // All of these web socket url params are optionally passed in through resourceQuery, - // so we need to fall back to the default if they are not provided - - - var socketURLHostname = (hostname || self.location.hostname || "localhost").replace(/^\[(.*)\]$/, "$1"); - var socketURLPort = parsedURL.port; - - if (!socketURLPort || socketURLPort === "0") { - socketURLPort = self.location.port; - } // If path is provided it'll be passed in via the resourceQuery as a - // query param so it has to be parsed out of the querystring in order for the - // client to open the socket to the correct location. - - - var socketURLPathname = "/ws"; - - if (parsedURL.pathname && !parsedURL.fromCurrentScript) { - socketURLPathname = parsedURL.pathname; - } - - return format({ - protocol: socketURLProtocol, - auth: socketURLAuth, - hostname: socketURLHostname, - port: socketURLPort, - pathname: socketURLPathname, - slashes: true - }); -} - -/* harmony default export */ __webpack_exports__["default"] = (createSocketURL); - -/***/ }), - -/***/ "./node_modules/webpack-dev-server/client/utils/getCurrentScriptSource.js": -/*!********************************************************************************!*\ - !*** ./node_modules/webpack-dev-server/client/utils/getCurrentScriptSource.js ***! - \********************************************************************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/** - * @returns {string} - */ -function getCurrentScriptSource() { - // `document.currentScript` is the most accurate way to find the current script, - // but is not supported in all browsers. - if (document.currentScript) { - return document.currentScript.getAttribute("src"); - } // Fallback to getting all scripts running in the document. - - - var scriptElements = document.scripts || []; - var scriptElementsWithSrc = Array.prototype.filter.call(scriptElements, function (element) { - return element.getAttribute("src"); - }); - - if (scriptElementsWithSrc.length > 0) { - var currentScript = scriptElementsWithSrc[scriptElementsWithSrc.length - 1]; - return currentScript.getAttribute("src"); - } // Fail as there was no script to use. - - - throw new Error("[webpack-dev-server] Failed to get current script source."); -} - -/* harmony default export */ __webpack_exports__["default"] = (getCurrentScriptSource); - -/***/ }), - -/***/ "./node_modules/webpack-dev-server/client/utils/log.js": -/*!*************************************************************!*\ - !*** ./node_modules/webpack-dev-server/client/utils/log.js ***! - \*************************************************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "log": function() { return /* binding */ log; }, -/* harmony export */ "setLogLevel": function() { return /* binding */ setLogLevel; } -/* harmony export */ }); -/* harmony import */ var _modules_logger_index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/logger/index.js */ "./node_modules/webpack-dev-server/client/modules/logger/index.js"); -/* harmony import */ var _modules_logger_index_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_modules_logger_index_js__WEBPACK_IMPORTED_MODULE_0__); - -var name = "webpack-dev-server"; // default level is set on the client side, so it does not need -// to be set by the CLI or API - -var defaultLevel = "info"; // options new options, merge with old options - -/** - * @param {false | true | "none" | "error" | "warn" | "info" | "log" | "verbose"} level - * @returns {void} - */ - -function setLogLevel(level) { - _modules_logger_index_js__WEBPACK_IMPORTED_MODULE_0___default().configureDefaultLogger({ - level: level - }); -} - -setLogLevel(defaultLevel); -var log = _modules_logger_index_js__WEBPACK_IMPORTED_MODULE_0___default().getLogger(name); - - -/***/ }), - -/***/ "./node_modules/webpack-dev-server/client/utils/parseURL.js": -/*!******************************************************************!*\ - !*** ./node_modules/webpack-dev-server/client/utils/parseURL.js ***! - \******************************************************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _getCurrentScriptSource_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getCurrentScriptSource.js */ "./node_modules/webpack-dev-server/client/utils/getCurrentScriptSource.js"); - -/** - * @param {string} resourceQuery - * @returns {{ [key: string]: string | boolean }} - */ - -function parseURL(resourceQuery) { - /** @type {{ [key: string]: string }} */ - var options = {}; - - if (typeof resourceQuery === "string" && resourceQuery !== "") { - var searchParams = resourceQuery.slice(1).split("&"); - - for (var i = 0; i < searchParams.length; i++) { - var pair = searchParams[i].split("="); - options[pair[0]] = decodeURIComponent(pair[1]); - } - } else { - // Else, get the url from the
Rotate Mode
R
RotateScale Mode
r
Scale Mode
s
Distort Mode
d
Drag Mode
D
Lock (Mode) / Unlock Image
l u
Stack up / down
q a
Add / Remove Image Border
b
Toggle Opacity
o
Deselect All
esc
Delete Image(s)
delete backspace
Export Image(s)
e
'),t.appendChild(i),t},this._keymapper.addTo(this._map)},_toggleKeymapper:function(t){t.preventDefault(),this._container.className="ldi-keymapper leaflet-control"===this._container.className?"ldi-keymapper-hide leaflet-control":"ldi-keymapper leaflet-control",this._scrollWrapper.style.display="none"===this._scrollWrapper.style.display?"block":"none",this._toggler.innerHTML="close"===this._toggler.innerHTML?L.IconUtil.create("keyboard_open"):"close",L.IconUtil.toggleTitle(this._toggler,"Show keymap","Hide keymap"),L.DomUtil.toggleClass(this._toggler,"close-icon")},_injectIconSet:function(){if(!document.querySelector("#keymapper-iconset")){var t=L.DomUtil.create("div","");t.id="keymapper-iconset",t.setAttribute("hidden","hidden"),this._iconset=(new L.KeymapperIconSet).render(),t.innerHTML=this._iconset,document.querySelector(".leaflet-control-container").appendChild(t)}}}),L.DistortableImage.Keymapper.addInitHook((function(){L.DistortableImage.Keymapper.prototype._n=L.DistortableImage.Keymapper.prototype._n?L.DistortableImage.Keymapper.prototype._n+1:1,1!==L.DistortableImage.Keymapper.prototype._n||L.Browser.mobile||(t.enable(),t._injectIconSet())})),L.distortableImage.keymapper=function(t,e){return new L.DistortableImage.Keymapper(t,e)}},428:function(){L.DistortableImage=L.DistortableImage||{},L.DistortableCollection.Edit=L.Handler.extend({options:{keymap:L.distortableImage.group_action_map},initialize:function(t,e){this._group=t,this._exportOpts=t.options.exportOpts,L.setOptions(this,e),L.distortableImage.group_action_map.Escape="_decollectAll"},addHooks:function(){var t=this._group._map;this.editActions=this.options.actions,this.runExporter=L.bind(L.Utils.getNestedVal(this,"_exportOpts","exporter")||this.startExport,this),L.DomEvent.on(document,"keydown",this._onKeyDown,this),t.doubleClickZoom.enabled()||t.doubleClickLabels.enabled()||L.DomEvent.on(t,"click",this._decollectAll,this),L.DomEvent.on(t,{singleclickon:this._singleClickListeners,singleclickoff:this._resetClickListeners,singleclick:this._singleClick,boxcollectend:this._addCollections},this),this._group.editable=!0,this._group.eachLayer((function(t){return t.editing.enable()}))},removeHooks:function(){var t=this._group._map;L.DomEvent.off(document,"keydown",this._onKeyDown,this),t.doubleClickZoom.enabled()||t.doubleClickLabels.enabled()||L.DomEvent.off(t,"click",this._decollectAll,this),L.DomEvent.off(t,{singleclickon:this._singleClickListeners,singleclickoff:this._resetClickListeners,singleclick:this._singleClick,boxcollectend:this._addCollections},this),this._decollectAll(),this._group.editable=!1,this._group.eachLayer((function(t){return t.editing.disable()}))},enable:function(){return this._enabled=!0,this.addHooks(),this},disable:function(){return this._enabled=!1,this.removeHooks(),this},_onKeyDown:function(t){var e=this.options.keymap[t.key];this[e]&&this._group.anyCollected()&&this[e].call(this)},_singleClick:function(t){"singleclick"===t.type&&this._decollectAll(t)},_singleClickListeners:function(){var t=this._group._map;L.DomEvent.off(t,"click",this._decollectAll,this),L.DomEvent.on(t,"singleclick",this._decollectAll,this)},_resetClickListeners:function(){var t=this._group._map;L.DomEvent.on(t,"click",this._decollectAll,this),L.DomEvent.off(t,"singleclick",this._decollectAll,this)},_decollectAll:function(t){var e;t&&(e=t.originalEvent),e&&(e.shiftKey||e.target instanceof HTMLImageElement)||(this._group.eachLayer((function(t){L.DomUtil.removeClass(t.getElement(),"collected"),t.deselect()})),this._removeToolbar(),t&&L.DomEvent.stopPropagation(t))},_unlockGroup:function(){var t=this;this.hasTool(L.UnlockAction)&&this._group.eachLayer((function(e){t._group.isCollected(e)&&(e.editing._unlock(),e.deselect())}))},_lockGroup:function(){var t=this;this.hasTool(L.LockAction)&&this._group.eachLayer((function(e){t._group.isCollected(e)&&(e.editing._lock(),L.DomUtil.addClass(e.getElement(),"collected"))}))},_addCollections:function(t){var e=this,i=t.boxCollectBounds,o=this._group._map;this._group.eachLayer((function(t){var n=t.editing;t.isSelected()&&t.deselect();var a=o.getZoom(),s=o.getCenter(),r=L.latLngBounds(t.getCorner(2),t.getCorner(1));r=o._latLngBoundsToNewLayerBounds(r,a,s),i.intersects(r)&&n.enabled()&&(e.toolbar||e._addToolbar(),L.DomUtil.addClass(t.getElement(),"collected"))}))},_removeGroup:function(t){var e=this;if(this.hasTool(L.DeleteAction)){var i=this._group._toRemove(),o=i.length;0!==o&&(L.DomUtil.confirmDeletes(o)&&(i.forEach((function(t){e._group.removeLayer(t)})),this._group.anyCollected()||this._removeToolbar()),t&&L.DomEvent.stopPropagation(t))}},cancelExport:function(){this.customCollection||(this._exportOpts.collection=void 0),clearInterval(this.updateInterval)},_addToolbar:function(){var t=this._group,e=t._map;t.options.suppressToolbar||this.toolbar||(this.toolbar=L.distortableImage.controlBar({actions:this.editActions,position:"topleft"}).addTo(e,t))},_removeToolbar:function(){var t=this._group._map;if(!this.toolbar)return!1;t.removeLayer(this.toolbar),this.toolbar=!1},hasTool:function(t){return this.editActions.some((function(e){return e===t}))},addTool:function(t){return"leaflet-toolbar-icon"!==t.baseClass||this.hasTool(t)||(this._removeToolbar(),this.editActions.push(t),this._addToolbar()),this},removeTool:function(t){var e=this;return this.editActions.some((function(i,o){return e.editActions[o]===t&&(e._removeToolbar(),e.editActions.splice(o,1),e._addToolbar(),!0)})),this},startExport:function(){var t=this;if(this.hasTool(L.ExportAction))return new Promise((function(e){var i,o=t._exportOpts;o.resolve=e,t.updateInterval=null,t.customCollection=!!o.collection,t.customCollection||(o.collection=t._group.generateExportJson().images),o.frequency=o.frequency||3e3,o.scale=o.scale||100,o.updater=o.updater||function(n){(n=JSON.parse(n)).status_url&&(i!==n.status_url&&n.status_url.match(".json")&&(i=n.status_url),"complete"===n.status&&(clearInterval(t.updateInterval),t.customCollection||(t._exportOpts.collection=void 0),e(),null!==n.jpg&&alert("Export succeeded. "+o.exportUrl+n.jpg)),console.log(n))},o.handleStatusRes=o.handleStatusRes||function(e){i=o.statusUrl+e,t.updateInterval=setInterval((function(){var t=new Request("".concat(i,"?").concat(Date.now()),{method:"GET"});fetch(t).then((function(t){if(t.ok)return t.text()})).then(o.updater)}),o.frequency)},o.fetchStatusUrl=o.fetchStatusUrl||function(t){var e=new FormData;e.append("collection",JSON.stringify(t.collection)),e.append("scale",t.scale),e.append("upload",!0);var i={method:"POST",body:e},o=new Request(t.exportStartUrl,i);fetch(o).then((function(t){if(t.ok)return t.text()})).then(t.handleStatusRes)},o.fetchStatusUrl(o)}))}}),L.distortableCollection.edit=function(t,e){return new L.DistortableCollection.Edit(t,e)}},397:function(){L.DistortableImage=L.DistortableImage||{},L.DistortableImage.Edit=L.Handler.extend({options:{opacity:.7,outline:"1px solid red",keymap:L.distortableImage.action_map},initialize:function(t,e){this._overlay=t,this._toggledImage=!1,this._mode=t.options.mode,this._transparent=!1,this._outlined=!1,L.setOptions(this,e),L.distortableImage.action_map.Escape="_deselect"},addHooks:function(){var t=this._overlay;this.editActions=this.options.actions,t.bringToFront(),this._initModes(),this._initHandles(),this._appendHandlesandDragable(),t.isSelected()&&!t.options.suppressToolbar&&this._addToolbar(),this.parentGroup=!!t.eP&&t.eP,L.DomEvent.on(t.getElement(),{dblclick:this.nextMode},this),L.DomEvent.on(window,"keydown",this._onKeyDown,this)},removeHooks:function(){var t=this._overlay,e=this.parentGroup;for(var i in this._disableDragging(),this.toolbar&&this._removeToolbar(),this._handles)L.DomUtil.remove(i);L.DomUtil.hasClass(t.getElement(),"collected")&&L.DomUtil.removeClass(t.getElement(),"collected"),e&&!e.anyCollected()&&e.editing.toolbar&&e.editing._removeToolbar(),L.DomEvent.off(t.getElement(),{dblclick:this.nextMode},this),L.DomEvent.off(window,"keydown",this._onKeyDown,this)},disable:function(){return this._enabled?(this._overlay.deselect(),this._enabled=!1,this.removeHooks(),this):this},_initModes:function(){for(var t in this._modes={},L.DistortableImage.Edit.MODES){var e=L.DistortableImage.Edit.MODES[t];-1!==this.editActions.indexOf(e)&&(this._modes[t]=e)}this._modes[this._mode]||(this._mode=Object.keys(this._modes)[0])},_initHandles:function(){var t,e=this._overlay;for(this._dragHandles=L.layerGroup(),t=0;t<4;t++)this._dragHandles.addLayer(L.dragHandle(e,t));for(this._scaleHandles=L.layerGroup(),t=0;t<4;t++)this._scaleHandles.addLayer(L.scaleHandle(e,t));for(this._distortHandles=L.layerGroup(),t=0;t<4;t++)this._distortHandles.addLayer(L.distortHandle(e,t));for(this._rotateHandles=L.layerGroup(),t=0;t<4;t++)this._rotateHandles.addLayer(L.rotateHandle(e,t));for(this._freeRotateHandles=L.layerGroup(),t=0;t<4;t++)this._freeRotateHandles.addLayer(L.freeRotateHandle(e,t));for(this._lockHandles=L.layerGroup(),t=0;t<4;t++)this._lockHandles.addLayer(L.lockHandle(e,t,{draggable:!1}));this._handles={drag:this._dragHandles,scale:this._scaleHandles,distort:this._distortHandles,rotate:this._rotateHandles,freeRotate:this._freeRotateHandles,lock:this._lockHandles}},_appendHandlesandDragable:function(){var t=this._overlay;this._mode?(this._updateHandle(),!t.isSelected()&&this.currentHandle&&this.currentHandle.eachLayer((function(t){t.setOpacity(0),t.dragging&&t.dragging.disable()})),this.isMode("lock")||this._enableDragging()):this._enableDragging()},_onKeyDown:function(t){var e=this.options.keymap[t.key],i=this._overlay,o=this.parentGroup;o&&o.anyCollected()||void 0===this[e]||i.options.suppressToolbar||i.isSelected()&&this.toolbar&&this[e].call(this)},replaceTool:function(t,e){var i=this;return"leaflet-toolbar-icon"!==e.baseClass||this.hasTool(e)||this.editActions.some((function(o,n){if(o===t){for(var a in i._removeToolbar(),i.editActions[n]=e,i._addToolbar(),L.DistortableImage.Edit.MODES)L.DistortableImage.Edit.MODES[a]===t?(delete i._modes[a],i._nextOrNone(a)):L.DistortableImage.Edit.MODES[a]===e&&(i._modes[a]=e);return!0}})),this},addTool:function(t){if("leaflet-toolbar-icon"===t.baseClass&&!this.hasTool(t)){for(var e in this._removeToolbar(),this.editActions.push(t),this._addToolbar(),L.DistortableImage.Edit.MODES)L.DistortableImage.Edit.MODES[e]===t&&(this._modes[e]=t);this._overlay.isSelected()||this._removeToolbar()}return this},hasTool:function(t){return this.editActions.some((function(e){return e===t}))},removeTool:function(t){var e=this;return this.editActions.some((function(i,o){if(i===t){for(var n in e._removeToolbar(),e.editActions.splice(o,1),e._addToolbar(),L.DistortableImage.Edit.MODES)L.DistortableImage.Edit.MODES[n]===t&&(delete e._modes[n],e._nextOrNone(n));return!0}})),this._overlay.isSelected()||this._removeToolbar(),this},_nextOrNone:function(t){this.isMode(t)&&(Object.keys(this.getModes()).length>=1?this.nextMode():("lock"===t&&this._enableDragging(),this._mode="",this._updateHandle()))},_removeToolbar:function(){var t=this._overlay._map;this.toolbar&&(t.removeLayer(this.toolbar),this.toolbar=!1)},_enableDragging:function(){var t=this,e=this._overlay,i=e._map;this.dragging=new L.Draggable(e.getElement()),this.dragging.enable(),this.dragging.on("dragstart",(function(){e.fire("dragstart"),t._removeToolbar()})),this.dragging._updatePosition=function(){var t,o,n=e.getCorner(0),a=this._newPos.subtract(i.latLngToLayerPoint(n)),s={};for(this.fire("predrag"),o=0;o<4;o++)t=i.latLngToLayerPoint(e.getCorner(o)),s[o]=i.layerPointToLatLng(t.add(a));e.setCorners(s),e.fire("drag"),this.fire("drag")},this.dragging.on("dragend",(function(){e.fire("dragend")}))},_disableDragging:function(){this.dragging&&(this.dragging.disable(),delete this.dragging)},_dragMode:function(){this.setMode("drag")},_scaleMode:function(){this.setMode("scale")},_distortMode:function(){this.setMode("distort")},_rotateMode:function(){this.setMode("rotate")},_freeRotateMode:function(){this.setMode("freeRotate")},_toggleLockMode:function(){this.isMode("lock")?this._unlock():this._lock()},_toggleOpacity:function(){var t=this._overlay.getElement();if(this.hasTool(L.OpacityAction)){this._transparent=!this._transparent;var e=this._transparent?this.options.opacity:1;L.DomUtil.setOpacity(t,e),t.setAttribute("opacity",e),this._refresh()}},_toggleBorder:function(){var t=this._overlay.getElement();if(this.hasTool(L.BorderAction)){this._outlined=!this._outlined;var e=this._outlined?this.options.outline:"none";t.style.outline=e,this._refresh()}},_toggleOrder:function(){this._toggledImage?this._stackUp():this._stackDown()},_removeOverlay:function(){var t=this._overlay,e=this.parentGroup;!this.isMode("lock")&&this.hasTool(L.DeleteAction)&&L.DomUtil.confirmDelete()&&(this._removeToolbar(),e?e.removeLayer(t):t._map.removeLayer(t))},_getExport:function(){var t=this._overlay,e=t._map,i=t.getElement();if(this.hasTool(L.ExportAction)){var o=new Image;o.id=o.id||"tempId12345",document.body.appendChild(o),o.onload=function(){var i=o.height,n=o.width,a=e.latLngToLayerPoint(t.getCorner(0)),s=e.latLngToLayerPoint(t.getCorner(1)),r=e.latLngToLayerPoint(t.getCorner(2)),l=e.latLngToLayerPoint(t.getCorner(3));o.onload=function(){L.DomUtil.remove(o)},window&&window.hasOwnProperty("warpWebGl")&&warpWebGl(o.id,[0,0,n,0,n,i,0,i],[a.x,a.y,s.x,s.y,l.x,l.y,r.x,r.y],!0)},o.src=t.options.fullResolutionSrc||i.src}},_stackUp:function(){this._toggledImage&&this.hasTool(L.StackAction)&&(this._toggledImage=!1,this._overlay.bringToFront(),this._refresh())},_stackDown:function(){!this._toggledImage&&this.hasTool(L.StackAction)&&(this._toggledImage=!0,this._overlay.bringToBack(),this._refresh())},_unlock:function(){var t=this._overlay,e=t._map,i=this.parentGroup;this.isMode("lock")&&((!i||i.isCollected(t))&&i||this.hasTool(L.LockAction))&&(this.currentHandle&&e.removeLayer(this.currentHandle),"lock"!==t.options.mode&&this.hasMode(t.options.mode)?this._mode=t.options.mode:(this._mode="",this.currentHandle=""),this._updateHandle(),this._enableDragging(),this._refresh())},_lock:function(){var t=this._overlay,e=t._map,i=this.parentGroup;this.isMode("lock")||((!i||i.isCollected(t))&&i||this.hasTool(L.LockAction))&&(this.currentHandle&&e.removeLayer(this.currentHandle),this._mode="lock",this._updateHandle(),this._disableDragging(),this._refresh())},_deselect:function(){this._overlay.deselect()},_showMarkers:function(t){var e=this.parentGroup;this.currentHandle&&(!this.isMode("lock")&&e&&e.anyCollected()||this.currentHandle.eachLayer((function(t){t.setOpacity(1),t.dragging&&t.dragging.enable(),L.DomUtil.addClass(t.getElement(),"leaflet-interactive")})))},_hideMarkers:function(){var t=this._overlay,e=this.parentGroup;this._handles||this._initHandles(),this.currentHandle&&(this.isMode("lock")&&e&&e.isCollected(t)||this.currentHandle.eachLayer((function(t){t.setOpacity(0),t.dragging&&t.dragging.disable(),L.DomUtil.removeClass(t.getElement(),"leaflet-interactive")})))},_updateHandle:function(){var t=this._overlay._map,e=this.getMode();this.currentHandle&&t.removeLayer(this.currentHandle),this.currentHandle=""===e?"":this._handles[e],""!==this.currentHandle&&t.addLayer(this.currentHandle)},_addToolbar:function(){var t=this._overlay,e=this.parentGroup,i=t._map,o=t.getCorners(),n=-1/0;if(e&&e.anyCollected())e.editing._addToolbar();else if(!t.options.suppressToolbar&&!this.toolbar){for(var a=0;an&&(n=o[a].lat);var s=t.getCenter();s.lat=n,this.toolbar=L.distortableImage.popupBar(s,{actions:this.editActions}).addTo(i,t),t.fire("toolbar:created")}},_refresh:function(){this.toolbar&&this._removeToolbar(),this._addToolbar()},_updateToolbarPos:function(){var t=this._overlay,e=t.getCorners(),i=this.toolbar,o=-1/0;if(i&&i instanceof L.DistortableImage.PopupBar){for(var n=0;no&&(o=e[n].lat);var a=t.getCenter();a.lat=o,t.options.suppressToolbar||this.toolbar.setLatLng(a)}},hasMode:function(t){return!!this._modes[t]},getMode:function(){if(this.enabled())return this._mode},getModes:function(){return this._modes},isMode:function(t){return!!this.enabled()&&this._mode===t},setMode:function(t){var e=this._overlay,i=this.parentGroup;if(this.getMode()!==t&&this.hasMode(t)&&this.enabled())return this.toolbar&&this.toolbar.clickTool(t),this.isMode("lock")&&!this.dragging&&this._enableDragging(),this._mode=t,this.isMode("lock")&&this._disableDragging(),this._updateHandle(),this._refresh(),i&&i.isCollected(e)&&e.deselect(),this},nextMode:function(t){var e=this.getMode(),i=this.parentGroup,o=Object.keys(this.getModes()),n=o.indexOf(e),a=o[(n+1)%o.length];if(t){if(i&&i.anyCollected())return;L.DomEvent.stop(t)}return this.setMode(a)}}),L.distortableImage.edit=function(t,e){return new L.DistortableImage.Edit(t,e)}},426:function(){L.BorderAction=L.EditAction.extend({initialize:function(t,e,i){var o,n,a=e.editing,s=a._mode;a._outlined?(o="border_outer",n=e.options.translation.removeBorder):(o="border_clear",n=e.options.translation.addBorder),(i=i||{}).toolbarIcon={svg:!0,html:o,tooltip:n,className:"lock"===s?"disabled":""},L.DistortableImage.action_map.b="lock"===s?"":"_toggleBorder",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){var t=this._overlay.editing;L.IconUtil.toggleXlink(this._link,"border_clear","border_outer"),L.IconUtil.toggleTitle(this._link,"Remove Border","Add Border"),t._toggleBorder()}})},114:function(){L.DeleteAction=L.EditAction.extend({initialize:function(t,e,i){var o,n=e.editing;n instanceof L.DistortableImage.Edit?(o=e.options.translation.deleteImage,L.DistortableImage.action_map.Backspace="lock"===n._mode?"":"_removeOverlay"):(o=e.options.translation.deleteImages,L.DistortableImage.group_action_map.Backspace="lock"===n._mode?"":"_removeGroup"),(i=i||{}).toolbarIcon={svg:!0,html:"delete_forever",tooltip:o,className:"lock"===n._mode?"disabled":""},L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){var t=this._overlay.editing;t instanceof L.DistortableImage.Edit?t._removeOverlay():t._removeGroup()}})},231:function(){L.DistortAction=L.EditAction.extend({initialize:function(t,e,i){(i=i||{}).toolbarIcon={svg:!0,html:"distort",tooltip:e.options.translation.distortImage,className:"distort"},L.DistortableImage.action_map.d="_distortMode",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){this._overlay.editing._distortMode()}})},541:function(){L.DragAction=L.EditAction.extend({initialize:function(t,e,i){(i=i||{}).toolbarIcon={svg:!0,html:"drag",tooltip:e.options.translation.dragImage,className:"drag"},L.DistortableImage.action_map.D="_dragMode",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){this._overlay.editing._dragMode()}})},280:function(){L.DistortableImage=L.DistortableImage||{},L.distortableImage=L.DistortableImage,L.DistortableImage.action_map={},L.EditAction=L.Toolbar2.Action.extend({options:{toolbarIcon:{svg:!1,html:"",className:"",tooltip:""}},initialize:function(t,e,i){this._overlay=e,this._map=t,L.setOptions(this,i),L.Toolbar2.Action.prototype.initialize.call(this,i),this._injectIconSet()},_createIcon:function(t,e,i){var o=this,n=this.options.toolbarIcon,a=n.className,s=this._overlay.editing;this.toolbar=t,this._icon=L.DomUtil.create("li","",e),this._link=L.DomUtil.create("a","",this._icon),n.svg?this._link.innerHTML=L.IconUtil.create(n.html):this._link.innerHTML=n.html,this._link.setAttribute("href","#"),this._link.setAttribute("title",n.tooltip),this._link.setAttribute("role","button"),L.DomUtil.addClass(this._link,this.constructor.baseClass),a&&(L.DomUtil.addClass(this._link,a),"disabled"===a&&L.DomUtil.addClass(this._icon,a),a===s._mode?L.DomUtil.addClass(this._link,"selected-mode"):L.DomUtil.removeClass(this._link,"selected-mode")),L.DomEvent.on(this._link,"click",this.enable,this),L.DomEvent.on(this._overlay,"update",(function(){var t=o._link.innerHTML.match(/xlink:href="#restore"/);t&&1===t.length&&o._enableAction()})),this._addSubToolbar(t,this._icon,i)},_injectIconSet:function(){if(!document.querySelector("#iconset")){var t=document.createElement("div");t.id="iconset",t.setAttribute("hidden","hidden"),t.innerHTML=(new L.ToolbarIconSet).render(),document.querySelector(".leaflet-marker-pane").appendChild(t)}},_enableAction:function(){L.DomUtil.removeClass(this._link.parentElement,"disabled"),L.DomUtil.removeClass(this._link,"disabled")},_disableAction:function(){L.DomUtil.addClass(this._link.parentElement,"disabled"),L.DomUtil.addClass(this._link,"disabled")}}),L.editAction=function(t,e,i){return new L.EditAction(t,e,i)}},149:function(){L.ExportAction=L.EditAction.extend({initialize:function(t,e,i){var o,n=e.editing;this.isExporting=!1,this.mouseLeaveSkip=!0,this.isHooksExecuted=!1,n instanceof L.DistortableImage.Edit?(L.DistortableImage.action_map.e="_getExport",o=e.options.translation.exportImage):(L.DistortableImage.group_action_map.e="runExporter",o=e.options.translation.exportImages),(i=i||{}).toolbarIcon={svg:!0,html:"get_app",tooltip:o},L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){var t=this._overlay.editing;if(t instanceof L.DistortableImage.Edit)t._getExport();else if(!this.isHooksExecuted){this.isHooksExecuted=!0;var e=this._link.parentElement;this.mouseEnterHandler=this.handleMouseEnter.bind(this),this.mouseLeaveHandler=this.handleMouseLeave.bind(this),L.DomEvent.on(e,"click",(function(){if(this.isExporting){if(this.mouseLeaveSkip)return;this.resetState(),this.detachMouseEventListeners(e),t.cancelExport()}else this.isExporting=!0,this.renderExportIcon(),setTimeout(this.attachMouseEventListeners.bind(this,e),100),t.runExporter().then(function(){this.resetState(),this.detachMouseEventListeners(e)}.bind(this))}),this)}},resetState:function(){this.renderDownloadIcon(),this.isExporting=!1,this.mouseLeaveSkip=!0},attachMouseEventListeners:function(t){t.addEventListener("mouseenter",this.mouseEnterHandler),t.addEventListener("mouseleave",this.mouseLeaveHandler)},detachMouseEventListeners:function(t){t.removeEventListener("mouseenter",this.mouseEnterHandler),t.removeEventListener("mouseleave",this.mouseLeaveHandler)},handleMouseEnter:function(){this.renderCancelIcon()},handleMouseLeave:function(){this.mouseLeaveSkip?this.mouseLeaveSkip=!1:this.renderExportIcon()},renderDownloadIcon:function(){L.IconUtil.toggleXlink(this._link,"get_app","spinner"),L.IconUtil.toggleTitle(this._link,"Export Images","Loading..."),L.DomUtil.removeClass(this._link.firstChild,"loader")},renderExportIcon:function(){L.IconUtil.toggleXlink(this._link,"spinner"),L.IconUtil.toggleTitle(this._link,"Export Images","Loading..."),L.IconUtil.addClassToSvg(this._link,"loader")},renderCancelIcon:function(){L.IconUtil.toggleXlink(this._link,"cancel"),L.IconUtil.toggleTitle(this._link,"Cancel Export","Loading..."),L.DomUtil.removeClass(this._link.firstChild,"loader")}})},74:function(){L.FreeRotateAction=L.EditAction.extend({initialize:function(t,e,i){(i=i||{}).toolbarIcon={svg:!0,html:"crop_rotate",tooltip:e.options.translation.freeRotateImage,className:"freeRotate"},L.DistortableImage.action_map.f="_freeRotateMode",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){this._overlay.editing._freeRotateMode()}})},691:function(){L.GeolocateAction=L.EditAction.extend({initialize:function(t,e,i){var o=e.editing;(i=i||{}).toolbarIcon={svg:!0,html:"explore",tooltip:e.options.translation.geolocateImage,className:"lock"===o._mode?"disabled":""},L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){var t=this._overlay.getElement();EXIF.getData(t,L.EXIF(t))}})},105:function(){L.LockAction=L.EditAction.extend({initialize:function(t,e,i){var o,n,a=e.editing;a instanceof L.DistortableImage.Edit?(L.DistortableImage.action_map.u="_unlock",L.DistortableImage.action_map.l="_lock",n=e.options.translation.lockMode,o=a.isMode("lock")?"lock":"unlock"):(L.DistortableImage.group_action_map.l="_lockGroup",n=e.options.translation.lockImages,o="lock"),(i=i||{}).toolbarIcon={svg:!0,html:o,tooltip:n,className:"lock"},L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){var t=this._overlay.editing;t instanceof L.DistortableImage.Edit?t._toggleLockMode():t._lockGroup()}})},944:function(){L.OpacityAction=L.EditAction.extend({initialize:function(t,e,i){var o,n,a=e.editing,s=a._mode;a._transparent?(o="opacity_empty",n=e.options.translation.makeImageOpaque):(o="opacity",n=e.options.translation.makeImageTransparent),(i=i||{}).toolbarIcon={svg:!0,html:o,tooltip:n,className:"lock"===s?"disabled":""},L.DistortableImage.action_map.o="lock"===s?"":"_toggleOpacity",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){var t=this._overlay.editing,e=this._link;L.IconUtil.toggleXlink(e,"opacity","opacity_empty"),L.IconUtil.toggleTitle(e,"Make Image Transparent","Make Image Opaque"),t._toggleOpacity()}})},954:function(){L.RestoreAction=L.EditAction.extend({initialize:function(t,e,i){var o=L.Utils.getNestedVal(e,"editing","_mode"),n=e.edited;(i=i||{}).toolbarIcon={svg:!0,html:"restore",tooltip:e.options.translation.restoreImage,className:n&&"lock"!==o?"":"disabled"},L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){var t=this._overlay;L.DomEvent.on(t,{edit:this._enableAction,restore:this._disableAction},this),t.restore()}})},178:function(){L.RotateAction=L.EditAction.extend({initialize:function(t,e,i){(i=i||{}).toolbarIcon={svg:!0,html:"rotate",tooltip:e.options.translation.rotateImage,className:"rotate"},L.DistortableImage.action_map.r="_rotateMode",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){this._overlay.editing._rotateMode()}})},547:function(){L.ScaleAction=L.EditAction.extend({initialize:function(t,e,i){(i=i||{}).toolbarIcon={svg:!0,html:"scale",tooltip:e.options.translation.scaleImage,className:"scale"},L.DistortableImage.action_map.s="_scaleMode",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){this._overlay.editing._scaleMode()}})},886:function(){L.StackAction=L.EditAction.extend({initialize:function(t,e,i){var o,n,a=e.editing;a._toggledImage?(o="flip_to_back",n=e.options.translation.stackToFront):(o="flip_to_front",n=e.options.translation.stackToBack),(i=i||{}).toolbarIcon={svg:!0,html:o,tooltip:n,className:"lock"===a._mode?"disabled":""},L.DistortableImage.action_map.q="lock"===a._mode?"":"_stackUp",L.DistortableImage.action_map.a="lock"===a._mode?"":"_stackDown",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){var t=this._overlay.editing;L.IconUtil.toggleXlink(this._link,"flip_to_front","flip_to_back"),L.IconUtil.toggleTitle(this._link,"Stack to Front","Stack to Back"),t._toggleOrder()}})},129:function(){L.UnlockAction=L.EditAction.extend({initialize:function(t,e,i){(i=i||{}).toolbarIcon={svg:!0,html:"unlock",tooltip:e.options.translation.unlockImages},L.DistortableImage.group_action_map.u="_unlockGroup",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){this._overlay.editing._unlockGroup()}})},743:function(){L.EXIF=function(t){if(0!==Object.keys(EXIF.getAllTags(t)).length){console.log(EXIF.getAllTags(t));var e=EXIF.getAllTags(t);void 0!==e.GPSLatitude&&void 0!==e.GPSLongitude&&(e.GPSLatitude[0],e.GPSLatitude[1],e.GPSLatitude[2],e.GPSLongitude[0],e.GPSLongitude[1],e.GPSLongitude[2],e.GPSLatitudeRef,e.GPSLongitudeRef),"T"===e.GPSImgDirectionRef||"M"===e.GPSImgDirectionRef?(Math.PI,e.GPSImgDirection.numerator,e.GPSImgDirection.denominator):console.log("No compass data found"),console.log("Orientation:",e.Orientation),(6===e.Orientation||8===e.Orientation||3===e.Orientation)&&Math.PI,void 0!==e.GPSAltitude&&void 0!==e.GPSAltitudeRef&&void 0!==e.GPSAltitude&&void 0!==e.GPSAltitudeRef&&(e.GPSAltitude.numerator,e.GPSAltitude.denominator,e.GPSAltitudeRef)}else alert("EXIF initialized. Press again to view data in console.")}},92:function(){L.DistortHandle=L.EditHandle.extend({options:{TYPE:"distort",icon:L.icon({iconUrl:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAChSURBVO3BIU4DURgGwNkvL2B6AkQTLBqP4QCoSm7DDXoBLBZHDbfgICAIZjEV3YTn9uVHdMZZtcnCfI13bIzxg0emg6Nm6QVbYz3jylEsXRrvwommb49X67jFkz80fR9Mb1YxTzqiWBSLYlEsikWxKBbFolgUi2JRLIpFsSgWxaJY03fHHOu40dH07bAzWCx9Ge/TiWbpHgdsjPGNB2f/yS+7xRCyiiZPJQAAAABJRU5ErkJggg==",iconSize:[32,32],iconAnchor:[16,16]})},_onHandleDrag:function(){this._handled.setCorner(this._corner,this.getLatLng())},updateHandle:function(){this.setLatLng(this._handled.getCorner(this._corner))}}),L.distortHandle=function(t,e,i){return new L.DistortHandle(t,e,i)}},194:function(){L.DragHandle=L.EditHandle.extend({options:{TYPE:"drag",icon:L.icon({iconUrl:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAsVJREFUeNrMVztLXEEUvnNVFAVBAhY2aRKbTZEHJNpYabuNjSgYg/GxdsmPSJkUAa/ZdVEX8mgWYVutbHxAHkVskjQBuUUgBISVhCQk3wnfwMlk1rusN1wHPubOzJlzvjlz5sxc01Ma/hUEwQnwDIjqc7uvgv9YYO86qgIwCXQbdNTlQ8kcCBHgBch8TcloF6oJGr6phk6EQAkfdz3zvgDr9Mr7Fg1fptEZoM8jsmrokpfsiIFO4IIjuE2v1EDmR4LRdlR5Gh51hj8D34ABtm8YTtqna0TgklIw5CgQguKxIojEjmFROg/MKQO27NkFAB+4wAPouGUJiIvWKHwbAxX2XyWRKWkqhT+pbJntJZJuUzISW0+5hW+obxrVBsfvoH/dqCCJuU97GBh2VteLSiYvArmErT8EVoAK9Bw7enbpVYmvAQlyowYforrH5jXL2rPHI/TKONDB7u9AlavdaTBPvPmazUeQuy8f7UomUgTEwIJPEQ3sQGE/6ll2l9H/KcEzBcfWn2IclluM3DpddJxSHujlFkscbUPvmB0LHVnLrId7nlaZVkEc6QGXQI1MAwZcWmVRHeNaQwJMMiU2cwy4s7p/RJ2ckpvIQs+cIs+5GzitloLKHUV3MPREuXbTOKO91dX387gGTONxIgEWm+E61FFrpcyqXLHsEwiDjEsjAksqw5XPoL9MHVrn6QR4q+XZrDaR4RoWzq2ymafuRA/Mq1stSsHLVkcbdf9VjOcx8ZH3+SFWcCWlVPyWuUBOwUWdC1wP5NVjYiXFWLO69PZ6CRTUY6KSIoEKdf6T3IzzgHxnsyHctNBEkmn6Oob8ExUDg/ahGybd177cDjzH5xHwgDiSvoS7I/LZyvxJZj0wod7tkX5G0XVC7rEyLhfLJjBGbKoLLEfZWObyKeZ6oY82g+yf5Zn/mJyHX7PMf04z/T3/LcAAu4E6iiyJqf0AAAAASUVORK5CYII=",iconSize:[32,32],iconAnchor:[16,16]})},_onHandleDrag:function(){var t=this._handled,e=t.getCorner(this._corner),i=this.getLatLng();t.dragBy(e,i)},updateHandle:function(){this.setLatLng(this._handled.getCorner(this._corner))}}),L.dragHandle=function(t,e,i){return new L.DragHandle(t,e,i)}},988:function(){L.EditHandle=L.Marker.extend({initialize:function(t,e,i){var o=t.getCorner(e);L.setOptions(this,i),this._handled=t,this._corner=e;var n={draggable:!0,zIndexOffset:10};i&&i.hasOwnProperty("draggable")&&(n.draggable=i.draggable),L.Marker.prototype.initialize.call(this,o,n)},onAdd:function(t){L.Marker.prototype.onAdd.call(this,t),this._bindListeners(),this.updateHandle()},onRemove:function(t){this._unbindListeners(),L.Marker.prototype.onRemove.call(this,t)},_onHandleDragStart:function(){this._handled.fire("editstart")},_onHandleDragEnd:function(){this._fireEdit()},_fireEdit:function(){this._handled.edited=!0,this._handled.fire("edit")},_bindListeners:function(){this.on({contextmenu:L.DomEvent.stop,dragstart:this._onHandleDragStart,drag:this._onHandleDrag,dragend:this._onHandleDragEnd},this),this._handled._map.on("zoomend",this.updateHandle,this),this._handled.on("update",this.updateHandle,this)},_unbindListeners:function(){this.off({contextmenu:L.DomEvent.stop,dragstart:this._onHandleDragStart,drag:this._onHandleDrag,dragend:this._onHandleDragEnd},this),this._handled._map.off("zoomend",this.updateHandle,this),this._handled.off("update",this.updateHandle,this)},_calculateScalingFactor:function(t,e){var i=this._handled,o=i._map,n=o.latLngToLayerPoint(i.getCenter()),a=o.latLngToLayerPoint(t),s=o.latLngToLayerPoint(e),r=this._d2(n,a),l=this._d2(n,s);return Math.sqrt(l/r)},_d2:function(t,e){var i=t.x-e.x,o=t.y-e.y;return Math.pow(i,2)+Math.pow(o,2)},calculateAngleDelta:function(t,e){var i=this._handled,o=i._map,n=o.latLngToLayerPoint(i.getCenter()),a=o.latLngToLayerPoint(t),s=o.latLngToLayerPoint(e),r=Math.atan2(n.y-a.y,n.x-a.x);return Math.atan2(n.y-s.y,n.x-s.x)-r}})},206:function(){L.FreeRotateHandle=L.EditHandle.extend({options:{TYPE:"freeRotate",icon:L.icon({iconUrl:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAHiSURBVMXBa3HbShgA0PMp/1sCCo8oCEpgTaCXgIXAJiDzyCJoAUTm4UVQAns1Y8+snWnTvJyeE16hkjDgDrfoNTMKcpC9UPiLSo8JyetkjEHxjPCMyoS199kFoz8Iv1HpMaN3qWDCHoegOKkkRwnJpRmroHgiPFEZ8IBekzEGxQtUEhKSS/fB7Ew4U+lxcGkVZG9QWWPSFAxBcdK59KApuA+yNwp2uEdx1GN25sZJZULSfAtm77SlbNjju6MvG75u+WHRWVR6rDVjMPsgwYyVZl3pLTpHkyYHOx8syMiayaJzlDTZ9YyaZNFVkiYH2ZUEBcVJJXVImuz6Js3Qofe59pq7DoOTILu+g+a288mCouk7/1iH4qTS+2QdDppbV1ZJmrnDXnPnc5UOs2Z0fUmTuyBr+krvSioJyUmQO0dZM7mepMkWnaNRkyrJB6uskTSjxY3Fll8bvmJwlDb83FJ8gMqAB80uyBY3Trb82PAfvjj6vuHnluIdKgMeNXOwctK5NKBoHitrb1RJeHRp5Ux4ojLg0aWMHGQvUOkxIWkKVsHsTPiNSo8HDC5lZIsgO6n0uMUdRvQuFQxB8UR4RmXC2vvsgtEfhL+o9JiQvE7GGBTPCK9QSUjoMWgKDthjDrIX+h/k0I7gth6N5gAAAABJRU5ErkJggg==",iconSize:[32,32],iconAnchor:[16,16]})},_onHandleDrag:function(){var t=this._handled,e=t._map,i=t.getCorner(this._corner),o=this.getLatLng(),n=this.calculateAngleDelta(i,o),a=this._calculateScalingFactor(i,o);0!==n&&t.rotateBy(n,"rad");var s=t.edgeMinWidth;s||(s=50);var r=e.latLngToContainerPoint(t.getCorner(0)),l=e.latLngToContainerPoint(t.getCorner(1)),c=Math.abs(r.x-l.x),d=Math.abs(r.y-l.y);Math.sqrt(c*c+d*d)>s||a>1?t.scaleBy(a):t.scaleBy(1)},updateHandle:function(){this.setLatLng(this._handled.getCorner(this._corner))}}),L.freeRotateHandle=function(t,e,i){return new L.FreeRotateHandle(t,e,i)}},789:function(){L.LockHandle=L.EditHandle.extend({options:{TYPE:"lock",interactive:!1,icon:L.icon({iconUrl:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAD8SURBVO3BPU7CYAAA0AdfjIcQlRCQBG7C3gk2uIPG2RC3Dk16Gz0FTO1WZs/gwGCMP/2+xsSl7+n1er1Iz9LtRQjaPeMeO+TinLDCJV78YqjdA04YodKuxhUaPGoRxMmxwRQZSt87Yo4KExGCeAUyLLFB4bMacxywEClIU2KDKXbInTUYo8JCgoFuGoxQO5uiwY1EA91VmDqrcKeDoX8WdNNgjApvmGGLXKIgXY0xGkxQYItrrFFIEKQ5Yo4KEx9yrDFDhlKkIF6NOQ5Y+KpAhiXWKEQI4pxwiwoLPyuxwQw75FoE7fZYocFEuwI7jHCBV39gL92TXq/Xi/AOcmczZmaIMScAAAAASUVORK5CYII=",iconSize:[32,32],iconAnchor:[16,16]})},onRemove:function(t){this.unbindTooltip(),L.EditHandle.prototype.onRemove.call(this,t)},_bindListeners:function(){var t=this.getElement();L.EditHandle.prototype._bindListeners.call(this),L.DomEvent.on(t,{mousedown:this._tooltipOn,mouseup:this._tooltipOff},this),L.DomEvent.on(document,"pointerleave",this._tooltipOff,this)},_unbindListeners:function(){var t=this.getElement();L.EditHandle.prototype._bindListeners.call(this),L.DomEvent.off(t,{mousedown:this._tooltipOn,mouseup:this._tooltipOff},this),L.DomEvent.off(document,"pointerleave",this._tooltipOff,this)},_onHandleDrag:function(){},updateHandle:function(){this.setLatLng(this._handled.getCorner(this._corner))},_tooltipOn:function(t){var e=this._handled.parentGroup,i=e?e.editing:this._handled.editing;if(!t.shiftKey&&(this._handled.isSelected()||!e||e.isCollected(this._handled))){var o=i._lockHandles;this._timer=setTimeout(L.bind((function(){this._timeout&&clearTimeout(this._timeout),this.getTooltip()?o.eachLayer((function(t){this!==t&&t.closeTooltip()})):this.bindTooltip("Locked!",{permanent:!0}),this.openTooltip()}),this),500)}},_tooltipOff:function(t){var e=this._handled.parentGroup,i=e?e.editing:this._handled.editing;if(!t.shiftKey&&(this._handled.isSelected()||!e||e.isCollected(this._handled))){var o=i._lockHandles;t.currentTarget===document&&o.eachLayer((function(t){t.closeTooltip()})),this._timer&&clearTimeout(this._timer),this._timeout=setTimeout(L.bind((function(){this.closeTooltip()}),this),400)}}}),L.lockHandle=function(t,e,i){return new L.LockHandle(t,e,i)}},337:function(){L.RotateHandle=L.EditHandle.extend({options:{TYPE:"rotate",icon:L.icon({iconUrl:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAHiSURBVMXBa3HbShgA0PMp/1sCCo8oCEpgTaCXgIXAJiDzyCJoAUTm4UVQAns1Y8+snWnTvJyeE16hkjDgDrfoNTMKcpC9UPiLSo8JyetkjEHxjPCMyoS199kFoz8Iv1HpMaN3qWDCHoegOKkkRwnJpRmroHgiPFEZ8IBekzEGxQtUEhKSS/fB7Ew4U+lxcGkVZG9QWWPSFAxBcdK59KApuA+yNwp2uEdx1GN25sZJZULSfAtm77SlbNjju6MvG75u+WHRWVR6rDVjMPsgwYyVZl3pLTpHkyYHOx8syMiayaJzlDTZ9YyaZNFVkiYH2ZUEBcVJJXVImuz6Js3Qofe59pq7DoOTILu+g+a288mCouk7/1iH4qTS+2QdDppbV1ZJmrnDXnPnc5UOs2Z0fUmTuyBr+krvSioJyUmQO0dZM7mepMkWnaNRkyrJB6uskTSjxY3Fll8bvmJwlDb83FJ8gMqAB80uyBY3Trb82PAfvjj6vuHnluIdKgMeNXOwctK5NKBoHitrb1RJeHRp5Ux4ojLg0aWMHGQvUOkxIWkKVsHsTPiNSo8HDC5lZIsgO6n0uMUdRvQuFQxB8UR4RmXC2vvsgtEfhL+o9JiQvE7GGBTPCK9QSUjoMWgKDthjDrIX+h/k0I7gth6N5gAAAABJRU5ErkJggg==",iconSize:[32,32],iconAnchor:[16,16]})},_onHandleDrag:function(){var t=this._handled,e=t.getCorner(this._corner),i=this.getLatLng(),o=this.calculateAngleDelta(e,i);t.rotateBy(o,"rad")},updateHandle:function(){this.setLatLng(this._handled.getCorner(this._corner))}}),L.rotateHandle=function(t,e,i){return new L.RotateHandle(t,e,i)}},350:function(){L.ScaleHandle=L.EditHandle.extend({options:{TYPE:"scale",icon:L.icon({iconUrl:"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2ZXJzaW9uPSIxLjEiIHdpZHRoPSI0NTkiIGhlaWdodD0iNDY0IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCA1MTIgNTEyIiB4bWw6c3BhY2U9InByZXNlcnZlIiBzdHlsZT0iIj48cmVjdCBpZD0iYmFja2dyb3VuZHJlY3QiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIHg9IjAiIHk9IjAiIGZpbGw9Im5vbmUiIHN0cm9rZT0ibm9uZSIgY2xhc3M9IiIgc3R5bGU9IiIvPjxnIGNsYXNzPSJjdXJyZW50TGF5ZXIiIHN0eWxlPSIiPjx0aXRsZT5MYXllciAxPC90aXRsZT48cGF0aCBkPSJNNDU5LjA0OTE1OTUzMDQ3MTM0LDg2LjkyNjIzNDUxMjU1MDAyIFYwIGgtODUuNzE0NTczMzU2MzEyMDkgdjI3LjA0MzcxNzQwMzkwNDQ1MiBIODUuNzE0NTczMzU2MzEyMDMgVjAgSDAgdjg2LjkyNjIzNDUxMjU1MDAyIGgyNS43MTQzNzIwMDY4OTM2MjYgdjI4OS43NTQxMTUwNDE4MzM0IEgwIHY4Ni45MjYyMzQ1MTI1NTAwMiBoODUuNzE0NTczMzU2MzEyMDkgdi0yNy4wNDM3MTc0MDM5MDQ0NTIgaDI4NS43MTUyNDQ1MjEwNDAzIHYyNy4wNDM3MTc0MDM5MDQ0NTIgaDg1LjcxNDU3MzM1NjMxMjA5IHYtODYuOTI2MjM0NTEyNTUwMDIgaC0yMy44MDk2MDM3MTAwODY2OSBWODYuOTI2MjM0NTEyNTUwMDIgSDQ1OS4wNDkxNTk1MzA0NzEzNCB6TTM4NC43NjMxOTU5NTUwMDA5LDEyLjU1NjAxMTY1MTgxMjc4MSBoNjEuOTA0OTY5NjQ2MjI1Mzk2IHY2Mi43ODAwNTgyNTkwNjM5MSBoLTYxLjkwNDk2OTY0NjIyNTM5NiBWMTIuNTU2MDExNjUxODEyNzgxIHpNMTIuMzgwOTkzOTI5MjQ1MDUsMTIuNTU2MDExNjUxODEyNzgxIGg2MS45MDQ5Njk2NDYyMjUzOTYgdjYyLjc4MDA1ODI1OTA2MzkxIEgxMi4zODA5OTM5MjkyNDUwNSBWMTIuNTU2MDExNjUxODEyNzgxIHpNNzQuMjg1OTYzNTc1NDcwNTMsNDUxLjA1MDU3MjQxNTEyMDY2IEgxMi4zODA5OTM5MjkyNDUwNSB2LTYyLjc4MDA1ODI1OTA2MzkxIGg2MS45MDQ5Njk2NDYyMjUzOTYgVjQ1MS4wNTA1NzI0MTUxMjA2NiB6TTQ0NS43MTU3ODE0NTI4MjI3NCw0NTEuMDUwNTcyNDE1MTIwNjYgaC02Mi44NTczNTM3OTQ2Mjg4NjQgdi02Mi43ODAwNTgyNTkwNjM5MSBoNjIuODU3MzUzNzk0NjI4ODY0IFY0NTEuMDUwNTcyNDE1MTIwNjYgek00MDcuNjIwNDE1NTE2Njg0MjYsMzc2LjY4MDM0OTU1NDM4MzQ0IGgtMzYuMTkwNTk3NjM5MzMxNzcgdjMyLjgzODc5OTcwNDc0MTEyIEg4NS43MTQ1NzMzNTYzMTIwMyB2LTMyLjgzODc5OTcwNDc0MTEyIEg0OS41MjM5NzU3MTY5ODAzMiBWODYuOTI2MjM0NTEyNTUwMDIgaDM2LjE5MDU5NzYzOTMzMTc3IFY1MC4yMjQwNDY2MDcyNTExMjUgaDI4Ny42MjAwMTI4MTc4NDcyIHYzNi43MDIxODc5MDUyOTg5IGgzNC4yODU4MjkzNDI1MjQ4MzUgVjM3Ni42ODAzNDk1NTQzODM0NCB6IiBpZD0ic3ZnXzIiIGNsYXNzPSIiIGZpbGw9IiMxYTFhZWIiIGZpbGwtb3BhY2l0eT0iMSIvPjwvZz48L3N2Zz4=",iconSize:[32,32],iconAnchor:[16,16]})},_onHandleDrag:function(){var t=this._handled,e=t._map,i=t.edgeMinWidth,o=t.getCorner(this._corner),n=this.getLatLng(),a=this._calculateScalingFactor(o,n);i||(i=50);var s=e.latLngToLayerPoint(t.getCorner(0)),r=e.latLngToLayerPoint(t.getCorner(1)),l=Math.abs(s.x-r.x),c=Math.abs(s.y-r.y);Math.sqrt(l*l+c*c)>i||a>1?t.scaleBy(a):t.scaleBy(1)},updateHandle:function(){this.setLatLng(this._handled.getCorner(this._corner))}}),L.scaleHandle=function(t,e,i){return new L.ScaleHandle(t,e,i)}},719:function(){L.distortableImage=L.DistortableImage||{},L.distortableImage=L.DistortableImage,L.DistortableImage.group_action_map={},L.DistortableImage.ControlBar=L.Toolbar2.Control.extend({}),L.distortableImage.controlBar=function(t){return new L.DistortableImage.ControlBar(t)},L.DistortableCollection.addInitHook((function(){this.ACTIONS=[L.ExportAction,L.DeleteAction,L.LockAction,L.UnlockAction],L.DistortableCollection.Edit.MODES={lock:L.LockAction,unlock:L.UnlockAction};var t=this.options.actions?this.options.actions:this.ACTIONS;this.editing=L.distortableCollection.edit(this,{actions:t})}))},93:function(){L.DistortableImage=L.DistortableImage||{},L.distortableImage=L.DistortableImage,L.DistortableImage.action_map={},L.DistortableImage.PopupBar=L.Toolbar2.Popup.extend({options:{anchor:[0,-10]},initialize:function(t,e){L.setOptions(this,e),L.Toolbar2.Popup.prototype.initialize.call(this,t,e)},addHooks:function(t,e){this.map=t,this.ov=e},tools:function(){if(this._ul)return this._ul.children},clickTool:function(t){for(var e=this.tools(),i=0;i',_symbols:"",render:function(){return this.addSymbols(this._symbols),this._svg},addSymbols:function(t){this._svg+=t}})},261:function(){L.KeymapperIconSet=L.IconSet.extend({_symbols:''})},929:function(){L.ToolbarIconSet=L.IconSet.extend({_symbols:''})},496:function(){L.Map.mergeOptions({boxCollector:!0,boxZoom:!1}),L.Map.BoxCollector=L.Map.BoxZoom.extend({initialize:function(t){this._map=t,this._container=t._container,this._pane=t._panes.overlayPane,this._resetStateTimeout=0,t.on("unload",this._destroy,this)},addHooks:function(){L.DomEvent.on(this._container,"mousedown",this._onMouseDown,this)},removeHooks:function(){L.DomEvent.off(this._container,"mousedown",this._onMouseDown,this)},moved:function(){return this._moved},_destroy:function(){L.DomUtil.remove(this._pane),delete this._pane},_resetState:function(){this._resetStateTimeout=0,this._moved=!1},_clearDeferredResetState:function(){0!==this._resetStateTimeout&&(clearTimeout(this._resetStateTimeout),this._resetStateTimeout=0)},_onMouseDown:function(t){if(!t.shiftKey||1!==t.which&&1!==t.button)return!1;this._clearDeferredResetState(),this._resetState(),L.DomUtil.disableTextSelection(),L.DomUtil.disableImageDrag(),this._startPoint=this._map.mouseEventToContainerPoint(t),L.DomEvent.on(document,{contextmenu:L.DomEvent.stop,mousemove:this._onMouseMove,mouseup:this._onMouseUp},this)},_onMouseMove:function(t){this._moved||(this._moved=!0,this._box=L.DomUtil.create("div","leaflet-zoom-box",this._container),L.DomUtil.addClass(this._container,"leaflet-crosshair"),this._map.fire("boxzoomstart")),this._point=this._map.mouseEventToContainerPoint(t),this._bounds=L.bounds(this._startPoint,this._point);var e=this._bounds.getSize();L.DomUtil.setPosition(this._box,this._bounds.min),this._box.style.width=e.x+"px",this._box.style.height=e.y+"px"},_finish:function(){this._moved&&(L.DomUtil.remove(this._box),L.DomUtil.removeClass(this._container,"leaflet-crosshair")),L.DomUtil.enableTextSelection(),L.DomUtil.enableImageDrag(),L.DomEvent.off(document,{contextmenu:L.DomEvent.stop,mousemove:this._onMouseMove,mouseup:this._onMouseUp},this)},_onMouseUp:function(t){if((1===t.which||1===t.button)&&(this._finish(),this._moved)){this._clearDeferredResetState(),this._resetStateTimeout=setTimeout(L.Util.bind(this._resetState,this),0);var e=L.latLngBounds(this._map.containerPointToLatLng(this._bounds.getBottomLeft()),this._map.containerPointToLatLng(this._bounds.getTopRight())),i=this._map.getZoom(),o=this._map.getCenter();e=this._map._latLngBoundsToNewLayerBounds(e,i,o),this._map.fire("boxcollectend",{boxCollectBounds:e})}}}),L.Map.addInitHook("addHandler","boxCollector",L.Map.BoxCollector)},291:function(){L.Map.mergeOptions({doubleClickLabels:!0}),L.Map.DoubleClickLabels=L.Map.DoubleClickZoom.extend({enable:function(){var t=this._map;return this._enabled||(t.doubleClickZoom.enabled()&&t.doubleClickZoom.disable(),this._map.fire("singleclickon"),this._enabled=!0,this.addHooks()),this},disable:function(){return this._enabled?(this._enabled=!1,this.removeHooks(),this):this},_fireIfSingle:function(t){var e=this._map,i=t.originalEvent;i&&i.shiftKey||(e._clicked+=1,this._map._clickTimeout=setTimeout((function(){1===e._clicked?(e._clicked=0,e.fire("singleclick",{type:"singleclick"})):L.Browser.touch&&i&&i.sourceCapabilities.firesTouchEvents&&e.fire("dblclick")}),250))},_onDoubleClick:function(){var t=this._map,e=t._labels;setTimeout((function(){t._clicked=0,clearTimeout(t._clickTimeout)}),0),e&&(1===e.options.opacity?(e.options.opacity=0,e.setOpacity(0)):(e.options.opacity=1,e.setOpacity(1)))}}),L.Map.addInitHook("addHandler","doubleClickLabels",L.Map.DoubleClickLabels)},752:function(){L.Map.DoubleClickZoom.include({addHooks:function(){this._map.on({click:this._fireIfSingle,dblclick:this._onDoubleClick},this)},removeHooks:function(){this._map.off({click:this._fireIfSingle,dblclick:this._onDoubleClick},this)},enable:function(){return this._enabled||this._map.doubleClickLabels&&this._map.doubleClickLabels.enabled()||(this._map.fire("singleclickon"),this._enabled=!0,this.addHooks()),this},disable:function(){return this._enabled?(this._map.fire("singleclickoff"),this._enabled=!1,this.removeHooks(),this):this},_fireIfSingle:function(t){var e=this._map,i=t.originalEvent;i&&i.shiftKey||(e._clicked+=1,this._map._clickTimeout=setTimeout((function(){1===e._clicked?(e._clicked=0,e.fire("singleclick",{type:"singleclick"})):L.Browser.touch&&i&&i.sourceCapabilities.firesTouchEvents&&e._fireDOMEvent(i,"dblclick",[e])}),250))},_onDoubleClick:function(t){var e=this._map,i=t.originalEvent;if(setTimeout((function(){e._clicked=0,clearTimeout(e._clickTimeout)}),0),!i)return!1;var o=e.getZoom(),n=e.options.zoomDelta,a=i.shiftKey?o-n:o+n;"center"===e.options.doubleClickZoom?e.setZoom(a):e.setZoomAround(t.containerPoint,a)}})},131:function(){L.Map.include({_clicked:0,addGoogleMutant:function(t){return(t=this.mutantOptions=L.extend({mutantOpacity:.8,maxZoom:24,maxNativeZoom:20,minZoom:0,labels:!0,labelOpacity:1,doubleClickLabels:!0},t)).labels||(this.mutantOptions=L.extend(this.mutantOptions,{labelOpacity:t.labels?1:void 0,doubleClickLabels:!!t.labels||void 0})),this._googleMutant=L.tileLayer("http://mt0.google.com/vt/lyrs=s&x={x}&y={y}&z={z}",{maxZoom:t.maxZoom,maxNativeZoom:t.maxNativeZoom,minZoom:t.minZoom,opacity:t.mutantOpacity}).addTo(this),t.labels?this._addLabels(t):this.doubleClickLabels=void 0,this},_addLabels:function(t){return 0!==t.labelOpacity&&1!==t.labelOpacity&&(t.labelOpacity=1),this._labels=L.tileLayer("https://stamen-tiles-{s}.a.ssl.fastly.net/toner-labels/{z}/{x}/{y}{r}.{ext}",{attribution:'Map tiles by Stamen Design, CC BY 3.0 — Map data © OpenStreetMap contributors',subdomains:"abcd",interactive:!1,opacity:t.labelOpacity,maxZoom:t.maxZoom,maxNativeZoom:t.maxNativeZoom,minZoom:t.minZoom,ext:"png"}).addTo(this),this.mutantOptions.doubleClickLabels&&this.doubleClickLabels.enable(),this}}),L.Map.addInitHook((function(){this.doubleClickLabels.disable(),this.doubleClickZoom.enable()}))},999:function(){L.DomUtil=L.extend(L.DomUtil,{initTranslation:function(t){this.translation=t},getMatrixString:function(t){var e=L.Browser.webkit3d||L.Browser.gecko3d||L.Browser.ie3d,i=[t[0],t[3],0,t[6],t[1],t[4],0,t[7],0,0,1,0,t[2],t[5],0,t[8]],o=e?"matrix3d("+i.join(",")+")":"";return e||console.log("Your browser must support 3D CSS transformsin order to use DistortableImageOverlay."),o},toggleClass:function(t,e){var i=e;return this.hasClass(t,i)?this.removeClass(t,i):this.addClass(t,i)},confirmDelete:function(){return window.confirm(this.translation.confirmImageDelete)},confirmDeletes:function(t){if(1===t)return this.confirmDelete();var e,i=this.translation.confirmImagesDeletes;return e="function"==typeof i?i(t):i,window.confirm(e)}})},85:function(){L.IconUtil={create:function(t){return/^#/.test(t)&&(t=t.replace(/^#/,"")),''},addClassToSvg:function(t,e){var i=t.querySelector("svg");i&&L.DomUtil.addClass(i,e)},toggleXlink:function(t,e,i){/^#/.test(e)||(e="#"+e),/^#/.test(i)||(i="#"+i);var o=t.querySelector("use");if(o){var n=o.getAttribute("xlink:href")===e?i:e;return o.setAttribute("xlink:href",n),n}return!1},toggleTitle:function(t,e,i){var o=t.getAttribute("title")===e?i:e;return t.setAttribute("title",o),t.hasAttribute("aria-label")&&t.setAttribute("aria-label",o),o}}},351:function(){L.ImageUtil={getCmPerPixel:function(t){var e=t._map;return 100*e.latLngToLayerPoint(t.getCorner(0)).distanceTo(e.latLngToLayerPoint(t.getCorner(1)))/t.getElement().width}}},360:function(){L.MatrixUtil={adj:function(t){return[t[4]*t[8]-t[5]*t[7],t[2]*t[7]-t[1]*t[8],t[1]*t[5]-t[2]*t[4],t[5]*t[6]-t[3]*t[8],t[0]*t[8]-t[2]*t[6],t[2]*t[3]-t[0]*t[5],t[3]*t[7]-t[4]*t[6],t[1]*t[6]-t[0]*t[7],t[0]*t[4]-t[1]*t[3]]},multmm:function(t,e){var i,o=[];for(i=0;i<3;i++)for(var n=0;n<3;n++){for(var a=0,s=0;s<3;s++)a+=t[3*i+s]*e[3*s+n];o[3*i+n]=a}return o},multmv:function(t,e){return[t[0]*e[0]+t[1]*e[1]+t[2]*e[2],t[3]*e[0]+t[4]*e[1]+t[5]*e[2],t[6]*e[0]+t[7]*e[1]+t[8]*e[2]]},multsm:function(t,e){for(var i=[],o=0,n=e.length;o2&&void 0!==arguments[2]?arguments[2]:"deg";return"deg"===i?this.radiansToDegrees(Math.atan2(e,t)):Math.atan2(e,t)},radiansToDegrees:function(t){return 180*t/Math.PI},degreesToRadians:function(t){return t*Math.PI/180}}},866:function(){L.Utils={initTranslation:function(){var t={deleteImage:"Delete Image",deleteImages:"Delete Images",distortImage:"Distort Image",dragImage:"Drag Image",exportImage:"Export Image",exportImages:"Export Images",removeBorder:"Remove Border",addBorder:"Add Border",freeRotateImage:"Free rotate Image",geolocateImage:"Geolocate Image",lockMode:"Lock Mode",lockImages:"Lock Images",makeImageOpaque:"Make Image Opaque",makeImageTransparent:"Make Image Transparent",restoreImage:"Restore Natural Image",rotateImage:"Rotate Image",scaleImage:"Scale Image",stackToFront:"Stack to Front",stackToBack:"Stack to Back",unlockImages:"Unlock Images",confirmImageDelete:"Are you sure? This image will be permanently deleted from the map.",confirmImagesDeletes:"Are you sure? These images will be permanently deleted from the map."};if(this.options.translation)for(var e in t)this.options.translation.hasOwnProperty(e)||(this.options.translation[e]=t[e]);else this.options.translation=t;L.DomUtil.initTranslation(this.options.translation)},getNestedVal:function(t,e,i){return[e,i].reduce((function(t,e){return t&&t[e]}),t)}}}};t[999](),t[85](),t[351](),t[360](),t[682](),t[866](),t[477](),t[808](),t[743](),t[988](),t[92](),t[194](),t[206](),t[789](),t[337](),t[350](),t[376](),t[261](),t[929](),t[280](),t[426](),t[114](),t[231](),t[541](),t[149](),t[74](),t[691](),t[105](),t[944](),t[954](),t[178](),t[547](),t[886](),t[129](),t[93](),t[719](),t[397](),t[428](),t[782](),t[752](),t[496](),t[291](),t[131]()}(); //# sourceMappingURL=leaflet.distortableimage.js.map \ No newline at end of file diff --git a/examples/js/export.js b/examples/js/export.js index 4891e3983..6ebd66225 100644 --- a/examples/js/export.js +++ b/examples/js/export.js @@ -13,6 +13,7 @@ let map; L.latLng(51.50, -0.10), ], mode: 'lock', + tooltipText: 'Aerial map of NY', }); // create a second image @@ -25,6 +26,7 @@ let map; ], mode: 'freeRotate', suppressToolbar: true, + tooltipText: 'Aerial map of NY', }); let json = [{'nodes': [ diff --git a/examples/js/listeners.js b/examples/js/listeners.js index 39a96829e..c14c037fd 100644 --- a/examples/js/listeners.js +++ b/examples/js/listeners.js @@ -7,6 +7,7 @@ let map; map.whenReady(function() { img = L.distortableImageOverlay('example.jpg', { selected: true, + tooltipText: 'Aerial map of NY', }).addTo(map); // Wait until image is loaded before setting up DOM element listeners diff --git a/examples/js/local.js b/examples/js/local.js index 1d3144792..bd3af73d1 100644 --- a/examples/js/local.js +++ b/examples/js/local.js @@ -39,6 +39,7 @@ const loadMap = (image) => { img = L.distortableImageOverlay(image, { selected: true, fullResolutionSrc: 'large.jpg', + tooltipText: 'Aerial map of NY', }).addTo(map); }); }; diff --git a/examples/js/select.js b/examples/js/select.js index 9b2639d1d..f4eccd6f7 100644 --- a/examples/js/select.js +++ b/examples/js/select.js @@ -13,6 +13,7 @@ let map; L.latLng(51.50, -0.10), ], mode: 'lock', + tooltipText: 'Aerial map of NY', }); // create a second image @@ -25,6 +26,7 @@ let map; ], mode: 'freeRotate', suppressToolbar: true, + tooltipText: 'Aerial map of NY', }); img3 = L.distortableImageOverlay('example.jpg', { @@ -42,6 +44,7 @@ let map; L.DeleteAction, L.StackAction, ], + tooltipText: 'Aerial map of NY', }); img4 = L.distortableImageOverlay('example.jpg', { @@ -61,6 +64,7 @@ let map; L.latLng(51.49, -0.08), L.latLng(51.49, -0.04), ], + tooltipText: 'Aerial map of NY', }); imgGroup = L.distortableCollection().addTo(map); From 8f3d21f373edb2e78ddea11ea6d8eb2ad3a63be4 Mon Sep 17 00:00:00 2001 From: segun Date: Thu, 5 Jan 2023 14:12:23 +0100 Subject: [PATCH 27/57] update --- dist/leaflet.distortableimage.js | 8351 +++++++++++++++++++++++++++++- 1 file changed, 8350 insertions(+), 1 deletion(-) diff --git a/dist/leaflet.distortableimage.js b/dist/leaflet.distortableimage.js index 766d17198..2edcf551a 100644 --- a/dist/leaflet.distortableimage.js +++ b/dist/leaflet.distortableimage.js @@ -1,2 +1,8351 @@ -!function(){var t={808:function(){var t=[];L.DistortableCollection=L.FeatureGroup.extend({options:{editable:!0,exportOpts:{exportStartUrl:"//export.mapknitter.org/export",statusUrl:"//export.mapknitter.org",exportUrl:"http://export.mapknitter.org/"}},initialize:function(t){L.setOptions(this,t),L.FeatureGroup.prototype.initialize.call(this,t),L.Utils.initTranslation.call(this),this.editable=this.options.editable},onAdd:function(t){L.FeatureGroup.prototype.onAdd.call(this,t),this._map=t,this.editable&&this.editing.enable(),this.on("layeradd",this._addEvents,this),this.on("layerremove",this._removeEvents,this)},onRemove:function(){this.editing&&this.editing.disable(),this.off("layeradd",this._addEvents,this),this.off("layerremove",this._removeEvents,this)},_addEvents:function(t){var e=t.layer;L.DomEvent.on(e,{dragstart:this._dragStartMultiple,drag:this._dragMultiple},this),L.DomEvent.on(e.getElement(),{mousedown:this._deselectOthers,contextmenu:this._longPressMultiSelect},this)},_removeEvents:function(t){var e=t.layer;L.DomEvent.off(e,{dragstart:this._dragStartMultiple,drag:this._dragMultiple},this),L.DomEvent.off(e.getElement(),{mousedown:this._deselectOthers,contextmenu:this._longPressMultiSelect},this)},_longPressMultiSelect:function(t){var e=this;this.editable&&(t.preventDefault(),this.eachLayer((function(i){var o=i.editing;i.getElement()===t.target&&o.enabled()&&(L.DomUtil.toggleClass(i.getElement(),"collected"),e.anyCollected()?(i.deselect(),e.editing._addToolbar()):e.editing._removeToolbar())})))},isCollected:function(t){return L.DomUtil.hasClass(t.getElement(),"collected")},anyCollected:function(){return this.getLayers().some(this.isCollected.bind(this))},_toggleCollected:function(e,i){e.shiftKey&&i.editing.enabled()&&(L.DomUtil.toggleClass(e.target,"collected"),t.every((function(t){return t._leaflet_id!==i._leaflet_id}))?t.push(i):t.splice(t.indexOf(i),1)),this.anyCollected()?i.deselect():this.editing._removeToolbar()},_deselectOthers:function(t){var e=this;this.editable&&(this.eachLayer((function(i){i.getElement()!==t.target?i.deselect():e._toggleCollected(t,i)})),t&&L.DomEvent.stopPropagation(t))},_dragStartMultiple:function(t){var e,i=t.target,o=this._map;this.isCollected(i)&&this.eachLayer((function(t){for(t._dragStartPoints={},t.deselect(),e=0;e<4;e++){var i=t.getCorner(e);t._dragStartPoints[e]=o.latLngToLayerPoint(i)}}))},_dragMultiple:function(t){var e=t.target,i=this._map;if(this.isCollected(e)){var o=i.latLngToLayerPoint(e.getCorner(0)),n=e._dragStartPoints[0].subtract(o);this._updateCollectionFromPoints(n,e)}},_toRemove:function(){var t=this;return this.getLayers().filter((function(e){var i=e.editing._mode;return t.isCollected(e)&&"lock"!==i}))},_toMove:function(t){var e=this;return this.getLayers().filter((function(i){var o=i.editing._mode;return i!==t&&e.isCollected(i)&&"lock"!==o}))},_updateCollectionFromPoints:function(t,e){var i,o=this._toMove(e),n=new L.Transformation(1,-t.x,1,-t.y);o.forEach((function(t){var e={};for(i=0;i<4;i++)e[i]=n.transform(t._dragStartPoints[i]);t.setCornersFromPoints(e)}))},_getAvgCmPerPixel:function(t){return t.reduce((function(t,e){return t+e.cm_per_pixel}),0)/t.length},generateExportJson:function(){var t={images:[]};return this.eachLayer((function(e){if(this.isCollected(e)){var i=e._image.src.split("/"),o=i[i.length-1],n=e.getCorners(),a=[{lat:n[0].lat,lon:n[0].lng},{lat:n[1].lat,lon:n[1].lng},{lat:n[3].lat,lon:n[3].lng},{lat:n[2].lat,lon:n[2].lng}];t.images.push({id:e._leaflet_id,src:e._image.src,width:e._image.width,height:e._image.height,image_file_name:o,nodes:a,cm_per_pixel:L.ImageUtil.getCmPerPixel(e)})}}),this),t.images=t.images.reverse(),t.avg_cm_per_pixel=this._getAvgCmPerPixel(t.images),t}}),L.distortableCollection=function(t,e){return new L.DistortableCollection(t,e)}},477:function(){L.DistortableImageOverlay=L.ImageOverlay.extend({options:{height:200,crossOrigin:!0,edgeMinWidth:50,editable:!0,mode:"distort",selected:!1,interactive:!0,tooltipText:"Unknow image"},initialize:function(t,e){L.setOptions(this,e),L.Utils.initTranslation.call(this),this.edgeMinWidth=this.options.edgeMinWidth,this.editable=this.options.editable,this._selected=this.options.selected,this._url=t,this.rotation={},this.interactive=this.options.interactive,this.tooltipText=e.tooltipText},onAdd:function(t){var e=this;this._map=t,this.getElement()||this._initImage(),t.on("viewreset",this._reset,this),this.options.corners&&(this._corners=this.options.corners,t.options.zoomAnimation&&L.Browser.any3d&&t.on("zoomanim",this._animateZoom,this)),L.DomEvent.on(this.getElement(),"load",(function(){if(e.getPane().appendChild(e.getElement()),e._initImageDimensions(),e.options.rotation){var i=e.options.rotation.deg>=0?"deg":"rad";e.setAngle(e.options.rotation[i],i)}else e.rotation={deg:0,rad:0},e._reset();e._corners||t.options.zoomAnimation&&L.Browser.any3d&&t.on("zoomanim",e._animateZoom,e);var o=e._eventParents;o?(e.eP=o[Object.keys(o)[0]],e.eP.editable&&e.editing.enable()):(e.editable&&e.editing.enable(),e.eP=null)})),L.DomEvent.on(this.getElement(),"click",this.select,this),L.DomEvent.on(t,{singleclickon:this._singleClickListeners,singleclickoff:this._resetClickListeners,singleclick:this._singleClick},this),t.doubleClickZoom.enabled()||t.doubleClickLabels.enabled()||L.DomEvent.on(t,"click",this.deselect,this),this.fire("add"),L.DomEvent.on(this.getElement(),"mouseover mousemove",this._activateTooltip,this),L.DomEvent.on(this.getElement(),"mouseout",this._closeTooltip,this)},onRemove:function(t){L.DomEvent.off(this.getElement(),"click",this.select,this),L.DomEvent.off(t,{singleclickon:this._singleClickListeners,singleclickoff:this._resetClickListeners,singleclick:this._singleClick},this),L.DomEvent.off(t,"click",this.deselect,this),this.editing&&this.editing.disable(),this.fire("remove"),L.ImageOverlay.prototype.onRemove.call(this,t),L.DomEvent.off(this.getElement(),"mouseover",this._deactivateTooltip,this)},_initImageDimensions:function(){var t=this._map,e=L.DomUtil.getStyle(this.getElement(),"width"),i=L.DomUtil.getStyle(this.getElement(),"height"),o=parseInt(e)/parseInt(i),n=this.options.height,a=parseInt(o*n),s=t.project(t.getCenter()),r=L.point(a,n).divideBy(2);this.options.corners?this._corners=this.options.corners:this._corners=[t.unproject(s.subtract(r)),t.unproject(s.add(L.point(r.x,-r.y))),t.unproject(s.add(L.point(-r.x,r.y))),t.unproject(s.add(r))],this._initialDimensions={center:s,offset:r,zoom:t.getZoom()},this.setBounds(L.latLngBounds(this.getCorners()))},_singleClick:function(t){"singleclick"===t.type&&this.deselect()},_singleClickListeners:function(){var t=this._map;L.DomEvent.off(t,"click",this.deselect,this),L.DomEvent.on(t,"singleclick",this.deselect,this)},_resetClickListeners:function(){var t=this._map;L.DomEvent.on(t,"click",this.deselect,this),L.DomEvent.off(t,"singleclick",this.deselect,this)},isSelected:function(){return this._selected},deselect:function(){var t=this.editing;if(t.enabled())return t._removeToolbar(),t._hideMarkers(),this._selected=!1,this.fire("deselect"),this},select:function(t){var e=this.editing,i=this.eP;if(e.enabled()){if(t&&L.DomEvent.stopPropagation(t),this._programmaticGrouping(),this._selected=!0,e._addToolbar(),e._showMarkers(),this.fire("select"),!i||!i.anyCollected())return this;this.deselect()}},_programmaticGrouping:function(){this._map.eachLayer((function(t){t instanceof L.DistortableImageOverlay&&t.deselect()}))},setCorner:function(t,e){var i=this.editing;return this._corners[t]=e,this.setBounds(L.latLngBounds(this.getCorners())),this.fire("update"),i.toolbar&&i.toolbar instanceof L.DistortableImage.PopupBar&&i._updateToolbarPos(),this.edited=!0,this},_cornerExceedsMapLats:function(t,e,i){return i.options.crs.Simple!=L.CRS.Simple&&(0===t?(o=i.project(e).y<2,n=i.project(e).y>=255):(o=i.project(e).y/t<2,n=i.project(e).y/Math.pow(2,t)>=255),o||n);var o,n},_activateTooltip:function(t){this._selected||(t.x,t.y,this.bindTooltip(this.tooltipText,{sticky:!0,direction:"top",offset:L.point([t.x-700,t.y-500])}).openTooltip())},_closeTooltip:function(){this.closeTooltip()},_deactivateTooltip:function(){this.unbindTooltip()},setCorners:function(t){var e=this._map,i=e.getZoom(),o=this.editing,n=0;for(var a in t)if(this._cornerExceedsMapLats(i,t[a],e))return this.setBounds(L.latLngBounds(this.getCorners())),void this.fire("update");for(var s in t)this._corners[n]=t[s],n+=1;return this.setBounds(L.latLngBounds(this.getCorners())),this.fire("update"),o.toolbar&&o.toolbar instanceof L.DistortableImage.PopupBar&&o._updateToolbarPos(),this.edited=!0,this},setCornersFromPoints:function(t){var e=this._map,i=e.getZoom(),o=this.editing,n=0;for(var a in t){var s=e.layerPointToLatLng(t[a]);if(this._cornerExceedsMapLats(i,s,e))return this.setBounds(L.latLngBounds(this.getCorners())),void this.fire("update")}for(var r in t)this._corners[n]=e.layerPointToLatLng(t[r]),n+=1;return this.setBounds(L.latLngBounds(this.getCorners())),this.fire("update"),o.toolbar&&o.toolbar instanceof L.DistortableImage.PopupBar&&o._updateToolbarPos(),this.edited=!0,this},scaleBy:function(t){var e,i,o=this._map,n=o.project(this.getCenter()),a={};if(0!==t){for(e=0;e<4;e++)i=o.project(this.getCorner(e)).subtract(n).multiplyBy(t).add(n),a[e]=o.unproject(i);return this.setCorners(a),this}},getAngle:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"deg",e=this.getElement().style[L.DomUtil.TRANSFORM].split("matrix3d")[1].slice(1,-1).split(","),i=e[0],o=e[1],n=e[4],a=e[5],s=i*a-o*n,r=L.TrigUtil.calcAngle(i,o,"rad");return s<0&&(r+=r<0?Math.PI:-Math.PI),r<0&&(r=2*Math.PI+r),"deg"===t?Math.round(L.TrigUtil.radiansToDegrees(r)):L.Util.formatNum(r,2)},setAngle:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"deg",i=this.getAngle(e),o=t-i;return this.rotateBy(o,e),this},rotateBy:function(t){var e,i,o,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"deg",a=this._map,s=a.project(this.getCenter()),r={};for("deg"===n&&(t=L.TrigUtil.degreesToRadians(t)),e=0;e<4;e++)i=a.project(this.getCorner(e)).subtract(s),o=L.point(Math.cos(t)*i.x-Math.sin(t)*i.y,Math.sin(t)*i.x+Math.cos(t)*i.y),r[e]=a.unproject(o.add(s));return this.setCorners(r),this},dragBy:function(t,e){var i,o,n=this._map,a={},s=n.project(t).subtract(n.project(e));for(i=0;i<4;i++)o=n.project(this.getCorner(i)).subtract(s),a[i]=n.unproject(o);this.setCorners(a)},restore:function(){for(var t=this._map,e=this._initialDimensions.center,i=this._initialDimensions.offset,o=this._initialDimensions.zoom,n=[e.subtract(i),e.add(L.point(i.x,-i.y)),e.add(L.point(-i.x,i.y)),e.add(i)],a=0;a<4;a++)t.unproject(n[a],o).equals(this.getCorner(a))||this.setCorner(a,t.unproject(n[a],o));return this.edited=!1,this.fire("restore"),this},_getTranslateString:function(t){var e=L.Browser.webkit3d,i=(e?",0":"")+")";return"translate"+(e?"3d":"")+"("+t.x+"px,"+t.y+"px"+i},_reset:function(){var t=this._map,e=this.getElement(),i=L.bind(t.latLngToLayerPoint,t),o=this._calculateProjectiveTransform(i),n=i(this.getCorner(0)),a=L.DomUtil.getMatrixString(o),s=this._getTranslateString(n);e._leaflet_pos=n,e.style[L.DomUtil.TRANSFORM]=[s,a].join(" "),e.style[L.DomUtil.TRANSFORM+"-origin"]="0 0 0",this.rotation.deg=this.getAngle(),this.rotation.rad=this.getAngle("rad")},_animateZoom:function(t){var e=this._map,i=this.getElement(),o=function(i){return e._latLngToNewLayerPoint(i,t.zoom,t.center)},n=this._calculateProjectiveTransform(o),a=o(this.getCorner(0)),s=L.DomUtil.getMatrixString(n),r=this._getTranslateString(a);i._leaflet_pos=a,i.style[L.DomUtil.TRANSFORM]=[r,s].join(" ")},getCorners:function(){return this._corners},getCorner:function(t){return this._corners[t]},getCenter:function(){var t=this._map,e=this.getCorners().reduce((function(e,i){return e.add(t.project(i))}),L.point(0,0));return t.unproject(e.divideBy(4))},_calculateProjectiveTransform:function(t){var e,i=t(this.getCorner(0)),o=this.getElement().offsetWidth||500,n=this.getElement().offsetHeight||375,a=[];for(e=0;e<4;e++)a.push(t(this.getCorner(e))._subtract(i));return L.MatrixUtil.general2DProjection(0,0,a[0].x,a[0].y,o,0,a[1].x,a[1].y,0,n,a[2].x,a[2].y,o,n,a[3].x,a[3].y)}}),L.distortableImageOverlay=function(t,e){return new L.DistortableImageOverlay(t,e)},L.Map.addInitHook((function(){L.DomUtil.hasClass(this.getContainer(),"ldi")||L.DomUtil.addClass(this.getContainer(),"ldi")}))},782:function(){var t=this;L.DomUtil=L.DomUtil||{},L.DistortableImage=L.DistortableImage||{},L.distortableImage=L.DistortableImage,L.DistortableImage.Keymapper=L.Handler.extend({options:{position:"topright"},initialize:function(t,e){this._map=t,L.setOptions(this,e)},addHooks:function(){this._keymapper||(this._container=this._buildContainer(),this._scrollWrapper=this._wrap(),this._toggler=this._createButton(),this._setMapper(this._container,this._scrollWrapper,this._toggler),L.DomEvent.on(this._toggler,"click",this._toggleKeymapper,this),L.DomEvent.disableClickPropagation(this._container),L.DomEvent.disableScrollPropagation(this._container))},removeHooks:function(){this._keymapper&&(L.DomEvent.off(this._toggler,"click",this._toggleKeymapper,this),L.DomUtil.remove(this._toggler),L.DomUtil.remove(this._scrollWrapper),L.DomUtil.remove(this._container),this._keymapper=!1)},_buildContainer:function(){var t=L.DomUtil.create("div","ldi-keymapper-hide");t.setAttribute("id","ldi-keymapper");var e=L.DomUtil.create("br","divider");return t.appendChild(e),t},_createButton:function(){var t=L.DomUtil.create("a","");return t.innerHTML=L.IconUtil.create("keyboard_open"),t.setAttribute("id","toggle-keymapper"),t.setAttribute("href","#"),t.setAttribute("title","Show keymap"),t.setAttribute("role","button"),t.setAttribute("aria-label","Show keymap"),t},_wrap:function(){var t=L.DomUtil.create("div","");return t.setAttribute("id","keymapper-wrapper"),t.style.display="none",t},_setMapper:function(t,e,i){this._keymapper=L.control({position:this.options.position}),this._keymapper.onAdd=function(){return t.appendChild(e),e.insertAdjacentHTML("beforeend",'
Rotate Mode
R
RotateScale Mode
r
Scale Mode
s
Distort Mode
d
Drag Mode
D
Lock (Mode) / Unlock Image
l u
Stack up / down
q a
Add / Remove Image Border
b
Toggle Opacity
o
Deselect All
esc
Delete Image(s)
delete backspace
Export Image(s)
e
'),t.appendChild(i),t},this._keymapper.addTo(this._map)},_toggleKeymapper:function(t){t.preventDefault(),this._container.className="ldi-keymapper leaflet-control"===this._container.className?"ldi-keymapper-hide leaflet-control":"ldi-keymapper leaflet-control",this._scrollWrapper.style.display="none"===this._scrollWrapper.style.display?"block":"none",this._toggler.innerHTML="close"===this._toggler.innerHTML?L.IconUtil.create("keyboard_open"):"close",L.IconUtil.toggleTitle(this._toggler,"Show keymap","Hide keymap"),L.DomUtil.toggleClass(this._toggler,"close-icon")},_injectIconSet:function(){if(!document.querySelector("#keymapper-iconset")){var t=L.DomUtil.create("div","");t.id="keymapper-iconset",t.setAttribute("hidden","hidden"),this._iconset=(new L.KeymapperIconSet).render(),t.innerHTML=this._iconset,document.querySelector(".leaflet-control-container").appendChild(t)}}}),L.DistortableImage.Keymapper.addInitHook((function(){L.DistortableImage.Keymapper.prototype._n=L.DistortableImage.Keymapper.prototype._n?L.DistortableImage.Keymapper.prototype._n+1:1,1!==L.DistortableImage.Keymapper.prototype._n||L.Browser.mobile||(t.enable(),t._injectIconSet())})),L.distortableImage.keymapper=function(t,e){return new L.DistortableImage.Keymapper(t,e)}},428:function(){L.DistortableImage=L.DistortableImage||{},L.DistortableCollection.Edit=L.Handler.extend({options:{keymap:L.distortableImage.group_action_map},initialize:function(t,e){this._group=t,this._exportOpts=t.options.exportOpts,L.setOptions(this,e),L.distortableImage.group_action_map.Escape="_decollectAll"},addHooks:function(){var t=this._group._map;this.editActions=this.options.actions,this.runExporter=L.bind(L.Utils.getNestedVal(this,"_exportOpts","exporter")||this.startExport,this),L.DomEvent.on(document,"keydown",this._onKeyDown,this),t.doubleClickZoom.enabled()||t.doubleClickLabels.enabled()||L.DomEvent.on(t,"click",this._decollectAll,this),L.DomEvent.on(t,{singleclickon:this._singleClickListeners,singleclickoff:this._resetClickListeners,singleclick:this._singleClick,boxcollectend:this._addCollections},this),this._group.editable=!0,this._group.eachLayer((function(t){return t.editing.enable()}))},removeHooks:function(){var t=this._group._map;L.DomEvent.off(document,"keydown",this._onKeyDown,this),t.doubleClickZoom.enabled()||t.doubleClickLabels.enabled()||L.DomEvent.off(t,"click",this._decollectAll,this),L.DomEvent.off(t,{singleclickon:this._singleClickListeners,singleclickoff:this._resetClickListeners,singleclick:this._singleClick,boxcollectend:this._addCollections},this),this._decollectAll(),this._group.editable=!1,this._group.eachLayer((function(t){return t.editing.disable()}))},enable:function(){return this._enabled=!0,this.addHooks(),this},disable:function(){return this._enabled=!1,this.removeHooks(),this},_onKeyDown:function(t){var e=this.options.keymap[t.key];this[e]&&this._group.anyCollected()&&this[e].call(this)},_singleClick:function(t){"singleclick"===t.type&&this._decollectAll(t)},_singleClickListeners:function(){var t=this._group._map;L.DomEvent.off(t,"click",this._decollectAll,this),L.DomEvent.on(t,"singleclick",this._decollectAll,this)},_resetClickListeners:function(){var t=this._group._map;L.DomEvent.on(t,"click",this._decollectAll,this),L.DomEvent.off(t,"singleclick",this._decollectAll,this)},_decollectAll:function(t){var e;t&&(e=t.originalEvent),e&&(e.shiftKey||e.target instanceof HTMLImageElement)||(this._group.eachLayer((function(t){L.DomUtil.removeClass(t.getElement(),"collected"),t.deselect()})),this._removeToolbar(),t&&L.DomEvent.stopPropagation(t))},_unlockGroup:function(){var t=this;this.hasTool(L.UnlockAction)&&this._group.eachLayer((function(e){t._group.isCollected(e)&&(e.editing._unlock(),e.deselect())}))},_lockGroup:function(){var t=this;this.hasTool(L.LockAction)&&this._group.eachLayer((function(e){t._group.isCollected(e)&&(e.editing._lock(),L.DomUtil.addClass(e.getElement(),"collected"))}))},_addCollections:function(t){var e=this,i=t.boxCollectBounds,o=this._group._map;this._group.eachLayer((function(t){var n=t.editing;t.isSelected()&&t.deselect();var a=o.getZoom(),s=o.getCenter(),r=L.latLngBounds(t.getCorner(2),t.getCorner(1));r=o._latLngBoundsToNewLayerBounds(r,a,s),i.intersects(r)&&n.enabled()&&(e.toolbar||e._addToolbar(),L.DomUtil.addClass(t.getElement(),"collected"))}))},_removeGroup:function(t){var e=this;if(this.hasTool(L.DeleteAction)){var i=this._group._toRemove(),o=i.length;0!==o&&(L.DomUtil.confirmDeletes(o)&&(i.forEach((function(t){e._group.removeLayer(t)})),this._group.anyCollected()||this._removeToolbar()),t&&L.DomEvent.stopPropagation(t))}},cancelExport:function(){this.customCollection||(this._exportOpts.collection=void 0),clearInterval(this.updateInterval)},_addToolbar:function(){var t=this._group,e=t._map;t.options.suppressToolbar||this.toolbar||(this.toolbar=L.distortableImage.controlBar({actions:this.editActions,position:"topleft"}).addTo(e,t))},_removeToolbar:function(){var t=this._group._map;if(!this.toolbar)return!1;t.removeLayer(this.toolbar),this.toolbar=!1},hasTool:function(t){return this.editActions.some((function(e){return e===t}))},addTool:function(t){return"leaflet-toolbar-icon"!==t.baseClass||this.hasTool(t)||(this._removeToolbar(),this.editActions.push(t),this._addToolbar()),this},removeTool:function(t){var e=this;return this.editActions.some((function(i,o){return e.editActions[o]===t&&(e._removeToolbar(),e.editActions.splice(o,1),e._addToolbar(),!0)})),this},startExport:function(){var t=this;if(this.hasTool(L.ExportAction))return new Promise((function(e){var i,o=t._exportOpts;o.resolve=e,t.updateInterval=null,t.customCollection=!!o.collection,t.customCollection||(o.collection=t._group.generateExportJson().images),o.frequency=o.frequency||3e3,o.scale=o.scale||100,o.updater=o.updater||function(n){(n=JSON.parse(n)).status_url&&(i!==n.status_url&&n.status_url.match(".json")&&(i=n.status_url),"complete"===n.status&&(clearInterval(t.updateInterval),t.customCollection||(t._exportOpts.collection=void 0),e(),null!==n.jpg&&alert("Export succeeded. "+o.exportUrl+n.jpg)),console.log(n))},o.handleStatusRes=o.handleStatusRes||function(e){i=o.statusUrl+e,t.updateInterval=setInterval((function(){var t=new Request("".concat(i,"?").concat(Date.now()),{method:"GET"});fetch(t).then((function(t){if(t.ok)return t.text()})).then(o.updater)}),o.frequency)},o.fetchStatusUrl=o.fetchStatusUrl||function(t){var e=new FormData;e.append("collection",JSON.stringify(t.collection)),e.append("scale",t.scale),e.append("upload",!0);var i={method:"POST",body:e},o=new Request(t.exportStartUrl,i);fetch(o).then((function(t){if(t.ok)return t.text()})).then(t.handleStatusRes)},o.fetchStatusUrl(o)}))}}),L.distortableCollection.edit=function(t,e){return new L.DistortableCollection.Edit(t,e)}},397:function(){L.DistortableImage=L.DistortableImage||{},L.DistortableImage.Edit=L.Handler.extend({options:{opacity:.7,outline:"1px solid red",keymap:L.distortableImage.action_map},initialize:function(t,e){this._overlay=t,this._toggledImage=!1,this._mode=t.options.mode,this._transparent=!1,this._outlined=!1,L.setOptions(this,e),L.distortableImage.action_map.Escape="_deselect"},addHooks:function(){var t=this._overlay;this.editActions=this.options.actions,t.bringToFront(),this._initModes(),this._initHandles(),this._appendHandlesandDragable(),t.isSelected()&&!t.options.suppressToolbar&&this._addToolbar(),this.parentGroup=!!t.eP&&t.eP,L.DomEvent.on(t.getElement(),{dblclick:this.nextMode},this),L.DomEvent.on(window,"keydown",this._onKeyDown,this)},removeHooks:function(){var t=this._overlay,e=this.parentGroup;for(var i in this._disableDragging(),this.toolbar&&this._removeToolbar(),this._handles)L.DomUtil.remove(i);L.DomUtil.hasClass(t.getElement(),"collected")&&L.DomUtil.removeClass(t.getElement(),"collected"),e&&!e.anyCollected()&&e.editing.toolbar&&e.editing._removeToolbar(),L.DomEvent.off(t.getElement(),{dblclick:this.nextMode},this),L.DomEvent.off(window,"keydown",this._onKeyDown,this)},disable:function(){return this._enabled?(this._overlay.deselect(),this._enabled=!1,this.removeHooks(),this):this},_initModes:function(){for(var t in this._modes={},L.DistortableImage.Edit.MODES){var e=L.DistortableImage.Edit.MODES[t];-1!==this.editActions.indexOf(e)&&(this._modes[t]=e)}this._modes[this._mode]||(this._mode=Object.keys(this._modes)[0])},_initHandles:function(){var t,e=this._overlay;for(this._dragHandles=L.layerGroup(),t=0;t<4;t++)this._dragHandles.addLayer(L.dragHandle(e,t));for(this._scaleHandles=L.layerGroup(),t=0;t<4;t++)this._scaleHandles.addLayer(L.scaleHandle(e,t));for(this._distortHandles=L.layerGroup(),t=0;t<4;t++)this._distortHandles.addLayer(L.distortHandle(e,t));for(this._rotateHandles=L.layerGroup(),t=0;t<4;t++)this._rotateHandles.addLayer(L.rotateHandle(e,t));for(this._freeRotateHandles=L.layerGroup(),t=0;t<4;t++)this._freeRotateHandles.addLayer(L.freeRotateHandle(e,t));for(this._lockHandles=L.layerGroup(),t=0;t<4;t++)this._lockHandles.addLayer(L.lockHandle(e,t,{draggable:!1}));this._handles={drag:this._dragHandles,scale:this._scaleHandles,distort:this._distortHandles,rotate:this._rotateHandles,freeRotate:this._freeRotateHandles,lock:this._lockHandles}},_appendHandlesandDragable:function(){var t=this._overlay;this._mode?(this._updateHandle(),!t.isSelected()&&this.currentHandle&&this.currentHandle.eachLayer((function(t){t.setOpacity(0),t.dragging&&t.dragging.disable()})),this.isMode("lock")||this._enableDragging()):this._enableDragging()},_onKeyDown:function(t){var e=this.options.keymap[t.key],i=this._overlay,o=this.parentGroup;o&&o.anyCollected()||void 0===this[e]||i.options.suppressToolbar||i.isSelected()&&this.toolbar&&this[e].call(this)},replaceTool:function(t,e){var i=this;return"leaflet-toolbar-icon"!==e.baseClass||this.hasTool(e)||this.editActions.some((function(o,n){if(o===t){for(var a in i._removeToolbar(),i.editActions[n]=e,i._addToolbar(),L.DistortableImage.Edit.MODES)L.DistortableImage.Edit.MODES[a]===t?(delete i._modes[a],i._nextOrNone(a)):L.DistortableImage.Edit.MODES[a]===e&&(i._modes[a]=e);return!0}})),this},addTool:function(t){if("leaflet-toolbar-icon"===t.baseClass&&!this.hasTool(t)){for(var e in this._removeToolbar(),this.editActions.push(t),this._addToolbar(),L.DistortableImage.Edit.MODES)L.DistortableImage.Edit.MODES[e]===t&&(this._modes[e]=t);this._overlay.isSelected()||this._removeToolbar()}return this},hasTool:function(t){return this.editActions.some((function(e){return e===t}))},removeTool:function(t){var e=this;return this.editActions.some((function(i,o){if(i===t){for(var n in e._removeToolbar(),e.editActions.splice(o,1),e._addToolbar(),L.DistortableImage.Edit.MODES)L.DistortableImage.Edit.MODES[n]===t&&(delete e._modes[n],e._nextOrNone(n));return!0}})),this._overlay.isSelected()||this._removeToolbar(),this},_nextOrNone:function(t){this.isMode(t)&&(Object.keys(this.getModes()).length>=1?this.nextMode():("lock"===t&&this._enableDragging(),this._mode="",this._updateHandle()))},_removeToolbar:function(){var t=this._overlay._map;this.toolbar&&(t.removeLayer(this.toolbar),this.toolbar=!1)},_enableDragging:function(){var t=this,e=this._overlay,i=e._map;this.dragging=new L.Draggable(e.getElement()),this.dragging.enable(),this.dragging.on("dragstart",(function(){e.fire("dragstart"),t._removeToolbar()})),this.dragging._updatePosition=function(){var t,o,n=e.getCorner(0),a=this._newPos.subtract(i.latLngToLayerPoint(n)),s={};for(this.fire("predrag"),o=0;o<4;o++)t=i.latLngToLayerPoint(e.getCorner(o)),s[o]=i.layerPointToLatLng(t.add(a));e.setCorners(s),e.fire("drag"),this.fire("drag")},this.dragging.on("dragend",(function(){e.fire("dragend")}))},_disableDragging:function(){this.dragging&&(this.dragging.disable(),delete this.dragging)},_dragMode:function(){this.setMode("drag")},_scaleMode:function(){this.setMode("scale")},_distortMode:function(){this.setMode("distort")},_rotateMode:function(){this.setMode("rotate")},_freeRotateMode:function(){this.setMode("freeRotate")},_toggleLockMode:function(){this.isMode("lock")?this._unlock():this._lock()},_toggleOpacity:function(){var t=this._overlay.getElement();if(this.hasTool(L.OpacityAction)){this._transparent=!this._transparent;var e=this._transparent?this.options.opacity:1;L.DomUtil.setOpacity(t,e),t.setAttribute("opacity",e),this._refresh()}},_toggleBorder:function(){var t=this._overlay.getElement();if(this.hasTool(L.BorderAction)){this._outlined=!this._outlined;var e=this._outlined?this.options.outline:"none";t.style.outline=e,this._refresh()}},_toggleOrder:function(){this._toggledImage?this._stackUp():this._stackDown()},_removeOverlay:function(){var t=this._overlay,e=this.parentGroup;!this.isMode("lock")&&this.hasTool(L.DeleteAction)&&L.DomUtil.confirmDelete()&&(this._removeToolbar(),e?e.removeLayer(t):t._map.removeLayer(t))},_getExport:function(){var t=this._overlay,e=t._map,i=t.getElement();if(this.hasTool(L.ExportAction)){var o=new Image;o.id=o.id||"tempId12345",document.body.appendChild(o),o.onload=function(){var i=o.height,n=o.width,a=e.latLngToLayerPoint(t.getCorner(0)),s=e.latLngToLayerPoint(t.getCorner(1)),r=e.latLngToLayerPoint(t.getCorner(2)),l=e.latLngToLayerPoint(t.getCorner(3));o.onload=function(){L.DomUtil.remove(o)},window&&window.hasOwnProperty("warpWebGl")&&warpWebGl(o.id,[0,0,n,0,n,i,0,i],[a.x,a.y,s.x,s.y,l.x,l.y,r.x,r.y],!0)},o.src=t.options.fullResolutionSrc||i.src}},_stackUp:function(){this._toggledImage&&this.hasTool(L.StackAction)&&(this._toggledImage=!1,this._overlay.bringToFront(),this._refresh())},_stackDown:function(){!this._toggledImage&&this.hasTool(L.StackAction)&&(this._toggledImage=!0,this._overlay.bringToBack(),this._refresh())},_unlock:function(){var t=this._overlay,e=t._map,i=this.parentGroup;this.isMode("lock")&&((!i||i.isCollected(t))&&i||this.hasTool(L.LockAction))&&(this.currentHandle&&e.removeLayer(this.currentHandle),"lock"!==t.options.mode&&this.hasMode(t.options.mode)?this._mode=t.options.mode:(this._mode="",this.currentHandle=""),this._updateHandle(),this._enableDragging(),this._refresh())},_lock:function(){var t=this._overlay,e=t._map,i=this.parentGroup;this.isMode("lock")||((!i||i.isCollected(t))&&i||this.hasTool(L.LockAction))&&(this.currentHandle&&e.removeLayer(this.currentHandle),this._mode="lock",this._updateHandle(),this._disableDragging(),this._refresh())},_deselect:function(){this._overlay.deselect()},_showMarkers:function(t){var e=this.parentGroup;this.currentHandle&&(!this.isMode("lock")&&e&&e.anyCollected()||this.currentHandle.eachLayer((function(t){t.setOpacity(1),t.dragging&&t.dragging.enable(),L.DomUtil.addClass(t.getElement(),"leaflet-interactive")})))},_hideMarkers:function(){var t=this._overlay,e=this.parentGroup;this._handles||this._initHandles(),this.currentHandle&&(this.isMode("lock")&&e&&e.isCollected(t)||this.currentHandle.eachLayer((function(t){t.setOpacity(0),t.dragging&&t.dragging.disable(),L.DomUtil.removeClass(t.getElement(),"leaflet-interactive")})))},_updateHandle:function(){var t=this._overlay._map,e=this.getMode();this.currentHandle&&t.removeLayer(this.currentHandle),this.currentHandle=""===e?"":this._handles[e],""!==this.currentHandle&&t.addLayer(this.currentHandle)},_addToolbar:function(){var t=this._overlay,e=this.parentGroup,i=t._map,o=t.getCorners(),n=-1/0;if(e&&e.anyCollected())e.editing._addToolbar();else if(!t.options.suppressToolbar&&!this.toolbar){for(var a=0;an&&(n=o[a].lat);var s=t.getCenter();s.lat=n,this.toolbar=L.distortableImage.popupBar(s,{actions:this.editActions}).addTo(i,t),t.fire("toolbar:created")}},_refresh:function(){this.toolbar&&this._removeToolbar(),this._addToolbar()},_updateToolbarPos:function(){var t=this._overlay,e=t.getCorners(),i=this.toolbar,o=-1/0;if(i&&i instanceof L.DistortableImage.PopupBar){for(var n=0;no&&(o=e[n].lat);var a=t.getCenter();a.lat=o,t.options.suppressToolbar||this.toolbar.setLatLng(a)}},hasMode:function(t){return!!this._modes[t]},getMode:function(){if(this.enabled())return this._mode},getModes:function(){return this._modes},isMode:function(t){return!!this.enabled()&&this._mode===t},setMode:function(t){var e=this._overlay,i=this.parentGroup;if(this.getMode()!==t&&this.hasMode(t)&&this.enabled())return this.toolbar&&this.toolbar.clickTool(t),this.isMode("lock")&&!this.dragging&&this._enableDragging(),this._mode=t,this.isMode("lock")&&this._disableDragging(),this._updateHandle(),this._refresh(),i&&i.isCollected(e)&&e.deselect(),this},nextMode:function(t){var e=this.getMode(),i=this.parentGroup,o=Object.keys(this.getModes()),n=o.indexOf(e),a=o[(n+1)%o.length];if(t){if(i&&i.anyCollected())return;L.DomEvent.stop(t)}return this.setMode(a)}}),L.distortableImage.edit=function(t,e){return new L.DistortableImage.Edit(t,e)}},426:function(){L.BorderAction=L.EditAction.extend({initialize:function(t,e,i){var o,n,a=e.editing,s=a._mode;a._outlined?(o="border_outer",n=e.options.translation.removeBorder):(o="border_clear",n=e.options.translation.addBorder),(i=i||{}).toolbarIcon={svg:!0,html:o,tooltip:n,className:"lock"===s?"disabled":""},L.DistortableImage.action_map.b="lock"===s?"":"_toggleBorder",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){var t=this._overlay.editing;L.IconUtil.toggleXlink(this._link,"border_clear","border_outer"),L.IconUtil.toggleTitle(this._link,"Remove Border","Add Border"),t._toggleBorder()}})},114:function(){L.DeleteAction=L.EditAction.extend({initialize:function(t,e,i){var o,n=e.editing;n instanceof L.DistortableImage.Edit?(o=e.options.translation.deleteImage,L.DistortableImage.action_map.Backspace="lock"===n._mode?"":"_removeOverlay"):(o=e.options.translation.deleteImages,L.DistortableImage.group_action_map.Backspace="lock"===n._mode?"":"_removeGroup"),(i=i||{}).toolbarIcon={svg:!0,html:"delete_forever",tooltip:o,className:"lock"===n._mode?"disabled":""},L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){var t=this._overlay.editing;t instanceof L.DistortableImage.Edit?t._removeOverlay():t._removeGroup()}})},231:function(){L.DistortAction=L.EditAction.extend({initialize:function(t,e,i){(i=i||{}).toolbarIcon={svg:!0,html:"distort",tooltip:e.options.translation.distortImage,className:"distort"},L.DistortableImage.action_map.d="_distortMode",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){this._overlay.editing._distortMode()}})},541:function(){L.DragAction=L.EditAction.extend({initialize:function(t,e,i){(i=i||{}).toolbarIcon={svg:!0,html:"drag",tooltip:e.options.translation.dragImage,className:"drag"},L.DistortableImage.action_map.D="_dragMode",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){this._overlay.editing._dragMode()}})},280:function(){L.DistortableImage=L.DistortableImage||{},L.distortableImage=L.DistortableImage,L.DistortableImage.action_map={},L.EditAction=L.Toolbar2.Action.extend({options:{toolbarIcon:{svg:!1,html:"",className:"",tooltip:""}},initialize:function(t,e,i){this._overlay=e,this._map=t,L.setOptions(this,i),L.Toolbar2.Action.prototype.initialize.call(this,i),this._injectIconSet()},_createIcon:function(t,e,i){var o=this,n=this.options.toolbarIcon,a=n.className,s=this._overlay.editing;this.toolbar=t,this._icon=L.DomUtil.create("li","",e),this._link=L.DomUtil.create("a","",this._icon),n.svg?this._link.innerHTML=L.IconUtil.create(n.html):this._link.innerHTML=n.html,this._link.setAttribute("href","#"),this._link.setAttribute("title",n.tooltip),this._link.setAttribute("role","button"),L.DomUtil.addClass(this._link,this.constructor.baseClass),a&&(L.DomUtil.addClass(this._link,a),"disabled"===a&&L.DomUtil.addClass(this._icon,a),a===s._mode?L.DomUtil.addClass(this._link,"selected-mode"):L.DomUtil.removeClass(this._link,"selected-mode")),L.DomEvent.on(this._link,"click",this.enable,this),L.DomEvent.on(this._overlay,"update",(function(){var t=o._link.innerHTML.match(/xlink:href="#restore"/);t&&1===t.length&&o._enableAction()})),this._addSubToolbar(t,this._icon,i)},_injectIconSet:function(){if(!document.querySelector("#iconset")){var t=document.createElement("div");t.id="iconset",t.setAttribute("hidden","hidden"),t.innerHTML=(new L.ToolbarIconSet).render(),document.querySelector(".leaflet-marker-pane").appendChild(t)}},_enableAction:function(){L.DomUtil.removeClass(this._link.parentElement,"disabled"),L.DomUtil.removeClass(this._link,"disabled")},_disableAction:function(){L.DomUtil.addClass(this._link.parentElement,"disabled"),L.DomUtil.addClass(this._link,"disabled")}}),L.editAction=function(t,e,i){return new L.EditAction(t,e,i)}},149:function(){L.ExportAction=L.EditAction.extend({initialize:function(t,e,i){var o,n=e.editing;this.isExporting=!1,this.mouseLeaveSkip=!0,this.isHooksExecuted=!1,n instanceof L.DistortableImage.Edit?(L.DistortableImage.action_map.e="_getExport",o=e.options.translation.exportImage):(L.DistortableImage.group_action_map.e="runExporter",o=e.options.translation.exportImages),(i=i||{}).toolbarIcon={svg:!0,html:"get_app",tooltip:o},L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){var t=this._overlay.editing;if(t instanceof L.DistortableImage.Edit)t._getExport();else if(!this.isHooksExecuted){this.isHooksExecuted=!0;var e=this._link.parentElement;this.mouseEnterHandler=this.handleMouseEnter.bind(this),this.mouseLeaveHandler=this.handleMouseLeave.bind(this),L.DomEvent.on(e,"click",(function(){if(this.isExporting){if(this.mouseLeaveSkip)return;this.resetState(),this.detachMouseEventListeners(e),t.cancelExport()}else this.isExporting=!0,this.renderExportIcon(),setTimeout(this.attachMouseEventListeners.bind(this,e),100),t.runExporter().then(function(){this.resetState(),this.detachMouseEventListeners(e)}.bind(this))}),this)}},resetState:function(){this.renderDownloadIcon(),this.isExporting=!1,this.mouseLeaveSkip=!0},attachMouseEventListeners:function(t){t.addEventListener("mouseenter",this.mouseEnterHandler),t.addEventListener("mouseleave",this.mouseLeaveHandler)},detachMouseEventListeners:function(t){t.removeEventListener("mouseenter",this.mouseEnterHandler),t.removeEventListener("mouseleave",this.mouseLeaveHandler)},handleMouseEnter:function(){this.renderCancelIcon()},handleMouseLeave:function(){this.mouseLeaveSkip?this.mouseLeaveSkip=!1:this.renderExportIcon()},renderDownloadIcon:function(){L.IconUtil.toggleXlink(this._link,"get_app","spinner"),L.IconUtil.toggleTitle(this._link,"Export Images","Loading..."),L.DomUtil.removeClass(this._link.firstChild,"loader")},renderExportIcon:function(){L.IconUtil.toggleXlink(this._link,"spinner"),L.IconUtil.toggleTitle(this._link,"Export Images","Loading..."),L.IconUtil.addClassToSvg(this._link,"loader")},renderCancelIcon:function(){L.IconUtil.toggleXlink(this._link,"cancel"),L.IconUtil.toggleTitle(this._link,"Cancel Export","Loading..."),L.DomUtil.removeClass(this._link.firstChild,"loader")}})},74:function(){L.FreeRotateAction=L.EditAction.extend({initialize:function(t,e,i){(i=i||{}).toolbarIcon={svg:!0,html:"crop_rotate",tooltip:e.options.translation.freeRotateImage,className:"freeRotate"},L.DistortableImage.action_map.f="_freeRotateMode",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){this._overlay.editing._freeRotateMode()}})},691:function(){L.GeolocateAction=L.EditAction.extend({initialize:function(t,e,i){var o=e.editing;(i=i||{}).toolbarIcon={svg:!0,html:"explore",tooltip:e.options.translation.geolocateImage,className:"lock"===o._mode?"disabled":""},L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){var t=this._overlay.getElement();EXIF.getData(t,L.EXIF(t))}})},105:function(){L.LockAction=L.EditAction.extend({initialize:function(t,e,i){var o,n,a=e.editing;a instanceof L.DistortableImage.Edit?(L.DistortableImage.action_map.u="_unlock",L.DistortableImage.action_map.l="_lock",n=e.options.translation.lockMode,o=a.isMode("lock")?"lock":"unlock"):(L.DistortableImage.group_action_map.l="_lockGroup",n=e.options.translation.lockImages,o="lock"),(i=i||{}).toolbarIcon={svg:!0,html:o,tooltip:n,className:"lock"},L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){var t=this._overlay.editing;t instanceof L.DistortableImage.Edit?t._toggleLockMode():t._lockGroup()}})},944:function(){L.OpacityAction=L.EditAction.extend({initialize:function(t,e,i){var o,n,a=e.editing,s=a._mode;a._transparent?(o="opacity_empty",n=e.options.translation.makeImageOpaque):(o="opacity",n=e.options.translation.makeImageTransparent),(i=i||{}).toolbarIcon={svg:!0,html:o,tooltip:n,className:"lock"===s?"disabled":""},L.DistortableImage.action_map.o="lock"===s?"":"_toggleOpacity",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){var t=this._overlay.editing,e=this._link;L.IconUtil.toggleXlink(e,"opacity","opacity_empty"),L.IconUtil.toggleTitle(e,"Make Image Transparent","Make Image Opaque"),t._toggleOpacity()}})},954:function(){L.RestoreAction=L.EditAction.extend({initialize:function(t,e,i){var o=L.Utils.getNestedVal(e,"editing","_mode"),n=e.edited;(i=i||{}).toolbarIcon={svg:!0,html:"restore",tooltip:e.options.translation.restoreImage,className:n&&"lock"!==o?"":"disabled"},L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){var t=this._overlay;L.DomEvent.on(t,{edit:this._enableAction,restore:this._disableAction},this),t.restore()}})},178:function(){L.RotateAction=L.EditAction.extend({initialize:function(t,e,i){(i=i||{}).toolbarIcon={svg:!0,html:"rotate",tooltip:e.options.translation.rotateImage,className:"rotate"},L.DistortableImage.action_map.r="_rotateMode",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){this._overlay.editing._rotateMode()}})},547:function(){L.ScaleAction=L.EditAction.extend({initialize:function(t,e,i){(i=i||{}).toolbarIcon={svg:!0,html:"scale",tooltip:e.options.translation.scaleImage,className:"scale"},L.DistortableImage.action_map.s="_scaleMode",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){this._overlay.editing._scaleMode()}})},886:function(){L.StackAction=L.EditAction.extend({initialize:function(t,e,i){var o,n,a=e.editing;a._toggledImage?(o="flip_to_back",n=e.options.translation.stackToFront):(o="flip_to_front",n=e.options.translation.stackToBack),(i=i||{}).toolbarIcon={svg:!0,html:o,tooltip:n,className:"lock"===a._mode?"disabled":""},L.DistortableImage.action_map.q="lock"===a._mode?"":"_stackUp",L.DistortableImage.action_map.a="lock"===a._mode?"":"_stackDown",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){var t=this._overlay.editing;L.IconUtil.toggleXlink(this._link,"flip_to_front","flip_to_back"),L.IconUtil.toggleTitle(this._link,"Stack to Front","Stack to Back"),t._toggleOrder()}})},129:function(){L.UnlockAction=L.EditAction.extend({initialize:function(t,e,i){(i=i||{}).toolbarIcon={svg:!0,html:"unlock",tooltip:e.options.translation.unlockImages},L.DistortableImage.group_action_map.u="_unlockGroup",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){this._overlay.editing._unlockGroup()}})},743:function(){L.EXIF=function(t){if(0!==Object.keys(EXIF.getAllTags(t)).length){console.log(EXIF.getAllTags(t));var e=EXIF.getAllTags(t);void 0!==e.GPSLatitude&&void 0!==e.GPSLongitude&&(e.GPSLatitude[0],e.GPSLatitude[1],e.GPSLatitude[2],e.GPSLongitude[0],e.GPSLongitude[1],e.GPSLongitude[2],e.GPSLatitudeRef,e.GPSLongitudeRef),"T"===e.GPSImgDirectionRef||"M"===e.GPSImgDirectionRef?(Math.PI,e.GPSImgDirection.numerator,e.GPSImgDirection.denominator):console.log("No compass data found"),console.log("Orientation:",e.Orientation),(6===e.Orientation||8===e.Orientation||3===e.Orientation)&&Math.PI,void 0!==e.GPSAltitude&&void 0!==e.GPSAltitudeRef&&void 0!==e.GPSAltitude&&void 0!==e.GPSAltitudeRef&&(e.GPSAltitude.numerator,e.GPSAltitude.denominator,e.GPSAltitudeRef)}else alert("EXIF initialized. Press again to view data in console.")}},92:function(){L.DistortHandle=L.EditHandle.extend({options:{TYPE:"distort",icon:L.icon({iconUrl:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAChSURBVO3BIU4DURgGwNkvL2B6AkQTLBqP4QCoSm7DDXoBLBZHDbfgICAIZjEV3YTn9uVHdMZZtcnCfI13bIzxg0emg6Nm6QVbYz3jylEsXRrvwommb49X67jFkz80fR9Mb1YxTzqiWBSLYlEsikWxKBbFolgUi2JRLIpFsSgWxaJY03fHHOu40dH07bAzWCx9Ge/TiWbpHgdsjPGNB2f/yS+7xRCyiiZPJQAAAABJRU5ErkJggg==",iconSize:[32,32],iconAnchor:[16,16]})},_onHandleDrag:function(){this._handled.setCorner(this._corner,this.getLatLng())},updateHandle:function(){this.setLatLng(this._handled.getCorner(this._corner))}}),L.distortHandle=function(t,e,i){return new L.DistortHandle(t,e,i)}},194:function(){L.DragHandle=L.EditHandle.extend({options:{TYPE:"drag",icon:L.icon({iconUrl:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAsVJREFUeNrMVztLXEEUvnNVFAVBAhY2aRKbTZEHJNpYabuNjSgYg/GxdsmPSJkUAa/ZdVEX8mgWYVutbHxAHkVskjQBuUUgBISVhCQk3wnfwMlk1rusN1wHPubOzJlzvjlz5sxc01Ma/hUEwQnwDIjqc7uvgv9YYO86qgIwCXQbdNTlQ8kcCBHgBch8TcloF6oJGr6phk6EQAkfdz3zvgDr9Mr7Fg1fptEZoM8jsmrokpfsiIFO4IIjuE2v1EDmR4LRdlR5Gh51hj8D34ABtm8YTtqna0TgklIw5CgQguKxIojEjmFROg/MKQO27NkFAB+4wAPouGUJiIvWKHwbAxX2XyWRKWkqhT+pbJntJZJuUzISW0+5hW+obxrVBsfvoH/dqCCJuU97GBh2VteLSiYvArmErT8EVoAK9Bw7enbpVYmvAQlyowYforrH5jXL2rPHI/TKONDB7u9AlavdaTBPvPmazUeQuy8f7UomUgTEwIJPEQ3sQGE/6ll2l9H/KcEzBcfWn2IclluM3DpddJxSHujlFkscbUPvmB0LHVnLrId7nlaZVkEc6QGXQI1MAwZcWmVRHeNaQwJMMiU2cwy4s7p/RJ2ckpvIQs+cIs+5GzitloLKHUV3MPREuXbTOKO91dX387gGTONxIgEWm+E61FFrpcyqXLHsEwiDjEsjAksqw5XPoL9MHVrn6QR4q+XZrDaR4RoWzq2ymafuRA/Mq1stSsHLVkcbdf9VjOcx8ZH3+SFWcCWlVPyWuUBOwUWdC1wP5NVjYiXFWLO69PZ6CRTUY6KSIoEKdf6T3IzzgHxnsyHctNBEkmn6Oob8ExUDg/ahGybd177cDjzH5xHwgDiSvoS7I/LZyvxJZj0wod7tkX5G0XVC7rEyLhfLJjBGbKoLLEfZWObyKeZ6oY82g+yf5Zn/mJyHX7PMf04z/T3/LcAAu4E6iiyJqf0AAAAASUVORK5CYII=",iconSize:[32,32],iconAnchor:[16,16]})},_onHandleDrag:function(){var t=this._handled,e=t.getCorner(this._corner),i=this.getLatLng();t.dragBy(e,i)},updateHandle:function(){this.setLatLng(this._handled.getCorner(this._corner))}}),L.dragHandle=function(t,e,i){return new L.DragHandle(t,e,i)}},988:function(){L.EditHandle=L.Marker.extend({initialize:function(t,e,i){var o=t.getCorner(e);L.setOptions(this,i),this._handled=t,this._corner=e;var n={draggable:!0,zIndexOffset:10};i&&i.hasOwnProperty("draggable")&&(n.draggable=i.draggable),L.Marker.prototype.initialize.call(this,o,n)},onAdd:function(t){L.Marker.prototype.onAdd.call(this,t),this._bindListeners(),this.updateHandle()},onRemove:function(t){this._unbindListeners(),L.Marker.prototype.onRemove.call(this,t)},_onHandleDragStart:function(){this._handled.fire("editstart")},_onHandleDragEnd:function(){this._fireEdit()},_fireEdit:function(){this._handled.edited=!0,this._handled.fire("edit")},_bindListeners:function(){this.on({contextmenu:L.DomEvent.stop,dragstart:this._onHandleDragStart,drag:this._onHandleDrag,dragend:this._onHandleDragEnd},this),this._handled._map.on("zoomend",this.updateHandle,this),this._handled.on("update",this.updateHandle,this)},_unbindListeners:function(){this.off({contextmenu:L.DomEvent.stop,dragstart:this._onHandleDragStart,drag:this._onHandleDrag,dragend:this._onHandleDragEnd},this),this._handled._map.off("zoomend",this.updateHandle,this),this._handled.off("update",this.updateHandle,this)},_calculateScalingFactor:function(t,e){var i=this._handled,o=i._map,n=o.latLngToLayerPoint(i.getCenter()),a=o.latLngToLayerPoint(t),s=o.latLngToLayerPoint(e),r=this._d2(n,a),l=this._d2(n,s);return Math.sqrt(l/r)},_d2:function(t,e){var i=t.x-e.x,o=t.y-e.y;return Math.pow(i,2)+Math.pow(o,2)},calculateAngleDelta:function(t,e){var i=this._handled,o=i._map,n=o.latLngToLayerPoint(i.getCenter()),a=o.latLngToLayerPoint(t),s=o.latLngToLayerPoint(e),r=Math.atan2(n.y-a.y,n.x-a.x);return Math.atan2(n.y-s.y,n.x-s.x)-r}})},206:function(){L.FreeRotateHandle=L.EditHandle.extend({options:{TYPE:"freeRotate",icon:L.icon({iconUrl:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAHiSURBVMXBa3HbShgA0PMp/1sCCo8oCEpgTaCXgIXAJiDzyCJoAUTm4UVQAns1Y8+snWnTvJyeE16hkjDgDrfoNTMKcpC9UPiLSo8JyetkjEHxjPCMyoS199kFoz8Iv1HpMaN3qWDCHoegOKkkRwnJpRmroHgiPFEZ8IBekzEGxQtUEhKSS/fB7Ew4U+lxcGkVZG9QWWPSFAxBcdK59KApuA+yNwp2uEdx1GN25sZJZULSfAtm77SlbNjju6MvG75u+WHRWVR6rDVjMPsgwYyVZl3pLTpHkyYHOx8syMiayaJzlDTZ9YyaZNFVkiYH2ZUEBcVJJXVImuz6Js3Qofe59pq7DoOTILu+g+a288mCouk7/1iH4qTS+2QdDppbV1ZJmrnDXnPnc5UOs2Z0fUmTuyBr+krvSioJyUmQO0dZM7mepMkWnaNRkyrJB6uskTSjxY3Fll8bvmJwlDb83FJ8gMqAB80uyBY3Trb82PAfvjj6vuHnluIdKgMeNXOwctK5NKBoHitrb1RJeHRp5Ux4ojLg0aWMHGQvUOkxIWkKVsHsTPiNSo8HDC5lZIsgO6n0uMUdRvQuFQxB8UR4RmXC2vvsgtEfhL+o9JiQvE7GGBTPCK9QSUjoMWgKDthjDrIX+h/k0I7gth6N5gAAAABJRU5ErkJggg==",iconSize:[32,32],iconAnchor:[16,16]})},_onHandleDrag:function(){var t=this._handled,e=t._map,i=t.getCorner(this._corner),o=this.getLatLng(),n=this.calculateAngleDelta(i,o),a=this._calculateScalingFactor(i,o);0!==n&&t.rotateBy(n,"rad");var s=t.edgeMinWidth;s||(s=50);var r=e.latLngToContainerPoint(t.getCorner(0)),l=e.latLngToContainerPoint(t.getCorner(1)),c=Math.abs(r.x-l.x),d=Math.abs(r.y-l.y);Math.sqrt(c*c+d*d)>s||a>1?t.scaleBy(a):t.scaleBy(1)},updateHandle:function(){this.setLatLng(this._handled.getCorner(this._corner))}}),L.freeRotateHandle=function(t,e,i){return new L.FreeRotateHandle(t,e,i)}},789:function(){L.LockHandle=L.EditHandle.extend({options:{TYPE:"lock",interactive:!1,icon:L.icon({iconUrl:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAD8SURBVO3BPU7CYAAA0AdfjIcQlRCQBG7C3gk2uIPG2RC3Dk16Gz0FTO1WZs/gwGCMP/2+xsSl7+n1er1Iz9LtRQjaPeMeO+TinLDCJV78YqjdA04YodKuxhUaPGoRxMmxwRQZSt87Yo4KExGCeAUyLLFB4bMacxywEClIU2KDKXbInTUYo8JCgoFuGoxQO5uiwY1EA91VmDqrcKeDoX8WdNNgjApvmGGLXKIgXY0xGkxQYItrrFFIEKQ5Yo4KEx9yrDFDhlKkIF6NOQ5Y+KpAhiXWKEQI4pxwiwoLPyuxwQw75FoE7fZYocFEuwI7jHCBV39gL92TXq/Xi/AOcmczZmaIMScAAAAASUVORK5CYII=",iconSize:[32,32],iconAnchor:[16,16]})},onRemove:function(t){this.unbindTooltip(),L.EditHandle.prototype.onRemove.call(this,t)},_bindListeners:function(){var t=this.getElement();L.EditHandle.prototype._bindListeners.call(this),L.DomEvent.on(t,{mousedown:this._tooltipOn,mouseup:this._tooltipOff},this),L.DomEvent.on(document,"pointerleave",this._tooltipOff,this)},_unbindListeners:function(){var t=this.getElement();L.EditHandle.prototype._bindListeners.call(this),L.DomEvent.off(t,{mousedown:this._tooltipOn,mouseup:this._tooltipOff},this),L.DomEvent.off(document,"pointerleave",this._tooltipOff,this)},_onHandleDrag:function(){},updateHandle:function(){this.setLatLng(this._handled.getCorner(this._corner))},_tooltipOn:function(t){var e=this._handled.parentGroup,i=e?e.editing:this._handled.editing;if(!t.shiftKey&&(this._handled.isSelected()||!e||e.isCollected(this._handled))){var o=i._lockHandles;this._timer=setTimeout(L.bind((function(){this._timeout&&clearTimeout(this._timeout),this.getTooltip()?o.eachLayer((function(t){this!==t&&t.closeTooltip()})):this.bindTooltip("Locked!",{permanent:!0}),this.openTooltip()}),this),500)}},_tooltipOff:function(t){var e=this._handled.parentGroup,i=e?e.editing:this._handled.editing;if(!t.shiftKey&&(this._handled.isSelected()||!e||e.isCollected(this._handled))){var o=i._lockHandles;t.currentTarget===document&&o.eachLayer((function(t){t.closeTooltip()})),this._timer&&clearTimeout(this._timer),this._timeout=setTimeout(L.bind((function(){this.closeTooltip()}),this),400)}}}),L.lockHandle=function(t,e,i){return new L.LockHandle(t,e,i)}},337:function(){L.RotateHandle=L.EditHandle.extend({options:{TYPE:"rotate",icon:L.icon({iconUrl:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAHiSURBVMXBa3HbShgA0PMp/1sCCo8oCEpgTaCXgIXAJiDzyCJoAUTm4UVQAns1Y8+snWnTvJyeE16hkjDgDrfoNTMKcpC9UPiLSo8JyetkjEHxjPCMyoS199kFoz8Iv1HpMaN3qWDCHoegOKkkRwnJpRmroHgiPFEZ8IBekzEGxQtUEhKSS/fB7Ew4U+lxcGkVZG9QWWPSFAxBcdK59KApuA+yNwp2uEdx1GN25sZJZULSfAtm77SlbNjju6MvG75u+WHRWVR6rDVjMPsgwYyVZl3pLTpHkyYHOx8syMiayaJzlDTZ9YyaZNFVkiYH2ZUEBcVJJXVImuz6Js3Qofe59pq7DoOTILu+g+a288mCouk7/1iH4qTS+2QdDppbV1ZJmrnDXnPnc5UOs2Z0fUmTuyBr+krvSioJyUmQO0dZM7mepMkWnaNRkyrJB6uskTSjxY3Fll8bvmJwlDb83FJ8gMqAB80uyBY3Trb82PAfvjj6vuHnluIdKgMeNXOwctK5NKBoHitrb1RJeHRp5Ux4ojLg0aWMHGQvUOkxIWkKVsHsTPiNSo8HDC5lZIsgO6n0uMUdRvQuFQxB8UR4RmXC2vvsgtEfhL+o9JiQvE7GGBTPCK9QSUjoMWgKDthjDrIX+h/k0I7gth6N5gAAAABJRU5ErkJggg==",iconSize:[32,32],iconAnchor:[16,16]})},_onHandleDrag:function(){var t=this._handled,e=t.getCorner(this._corner),i=this.getLatLng(),o=this.calculateAngleDelta(e,i);t.rotateBy(o,"rad")},updateHandle:function(){this.setLatLng(this._handled.getCorner(this._corner))}}),L.rotateHandle=function(t,e,i){return new L.RotateHandle(t,e,i)}},350:function(){L.ScaleHandle=L.EditHandle.extend({options:{TYPE:"scale",icon:L.icon({iconUrl:"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2ZXJzaW9uPSIxLjEiIHdpZHRoPSI0NTkiIGhlaWdodD0iNDY0IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCA1MTIgNTEyIiB4bWw6c3BhY2U9InByZXNlcnZlIiBzdHlsZT0iIj48cmVjdCBpZD0iYmFja2dyb3VuZHJlY3QiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIHg9IjAiIHk9IjAiIGZpbGw9Im5vbmUiIHN0cm9rZT0ibm9uZSIgY2xhc3M9IiIgc3R5bGU9IiIvPjxnIGNsYXNzPSJjdXJyZW50TGF5ZXIiIHN0eWxlPSIiPjx0aXRsZT5MYXllciAxPC90aXRsZT48cGF0aCBkPSJNNDU5LjA0OTE1OTUzMDQ3MTM0LDg2LjkyNjIzNDUxMjU1MDAyIFYwIGgtODUuNzE0NTczMzU2MzEyMDkgdjI3LjA0MzcxNzQwMzkwNDQ1MiBIODUuNzE0NTczMzU2MzEyMDMgVjAgSDAgdjg2LjkyNjIzNDUxMjU1MDAyIGgyNS43MTQzNzIwMDY4OTM2MjYgdjI4OS43NTQxMTUwNDE4MzM0IEgwIHY4Ni45MjYyMzQ1MTI1NTAwMiBoODUuNzE0NTczMzU2MzEyMDkgdi0yNy4wNDM3MTc0MDM5MDQ0NTIgaDI4NS43MTUyNDQ1MjEwNDAzIHYyNy4wNDM3MTc0MDM5MDQ0NTIgaDg1LjcxNDU3MzM1NjMxMjA5IHYtODYuOTI2MjM0NTEyNTUwMDIgaC0yMy44MDk2MDM3MTAwODY2OSBWODYuOTI2MjM0NTEyNTUwMDIgSDQ1OS4wNDkxNTk1MzA0NzEzNCB6TTM4NC43NjMxOTU5NTUwMDA5LDEyLjU1NjAxMTY1MTgxMjc4MSBoNjEuOTA0OTY5NjQ2MjI1Mzk2IHY2Mi43ODAwNTgyNTkwNjM5MSBoLTYxLjkwNDk2OTY0NjIyNTM5NiBWMTIuNTU2MDExNjUxODEyNzgxIHpNMTIuMzgwOTkzOTI5MjQ1MDUsMTIuNTU2MDExNjUxODEyNzgxIGg2MS45MDQ5Njk2NDYyMjUzOTYgdjYyLjc4MDA1ODI1OTA2MzkxIEgxMi4zODA5OTM5MjkyNDUwNSBWMTIuNTU2MDExNjUxODEyNzgxIHpNNzQuMjg1OTYzNTc1NDcwNTMsNDUxLjA1MDU3MjQxNTEyMDY2IEgxMi4zODA5OTM5MjkyNDUwNSB2LTYyLjc4MDA1ODI1OTA2MzkxIGg2MS45MDQ5Njk2NDYyMjUzOTYgVjQ1MS4wNTA1NzI0MTUxMjA2NiB6TTQ0NS43MTU3ODE0NTI4MjI3NCw0NTEuMDUwNTcyNDE1MTIwNjYgaC02Mi44NTczNTM3OTQ2Mjg4NjQgdi02Mi43ODAwNTgyNTkwNjM5MSBoNjIuODU3MzUzNzk0NjI4ODY0IFY0NTEuMDUwNTcyNDE1MTIwNjYgek00MDcuNjIwNDE1NTE2Njg0MjYsMzc2LjY4MDM0OTU1NDM4MzQ0IGgtMzYuMTkwNTk3NjM5MzMxNzcgdjMyLjgzODc5OTcwNDc0MTEyIEg4NS43MTQ1NzMzNTYzMTIwMyB2LTMyLjgzODc5OTcwNDc0MTEyIEg0OS41MjM5NzU3MTY5ODAzMiBWODYuOTI2MjM0NTEyNTUwMDIgaDM2LjE5MDU5NzYzOTMzMTc3IFY1MC4yMjQwNDY2MDcyNTExMjUgaDI4Ny42MjAwMTI4MTc4NDcyIHYzNi43MDIxODc5MDUyOTg5IGgzNC4yODU4MjkzNDI1MjQ4MzUgVjM3Ni42ODAzNDk1NTQzODM0NCB6IiBpZD0ic3ZnXzIiIGNsYXNzPSIiIGZpbGw9IiMxYTFhZWIiIGZpbGwtb3BhY2l0eT0iMSIvPjwvZz48L3N2Zz4=",iconSize:[32,32],iconAnchor:[16,16]})},_onHandleDrag:function(){var t=this._handled,e=t._map,i=t.edgeMinWidth,o=t.getCorner(this._corner),n=this.getLatLng(),a=this._calculateScalingFactor(o,n);i||(i=50);var s=e.latLngToLayerPoint(t.getCorner(0)),r=e.latLngToLayerPoint(t.getCorner(1)),l=Math.abs(s.x-r.x),c=Math.abs(s.y-r.y);Math.sqrt(l*l+c*c)>i||a>1?t.scaleBy(a):t.scaleBy(1)},updateHandle:function(){this.setLatLng(this._handled.getCorner(this._corner))}}),L.scaleHandle=function(t,e,i){return new L.ScaleHandle(t,e,i)}},719:function(){L.distortableImage=L.DistortableImage||{},L.distortableImage=L.DistortableImage,L.DistortableImage.group_action_map={},L.DistortableImage.ControlBar=L.Toolbar2.Control.extend({}),L.distortableImage.controlBar=function(t){return new L.DistortableImage.ControlBar(t)},L.DistortableCollection.addInitHook((function(){this.ACTIONS=[L.ExportAction,L.DeleteAction,L.LockAction,L.UnlockAction],L.DistortableCollection.Edit.MODES={lock:L.LockAction,unlock:L.UnlockAction};var t=this.options.actions?this.options.actions:this.ACTIONS;this.editing=L.distortableCollection.edit(this,{actions:t})}))},93:function(){L.DistortableImage=L.DistortableImage||{},L.distortableImage=L.DistortableImage,L.DistortableImage.action_map={},L.DistortableImage.PopupBar=L.Toolbar2.Popup.extend({options:{anchor:[0,-10]},initialize:function(t,e){L.setOptions(this,e),L.Toolbar2.Popup.prototype.initialize.call(this,t,e)},addHooks:function(t,e){this.map=t,this.ov=e},tools:function(){if(this._ul)return this._ul.children},clickTool:function(t){for(var e=this.tools(),i=0;i',_symbols:"",render:function(){return this.addSymbols(this._symbols),this._svg},addSymbols:function(t){this._svg+=t}})},261:function(){L.KeymapperIconSet=L.IconSet.extend({_symbols:''})},929:function(){L.ToolbarIconSet=L.IconSet.extend({_symbols:''})},496:function(){L.Map.mergeOptions({boxCollector:!0,boxZoom:!1}),L.Map.BoxCollector=L.Map.BoxZoom.extend({initialize:function(t){this._map=t,this._container=t._container,this._pane=t._panes.overlayPane,this._resetStateTimeout=0,t.on("unload",this._destroy,this)},addHooks:function(){L.DomEvent.on(this._container,"mousedown",this._onMouseDown,this)},removeHooks:function(){L.DomEvent.off(this._container,"mousedown",this._onMouseDown,this)},moved:function(){return this._moved},_destroy:function(){L.DomUtil.remove(this._pane),delete this._pane},_resetState:function(){this._resetStateTimeout=0,this._moved=!1},_clearDeferredResetState:function(){0!==this._resetStateTimeout&&(clearTimeout(this._resetStateTimeout),this._resetStateTimeout=0)},_onMouseDown:function(t){if(!t.shiftKey||1!==t.which&&1!==t.button)return!1;this._clearDeferredResetState(),this._resetState(),L.DomUtil.disableTextSelection(),L.DomUtil.disableImageDrag(),this._startPoint=this._map.mouseEventToContainerPoint(t),L.DomEvent.on(document,{contextmenu:L.DomEvent.stop,mousemove:this._onMouseMove,mouseup:this._onMouseUp},this)},_onMouseMove:function(t){this._moved||(this._moved=!0,this._box=L.DomUtil.create("div","leaflet-zoom-box",this._container),L.DomUtil.addClass(this._container,"leaflet-crosshair"),this._map.fire("boxzoomstart")),this._point=this._map.mouseEventToContainerPoint(t),this._bounds=L.bounds(this._startPoint,this._point);var e=this._bounds.getSize();L.DomUtil.setPosition(this._box,this._bounds.min),this._box.style.width=e.x+"px",this._box.style.height=e.y+"px"},_finish:function(){this._moved&&(L.DomUtil.remove(this._box),L.DomUtil.removeClass(this._container,"leaflet-crosshair")),L.DomUtil.enableTextSelection(),L.DomUtil.enableImageDrag(),L.DomEvent.off(document,{contextmenu:L.DomEvent.stop,mousemove:this._onMouseMove,mouseup:this._onMouseUp},this)},_onMouseUp:function(t){if((1===t.which||1===t.button)&&(this._finish(),this._moved)){this._clearDeferredResetState(),this._resetStateTimeout=setTimeout(L.Util.bind(this._resetState,this),0);var e=L.latLngBounds(this._map.containerPointToLatLng(this._bounds.getBottomLeft()),this._map.containerPointToLatLng(this._bounds.getTopRight())),i=this._map.getZoom(),o=this._map.getCenter();e=this._map._latLngBoundsToNewLayerBounds(e,i,o),this._map.fire("boxcollectend",{boxCollectBounds:e})}}}),L.Map.addInitHook("addHandler","boxCollector",L.Map.BoxCollector)},291:function(){L.Map.mergeOptions({doubleClickLabels:!0}),L.Map.DoubleClickLabels=L.Map.DoubleClickZoom.extend({enable:function(){var t=this._map;return this._enabled||(t.doubleClickZoom.enabled()&&t.doubleClickZoom.disable(),this._map.fire("singleclickon"),this._enabled=!0,this.addHooks()),this},disable:function(){return this._enabled?(this._enabled=!1,this.removeHooks(),this):this},_fireIfSingle:function(t){var e=this._map,i=t.originalEvent;i&&i.shiftKey||(e._clicked+=1,this._map._clickTimeout=setTimeout((function(){1===e._clicked?(e._clicked=0,e.fire("singleclick",{type:"singleclick"})):L.Browser.touch&&i&&i.sourceCapabilities.firesTouchEvents&&e.fire("dblclick")}),250))},_onDoubleClick:function(){var t=this._map,e=t._labels;setTimeout((function(){t._clicked=0,clearTimeout(t._clickTimeout)}),0),e&&(1===e.options.opacity?(e.options.opacity=0,e.setOpacity(0)):(e.options.opacity=1,e.setOpacity(1)))}}),L.Map.addInitHook("addHandler","doubleClickLabels",L.Map.DoubleClickLabels)},752:function(){L.Map.DoubleClickZoom.include({addHooks:function(){this._map.on({click:this._fireIfSingle,dblclick:this._onDoubleClick},this)},removeHooks:function(){this._map.off({click:this._fireIfSingle,dblclick:this._onDoubleClick},this)},enable:function(){return this._enabled||this._map.doubleClickLabels&&this._map.doubleClickLabels.enabled()||(this._map.fire("singleclickon"),this._enabled=!0,this.addHooks()),this},disable:function(){return this._enabled?(this._map.fire("singleclickoff"),this._enabled=!1,this.removeHooks(),this):this},_fireIfSingle:function(t){var e=this._map,i=t.originalEvent;i&&i.shiftKey||(e._clicked+=1,this._map._clickTimeout=setTimeout((function(){1===e._clicked?(e._clicked=0,e.fire("singleclick",{type:"singleclick"})):L.Browser.touch&&i&&i.sourceCapabilities.firesTouchEvents&&e._fireDOMEvent(i,"dblclick",[e])}),250))},_onDoubleClick:function(t){var e=this._map,i=t.originalEvent;if(setTimeout((function(){e._clicked=0,clearTimeout(e._clickTimeout)}),0),!i)return!1;var o=e.getZoom(),n=e.options.zoomDelta,a=i.shiftKey?o-n:o+n;"center"===e.options.doubleClickZoom?e.setZoom(a):e.setZoomAround(t.containerPoint,a)}})},131:function(){L.Map.include({_clicked:0,addGoogleMutant:function(t){return(t=this.mutantOptions=L.extend({mutantOpacity:.8,maxZoom:24,maxNativeZoom:20,minZoom:0,labels:!0,labelOpacity:1,doubleClickLabels:!0},t)).labels||(this.mutantOptions=L.extend(this.mutantOptions,{labelOpacity:t.labels?1:void 0,doubleClickLabels:!!t.labels||void 0})),this._googleMutant=L.tileLayer("http://mt0.google.com/vt/lyrs=s&x={x}&y={y}&z={z}",{maxZoom:t.maxZoom,maxNativeZoom:t.maxNativeZoom,minZoom:t.minZoom,opacity:t.mutantOpacity}).addTo(this),t.labels?this._addLabels(t):this.doubleClickLabels=void 0,this},_addLabels:function(t){return 0!==t.labelOpacity&&1!==t.labelOpacity&&(t.labelOpacity=1),this._labels=L.tileLayer("https://stamen-tiles-{s}.a.ssl.fastly.net/toner-labels/{z}/{x}/{y}{r}.{ext}",{attribution:'Map tiles by Stamen Design, CC BY 3.0 — Map data © OpenStreetMap contributors',subdomains:"abcd",interactive:!1,opacity:t.labelOpacity,maxZoom:t.maxZoom,maxNativeZoom:t.maxNativeZoom,minZoom:t.minZoom,ext:"png"}).addTo(this),this.mutantOptions.doubleClickLabels&&this.doubleClickLabels.enable(),this}}),L.Map.addInitHook((function(){this.doubleClickLabels.disable(),this.doubleClickZoom.enable()}))},999:function(){L.DomUtil=L.extend(L.DomUtil,{initTranslation:function(t){this.translation=t},getMatrixString:function(t){var e=L.Browser.webkit3d||L.Browser.gecko3d||L.Browser.ie3d,i=[t[0],t[3],0,t[6],t[1],t[4],0,t[7],0,0,1,0,t[2],t[5],0,t[8]],o=e?"matrix3d("+i.join(",")+")":"";return e||console.log("Your browser must support 3D CSS transformsin order to use DistortableImageOverlay."),o},toggleClass:function(t,e){var i=e;return this.hasClass(t,i)?this.removeClass(t,i):this.addClass(t,i)},confirmDelete:function(){return window.confirm(this.translation.confirmImageDelete)},confirmDeletes:function(t){if(1===t)return this.confirmDelete();var e,i=this.translation.confirmImagesDeletes;return e="function"==typeof i?i(t):i,window.confirm(e)}})},85:function(){L.IconUtil={create:function(t){return/^#/.test(t)&&(t=t.replace(/^#/,"")),''},addClassToSvg:function(t,e){var i=t.querySelector("svg");i&&L.DomUtil.addClass(i,e)},toggleXlink:function(t,e,i){/^#/.test(e)||(e="#"+e),/^#/.test(i)||(i="#"+i);var o=t.querySelector("use");if(o){var n=o.getAttribute("xlink:href")===e?i:e;return o.setAttribute("xlink:href",n),n}return!1},toggleTitle:function(t,e,i){var o=t.getAttribute("title")===e?i:e;return t.setAttribute("title",o),t.hasAttribute("aria-label")&&t.setAttribute("aria-label",o),o}}},351:function(){L.ImageUtil={getCmPerPixel:function(t){var e=t._map;return 100*e.latLngToLayerPoint(t.getCorner(0)).distanceTo(e.latLngToLayerPoint(t.getCorner(1)))/t.getElement().width}}},360:function(){L.MatrixUtil={adj:function(t){return[t[4]*t[8]-t[5]*t[7],t[2]*t[7]-t[1]*t[8],t[1]*t[5]-t[2]*t[4],t[5]*t[6]-t[3]*t[8],t[0]*t[8]-t[2]*t[6],t[2]*t[3]-t[0]*t[5],t[3]*t[7]-t[4]*t[6],t[1]*t[6]-t[0]*t[7],t[0]*t[4]-t[1]*t[3]]},multmm:function(t,e){var i,o=[];for(i=0;i<3;i++)for(var n=0;n<3;n++){for(var a=0,s=0;s<3;s++)a+=t[3*i+s]*e[3*s+n];o[3*i+n]=a}return o},multmv:function(t,e){return[t[0]*e[0]+t[1]*e[1]+t[2]*e[2],t[3]*e[0]+t[4]*e[1]+t[5]*e[2],t[6]*e[0]+t[7]*e[1]+t[8]*e[2]]},multsm:function(t,e){for(var i=[],o=0,n=e.length;o2&&void 0!==arguments[2]?arguments[2]:"deg";return"deg"===i?this.radiansToDegrees(Math.atan2(e,t)):Math.atan2(e,t)},radiansToDegrees:function(t){return 180*t/Math.PI},degreesToRadians:function(t){return t*Math.PI/180}}},866:function(){L.Utils={initTranslation:function(){var t={deleteImage:"Delete Image",deleteImages:"Delete Images",distortImage:"Distort Image",dragImage:"Drag Image",exportImage:"Export Image",exportImages:"Export Images",removeBorder:"Remove Border",addBorder:"Add Border",freeRotateImage:"Free rotate Image",geolocateImage:"Geolocate Image",lockMode:"Lock Mode",lockImages:"Lock Images",makeImageOpaque:"Make Image Opaque",makeImageTransparent:"Make Image Transparent",restoreImage:"Restore Natural Image",rotateImage:"Rotate Image",scaleImage:"Scale Image",stackToFront:"Stack to Front",stackToBack:"Stack to Back",unlockImages:"Unlock Images",confirmImageDelete:"Are you sure? This image will be permanently deleted from the map.",confirmImagesDeletes:"Are you sure? These images will be permanently deleted from the map."};if(this.options.translation)for(var e in t)this.options.translation.hasOwnProperty(e)||(this.options.translation[e]=t[e]);else this.options.translation=t;L.DomUtil.initTranslation(this.options.translation)},getNestedVal:function(t,e,i){return[e,i].reduce((function(t,e){return t&&t[e]}),t)}}}};t[999](),t[85](),t[351](),t[360](),t[682](),t[866](),t[477](),t[808](),t[743](),t[988](),t[92](),t[194](),t[206](),t[789](),t[337](),t[350](),t[376](),t[261](),t[929](),t[280](),t[426](),t[114](),t[231](),t[541](),t[149](),t[74](),t[691](),t[105](),t[944](),t[954](),t[178](),t[547](),t[886](),t[129](),t[93](),t[719](),t[397](),t[428](),t[782](),t[752](),t[496](),t[291](),t[131]()}(); +/******/ (function() { // webpackBootstrap +/******/ var __webpack_modules__ = ({ + +/***/ "./node_modules/ansi-html-community/index.js": +/*!***************************************************!*\ + !*** ./node_modules/ansi-html-community/index.js ***! + \***************************************************/ +/***/ (function(module) { + +"use strict"; + + +module.exports = ansiHTML + +// Reference to https://github.com/sindresorhus/ansi-regex +var _regANSI = /(?:(?:\u001b\[)|\u009b)(?:(?:[0-9]{1,3})?(?:(?:;[0-9]{0,3})*)?[A-M|f-m])|\u001b[A-M]/ + +var _defColors = { + reset: ['fff', '000'], // [FOREGROUD_COLOR, BACKGROUND_COLOR] + black: '000', + red: 'ff0000', + green: '209805', + yellow: 'e8bf03', + blue: '0000ff', + magenta: 'ff00ff', + cyan: '00ffee', + lightgrey: 'f0f0f0', + darkgrey: '888' +} +var _styles = { + 30: 'black', + 31: 'red', + 32: 'green', + 33: 'yellow', + 34: 'blue', + 35: 'magenta', + 36: 'cyan', + 37: 'lightgrey' +} +var _openTags = { + '1': 'font-weight:bold', // bold + '2': 'opacity:0.5', // dim + '3': '', // italic + '4': '', // underscore + '8': 'display:none', // hidden + '9': '' // delete +} +var _closeTags = { + '23': '', // reset italic + '24': '', // reset underscore + '29': '' // reset delete +} + +;[0, 21, 22, 27, 28, 39, 49].forEach(function (n) { + _closeTags[n] = '' +}) + +/** + * Converts text with ANSI color codes to HTML markup. + * @param {String} text + * @returns {*} + */ +function ansiHTML (text) { + // Returns the text if the string has no ANSI escape code. + if (!_regANSI.test(text)) { + return text + } + + // Cache opened sequence. + var ansiCodes = [] + // Replace with markup. + var ret = text.replace(/\033\[(\d+)m/g, function (match, seq) { + var ot = _openTags[seq] + if (ot) { + // If current sequence has been opened, close it. + if (!!~ansiCodes.indexOf(seq)) { // eslint-disable-line no-extra-boolean-cast + ansiCodes.pop() + return '' + } + // Open tag. + ansiCodes.push(seq) + return ot[0] === '<' ? ot : '' + } + + var ct = _closeTags[seq] + if (ct) { + // Pop sequence + ansiCodes.pop() + return ct + } + return '' + }) + + // Make sure tags are closed. + var l = ansiCodes.length + ;(l > 0) && (ret += Array(l + 1).join('')) + + return ret +} + +/** + * Customize colors. + * @param {Object} colors reference to _defColors + */ +ansiHTML.setColors = function (colors) { + if (typeof colors !== 'object') { + throw new Error('`colors` parameter must be an Object.') + } + + var _finalColors = {} + for (var key in _defColors) { + var hex = colors.hasOwnProperty(key) ? colors[key] : null + if (!hex) { + _finalColors[key] = _defColors[key] + continue + } + if ('reset' === key) { + if (typeof hex === 'string') { + hex = [hex] + } + if (!Array.isArray(hex) || hex.length === 0 || hex.some(function (h) { + return typeof h !== 'string' + })) { + throw new Error('The value of `' + key + '` property must be an Array and each item could only be a hex string, e.g.: FF0000') + } + var defHexColor = _defColors[key] + if (!hex[0]) { + hex[0] = defHexColor[0] + } + if (hex.length === 1 || !hex[1]) { + hex = [hex[0]] + hex.push(defHexColor[1]) + } + + hex = hex.slice(0, 2) + } else if (typeof hex !== 'string') { + throw new Error('The value of `' + key + '` property must be a hex string, e.g.: FF0000') + } + _finalColors[key] = hex + } + _setTags(_finalColors) +} + +/** + * Reset colors. + */ +ansiHTML.reset = function () { + _setTags(_defColors) +} + +/** + * Expose tags, including open and close. + * @type {Object} + */ +ansiHTML.tags = {} + +if (Object.defineProperty) { + Object.defineProperty(ansiHTML.tags, 'open', { + get: function () { return _openTags } + }) + Object.defineProperty(ansiHTML.tags, 'close', { + get: function () { return _closeTags } + }) +} else { + ansiHTML.tags.open = _openTags + ansiHTML.tags.close = _closeTags +} + +function _setTags (colors) { + // reset all + _openTags['0'] = 'font-weight:normal;opacity:1;color:#' + colors.reset[0] + ';background:#' + colors.reset[1] + // inverse + _openTags['7'] = 'color:#' + colors.reset[1] + ';background:#' + colors.reset[0] + // dark grey + _openTags['90'] = 'color:#' + colors.darkgrey + + for (var code in _styles) { + var color = _styles[code] + var oriColor = colors[color] || '000' + _openTags[code] = 'color:#' + oriColor + code = parseInt(code) + _openTags[(code + 10).toString()] = 'background:#' + oriColor + } +} + +ansiHTML.reset() + + +/***/ }), + +/***/ "./src/DistortableCollection.js": +/*!**************************************!*\ + !*** ./src/DistortableCollection.js ***! + \**************************************/ +/***/ (function() { + +var arr = []; +L.DistortableCollection = L.FeatureGroup.extend({ + options: { + editable: true, + exportOpts: { + exportStartUrl: '//export.mapknitter.org/export', + statusUrl: '//export.mapknitter.org', + exportUrl: 'http://export.mapknitter.org/' + } + }, + initialize: function initialize(options) { + L.setOptions(this, options); + L.FeatureGroup.prototype.initialize.call(this, options); + L.Utils.initTranslation.call(this); + this.editable = this.options.editable; + }, + onAdd: function onAdd(map) { + L.FeatureGroup.prototype.onAdd.call(this, map); + this._map = map; + + if (this.editable) { + this.editing.enable(); + } + /** + * although we have a DistortableCollection.Edit class that handles collection events to keep our code managable, + * events that need to be added on individual images are kept here to do so through `layeradd`. + */ + + + this.on('layeradd', this._addEvents, this); + this.on('layerremove', this._removeEvents, this); + }, + onRemove: function onRemove() { + if (this.editing) { + this.editing.disable(); + } + + this.off('layeradd', this._addEvents, this); + this.off('layerremove', this._removeEvents, this); + }, + _addEvents: function _addEvents(e) { + var layer = e.layer; + L.DomEvent.on(layer, { + dragstart: this._dragStartMultiple, + drag: this._dragMultiple + }, this); + L.DomEvent.on(layer.getElement(), { + mousedown: this._deselectOthers, + + /* Enable longpress for multi select for touch devices. */ + contextmenu: this._longPressMultiSelect + }, this); + }, + _removeEvents: function _removeEvents(e) { + var layer = e.layer; + L.DomEvent.off(layer, { + dragstart: this._dragStartMultiple, + drag: this._dragMultiple + }, this); + L.DomEvent.off(layer.getElement(), { + mousedown: this._deselectOthers, + contextmenu: this._longPressMultiSelect + }, this); + }, + _longPressMultiSelect: function _longPressMultiSelect(e) { + var _this = this; + + if (!this.editable) { + return; + } + + e.preventDefault(); + this.eachLayer(function (layer) { + var edit = layer.editing; + + if (layer.getElement() === e.target && edit.enabled()) { + L.DomUtil.toggleClass(layer.getElement(), 'collected'); + + if (_this.anyCollected()) { + layer.deselect(); + + _this.editing._addToolbar(); + } else { + _this.editing._removeToolbar(); + } + } + }); + }, + isCollected: function isCollected(overlay) { + return L.DomUtil.hasClass(overlay.getElement(), 'collected'); + }, + anyCollected: function anyCollected() { + var layerArr = this.getLayers(); + return layerArr.some(this.isCollected.bind(this)); + }, + _toggleCollected: function _toggleCollected(e, layer) { + if (e.shiftKey) { + /* conditional prevents disabled images from flickering multi-select mode */ + if (layer.editing.enabled()) { + L.DomUtil.toggleClass(e.target, 'collected'); // re-order layers by _leaflet_id to match their display order in UI + // add new layer to right position and avoid repitition + + var newArr = arr.every(function (each) { + return each._leaflet_id !== layer._leaflet_id; + }); + + if (newArr) { + arr.push(layer); + } else { + arr.splice(arr.indexOf(layer), 1); + } + } + } + + if (this.anyCollected()) { + layer.deselect(); + } else { + this.editing._removeToolbar(); + } + }, + _deselectOthers: function _deselectOthers(e) { + var _this2 = this; + + if (!this.editable) { + return; + } + + this.eachLayer(function (layer) { + if (layer.getElement() !== e.target) { + layer.deselect(); + } else { + _this2._toggleCollected(e, layer); + } + }); + + if (e) { + L.DomEvent.stopPropagation(e); + } + }, + _dragStartMultiple: function _dragStartMultiple(e) { + var overlay = e.target; + var map = this._map; + var i; + + if (!this.isCollected(overlay)) { + return; + } + + this.eachLayer(function (layer) { + layer._dragStartPoints = {}; + layer.deselect(); + + for (i = 0; i < 4; i++) { + var c = layer.getCorner(i); + layer._dragStartPoints[i] = map.latLngToLayerPoint(c); + } + }); + }, + _dragMultiple: function _dragMultiple(e) { + var overlay = e.target; + var map = this._map; + + if (!this.isCollected(overlay)) { + return; + } + + var topLeft = map.latLngToLayerPoint(overlay.getCorner(0)); + + var delta = overlay._dragStartPoints[0].subtract(topLeft); + + this._updateCollectionFromPoints(delta, overlay); + }, + _toRemove: function _toRemove() { + var _this3 = this; + + var layerArr = this.getLayers(); + return layerArr.filter(function (layer) { + var mode = layer.editing._mode; + return _this3.isCollected(layer) && mode !== 'lock'; + }); + }, + _toMove: function _toMove(overlay) { + var _this4 = this; + + var layerArr = this.getLayers(); + return layerArr.filter(function (layer) { + var mode = layer.editing._mode; + return layer !== overlay && _this4.isCollected(layer) && mode !== 'lock'; + }); + }, + _updateCollectionFromPoints: function _updateCollectionFromPoints(delta, overlay) { + var layersToMove = this._toMove(overlay); + + var p = new L.Transformation(1, -delta.x, 1, -delta.y); + var i; + layersToMove.forEach(function (layer) { + var movedPoints = {}; + + for (i = 0; i < 4; i++) { + movedPoints[i] = p.transform(layer._dragStartPoints[i]); + } + + layer.setCornersFromPoints(movedPoints); + }); + }, + _getAvgCmPerPixel: function _getAvgCmPerPixel(imgs) { + var reduce = imgs.reduce(function (sum, img) { + return sum + img.cm_per_pixel; + }, 0); + return reduce / imgs.length; + }, + generateExportJson: function generateExportJson() { + var json = {}; + json.images = []; + this.eachLayer(function (layer) { + if (this.isCollected(layer)) { + var sections = layer._image.src.split('/'); + + var filename = sections[sections.length - 1]; + var zc = layer.getCorners(); + var corners = [{ + lat: zc[0].lat, + lon: zc[0].lng + }, { + lat: zc[1].lat, + lon: zc[1].lng + }, { + lat: zc[3].lat, + lon: zc[3].lng + }, { + lat: zc[2].lat, + lon: zc[2].lng + }]; + json.images.push({ + id: layer._leaflet_id, + src: layer._image.src, + width: layer._image.width, + height: layer._image.height, + image_file_name: filename, + nodes: corners, + cm_per_pixel: L.ImageUtil.getCmPerPixel(layer) + }); + } + }, this); + json.images = json.images.reverse(); + json.avg_cm_per_pixel = this._getAvgCmPerPixel(json.images); + return json; + } +}); + +L.distortableCollection = function (id, options) { + return new L.DistortableCollection(id, options); +}; + +/***/ }), + +/***/ "./src/DistortableImageOverlay.js": +/*!****************************************!*\ + !*** ./src/DistortableImageOverlay.js ***! + \****************************************/ +/***/ (function() { + +L.DistortableImageOverlay = L.ImageOverlay.extend({ + options: { + height: 200, + crossOrigin: true, + // todo: find ideal number to prevent distortions during RotateScale, and make it dynamic (remove hardcoding) + edgeMinWidth: 50, + editable: true, + mode: 'distort', + selected: false, + // SEGUN ------------------------------------------------------------------------------------------------------------------------------ + interactive: true, + tooltipText: 'Unknow image' // default tooltipText + // SEGUN ------------------------------------------------------------------------------------------------------------------------------ + + }, + initialize: function initialize(url, options) { + L.setOptions(this, options); + L.Utils.initTranslation.call(this); + this.edgeMinWidth = this.options.edgeMinWidth; + this.editable = this.options.editable; + this._selected = this.options.selected; + this._url = url; + this.rotation = {}; // SEGUN ------------------------------------------------------------------------------------------------------------------------------ + + this.interactive = this.options.interactive; + this.tooltipText = options.tooltipText; // SEGUN ------------------------------------------------------------------------------------------------------------------------------ + }, + onAdd: function onAdd(map) { + var _this = this; + + this._map = map; + + if (!this.getElement()) { + this._initImage(); + } + + map.on('viewreset', this._reset, this); + + if (this.options.corners) { + this._corners = this.options.corners; + + if (map.options.zoomAnimation && L.Browser.any3d) { + map.on('zoomanim', this._animateZoom, this); + } + } // Have to wait for the image to load because need to access its w/h + + + L.DomEvent.on(this.getElement(), 'load', function () { + _this.getPane().appendChild(_this.getElement()); + + _this._initImageDimensions(); + + if (_this.options.rotation) { + var units = _this.options.rotation.deg >= 0 ? 'deg' : 'rad'; + + _this.setAngle(_this.options.rotation[units], units); + } else { + _this.rotation = { + deg: 0, + rad: 0 + }; + + _this._reset(); + } + /* Initialize default corners if not already set */ + + + if (!_this._corners) { + if (map.options.zoomAnimation && L.Browser.any3d) { + map.on('zoomanim', _this._animateZoom, _this); + } + } + /** if there is a featureGroup, only its editable option matters */ + + + var eventParents = _this._eventParents; + + if (eventParents) { + _this.eP = eventParents[Object.keys(eventParents)[0]]; + + if (_this.eP.editable) { + _this.editing.enable(); + } + } else { + if (_this.editable) { + _this.editing.enable(); + } + + _this.eP = null; + } + }); + L.DomEvent.on(this.getElement(), 'click', this.select, this); + L.DomEvent.on(map, { + singleclickon: this._singleClickListeners, + singleclickoff: this._resetClickListeners, + singleclick: this._singleClick + }, this); + /** + * custom events fired from DoubleClickLabels.js. Used to differentiate + * single / dblclick to not deselect images on map dblclick. + */ + + if (!(map.doubleClickZoom.enabled() || map.doubleClickLabels.enabled())) { + L.DomEvent.on(map, 'click', this.deselect, this); + } + + this.fire('add'); // SEGUN ------------------------------------------------------------------------------------------------------------------------------ + + L.DomEvent.on(this.getElement(), 'mouseover mousemove', this._activateTooltip, this); + L.DomEvent.on(this.getElement(), 'mouseout', this._closeTooltip, this); + }, + onRemove: function onRemove(map) { + L.DomEvent.off(this.getElement(), 'click', this.select, this); + L.DomEvent.off(map, { + singleclickon: this._singleClickListeners, + singleclickoff: this._resetClickListeners, + singleclick: this._singleClick + }, this); + L.DomEvent.off(map, 'click', this.deselect, this); + + if (this.editing) { + this.editing.disable(); + } + + this.fire('remove'); + L.ImageOverlay.prototype.onRemove.call(this, map); // SEGUN ----------------------------------------------------------------------------------------------------------------------------- + + L.DomEvent.off(this.getElement(), 'mouseover', this._deactivateTooltip, this); // ENDS ------------------------------------------------------------------------------------------------------------------------------ + }, + _initImageDimensions: function _initImageDimensions() { + var map = this._map; + var originalImageWidth = L.DomUtil.getStyle(this.getElement(), 'width'); + var originalImageHeight = L.DomUtil.getStyle(this.getElement(), 'height'); + var aspectRatio = parseInt(originalImageWidth) / parseInt(originalImageHeight); + var imageHeight = this.options.height; + var imageWidth = parseInt(aspectRatio * imageHeight); + var center = map.project(map.getCenter()); + var offset = L.point(imageWidth, imageHeight).divideBy(2); + + if (this.options.corners) { + this._corners = this.options.corners; + } else { + this._corners = [map.unproject(center.subtract(offset)), map.unproject(center.add(L.point(offset.x, -offset.y))), map.unproject(center.add(L.point(-offset.x, offset.y))), map.unproject(center.add(offset))]; + } + + this._initialDimensions = { + 'center': center, + 'offset': offset, + 'zoom': map.getZoom() + }; + this.setBounds(L.latLngBounds(this.getCorners())); + }, + _singleClick: function _singleClick(e) { + if (e.type === 'singleclick') { + this.deselect(); + } else { + return; + } + }, + _singleClickListeners: function _singleClickListeners() { + var map = this._map; + L.DomEvent.off(map, 'click', this.deselect, this); + L.DomEvent.on(map, 'singleclick', this.deselect, this); + }, + _resetClickListeners: function _resetClickListeners() { + var map = this._map; + L.DomEvent.on(map, 'click', this.deselect, this); + L.DomEvent.off(map, 'singleclick', this.deselect, this); + }, + isSelected: function isSelected() { + return this._selected; // this._selected + }, + deselect: function deselect() { + var edit = this.editing; + + if (!edit.enabled()) { + return; + } + + edit._removeToolbar(); + + edit._hideMarkers(); + + this._selected = false; + this.fire('deselect'); + return this; + }, + select: function select(e) { + var edit = this.editing; + var eP = this.eP; + + if (!edit.enabled()) { + return; + } + + if (e) { + L.DomEvent.stopPropagation(e); + } // this ensures deselection of all other images, allowing us to keep collection group optional + + + this._programmaticGrouping(); + + this._selected = true; + + edit._addToolbar(); + + edit._showMarkers(); + + this.fire('select'); // we run the selection logic 1st anyway because the collection group's _addToolbar method depends on it + + if (eP && eP.anyCollected()) { + this.deselect(); + return; + } + + return this; + }, + _programmaticGrouping: function _programmaticGrouping() { + this._map.eachLayer(function (layer) { + if (layer instanceof L.DistortableImageOverlay) { + layer.deselect(); + } + }); + }, + setCorner: function setCorner(corner, latlng) { + var edit = this.editing; + this._corners[corner] = latlng; + this.setBounds(L.latLngBounds(this.getCorners())); + this.fire('update'); + + if (edit.toolbar && edit.toolbar instanceof L.DistortableImage.PopupBar) { + edit._updateToolbarPos(); + } + + this.edited = true; + return this; + }, + _cornerExceedsMapLats: function _cornerExceedsMapLats(zoom, corner, map) { + if (map.options.crs.Simple == L.CRS.Simple) { + return false; + } else { + var exceedsTop; + var exceedsBottom; + + if (zoom === 0) { + exceedsTop = map.project(corner).y < 2; + exceedsBottom = map.project(corner).y >= 255; + } else { + exceedsTop = map.project(corner).y / zoom < 2; + exceedsBottom = map.project(corner).y / Math.pow(2, zoom) >= 255; + } + + return exceedsTop || exceedsBottom; + } + }, + // SEGUN ------------------------------------------------------------------------------------------------------------------------------- + // Work in progress on this function + _activateTooltip: function _activateTooltip(ev) { + var index = 0; + var xAxis = []; // stores previous values of x coordinate + + var yAxis = []; // stores previous values of y coordinate, may be needed later + // let newPosX = 0; + + if (!this._selected) { + // Consider using "if (!this.selected)" instead + // console.log('mouseOVER_DONE/mouseMOVE_DONE-TOOLTIP-ACTIVATED'); // To be deleted + // console.log('x-axis:', ev.x); // To be deleted + // console.log('y-axis:', ev.y); // To be deleted + xAxis[index] = ev.x; + yAxis[index] = ev.y; // May be needed later + // newPosX = xAxis[index-1] - xAxis[index]; // - works but not perfect + // newPosX = (xAxis[index-1] - xAxis[index]) - ((xAxis[index])/4); // - better than above but not perfect + // newPosX =(xAxis[index-1] - xAxis[index]) - (xAxis[index] - this.imageWidth); // - works but no perfect + + ++index; + this.bindTooltip(this.tooltipText, { + sticky: true, + direction: 'top', + offset: L.point([ev.x - 700, ev.y - 500]) + }).openTooltip(); // POC only, work still in progress on this - hardcoded, works not perfect yet + } + }, + _closeTooltip: function _closeTooltip() { + // console.log('mouseOUT_DONE-TOOLTIP-CLOSED'); // To be deleted + this.closeTooltip(); + }, + _deactivateTooltip: function _deactivateTooltip() { + // console.log('MouseoverENDED & mousemoveENDED-TOOLTIP-DEACTIVATED'); - To be deleted + this.unbindTooltip(); + }, + // ENDS ------------------------------------------------------------------------------------------------------------------------------ + setCorners: function setCorners(latlngObj) { + var map = this._map; + var zoom = map.getZoom(); + var edit = this.editing; + var i = 0; // this is to fix https://github.com/publiclab/Leaflet.DistortableImage/issues/402 + + for (var k in latlngObj) { + if (this._cornerExceedsMapLats(zoom, latlngObj[k], map)) { + // calling reset / update w/ the same corners bc it prevents a marker flicker for rotate + this.setBounds(L.latLngBounds(this.getCorners())); + this.fire('update'); + return; + } + } + + for (var _k in latlngObj) { + this._corners[i] = latlngObj[_k]; + i += 1; + } + + this.setBounds(L.latLngBounds(this.getCorners())); + this.fire('update'); + + if (edit.toolbar && edit.toolbar instanceof L.DistortableImage.PopupBar) { + edit._updateToolbarPos(); + } + + this.edited = true; + return this; + }, + setCornersFromPoints: function setCornersFromPoints(pointsObj) { + var map = this._map; + var zoom = map.getZoom(); + var edit = this.editing; + var i = 0; + + for (var k in pointsObj) { + var corner = map.layerPointToLatLng(pointsObj[k]); + + if (this._cornerExceedsMapLats(zoom, corner, map)) { + // calling reset / update w/ the same corners bc it prevents a marker flicker for rotate + this.setBounds(L.latLngBounds(this.getCorners())); + this.fire('update'); + return; + } + } + + for (var _k2 in pointsObj) { + this._corners[i] = map.layerPointToLatLng(pointsObj[_k2]); + i += 1; + } + + this.setBounds(L.latLngBounds(this.getCorners())); + this.fire('update'); + + if (edit.toolbar && edit.toolbar instanceof L.DistortableImage.PopupBar) { + edit._updateToolbarPos(); + } + + this.edited = true; + return this; + }, + scaleBy: function scaleBy(scale) { + var map = this._map; + var center = map.project(this.getCenter()); + var i; + var p; + var scaledCorners = {}; + + if (scale === 0) { + return; + } + + for (i = 0; i < 4; i++) { + p = map.project(this.getCorner(i)).subtract(center).multiplyBy(scale).add(center); + scaledCorners[i] = map.unproject(p); + } + + this.setCorners(scaledCorners); + return this; + }, + getAngle: function getAngle() { + var unit = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'deg'; + var matrix = this.getElement().style[L.DomUtil.TRANSFORM].split('matrix3d')[1].slice(1, -1).split(','); + var row0x = matrix[0]; + var row0y = matrix[1]; + var row1x = matrix[4]; + var row1y = matrix[5]; + var determinant = row0x * row1y - row0y * row1x; + var angle = L.TrigUtil.calcAngle(row0x, row0y, 'rad'); + + if (determinant < 0) { + angle += angle < 0 ? Math.PI : -Math.PI; + } + + if (angle < 0) { + angle = 2 * Math.PI + angle; + } + + return unit === 'deg' ? Math.round(L.TrigUtil.radiansToDegrees(angle)) : L.Util.formatNum(angle, 2); + }, + setAngle: function setAngle(angle) { + var unit = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'deg'; + var currentAngle = this.getAngle(unit); + var angleToRotateBy = angle - currentAngle; + this.rotateBy(angleToRotateBy, unit); + return this; + }, + rotateBy: function rotateBy(angle) { + var unit = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'deg'; + var map = this._map; + var center = map.project(this.getCenter()); + var corners = {}; + var i; + var p; + var q; + + if (unit === 'deg') { + angle = L.TrigUtil.degreesToRadians(angle); + } + + for (i = 0; i < 4; i++) { + p = map.project(this.getCorner(i)).subtract(center); + q = L.point(Math.cos(angle) * p.x - Math.sin(angle) * p.y, Math.sin(angle) * p.x + Math.cos(angle) * p.y); + corners[i] = map.unproject(q.add(center)); + } + + this.setCorners(corners); + return this; + }, + dragBy: function dragBy(formerPoint, newPoint) { + var map = this._map; + var i; + var p; + var transCorners = {}; + var delta = map.project(formerPoint).subtract(map.project(newPoint)); + + for (i = 0; i < 4; i++) { + p = map.project(this.getCorner(i)).subtract(delta); + transCorners[i] = map.unproject(p); + } + + this.setCorners(transCorners); + }, + restore: function restore() { + var map = this._map; + var center = this._initialDimensions.center; + var offset = this._initialDimensions.offset; + var zoom = this._initialDimensions.zoom; + var corners = [center.subtract(offset), center.add(L.point(offset.x, -offset.y)), center.add(L.point(-offset.x, offset.y)), center.add(offset)]; + + for (var i = 0; i < 4; i++) { + if (!map.unproject(corners[i], zoom).equals(this.getCorner(i))) { + this.setCorner(i, map.unproject(corners[i], zoom)); + } + } + + this.edited = false; + this.fire('restore'); + return this; + }, + + /* Copied from Leaflet v0.7 https://github.com/Leaflet/Leaflet/blob/66282f14bcb180ec87d9818d9f3c9f75afd01b30/src/dom/DomUtil.js#L189-L199 */ + + /* since L.DomUtil.getTranslateString() is deprecated in Leaflet v1.0 */ + _getTranslateString: function _getTranslateString(point) { + // on WebKit browsers (Chrome/Safari/iOS Safari/Android) + // using translate3d instead of translate + // makes animation smoother as it ensures HW accel is used. + // Firefox 13 doesn't care + // (same speed either way), Opera 12 doesn't support translate3d + var is3d = L.Browser.webkit3d; + var open = 'translate' + (is3d ? '3d' : '') + '('; + var close = (is3d ? ',0' : '') + ')'; + return open + point.x + 'px,' + point.y + 'px' + close; + }, + _reset: function _reset() { + var map = this._map; + var image = this.getElement(); + var latLngToLayerPoint = L.bind(map.latLngToLayerPoint, map); + + var transformMatrix = this._calculateProjectiveTransform(latLngToLayerPoint); + + var topLeft = latLngToLayerPoint(this.getCorner(0)); + var warp = L.DomUtil.getMatrixString(transformMatrix); + + var translation = this._getTranslateString(topLeft); + /* See L.DomUtil.setPosition. Mainly for the purposes of L.Draggable. */ + + + image._leaflet_pos = topLeft; + image.style[L.DomUtil.TRANSFORM] = [translation, warp].join(' '); + /* Set origin to the upper-left corner rather than + * the center of the image, which is the default. + */ + + image.style[L.DomUtil.TRANSFORM + '-origin'] = '0 0 0'; + this.rotation.deg = this.getAngle(); + this.rotation.rad = this.getAngle('rad'); + }, + + /* + * Calculates the transform string that will be + * correct *at the end* of zooming. + * Leaflet then generates a CSS3 animation between the current transform and + * future transform which makes the transition appear smooth. + */ + _animateZoom: function _animateZoom(event) { + var map = this._map; + var image = this.getElement(); + + var latLngToNewLayerPoint = function latLngToNewLayerPoint(latlng) { + return map._latLngToNewLayerPoint(latlng, event.zoom, event.center); + }; + + var transformMatrix = this._calculateProjectiveTransform(latLngToNewLayerPoint); + + var topLeft = latLngToNewLayerPoint(this.getCorner(0)); + var warp = L.DomUtil.getMatrixString(transformMatrix); + + var translation = this._getTranslateString(topLeft); + /* See L.DomUtil.setPosition. Mainly for the purposes of L.Draggable. */ + + + image._leaflet_pos = topLeft; + image.style[L.DomUtil.TRANSFORM] = [translation, warp].join(' '); + }, + getCorners: function getCorners() { + return this._corners; + }, + getCorner: function getCorner(i) { + return this._corners[i]; + }, + // image (vertex) centroid calculation + getCenter: function getCenter() { + var map = this._map; + var reduce = this.getCorners().reduce(function (agg, corner) { + return agg.add(map.project(corner)); + }, L.point(0, 0)); + return map.unproject(reduce.divideBy(4)); + }, + _calculateProjectiveTransform: function _calculateProjectiveTransform(latLngToCartesian) { + /* Setting reasonable but made-up image defaults + * allow us to place images on the map before + * they've finished downloading. */ + var offset = latLngToCartesian(this.getCorner(0)); + var w = this.getElement().offsetWidth || 500; + var h = this.getElement().offsetHeight || 375; + var c = []; + var j; + /* Convert corners to container points (i.e. cartesian coordinates). */ + + for (j = 0; j < 4; j++) { + c.push(latLngToCartesian(this.getCorner(j))._subtract(offset)); + } + /* + * This matrix describes the action of + * the CSS transform on each corner of the image. + * It maps from the coordinate system centered + * at the upper left corner of the image + * to the region bounded by the latlngs in this._corners. + * For example: + * 0, 0, c[0].x, c[0].y + * says that the upper-left corner of the image + * maps to the first latlng in this._corners. + */ + + + return L.MatrixUtil.general2DProjection(0, 0, c[0].x, c[0].y, w, 0, c[1].x, c[1].y, 0, h, c[2].x, c[2].y, w, h, c[3].x, c[3].y); + } +}); + +L.distortableImageOverlay = function (id, options) { + // remove temp + return new L.DistortableImageOverlay(id, options); // remove temp +}; + +L.Map.addInitHook(function () { + if (!L.DomUtil.hasClass(this.getContainer(), 'ldi')) { + L.DomUtil.addClass(this.getContainer(), 'ldi'); + } +}); + +/***/ }), + +/***/ "./src/components/DistortableImage.Keymapper.js": +/*!******************************************************!*\ + !*** ./src/components/DistortableImage.Keymapper.js ***! + \******************************************************/ +/***/ (function() { + +var _this = this; + +L.DomUtil = L.DomUtil || {}; +L.DistortableImage = L.DistortableImage || {}; +L.distortableImage = L.DistortableImage; +L.DistortableImage.Keymapper = L.Handler.extend({ + options: { + position: 'topright' + }, + initialize: function initialize(map, options) { + this._map = map; + L.setOptions(this, options); + }, + addHooks: function addHooks() { + if (!this._keymapper) { + this._container = this._buildContainer(); + this._scrollWrapper = this._wrap(); + this._toggler = this._createButton(); + + this._setMapper(this._container, this._scrollWrapper, this._toggler); + + L.DomEvent.on(this._toggler, 'click', this._toggleKeymapper, this); + L.DomEvent.disableClickPropagation(this._container); + L.DomEvent.disableScrollPropagation(this._container); + } + }, + removeHooks: function removeHooks() { + if (this._keymapper) { + L.DomEvent.off(this._toggler, 'click', this._toggleKeymapper, this); + L.DomUtil.remove(this._toggler); + L.DomUtil.remove(this._scrollWrapper); + L.DomUtil.remove(this._container); + this._keymapper = false; + } + }, + _buildContainer: function _buildContainer() { + var container = L.DomUtil.create('div', 'ldi-keymapper-hide'); + container.setAttribute('id', 'ldi-keymapper'); + var divider = L.DomUtil.create('br', 'divider'); + container.appendChild(divider); + return container; + }, + _createButton: function _createButton() { + var toggler = L.DomUtil.create('a', ''); + toggler.innerHTML = L.IconUtil.create('keyboard_open'); + toggler.setAttribute('id', 'toggle-keymapper'); + toggler.setAttribute('href', '#'); + toggler.setAttribute('title', 'Show keymap'); // Will force screen readers like VoiceOver to read this as "Show keymap - button" + + toggler.setAttribute('role', 'button'); + toggler.setAttribute('aria-label', 'Show keymap'); + return toggler; + }, + _wrap: function _wrap() { + var wrap = L.DomUtil.create('div', ''); + wrap.setAttribute('id', 'keymapper-wrapper'); + wrap.style.display = 'none'; + return wrap; + }, + _setMapper: function _setMapper(container, wrap, button) { + this._keymapper = L.control({ + position: this.options.position + }); + + this._keymapper.onAdd = function () { + container.appendChild(wrap); + wrap.insertAdjacentHTML('beforeend', '' + '
' + + /* eslint-disable */ + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '
Rotate Mode
R
RotateScale Mode
r
Scale Mode
s
Distort Mode
d
Drag Mode
D
Lock (Mode) / Unlock Image
l\xa0u
Stack up / down
q\xa0a
Add / Remove Image Border
b
Toggle Opacity
o
Deselect All
esc
Delete Image(s)
delete\xa0backspace
Export Image(s)
e
'); + /* eslint-enable */ + + container.appendChild(button); + return container; + }; + + this._keymapper.addTo(this._map); + }, + _toggleKeymapper: function _toggleKeymapper(e) { + e.preventDefault(); + this._container.className = this._container.className === 'ldi-keymapper leaflet-control' ? 'ldi-keymapper-hide leaflet-control' : 'ldi-keymapper leaflet-control'; + this._scrollWrapper.style.display = this._scrollWrapper.style.display === 'none' ? 'block' : 'none'; + this._toggler.innerHTML = this._toggler.innerHTML === 'close' ? L.IconUtil.create('keyboard_open') : 'close'; + L.IconUtil.toggleTitle(this._toggler, 'Show keymap', 'Hide keymap'); + L.DomUtil.toggleClass(this._toggler, 'close-icon'); + }, + _injectIconSet: function _injectIconSet() { + if (document.querySelector('#keymapper-iconset')) { + return; + } + + var el = L.DomUtil.create('div', ''); + el.id = 'keymapper-iconset'; + el.setAttribute('hidden', 'hidden'); + this._iconset = new L.KeymapperIconSet().render(); + el.innerHTML = this._iconset; + document.querySelector('.leaflet-control-container').appendChild(el); + } +}); +L.DistortableImage.Keymapper.addInitHook(function () { + L.DistortableImage.Keymapper.prototype._n = L.DistortableImage.Keymapper.prototype._n ? L.DistortableImage.Keymapper.prototype._n + 1 : 1; // dont enable keymapper for mobile + + if (L.DistortableImage.Keymapper.prototype._n === 1 && !L.Browser.mobile) { + _this.enable(); + + _this._injectIconSet(); + } +}); + +L.distortableImage.keymapper = function (map, options) { + return new L.DistortableImage.Keymapper(map, options); +}; + +/***/ }), + +/***/ "./src/edit/DistortableCollection.Edit.js": +/*!************************************************!*\ + !*** ./src/edit/DistortableCollection.Edit.js ***! + \************************************************/ +/***/ (function() { + +L.DistortableImage = L.DistortableImage || {}; // this class holds the keybindings and toolbar API for an image collection instance + +L.DistortableCollection.Edit = L.Handler.extend({ + options: { + keymap: L.distortableImage.group_action_map + }, + initialize: function initialize(group, options) { + this._group = group; + this._exportOpts = group.options.exportOpts; + L.setOptions(this, options); + L.distortableImage.group_action_map.Escape = '_decollectAll'; + }, + addHooks: function addHooks() { + var group = this._group; + var map = group._map; + this.editActions = this.options.actions; + this.runExporter = L.bind(L.Utils.getNestedVal(this, '_exportOpts', 'exporter') || this.startExport, this); + L.DomEvent.on(document, 'keydown', this._onKeyDown, this); + + if (!(map.doubleClickZoom.enabled() || map.doubleClickLabels.enabled())) { + L.DomEvent.on(map, 'click', this._decollectAll, this); + } + + L.DomEvent.on(map, { + singleclickon: this._singleClickListeners, + singleclickoff: this._resetClickListeners, + singleclick: this._singleClick, + boxcollectend: this._addCollections + }, this); + this._group.editable = true; + + this._group.eachLayer(function (layer) { + return layer.editing.enable(); + }); + }, + removeHooks: function removeHooks() { + var group = this._group; + var map = group._map; + L.DomEvent.off(document, 'keydown', this._onKeyDown, this); + + if (!(map.doubleClickZoom.enabled() || map.doubleClickLabels.enabled())) { + L.DomEvent.off(map, 'click', this._decollectAll, this); + } + + L.DomEvent.off(map, { + singleclickon: this._singleClickListeners, + singleclickoff: this._resetClickListeners, + singleclick: this._singleClick, + boxcollectend: this._addCollections + }, this); + + this._decollectAll(); + + this._group.editable = false; + + this._group.eachLayer(function (layer) { + return layer.editing.disable(); + }); + }, + enable: function enable() { + this._enabled = true; + this.addHooks(); + return this; + }, + disable: function disable() { + this._enabled = false; + this.removeHooks(); + return this; + }, + _onKeyDown: function _onKeyDown(e) { + var keymap = this.options.keymap; + var handlerName = keymap[e.key]; + + if (!this[handlerName]) { + return; + } + + if (this._group.anyCollected()) { + this[handlerName].call(this); + } + }, + _singleClick: function _singleClick(e) { + if (e.type === 'singleclick') { + this._decollectAll(e); + } else { + return; + } + }, + _singleClickListeners: function _singleClickListeners() { + var map = this._group._map; + L.DomEvent.off(map, 'click', this._decollectAll, this); + L.DomEvent.on(map, 'singleclick', this._decollectAll, this); + }, + _resetClickListeners: function _resetClickListeners() { + var map = this._group._map; + L.DomEvent.on(map, 'click', this._decollectAll, this); + L.DomEvent.off(map, 'singleclick', this._decollectAll, this); + }, + _decollectAll: function _decollectAll(e) { + var oe; + + if (e) { + oe = e.originalEvent; + } + /** + * prevents image deselection following the 'boxcollectend' event - note 'shift' must not be released until dragging is complete + * also prevents deselection following a click on a disabled img by differentiating it from the map + */ + + + if (oe && (oe.shiftKey || oe.target instanceof HTMLImageElement)) { + return; + } + + this._group.eachLayer(function (layer) { + L.DomUtil.removeClass(layer.getElement(), 'collected'); + layer.deselect(); + }); + + this._removeToolbar(); + + if (e) { + L.DomEvent.stopPropagation(e); + } + }, + _unlockGroup: function _unlockGroup() { + var _this = this; + + if (!this.hasTool(L.UnlockAction)) { + return; + } + + this._group.eachLayer(function (layer) { + if (_this._group.isCollected(layer)) { + var edit = layer.editing; + + edit._unlock(); // unlock updates the layer's handles; deselect to ensure they're hidden + + + layer.deselect(); + } + }); + }, + _lockGroup: function _lockGroup() { + var _this2 = this; + + if (!this.hasTool(L.LockAction)) { + return; + } + + this._group.eachLayer(function (layer) { + if (_this2._group.isCollected(layer)) { + var edit = layer.editing; + + edit._lock(); // map.addLayer also deselects the image, so we reselect here + + + L.DomUtil.addClass(layer.getElement(), 'collected'); + } + }); + }, + _addCollections: function _addCollections(e) { + var _this3 = this; + + var box = e.boxCollectBounds; + var map = this._group._map; + + this._group.eachLayer(function (layer) { + var edit = layer.editing; + + if (layer.isSelected()) { + layer.deselect(); + } + + var zoom = map.getZoom(); + var center = map.getCenter(); + var imgBounds = L.latLngBounds(layer.getCorner(2), layer.getCorner(1)); + imgBounds = map._latLngBoundsToNewLayerBounds(imgBounds, zoom, center); + + if (box.intersects(imgBounds) && edit.enabled()) { + if (!_this3.toolbar) { + _this3._addToolbar(); + } + + L.DomUtil.addClass(layer.getElement(), 'collected'); + } + }); + }, + _removeGroup: function _removeGroup(e) { + var _this4 = this; + + if (!this.hasTool(L.DeleteAction)) { + return; + } + + var layersToRemove = this._group._toRemove(); + + var n = layersToRemove.length; + + if (n === 0) { + return; + } + + var choice = L.DomUtil.confirmDeletes(n); + + if (choice) { + layersToRemove.forEach(function (layer) { + _this4._group.removeLayer(layer); + }); + + if (!this._group.anyCollected()) { + this._removeToolbar(); + } + } + + if (e) { + L.DomEvent.stopPropagation(e); + } + }, + cancelExport: function cancelExport() { + if (!this.customCollection) { + this._exportOpts.collection = undefined; + } + + clearInterval(this.updateInterval); + }, + _addToolbar: function _addToolbar() { + var group = this._group; + var map = group._map; + + if (group.options.suppressToolbar || this.toolbar) { + return; + } + + this.toolbar = L.distortableImage.controlBar({ + actions: this.editActions, + position: 'topleft' + }).addTo(map, group); + }, + _removeToolbar: function _removeToolbar() { + var map = this._group._map; + + if (this.toolbar) { + map.removeLayer(this.toolbar); + this.toolbar = false; + } else { + return false; + } + }, + hasTool: function hasTool(value) { + return this.editActions.some(function (action) { + return action === value; + }); + }, + addTool: function addTool(value) { + if (value.baseClass === 'leaflet-toolbar-icon' && !this.hasTool(value)) { + this._removeToolbar(); + + this.editActions.push(value); + + this._addToolbar(); + } + + return this; + }, + removeTool: function removeTool(value) { + var _this5 = this; + + this.editActions.some(function (item, idx) { + if (_this5.editActions[idx] === value) { + _this5._removeToolbar(); + + _this5.editActions.splice(idx, 1); + + _this5._addToolbar(); + + return true; + } else { + return false; + } + }); + return this; + }, + startExport: function startExport() { + var _this6 = this; + + if (!this.hasTool(L.ExportAction)) { + return; + } + + return new Promise(function (resolve) { + var opts = _this6._exportOpts; + opts.resolve = resolve; // allow resolving promise in user-defined functions, to stop spinner on completion + + var statusUrl; + _this6.updateInterval = null; // this may be overridden to update the UI to show export progress or completion + + var _defaultUpdater = function _defaultUpdater(data) { + data = JSON.parse(data); // optimization: fetch status directly from google storage: + + if (data.status_url) { + if (statusUrl !== data.status_url && data.status_url.match('.json')) { + // if (data.status_url && data.status_url.substr(0,1) === "/") { + // opts.statusUrl = opts.statusUrl + data.status_url; + // } else { + statusUrl = data.status_url; // } + } + + if (data.status === 'complete') { + clearInterval(_this6.updateInterval); + + if (!_this6.customCollection) { + _this6._exportOpts.collection = undefined; + } + + resolve(); + + if (data.jpg !== null) { + alert('Export succeeded. ' + opts.exportUrl + data.jpg); + } + } // TODO: update to clearInterval when status == "failed" if we update that in this file: + // https://github.com/publiclab/mapknitter-exporter/blob/main/lib/mapknitterExporter.rb + + + console.log(data); + } + }; // receives the URL of status.json, and starts running the updater to repeatedly fetch from status.json; + // this may be overridden to integrate with any UI + + + var _defaultHandleStatusRes = function _defaultHandleStatusRes(data) { + statusUrl = opts.statusUrl + data; // repeatedly fetch the status.json + + _this6.updateInterval = setInterval(function () { + var reqOpts = { + method: 'GET' + }; + var req = new Request("".concat(statusUrl, "?").concat(Date.now()), reqOpts); + fetch(req).then(function (res) { + if (res.ok) { + return res.text(); + } + }).then(opts.updater); + }, opts.frequency); + }; // initiate the export + + + var _defaultFetchStatusUrl = function _defaultFetchStatusUrl(mergedOpts) { + var form = new FormData(); + form.append('collection', JSON.stringify(mergedOpts.collection)); + form.append('scale', mergedOpts.scale); + form.append('upload', true); + var reqOpts = { + method: 'POST', + body: form + }; + var req = new Request(mergedOpts.exportStartUrl, reqOpts); + fetch(req).then(function (res) { + if (res.ok) { + return res.text(); + } + }).then(mergedOpts.handleStatusRes); + }; // If the user has passed collection property + + + _this6.customCollection = !!opts.collection; + + if (!_this6.customCollection) { + opts.collection = _this6._group.generateExportJson().images; + } + + opts.frequency = opts.frequency || 3000; + opts.scale = opts.scale || 100; // switch it to _getAvgCmPerPixel ! + + opts.updater = opts.updater || _defaultUpdater; + opts.handleStatusRes = opts.handleStatusRes || _defaultHandleStatusRes; + opts.fetchStatusUrl = opts.fetchStatusUrl || _defaultFetchStatusUrl; + opts.fetchStatusUrl(opts); + }); + } +}); + +L.distortableCollection.edit = function (group, options) { + return new L.DistortableCollection.Edit(group, options); +}; + +/***/ }), + +/***/ "./src/edit/DistortableImage.Edit.js": +/*!*******************************************!*\ + !*** ./src/edit/DistortableImage.Edit.js ***! + \*******************************************/ +/***/ (function() { + +L.DistortableImage = L.DistortableImage || {}; // holds the keybindings & toolbar API for an individual image instance + +L.DistortableImage.Edit = L.Handler.extend({ + options: { + opacity: 0.7, + outline: '1px solid red', + keymap: L.distortableImage.action_map + }, + initialize: function initialize(overlay, options) { + this._overlay = overlay; + this._toggledImage = false; + this._mode = overlay.options.mode; + this._transparent = false; + this._outlined = false; + L.setOptions(this, options); + L.distortableImage.action_map.Escape = '_deselect'; + }, + + /* Run on image selection. */ + addHooks: function addHooks() { + var overlay = this._overlay; + this.editActions = this.options.actions; + /* bring the selected image into view */ + + overlay.bringToFront(); + + this._initModes(); + + this._initHandles(); + + this._appendHandlesandDragable(); + + if (overlay.isSelected() && !overlay.options.suppressToolbar) { + this._addToolbar(); + } + + this.parentGroup = overlay.eP ? overlay.eP : false; + L.DomEvent.on(overlay.getElement(), { + dblclick: this.nextMode + }, this); + L.DomEvent.on(window, 'keydown', this._onKeyDown, this); + }, + + /* Run on image deselection. */ + removeHooks: function removeHooks() { + var overlay = this._overlay; + var eP = this.parentGroup; // First, check if dragging exists - it may be off due to locking + + this._disableDragging(); + + if (this.toolbar) { + this._removeToolbar(); + } + + for (var handle in this._handles) { + L.DomUtil.remove(handle); + } + /** + * ensures if you disable an image while it is multi-selected + * additional deselection logic is run + */ + + + if (L.DomUtil.hasClass(overlay.getElement(), 'collected')) { + L.DomUtil.removeClass(overlay.getElement(), 'collected'); + } + + if (eP && !eP.anyCollected() && eP.editing.toolbar) { + eP.editing._removeToolbar(); + } + + L.DomEvent.off(overlay.getElement(), { + dblclick: this.nextMode + }, this); + L.DomEvent.off(window, 'keydown', this._onKeyDown, this); + }, + disable: function disable() { + if (!this._enabled) { + return this; + } + + this._overlay.deselect(); + + this._enabled = false; + this.removeHooks(); + return this; + }, + _initModes: function _initModes() { + this._modes = {}; // passed from L.DistortablImage.PopupBar. If the mode is one + // of the current toolbar actions, adds it to this._modes + + for (var mode in L.DistortableImage.Edit.MODES) { + var action = L.DistortableImage.Edit.MODES[mode]; + + if (this.editActions.indexOf(action) !== -1) { + this._modes[mode] = action; + } + } // sets the current mode to the 1st available one if the one selected + // during initialization is not available + + + if (!this._modes[this._mode]) { + this._mode = Object.keys(this._modes)[0]; + } + }, + _initHandles: function _initHandles() { + var overlay = this._overlay; + var i; + this._dragHandles = L.layerGroup(); + + for (i = 0; i < 4; i++) { + this._dragHandles.addLayer(L.dragHandle(overlay, i)); + } + + this._scaleHandles = L.layerGroup(); + + for (i = 0; i < 4; i++) { + this._scaleHandles.addLayer(L.scaleHandle(overlay, i)); + } + + this._distortHandles = L.layerGroup(); + + for (i = 0; i < 4; i++) { + this._distortHandles.addLayer(L.distortHandle(overlay, i)); + } + + this._rotateHandles = L.layerGroup(); // individual rotate + + for (i = 0; i < 4; i++) { + this._rotateHandles.addLayer(L.rotateHandle(overlay, i)); + } // handle includes rotate AND scale + + + this._freeRotateHandles = L.layerGroup(); + + for (i = 0; i < 4; i++) { + this._freeRotateHandles.addLayer(L.freeRotateHandle(overlay, i)); + } + + this._lockHandles = L.layerGroup(); + + for (i = 0; i < 4; i++) { + this._lockHandles.addLayer(L.lockHandle(overlay, i, { + draggable: false + })); + } + + this._handles = { + drag: this._dragHandles, + scale: this._scaleHandles, + distort: this._distortHandles, + rotate: this._rotateHandles, + freeRotate: this._freeRotateHandles, + lock: this._lockHandles + }; + }, + _appendHandlesandDragable: function _appendHandlesandDragable() { + var ov = this._overlay; // won't throw error if user adds 0 mode actions to toolbar + + if (!this._mode) { + this._enableDragging(); + + return; + } + + this._updateHandle(); + + if (!ov.isSelected() && this.currentHandle) { + this.currentHandle.eachLayer(function (handle) { + handle.setOpacity(0); + + if (handle.dragging) { + handle.dragging.disable(); + } + }); + } + + if (!this.isMode('lock')) { + this._enableDragging(); + } + }, + _onKeyDown: function _onKeyDown(e) { + var keymap = this.options.keymap; + var handlerName = keymap[e.key]; + var ov = this._overlay; + var eP = this.parentGroup; + + if (eP && eP.anyCollected()) { + return; + } + + if (this[handlerName] !== undefined && !ov.options.suppressToolbar) { + if (ov.isSelected() && this.toolbar) { + this[handlerName].call(this); + } + } + }, + replaceTool: function replaceTool(old, next) { + var _this = this; + + if (next.baseClass !== 'leaflet-toolbar-icon' || this.hasTool(next)) { + return this; + } + + this.editActions.some(function (item, idx) { + if (item === old) { + _this._removeToolbar(); + + _this.editActions[idx] = next; + + _this._addToolbar(); + + for (var mode in L.DistortableImage.Edit.MODES) { + if (L.DistortableImage.Edit.MODES[mode] === old) { + delete _this._modes[mode]; + + _this._nextOrNone(mode); + } else if (L.DistortableImage.Edit.MODES[mode] === next) { + _this._modes[mode] = next; + } + } + + return true; + } + }); + return this; + }, + addTool: function addTool(value) { + if (value.baseClass === 'leaflet-toolbar-icon' && !this.hasTool(value)) { + this._removeToolbar(); + + this.editActions.push(value); + + this._addToolbar(); + + for (var mode in L.DistortableImage.Edit.MODES) { + if (L.DistortableImage.Edit.MODES[mode] === value) { + this._modes[mode] = value; + } + } + + if (!this._overlay.isSelected()) { + this._removeToolbar(); + } + } + + return this; + }, + hasTool: function hasTool(value) { + return this.editActions.some(function (action) { + return action === value; + }); + }, + removeTool: function removeTool(value) { + var _this2 = this; + + this.editActions.some(function (item, idx) { + if (item === value) { + _this2._removeToolbar(); + + _this2.editActions.splice(idx, 1); + + _this2._addToolbar(); + + for (var mode in L.DistortableImage.Edit.MODES) { + if (L.DistortableImage.Edit.MODES[mode] === value) { + delete _this2._modes[mode]; + + _this2._nextOrNone(mode); + } + } + + return true; + } + }); + + if (!this._overlay.isSelected()) { + this._removeToolbar(); + } + + return this; + }, + // set the mode to the next mode or if that was the last one set mode to '' + _nextOrNone: function _nextOrNone(mode) { + if (this.isMode(mode)) { + if (Object.keys(this.getModes()).length >= 1) { + this.nextMode(); + } else { + if (mode === 'lock') { + this._enableDragging(); + } + + this._mode = ''; + + this._updateHandle(); + } + } + }, + _removeToolbar: function _removeToolbar() { + var ov = this._overlay; + var map = ov._map; + + if (this.toolbar) { + map.removeLayer(this.toolbar); + this.toolbar = false; + } + }, + _enableDragging: function _enableDragging() { + var _this3 = this; + + var overlay = this._overlay; + var map = overlay._map; + this.dragging = new L.Draggable(overlay.getElement()); + this.dragging.enable(); + /* Hide toolbars and markers while dragging; click will re-show it */ + + this.dragging.on('dragstart', function () { + overlay.fire('dragstart'); + + _this3._removeToolbar(); + }); + /* + * Adjust default behavior of L.Draggable, which overwrites the CSS3 + * distort transformations that we set when it calls L.DomUtil.setPosition. + */ + + this.dragging._updatePosition = function () { + var topLeft = overlay.getCorner(0); + + var delta = this._newPos.subtract(map.latLngToLayerPoint(topLeft)); + + var currentPoint; + var corners = {}; + var i; + this.fire('predrag'); + + for (i = 0; i < 4; i++) { + currentPoint = map.latLngToLayerPoint(overlay.getCorner(i)); + corners[i] = map.layerPointToLatLng(currentPoint.add(delta)); + } + + overlay.setCorners(corners); + overlay.fire('drag'); + this.fire('drag'); + }; + + this.dragging.on('dragend', function () { + overlay.fire('dragend'); + }); + }, + _disableDragging: function _disableDragging() { + if (this.dragging) { + this.dragging.disable(); + delete this.dragging; + } + }, + _dragMode: function _dragMode() { + this.setMode('drag'); + }, + _scaleMode: function _scaleMode() { + this.setMode('scale'); + }, + _distortMode: function _distortMode() { + this.setMode('distort'); + }, + _rotateMode: function _rotateMode() { + this.setMode('rotate'); + }, + _freeRotateMode: function _freeRotateMode() { + this.setMode('freeRotate'); + }, + _toggleLockMode: function _toggleLockMode() { + if (this.isMode('lock')) { + this._unlock(); + } else { + this._lock(); + } + }, + _toggleOpacity: function _toggleOpacity() { + var image = this._overlay.getElement(); + + if (!this.hasTool(L.OpacityAction)) { + return; + } + + this._transparent = !this._transparent; + var opacity = this._transparent ? this.options.opacity : 1; + L.DomUtil.setOpacity(image, opacity); + image.setAttribute('opacity', opacity); + + this._refresh(); + }, + _toggleBorder: function _toggleBorder() { + var image = this._overlay.getElement(); + + if (!this.hasTool(L.BorderAction)) { + return; + } + + this._outlined = !this._outlined; + var outline = this._outlined ? this.options.outline : 'none'; + image.style.outline = outline; + + this._refresh(); + }, + // compare this to using overlay zIndex + _toggleOrder: function _toggleOrder() { + if (this._toggledImage) { + this._stackUp(); + } else { + this._stackDown(); + } + }, + _removeOverlay: function _removeOverlay() { + var ov = this._overlay; + var eP = this.parentGroup; + + if (this.isMode('lock') || !this.hasTool(L.DeleteAction)) { + return; + } + + var choice = L.DomUtil.confirmDelete(); + + if (!choice) { + return; + } + + this._removeToolbar(); + + if (eP) { + eP.removeLayer(ov); + } else { + ov._map.removeLayer(ov); + } + }, + // Based on https://github.com/publiclab/mapknitter/blob/8d94132c81b3040ae0d0b4627e685ff75275b416/app/assets/javascripts/mapknitter/Map.js#L47-L82 + _getExport: function _getExport() { + var overlay = this._overlay; + var map = overlay._map; + var img = overlay.getElement(); + + if (!this.hasTool(L.ExportAction)) { + return; + } // make a new image + + + var downloadable = new Image(); + downloadable.id = downloadable.id || 'tempId12345'; + document.body.appendChild(downloadable); + + downloadable.onload = function onLoadDownloadableImage() { + var height = downloadable.height; + var width = downloadable.width; + var nw = map.latLngToLayerPoint(overlay.getCorner(0)); + var ne = map.latLngToLayerPoint(overlay.getCorner(1)); + var sw = map.latLngToLayerPoint(overlay.getCorner(2)); + var se = map.latLngToLayerPoint(overlay.getCorner(3)); // I think this is to move the image to the upper left corner, + // eslint-disable-next-line max-len + // jywarren: i think we may need these or the image goes off the edge of the canvas + // jywarren: but these seem to break the distortion math... + // jywarren: i think it should be rejiggered so it + // finds the most negative values of x and y and then + // adds those to all coordinates + // nw.x -= nw.x; + // ne.x -= nw.x; + // se.x -= nw.x; + // sw.x -= nw.x; + // nw.y -= nw.y; + // ne.y -= nw.y; + // se.y -= nw.y; + // sw.y -= nw.y; + // run once warping is complete + + downloadable.onload = function () { + L.DomUtil.remove(downloadable); + }; + + if (window && window.hasOwnProperty('warpWebGl')) { + warpWebGl(downloadable.id, [0, 0, width, 0, width, height, 0, height], [nw.x, nw.y, ne.x, ne.y, se.x, se.y, sw.x, sw.y], true // trigger download + ); + } + }; + + downloadable.src = overlay.options.fullResolutionSrc || img.src; + }, + _stackUp: function _stackUp() { + var t = this._toggledImage; + + if (!t || !this.hasTool(L.StackAction)) { + return; + } + + this._toggledImage = false; + + this._overlay.bringToFront(); + + this._refresh(); + }, + _stackDown: function _stackDown() { + var t = this._toggledImage; + + if (t || !this.hasTool(L.StackAction)) { + return; + } + + this._toggledImage = true; + + this._overlay.bringToBack(); + + this._refresh(); + }, + _unlock: function _unlock() { + var ov = this._overlay; + var map = ov._map; + var eP = this.parentGroup; + + if (!this.isMode('lock')) { + return; + } + + if (eP && !eP.isCollected(ov) || !eP) { + if (!this.hasTool(L.LockAction)) { + return; + } + } + + if (this.currentHandle) { + map.removeLayer(this.currentHandle); + } + + if (ov.options.mode === 'lock' || !this.hasMode(ov.options.mode)) { + this._mode = ''; + this.currentHandle = ''; + } else { + this._mode = ov.options.mode; + } + + this._updateHandle(); + + this._enableDragging(); + + this._refresh(); + }, + _lock: function _lock() { + var ov = this._overlay; + var map = ov._map; + var eP = this.parentGroup; + + if (this.isMode('lock')) { + return; + } + + if (eP && !eP.isCollected(ov) || !eP) { + if (!this.hasTool(L.LockAction)) { + return; + } + } + + if (this.currentHandle) { + map.removeLayer(this.currentHandle); + } + + this._mode = 'lock'; + + this._updateHandle(); + + this._disableDragging(); + + this._refresh(); + }, + _deselect: function _deselect() { + this._overlay.deselect(); + }, + _showMarkers: function _showMarkers(e) { + var eP = this.parentGroup; + + if (!this.currentHandle) { + return; + } // only markers we want in collect interface for now is lock + + + if (!this.isMode('lock') && eP && eP.anyCollected()) { + return; + } + + this.currentHandle.eachLayer(function (handle) { + handle.setOpacity(1); + + if (handle.dragging) { + handle.dragging.enable(); + } + + L.DomUtil.addClass(handle.getElement(), 'leaflet-interactive'); + }); + }, + _hideMarkers: function _hideMarkers() { + var ov = this._overlay; + var eP = this.parentGroup; // workaround for race condition w/ feature group + + if (!this._handles) { + this._initHandles(); + } + + if (!this.currentHandle) { + return; + } + + if (this.isMode('lock') && eP && eP.isCollected(ov)) { + return; + } + + this.currentHandle.eachLayer(function (handle) { + handle.setOpacity(0); + + if (handle.dragging) { + handle.dragging.disable(); + } + + L.DomUtil.removeClass(handle.getElement(), 'leaflet-interactive'); + }); + }, + _updateHandle: function _updateHandle() { + var ov = this._overlay; + var map = ov._map; + var mode = this.getMode(); + + if (this.currentHandle) { + map.removeLayer(this.currentHandle); + } + + this.currentHandle = mode === '' ? '' : this._handles[mode]; + + if (this.currentHandle !== '') { + map.addLayer(this.currentHandle); + } + }, + _addToolbar: function _addToolbar() { + var ov = this._overlay; + var eP = this.parentGroup; + var map = ov._map; // Find the topmost point on the image. + + var corners = ov.getCorners(); + var maxLat = -Infinity; + + if (eP && eP.anyCollected()) { + eP.editing._addToolbar(); + + return; + } + + if (ov.options.suppressToolbar || this.toolbar) { + return; + } + + for (var i = 0; i < corners.length; i++) { + if (corners[i].lat > maxLat) { + maxLat = corners[i].lat; + } + } // Longitude is based on the centroid of the image. + + + var raisedPoint = ov.getCenter(); + raisedPoint.lat = maxLat; + this.toolbar = L.distortableImage.popupBar(raisedPoint, { + actions: this.editActions + }).addTo(map, ov); + ov.fire('toolbar:created'); + }, + _refresh: function _refresh() { + if (this.toolbar) { + this._removeToolbar(); + } + + this._addToolbar(); + }, + _updateToolbarPos: function _updateToolbarPos() { + var overlay = this._overlay; // Find the topmost point on the image. + + var corners = overlay.getCorners(); + var toolbar = this.toolbar; + var maxLat = -Infinity; + + if (toolbar && toolbar instanceof L.DistortableImage.PopupBar) { + for (var i = 0; i < corners.length; i++) { + if (corners[i].lat > maxLat) { + maxLat = corners[i].lat; + } + } // Longitude is based on the centroid of the image. + + + var raisedPoint = overlay.getCenter(); + raisedPoint.lat = maxLat; + + if (!overlay.options.suppressToolbar) { + this.toolbar.setLatLng(raisedPoint); + } + } + }, + hasMode: function hasMode(mode) { + return !!this._modes[mode]; + }, + getMode: function getMode() { + if (!this.enabled()) { + return; + } + + return this._mode; + }, + getModes: function getModes() { + return this._modes; + }, + isMode: function isMode(mode) { + if (!this.enabled()) { + return false; + } + + return this._mode === mode; + }, + setMode: function setMode(newMode) { + var ov = this._overlay; + var eP = this.parentGroup; + var mode = this.getMode(); + + if (mode === newMode || !this.hasMode(newMode) || !this.enabled()) { + return; + } + + if (this.toolbar) { + this.toolbar.clickTool(newMode); + } + + if (this.isMode('lock') && !this.dragging) { + this._enableDragging(); + } + + this._mode = newMode; + + if (this.isMode('lock')) { + this._disableDragging(); + } + + this._updateHandle(); + + this._refresh(); + + if (eP && eP.isCollected(ov)) { + ov.deselect(); + } + + return this; + }, + + /** + * need to attach a stop to img dblclick or it will propagate to + * the map and fire the handler that shows map location labels on map dblclick. + */ + nextMode: function nextMode(e) { + var mode = this.getMode(); + var eP = this.parentGroup; + var modesArray = Object.keys(this.getModes()); + var idx = modesArray.indexOf(mode); + var nextIdx = (idx + 1) % modesArray.length; + var newMode = modesArray[nextIdx]; + + if (e) { + if (eP && eP.anyCollected()) { + return; + } + + L.DomEvent.stop(e); + } + + return this.setMode(newMode); + } +}); + +L.distortableImage.edit = function (overlay, options) { + return new L.DistortableImage.Edit(overlay, options); +}; + +/***/ }), + +/***/ "./src/edit/actions/BorderAction.js": +/*!******************************************!*\ + !*** ./src/edit/actions/BorderAction.js ***! + \******************************************/ +/***/ (function() { + +L.BorderAction = L.EditAction.extend({ + initialize: function initialize(map, overlay, options) { + var edit = overlay.editing; + var mode = edit._mode; + var use; + var tooltip; + + if (edit._outlined) { + use = 'border_outer'; + tooltip = overlay.options.translation.removeBorder; + } else { + use = 'border_clear'; + tooltip = overlay.options.translation.addBorder; + } + + options = options || {}; + options.toolbarIcon = { + svg: true, + html: use, + tooltip: tooltip, + className: mode === 'lock' ? 'disabled' : '' + }; // conditional for disabling keybindings for this action when the image is locked. + + L.DistortableImage.action_map.b = mode === 'lock' ? '' : '_toggleBorder'; + L.EditAction.prototype.initialize.call(this, map, overlay, options); + }, + addHooks: function addHooks() { + var edit = this._overlay.editing; + L.IconUtil.toggleXlink(this._link, 'border_clear', 'border_outer'); + L.IconUtil.toggleTitle(this._link, 'Remove Border', 'Add Border'); + + edit._toggleBorder(); + } +}); + +/***/ }), + +/***/ "./src/edit/actions/DeleteAction.js": +/*!******************************************!*\ + !*** ./src/edit/actions/DeleteAction.js ***! + \******************************************/ +/***/ (function() { + +L.DeleteAction = L.EditAction.extend({ + initialize: function initialize(map, overlay, options) { + var edit = overlay.editing; + var use = 'delete_forever'; + var tooltip; + /** + * we can tell whether the overlay is an instance of `L.DistortableImageOverlay` or `L.DistortableCollection` bc only + * the former should have `parentGroup` defined on it. From there we call the apporpriate keybindings and methods. + */ + + if (edit instanceof L.DistortableImage.Edit) { + tooltip = overlay.options.translation.deleteImage; // backspace windows / delete mac + + L.DistortableImage.action_map.Backspace = edit._mode === 'lock' ? '' : '_removeOverlay'; + } else { + tooltip = overlay.options.translation.deleteImages; + L.DistortableImage.group_action_map.Backspace = edit._mode === 'lock' ? '' : '_removeGroup'; + } + + options = options || {}; + options.toolbarIcon = { + svg: true, + html: use, + tooltip: tooltip, + className: edit._mode === 'lock' ? 'disabled' : '' + }; + L.EditAction.prototype.initialize.call(this, map, overlay, options); + }, + addHooks: function addHooks() { + var edit = this._overlay.editing; + + if (edit instanceof L.DistortableImage.Edit) { + edit._removeOverlay(); + } else { + edit._removeGroup(); + } + } +}); + +/***/ }), + +/***/ "./src/edit/actions/DistortAction.js": +/*!*******************************************!*\ + !*** ./src/edit/actions/DistortAction.js ***! + \*******************************************/ +/***/ (function() { + +L.DistortAction = L.EditAction.extend({ + initialize: function initialize(map, overlay, options) { + options = options || {}; + options.toolbarIcon = { + svg: true, + html: 'distort', + tooltip: overlay.options.translation.distortImage, + className: 'distort' + }; + L.DistortableImage.action_map.d = '_distortMode'; + L.EditAction.prototype.initialize.call(this, map, overlay, options); + }, + addHooks: function addHooks() { + var edit = this._overlay.editing; + + edit._distortMode(); + } +}); + +/***/ }), + +/***/ "./src/edit/actions/DragAction.js": +/*!****************************************!*\ + !*** ./src/edit/actions/DragAction.js ***! + \****************************************/ +/***/ (function() { + +L.DragAction = L.EditAction.extend({ + initialize: function initialize(map, overlay, options) { + options = options || {}; + options.toolbarIcon = { + svg: true, + html: 'drag', + tooltip: overlay.options.translation.dragImage, + className: 'drag' + }; + L.DistortableImage.action_map.D = '_dragMode'; + L.EditAction.prototype.initialize.call(this, map, overlay, options); + }, + addHooks: function addHooks() { + var edit = this._overlay.editing; + + edit._dragMode(); + } +}); + +/***/ }), + +/***/ "./src/edit/actions/EditAction.js": +/*!****************************************!*\ + !*** ./src/edit/actions/EditAction.js ***! + \****************************************/ +/***/ (function() { + +L.DistortableImage = L.DistortableImage || {}; +L.distortableImage = L.DistortableImage; +L.DistortableImage.action_map = {}; +L.EditAction = L.Toolbar2.Action.extend({ + options: { + toolbarIcon: { + svg: false, + html: '', + className: '', + tooltip: '' + } + }, + initialize: function initialize(map, overlay, options) { + this._overlay = overlay; + this._map = map; + L.setOptions(this, options); + L.Toolbar2.Action.prototype.initialize.call(this, options); + + this._injectIconSet(); + }, + _createIcon: function _createIcon(toolbar, container, args) { + var _this = this; + + var iconOptions = this.options.toolbarIcon; + var className = iconOptions.className; + var edit = this._overlay.editing; + this.toolbar = toolbar; + this._icon = L.DomUtil.create('li', '', container); + this._link = L.DomUtil.create('a', '', this._icon); + + if (iconOptions.svg) { + this._link.innerHTML = L.IconUtil.create(iconOptions.html); + } else { + this._link.innerHTML = iconOptions.html; + } + + this._link.setAttribute('href', '#'); + + this._link.setAttribute('title', iconOptions.tooltip); + + this._link.setAttribute('role', 'button'); + + L.DomUtil.addClass(this._link, this.constructor.baseClass); + + if (className) { + L.DomUtil.addClass(this._link, className); + + if (className === 'disabled') { + L.DomUtil.addClass(this._icon, className); + } + + if (className === edit._mode) { + L.DomUtil.addClass(this._link, 'selected-mode'); + } else { + L.DomUtil.removeClass(this._link, 'selected-mode'); + } + } + + L.DomEvent.on(this._link, 'click', this.enable, this); + L.DomEvent.on(this._overlay, 'update', function () { + var match = _this._link.innerHTML.match(/xlink:href="#restore"/); + + if (match && match.length === 1) { + _this._enableAction(); + } + }); + /* Add secondary toolbar */ + + this._addSubToolbar(toolbar, this._icon, args); + }, + _injectIconSet: function _injectIconSet() { + if (document.querySelector('#iconset')) { + return; + } + + var el = document.createElement('div'); + el.id = 'iconset'; + el.setAttribute('hidden', 'hidden'); + el.innerHTML = new L.ToolbarIconSet().render(); + document.querySelector('.leaflet-marker-pane').appendChild(el); + }, + _enableAction: function _enableAction() { + L.DomUtil.removeClass(this._link.parentElement, 'disabled'); + L.DomUtil.removeClass(this._link, 'disabled'); + }, + _disableAction: function _disableAction() { + L.DomUtil.addClass(this._link.parentElement, 'disabled'); + L.DomUtil.addClass(this._link, 'disabled'); + } +}); + +L.editAction = function (map, overlay, options) { + return new L.EditAction(map, overlay, options); +}; + +/***/ }), + +/***/ "./src/edit/actions/ExportAction.js": +/*!******************************************!*\ + !*** ./src/edit/actions/ExportAction.js ***! + \******************************************/ +/***/ (function() { + +L.ExportAction = L.EditAction.extend({ + // This function is executed every time we select an image + initialize: function initialize(map, overlay, options) { + var edit = overlay.editing; + var tooltip; + this.isExporting = false; + this.mouseLeaveSkip = true; + this.isHooksExecuted = false; + + if (edit instanceof L.DistortableImage.Edit) { + L.DistortableImage.action_map.e = '_getExport'; + tooltip = overlay.options.translation.exportImage; + } else { + L.DistortableImage.group_action_map.e = 'runExporter'; + tooltip = overlay.options.translation.exportImages; + } + + options = options || {}; + options.toolbarIcon = { + svg: true, + html: 'get_app', + tooltip: tooltip + }; + L.EditAction.prototype.initialize.call(this, map, overlay, options); + }, + addHooks: function addHooks() { + var edit = this._overlay.editing; + + if (edit instanceof L.DistortableImage.Edit) { + edit._getExport(); + + return; + } // Make sure that addHooks is executed only once, event listeners will handle the rest + + + if (this.isHooksExecuted) { + return; + } else { + this.isHooksExecuted = true; + } + + var exportTool = this._link.parentElement; + this.mouseEnterHandler = this.handleMouseEnter.bind(this); + this.mouseLeaveHandler = this.handleMouseLeave.bind(this); + L.DomEvent.on(exportTool, 'click', function () { + if (!this.isExporting) { + this.isExporting = true; + this.renderExportIcon(); + setTimeout(this.attachMouseEventListeners.bind(this, exportTool), 100); + edit.runExporter().then(function () { + this.resetState(); + this.detachMouseEventListeners(exportTool); + }.bind(this)); + } else { + // Clicking on the export icon after export has started will be ignored + if (this.mouseLeaveSkip) { + return; + } + + this.resetState(); + this.detachMouseEventListeners(exportTool); + edit.cancelExport(); + } + }, this); + }, + resetState: function resetState() { + this.renderDownloadIcon(); + this.isExporting = false; + this.mouseLeaveSkip = true; + }, + attachMouseEventListeners: function attachMouseEventListeners(element) { + element.addEventListener('mouseenter', this.mouseEnterHandler); + element.addEventListener('mouseleave', this.mouseLeaveHandler); + }, + detachMouseEventListeners: function detachMouseEventListeners(element) { + element.removeEventListener('mouseenter', this.mouseEnterHandler); + element.removeEventListener('mouseleave', this.mouseLeaveHandler); + }, + handleMouseEnter: function handleMouseEnter() { + this.renderCancelIcon(); + }, + handleMouseLeave: function handleMouseLeave() { + if (this.mouseLeaveSkip) { + this.mouseLeaveSkip = false; + } else { + this.renderExportIcon(); + } + }, + renderDownloadIcon: function renderDownloadIcon() { + L.IconUtil.toggleXlink(this._link, 'get_app', 'spinner'); + L.IconUtil.toggleTitle(this._link, 'Export Images', 'Loading...'); + L.DomUtil.removeClass(this._link.firstChild, 'loader'); + }, + renderExportIcon: function renderExportIcon() { + L.IconUtil.toggleXlink(this._link, 'spinner'); + L.IconUtil.toggleTitle(this._link, 'Export Images', 'Loading...'); + L.IconUtil.addClassToSvg(this._link, 'loader'); + }, + renderCancelIcon: function renderCancelIcon() { + L.IconUtil.toggleXlink(this._link, 'cancel'); + L.IconUtil.toggleTitle(this._link, 'Cancel Export', 'Loading...'); + L.DomUtil.removeClass(this._link.firstChild, 'loader'); + } +}); + +/***/ }), + +/***/ "./src/edit/actions/FreeRotateAction.js": +/*!**********************************************!*\ + !*** ./src/edit/actions/FreeRotateAction.js ***! + \**********************************************/ +/***/ (function() { + +L.FreeRotateAction = L.EditAction.extend({ + initialize: function initialize(map, overlay, options) { + options = options || {}; + options.toolbarIcon = { + svg: true, + html: 'crop_rotate', + tooltip: overlay.options.translation.freeRotateImage, + className: 'freeRotate' + }; + L.DistortableImage.action_map.f = '_freeRotateMode'; + L.EditAction.prototype.initialize.call(this, map, overlay, options); + }, + addHooks: function addHooks() { + var edit = this._overlay.editing; + + edit._freeRotateMode(); + } +}); + +/***/ }), + +/***/ "./src/edit/actions/GeolocateAction.js": +/*!*********************************************!*\ + !*** ./src/edit/actions/GeolocateAction.js ***! + \*********************************************/ +/***/ (function() { + +L.GeolocateAction = L.EditAction.extend({ + initialize: function initialize(map, overlay, options) { + var edit = overlay.editing; + options = options || {}; + options.toolbarIcon = { + svg: true, + html: 'explore', + tooltip: overlay.options.translation.geolocateImage, + className: edit._mode === 'lock' ? 'disabled' : '' + }; + L.EditAction.prototype.initialize.call(this, map, overlay, options); + }, + addHooks: function addHooks() { + var image = this._overlay.getElement(); + + EXIF.getData(image, L.EXIF(image)); + } +}); + +/***/ }), + +/***/ "./src/edit/actions/LockAction.js": +/*!****************************************!*\ + !*** ./src/edit/actions/LockAction.js ***! + \****************************************/ +/***/ (function() { + +L.LockAction = L.EditAction.extend({ + initialize: function initialize(map, overlay, options) { + var edit = overlay.editing; + var use; + var tooltip; + + if (edit instanceof L.DistortableImage.Edit) { + L.DistortableImage.action_map.u = '_unlock'; + L.DistortableImage.action_map.l = '_lock'; + tooltip = overlay.options.translation.lockMode; + use = edit.isMode('lock') ? 'lock' : 'unlock'; + } else { + L.DistortableImage.group_action_map.l = '_lockGroup'; + tooltip = overlay.options.translation.lockImages; + use = 'lock'; + } + + options = options || {}; + options.toolbarIcon = { + svg: true, + html: use, + tooltip: tooltip, + className: 'lock' + }; + L.EditAction.prototype.initialize.call(this, map, overlay, options); + }, + addHooks: function addHooks() { + var edit = this._overlay.editing; + + if (edit instanceof L.DistortableImage.Edit) { + edit._toggleLockMode(); + } else { + edit._lockGroup(); + } + } +}); + +/***/ }), + +/***/ "./src/edit/actions/OpacityAction.js": +/*!*******************************************!*\ + !*** ./src/edit/actions/OpacityAction.js ***! + \*******************************************/ +/***/ (function() { + +L.OpacityAction = L.EditAction.extend({ + initialize: function initialize(map, overlay, options) { + var edit = overlay.editing; + var mode = edit._mode; + var use; + var tooltip; + + if (edit._transparent) { + use = 'opacity_empty'; + tooltip = overlay.options.translation.makeImageOpaque; + } else { + use = 'opacity'; + tooltip = overlay.options.translation.makeImageTransparent; + } + + options = options || {}; + options.toolbarIcon = { + svg: true, + html: use, + tooltip: tooltip, + className: mode === 'lock' ? 'disabled' : '' + }; + L.DistortableImage.action_map.o = mode === 'lock' ? '' : '_toggleOpacity'; + L.EditAction.prototype.initialize.call(this, map, overlay, options); + }, + addHooks: function addHooks() { + var edit = this._overlay.editing; + var link = this._link; + L.IconUtil.toggleXlink(link, 'opacity', 'opacity_empty'); + L.IconUtil.toggleTitle(link, 'Make Image Transparent', 'Make Image Opaque'); + + edit._toggleOpacity(); + } +}); + +/***/ }), + +/***/ "./src/edit/actions/RestoreAction.js": +/*!*******************************************!*\ + !*** ./src/edit/actions/RestoreAction.js ***! + \*******************************************/ +/***/ (function() { + +L.RestoreAction = L.EditAction.extend({ + initialize: function initialize(map, overlay, options) { + var mode = L.Utils.getNestedVal(overlay, 'editing', '_mode'); + var edited = overlay.edited; + options = options || {}; + options.toolbarIcon = { + svg: true, + html: 'restore', + tooltip: overlay.options.translation.restoreImage, + className: edited && mode !== 'lock' ? '' : 'disabled' + }; + L.EditAction.prototype.initialize.call(this, map, overlay, options); + }, + addHooks: function addHooks() { + var ov = this._overlay; + L.DomEvent.on(ov, { + edit: this._enableAction, + restore: this._disableAction + }, this); + ov.restore(); + } +}); + +/***/ }), + +/***/ "./src/edit/actions/RotateAction.js": +/*!******************************************!*\ + !*** ./src/edit/actions/RotateAction.js ***! + \******************************************/ +/***/ (function() { + +L.RotateAction = L.EditAction.extend({ + initialize: function initialize(map, overlay, options) { + options = options || {}; + options.toolbarIcon = { + svg: true, + html: 'rotate', + tooltip: overlay.options.translation.rotateImage, + className: 'rotate' + }; + L.DistortableImage.action_map.r = '_rotateMode'; + L.EditAction.prototype.initialize.call(this, map, overlay, options); + }, + addHooks: function addHooks() { + var edit = this._overlay.editing; + + edit._rotateMode(); + } +}); + +/***/ }), + +/***/ "./src/edit/actions/ScaleAction.js": +/*!*****************************************!*\ + !*** ./src/edit/actions/ScaleAction.js ***! + \*****************************************/ +/***/ (function() { + +L.ScaleAction = L.EditAction.extend({ + initialize: function initialize(map, overlay, options) { + options = options || {}; + options.toolbarIcon = { + svg: true, + html: 'scale', + tooltip: overlay.options.translation.scaleImage, + className: 'scale' + }; + L.DistortableImage.action_map.s = '_scaleMode'; + L.EditAction.prototype.initialize.call(this, map, overlay, options); + }, + addHooks: function addHooks() { + var edit = this._overlay.editing; + + edit._scaleMode(); + } +}); + +/***/ }), + +/***/ "./src/edit/actions/StackAction.js": +/*!*****************************************!*\ + !*** ./src/edit/actions/StackAction.js ***! + \*****************************************/ +/***/ (function() { + +L.StackAction = L.EditAction.extend({ + initialize: function initialize(map, overlay, options) { + var edit = overlay.editing; + var use; + var tooltip; + + if (edit._toggledImage) { + use = 'flip_to_back'; + tooltip = overlay.options.translation.stackToFront; + } else { + use = 'flip_to_front'; + tooltip = overlay.options.translation.stackToBack; + } + + options = options || {}; + options.toolbarIcon = { + svg: true, + html: use, + tooltip: tooltip, + className: edit._mode === 'lock' ? 'disabled' : '' + }; + L.DistortableImage.action_map.q = edit._mode === 'lock' ? '' : '_stackUp'; + L.DistortableImage.action_map.a = edit._mode === 'lock' ? '' : '_stackDown'; + L.EditAction.prototype.initialize.call(this, map, overlay, options); + }, + addHooks: function addHooks() { + var edit = this._overlay.editing; + L.IconUtil.toggleXlink(this._link, 'flip_to_front', 'flip_to_back'); + L.IconUtil.toggleTitle(this._link, 'Stack to Front', 'Stack to Back'); + + edit._toggleOrder(); + } +}); + +/***/ }), + +/***/ "./src/edit/actions/UnlockAction.js": +/*!******************************************!*\ + !*** ./src/edit/actions/UnlockAction.js ***! + \******************************************/ +/***/ (function() { + +L.UnlockAction = L.EditAction.extend({ + initialize: function initialize(map, overlay, options) { + options = options || {}; + options.toolbarIcon = { + svg: true, + html: 'unlock', + tooltip: overlay.options.translation.unlockImages + }; + L.DistortableImage.group_action_map.u = '_unlockGroup'; + L.EditAction.prototype.initialize.call(this, map, overlay, options); + }, + addHooks: function addHooks() { + var edit = this._overlay.editing; + + edit._unlockGroup(); + } +}); + +/***/ }), + +/***/ "./src/edit/getEXIFdata.js": +/*!*********************************!*\ + !*** ./src/edit/getEXIFdata.js ***! + \*********************************/ +/***/ (function() { + +/* eslint-disable no-unused-vars */ +L.EXIF = function getEXIFdata(img) { + if (Object.keys(EXIF.getAllTags(img)).length !== 0) { + console.log(EXIF.getAllTags(img)); + var GPS = EXIF.getAllTags(img); + var altitude; + /* If the lat/lng is available. */ + + if (typeof GPS.GPSLatitude !== 'undefined' && typeof GPS.GPSLongitude !== 'undefined') { + // sadly, encoded in [degrees,minutes,seconds] + // primitive value = GPS.GPSLatitude[x].numerator + var lat = GPS.GPSLatitude[0] + GPS.GPSLatitude[1] / 60 + GPS.GPSLatitude[2] / 3600; + var lng = GPS.GPSLongitude[0] + GPS.GPSLongitude[1] / 60 + GPS.GPSLongitude[2] / 3600; + + if (GPS.GPSLatitudeRef !== 'N') { + lat = lat * -1; + } + + if (GPS.GPSLongitudeRef === 'W') { + lng = lng * -1; + } + } // Attempt to use GPS compass heading; will require + // some trig to calc corner points, which you can find below: + + + var angle = 0; // "T" refers to "True north", so -90. + + if (GPS.GPSImgDirectionRef === 'T') { + angle = Math.PI / 180 * (GPS.GPSImgDirection.numerator / GPS.GPSImgDirection.denominator - 90); // "M" refers to "Magnetic north" + } else if (GPS.GPSImgDirectionRef === 'M') { + angle = Math.PI / 180 * (GPS.GPSImgDirection.numerator / GPS.GPSImgDirection.denominator - 90); + } else { + console.log('No compass data found'); + } + + console.log('Orientation:', GPS.Orientation); + /* If there is orientation data -- i.e. landscape/portrait etc */ + + if (GPS.Orientation === 6) { + // CCW + angle += Math.PI / 180 * -90; + } else if (GPS.Orientation === 8) { + // CW + angle += Math.PI / 180 * 90; + } else if (GPS.Orientation === 3) { + // 180 + angle += Math.PI / 180 * 180; + } + /* If there is altitude data */ + + + if (typeof GPS.GPSAltitude !== 'undefined' && typeof GPS.GPSAltitudeRef !== 'undefined') { + // Attempt to use GPS altitude: + // (may eventually need to find EXIF field of view for correction) + if (typeof GPS.GPSAltitude !== 'undefined' && typeof GPS.GPSAltitudeRef !== 'undefined') { + altitude = GPS.GPSAltitude.numerator / GPS.GPSAltitude.denominator + GPS.GPSAltitudeRef; + } else { + altitude = 0; // none + } + } + } else { + alert('EXIF initialized. Press again to view data in console.'); + } +}; + +/***/ }), + +/***/ "./src/edit/handles/DistortHandle.js": +/*!*******************************************!*\ + !*** ./src/edit/handles/DistortHandle.js ***! + \*******************************************/ +/***/ (function() { + +L.DistortHandle = L.EditHandle.extend({ + options: { + TYPE: 'distort', + icon: L.icon({ + iconUrl: // eslint-disable-next-line max-len + 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAChSURBVO3BIU4DURgGwNkvL2B6AkQTLBqP4QCoSm7DDXoBLBZHDbfgICAIZjEV3YTn9uVHdMZZtcnCfI13bIzxg0emg6Nm6QVbYz3jylEsXRrvwommb49X67jFkz80fR9Mb1YxTzqiWBSLYlEsikWxKBbFolgUi2JRLIpFsSgWxaJY03fHHOu40dH07bAzWCx9Ge/TiWbpHgdsjPGNB2f/yS+7xRCyiiZPJQAAAABJRU5ErkJggg==', + iconSize: [32, 32], + iconAnchor: [16, 16] + }) + }, + _onHandleDrag: function _onHandleDrag() { + var overlay = this._handled; + overlay.setCorner(this._corner, this.getLatLng()); + }, + updateHandle: function updateHandle() { + this.setLatLng(this._handled.getCorner(this._corner)); + } +}); + +L.distortHandle = function (overlay, idx, options) { + return new L.DistortHandle(overlay, idx, options); +}; + +/***/ }), + +/***/ "./src/edit/handles/DragHandle.js": +/*!****************************************!*\ + !*** ./src/edit/handles/DragHandle.js ***! + \****************************************/ +/***/ (function() { + +L.DragHandle = L.EditHandle.extend({ + options: { + TYPE: 'drag', + icon: L.icon({ + // eslint-disable-next-line max-len + iconUrl: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAsVJREFUeNrMVztLXEEUvnNVFAVBAhY2aRKbTZEHJNpYabuNjSgYg/GxdsmPSJkUAa/ZdVEX8mgWYVutbHxAHkVskjQBuUUgBISVhCQk3wnfwMlk1rusN1wHPubOzJlzvjlz5sxc01Ma/hUEwQnwDIjqc7uvgv9YYO86qgIwCXQbdNTlQ8kcCBHgBch8TcloF6oJGr6phk6EQAkfdz3zvgDr9Mr7Fg1fptEZoM8jsmrokpfsiIFO4IIjuE2v1EDmR4LRdlR5Gh51hj8D34ABtm8YTtqna0TgklIw5CgQguKxIojEjmFROg/MKQO27NkFAB+4wAPouGUJiIvWKHwbAxX2XyWRKWkqhT+pbJntJZJuUzISW0+5hW+obxrVBsfvoH/dqCCJuU97GBh2VteLSiYvArmErT8EVoAK9Bw7enbpVYmvAQlyowYforrH5jXL2rPHI/TKONDB7u9AlavdaTBPvPmazUeQuy8f7UomUgTEwIJPEQ3sQGE/6ll2l9H/KcEzBcfWn2IclluM3DpddJxSHujlFkscbUPvmB0LHVnLrId7nlaZVkEc6QGXQI1MAwZcWmVRHeNaQwJMMiU2cwy4s7p/RJ2ckpvIQs+cIs+5GzitloLKHUV3MPREuXbTOKO91dX387gGTONxIgEWm+E61FFrpcyqXLHsEwiDjEsjAksqw5XPoL9MHVrn6QR4q+XZrDaR4RoWzq2ymafuRA/Mq1stSsHLVkcbdf9VjOcx8ZH3+SFWcCWlVPyWuUBOwUWdC1wP5NVjYiXFWLO69PZ6CRTUY6KSIoEKdf6T3IzzgHxnsyHctNBEkmn6Oob8ExUDg/ahGybd177cDjzH5xHwgDiSvoS7I/LZyvxJZj0wod7tkX5G0XVC7rEyLhfLJjBGbKoLLEfZWObyKeZ6oY82g+yf5Zn/mJyHX7PMf04z/T3/LcAAu4E6iiyJqf0AAAAASUVORK5CYII=', + iconSize: [32, 32], + iconAnchor: [16, 16] + }) + }, + _onHandleDrag: function _onHandleDrag() { + var overlay = this._handled; + var formerLatLng = overlay.getCorner(this._corner); + var newLatLng = this.getLatLng(); + overlay.dragBy(formerLatLng, newLatLng); + }, + updateHandle: function updateHandle() { + this.setLatLng(this._handled.getCorner(this._corner)); + } +}); + +L.dragHandle = function (overlay, idx, options) { + return new L.DragHandle(overlay, idx, options); +}; + +/***/ }), + +/***/ "./src/edit/handles/EditHandle.js": +/*!****************************************!*\ + !*** ./src/edit/handles/EditHandle.js ***! + \****************************************/ +/***/ (function() { + +L.EditHandle = L.Marker.extend({ + initialize: function initialize(overlay, corner, options) { + var latlng = overlay.getCorner(corner); + L.setOptions(this, options); + this._handled = overlay; + this._corner = corner; + var markerOptions = { + draggable: true, + zIndexOffset: 10 + }; + + if (options && options.hasOwnProperty('draggable')) { + markerOptions.draggable = options.draggable; + } + + L.Marker.prototype.initialize.call(this, latlng, markerOptions); + }, + onAdd: function onAdd(map) { + L.Marker.prototype.onAdd.call(this, map); + + this._bindListeners(); + + this.updateHandle(); + }, + onRemove: function onRemove(map) { + this._unbindListeners(); + + L.Marker.prototype.onRemove.call(this, map); + }, + _onHandleDragStart: function _onHandleDragStart() { + this._handled.fire('editstart'); + }, + _onHandleDragEnd: function _onHandleDragEnd() { + this._fireEdit(); + }, + _fireEdit: function _fireEdit() { + this._handled.edited = true; + + this._handled.fire('edit'); + }, + _bindListeners: function _bindListeners() { + this.on({ + contextmenu: L.DomEvent.stop, + dragstart: this._onHandleDragStart, + drag: this._onHandleDrag, + dragend: this._onHandleDragEnd + }, this); + + this._handled._map.on('zoomend', this.updateHandle, this); + + this._handled.on('update', this.updateHandle, this); + }, + _unbindListeners: function _unbindListeners() { + this.off({ + contextmenu: L.DomEvent.stop, + dragstart: this._onHandleDragStart, + drag: this._onHandleDrag, + dragend: this._onHandleDragEnd + }, this); + + this._handled._map.off('zoomend', this.updateHandle, this); + + this._handled.off('update', this.updateHandle, this); + }, + + /* Takes two latlngs and calculates the scaling difference. */ + _calculateScalingFactor: function _calculateScalingFactor(latlngA, latlngB) { + var overlay = this._handled; + var map = overlay._map; + var centerPoint = map.latLngToLayerPoint(overlay.getCenter()); + var formerPoint = map.latLngToLayerPoint(latlngA); + var newPoint = map.latLngToLayerPoint(latlngB); + + var formerRadiusSquared = this._d2(centerPoint, formerPoint); + + var newRadiusSquared = this._d2(centerPoint, newPoint); + + return Math.sqrt(newRadiusSquared / formerRadiusSquared); + }, + + /* Distance between two points in cartesian space, squared (distance formula). */ + _d2: function _d2(a, b) { + var dx = a.x - b.x; + var dy = a.y - b.y; + return Math.pow(dx, 2) + Math.pow(dy, 2); + }, + + /* Takes two latlngs and calculates the angle between them. */ + calculateAngleDelta: function calculateAngleDelta(latlngA, latlngB) { + var overlay = this._handled; + var map = overlay._map; + var centerPoint = map.latLngToLayerPoint(overlay.getCenter()); + var formerPoint = map.latLngToLayerPoint(latlngA); + var newPoint = map.latLngToLayerPoint(latlngB); + var initialAngle = Math.atan2(centerPoint.y - formerPoint.y, centerPoint.x - formerPoint.x); + var newAngle = Math.atan2(centerPoint.y - newPoint.y, centerPoint.x - newPoint.x); + return newAngle - initialAngle; + } +}); + +/***/ }), + +/***/ "./src/edit/handles/FreeRotateHandle.js": +/*!**********************************************!*\ + !*** ./src/edit/handles/FreeRotateHandle.js ***! + \**********************************************/ +/***/ (function() { + +L.FreeRotateHandle = L.EditHandle.extend({ + options: { + TYPE: 'freeRotate', + icon: L.icon({ + iconUrl: // eslint-disable-next-line max-len + 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAHiSURBVMXBa3HbShgA0PMp/1sCCo8oCEpgTaCXgIXAJiDzyCJoAUTm4UVQAns1Y8+snWnTvJyeE16hkjDgDrfoNTMKcpC9UPiLSo8JyetkjEHxjPCMyoS199kFoz8Iv1HpMaN3qWDCHoegOKkkRwnJpRmroHgiPFEZ8IBekzEGxQtUEhKSS/fB7Ew4U+lxcGkVZG9QWWPSFAxBcdK59KApuA+yNwp2uEdx1GN25sZJZULSfAtm77SlbNjju6MvG75u+WHRWVR6rDVjMPsgwYyVZl3pLTpHkyYHOx8syMiayaJzlDTZ9YyaZNFVkiYH2ZUEBcVJJXVImuz6Js3Qofe59pq7DoOTILu+g+a288mCouk7/1iH4qTS+2QdDppbV1ZJmrnDXnPnc5UOs2Z0fUmTuyBr+krvSioJyUmQO0dZM7mepMkWnaNRkyrJB6uskTSjxY3Fll8bvmJwlDb83FJ8gMqAB80uyBY3Trb82PAfvjj6vuHnluIdKgMeNXOwctK5NKBoHitrb1RJeHRp5Ux4ojLg0aWMHGQvUOkxIWkKVsHsTPiNSo8HDC5lZIsgO6n0uMUdRvQuFQxB8UR4RmXC2vvsgtEfhL+o9JiQvE7GGBTPCK9QSUjoMWgKDthjDrIX+h/k0I7gth6N5gAAAABJRU5ErkJggg==', + iconSize: [32, 32], + iconAnchor: [16, 16] + }) + }, + _onHandleDrag: function _onHandleDrag() { + var overlay = this._handled; + var map = overlay._map; + var formerLatLng = overlay.getCorner(this._corner); + var newLatLng = this.getLatLng(); + var angle = this.calculateAngleDelta(formerLatLng, newLatLng); + + var scale = this._calculateScalingFactor(formerLatLng, newLatLng); + + if (angle !== 0) { + overlay.rotateBy(angle, 'rad'); + } + + var edgeMinWidth = overlay.edgeMinWidth; + + if (!edgeMinWidth) { + edgeMinWidth = 50; + } + /* just in case */ + + + var corner1 = map.latLngToContainerPoint(overlay.getCorner(0)); + var corner2 = map.latLngToContainerPoint(overlay.getCorner(1)); + var w = Math.abs(corner1.x - corner2.x); + var h = Math.abs(corner1.y - corner2.y); + var distance = Math.sqrt(w * w + h * h); + + if (distance > edgeMinWidth || scale > 1) { + overlay.scaleBy(scale); + } else { + overlay.scaleBy(1); + } + }, + updateHandle: function updateHandle() { + this.setLatLng(this._handled.getCorner(this._corner)); + } +}); + +L.freeRotateHandle = function (overlay, idx, options) { + return new L.FreeRotateHandle(overlay, idx, options); +}; + +/***/ }), + +/***/ "./src/edit/handles/LockHandle.js": +/*!****************************************!*\ + !*** ./src/edit/handles/LockHandle.js ***! + \****************************************/ +/***/ (function() { + +L.LockHandle = L.EditHandle.extend({ + options: { + TYPE: 'lock', + interactive: false, + icon: L.icon({ + // eslint-disable-next-line max-len + iconUrl: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAD8SURBVO3BPU7CYAAA0AdfjIcQlRCQBG7C3gk2uIPG2RC3Dk16Gz0FTO1WZs/gwGCMP/2+xsSl7+n1er1Iz9LtRQjaPeMeO+TinLDCJV78YqjdA04YodKuxhUaPGoRxMmxwRQZSt87Yo4KExGCeAUyLLFB4bMacxywEClIU2KDKXbInTUYo8JCgoFuGoxQO5uiwY1EA91VmDqrcKeDoX8WdNNgjApvmGGLXKIgXY0xGkxQYItrrFFIEKQ5Yo4KEx9yrDFDhlKkIF6NOQ5Y+KpAhiXWKEQI4pxwiwoLPyuxwQw75FoE7fZYocFEuwI7jHCBV39gL92TXq/Xi/AOcmczZmaIMScAAAAASUVORK5CYII=', + iconSize: [32, 32], + iconAnchor: [16, 16] + }) + }, + onRemove: function onRemove(map) { + this.unbindTooltip(); + L.EditHandle.prototype.onRemove.call(this, map); + }, + _bindListeners: function _bindListeners() { + var icon = this.getElement(); + + L.EditHandle.prototype._bindListeners.call(this); + + L.DomEvent.on(icon, { + mousedown: this._tooltipOn, + mouseup: this._tooltipOff + }, this); + L.DomEvent.on(document, 'pointerleave', this._tooltipOff, this); + }, + _unbindListeners: function _unbindListeners() { + var icon = this.getElement(); + + L.EditHandle.prototype._bindListeners.call(this); + + L.DomEvent.off(icon, { + mousedown: this._tooltipOn, + mouseup: this._tooltipOff + }, this); + L.DomEvent.off(document, 'pointerleave', this._tooltipOff, this); + }, + + /* cannot be dragged */ + _onHandleDrag: function _onHandleDrag() {}, + updateHandle: function updateHandle() { + this.setLatLng(this._handled.getCorner(this._corner)); + }, + _tooltipOn: function _tooltipOn(e) { + var eP = this._handled.parentGroup; + var edit = eP ? eP.editing : this._handled.editing; + + if (e.shiftKey) { + return; + } + + if (!this._handled.isSelected() && eP && !eP.isCollected(this._handled)) { + return; + } + + var handlesArr = edit._lockHandles; + this._timer = setTimeout(L.bind(function () { + if (this._timeout) { + clearTimeout(this._timeout); + } + + if (!this.getTooltip()) { + this.bindTooltip('Locked!', { + permanent: true + }); + } else { + handlesArr.eachLayer(function (handle) { + if (this !== handle) { + handle.closeTooltip(); + } + }); + } + + this.openTooltip(); + }, this), 500); + }, + _tooltipOff: function _tooltipOff(e) { + var eP = this._handled.parentGroup; + var edit = eP ? eP.editing : this._handled.editing; + + if (e.shiftKey) { + return; + } + + if (!this._handled.isSelected() && eP && !eP.isCollected(this._handled)) { + return; + } + + var handlesArr = edit._lockHandles; + + if (e.currentTarget === document) { + handlesArr.eachLayer(function (handle) { + handle.closeTooltip(); + }); + } + + if (this._timer) { + clearTimeout(this._timer); + } + + this._timeout = setTimeout(L.bind(function () { + this.closeTooltip(); + }, this), 400); + } +}); + +L.lockHandle = function (overlay, idx, options) { + return new L.LockHandle(overlay, idx, options); +}; + +/***/ }), + +/***/ "./src/edit/handles/RotateHandle.js": +/*!******************************************!*\ + !*** ./src/edit/handles/RotateHandle.js ***! + \******************************************/ +/***/ (function() { + +L.RotateHandle = L.EditHandle.extend({ + options: { + TYPE: 'rotate', + icon: L.icon({ + iconUrl: // eslint-disable-next-line max-len + 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAHiSURBVMXBa3HbShgA0PMp/1sCCo8oCEpgTaCXgIXAJiDzyCJoAUTm4UVQAns1Y8+snWnTvJyeE16hkjDgDrfoNTMKcpC9UPiLSo8JyetkjEHxjPCMyoS199kFoz8Iv1HpMaN3qWDCHoegOKkkRwnJpRmroHgiPFEZ8IBekzEGxQtUEhKSS/fB7Ew4U+lxcGkVZG9QWWPSFAxBcdK59KApuA+yNwp2uEdx1GN25sZJZULSfAtm77SlbNjju6MvG75u+WHRWVR6rDVjMPsgwYyVZl3pLTpHkyYHOx8syMiayaJzlDTZ9YyaZNFVkiYH2ZUEBcVJJXVImuz6Js3Qofe59pq7DoOTILu+g+a288mCouk7/1iH4qTS+2QdDppbV1ZJmrnDXnPnc5UOs2Z0fUmTuyBr+krvSioJyUmQO0dZM7mepMkWnaNRkyrJB6uskTSjxY3Fll8bvmJwlDb83FJ8gMqAB80uyBY3Trb82PAfvjj6vuHnluIdKgMeNXOwctK5NKBoHitrb1RJeHRp5Ux4ojLg0aWMHGQvUOkxIWkKVsHsTPiNSo8HDC5lZIsgO6n0uMUdRvQuFQxB8UR4RmXC2vvsgtEfhL+o9JiQvE7GGBTPCK9QSUjoMWgKDthjDrIX+h/k0I7gth6N5gAAAABJRU5ErkJggg==', + iconSize: [32, 32], + iconAnchor: [16, 16] + }) + }, + _onHandleDrag: function _onHandleDrag() { + var overlay = this._handled; + var formerLatLng = overlay.getCorner(this._corner); + var newLatLng = this.getLatLng(); + var angle = this.calculateAngleDelta(formerLatLng, newLatLng); + /* + * running rotation logic even for an angle delta of 0 + * prevents a small, occasional marker flicker + */ + + overlay.rotateBy(angle, 'rad'); + }, + updateHandle: function updateHandle() { + this.setLatLng(this._handled.getCorner(this._corner)); + } +}); + +L.rotateHandle = function (overlay, idx, options) { + return new L.RotateHandle(overlay, idx, options); +}; + +/***/ }), + +/***/ "./src/edit/handles/ScaleHandle.js": +/*!*****************************************!*\ + !*** ./src/edit/handles/ScaleHandle.js ***! + \*****************************************/ +/***/ (function() { + +L.ScaleHandle = L.EditHandle.extend({ + options: { + TYPE: 'scale', + icon: L.icon({ + iconUrl: // eslint-disable-next-line max-len + 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2ZXJzaW9uPSIxLjEiIHdpZHRoPSI0NTkiIGhlaWdodD0iNDY0IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCA1MTIgNTEyIiB4bWw6c3BhY2U9InByZXNlcnZlIiBzdHlsZT0iIj48cmVjdCBpZD0iYmFja2dyb3VuZHJlY3QiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIHg9IjAiIHk9IjAiIGZpbGw9Im5vbmUiIHN0cm9rZT0ibm9uZSIgY2xhc3M9IiIgc3R5bGU9IiIvPjxnIGNsYXNzPSJjdXJyZW50TGF5ZXIiIHN0eWxlPSIiPjx0aXRsZT5MYXllciAxPC90aXRsZT48cGF0aCBkPSJNNDU5LjA0OTE1OTUzMDQ3MTM0LDg2LjkyNjIzNDUxMjU1MDAyIFYwIGgtODUuNzE0NTczMzU2MzEyMDkgdjI3LjA0MzcxNzQwMzkwNDQ1MiBIODUuNzE0NTczMzU2MzEyMDMgVjAgSDAgdjg2LjkyNjIzNDUxMjU1MDAyIGgyNS43MTQzNzIwMDY4OTM2MjYgdjI4OS43NTQxMTUwNDE4MzM0IEgwIHY4Ni45MjYyMzQ1MTI1NTAwMiBoODUuNzE0NTczMzU2MzEyMDkgdi0yNy4wNDM3MTc0MDM5MDQ0NTIgaDI4NS43MTUyNDQ1MjEwNDAzIHYyNy4wNDM3MTc0MDM5MDQ0NTIgaDg1LjcxNDU3MzM1NjMxMjA5IHYtODYuOTI2MjM0NTEyNTUwMDIgaC0yMy44MDk2MDM3MTAwODY2OSBWODYuOTI2MjM0NTEyNTUwMDIgSDQ1OS4wNDkxNTk1MzA0NzEzNCB6TTM4NC43NjMxOTU5NTUwMDA5LDEyLjU1NjAxMTY1MTgxMjc4MSBoNjEuOTA0OTY5NjQ2MjI1Mzk2IHY2Mi43ODAwNTgyNTkwNjM5MSBoLTYxLjkwNDk2OTY0NjIyNTM5NiBWMTIuNTU2MDExNjUxODEyNzgxIHpNMTIuMzgwOTkzOTI5MjQ1MDUsMTIuNTU2MDExNjUxODEyNzgxIGg2MS45MDQ5Njk2NDYyMjUzOTYgdjYyLjc4MDA1ODI1OTA2MzkxIEgxMi4zODA5OTM5MjkyNDUwNSBWMTIuNTU2MDExNjUxODEyNzgxIHpNNzQuMjg1OTYzNTc1NDcwNTMsNDUxLjA1MDU3MjQxNTEyMDY2IEgxMi4zODA5OTM5MjkyNDUwNSB2LTYyLjc4MDA1ODI1OTA2MzkxIGg2MS45MDQ5Njk2NDYyMjUzOTYgVjQ1MS4wNTA1NzI0MTUxMjA2NiB6TTQ0NS43MTU3ODE0NTI4MjI3NCw0NTEuMDUwNTcyNDE1MTIwNjYgaC02Mi44NTczNTM3OTQ2Mjg4NjQgdi02Mi43ODAwNTgyNTkwNjM5MSBoNjIuODU3MzUzNzk0NjI4ODY0IFY0NTEuMDUwNTcyNDE1MTIwNjYgek00MDcuNjIwNDE1NTE2Njg0MjYsMzc2LjY4MDM0OTU1NDM4MzQ0IGgtMzYuMTkwNTk3NjM5MzMxNzcgdjMyLjgzODc5OTcwNDc0MTEyIEg4NS43MTQ1NzMzNTYzMTIwMyB2LTMyLjgzODc5OTcwNDc0MTEyIEg0OS41MjM5NzU3MTY5ODAzMiBWODYuOTI2MjM0NTEyNTUwMDIgaDM2LjE5MDU5NzYzOTMzMTc3IFY1MC4yMjQwNDY2MDcyNTExMjUgaDI4Ny42MjAwMTI4MTc4NDcyIHYzNi43MDIxODc5MDUyOTg5IGgzNC4yODU4MjkzNDI1MjQ4MzUgVjM3Ni42ODAzNDk1NTQzODM0NCB6IiBpZD0ic3ZnXzIiIGNsYXNzPSIiIGZpbGw9IiMxYTFhZWIiIGZpbGwtb3BhY2l0eT0iMSIvPjwvZz48L3N2Zz4=', + iconSize: [32, 32], + iconAnchor: [16, 16] + }) + }, + _onHandleDrag: function _onHandleDrag() { + var overlay = this._handled; + var map = overlay._map; + var edgeMinWidth = overlay.edgeMinWidth; + var formerLatLng = overlay.getCorner(this._corner); + var newLatLng = this.getLatLng(); + + var scale = this._calculateScalingFactor(formerLatLng, newLatLng); + /* + * checks whether the "edgeMinWidth" property is set and tracks the minimum edge length; + * this enables preventing scaling to zero, but we might also add an overall scale limit + */ + + + if (!edgeMinWidth) { + edgeMinWidth = 50; + } + /* just in case */ + + + var corner1 = map.latLngToLayerPoint(overlay.getCorner(0)); + var corner2 = map.latLngToLayerPoint(overlay.getCorner(1)); + var w = Math.abs(corner1.x - corner2.x); + var h = Math.abs(corner1.y - corner2.y); + var distance = Math.sqrt(w * w + h * h); + + if (distance > edgeMinWidth || scale > 1) { + overlay.scaleBy(scale); + /* + * running scale logic even for a scale ratio of 1 + * prevents a small, occasional marker flicker + */ + } else { + overlay.scaleBy(1); + } + }, + updateHandle: function updateHandle() { + this.setLatLng(this._handled.getCorner(this._corner)); + } +}); + +L.scaleHandle = function (overlay, idx, options) { + return new L.ScaleHandle(overlay, idx, options); +}; + +/***/ }), + +/***/ "./src/edit/toolbars/DistortableImage.ControlBar.js": +/*!**********************************************************!*\ + !*** ./src/edit/toolbars/DistortableImage.ControlBar.js ***! + \**********************************************************/ +/***/ (function() { + +L.distortableImage = L.DistortableImage || {}; +L.distortableImage = L.DistortableImage; +L.DistortableImage.group_action_map = {}; +L.DistortableImage.ControlBar = L.Toolbar2.Control.extend({}); + +L.distortableImage.controlBar = function (options) { + return new L.DistortableImage.ControlBar(options); +}; +/** addInitHooks run before onAdd */ + + +L.DistortableCollection.addInitHook(function () { + /** Default actions */ + this.ACTIONS = [L.ExportAction, L.DeleteAction, L.LockAction, L.UnlockAction]; // all possible modes + + L.DistortableCollection.Edit.MODES = { + lock: L.LockAction, + unlock: L.UnlockAction + }; + var a = this.options.actions ? this.options.actions : this.ACTIONS; + this.editing = L.distortableCollection.edit(this, { + actions: a + }); +}); + +/***/ }), + +/***/ "./src/edit/toolbars/DistortableImage.PopupBar.js": +/*!********************************************************!*\ + !*** ./src/edit/toolbars/DistortableImage.PopupBar.js ***! + \********************************************************/ +/***/ (function() { + +L.DistortableImage = L.DistortableImage || {}; +L.distortableImage = L.DistortableImage; +L.DistortableImage.action_map = {}; +L.DistortableImage.PopupBar = L.Toolbar2.Popup.extend({ + options: { + anchor: [0, -10] + }, + initialize: function initialize(latlng, options) { + L.setOptions(this, options); + L.Toolbar2.Popup.prototype.initialize.call(this, latlng, options); + }, + addHooks: function addHooks(map, ov) { + this.map = map; + this.ov = ov; + }, + tools: function tools() { + if (this._ul) { + return this._ul.children; + } + }, + clickTool: function clickTool(name) { + var tools = this.tools(); + + for (var i = 0; i < tools.length; i++) { + var tool = tools.item(i).children[0]; + + if (L.DomUtil.hasClass(tool, name)) { + tool.click(); + return tool; + } + } + + return false; + } +}); + +L.distortableImage.popupBar = function (latlng, options) { + return new L.DistortableImage.PopupBar(latlng, options); +}; + +L.DistortableImageOverlay.addInitHook(function () { + /** Default actions */ + this.ACTIONS = [L.DragAction, L.ScaleAction, L.DistortAction, L.RotateAction, L.FreeRotateAction, L.LockAction, L.OpacityAction, L.BorderAction, L.ExportAction, L.DeleteAction]; // all possible modes + + L.DistortableImage.Edit.MODES = { + drag: L.DragAction, + scale: L.ScaleAction, + distort: L.DistortAction, + rotate: L.RotateAction, + freeRotate: L.FreeRotateAction, + lock: L.LockAction + }; + var a = this.options.actions ? this.options.actions : this.ACTIONS; + this.editing = L.distortableImage.edit(this, { + actions: a + }); +}); + +/***/ }), + +/***/ "./src/iconsets/IconSet.js": +/*!*********************************!*\ + !*** ./src/iconsets/IconSet.js ***! + \*********************************/ +/***/ (function() { + +/* this is the baseclass other IconSets inherit from, +* we don't use it directly */ +L.IconSet = L.Class.extend({ + _svg: '', + _symbols: '', + render: function render() { + this.addSymbols(this._symbols); + return this._svg; + }, + addSymbols: function addSymbols(symbols) { + this._svg += symbols; + } +}); + +/***/ }), + +/***/ "./src/iconsets/KeymapperIconSet.js": +/*!******************************************!*\ + !*** ./src/iconsets/KeymapperIconSet.js ***! + \******************************************/ +/***/ (function() { + +L.KeymapperIconSet = L.IconSet.extend({ + _symbols: // eslint-disable-next-line max-len + '' +}); + +/***/ }), + +/***/ "./src/iconsets/ToolbarIconSet.js": +/*!****************************************!*\ + !*** ./src/iconsets/ToolbarIconSet.js ***! + \****************************************/ +/***/ (function() { + +/* eslint-disable max-len */ +L.ToolbarIconSet = L.IconSet.extend({ + _symbols: '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' +}); + +/***/ }), + +/***/ "./src/mapmixins/BoxCollector.js": +/*!***************************************!*\ + !*** ./src/mapmixins/BoxCollector.js ***! + \***************************************/ +/***/ (function() { + +L.Map.mergeOptions({ + boxCollector: true, + boxZoom: false +}); +/** + * primarily Leaflet 1.5.1 source code. Overriden so that it's a collection box used with + * our `L.DistortableCollection` class instead of a zoom box. + * */ + +L.Map.BoxCollector = L.Map.BoxZoom.extend({ + initialize: function initialize(map) { + this._map = map; + this._container = map._container; + this._pane = map._panes.overlayPane; + this._resetStateTimeout = 0; + map.on('unload', this._destroy, this); + }, + addHooks: function addHooks() { + L.DomEvent.on(this._container, 'mousedown', this._onMouseDown, this); + }, + removeHooks: function removeHooks() { + L.DomEvent.off(this._container, 'mousedown', this._onMouseDown, this); + }, + moved: function moved() { + return this._moved; + }, + _destroy: function _destroy() { + L.DomUtil.remove(this._pane); + delete this._pane; + }, + _resetState: function _resetState() { + this._resetStateTimeout = 0; + this._moved = false; + }, + _clearDeferredResetState: function _clearDeferredResetState() { + if (this._resetStateTimeout !== 0) { + clearTimeout(this._resetStateTimeout); + this._resetStateTimeout = 0; + } + }, + _onMouseDown: function _onMouseDown(e) { + if (!e.shiftKey || e.which !== 1 && e.button !== 1) { + return false; + } // Clear the deferred resetState if it hasn't executed yet, otherwise it + // will interrupt the interaction and orphan a box element in the container. + + + this._clearDeferredResetState(); + + this._resetState(); + + L.DomUtil.disableTextSelection(); + L.DomUtil.disableImageDrag(); + this._startPoint = this._map.mouseEventToContainerPoint(e); + L.DomEvent.on(document, { + contextmenu: L.DomEvent.stop, + mousemove: this._onMouseMove, + mouseup: this._onMouseUp + }, this); + }, + _onMouseMove: function _onMouseMove(e) { + if (!this._moved) { + this._moved = true; + this._box = L.DomUtil.create('div', 'leaflet-zoom-box', this._container); + L.DomUtil.addClass(this._container, 'leaflet-crosshair'); + + this._map.fire('boxzoomstart'); + } + + this._point = this._map.mouseEventToContainerPoint(e); + this._bounds = L.bounds(this._startPoint, this._point); + + var size = this._bounds.getSize(); + + L.DomUtil.setPosition(this._box, this._bounds.min); + this._box.style.width = size.x + 'px'; + this._box.style.height = size.y + 'px'; + }, + _finish: function _finish() { + if (this._moved) { + L.DomUtil.remove(this._box); + L.DomUtil.removeClass(this._container, 'leaflet-crosshair'); + } + + L.DomUtil.enableTextSelection(); + L.DomUtil.enableImageDrag(); + L.DomEvent.off(document, { + contextmenu: L.DomEvent.stop, + mousemove: this._onMouseMove, + mouseup: this._onMouseUp + }, this); + }, + _onMouseUp: function _onMouseUp(e) { + if (e.which !== 1 && e.button !== 1) { + return; + } + + this._finish(); + + if (!this._moved) { + return; + } // Postpone to next JS tick so internal click event handling + // still see it as "moved". + + + this._clearDeferredResetState(); + + this._resetStateTimeout = setTimeout(L.Util.bind(this._resetState, this), 0); + var bounds = L.latLngBounds(this._map.containerPointToLatLng(this._bounds.getBottomLeft()), this._map.containerPointToLatLng(this._bounds.getTopRight())); + + var zoom = this._map.getZoom(); + + var center = this._map.getCenter(); // calls the `project` method but 1st updates the pixel origin - see https://github.com/publiclab/Leaflet.DistortableImage/pull/344 + + + bounds = this._map._latLngBoundsToNewLayerBounds(bounds, zoom, center); + + this._map.fire('boxcollectend', { + boxCollectBounds: bounds + }); + } +}); +L.Map.addInitHook('addHandler', 'boxCollector', L.Map.BoxCollector); + +/***/ }), + +/***/ "./src/mapmixins/DoubleClickLabels.js": +/*!********************************************!*\ + !*** ./src/mapmixins/DoubleClickLabels.js ***! + \********************************************/ +/***/ (function() { + +L.Map.mergeOptions({ + doubleClickLabels: true +}); +/** + * The `doubleClickLabels` handler replaces `doubleClickZoom` by default if `#addGoogleMutant` + * is used unless the options 'labels: false' or 'doubleClickZoom: false` were passed to it. + */ + +L.Map.DoubleClickLabels = L.Map.DoubleClickZoom.extend({ + enable: function enable() { + var map = this._map; + + if (this._enabled) { + return this; + } // disable 'doubleClickZoom' if 'doubleClickLabels' is enabled. + + + if (map.doubleClickZoom.enabled()) { + map.doubleClickZoom.disable(); + } + + this._map.fire('singleclickon'); + + this._enabled = true; + this.addHooks(); + return this; + }, + disable: function disable() { + if (!this._enabled) { + return this; + } + + this._enabled = false; + this.removeHooks(); + return this; + }, + _fireIfSingle: function _fireIfSingle(e) { + var map = this._map; + var oe = e.originalEvent; // prevents deselection in case of box selector + + if (oe && oe.shiftKey) { + return; + } + + map._clicked += 1; + this._map._clickTimeout = setTimeout(function () { + if (map._clicked === 1) { + map._clicked = 0; + map.fire('singleclick', { + type: 'singleclick' + }); + } else { + // manually fire doubleclick event only for touch screens that don't natively fire it + if (L.Browser.touch && oe && oe.sourceCapabilities.firesTouchEvents) { + map.fire('dblclick'); + } + } + }, 250); + }, + _onDoubleClick: function _onDoubleClick() { + var map = this._map; + var labels = map._labels; + setTimeout(function () { + map._clicked = 0; + clearTimeout(map._clickTimeout); + }, 0); + + if (!labels) { + return; + } + + if (labels.options.opacity === 1) { + labels.options.opacity = 0; + labels.setOpacity(0); + } else { + labels.options.opacity = 1; + labels.setOpacity(1); + } + } +}); +L.Map.addInitHook('addHandler', 'doubleClickLabels', L.Map.DoubleClickLabels); + +/***/ }), + +/***/ "./src/mapmixins/DoubleClickZoom.js": +/*!******************************************!*\ + !*** ./src/mapmixins/DoubleClickZoom.js ***! + \******************************************/ +/***/ (function() { + +/** + * `L.Map.DoubleClickZoom` from leaflet 1.5.1, overrwritten so that it + * 1) Fires a `singleclick` event to avoid deselecting images on `dblclick`. + * 2) Maintains a mutually exclusive relationship with the map's `DoubleClickLabels` handler + */ +L.Map.DoubleClickZoom.include({ + addHooks: function addHooks() { + this._map.on({ + click: this._fireIfSingle, + dblclick: this._onDoubleClick + }, this); + }, + removeHooks: function removeHooks() { + this._map.off({ + click: this._fireIfSingle, + dblclick: this._onDoubleClick + }, this); + }, + enable: function enable() { + if (this._enabled) { + return this; + } // don't enable 'doubleClickZoom' unless 'doubleClickLabels' is disabled first + + + if (this._map.doubleClickLabels) { + if (this._map.doubleClickLabels.enabled()) { + return this; + } + } // signify to collection/instance classes to turn on 'singleclick' listeners + + + this._map.fire('singleclickon'); + + this._enabled = true; + this.addHooks(); + return this; + }, + disable: function disable() { + if (!this._enabled) { + return this; + } // signify to collection/instance safe to swap 'singleclick' listeners with 'click' listeners. + + + this._map.fire('singleclickoff'); + + this._enabled = false; + this.removeHooks(); + return this; + }, + _fireIfSingle: function _fireIfSingle(e) { + var map = this._map; + var oe = e.originalEvent; // prevents deselection in case of box selector + + if (oe && oe.shiftKey) { + return; + } + + map._clicked += 1; + this._map._clickTimeout = setTimeout(function () { + if (map._clicked === 1) { + map._clicked = 0; + map.fire('singleclick', { + type: 'singleclick' + }); + } else { + // manually fire doubleclick event only for touch screens that don't natively fire it + if (L.Browser.touch && oe && oe.sourceCapabilities.firesTouchEvents) { + /* in `DoubleClickLabels.js`, we just do map.fire('dblclick') bc `_onDoublClick` doesn't use the + passed "e" (for now). To generate a 'real' DOM event that will have all of its corresponding core + properties (originalEvent, latlng, etc.), use Leaflet's `#map._fireDOMEvent` (Leaflet 1.5.1 source) */ + map._fireDOMEvent(oe, 'dblclick', [map]); + } + } + }, 250); + }, + _onDoubleClick: function _onDoubleClick(e) { + var map = this._map; + var oe = e.originalEvent; + setTimeout(function () { + map._clicked = 0; + clearTimeout(map._clickTimeout); + }, 0); + + if (!oe) { + return false; + } + + var oldZoom = map.getZoom(); + var delta = map.options.zoomDelta; + var zoom = oe.shiftKey ? oldZoom - delta : oldZoom + delta; + + if (map.options.doubleClickZoom === 'center') { + map.setZoom(zoom); + } else { + map.setZoomAround(e.containerPoint, zoom); + } + } +}); + +/***/ }), + +/***/ "./src/mapmixins/MapMixins.js": +/*!************************************!*\ + !*** ./src/mapmixins/MapMixins.js ***! + \************************************/ +/***/ (function() { + +/* eslint-disable max-len */ +L.Map.include({ + _clicked: 0, + addGoogleMutant: function addGoogleMutant(opts) { + var url = 'http://mt0.google.com/vt/lyrs=s&x={x}&y={y}&z={z}'; + opts = this.mutantOptions = L.extend({ + mutantOpacity: 0.8, + maxZoom: 24, + maxNativeZoom: 20, + minZoom: 0, + labels: true, + labelOpacity: 1, + doubleClickLabels: true + }, opts); + + if (!opts.labels) { + this.mutantOptions = L.extend(this.mutantOptions, { + labelOpacity: opts.labels ? 1 : undefined, + doubleClickLabels: opts.labels ? true : undefined + }); + } + + this._googleMutant = L.tileLayer(url, { + maxZoom: opts.maxZoom, + maxNativeZoom: opts.maxNativeZoom, + minZoom: opts.minZoom, + opacity: opts.mutantOpacity + }).addTo(this); + + if (opts.labels) { + this._addLabels(opts); + } // shouldn't have this handler at all if there are no labels to toggle + else { + this.doubleClickLabels = undefined; + } + + return this; + }, + _addLabels: function _addLabels(opts) { + var url = 'https://stamen-tiles-{s}.a.ssl.fastly.net/toner-labels/{z}/{x}/{y}{r}.{ext}'; + + if (opts.labelOpacity !== 0 && opts.labelOpacity !== 1) { + opts.labelOpacity = 1; + } + + this._labels = L.tileLayer(url, { + attribution: 'Map tiles by Stamen Design, CC BY 3.0 — Map data © OpenStreetMap contributors', + subdomains: 'abcd', + interactive: false, + opacity: opts.labelOpacity, + maxZoom: opts.maxZoom, + maxNativeZoom: opts.maxNativeZoom, + minZoom: opts.minZoom, + ext: 'png' + }).addTo(this); + + if (this.mutantOptions.doubleClickLabels) { + this.doubleClickLabels.enable(); + } + + return this; + } +}); // start off with doubleClickZoom enabled, doubleClickLabels can later be enabled instead +// during initialization + +L.Map.addInitHook(function () { + this.doubleClickLabels.disable(); + this.doubleClickZoom.enable(); +}); + +/***/ }), + +/***/ "./src/util/DomUtil.js": +/*!*****************************!*\ + !*** ./src/util/DomUtil.js ***! + \*****************************/ +/***/ (function() { + +L.DomUtil = L.extend(L.DomUtil, { + initTranslation: function initTranslation(obj) { + this.translation = obj; + }, + getMatrixString: function getMatrixString(m) { + var is3d = L.Browser.webkit3d || L.Browser.gecko3d || L.Browser.ie3d; + /* + * Since matrix3d takes a 4*4 matrix, we add in an empty row and column, + * which act as the identity on the z-axis. + * See: + * http://franklinta.com/2014/09/08/computing-css-matrix3d-transforms/ + * https://developer.mozilla.org/en-US/docs/Web/CSS/transform-function#M.C3.B6bius'_homogeneous_coordinates_in_projective_geometry + */ + + var matrix = [m[0], m[3], 0, m[6], m[1], m[4], 0, m[7], 0, 0, 1, 0, m[2], m[5], 0, m[8]]; + var str = is3d ? 'matrix3d(' + matrix.join(',') + ')' : ''; + + if (!is3d) { + console.log('Your browser must support 3D CSS transforms' + 'in order to use DistortableImageOverlay.'); + } + + return str; + }, + toggleClass: function toggleClass(el, className) { + var c = className; + return this.hasClass(el, c) ? this.removeClass(el, c) : this.addClass(el, c); + }, + confirmDelete: function confirmDelete() { + return window.confirm(this.translation.confirmImageDelete); + }, + confirmDeletes: function confirmDeletes(n) { + if (n === 1) { + return this.confirmDelete(); + } + + var translation = this.translation.confirmImagesDeletes; + var warningMsg = ''; + + if (typeof translation === 'function') { + warningMsg = translation(n); + } else { + warningMsg = translation; + } + + return window.confirm(warningMsg); + } +}); + +/***/ }), + +/***/ "./src/util/IconUtil.js": +/*!******************************!*\ + !*** ./src/util/IconUtil.js ***! + \******************************/ +/***/ (function() { + +L.IconUtil = { + /* creates an svg elemenet with built in accessibility properties + * and standardized classes for styling, takes in the fragment + * identifier (id) of the symbol to reference. note for symplicity + * we allow providing the icon target with or without the '#' prefix + */ + create: function create(ref) { + if (/^#/.test(ref)) { + ref = ref.replace(/^#/, ''); + } + + return '' + '' + ''; + }, + addClassToSvg: function addClassToSvg(container, loader) { + var svg = container.querySelector('svg'); + + if (svg) { + L.DomUtil.addClass(svg, loader); + } + }, + // finds the use element and toggles its icon reference + toggleXlink: function toggleXlink(container, ref1, ref2) { + if (!/^#/.test(ref1)) { + ref1 = '#' + ref1; + } + + if (!/^#/.test(ref2)) { + ref2 = '#' + ref2; + } + + var use = container.querySelector('use'); + + if (use) { + var toggled = use.getAttribute('xlink:href') === ref1 ? ref2 : ref1; + use.setAttribute('xlink:href', toggled); + return toggled; + } + + return false; + }, + toggleTitle: function toggleTitle(container, title1, title2) { + var toggled = container.getAttribute('title') === title1 ? title2 : title1; + container.setAttribute('title', toggled); + + if (container.hasAttribute('aria-label')) { + container.setAttribute('aria-label', toggled); + } + + return toggled; + } +}; + +/***/ }), + +/***/ "./src/util/ImageUtil.js": +/*!*******************************!*\ + !*** ./src/util/ImageUtil.js ***! + \*******************************/ +/***/ (function() { + +L.ImageUtil = { + getCmPerPixel: function getCmPerPixel(overlay) { + var map = overlay._map; + var dist = map.latLngToLayerPoint(overlay.getCorner(0)).distanceTo(map.latLngToLayerPoint(overlay.getCorner(1))); + return dist * 100 / overlay.getElement().width; + } +}; + +/***/ }), + +/***/ "./src/util/MatrixUtil.js": +/*!********************************!*\ + !*** ./src/util/MatrixUtil.js ***! + \********************************/ +/***/ (function() { + +L.MatrixUtil = { + // Compute the adjugate of m + adj: function adj(m) { + return [m[4] * m[8] - m[5] * m[7], m[2] * m[7] - m[1] * m[8], m[1] * m[5] - m[2] * m[4], m[5] * m[6] - m[3] * m[8], m[0] * m[8] - m[2] * m[6], m[2] * m[3] - m[0] * m[5], m[3] * m[7] - m[4] * m[6], m[1] * m[6] - m[0] * m[7], m[0] * m[4] - m[1] * m[3]]; + }, + // multiply two 3*3 matrices + multmm: function multmm(a, b) { + var c = []; + var i; + + for (i = 0; i < 3; i++) { + for (var j = 0; j < 3; j++) { + var cij = 0; + + for (var k = 0; k < 3; k++) { + cij += a[3 * i + k] * b[3 * k + j]; + } + + c[3 * i + j] = cij; + } + } + + return c; + }, + // multiply a 3*3 matrix and a 3-vector + multmv: function multmv(m, v) { + return [m[0] * v[0] + m[1] * v[1] + m[2] * v[2], m[3] * v[0] + m[4] * v[1] + m[5] * v[2], m[6] * v[0] + m[7] * v[1] + m[8] * v[2]]; + }, + // multiply a scalar and a 3*3 matrix + multsm: function multsm(s, m) { + var matrix = []; + + for (var i = 0, l = m.length; i < l; i++) { + matrix.push(s * m[i]); + } + + return matrix; + }, + basisToPoints: function basisToPoints(x1, y1, x2, y2, x3, y3, x4, y4) { + var m = [x1, x2, x3, y1, y2, y3, 1, 1, 1]; + var v = L.MatrixUtil.multmv(L.MatrixUtil.adj(m), [x4, y4, 1]); + return L.MatrixUtil.multmm(m, [v[0], 0, 0, 0, v[1], 0, 0, 0, v[2]]); + }, + project: function project(m, x, y) { + var v = L.MatrixUtil.multmv(m, [x, y, 1]); + return [v[0] / v[2], v[1] / v[2]]; + }, + general2DProjection: function general2DProjection(x1s, y1s, x1d, y1d, x2s, y2s, x2d, y2d, x3s, y3s, x3d, y3d, x4s, y4s, x4d, y4d) { + var s = L.MatrixUtil.basisToPoints(x1s, y1s, x2s, y2s, x3s, y3s, x4s, y4s); + var d = L.MatrixUtil.basisToPoints(x1d, y1d, x2d, y2d, x3d, y3d, x4d, y4d); + var m = L.MatrixUtil.multmm(d, L.MatrixUtil.adj(s)); // Normalize to the unique matrix with m[8] == 1. + // See: http://franklinta.com/2014/09/08/computing-css-matrix3d-transforms/ + + return L.MatrixUtil.multsm(1 / m[8], m); + } +}; + +/***/ }), + +/***/ "./src/util/TrigUtil.js": +/*!******************************!*\ + !*** ./src/util/TrigUtil.js ***! + \******************************/ +/***/ (function() { + +L.TrigUtil = { + calcAngle: function calcAngle(x, y) { + var unit = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'deg'; + return unit === 'deg' ? this.radiansToDegrees(Math.atan2(y, x)) : Math.atan2(y, x); + }, + radiansToDegrees: function radiansToDegrees(angle) { + return angle * 180 / Math.PI; + }, + degreesToRadians: function degreesToRadians(angle) { + return angle * Math.PI / 180; + } +}; + +/***/ }), + +/***/ "./src/util/Utils.js": +/*!***************************!*\ + !*** ./src/util/Utils.js ***! + \***************************/ +/***/ (function() { + +L.Utils = { + initTranslation: function initTranslation() { + var translation = { + deleteImage: 'Delete Image', + deleteImages: 'Delete Images', + distortImage: 'Distort Image', + dragImage: 'Drag Image', + exportImage: 'Export Image', + exportImages: 'Export Images', + removeBorder: 'Remove Border', + addBorder: 'Add Border', + freeRotateImage: 'Free rotate Image', + geolocateImage: 'Geolocate Image', + lockMode: 'Lock Mode', + lockImages: 'Lock Images', + makeImageOpaque: 'Make Image Opaque', + makeImageTransparent: 'Make Image Transparent', + restoreImage: 'Restore Natural Image', + rotateImage: 'Rotate Image', + scaleImage: 'Scale Image', + stackToFront: 'Stack to Front', + stackToBack: 'Stack to Back', + unlockImages: 'Unlock Images', + confirmImageDelete: 'Are you sure? This image will be permanently deleted from the map.', + confirmImagesDeletes: 'Are you sure? These images will be permanently deleted from the map.' + }; + + if (!this.options.translation) { + this.options.translation = translation; + } else { + // If the translation for a word is not specified, fallback to English. + for (var key in translation) { + if (!this.options.translation.hasOwnProperty(key)) { + this.options.translation[key] = translation[key]; + } + } + } + + L.DomUtil.initTranslation(this.options.translation); + }, + getNestedVal: function getNestedVal(obj, key, nestedKey) { + var dig = [key, nestedKey]; + return dig.reduce(function (obj, k) { + return obj && obj[k]; + }, obj); + } +}; + +/***/ }), + +/***/ "./node_modules/events/events.js": +/*!***************************************!*\ + !*** ./node_modules/events/events.js ***! + \***************************************/ +/***/ (function(module) { + +"use strict"; +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + + + +var R = typeof Reflect === 'object' ? Reflect : null +var ReflectApply = R && typeof R.apply === 'function' + ? R.apply + : function ReflectApply(target, receiver, args) { + return Function.prototype.apply.call(target, receiver, args); + } + +var ReflectOwnKeys +if (R && typeof R.ownKeys === 'function') { + ReflectOwnKeys = R.ownKeys +} else if (Object.getOwnPropertySymbols) { + ReflectOwnKeys = function ReflectOwnKeys(target) { + return Object.getOwnPropertyNames(target) + .concat(Object.getOwnPropertySymbols(target)); + }; +} else { + ReflectOwnKeys = function ReflectOwnKeys(target) { + return Object.getOwnPropertyNames(target); + }; +} + +function ProcessEmitWarning(warning) { + if (console && console.warn) console.warn(warning); +} + +var NumberIsNaN = Number.isNaN || function NumberIsNaN(value) { + return value !== value; +} + +function EventEmitter() { + EventEmitter.init.call(this); +} +module.exports = EventEmitter; +module.exports.once = once; + +// Backwards-compat with node 0.10.x +EventEmitter.EventEmitter = EventEmitter; + +EventEmitter.prototype._events = undefined; +EventEmitter.prototype._eventsCount = 0; +EventEmitter.prototype._maxListeners = undefined; + +// By default EventEmitters will print a warning if more than 10 listeners are +// added to it. This is a useful default which helps finding memory leaks. +var defaultMaxListeners = 10; + +function checkListener(listener) { + if (typeof listener !== 'function') { + throw new TypeError('The "listener" argument must be of type Function. Received type ' + typeof listener); + } +} + +Object.defineProperty(EventEmitter, 'defaultMaxListeners', { + enumerable: true, + get: function() { + return defaultMaxListeners; + }, + set: function(arg) { + if (typeof arg !== 'number' || arg < 0 || NumberIsNaN(arg)) { + throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received ' + arg + '.'); + } + defaultMaxListeners = arg; + } +}); + +EventEmitter.init = function() { + + if (this._events === undefined || + this._events === Object.getPrototypeOf(this)._events) { + this._events = Object.create(null); + this._eventsCount = 0; + } + + this._maxListeners = this._maxListeners || undefined; +}; + +// Obviously not all Emitters should be limited to 10. This function allows +// that to be increased. Set to zero for unlimited. +EventEmitter.prototype.setMaxListeners = function setMaxListeners(n) { + if (typeof n !== 'number' || n < 0 || NumberIsNaN(n)) { + throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received ' + n + '.'); + } + this._maxListeners = n; + return this; +}; + +function _getMaxListeners(that) { + if (that._maxListeners === undefined) + return EventEmitter.defaultMaxListeners; + return that._maxListeners; +} + +EventEmitter.prototype.getMaxListeners = function getMaxListeners() { + return _getMaxListeners(this); +}; + +EventEmitter.prototype.emit = function emit(type) { + var args = []; + for (var i = 1; i < arguments.length; i++) args.push(arguments[i]); + var doError = (type === 'error'); + + var events = this._events; + if (events !== undefined) + doError = (doError && events.error === undefined); + else if (!doError) + return false; + + // If there is no 'error' event listener then throw. + if (doError) { + var er; + if (args.length > 0) + er = args[0]; + if (er instanceof Error) { + // Note: The comments on the `throw` lines are intentional, they show + // up in Node's output if this results in an unhandled exception. + throw er; // Unhandled 'error' event + } + // At least give some kind of context to the user + var err = new Error('Unhandled error.' + (er ? ' (' + er.message + ')' : '')); + err.context = er; + throw err; // Unhandled 'error' event + } + + var handler = events[type]; + + if (handler === undefined) + return false; + + if (typeof handler === 'function') { + ReflectApply(handler, this, args); + } else { + var len = handler.length; + var listeners = arrayClone(handler, len); + for (var i = 0; i < len; ++i) + ReflectApply(listeners[i], this, args); + } + + return true; +}; + +function _addListener(target, type, listener, prepend) { + var m; + var events; + var existing; + + checkListener(listener); + + events = target._events; + if (events === undefined) { + events = target._events = Object.create(null); + target._eventsCount = 0; + } else { + // To avoid recursion in the case that type === "newListener"! Before + // adding it to the listeners, first emit "newListener". + if (events.newListener !== undefined) { + target.emit('newListener', type, + listener.listener ? listener.listener : listener); + + // Re-assign `events` because a newListener handler could have caused the + // this._events to be assigned to a new object + events = target._events; + } + existing = events[type]; + } + + if (existing === undefined) { + // Optimize the case of one listener. Don't need the extra array object. + existing = events[type] = listener; + ++target._eventsCount; + } else { + if (typeof existing === 'function') { + // Adding the second element, need to change to array. + existing = events[type] = + prepend ? [listener, existing] : [existing, listener]; + // If we've already got an array, just append. + } else if (prepend) { + existing.unshift(listener); + } else { + existing.push(listener); + } + + // Check for listener leak + m = _getMaxListeners(target); + if (m > 0 && existing.length > m && !existing.warned) { + existing.warned = true; + // No error code for this since it is a Warning + // eslint-disable-next-line no-restricted-syntax + var w = new Error('Possible EventEmitter memory leak detected. ' + + existing.length + ' ' + String(type) + ' listeners ' + + 'added. Use emitter.setMaxListeners() to ' + + 'increase limit'); + w.name = 'MaxListenersExceededWarning'; + w.emitter = target; + w.type = type; + w.count = existing.length; + ProcessEmitWarning(w); + } + } + + return target; +} + +EventEmitter.prototype.addListener = function addListener(type, listener) { + return _addListener(this, type, listener, false); +}; + +EventEmitter.prototype.on = EventEmitter.prototype.addListener; + +EventEmitter.prototype.prependListener = + function prependListener(type, listener) { + return _addListener(this, type, listener, true); + }; + +function onceWrapper() { + if (!this.fired) { + this.target.removeListener(this.type, this.wrapFn); + this.fired = true; + if (arguments.length === 0) + return this.listener.call(this.target); + return this.listener.apply(this.target, arguments); + } +} + +function _onceWrap(target, type, listener) { + var state = { fired: false, wrapFn: undefined, target: target, type: type, listener: listener }; + var wrapped = onceWrapper.bind(state); + wrapped.listener = listener; + state.wrapFn = wrapped; + return wrapped; +} + +EventEmitter.prototype.once = function once(type, listener) { + checkListener(listener); + this.on(type, _onceWrap(this, type, listener)); + return this; +}; + +EventEmitter.prototype.prependOnceListener = + function prependOnceListener(type, listener) { + checkListener(listener); + this.prependListener(type, _onceWrap(this, type, listener)); + return this; + }; + +// Emits a 'removeListener' event if and only if the listener was removed. +EventEmitter.prototype.removeListener = + function removeListener(type, listener) { + var list, events, position, i, originalListener; + + checkListener(listener); + + events = this._events; + if (events === undefined) + return this; + + list = events[type]; + if (list === undefined) + return this; + + if (list === listener || list.listener === listener) { + if (--this._eventsCount === 0) + this._events = Object.create(null); + else { + delete events[type]; + if (events.removeListener) + this.emit('removeListener', type, list.listener || listener); + } + } else if (typeof list !== 'function') { + position = -1; + + for (i = list.length - 1; i >= 0; i--) { + if (list[i] === listener || list[i].listener === listener) { + originalListener = list[i].listener; + position = i; + break; + } + } + + if (position < 0) + return this; + + if (position === 0) + list.shift(); + else { + spliceOne(list, position); + } + + if (list.length === 1) + events[type] = list[0]; + + if (events.removeListener !== undefined) + this.emit('removeListener', type, originalListener || listener); + } + + return this; + }; + +EventEmitter.prototype.off = EventEmitter.prototype.removeListener; + +EventEmitter.prototype.removeAllListeners = + function removeAllListeners(type) { + var listeners, events, i; + + events = this._events; + if (events === undefined) + return this; + + // not listening for removeListener, no need to emit + if (events.removeListener === undefined) { + if (arguments.length === 0) { + this._events = Object.create(null); + this._eventsCount = 0; + } else if (events[type] !== undefined) { + if (--this._eventsCount === 0) + this._events = Object.create(null); + else + delete events[type]; + } + return this; + } + + // emit removeListener for all listeners on all events + if (arguments.length === 0) { + var keys = Object.keys(events); + var key; + for (i = 0; i < keys.length; ++i) { + key = keys[i]; + if (key === 'removeListener') continue; + this.removeAllListeners(key); + } + this.removeAllListeners('removeListener'); + this._events = Object.create(null); + this._eventsCount = 0; + return this; + } + + listeners = events[type]; + + if (typeof listeners === 'function') { + this.removeListener(type, listeners); + } else if (listeners !== undefined) { + // LIFO order + for (i = listeners.length - 1; i >= 0; i--) { + this.removeListener(type, listeners[i]); + } + } + + return this; + }; + +function _listeners(target, type, unwrap) { + var events = target._events; + + if (events === undefined) + return []; + + var evlistener = events[type]; + if (evlistener === undefined) + return []; + + if (typeof evlistener === 'function') + return unwrap ? [evlistener.listener || evlistener] : [evlistener]; + + return unwrap ? + unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length); +} + +EventEmitter.prototype.listeners = function listeners(type) { + return _listeners(this, type, true); +}; + +EventEmitter.prototype.rawListeners = function rawListeners(type) { + return _listeners(this, type, false); +}; + +EventEmitter.listenerCount = function(emitter, type) { + if (typeof emitter.listenerCount === 'function') { + return emitter.listenerCount(type); + } else { + return listenerCount.call(emitter, type); + } +}; + +EventEmitter.prototype.listenerCount = listenerCount; +function listenerCount(type) { + var events = this._events; + + if (events !== undefined) { + var evlistener = events[type]; + + if (typeof evlistener === 'function') { + return 1; + } else if (evlistener !== undefined) { + return evlistener.length; + } + } + + return 0; +} + +EventEmitter.prototype.eventNames = function eventNames() { + return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : []; +}; + +function arrayClone(arr, n) { + var copy = new Array(n); + for (var i = 0; i < n; ++i) + copy[i] = arr[i]; + return copy; +} + +function spliceOne(list, index) { + for (; index + 1 < list.length; index++) + list[index] = list[index + 1]; + list.pop(); +} + +function unwrapListeners(arr) { + var ret = new Array(arr.length); + for (var i = 0; i < ret.length; ++i) { + ret[i] = arr[i].listener || arr[i]; + } + return ret; +} + +function once(emitter, name) { + return new Promise(function (resolve, reject) { + function errorListener(err) { + emitter.removeListener(name, resolver); + reject(err); + } + + function resolver() { + if (typeof emitter.removeListener === 'function') { + emitter.removeListener('error', errorListener); + } + resolve([].slice.call(arguments)); + }; + + eventTargetAgnosticAddListener(emitter, name, resolver, { once: true }); + if (name !== 'error') { + addErrorHandlerIfEventEmitter(emitter, errorListener, { once: true }); + } + }); +} + +function addErrorHandlerIfEventEmitter(emitter, handler, flags) { + if (typeof emitter.on === 'function') { + eventTargetAgnosticAddListener(emitter, 'error', handler, flags); + } +} + +function eventTargetAgnosticAddListener(emitter, name, listener, flags) { + if (typeof emitter.on === 'function') { + if (flags.once) { + emitter.once(name, listener); + } else { + emitter.on(name, listener); + } + } else if (typeof emitter.addEventListener === 'function') { + // EventTarget does not have `error` event semantics like Node + // EventEmitters, we do not listen for `error` events here. + emitter.addEventListener(name, function wrapListener(arg) { + // IE does not have builtin `{ once: true }` support so we + // have to do it manually. + if (flags.once) { + emitter.removeEventListener(name, wrapListener); + } + listener(arg); + }); + } else { + throw new TypeError('The "emitter" argument must be of type EventEmitter. Received type ' + typeof emitter); + } +} + + +/***/ }), + +/***/ "./node_modules/html-entities/lib/index.js": +/*!*************************************************!*\ + !*** ./node_modules/html-entities/lib/index.js ***! + \*************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +var __assign = (this && this.__assign) || function () { + __assign = Object.assign || function(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +var named_references_1 = __webpack_require__(/*! ./named-references */ "./node_modules/html-entities/lib/named-references.js"); +var numeric_unicode_map_1 = __webpack_require__(/*! ./numeric-unicode-map */ "./node_modules/html-entities/lib/numeric-unicode-map.js"); +var surrogate_pairs_1 = __webpack_require__(/*! ./surrogate-pairs */ "./node_modules/html-entities/lib/surrogate-pairs.js"); +var allNamedReferences = __assign(__assign({}, named_references_1.namedReferences), { all: named_references_1.namedReferences.html5 }); +var encodeRegExps = { + specialChars: /[<>'"&]/g, + nonAscii: /(?:[<>'"&\u0080-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])/g, + nonAsciiPrintable: /(?:[<>'"&\x01-\x08\x11-\x15\x17-\x1F\x7f-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])/g, + extensive: /(?:[\x01-\x0c\x0e-\x1f\x21-\x2c\x2e-\x2f\x3a-\x40\x5b-\x60\x7b-\x7d\x7f-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])/g +}; +var defaultEncodeOptions = { + mode: 'specialChars', + level: 'all', + numeric: 'decimal' +}; +/** Encodes all the necessary (specified by `level`) characters in the text */ +function encode(text, _a) { + var _b = _a === void 0 ? defaultEncodeOptions : _a, _c = _b.mode, mode = _c === void 0 ? 'specialChars' : _c, _d = _b.numeric, numeric = _d === void 0 ? 'decimal' : _d, _e = _b.level, level = _e === void 0 ? 'all' : _e; + if (!text) { + return ''; + } + var encodeRegExp = encodeRegExps[mode]; + var references = allNamedReferences[level].characters; + var isHex = numeric === 'hexadecimal'; + encodeRegExp.lastIndex = 0; + var _b = encodeRegExp.exec(text); + var _c; + if (_b) { + _c = ''; + var _d = 0; + do { + if (_d !== _b.index) { + _c += text.substring(_d, _b.index); + } + var _e = _b[0]; + var result_1 = references[_e]; + if (!result_1) { + var code_1 = _e.length > 1 ? surrogate_pairs_1.getCodePoint(_e, 0) : _e.charCodeAt(0); + result_1 = (isHex ? '&#x' + code_1.toString(16) : '&#' + code_1) + ';'; + } + _c += result_1; + _d = _b.index + _e.length; + } while ((_b = encodeRegExp.exec(text))); + if (_d !== text.length) { + _c += text.substring(_d); + } + } + else { + _c = + text; + } + return _c; +} +exports.encode = encode; +var defaultDecodeOptions = { + scope: 'body', + level: 'all' +}; +var strict = /&(?:#\d+|#[xX][\da-fA-F]+|[0-9a-zA-Z]+);/g; +var attribute = /&(?:#\d+|#[xX][\da-fA-F]+|[0-9a-zA-Z]+)[;=]?/g; +var baseDecodeRegExps = { + xml: { + strict: strict, + attribute: attribute, + body: named_references_1.bodyRegExps.xml + }, + html4: { + strict: strict, + attribute: attribute, + body: named_references_1.bodyRegExps.html4 + }, + html5: { + strict: strict, + attribute: attribute, + body: named_references_1.bodyRegExps.html5 + } +}; +var decodeRegExps = __assign(__assign({}, baseDecodeRegExps), { all: baseDecodeRegExps.html5 }); +var fromCharCode = String.fromCharCode; +var outOfBoundsChar = fromCharCode(65533); +var defaultDecodeEntityOptions = { + level: 'all' +}; +/** Decodes a single entity */ +function decodeEntity(entity, _a) { + var _b = (_a === void 0 ? defaultDecodeEntityOptions : _a).level, level = _b === void 0 ? 'all' : _b; + if (!entity) { + return ''; + } + var _b = entity; + var decodeEntityLastChar_1 = entity[entity.length - 1]; + if (false) {} + else if (false) {} + else { + var decodeResultByReference_1 = allNamedReferences[level].entities[entity]; + if (decodeResultByReference_1) { + _b = decodeResultByReference_1; + } + else if (entity[0] === '&' && entity[1] === '#') { + var decodeSecondChar_1 = entity[2]; + var decodeCode_1 = decodeSecondChar_1 == 'x' || decodeSecondChar_1 == 'X' + ? parseInt(entity.substr(3), 16) + : parseInt(entity.substr(2)); + _b = + decodeCode_1 >= 0x10ffff + ? outOfBoundsChar + : decodeCode_1 > 65535 + ? surrogate_pairs_1.fromCodePoint(decodeCode_1) + : fromCharCode(numeric_unicode_map_1.numericUnicodeMap[decodeCode_1] || decodeCode_1); + } + } + return _b; +} +exports.decodeEntity = decodeEntity; +/** Decodes all entities in the text */ +function decode(text, _a) { + var decodeSecondChar_1 = _a === void 0 ? defaultDecodeOptions : _a, decodeCode_1 = decodeSecondChar_1.level, level = decodeCode_1 === void 0 ? 'all' : decodeCode_1, _b = decodeSecondChar_1.scope, scope = _b === void 0 ? level === 'xml' ? 'strict' : 'body' : _b; + if (!text) { + return ''; + } + var decodeRegExp = decodeRegExps[level][scope]; + var references = allNamedReferences[level].entities; + var isAttribute = scope === 'attribute'; + var isStrict = scope === 'strict'; + decodeRegExp.lastIndex = 0; + var replaceMatch_1 = decodeRegExp.exec(text); + var replaceResult_1; + if (replaceMatch_1) { + replaceResult_1 = ''; + var replaceLastIndex_1 = 0; + do { + if (replaceLastIndex_1 !== replaceMatch_1.index) { + replaceResult_1 += text.substring(replaceLastIndex_1, replaceMatch_1.index); + } + var replaceInput_1 = replaceMatch_1[0]; + var decodeResult_1 = replaceInput_1; + var decodeEntityLastChar_2 = replaceInput_1[replaceInput_1.length - 1]; + if (isAttribute + && decodeEntityLastChar_2 === '=') { + decodeResult_1 = replaceInput_1; + } + else if (isStrict + && decodeEntityLastChar_2 !== ';') { + decodeResult_1 = replaceInput_1; + } + else { + var decodeResultByReference_2 = references[replaceInput_1]; + if (decodeResultByReference_2) { + decodeResult_1 = decodeResultByReference_2; + } + else if (replaceInput_1[0] === '&' && replaceInput_1[1] === '#') { + var decodeSecondChar_2 = replaceInput_1[2]; + var decodeCode_2 = decodeSecondChar_2 == 'x' || decodeSecondChar_2 == 'X' + ? parseInt(replaceInput_1.substr(3), 16) + : parseInt(replaceInput_1.substr(2)); + decodeResult_1 = + decodeCode_2 >= 0x10ffff + ? outOfBoundsChar + : decodeCode_2 > 65535 + ? surrogate_pairs_1.fromCodePoint(decodeCode_2) + : fromCharCode(numeric_unicode_map_1.numericUnicodeMap[decodeCode_2] || decodeCode_2); + } + } + replaceResult_1 += decodeResult_1; + replaceLastIndex_1 = replaceMatch_1.index + replaceInput_1.length; + } while ((replaceMatch_1 = decodeRegExp.exec(text))); + if (replaceLastIndex_1 !== text.length) { + replaceResult_1 += text.substring(replaceLastIndex_1); + } + } + else { + replaceResult_1 = + text; + } + return replaceResult_1; +} +exports.decode = decode; + + +/***/ }), + +/***/ "./node_modules/html-entities/lib/named-references.js": +/*!************************************************************!*\ + !*** ./node_modules/html-entities/lib/named-references.js ***! + \************************************************************/ +/***/ (function(__unused_webpack_module, exports) { + +"use strict"; +Object.defineProperty(exports, "__esModule", ({value:true}));exports.bodyRegExps={xml:/&(?:#\d+|#[xX][\da-fA-F]+|[0-9a-zA-Z]+);?/g,html4:/&(?:nbsp|iexcl|cent|pound|curren|yen|brvbar|sect|uml|copy|ordf|laquo|not|shy|reg|macr|deg|plusmn|sup2|sup3|acute|micro|para|middot|cedil|sup1|ordm|raquo|frac14|frac12|frac34|iquest|Agrave|Aacute|Acirc|Atilde|Auml|Aring|AElig|Ccedil|Egrave|Eacute|Ecirc|Euml|Igrave|Iacute|Icirc|Iuml|ETH|Ntilde|Ograve|Oacute|Ocirc|Otilde|Ouml|times|Oslash|Ugrave|Uacute|Ucirc|Uuml|Yacute|THORN|szlig|agrave|aacute|acirc|atilde|auml|aring|aelig|ccedil|egrave|eacute|ecirc|euml|igrave|iacute|icirc|iuml|eth|ntilde|ograve|oacute|ocirc|otilde|ouml|divide|oslash|ugrave|uacute|ucirc|uuml|yacute|thorn|yuml|quot|amp|lt|gt|#\d+|#[xX][\da-fA-F]+|[0-9a-zA-Z]+);?/g,html5:/&(?:AElig|AMP|Aacute|Acirc|Agrave|Aring|Atilde|Auml|COPY|Ccedil|ETH|Eacute|Ecirc|Egrave|Euml|GT|Iacute|Icirc|Igrave|Iuml|LT|Ntilde|Oacute|Ocirc|Ograve|Oslash|Otilde|Ouml|QUOT|REG|THORN|Uacute|Ucirc|Ugrave|Uuml|Yacute|aacute|acirc|acute|aelig|agrave|amp|aring|atilde|auml|brvbar|ccedil|cedil|cent|copy|curren|deg|divide|eacute|ecirc|egrave|eth|euml|frac12|frac14|frac34|gt|iacute|icirc|iexcl|igrave|iquest|iuml|laquo|lt|macr|micro|middot|nbsp|not|ntilde|oacute|ocirc|ograve|ordf|ordm|oslash|otilde|ouml|para|plusmn|pound|quot|raquo|reg|sect|shy|sup1|sup2|sup3|szlig|thorn|times|uacute|ucirc|ugrave|uml|uuml|yacute|yen|yuml|#\d+|#[xX][\da-fA-F]+|[0-9a-zA-Z]+);?/g};exports.namedReferences={xml:{entities:{"<":"<",">":">",""":'"',"'":"'","&":"&"},characters:{"<":"<",">":">",'"':""","'":"'","&":"&"}},html4:{entities:{"'":"'"," ":" "," ":" ","¡":"¡","¡":"¡","¢":"¢","¢":"¢","£":"£","£":"£","¤":"¤","¤":"¤","¥":"¥","¥":"¥","¦":"¦","¦":"¦","§":"§","§":"§","¨":"¨","¨":"¨","©":"©","©":"©","ª":"ª","ª":"ª","«":"«","«":"«","¬":"¬","¬":"¬","­":"­","­":"­","®":"®","®":"®","¯":"¯","¯":"¯","°":"°","°":"°","±":"±","±":"±","²":"²","²":"²","³":"³","³":"³","´":"´","´":"´","µ":"µ","µ":"µ","¶":"¶","¶":"¶","·":"·","·":"·","¸":"¸","¸":"¸","¹":"¹","¹":"¹","º":"º","º":"º","»":"»","»":"»","¼":"¼","¼":"¼","½":"½","½":"½","¾":"¾","¾":"¾","¿":"¿","¿":"¿","À":"À","À":"À","Á":"Á","Á":"Á","Â":"Â","Â":"Â","Ã":"Ã","Ã":"Ã","Ä":"Ä","Ä":"Ä","Å":"Å","Å":"Å","Æ":"Æ","Æ":"Æ","Ç":"Ç","Ç":"Ç","È":"È","È":"È","É":"É","É":"É","Ê":"Ê","Ê":"Ê","Ë":"Ë","Ë":"Ë","Ì":"Ì","Ì":"Ì","Í":"Í","Í":"Í","Î":"Î","Î":"Î","Ï":"Ï","Ï":"Ï","Ð":"Ð","Ð":"Ð","Ñ":"Ñ","Ñ":"Ñ","Ò":"Ò","Ò":"Ò","Ó":"Ó","Ó":"Ó","Ô":"Ô","Ô":"Ô","Õ":"Õ","Õ":"Õ","Ö":"Ö","Ö":"Ö","×":"×","×":"×","Ø":"Ø","Ø":"Ø","Ù":"Ù","Ù":"Ù","Ú":"Ú","Ú":"Ú","Û":"Û","Û":"Û","Ü":"Ü","Ü":"Ü","Ý":"Ý","Ý":"Ý","Þ":"Þ","Þ":"Þ","ß":"ß","ß":"ß","à":"à","à":"à","á":"á","á":"á","â":"â","â":"â","ã":"ã","ã":"ã","ä":"ä","ä":"ä","å":"å","å":"å","æ":"æ","æ":"æ","ç":"ç","ç":"ç","è":"è","è":"è","é":"é","é":"é","ê":"ê","ê":"ê","ë":"ë","ë":"ë","ì":"ì","ì":"ì","í":"í","í":"í","î":"î","î":"î","ï":"ï","ï":"ï","ð":"ð","ð":"ð","ñ":"ñ","ñ":"ñ","ò":"ò","ò":"ò","ó":"ó","ó":"ó","ô":"ô","ô":"ô","õ":"õ","õ":"õ","ö":"ö","ö":"ö","÷":"÷","÷":"÷","ø":"ø","ø":"ø","ù":"ù","ù":"ù","ú":"ú","ú":"ú","û":"û","û":"û","ü":"ü","ü":"ü","ý":"ý","ý":"ý","þ":"þ","þ":"þ","ÿ":"ÿ","ÿ":"ÿ",""":'"',""":'"',"&":"&","&":"&","<":"<","<":"<",">":">",">":">","Œ":"Œ","œ":"œ","Š":"Š","š":"š","Ÿ":"Ÿ","ˆ":"ˆ","˜":"˜"," ":" "," ":" "," ":" ","‌":"‌","‍":"‍","‎":"‎","‏":"‏","–":"–","—":"—","‘":"‘","’":"’","‚":"‚","“":"“","”":"”","„":"„","†":"†","‡":"‡","‰":"‰","‹":"‹","›":"›","€":"€","ƒ":"ƒ","Α":"Α","Β":"Β","Γ":"Γ","Δ":"Δ","Ε":"Ε","Ζ":"Ζ","Η":"Η","Θ":"Θ","Ι":"Ι","Κ":"Κ","Λ":"Λ","Μ":"Μ","Ν":"Ν","Ξ":"Ξ","Ο":"Ο","Π":"Π","Ρ":"Ρ","Σ":"Σ","Τ":"Τ","Υ":"Υ","Φ":"Φ","Χ":"Χ","Ψ":"Ψ","Ω":"Ω","α":"α","β":"β","γ":"γ","δ":"δ","ε":"ε","ζ":"ζ","η":"η","θ":"θ","ι":"ι","κ":"κ","λ":"λ","μ":"μ","ν":"ν","ξ":"ξ","ο":"ο","π":"π","ρ":"ρ","ς":"ς","σ":"σ","τ":"τ","υ":"υ","φ":"φ","χ":"χ","ψ":"ψ","ω":"ω","ϑ":"ϑ","ϒ":"ϒ","ϖ":"ϖ","•":"•","…":"…","′":"′","″":"″","‾":"‾","⁄":"⁄","℘":"℘","ℑ":"ℑ","ℜ":"ℜ","™":"™","ℵ":"ℵ","←":"←","↑":"↑","→":"→","↓":"↓","↔":"↔","↵":"↵","⇐":"⇐","⇑":"⇑","⇒":"⇒","⇓":"⇓","⇔":"⇔","∀":"∀","∂":"∂","∃":"∃","∅":"∅","∇":"∇","∈":"∈","∉":"∉","∋":"∋","∏":"∏","∑":"∑","−":"−","∗":"∗","√":"√","∝":"∝","∞":"∞","∠":"∠","∧":"∧","∨":"∨","∩":"∩","∪":"∪","∫":"∫","∴":"∴","∼":"∼","≅":"≅","≈":"≈","≠":"≠","≡":"≡","≤":"≤","≥":"≥","⊂":"⊂","⊃":"⊃","⊄":"⊄","⊆":"⊆","⊇":"⊇","⊕":"⊕","⊗":"⊗","⊥":"⊥","⋅":"⋅","⌈":"⌈","⌉":"⌉","⌊":"⌊","⌋":"⌋","⟨":"〈","⟩":"〉","◊":"◊","♠":"♠","♣":"♣","♥":"♥","♦":"♦"},characters:{"'":"'"," ":" ","¡":"¡","¢":"¢","£":"£","¤":"¤","¥":"¥","¦":"¦","§":"§","¨":"¨","©":"©","ª":"ª","«":"«","¬":"¬","­":"­","®":"®","¯":"¯","°":"°","±":"±","²":"²","³":"³","´":"´","µ":"µ","¶":"¶","·":"·","¸":"¸","¹":"¹","º":"º","»":"»","¼":"¼","½":"½","¾":"¾","¿":"¿","À":"À","Á":"Á","Â":"Â","Ã":"Ã","Ä":"Ä","Å":"Å","Æ":"Æ","Ç":"Ç","È":"È","É":"É","Ê":"Ê","Ë":"Ë","Ì":"Ì","Í":"Í","Î":"Î","Ï":"Ï","Ð":"Ð","Ñ":"Ñ","Ò":"Ò","Ó":"Ó","Ô":"Ô","Õ":"Õ","Ö":"Ö","×":"×","Ø":"Ø","Ù":"Ù","Ú":"Ú","Û":"Û","Ü":"Ü","Ý":"Ý","Þ":"Þ","ß":"ß","à":"à","á":"á","â":"â","ã":"ã","ä":"ä","å":"å","æ":"æ","ç":"ç","è":"è","é":"é","ê":"ê","ë":"ë","ì":"ì","í":"í","î":"î","ï":"ï","ð":"ð","ñ":"ñ","ò":"ò","ó":"ó","ô":"ô","õ":"õ","ö":"ö","÷":"÷","ø":"ø","ù":"ù","ú":"ú","û":"û","ü":"ü","ý":"ý","þ":"þ","ÿ":"ÿ",'"':""","&":"&","<":"<",">":">","Œ":"Œ","œ":"œ","Š":"Š","š":"š","Ÿ":"Ÿ","ˆ":"ˆ","˜":"˜"," ":" "," ":" "," ":" ","‌":"‌","‍":"‍","‎":"‎","‏":"‏","–":"–","—":"—","‘":"‘","’":"’","‚":"‚","“":"“","”":"”","„":"„","†":"†","‡":"‡","‰":"‰","‹":"‹","›":"›","€":"€","ƒ":"ƒ","Α":"Α","Β":"Β","Γ":"Γ","Δ":"Δ","Ε":"Ε","Ζ":"Ζ","Η":"Η","Θ":"Θ","Ι":"Ι","Κ":"Κ","Λ":"Λ","Μ":"Μ","Ν":"Ν","Ξ":"Ξ","Ο":"Ο","Π":"Π","Ρ":"Ρ","Σ":"Σ","Τ":"Τ","Υ":"Υ","Φ":"Φ","Χ":"Χ","Ψ":"Ψ","Ω":"Ω","α":"α","β":"β","γ":"γ","δ":"δ","ε":"ε","ζ":"ζ","η":"η","θ":"θ","ι":"ι","κ":"κ","λ":"λ","μ":"μ","ν":"ν","ξ":"ξ","ο":"ο","π":"π","ρ":"ρ","ς":"ς","σ":"σ","τ":"τ","υ":"υ","φ":"φ","χ":"χ","ψ":"ψ","ω":"ω","ϑ":"ϑ","ϒ":"ϒ","ϖ":"ϖ","•":"•","…":"…","′":"′","″":"″","‾":"‾","⁄":"⁄","℘":"℘","ℑ":"ℑ","ℜ":"ℜ","™":"™","ℵ":"ℵ","←":"←","↑":"↑","→":"→","↓":"↓","↔":"↔","↵":"↵","⇐":"⇐","⇑":"⇑","⇒":"⇒","⇓":"⇓","⇔":"⇔","∀":"∀","∂":"∂","∃":"∃","∅":"∅","∇":"∇","∈":"∈","∉":"∉","∋":"∋","∏":"∏","∑":"∑","−":"−","∗":"∗","√":"√","∝":"∝","∞":"∞","∠":"∠","∧":"∧","∨":"∨","∩":"∩","∪":"∪","∫":"∫","∴":"∴","∼":"∼","≅":"≅","≈":"≈","≠":"≠","≡":"≡","≤":"≤","≥":"≥","⊂":"⊂","⊃":"⊃","⊄":"⊄","⊆":"⊆","⊇":"⊇","⊕":"⊕","⊗":"⊗","⊥":"⊥","⋅":"⋅","⌈":"⌈","⌉":"⌉","⌊":"⌊","⌋":"⌋","〈":"⟨","〉":"⟩","◊":"◊","♠":"♠","♣":"♣","♥":"♥","♦":"♦"}},html5:{entities:{"Æ":"Æ","Æ":"Æ","&":"&","&":"&","Á":"Á","Á":"Á","Ă":"Ă","Â":"Â","Â":"Â","А":"А","𝔄":"𝔄","À":"À","À":"À","Α":"Α","Ā":"Ā","⩓":"⩓","Ą":"Ą","𝔸":"𝔸","⁡":"⁡","Å":"Å","Å":"Å","𝒜":"𝒜","≔":"≔","Ã":"Ã","Ã":"Ã","Ä":"Ä","Ä":"Ä","∖":"∖","⫧":"⫧","⌆":"⌆","Б":"Б","∵":"∵","ℬ":"ℬ","Β":"Β","𝔅":"𝔅","𝔹":"𝔹","˘":"˘","ℬ":"ℬ","≎":"≎","Ч":"Ч","©":"©","©":"©","Ć":"Ć","⋒":"⋒","ⅅ":"ⅅ","ℭ":"ℭ","Č":"Č","Ç":"Ç","Ç":"Ç","Ĉ":"Ĉ","∰":"∰","Ċ":"Ċ","¸":"¸","·":"·","ℭ":"ℭ","Χ":"Χ","⊙":"⊙","⊖":"⊖","⊕":"⊕","⊗":"⊗","∲":"∲","”":"”","’":"’","∷":"∷","⩴":"⩴","≡":"≡","∯":"∯","∮":"∮","ℂ":"ℂ","∐":"∐","∳":"∳","⨯":"⨯","𝒞":"𝒞","⋓":"⋓","≍":"≍","ⅅ":"ⅅ","⤑":"⤑","Ђ":"Ђ","Ѕ":"Ѕ","Џ":"Џ","‡":"‡","↡":"↡","⫤":"⫤","Ď":"Ď","Д":"Д","∇":"∇","Δ":"Δ","𝔇":"𝔇","´":"´","˙":"˙","˝":"˝","`":"`","˜":"˜","⋄":"⋄","ⅆ":"ⅆ","𝔻":"𝔻","¨":"¨","⃜":"⃜","≐":"≐","∯":"∯","¨":"¨","⇓":"⇓","⇐":"⇐","⇔":"⇔","⫤":"⫤","⟸":"⟸","⟺":"⟺","⟹":"⟹","⇒":"⇒","⊨":"⊨","⇑":"⇑","⇕":"⇕","∥":"∥","↓":"↓","⤓":"⤓","⇵":"⇵","̑":"̑","⥐":"⥐","⥞":"⥞","↽":"↽","⥖":"⥖","⥟":"⥟","⇁":"⇁","⥗":"⥗","⊤":"⊤","↧":"↧","⇓":"⇓","𝒟":"𝒟","Đ":"Đ","Ŋ":"Ŋ","Ð":"Ð","Ð":"Ð","É":"É","É":"É","Ě":"Ě","Ê":"Ê","Ê":"Ê","Э":"Э","Ė":"Ė","𝔈":"𝔈","È":"È","È":"È","∈":"∈","Ē":"Ē","◻":"◻","▫":"▫","Ę":"Ę","𝔼":"𝔼","Ε":"Ε","⩵":"⩵","≂":"≂","⇌":"⇌","ℰ":"ℰ","⩳":"⩳","Η":"Η","Ë":"Ë","Ë":"Ë","∃":"∃","ⅇ":"ⅇ","Ф":"Ф","𝔉":"𝔉","◼":"◼","▪":"▪","𝔽":"𝔽","∀":"∀","ℱ":"ℱ","ℱ":"ℱ","Ѓ":"Ѓ",">":">",">":">","Γ":"Γ","Ϝ":"Ϝ","Ğ":"Ğ","Ģ":"Ģ","Ĝ":"Ĝ","Г":"Г","Ġ":"Ġ","𝔊":"𝔊","⋙":"⋙","𝔾":"𝔾","≥":"≥","⋛":"⋛","≧":"≧","⪢":"⪢","≷":"≷","⩾":"⩾","≳":"≳","𝒢":"𝒢","≫":"≫","Ъ":"Ъ","ˇ":"ˇ","^":"^","Ĥ":"Ĥ","ℌ":"ℌ","ℋ":"ℋ","ℍ":"ℍ","─":"─","ℋ":"ℋ","Ħ":"Ħ","≎":"≎","≏":"≏","Е":"Е","IJ":"IJ","Ё":"Ё","Í":"Í","Í":"Í","Î":"Î","Î":"Î","И":"И","İ":"İ","ℑ":"ℑ","Ì":"Ì","Ì":"Ì","ℑ":"ℑ","Ī":"Ī","ⅈ":"ⅈ","⇒":"⇒","∬":"∬","∫":"∫","⋂":"⋂","⁣":"⁣","⁢":"⁢","Į":"Į","𝕀":"𝕀","Ι":"Ι","ℐ":"ℐ","Ĩ":"Ĩ","І":"І","Ï":"Ï","Ï":"Ï","Ĵ":"Ĵ","Й":"Й","𝔍":"𝔍","𝕁":"𝕁","𝒥":"𝒥","Ј":"Ј","Є":"Є","Х":"Х","Ќ":"Ќ","Κ":"Κ","Ķ":"Ķ","К":"К","𝔎":"𝔎","𝕂":"𝕂","𝒦":"𝒦","Љ":"Љ","<":"<","<":"<","Ĺ":"Ĺ","Λ":"Λ","⟪":"⟪","ℒ":"ℒ","↞":"↞","Ľ":"Ľ","Ļ":"Ļ","Л":"Л","⟨":"⟨","←":"←","⇤":"⇤","⇆":"⇆","⌈":"⌈","⟦":"⟦","⥡":"⥡","⇃":"⇃","⥙":"⥙","⌊":"⌊","↔":"↔","⥎":"⥎","⊣":"⊣","↤":"↤","⥚":"⥚","⊲":"⊲","⧏":"⧏","⊴":"⊴","⥑":"⥑","⥠":"⥠","↿":"↿","⥘":"⥘","↼":"↼","⥒":"⥒","⇐":"⇐","⇔":"⇔","⋚":"⋚","≦":"≦","≶":"≶","⪡":"⪡","⩽":"⩽","≲":"≲","𝔏":"𝔏","⋘":"⋘","⇚":"⇚","Ŀ":"Ŀ","⟵":"⟵","⟷":"⟷","⟶":"⟶","⟸":"⟸","⟺":"⟺","⟹":"⟹","𝕃":"𝕃","↙":"↙","↘":"↘","ℒ":"ℒ","↰":"↰","Ł":"Ł","≪":"≪","⤅":"⤅","М":"М"," ":" ","ℳ":"ℳ","𝔐":"𝔐","∓":"∓","𝕄":"𝕄","ℳ":"ℳ","Μ":"Μ","Њ":"Њ","Ń":"Ń","Ň":"Ň","Ņ":"Ņ","Н":"Н","​":"​","​":"​","​":"​","​":"​","≫":"≫","≪":"≪"," ":"\n","𝔑":"𝔑","⁠":"⁠"," ":" ","ℕ":"ℕ","⫬":"⫬","≢":"≢","≭":"≭","∦":"∦","∉":"∉","≠":"≠","≂̸":"≂̸","∄":"∄","≯":"≯","≱":"≱","≧̸":"≧̸","≫̸":"≫̸","≹":"≹","⩾̸":"⩾̸","≵":"≵","≎̸":"≎̸","≏̸":"≏̸","⋪":"⋪","⧏̸":"⧏̸","⋬":"⋬","≮":"≮","≰":"≰","≸":"≸","≪̸":"≪̸","⩽̸":"⩽̸","≴":"≴","⪢̸":"⪢̸","⪡̸":"⪡̸","⊀":"⊀","⪯̸":"⪯̸","⋠":"⋠","∌":"∌","⋫":"⋫","⧐̸":"⧐̸","⋭":"⋭","⊏̸":"⊏̸","⋢":"⋢","⊐̸":"⊐̸","⋣":"⋣","⊂⃒":"⊂⃒","⊈":"⊈","⊁":"⊁","⪰̸":"⪰̸","⋡":"⋡","≿̸":"≿̸","⊃⃒":"⊃⃒","⊉":"⊉","≁":"≁","≄":"≄","≇":"≇","≉":"≉","∤":"∤","𝒩":"𝒩","Ñ":"Ñ","Ñ":"Ñ","Ν":"Ν","Œ":"Œ","Ó":"Ó","Ó":"Ó","Ô":"Ô","Ô":"Ô","О":"О","Ő":"Ő","𝔒":"𝔒","Ò":"Ò","Ò":"Ò","Ō":"Ō","Ω":"Ω","Ο":"Ο","𝕆":"𝕆","“":"“","‘":"‘","⩔":"⩔","𝒪":"𝒪","Ø":"Ø","Ø":"Ø","Õ":"Õ","Õ":"Õ","⨷":"⨷","Ö":"Ö","Ö":"Ö","‾":"‾","⏞":"⏞","⎴":"⎴","⏜":"⏜","∂":"∂","П":"П","𝔓":"𝔓","Φ":"Φ","Π":"Π","±":"±","ℌ":"ℌ","ℙ":"ℙ","⪻":"⪻","≺":"≺","⪯":"⪯","≼":"≼","≾":"≾","″":"″","∏":"∏","∷":"∷","∝":"∝","𝒫":"𝒫","Ψ":"Ψ",""":'"',""":'"',"𝔔":"𝔔","ℚ":"ℚ","𝒬":"𝒬","⤐":"⤐","®":"®","®":"®","Ŕ":"Ŕ","⟫":"⟫","↠":"↠","⤖":"⤖","Ř":"Ř","Ŗ":"Ŗ","Р":"Р","ℜ":"ℜ","∋":"∋","⇋":"⇋","⥯":"⥯","ℜ":"ℜ","Ρ":"Ρ","⟩":"⟩","→":"→","⇥":"⇥","⇄":"⇄","⌉":"⌉","⟧":"⟧","⥝":"⥝","⇂":"⇂","⥕":"⥕","⌋":"⌋","⊢":"⊢","↦":"↦","⥛":"⥛","⊳":"⊳","⧐":"⧐","⊵":"⊵","⥏":"⥏","⥜":"⥜","↾":"↾","⥔":"⥔","⇀":"⇀","⥓":"⥓","⇒":"⇒","ℝ":"ℝ","⥰":"⥰","⇛":"⇛","ℛ":"ℛ","↱":"↱","⧴":"⧴","Щ":"Щ","Ш":"Ш","Ь":"Ь","Ś":"Ś","⪼":"⪼","Š":"Š","Ş":"Ş","Ŝ":"Ŝ","С":"С","𝔖":"𝔖","↓":"↓","←":"←","→":"→","↑":"↑","Σ":"Σ","∘":"∘","𝕊":"𝕊","√":"√","□":"□","⊓":"⊓","⊏":"⊏","⊑":"⊑","⊐":"⊐","⊒":"⊒","⊔":"⊔","𝒮":"𝒮","⋆":"⋆","⋐":"⋐","⋐":"⋐","⊆":"⊆","≻":"≻","⪰":"⪰","≽":"≽","≿":"≿","∋":"∋","∑":"∑","⋑":"⋑","⊃":"⊃","⊇":"⊇","⋑":"⋑","Þ":"Þ","Þ":"Þ","™":"™","Ћ":"Ћ","Ц":"Ц"," ":"\t","Τ":"Τ","Ť":"Ť","Ţ":"Ţ","Т":"Т","𝔗":"𝔗","∴":"∴","Θ":"Θ","  ":"  "," ":" ","∼":"∼","≃":"≃","≅":"≅","≈":"≈","𝕋":"𝕋","⃛":"⃛","𝒯":"𝒯","Ŧ":"Ŧ","Ú":"Ú","Ú":"Ú","↟":"↟","⥉":"⥉","Ў":"Ў","Ŭ":"Ŭ","Û":"Û","Û":"Û","У":"У","Ű":"Ű","𝔘":"𝔘","Ù":"Ù","Ù":"Ù","Ū":"Ū","_":"_","⏟":"⏟","⎵":"⎵","⏝":"⏝","⋃":"⋃","⊎":"⊎","Ų":"Ų","𝕌":"𝕌","↑":"↑","⤒":"⤒","⇅":"⇅","↕":"↕","⥮":"⥮","⊥":"⊥","↥":"↥","⇑":"⇑","⇕":"⇕","↖":"↖","↗":"↗","ϒ":"ϒ","Υ":"Υ","Ů":"Ů","𝒰":"𝒰","Ũ":"Ũ","Ü":"Ü","Ü":"Ü","⊫":"⊫","⫫":"⫫","В":"В","⊩":"⊩","⫦":"⫦","⋁":"⋁","‖":"‖","‖":"‖","∣":"∣","|":"|","❘":"❘","≀":"≀"," ":" ","𝔙":"𝔙","𝕍":"𝕍","𝒱":"𝒱","⊪":"⊪","Ŵ":"Ŵ","⋀":"⋀","𝔚":"𝔚","𝕎":"𝕎","𝒲":"𝒲","𝔛":"𝔛","Ξ":"Ξ","𝕏":"𝕏","𝒳":"𝒳","Я":"Я","Ї":"Ї","Ю":"Ю","Ý":"Ý","Ý":"Ý","Ŷ":"Ŷ","Ы":"Ы","𝔜":"𝔜","𝕐":"𝕐","𝒴":"𝒴","Ÿ":"Ÿ","Ж":"Ж","Ź":"Ź","Ž":"Ž","З":"З","Ż":"Ż","​":"​","Ζ":"Ζ","ℨ":"ℨ","ℤ":"ℤ","𝒵":"𝒵","á":"á","á":"á","ă":"ă","∾":"∾","∾̳":"∾̳","∿":"∿","â":"â","â":"â","´":"´","´":"´","а":"а","æ":"æ","æ":"æ","⁡":"⁡","𝔞":"𝔞","à":"à","à":"à","ℵ":"ℵ","ℵ":"ℵ","α":"α","ā":"ā","⨿":"⨿","&":"&","&":"&","∧":"∧","⩕":"⩕","⩜":"⩜","⩘":"⩘","⩚":"⩚","∠":"∠","⦤":"⦤","∠":"∠","∡":"∡","⦨":"⦨","⦩":"⦩","⦪":"⦪","⦫":"⦫","⦬":"⦬","⦭":"⦭","⦮":"⦮","⦯":"⦯","∟":"∟","⊾":"⊾","⦝":"⦝","∢":"∢","Å":"Å","⍼":"⍼","ą":"ą","𝕒":"𝕒","≈":"≈","⩰":"⩰","⩯":"⩯","≊":"≊","≋":"≋","'":"'","≈":"≈","≊":"≊","å":"å","å":"å","𝒶":"𝒶","*":"*","≈":"≈","≍":"≍","ã":"ã","ã":"ã","ä":"ä","ä":"ä","∳":"∳","⨑":"⨑","⫭":"⫭","≌":"≌","϶":"϶","‵":"‵","∽":"∽","⋍":"⋍","⊽":"⊽","⌅":"⌅","⌅":"⌅","⎵":"⎵","⎶":"⎶","≌":"≌","б":"б","„":"„","∵":"∵","∵":"∵","⦰":"⦰","϶":"϶","ℬ":"ℬ","β":"β","ℶ":"ℶ","≬":"≬","𝔟":"𝔟","⋂":"⋂","◯":"◯","⋃":"⋃","⨀":"⨀","⨁":"⨁","⨂":"⨂","⨆":"⨆","★":"★","▽":"▽","△":"△","⨄":"⨄","⋁":"⋁","⋀":"⋀","⤍":"⤍","⧫":"⧫","▪":"▪","▴":"▴","▾":"▾","◂":"◂","▸":"▸","␣":"␣","▒":"▒","░":"░","▓":"▓","█":"█","=⃥":"=⃥","≡⃥":"≡⃥","⌐":"⌐","𝕓":"𝕓","⊥":"⊥","⊥":"⊥","⋈":"⋈","╗":"╗","╔":"╔","╖":"╖","╓":"╓","═":"═","╦":"╦","╩":"╩","╤":"╤","╧":"╧","╝":"╝","╚":"╚","╜":"╜","╙":"╙","║":"║","╬":"╬","╣":"╣","╠":"╠","╫":"╫","╢":"╢","╟":"╟","⧉":"⧉","╕":"╕","╒":"╒","┐":"┐","┌":"┌","─":"─","╥":"╥","╨":"╨","┬":"┬","┴":"┴","⊟":"⊟","⊞":"⊞","⊠":"⊠","╛":"╛","╘":"╘","┘":"┘","└":"└","│":"│","╪":"╪","╡":"╡","╞":"╞","┼":"┼","┤":"┤","├":"├","‵":"‵","˘":"˘","¦":"¦","¦":"¦","𝒷":"𝒷","⁏":"⁏","∽":"∽","⋍":"⋍","\":"\\","⧅":"⧅","⟈":"⟈","•":"•","•":"•","≎":"≎","⪮":"⪮","≏":"≏","≏":"≏","ć":"ć","∩":"∩","⩄":"⩄","⩉":"⩉","⩋":"⩋","⩇":"⩇","⩀":"⩀","∩︀":"∩︀","⁁":"⁁","ˇ":"ˇ","⩍":"⩍","č":"č","ç":"ç","ç":"ç","ĉ":"ĉ","⩌":"⩌","⩐":"⩐","ċ":"ċ","¸":"¸","¸":"¸","⦲":"⦲","¢":"¢","¢":"¢","·":"·","𝔠":"𝔠","ч":"ч","✓":"✓","✓":"✓","χ":"χ","○":"○","⧃":"⧃","ˆ":"ˆ","≗":"≗","↺":"↺","↻":"↻","®":"®","Ⓢ":"Ⓢ","⊛":"⊛","⊚":"⊚","⊝":"⊝","≗":"≗","⨐":"⨐","⫯":"⫯","⧂":"⧂","♣":"♣","♣":"♣",":":":","≔":"≔","≔":"≔",",":",","@":"@","∁":"∁","∘":"∘","∁":"∁","ℂ":"ℂ","≅":"≅","⩭":"⩭","∮":"∮","𝕔":"𝕔","∐":"∐","©":"©","©":"©","℗":"℗","↵":"↵","✗":"✗","𝒸":"𝒸","⫏":"⫏","⫑":"⫑","⫐":"⫐","⫒":"⫒","⋯":"⋯","⤸":"⤸","⤵":"⤵","⋞":"⋞","⋟":"⋟","↶":"↶","⤽":"⤽","∪":"∪","⩈":"⩈","⩆":"⩆","⩊":"⩊","⊍":"⊍","⩅":"⩅","∪︀":"∪︀","↷":"↷","⤼":"⤼","⋞":"⋞","⋟":"⋟","⋎":"⋎","⋏":"⋏","¤":"¤","¤":"¤","↶":"↶","↷":"↷","⋎":"⋎","⋏":"⋏","∲":"∲","∱":"∱","⌭":"⌭","⇓":"⇓","⥥":"⥥","†":"†","ℸ":"ℸ","↓":"↓","‐":"‐","⊣":"⊣","⤏":"⤏","˝":"˝","ď":"ď","д":"д","ⅆ":"ⅆ","‡":"‡","⇊":"⇊","⩷":"⩷","°":"°","°":"°","δ":"δ","⦱":"⦱","⥿":"⥿","𝔡":"𝔡","⇃":"⇃","⇂":"⇂","⋄":"⋄","⋄":"⋄","♦":"♦","♦":"♦","¨":"¨","ϝ":"ϝ","⋲":"⋲","÷":"÷","÷":"÷","÷":"÷","⋇":"⋇","⋇":"⋇","ђ":"ђ","⌞":"⌞","⌍":"⌍","$":"$","𝕕":"𝕕","˙":"˙","≐":"≐","≑":"≑","∸":"∸","∔":"∔","⊡":"⊡","⌆":"⌆","↓":"↓","⇊":"⇊","⇃":"⇃","⇂":"⇂","⤐":"⤐","⌟":"⌟","⌌":"⌌","𝒹":"𝒹","ѕ":"ѕ","⧶":"⧶","đ":"đ","⋱":"⋱","▿":"▿","▾":"▾","⇵":"⇵","⥯":"⥯","⦦":"⦦","џ":"џ","⟿":"⟿","⩷":"⩷","≑":"≑","é":"é","é":"é","⩮":"⩮","ě":"ě","≖":"≖","ê":"ê","ê":"ê","≕":"≕","э":"э","ė":"ė","ⅇ":"ⅇ","≒":"≒","𝔢":"𝔢","⪚":"⪚","è":"è","è":"è","⪖":"⪖","⪘":"⪘","⪙":"⪙","⏧":"⏧","ℓ":"ℓ","⪕":"⪕","⪗":"⪗","ē":"ē","∅":"∅","∅":"∅","∅":"∅"," ":" "," ":" "," ":" ","ŋ":"ŋ"," ":" ","ę":"ę","𝕖":"𝕖","⋕":"⋕","⧣":"⧣","⩱":"⩱","ε":"ε","ε":"ε","ϵ":"ϵ","≖":"≖","≕":"≕","≂":"≂","⪖":"⪖","⪕":"⪕","=":"=","≟":"≟","≡":"≡","⩸":"⩸","⧥":"⧥","≓":"≓","⥱":"⥱","ℯ":"ℯ","≐":"≐","≂":"≂","η":"η","ð":"ð","ð":"ð","ë":"ë","ë":"ë","€":"€","!":"!","∃":"∃","ℰ":"ℰ","ⅇ":"ⅇ","≒":"≒","ф":"ф","♀":"♀","ffi":"ffi","ff":"ff","ffl":"ffl","𝔣":"𝔣","fi":"fi","fj":"fj","♭":"♭","fl":"fl","▱":"▱","ƒ":"ƒ","𝕗":"𝕗","∀":"∀","⋔":"⋔","⫙":"⫙","⨍":"⨍","½":"½","½":"½","⅓":"⅓","¼":"¼","¼":"¼","⅕":"⅕","⅙":"⅙","⅛":"⅛","⅔":"⅔","⅖":"⅖","¾":"¾","¾":"¾","⅗":"⅗","⅜":"⅜","⅘":"⅘","⅚":"⅚","⅝":"⅝","⅞":"⅞","⁄":"⁄","⌢":"⌢","𝒻":"𝒻","≧":"≧","⪌":"⪌","ǵ":"ǵ","γ":"γ","ϝ":"ϝ","⪆":"⪆","ğ":"ğ","ĝ":"ĝ","г":"г","ġ":"ġ","≥":"≥","⋛":"⋛","≥":"≥","≧":"≧","⩾":"⩾","⩾":"⩾","⪩":"⪩","⪀":"⪀","⪂":"⪂","⪄":"⪄","⋛︀":"⋛︀","⪔":"⪔","𝔤":"𝔤","≫":"≫","⋙":"⋙","ℷ":"ℷ","ѓ":"ѓ","≷":"≷","⪒":"⪒","⪥":"⪥","⪤":"⪤","≩":"≩","⪊":"⪊","⪊":"⪊","⪈":"⪈","⪈":"⪈","≩":"≩","⋧":"⋧","𝕘":"𝕘","`":"`","ℊ":"ℊ","≳":"≳","⪎":"⪎","⪐":"⪐",">":">",">":">","⪧":"⪧","⩺":"⩺","⋗":"⋗","⦕":"⦕","⩼":"⩼","⪆":"⪆","⥸":"⥸","⋗":"⋗","⋛":"⋛","⪌":"⪌","≷":"≷","≳":"≳","≩︀":"≩︀","≩︀":"≩︀","⇔":"⇔"," ":" ","½":"½","ℋ":"ℋ","ъ":"ъ","↔":"↔","⥈":"⥈","↭":"↭","ℏ":"ℏ","ĥ":"ĥ","♥":"♥","♥":"♥","…":"…","⊹":"⊹","𝔥":"𝔥","⤥":"⤥","⤦":"⤦","⇿":"⇿","∻":"∻","↩":"↩","↪":"↪","𝕙":"𝕙","―":"―","𝒽":"𝒽","ℏ":"ℏ","ħ":"ħ","⁃":"⁃","‐":"‐","í":"í","í":"í","⁣":"⁣","î":"î","î":"î","и":"и","е":"е","¡":"¡","¡":"¡","⇔":"⇔","𝔦":"𝔦","ì":"ì","ì":"ì","ⅈ":"ⅈ","⨌":"⨌","∭":"∭","⧜":"⧜","℩":"℩","ij":"ij","ī":"ī","ℑ":"ℑ","ℐ":"ℐ","ℑ":"ℑ","ı":"ı","⊷":"⊷","Ƶ":"Ƶ","∈":"∈","℅":"℅","∞":"∞","⧝":"⧝","ı":"ı","∫":"∫","⊺":"⊺","ℤ":"ℤ","⊺":"⊺","⨗":"⨗","⨼":"⨼","ё":"ё","į":"į","𝕚":"𝕚","ι":"ι","⨼":"⨼","¿":"¿","¿":"¿","𝒾":"𝒾","∈":"∈","⋹":"⋹","⋵":"⋵","⋴":"⋴","⋳":"⋳","∈":"∈","⁢":"⁢","ĩ":"ĩ","і":"і","ï":"ï","ï":"ï","ĵ":"ĵ","й":"й","𝔧":"𝔧","ȷ":"ȷ","𝕛":"𝕛","𝒿":"𝒿","ј":"ј","є":"є","κ":"κ","ϰ":"ϰ","ķ":"ķ","к":"к","𝔨":"𝔨","ĸ":"ĸ","х":"х","ќ":"ќ","𝕜":"𝕜","𝓀":"𝓀","⇚":"⇚","⇐":"⇐","⤛":"⤛","⤎":"⤎","≦":"≦","⪋":"⪋","⥢":"⥢","ĺ":"ĺ","⦴":"⦴","ℒ":"ℒ","λ":"λ","⟨":"⟨","⦑":"⦑","⟨":"⟨","⪅":"⪅","«":"«","«":"«","←":"←","⇤":"⇤","⤟":"⤟","⤝":"⤝","↩":"↩","↫":"↫","⤹":"⤹","⥳":"⥳","↢":"↢","⪫":"⪫","⤙":"⤙","⪭":"⪭","⪭︀":"⪭︀","⤌":"⤌","❲":"❲","{":"{","[":"[","⦋":"⦋","⦏":"⦏","⦍":"⦍","ľ":"ľ","ļ":"ļ","⌈":"⌈","{":"{","л":"л","⤶":"⤶","“":"“","„":"„","⥧":"⥧","⥋":"⥋","↲":"↲","≤":"≤","←":"←","↢":"↢","↽":"↽","↼":"↼","⇇":"⇇","↔":"↔","⇆":"⇆","⇋":"⇋","↭":"↭","⋋":"⋋","⋚":"⋚","≤":"≤","≦":"≦","⩽":"⩽","⩽":"⩽","⪨":"⪨","⩿":"⩿","⪁":"⪁","⪃":"⪃","⋚︀":"⋚︀","⪓":"⪓","⪅":"⪅","⋖":"⋖","⋚":"⋚","⪋":"⪋","≶":"≶","≲":"≲","⥼":"⥼","⌊":"⌊","𝔩":"𝔩","≶":"≶","⪑":"⪑","↽":"↽","↼":"↼","⥪":"⥪","▄":"▄","љ":"љ","≪":"≪","⇇":"⇇","⌞":"⌞","⥫":"⥫","◺":"◺","ŀ":"ŀ","⎰":"⎰","⎰":"⎰","≨":"≨","⪉":"⪉","⪉":"⪉","⪇":"⪇","⪇":"⪇","≨":"≨","⋦":"⋦","⟬":"⟬","⇽":"⇽","⟦":"⟦","⟵":"⟵","⟷":"⟷","⟼":"⟼","⟶":"⟶","↫":"↫","↬":"↬","⦅":"⦅","𝕝":"𝕝","⨭":"⨭","⨴":"⨴","∗":"∗","_":"_","◊":"◊","◊":"◊","⧫":"⧫","(":"(","⦓":"⦓","⇆":"⇆","⌟":"⌟","⇋":"⇋","⥭":"⥭","‎":"‎","⊿":"⊿","‹":"‹","𝓁":"𝓁","↰":"↰","≲":"≲","⪍":"⪍","⪏":"⪏","[":"[","‘":"‘","‚":"‚","ł":"ł","<":"<","<":"<","⪦":"⪦","⩹":"⩹","⋖":"⋖","⋋":"⋋","⋉":"⋉","⥶":"⥶","⩻":"⩻","⦖":"⦖","◃":"◃","⊴":"⊴","◂":"◂","⥊":"⥊","⥦":"⥦","≨︀":"≨︀","≨︀":"≨︀","∺":"∺","¯":"¯","¯":"¯","♂":"♂","✠":"✠","✠":"✠","↦":"↦","↦":"↦","↧":"↧","↤":"↤","↥":"↥","▮":"▮","⨩":"⨩","м":"м","—":"—","∡":"∡","𝔪":"𝔪","℧":"℧","µ":"µ","µ":"µ","∣":"∣","*":"*","⫰":"⫰","·":"·","·":"·","−":"−","⊟":"⊟","∸":"∸","⨪":"⨪","⫛":"⫛","…":"…","∓":"∓","⊧":"⊧","𝕞":"𝕞","∓":"∓","𝓂":"𝓂","∾":"∾","μ":"μ","⊸":"⊸","⊸":"⊸","⋙̸":"⋙̸","≫⃒":"≫⃒","≫̸":"≫̸","⇍":"⇍","⇎":"⇎","⋘̸":"⋘̸","≪⃒":"≪⃒","≪̸":"≪̸","⇏":"⇏","⊯":"⊯","⊮":"⊮","∇":"∇","ń":"ń","∠⃒":"∠⃒","≉":"≉","⩰̸":"⩰̸","≋̸":"≋̸","ʼn":"ʼn","≉":"≉","♮":"♮","♮":"♮","ℕ":"ℕ"," ":" "," ":" ","≎̸":"≎̸","≏̸":"≏̸","⩃":"⩃","ň":"ň","ņ":"ņ","≇":"≇","⩭̸":"⩭̸","⩂":"⩂","н":"н","–":"–","≠":"≠","⇗":"⇗","⤤":"⤤","↗":"↗","↗":"↗","≐̸":"≐̸","≢":"≢","⤨":"⤨","≂̸":"≂̸","∄":"∄","∄":"∄","𝔫":"𝔫","≧̸":"≧̸","≱":"≱","≱":"≱","≧̸":"≧̸","⩾̸":"⩾̸","⩾̸":"⩾̸","≵":"≵","≯":"≯","≯":"≯","⇎":"⇎","↮":"↮","⫲":"⫲","∋":"∋","⋼":"⋼","⋺":"⋺","∋":"∋","њ":"њ","⇍":"⇍","≦̸":"≦̸","↚":"↚","‥":"‥","≰":"≰","↚":"↚","↮":"↮","≰":"≰","≦̸":"≦̸","⩽̸":"⩽̸","⩽̸":"⩽̸","≮":"≮","≴":"≴","≮":"≮","⋪":"⋪","⋬":"⋬","∤":"∤","𝕟":"𝕟","¬":"¬","¬":"¬","∉":"∉","⋹̸":"⋹̸","⋵̸":"⋵̸","∉":"∉","⋷":"⋷","⋶":"⋶","∌":"∌","∌":"∌","⋾":"⋾","⋽":"⋽","∦":"∦","∦":"∦","⫽⃥":"⫽⃥","∂̸":"∂̸","⨔":"⨔","⊀":"⊀","⋠":"⋠","⪯̸":"⪯̸","⊀":"⊀","⪯̸":"⪯̸","⇏":"⇏","↛":"↛","⤳̸":"⤳̸","↝̸":"↝̸","↛":"↛","⋫":"⋫","⋭":"⋭","⊁":"⊁","⋡":"⋡","⪰̸":"⪰̸","𝓃":"𝓃","∤":"∤","∦":"∦","≁":"≁","≄":"≄","≄":"≄","∤":"∤","∦":"∦","⋢":"⋢","⋣":"⋣","⊄":"⊄","⫅̸":"⫅̸","⊈":"⊈","⊂⃒":"⊂⃒","⊈":"⊈","⫅̸":"⫅̸","⊁":"⊁","⪰̸":"⪰̸","⊅":"⊅","⫆̸":"⫆̸","⊉":"⊉","⊃⃒":"⊃⃒","⊉":"⊉","⫆̸":"⫆̸","≹":"≹","ñ":"ñ","ñ":"ñ","≸":"≸","⋪":"⋪","⋬":"⋬","⋫":"⋫","⋭":"⋭","ν":"ν","#":"#","№":"№"," ":" ","⊭":"⊭","⤄":"⤄","≍⃒":"≍⃒","⊬":"⊬","≥⃒":"≥⃒",">⃒":">⃒","⧞":"⧞","⤂":"⤂","≤⃒":"≤⃒","<⃒":"<⃒","⊴⃒":"⊴⃒","⤃":"⤃","⊵⃒":"⊵⃒","∼⃒":"∼⃒","⇖":"⇖","⤣":"⤣","↖":"↖","↖":"↖","⤧":"⤧","Ⓢ":"Ⓢ","ó":"ó","ó":"ó","⊛":"⊛","⊚":"⊚","ô":"ô","ô":"ô","о":"о","⊝":"⊝","ő":"ő","⨸":"⨸","⊙":"⊙","⦼":"⦼","œ":"œ","⦿":"⦿","𝔬":"𝔬","˛":"˛","ò":"ò","ò":"ò","⧁":"⧁","⦵":"⦵","Ω":"Ω","∮":"∮","↺":"↺","⦾":"⦾","⦻":"⦻","‾":"‾","⧀":"⧀","ō":"ō","ω":"ω","ο":"ο","⦶":"⦶","⊖":"⊖","𝕠":"𝕠","⦷":"⦷","⦹":"⦹","⊕":"⊕","∨":"∨","↻":"↻","⩝":"⩝","ℴ":"ℴ","ℴ":"ℴ","ª":"ª","ª":"ª","º":"º","º":"º","⊶":"⊶","⩖":"⩖","⩗":"⩗","⩛":"⩛","ℴ":"ℴ","ø":"ø","ø":"ø","⊘":"⊘","õ":"õ","õ":"õ","⊗":"⊗","⨶":"⨶","ö":"ö","ö":"ö","⌽":"⌽","∥":"∥","¶":"¶","¶":"¶","∥":"∥","⫳":"⫳","⫽":"⫽","∂":"∂","п":"п","%":"%",".":".","‰":"‰","⊥":"⊥","‱":"‱","𝔭":"𝔭","φ":"φ","ϕ":"ϕ","ℳ":"ℳ","☎":"☎","π":"π","⋔":"⋔","ϖ":"ϖ","ℏ":"ℏ","ℎ":"ℎ","ℏ":"ℏ","+":"+","⨣":"⨣","⊞":"⊞","⨢":"⨢","∔":"∔","⨥":"⨥","⩲":"⩲","±":"±","±":"±","⨦":"⨦","⨧":"⨧","±":"±","⨕":"⨕","𝕡":"𝕡","£":"£","£":"£","≺":"≺","⪳":"⪳","⪷":"⪷","≼":"≼","⪯":"⪯","≺":"≺","⪷":"⪷","≼":"≼","⪯":"⪯","⪹":"⪹","⪵":"⪵","⋨":"⋨","≾":"≾","′":"′","ℙ":"ℙ","⪵":"⪵","⪹":"⪹","⋨":"⋨","∏":"∏","⌮":"⌮","⌒":"⌒","⌓":"⌓","∝":"∝","∝":"∝","≾":"≾","⊰":"⊰","𝓅":"𝓅","ψ":"ψ"," ":" ","𝔮":"𝔮","⨌":"⨌","𝕢":"𝕢","⁗":"⁗","𝓆":"𝓆","ℍ":"ℍ","⨖":"⨖","?":"?","≟":"≟",""":'"',""":'"',"⇛":"⇛","⇒":"⇒","⤜":"⤜","⤏":"⤏","⥤":"⥤","∽̱":"∽̱","ŕ":"ŕ","√":"√","⦳":"⦳","⟩":"⟩","⦒":"⦒","⦥":"⦥","⟩":"⟩","»":"»","»":"»","→":"→","⥵":"⥵","⇥":"⇥","⤠":"⤠","⤳":"⤳","⤞":"⤞","↪":"↪","↬":"↬","⥅":"⥅","⥴":"⥴","↣":"↣","↝":"↝","⤚":"⤚","∶":"∶","ℚ":"ℚ","⤍":"⤍","❳":"❳","}":"}","]":"]","⦌":"⦌","⦎":"⦎","⦐":"⦐","ř":"ř","ŗ":"ŗ","⌉":"⌉","}":"}","р":"р","⤷":"⤷","⥩":"⥩","”":"”","”":"”","↳":"↳","ℜ":"ℜ","ℛ":"ℛ","ℜ":"ℜ","ℝ":"ℝ","▭":"▭","®":"®","®":"®","⥽":"⥽","⌋":"⌋","𝔯":"𝔯","⇁":"⇁","⇀":"⇀","⥬":"⥬","ρ":"ρ","ϱ":"ϱ","→":"→","↣":"↣","⇁":"⇁","⇀":"⇀","⇄":"⇄","⇌":"⇌","⇉":"⇉","↝":"↝","⋌":"⋌","˚":"˚","≓":"≓","⇄":"⇄","⇌":"⇌","‏":"‏","⎱":"⎱","⎱":"⎱","⫮":"⫮","⟭":"⟭","⇾":"⇾","⟧":"⟧","⦆":"⦆","𝕣":"𝕣","⨮":"⨮","⨵":"⨵",")":")","⦔":"⦔","⨒":"⨒","⇉":"⇉","›":"›","𝓇":"𝓇","↱":"↱","]":"]","’":"’","’":"’","⋌":"⋌","⋊":"⋊","▹":"▹","⊵":"⊵","▸":"▸","⧎":"⧎","⥨":"⥨","℞":"℞","ś":"ś","‚":"‚","≻":"≻","⪴":"⪴","⪸":"⪸","š":"š","≽":"≽","⪰":"⪰","ş":"ş","ŝ":"ŝ","⪶":"⪶","⪺":"⪺","⋩":"⋩","⨓":"⨓","≿":"≿","с":"с","⋅":"⋅","⊡":"⊡","⩦":"⩦","⇘":"⇘","⤥":"⤥","↘":"↘","↘":"↘","§":"§","§":"§",";":";","⤩":"⤩","∖":"∖","∖":"∖","✶":"✶","𝔰":"𝔰","⌢":"⌢","♯":"♯","щ":"щ","ш":"ш","∣":"∣","∥":"∥","­":"­","­":"­","σ":"σ","ς":"ς","ς":"ς","∼":"∼","⩪":"⩪","≃":"≃","≃":"≃","⪞":"⪞","⪠":"⪠","⪝":"⪝","⪟":"⪟","≆":"≆","⨤":"⨤","⥲":"⥲","←":"←","∖":"∖","⨳":"⨳","⧤":"⧤","∣":"∣","⌣":"⌣","⪪":"⪪","⪬":"⪬","⪬︀":"⪬︀","ь":"ь","/":"/","⧄":"⧄","⌿":"⌿","𝕤":"𝕤","♠":"♠","♠":"♠","∥":"∥","⊓":"⊓","⊓︀":"⊓︀","⊔":"⊔","⊔︀":"⊔︀","⊏":"⊏","⊑":"⊑","⊏":"⊏","⊑":"⊑","⊐":"⊐","⊒":"⊒","⊐":"⊐","⊒":"⊒","□":"□","□":"□","▪":"▪","▪":"▪","→":"→","𝓈":"𝓈","∖":"∖","⌣":"⌣","⋆":"⋆","☆":"☆","★":"★","ϵ":"ϵ","ϕ":"ϕ","¯":"¯","⊂":"⊂","⫅":"⫅","⪽":"⪽","⊆":"⊆","⫃":"⫃","⫁":"⫁","⫋":"⫋","⊊":"⊊","⪿":"⪿","⥹":"⥹","⊂":"⊂","⊆":"⊆","⫅":"⫅","⊊":"⊊","⫋":"⫋","⫇":"⫇","⫕":"⫕","⫓":"⫓","≻":"≻","⪸":"⪸","≽":"≽","⪰":"⪰","⪺":"⪺","⪶":"⪶","⋩":"⋩","≿":"≿","∑":"∑","♪":"♪","¹":"¹","¹":"¹","²":"²","²":"²","³":"³","³":"³","⊃":"⊃","⫆":"⫆","⪾":"⪾","⫘":"⫘","⊇":"⊇","⫄":"⫄","⟉":"⟉","⫗":"⫗","⥻":"⥻","⫂":"⫂","⫌":"⫌","⊋":"⊋","⫀":"⫀","⊃":"⊃","⊇":"⊇","⫆":"⫆","⊋":"⊋","⫌":"⫌","⫈":"⫈","⫔":"⫔","⫖":"⫖","⇙":"⇙","⤦":"⤦","↙":"↙","↙":"↙","⤪":"⤪","ß":"ß","ß":"ß","⌖":"⌖","τ":"τ","⎴":"⎴","ť":"ť","ţ":"ţ","т":"т","⃛":"⃛","⌕":"⌕","𝔱":"𝔱","∴":"∴","∴":"∴","θ":"θ","ϑ":"ϑ","ϑ":"ϑ","≈":"≈","∼":"∼"," ":" ","≈":"≈","∼":"∼","þ":"þ","þ":"þ","˜":"˜","×":"×","×":"×","⊠":"⊠","⨱":"⨱","⨰":"⨰","∭":"∭","⤨":"⤨","⊤":"⊤","⌶":"⌶","⫱":"⫱","𝕥":"𝕥","⫚":"⫚","⤩":"⤩","‴":"‴","™":"™","▵":"▵","▿":"▿","◃":"◃","⊴":"⊴","≜":"≜","▹":"▹","⊵":"⊵","◬":"◬","≜":"≜","⨺":"⨺","⨹":"⨹","⧍":"⧍","⨻":"⨻","⏢":"⏢","𝓉":"𝓉","ц":"ц","ћ":"ћ","ŧ":"ŧ","≬":"≬","↞":"↞","↠":"↠","⇑":"⇑","⥣":"⥣","ú":"ú","ú":"ú","↑":"↑","ў":"ў","ŭ":"ŭ","û":"û","û":"û","у":"у","⇅":"⇅","ű":"ű","⥮":"⥮","⥾":"⥾","𝔲":"𝔲","ù":"ù","ù":"ù","↿":"↿","↾":"↾","▀":"▀","⌜":"⌜","⌜":"⌜","⌏":"⌏","◸":"◸","ū":"ū","¨":"¨","¨":"¨","ų":"ų","𝕦":"𝕦","↑":"↑","↕":"↕","↿":"↿","↾":"↾","⊎":"⊎","υ":"υ","ϒ":"ϒ","υ":"υ","⇈":"⇈","⌝":"⌝","⌝":"⌝","⌎":"⌎","ů":"ů","◹":"◹","𝓊":"𝓊","⋰":"⋰","ũ":"ũ","▵":"▵","▴":"▴","⇈":"⇈","ü":"ü","ü":"ü","⦧":"⦧","⇕":"⇕","⫨":"⫨","⫩":"⫩","⊨":"⊨","⦜":"⦜","ϵ":"ϵ","ϰ":"ϰ","∅":"∅","ϕ":"ϕ","ϖ":"ϖ","∝":"∝","↕":"↕","ϱ":"ϱ","ς":"ς","⊊︀":"⊊︀","⫋︀":"⫋︀","⊋︀":"⊋︀","⫌︀":"⫌︀","ϑ":"ϑ","⊲":"⊲","⊳":"⊳","в":"в","⊢":"⊢","∨":"∨","⊻":"⊻","≚":"≚","⋮":"⋮","|":"|","|":"|","𝔳":"𝔳","⊲":"⊲","⊂⃒":"⊂⃒","⊃⃒":"⊃⃒","𝕧":"𝕧","∝":"∝","⊳":"⊳","𝓋":"𝓋","⫋︀":"⫋︀","⊊︀":"⊊︀","⫌︀":"⫌︀","⊋︀":"⊋︀","⦚":"⦚","ŵ":"ŵ","⩟":"⩟","∧":"∧","≙":"≙","℘":"℘","𝔴":"𝔴","𝕨":"𝕨","℘":"℘","≀":"≀","≀":"≀","𝓌":"𝓌","⋂":"⋂","◯":"◯","⋃":"⋃","▽":"▽","𝔵":"𝔵","⟺":"⟺","⟷":"⟷","ξ":"ξ","⟸":"⟸","⟵":"⟵","⟼":"⟼","⋻":"⋻","⨀":"⨀","𝕩":"𝕩","⨁":"⨁","⨂":"⨂","⟹":"⟹","⟶":"⟶","𝓍":"𝓍","⨆":"⨆","⨄":"⨄","△":"△","⋁":"⋁","⋀":"⋀","ý":"ý","ý":"ý","я":"я","ŷ":"ŷ","ы":"ы","¥":"¥","¥":"¥","𝔶":"𝔶","ї":"ї","𝕪":"𝕪","𝓎":"𝓎","ю":"ю","ÿ":"ÿ","ÿ":"ÿ","ź":"ź","ž":"ž","з":"з","ż":"ż","ℨ":"ℨ","ζ":"ζ","𝔷":"𝔷","ж":"ж","⇝":"⇝","𝕫":"𝕫","𝓏":"𝓏","‍":"‍","‌":"‌"},characters:{"Æ":"Æ","&":"&","Á":"Á","Ă":"Ă","Â":"Â","А":"А","𝔄":"𝔄","À":"À","Α":"Α","Ā":"Ā","⩓":"⩓","Ą":"Ą","𝔸":"𝔸","⁡":"⁡","Å":"Å","𝒜":"𝒜","≔":"≔","Ã":"Ã","Ä":"Ä","∖":"∖","⫧":"⫧","⌆":"⌆","Б":"Б","∵":"∵","ℬ":"ℬ","Β":"Β","𝔅":"𝔅","𝔹":"𝔹","˘":"˘","≎":"≎","Ч":"Ч","©":"©","Ć":"Ć","⋒":"⋒","ⅅ":"ⅅ","ℭ":"ℭ","Č":"Č","Ç":"Ç","Ĉ":"Ĉ","∰":"∰","Ċ":"Ċ","¸":"¸","·":"·","Χ":"Χ","⊙":"⊙","⊖":"⊖","⊕":"⊕","⊗":"⊗","∲":"∲","”":"”","’":"’","∷":"∷","⩴":"⩴","≡":"≡","∯":"∯","∮":"∮","ℂ":"ℂ","∐":"∐","∳":"∳","⨯":"⨯","𝒞":"𝒞","⋓":"⋓","≍":"≍","⤑":"⤑","Ђ":"Ђ","Ѕ":"Ѕ","Џ":"Џ","‡":"‡","↡":"↡","⫤":"⫤","Ď":"Ď","Д":"Д","∇":"∇","Δ":"Δ","𝔇":"𝔇","´":"´","˙":"˙","˝":"˝","`":"`","˜":"˜","⋄":"⋄","ⅆ":"ⅆ","𝔻":"𝔻","¨":"¨","⃜":"⃜","≐":"≐","⇓":"⇓","⇐":"⇐","⇔":"⇔","⟸":"⟸","⟺":"⟺","⟹":"⟹","⇒":"⇒","⊨":"⊨","⇑":"⇑","⇕":"⇕","∥":"∥","↓":"↓","⤓":"⤓","⇵":"⇵","̑":"̑","⥐":"⥐","⥞":"⥞","↽":"↽","⥖":"⥖","⥟":"⥟","⇁":"⇁","⥗":"⥗","⊤":"⊤","↧":"↧","𝒟":"𝒟","Đ":"Đ","Ŋ":"Ŋ","Ð":"Ð","É":"É","Ě":"Ě","Ê":"Ê","Э":"Э","Ė":"Ė","𝔈":"𝔈","È":"È","∈":"∈","Ē":"Ē","◻":"◻","▫":"▫","Ę":"Ę","𝔼":"𝔼","Ε":"Ε","⩵":"⩵","≂":"≂","⇌":"⇌","ℰ":"ℰ","⩳":"⩳","Η":"Η","Ë":"Ë","∃":"∃","ⅇ":"ⅇ","Ф":"Ф","𝔉":"𝔉","◼":"◼","▪":"▪","𝔽":"𝔽","∀":"∀","ℱ":"ℱ","Ѓ":"Ѓ",">":">","Γ":"Γ","Ϝ":"Ϝ","Ğ":"Ğ","Ģ":"Ģ","Ĝ":"Ĝ","Г":"Г","Ġ":"Ġ","𝔊":"𝔊","⋙":"⋙","𝔾":"𝔾","≥":"≥","⋛":"⋛","≧":"≧","⪢":"⪢","≷":"≷","⩾":"⩾","≳":"≳","𝒢":"𝒢","≫":"≫","Ъ":"Ъ","ˇ":"ˇ","^":"^","Ĥ":"Ĥ","ℌ":"ℌ","ℋ":"ℋ","ℍ":"ℍ","─":"─","Ħ":"Ħ","≏":"≏","Е":"Е","IJ":"IJ","Ё":"Ё","Í":"Í","Î":"Î","И":"И","İ":"İ","ℑ":"ℑ","Ì":"Ì","Ī":"Ī","ⅈ":"ⅈ","∬":"∬","∫":"∫","⋂":"⋂","⁣":"⁣","⁢":"⁢","Į":"Į","𝕀":"𝕀","Ι":"Ι","ℐ":"ℐ","Ĩ":"Ĩ","І":"І","Ï":"Ï","Ĵ":"Ĵ","Й":"Й","𝔍":"𝔍","𝕁":"𝕁","𝒥":"𝒥","Ј":"Ј","Є":"Є","Х":"Х","Ќ":"Ќ","Κ":"Κ","Ķ":"Ķ","К":"К","𝔎":"𝔎","𝕂":"𝕂","𝒦":"𝒦","Љ":"Љ","<":"<","Ĺ":"Ĺ","Λ":"Λ","⟪":"⟪","ℒ":"ℒ","↞":"↞","Ľ":"Ľ","Ļ":"Ļ","Л":"Л","⟨":"⟨","←":"←","⇤":"⇤","⇆":"⇆","⌈":"⌈","⟦":"⟦","⥡":"⥡","⇃":"⇃","⥙":"⥙","⌊":"⌊","↔":"↔","⥎":"⥎","⊣":"⊣","↤":"↤","⥚":"⥚","⊲":"⊲","⧏":"⧏","⊴":"⊴","⥑":"⥑","⥠":"⥠","↿":"↿","⥘":"⥘","↼":"↼","⥒":"⥒","⋚":"⋚","≦":"≦","≶":"≶","⪡":"⪡","⩽":"⩽","≲":"≲","𝔏":"𝔏","⋘":"⋘","⇚":"⇚","Ŀ":"Ŀ","⟵":"⟵","⟷":"⟷","⟶":"⟶","𝕃":"𝕃","↙":"↙","↘":"↘","↰":"↰","Ł":"Ł","≪":"≪","⤅":"⤅","М":"М"," ":" ","ℳ":"ℳ","𝔐":"𝔐","∓":"∓","𝕄":"𝕄","Μ":"Μ","Њ":"Њ","Ń":"Ń","Ň":"Ň","Ņ":"Ņ","Н":"Н","​":"​","\n":" ","𝔑":"𝔑","⁠":"⁠"," ":" ","ℕ":"ℕ","⫬":"⫬","≢":"≢","≭":"≭","∦":"∦","∉":"∉","≠":"≠","≂̸":"≂̸","∄":"∄","≯":"≯","≱":"≱","≧̸":"≧̸","≫̸":"≫̸","≹":"≹","⩾̸":"⩾̸","≵":"≵","≎̸":"≎̸","≏̸":"≏̸","⋪":"⋪","⧏̸":"⧏̸","⋬":"⋬","≮":"≮","≰":"≰","≸":"≸","≪̸":"≪̸","⩽̸":"⩽̸","≴":"≴","⪢̸":"⪢̸","⪡̸":"⪡̸","⊀":"⊀","⪯̸":"⪯̸","⋠":"⋠","∌":"∌","⋫":"⋫","⧐̸":"⧐̸","⋭":"⋭","⊏̸":"⊏̸","⋢":"⋢","⊐̸":"⊐̸","⋣":"⋣","⊂⃒":"⊂⃒","⊈":"⊈","⊁":"⊁","⪰̸":"⪰̸","⋡":"⋡","≿̸":"≿̸","⊃⃒":"⊃⃒","⊉":"⊉","≁":"≁","≄":"≄","≇":"≇","≉":"≉","∤":"∤","𝒩":"𝒩","Ñ":"Ñ","Ν":"Ν","Œ":"Œ","Ó":"Ó","Ô":"Ô","О":"О","Ő":"Ő","𝔒":"𝔒","Ò":"Ò","Ō":"Ō","Ω":"Ω","Ο":"Ο","𝕆":"𝕆","“":"“","‘":"‘","⩔":"⩔","𝒪":"𝒪","Ø":"Ø","Õ":"Õ","⨷":"⨷","Ö":"Ö","‾":"‾","⏞":"⏞","⎴":"⎴","⏜":"⏜","∂":"∂","П":"П","𝔓":"𝔓","Φ":"Φ","Π":"Π","±":"±","ℙ":"ℙ","⪻":"⪻","≺":"≺","⪯":"⪯","≼":"≼","≾":"≾","″":"″","∏":"∏","∝":"∝","𝒫":"𝒫","Ψ":"Ψ",'"':""","𝔔":"𝔔","ℚ":"ℚ","𝒬":"𝒬","⤐":"⤐","®":"®","Ŕ":"Ŕ","⟫":"⟫","↠":"↠","⤖":"⤖","Ř":"Ř","Ŗ":"Ŗ","Р":"Р","ℜ":"ℜ","∋":"∋","⇋":"⇋","⥯":"⥯","Ρ":"Ρ","⟩":"⟩","→":"→","⇥":"⇥","⇄":"⇄","⌉":"⌉","⟧":"⟧","⥝":"⥝","⇂":"⇂","⥕":"⥕","⌋":"⌋","⊢":"⊢","↦":"↦","⥛":"⥛","⊳":"⊳","⧐":"⧐","⊵":"⊵","⥏":"⥏","⥜":"⥜","↾":"↾","⥔":"⥔","⇀":"⇀","⥓":"⥓","ℝ":"ℝ","⥰":"⥰","⇛":"⇛","ℛ":"ℛ","↱":"↱","⧴":"⧴","Щ":"Щ","Ш":"Ш","Ь":"Ь","Ś":"Ś","⪼":"⪼","Š":"Š","Ş":"Ş","Ŝ":"Ŝ","С":"С","𝔖":"𝔖","↑":"↑","Σ":"Σ","∘":"∘","𝕊":"𝕊","√":"√","□":"□","⊓":"⊓","⊏":"⊏","⊑":"⊑","⊐":"⊐","⊒":"⊒","⊔":"⊔","𝒮":"𝒮","⋆":"⋆","⋐":"⋐","⊆":"⊆","≻":"≻","⪰":"⪰","≽":"≽","≿":"≿","∑":"∑","⋑":"⋑","⊃":"⊃","⊇":"⊇","Þ":"Þ","™":"™","Ћ":"Ћ","Ц":"Ц","\t":" ","Τ":"Τ","Ť":"Ť","Ţ":"Ţ","Т":"Т","𝔗":"𝔗","∴":"∴","Θ":"Θ","  ":"  "," ":" ","∼":"∼","≃":"≃","≅":"≅","≈":"≈","𝕋":"𝕋","⃛":"⃛","𝒯":"𝒯","Ŧ":"Ŧ","Ú":"Ú","↟":"↟","⥉":"⥉","Ў":"Ў","Ŭ":"Ŭ","Û":"Û","У":"У","Ű":"Ű","𝔘":"𝔘","Ù":"Ù","Ū":"Ū",_:"_","⏟":"⏟","⎵":"⎵","⏝":"⏝","⋃":"⋃","⊎":"⊎","Ų":"Ų","𝕌":"𝕌","⤒":"⤒","⇅":"⇅","↕":"↕","⥮":"⥮","⊥":"⊥","↥":"↥","↖":"↖","↗":"↗","ϒ":"ϒ","Υ":"Υ","Ů":"Ů","𝒰":"𝒰","Ũ":"Ũ","Ü":"Ü","⊫":"⊫","⫫":"⫫","В":"В","⊩":"⊩","⫦":"⫦","⋁":"⋁","‖":"‖","∣":"∣","|":"|","❘":"❘","≀":"≀"," ":" ","𝔙":"𝔙","𝕍":"𝕍","𝒱":"𝒱","⊪":"⊪","Ŵ":"Ŵ","⋀":"⋀","𝔚":"𝔚","𝕎":"𝕎","𝒲":"𝒲","𝔛":"𝔛","Ξ":"Ξ","𝕏":"𝕏","𝒳":"𝒳","Я":"Я","Ї":"Ї","Ю":"Ю","Ý":"Ý","Ŷ":"Ŷ","Ы":"Ы","𝔜":"𝔜","𝕐":"𝕐","𝒴":"𝒴","Ÿ":"Ÿ","Ж":"Ж","Ź":"Ź","Ž":"Ž","З":"З","Ż":"Ż","Ζ":"Ζ","ℨ":"ℨ","ℤ":"ℤ","𝒵":"𝒵","á":"á","ă":"ă","∾":"∾","∾̳":"∾̳","∿":"∿","â":"â","а":"а","æ":"æ","𝔞":"𝔞","à":"à","ℵ":"ℵ","α":"α","ā":"ā","⨿":"⨿","∧":"∧","⩕":"⩕","⩜":"⩜","⩘":"⩘","⩚":"⩚","∠":"∠","⦤":"⦤","∡":"∡","⦨":"⦨","⦩":"⦩","⦪":"⦪","⦫":"⦫","⦬":"⦬","⦭":"⦭","⦮":"⦮","⦯":"⦯","∟":"∟","⊾":"⊾","⦝":"⦝","∢":"∢","⍼":"⍼","ą":"ą","𝕒":"𝕒","⩰":"⩰","⩯":"⩯","≊":"≊","≋":"≋","'":"'","å":"å","𝒶":"𝒶","*":"*","ã":"ã","ä":"ä","⨑":"⨑","⫭":"⫭","≌":"≌","϶":"϶","‵":"‵","∽":"∽","⋍":"⋍","⊽":"⊽","⌅":"⌅","⎶":"⎶","б":"б","„":"„","⦰":"⦰","β":"β","ℶ":"ℶ","≬":"≬","𝔟":"𝔟","◯":"◯","⨀":"⨀","⨁":"⨁","⨂":"⨂","⨆":"⨆","★":"★","▽":"▽","△":"△","⨄":"⨄","⤍":"⤍","⧫":"⧫","▴":"▴","▾":"▾","◂":"◂","▸":"▸","␣":"␣","▒":"▒","░":"░","▓":"▓","█":"█","=⃥":"=⃥","≡⃥":"≡⃥","⌐":"⌐","𝕓":"𝕓","⋈":"⋈","╗":"╗","╔":"╔","╖":"╖","╓":"╓","═":"═","╦":"╦","╩":"╩","╤":"╤","╧":"╧","╝":"╝","╚":"╚","╜":"╜","╙":"╙","║":"║","╬":"╬","╣":"╣","╠":"╠","╫":"╫","╢":"╢","╟":"╟","⧉":"⧉","╕":"╕","╒":"╒","┐":"┐","┌":"┌","╥":"╥","╨":"╨","┬":"┬","┴":"┴","⊟":"⊟","⊞":"⊞","⊠":"⊠","╛":"╛","╘":"╘","┘":"┘","└":"└","│":"│","╪":"╪","╡":"╡","╞":"╞","┼":"┼","┤":"┤","├":"├","¦":"¦","𝒷":"𝒷","⁏":"⁏","\\":"\","⧅":"⧅","⟈":"⟈","•":"•","⪮":"⪮","ć":"ć","∩":"∩","⩄":"⩄","⩉":"⩉","⩋":"⩋","⩇":"⩇","⩀":"⩀","∩︀":"∩︀","⁁":"⁁","⩍":"⩍","č":"č","ç":"ç","ĉ":"ĉ","⩌":"⩌","⩐":"⩐","ċ":"ċ","⦲":"⦲","¢":"¢","𝔠":"𝔠","ч":"ч","✓":"✓","χ":"χ","○":"○","⧃":"⧃","ˆ":"ˆ","≗":"≗","↺":"↺","↻":"↻","Ⓢ":"Ⓢ","⊛":"⊛","⊚":"⊚","⊝":"⊝","⨐":"⨐","⫯":"⫯","⧂":"⧂","♣":"♣",":":":",",":",","@":"@","∁":"∁","⩭":"⩭","𝕔":"𝕔","℗":"℗","↵":"↵","✗":"✗","𝒸":"𝒸","⫏":"⫏","⫑":"⫑","⫐":"⫐","⫒":"⫒","⋯":"⋯","⤸":"⤸","⤵":"⤵","⋞":"⋞","⋟":"⋟","↶":"↶","⤽":"⤽","∪":"∪","⩈":"⩈","⩆":"⩆","⩊":"⩊","⊍":"⊍","⩅":"⩅","∪︀":"∪︀","↷":"↷","⤼":"⤼","⋎":"⋎","⋏":"⋏","¤":"¤","∱":"∱","⌭":"⌭","⥥":"⥥","†":"†","ℸ":"ℸ","‐":"‐","⤏":"⤏","ď":"ď","д":"д","⇊":"⇊","⩷":"⩷","°":"°","δ":"δ","⦱":"⦱","⥿":"⥿","𝔡":"𝔡","♦":"♦","ϝ":"ϝ","⋲":"⋲","÷":"÷","⋇":"⋇","ђ":"ђ","⌞":"⌞","⌍":"⌍",$:"$","𝕕":"𝕕","≑":"≑","∸":"∸","∔":"∔","⊡":"⊡","⌟":"⌟","⌌":"⌌","𝒹":"𝒹","ѕ":"ѕ","⧶":"⧶","đ":"đ","⋱":"⋱","▿":"▿","⦦":"⦦","џ":"џ","⟿":"⟿","é":"é","⩮":"⩮","ě":"ě","≖":"≖","ê":"ê","≕":"≕","э":"э","ė":"ė","≒":"≒","𝔢":"𝔢","⪚":"⪚","è":"è","⪖":"⪖","⪘":"⪘","⪙":"⪙","⏧":"⏧","ℓ":"ℓ","⪕":"⪕","⪗":"⪗","ē":"ē","∅":"∅"," ":" "," ":" "," ":" ","ŋ":"ŋ"," ":" ","ę":"ę","𝕖":"𝕖","⋕":"⋕","⧣":"⧣","⩱":"⩱","ε":"ε","ϵ":"ϵ","=":"=","≟":"≟","⩸":"⩸","⧥":"⧥","≓":"≓","⥱":"⥱","ℯ":"ℯ","η":"η","ð":"ð","ë":"ë","€":"€","!":"!","ф":"ф","♀":"♀","ffi":"ffi","ff":"ff","ffl":"ffl","𝔣":"𝔣","fi":"fi",fj:"fj","♭":"♭","fl":"fl","▱":"▱","ƒ":"ƒ","𝕗":"𝕗","⋔":"⋔","⫙":"⫙","⨍":"⨍","½":"½","⅓":"⅓","¼":"¼","⅕":"⅕","⅙":"⅙","⅛":"⅛","⅔":"⅔","⅖":"⅖","¾":"¾","⅗":"⅗","⅜":"⅜","⅘":"⅘","⅚":"⅚","⅝":"⅝","⅞":"⅞","⁄":"⁄","⌢":"⌢","𝒻":"𝒻","⪌":"⪌","ǵ":"ǵ","γ":"γ","⪆":"⪆","ğ":"ğ","ĝ":"ĝ","г":"г","ġ":"ġ","⪩":"⪩","⪀":"⪀","⪂":"⪂","⪄":"⪄","⋛︀":"⋛︀","⪔":"⪔","𝔤":"𝔤","ℷ":"ℷ","ѓ":"ѓ","⪒":"⪒","⪥":"⪥","⪤":"⪤","≩":"≩","⪊":"⪊","⪈":"⪈","⋧":"⋧","𝕘":"𝕘","ℊ":"ℊ","⪎":"⪎","⪐":"⪐","⪧":"⪧","⩺":"⩺","⋗":"⋗","⦕":"⦕","⩼":"⩼","⥸":"⥸","≩︀":"≩︀","ъ":"ъ","⥈":"⥈","↭":"↭","ℏ":"ℏ","ĥ":"ĥ","♥":"♥","…":"…","⊹":"⊹","𝔥":"𝔥","⤥":"⤥","⤦":"⤦","⇿":"⇿","∻":"∻","↩":"↩","↪":"↪","𝕙":"𝕙","―":"―","𝒽":"𝒽","ħ":"ħ","⁃":"⁃","í":"í","î":"î","и":"и","е":"е","¡":"¡","𝔦":"𝔦","ì":"ì","⨌":"⨌","∭":"∭","⧜":"⧜","℩":"℩","ij":"ij","ī":"ī","ı":"ı","⊷":"⊷","Ƶ":"Ƶ","℅":"℅","∞":"∞","⧝":"⧝","⊺":"⊺","⨗":"⨗","⨼":"⨼","ё":"ё","į":"į","𝕚":"𝕚","ι":"ι","¿":"¿","𝒾":"𝒾","⋹":"⋹","⋵":"⋵","⋴":"⋴","⋳":"⋳","ĩ":"ĩ","і":"і","ï":"ï","ĵ":"ĵ","й":"й","𝔧":"𝔧","ȷ":"ȷ","𝕛":"𝕛","𝒿":"𝒿","ј":"ј","є":"є","κ":"κ","ϰ":"ϰ","ķ":"ķ","к":"к","𝔨":"𝔨","ĸ":"ĸ","х":"х","ќ":"ќ","𝕜":"𝕜","𝓀":"𝓀","⤛":"⤛","⤎":"⤎","⪋":"⪋","⥢":"⥢","ĺ":"ĺ","⦴":"⦴","λ":"λ","⦑":"⦑","⪅":"⪅","«":"«","⤟":"⤟","⤝":"⤝","↫":"↫","⤹":"⤹","⥳":"⥳","↢":"↢","⪫":"⪫","⤙":"⤙","⪭":"⪭","⪭︀":"⪭︀","⤌":"⤌","❲":"❲","{":"{","[":"[","⦋":"⦋","⦏":"⦏","⦍":"⦍","ľ":"ľ","ļ":"ļ","л":"л","⤶":"⤶","⥧":"⥧","⥋":"⥋","↲":"↲","≤":"≤","⇇":"⇇","⋋":"⋋","⪨":"⪨","⩿":"⩿","⪁":"⪁","⪃":"⪃","⋚︀":"⋚︀","⪓":"⪓","⋖":"⋖","⥼":"⥼","𝔩":"𝔩","⪑":"⪑","⥪":"⥪","▄":"▄","љ":"љ","⥫":"⥫","◺":"◺","ŀ":"ŀ","⎰":"⎰","≨":"≨","⪉":"⪉","⪇":"⪇","⋦":"⋦","⟬":"⟬","⇽":"⇽","⟼":"⟼","↬":"↬","⦅":"⦅","𝕝":"𝕝","⨭":"⨭","⨴":"⨴","∗":"∗","◊":"◊","(":"(","⦓":"⦓","⥭":"⥭","‎":"‎","⊿":"⊿","‹":"‹","𝓁":"𝓁","⪍":"⪍","⪏":"⪏","‚":"‚","ł":"ł","⪦":"⪦","⩹":"⩹","⋉":"⋉","⥶":"⥶","⩻":"⩻","⦖":"⦖","◃":"◃","⥊":"⥊","⥦":"⥦","≨︀":"≨︀","∺":"∺","¯":"¯","♂":"♂","✠":"✠","▮":"▮","⨩":"⨩","м":"м","—":"—","𝔪":"𝔪","℧":"℧","µ":"µ","⫰":"⫰","−":"−","⨪":"⨪","⫛":"⫛","⊧":"⊧","𝕞":"𝕞","𝓂":"𝓂","μ":"μ","⊸":"⊸","⋙̸":"⋙̸","≫⃒":"≫⃒","⇍":"⇍","⇎":"⇎","⋘̸":"⋘̸","≪⃒":"≪⃒","⇏":"⇏","⊯":"⊯","⊮":"⊮","ń":"ń","∠⃒":"∠⃒","⩰̸":"⩰̸","≋̸":"≋̸","ʼn":"ʼn","♮":"♮","⩃":"⩃","ň":"ň","ņ":"ņ","⩭̸":"⩭̸","⩂":"⩂","н":"н","–":"–","⇗":"⇗","⤤":"⤤","≐̸":"≐̸","⤨":"⤨","𝔫":"𝔫","↮":"↮","⫲":"⫲","⋼":"⋼","⋺":"⋺","њ":"њ","≦̸":"≦̸","↚":"↚","‥":"‥","𝕟":"𝕟","¬":"¬","⋹̸":"⋹̸","⋵̸":"⋵̸","⋷":"⋷","⋶":"⋶","⋾":"⋾","⋽":"⋽","⫽⃥":"⫽⃥","∂̸":"∂̸","⨔":"⨔","↛":"↛","⤳̸":"⤳̸","↝̸":"↝̸","𝓃":"𝓃","⊄":"⊄","⫅̸":"⫅̸","⊅":"⊅","⫆̸":"⫆̸","ñ":"ñ","ν":"ν","#":"#","№":"№"," ":" ","⊭":"⊭","⤄":"⤄","≍⃒":"≍⃒","⊬":"⊬","≥⃒":"≥⃒",">⃒":">⃒","⧞":"⧞","⤂":"⤂","≤⃒":"≤⃒","<⃒":"<⃒","⊴⃒":"⊴⃒","⤃":"⤃","⊵⃒":"⊵⃒","∼⃒":"∼⃒","⇖":"⇖","⤣":"⤣","⤧":"⤧","ó":"ó","ô":"ô","о":"о","ő":"ő","⨸":"⨸","⦼":"⦼","œ":"œ","⦿":"⦿","𝔬":"𝔬","˛":"˛","ò":"ò","⧁":"⧁","⦵":"⦵","⦾":"⦾","⦻":"⦻","⧀":"⧀","ō":"ō","ω":"ω","ο":"ο","⦶":"⦶","𝕠":"𝕠","⦷":"⦷","⦹":"⦹","∨":"∨","⩝":"⩝","ℴ":"ℴ","ª":"ª","º":"º","⊶":"⊶","⩖":"⩖","⩗":"⩗","⩛":"⩛","ø":"ø","⊘":"⊘","õ":"õ","⨶":"⨶","ö":"ö","⌽":"⌽","¶":"¶","⫳":"⫳","⫽":"⫽","п":"п","%":"%",".":".","‰":"‰","‱":"‱","𝔭":"𝔭","φ":"φ","ϕ":"ϕ","☎":"☎","π":"π","ϖ":"ϖ","ℎ":"ℎ","+":"+","⨣":"⨣","⨢":"⨢","⨥":"⨥","⩲":"⩲","⨦":"⨦","⨧":"⨧","⨕":"⨕","𝕡":"𝕡","£":"£","⪳":"⪳","⪷":"⪷","⪹":"⪹","⪵":"⪵","⋨":"⋨","′":"′","⌮":"⌮","⌒":"⌒","⌓":"⌓","⊰":"⊰","𝓅":"𝓅","ψ":"ψ"," ":" ","𝔮":"𝔮","𝕢":"𝕢","⁗":"⁗","𝓆":"𝓆","⨖":"⨖","?":"?","⤜":"⤜","⥤":"⥤","∽̱":"∽̱","ŕ":"ŕ","⦳":"⦳","⦒":"⦒","⦥":"⦥","»":"»","⥵":"⥵","⤠":"⤠","⤳":"⤳","⤞":"⤞","⥅":"⥅","⥴":"⥴","↣":"↣","↝":"↝","⤚":"⤚","∶":"∶","❳":"❳","}":"}","]":"]","⦌":"⦌","⦎":"⦎","⦐":"⦐","ř":"ř","ŗ":"ŗ","р":"р","⤷":"⤷","⥩":"⥩","↳":"↳","▭":"▭","⥽":"⥽","𝔯":"𝔯","⥬":"⥬","ρ":"ρ","ϱ":"ϱ","⇉":"⇉","⋌":"⋌","˚":"˚","‏":"‏","⎱":"⎱","⫮":"⫮","⟭":"⟭","⇾":"⇾","⦆":"⦆","𝕣":"𝕣","⨮":"⨮","⨵":"⨵",")":")","⦔":"⦔","⨒":"⨒","›":"›","𝓇":"𝓇","⋊":"⋊","▹":"▹","⧎":"⧎","⥨":"⥨","℞":"℞","ś":"ś","⪴":"⪴","⪸":"⪸","š":"š","ş":"ş","ŝ":"ŝ","⪶":"⪶","⪺":"⪺","⋩":"⋩","⨓":"⨓","с":"с","⋅":"⋅","⩦":"⩦","⇘":"⇘","§":"§",";":";","⤩":"⤩","✶":"✶","𝔰":"𝔰","♯":"♯","щ":"щ","ш":"ш","­":"­","σ":"σ","ς":"ς","⩪":"⩪","⪞":"⪞","⪠":"⪠","⪝":"⪝","⪟":"⪟","≆":"≆","⨤":"⨤","⥲":"⥲","⨳":"⨳","⧤":"⧤","⌣":"⌣","⪪":"⪪","⪬":"⪬","⪬︀":"⪬︀","ь":"ь","/":"/","⧄":"⧄","⌿":"⌿","𝕤":"𝕤","♠":"♠","⊓︀":"⊓︀","⊔︀":"⊔︀","𝓈":"𝓈","☆":"☆","⊂":"⊂","⫅":"⫅","⪽":"⪽","⫃":"⫃","⫁":"⫁","⫋":"⫋","⊊":"⊊","⪿":"⪿","⥹":"⥹","⫇":"⫇","⫕":"⫕","⫓":"⫓","♪":"♪","¹":"¹","²":"²","³":"³","⫆":"⫆","⪾":"⪾","⫘":"⫘","⫄":"⫄","⟉":"⟉","⫗":"⫗","⥻":"⥻","⫂":"⫂","⫌":"⫌","⊋":"⊋","⫀":"⫀","⫈":"⫈","⫔":"⫔","⫖":"⫖","⇙":"⇙","⤪":"⤪","ß":"ß","⌖":"⌖","τ":"τ","ť":"ť","ţ":"ţ","т":"т","⌕":"⌕","𝔱":"𝔱","θ":"θ","ϑ":"ϑ","þ":"þ","×":"×","⨱":"⨱","⨰":"⨰","⌶":"⌶","⫱":"⫱","𝕥":"𝕥","⫚":"⫚","‴":"‴","▵":"▵","≜":"≜","◬":"◬","⨺":"⨺","⨹":"⨹","⧍":"⧍","⨻":"⨻","⏢":"⏢","𝓉":"𝓉","ц":"ц","ћ":"ћ","ŧ":"ŧ","⥣":"⥣","ú":"ú","ў":"ў","ŭ":"ŭ","û":"û","у":"у","ű":"ű","⥾":"⥾","𝔲":"𝔲","ù":"ù","▀":"▀","⌜":"⌜","⌏":"⌏","◸":"◸","ū":"ū","ų":"ų","𝕦":"𝕦","υ":"υ","⇈":"⇈","⌝":"⌝","⌎":"⌎","ů":"ů","◹":"◹","𝓊":"𝓊","⋰":"⋰","ũ":"ũ","ü":"ü","⦧":"⦧","⫨":"⫨","⫩":"⫩","⦜":"⦜","⊊︀":"⊊︀","⫋︀":"⫋︀","⊋︀":"⊋︀","⫌︀":"⫌︀","в":"в","⊻":"⊻","≚":"≚","⋮":"⋮","𝔳":"𝔳","𝕧":"𝕧","𝓋":"𝓋","⦚":"⦚","ŵ":"ŵ","⩟":"⩟","≙":"≙","℘":"℘","𝔴":"𝔴","𝕨":"𝕨","𝓌":"𝓌","𝔵":"𝔵","ξ":"ξ","⋻":"⋻","𝕩":"𝕩","𝓍":"𝓍","ý":"ý","я":"я","ŷ":"ŷ","ы":"ы","¥":"¥","𝔶":"𝔶","ї":"ї","𝕪":"𝕪","𝓎":"𝓎","ю":"ю","ÿ":"ÿ","ź":"ź","ž":"ž","з":"з","ż":"ż","ζ":"ζ","𝔷":"𝔷","ж":"ж","⇝":"⇝","𝕫":"𝕫","𝓏":"𝓏","‍":"‍","‌":"‌"}}}; + +/***/ }), + +/***/ "./node_modules/html-entities/lib/numeric-unicode-map.js": +/*!***************************************************************!*\ + !*** ./node_modules/html-entities/lib/numeric-unicode-map.js ***! + \***************************************************************/ +/***/ (function(__unused_webpack_module, exports) { + +"use strict"; +Object.defineProperty(exports, "__esModule", ({value:true}));exports.numericUnicodeMap={0:65533,128:8364,130:8218,131:402,132:8222,133:8230,134:8224,135:8225,136:710,137:8240,138:352,139:8249,140:338,142:381,145:8216,146:8217,147:8220,148:8221,149:8226,150:8211,151:8212,152:732,153:8482,154:353,155:8250,156:339,158:382,159:376}; + +/***/ }), + +/***/ "./node_modules/html-entities/lib/surrogate-pairs.js": +/*!***********************************************************!*\ + !*** ./node_modules/html-entities/lib/surrogate-pairs.js ***! + \***********************************************************/ +/***/ (function(__unused_webpack_module, exports) { + +"use strict"; +Object.defineProperty(exports, "__esModule", ({value:true}));exports.fromCodePoint=String.fromCodePoint||function(astralCodePoint){return String.fromCharCode(Math.floor((astralCodePoint-65536)/1024)+55296,(astralCodePoint-65536)%1024+56320)};exports.getCodePoint=String.prototype.codePointAt?function(input,position){return input.codePointAt(position)}:function(input,position){return(input.charCodeAt(position)-55296)*1024+input.charCodeAt(position+1)-56320+65536};exports.highSurrogateFrom=55296;exports.highSurrogateTo=56319; + +/***/ }), + +/***/ "./node_modules/webpack-dev-server/client/clients/WebSocketClient.js": +/*!***************************************************************************!*\ + !*** ./node_modules/webpack-dev-server/client/clients/WebSocketClient.js ***! + \***************************************************************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": function() { return /* binding */ WebSocketClient; } +/* harmony export */ }); +/* harmony import */ var _utils_log_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils/log.js */ "./node_modules/webpack-dev-server/client/utils/log.js"); +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + + + +var WebSocketClient = /*#__PURE__*/function () { + /** + * @param {string} url + */ + function WebSocketClient(url) { + _classCallCheck(this, WebSocketClient); + + this.client = new WebSocket(url); + + this.client.onerror = function (error) { + _utils_log_js__WEBPACK_IMPORTED_MODULE_0__.log.error(error); + }; + } + /** + * @param {(...args: any[]) => void} f + */ + + + _createClass(WebSocketClient, [{ + key: "onOpen", + value: function onOpen(f) { + this.client.onopen = f; + } + /** + * @param {(...args: any[]) => void} f + */ + + }, { + key: "onClose", + value: function onClose(f) { + this.client.onclose = f; + } // call f with the message string as the first argument + + /** + * @param {(...args: any[]) => void} f + */ + + }, { + key: "onMessage", + value: function onMessage(f) { + this.client.onmessage = function (e) { + f(e.data); + }; + } + }]); + + return WebSocketClient; +}(); + + + +/***/ }), + +/***/ "./node_modules/webpack-dev-server/client/index.js?protocol=ws%3A&hostname=localhost&port=8081&pathname=%2Fws&logging=none&reconnect=10": +/*!**********************************************************************************************************************************************!*\ + !*** ./node_modules/webpack-dev-server/client/index.js?protocol=ws%3A&hostname=localhost&port=8081&pathname=%2Fws&logging=none&reconnect=10 ***! + \**********************************************************************************************************************************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +"use strict"; +var __resourceQuery = "?protocol=ws%3A&hostname=localhost&port=8081&pathname=%2Fws&logging=none&reconnect=10"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var webpack_hot_log_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! webpack/hot/log.js */ "./node_modules/webpack/hot/log.js"); +/* harmony import */ var webpack_hot_log_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(webpack_hot_log_js__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var _utils_stripAnsi_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils/stripAnsi.js */ "./node_modules/webpack-dev-server/client/utils/stripAnsi.js"); +/* harmony import */ var _utils_parseURL_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utils/parseURL.js */ "./node_modules/webpack-dev-server/client/utils/parseURL.js"); +/* harmony import */ var _socket_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./socket.js */ "./node_modules/webpack-dev-server/client/socket.js"); +/* harmony import */ var _overlay_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./overlay.js */ "./node_modules/webpack-dev-server/client/overlay.js"); +/* harmony import */ var _utils_log_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./utils/log.js */ "./node_modules/webpack-dev-server/client/utils/log.js"); +/* harmony import */ var _utils_sendMessage_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./utils/sendMessage.js */ "./node_modules/webpack-dev-server/client/utils/sendMessage.js"); +/* harmony import */ var _utils_reloadApp_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./utils/reloadApp.js */ "./node_modules/webpack-dev-server/client/utils/reloadApp.js"); +/* harmony import */ var _utils_createSocketURL_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./utils/createSocketURL.js */ "./node_modules/webpack-dev-server/client/utils/createSocketURL.js"); +/* global __resourceQuery, __webpack_hash__ */ +/// + + + + + + + + + +/** + * @typedef {Object} Options + * @property {boolean} hot + * @property {boolean} liveReload + * @property {boolean} progress + * @property {boolean | { warnings?: boolean, errors?: boolean, trustedTypesPolicyName?: string }} overlay + * @property {string} [logging] + * @property {number} [reconnect] + */ + +/** + * @typedef {Object} Status + * @property {boolean} isUnloading + * @property {string} currentHash + * @property {string} [previousHash] + */ + +/** + * @type {Status} + */ + +var status = { + isUnloading: false, + // TODO Workaround for webpack v4, `__webpack_hash__` is not replaced without HotModuleReplacement + // eslint-disable-next-line camelcase + currentHash: true ? __webpack_require__.h() : 0 +}; +/** @type {Options} */ + +var options = { + hot: false, + liveReload: false, + progress: false, + overlay: false +}; +var parsedResourceQuery = (0,_utils_parseURL_js__WEBPACK_IMPORTED_MODULE_2__["default"])(__resourceQuery); + +if (parsedResourceQuery.hot === "true") { + options.hot = true; + _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.info("Hot Module Replacement enabled."); +} + +if (parsedResourceQuery["live-reload"] === "true") { + options.liveReload = true; + _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.info("Live Reloading enabled."); +} + +if (parsedResourceQuery.logging) { + options.logging = parsedResourceQuery.logging; +} + +if (typeof parsedResourceQuery.reconnect !== "undefined") { + options.reconnect = Number(parsedResourceQuery.reconnect); +} +/** + * @param {string} level + */ + + +function setAllLogLevel(level) { + // This is needed because the HMR logger operate separately from dev server logger + webpack_hot_log_js__WEBPACK_IMPORTED_MODULE_0___default().setLogLevel(level === "verbose" || level === "log" ? "info" : level); + (0,_utils_log_js__WEBPACK_IMPORTED_MODULE_5__.setLogLevel)(level); +} + +if (options.logging) { + setAllLogLevel(options.logging); +} + +self.addEventListener("beforeunload", function () { + status.isUnloading = true; +}); +var onSocketMessage = { + hot: function hot() { + if (parsedResourceQuery.hot === "false") { + return; + } + + options.hot = true; + _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.info("Hot Module Replacement enabled."); + }, + liveReload: function liveReload() { + if (parsedResourceQuery["live-reload"] === "false") { + return; + } + + options.liveReload = true; + _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.info("Live Reloading enabled."); + }, + invalid: function invalid() { + _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.info("App updated. Recompiling..."); // Fixes #1042. overlay doesn't clear if errors are fixed but warnings remain. + + if (options.overlay) { + (0,_overlay_js__WEBPACK_IMPORTED_MODULE_4__.hide)(); + } + + (0,_utils_sendMessage_js__WEBPACK_IMPORTED_MODULE_6__["default"])("Invalid"); + }, + + /** + * @param {string} hash + */ + hash: function hash(_hash) { + status.previousHash = status.currentHash; + status.currentHash = _hash; + }, + logging: setAllLogLevel, + + /** + * @param {boolean} value + */ + overlay: function overlay(value) { + if (typeof document === "undefined") { + return; + } + + options.overlay = value; + }, + + /** + * @param {number} value + */ + reconnect: function reconnect(value) { + if (parsedResourceQuery.reconnect === "false") { + return; + } + + options.reconnect = value; + }, + + /** + * @param {boolean} value + */ + progress: function progress(value) { + options.progress = value; + }, + + /** + * @param {{ pluginName?: string, percent: number, msg: string }} data + */ + "progress-update": function progressUpdate(data) { + if (options.progress) { + _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.info("".concat(data.pluginName ? "[".concat(data.pluginName, "] ") : "").concat(data.percent, "% - ").concat(data.msg, ".")); + } + + (0,_utils_sendMessage_js__WEBPACK_IMPORTED_MODULE_6__["default"])("Progress", data); + }, + "still-ok": function stillOk() { + _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.info("Nothing changed."); + + if (options.overlay) { + (0,_overlay_js__WEBPACK_IMPORTED_MODULE_4__.hide)(); + } + + (0,_utils_sendMessage_js__WEBPACK_IMPORTED_MODULE_6__["default"])("StillOk"); + }, + ok: function ok() { + (0,_utils_sendMessage_js__WEBPACK_IMPORTED_MODULE_6__["default"])("Ok"); + + if (options.overlay) { + (0,_overlay_js__WEBPACK_IMPORTED_MODULE_4__.hide)(); + } + + (0,_utils_reloadApp_js__WEBPACK_IMPORTED_MODULE_7__["default"])(options, status); + }, + // TODO: remove in v5 in favor of 'static-changed' + + /** + * @param {string} file + */ + "content-changed": function contentChanged(file) { + _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.info("".concat(file ? "\"".concat(file, "\"") : "Content", " from static directory was changed. Reloading...")); + self.location.reload(); + }, + + /** + * @param {string} file + */ + "static-changed": function staticChanged(file) { + _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.info("".concat(file ? "\"".concat(file, "\"") : "Content", " from static directory was changed. Reloading...")); + self.location.reload(); + }, + + /** + * @param {Error[]} warnings + * @param {any} params + */ + warnings: function warnings(_warnings, params) { + _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.warn("Warnings while compiling."); + + var printableWarnings = _warnings.map(function (error) { + var _formatProblem = (0,_overlay_js__WEBPACK_IMPORTED_MODULE_4__.formatProblem)("warning", error), + header = _formatProblem.header, + body = _formatProblem.body; + + return "".concat(header, "\n").concat((0,_utils_stripAnsi_js__WEBPACK_IMPORTED_MODULE_1__["default"])(body)); + }); + + (0,_utils_sendMessage_js__WEBPACK_IMPORTED_MODULE_6__["default"])("Warnings", printableWarnings); + + for (var i = 0; i < printableWarnings.length; i++) { + _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.warn(printableWarnings[i]); + } + + var needShowOverlayForWarnings = typeof options.overlay === "boolean" ? options.overlay : options.overlay && options.overlay.warnings; + + if (needShowOverlayForWarnings) { + var trustedTypesPolicyName = typeof options.overlay === "object" && options.overlay.trustedTypesPolicyName; + (0,_overlay_js__WEBPACK_IMPORTED_MODULE_4__.show)("warning", _warnings, trustedTypesPolicyName || null); + } + + if (params && params.preventReloading) { + return; + } + + (0,_utils_reloadApp_js__WEBPACK_IMPORTED_MODULE_7__["default"])(options, status); + }, + + /** + * @param {Error[]} errors + */ + errors: function errors(_errors) { + _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.error("Errors while compiling. Reload prevented."); + + var printableErrors = _errors.map(function (error) { + var _formatProblem2 = (0,_overlay_js__WEBPACK_IMPORTED_MODULE_4__.formatProblem)("error", error), + header = _formatProblem2.header, + body = _formatProblem2.body; + + return "".concat(header, "\n").concat((0,_utils_stripAnsi_js__WEBPACK_IMPORTED_MODULE_1__["default"])(body)); + }); + + (0,_utils_sendMessage_js__WEBPACK_IMPORTED_MODULE_6__["default"])("Errors", printableErrors); + + for (var i = 0; i < printableErrors.length; i++) { + _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.error(printableErrors[i]); + } + + var needShowOverlayForErrors = typeof options.overlay === "boolean" ? options.overlay : options.overlay && options.overlay.errors; + + if (needShowOverlayForErrors) { + var trustedTypesPolicyName = typeof options.overlay === "object" && options.overlay.trustedTypesPolicyName; + (0,_overlay_js__WEBPACK_IMPORTED_MODULE_4__.show)("error", _errors, trustedTypesPolicyName || null); + } + }, + + /** + * @param {Error} error + */ + error: function error(_error) { + _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.error(_error); + }, + close: function close() { + _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.info("Disconnected!"); + + if (options.overlay) { + (0,_overlay_js__WEBPACK_IMPORTED_MODULE_4__.hide)(); + } + + (0,_utils_sendMessage_js__WEBPACK_IMPORTED_MODULE_6__["default"])("Close"); + } +}; +var socketURL = (0,_utils_createSocketURL_js__WEBPACK_IMPORTED_MODULE_8__["default"])(parsedResourceQuery); +(0,_socket_js__WEBPACK_IMPORTED_MODULE_3__["default"])(socketURL, onSocketMessage, options.reconnect); + +/***/ }), + +/***/ "./node_modules/webpack-dev-server/client/modules/logger/index.js": +/*!************************************************************************!*\ + !*** ./node_modules/webpack-dev-server/client/modules/logger/index.js ***! + \************************************************************************/ +/***/ (function(__unused_webpack_module, exports) { + +/******/ (function() { // webpackBootstrap +/******/ "use strict"; +/******/ var __webpack_modules__ = ({ + +/***/ "./client-src/modules/logger/SyncBailHookFake.js": +/*!*******************************************************!*\ + !*** ./client-src/modules/logger/SyncBailHookFake.js ***! + \*******************************************************/ +/***/ (function(module) { + + +/** + * Client stub for tapable SyncBailHook + */ + +module.exports = function clientTapableSyncBailHook() { + return { + call: function call() {} + }; +}; + +/***/ }), + +/***/ "./node_modules/webpack/lib/logging/Logger.js": +/*!****************************************************!*\ + !*** ./node_modules/webpack/lib/logging/Logger.js ***! + \****************************************************/ +/***/ (function(__unused_webpack_module, exports) { + +/* + MIT License http://www.opensource.org/licenses/mit-license.php + Author Tobias Koppers @sokra +*/ + + +function _toConsumableArray(arr) { + return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); +} + +function _nonIterableSpread() { + throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); +} + +function _unsupportedIterableToArray(o, minLen) { + if (!o) return; + if (typeof o === "string") return _arrayLikeToArray(o, minLen); + var n = Object.prototype.toString.call(o).slice(8, -1); + if (n === "Object" && o.constructor) n = o.constructor.name; + if (n === "Map" || n === "Set") return Array.from(o); + if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); +} + +function _iterableToArray(iter) { + if (typeof (typeof Symbol !== "undefined" ? Symbol : function (i) { return i; }) !== "undefined" && iter[(typeof Symbol !== "undefined" ? Symbol : function (i) { return i; }).iterator] != null || iter["@@iterator"] != null) return Array.from(iter); +} + +function _arrayWithoutHoles(arr) { + if (Array.isArray(arr)) return _arrayLikeToArray(arr); +} + +function _arrayLikeToArray(arr, len) { + if (len == null || len > arr.length) len = arr.length; + + for (var i = 0, arr2 = new Array(len); i < len; i++) { + arr2[i] = arr[i]; + } + + return arr2; +} + +function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } +} + +function _defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } +} + +function _createClass(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties(Constructor.prototype, protoProps); + if (staticProps) _defineProperties(Constructor, staticProps); + Object.defineProperty(Constructor, "prototype", { + writable: false + }); + return Constructor; +} + +var LogType = Object.freeze({ + error: + /** @type {"error"} */ + "error", + // message, c style arguments + warn: + /** @type {"warn"} */ + "warn", + // message, c style arguments + info: + /** @type {"info"} */ + "info", + // message, c style arguments + log: + /** @type {"log"} */ + "log", + // message, c style arguments + debug: + /** @type {"debug"} */ + "debug", + // message, c style arguments + trace: + /** @type {"trace"} */ + "trace", + // no arguments + group: + /** @type {"group"} */ + "group", + // [label] + groupCollapsed: + /** @type {"groupCollapsed"} */ + "groupCollapsed", + // [label] + groupEnd: + /** @type {"groupEnd"} */ + "groupEnd", + // [label] + profile: + /** @type {"profile"} */ + "profile", + // [profileName] + profileEnd: + /** @type {"profileEnd"} */ + "profileEnd", + // [profileName] + time: + /** @type {"time"} */ + "time", + // name, time as [seconds, nanoseconds] + clear: + /** @type {"clear"} */ + "clear", + // no arguments + status: + /** @type {"status"} */ + "status" // message, arguments + +}); +exports.LogType = LogType; +/** @typedef {typeof LogType[keyof typeof LogType]} LogTypeEnum */ + +var LOG_SYMBOL = (typeof Symbol !== "undefined" ? Symbol : function (i) { return i; })("webpack logger raw log method"); +var TIMERS_SYMBOL = (typeof Symbol !== "undefined" ? Symbol : function (i) { return i; })("webpack logger times"); +var TIMERS_AGGREGATES_SYMBOL = (typeof Symbol !== "undefined" ? Symbol : function (i) { return i; })("webpack logger aggregated times"); + +var WebpackLogger = /*#__PURE__*/function () { + /** + * @param {function(LogTypeEnum, any[]=): void} log log function + * @param {function(string | function(): string): WebpackLogger} getChildLogger function to create child logger + */ + function WebpackLogger(log, getChildLogger) { + _classCallCheck(this, WebpackLogger); + + this[LOG_SYMBOL] = log; + this.getChildLogger = getChildLogger; + } + + _createClass(WebpackLogger, [{ + key: "error", + value: function error() { + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + this[LOG_SYMBOL](LogType.error, args); + } + }, { + key: "warn", + value: function warn() { + for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { + args[_key2] = arguments[_key2]; + } + + this[LOG_SYMBOL](LogType.warn, args); + } + }, { + key: "info", + value: function info() { + for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) { + args[_key3] = arguments[_key3]; + } + + this[LOG_SYMBOL](LogType.info, args); + } + }, { + key: "log", + value: function log() { + for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) { + args[_key4] = arguments[_key4]; + } + + this[LOG_SYMBOL](LogType.log, args); + } + }, { + key: "debug", + value: function debug() { + for (var _len5 = arguments.length, args = new Array(_len5), _key5 = 0; _key5 < _len5; _key5++) { + args[_key5] = arguments[_key5]; + } + + this[LOG_SYMBOL](LogType.debug, args); + } + }, { + key: "assert", + value: function assert(assertion) { + if (!assertion) { + for (var _len6 = arguments.length, args = new Array(_len6 > 1 ? _len6 - 1 : 0), _key6 = 1; _key6 < _len6; _key6++) { + args[_key6 - 1] = arguments[_key6]; + } + + this[LOG_SYMBOL](LogType.error, args); + } + } + }, { + key: "trace", + value: function trace() { + this[LOG_SYMBOL](LogType.trace, ["Trace"]); + } + }, { + key: "clear", + value: function clear() { + this[LOG_SYMBOL](LogType.clear); + } + }, { + key: "status", + value: function status() { + for (var _len7 = arguments.length, args = new Array(_len7), _key7 = 0; _key7 < _len7; _key7++) { + args[_key7] = arguments[_key7]; + } + + this[LOG_SYMBOL](LogType.status, args); + } + }, { + key: "group", + value: function group() { + for (var _len8 = arguments.length, args = new Array(_len8), _key8 = 0; _key8 < _len8; _key8++) { + args[_key8] = arguments[_key8]; + } + + this[LOG_SYMBOL](LogType.group, args); + } + }, { + key: "groupCollapsed", + value: function groupCollapsed() { + for (var _len9 = arguments.length, args = new Array(_len9), _key9 = 0; _key9 < _len9; _key9++) { + args[_key9] = arguments[_key9]; + } + + this[LOG_SYMBOL](LogType.groupCollapsed, args); + } + }, { + key: "groupEnd", + value: function groupEnd() { + for (var _len10 = arguments.length, args = new Array(_len10), _key10 = 0; _key10 < _len10; _key10++) { + args[_key10] = arguments[_key10]; + } + + this[LOG_SYMBOL](LogType.groupEnd, args); + } + }, { + key: "profile", + value: function profile(label) { + this[LOG_SYMBOL](LogType.profile, [label]); + } + }, { + key: "profileEnd", + value: function profileEnd(label) { + this[LOG_SYMBOL](LogType.profileEnd, [label]); + } + }, { + key: "time", + value: function time(label) { + this[TIMERS_SYMBOL] = this[TIMERS_SYMBOL] || new Map(); + this[TIMERS_SYMBOL].set(label, process.hrtime()); + } + }, { + key: "timeLog", + value: function timeLog(label) { + var prev = this[TIMERS_SYMBOL] && this[TIMERS_SYMBOL].get(label); + + if (!prev) { + throw new Error("No such label '".concat(label, "' for WebpackLogger.timeLog()")); + } + + var time = process.hrtime(prev); + this[LOG_SYMBOL](LogType.time, [label].concat(_toConsumableArray(time))); + } + }, { + key: "timeEnd", + value: function timeEnd(label) { + var prev = this[TIMERS_SYMBOL] && this[TIMERS_SYMBOL].get(label); + + if (!prev) { + throw new Error("No such label '".concat(label, "' for WebpackLogger.timeEnd()")); + } + + var time = process.hrtime(prev); + this[TIMERS_SYMBOL].delete(label); + this[LOG_SYMBOL](LogType.time, [label].concat(_toConsumableArray(time))); + } + }, { + key: "timeAggregate", + value: function timeAggregate(label) { + var prev = this[TIMERS_SYMBOL] && this[TIMERS_SYMBOL].get(label); + + if (!prev) { + throw new Error("No such label '".concat(label, "' for WebpackLogger.timeAggregate()")); + } + + var time = process.hrtime(prev); + this[TIMERS_SYMBOL].delete(label); + this[TIMERS_AGGREGATES_SYMBOL] = this[TIMERS_AGGREGATES_SYMBOL] || new Map(); + var current = this[TIMERS_AGGREGATES_SYMBOL].get(label); + + if (current !== undefined) { + if (time[1] + current[1] > 1e9) { + time[0] += current[0] + 1; + time[1] = time[1] - 1e9 + current[1]; + } else { + time[0] += current[0]; + time[1] += current[1]; + } + } + + this[TIMERS_AGGREGATES_SYMBOL].set(label, time); + } + }, { + key: "timeAggregateEnd", + value: function timeAggregateEnd(label) { + if (this[TIMERS_AGGREGATES_SYMBOL] === undefined) return; + var time = this[TIMERS_AGGREGATES_SYMBOL].get(label); + if (time === undefined) return; + this[TIMERS_AGGREGATES_SYMBOL].delete(label); + this[LOG_SYMBOL](LogType.time, [label].concat(_toConsumableArray(time))); + } + }]); + + return WebpackLogger; +}(); + +exports.Logger = WebpackLogger; + +/***/ }), + +/***/ "./node_modules/webpack/lib/logging/createConsoleLogger.js": +/*!*****************************************************************!*\ + !*** ./node_modules/webpack/lib/logging/createConsoleLogger.js ***! + \*****************************************************************/ +/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_10785__) { + +/* + MIT License http://www.opensource.org/licenses/mit-license.php + Author Tobias Koppers @sokra +*/ + + +function _toConsumableArray(arr) { + return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); +} + +function _nonIterableSpread() { + throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); +} + +function _unsupportedIterableToArray(o, minLen) { + if (!o) return; + if (typeof o === "string") return _arrayLikeToArray(o, minLen); + var n = Object.prototype.toString.call(o).slice(8, -1); + if (n === "Object" && o.constructor) n = o.constructor.name; + if (n === "Map" || n === "Set") return Array.from(o); + if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); +} + +function _iterableToArray(iter) { + if (typeof (typeof Symbol !== "undefined" ? Symbol : function (i) { return i; }) !== "undefined" && iter[(typeof Symbol !== "undefined" ? Symbol : function (i) { return i; }).iterator] != null || iter["@@iterator"] != null) return Array.from(iter); +} + +function _arrayWithoutHoles(arr) { + if (Array.isArray(arr)) return _arrayLikeToArray(arr); +} + +function _arrayLikeToArray(arr, len) { + if (len == null || len > arr.length) len = arr.length; + + for (var i = 0, arr2 = new Array(len); i < len; i++) { + arr2[i] = arr[i]; + } + + return arr2; +} + +var _require = __nested_webpack_require_10785__(/*! ./Logger */ "./node_modules/webpack/lib/logging/Logger.js"), + LogType = _require.LogType; +/** @typedef {import("../../declarations/WebpackOptions").FilterItemTypes} FilterItemTypes */ + +/** @typedef {import("../../declarations/WebpackOptions").FilterTypes} FilterTypes */ + +/** @typedef {import("./Logger").LogTypeEnum} LogTypeEnum */ + +/** @typedef {function(string): boolean} FilterFunction */ + +/** + * @typedef {Object} LoggerConsole + * @property {function(): void} clear + * @property {function(): void} trace + * @property {(...args: any[]) => void} info + * @property {(...args: any[]) => void} log + * @property {(...args: any[]) => void} warn + * @property {(...args: any[]) => void} error + * @property {(...args: any[]) => void=} debug + * @property {(...args: any[]) => void=} group + * @property {(...args: any[]) => void=} groupCollapsed + * @property {(...args: any[]) => void=} groupEnd + * @property {(...args: any[]) => void=} status + * @property {(...args: any[]) => void=} profile + * @property {(...args: any[]) => void=} profileEnd + * @property {(...args: any[]) => void=} logTime + */ + +/** + * @typedef {Object} LoggerOptions + * @property {false|true|"none"|"error"|"warn"|"info"|"log"|"verbose"} level loglevel + * @property {FilterTypes|boolean} debug filter for debug logging + * @property {LoggerConsole} console the console to log to + */ + +/** + * @param {FilterItemTypes} item an input item + * @returns {FilterFunction} filter function + */ + + +var filterToFunction = function filterToFunction(item) { + if (typeof item === "string") { + var regExp = new RegExp("[\\\\/]".concat(item.replace( // eslint-disable-next-line no-useless-escape + /[-[\]{}()*+?.\\^$|]/g, "\\$&"), "([\\\\/]|$|!|\\?)")); + return function (ident) { + return regExp.test(ident); + }; + } + + if (item && typeof item === "object" && typeof item.test === "function") { + return function (ident) { + return item.test(ident); + }; + } + + if (typeof item === "function") { + return item; + } + + if (typeof item === "boolean") { + return function () { + return item; + }; + } +}; +/** + * @enum {number} + */ + + +var LogLevel = { + none: 6, + false: 6, + error: 5, + warn: 4, + info: 3, + log: 2, + true: 2, + verbose: 1 +}; +/** + * @param {LoggerOptions} options options object + * @returns {function(string, LogTypeEnum, any[]): void} logging function + */ + +module.exports = function (_ref) { + var _ref$level = _ref.level, + level = _ref$level === void 0 ? "info" : _ref$level, + _ref$debug = _ref.debug, + debug = _ref$debug === void 0 ? false : _ref$debug, + console = _ref.console; + var debugFilters = typeof debug === "boolean" ? [function () { + return debug; + }] : + /** @type {FilterItemTypes[]} */ + [].concat(debug).map(filterToFunction); + /** @type {number} */ + + var loglevel = LogLevel["".concat(level)] || 0; + /** + * @param {string} name name of the logger + * @param {LogTypeEnum} type type of the log entry + * @param {any[]} args arguments of the log entry + * @returns {void} + */ + + var logger = function logger(name, type, args) { + var labeledArgs = function labeledArgs() { + if (Array.isArray(args)) { + if (args.length > 0 && typeof args[0] === "string") { + return ["[".concat(name, "] ").concat(args[0])].concat(_toConsumableArray(args.slice(1))); + } else { + return ["[".concat(name, "]")].concat(_toConsumableArray(args)); + } + } else { + return []; + } + }; + + var debug = debugFilters.some(function (f) { + return f(name); + }); + + switch (type) { + case LogType.debug: + if (!debug) return; // eslint-disable-next-line node/no-unsupported-features/node-builtins + + if (typeof console.debug === "function") { + // eslint-disable-next-line node/no-unsupported-features/node-builtins + console.debug.apply(console, _toConsumableArray(labeledArgs())); + } else { + console.log.apply(console, _toConsumableArray(labeledArgs())); + } + + break; + + case LogType.log: + if (!debug && loglevel > LogLevel.log) return; + console.log.apply(console, _toConsumableArray(labeledArgs())); + break; + + case LogType.info: + if (!debug && loglevel > LogLevel.info) return; + console.info.apply(console, _toConsumableArray(labeledArgs())); + break; + + case LogType.warn: + if (!debug && loglevel > LogLevel.warn) return; + console.warn.apply(console, _toConsumableArray(labeledArgs())); + break; + + case LogType.error: + if (!debug && loglevel > LogLevel.error) return; + console.error.apply(console, _toConsumableArray(labeledArgs())); + break; + + case LogType.trace: + if (!debug) return; + console.trace(); + break; + + case LogType.groupCollapsed: + if (!debug && loglevel > LogLevel.log) return; + + if (!debug && loglevel > LogLevel.verbose) { + // eslint-disable-next-line node/no-unsupported-features/node-builtins + if (typeof console.groupCollapsed === "function") { + // eslint-disable-next-line node/no-unsupported-features/node-builtins + console.groupCollapsed.apply(console, _toConsumableArray(labeledArgs())); + } else { + console.log.apply(console, _toConsumableArray(labeledArgs())); + } + + break; + } + + // falls through + + case LogType.group: + if (!debug && loglevel > LogLevel.log) return; // eslint-disable-next-line node/no-unsupported-features/node-builtins + + if (typeof console.group === "function") { + // eslint-disable-next-line node/no-unsupported-features/node-builtins + console.group.apply(console, _toConsumableArray(labeledArgs())); + } else { + console.log.apply(console, _toConsumableArray(labeledArgs())); + } + + break; + + case LogType.groupEnd: + if (!debug && loglevel > LogLevel.log) return; // eslint-disable-next-line node/no-unsupported-features/node-builtins + + if (typeof console.groupEnd === "function") { + // eslint-disable-next-line node/no-unsupported-features/node-builtins + console.groupEnd(); + } + + break; + + case LogType.time: + { + if (!debug && loglevel > LogLevel.log) return; + var ms = args[1] * 1000 + args[2] / 1000000; + var msg = "[".concat(name, "] ").concat(args[0], ": ").concat(ms, " ms"); + + if (typeof console.logTime === "function") { + console.logTime(msg); + } else { + console.log(msg); + } + + break; + } + + case LogType.profile: + // eslint-disable-next-line node/no-unsupported-features/node-builtins + if (typeof console.profile === "function") { + // eslint-disable-next-line node/no-unsupported-features/node-builtins + console.profile.apply(console, _toConsumableArray(labeledArgs())); + } + + break; + + case LogType.profileEnd: + // eslint-disable-next-line node/no-unsupported-features/node-builtins + if (typeof console.profileEnd === "function") { + // eslint-disable-next-line node/no-unsupported-features/node-builtins + console.profileEnd.apply(console, _toConsumableArray(labeledArgs())); + } + + break; + + case LogType.clear: + if (!debug && loglevel > LogLevel.log) return; // eslint-disable-next-line node/no-unsupported-features/node-builtins + + if (typeof console.clear === "function") { + // eslint-disable-next-line node/no-unsupported-features/node-builtins + console.clear(); + } + + break; + + case LogType.status: + if (!debug && loglevel > LogLevel.info) return; + + if (typeof console.status === "function") { + if (args.length === 0) { + console.status(); + } else { + console.status.apply(console, _toConsumableArray(labeledArgs())); + } + } else { + if (args.length !== 0) { + console.info.apply(console, _toConsumableArray(labeledArgs())); + } + } + + break; + + default: + throw new Error("Unexpected LogType ".concat(type)); + } + }; + + return logger; +}; + +/***/ }), + +/***/ "./node_modules/webpack/lib/logging/runtime.js": +/*!*****************************************************!*\ + !*** ./node_modules/webpack/lib/logging/runtime.js ***! + \*****************************************************/ +/***/ (function(__unused_webpack_module, exports, __nested_webpack_require_20872__) { + +/* + MIT License http://www.opensource.org/licenses/mit-license.php + Author Tobias Koppers @sokra +*/ + + +function _extends() { + _extends = Object.assign ? Object.assign.bind() : function (target) { + for (var i = 1; i < arguments.length; i++) { + var source = arguments[i]; + + for (var key in source) { + if (Object.prototype.hasOwnProperty.call(source, key)) { + target[key] = source[key]; + } + } + } + + return target; + }; + return _extends.apply(this, arguments); +} + +var SyncBailHook = __nested_webpack_require_20872__(/*! tapable/lib/SyncBailHook */ "./client-src/modules/logger/SyncBailHookFake.js"); + +var _require = __nested_webpack_require_20872__(/*! ./Logger */ "./node_modules/webpack/lib/logging/Logger.js"), + Logger = _require.Logger; + +var createConsoleLogger = __nested_webpack_require_20872__(/*! ./createConsoleLogger */ "./node_modules/webpack/lib/logging/createConsoleLogger.js"); +/** @type {createConsoleLogger.LoggerOptions} */ + + +var currentDefaultLoggerOptions = { + level: "info", + debug: false, + console: console +}; +var currentDefaultLogger = createConsoleLogger(currentDefaultLoggerOptions); +/** + * @param {string} name name of the logger + * @returns {Logger} a logger + */ + +exports.getLogger = function (name) { + return new Logger(function (type, args) { + if (exports.hooks.log.call(name, type, args) === undefined) { + currentDefaultLogger(name, type, args); + } + }, function (childName) { + return exports.getLogger("".concat(name, "/").concat(childName)); + }); +}; +/** + * @param {createConsoleLogger.LoggerOptions} options new options, merge with old options + * @returns {void} + */ + + +exports.configureDefaultLogger = function (options) { + _extends(currentDefaultLoggerOptions, options); + + currentDefaultLogger = createConsoleLogger(currentDefaultLoggerOptions); +}; + +exports.hooks = { + log: new SyncBailHook(["origin", "type", "args"]) +}; + +/***/ }) + +/******/ }); +/************************************************************************/ +/******/ // The module cache +/******/ var __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __nested_webpack_require_23009__(moduleId) { +/******/ // Check if module is in cache +/******/ var cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ __webpack_modules__[moduleId](module, module.exports, __nested_webpack_require_23009__); +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/define property getters */ +/******/ !function() { +/******/ // define getter functions for harmony exports +/******/ __nested_webpack_require_23009__.d = function(exports, definition) { +/******/ for(var key in definition) { +/******/ if(__nested_webpack_require_23009__.o(definition, key) && !__nested_webpack_require_23009__.o(exports, key)) { +/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); +/******/ } +/******/ } +/******/ }; +/******/ }(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ !function() { +/******/ __nested_webpack_require_23009__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); } +/******/ }(); +/******/ +/******/ /* webpack/runtime/make namespace object */ +/******/ !function() { +/******/ // define __esModule on exports +/******/ __nested_webpack_require_23009__.r = function(exports) { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ }(); +/******/ +/************************************************************************/ +var __webpack_exports__ = {}; +// This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk. +!function() { +/*!********************************************!*\ + !*** ./client-src/modules/logger/index.js ***! + \********************************************/ +__nested_webpack_require_23009__.r(__webpack_exports__); +/* harmony export */ __nested_webpack_require_23009__.d(__webpack_exports__, { +/* harmony export */ "default": function() { return /* reexport default export from named module */ webpack_lib_logging_runtime_js__WEBPACK_IMPORTED_MODULE_0__; } +/* harmony export */ }); +/* harmony import */ var webpack_lib_logging_runtime_js__WEBPACK_IMPORTED_MODULE_0__ = __nested_webpack_require_23009__(/*! webpack/lib/logging/runtime.js */ "./node_modules/webpack/lib/logging/runtime.js"); + +}(); +var __webpack_export_target__ = exports; +for(var i in __webpack_exports__) __webpack_export_target__[i] = __webpack_exports__[i]; +if(__webpack_exports__.__esModule) Object.defineProperty(__webpack_export_target__, "__esModule", { value: true }); +/******/ })() +; + +/***/ }), + +/***/ "./node_modules/webpack-dev-server/client/overlay.js": +/*!***********************************************************!*\ + !*** ./node_modules/webpack-dev-server/client/overlay.js ***! + \***********************************************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "formatProblem": function() { return /* binding */ formatProblem; }, +/* harmony export */ "hide": function() { return /* binding */ hide; }, +/* harmony export */ "show": function() { return /* binding */ show; } +/* harmony export */ }); +/* harmony import */ var ansi_html_community__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ansi-html-community */ "./node_modules/ansi-html-community/index.js"); +/* harmony import */ var ansi_html_community__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(ansi_html_community__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var html_entities__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! html-entities */ "./node_modules/html-entities/lib/index.js"); +/* harmony import */ var html_entities__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(html_entities__WEBPACK_IMPORTED_MODULE_1__); +// The error overlay is inspired (and mostly copied) from Create React App (https://github.com/facebookincubator/create-react-app) +// They, in turn, got inspired by webpack-hot-middleware (https://github.com/glenjamin/webpack-hot-middleware). + + +var colors = { + reset: ["transparent", "transparent"], + black: "181818", + red: "E36049", + green: "B3CB74", + yellow: "FFD080", + blue: "7CAFC2", + magenta: "7FACCA", + cyan: "C3C2EF", + lightgrey: "EBE7E3", + darkgrey: "6D7891" +}; +/** @type {HTMLIFrameElement | null | undefined} */ + +var iframeContainerElement; +/** @type {HTMLDivElement | null | undefined} */ + +var containerElement; +/** @type {Array<(element: HTMLDivElement) => void>} */ + +var onLoadQueue = []; +/** @type {TrustedTypePolicy | undefined} */ + +var overlayTrustedTypesPolicy; +ansi_html_community__WEBPACK_IMPORTED_MODULE_0___default().setColors(colors); +/** + * @param {string | null} trustedTypesPolicyName + */ + +function createContainer(trustedTypesPolicyName) { + // Enable Trusted Types if they are available in the current browser. + if (window.trustedTypes) { + overlayTrustedTypesPolicy = window.trustedTypes.createPolicy(trustedTypesPolicyName || "webpack-dev-server#overlay", { + createHTML: function createHTML(value) { + return value; + } + }); + } + + iframeContainerElement = document.createElement("iframe"); + iframeContainerElement.id = "webpack-dev-server-client-overlay"; + iframeContainerElement.src = "about:blank"; + iframeContainerElement.style.position = "fixed"; + iframeContainerElement.style.left = 0; + iframeContainerElement.style.top = 0; + iframeContainerElement.style.right = 0; + iframeContainerElement.style.bottom = 0; + iframeContainerElement.style.width = "100vw"; + iframeContainerElement.style.height = "100vh"; + iframeContainerElement.style.border = "none"; + iframeContainerElement.style.zIndex = 9999999999; + + iframeContainerElement.onload = function () { + containerElement = + /** @type {Document} */ + + /** @type {HTMLIFrameElement} */ + iframeContainerElement.contentDocument.createElement("div"); + containerElement.id = "webpack-dev-server-client-overlay-div"; + containerElement.style.position = "fixed"; + containerElement.style.boxSizing = "border-box"; + containerElement.style.left = 0; + containerElement.style.top = 0; + containerElement.style.right = 0; + containerElement.style.bottom = 0; + containerElement.style.width = "100vw"; + containerElement.style.height = "100vh"; + containerElement.style.backgroundColor = "rgba(0, 0, 0, 0.85)"; + containerElement.style.color = "#E8E8E8"; + containerElement.style.fontFamily = "Menlo, Consolas, monospace"; + containerElement.style.fontSize = "large"; + containerElement.style.padding = "2rem"; + containerElement.style.lineHeight = "1.2"; + containerElement.style.whiteSpace = "pre-wrap"; + containerElement.style.overflow = "auto"; + var headerElement = document.createElement("span"); + headerElement.innerText = "Compiled with problems:"; + var closeButtonElement = document.createElement("button"); + closeButtonElement.innerText = "X"; + closeButtonElement.style.background = "transparent"; + closeButtonElement.style.border = "none"; + closeButtonElement.style.fontSize = "20px"; + closeButtonElement.style.fontWeight = "bold"; + closeButtonElement.style.color = "white"; + closeButtonElement.style.cursor = "pointer"; + closeButtonElement.style.cssFloat = "right"; // @ts-ignore + + closeButtonElement.style.styleFloat = "right"; + closeButtonElement.addEventListener("click", function () { + hide(); + }); + containerElement.appendChild(headerElement); + containerElement.appendChild(closeButtonElement); + containerElement.appendChild(document.createElement("br")); + containerElement.appendChild(document.createElement("br")); + /** @type {Document} */ + + /** @type {HTMLIFrameElement} */ + iframeContainerElement.contentDocument.body.appendChild(containerElement); + onLoadQueue.forEach(function (onLoad) { + onLoad( + /** @type {HTMLDivElement} */ + containerElement); + }); + onLoadQueue = []; + /** @type {HTMLIFrameElement} */ + + iframeContainerElement.onload = null; + }; + + document.body.appendChild(iframeContainerElement); +} +/** + * @param {(element: HTMLDivElement) => void} callback + * @param {string | null} trustedTypesPolicyName + */ + + +function ensureOverlayExists(callback, trustedTypesPolicyName) { + if (containerElement) { + // Everything is ready, call the callback right away. + callback(containerElement); + return; + } + + onLoadQueue.push(callback); + + if (iframeContainerElement) { + return; + } + + createContainer(trustedTypesPolicyName); +} // Successful compilation. + + +function hide() { + if (!iframeContainerElement) { + return; + } // Clean up and reset internal state. + + + document.body.removeChild(iframeContainerElement); + iframeContainerElement = null; + containerElement = null; +} +/** + * @param {string} type + * @param {string | { file?: string, moduleName?: string, loc?: string, message?: string }} item + * @returns {{ header: string, body: string }} + */ + + +function formatProblem(type, item) { + var header = type === "warning" ? "WARNING" : "ERROR"; + var body = ""; + + if (typeof item === "string") { + body += item; + } else { + var file = item.file || ""; // eslint-disable-next-line no-nested-ternary + + var moduleName = item.moduleName ? item.moduleName.indexOf("!") !== -1 ? "".concat(item.moduleName.replace(/^(\s|\S)*!/, ""), " (").concat(item.moduleName, ")") : "".concat(item.moduleName) : ""; + var loc = item.loc; + header += "".concat(moduleName || file ? " in ".concat(moduleName ? "".concat(moduleName).concat(file ? " (".concat(file, ")") : "") : file).concat(loc ? " ".concat(loc) : "") : ""); + body += item.message || ""; + } + + return { + header: header, + body: body + }; +} // Compilation with errors (e.g. syntax error or missing modules). + +/** + * @param {string} type + * @param {Array} messages + * @param {string | null} trustedTypesPolicyName + */ + + +function show(type, messages, trustedTypesPolicyName) { + ensureOverlayExists(function () { + messages.forEach(function (message) { + var entryElement = document.createElement("div"); + var typeElement = document.createElement("span"); + + var _formatProblem = formatProblem(type, message), + header = _formatProblem.header, + body = _formatProblem.body; + + typeElement.innerText = header; + typeElement.style.color = "#".concat(colors.red); // Make it look similar to our terminal. + + var text = ansi_html_community__WEBPACK_IMPORTED_MODULE_0___default()((0,html_entities__WEBPACK_IMPORTED_MODULE_1__.encode)(body)); + var messageTextNode = document.createElement("div"); + messageTextNode.innerHTML = overlayTrustedTypesPolicy ? overlayTrustedTypesPolicy.createHTML(text) : text; + entryElement.appendChild(typeElement); + entryElement.appendChild(document.createElement("br")); + entryElement.appendChild(document.createElement("br")); + entryElement.appendChild(messageTextNode); + entryElement.appendChild(document.createElement("br")); + entryElement.appendChild(document.createElement("br")); + /** @type {HTMLDivElement} */ + + containerElement.appendChild(entryElement); + }); + }, trustedTypesPolicyName); +} + + + +/***/ }), + +/***/ "./node_modules/webpack-dev-server/client/socket.js": +/*!**********************************************************!*\ + !*** ./node_modules/webpack-dev-server/client/socket.js ***! + \**********************************************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "client": function() { return /* binding */ client; } +/* harmony export */ }); +/* harmony import */ var _clients_WebSocketClient_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./clients/WebSocketClient.js */ "./node_modules/webpack-dev-server/client/clients/WebSocketClient.js"); +/* harmony import */ var _utils_log_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils/log.js */ "./node_modules/webpack-dev-server/client/utils/log.js"); +/* provided dependency */ var __webpack_dev_server_client__ = __webpack_require__(/*! ./node_modules/webpack-dev-server/client/clients/WebSocketClient.js */ "./node_modules/webpack-dev-server/client/clients/WebSocketClient.js"); +/* global __webpack_dev_server_client__ */ + + // this WebsocketClient is here as a default fallback, in case the client is not injected + +/* eslint-disable camelcase */ + +var Client = // eslint-disable-next-line no-nested-ternary +typeof __webpack_dev_server_client__ !== "undefined" ? typeof __webpack_dev_server_client__.default !== "undefined" ? __webpack_dev_server_client__.default : __webpack_dev_server_client__ : _clients_WebSocketClient_js__WEBPACK_IMPORTED_MODULE_0__["default"]; +/* eslint-enable camelcase */ + +var retries = 0; +var maxRetries = 10; // Initialized client is exported so external consumers can utilize the same instance +// It is mutable to enforce singleton +// eslint-disable-next-line import/no-mutable-exports + +var client = null; +/** + * @param {string} url + * @param {{ [handler: string]: (data?: any, params?: any) => any }} handlers + * @param {number} [reconnect] + */ + +var socket = function initSocket(url, handlers, reconnect) { + client = new Client(url); + client.onOpen(function () { + retries = 0; + + if (typeof reconnect !== "undefined") { + maxRetries = reconnect; + } + }); + client.onClose(function () { + if (retries === 0) { + handlers.close(); + } // Try to reconnect. + + + client = null; // After 10 retries stop trying, to prevent logspam. + + if (retries < maxRetries) { + // Exponentially increase timeout to reconnect. + // Respectfully copied from the package `got`. + // eslint-disable-next-line no-restricted-properties + var retryInMs = 1000 * Math.pow(2, retries) + Math.random() * 100; + retries += 1; + _utils_log_js__WEBPACK_IMPORTED_MODULE_1__.log.info("Trying to reconnect..."); + setTimeout(function () { + socket(url, handlers, reconnect); + }, retryInMs); + } + }); + client.onMessage( + /** + * @param {any} data + */ + function (data) { + var message = JSON.parse(data); + + if (handlers[message.type]) { + handlers[message.type](message.data, message.params); + } + }); +}; + +/* harmony default export */ __webpack_exports__["default"] = (socket); + +/***/ }), + +/***/ "./node_modules/webpack-dev-server/client/utils/createSocketURL.js": +/*!*************************************************************************!*\ + !*** ./node_modules/webpack-dev-server/client/utils/createSocketURL.js ***! + \*************************************************************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/** + * @param {{ protocol?: string, auth?: string, hostname?: string, port?: string, pathname?: string, search?: string, hash?: string, slashes?: boolean }} objURL + * @returns {string} + */ +function format(objURL) { + var protocol = objURL.protocol || ""; + + if (protocol && protocol.substr(-1) !== ":") { + protocol += ":"; + } + + var auth = objURL.auth || ""; + + if (auth) { + auth = encodeURIComponent(auth); + auth = auth.replace(/%3A/i, ":"); + auth += "@"; + } + + var host = ""; + + if (objURL.hostname) { + host = auth + (objURL.hostname.indexOf(":") === -1 ? objURL.hostname : "[".concat(objURL.hostname, "]")); + + if (objURL.port) { + host += ":".concat(objURL.port); + } + } + + var pathname = objURL.pathname || ""; + + if (objURL.slashes) { + host = "//".concat(host || ""); + + if (pathname && pathname.charAt(0) !== "/") { + pathname = "/".concat(pathname); + } + } else if (!host) { + host = ""; + } + + var search = objURL.search || ""; + + if (search && search.charAt(0) !== "?") { + search = "?".concat(search); + } + + var hash = objURL.hash || ""; + + if (hash && hash.charAt(0) !== "#") { + hash = "#".concat(hash); + } + + pathname = pathname.replace(/[?#]/g, + /** + * @param {string} match + * @returns {string} + */ + function (match) { + return encodeURIComponent(match); + }); + search = search.replace("#", "%23"); + return "".concat(protocol).concat(host).concat(pathname).concat(search).concat(hash); +} +/** + * @param {URL & { fromCurrentScript?: boolean }} parsedURL + * @returns {string} + */ + + +function createSocketURL(parsedURL) { + var hostname = parsedURL.hostname; // Node.js module parses it as `::` + // `new URL(urlString, [baseURLString])` parses it as '[::]' + + var isInAddrAny = hostname === "0.0.0.0" || hostname === "::" || hostname === "[::]"; // why do we need this check? + // hostname n/a for file protocol (example, when using electron, ionic) + // see: https://github.com/webpack/webpack-dev-server/pull/384 + + if (isInAddrAny && self.location.hostname && self.location.protocol.indexOf("http") === 0) { + hostname = self.location.hostname; + } + + var socketURLProtocol = parsedURL.protocol || self.location.protocol; // When https is used in the app, secure web sockets are always necessary because the browser doesn't accept non-secure web sockets. + + if (socketURLProtocol === "auto:" || hostname && isInAddrAny && self.location.protocol === "https:") { + socketURLProtocol = self.location.protocol; + } + + socketURLProtocol = socketURLProtocol.replace(/^(?:http|.+-extension|file)/i, "ws"); + var socketURLAuth = ""; // `new URL(urlString, [baseURLstring])` doesn't have `auth` property + // Parse authentication credentials in case we need them + + if (parsedURL.username) { + socketURLAuth = parsedURL.username; // Since HTTP basic authentication does not allow empty username, + // we only include password if the username is not empty. + + if (parsedURL.password) { + // Result: : + socketURLAuth = socketURLAuth.concat(":", parsedURL.password); + } + } // In case the host is a raw IPv6 address, it can be enclosed in + // the brackets as the brackets are needed in the final URL string. + // Need to remove those as url.format blindly adds its own set of brackets + // if the host string contains colons. That would lead to non-working + // double brackets (e.g. [[::]]) host + // + // All of these web socket url params are optionally passed in through resourceQuery, + // so we need to fall back to the default if they are not provided + + + var socketURLHostname = (hostname || self.location.hostname || "localhost").replace(/^\[(.*)\]$/, "$1"); + var socketURLPort = parsedURL.port; + + if (!socketURLPort || socketURLPort === "0") { + socketURLPort = self.location.port; + } // If path is provided it'll be passed in via the resourceQuery as a + // query param so it has to be parsed out of the querystring in order for the + // client to open the socket to the correct location. + + + var socketURLPathname = "/ws"; + + if (parsedURL.pathname && !parsedURL.fromCurrentScript) { + socketURLPathname = parsedURL.pathname; + } + + return format({ + protocol: socketURLProtocol, + auth: socketURLAuth, + hostname: socketURLHostname, + port: socketURLPort, + pathname: socketURLPathname, + slashes: true + }); +} + +/* harmony default export */ __webpack_exports__["default"] = (createSocketURL); + +/***/ }), + +/***/ "./node_modules/webpack-dev-server/client/utils/getCurrentScriptSource.js": +/*!********************************************************************************!*\ + !*** ./node_modules/webpack-dev-server/client/utils/getCurrentScriptSource.js ***! + \********************************************************************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/** + * @returns {string} + */ +function getCurrentScriptSource() { + // `document.currentScript` is the most accurate way to find the current script, + // but is not supported in all browsers. + if (document.currentScript) { + return document.currentScript.getAttribute("src"); + } // Fallback to getting all scripts running in the document. + + + var scriptElements = document.scripts || []; + var scriptElementsWithSrc = Array.prototype.filter.call(scriptElements, function (element) { + return element.getAttribute("src"); + }); + + if (scriptElementsWithSrc.length > 0) { + var currentScript = scriptElementsWithSrc[scriptElementsWithSrc.length - 1]; + return currentScript.getAttribute("src"); + } // Fail as there was no script to use. + + + throw new Error("[webpack-dev-server] Failed to get current script source."); +} + +/* harmony default export */ __webpack_exports__["default"] = (getCurrentScriptSource); + +/***/ }), + +/***/ "./node_modules/webpack-dev-server/client/utils/log.js": +/*!*************************************************************!*\ + !*** ./node_modules/webpack-dev-server/client/utils/log.js ***! + \*************************************************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "log": function() { return /* binding */ log; }, +/* harmony export */ "setLogLevel": function() { return /* binding */ setLogLevel; } +/* harmony export */ }); +/* harmony import */ var _modules_logger_index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/logger/index.js */ "./node_modules/webpack-dev-server/client/modules/logger/index.js"); +/* harmony import */ var _modules_logger_index_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_modules_logger_index_js__WEBPACK_IMPORTED_MODULE_0__); + +var name = "webpack-dev-server"; // default level is set on the client side, so it does not need +// to be set by the CLI or API + +var defaultLevel = "info"; // options new options, merge with old options + +/** + * @param {false | true | "none" | "error" | "warn" | "info" | "log" | "verbose"} level + * @returns {void} + */ + +function setLogLevel(level) { + _modules_logger_index_js__WEBPACK_IMPORTED_MODULE_0___default().configureDefaultLogger({ + level: level + }); +} + +setLogLevel(defaultLevel); +var log = _modules_logger_index_js__WEBPACK_IMPORTED_MODULE_0___default().getLogger(name); + + +/***/ }), + +/***/ "./node_modules/webpack-dev-server/client/utils/parseURL.js": +/*!******************************************************************!*\ + !*** ./node_modules/webpack-dev-server/client/utils/parseURL.js ***! + \******************************************************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _getCurrentScriptSource_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getCurrentScriptSource.js */ "./node_modules/webpack-dev-server/client/utils/getCurrentScriptSource.js"); + +/** + * @param {string} resourceQuery + * @returns {{ [key: string]: string | boolean }} + */ + +function parseURL(resourceQuery) { + /** @type {{ [key: string]: string }} */ + var options = {}; + + if (typeof resourceQuery === "string" && resourceQuery !== "") { + var searchParams = resourceQuery.slice(1).split("&"); + + for (var i = 0; i < searchParams.length; i++) { + var pair = searchParams[i].split("="); + options[pair[0]] = decodeURIComponent(pair[1]); + } + } else { + // Else, get the url from the ', // italic - '4': '', // underscore - '8': 'display:none', // hidden - '9': '' // delete -} -var _closeTags = { - '23': '', // reset italic - '24': '', // reset underscore - '29': '' // reset delete -} - -;[0, 21, 22, 27, 28, 39, 49].forEach(function (n) { - _closeTags[n] = '' -}) - -/** - * Converts text with ANSI color codes to HTML markup. - * @param {String} text - * @returns {*} - */ -function ansiHTML (text) { - // Returns the text if the string has no ANSI escape code. - if (!_regANSI.test(text)) { - return text - } - - // Cache opened sequence. - var ansiCodes = [] - // Replace with markup. - var ret = text.replace(/\033\[(\d+)m/g, function (match, seq) { - var ot = _openTags[seq] - if (ot) { - // If current sequence has been opened, close it. - if (!!~ansiCodes.indexOf(seq)) { // eslint-disable-line no-extra-boolean-cast - ansiCodes.pop() - return '' - } - // Open tag. - ansiCodes.push(seq) - return ot[0] === '<' ? ot : '' - } - - var ct = _closeTags[seq] - if (ct) { - // Pop sequence - ansiCodes.pop() - return ct - } - return '' - }) - - // Make sure tags are closed. - var l = ansiCodes.length - ;(l > 0) && (ret += Array(l + 1).join('')) - - return ret -} - -/** - * Customize colors. - * @param {Object} colors reference to _defColors - */ -ansiHTML.setColors = function (colors) { - if (typeof colors !== 'object') { - throw new Error('`colors` parameter must be an Object.') - } - - var _finalColors = {} - for (var key in _defColors) { - var hex = colors.hasOwnProperty(key) ? colors[key] : null - if (!hex) { - _finalColors[key] = _defColors[key] - continue - } - if ('reset' === key) { - if (typeof hex === 'string') { - hex = [hex] - } - if (!Array.isArray(hex) || hex.length === 0 || hex.some(function (h) { - return typeof h !== 'string' - })) { - throw new Error('The value of `' + key + '` property must be an Array and each item could only be a hex string, e.g.: FF0000') - } - var defHexColor = _defColors[key] - if (!hex[0]) { - hex[0] = defHexColor[0] - } - if (hex.length === 1 || !hex[1]) { - hex = [hex[0]] - hex.push(defHexColor[1]) - } - - hex = hex.slice(0, 2) - } else if (typeof hex !== 'string') { - throw new Error('The value of `' + key + '` property must be a hex string, e.g.: FF0000') - } - _finalColors[key] = hex - } - _setTags(_finalColors) -} - -/** - * Reset colors. - */ -ansiHTML.reset = function () { - _setTags(_defColors) -} - -/** - * Expose tags, including open and close. - * @type {Object} - */ -ansiHTML.tags = {} - -if (Object.defineProperty) { - Object.defineProperty(ansiHTML.tags, 'open', { - get: function () { return _openTags } - }) - Object.defineProperty(ansiHTML.tags, 'close', { - get: function () { return _closeTags } - }) -} else { - ansiHTML.tags.open = _openTags - ansiHTML.tags.close = _closeTags -} - -function _setTags (colors) { - // reset all - _openTags['0'] = 'font-weight:normal;opacity:1;color:#' + colors.reset[0] + ';background:#' + colors.reset[1] - // inverse - _openTags['7'] = 'color:#' + colors.reset[1] + ';background:#' + colors.reset[0] - // dark grey - _openTags['90'] = 'color:#' + colors.darkgrey - - for (var code in _styles) { - var color = _styles[code] - var oriColor = colors[color] || '000' - _openTags[code] = 'color:#' + oriColor - code = parseInt(code) - _openTags[(code + 10).toString()] = 'background:#' + oriColor - } -} - -ansiHTML.reset() - - -/***/ }), - -/***/ "./src/DistortableCollection.js": -/*!**************************************!*\ - !*** ./src/DistortableCollection.js ***! - \**************************************/ -/***/ (function() { - -var arr = []; -L.DistortableCollection = L.FeatureGroup.extend({ - options: { - editable: true, - exportOpts: { - exportStartUrl: '//export.mapknitter.org/export', - statusUrl: '//export.mapknitter.org', - exportUrl: 'http://export.mapknitter.org/' - } - }, - initialize: function initialize(options) { - L.setOptions(this, options); - L.FeatureGroup.prototype.initialize.call(this, options); - L.Utils.initTranslation.call(this); - this.editable = this.options.editable; - }, - onAdd: function onAdd(map) { - L.FeatureGroup.prototype.onAdd.call(this, map); - this._map = map; - - if (this.editable) { - this.editing.enable(); - } - /** - * although we have a DistortableCollection.Edit class that handles collection events to keep our code managable, - * events that need to be added on individual images are kept here to do so through `layeradd`. - */ - - - this.on('layeradd', this._addEvents, this); - this.on('layerremove', this._removeEvents, this); - }, - onRemove: function onRemove() { - if (this.editing) { - this.editing.disable(); - } - - this.off('layeradd', this._addEvents, this); - this.off('layerremove', this._removeEvents, this); - }, - _addEvents: function _addEvents(e) { - var layer = e.layer; - L.DomEvent.on(layer, { - dragstart: this._dragStartMultiple, - drag: this._dragMultiple - }, this); - L.DomEvent.on(layer.getElement(), { - mousedown: this._deselectOthers, - - /* Enable longpress for multi select for touch devices. */ - contextmenu: this._longPressMultiSelect - }, this); - }, - _removeEvents: function _removeEvents(e) { - var layer = e.layer; - L.DomEvent.off(layer, { - dragstart: this._dragStartMultiple, - drag: this._dragMultiple - }, this); - L.DomEvent.off(layer.getElement(), { - mousedown: this._deselectOthers, - contextmenu: this._longPressMultiSelect - }, this); - }, - _longPressMultiSelect: function _longPressMultiSelect(e) { - var _this = this; - - if (!this.editable) { - return; - } - - e.preventDefault(); - this.eachLayer(function (layer) { - var edit = layer.editing; - - if (layer.getElement() === e.target && edit.enabled()) { - L.DomUtil.toggleClass(layer.getElement(), 'collected'); - - if (_this.anyCollected()) { - layer.deselect(); - - _this.editing._addToolbar(); - } else { - _this.editing._removeToolbar(); - } - } - }); - }, - isCollected: function isCollected(overlay) { - return L.DomUtil.hasClass(overlay.getElement(), 'collected'); - }, - anyCollected: function anyCollected() { - var layerArr = this.getLayers(); - return layerArr.some(this.isCollected.bind(this)); - }, - _toggleCollected: function _toggleCollected(e, layer) { - if (e.shiftKey) { - /* conditional prevents disabled images from flickering multi-select mode */ - if (layer.editing.enabled()) { - L.DomUtil.toggleClass(e.target, 'collected'); // re-order layers by _leaflet_id to match their display order in UI - // add new layer to right position and avoid repitition - - var newArr = arr.every(function (each) { - return each._leaflet_id !== layer._leaflet_id; - }); - - if (newArr) { - arr.push(layer); - } else { - arr.splice(arr.indexOf(layer), 1); - } - } - } - - if (this.anyCollected()) { - layer.deselect(); - } else { - this.editing._removeToolbar(); - } - }, - _deselectOthers: function _deselectOthers(e) { - var _this2 = this; - - if (!this.editable) { - return; - } - - this.eachLayer(function (layer) { - if (layer.getElement() !== e.target) { - layer.deselect(); - } else { - _this2._toggleCollected(e, layer); - } - }); - - if (e) { - L.DomEvent.stopPropagation(e); - } - }, - _dragStartMultiple: function _dragStartMultiple(e) { - var overlay = e.target; - var map = this._map; - var i; - - if (!this.isCollected(overlay)) { - return; - } - - this.eachLayer(function (layer) { - layer._dragStartPoints = {}; - layer.deselect(); - - for (i = 0; i < 4; i++) { - var c = layer.getCorner(i); - layer._dragStartPoints[i] = map.latLngToLayerPoint(c); - } - }); - }, - _dragMultiple: function _dragMultiple(e) { - var overlay = e.target; - var map = this._map; - - if (!this.isCollected(overlay)) { - return; - } - - var topLeft = map.latLngToLayerPoint(overlay.getCorner(0)); - - var delta = overlay._dragStartPoints[0].subtract(topLeft); - - this._updateCollectionFromPoints(delta, overlay); - }, - _toRemove: function _toRemove() { - var _this3 = this; - - var layerArr = this.getLayers(); - return layerArr.filter(function (layer) { - var mode = layer.editing._mode; - return _this3.isCollected(layer) && mode !== 'lock'; - }); - }, - _toMove: function _toMove(overlay) { - var _this4 = this; - - var layerArr = this.getLayers(); - return layerArr.filter(function (layer) { - var mode = layer.editing._mode; - return layer !== overlay && _this4.isCollected(layer) && mode !== 'lock'; - }); - }, - _updateCollectionFromPoints: function _updateCollectionFromPoints(delta, overlay) { - var layersToMove = this._toMove(overlay); - - var p = new L.Transformation(1, -delta.x, 1, -delta.y); - var i; - layersToMove.forEach(function (layer) { - var movedPoints = {}; - - for (i = 0; i < 4; i++) { - movedPoints[i] = p.transform(layer._dragStartPoints[i]); - } - - layer.setCornersFromPoints(movedPoints); - }); - }, - _getAvgCmPerPixel: function _getAvgCmPerPixel(imgs) { - var reduce = imgs.reduce(function (sum, img) { - return sum + img.cm_per_pixel; - }, 0); - return reduce / imgs.length; - }, - generateExportJson: function generateExportJson() { - var json = {}; - json.images = []; - this.eachLayer(function (layer) { - if (this.isCollected(layer)) { - var sections = layer._image.src.split('/'); - - var filename = sections[sections.length - 1]; - var zc = layer.getCorners(); - var corners = [{ - lat: zc[0].lat, - lon: zc[0].lng - }, { - lat: zc[1].lat, - lon: zc[1].lng - }, { - lat: zc[3].lat, - lon: zc[3].lng - }, { - lat: zc[2].lat, - lon: zc[2].lng - }]; - json.images.push({ - id: layer._leaflet_id, - src: layer._image.src, - width: layer._image.width, - height: layer._image.height, - image_file_name: filename, - nodes: corners, - cm_per_pixel: L.ImageUtil.getCmPerPixel(layer) - }); - } - }, this); - json.images = json.images.reverse(); - json.avg_cm_per_pixel = this._getAvgCmPerPixel(json.images); - return json; - } -}); - -L.distortableCollection = function (id, options) { - return new L.DistortableCollection(id, options); -}; - -/***/ }), - -/***/ "./src/DistortableImageOverlay.js": -/*!****************************************!*\ - !*** ./src/DistortableImageOverlay.js ***! - \****************************************/ -/***/ (function() { - -L.DistortableImageOverlay = L.ImageOverlay.extend({ - options: { - height: 200, - crossOrigin: true, - // todo: find ideal number to prevent distortions during RotateScale, and make it dynamic (remove hardcoding) - edgeMinWidth: 50, - editable: true, - mode: 'distort', - selected: false, - // SEGUN ------------------------------------------------------------------------------------------------------------------------------ - interactive: true, - tooltipText: 'Unknow image' // default tooltipText - // SEGUN ------------------------------------------------------------------------------------------------------------------------------ - - }, - initialize: function initialize(url, options) { - L.setOptions(this, options); - L.Utils.initTranslation.call(this); - this.edgeMinWidth = this.options.edgeMinWidth; - this.editable = this.options.editable; - this._selected = this.options.selected; - this._url = url; - this.rotation = {}; // SEGUN ------------------------------------------------------------------------------------------------------------------------------ - - this.interactive = this.options.interactive; - this.tooltipText = options.tooltipText; // SEGUN ------------------------------------------------------------------------------------------------------------------------------ - }, - onAdd: function onAdd(map) { - var _this = this; - - this._map = map; - - if (!this.getElement()) { - this._initImage(); - } - - map.on('viewreset', this._reset, this); - - if (this.options.corners) { - this._corners = this.options.corners; - - if (map.options.zoomAnimation && L.Browser.any3d) { - map.on('zoomanim', this._animateZoom, this); - } - } // Have to wait for the image to load because need to access its w/h - - - L.DomEvent.on(this.getElement(), 'load', function () { - _this.getPane().appendChild(_this.getElement()); - - _this._initImageDimensions(); - - if (_this.options.rotation) { - var units = _this.options.rotation.deg >= 0 ? 'deg' : 'rad'; - - _this.setAngle(_this.options.rotation[units], units); - } else { - _this.rotation = { - deg: 0, - rad: 0 - }; - - _this._reset(); - } - /* Initialize default corners if not already set */ - - - if (!_this._corners) { - if (map.options.zoomAnimation && L.Browser.any3d) { - map.on('zoomanim', _this._animateZoom, _this); - } - } - /** if there is a featureGroup, only its editable option matters */ - - - var eventParents = _this._eventParents; - - if (eventParents) { - _this.eP = eventParents[Object.keys(eventParents)[0]]; - - if (_this.eP.editable) { - _this.editing.enable(); - } - } else { - if (_this.editable) { - _this.editing.enable(); - } - - _this.eP = null; - } - }); - L.DomEvent.on(this.getElement(), 'click', this.select, this); - L.DomEvent.on(map, { - singleclickon: this._singleClickListeners, - singleclickoff: this._resetClickListeners, - singleclick: this._singleClick - }, this); - /** - * custom events fired from DoubleClickLabels.js. Used to differentiate - * single / dblclick to not deselect images on map dblclick. - */ - - if (!(map.doubleClickZoom.enabled() || map.doubleClickLabels.enabled())) { - L.DomEvent.on(map, 'click', this.deselect, this); - } - - this.fire('add'); // SEGUN ------------------------------------------------------------------------------------------------------------------------------ - - L.DomEvent.on(this.getElement(), 'mouseover mousemove', this._activateTooltip, this); - L.DomEvent.on(this.getElement(), 'mouseout', this._closeTooltip, this); - }, - onRemove: function onRemove(map) { - L.DomEvent.off(this.getElement(), 'click', this.select, this); - L.DomEvent.off(map, { - singleclickon: this._singleClickListeners, - singleclickoff: this._resetClickListeners, - singleclick: this._singleClick - }, this); - L.DomEvent.off(map, 'click', this.deselect, this); - - if (this.editing) { - this.editing.disable(); - } - - this.fire('remove'); - L.ImageOverlay.prototype.onRemove.call(this, map); // SEGUN ----------------------------------------------------------------------------------------------------------------------------- - - L.DomEvent.off(this.getElement(), 'mouseover', this._deactivateTooltip, this); // ENDS ------------------------------------------------------------------------------------------------------------------------------ - }, - _initImageDimensions: function _initImageDimensions() { - var map = this._map; - var originalImageWidth = L.DomUtil.getStyle(this.getElement(), 'width'); - var originalImageHeight = L.DomUtil.getStyle(this.getElement(), 'height'); - var aspectRatio = parseInt(originalImageWidth) / parseInt(originalImageHeight); - var imageHeight = this.options.height; - var imageWidth = parseInt(aspectRatio * imageHeight); - var center = map.project(map.getCenter()); - var offset = L.point(imageWidth, imageHeight).divideBy(2); - - if (this.options.corners) { - this._corners = this.options.corners; - } else { - this._corners = [map.unproject(center.subtract(offset)), map.unproject(center.add(L.point(offset.x, -offset.y))), map.unproject(center.add(L.point(-offset.x, offset.y))), map.unproject(center.add(offset))]; - } - - this._initialDimensions = { - 'center': center, - 'offset': offset, - 'zoom': map.getZoom() - }; - this.setBounds(L.latLngBounds(this.getCorners())); - }, - _singleClick: function _singleClick(e) { - if (e.type === 'singleclick') { - this.deselect(); - } else { - return; - } - }, - _singleClickListeners: function _singleClickListeners() { - var map = this._map; - L.DomEvent.off(map, 'click', this.deselect, this); - L.DomEvent.on(map, 'singleclick', this.deselect, this); - }, - _resetClickListeners: function _resetClickListeners() { - var map = this._map; - L.DomEvent.on(map, 'click', this.deselect, this); - L.DomEvent.off(map, 'singleclick', this.deselect, this); - }, - isSelected: function isSelected() { - return this._selected; // this._selected - }, - deselect: function deselect() { - var edit = this.editing; - - if (!edit.enabled()) { - return; - } - - edit._removeToolbar(); - - edit._hideMarkers(); - - this._selected = false; - this.fire('deselect'); - return this; - }, - select: function select(e) { - var edit = this.editing; - var eP = this.eP; - - if (!edit.enabled()) { - return; - } - - if (e) { - L.DomEvent.stopPropagation(e); - } // this ensures deselection of all other images, allowing us to keep collection group optional - - - this._programmaticGrouping(); - - this._selected = true; - - edit._addToolbar(); - - edit._showMarkers(); - - this.fire('select'); // we run the selection logic 1st anyway because the collection group's _addToolbar method depends on it - - if (eP && eP.anyCollected()) { - this.deselect(); - return; - } - - return this; - }, - _programmaticGrouping: function _programmaticGrouping() { - this._map.eachLayer(function (layer) { - if (layer instanceof L.DistortableImageOverlay) { - layer.deselect(); - } - }); - }, - setCorner: function setCorner(corner, latlng) { - var edit = this.editing; - this._corners[corner] = latlng; - this.setBounds(L.latLngBounds(this.getCorners())); - this.fire('update'); - - if (edit.toolbar && edit.toolbar instanceof L.DistortableImage.PopupBar) { - edit._updateToolbarPos(); - } - - this.edited = true; - return this; - }, - _cornerExceedsMapLats: function _cornerExceedsMapLats(zoom, corner, map) { - if (map.options.crs.Simple == L.CRS.Simple) { - return false; - } else { - var exceedsTop; - var exceedsBottom; - - if (zoom === 0) { - exceedsTop = map.project(corner).y < 2; - exceedsBottom = map.project(corner).y >= 255; - } else { - exceedsTop = map.project(corner).y / zoom < 2; - exceedsBottom = map.project(corner).y / Math.pow(2, zoom) >= 255; - } - - return exceedsTop || exceedsBottom; - } - }, - // SEGUN ------------------------------------------------------------------------------------------------------------------------------- - // Work in progress on this function - _activateTooltip: function _activateTooltip(ev) { - var index = 0; - var xAxis = []; // stores previous values of x coordinate - - var yAxis = []; // stores previous values of y coordinate, may be needed later - // let newPosX = 0; - - if (!this._selected) { - // Consider using "if (!this.selected)" instead - // console.log('mouseOVER_DONE/mouseMOVE_DONE-TOOLTIP-ACTIVATED'); // To be deleted - // console.log('x-axis:', ev.x); // To be deleted - // console.log('y-axis:', ev.y); // To be deleted - xAxis[index] = ev.x; - yAxis[index] = ev.y; // May be needed later - // newPosX = xAxis[index-1] - xAxis[index]; // - works but not perfect - // newPosX = (xAxis[index-1] - xAxis[index]) - ((xAxis[index])/4); // - better than above but not perfect - // newPosX =(xAxis[index-1] - xAxis[index]) - (xAxis[index] - this.imageWidth); // - works but no perfect - - ++index; - this.bindTooltip(this.tooltipText, { - sticky: true, - direction: 'top', - offset: L.point([ev.x - 700, ev.y - 500]) - }).openTooltip(); // POC only, work still in progress on this - hardcoded, works not perfect yet - } - }, - _closeTooltip: function _closeTooltip() { - // console.log('mouseOUT_DONE-TOOLTIP-CLOSED'); // To be deleted - this.closeTooltip(); - }, - _deactivateTooltip: function _deactivateTooltip() { - // console.log('MouseoverENDED & mousemoveENDED-TOOLTIP-DEACTIVATED'); - To be deleted - this.unbindTooltip(); - }, - // ENDS ------------------------------------------------------------------------------------------------------------------------------ - setCorners: function setCorners(latlngObj) { - var map = this._map; - var zoom = map.getZoom(); - var edit = this.editing; - var i = 0; // this is to fix https://github.com/publiclab/Leaflet.DistortableImage/issues/402 - - for (var k in latlngObj) { - if (this._cornerExceedsMapLats(zoom, latlngObj[k], map)) { - // calling reset / update w/ the same corners bc it prevents a marker flicker for rotate - this.setBounds(L.latLngBounds(this.getCorners())); - this.fire('update'); - return; - } - } - - for (var _k in latlngObj) { - this._corners[i] = latlngObj[_k]; - i += 1; - } - - this.setBounds(L.latLngBounds(this.getCorners())); - this.fire('update'); - - if (edit.toolbar && edit.toolbar instanceof L.DistortableImage.PopupBar) { - edit._updateToolbarPos(); - } - - this.edited = true; - return this; - }, - setCornersFromPoints: function setCornersFromPoints(pointsObj) { - var map = this._map; - var zoom = map.getZoom(); - var edit = this.editing; - var i = 0; - - for (var k in pointsObj) { - var corner = map.layerPointToLatLng(pointsObj[k]); - - if (this._cornerExceedsMapLats(zoom, corner, map)) { - // calling reset / update w/ the same corners bc it prevents a marker flicker for rotate - this.setBounds(L.latLngBounds(this.getCorners())); - this.fire('update'); - return; - } - } - - for (var _k2 in pointsObj) { - this._corners[i] = map.layerPointToLatLng(pointsObj[_k2]); - i += 1; - } - - this.setBounds(L.latLngBounds(this.getCorners())); - this.fire('update'); - - if (edit.toolbar && edit.toolbar instanceof L.DistortableImage.PopupBar) { - edit._updateToolbarPos(); - } - - this.edited = true; - return this; - }, - scaleBy: function scaleBy(scale) { - var map = this._map; - var center = map.project(this.getCenter()); - var i; - var p; - var scaledCorners = {}; - - if (scale === 0) { - return; - } - - for (i = 0; i < 4; i++) { - p = map.project(this.getCorner(i)).subtract(center).multiplyBy(scale).add(center); - scaledCorners[i] = map.unproject(p); - } - - this.setCorners(scaledCorners); - return this; - }, - getAngle: function getAngle() { - var unit = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'deg'; - var matrix = this.getElement().style[L.DomUtil.TRANSFORM].split('matrix3d')[1].slice(1, -1).split(','); - var row0x = matrix[0]; - var row0y = matrix[1]; - var row1x = matrix[4]; - var row1y = matrix[5]; - var determinant = row0x * row1y - row0y * row1x; - var angle = L.TrigUtil.calcAngle(row0x, row0y, 'rad'); - - if (determinant < 0) { - angle += angle < 0 ? Math.PI : -Math.PI; - } - - if (angle < 0) { - angle = 2 * Math.PI + angle; - } - - return unit === 'deg' ? Math.round(L.TrigUtil.radiansToDegrees(angle)) : L.Util.formatNum(angle, 2); - }, - setAngle: function setAngle(angle) { - var unit = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'deg'; - var currentAngle = this.getAngle(unit); - var angleToRotateBy = angle - currentAngle; - this.rotateBy(angleToRotateBy, unit); - return this; - }, - rotateBy: function rotateBy(angle) { - var unit = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'deg'; - var map = this._map; - var center = map.project(this.getCenter()); - var corners = {}; - var i; - var p; - var q; - - if (unit === 'deg') { - angle = L.TrigUtil.degreesToRadians(angle); - } - - for (i = 0; i < 4; i++) { - p = map.project(this.getCorner(i)).subtract(center); - q = L.point(Math.cos(angle) * p.x - Math.sin(angle) * p.y, Math.sin(angle) * p.x + Math.cos(angle) * p.y); - corners[i] = map.unproject(q.add(center)); - } - - this.setCorners(corners); - return this; - }, - dragBy: function dragBy(formerPoint, newPoint) { - var map = this._map; - var i; - var p; - var transCorners = {}; - var delta = map.project(formerPoint).subtract(map.project(newPoint)); - - for (i = 0; i < 4; i++) { - p = map.project(this.getCorner(i)).subtract(delta); - transCorners[i] = map.unproject(p); - } - - this.setCorners(transCorners); - }, - restore: function restore() { - var map = this._map; - var center = this._initialDimensions.center; - var offset = this._initialDimensions.offset; - var zoom = this._initialDimensions.zoom; - var corners = [center.subtract(offset), center.add(L.point(offset.x, -offset.y)), center.add(L.point(-offset.x, offset.y)), center.add(offset)]; - - for (var i = 0; i < 4; i++) { - if (!map.unproject(corners[i], zoom).equals(this.getCorner(i))) { - this.setCorner(i, map.unproject(corners[i], zoom)); - } - } - - this.edited = false; - this.fire('restore'); - return this; - }, - - /* Copied from Leaflet v0.7 https://github.com/Leaflet/Leaflet/blob/66282f14bcb180ec87d9818d9f3c9f75afd01b30/src/dom/DomUtil.js#L189-L199 */ - - /* since L.DomUtil.getTranslateString() is deprecated in Leaflet v1.0 */ - _getTranslateString: function _getTranslateString(point) { - // on WebKit browsers (Chrome/Safari/iOS Safari/Android) - // using translate3d instead of translate - // makes animation smoother as it ensures HW accel is used. - // Firefox 13 doesn't care - // (same speed either way), Opera 12 doesn't support translate3d - var is3d = L.Browser.webkit3d; - var open = 'translate' + (is3d ? '3d' : '') + '('; - var close = (is3d ? ',0' : '') + ')'; - return open + point.x + 'px,' + point.y + 'px' + close; - }, - _reset: function _reset() { - var map = this._map; - var image = this.getElement(); - var latLngToLayerPoint = L.bind(map.latLngToLayerPoint, map); - - var transformMatrix = this._calculateProjectiveTransform(latLngToLayerPoint); - - var topLeft = latLngToLayerPoint(this.getCorner(0)); - var warp = L.DomUtil.getMatrixString(transformMatrix); - - var translation = this._getTranslateString(topLeft); - /* See L.DomUtil.setPosition. Mainly for the purposes of L.Draggable. */ - - - image._leaflet_pos = topLeft; - image.style[L.DomUtil.TRANSFORM] = [translation, warp].join(' '); - /* Set origin to the upper-left corner rather than - * the center of the image, which is the default. - */ - - image.style[L.DomUtil.TRANSFORM + '-origin'] = '0 0 0'; - this.rotation.deg = this.getAngle(); - this.rotation.rad = this.getAngle('rad'); - }, - - /* - * Calculates the transform string that will be - * correct *at the end* of zooming. - * Leaflet then generates a CSS3 animation between the current transform and - * future transform which makes the transition appear smooth. - */ - _animateZoom: function _animateZoom(event) { - var map = this._map; - var image = this.getElement(); - - var latLngToNewLayerPoint = function latLngToNewLayerPoint(latlng) { - return map._latLngToNewLayerPoint(latlng, event.zoom, event.center); - }; - - var transformMatrix = this._calculateProjectiveTransform(latLngToNewLayerPoint); - - var topLeft = latLngToNewLayerPoint(this.getCorner(0)); - var warp = L.DomUtil.getMatrixString(transformMatrix); - - var translation = this._getTranslateString(topLeft); - /* See L.DomUtil.setPosition. Mainly for the purposes of L.Draggable. */ - - - image._leaflet_pos = topLeft; - image.style[L.DomUtil.TRANSFORM] = [translation, warp].join(' '); - }, - getCorners: function getCorners() { - return this._corners; - }, - getCorner: function getCorner(i) { - return this._corners[i]; - }, - // image (vertex) centroid calculation - getCenter: function getCenter() { - var map = this._map; - var reduce = this.getCorners().reduce(function (agg, corner) { - return agg.add(map.project(corner)); - }, L.point(0, 0)); - return map.unproject(reduce.divideBy(4)); - }, - _calculateProjectiveTransform: function _calculateProjectiveTransform(latLngToCartesian) { - /* Setting reasonable but made-up image defaults - * allow us to place images on the map before - * they've finished downloading. */ - var offset = latLngToCartesian(this.getCorner(0)); - var w = this.getElement().offsetWidth || 500; - var h = this.getElement().offsetHeight || 375; - var c = []; - var j; - /* Convert corners to container points (i.e. cartesian coordinates). */ - - for (j = 0; j < 4; j++) { - c.push(latLngToCartesian(this.getCorner(j))._subtract(offset)); - } - /* - * This matrix describes the action of - * the CSS transform on each corner of the image. - * It maps from the coordinate system centered - * at the upper left corner of the image - * to the region bounded by the latlngs in this._corners. - * For example: - * 0, 0, c[0].x, c[0].y - * says that the upper-left corner of the image - * maps to the first latlng in this._corners. - */ - - - return L.MatrixUtil.general2DProjection(0, 0, c[0].x, c[0].y, w, 0, c[1].x, c[1].y, 0, h, c[2].x, c[2].y, w, h, c[3].x, c[3].y); - } -}); - -L.distortableImageOverlay = function (id, options) { - // remove temp - return new L.DistortableImageOverlay(id, options); // remove temp -}; - -L.Map.addInitHook(function () { - if (!L.DomUtil.hasClass(this.getContainer(), 'ldi')) { - L.DomUtil.addClass(this.getContainer(), 'ldi'); - } -}); - -/***/ }), - -/***/ "./src/components/DistortableImage.Keymapper.js": -/*!******************************************************!*\ - !*** ./src/components/DistortableImage.Keymapper.js ***! - \******************************************************/ -/***/ (function() { - -var _this = this; - -L.DomUtil = L.DomUtil || {}; -L.DistortableImage = L.DistortableImage || {}; -L.distortableImage = L.DistortableImage; -L.DistortableImage.Keymapper = L.Handler.extend({ - options: { - position: 'topright' - }, - initialize: function initialize(map, options) { - this._map = map; - L.setOptions(this, options); - }, - addHooks: function addHooks() { - if (!this._keymapper) { - this._container = this._buildContainer(); - this._scrollWrapper = this._wrap(); - this._toggler = this._createButton(); - - this._setMapper(this._container, this._scrollWrapper, this._toggler); - - L.DomEvent.on(this._toggler, 'click', this._toggleKeymapper, this); - L.DomEvent.disableClickPropagation(this._container); - L.DomEvent.disableScrollPropagation(this._container); - } - }, - removeHooks: function removeHooks() { - if (this._keymapper) { - L.DomEvent.off(this._toggler, 'click', this._toggleKeymapper, this); - L.DomUtil.remove(this._toggler); - L.DomUtil.remove(this._scrollWrapper); - L.DomUtil.remove(this._container); - this._keymapper = false; - } - }, - _buildContainer: function _buildContainer() { - var container = L.DomUtil.create('div', 'ldi-keymapper-hide'); - container.setAttribute('id', 'ldi-keymapper'); - var divider = L.DomUtil.create('br', 'divider'); - container.appendChild(divider); - return container; - }, - _createButton: function _createButton() { - var toggler = L.DomUtil.create('a', ''); - toggler.innerHTML = L.IconUtil.create('keyboard_open'); - toggler.setAttribute('id', 'toggle-keymapper'); - toggler.setAttribute('href', '#'); - toggler.setAttribute('title', 'Show keymap'); // Will force screen readers like VoiceOver to read this as "Show keymap - button" - - toggler.setAttribute('role', 'button'); - toggler.setAttribute('aria-label', 'Show keymap'); - return toggler; - }, - _wrap: function _wrap() { - var wrap = L.DomUtil.create('div', ''); - wrap.setAttribute('id', 'keymapper-wrapper'); - wrap.style.display = 'none'; - return wrap; - }, - _setMapper: function _setMapper(container, wrap, button) { - this._keymapper = L.control({ - position: this.options.position - }); - - this._keymapper.onAdd = function () { - container.appendChild(wrap); - wrap.insertAdjacentHTML('beforeend', '' + '
' + - /* eslint-disable */ - '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '
Rotate Mode
R
RotateScale Mode
r
Scale Mode
s
Distort Mode
d
Drag Mode
D
Lock (Mode) / Unlock Image
l\xa0u
Stack up / down
q\xa0a
Add / Remove Image Border
b
Toggle Opacity
o
Deselect All
esc
Delete Image(s)
delete\xa0backspace
Export Image(s)
e
'); - /* eslint-enable */ - - container.appendChild(button); - return container; - }; - - this._keymapper.addTo(this._map); - }, - _toggleKeymapper: function _toggleKeymapper(e) { - e.preventDefault(); - this._container.className = this._container.className === 'ldi-keymapper leaflet-control' ? 'ldi-keymapper-hide leaflet-control' : 'ldi-keymapper leaflet-control'; - this._scrollWrapper.style.display = this._scrollWrapper.style.display === 'none' ? 'block' : 'none'; - this._toggler.innerHTML = this._toggler.innerHTML === 'close' ? L.IconUtil.create('keyboard_open') : 'close'; - L.IconUtil.toggleTitle(this._toggler, 'Show keymap', 'Hide keymap'); - L.DomUtil.toggleClass(this._toggler, 'close-icon'); - }, - _injectIconSet: function _injectIconSet() { - if (document.querySelector('#keymapper-iconset')) { - return; - } - - var el = L.DomUtil.create('div', ''); - el.id = 'keymapper-iconset'; - el.setAttribute('hidden', 'hidden'); - this._iconset = new L.KeymapperIconSet().render(); - el.innerHTML = this._iconset; - document.querySelector('.leaflet-control-container').appendChild(el); - } -}); -L.DistortableImage.Keymapper.addInitHook(function () { - L.DistortableImage.Keymapper.prototype._n = L.DistortableImage.Keymapper.prototype._n ? L.DistortableImage.Keymapper.prototype._n + 1 : 1; // dont enable keymapper for mobile - - if (L.DistortableImage.Keymapper.prototype._n === 1 && !L.Browser.mobile) { - _this.enable(); - - _this._injectIconSet(); - } -}); - -L.distortableImage.keymapper = function (map, options) { - return new L.DistortableImage.Keymapper(map, options); -}; - -/***/ }), - -/***/ "./src/edit/DistortableCollection.Edit.js": -/*!************************************************!*\ - !*** ./src/edit/DistortableCollection.Edit.js ***! - \************************************************/ -/***/ (function() { - -L.DistortableImage = L.DistortableImage || {}; // this class holds the keybindings and toolbar API for an image collection instance - -L.DistortableCollection.Edit = L.Handler.extend({ - options: { - keymap: L.distortableImage.group_action_map - }, - initialize: function initialize(group, options) { - this._group = group; - this._exportOpts = group.options.exportOpts; - L.setOptions(this, options); - L.distortableImage.group_action_map.Escape = '_decollectAll'; - }, - addHooks: function addHooks() { - var group = this._group; - var map = group._map; - this.editActions = this.options.actions; - this.runExporter = L.bind(L.Utils.getNestedVal(this, '_exportOpts', 'exporter') || this.startExport, this); - L.DomEvent.on(document, 'keydown', this._onKeyDown, this); - - if (!(map.doubleClickZoom.enabled() || map.doubleClickLabels.enabled())) { - L.DomEvent.on(map, 'click', this._decollectAll, this); - } - - L.DomEvent.on(map, { - singleclickon: this._singleClickListeners, - singleclickoff: this._resetClickListeners, - singleclick: this._singleClick, - boxcollectend: this._addCollections - }, this); - this._group.editable = true; - - this._group.eachLayer(function (layer) { - return layer.editing.enable(); - }); - }, - removeHooks: function removeHooks() { - var group = this._group; - var map = group._map; - L.DomEvent.off(document, 'keydown', this._onKeyDown, this); - - if (!(map.doubleClickZoom.enabled() || map.doubleClickLabels.enabled())) { - L.DomEvent.off(map, 'click', this._decollectAll, this); - } - - L.DomEvent.off(map, { - singleclickon: this._singleClickListeners, - singleclickoff: this._resetClickListeners, - singleclick: this._singleClick, - boxcollectend: this._addCollections - }, this); - - this._decollectAll(); - - this._group.editable = false; - - this._group.eachLayer(function (layer) { - return layer.editing.disable(); - }); - }, - enable: function enable() { - this._enabled = true; - this.addHooks(); - return this; - }, - disable: function disable() { - this._enabled = false; - this.removeHooks(); - return this; - }, - _onKeyDown: function _onKeyDown(e) { - var keymap = this.options.keymap; - var handlerName = keymap[e.key]; - - if (!this[handlerName]) { - return; - } - - if (this._group.anyCollected()) { - this[handlerName].call(this); - } - }, - _singleClick: function _singleClick(e) { - if (e.type === 'singleclick') { - this._decollectAll(e); - } else { - return; - } - }, - _singleClickListeners: function _singleClickListeners() { - var map = this._group._map; - L.DomEvent.off(map, 'click', this._decollectAll, this); - L.DomEvent.on(map, 'singleclick', this._decollectAll, this); - }, - _resetClickListeners: function _resetClickListeners() { - var map = this._group._map; - L.DomEvent.on(map, 'click', this._decollectAll, this); - L.DomEvent.off(map, 'singleclick', this._decollectAll, this); - }, - _decollectAll: function _decollectAll(e) { - var oe; - - if (e) { - oe = e.originalEvent; - } - /** - * prevents image deselection following the 'boxcollectend' event - note 'shift' must not be released until dragging is complete - * also prevents deselection following a click on a disabled img by differentiating it from the map - */ - - - if (oe && (oe.shiftKey || oe.target instanceof HTMLImageElement)) { - return; - } - - this._group.eachLayer(function (layer) { - L.DomUtil.removeClass(layer.getElement(), 'collected'); - layer.deselect(); - }); - - this._removeToolbar(); - - if (e) { - L.DomEvent.stopPropagation(e); - } - }, - _unlockGroup: function _unlockGroup() { - var _this = this; - - if (!this.hasTool(L.UnlockAction)) { - return; - } - - this._group.eachLayer(function (layer) { - if (_this._group.isCollected(layer)) { - var edit = layer.editing; - - edit._unlock(); // unlock updates the layer's handles; deselect to ensure they're hidden - - - layer.deselect(); - } - }); - }, - _lockGroup: function _lockGroup() { - var _this2 = this; - - if (!this.hasTool(L.LockAction)) { - return; - } - - this._group.eachLayer(function (layer) { - if (_this2._group.isCollected(layer)) { - var edit = layer.editing; - - edit._lock(); // map.addLayer also deselects the image, so we reselect here - - - L.DomUtil.addClass(layer.getElement(), 'collected'); - } - }); - }, - _addCollections: function _addCollections(e) { - var _this3 = this; - - var box = e.boxCollectBounds; - var map = this._group._map; - - this._group.eachLayer(function (layer) { - var edit = layer.editing; - - if (layer.isSelected()) { - layer.deselect(); - } - - var zoom = map.getZoom(); - var center = map.getCenter(); - var imgBounds = L.latLngBounds(layer.getCorner(2), layer.getCorner(1)); - imgBounds = map._latLngBoundsToNewLayerBounds(imgBounds, zoom, center); - - if (box.intersects(imgBounds) && edit.enabled()) { - if (!_this3.toolbar) { - _this3._addToolbar(); - } - - L.DomUtil.addClass(layer.getElement(), 'collected'); - } - }); - }, - _removeGroup: function _removeGroup(e) { - var _this4 = this; - - if (!this.hasTool(L.DeleteAction)) { - return; - } - - var layersToRemove = this._group._toRemove(); - - var n = layersToRemove.length; - - if (n === 0) { - return; - } - - var choice = L.DomUtil.confirmDeletes(n); - - if (choice) { - layersToRemove.forEach(function (layer) { - _this4._group.removeLayer(layer); - }); - - if (!this._group.anyCollected()) { - this._removeToolbar(); - } - } - - if (e) { - L.DomEvent.stopPropagation(e); - } - }, - cancelExport: function cancelExport() { - if (!this.customCollection) { - this._exportOpts.collection = undefined; - } - - clearInterval(this.updateInterval); - }, - _addToolbar: function _addToolbar() { - var group = this._group; - var map = group._map; - - if (group.options.suppressToolbar || this.toolbar) { - return; - } - - this.toolbar = L.distortableImage.controlBar({ - actions: this.editActions, - position: 'topleft' - }).addTo(map, group); - }, - _removeToolbar: function _removeToolbar() { - var map = this._group._map; - - if (this.toolbar) { - map.removeLayer(this.toolbar); - this.toolbar = false; - } else { - return false; - } - }, - hasTool: function hasTool(value) { - return this.editActions.some(function (action) { - return action === value; - }); - }, - addTool: function addTool(value) { - if (value.baseClass === 'leaflet-toolbar-icon' && !this.hasTool(value)) { - this._removeToolbar(); - - this.editActions.push(value); - - this._addToolbar(); - } - - return this; - }, - removeTool: function removeTool(value) { - var _this5 = this; - - this.editActions.some(function (item, idx) { - if (_this5.editActions[idx] === value) { - _this5._removeToolbar(); - - _this5.editActions.splice(idx, 1); - - _this5._addToolbar(); - - return true; - } else { - return false; - } - }); - return this; - }, - startExport: function startExport() { - var _this6 = this; - - if (!this.hasTool(L.ExportAction)) { - return; - } - - return new Promise(function (resolve) { - var opts = _this6._exportOpts; - opts.resolve = resolve; // allow resolving promise in user-defined functions, to stop spinner on completion - - var statusUrl; - _this6.updateInterval = null; // this may be overridden to update the UI to show export progress or completion - - var _defaultUpdater = function _defaultUpdater(data) { - data = JSON.parse(data); // optimization: fetch status directly from google storage: - - if (data.status_url) { - if (statusUrl !== data.status_url && data.status_url.match('.json')) { - // if (data.status_url && data.status_url.substr(0,1) === "/") { - // opts.statusUrl = opts.statusUrl + data.status_url; - // } else { - statusUrl = data.status_url; // } - } - - if (data.status === 'complete') { - clearInterval(_this6.updateInterval); - - if (!_this6.customCollection) { - _this6._exportOpts.collection = undefined; - } - - resolve(); - - if (data.jpg !== null) { - alert('Export succeeded. ' + opts.exportUrl + data.jpg); - } - } // TODO: update to clearInterval when status == "failed" if we update that in this file: - // https://github.com/publiclab/mapknitter-exporter/blob/main/lib/mapknitterExporter.rb - - - console.log(data); - } - }; // receives the URL of status.json, and starts running the updater to repeatedly fetch from status.json; - // this may be overridden to integrate with any UI - - - var _defaultHandleStatusRes = function _defaultHandleStatusRes(data) { - statusUrl = opts.statusUrl + data; // repeatedly fetch the status.json - - _this6.updateInterval = setInterval(function () { - var reqOpts = { - method: 'GET' - }; - var req = new Request("".concat(statusUrl, "?").concat(Date.now()), reqOpts); - fetch(req).then(function (res) { - if (res.ok) { - return res.text(); - } - }).then(opts.updater); - }, opts.frequency); - }; // initiate the export - - - var _defaultFetchStatusUrl = function _defaultFetchStatusUrl(mergedOpts) { - var form = new FormData(); - form.append('collection', JSON.stringify(mergedOpts.collection)); - form.append('scale', mergedOpts.scale); - form.append('upload', true); - var reqOpts = { - method: 'POST', - body: form - }; - var req = new Request(mergedOpts.exportStartUrl, reqOpts); - fetch(req).then(function (res) { - if (res.ok) { - return res.text(); - } - }).then(mergedOpts.handleStatusRes); - }; // If the user has passed collection property - - - _this6.customCollection = !!opts.collection; - - if (!_this6.customCollection) { - opts.collection = _this6._group.generateExportJson().images; - } - - opts.frequency = opts.frequency || 3000; - opts.scale = opts.scale || 100; // switch it to _getAvgCmPerPixel ! - - opts.updater = opts.updater || _defaultUpdater; - opts.handleStatusRes = opts.handleStatusRes || _defaultHandleStatusRes; - opts.fetchStatusUrl = opts.fetchStatusUrl || _defaultFetchStatusUrl; - opts.fetchStatusUrl(opts); - }); - } -}); - -L.distortableCollection.edit = function (group, options) { - return new L.DistortableCollection.Edit(group, options); -}; - -/***/ }), - -/***/ "./src/edit/DistortableImage.Edit.js": -/*!*******************************************!*\ - !*** ./src/edit/DistortableImage.Edit.js ***! - \*******************************************/ -/***/ (function() { - -L.DistortableImage = L.DistortableImage || {}; // holds the keybindings & toolbar API for an individual image instance - -L.DistortableImage.Edit = L.Handler.extend({ - options: { - opacity: 0.7, - outline: '1px solid red', - keymap: L.distortableImage.action_map - }, - initialize: function initialize(overlay, options) { - this._overlay = overlay; - this._toggledImage = false; - this._mode = overlay.options.mode; - this._transparent = false; - this._outlined = false; - L.setOptions(this, options); - L.distortableImage.action_map.Escape = '_deselect'; - }, - - /* Run on image selection. */ - addHooks: function addHooks() { - var overlay = this._overlay; - this.editActions = this.options.actions; - /* bring the selected image into view */ - - overlay.bringToFront(); - - this._initModes(); - - this._initHandles(); - - this._appendHandlesandDragable(); - - if (overlay.isSelected() && !overlay.options.suppressToolbar) { - this._addToolbar(); - } - - this.parentGroup = overlay.eP ? overlay.eP : false; - L.DomEvent.on(overlay.getElement(), { - dblclick: this.nextMode - }, this); - L.DomEvent.on(window, 'keydown', this._onKeyDown, this); - }, - - /* Run on image deselection. */ - removeHooks: function removeHooks() { - var overlay = this._overlay; - var eP = this.parentGroup; // First, check if dragging exists - it may be off due to locking - - this._disableDragging(); - - if (this.toolbar) { - this._removeToolbar(); - } - - for (var handle in this._handles) { - L.DomUtil.remove(handle); - } - /** - * ensures if you disable an image while it is multi-selected - * additional deselection logic is run - */ - - - if (L.DomUtil.hasClass(overlay.getElement(), 'collected')) { - L.DomUtil.removeClass(overlay.getElement(), 'collected'); - } - - if (eP && !eP.anyCollected() && eP.editing.toolbar) { - eP.editing._removeToolbar(); - } - - L.DomEvent.off(overlay.getElement(), { - dblclick: this.nextMode - }, this); - L.DomEvent.off(window, 'keydown', this._onKeyDown, this); - }, - disable: function disable() { - if (!this._enabled) { - return this; - } - - this._overlay.deselect(); - - this._enabled = false; - this.removeHooks(); - return this; - }, - _initModes: function _initModes() { - this._modes = {}; // passed from L.DistortablImage.PopupBar. If the mode is one - // of the current toolbar actions, adds it to this._modes - - for (var mode in L.DistortableImage.Edit.MODES) { - var action = L.DistortableImage.Edit.MODES[mode]; - - if (this.editActions.indexOf(action) !== -1) { - this._modes[mode] = action; - } - } // sets the current mode to the 1st available one if the one selected - // during initialization is not available - - - if (!this._modes[this._mode]) { - this._mode = Object.keys(this._modes)[0]; - } - }, - _initHandles: function _initHandles() { - var overlay = this._overlay; - var i; - this._dragHandles = L.layerGroup(); - - for (i = 0; i < 4; i++) { - this._dragHandles.addLayer(L.dragHandle(overlay, i)); - } - - this._scaleHandles = L.layerGroup(); - - for (i = 0; i < 4; i++) { - this._scaleHandles.addLayer(L.scaleHandle(overlay, i)); - } - - this._distortHandles = L.layerGroup(); - - for (i = 0; i < 4; i++) { - this._distortHandles.addLayer(L.distortHandle(overlay, i)); - } - - this._rotateHandles = L.layerGroup(); // individual rotate - - for (i = 0; i < 4; i++) { - this._rotateHandles.addLayer(L.rotateHandle(overlay, i)); - } // handle includes rotate AND scale - - - this._freeRotateHandles = L.layerGroup(); - - for (i = 0; i < 4; i++) { - this._freeRotateHandles.addLayer(L.freeRotateHandle(overlay, i)); - } - - this._lockHandles = L.layerGroup(); - - for (i = 0; i < 4; i++) { - this._lockHandles.addLayer(L.lockHandle(overlay, i, { - draggable: false - })); - } - - this._handles = { - drag: this._dragHandles, - scale: this._scaleHandles, - distort: this._distortHandles, - rotate: this._rotateHandles, - freeRotate: this._freeRotateHandles, - lock: this._lockHandles - }; - }, - _appendHandlesandDragable: function _appendHandlesandDragable() { - var ov = this._overlay; // won't throw error if user adds 0 mode actions to toolbar - - if (!this._mode) { - this._enableDragging(); - - return; - } - - this._updateHandle(); - - if (!ov.isSelected() && this.currentHandle) { - this.currentHandle.eachLayer(function (handle) { - handle.setOpacity(0); - - if (handle.dragging) { - handle.dragging.disable(); - } - }); - } - - if (!this.isMode('lock')) { - this._enableDragging(); - } - }, - _onKeyDown: function _onKeyDown(e) { - var keymap = this.options.keymap; - var handlerName = keymap[e.key]; - var ov = this._overlay; - var eP = this.parentGroup; - - if (eP && eP.anyCollected()) { - return; - } - - if (this[handlerName] !== undefined && !ov.options.suppressToolbar) { - if (ov.isSelected() && this.toolbar) { - this[handlerName].call(this); - } - } - }, - replaceTool: function replaceTool(old, next) { - var _this = this; - - if (next.baseClass !== 'leaflet-toolbar-icon' || this.hasTool(next)) { - return this; - } - - this.editActions.some(function (item, idx) { - if (item === old) { - _this._removeToolbar(); - - _this.editActions[idx] = next; - - _this._addToolbar(); - - for (var mode in L.DistortableImage.Edit.MODES) { - if (L.DistortableImage.Edit.MODES[mode] === old) { - delete _this._modes[mode]; - - _this._nextOrNone(mode); - } else if (L.DistortableImage.Edit.MODES[mode] === next) { - _this._modes[mode] = next; - } - } - - return true; - } - }); - return this; - }, - addTool: function addTool(value) { - if (value.baseClass === 'leaflet-toolbar-icon' && !this.hasTool(value)) { - this._removeToolbar(); - - this.editActions.push(value); - - this._addToolbar(); - - for (var mode in L.DistortableImage.Edit.MODES) { - if (L.DistortableImage.Edit.MODES[mode] === value) { - this._modes[mode] = value; - } - } - - if (!this._overlay.isSelected()) { - this._removeToolbar(); - } - } - - return this; - }, - hasTool: function hasTool(value) { - return this.editActions.some(function (action) { - return action === value; - }); - }, - removeTool: function removeTool(value) { - var _this2 = this; - - this.editActions.some(function (item, idx) { - if (item === value) { - _this2._removeToolbar(); - - _this2.editActions.splice(idx, 1); - - _this2._addToolbar(); - - for (var mode in L.DistortableImage.Edit.MODES) { - if (L.DistortableImage.Edit.MODES[mode] === value) { - delete _this2._modes[mode]; - - _this2._nextOrNone(mode); - } - } - - return true; - } - }); - - if (!this._overlay.isSelected()) { - this._removeToolbar(); - } - - return this; - }, - // set the mode to the next mode or if that was the last one set mode to '' - _nextOrNone: function _nextOrNone(mode) { - if (this.isMode(mode)) { - if (Object.keys(this.getModes()).length >= 1) { - this.nextMode(); - } else { - if (mode === 'lock') { - this._enableDragging(); - } - - this._mode = ''; - - this._updateHandle(); - } - } - }, - _removeToolbar: function _removeToolbar() { - var ov = this._overlay; - var map = ov._map; - - if (this.toolbar) { - map.removeLayer(this.toolbar); - this.toolbar = false; - } - }, - _enableDragging: function _enableDragging() { - var _this3 = this; - - var overlay = this._overlay; - var map = overlay._map; - this.dragging = new L.Draggable(overlay.getElement()); - this.dragging.enable(); - /* Hide toolbars and markers while dragging; click will re-show it */ - - this.dragging.on('dragstart', function () { - overlay.fire('dragstart'); - - _this3._removeToolbar(); - }); - /* - * Adjust default behavior of L.Draggable, which overwrites the CSS3 - * distort transformations that we set when it calls L.DomUtil.setPosition. - */ - - this.dragging._updatePosition = function () { - var topLeft = overlay.getCorner(0); - - var delta = this._newPos.subtract(map.latLngToLayerPoint(topLeft)); - - var currentPoint; - var corners = {}; - var i; - this.fire('predrag'); - - for (i = 0; i < 4; i++) { - currentPoint = map.latLngToLayerPoint(overlay.getCorner(i)); - corners[i] = map.layerPointToLatLng(currentPoint.add(delta)); - } - - overlay.setCorners(corners); - overlay.fire('drag'); - this.fire('drag'); - }; - - this.dragging.on('dragend', function () { - overlay.fire('dragend'); - }); - }, - _disableDragging: function _disableDragging() { - if (this.dragging) { - this.dragging.disable(); - delete this.dragging; - } - }, - _dragMode: function _dragMode() { - this.setMode('drag'); - }, - _scaleMode: function _scaleMode() { - this.setMode('scale'); - }, - _distortMode: function _distortMode() { - this.setMode('distort'); - }, - _rotateMode: function _rotateMode() { - this.setMode('rotate'); - }, - _freeRotateMode: function _freeRotateMode() { - this.setMode('freeRotate'); - }, - _toggleLockMode: function _toggleLockMode() { - if (this.isMode('lock')) { - this._unlock(); - } else { - this._lock(); - } - }, - _toggleOpacity: function _toggleOpacity() { - var image = this._overlay.getElement(); - - if (!this.hasTool(L.OpacityAction)) { - return; - } - - this._transparent = !this._transparent; - var opacity = this._transparent ? this.options.opacity : 1; - L.DomUtil.setOpacity(image, opacity); - image.setAttribute('opacity', opacity); - - this._refresh(); - }, - _toggleBorder: function _toggleBorder() { - var image = this._overlay.getElement(); - - if (!this.hasTool(L.BorderAction)) { - return; - } - - this._outlined = !this._outlined; - var outline = this._outlined ? this.options.outline : 'none'; - image.style.outline = outline; - - this._refresh(); - }, - // compare this to using overlay zIndex - _toggleOrder: function _toggleOrder() { - if (this._toggledImage) { - this._stackUp(); - } else { - this._stackDown(); - } - }, - _removeOverlay: function _removeOverlay() { - var ov = this._overlay; - var eP = this.parentGroup; - - if (this.isMode('lock') || !this.hasTool(L.DeleteAction)) { - return; - } - - var choice = L.DomUtil.confirmDelete(); - - if (!choice) { - return; - } - - this._removeToolbar(); - - if (eP) { - eP.removeLayer(ov); - } else { - ov._map.removeLayer(ov); - } - }, - // Based on https://github.com/publiclab/mapknitter/blob/8d94132c81b3040ae0d0b4627e685ff75275b416/app/assets/javascripts/mapknitter/Map.js#L47-L82 - _getExport: function _getExport() { - var overlay = this._overlay; - var map = overlay._map; - var img = overlay.getElement(); - - if (!this.hasTool(L.ExportAction)) { - return; - } // make a new image - - - var downloadable = new Image(); - downloadable.id = downloadable.id || 'tempId12345'; - document.body.appendChild(downloadable); - - downloadable.onload = function onLoadDownloadableImage() { - var height = downloadable.height; - var width = downloadable.width; - var nw = map.latLngToLayerPoint(overlay.getCorner(0)); - var ne = map.latLngToLayerPoint(overlay.getCorner(1)); - var sw = map.latLngToLayerPoint(overlay.getCorner(2)); - var se = map.latLngToLayerPoint(overlay.getCorner(3)); // I think this is to move the image to the upper left corner, - // eslint-disable-next-line max-len - // jywarren: i think we may need these or the image goes off the edge of the canvas - // jywarren: but these seem to break the distortion math... - // jywarren: i think it should be rejiggered so it - // finds the most negative values of x and y and then - // adds those to all coordinates - // nw.x -= nw.x; - // ne.x -= nw.x; - // se.x -= nw.x; - // sw.x -= nw.x; - // nw.y -= nw.y; - // ne.y -= nw.y; - // se.y -= nw.y; - // sw.y -= nw.y; - // run once warping is complete - - downloadable.onload = function () { - L.DomUtil.remove(downloadable); - }; - - if (window && window.hasOwnProperty('warpWebGl')) { - warpWebGl(downloadable.id, [0, 0, width, 0, width, height, 0, height], [nw.x, nw.y, ne.x, ne.y, se.x, se.y, sw.x, sw.y], true // trigger download - ); - } - }; - - downloadable.src = overlay.options.fullResolutionSrc || img.src; - }, - _stackUp: function _stackUp() { - var t = this._toggledImage; - - if (!t || !this.hasTool(L.StackAction)) { - return; - } - - this._toggledImage = false; - - this._overlay.bringToFront(); - - this._refresh(); - }, - _stackDown: function _stackDown() { - var t = this._toggledImage; - - if (t || !this.hasTool(L.StackAction)) { - return; - } - - this._toggledImage = true; - - this._overlay.bringToBack(); - - this._refresh(); - }, - _unlock: function _unlock() { - var ov = this._overlay; - var map = ov._map; - var eP = this.parentGroup; - - if (!this.isMode('lock')) { - return; - } - - if (eP && !eP.isCollected(ov) || !eP) { - if (!this.hasTool(L.LockAction)) { - return; - } - } - - if (this.currentHandle) { - map.removeLayer(this.currentHandle); - } - - if (ov.options.mode === 'lock' || !this.hasMode(ov.options.mode)) { - this._mode = ''; - this.currentHandle = ''; - } else { - this._mode = ov.options.mode; - } - - this._updateHandle(); - - this._enableDragging(); - - this._refresh(); - }, - _lock: function _lock() { - var ov = this._overlay; - var map = ov._map; - var eP = this.parentGroup; - - if (this.isMode('lock')) { - return; - } - - if (eP && !eP.isCollected(ov) || !eP) { - if (!this.hasTool(L.LockAction)) { - return; - } - } - - if (this.currentHandle) { - map.removeLayer(this.currentHandle); - } - - this._mode = 'lock'; - - this._updateHandle(); - - this._disableDragging(); - - this._refresh(); - }, - _deselect: function _deselect() { - this._overlay.deselect(); - }, - _showMarkers: function _showMarkers(e) { - var eP = this.parentGroup; - - if (!this.currentHandle) { - return; - } // only markers we want in collect interface for now is lock - - - if (!this.isMode('lock') && eP && eP.anyCollected()) { - return; - } - - this.currentHandle.eachLayer(function (handle) { - handle.setOpacity(1); - - if (handle.dragging) { - handle.dragging.enable(); - } - - L.DomUtil.addClass(handle.getElement(), 'leaflet-interactive'); - }); - }, - _hideMarkers: function _hideMarkers() { - var ov = this._overlay; - var eP = this.parentGroup; // workaround for race condition w/ feature group - - if (!this._handles) { - this._initHandles(); - } - - if (!this.currentHandle) { - return; - } - - if (this.isMode('lock') && eP && eP.isCollected(ov)) { - return; - } - - this.currentHandle.eachLayer(function (handle) { - handle.setOpacity(0); - - if (handle.dragging) { - handle.dragging.disable(); - } - - L.DomUtil.removeClass(handle.getElement(), 'leaflet-interactive'); - }); - }, - _updateHandle: function _updateHandle() { - var ov = this._overlay; - var map = ov._map; - var mode = this.getMode(); - - if (this.currentHandle) { - map.removeLayer(this.currentHandle); - } - - this.currentHandle = mode === '' ? '' : this._handles[mode]; - - if (this.currentHandle !== '') { - map.addLayer(this.currentHandle); - } - }, - _addToolbar: function _addToolbar() { - var ov = this._overlay; - var eP = this.parentGroup; - var map = ov._map; // Find the topmost point on the image. - - var corners = ov.getCorners(); - var maxLat = -Infinity; - - if (eP && eP.anyCollected()) { - eP.editing._addToolbar(); - - return; - } - - if (ov.options.suppressToolbar || this.toolbar) { - return; - } - - for (var i = 0; i < corners.length; i++) { - if (corners[i].lat > maxLat) { - maxLat = corners[i].lat; - } - } // Longitude is based on the centroid of the image. - - - var raisedPoint = ov.getCenter(); - raisedPoint.lat = maxLat; - this.toolbar = L.distortableImage.popupBar(raisedPoint, { - actions: this.editActions - }).addTo(map, ov); - ov.fire('toolbar:created'); - }, - _refresh: function _refresh() { - if (this.toolbar) { - this._removeToolbar(); - } - - this._addToolbar(); - }, - _updateToolbarPos: function _updateToolbarPos() { - var overlay = this._overlay; // Find the topmost point on the image. - - var corners = overlay.getCorners(); - var toolbar = this.toolbar; - var maxLat = -Infinity; - - if (toolbar && toolbar instanceof L.DistortableImage.PopupBar) { - for (var i = 0; i < corners.length; i++) { - if (corners[i].lat > maxLat) { - maxLat = corners[i].lat; - } - } // Longitude is based on the centroid of the image. - - - var raisedPoint = overlay.getCenter(); - raisedPoint.lat = maxLat; - - if (!overlay.options.suppressToolbar) { - this.toolbar.setLatLng(raisedPoint); - } - } - }, - hasMode: function hasMode(mode) { - return !!this._modes[mode]; - }, - getMode: function getMode() { - if (!this.enabled()) { - return; - } - - return this._mode; - }, - getModes: function getModes() { - return this._modes; - }, - isMode: function isMode(mode) { - if (!this.enabled()) { - return false; - } - - return this._mode === mode; - }, - setMode: function setMode(newMode) { - var ov = this._overlay; - var eP = this.parentGroup; - var mode = this.getMode(); - - if (mode === newMode || !this.hasMode(newMode) || !this.enabled()) { - return; - } - - if (this.toolbar) { - this.toolbar.clickTool(newMode); - } - - if (this.isMode('lock') && !this.dragging) { - this._enableDragging(); - } - - this._mode = newMode; - - if (this.isMode('lock')) { - this._disableDragging(); - } - - this._updateHandle(); - - this._refresh(); - - if (eP && eP.isCollected(ov)) { - ov.deselect(); - } - - return this; - }, - - /** - * need to attach a stop to img dblclick or it will propagate to - * the map and fire the handler that shows map location labels on map dblclick. - */ - nextMode: function nextMode(e) { - var mode = this.getMode(); - var eP = this.parentGroup; - var modesArray = Object.keys(this.getModes()); - var idx = modesArray.indexOf(mode); - var nextIdx = (idx + 1) % modesArray.length; - var newMode = modesArray[nextIdx]; - - if (e) { - if (eP && eP.anyCollected()) { - return; - } - - L.DomEvent.stop(e); - } - - return this.setMode(newMode); - } -}); - -L.distortableImage.edit = function (overlay, options) { - return new L.DistortableImage.Edit(overlay, options); -}; - -/***/ }), - -/***/ "./src/edit/actions/BorderAction.js": -/*!******************************************!*\ - !*** ./src/edit/actions/BorderAction.js ***! - \******************************************/ -/***/ (function() { - -L.BorderAction = L.EditAction.extend({ - initialize: function initialize(map, overlay, options) { - var edit = overlay.editing; - var mode = edit._mode; - var use; - var tooltip; - - if (edit._outlined) { - use = 'border_outer'; - tooltip = overlay.options.translation.removeBorder; - } else { - use = 'border_clear'; - tooltip = overlay.options.translation.addBorder; - } - - options = options || {}; - options.toolbarIcon = { - svg: true, - html: use, - tooltip: tooltip, - className: mode === 'lock' ? 'disabled' : '' - }; // conditional for disabling keybindings for this action when the image is locked. - - L.DistortableImage.action_map.b = mode === 'lock' ? '' : '_toggleBorder'; - L.EditAction.prototype.initialize.call(this, map, overlay, options); - }, - addHooks: function addHooks() { - var edit = this._overlay.editing; - L.IconUtil.toggleXlink(this._link, 'border_clear', 'border_outer'); - L.IconUtil.toggleTitle(this._link, 'Remove Border', 'Add Border'); - - edit._toggleBorder(); - } -}); - -/***/ }), - -/***/ "./src/edit/actions/DeleteAction.js": -/*!******************************************!*\ - !*** ./src/edit/actions/DeleteAction.js ***! - \******************************************/ -/***/ (function() { - -L.DeleteAction = L.EditAction.extend({ - initialize: function initialize(map, overlay, options) { - var edit = overlay.editing; - var use = 'delete_forever'; - var tooltip; - /** - * we can tell whether the overlay is an instance of `L.DistortableImageOverlay` or `L.DistortableCollection` bc only - * the former should have `parentGroup` defined on it. From there we call the apporpriate keybindings and methods. - */ - - if (edit instanceof L.DistortableImage.Edit) { - tooltip = overlay.options.translation.deleteImage; // backspace windows / delete mac - - L.DistortableImage.action_map.Backspace = edit._mode === 'lock' ? '' : '_removeOverlay'; - } else { - tooltip = overlay.options.translation.deleteImages; - L.DistortableImage.group_action_map.Backspace = edit._mode === 'lock' ? '' : '_removeGroup'; - } - - options = options || {}; - options.toolbarIcon = { - svg: true, - html: use, - tooltip: tooltip, - className: edit._mode === 'lock' ? 'disabled' : '' - }; - L.EditAction.prototype.initialize.call(this, map, overlay, options); - }, - addHooks: function addHooks() { - var edit = this._overlay.editing; - - if (edit instanceof L.DistortableImage.Edit) { - edit._removeOverlay(); - } else { - edit._removeGroup(); - } - } -}); - -/***/ }), - -/***/ "./src/edit/actions/DistortAction.js": -/*!*******************************************!*\ - !*** ./src/edit/actions/DistortAction.js ***! - \*******************************************/ -/***/ (function() { - -L.DistortAction = L.EditAction.extend({ - initialize: function initialize(map, overlay, options) { - options = options || {}; - options.toolbarIcon = { - svg: true, - html: 'distort', - tooltip: overlay.options.translation.distortImage, - className: 'distort' - }; - L.DistortableImage.action_map.d = '_distortMode'; - L.EditAction.prototype.initialize.call(this, map, overlay, options); - }, - addHooks: function addHooks() { - var edit = this._overlay.editing; - - edit._distortMode(); - } -}); - -/***/ }), - -/***/ "./src/edit/actions/DragAction.js": -/*!****************************************!*\ - !*** ./src/edit/actions/DragAction.js ***! - \****************************************/ -/***/ (function() { - -L.DragAction = L.EditAction.extend({ - initialize: function initialize(map, overlay, options) { - options = options || {}; - options.toolbarIcon = { - svg: true, - html: 'drag', - tooltip: overlay.options.translation.dragImage, - className: 'drag' - }; - L.DistortableImage.action_map.D = '_dragMode'; - L.EditAction.prototype.initialize.call(this, map, overlay, options); - }, - addHooks: function addHooks() { - var edit = this._overlay.editing; - - edit._dragMode(); - } -}); - -/***/ }), - -/***/ "./src/edit/actions/EditAction.js": -/*!****************************************!*\ - !*** ./src/edit/actions/EditAction.js ***! - \****************************************/ -/***/ (function() { - -L.DistortableImage = L.DistortableImage || {}; -L.distortableImage = L.DistortableImage; -L.DistortableImage.action_map = {}; -L.EditAction = L.Toolbar2.Action.extend({ - options: { - toolbarIcon: { - svg: false, - html: '', - className: '', - tooltip: '' - } - }, - initialize: function initialize(map, overlay, options) { - this._overlay = overlay; - this._map = map; - L.setOptions(this, options); - L.Toolbar2.Action.prototype.initialize.call(this, options); - - this._injectIconSet(); - }, - _createIcon: function _createIcon(toolbar, container, args) { - var _this = this; - - var iconOptions = this.options.toolbarIcon; - var className = iconOptions.className; - var edit = this._overlay.editing; - this.toolbar = toolbar; - this._icon = L.DomUtil.create('li', '', container); - this._link = L.DomUtil.create('a', '', this._icon); - - if (iconOptions.svg) { - this._link.innerHTML = L.IconUtil.create(iconOptions.html); - } else { - this._link.innerHTML = iconOptions.html; - } - - this._link.setAttribute('href', '#'); - - this._link.setAttribute('title', iconOptions.tooltip); - - this._link.setAttribute('role', 'button'); - - L.DomUtil.addClass(this._link, this.constructor.baseClass); - - if (className) { - L.DomUtil.addClass(this._link, className); - - if (className === 'disabled') { - L.DomUtil.addClass(this._icon, className); - } - - if (className === edit._mode) { - L.DomUtil.addClass(this._link, 'selected-mode'); - } else { - L.DomUtil.removeClass(this._link, 'selected-mode'); - } - } - - L.DomEvent.on(this._link, 'click', this.enable, this); - L.DomEvent.on(this._overlay, 'update', function () { - var match = _this._link.innerHTML.match(/xlink:href="#restore"/); - - if (match && match.length === 1) { - _this._enableAction(); - } - }); - /* Add secondary toolbar */ - - this._addSubToolbar(toolbar, this._icon, args); - }, - _injectIconSet: function _injectIconSet() { - if (document.querySelector('#iconset')) { - return; - } - - var el = document.createElement('div'); - el.id = 'iconset'; - el.setAttribute('hidden', 'hidden'); - el.innerHTML = new L.ToolbarIconSet().render(); - document.querySelector('.leaflet-marker-pane').appendChild(el); - }, - _enableAction: function _enableAction() { - L.DomUtil.removeClass(this._link.parentElement, 'disabled'); - L.DomUtil.removeClass(this._link, 'disabled'); - }, - _disableAction: function _disableAction() { - L.DomUtil.addClass(this._link.parentElement, 'disabled'); - L.DomUtil.addClass(this._link, 'disabled'); - } -}); - -L.editAction = function (map, overlay, options) { - return new L.EditAction(map, overlay, options); -}; - -/***/ }), - -/***/ "./src/edit/actions/ExportAction.js": -/*!******************************************!*\ - !*** ./src/edit/actions/ExportAction.js ***! - \******************************************/ -/***/ (function() { - -L.ExportAction = L.EditAction.extend({ - // This function is executed every time we select an image - initialize: function initialize(map, overlay, options) { - var edit = overlay.editing; - var tooltip; - this.isExporting = false; - this.mouseLeaveSkip = true; - this.isHooksExecuted = false; - - if (edit instanceof L.DistortableImage.Edit) { - L.DistortableImage.action_map.e = '_getExport'; - tooltip = overlay.options.translation.exportImage; - } else { - L.DistortableImage.group_action_map.e = 'runExporter'; - tooltip = overlay.options.translation.exportImages; - } - - options = options || {}; - options.toolbarIcon = { - svg: true, - html: 'get_app', - tooltip: tooltip - }; - L.EditAction.prototype.initialize.call(this, map, overlay, options); - }, - addHooks: function addHooks() { - var edit = this._overlay.editing; - - if (edit instanceof L.DistortableImage.Edit) { - edit._getExport(); - - return; - } // Make sure that addHooks is executed only once, event listeners will handle the rest - - - if (this.isHooksExecuted) { - return; - } else { - this.isHooksExecuted = true; - } - - var exportTool = this._link.parentElement; - this.mouseEnterHandler = this.handleMouseEnter.bind(this); - this.mouseLeaveHandler = this.handleMouseLeave.bind(this); - L.DomEvent.on(exportTool, 'click', function () { - if (!this.isExporting) { - this.isExporting = true; - this.renderExportIcon(); - setTimeout(this.attachMouseEventListeners.bind(this, exportTool), 100); - edit.runExporter().then(function () { - this.resetState(); - this.detachMouseEventListeners(exportTool); - }.bind(this)); - } else { - // Clicking on the export icon after export has started will be ignored - if (this.mouseLeaveSkip) { - return; - } - - this.resetState(); - this.detachMouseEventListeners(exportTool); - edit.cancelExport(); - } - }, this); - }, - resetState: function resetState() { - this.renderDownloadIcon(); - this.isExporting = false; - this.mouseLeaveSkip = true; - }, - attachMouseEventListeners: function attachMouseEventListeners(element) { - element.addEventListener('mouseenter', this.mouseEnterHandler); - element.addEventListener('mouseleave', this.mouseLeaveHandler); - }, - detachMouseEventListeners: function detachMouseEventListeners(element) { - element.removeEventListener('mouseenter', this.mouseEnterHandler); - element.removeEventListener('mouseleave', this.mouseLeaveHandler); - }, - handleMouseEnter: function handleMouseEnter() { - this.renderCancelIcon(); - }, - handleMouseLeave: function handleMouseLeave() { - if (this.mouseLeaveSkip) { - this.mouseLeaveSkip = false; - } else { - this.renderExportIcon(); - } - }, - renderDownloadIcon: function renderDownloadIcon() { - L.IconUtil.toggleXlink(this._link, 'get_app', 'spinner'); - L.IconUtil.toggleTitle(this._link, 'Export Images', 'Loading...'); - L.DomUtil.removeClass(this._link.firstChild, 'loader'); - }, - renderExportIcon: function renderExportIcon() { - L.IconUtil.toggleXlink(this._link, 'spinner'); - L.IconUtil.toggleTitle(this._link, 'Export Images', 'Loading...'); - L.IconUtil.addClassToSvg(this._link, 'loader'); - }, - renderCancelIcon: function renderCancelIcon() { - L.IconUtil.toggleXlink(this._link, 'cancel'); - L.IconUtil.toggleTitle(this._link, 'Cancel Export', 'Loading...'); - L.DomUtil.removeClass(this._link.firstChild, 'loader'); - } -}); - -/***/ }), - -/***/ "./src/edit/actions/FreeRotateAction.js": -/*!**********************************************!*\ - !*** ./src/edit/actions/FreeRotateAction.js ***! - \**********************************************/ -/***/ (function() { - -L.FreeRotateAction = L.EditAction.extend({ - initialize: function initialize(map, overlay, options) { - options = options || {}; - options.toolbarIcon = { - svg: true, - html: 'crop_rotate', - tooltip: overlay.options.translation.freeRotateImage, - className: 'freeRotate' - }; - L.DistortableImage.action_map.f = '_freeRotateMode'; - L.EditAction.prototype.initialize.call(this, map, overlay, options); - }, - addHooks: function addHooks() { - var edit = this._overlay.editing; - - edit._freeRotateMode(); - } -}); - -/***/ }), - -/***/ "./src/edit/actions/GeolocateAction.js": -/*!*********************************************!*\ - !*** ./src/edit/actions/GeolocateAction.js ***! - \*********************************************/ -/***/ (function() { - -L.GeolocateAction = L.EditAction.extend({ - initialize: function initialize(map, overlay, options) { - var edit = overlay.editing; - options = options || {}; - options.toolbarIcon = { - svg: true, - html: 'explore', - tooltip: overlay.options.translation.geolocateImage, - className: edit._mode === 'lock' ? 'disabled' : '' - }; - L.EditAction.prototype.initialize.call(this, map, overlay, options); - }, - addHooks: function addHooks() { - var image = this._overlay.getElement(); - - EXIF.getData(image, L.EXIF(image)); - } -}); - -/***/ }), - -/***/ "./src/edit/actions/LockAction.js": -/*!****************************************!*\ - !*** ./src/edit/actions/LockAction.js ***! - \****************************************/ -/***/ (function() { - -L.LockAction = L.EditAction.extend({ - initialize: function initialize(map, overlay, options) { - var edit = overlay.editing; - var use; - var tooltip; - - if (edit instanceof L.DistortableImage.Edit) { - L.DistortableImage.action_map.u = '_unlock'; - L.DistortableImage.action_map.l = '_lock'; - tooltip = overlay.options.translation.lockMode; - use = edit.isMode('lock') ? 'lock' : 'unlock'; - } else { - L.DistortableImage.group_action_map.l = '_lockGroup'; - tooltip = overlay.options.translation.lockImages; - use = 'lock'; - } - - options = options || {}; - options.toolbarIcon = { - svg: true, - html: use, - tooltip: tooltip, - className: 'lock' - }; - L.EditAction.prototype.initialize.call(this, map, overlay, options); - }, - addHooks: function addHooks() { - var edit = this._overlay.editing; - - if (edit instanceof L.DistortableImage.Edit) { - edit._toggleLockMode(); - } else { - edit._lockGroup(); - } - } -}); - -/***/ }), - -/***/ "./src/edit/actions/OpacityAction.js": -/*!*******************************************!*\ - !*** ./src/edit/actions/OpacityAction.js ***! - \*******************************************/ -/***/ (function() { - -L.OpacityAction = L.EditAction.extend({ - initialize: function initialize(map, overlay, options) { - var edit = overlay.editing; - var mode = edit._mode; - var use; - var tooltip; - - if (edit._transparent) { - use = 'opacity_empty'; - tooltip = overlay.options.translation.makeImageOpaque; - } else { - use = 'opacity'; - tooltip = overlay.options.translation.makeImageTransparent; - } - - options = options || {}; - options.toolbarIcon = { - svg: true, - html: use, - tooltip: tooltip, - className: mode === 'lock' ? 'disabled' : '' - }; - L.DistortableImage.action_map.o = mode === 'lock' ? '' : '_toggleOpacity'; - L.EditAction.prototype.initialize.call(this, map, overlay, options); - }, - addHooks: function addHooks() { - var edit = this._overlay.editing; - var link = this._link; - L.IconUtil.toggleXlink(link, 'opacity', 'opacity_empty'); - L.IconUtil.toggleTitle(link, 'Make Image Transparent', 'Make Image Opaque'); - - edit._toggleOpacity(); - } -}); - -/***/ }), - -/***/ "./src/edit/actions/RestoreAction.js": -/*!*******************************************!*\ - !*** ./src/edit/actions/RestoreAction.js ***! - \*******************************************/ -/***/ (function() { - -L.RestoreAction = L.EditAction.extend({ - initialize: function initialize(map, overlay, options) { - var mode = L.Utils.getNestedVal(overlay, 'editing', '_mode'); - var edited = overlay.edited; - options = options || {}; - options.toolbarIcon = { - svg: true, - html: 'restore', - tooltip: overlay.options.translation.restoreImage, - className: edited && mode !== 'lock' ? '' : 'disabled' - }; - L.EditAction.prototype.initialize.call(this, map, overlay, options); - }, - addHooks: function addHooks() { - var ov = this._overlay; - L.DomEvent.on(ov, { - edit: this._enableAction, - restore: this._disableAction - }, this); - ov.restore(); - } -}); - -/***/ }), - -/***/ "./src/edit/actions/RotateAction.js": -/*!******************************************!*\ - !*** ./src/edit/actions/RotateAction.js ***! - \******************************************/ -/***/ (function() { - -L.RotateAction = L.EditAction.extend({ - initialize: function initialize(map, overlay, options) { - options = options || {}; - options.toolbarIcon = { - svg: true, - html: 'rotate', - tooltip: overlay.options.translation.rotateImage, - className: 'rotate' - }; - L.DistortableImage.action_map.r = '_rotateMode'; - L.EditAction.prototype.initialize.call(this, map, overlay, options); - }, - addHooks: function addHooks() { - var edit = this._overlay.editing; - - edit._rotateMode(); - } -}); - -/***/ }), - -/***/ "./src/edit/actions/ScaleAction.js": -/*!*****************************************!*\ - !*** ./src/edit/actions/ScaleAction.js ***! - \*****************************************/ -/***/ (function() { - -L.ScaleAction = L.EditAction.extend({ - initialize: function initialize(map, overlay, options) { - options = options || {}; - options.toolbarIcon = { - svg: true, - html: 'scale', - tooltip: overlay.options.translation.scaleImage, - className: 'scale' - }; - L.DistortableImage.action_map.s = '_scaleMode'; - L.EditAction.prototype.initialize.call(this, map, overlay, options); - }, - addHooks: function addHooks() { - var edit = this._overlay.editing; - - edit._scaleMode(); - } -}); - -/***/ }), - -/***/ "./src/edit/actions/StackAction.js": -/*!*****************************************!*\ - !*** ./src/edit/actions/StackAction.js ***! - \*****************************************/ -/***/ (function() { - -L.StackAction = L.EditAction.extend({ - initialize: function initialize(map, overlay, options) { - var edit = overlay.editing; - var use; - var tooltip; - - if (edit._toggledImage) { - use = 'flip_to_back'; - tooltip = overlay.options.translation.stackToFront; - } else { - use = 'flip_to_front'; - tooltip = overlay.options.translation.stackToBack; - } - - options = options || {}; - options.toolbarIcon = { - svg: true, - html: use, - tooltip: tooltip, - className: edit._mode === 'lock' ? 'disabled' : '' - }; - L.DistortableImage.action_map.q = edit._mode === 'lock' ? '' : '_stackUp'; - L.DistortableImage.action_map.a = edit._mode === 'lock' ? '' : '_stackDown'; - L.EditAction.prototype.initialize.call(this, map, overlay, options); - }, - addHooks: function addHooks() { - var edit = this._overlay.editing; - L.IconUtil.toggleXlink(this._link, 'flip_to_front', 'flip_to_back'); - L.IconUtil.toggleTitle(this._link, 'Stack to Front', 'Stack to Back'); - - edit._toggleOrder(); - } -}); - -/***/ }), - -/***/ "./src/edit/actions/UnlockAction.js": -/*!******************************************!*\ - !*** ./src/edit/actions/UnlockAction.js ***! - \******************************************/ -/***/ (function() { - -L.UnlockAction = L.EditAction.extend({ - initialize: function initialize(map, overlay, options) { - options = options || {}; - options.toolbarIcon = { - svg: true, - html: 'unlock', - tooltip: overlay.options.translation.unlockImages - }; - L.DistortableImage.group_action_map.u = '_unlockGroup'; - L.EditAction.prototype.initialize.call(this, map, overlay, options); - }, - addHooks: function addHooks() { - var edit = this._overlay.editing; - - edit._unlockGroup(); - } -}); - -/***/ }), - -/***/ "./src/edit/getEXIFdata.js": -/*!*********************************!*\ - !*** ./src/edit/getEXIFdata.js ***! - \*********************************/ -/***/ (function() { - -/* eslint-disable no-unused-vars */ -L.EXIF = function getEXIFdata(img) { - if (Object.keys(EXIF.getAllTags(img)).length !== 0) { - console.log(EXIF.getAllTags(img)); - var GPS = EXIF.getAllTags(img); - var altitude; - /* If the lat/lng is available. */ - - if (typeof GPS.GPSLatitude !== 'undefined' && typeof GPS.GPSLongitude !== 'undefined') { - // sadly, encoded in [degrees,minutes,seconds] - // primitive value = GPS.GPSLatitude[x].numerator - var lat = GPS.GPSLatitude[0] + GPS.GPSLatitude[1] / 60 + GPS.GPSLatitude[2] / 3600; - var lng = GPS.GPSLongitude[0] + GPS.GPSLongitude[1] / 60 + GPS.GPSLongitude[2] / 3600; - - if (GPS.GPSLatitudeRef !== 'N') { - lat = lat * -1; - } - - if (GPS.GPSLongitudeRef === 'W') { - lng = lng * -1; - } - } // Attempt to use GPS compass heading; will require - // some trig to calc corner points, which you can find below: - - - var angle = 0; // "T" refers to "True north", so -90. - - if (GPS.GPSImgDirectionRef === 'T') { - angle = Math.PI / 180 * (GPS.GPSImgDirection.numerator / GPS.GPSImgDirection.denominator - 90); // "M" refers to "Magnetic north" - } else if (GPS.GPSImgDirectionRef === 'M') { - angle = Math.PI / 180 * (GPS.GPSImgDirection.numerator / GPS.GPSImgDirection.denominator - 90); - } else { - console.log('No compass data found'); - } - - console.log('Orientation:', GPS.Orientation); - /* If there is orientation data -- i.e. landscape/portrait etc */ - - if (GPS.Orientation === 6) { - // CCW - angle += Math.PI / 180 * -90; - } else if (GPS.Orientation === 8) { - // CW - angle += Math.PI / 180 * 90; - } else if (GPS.Orientation === 3) { - // 180 - angle += Math.PI / 180 * 180; - } - /* If there is altitude data */ - - - if (typeof GPS.GPSAltitude !== 'undefined' && typeof GPS.GPSAltitudeRef !== 'undefined') { - // Attempt to use GPS altitude: - // (may eventually need to find EXIF field of view for correction) - if (typeof GPS.GPSAltitude !== 'undefined' && typeof GPS.GPSAltitudeRef !== 'undefined') { - altitude = GPS.GPSAltitude.numerator / GPS.GPSAltitude.denominator + GPS.GPSAltitudeRef; - } else { - altitude = 0; // none - } - } - } else { - alert('EXIF initialized. Press again to view data in console.'); - } -}; - -/***/ }), - -/***/ "./src/edit/handles/DistortHandle.js": -/*!*******************************************!*\ - !*** ./src/edit/handles/DistortHandle.js ***! - \*******************************************/ -/***/ (function() { - -L.DistortHandle = L.EditHandle.extend({ - options: { - TYPE: 'distort', - icon: L.icon({ - iconUrl: // eslint-disable-next-line max-len - 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAChSURBVO3BIU4DURgGwNkvL2B6AkQTLBqP4QCoSm7DDXoBLBZHDbfgICAIZjEV3YTn9uVHdMZZtcnCfI13bIzxg0emg6Nm6QVbYz3jylEsXRrvwommb49X67jFkz80fR9Mb1YxTzqiWBSLYlEsikWxKBbFolgUi2JRLIpFsSgWxaJY03fHHOu40dH07bAzWCx9Ge/TiWbpHgdsjPGNB2f/yS+7xRCyiiZPJQAAAABJRU5ErkJggg==', - iconSize: [32, 32], - iconAnchor: [16, 16] - }) - }, - _onHandleDrag: function _onHandleDrag() { - var overlay = this._handled; - overlay.setCorner(this._corner, this.getLatLng()); - }, - updateHandle: function updateHandle() { - this.setLatLng(this._handled.getCorner(this._corner)); - } -}); - -L.distortHandle = function (overlay, idx, options) { - return new L.DistortHandle(overlay, idx, options); -}; - -/***/ }), - -/***/ "./src/edit/handles/DragHandle.js": -/*!****************************************!*\ - !*** ./src/edit/handles/DragHandle.js ***! - \****************************************/ -/***/ (function() { - -L.DragHandle = L.EditHandle.extend({ - options: { - TYPE: 'drag', - icon: L.icon({ - // eslint-disable-next-line max-len - iconUrl: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAsVJREFUeNrMVztLXEEUvnNVFAVBAhY2aRKbTZEHJNpYabuNjSgYg/GxdsmPSJkUAa/ZdVEX8mgWYVutbHxAHkVskjQBuUUgBISVhCQk3wnfwMlk1rusN1wHPubOzJlzvjlz5sxc01Ma/hUEwQnwDIjqc7uvgv9YYO86qgIwCXQbdNTlQ8kcCBHgBch8TcloF6oJGr6phk6EQAkfdz3zvgDr9Mr7Fg1fptEZoM8jsmrokpfsiIFO4IIjuE2v1EDmR4LRdlR5Gh51hj8D34ABtm8YTtqna0TgklIw5CgQguKxIojEjmFROg/MKQO27NkFAB+4wAPouGUJiIvWKHwbAxX2XyWRKWkqhT+pbJntJZJuUzISW0+5hW+obxrVBsfvoH/dqCCJuU97GBh2VteLSiYvArmErT8EVoAK9Bw7enbpVYmvAQlyowYforrH5jXL2rPHI/TKONDB7u9AlavdaTBPvPmazUeQuy8f7UomUgTEwIJPEQ3sQGE/6ll2l9H/KcEzBcfWn2IclluM3DpddJxSHujlFkscbUPvmB0LHVnLrId7nlaZVkEc6QGXQI1MAwZcWmVRHeNaQwJMMiU2cwy4s7p/RJ2ckpvIQs+cIs+5GzitloLKHUV3MPREuXbTOKO91dX387gGTONxIgEWm+E61FFrpcyqXLHsEwiDjEsjAksqw5XPoL9MHVrn6QR4q+XZrDaR4RoWzq2ymafuRA/Mq1stSsHLVkcbdf9VjOcx8ZH3+SFWcCWlVPyWuUBOwUWdC1wP5NVjYiXFWLO69PZ6CRTUY6KSIoEKdf6T3IzzgHxnsyHctNBEkmn6Oob8ExUDg/ahGybd177cDjzH5xHwgDiSvoS7I/LZyvxJZj0wod7tkX5G0XVC7rEyLhfLJjBGbKoLLEfZWObyKeZ6oY82g+yf5Zn/mJyHX7PMf04z/T3/LcAAu4E6iiyJqf0AAAAASUVORK5CYII=', - iconSize: [32, 32], - iconAnchor: [16, 16] - }) - }, - _onHandleDrag: function _onHandleDrag() { - var overlay = this._handled; - var formerLatLng = overlay.getCorner(this._corner); - var newLatLng = this.getLatLng(); - overlay.dragBy(formerLatLng, newLatLng); - }, - updateHandle: function updateHandle() { - this.setLatLng(this._handled.getCorner(this._corner)); - } -}); - -L.dragHandle = function (overlay, idx, options) { - return new L.DragHandle(overlay, idx, options); -}; - -/***/ }), - -/***/ "./src/edit/handles/EditHandle.js": -/*!****************************************!*\ - !*** ./src/edit/handles/EditHandle.js ***! - \****************************************/ -/***/ (function() { - -L.EditHandle = L.Marker.extend({ - initialize: function initialize(overlay, corner, options) { - var latlng = overlay.getCorner(corner); - L.setOptions(this, options); - this._handled = overlay; - this._corner = corner; - var markerOptions = { - draggable: true, - zIndexOffset: 10 - }; - - if (options && options.hasOwnProperty('draggable')) { - markerOptions.draggable = options.draggable; - } - - L.Marker.prototype.initialize.call(this, latlng, markerOptions); - }, - onAdd: function onAdd(map) { - L.Marker.prototype.onAdd.call(this, map); - - this._bindListeners(); - - this.updateHandle(); - }, - onRemove: function onRemove(map) { - this._unbindListeners(); - - L.Marker.prototype.onRemove.call(this, map); - }, - _onHandleDragStart: function _onHandleDragStart() { - this._handled.fire('editstart'); - }, - _onHandleDragEnd: function _onHandleDragEnd() { - this._fireEdit(); - }, - _fireEdit: function _fireEdit() { - this._handled.edited = true; - - this._handled.fire('edit'); - }, - _bindListeners: function _bindListeners() { - this.on({ - contextmenu: L.DomEvent.stop, - dragstart: this._onHandleDragStart, - drag: this._onHandleDrag, - dragend: this._onHandleDragEnd - }, this); - - this._handled._map.on('zoomend', this.updateHandle, this); - - this._handled.on('update', this.updateHandle, this); - }, - _unbindListeners: function _unbindListeners() { - this.off({ - contextmenu: L.DomEvent.stop, - dragstart: this._onHandleDragStart, - drag: this._onHandleDrag, - dragend: this._onHandleDragEnd - }, this); - - this._handled._map.off('zoomend', this.updateHandle, this); - - this._handled.off('update', this.updateHandle, this); - }, - - /* Takes two latlngs and calculates the scaling difference. */ - _calculateScalingFactor: function _calculateScalingFactor(latlngA, latlngB) { - var overlay = this._handled; - var map = overlay._map; - var centerPoint = map.latLngToLayerPoint(overlay.getCenter()); - var formerPoint = map.latLngToLayerPoint(latlngA); - var newPoint = map.latLngToLayerPoint(latlngB); - - var formerRadiusSquared = this._d2(centerPoint, formerPoint); - - var newRadiusSquared = this._d2(centerPoint, newPoint); - - return Math.sqrt(newRadiusSquared / formerRadiusSquared); - }, - - /* Distance between two points in cartesian space, squared (distance formula). */ - _d2: function _d2(a, b) { - var dx = a.x - b.x; - var dy = a.y - b.y; - return Math.pow(dx, 2) + Math.pow(dy, 2); - }, - - /* Takes two latlngs and calculates the angle between them. */ - calculateAngleDelta: function calculateAngleDelta(latlngA, latlngB) { - var overlay = this._handled; - var map = overlay._map; - var centerPoint = map.latLngToLayerPoint(overlay.getCenter()); - var formerPoint = map.latLngToLayerPoint(latlngA); - var newPoint = map.latLngToLayerPoint(latlngB); - var initialAngle = Math.atan2(centerPoint.y - formerPoint.y, centerPoint.x - formerPoint.x); - var newAngle = Math.atan2(centerPoint.y - newPoint.y, centerPoint.x - newPoint.x); - return newAngle - initialAngle; - } -}); - -/***/ }), - -/***/ "./src/edit/handles/FreeRotateHandle.js": -/*!**********************************************!*\ - !*** ./src/edit/handles/FreeRotateHandle.js ***! - \**********************************************/ -/***/ (function() { - -L.FreeRotateHandle = L.EditHandle.extend({ - options: { - TYPE: 'freeRotate', - icon: L.icon({ - iconUrl: // eslint-disable-next-line max-len - 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAHiSURBVMXBa3HbShgA0PMp/1sCCo8oCEpgTaCXgIXAJiDzyCJoAUTm4UVQAns1Y8+snWnTvJyeE16hkjDgDrfoNTMKcpC9UPiLSo8JyetkjEHxjPCMyoS199kFoz8Iv1HpMaN3qWDCHoegOKkkRwnJpRmroHgiPFEZ8IBekzEGxQtUEhKSS/fB7Ew4U+lxcGkVZG9QWWPSFAxBcdK59KApuA+yNwp2uEdx1GN25sZJZULSfAtm77SlbNjju6MvG75u+WHRWVR6rDVjMPsgwYyVZl3pLTpHkyYHOx8syMiayaJzlDTZ9YyaZNFVkiYH2ZUEBcVJJXVImuz6Js3Qofe59pq7DoOTILu+g+a288mCouk7/1iH4qTS+2QdDppbV1ZJmrnDXnPnc5UOs2Z0fUmTuyBr+krvSioJyUmQO0dZM7mepMkWnaNRkyrJB6uskTSjxY3Fll8bvmJwlDb83FJ8gMqAB80uyBY3Trb82PAfvjj6vuHnluIdKgMeNXOwctK5NKBoHitrb1RJeHRp5Ux4ojLg0aWMHGQvUOkxIWkKVsHsTPiNSo8HDC5lZIsgO6n0uMUdRvQuFQxB8UR4RmXC2vvsgtEfhL+o9JiQvE7GGBTPCK9QSUjoMWgKDthjDrIX+h/k0I7gth6N5gAAAABJRU5ErkJggg==', - iconSize: [32, 32], - iconAnchor: [16, 16] - }) - }, - _onHandleDrag: function _onHandleDrag() { - var overlay = this._handled; - var map = overlay._map; - var formerLatLng = overlay.getCorner(this._corner); - var newLatLng = this.getLatLng(); - var angle = this.calculateAngleDelta(formerLatLng, newLatLng); - - var scale = this._calculateScalingFactor(formerLatLng, newLatLng); - - if (angle !== 0) { - overlay.rotateBy(angle, 'rad'); - } - - var edgeMinWidth = overlay.edgeMinWidth; - - if (!edgeMinWidth) { - edgeMinWidth = 50; - } - /* just in case */ - - - var corner1 = map.latLngToContainerPoint(overlay.getCorner(0)); - var corner2 = map.latLngToContainerPoint(overlay.getCorner(1)); - var w = Math.abs(corner1.x - corner2.x); - var h = Math.abs(corner1.y - corner2.y); - var distance = Math.sqrt(w * w + h * h); - - if (distance > edgeMinWidth || scale > 1) { - overlay.scaleBy(scale); - } else { - overlay.scaleBy(1); - } - }, - updateHandle: function updateHandle() { - this.setLatLng(this._handled.getCorner(this._corner)); - } -}); - -L.freeRotateHandle = function (overlay, idx, options) { - return new L.FreeRotateHandle(overlay, idx, options); -}; - -/***/ }), - -/***/ "./src/edit/handles/LockHandle.js": -/*!****************************************!*\ - !*** ./src/edit/handles/LockHandle.js ***! - \****************************************/ -/***/ (function() { - -L.LockHandle = L.EditHandle.extend({ - options: { - TYPE: 'lock', - interactive: false, - icon: L.icon({ - // eslint-disable-next-line max-len - iconUrl: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAD8SURBVO3BPU7CYAAA0AdfjIcQlRCQBG7C3gk2uIPG2RC3Dk16Gz0FTO1WZs/gwGCMP/2+xsSl7+n1er1Iz9LtRQjaPeMeO+TinLDCJV78YqjdA04YodKuxhUaPGoRxMmxwRQZSt87Yo4KExGCeAUyLLFB4bMacxywEClIU2KDKXbInTUYo8JCgoFuGoxQO5uiwY1EA91VmDqrcKeDoX8WdNNgjApvmGGLXKIgXY0xGkxQYItrrFFIEKQ5Yo4KEx9yrDFDhlKkIF6NOQ5Y+KpAhiXWKEQI4pxwiwoLPyuxwQw75FoE7fZYocFEuwI7jHCBV39gL92TXq/Xi/AOcmczZmaIMScAAAAASUVORK5CYII=', - iconSize: [32, 32], - iconAnchor: [16, 16] - }) - }, - onRemove: function onRemove(map) { - this.unbindTooltip(); - L.EditHandle.prototype.onRemove.call(this, map); - }, - _bindListeners: function _bindListeners() { - var icon = this.getElement(); - - L.EditHandle.prototype._bindListeners.call(this); - - L.DomEvent.on(icon, { - mousedown: this._tooltipOn, - mouseup: this._tooltipOff - }, this); - L.DomEvent.on(document, 'pointerleave', this._tooltipOff, this); - }, - _unbindListeners: function _unbindListeners() { - var icon = this.getElement(); - - L.EditHandle.prototype._bindListeners.call(this); - - L.DomEvent.off(icon, { - mousedown: this._tooltipOn, - mouseup: this._tooltipOff - }, this); - L.DomEvent.off(document, 'pointerleave', this._tooltipOff, this); - }, - - /* cannot be dragged */ - _onHandleDrag: function _onHandleDrag() {}, - updateHandle: function updateHandle() { - this.setLatLng(this._handled.getCorner(this._corner)); - }, - _tooltipOn: function _tooltipOn(e) { - var eP = this._handled.parentGroup; - var edit = eP ? eP.editing : this._handled.editing; - - if (e.shiftKey) { - return; - } - - if (!this._handled.isSelected() && eP && !eP.isCollected(this._handled)) { - return; - } - - var handlesArr = edit._lockHandles; - this._timer = setTimeout(L.bind(function () { - if (this._timeout) { - clearTimeout(this._timeout); - } - - if (!this.getTooltip()) { - this.bindTooltip('Locked!', { - permanent: true - }); - } else { - handlesArr.eachLayer(function (handle) { - if (this !== handle) { - handle.closeTooltip(); - } - }); - } - - this.openTooltip(); - }, this), 500); - }, - _tooltipOff: function _tooltipOff(e) { - var eP = this._handled.parentGroup; - var edit = eP ? eP.editing : this._handled.editing; - - if (e.shiftKey) { - return; - } - - if (!this._handled.isSelected() && eP && !eP.isCollected(this._handled)) { - return; - } - - var handlesArr = edit._lockHandles; - - if (e.currentTarget === document) { - handlesArr.eachLayer(function (handle) { - handle.closeTooltip(); - }); - } - - if (this._timer) { - clearTimeout(this._timer); - } - - this._timeout = setTimeout(L.bind(function () { - this.closeTooltip(); - }, this), 400); - } -}); - -L.lockHandle = function (overlay, idx, options) { - return new L.LockHandle(overlay, idx, options); -}; - -/***/ }), - -/***/ "./src/edit/handles/RotateHandle.js": -/*!******************************************!*\ - !*** ./src/edit/handles/RotateHandle.js ***! - \******************************************/ -/***/ (function() { - -L.RotateHandle = L.EditHandle.extend({ - options: { - TYPE: 'rotate', - icon: L.icon({ - iconUrl: // eslint-disable-next-line max-len - 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAHiSURBVMXBa3HbShgA0PMp/1sCCo8oCEpgTaCXgIXAJiDzyCJoAUTm4UVQAns1Y8+snWnTvJyeE16hkjDgDrfoNTMKcpC9UPiLSo8JyetkjEHxjPCMyoS199kFoz8Iv1HpMaN3qWDCHoegOKkkRwnJpRmroHgiPFEZ8IBekzEGxQtUEhKSS/fB7Ew4U+lxcGkVZG9QWWPSFAxBcdK59KApuA+yNwp2uEdx1GN25sZJZULSfAtm77SlbNjju6MvG75u+WHRWVR6rDVjMPsgwYyVZl3pLTpHkyYHOx8syMiayaJzlDTZ9YyaZNFVkiYH2ZUEBcVJJXVImuz6Js3Qofe59pq7DoOTILu+g+a288mCouk7/1iH4qTS+2QdDppbV1ZJmrnDXnPnc5UOs2Z0fUmTuyBr+krvSioJyUmQO0dZM7mepMkWnaNRkyrJB6uskTSjxY3Fll8bvmJwlDb83FJ8gMqAB80uyBY3Trb82PAfvjj6vuHnluIdKgMeNXOwctK5NKBoHitrb1RJeHRp5Ux4ojLg0aWMHGQvUOkxIWkKVsHsTPiNSo8HDC5lZIsgO6n0uMUdRvQuFQxB8UR4RmXC2vvsgtEfhL+o9JiQvE7GGBTPCK9QSUjoMWgKDthjDrIX+h/k0I7gth6N5gAAAABJRU5ErkJggg==', - iconSize: [32, 32], - iconAnchor: [16, 16] - }) - }, - _onHandleDrag: function _onHandleDrag() { - var overlay = this._handled; - var formerLatLng = overlay.getCorner(this._corner); - var newLatLng = this.getLatLng(); - var angle = this.calculateAngleDelta(formerLatLng, newLatLng); - /* - * running rotation logic even for an angle delta of 0 - * prevents a small, occasional marker flicker - */ - - overlay.rotateBy(angle, 'rad'); - }, - updateHandle: function updateHandle() { - this.setLatLng(this._handled.getCorner(this._corner)); - } -}); - -L.rotateHandle = function (overlay, idx, options) { - return new L.RotateHandle(overlay, idx, options); -}; - -/***/ }), - -/***/ "./src/edit/handles/ScaleHandle.js": -/*!*****************************************!*\ - !*** ./src/edit/handles/ScaleHandle.js ***! - \*****************************************/ -/***/ (function() { - -L.ScaleHandle = L.EditHandle.extend({ - options: { - TYPE: 'scale', - icon: L.icon({ - iconUrl: // eslint-disable-next-line max-len - 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2ZXJzaW9uPSIxLjEiIHdpZHRoPSI0NTkiIGhlaWdodD0iNDY0IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCA1MTIgNTEyIiB4bWw6c3BhY2U9InByZXNlcnZlIiBzdHlsZT0iIj48cmVjdCBpZD0iYmFja2dyb3VuZHJlY3QiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIHg9IjAiIHk9IjAiIGZpbGw9Im5vbmUiIHN0cm9rZT0ibm9uZSIgY2xhc3M9IiIgc3R5bGU9IiIvPjxnIGNsYXNzPSJjdXJyZW50TGF5ZXIiIHN0eWxlPSIiPjx0aXRsZT5MYXllciAxPC90aXRsZT48cGF0aCBkPSJNNDU5LjA0OTE1OTUzMDQ3MTM0LDg2LjkyNjIzNDUxMjU1MDAyIFYwIGgtODUuNzE0NTczMzU2MzEyMDkgdjI3LjA0MzcxNzQwMzkwNDQ1MiBIODUuNzE0NTczMzU2MzEyMDMgVjAgSDAgdjg2LjkyNjIzNDUxMjU1MDAyIGgyNS43MTQzNzIwMDY4OTM2MjYgdjI4OS43NTQxMTUwNDE4MzM0IEgwIHY4Ni45MjYyMzQ1MTI1NTAwMiBoODUuNzE0NTczMzU2MzEyMDkgdi0yNy4wNDM3MTc0MDM5MDQ0NTIgaDI4NS43MTUyNDQ1MjEwNDAzIHYyNy4wNDM3MTc0MDM5MDQ0NTIgaDg1LjcxNDU3MzM1NjMxMjA5IHYtODYuOTI2MjM0NTEyNTUwMDIgaC0yMy44MDk2MDM3MTAwODY2OSBWODYuOTI2MjM0NTEyNTUwMDIgSDQ1OS4wNDkxNTk1MzA0NzEzNCB6TTM4NC43NjMxOTU5NTUwMDA5LDEyLjU1NjAxMTY1MTgxMjc4MSBoNjEuOTA0OTY5NjQ2MjI1Mzk2IHY2Mi43ODAwNTgyNTkwNjM5MSBoLTYxLjkwNDk2OTY0NjIyNTM5NiBWMTIuNTU2MDExNjUxODEyNzgxIHpNMTIuMzgwOTkzOTI5MjQ1MDUsMTIuNTU2MDExNjUxODEyNzgxIGg2MS45MDQ5Njk2NDYyMjUzOTYgdjYyLjc4MDA1ODI1OTA2MzkxIEgxMi4zODA5OTM5MjkyNDUwNSBWMTIuNTU2MDExNjUxODEyNzgxIHpNNzQuMjg1OTYzNTc1NDcwNTMsNDUxLjA1MDU3MjQxNTEyMDY2IEgxMi4zODA5OTM5MjkyNDUwNSB2LTYyLjc4MDA1ODI1OTA2MzkxIGg2MS45MDQ5Njk2NDYyMjUzOTYgVjQ1MS4wNTA1NzI0MTUxMjA2NiB6TTQ0NS43MTU3ODE0NTI4MjI3NCw0NTEuMDUwNTcyNDE1MTIwNjYgaC02Mi44NTczNTM3OTQ2Mjg4NjQgdi02Mi43ODAwNTgyNTkwNjM5MSBoNjIuODU3MzUzNzk0NjI4ODY0IFY0NTEuMDUwNTcyNDE1MTIwNjYgek00MDcuNjIwNDE1NTE2Njg0MjYsMzc2LjY4MDM0OTU1NDM4MzQ0IGgtMzYuMTkwNTk3NjM5MzMxNzcgdjMyLjgzODc5OTcwNDc0MTEyIEg4NS43MTQ1NzMzNTYzMTIwMyB2LTMyLjgzODc5OTcwNDc0MTEyIEg0OS41MjM5NzU3MTY5ODAzMiBWODYuOTI2MjM0NTEyNTUwMDIgaDM2LjE5MDU5NzYzOTMzMTc3IFY1MC4yMjQwNDY2MDcyNTExMjUgaDI4Ny42MjAwMTI4MTc4NDcyIHYzNi43MDIxODc5MDUyOTg5IGgzNC4yODU4MjkzNDI1MjQ4MzUgVjM3Ni42ODAzNDk1NTQzODM0NCB6IiBpZD0ic3ZnXzIiIGNsYXNzPSIiIGZpbGw9IiMxYTFhZWIiIGZpbGwtb3BhY2l0eT0iMSIvPjwvZz48L3N2Zz4=', - iconSize: [32, 32], - iconAnchor: [16, 16] - }) - }, - _onHandleDrag: function _onHandleDrag() { - var overlay = this._handled; - var map = overlay._map; - var edgeMinWidth = overlay.edgeMinWidth; - var formerLatLng = overlay.getCorner(this._corner); - var newLatLng = this.getLatLng(); - - var scale = this._calculateScalingFactor(formerLatLng, newLatLng); - /* - * checks whether the "edgeMinWidth" property is set and tracks the minimum edge length; - * this enables preventing scaling to zero, but we might also add an overall scale limit - */ - - - if (!edgeMinWidth) { - edgeMinWidth = 50; - } - /* just in case */ - - - var corner1 = map.latLngToLayerPoint(overlay.getCorner(0)); - var corner2 = map.latLngToLayerPoint(overlay.getCorner(1)); - var w = Math.abs(corner1.x - corner2.x); - var h = Math.abs(corner1.y - corner2.y); - var distance = Math.sqrt(w * w + h * h); - - if (distance > edgeMinWidth || scale > 1) { - overlay.scaleBy(scale); - /* - * running scale logic even for a scale ratio of 1 - * prevents a small, occasional marker flicker - */ - } else { - overlay.scaleBy(1); - } - }, - updateHandle: function updateHandle() { - this.setLatLng(this._handled.getCorner(this._corner)); - } -}); - -L.scaleHandle = function (overlay, idx, options) { - return new L.ScaleHandle(overlay, idx, options); -}; - -/***/ }), - -/***/ "./src/edit/toolbars/DistortableImage.ControlBar.js": -/*!**********************************************************!*\ - !*** ./src/edit/toolbars/DistortableImage.ControlBar.js ***! - \**********************************************************/ -/***/ (function() { - -L.distortableImage = L.DistortableImage || {}; -L.distortableImage = L.DistortableImage; -L.DistortableImage.group_action_map = {}; -L.DistortableImage.ControlBar = L.Toolbar2.Control.extend({}); - -L.distortableImage.controlBar = function (options) { - return new L.DistortableImage.ControlBar(options); -}; -/** addInitHooks run before onAdd */ - - -L.DistortableCollection.addInitHook(function () { - /** Default actions */ - this.ACTIONS = [L.ExportAction, L.DeleteAction, L.LockAction, L.UnlockAction]; // all possible modes - - L.DistortableCollection.Edit.MODES = { - lock: L.LockAction, - unlock: L.UnlockAction - }; - var a = this.options.actions ? this.options.actions : this.ACTIONS; - this.editing = L.distortableCollection.edit(this, { - actions: a - }); -}); - -/***/ }), - -/***/ "./src/edit/toolbars/DistortableImage.PopupBar.js": -/*!********************************************************!*\ - !*** ./src/edit/toolbars/DistortableImage.PopupBar.js ***! - \********************************************************/ -/***/ (function() { - -L.DistortableImage = L.DistortableImage || {}; -L.distortableImage = L.DistortableImage; -L.DistortableImage.action_map = {}; -L.DistortableImage.PopupBar = L.Toolbar2.Popup.extend({ - options: { - anchor: [0, -10] - }, - initialize: function initialize(latlng, options) { - L.setOptions(this, options); - L.Toolbar2.Popup.prototype.initialize.call(this, latlng, options); - }, - addHooks: function addHooks(map, ov) { - this.map = map; - this.ov = ov; - }, - tools: function tools() { - if (this._ul) { - return this._ul.children; - } - }, - clickTool: function clickTool(name) { - var tools = this.tools(); - - for (var i = 0; i < tools.length; i++) { - var tool = tools.item(i).children[0]; - - if (L.DomUtil.hasClass(tool, name)) { - tool.click(); - return tool; - } - } - - return false; - } -}); - -L.distortableImage.popupBar = function (latlng, options) { - return new L.DistortableImage.PopupBar(latlng, options); -}; - -L.DistortableImageOverlay.addInitHook(function () { - /** Default actions */ - this.ACTIONS = [L.DragAction, L.ScaleAction, L.DistortAction, L.RotateAction, L.FreeRotateAction, L.LockAction, L.OpacityAction, L.BorderAction, L.ExportAction, L.DeleteAction]; // all possible modes - - L.DistortableImage.Edit.MODES = { - drag: L.DragAction, - scale: L.ScaleAction, - distort: L.DistortAction, - rotate: L.RotateAction, - freeRotate: L.FreeRotateAction, - lock: L.LockAction - }; - var a = this.options.actions ? this.options.actions : this.ACTIONS; - this.editing = L.distortableImage.edit(this, { - actions: a - }); -}); - -/***/ }), - -/***/ "./src/iconsets/IconSet.js": -/*!*********************************!*\ - !*** ./src/iconsets/IconSet.js ***! - \*********************************/ -/***/ (function() { - -/* this is the baseclass other IconSets inherit from, -* we don't use it directly */ -L.IconSet = L.Class.extend({ - _svg: '', - _symbols: '', - render: function render() { - this.addSymbols(this._symbols); - return this._svg; - }, - addSymbols: function addSymbols(symbols) { - this._svg += symbols; - } -}); - -/***/ }), - -/***/ "./src/iconsets/KeymapperIconSet.js": -/*!******************************************!*\ - !*** ./src/iconsets/KeymapperIconSet.js ***! - \******************************************/ -/***/ (function() { - -L.KeymapperIconSet = L.IconSet.extend({ - _symbols: // eslint-disable-next-line max-len - '' -}); - -/***/ }), - -/***/ "./src/iconsets/ToolbarIconSet.js": -/*!****************************************!*\ - !*** ./src/iconsets/ToolbarIconSet.js ***! - \****************************************/ -/***/ (function() { - -/* eslint-disable max-len */ -L.ToolbarIconSet = L.IconSet.extend({ - _symbols: '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' -}); - -/***/ }), - -/***/ "./src/mapmixins/BoxCollector.js": -/*!***************************************!*\ - !*** ./src/mapmixins/BoxCollector.js ***! - \***************************************/ -/***/ (function() { - -L.Map.mergeOptions({ - boxCollector: true, - boxZoom: false -}); -/** - * primarily Leaflet 1.5.1 source code. Overriden so that it's a collection box used with - * our `L.DistortableCollection` class instead of a zoom box. - * */ - -L.Map.BoxCollector = L.Map.BoxZoom.extend({ - initialize: function initialize(map) { - this._map = map; - this._container = map._container; - this._pane = map._panes.overlayPane; - this._resetStateTimeout = 0; - map.on('unload', this._destroy, this); - }, - addHooks: function addHooks() { - L.DomEvent.on(this._container, 'mousedown', this._onMouseDown, this); - }, - removeHooks: function removeHooks() { - L.DomEvent.off(this._container, 'mousedown', this._onMouseDown, this); - }, - moved: function moved() { - return this._moved; - }, - _destroy: function _destroy() { - L.DomUtil.remove(this._pane); - delete this._pane; - }, - _resetState: function _resetState() { - this._resetStateTimeout = 0; - this._moved = false; - }, - _clearDeferredResetState: function _clearDeferredResetState() { - if (this._resetStateTimeout !== 0) { - clearTimeout(this._resetStateTimeout); - this._resetStateTimeout = 0; - } - }, - _onMouseDown: function _onMouseDown(e) { - if (!e.shiftKey || e.which !== 1 && e.button !== 1) { - return false; - } // Clear the deferred resetState if it hasn't executed yet, otherwise it - // will interrupt the interaction and orphan a box element in the container. - - - this._clearDeferredResetState(); - - this._resetState(); - - L.DomUtil.disableTextSelection(); - L.DomUtil.disableImageDrag(); - this._startPoint = this._map.mouseEventToContainerPoint(e); - L.DomEvent.on(document, { - contextmenu: L.DomEvent.stop, - mousemove: this._onMouseMove, - mouseup: this._onMouseUp - }, this); - }, - _onMouseMove: function _onMouseMove(e) { - if (!this._moved) { - this._moved = true; - this._box = L.DomUtil.create('div', 'leaflet-zoom-box', this._container); - L.DomUtil.addClass(this._container, 'leaflet-crosshair'); - - this._map.fire('boxzoomstart'); - } - - this._point = this._map.mouseEventToContainerPoint(e); - this._bounds = L.bounds(this._startPoint, this._point); - - var size = this._bounds.getSize(); - - L.DomUtil.setPosition(this._box, this._bounds.min); - this._box.style.width = size.x + 'px'; - this._box.style.height = size.y + 'px'; - }, - _finish: function _finish() { - if (this._moved) { - L.DomUtil.remove(this._box); - L.DomUtil.removeClass(this._container, 'leaflet-crosshair'); - } - - L.DomUtil.enableTextSelection(); - L.DomUtil.enableImageDrag(); - L.DomEvent.off(document, { - contextmenu: L.DomEvent.stop, - mousemove: this._onMouseMove, - mouseup: this._onMouseUp - }, this); - }, - _onMouseUp: function _onMouseUp(e) { - if (e.which !== 1 && e.button !== 1) { - return; - } - - this._finish(); - - if (!this._moved) { - return; - } // Postpone to next JS tick so internal click event handling - // still see it as "moved". - - - this._clearDeferredResetState(); - - this._resetStateTimeout = setTimeout(L.Util.bind(this._resetState, this), 0); - var bounds = L.latLngBounds(this._map.containerPointToLatLng(this._bounds.getBottomLeft()), this._map.containerPointToLatLng(this._bounds.getTopRight())); - - var zoom = this._map.getZoom(); - - var center = this._map.getCenter(); // calls the `project` method but 1st updates the pixel origin - see https://github.com/publiclab/Leaflet.DistortableImage/pull/344 - - - bounds = this._map._latLngBoundsToNewLayerBounds(bounds, zoom, center); - - this._map.fire('boxcollectend', { - boxCollectBounds: bounds - }); - } -}); -L.Map.addInitHook('addHandler', 'boxCollector', L.Map.BoxCollector); - -/***/ }), - -/***/ "./src/mapmixins/DoubleClickLabels.js": -/*!********************************************!*\ - !*** ./src/mapmixins/DoubleClickLabels.js ***! - \********************************************/ -/***/ (function() { - -L.Map.mergeOptions({ - doubleClickLabels: true -}); -/** - * The `doubleClickLabels` handler replaces `doubleClickZoom` by default if `#addGoogleMutant` - * is used unless the options 'labels: false' or 'doubleClickZoom: false` were passed to it. - */ - -L.Map.DoubleClickLabels = L.Map.DoubleClickZoom.extend({ - enable: function enable() { - var map = this._map; - - if (this._enabled) { - return this; - } // disable 'doubleClickZoom' if 'doubleClickLabels' is enabled. - - - if (map.doubleClickZoom.enabled()) { - map.doubleClickZoom.disable(); - } - - this._map.fire('singleclickon'); - - this._enabled = true; - this.addHooks(); - return this; - }, - disable: function disable() { - if (!this._enabled) { - return this; - } - - this._enabled = false; - this.removeHooks(); - return this; - }, - _fireIfSingle: function _fireIfSingle(e) { - var map = this._map; - var oe = e.originalEvent; // prevents deselection in case of box selector - - if (oe && oe.shiftKey) { - return; - } - - map._clicked += 1; - this._map._clickTimeout = setTimeout(function () { - if (map._clicked === 1) { - map._clicked = 0; - map.fire('singleclick', { - type: 'singleclick' - }); - } else { - // manually fire doubleclick event only for touch screens that don't natively fire it - if (L.Browser.touch && oe && oe.sourceCapabilities.firesTouchEvents) { - map.fire('dblclick'); - } - } - }, 250); - }, - _onDoubleClick: function _onDoubleClick() { - var map = this._map; - var labels = map._labels; - setTimeout(function () { - map._clicked = 0; - clearTimeout(map._clickTimeout); - }, 0); - - if (!labels) { - return; - } - - if (labels.options.opacity === 1) { - labels.options.opacity = 0; - labels.setOpacity(0); - } else { - labels.options.opacity = 1; - labels.setOpacity(1); - } - } -}); -L.Map.addInitHook('addHandler', 'doubleClickLabels', L.Map.DoubleClickLabels); - -/***/ }), - -/***/ "./src/mapmixins/DoubleClickZoom.js": -/*!******************************************!*\ - !*** ./src/mapmixins/DoubleClickZoom.js ***! - \******************************************/ -/***/ (function() { - -/** - * `L.Map.DoubleClickZoom` from leaflet 1.5.1, overrwritten so that it - * 1) Fires a `singleclick` event to avoid deselecting images on `dblclick`. - * 2) Maintains a mutually exclusive relationship with the map's `DoubleClickLabels` handler - */ -L.Map.DoubleClickZoom.include({ - addHooks: function addHooks() { - this._map.on({ - click: this._fireIfSingle, - dblclick: this._onDoubleClick - }, this); - }, - removeHooks: function removeHooks() { - this._map.off({ - click: this._fireIfSingle, - dblclick: this._onDoubleClick - }, this); - }, - enable: function enable() { - if (this._enabled) { - return this; - } // don't enable 'doubleClickZoom' unless 'doubleClickLabels' is disabled first - - - if (this._map.doubleClickLabels) { - if (this._map.doubleClickLabels.enabled()) { - return this; - } - } // signify to collection/instance classes to turn on 'singleclick' listeners - - - this._map.fire('singleclickon'); - - this._enabled = true; - this.addHooks(); - return this; - }, - disable: function disable() { - if (!this._enabled) { - return this; - } // signify to collection/instance safe to swap 'singleclick' listeners with 'click' listeners. - - - this._map.fire('singleclickoff'); - - this._enabled = false; - this.removeHooks(); - return this; - }, - _fireIfSingle: function _fireIfSingle(e) { - var map = this._map; - var oe = e.originalEvent; // prevents deselection in case of box selector - - if (oe && oe.shiftKey) { - return; - } - - map._clicked += 1; - this._map._clickTimeout = setTimeout(function () { - if (map._clicked === 1) { - map._clicked = 0; - map.fire('singleclick', { - type: 'singleclick' - }); - } else { - // manually fire doubleclick event only for touch screens that don't natively fire it - if (L.Browser.touch && oe && oe.sourceCapabilities.firesTouchEvents) { - /* in `DoubleClickLabels.js`, we just do map.fire('dblclick') bc `_onDoublClick` doesn't use the - passed "e" (for now). To generate a 'real' DOM event that will have all of its corresponding core - properties (originalEvent, latlng, etc.), use Leaflet's `#map._fireDOMEvent` (Leaflet 1.5.1 source) */ - map._fireDOMEvent(oe, 'dblclick', [map]); - } - } - }, 250); - }, - _onDoubleClick: function _onDoubleClick(e) { - var map = this._map; - var oe = e.originalEvent; - setTimeout(function () { - map._clicked = 0; - clearTimeout(map._clickTimeout); - }, 0); - - if (!oe) { - return false; - } - - var oldZoom = map.getZoom(); - var delta = map.options.zoomDelta; - var zoom = oe.shiftKey ? oldZoom - delta : oldZoom + delta; - - if (map.options.doubleClickZoom === 'center') { - map.setZoom(zoom); - } else { - map.setZoomAround(e.containerPoint, zoom); - } - } -}); - -/***/ }), - -/***/ "./src/mapmixins/MapMixins.js": -/*!************************************!*\ - !*** ./src/mapmixins/MapMixins.js ***! - \************************************/ -/***/ (function() { - -/* eslint-disable max-len */ -L.Map.include({ - _clicked: 0, - addGoogleMutant: function addGoogleMutant(opts) { - var url = 'http://mt0.google.com/vt/lyrs=s&x={x}&y={y}&z={z}'; - opts = this.mutantOptions = L.extend({ - mutantOpacity: 0.8, - maxZoom: 24, - maxNativeZoom: 20, - minZoom: 0, - labels: true, - labelOpacity: 1, - doubleClickLabels: true - }, opts); - - if (!opts.labels) { - this.mutantOptions = L.extend(this.mutantOptions, { - labelOpacity: opts.labels ? 1 : undefined, - doubleClickLabels: opts.labels ? true : undefined - }); - } - - this._googleMutant = L.tileLayer(url, { - maxZoom: opts.maxZoom, - maxNativeZoom: opts.maxNativeZoom, - minZoom: opts.minZoom, - opacity: opts.mutantOpacity - }).addTo(this); - - if (opts.labels) { - this._addLabels(opts); - } // shouldn't have this handler at all if there are no labels to toggle - else { - this.doubleClickLabels = undefined; - } - - return this; - }, - _addLabels: function _addLabels(opts) { - var url = 'https://stamen-tiles-{s}.a.ssl.fastly.net/toner-labels/{z}/{x}/{y}{r}.{ext}'; - - if (opts.labelOpacity !== 0 && opts.labelOpacity !== 1) { - opts.labelOpacity = 1; - } - - this._labels = L.tileLayer(url, { - attribution: 'Map tiles by Stamen Design, CC BY 3.0 — Map data © OpenStreetMap contributors', - subdomains: 'abcd', - interactive: false, - opacity: opts.labelOpacity, - maxZoom: opts.maxZoom, - maxNativeZoom: opts.maxNativeZoom, - minZoom: opts.minZoom, - ext: 'png' - }).addTo(this); - - if (this.mutantOptions.doubleClickLabels) { - this.doubleClickLabels.enable(); - } - - return this; - } -}); // start off with doubleClickZoom enabled, doubleClickLabels can later be enabled instead -// during initialization - -L.Map.addInitHook(function () { - this.doubleClickLabels.disable(); - this.doubleClickZoom.enable(); -}); - -/***/ }), - -/***/ "./src/util/DomUtil.js": -/*!*****************************!*\ - !*** ./src/util/DomUtil.js ***! - \*****************************/ -/***/ (function() { - -L.DomUtil = L.extend(L.DomUtil, { - initTranslation: function initTranslation(obj) { - this.translation = obj; - }, - getMatrixString: function getMatrixString(m) { - var is3d = L.Browser.webkit3d || L.Browser.gecko3d || L.Browser.ie3d; - /* - * Since matrix3d takes a 4*4 matrix, we add in an empty row and column, - * which act as the identity on the z-axis. - * See: - * http://franklinta.com/2014/09/08/computing-css-matrix3d-transforms/ - * https://developer.mozilla.org/en-US/docs/Web/CSS/transform-function#M.C3.B6bius'_homogeneous_coordinates_in_projective_geometry - */ - - var matrix = [m[0], m[3], 0, m[6], m[1], m[4], 0, m[7], 0, 0, 1, 0, m[2], m[5], 0, m[8]]; - var str = is3d ? 'matrix3d(' + matrix.join(',') + ')' : ''; - - if (!is3d) { - console.log('Your browser must support 3D CSS transforms' + 'in order to use DistortableImageOverlay.'); - } - - return str; - }, - toggleClass: function toggleClass(el, className) { - var c = className; - return this.hasClass(el, c) ? this.removeClass(el, c) : this.addClass(el, c); - }, - confirmDelete: function confirmDelete() { - return window.confirm(this.translation.confirmImageDelete); - }, - confirmDeletes: function confirmDeletes(n) { - if (n === 1) { - return this.confirmDelete(); - } - - var translation = this.translation.confirmImagesDeletes; - var warningMsg = ''; - - if (typeof translation === 'function') { - warningMsg = translation(n); - } else { - warningMsg = translation; - } - - return window.confirm(warningMsg); - } -}); - -/***/ }), - -/***/ "./src/util/IconUtil.js": -/*!******************************!*\ - !*** ./src/util/IconUtil.js ***! - \******************************/ -/***/ (function() { - -L.IconUtil = { - /* creates an svg elemenet with built in accessibility properties - * and standardized classes for styling, takes in the fragment - * identifier (id) of the symbol to reference. note for symplicity - * we allow providing the icon target with or without the '#' prefix - */ - create: function create(ref) { - if (/^#/.test(ref)) { - ref = ref.replace(/^#/, ''); - } - - return '' + '' + ''; - }, - addClassToSvg: function addClassToSvg(container, loader) { - var svg = container.querySelector('svg'); - - if (svg) { - L.DomUtil.addClass(svg, loader); - } - }, - // finds the use element and toggles its icon reference - toggleXlink: function toggleXlink(container, ref1, ref2) { - if (!/^#/.test(ref1)) { - ref1 = '#' + ref1; - } - - if (!/^#/.test(ref2)) { - ref2 = '#' + ref2; - } - - var use = container.querySelector('use'); - - if (use) { - var toggled = use.getAttribute('xlink:href') === ref1 ? ref2 : ref1; - use.setAttribute('xlink:href', toggled); - return toggled; - } - - return false; - }, - toggleTitle: function toggleTitle(container, title1, title2) { - var toggled = container.getAttribute('title') === title1 ? title2 : title1; - container.setAttribute('title', toggled); - - if (container.hasAttribute('aria-label')) { - container.setAttribute('aria-label', toggled); - } - - return toggled; - } -}; - -/***/ }), - -/***/ "./src/util/ImageUtil.js": -/*!*******************************!*\ - !*** ./src/util/ImageUtil.js ***! - \*******************************/ -/***/ (function() { - -L.ImageUtil = { - getCmPerPixel: function getCmPerPixel(overlay) { - var map = overlay._map; - var dist = map.latLngToLayerPoint(overlay.getCorner(0)).distanceTo(map.latLngToLayerPoint(overlay.getCorner(1))); - return dist * 100 / overlay.getElement().width; - } -}; - -/***/ }), - -/***/ "./src/util/MatrixUtil.js": -/*!********************************!*\ - !*** ./src/util/MatrixUtil.js ***! - \********************************/ -/***/ (function() { - -L.MatrixUtil = { - // Compute the adjugate of m - adj: function adj(m) { - return [m[4] * m[8] - m[5] * m[7], m[2] * m[7] - m[1] * m[8], m[1] * m[5] - m[2] * m[4], m[5] * m[6] - m[3] * m[8], m[0] * m[8] - m[2] * m[6], m[2] * m[3] - m[0] * m[5], m[3] * m[7] - m[4] * m[6], m[1] * m[6] - m[0] * m[7], m[0] * m[4] - m[1] * m[3]]; - }, - // multiply two 3*3 matrices - multmm: function multmm(a, b) { - var c = []; - var i; - - for (i = 0; i < 3; i++) { - for (var j = 0; j < 3; j++) { - var cij = 0; - - for (var k = 0; k < 3; k++) { - cij += a[3 * i + k] * b[3 * k + j]; - } - - c[3 * i + j] = cij; - } - } - - return c; - }, - // multiply a 3*3 matrix and a 3-vector - multmv: function multmv(m, v) { - return [m[0] * v[0] + m[1] * v[1] + m[2] * v[2], m[3] * v[0] + m[4] * v[1] + m[5] * v[2], m[6] * v[0] + m[7] * v[1] + m[8] * v[2]]; - }, - // multiply a scalar and a 3*3 matrix - multsm: function multsm(s, m) { - var matrix = []; - - for (var i = 0, l = m.length; i < l; i++) { - matrix.push(s * m[i]); - } - - return matrix; - }, - basisToPoints: function basisToPoints(x1, y1, x2, y2, x3, y3, x4, y4) { - var m = [x1, x2, x3, y1, y2, y3, 1, 1, 1]; - var v = L.MatrixUtil.multmv(L.MatrixUtil.adj(m), [x4, y4, 1]); - return L.MatrixUtil.multmm(m, [v[0], 0, 0, 0, v[1], 0, 0, 0, v[2]]); - }, - project: function project(m, x, y) { - var v = L.MatrixUtil.multmv(m, [x, y, 1]); - return [v[0] / v[2], v[1] / v[2]]; - }, - general2DProjection: function general2DProjection(x1s, y1s, x1d, y1d, x2s, y2s, x2d, y2d, x3s, y3s, x3d, y3d, x4s, y4s, x4d, y4d) { - var s = L.MatrixUtil.basisToPoints(x1s, y1s, x2s, y2s, x3s, y3s, x4s, y4s); - var d = L.MatrixUtil.basisToPoints(x1d, y1d, x2d, y2d, x3d, y3d, x4d, y4d); - var m = L.MatrixUtil.multmm(d, L.MatrixUtil.adj(s)); // Normalize to the unique matrix with m[8] == 1. - // See: http://franklinta.com/2014/09/08/computing-css-matrix3d-transforms/ - - return L.MatrixUtil.multsm(1 / m[8], m); - } -}; - -/***/ }), - -/***/ "./src/util/TrigUtil.js": -/*!******************************!*\ - !*** ./src/util/TrigUtil.js ***! - \******************************/ -/***/ (function() { - -L.TrigUtil = { - calcAngle: function calcAngle(x, y) { - var unit = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'deg'; - return unit === 'deg' ? this.radiansToDegrees(Math.atan2(y, x)) : Math.atan2(y, x); - }, - radiansToDegrees: function radiansToDegrees(angle) { - return angle * 180 / Math.PI; - }, - degreesToRadians: function degreesToRadians(angle) { - return angle * Math.PI / 180; - } -}; - -/***/ }), - -/***/ "./src/util/Utils.js": -/*!***************************!*\ - !*** ./src/util/Utils.js ***! - \***************************/ -/***/ (function() { - -L.Utils = { - initTranslation: function initTranslation() { - var translation = { - deleteImage: 'Delete Image', - deleteImages: 'Delete Images', - distortImage: 'Distort Image', - dragImage: 'Drag Image', - exportImage: 'Export Image', - exportImages: 'Export Images', - removeBorder: 'Remove Border', - addBorder: 'Add Border', - freeRotateImage: 'Free rotate Image', - geolocateImage: 'Geolocate Image', - lockMode: 'Lock Mode', - lockImages: 'Lock Images', - makeImageOpaque: 'Make Image Opaque', - makeImageTransparent: 'Make Image Transparent', - restoreImage: 'Restore Natural Image', - rotateImage: 'Rotate Image', - scaleImage: 'Scale Image', - stackToFront: 'Stack to Front', - stackToBack: 'Stack to Back', - unlockImages: 'Unlock Images', - confirmImageDelete: 'Are you sure? This image will be permanently deleted from the map.', - confirmImagesDeletes: 'Are you sure? These images will be permanently deleted from the map.' - }; - - if (!this.options.translation) { - this.options.translation = translation; - } else { - // If the translation for a word is not specified, fallback to English. - for (var key in translation) { - if (!this.options.translation.hasOwnProperty(key)) { - this.options.translation[key] = translation[key]; - } - } - } - - L.DomUtil.initTranslation(this.options.translation); - }, - getNestedVal: function getNestedVal(obj, key, nestedKey) { - var dig = [key, nestedKey]; - return dig.reduce(function (obj, k) { - return obj && obj[k]; - }, obj); - } -}; - -/***/ }), - -/***/ "./node_modules/events/events.js": -/*!***************************************!*\ - !*** ./node_modules/events/events.js ***! - \***************************************/ -/***/ (function(module) { - -"use strict"; -// Copyright Joyent, Inc. and other Node contributors. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to permit -// persons to whom the Software is furnished to do so, subject to the -// following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -// USE OR OTHER DEALINGS IN THE SOFTWARE. - - - -var R = typeof Reflect === 'object' ? Reflect : null -var ReflectApply = R && typeof R.apply === 'function' - ? R.apply - : function ReflectApply(target, receiver, args) { - return Function.prototype.apply.call(target, receiver, args); - } - -var ReflectOwnKeys -if (R && typeof R.ownKeys === 'function') { - ReflectOwnKeys = R.ownKeys -} else if (Object.getOwnPropertySymbols) { - ReflectOwnKeys = function ReflectOwnKeys(target) { - return Object.getOwnPropertyNames(target) - .concat(Object.getOwnPropertySymbols(target)); - }; -} else { - ReflectOwnKeys = function ReflectOwnKeys(target) { - return Object.getOwnPropertyNames(target); - }; -} - -function ProcessEmitWarning(warning) { - if (console && console.warn) console.warn(warning); -} - -var NumberIsNaN = Number.isNaN || function NumberIsNaN(value) { - return value !== value; -} - -function EventEmitter() { - EventEmitter.init.call(this); -} -module.exports = EventEmitter; -module.exports.once = once; - -// Backwards-compat with node 0.10.x -EventEmitter.EventEmitter = EventEmitter; - -EventEmitter.prototype._events = undefined; -EventEmitter.prototype._eventsCount = 0; -EventEmitter.prototype._maxListeners = undefined; - -// By default EventEmitters will print a warning if more than 10 listeners are -// added to it. This is a useful default which helps finding memory leaks. -var defaultMaxListeners = 10; - -function checkListener(listener) { - if (typeof listener !== 'function') { - throw new TypeError('The "listener" argument must be of type Function. Received type ' + typeof listener); - } -} - -Object.defineProperty(EventEmitter, 'defaultMaxListeners', { - enumerable: true, - get: function() { - return defaultMaxListeners; - }, - set: function(arg) { - if (typeof arg !== 'number' || arg < 0 || NumberIsNaN(arg)) { - throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received ' + arg + '.'); - } - defaultMaxListeners = arg; - } -}); - -EventEmitter.init = function() { - - if (this._events === undefined || - this._events === Object.getPrototypeOf(this)._events) { - this._events = Object.create(null); - this._eventsCount = 0; - } - - this._maxListeners = this._maxListeners || undefined; -}; - -// Obviously not all Emitters should be limited to 10. This function allows -// that to be increased. Set to zero for unlimited. -EventEmitter.prototype.setMaxListeners = function setMaxListeners(n) { - if (typeof n !== 'number' || n < 0 || NumberIsNaN(n)) { - throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received ' + n + '.'); - } - this._maxListeners = n; - return this; -}; - -function _getMaxListeners(that) { - if (that._maxListeners === undefined) - return EventEmitter.defaultMaxListeners; - return that._maxListeners; -} - -EventEmitter.prototype.getMaxListeners = function getMaxListeners() { - return _getMaxListeners(this); -}; - -EventEmitter.prototype.emit = function emit(type) { - var args = []; - for (var i = 1; i < arguments.length; i++) args.push(arguments[i]); - var doError = (type === 'error'); - - var events = this._events; - if (events !== undefined) - doError = (doError && events.error === undefined); - else if (!doError) - return false; - - // If there is no 'error' event listener then throw. - if (doError) { - var er; - if (args.length > 0) - er = args[0]; - if (er instanceof Error) { - // Note: The comments on the `throw` lines are intentional, they show - // up in Node's output if this results in an unhandled exception. - throw er; // Unhandled 'error' event - } - // At least give some kind of context to the user - var err = new Error('Unhandled error.' + (er ? ' (' + er.message + ')' : '')); - err.context = er; - throw err; // Unhandled 'error' event - } - - var handler = events[type]; - - if (handler === undefined) - return false; - - if (typeof handler === 'function') { - ReflectApply(handler, this, args); - } else { - var len = handler.length; - var listeners = arrayClone(handler, len); - for (var i = 0; i < len; ++i) - ReflectApply(listeners[i], this, args); - } - - return true; -}; - -function _addListener(target, type, listener, prepend) { - var m; - var events; - var existing; - - checkListener(listener); - - events = target._events; - if (events === undefined) { - events = target._events = Object.create(null); - target._eventsCount = 0; - } else { - // To avoid recursion in the case that type === "newListener"! Before - // adding it to the listeners, first emit "newListener". - if (events.newListener !== undefined) { - target.emit('newListener', type, - listener.listener ? listener.listener : listener); - - // Re-assign `events` because a newListener handler could have caused the - // this._events to be assigned to a new object - events = target._events; - } - existing = events[type]; - } - - if (existing === undefined) { - // Optimize the case of one listener. Don't need the extra array object. - existing = events[type] = listener; - ++target._eventsCount; - } else { - if (typeof existing === 'function') { - // Adding the second element, need to change to array. - existing = events[type] = - prepend ? [listener, existing] : [existing, listener]; - // If we've already got an array, just append. - } else if (prepend) { - existing.unshift(listener); - } else { - existing.push(listener); - } - - // Check for listener leak - m = _getMaxListeners(target); - if (m > 0 && existing.length > m && !existing.warned) { - existing.warned = true; - // No error code for this since it is a Warning - // eslint-disable-next-line no-restricted-syntax - var w = new Error('Possible EventEmitter memory leak detected. ' + - existing.length + ' ' + String(type) + ' listeners ' + - 'added. Use emitter.setMaxListeners() to ' + - 'increase limit'); - w.name = 'MaxListenersExceededWarning'; - w.emitter = target; - w.type = type; - w.count = existing.length; - ProcessEmitWarning(w); - } - } - - return target; -} - -EventEmitter.prototype.addListener = function addListener(type, listener) { - return _addListener(this, type, listener, false); -}; - -EventEmitter.prototype.on = EventEmitter.prototype.addListener; - -EventEmitter.prototype.prependListener = - function prependListener(type, listener) { - return _addListener(this, type, listener, true); - }; - -function onceWrapper() { - if (!this.fired) { - this.target.removeListener(this.type, this.wrapFn); - this.fired = true; - if (arguments.length === 0) - return this.listener.call(this.target); - return this.listener.apply(this.target, arguments); - } -} - -function _onceWrap(target, type, listener) { - var state = { fired: false, wrapFn: undefined, target: target, type: type, listener: listener }; - var wrapped = onceWrapper.bind(state); - wrapped.listener = listener; - state.wrapFn = wrapped; - return wrapped; -} - -EventEmitter.prototype.once = function once(type, listener) { - checkListener(listener); - this.on(type, _onceWrap(this, type, listener)); - return this; -}; - -EventEmitter.prototype.prependOnceListener = - function prependOnceListener(type, listener) { - checkListener(listener); - this.prependListener(type, _onceWrap(this, type, listener)); - return this; - }; - -// Emits a 'removeListener' event if and only if the listener was removed. -EventEmitter.prototype.removeListener = - function removeListener(type, listener) { - var list, events, position, i, originalListener; - - checkListener(listener); - - events = this._events; - if (events === undefined) - return this; - - list = events[type]; - if (list === undefined) - return this; - - if (list === listener || list.listener === listener) { - if (--this._eventsCount === 0) - this._events = Object.create(null); - else { - delete events[type]; - if (events.removeListener) - this.emit('removeListener', type, list.listener || listener); - } - } else if (typeof list !== 'function') { - position = -1; - - for (i = list.length - 1; i >= 0; i--) { - if (list[i] === listener || list[i].listener === listener) { - originalListener = list[i].listener; - position = i; - break; - } - } - - if (position < 0) - return this; - - if (position === 0) - list.shift(); - else { - spliceOne(list, position); - } - - if (list.length === 1) - events[type] = list[0]; - - if (events.removeListener !== undefined) - this.emit('removeListener', type, originalListener || listener); - } - - return this; - }; - -EventEmitter.prototype.off = EventEmitter.prototype.removeListener; - -EventEmitter.prototype.removeAllListeners = - function removeAllListeners(type) { - var listeners, events, i; - - events = this._events; - if (events === undefined) - return this; - - // not listening for removeListener, no need to emit - if (events.removeListener === undefined) { - if (arguments.length === 0) { - this._events = Object.create(null); - this._eventsCount = 0; - } else if (events[type] !== undefined) { - if (--this._eventsCount === 0) - this._events = Object.create(null); - else - delete events[type]; - } - return this; - } - - // emit removeListener for all listeners on all events - if (arguments.length === 0) { - var keys = Object.keys(events); - var key; - for (i = 0; i < keys.length; ++i) { - key = keys[i]; - if (key === 'removeListener') continue; - this.removeAllListeners(key); - } - this.removeAllListeners('removeListener'); - this._events = Object.create(null); - this._eventsCount = 0; - return this; - } - - listeners = events[type]; - - if (typeof listeners === 'function') { - this.removeListener(type, listeners); - } else if (listeners !== undefined) { - // LIFO order - for (i = listeners.length - 1; i >= 0; i--) { - this.removeListener(type, listeners[i]); - } - } - - return this; - }; - -function _listeners(target, type, unwrap) { - var events = target._events; - - if (events === undefined) - return []; - - var evlistener = events[type]; - if (evlistener === undefined) - return []; - - if (typeof evlistener === 'function') - return unwrap ? [evlistener.listener || evlistener] : [evlistener]; - - return unwrap ? - unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length); -} - -EventEmitter.prototype.listeners = function listeners(type) { - return _listeners(this, type, true); -}; - -EventEmitter.prototype.rawListeners = function rawListeners(type) { - return _listeners(this, type, false); -}; - -EventEmitter.listenerCount = function(emitter, type) { - if (typeof emitter.listenerCount === 'function') { - return emitter.listenerCount(type); - } else { - return listenerCount.call(emitter, type); - } -}; - -EventEmitter.prototype.listenerCount = listenerCount; -function listenerCount(type) { - var events = this._events; - - if (events !== undefined) { - var evlistener = events[type]; - - if (typeof evlistener === 'function') { - return 1; - } else if (evlistener !== undefined) { - return evlistener.length; - } - } - - return 0; -} - -EventEmitter.prototype.eventNames = function eventNames() { - return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : []; -}; - -function arrayClone(arr, n) { - var copy = new Array(n); - for (var i = 0; i < n; ++i) - copy[i] = arr[i]; - return copy; -} - -function spliceOne(list, index) { - for (; index + 1 < list.length; index++) - list[index] = list[index + 1]; - list.pop(); -} - -function unwrapListeners(arr) { - var ret = new Array(arr.length); - for (var i = 0; i < ret.length; ++i) { - ret[i] = arr[i].listener || arr[i]; - } - return ret; -} - -function once(emitter, name) { - return new Promise(function (resolve, reject) { - function errorListener(err) { - emitter.removeListener(name, resolver); - reject(err); - } - - function resolver() { - if (typeof emitter.removeListener === 'function') { - emitter.removeListener('error', errorListener); - } - resolve([].slice.call(arguments)); - }; - - eventTargetAgnosticAddListener(emitter, name, resolver, { once: true }); - if (name !== 'error') { - addErrorHandlerIfEventEmitter(emitter, errorListener, { once: true }); - } - }); -} - -function addErrorHandlerIfEventEmitter(emitter, handler, flags) { - if (typeof emitter.on === 'function') { - eventTargetAgnosticAddListener(emitter, 'error', handler, flags); - } -} - -function eventTargetAgnosticAddListener(emitter, name, listener, flags) { - if (typeof emitter.on === 'function') { - if (flags.once) { - emitter.once(name, listener); - } else { - emitter.on(name, listener); - } - } else if (typeof emitter.addEventListener === 'function') { - // EventTarget does not have `error` event semantics like Node - // EventEmitters, we do not listen for `error` events here. - emitter.addEventListener(name, function wrapListener(arg) { - // IE does not have builtin `{ once: true }` support so we - // have to do it manually. - if (flags.once) { - emitter.removeEventListener(name, wrapListener); - } - listener(arg); - }); - } else { - throw new TypeError('The "emitter" argument must be of type EventEmitter. Received type ' + typeof emitter); - } -} - - -/***/ }), - -/***/ "./node_modules/html-entities/lib/index.js": -/*!*************************************************!*\ - !*** ./node_modules/html-entities/lib/index.js ***! - \*************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - -"use strict"; - -var __assign = (this && this.__assign) || function () { - __assign = Object.assign || function(t) { - for (var s, i = 1, n = arguments.length; i < n; i++) { - s = arguments[i]; - for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) - t[p] = s[p]; - } - return t; - }; - return __assign.apply(this, arguments); -}; -Object.defineProperty(exports, "__esModule", ({ value: true })); -var named_references_1 = __webpack_require__(/*! ./named-references */ "./node_modules/html-entities/lib/named-references.js"); -var numeric_unicode_map_1 = __webpack_require__(/*! ./numeric-unicode-map */ "./node_modules/html-entities/lib/numeric-unicode-map.js"); -var surrogate_pairs_1 = __webpack_require__(/*! ./surrogate-pairs */ "./node_modules/html-entities/lib/surrogate-pairs.js"); -var allNamedReferences = __assign(__assign({}, named_references_1.namedReferences), { all: named_references_1.namedReferences.html5 }); -var encodeRegExps = { - specialChars: /[<>'"&]/g, - nonAscii: /(?:[<>'"&\u0080-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])/g, - nonAsciiPrintable: /(?:[<>'"&\x01-\x08\x11-\x15\x17-\x1F\x7f-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])/g, - extensive: /(?:[\x01-\x0c\x0e-\x1f\x21-\x2c\x2e-\x2f\x3a-\x40\x5b-\x60\x7b-\x7d\x7f-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])/g -}; -var defaultEncodeOptions = { - mode: 'specialChars', - level: 'all', - numeric: 'decimal' -}; -/** Encodes all the necessary (specified by `level`) characters in the text */ -function encode(text, _a) { - var _b = _a === void 0 ? defaultEncodeOptions : _a, _c = _b.mode, mode = _c === void 0 ? 'specialChars' : _c, _d = _b.numeric, numeric = _d === void 0 ? 'decimal' : _d, _e = _b.level, level = _e === void 0 ? 'all' : _e; - if (!text) { - return ''; - } - var encodeRegExp = encodeRegExps[mode]; - var references = allNamedReferences[level].characters; - var isHex = numeric === 'hexadecimal'; - encodeRegExp.lastIndex = 0; - var _b = encodeRegExp.exec(text); - var _c; - if (_b) { - _c = ''; - var _d = 0; - do { - if (_d !== _b.index) { - _c += text.substring(_d, _b.index); - } - var _e = _b[0]; - var result_1 = references[_e]; - if (!result_1) { - var code_1 = _e.length > 1 ? surrogate_pairs_1.getCodePoint(_e, 0) : _e.charCodeAt(0); - result_1 = (isHex ? '&#x' + code_1.toString(16) : '&#' + code_1) + ';'; - } - _c += result_1; - _d = _b.index + _e.length; - } while ((_b = encodeRegExp.exec(text))); - if (_d !== text.length) { - _c += text.substring(_d); - } - } - else { - _c = - text; - } - return _c; -} -exports.encode = encode; -var defaultDecodeOptions = { - scope: 'body', - level: 'all' -}; -var strict = /&(?:#\d+|#[xX][\da-fA-F]+|[0-9a-zA-Z]+);/g; -var attribute = /&(?:#\d+|#[xX][\da-fA-F]+|[0-9a-zA-Z]+)[;=]?/g; -var baseDecodeRegExps = { - xml: { - strict: strict, - attribute: attribute, - body: named_references_1.bodyRegExps.xml - }, - html4: { - strict: strict, - attribute: attribute, - body: named_references_1.bodyRegExps.html4 - }, - html5: { - strict: strict, - attribute: attribute, - body: named_references_1.bodyRegExps.html5 - } -}; -var decodeRegExps = __assign(__assign({}, baseDecodeRegExps), { all: baseDecodeRegExps.html5 }); -var fromCharCode = String.fromCharCode; -var outOfBoundsChar = fromCharCode(65533); -var defaultDecodeEntityOptions = { - level: 'all' -}; -/** Decodes a single entity */ -function decodeEntity(entity, _a) { - var _b = (_a === void 0 ? defaultDecodeEntityOptions : _a).level, level = _b === void 0 ? 'all' : _b; - if (!entity) { - return ''; - } - var _b = entity; - var decodeEntityLastChar_1 = entity[entity.length - 1]; - if (false) {} - else if (false) {} - else { - var decodeResultByReference_1 = allNamedReferences[level].entities[entity]; - if (decodeResultByReference_1) { - _b = decodeResultByReference_1; - } - else if (entity[0] === '&' && entity[1] === '#') { - var decodeSecondChar_1 = entity[2]; - var decodeCode_1 = decodeSecondChar_1 == 'x' || decodeSecondChar_1 == 'X' - ? parseInt(entity.substr(3), 16) - : parseInt(entity.substr(2)); - _b = - decodeCode_1 >= 0x10ffff - ? outOfBoundsChar - : decodeCode_1 > 65535 - ? surrogate_pairs_1.fromCodePoint(decodeCode_1) - : fromCharCode(numeric_unicode_map_1.numericUnicodeMap[decodeCode_1] || decodeCode_1); - } - } - return _b; -} -exports.decodeEntity = decodeEntity; -/** Decodes all entities in the text */ -function decode(text, _a) { - var decodeSecondChar_1 = _a === void 0 ? defaultDecodeOptions : _a, decodeCode_1 = decodeSecondChar_1.level, level = decodeCode_1 === void 0 ? 'all' : decodeCode_1, _b = decodeSecondChar_1.scope, scope = _b === void 0 ? level === 'xml' ? 'strict' : 'body' : _b; - if (!text) { - return ''; - } - var decodeRegExp = decodeRegExps[level][scope]; - var references = allNamedReferences[level].entities; - var isAttribute = scope === 'attribute'; - var isStrict = scope === 'strict'; - decodeRegExp.lastIndex = 0; - var replaceMatch_1 = decodeRegExp.exec(text); - var replaceResult_1; - if (replaceMatch_1) { - replaceResult_1 = ''; - var replaceLastIndex_1 = 0; - do { - if (replaceLastIndex_1 !== replaceMatch_1.index) { - replaceResult_1 += text.substring(replaceLastIndex_1, replaceMatch_1.index); - } - var replaceInput_1 = replaceMatch_1[0]; - var decodeResult_1 = replaceInput_1; - var decodeEntityLastChar_2 = replaceInput_1[replaceInput_1.length - 1]; - if (isAttribute - && decodeEntityLastChar_2 === '=') { - decodeResult_1 = replaceInput_1; - } - else if (isStrict - && decodeEntityLastChar_2 !== ';') { - decodeResult_1 = replaceInput_1; - } - else { - var decodeResultByReference_2 = references[replaceInput_1]; - if (decodeResultByReference_2) { - decodeResult_1 = decodeResultByReference_2; - } - else if (replaceInput_1[0] === '&' && replaceInput_1[1] === '#') { - var decodeSecondChar_2 = replaceInput_1[2]; - var decodeCode_2 = decodeSecondChar_2 == 'x' || decodeSecondChar_2 == 'X' - ? parseInt(replaceInput_1.substr(3), 16) - : parseInt(replaceInput_1.substr(2)); - decodeResult_1 = - decodeCode_2 >= 0x10ffff - ? outOfBoundsChar - : decodeCode_2 > 65535 - ? surrogate_pairs_1.fromCodePoint(decodeCode_2) - : fromCharCode(numeric_unicode_map_1.numericUnicodeMap[decodeCode_2] || decodeCode_2); - } - } - replaceResult_1 += decodeResult_1; - replaceLastIndex_1 = replaceMatch_1.index + replaceInput_1.length; - } while ((replaceMatch_1 = decodeRegExp.exec(text))); - if (replaceLastIndex_1 !== text.length) { - replaceResult_1 += text.substring(replaceLastIndex_1); - } - } - else { - replaceResult_1 = - text; - } - return replaceResult_1; -} -exports.decode = decode; - - -/***/ }), - -/***/ "./node_modules/html-entities/lib/named-references.js": -/*!************************************************************!*\ - !*** ./node_modules/html-entities/lib/named-references.js ***! - \************************************************************/ -/***/ (function(__unused_webpack_module, exports) { - -"use strict"; -Object.defineProperty(exports, "__esModule", ({value:true}));exports.bodyRegExps={xml:/&(?:#\d+|#[xX][\da-fA-F]+|[0-9a-zA-Z]+);?/g,html4:/&(?:nbsp|iexcl|cent|pound|curren|yen|brvbar|sect|uml|copy|ordf|laquo|not|shy|reg|macr|deg|plusmn|sup2|sup3|acute|micro|para|middot|cedil|sup1|ordm|raquo|frac14|frac12|frac34|iquest|Agrave|Aacute|Acirc|Atilde|Auml|Aring|AElig|Ccedil|Egrave|Eacute|Ecirc|Euml|Igrave|Iacute|Icirc|Iuml|ETH|Ntilde|Ograve|Oacute|Ocirc|Otilde|Ouml|times|Oslash|Ugrave|Uacute|Ucirc|Uuml|Yacute|THORN|szlig|agrave|aacute|acirc|atilde|auml|aring|aelig|ccedil|egrave|eacute|ecirc|euml|igrave|iacute|icirc|iuml|eth|ntilde|ograve|oacute|ocirc|otilde|ouml|divide|oslash|ugrave|uacute|ucirc|uuml|yacute|thorn|yuml|quot|amp|lt|gt|#\d+|#[xX][\da-fA-F]+|[0-9a-zA-Z]+);?/g,html5:/&(?:AElig|AMP|Aacute|Acirc|Agrave|Aring|Atilde|Auml|COPY|Ccedil|ETH|Eacute|Ecirc|Egrave|Euml|GT|Iacute|Icirc|Igrave|Iuml|LT|Ntilde|Oacute|Ocirc|Ograve|Oslash|Otilde|Ouml|QUOT|REG|THORN|Uacute|Ucirc|Ugrave|Uuml|Yacute|aacute|acirc|acute|aelig|agrave|amp|aring|atilde|auml|brvbar|ccedil|cedil|cent|copy|curren|deg|divide|eacute|ecirc|egrave|eth|euml|frac12|frac14|frac34|gt|iacute|icirc|iexcl|igrave|iquest|iuml|laquo|lt|macr|micro|middot|nbsp|not|ntilde|oacute|ocirc|ograve|ordf|ordm|oslash|otilde|ouml|para|plusmn|pound|quot|raquo|reg|sect|shy|sup1|sup2|sup3|szlig|thorn|times|uacute|ucirc|ugrave|uml|uuml|yacute|yen|yuml|#\d+|#[xX][\da-fA-F]+|[0-9a-zA-Z]+);?/g};exports.namedReferences={xml:{entities:{"<":"<",">":">",""":'"',"'":"'","&":"&"},characters:{"<":"<",">":">",'"':""","'":"'","&":"&"}},html4:{entities:{"'":"'"," ":" "," ":" ","¡":"¡","¡":"¡","¢":"¢","¢":"¢","£":"£","£":"£","¤":"¤","¤":"¤","¥":"¥","¥":"¥","¦":"¦","¦":"¦","§":"§","§":"§","¨":"¨","¨":"¨","©":"©","©":"©","ª":"ª","ª":"ª","«":"«","«":"«","¬":"¬","¬":"¬","­":"­","­":"­","®":"®","®":"®","¯":"¯","¯":"¯","°":"°","°":"°","±":"±","±":"±","²":"²","²":"²","³":"³","³":"³","´":"´","´":"´","µ":"µ","µ":"µ","¶":"¶","¶":"¶","·":"·","·":"·","¸":"¸","¸":"¸","¹":"¹","¹":"¹","º":"º","º":"º","»":"»","»":"»","¼":"¼","¼":"¼","½":"½","½":"½","¾":"¾","¾":"¾","¿":"¿","¿":"¿","À":"À","À":"À","Á":"Á","Á":"Á","Â":"Â","Â":"Â","Ã":"Ã","Ã":"Ã","Ä":"Ä","Ä":"Ä","Å":"Å","Å":"Å","Æ":"Æ","Æ":"Æ","Ç":"Ç","Ç":"Ç","È":"È","È":"È","É":"É","É":"É","Ê":"Ê","Ê":"Ê","Ë":"Ë","Ë":"Ë","Ì":"Ì","Ì":"Ì","Í":"Í","Í":"Í","Î":"Î","Î":"Î","Ï":"Ï","Ï":"Ï","Ð":"Ð","Ð":"Ð","Ñ":"Ñ","Ñ":"Ñ","Ò":"Ò","Ò":"Ò","Ó":"Ó","Ó":"Ó","Ô":"Ô","Ô":"Ô","Õ":"Õ","Õ":"Õ","Ö":"Ö","Ö":"Ö","×":"×","×":"×","Ø":"Ø","Ø":"Ø","Ù":"Ù","Ù":"Ù","Ú":"Ú","Ú":"Ú","Û":"Û","Û":"Û","Ü":"Ü","Ü":"Ü","Ý":"Ý","Ý":"Ý","Þ":"Þ","Þ":"Þ","ß":"ß","ß":"ß","à":"à","à":"à","á":"á","á":"á","â":"â","â":"â","ã":"ã","ã":"ã","ä":"ä","ä":"ä","å":"å","å":"å","æ":"æ","æ":"æ","ç":"ç","ç":"ç","è":"è","è":"è","é":"é","é":"é","ê":"ê","ê":"ê","ë":"ë","ë":"ë","ì":"ì","ì":"ì","í":"í","í":"í","î":"î","î":"î","ï":"ï","ï":"ï","ð":"ð","ð":"ð","ñ":"ñ","ñ":"ñ","ò":"ò","ò":"ò","ó":"ó","ó":"ó","ô":"ô","ô":"ô","õ":"õ","õ":"õ","ö":"ö","ö":"ö","÷":"÷","÷":"÷","ø":"ø","ø":"ø","ù":"ù","ù":"ù","ú":"ú","ú":"ú","û":"û","û":"û","ü":"ü","ü":"ü","ý":"ý","ý":"ý","þ":"þ","þ":"þ","ÿ":"ÿ","ÿ":"ÿ",""":'"',""":'"',"&":"&","&":"&","<":"<","<":"<",">":">",">":">","Œ":"Œ","œ":"œ","Š":"Š","š":"š","Ÿ":"Ÿ","ˆ":"ˆ","˜":"˜"," ":" "," ":" "," ":" ","‌":"‌","‍":"‍","‎":"‎","‏":"‏","–":"–","—":"—","‘":"‘","’":"’","‚":"‚","“":"“","”":"”","„":"„","†":"†","‡":"‡","‰":"‰","‹":"‹","›":"›","€":"€","ƒ":"ƒ","Α":"Α","Β":"Β","Γ":"Γ","Δ":"Δ","Ε":"Ε","Ζ":"Ζ","Η":"Η","Θ":"Θ","Ι":"Ι","Κ":"Κ","Λ":"Λ","Μ":"Μ","Ν":"Ν","Ξ":"Ξ","Ο":"Ο","Π":"Π","Ρ":"Ρ","Σ":"Σ","Τ":"Τ","Υ":"Υ","Φ":"Φ","Χ":"Χ","Ψ":"Ψ","Ω":"Ω","α":"α","β":"β","γ":"γ","δ":"δ","ε":"ε","ζ":"ζ","η":"η","θ":"θ","ι":"ι","κ":"κ","λ":"λ","μ":"μ","ν":"ν","ξ":"ξ","ο":"ο","π":"π","ρ":"ρ","ς":"ς","σ":"σ","τ":"τ","υ":"υ","φ":"φ","χ":"χ","ψ":"ψ","ω":"ω","ϑ":"ϑ","ϒ":"ϒ","ϖ":"ϖ","•":"•","…":"…","′":"′","″":"″","‾":"‾","⁄":"⁄","℘":"℘","ℑ":"ℑ","ℜ":"ℜ","™":"™","ℵ":"ℵ","←":"←","↑":"↑","→":"→","↓":"↓","↔":"↔","↵":"↵","⇐":"⇐","⇑":"⇑","⇒":"⇒","⇓":"⇓","⇔":"⇔","∀":"∀","∂":"∂","∃":"∃","∅":"∅","∇":"∇","∈":"∈","∉":"∉","∋":"∋","∏":"∏","∑":"∑","−":"−","∗":"∗","√":"√","∝":"∝","∞":"∞","∠":"∠","∧":"∧","∨":"∨","∩":"∩","∪":"∪","∫":"∫","∴":"∴","∼":"∼","≅":"≅","≈":"≈","≠":"≠","≡":"≡","≤":"≤","≥":"≥","⊂":"⊂","⊃":"⊃","⊄":"⊄","⊆":"⊆","⊇":"⊇","⊕":"⊕","⊗":"⊗","⊥":"⊥","⋅":"⋅","⌈":"⌈","⌉":"⌉","⌊":"⌊","⌋":"⌋","⟨":"〈","⟩":"〉","◊":"◊","♠":"♠","♣":"♣","♥":"♥","♦":"♦"},characters:{"'":"'"," ":" ","¡":"¡","¢":"¢","£":"£","¤":"¤","¥":"¥","¦":"¦","§":"§","¨":"¨","©":"©","ª":"ª","«":"«","¬":"¬","­":"­","®":"®","¯":"¯","°":"°","±":"±","²":"²","³":"³","´":"´","µ":"µ","¶":"¶","·":"·","¸":"¸","¹":"¹","º":"º","»":"»","¼":"¼","½":"½","¾":"¾","¿":"¿","À":"À","Á":"Á","Â":"Â","Ã":"Ã","Ä":"Ä","Å":"Å","Æ":"Æ","Ç":"Ç","È":"È","É":"É","Ê":"Ê","Ë":"Ë","Ì":"Ì","Í":"Í","Î":"Î","Ï":"Ï","Ð":"Ð","Ñ":"Ñ","Ò":"Ò","Ó":"Ó","Ô":"Ô","Õ":"Õ","Ö":"Ö","×":"×","Ø":"Ø","Ù":"Ù","Ú":"Ú","Û":"Û","Ü":"Ü","Ý":"Ý","Þ":"Þ","ß":"ß","à":"à","á":"á","â":"â","ã":"ã","ä":"ä","å":"å","æ":"æ","ç":"ç","è":"è","é":"é","ê":"ê","ë":"ë","ì":"ì","í":"í","î":"î","ï":"ï","ð":"ð","ñ":"ñ","ò":"ò","ó":"ó","ô":"ô","õ":"õ","ö":"ö","÷":"÷","ø":"ø","ù":"ù","ú":"ú","û":"û","ü":"ü","ý":"ý","þ":"þ","ÿ":"ÿ",'"':""","&":"&","<":"<",">":">","Œ":"Œ","œ":"œ","Š":"Š","š":"š","Ÿ":"Ÿ","ˆ":"ˆ","˜":"˜"," ":" "," ":" "," ":" ","‌":"‌","‍":"‍","‎":"‎","‏":"‏","–":"–","—":"—","‘":"‘","’":"’","‚":"‚","“":"“","”":"”","„":"„","†":"†","‡":"‡","‰":"‰","‹":"‹","›":"›","€":"€","ƒ":"ƒ","Α":"Α","Β":"Β","Γ":"Γ","Δ":"Δ","Ε":"Ε","Ζ":"Ζ","Η":"Η","Θ":"Θ","Ι":"Ι","Κ":"Κ","Λ":"Λ","Μ":"Μ","Ν":"Ν","Ξ":"Ξ","Ο":"Ο","Π":"Π","Ρ":"Ρ","Σ":"Σ","Τ":"Τ","Υ":"Υ","Φ":"Φ","Χ":"Χ","Ψ":"Ψ","Ω":"Ω","α":"α","β":"β","γ":"γ","δ":"δ","ε":"ε","ζ":"ζ","η":"η","θ":"θ","ι":"ι","κ":"κ","λ":"λ","μ":"μ","ν":"ν","ξ":"ξ","ο":"ο","π":"π","ρ":"ρ","ς":"ς","σ":"σ","τ":"τ","υ":"υ","φ":"φ","χ":"χ","ψ":"ψ","ω":"ω","ϑ":"ϑ","ϒ":"ϒ","ϖ":"ϖ","•":"•","…":"…","′":"′","″":"″","‾":"‾","⁄":"⁄","℘":"℘","ℑ":"ℑ","ℜ":"ℜ","™":"™","ℵ":"ℵ","←":"←","↑":"↑","→":"→","↓":"↓","↔":"↔","↵":"↵","⇐":"⇐","⇑":"⇑","⇒":"⇒","⇓":"⇓","⇔":"⇔","∀":"∀","∂":"∂","∃":"∃","∅":"∅","∇":"∇","∈":"∈","∉":"∉","∋":"∋","∏":"∏","∑":"∑","−":"−","∗":"∗","√":"√","∝":"∝","∞":"∞","∠":"∠","∧":"∧","∨":"∨","∩":"∩","∪":"∪","∫":"∫","∴":"∴","∼":"∼","≅":"≅","≈":"≈","≠":"≠","≡":"≡","≤":"≤","≥":"≥","⊂":"⊂","⊃":"⊃","⊄":"⊄","⊆":"⊆","⊇":"⊇","⊕":"⊕","⊗":"⊗","⊥":"⊥","⋅":"⋅","⌈":"⌈","⌉":"⌉","⌊":"⌊","⌋":"⌋","〈":"⟨","〉":"⟩","◊":"◊","♠":"♠","♣":"♣","♥":"♥","♦":"♦"}},html5:{entities:{"Æ":"Æ","Æ":"Æ","&":"&","&":"&","Á":"Á","Á":"Á","Ă":"Ă","Â":"Â","Â":"Â","А":"А","𝔄":"𝔄","À":"À","À":"À","Α":"Α","Ā":"Ā","⩓":"⩓","Ą":"Ą","𝔸":"𝔸","⁡":"⁡","Å":"Å","Å":"Å","𝒜":"𝒜","≔":"≔","Ã":"Ã","Ã":"Ã","Ä":"Ä","Ä":"Ä","∖":"∖","⫧":"⫧","⌆":"⌆","Б":"Б","∵":"∵","ℬ":"ℬ","Β":"Β","𝔅":"𝔅","𝔹":"𝔹","˘":"˘","ℬ":"ℬ","≎":"≎","Ч":"Ч","©":"©","©":"©","Ć":"Ć","⋒":"⋒","ⅅ":"ⅅ","ℭ":"ℭ","Č":"Č","Ç":"Ç","Ç":"Ç","Ĉ":"Ĉ","∰":"∰","Ċ":"Ċ","¸":"¸","·":"·","ℭ":"ℭ","Χ":"Χ","⊙":"⊙","⊖":"⊖","⊕":"⊕","⊗":"⊗","∲":"∲","”":"”","’":"’","∷":"∷","⩴":"⩴","≡":"≡","∯":"∯","∮":"∮","ℂ":"ℂ","∐":"∐","∳":"∳","⨯":"⨯","𝒞":"𝒞","⋓":"⋓","≍":"≍","ⅅ":"ⅅ","⤑":"⤑","Ђ":"Ђ","Ѕ":"Ѕ","Џ":"Џ","‡":"‡","↡":"↡","⫤":"⫤","Ď":"Ď","Д":"Д","∇":"∇","Δ":"Δ","𝔇":"𝔇","´":"´","˙":"˙","˝":"˝","`":"`","˜":"˜","⋄":"⋄","ⅆ":"ⅆ","𝔻":"𝔻","¨":"¨","⃜":"⃜","≐":"≐","∯":"∯","¨":"¨","⇓":"⇓","⇐":"⇐","⇔":"⇔","⫤":"⫤","⟸":"⟸","⟺":"⟺","⟹":"⟹","⇒":"⇒","⊨":"⊨","⇑":"⇑","⇕":"⇕","∥":"∥","↓":"↓","⤓":"⤓","⇵":"⇵","̑":"̑","⥐":"⥐","⥞":"⥞","↽":"↽","⥖":"⥖","⥟":"⥟","⇁":"⇁","⥗":"⥗","⊤":"⊤","↧":"↧","⇓":"⇓","𝒟":"𝒟","Đ":"Đ","Ŋ":"Ŋ","Ð":"Ð","Ð":"Ð","É":"É","É":"É","Ě":"Ě","Ê":"Ê","Ê":"Ê","Э":"Э","Ė":"Ė","𝔈":"𝔈","È":"È","È":"È","∈":"∈","Ē":"Ē","◻":"◻","▫":"▫","Ę":"Ę","𝔼":"𝔼","Ε":"Ε","⩵":"⩵","≂":"≂","⇌":"⇌","ℰ":"ℰ","⩳":"⩳","Η":"Η","Ë":"Ë","Ë":"Ë","∃":"∃","ⅇ":"ⅇ","Ф":"Ф","𝔉":"𝔉","◼":"◼","▪":"▪","𝔽":"𝔽","∀":"∀","ℱ":"ℱ","ℱ":"ℱ","Ѓ":"Ѓ",">":">",">":">","Γ":"Γ","Ϝ":"Ϝ","Ğ":"Ğ","Ģ":"Ģ","Ĝ":"Ĝ","Г":"Г","Ġ":"Ġ","𝔊":"𝔊","⋙":"⋙","𝔾":"𝔾","≥":"≥","⋛":"⋛","≧":"≧","⪢":"⪢","≷":"≷","⩾":"⩾","≳":"≳","𝒢":"𝒢","≫":"≫","Ъ":"Ъ","ˇ":"ˇ","^":"^","Ĥ":"Ĥ","ℌ":"ℌ","ℋ":"ℋ","ℍ":"ℍ","─":"─","ℋ":"ℋ","Ħ":"Ħ","≎":"≎","≏":"≏","Е":"Е","IJ":"IJ","Ё":"Ё","Í":"Í","Í":"Í","Î":"Î","Î":"Î","И":"И","İ":"İ","ℑ":"ℑ","Ì":"Ì","Ì":"Ì","ℑ":"ℑ","Ī":"Ī","ⅈ":"ⅈ","⇒":"⇒","∬":"∬","∫":"∫","⋂":"⋂","⁣":"⁣","⁢":"⁢","Į":"Į","𝕀":"𝕀","Ι":"Ι","ℐ":"ℐ","Ĩ":"Ĩ","І":"І","Ï":"Ï","Ï":"Ï","Ĵ":"Ĵ","Й":"Й","𝔍":"𝔍","𝕁":"𝕁","𝒥":"𝒥","Ј":"Ј","Є":"Є","Х":"Х","Ќ":"Ќ","Κ":"Κ","Ķ":"Ķ","К":"К","𝔎":"𝔎","𝕂":"𝕂","𝒦":"𝒦","Љ":"Љ","<":"<","<":"<","Ĺ":"Ĺ","Λ":"Λ","⟪":"⟪","ℒ":"ℒ","↞":"↞","Ľ":"Ľ","Ļ":"Ļ","Л":"Л","⟨":"⟨","←":"←","⇤":"⇤","⇆":"⇆","⌈":"⌈","⟦":"⟦","⥡":"⥡","⇃":"⇃","⥙":"⥙","⌊":"⌊","↔":"↔","⥎":"⥎","⊣":"⊣","↤":"↤","⥚":"⥚","⊲":"⊲","⧏":"⧏","⊴":"⊴","⥑":"⥑","⥠":"⥠","↿":"↿","⥘":"⥘","↼":"↼","⥒":"⥒","⇐":"⇐","⇔":"⇔","⋚":"⋚","≦":"≦","≶":"≶","⪡":"⪡","⩽":"⩽","≲":"≲","𝔏":"𝔏","⋘":"⋘","⇚":"⇚","Ŀ":"Ŀ","⟵":"⟵","⟷":"⟷","⟶":"⟶","⟸":"⟸","⟺":"⟺","⟹":"⟹","𝕃":"𝕃","↙":"↙","↘":"↘","ℒ":"ℒ","↰":"↰","Ł":"Ł","≪":"≪","⤅":"⤅","М":"М"," ":" ","ℳ":"ℳ","𝔐":"𝔐","∓":"∓","𝕄":"𝕄","ℳ":"ℳ","Μ":"Μ","Њ":"Њ","Ń":"Ń","Ň":"Ň","Ņ":"Ņ","Н":"Н","​":"​","​":"​","​":"​","​":"​","≫":"≫","≪":"≪"," ":"\n","𝔑":"𝔑","⁠":"⁠"," ":" ","ℕ":"ℕ","⫬":"⫬","≢":"≢","≭":"≭","∦":"∦","∉":"∉","≠":"≠","≂̸":"≂̸","∄":"∄","≯":"≯","≱":"≱","≧̸":"≧̸","≫̸":"≫̸","≹":"≹","⩾̸":"⩾̸","≵":"≵","≎̸":"≎̸","≏̸":"≏̸","⋪":"⋪","⧏̸":"⧏̸","⋬":"⋬","≮":"≮","≰":"≰","≸":"≸","≪̸":"≪̸","⩽̸":"⩽̸","≴":"≴","⪢̸":"⪢̸","⪡̸":"⪡̸","⊀":"⊀","⪯̸":"⪯̸","⋠":"⋠","∌":"∌","⋫":"⋫","⧐̸":"⧐̸","⋭":"⋭","⊏̸":"⊏̸","⋢":"⋢","⊐̸":"⊐̸","⋣":"⋣","⊂⃒":"⊂⃒","⊈":"⊈","⊁":"⊁","⪰̸":"⪰̸","⋡":"⋡","≿̸":"≿̸","⊃⃒":"⊃⃒","⊉":"⊉","≁":"≁","≄":"≄","≇":"≇","≉":"≉","∤":"∤","𝒩":"𝒩","Ñ":"Ñ","Ñ":"Ñ","Ν":"Ν","Œ":"Œ","Ó":"Ó","Ó":"Ó","Ô":"Ô","Ô":"Ô","О":"О","Ő":"Ő","𝔒":"𝔒","Ò":"Ò","Ò":"Ò","Ō":"Ō","Ω":"Ω","Ο":"Ο","𝕆":"𝕆","“":"“","‘":"‘","⩔":"⩔","𝒪":"𝒪","Ø":"Ø","Ø":"Ø","Õ":"Õ","Õ":"Õ","⨷":"⨷","Ö":"Ö","Ö":"Ö","‾":"‾","⏞":"⏞","⎴":"⎴","⏜":"⏜","∂":"∂","П":"П","𝔓":"𝔓","Φ":"Φ","Π":"Π","±":"±","ℌ":"ℌ","ℙ":"ℙ","⪻":"⪻","≺":"≺","⪯":"⪯","≼":"≼","≾":"≾","″":"″","∏":"∏","∷":"∷","∝":"∝","𝒫":"𝒫","Ψ":"Ψ",""":'"',""":'"',"𝔔":"𝔔","ℚ":"ℚ","𝒬":"𝒬","⤐":"⤐","®":"®","®":"®","Ŕ":"Ŕ","⟫":"⟫","↠":"↠","⤖":"⤖","Ř":"Ř","Ŗ":"Ŗ","Р":"Р","ℜ":"ℜ","∋":"∋","⇋":"⇋","⥯":"⥯","ℜ":"ℜ","Ρ":"Ρ","⟩":"⟩","→":"→","⇥":"⇥","⇄":"⇄","⌉":"⌉","⟧":"⟧","⥝":"⥝","⇂":"⇂","⥕":"⥕","⌋":"⌋","⊢":"⊢","↦":"↦","⥛":"⥛","⊳":"⊳","⧐":"⧐","⊵":"⊵","⥏":"⥏","⥜":"⥜","↾":"↾","⥔":"⥔","⇀":"⇀","⥓":"⥓","⇒":"⇒","ℝ":"ℝ","⥰":"⥰","⇛":"⇛","ℛ":"ℛ","↱":"↱","⧴":"⧴","Щ":"Щ","Ш":"Ш","Ь":"Ь","Ś":"Ś","⪼":"⪼","Š":"Š","Ş":"Ş","Ŝ":"Ŝ","С":"С","𝔖":"𝔖","↓":"↓","←":"←","→":"→","↑":"↑","Σ":"Σ","∘":"∘","𝕊":"𝕊","√":"√","□":"□","⊓":"⊓","⊏":"⊏","⊑":"⊑","⊐":"⊐","⊒":"⊒","⊔":"⊔","𝒮":"𝒮","⋆":"⋆","⋐":"⋐","⋐":"⋐","⊆":"⊆","≻":"≻","⪰":"⪰","≽":"≽","≿":"≿","∋":"∋","∑":"∑","⋑":"⋑","⊃":"⊃","⊇":"⊇","⋑":"⋑","Þ":"Þ","Þ":"Þ","™":"™","Ћ":"Ћ","Ц":"Ц"," ":"\t","Τ":"Τ","Ť":"Ť","Ţ":"Ţ","Т":"Т","𝔗":"𝔗","∴":"∴","Θ":"Θ","  ":"  "," ":" ","∼":"∼","≃":"≃","≅":"≅","≈":"≈","𝕋":"𝕋","⃛":"⃛","𝒯":"𝒯","Ŧ":"Ŧ","Ú":"Ú","Ú":"Ú","↟":"↟","⥉":"⥉","Ў":"Ў","Ŭ":"Ŭ","Û":"Û","Û":"Û","У":"У","Ű":"Ű","𝔘":"𝔘","Ù":"Ù","Ù":"Ù","Ū":"Ū","_":"_","⏟":"⏟","⎵":"⎵","⏝":"⏝","⋃":"⋃","⊎":"⊎","Ų":"Ų","𝕌":"𝕌","↑":"↑","⤒":"⤒","⇅":"⇅","↕":"↕","⥮":"⥮","⊥":"⊥","↥":"↥","⇑":"⇑","⇕":"⇕","↖":"↖","↗":"↗","ϒ":"ϒ","Υ":"Υ","Ů":"Ů","𝒰":"𝒰","Ũ":"Ũ","Ü":"Ü","Ü":"Ü","⊫":"⊫","⫫":"⫫","В":"В","⊩":"⊩","⫦":"⫦","⋁":"⋁","‖":"‖","‖":"‖","∣":"∣","|":"|","❘":"❘","≀":"≀"," ":" ","𝔙":"𝔙","𝕍":"𝕍","𝒱":"𝒱","⊪":"⊪","Ŵ":"Ŵ","⋀":"⋀","𝔚":"𝔚","𝕎":"𝕎","𝒲":"𝒲","𝔛":"𝔛","Ξ":"Ξ","𝕏":"𝕏","𝒳":"𝒳","Я":"Я","Ї":"Ї","Ю":"Ю","Ý":"Ý","Ý":"Ý","Ŷ":"Ŷ","Ы":"Ы","𝔜":"𝔜","𝕐":"𝕐","𝒴":"𝒴","Ÿ":"Ÿ","Ж":"Ж","Ź":"Ź","Ž":"Ž","З":"З","Ż":"Ż","​":"​","Ζ":"Ζ","ℨ":"ℨ","ℤ":"ℤ","𝒵":"𝒵","á":"á","á":"á","ă":"ă","∾":"∾","∾̳":"∾̳","∿":"∿","â":"â","â":"â","´":"´","´":"´","а":"а","æ":"æ","æ":"æ","⁡":"⁡","𝔞":"𝔞","à":"à","à":"à","ℵ":"ℵ","ℵ":"ℵ","α":"α","ā":"ā","⨿":"⨿","&":"&","&":"&","∧":"∧","⩕":"⩕","⩜":"⩜","⩘":"⩘","⩚":"⩚","∠":"∠","⦤":"⦤","∠":"∠","∡":"∡","⦨":"⦨","⦩":"⦩","⦪":"⦪","⦫":"⦫","⦬":"⦬","⦭":"⦭","⦮":"⦮","⦯":"⦯","∟":"∟","⊾":"⊾","⦝":"⦝","∢":"∢","Å":"Å","⍼":"⍼","ą":"ą","𝕒":"𝕒","≈":"≈","⩰":"⩰","⩯":"⩯","≊":"≊","≋":"≋","'":"'","≈":"≈","≊":"≊","å":"å","å":"å","𝒶":"𝒶","*":"*","≈":"≈","≍":"≍","ã":"ã","ã":"ã","ä":"ä","ä":"ä","∳":"∳","⨑":"⨑","⫭":"⫭","≌":"≌","϶":"϶","‵":"‵","∽":"∽","⋍":"⋍","⊽":"⊽","⌅":"⌅","⌅":"⌅","⎵":"⎵","⎶":"⎶","≌":"≌","б":"б","„":"„","∵":"∵","∵":"∵","⦰":"⦰","϶":"϶","ℬ":"ℬ","β":"β","ℶ":"ℶ","≬":"≬","𝔟":"𝔟","⋂":"⋂","◯":"◯","⋃":"⋃","⨀":"⨀","⨁":"⨁","⨂":"⨂","⨆":"⨆","★":"★","▽":"▽","△":"△","⨄":"⨄","⋁":"⋁","⋀":"⋀","⤍":"⤍","⧫":"⧫","▪":"▪","▴":"▴","▾":"▾","◂":"◂","▸":"▸","␣":"␣","▒":"▒","░":"░","▓":"▓","█":"█","=⃥":"=⃥","≡⃥":"≡⃥","⌐":"⌐","𝕓":"𝕓","⊥":"⊥","⊥":"⊥","⋈":"⋈","╗":"╗","╔":"╔","╖":"╖","╓":"╓","═":"═","╦":"╦","╩":"╩","╤":"╤","╧":"╧","╝":"╝","╚":"╚","╜":"╜","╙":"╙","║":"║","╬":"╬","╣":"╣","╠":"╠","╫":"╫","╢":"╢","╟":"╟","⧉":"⧉","╕":"╕","╒":"╒","┐":"┐","┌":"┌","─":"─","╥":"╥","╨":"╨","┬":"┬","┴":"┴","⊟":"⊟","⊞":"⊞","⊠":"⊠","╛":"╛","╘":"╘","┘":"┘","└":"└","│":"│","╪":"╪","╡":"╡","╞":"╞","┼":"┼","┤":"┤","├":"├","‵":"‵","˘":"˘","¦":"¦","¦":"¦","𝒷":"𝒷","⁏":"⁏","∽":"∽","⋍":"⋍","\":"\\","⧅":"⧅","⟈":"⟈","•":"•","•":"•","≎":"≎","⪮":"⪮","≏":"≏","≏":"≏","ć":"ć","∩":"∩","⩄":"⩄","⩉":"⩉","⩋":"⩋","⩇":"⩇","⩀":"⩀","∩︀":"∩︀","⁁":"⁁","ˇ":"ˇ","⩍":"⩍","č":"č","ç":"ç","ç":"ç","ĉ":"ĉ","⩌":"⩌","⩐":"⩐","ċ":"ċ","¸":"¸","¸":"¸","⦲":"⦲","¢":"¢","¢":"¢","·":"·","𝔠":"𝔠","ч":"ч","✓":"✓","✓":"✓","χ":"χ","○":"○","⧃":"⧃","ˆ":"ˆ","≗":"≗","↺":"↺","↻":"↻","®":"®","Ⓢ":"Ⓢ","⊛":"⊛","⊚":"⊚","⊝":"⊝","≗":"≗","⨐":"⨐","⫯":"⫯","⧂":"⧂","♣":"♣","♣":"♣",":":":","≔":"≔","≔":"≔",",":",","@":"@","∁":"∁","∘":"∘","∁":"∁","ℂ":"ℂ","≅":"≅","⩭":"⩭","∮":"∮","𝕔":"𝕔","∐":"∐","©":"©","©":"©","℗":"℗","↵":"↵","✗":"✗","𝒸":"𝒸","⫏":"⫏","⫑":"⫑","⫐":"⫐","⫒":"⫒","⋯":"⋯","⤸":"⤸","⤵":"⤵","⋞":"⋞","⋟":"⋟","↶":"↶","⤽":"⤽","∪":"∪","⩈":"⩈","⩆":"⩆","⩊":"⩊","⊍":"⊍","⩅":"⩅","∪︀":"∪︀","↷":"↷","⤼":"⤼","⋞":"⋞","⋟":"⋟","⋎":"⋎","⋏":"⋏","¤":"¤","¤":"¤","↶":"↶","↷":"↷","⋎":"⋎","⋏":"⋏","∲":"∲","∱":"∱","⌭":"⌭","⇓":"⇓","⥥":"⥥","†":"†","ℸ":"ℸ","↓":"↓","‐":"‐","⊣":"⊣","⤏":"⤏","˝":"˝","ď":"ď","д":"д","ⅆ":"ⅆ","‡":"‡","⇊":"⇊","⩷":"⩷","°":"°","°":"°","δ":"δ","⦱":"⦱","⥿":"⥿","𝔡":"𝔡","⇃":"⇃","⇂":"⇂","⋄":"⋄","⋄":"⋄","♦":"♦","♦":"♦","¨":"¨","ϝ":"ϝ","⋲":"⋲","÷":"÷","÷":"÷","÷":"÷","⋇":"⋇","⋇":"⋇","ђ":"ђ","⌞":"⌞","⌍":"⌍","$":"$","𝕕":"𝕕","˙":"˙","≐":"≐","≑":"≑","∸":"∸","∔":"∔","⊡":"⊡","⌆":"⌆","↓":"↓","⇊":"⇊","⇃":"⇃","⇂":"⇂","⤐":"⤐","⌟":"⌟","⌌":"⌌","𝒹":"𝒹","ѕ":"ѕ","⧶":"⧶","đ":"đ","⋱":"⋱","▿":"▿","▾":"▾","⇵":"⇵","⥯":"⥯","⦦":"⦦","џ":"џ","⟿":"⟿","⩷":"⩷","≑":"≑","é":"é","é":"é","⩮":"⩮","ě":"ě","≖":"≖","ê":"ê","ê":"ê","≕":"≕","э":"э","ė":"ė","ⅇ":"ⅇ","≒":"≒","𝔢":"𝔢","⪚":"⪚","è":"è","è":"è","⪖":"⪖","⪘":"⪘","⪙":"⪙","⏧":"⏧","ℓ":"ℓ","⪕":"⪕","⪗":"⪗","ē":"ē","∅":"∅","∅":"∅","∅":"∅"," ":" "," ":" "," ":" ","ŋ":"ŋ"," ":" ","ę":"ę","𝕖":"𝕖","⋕":"⋕","⧣":"⧣","⩱":"⩱","ε":"ε","ε":"ε","ϵ":"ϵ","≖":"≖","≕":"≕","≂":"≂","⪖":"⪖","⪕":"⪕","=":"=","≟":"≟","≡":"≡","⩸":"⩸","⧥":"⧥","≓":"≓","⥱":"⥱","ℯ":"ℯ","≐":"≐","≂":"≂","η":"η","ð":"ð","ð":"ð","ë":"ë","ë":"ë","€":"€","!":"!","∃":"∃","ℰ":"ℰ","ⅇ":"ⅇ","≒":"≒","ф":"ф","♀":"♀","ffi":"ffi","ff":"ff","ffl":"ffl","𝔣":"𝔣","fi":"fi","fj":"fj","♭":"♭","fl":"fl","▱":"▱","ƒ":"ƒ","𝕗":"𝕗","∀":"∀","⋔":"⋔","⫙":"⫙","⨍":"⨍","½":"½","½":"½","⅓":"⅓","¼":"¼","¼":"¼","⅕":"⅕","⅙":"⅙","⅛":"⅛","⅔":"⅔","⅖":"⅖","¾":"¾","¾":"¾","⅗":"⅗","⅜":"⅜","⅘":"⅘","⅚":"⅚","⅝":"⅝","⅞":"⅞","⁄":"⁄","⌢":"⌢","𝒻":"𝒻","≧":"≧","⪌":"⪌","ǵ":"ǵ","γ":"γ","ϝ":"ϝ","⪆":"⪆","ğ":"ğ","ĝ":"ĝ","г":"г","ġ":"ġ","≥":"≥","⋛":"⋛","≥":"≥","≧":"≧","⩾":"⩾","⩾":"⩾","⪩":"⪩","⪀":"⪀","⪂":"⪂","⪄":"⪄","⋛︀":"⋛︀","⪔":"⪔","𝔤":"𝔤","≫":"≫","⋙":"⋙","ℷ":"ℷ","ѓ":"ѓ","≷":"≷","⪒":"⪒","⪥":"⪥","⪤":"⪤","≩":"≩","⪊":"⪊","⪊":"⪊","⪈":"⪈","⪈":"⪈","≩":"≩","⋧":"⋧","𝕘":"𝕘","`":"`","ℊ":"ℊ","≳":"≳","⪎":"⪎","⪐":"⪐",">":">",">":">","⪧":"⪧","⩺":"⩺","⋗":"⋗","⦕":"⦕","⩼":"⩼","⪆":"⪆","⥸":"⥸","⋗":"⋗","⋛":"⋛","⪌":"⪌","≷":"≷","≳":"≳","≩︀":"≩︀","≩︀":"≩︀","⇔":"⇔"," ":" ","½":"½","ℋ":"ℋ","ъ":"ъ","↔":"↔","⥈":"⥈","↭":"↭","ℏ":"ℏ","ĥ":"ĥ","♥":"♥","♥":"♥","…":"…","⊹":"⊹","𝔥":"𝔥","⤥":"⤥","⤦":"⤦","⇿":"⇿","∻":"∻","↩":"↩","↪":"↪","𝕙":"𝕙","―":"―","𝒽":"𝒽","ℏ":"ℏ","ħ":"ħ","⁃":"⁃","‐":"‐","í":"í","í":"í","⁣":"⁣","î":"î","î":"î","и":"и","е":"е","¡":"¡","¡":"¡","⇔":"⇔","𝔦":"𝔦","ì":"ì","ì":"ì","ⅈ":"ⅈ","⨌":"⨌","∭":"∭","⧜":"⧜","℩":"℩","ij":"ij","ī":"ī","ℑ":"ℑ","ℐ":"ℐ","ℑ":"ℑ","ı":"ı","⊷":"⊷","Ƶ":"Ƶ","∈":"∈","℅":"℅","∞":"∞","⧝":"⧝","ı":"ı","∫":"∫","⊺":"⊺","ℤ":"ℤ","⊺":"⊺","⨗":"⨗","⨼":"⨼","ё":"ё","į":"į","𝕚":"𝕚","ι":"ι","⨼":"⨼","¿":"¿","¿":"¿","𝒾":"𝒾","∈":"∈","⋹":"⋹","⋵":"⋵","⋴":"⋴","⋳":"⋳","∈":"∈","⁢":"⁢","ĩ":"ĩ","і":"і","ï":"ï","ï":"ï","ĵ":"ĵ","й":"й","𝔧":"𝔧","ȷ":"ȷ","𝕛":"𝕛","𝒿":"𝒿","ј":"ј","є":"є","κ":"κ","ϰ":"ϰ","ķ":"ķ","к":"к","𝔨":"𝔨","ĸ":"ĸ","х":"х","ќ":"ќ","𝕜":"𝕜","𝓀":"𝓀","⇚":"⇚","⇐":"⇐","⤛":"⤛","⤎":"⤎","≦":"≦","⪋":"⪋","⥢":"⥢","ĺ":"ĺ","⦴":"⦴","ℒ":"ℒ","λ":"λ","⟨":"⟨","⦑":"⦑","⟨":"⟨","⪅":"⪅","«":"«","«":"«","←":"←","⇤":"⇤","⤟":"⤟","⤝":"⤝","↩":"↩","↫":"↫","⤹":"⤹","⥳":"⥳","↢":"↢","⪫":"⪫","⤙":"⤙","⪭":"⪭","⪭︀":"⪭︀","⤌":"⤌","❲":"❲","{":"{","[":"[","⦋":"⦋","⦏":"⦏","⦍":"⦍","ľ":"ľ","ļ":"ļ","⌈":"⌈","{":"{","л":"л","⤶":"⤶","“":"“","„":"„","⥧":"⥧","⥋":"⥋","↲":"↲","≤":"≤","←":"←","↢":"↢","↽":"↽","↼":"↼","⇇":"⇇","↔":"↔","⇆":"⇆","⇋":"⇋","↭":"↭","⋋":"⋋","⋚":"⋚","≤":"≤","≦":"≦","⩽":"⩽","⩽":"⩽","⪨":"⪨","⩿":"⩿","⪁":"⪁","⪃":"⪃","⋚︀":"⋚︀","⪓":"⪓","⪅":"⪅","⋖":"⋖","⋚":"⋚","⪋":"⪋","≶":"≶","≲":"≲","⥼":"⥼","⌊":"⌊","𝔩":"𝔩","≶":"≶","⪑":"⪑","↽":"↽","↼":"↼","⥪":"⥪","▄":"▄","љ":"љ","≪":"≪","⇇":"⇇","⌞":"⌞","⥫":"⥫","◺":"◺","ŀ":"ŀ","⎰":"⎰","⎰":"⎰","≨":"≨","⪉":"⪉","⪉":"⪉","⪇":"⪇","⪇":"⪇","≨":"≨","⋦":"⋦","⟬":"⟬","⇽":"⇽","⟦":"⟦","⟵":"⟵","⟷":"⟷","⟼":"⟼","⟶":"⟶","↫":"↫","↬":"↬","⦅":"⦅","𝕝":"𝕝","⨭":"⨭","⨴":"⨴","∗":"∗","_":"_","◊":"◊","◊":"◊","⧫":"⧫","(":"(","⦓":"⦓","⇆":"⇆","⌟":"⌟","⇋":"⇋","⥭":"⥭","‎":"‎","⊿":"⊿","‹":"‹","𝓁":"𝓁","↰":"↰","≲":"≲","⪍":"⪍","⪏":"⪏","[":"[","‘":"‘","‚":"‚","ł":"ł","<":"<","<":"<","⪦":"⪦","⩹":"⩹","⋖":"⋖","⋋":"⋋","⋉":"⋉","⥶":"⥶","⩻":"⩻","⦖":"⦖","◃":"◃","⊴":"⊴","◂":"◂","⥊":"⥊","⥦":"⥦","≨︀":"≨︀","≨︀":"≨︀","∺":"∺","¯":"¯","¯":"¯","♂":"♂","✠":"✠","✠":"✠","↦":"↦","↦":"↦","↧":"↧","↤":"↤","↥":"↥","▮":"▮","⨩":"⨩","м":"м","—":"—","∡":"∡","𝔪":"𝔪","℧":"℧","µ":"µ","µ":"µ","∣":"∣","*":"*","⫰":"⫰","·":"·","·":"·","−":"−","⊟":"⊟","∸":"∸","⨪":"⨪","⫛":"⫛","…":"…","∓":"∓","⊧":"⊧","𝕞":"𝕞","∓":"∓","𝓂":"𝓂","∾":"∾","μ":"μ","⊸":"⊸","⊸":"⊸","⋙̸":"⋙̸","≫⃒":"≫⃒","≫̸":"≫̸","⇍":"⇍","⇎":"⇎","⋘̸":"⋘̸","≪⃒":"≪⃒","≪̸":"≪̸","⇏":"⇏","⊯":"⊯","⊮":"⊮","∇":"∇","ń":"ń","∠⃒":"∠⃒","≉":"≉","⩰̸":"⩰̸","≋̸":"≋̸","ʼn":"ʼn","≉":"≉","♮":"♮","♮":"♮","ℕ":"ℕ"," ":" "," ":" ","≎̸":"≎̸","≏̸":"≏̸","⩃":"⩃","ň":"ň","ņ":"ņ","≇":"≇","⩭̸":"⩭̸","⩂":"⩂","н":"н","–":"–","≠":"≠","⇗":"⇗","⤤":"⤤","↗":"↗","↗":"↗","≐̸":"≐̸","≢":"≢","⤨":"⤨","≂̸":"≂̸","∄":"∄","∄":"∄","𝔫":"𝔫","≧̸":"≧̸","≱":"≱","≱":"≱","≧̸":"≧̸","⩾̸":"⩾̸","⩾̸":"⩾̸","≵":"≵","≯":"≯","≯":"≯","⇎":"⇎","↮":"↮","⫲":"⫲","∋":"∋","⋼":"⋼","⋺":"⋺","∋":"∋","њ":"њ","⇍":"⇍","≦̸":"≦̸","↚":"↚","‥":"‥","≰":"≰","↚":"↚","↮":"↮","≰":"≰","≦̸":"≦̸","⩽̸":"⩽̸","⩽̸":"⩽̸","≮":"≮","≴":"≴","≮":"≮","⋪":"⋪","⋬":"⋬","∤":"∤","𝕟":"𝕟","¬":"¬","¬":"¬","∉":"∉","⋹̸":"⋹̸","⋵̸":"⋵̸","∉":"∉","⋷":"⋷","⋶":"⋶","∌":"∌","∌":"∌","⋾":"⋾","⋽":"⋽","∦":"∦","∦":"∦","⫽⃥":"⫽⃥","∂̸":"∂̸","⨔":"⨔","⊀":"⊀","⋠":"⋠","⪯̸":"⪯̸","⊀":"⊀","⪯̸":"⪯̸","⇏":"⇏","↛":"↛","⤳̸":"⤳̸","↝̸":"↝̸","↛":"↛","⋫":"⋫","⋭":"⋭","⊁":"⊁","⋡":"⋡","⪰̸":"⪰̸","𝓃":"𝓃","∤":"∤","∦":"∦","≁":"≁","≄":"≄","≄":"≄","∤":"∤","∦":"∦","⋢":"⋢","⋣":"⋣","⊄":"⊄","⫅̸":"⫅̸","⊈":"⊈","⊂⃒":"⊂⃒","⊈":"⊈","⫅̸":"⫅̸","⊁":"⊁","⪰̸":"⪰̸","⊅":"⊅","⫆̸":"⫆̸","⊉":"⊉","⊃⃒":"⊃⃒","⊉":"⊉","⫆̸":"⫆̸","≹":"≹","ñ":"ñ","ñ":"ñ","≸":"≸","⋪":"⋪","⋬":"⋬","⋫":"⋫","⋭":"⋭","ν":"ν","#":"#","№":"№"," ":" ","⊭":"⊭","⤄":"⤄","≍⃒":"≍⃒","⊬":"⊬","≥⃒":"≥⃒",">⃒":">⃒","⧞":"⧞","⤂":"⤂","≤⃒":"≤⃒","<⃒":"<⃒","⊴⃒":"⊴⃒","⤃":"⤃","⊵⃒":"⊵⃒","∼⃒":"∼⃒","⇖":"⇖","⤣":"⤣","↖":"↖","↖":"↖","⤧":"⤧","Ⓢ":"Ⓢ","ó":"ó","ó":"ó","⊛":"⊛","⊚":"⊚","ô":"ô","ô":"ô","о":"о","⊝":"⊝","ő":"ő","⨸":"⨸","⊙":"⊙","⦼":"⦼","œ":"œ","⦿":"⦿","𝔬":"𝔬","˛":"˛","ò":"ò","ò":"ò","⧁":"⧁","⦵":"⦵","Ω":"Ω","∮":"∮","↺":"↺","⦾":"⦾","⦻":"⦻","‾":"‾","⧀":"⧀","ō":"ō","ω":"ω","ο":"ο","⦶":"⦶","⊖":"⊖","𝕠":"𝕠","⦷":"⦷","⦹":"⦹","⊕":"⊕","∨":"∨","↻":"↻","⩝":"⩝","ℴ":"ℴ","ℴ":"ℴ","ª":"ª","ª":"ª","º":"º","º":"º","⊶":"⊶","⩖":"⩖","⩗":"⩗","⩛":"⩛","ℴ":"ℴ","ø":"ø","ø":"ø","⊘":"⊘","õ":"õ","õ":"õ","⊗":"⊗","⨶":"⨶","ö":"ö","ö":"ö","⌽":"⌽","∥":"∥","¶":"¶","¶":"¶","∥":"∥","⫳":"⫳","⫽":"⫽","∂":"∂","п":"п","%":"%",".":".","‰":"‰","⊥":"⊥","‱":"‱","𝔭":"𝔭","φ":"φ","ϕ":"ϕ","ℳ":"ℳ","☎":"☎","π":"π","⋔":"⋔","ϖ":"ϖ","ℏ":"ℏ","ℎ":"ℎ","ℏ":"ℏ","+":"+","⨣":"⨣","⊞":"⊞","⨢":"⨢","∔":"∔","⨥":"⨥","⩲":"⩲","±":"±","±":"±","⨦":"⨦","⨧":"⨧","±":"±","⨕":"⨕","𝕡":"𝕡","£":"£","£":"£","≺":"≺","⪳":"⪳","⪷":"⪷","≼":"≼","⪯":"⪯","≺":"≺","⪷":"⪷","≼":"≼","⪯":"⪯","⪹":"⪹","⪵":"⪵","⋨":"⋨","≾":"≾","′":"′","ℙ":"ℙ","⪵":"⪵","⪹":"⪹","⋨":"⋨","∏":"∏","⌮":"⌮","⌒":"⌒","⌓":"⌓","∝":"∝","∝":"∝","≾":"≾","⊰":"⊰","𝓅":"𝓅","ψ":"ψ"," ":" ","𝔮":"𝔮","⨌":"⨌","𝕢":"𝕢","⁗":"⁗","𝓆":"𝓆","ℍ":"ℍ","⨖":"⨖","?":"?","≟":"≟",""":'"',""":'"',"⇛":"⇛","⇒":"⇒","⤜":"⤜","⤏":"⤏","⥤":"⥤","∽̱":"∽̱","ŕ":"ŕ","√":"√","⦳":"⦳","⟩":"⟩","⦒":"⦒","⦥":"⦥","⟩":"⟩","»":"»","»":"»","→":"→","⥵":"⥵","⇥":"⇥","⤠":"⤠","⤳":"⤳","⤞":"⤞","↪":"↪","↬":"↬","⥅":"⥅","⥴":"⥴","↣":"↣","↝":"↝","⤚":"⤚","∶":"∶","ℚ":"ℚ","⤍":"⤍","❳":"❳","}":"}","]":"]","⦌":"⦌","⦎":"⦎","⦐":"⦐","ř":"ř","ŗ":"ŗ","⌉":"⌉","}":"}","р":"р","⤷":"⤷","⥩":"⥩","”":"”","”":"”","↳":"↳","ℜ":"ℜ","ℛ":"ℛ","ℜ":"ℜ","ℝ":"ℝ","▭":"▭","®":"®","®":"®","⥽":"⥽","⌋":"⌋","𝔯":"𝔯","⇁":"⇁","⇀":"⇀","⥬":"⥬","ρ":"ρ","ϱ":"ϱ","→":"→","↣":"↣","⇁":"⇁","⇀":"⇀","⇄":"⇄","⇌":"⇌","⇉":"⇉","↝":"↝","⋌":"⋌","˚":"˚","≓":"≓","⇄":"⇄","⇌":"⇌","‏":"‏","⎱":"⎱","⎱":"⎱","⫮":"⫮","⟭":"⟭","⇾":"⇾","⟧":"⟧","⦆":"⦆","𝕣":"𝕣","⨮":"⨮","⨵":"⨵",")":")","⦔":"⦔","⨒":"⨒","⇉":"⇉","›":"›","𝓇":"𝓇","↱":"↱","]":"]","’":"’","’":"’","⋌":"⋌","⋊":"⋊","▹":"▹","⊵":"⊵","▸":"▸","⧎":"⧎","⥨":"⥨","℞":"℞","ś":"ś","‚":"‚","≻":"≻","⪴":"⪴","⪸":"⪸","š":"š","≽":"≽","⪰":"⪰","ş":"ş","ŝ":"ŝ","⪶":"⪶","⪺":"⪺","⋩":"⋩","⨓":"⨓","≿":"≿","с":"с","⋅":"⋅","⊡":"⊡","⩦":"⩦","⇘":"⇘","⤥":"⤥","↘":"↘","↘":"↘","§":"§","§":"§",";":";","⤩":"⤩","∖":"∖","∖":"∖","✶":"✶","𝔰":"𝔰","⌢":"⌢","♯":"♯","щ":"щ","ш":"ш","∣":"∣","∥":"∥","­":"­","­":"­","σ":"σ","ς":"ς","ς":"ς","∼":"∼","⩪":"⩪","≃":"≃","≃":"≃","⪞":"⪞","⪠":"⪠","⪝":"⪝","⪟":"⪟","≆":"≆","⨤":"⨤","⥲":"⥲","←":"←","∖":"∖","⨳":"⨳","⧤":"⧤","∣":"∣","⌣":"⌣","⪪":"⪪","⪬":"⪬","⪬︀":"⪬︀","ь":"ь","/":"/","⧄":"⧄","⌿":"⌿","𝕤":"𝕤","♠":"♠","♠":"♠","∥":"∥","⊓":"⊓","⊓︀":"⊓︀","⊔":"⊔","⊔︀":"⊔︀","⊏":"⊏","⊑":"⊑","⊏":"⊏","⊑":"⊑","⊐":"⊐","⊒":"⊒","⊐":"⊐","⊒":"⊒","□":"□","□":"□","▪":"▪","▪":"▪","→":"→","𝓈":"𝓈","∖":"∖","⌣":"⌣","⋆":"⋆","☆":"☆","★":"★","ϵ":"ϵ","ϕ":"ϕ","¯":"¯","⊂":"⊂","⫅":"⫅","⪽":"⪽","⊆":"⊆","⫃":"⫃","⫁":"⫁","⫋":"⫋","⊊":"⊊","⪿":"⪿","⥹":"⥹","⊂":"⊂","⊆":"⊆","⫅":"⫅","⊊":"⊊","⫋":"⫋","⫇":"⫇","⫕":"⫕","⫓":"⫓","≻":"≻","⪸":"⪸","≽":"≽","⪰":"⪰","⪺":"⪺","⪶":"⪶","⋩":"⋩","≿":"≿","∑":"∑","♪":"♪","¹":"¹","¹":"¹","²":"²","²":"²","³":"³","³":"³","⊃":"⊃","⫆":"⫆","⪾":"⪾","⫘":"⫘","⊇":"⊇","⫄":"⫄","⟉":"⟉","⫗":"⫗","⥻":"⥻","⫂":"⫂","⫌":"⫌","⊋":"⊋","⫀":"⫀","⊃":"⊃","⊇":"⊇","⫆":"⫆","⊋":"⊋","⫌":"⫌","⫈":"⫈","⫔":"⫔","⫖":"⫖","⇙":"⇙","⤦":"⤦","↙":"↙","↙":"↙","⤪":"⤪","ß":"ß","ß":"ß","⌖":"⌖","τ":"τ","⎴":"⎴","ť":"ť","ţ":"ţ","т":"т","⃛":"⃛","⌕":"⌕","𝔱":"𝔱","∴":"∴","∴":"∴","θ":"θ","ϑ":"ϑ","ϑ":"ϑ","≈":"≈","∼":"∼"," ":" ","≈":"≈","∼":"∼","þ":"þ","þ":"þ","˜":"˜","×":"×","×":"×","⊠":"⊠","⨱":"⨱","⨰":"⨰","∭":"∭","⤨":"⤨","⊤":"⊤","⌶":"⌶","⫱":"⫱","𝕥":"𝕥","⫚":"⫚","⤩":"⤩","‴":"‴","™":"™","▵":"▵","▿":"▿","◃":"◃","⊴":"⊴","≜":"≜","▹":"▹","⊵":"⊵","◬":"◬","≜":"≜","⨺":"⨺","⨹":"⨹","⧍":"⧍","⨻":"⨻","⏢":"⏢","𝓉":"𝓉","ц":"ц","ћ":"ћ","ŧ":"ŧ","≬":"≬","↞":"↞","↠":"↠","⇑":"⇑","⥣":"⥣","ú":"ú","ú":"ú","↑":"↑","ў":"ў","ŭ":"ŭ","û":"û","û":"û","у":"у","⇅":"⇅","ű":"ű","⥮":"⥮","⥾":"⥾","𝔲":"𝔲","ù":"ù","ù":"ù","↿":"↿","↾":"↾","▀":"▀","⌜":"⌜","⌜":"⌜","⌏":"⌏","◸":"◸","ū":"ū","¨":"¨","¨":"¨","ų":"ų","𝕦":"𝕦","↑":"↑","↕":"↕","↿":"↿","↾":"↾","⊎":"⊎","υ":"υ","ϒ":"ϒ","υ":"υ","⇈":"⇈","⌝":"⌝","⌝":"⌝","⌎":"⌎","ů":"ů","◹":"◹","𝓊":"𝓊","⋰":"⋰","ũ":"ũ","▵":"▵","▴":"▴","⇈":"⇈","ü":"ü","ü":"ü","⦧":"⦧","⇕":"⇕","⫨":"⫨","⫩":"⫩","⊨":"⊨","⦜":"⦜","ϵ":"ϵ","ϰ":"ϰ","∅":"∅","ϕ":"ϕ","ϖ":"ϖ","∝":"∝","↕":"↕","ϱ":"ϱ","ς":"ς","⊊︀":"⊊︀","⫋︀":"⫋︀","⊋︀":"⊋︀","⫌︀":"⫌︀","ϑ":"ϑ","⊲":"⊲","⊳":"⊳","в":"в","⊢":"⊢","∨":"∨","⊻":"⊻","≚":"≚","⋮":"⋮","|":"|","|":"|","𝔳":"𝔳","⊲":"⊲","⊂⃒":"⊂⃒","⊃⃒":"⊃⃒","𝕧":"𝕧","∝":"∝","⊳":"⊳","𝓋":"𝓋","⫋︀":"⫋︀","⊊︀":"⊊︀","⫌︀":"⫌︀","⊋︀":"⊋︀","⦚":"⦚","ŵ":"ŵ","⩟":"⩟","∧":"∧","≙":"≙","℘":"℘","𝔴":"𝔴","𝕨":"𝕨","℘":"℘","≀":"≀","≀":"≀","𝓌":"𝓌","⋂":"⋂","◯":"◯","⋃":"⋃","▽":"▽","𝔵":"𝔵","⟺":"⟺","⟷":"⟷","ξ":"ξ","⟸":"⟸","⟵":"⟵","⟼":"⟼","⋻":"⋻","⨀":"⨀","𝕩":"𝕩","⨁":"⨁","⨂":"⨂","⟹":"⟹","⟶":"⟶","𝓍":"𝓍","⨆":"⨆","⨄":"⨄","△":"△","⋁":"⋁","⋀":"⋀","ý":"ý","ý":"ý","я":"я","ŷ":"ŷ","ы":"ы","¥":"¥","¥":"¥","𝔶":"𝔶","ї":"ї","𝕪":"𝕪","𝓎":"𝓎","ю":"ю","ÿ":"ÿ","ÿ":"ÿ","ź":"ź","ž":"ž","з":"з","ż":"ż","ℨ":"ℨ","ζ":"ζ","𝔷":"𝔷","ж":"ж","⇝":"⇝","𝕫":"𝕫","𝓏":"𝓏","‍":"‍","‌":"‌"},characters:{"Æ":"Æ","&":"&","Á":"Á","Ă":"Ă","Â":"Â","А":"А","𝔄":"𝔄","À":"À","Α":"Α","Ā":"Ā","⩓":"⩓","Ą":"Ą","𝔸":"𝔸","⁡":"⁡","Å":"Å","𝒜":"𝒜","≔":"≔","Ã":"Ã","Ä":"Ä","∖":"∖","⫧":"⫧","⌆":"⌆","Б":"Б","∵":"∵","ℬ":"ℬ","Β":"Β","𝔅":"𝔅","𝔹":"𝔹","˘":"˘","≎":"≎","Ч":"Ч","©":"©","Ć":"Ć","⋒":"⋒","ⅅ":"ⅅ","ℭ":"ℭ","Č":"Č","Ç":"Ç","Ĉ":"Ĉ","∰":"∰","Ċ":"Ċ","¸":"¸","·":"·","Χ":"Χ","⊙":"⊙","⊖":"⊖","⊕":"⊕","⊗":"⊗","∲":"∲","”":"”","’":"’","∷":"∷","⩴":"⩴","≡":"≡","∯":"∯","∮":"∮","ℂ":"ℂ","∐":"∐","∳":"∳","⨯":"⨯","𝒞":"𝒞","⋓":"⋓","≍":"≍","⤑":"⤑","Ђ":"Ђ","Ѕ":"Ѕ","Џ":"Џ","‡":"‡","↡":"↡","⫤":"⫤","Ď":"Ď","Д":"Д","∇":"∇","Δ":"Δ","𝔇":"𝔇","´":"´","˙":"˙","˝":"˝","`":"`","˜":"˜","⋄":"⋄","ⅆ":"ⅆ","𝔻":"𝔻","¨":"¨","⃜":"⃜","≐":"≐","⇓":"⇓","⇐":"⇐","⇔":"⇔","⟸":"⟸","⟺":"⟺","⟹":"⟹","⇒":"⇒","⊨":"⊨","⇑":"⇑","⇕":"⇕","∥":"∥","↓":"↓","⤓":"⤓","⇵":"⇵","̑":"̑","⥐":"⥐","⥞":"⥞","↽":"↽","⥖":"⥖","⥟":"⥟","⇁":"⇁","⥗":"⥗","⊤":"⊤","↧":"↧","𝒟":"𝒟","Đ":"Đ","Ŋ":"Ŋ","Ð":"Ð","É":"É","Ě":"Ě","Ê":"Ê","Э":"Э","Ė":"Ė","𝔈":"𝔈","È":"È","∈":"∈","Ē":"Ē","◻":"◻","▫":"▫","Ę":"Ę","𝔼":"𝔼","Ε":"Ε","⩵":"⩵","≂":"≂","⇌":"⇌","ℰ":"ℰ","⩳":"⩳","Η":"Η","Ë":"Ë","∃":"∃","ⅇ":"ⅇ","Ф":"Ф","𝔉":"𝔉","◼":"◼","▪":"▪","𝔽":"𝔽","∀":"∀","ℱ":"ℱ","Ѓ":"Ѓ",">":">","Γ":"Γ","Ϝ":"Ϝ","Ğ":"Ğ","Ģ":"Ģ","Ĝ":"Ĝ","Г":"Г","Ġ":"Ġ","𝔊":"𝔊","⋙":"⋙","𝔾":"𝔾","≥":"≥","⋛":"⋛","≧":"≧","⪢":"⪢","≷":"≷","⩾":"⩾","≳":"≳","𝒢":"𝒢","≫":"≫","Ъ":"Ъ","ˇ":"ˇ","^":"^","Ĥ":"Ĥ","ℌ":"ℌ","ℋ":"ℋ","ℍ":"ℍ","─":"─","Ħ":"Ħ","≏":"≏","Е":"Е","IJ":"IJ","Ё":"Ё","Í":"Í","Î":"Î","И":"И","İ":"İ","ℑ":"ℑ","Ì":"Ì","Ī":"Ī","ⅈ":"ⅈ","∬":"∬","∫":"∫","⋂":"⋂","⁣":"⁣","⁢":"⁢","Į":"Į","𝕀":"𝕀","Ι":"Ι","ℐ":"ℐ","Ĩ":"Ĩ","І":"І","Ï":"Ï","Ĵ":"Ĵ","Й":"Й","𝔍":"𝔍","𝕁":"𝕁","𝒥":"𝒥","Ј":"Ј","Є":"Є","Х":"Х","Ќ":"Ќ","Κ":"Κ","Ķ":"Ķ","К":"К","𝔎":"𝔎","𝕂":"𝕂","𝒦":"𝒦","Љ":"Љ","<":"<","Ĺ":"Ĺ","Λ":"Λ","⟪":"⟪","ℒ":"ℒ","↞":"↞","Ľ":"Ľ","Ļ":"Ļ","Л":"Л","⟨":"⟨","←":"←","⇤":"⇤","⇆":"⇆","⌈":"⌈","⟦":"⟦","⥡":"⥡","⇃":"⇃","⥙":"⥙","⌊":"⌊","↔":"↔","⥎":"⥎","⊣":"⊣","↤":"↤","⥚":"⥚","⊲":"⊲","⧏":"⧏","⊴":"⊴","⥑":"⥑","⥠":"⥠","↿":"↿","⥘":"⥘","↼":"↼","⥒":"⥒","⋚":"⋚","≦":"≦","≶":"≶","⪡":"⪡","⩽":"⩽","≲":"≲","𝔏":"𝔏","⋘":"⋘","⇚":"⇚","Ŀ":"Ŀ","⟵":"⟵","⟷":"⟷","⟶":"⟶","𝕃":"𝕃","↙":"↙","↘":"↘","↰":"↰","Ł":"Ł","≪":"≪","⤅":"⤅","М":"М"," ":" ","ℳ":"ℳ","𝔐":"𝔐","∓":"∓","𝕄":"𝕄","Μ":"Μ","Њ":"Њ","Ń":"Ń","Ň":"Ň","Ņ":"Ņ","Н":"Н","​":"​","\n":" ","𝔑":"𝔑","⁠":"⁠"," ":" ","ℕ":"ℕ","⫬":"⫬","≢":"≢","≭":"≭","∦":"∦","∉":"∉","≠":"≠","≂̸":"≂̸","∄":"∄","≯":"≯","≱":"≱","≧̸":"≧̸","≫̸":"≫̸","≹":"≹","⩾̸":"⩾̸","≵":"≵","≎̸":"≎̸","≏̸":"≏̸","⋪":"⋪","⧏̸":"⧏̸","⋬":"⋬","≮":"≮","≰":"≰","≸":"≸","≪̸":"≪̸","⩽̸":"⩽̸","≴":"≴","⪢̸":"⪢̸","⪡̸":"⪡̸","⊀":"⊀","⪯̸":"⪯̸","⋠":"⋠","∌":"∌","⋫":"⋫","⧐̸":"⧐̸","⋭":"⋭","⊏̸":"⊏̸","⋢":"⋢","⊐̸":"⊐̸","⋣":"⋣","⊂⃒":"⊂⃒","⊈":"⊈","⊁":"⊁","⪰̸":"⪰̸","⋡":"⋡","≿̸":"≿̸","⊃⃒":"⊃⃒","⊉":"⊉","≁":"≁","≄":"≄","≇":"≇","≉":"≉","∤":"∤","𝒩":"𝒩","Ñ":"Ñ","Ν":"Ν","Œ":"Œ","Ó":"Ó","Ô":"Ô","О":"О","Ő":"Ő","𝔒":"𝔒","Ò":"Ò","Ō":"Ō","Ω":"Ω","Ο":"Ο","𝕆":"𝕆","“":"“","‘":"‘","⩔":"⩔","𝒪":"𝒪","Ø":"Ø","Õ":"Õ","⨷":"⨷","Ö":"Ö","‾":"‾","⏞":"⏞","⎴":"⎴","⏜":"⏜","∂":"∂","П":"П","𝔓":"𝔓","Φ":"Φ","Π":"Π","±":"±","ℙ":"ℙ","⪻":"⪻","≺":"≺","⪯":"⪯","≼":"≼","≾":"≾","″":"″","∏":"∏","∝":"∝","𝒫":"𝒫","Ψ":"Ψ",'"':""","𝔔":"𝔔","ℚ":"ℚ","𝒬":"𝒬","⤐":"⤐","®":"®","Ŕ":"Ŕ","⟫":"⟫","↠":"↠","⤖":"⤖","Ř":"Ř","Ŗ":"Ŗ","Р":"Р","ℜ":"ℜ","∋":"∋","⇋":"⇋","⥯":"⥯","Ρ":"Ρ","⟩":"⟩","→":"→","⇥":"⇥","⇄":"⇄","⌉":"⌉","⟧":"⟧","⥝":"⥝","⇂":"⇂","⥕":"⥕","⌋":"⌋","⊢":"⊢","↦":"↦","⥛":"⥛","⊳":"⊳","⧐":"⧐","⊵":"⊵","⥏":"⥏","⥜":"⥜","↾":"↾","⥔":"⥔","⇀":"⇀","⥓":"⥓","ℝ":"ℝ","⥰":"⥰","⇛":"⇛","ℛ":"ℛ","↱":"↱","⧴":"⧴","Щ":"Щ","Ш":"Ш","Ь":"Ь","Ś":"Ś","⪼":"⪼","Š":"Š","Ş":"Ş","Ŝ":"Ŝ","С":"С","𝔖":"𝔖","↑":"↑","Σ":"Σ","∘":"∘","𝕊":"𝕊","√":"√","□":"□","⊓":"⊓","⊏":"⊏","⊑":"⊑","⊐":"⊐","⊒":"⊒","⊔":"⊔","𝒮":"𝒮","⋆":"⋆","⋐":"⋐","⊆":"⊆","≻":"≻","⪰":"⪰","≽":"≽","≿":"≿","∑":"∑","⋑":"⋑","⊃":"⊃","⊇":"⊇","Þ":"Þ","™":"™","Ћ":"Ћ","Ц":"Ц","\t":" ","Τ":"Τ","Ť":"Ť","Ţ":"Ţ","Т":"Т","𝔗":"𝔗","∴":"∴","Θ":"Θ","  ":"  "," ":" ","∼":"∼","≃":"≃","≅":"≅","≈":"≈","𝕋":"𝕋","⃛":"⃛","𝒯":"𝒯","Ŧ":"Ŧ","Ú":"Ú","↟":"↟","⥉":"⥉","Ў":"Ў","Ŭ":"Ŭ","Û":"Û","У":"У","Ű":"Ű","𝔘":"𝔘","Ù":"Ù","Ū":"Ū",_:"_","⏟":"⏟","⎵":"⎵","⏝":"⏝","⋃":"⋃","⊎":"⊎","Ų":"Ų","𝕌":"𝕌","⤒":"⤒","⇅":"⇅","↕":"↕","⥮":"⥮","⊥":"⊥","↥":"↥","↖":"↖","↗":"↗","ϒ":"ϒ","Υ":"Υ","Ů":"Ů","𝒰":"𝒰","Ũ":"Ũ","Ü":"Ü","⊫":"⊫","⫫":"⫫","В":"В","⊩":"⊩","⫦":"⫦","⋁":"⋁","‖":"‖","∣":"∣","|":"|","❘":"❘","≀":"≀"," ":" ","𝔙":"𝔙","𝕍":"𝕍","𝒱":"𝒱","⊪":"⊪","Ŵ":"Ŵ","⋀":"⋀","𝔚":"𝔚","𝕎":"𝕎","𝒲":"𝒲","𝔛":"𝔛","Ξ":"Ξ","𝕏":"𝕏","𝒳":"𝒳","Я":"Я","Ї":"Ї","Ю":"Ю","Ý":"Ý","Ŷ":"Ŷ","Ы":"Ы","𝔜":"𝔜","𝕐":"𝕐","𝒴":"𝒴","Ÿ":"Ÿ","Ж":"Ж","Ź":"Ź","Ž":"Ž","З":"З","Ż":"Ż","Ζ":"Ζ","ℨ":"ℨ","ℤ":"ℤ","𝒵":"𝒵","á":"á","ă":"ă","∾":"∾","∾̳":"∾̳","∿":"∿","â":"â","а":"а","æ":"æ","𝔞":"𝔞","à":"à","ℵ":"ℵ","α":"α","ā":"ā","⨿":"⨿","∧":"∧","⩕":"⩕","⩜":"⩜","⩘":"⩘","⩚":"⩚","∠":"∠","⦤":"⦤","∡":"∡","⦨":"⦨","⦩":"⦩","⦪":"⦪","⦫":"⦫","⦬":"⦬","⦭":"⦭","⦮":"⦮","⦯":"⦯","∟":"∟","⊾":"⊾","⦝":"⦝","∢":"∢","⍼":"⍼","ą":"ą","𝕒":"𝕒","⩰":"⩰","⩯":"⩯","≊":"≊","≋":"≋","'":"'","å":"å","𝒶":"𝒶","*":"*","ã":"ã","ä":"ä","⨑":"⨑","⫭":"⫭","≌":"≌","϶":"϶","‵":"‵","∽":"∽","⋍":"⋍","⊽":"⊽","⌅":"⌅","⎶":"⎶","б":"б","„":"„","⦰":"⦰","β":"β","ℶ":"ℶ","≬":"≬","𝔟":"𝔟","◯":"◯","⨀":"⨀","⨁":"⨁","⨂":"⨂","⨆":"⨆","★":"★","▽":"▽","△":"△","⨄":"⨄","⤍":"⤍","⧫":"⧫","▴":"▴","▾":"▾","◂":"◂","▸":"▸","␣":"␣","▒":"▒","░":"░","▓":"▓","█":"█","=⃥":"=⃥","≡⃥":"≡⃥","⌐":"⌐","𝕓":"𝕓","⋈":"⋈","╗":"╗","╔":"╔","╖":"╖","╓":"╓","═":"═","╦":"╦","╩":"╩","╤":"╤","╧":"╧","╝":"╝","╚":"╚","╜":"╜","╙":"╙","║":"║","╬":"╬","╣":"╣","╠":"╠","╫":"╫","╢":"╢","╟":"╟","⧉":"⧉","╕":"╕","╒":"╒","┐":"┐","┌":"┌","╥":"╥","╨":"╨","┬":"┬","┴":"┴","⊟":"⊟","⊞":"⊞","⊠":"⊠","╛":"╛","╘":"╘","┘":"┘","└":"└","│":"│","╪":"╪","╡":"╡","╞":"╞","┼":"┼","┤":"┤","├":"├","¦":"¦","𝒷":"𝒷","⁏":"⁏","\\":"\","⧅":"⧅","⟈":"⟈","•":"•","⪮":"⪮","ć":"ć","∩":"∩","⩄":"⩄","⩉":"⩉","⩋":"⩋","⩇":"⩇","⩀":"⩀","∩︀":"∩︀","⁁":"⁁","⩍":"⩍","č":"č","ç":"ç","ĉ":"ĉ","⩌":"⩌","⩐":"⩐","ċ":"ċ","⦲":"⦲","¢":"¢","𝔠":"𝔠","ч":"ч","✓":"✓","χ":"χ","○":"○","⧃":"⧃","ˆ":"ˆ","≗":"≗","↺":"↺","↻":"↻","Ⓢ":"Ⓢ","⊛":"⊛","⊚":"⊚","⊝":"⊝","⨐":"⨐","⫯":"⫯","⧂":"⧂","♣":"♣",":":":",",":",","@":"@","∁":"∁","⩭":"⩭","𝕔":"𝕔","℗":"℗","↵":"↵","✗":"✗","𝒸":"𝒸","⫏":"⫏","⫑":"⫑","⫐":"⫐","⫒":"⫒","⋯":"⋯","⤸":"⤸","⤵":"⤵","⋞":"⋞","⋟":"⋟","↶":"↶","⤽":"⤽","∪":"∪","⩈":"⩈","⩆":"⩆","⩊":"⩊","⊍":"⊍","⩅":"⩅","∪︀":"∪︀","↷":"↷","⤼":"⤼","⋎":"⋎","⋏":"⋏","¤":"¤","∱":"∱","⌭":"⌭","⥥":"⥥","†":"†","ℸ":"ℸ","‐":"‐","⤏":"⤏","ď":"ď","д":"д","⇊":"⇊","⩷":"⩷","°":"°","δ":"δ","⦱":"⦱","⥿":"⥿","𝔡":"𝔡","♦":"♦","ϝ":"ϝ","⋲":"⋲","÷":"÷","⋇":"⋇","ђ":"ђ","⌞":"⌞","⌍":"⌍",$:"$","𝕕":"𝕕","≑":"≑","∸":"∸","∔":"∔","⊡":"⊡","⌟":"⌟","⌌":"⌌","𝒹":"𝒹","ѕ":"ѕ","⧶":"⧶","đ":"đ","⋱":"⋱","▿":"▿","⦦":"⦦","џ":"џ","⟿":"⟿","é":"é","⩮":"⩮","ě":"ě","≖":"≖","ê":"ê","≕":"≕","э":"э","ė":"ė","≒":"≒","𝔢":"𝔢","⪚":"⪚","è":"è","⪖":"⪖","⪘":"⪘","⪙":"⪙","⏧":"⏧","ℓ":"ℓ","⪕":"⪕","⪗":"⪗","ē":"ē","∅":"∅"," ":" "," ":" "," ":" ","ŋ":"ŋ"," ":" ","ę":"ę","𝕖":"𝕖","⋕":"⋕","⧣":"⧣","⩱":"⩱","ε":"ε","ϵ":"ϵ","=":"=","≟":"≟","⩸":"⩸","⧥":"⧥","≓":"≓","⥱":"⥱","ℯ":"ℯ","η":"η","ð":"ð","ë":"ë","€":"€","!":"!","ф":"ф","♀":"♀","ffi":"ffi","ff":"ff","ffl":"ffl","𝔣":"𝔣","fi":"fi",fj:"fj","♭":"♭","fl":"fl","▱":"▱","ƒ":"ƒ","𝕗":"𝕗","⋔":"⋔","⫙":"⫙","⨍":"⨍","½":"½","⅓":"⅓","¼":"¼","⅕":"⅕","⅙":"⅙","⅛":"⅛","⅔":"⅔","⅖":"⅖","¾":"¾","⅗":"⅗","⅜":"⅜","⅘":"⅘","⅚":"⅚","⅝":"⅝","⅞":"⅞","⁄":"⁄","⌢":"⌢","𝒻":"𝒻","⪌":"⪌","ǵ":"ǵ","γ":"γ","⪆":"⪆","ğ":"ğ","ĝ":"ĝ","г":"г","ġ":"ġ","⪩":"⪩","⪀":"⪀","⪂":"⪂","⪄":"⪄","⋛︀":"⋛︀","⪔":"⪔","𝔤":"𝔤","ℷ":"ℷ","ѓ":"ѓ","⪒":"⪒","⪥":"⪥","⪤":"⪤","≩":"≩","⪊":"⪊","⪈":"⪈","⋧":"⋧","𝕘":"𝕘","ℊ":"ℊ","⪎":"⪎","⪐":"⪐","⪧":"⪧","⩺":"⩺","⋗":"⋗","⦕":"⦕","⩼":"⩼","⥸":"⥸","≩︀":"≩︀","ъ":"ъ","⥈":"⥈","↭":"↭","ℏ":"ℏ","ĥ":"ĥ","♥":"♥","…":"…","⊹":"⊹","𝔥":"𝔥","⤥":"⤥","⤦":"⤦","⇿":"⇿","∻":"∻","↩":"↩","↪":"↪","𝕙":"𝕙","―":"―","𝒽":"𝒽","ħ":"ħ","⁃":"⁃","í":"í","î":"î","и":"и","е":"е","¡":"¡","𝔦":"𝔦","ì":"ì","⨌":"⨌","∭":"∭","⧜":"⧜","℩":"℩","ij":"ij","ī":"ī","ı":"ı","⊷":"⊷","Ƶ":"Ƶ","℅":"℅","∞":"∞","⧝":"⧝","⊺":"⊺","⨗":"⨗","⨼":"⨼","ё":"ё","į":"į","𝕚":"𝕚","ι":"ι","¿":"¿","𝒾":"𝒾","⋹":"⋹","⋵":"⋵","⋴":"⋴","⋳":"⋳","ĩ":"ĩ","і":"і","ï":"ï","ĵ":"ĵ","й":"й","𝔧":"𝔧","ȷ":"ȷ","𝕛":"𝕛","𝒿":"𝒿","ј":"ј","є":"є","κ":"κ","ϰ":"ϰ","ķ":"ķ","к":"к","𝔨":"𝔨","ĸ":"ĸ","х":"х","ќ":"ќ","𝕜":"𝕜","𝓀":"𝓀","⤛":"⤛","⤎":"⤎","⪋":"⪋","⥢":"⥢","ĺ":"ĺ","⦴":"⦴","λ":"λ","⦑":"⦑","⪅":"⪅","«":"«","⤟":"⤟","⤝":"⤝","↫":"↫","⤹":"⤹","⥳":"⥳","↢":"↢","⪫":"⪫","⤙":"⤙","⪭":"⪭","⪭︀":"⪭︀","⤌":"⤌","❲":"❲","{":"{","[":"[","⦋":"⦋","⦏":"⦏","⦍":"⦍","ľ":"ľ","ļ":"ļ","л":"л","⤶":"⤶","⥧":"⥧","⥋":"⥋","↲":"↲","≤":"≤","⇇":"⇇","⋋":"⋋","⪨":"⪨","⩿":"⩿","⪁":"⪁","⪃":"⪃","⋚︀":"⋚︀","⪓":"⪓","⋖":"⋖","⥼":"⥼","𝔩":"𝔩","⪑":"⪑","⥪":"⥪","▄":"▄","љ":"љ","⥫":"⥫","◺":"◺","ŀ":"ŀ","⎰":"⎰","≨":"≨","⪉":"⪉","⪇":"⪇","⋦":"⋦","⟬":"⟬","⇽":"⇽","⟼":"⟼","↬":"↬","⦅":"⦅","𝕝":"𝕝","⨭":"⨭","⨴":"⨴","∗":"∗","◊":"◊","(":"(","⦓":"⦓","⥭":"⥭","‎":"‎","⊿":"⊿","‹":"‹","𝓁":"𝓁","⪍":"⪍","⪏":"⪏","‚":"‚","ł":"ł","⪦":"⪦","⩹":"⩹","⋉":"⋉","⥶":"⥶","⩻":"⩻","⦖":"⦖","◃":"◃","⥊":"⥊","⥦":"⥦","≨︀":"≨︀","∺":"∺","¯":"¯","♂":"♂","✠":"✠","▮":"▮","⨩":"⨩","м":"м","—":"—","𝔪":"𝔪","℧":"℧","µ":"µ","⫰":"⫰","−":"−","⨪":"⨪","⫛":"⫛","⊧":"⊧","𝕞":"𝕞","𝓂":"𝓂","μ":"μ","⊸":"⊸","⋙̸":"⋙̸","≫⃒":"≫⃒","⇍":"⇍","⇎":"⇎","⋘̸":"⋘̸","≪⃒":"≪⃒","⇏":"⇏","⊯":"⊯","⊮":"⊮","ń":"ń","∠⃒":"∠⃒","⩰̸":"⩰̸","≋̸":"≋̸","ʼn":"ʼn","♮":"♮","⩃":"⩃","ň":"ň","ņ":"ņ","⩭̸":"⩭̸","⩂":"⩂","н":"н","–":"–","⇗":"⇗","⤤":"⤤","≐̸":"≐̸","⤨":"⤨","𝔫":"𝔫","↮":"↮","⫲":"⫲","⋼":"⋼","⋺":"⋺","њ":"њ","≦̸":"≦̸","↚":"↚","‥":"‥","𝕟":"𝕟","¬":"¬","⋹̸":"⋹̸","⋵̸":"⋵̸","⋷":"⋷","⋶":"⋶","⋾":"⋾","⋽":"⋽","⫽⃥":"⫽⃥","∂̸":"∂̸","⨔":"⨔","↛":"↛","⤳̸":"⤳̸","↝̸":"↝̸","𝓃":"𝓃","⊄":"⊄","⫅̸":"⫅̸","⊅":"⊅","⫆̸":"⫆̸","ñ":"ñ","ν":"ν","#":"#","№":"№"," ":" ","⊭":"⊭","⤄":"⤄","≍⃒":"≍⃒","⊬":"⊬","≥⃒":"≥⃒",">⃒":">⃒","⧞":"⧞","⤂":"⤂","≤⃒":"≤⃒","<⃒":"<⃒","⊴⃒":"⊴⃒","⤃":"⤃","⊵⃒":"⊵⃒","∼⃒":"∼⃒","⇖":"⇖","⤣":"⤣","⤧":"⤧","ó":"ó","ô":"ô","о":"о","ő":"ő","⨸":"⨸","⦼":"⦼","œ":"œ","⦿":"⦿","𝔬":"𝔬","˛":"˛","ò":"ò","⧁":"⧁","⦵":"⦵","⦾":"⦾","⦻":"⦻","⧀":"⧀","ō":"ō","ω":"ω","ο":"ο","⦶":"⦶","𝕠":"𝕠","⦷":"⦷","⦹":"⦹","∨":"∨","⩝":"⩝","ℴ":"ℴ","ª":"ª","º":"º","⊶":"⊶","⩖":"⩖","⩗":"⩗","⩛":"⩛","ø":"ø","⊘":"⊘","õ":"õ","⨶":"⨶","ö":"ö","⌽":"⌽","¶":"¶","⫳":"⫳","⫽":"⫽","п":"п","%":"%",".":".","‰":"‰","‱":"‱","𝔭":"𝔭","φ":"φ","ϕ":"ϕ","☎":"☎","π":"π","ϖ":"ϖ","ℎ":"ℎ","+":"+","⨣":"⨣","⨢":"⨢","⨥":"⨥","⩲":"⩲","⨦":"⨦","⨧":"⨧","⨕":"⨕","𝕡":"𝕡","£":"£","⪳":"⪳","⪷":"⪷","⪹":"⪹","⪵":"⪵","⋨":"⋨","′":"′","⌮":"⌮","⌒":"⌒","⌓":"⌓","⊰":"⊰","𝓅":"𝓅","ψ":"ψ"," ":" ","𝔮":"𝔮","𝕢":"𝕢","⁗":"⁗","𝓆":"𝓆","⨖":"⨖","?":"?","⤜":"⤜","⥤":"⥤","∽̱":"∽̱","ŕ":"ŕ","⦳":"⦳","⦒":"⦒","⦥":"⦥","»":"»","⥵":"⥵","⤠":"⤠","⤳":"⤳","⤞":"⤞","⥅":"⥅","⥴":"⥴","↣":"↣","↝":"↝","⤚":"⤚","∶":"∶","❳":"❳","}":"}","]":"]","⦌":"⦌","⦎":"⦎","⦐":"⦐","ř":"ř","ŗ":"ŗ","р":"р","⤷":"⤷","⥩":"⥩","↳":"↳","▭":"▭","⥽":"⥽","𝔯":"𝔯","⥬":"⥬","ρ":"ρ","ϱ":"ϱ","⇉":"⇉","⋌":"⋌","˚":"˚","‏":"‏","⎱":"⎱","⫮":"⫮","⟭":"⟭","⇾":"⇾","⦆":"⦆","𝕣":"𝕣","⨮":"⨮","⨵":"⨵",")":")","⦔":"⦔","⨒":"⨒","›":"›","𝓇":"𝓇","⋊":"⋊","▹":"▹","⧎":"⧎","⥨":"⥨","℞":"℞","ś":"ś","⪴":"⪴","⪸":"⪸","š":"š","ş":"ş","ŝ":"ŝ","⪶":"⪶","⪺":"⪺","⋩":"⋩","⨓":"⨓","с":"с","⋅":"⋅","⩦":"⩦","⇘":"⇘","§":"§",";":";","⤩":"⤩","✶":"✶","𝔰":"𝔰","♯":"♯","щ":"щ","ш":"ш","­":"­","σ":"σ","ς":"ς","⩪":"⩪","⪞":"⪞","⪠":"⪠","⪝":"⪝","⪟":"⪟","≆":"≆","⨤":"⨤","⥲":"⥲","⨳":"⨳","⧤":"⧤","⌣":"⌣","⪪":"⪪","⪬":"⪬","⪬︀":"⪬︀","ь":"ь","/":"/","⧄":"⧄","⌿":"⌿","𝕤":"𝕤","♠":"♠","⊓︀":"⊓︀","⊔︀":"⊔︀","𝓈":"𝓈","☆":"☆","⊂":"⊂","⫅":"⫅","⪽":"⪽","⫃":"⫃","⫁":"⫁","⫋":"⫋","⊊":"⊊","⪿":"⪿","⥹":"⥹","⫇":"⫇","⫕":"⫕","⫓":"⫓","♪":"♪","¹":"¹","²":"²","³":"³","⫆":"⫆","⪾":"⪾","⫘":"⫘","⫄":"⫄","⟉":"⟉","⫗":"⫗","⥻":"⥻","⫂":"⫂","⫌":"⫌","⊋":"⊋","⫀":"⫀","⫈":"⫈","⫔":"⫔","⫖":"⫖","⇙":"⇙","⤪":"⤪","ß":"ß","⌖":"⌖","τ":"τ","ť":"ť","ţ":"ţ","т":"т","⌕":"⌕","𝔱":"𝔱","θ":"θ","ϑ":"ϑ","þ":"þ","×":"×","⨱":"⨱","⨰":"⨰","⌶":"⌶","⫱":"⫱","𝕥":"𝕥","⫚":"⫚","‴":"‴","▵":"▵","≜":"≜","◬":"◬","⨺":"⨺","⨹":"⨹","⧍":"⧍","⨻":"⨻","⏢":"⏢","𝓉":"𝓉","ц":"ц","ћ":"ћ","ŧ":"ŧ","⥣":"⥣","ú":"ú","ў":"ў","ŭ":"ŭ","û":"û","у":"у","ű":"ű","⥾":"⥾","𝔲":"𝔲","ù":"ù","▀":"▀","⌜":"⌜","⌏":"⌏","◸":"◸","ū":"ū","ų":"ų","𝕦":"𝕦","υ":"υ","⇈":"⇈","⌝":"⌝","⌎":"⌎","ů":"ů","◹":"◹","𝓊":"𝓊","⋰":"⋰","ũ":"ũ","ü":"ü","⦧":"⦧","⫨":"⫨","⫩":"⫩","⦜":"⦜","⊊︀":"⊊︀","⫋︀":"⫋︀","⊋︀":"⊋︀","⫌︀":"⫌︀","в":"в","⊻":"⊻","≚":"≚","⋮":"⋮","𝔳":"𝔳","𝕧":"𝕧","𝓋":"𝓋","⦚":"⦚","ŵ":"ŵ","⩟":"⩟","≙":"≙","℘":"℘","𝔴":"𝔴","𝕨":"𝕨","𝓌":"𝓌","𝔵":"𝔵","ξ":"ξ","⋻":"⋻","𝕩":"𝕩","𝓍":"𝓍","ý":"ý","я":"я","ŷ":"ŷ","ы":"ы","¥":"¥","𝔶":"𝔶","ї":"ї","𝕪":"𝕪","𝓎":"𝓎","ю":"ю","ÿ":"ÿ","ź":"ź","ž":"ž","з":"з","ż":"ż","ζ":"ζ","𝔷":"𝔷","ж":"ж","⇝":"⇝","𝕫":"𝕫","𝓏":"𝓏","‍":"‍","‌":"‌"}}}; - -/***/ }), - -/***/ "./node_modules/html-entities/lib/numeric-unicode-map.js": -/*!***************************************************************!*\ - !*** ./node_modules/html-entities/lib/numeric-unicode-map.js ***! - \***************************************************************/ -/***/ (function(__unused_webpack_module, exports) { - -"use strict"; -Object.defineProperty(exports, "__esModule", ({value:true}));exports.numericUnicodeMap={0:65533,128:8364,130:8218,131:402,132:8222,133:8230,134:8224,135:8225,136:710,137:8240,138:352,139:8249,140:338,142:381,145:8216,146:8217,147:8220,148:8221,149:8226,150:8211,151:8212,152:732,153:8482,154:353,155:8250,156:339,158:382,159:376}; - -/***/ }), - -/***/ "./node_modules/html-entities/lib/surrogate-pairs.js": -/*!***********************************************************!*\ - !*** ./node_modules/html-entities/lib/surrogate-pairs.js ***! - \***********************************************************/ -/***/ (function(__unused_webpack_module, exports) { - -"use strict"; -Object.defineProperty(exports, "__esModule", ({value:true}));exports.fromCodePoint=String.fromCodePoint||function(astralCodePoint){return String.fromCharCode(Math.floor((astralCodePoint-65536)/1024)+55296,(astralCodePoint-65536)%1024+56320)};exports.getCodePoint=String.prototype.codePointAt?function(input,position){return input.codePointAt(position)}:function(input,position){return(input.charCodeAt(position)-55296)*1024+input.charCodeAt(position+1)-56320+65536};exports.highSurrogateFrom=55296;exports.highSurrogateTo=56319; - -/***/ }), - -/***/ "./node_modules/webpack-dev-server/client/clients/WebSocketClient.js": -/*!***************************************************************************!*\ - !*** ./node_modules/webpack-dev-server/client/clients/WebSocketClient.js ***! - \***************************************************************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ WebSocketClient; } -/* harmony export */ }); -/* harmony import */ var _utils_log_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils/log.js */ "./node_modules/webpack-dev-server/client/utils/log.js"); -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } - -function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } - - - -var WebSocketClient = /*#__PURE__*/function () { - /** - * @param {string} url - */ - function WebSocketClient(url) { - _classCallCheck(this, WebSocketClient); - - this.client = new WebSocket(url); - - this.client.onerror = function (error) { - _utils_log_js__WEBPACK_IMPORTED_MODULE_0__.log.error(error); - }; - } - /** - * @param {(...args: any[]) => void} f - */ - - - _createClass(WebSocketClient, [{ - key: "onOpen", - value: function onOpen(f) { - this.client.onopen = f; - } - /** - * @param {(...args: any[]) => void} f - */ - - }, { - key: "onClose", - value: function onClose(f) { - this.client.onclose = f; - } // call f with the message string as the first argument - - /** - * @param {(...args: any[]) => void} f - */ - - }, { - key: "onMessage", - value: function onMessage(f) { - this.client.onmessage = function (e) { - f(e.data); - }; - } - }]); - - return WebSocketClient; -}(); - - - -/***/ }), - -/***/ "./node_modules/webpack-dev-server/client/index.js?protocol=ws%3A&hostname=localhost&port=8081&pathname=%2Fws&logging=none&reconnect=10": -/*!**********************************************************************************************************************************************!*\ - !*** ./node_modules/webpack-dev-server/client/index.js?protocol=ws%3A&hostname=localhost&port=8081&pathname=%2Fws&logging=none&reconnect=10 ***! - \**********************************************************************************************************************************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { - -"use strict"; -var __resourceQuery = "?protocol=ws%3A&hostname=localhost&port=8081&pathname=%2Fws&logging=none&reconnect=10"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var webpack_hot_log_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! webpack/hot/log.js */ "./node_modules/webpack/hot/log.js"); -/* harmony import */ var webpack_hot_log_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(webpack_hot_log_js__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _utils_stripAnsi_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils/stripAnsi.js */ "./node_modules/webpack-dev-server/client/utils/stripAnsi.js"); -/* harmony import */ var _utils_parseURL_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utils/parseURL.js */ "./node_modules/webpack-dev-server/client/utils/parseURL.js"); -/* harmony import */ var _socket_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./socket.js */ "./node_modules/webpack-dev-server/client/socket.js"); -/* harmony import */ var _overlay_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./overlay.js */ "./node_modules/webpack-dev-server/client/overlay.js"); -/* harmony import */ var _utils_log_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./utils/log.js */ "./node_modules/webpack-dev-server/client/utils/log.js"); -/* harmony import */ var _utils_sendMessage_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./utils/sendMessage.js */ "./node_modules/webpack-dev-server/client/utils/sendMessage.js"); -/* harmony import */ var _utils_reloadApp_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./utils/reloadApp.js */ "./node_modules/webpack-dev-server/client/utils/reloadApp.js"); -/* harmony import */ var _utils_createSocketURL_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./utils/createSocketURL.js */ "./node_modules/webpack-dev-server/client/utils/createSocketURL.js"); -/* global __resourceQuery, __webpack_hash__ */ -/// - - - - - - - - - -/** - * @typedef {Object} Options - * @property {boolean} hot - * @property {boolean} liveReload - * @property {boolean} progress - * @property {boolean | { warnings?: boolean, errors?: boolean, trustedTypesPolicyName?: string }} overlay - * @property {string} [logging] - * @property {number} [reconnect] - */ - -/** - * @typedef {Object} Status - * @property {boolean} isUnloading - * @property {string} currentHash - * @property {string} [previousHash] - */ - -/** - * @type {Status} - */ - -var status = { - isUnloading: false, - // TODO Workaround for webpack v4, `__webpack_hash__` is not replaced without HotModuleReplacement - // eslint-disable-next-line camelcase - currentHash: true ? __webpack_require__.h() : 0 -}; -/** @type {Options} */ - -var options = { - hot: false, - liveReload: false, - progress: false, - overlay: false -}; -var parsedResourceQuery = (0,_utils_parseURL_js__WEBPACK_IMPORTED_MODULE_2__["default"])(__resourceQuery); - -if (parsedResourceQuery.hot === "true") { - options.hot = true; - _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.info("Hot Module Replacement enabled."); -} - -if (parsedResourceQuery["live-reload"] === "true") { - options.liveReload = true; - _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.info("Live Reloading enabled."); -} - -if (parsedResourceQuery.logging) { - options.logging = parsedResourceQuery.logging; -} - -if (typeof parsedResourceQuery.reconnect !== "undefined") { - options.reconnect = Number(parsedResourceQuery.reconnect); -} -/** - * @param {string} level - */ - - -function setAllLogLevel(level) { - // This is needed because the HMR logger operate separately from dev server logger - webpack_hot_log_js__WEBPACK_IMPORTED_MODULE_0___default().setLogLevel(level === "verbose" || level === "log" ? "info" : level); - (0,_utils_log_js__WEBPACK_IMPORTED_MODULE_5__.setLogLevel)(level); -} - -if (options.logging) { - setAllLogLevel(options.logging); -} - -self.addEventListener("beforeunload", function () { - status.isUnloading = true; -}); -var onSocketMessage = { - hot: function hot() { - if (parsedResourceQuery.hot === "false") { - return; - } - - options.hot = true; - _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.info("Hot Module Replacement enabled."); - }, - liveReload: function liveReload() { - if (parsedResourceQuery["live-reload"] === "false") { - return; - } - - options.liveReload = true; - _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.info("Live Reloading enabled."); - }, - invalid: function invalid() { - _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.info("App updated. Recompiling..."); // Fixes #1042. overlay doesn't clear if errors are fixed but warnings remain. - - if (options.overlay) { - (0,_overlay_js__WEBPACK_IMPORTED_MODULE_4__.hide)(); - } - - (0,_utils_sendMessage_js__WEBPACK_IMPORTED_MODULE_6__["default"])("Invalid"); - }, - - /** - * @param {string} hash - */ - hash: function hash(_hash) { - status.previousHash = status.currentHash; - status.currentHash = _hash; - }, - logging: setAllLogLevel, - - /** - * @param {boolean} value - */ - overlay: function overlay(value) { - if (typeof document === "undefined") { - return; - } - - options.overlay = value; - }, - - /** - * @param {number} value - */ - reconnect: function reconnect(value) { - if (parsedResourceQuery.reconnect === "false") { - return; - } - - options.reconnect = value; - }, - - /** - * @param {boolean} value - */ - progress: function progress(value) { - options.progress = value; - }, - - /** - * @param {{ pluginName?: string, percent: number, msg: string }} data - */ - "progress-update": function progressUpdate(data) { - if (options.progress) { - _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.info("".concat(data.pluginName ? "[".concat(data.pluginName, "] ") : "").concat(data.percent, "% - ").concat(data.msg, ".")); - } - - (0,_utils_sendMessage_js__WEBPACK_IMPORTED_MODULE_6__["default"])("Progress", data); - }, - "still-ok": function stillOk() { - _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.info("Nothing changed."); - - if (options.overlay) { - (0,_overlay_js__WEBPACK_IMPORTED_MODULE_4__.hide)(); - } - - (0,_utils_sendMessage_js__WEBPACK_IMPORTED_MODULE_6__["default"])("StillOk"); - }, - ok: function ok() { - (0,_utils_sendMessage_js__WEBPACK_IMPORTED_MODULE_6__["default"])("Ok"); - - if (options.overlay) { - (0,_overlay_js__WEBPACK_IMPORTED_MODULE_4__.hide)(); - } - - (0,_utils_reloadApp_js__WEBPACK_IMPORTED_MODULE_7__["default"])(options, status); - }, - // TODO: remove in v5 in favor of 'static-changed' - - /** - * @param {string} file - */ - "content-changed": function contentChanged(file) { - _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.info("".concat(file ? "\"".concat(file, "\"") : "Content", " from static directory was changed. Reloading...")); - self.location.reload(); - }, - - /** - * @param {string} file - */ - "static-changed": function staticChanged(file) { - _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.info("".concat(file ? "\"".concat(file, "\"") : "Content", " from static directory was changed. Reloading...")); - self.location.reload(); - }, - - /** - * @param {Error[]} warnings - * @param {any} params - */ - warnings: function warnings(_warnings, params) { - _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.warn("Warnings while compiling."); - - var printableWarnings = _warnings.map(function (error) { - var _formatProblem = (0,_overlay_js__WEBPACK_IMPORTED_MODULE_4__.formatProblem)("warning", error), - header = _formatProblem.header, - body = _formatProblem.body; - - return "".concat(header, "\n").concat((0,_utils_stripAnsi_js__WEBPACK_IMPORTED_MODULE_1__["default"])(body)); - }); - - (0,_utils_sendMessage_js__WEBPACK_IMPORTED_MODULE_6__["default"])("Warnings", printableWarnings); - - for (var i = 0; i < printableWarnings.length; i++) { - _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.warn(printableWarnings[i]); - } - - var needShowOverlayForWarnings = typeof options.overlay === "boolean" ? options.overlay : options.overlay && options.overlay.warnings; - - if (needShowOverlayForWarnings) { - var trustedTypesPolicyName = typeof options.overlay === "object" && options.overlay.trustedTypesPolicyName; - (0,_overlay_js__WEBPACK_IMPORTED_MODULE_4__.show)("warning", _warnings, trustedTypesPolicyName || null); - } - - if (params && params.preventReloading) { - return; - } - - (0,_utils_reloadApp_js__WEBPACK_IMPORTED_MODULE_7__["default"])(options, status); - }, - - /** - * @param {Error[]} errors - */ - errors: function errors(_errors) { - _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.error("Errors while compiling. Reload prevented."); - - var printableErrors = _errors.map(function (error) { - var _formatProblem2 = (0,_overlay_js__WEBPACK_IMPORTED_MODULE_4__.formatProblem)("error", error), - header = _formatProblem2.header, - body = _formatProblem2.body; - - return "".concat(header, "\n").concat((0,_utils_stripAnsi_js__WEBPACK_IMPORTED_MODULE_1__["default"])(body)); - }); - - (0,_utils_sendMessage_js__WEBPACK_IMPORTED_MODULE_6__["default"])("Errors", printableErrors); - - for (var i = 0; i < printableErrors.length; i++) { - _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.error(printableErrors[i]); - } - - var needShowOverlayForErrors = typeof options.overlay === "boolean" ? options.overlay : options.overlay && options.overlay.errors; - - if (needShowOverlayForErrors) { - var trustedTypesPolicyName = typeof options.overlay === "object" && options.overlay.trustedTypesPolicyName; - (0,_overlay_js__WEBPACK_IMPORTED_MODULE_4__.show)("error", _errors, trustedTypesPolicyName || null); - } - }, - - /** - * @param {Error} error - */ - error: function error(_error) { - _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.error(_error); - }, - close: function close() { - _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.info("Disconnected!"); - - if (options.overlay) { - (0,_overlay_js__WEBPACK_IMPORTED_MODULE_4__.hide)(); - } - - (0,_utils_sendMessage_js__WEBPACK_IMPORTED_MODULE_6__["default"])("Close"); - } -}; -var socketURL = (0,_utils_createSocketURL_js__WEBPACK_IMPORTED_MODULE_8__["default"])(parsedResourceQuery); -(0,_socket_js__WEBPACK_IMPORTED_MODULE_3__["default"])(socketURL, onSocketMessage, options.reconnect); - -/***/ }), - -/***/ "./node_modules/webpack-dev-server/client/modules/logger/index.js": -/*!************************************************************************!*\ - !*** ./node_modules/webpack-dev-server/client/modules/logger/index.js ***! - \************************************************************************/ -/***/ (function(__unused_webpack_module, exports) { - -/******/ (function() { // webpackBootstrap -/******/ "use strict"; -/******/ var __webpack_modules__ = ({ - -/***/ "./client-src/modules/logger/SyncBailHookFake.js": -/*!*******************************************************!*\ - !*** ./client-src/modules/logger/SyncBailHookFake.js ***! - \*******************************************************/ -/***/ (function(module) { - - -/** - * Client stub for tapable SyncBailHook - */ - -module.exports = function clientTapableSyncBailHook() { - return { - call: function call() {} - }; -}; - -/***/ }), - -/***/ "./node_modules/webpack/lib/logging/Logger.js": -/*!****************************************************!*\ - !*** ./node_modules/webpack/lib/logging/Logger.js ***! - \****************************************************/ -/***/ (function(__unused_webpack_module, exports) { - -/* - MIT License http://www.opensource.org/licenses/mit-license.php - Author Tobias Koppers @sokra -*/ - - -function _toConsumableArray(arr) { - return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); -} - -function _nonIterableSpread() { - throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); -} - -function _unsupportedIterableToArray(o, minLen) { - if (!o) return; - if (typeof o === "string") return _arrayLikeToArray(o, minLen); - var n = Object.prototype.toString.call(o).slice(8, -1); - if (n === "Object" && o.constructor) n = o.constructor.name; - if (n === "Map" || n === "Set") return Array.from(o); - if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); -} - -function _iterableToArray(iter) { - if (typeof (typeof Symbol !== "undefined" ? Symbol : function (i) { return i; }) !== "undefined" && iter[(typeof Symbol !== "undefined" ? Symbol : function (i) { return i; }).iterator] != null || iter["@@iterator"] != null) return Array.from(iter); -} - -function _arrayWithoutHoles(arr) { - if (Array.isArray(arr)) return _arrayLikeToArray(arr); -} - -function _arrayLikeToArray(arr, len) { - if (len == null || len > arr.length) len = arr.length; - - for (var i = 0, arr2 = new Array(len); i < len; i++) { - arr2[i] = arr[i]; - } - - return arr2; -} - -function _classCallCheck(instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a function"); - } -} - -function _defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i]; - descriptor.enumerable = descriptor.enumerable || false; - descriptor.configurable = true; - if ("value" in descriptor) descriptor.writable = true; - Object.defineProperty(target, descriptor.key, descriptor); - } -} - -function _createClass(Constructor, protoProps, staticProps) { - if (protoProps) _defineProperties(Constructor.prototype, protoProps); - if (staticProps) _defineProperties(Constructor, staticProps); - Object.defineProperty(Constructor, "prototype", { - writable: false - }); - return Constructor; -} - -var LogType = Object.freeze({ - error: - /** @type {"error"} */ - "error", - // message, c style arguments - warn: - /** @type {"warn"} */ - "warn", - // message, c style arguments - info: - /** @type {"info"} */ - "info", - // message, c style arguments - log: - /** @type {"log"} */ - "log", - // message, c style arguments - debug: - /** @type {"debug"} */ - "debug", - // message, c style arguments - trace: - /** @type {"trace"} */ - "trace", - // no arguments - group: - /** @type {"group"} */ - "group", - // [label] - groupCollapsed: - /** @type {"groupCollapsed"} */ - "groupCollapsed", - // [label] - groupEnd: - /** @type {"groupEnd"} */ - "groupEnd", - // [label] - profile: - /** @type {"profile"} */ - "profile", - // [profileName] - profileEnd: - /** @type {"profileEnd"} */ - "profileEnd", - // [profileName] - time: - /** @type {"time"} */ - "time", - // name, time as [seconds, nanoseconds] - clear: - /** @type {"clear"} */ - "clear", - // no arguments - status: - /** @type {"status"} */ - "status" // message, arguments - -}); -exports.LogType = LogType; -/** @typedef {typeof LogType[keyof typeof LogType]} LogTypeEnum */ - -var LOG_SYMBOL = (typeof Symbol !== "undefined" ? Symbol : function (i) { return i; })("webpack logger raw log method"); -var TIMERS_SYMBOL = (typeof Symbol !== "undefined" ? Symbol : function (i) { return i; })("webpack logger times"); -var TIMERS_AGGREGATES_SYMBOL = (typeof Symbol !== "undefined" ? Symbol : function (i) { return i; })("webpack logger aggregated times"); - -var WebpackLogger = /*#__PURE__*/function () { - /** - * @param {function(LogTypeEnum, any[]=): void} log log function - * @param {function(string | function(): string): WebpackLogger} getChildLogger function to create child logger - */ - function WebpackLogger(log, getChildLogger) { - _classCallCheck(this, WebpackLogger); - - this[LOG_SYMBOL] = log; - this.getChildLogger = getChildLogger; - } - - _createClass(WebpackLogger, [{ - key: "error", - value: function error() { - for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { - args[_key] = arguments[_key]; - } - - this[LOG_SYMBOL](LogType.error, args); - } - }, { - key: "warn", - value: function warn() { - for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { - args[_key2] = arguments[_key2]; - } - - this[LOG_SYMBOL](LogType.warn, args); - } - }, { - key: "info", - value: function info() { - for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) { - args[_key3] = arguments[_key3]; - } - - this[LOG_SYMBOL](LogType.info, args); - } - }, { - key: "log", - value: function log() { - for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) { - args[_key4] = arguments[_key4]; - } - - this[LOG_SYMBOL](LogType.log, args); - } - }, { - key: "debug", - value: function debug() { - for (var _len5 = arguments.length, args = new Array(_len5), _key5 = 0; _key5 < _len5; _key5++) { - args[_key5] = arguments[_key5]; - } - - this[LOG_SYMBOL](LogType.debug, args); - } - }, { - key: "assert", - value: function assert(assertion) { - if (!assertion) { - for (var _len6 = arguments.length, args = new Array(_len6 > 1 ? _len6 - 1 : 0), _key6 = 1; _key6 < _len6; _key6++) { - args[_key6 - 1] = arguments[_key6]; - } - - this[LOG_SYMBOL](LogType.error, args); - } - } - }, { - key: "trace", - value: function trace() { - this[LOG_SYMBOL](LogType.trace, ["Trace"]); - } - }, { - key: "clear", - value: function clear() { - this[LOG_SYMBOL](LogType.clear); - } - }, { - key: "status", - value: function status() { - for (var _len7 = arguments.length, args = new Array(_len7), _key7 = 0; _key7 < _len7; _key7++) { - args[_key7] = arguments[_key7]; - } - - this[LOG_SYMBOL](LogType.status, args); - } - }, { - key: "group", - value: function group() { - for (var _len8 = arguments.length, args = new Array(_len8), _key8 = 0; _key8 < _len8; _key8++) { - args[_key8] = arguments[_key8]; - } - - this[LOG_SYMBOL](LogType.group, args); - } - }, { - key: "groupCollapsed", - value: function groupCollapsed() { - for (var _len9 = arguments.length, args = new Array(_len9), _key9 = 0; _key9 < _len9; _key9++) { - args[_key9] = arguments[_key9]; - } - - this[LOG_SYMBOL](LogType.groupCollapsed, args); - } - }, { - key: "groupEnd", - value: function groupEnd() { - for (var _len10 = arguments.length, args = new Array(_len10), _key10 = 0; _key10 < _len10; _key10++) { - args[_key10] = arguments[_key10]; - } - - this[LOG_SYMBOL](LogType.groupEnd, args); - } - }, { - key: "profile", - value: function profile(label) { - this[LOG_SYMBOL](LogType.profile, [label]); - } - }, { - key: "profileEnd", - value: function profileEnd(label) { - this[LOG_SYMBOL](LogType.profileEnd, [label]); - } - }, { - key: "time", - value: function time(label) { - this[TIMERS_SYMBOL] = this[TIMERS_SYMBOL] || new Map(); - this[TIMERS_SYMBOL].set(label, process.hrtime()); - } - }, { - key: "timeLog", - value: function timeLog(label) { - var prev = this[TIMERS_SYMBOL] && this[TIMERS_SYMBOL].get(label); - - if (!prev) { - throw new Error("No such label '".concat(label, "' for WebpackLogger.timeLog()")); - } - - var time = process.hrtime(prev); - this[LOG_SYMBOL](LogType.time, [label].concat(_toConsumableArray(time))); - } - }, { - key: "timeEnd", - value: function timeEnd(label) { - var prev = this[TIMERS_SYMBOL] && this[TIMERS_SYMBOL].get(label); - - if (!prev) { - throw new Error("No such label '".concat(label, "' for WebpackLogger.timeEnd()")); - } - - var time = process.hrtime(prev); - this[TIMERS_SYMBOL].delete(label); - this[LOG_SYMBOL](LogType.time, [label].concat(_toConsumableArray(time))); - } - }, { - key: "timeAggregate", - value: function timeAggregate(label) { - var prev = this[TIMERS_SYMBOL] && this[TIMERS_SYMBOL].get(label); - - if (!prev) { - throw new Error("No such label '".concat(label, "' for WebpackLogger.timeAggregate()")); - } - - var time = process.hrtime(prev); - this[TIMERS_SYMBOL].delete(label); - this[TIMERS_AGGREGATES_SYMBOL] = this[TIMERS_AGGREGATES_SYMBOL] || new Map(); - var current = this[TIMERS_AGGREGATES_SYMBOL].get(label); - - if (current !== undefined) { - if (time[1] + current[1] > 1e9) { - time[0] += current[0] + 1; - time[1] = time[1] - 1e9 + current[1]; - } else { - time[0] += current[0]; - time[1] += current[1]; - } - } - - this[TIMERS_AGGREGATES_SYMBOL].set(label, time); - } - }, { - key: "timeAggregateEnd", - value: function timeAggregateEnd(label) { - if (this[TIMERS_AGGREGATES_SYMBOL] === undefined) return; - var time = this[TIMERS_AGGREGATES_SYMBOL].get(label); - if (time === undefined) return; - this[TIMERS_AGGREGATES_SYMBOL].delete(label); - this[LOG_SYMBOL](LogType.time, [label].concat(_toConsumableArray(time))); - } - }]); - - return WebpackLogger; -}(); - -exports.Logger = WebpackLogger; - -/***/ }), - -/***/ "./node_modules/webpack/lib/logging/createConsoleLogger.js": -/*!*****************************************************************!*\ - !*** ./node_modules/webpack/lib/logging/createConsoleLogger.js ***! - \*****************************************************************/ -/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_10785__) { - -/* - MIT License http://www.opensource.org/licenses/mit-license.php - Author Tobias Koppers @sokra -*/ - - -function _toConsumableArray(arr) { - return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); -} - -function _nonIterableSpread() { - throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); -} - -function _unsupportedIterableToArray(o, minLen) { - if (!o) return; - if (typeof o === "string") return _arrayLikeToArray(o, minLen); - var n = Object.prototype.toString.call(o).slice(8, -1); - if (n === "Object" && o.constructor) n = o.constructor.name; - if (n === "Map" || n === "Set") return Array.from(o); - if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); -} - -function _iterableToArray(iter) { - if (typeof (typeof Symbol !== "undefined" ? Symbol : function (i) { return i; }) !== "undefined" && iter[(typeof Symbol !== "undefined" ? Symbol : function (i) { return i; }).iterator] != null || iter["@@iterator"] != null) return Array.from(iter); -} - -function _arrayWithoutHoles(arr) { - if (Array.isArray(arr)) return _arrayLikeToArray(arr); -} - -function _arrayLikeToArray(arr, len) { - if (len == null || len > arr.length) len = arr.length; - - for (var i = 0, arr2 = new Array(len); i < len; i++) { - arr2[i] = arr[i]; - } - - return arr2; -} - -var _require = __nested_webpack_require_10785__(/*! ./Logger */ "./node_modules/webpack/lib/logging/Logger.js"), - LogType = _require.LogType; -/** @typedef {import("../../declarations/WebpackOptions").FilterItemTypes} FilterItemTypes */ - -/** @typedef {import("../../declarations/WebpackOptions").FilterTypes} FilterTypes */ - -/** @typedef {import("./Logger").LogTypeEnum} LogTypeEnum */ - -/** @typedef {function(string): boolean} FilterFunction */ - -/** - * @typedef {Object} LoggerConsole - * @property {function(): void} clear - * @property {function(): void} trace - * @property {(...args: any[]) => void} info - * @property {(...args: any[]) => void} log - * @property {(...args: any[]) => void} warn - * @property {(...args: any[]) => void} error - * @property {(...args: any[]) => void=} debug - * @property {(...args: any[]) => void=} group - * @property {(...args: any[]) => void=} groupCollapsed - * @property {(...args: any[]) => void=} groupEnd - * @property {(...args: any[]) => void=} status - * @property {(...args: any[]) => void=} profile - * @property {(...args: any[]) => void=} profileEnd - * @property {(...args: any[]) => void=} logTime - */ - -/** - * @typedef {Object} LoggerOptions - * @property {false|true|"none"|"error"|"warn"|"info"|"log"|"verbose"} level loglevel - * @property {FilterTypes|boolean} debug filter for debug logging - * @property {LoggerConsole} console the console to log to - */ - -/** - * @param {FilterItemTypes} item an input item - * @returns {FilterFunction} filter function - */ - - -var filterToFunction = function filterToFunction(item) { - if (typeof item === "string") { - var regExp = new RegExp("[\\\\/]".concat(item.replace( // eslint-disable-next-line no-useless-escape - /[-[\]{}()*+?.\\^$|]/g, "\\$&"), "([\\\\/]|$|!|\\?)")); - return function (ident) { - return regExp.test(ident); - }; - } - - if (item && typeof item === "object" && typeof item.test === "function") { - return function (ident) { - return item.test(ident); - }; - } - - if (typeof item === "function") { - return item; - } - - if (typeof item === "boolean") { - return function () { - return item; - }; - } -}; -/** - * @enum {number} - */ - - -var LogLevel = { - none: 6, - false: 6, - error: 5, - warn: 4, - info: 3, - log: 2, - true: 2, - verbose: 1 -}; -/** - * @param {LoggerOptions} options options object - * @returns {function(string, LogTypeEnum, any[]): void} logging function - */ - -module.exports = function (_ref) { - var _ref$level = _ref.level, - level = _ref$level === void 0 ? "info" : _ref$level, - _ref$debug = _ref.debug, - debug = _ref$debug === void 0 ? false : _ref$debug, - console = _ref.console; - var debugFilters = typeof debug === "boolean" ? [function () { - return debug; - }] : - /** @type {FilterItemTypes[]} */ - [].concat(debug).map(filterToFunction); - /** @type {number} */ - - var loglevel = LogLevel["".concat(level)] || 0; - /** - * @param {string} name name of the logger - * @param {LogTypeEnum} type type of the log entry - * @param {any[]} args arguments of the log entry - * @returns {void} - */ - - var logger = function logger(name, type, args) { - var labeledArgs = function labeledArgs() { - if (Array.isArray(args)) { - if (args.length > 0 && typeof args[0] === "string") { - return ["[".concat(name, "] ").concat(args[0])].concat(_toConsumableArray(args.slice(1))); - } else { - return ["[".concat(name, "]")].concat(_toConsumableArray(args)); - } - } else { - return []; - } - }; - - var debug = debugFilters.some(function (f) { - return f(name); - }); - - switch (type) { - case LogType.debug: - if (!debug) return; // eslint-disable-next-line node/no-unsupported-features/node-builtins - - if (typeof console.debug === "function") { - // eslint-disable-next-line node/no-unsupported-features/node-builtins - console.debug.apply(console, _toConsumableArray(labeledArgs())); - } else { - console.log.apply(console, _toConsumableArray(labeledArgs())); - } - - break; - - case LogType.log: - if (!debug && loglevel > LogLevel.log) return; - console.log.apply(console, _toConsumableArray(labeledArgs())); - break; - - case LogType.info: - if (!debug && loglevel > LogLevel.info) return; - console.info.apply(console, _toConsumableArray(labeledArgs())); - break; - - case LogType.warn: - if (!debug && loglevel > LogLevel.warn) return; - console.warn.apply(console, _toConsumableArray(labeledArgs())); - break; - - case LogType.error: - if (!debug && loglevel > LogLevel.error) return; - console.error.apply(console, _toConsumableArray(labeledArgs())); - break; - - case LogType.trace: - if (!debug) return; - console.trace(); - break; - - case LogType.groupCollapsed: - if (!debug && loglevel > LogLevel.log) return; - - if (!debug && loglevel > LogLevel.verbose) { - // eslint-disable-next-line node/no-unsupported-features/node-builtins - if (typeof console.groupCollapsed === "function") { - // eslint-disable-next-line node/no-unsupported-features/node-builtins - console.groupCollapsed.apply(console, _toConsumableArray(labeledArgs())); - } else { - console.log.apply(console, _toConsumableArray(labeledArgs())); - } - - break; - } - - // falls through - - case LogType.group: - if (!debug && loglevel > LogLevel.log) return; // eslint-disable-next-line node/no-unsupported-features/node-builtins - - if (typeof console.group === "function") { - // eslint-disable-next-line node/no-unsupported-features/node-builtins - console.group.apply(console, _toConsumableArray(labeledArgs())); - } else { - console.log.apply(console, _toConsumableArray(labeledArgs())); - } - - break; - - case LogType.groupEnd: - if (!debug && loglevel > LogLevel.log) return; // eslint-disable-next-line node/no-unsupported-features/node-builtins - - if (typeof console.groupEnd === "function") { - // eslint-disable-next-line node/no-unsupported-features/node-builtins - console.groupEnd(); - } - - break; - - case LogType.time: - { - if (!debug && loglevel > LogLevel.log) return; - var ms = args[1] * 1000 + args[2] / 1000000; - var msg = "[".concat(name, "] ").concat(args[0], ": ").concat(ms, " ms"); - - if (typeof console.logTime === "function") { - console.logTime(msg); - } else { - console.log(msg); - } - - break; - } - - case LogType.profile: - // eslint-disable-next-line node/no-unsupported-features/node-builtins - if (typeof console.profile === "function") { - // eslint-disable-next-line node/no-unsupported-features/node-builtins - console.profile.apply(console, _toConsumableArray(labeledArgs())); - } - - break; - - case LogType.profileEnd: - // eslint-disable-next-line node/no-unsupported-features/node-builtins - if (typeof console.profileEnd === "function") { - // eslint-disable-next-line node/no-unsupported-features/node-builtins - console.profileEnd.apply(console, _toConsumableArray(labeledArgs())); - } - - break; - - case LogType.clear: - if (!debug && loglevel > LogLevel.log) return; // eslint-disable-next-line node/no-unsupported-features/node-builtins - - if (typeof console.clear === "function") { - // eslint-disable-next-line node/no-unsupported-features/node-builtins - console.clear(); - } - - break; - - case LogType.status: - if (!debug && loglevel > LogLevel.info) return; - - if (typeof console.status === "function") { - if (args.length === 0) { - console.status(); - } else { - console.status.apply(console, _toConsumableArray(labeledArgs())); - } - } else { - if (args.length !== 0) { - console.info.apply(console, _toConsumableArray(labeledArgs())); - } - } - - break; - - default: - throw new Error("Unexpected LogType ".concat(type)); - } - }; - - return logger; -}; - -/***/ }), - -/***/ "./node_modules/webpack/lib/logging/runtime.js": -/*!*****************************************************!*\ - !*** ./node_modules/webpack/lib/logging/runtime.js ***! - \*****************************************************/ -/***/ (function(__unused_webpack_module, exports, __nested_webpack_require_20872__) { - -/* - MIT License http://www.opensource.org/licenses/mit-license.php - Author Tobias Koppers @sokra -*/ - - -function _extends() { - _extends = Object.assign ? Object.assign.bind() : function (target) { - for (var i = 1; i < arguments.length; i++) { - var source = arguments[i]; - - for (var key in source) { - if (Object.prototype.hasOwnProperty.call(source, key)) { - target[key] = source[key]; - } - } - } - - return target; - }; - return _extends.apply(this, arguments); -} - -var SyncBailHook = __nested_webpack_require_20872__(/*! tapable/lib/SyncBailHook */ "./client-src/modules/logger/SyncBailHookFake.js"); - -var _require = __nested_webpack_require_20872__(/*! ./Logger */ "./node_modules/webpack/lib/logging/Logger.js"), - Logger = _require.Logger; - -var createConsoleLogger = __nested_webpack_require_20872__(/*! ./createConsoleLogger */ "./node_modules/webpack/lib/logging/createConsoleLogger.js"); -/** @type {createConsoleLogger.LoggerOptions} */ - - -var currentDefaultLoggerOptions = { - level: "info", - debug: false, - console: console -}; -var currentDefaultLogger = createConsoleLogger(currentDefaultLoggerOptions); -/** - * @param {string} name name of the logger - * @returns {Logger} a logger - */ - -exports.getLogger = function (name) { - return new Logger(function (type, args) { - if (exports.hooks.log.call(name, type, args) === undefined) { - currentDefaultLogger(name, type, args); - } - }, function (childName) { - return exports.getLogger("".concat(name, "/").concat(childName)); - }); -}; -/** - * @param {createConsoleLogger.LoggerOptions} options new options, merge with old options - * @returns {void} - */ - - -exports.configureDefaultLogger = function (options) { - _extends(currentDefaultLoggerOptions, options); - - currentDefaultLogger = createConsoleLogger(currentDefaultLoggerOptions); -}; - -exports.hooks = { - log: new SyncBailHook(["origin", "type", "args"]) -}; - -/***/ }) - -/******/ }); -/************************************************************************/ -/******/ // The module cache -/******/ var __webpack_module_cache__ = {}; -/******/ -/******/ // The require function -/******/ function __nested_webpack_require_23009__(moduleId) { -/******/ // Check if module is in cache -/******/ var cachedModule = __webpack_module_cache__[moduleId]; -/******/ if (cachedModule !== undefined) { -/******/ return cachedModule.exports; -/******/ } -/******/ // Create a new module (and put it into the cache) -/******/ var module = __webpack_module_cache__[moduleId] = { -/******/ // no module.id needed -/******/ // no module.loaded needed -/******/ exports: {} -/******/ }; -/******/ -/******/ // Execute the module function -/******/ __webpack_modules__[moduleId](module, module.exports, __nested_webpack_require_23009__); -/******/ -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } -/******/ -/************************************************************************/ -/******/ /* webpack/runtime/define property getters */ -/******/ !function() { -/******/ // define getter functions for harmony exports -/******/ __nested_webpack_require_23009__.d = function(exports, definition) { -/******/ for(var key in definition) { -/******/ if(__nested_webpack_require_23009__.o(definition, key) && !__nested_webpack_require_23009__.o(exports, key)) { -/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); -/******/ } -/******/ } -/******/ }; -/******/ }(); -/******/ -/******/ /* webpack/runtime/hasOwnProperty shorthand */ -/******/ !function() { -/******/ __nested_webpack_require_23009__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); } -/******/ }(); -/******/ -/******/ /* webpack/runtime/make namespace object */ -/******/ !function() { -/******/ // define __esModule on exports -/******/ __nested_webpack_require_23009__.r = function(exports) { -/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { -/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); -/******/ } -/******/ Object.defineProperty(exports, '__esModule', { value: true }); -/******/ }; -/******/ }(); -/******/ -/************************************************************************/ -var __webpack_exports__ = {}; -// This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk. -!function() { -/*!********************************************!*\ - !*** ./client-src/modules/logger/index.js ***! - \********************************************/ -__nested_webpack_require_23009__.r(__webpack_exports__); -/* harmony export */ __nested_webpack_require_23009__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* reexport default export from named module */ webpack_lib_logging_runtime_js__WEBPACK_IMPORTED_MODULE_0__; } -/* harmony export */ }); -/* harmony import */ var webpack_lib_logging_runtime_js__WEBPACK_IMPORTED_MODULE_0__ = __nested_webpack_require_23009__(/*! webpack/lib/logging/runtime.js */ "./node_modules/webpack/lib/logging/runtime.js"); - -}(); -var __webpack_export_target__ = exports; -for(var i in __webpack_exports__) __webpack_export_target__[i] = __webpack_exports__[i]; -if(__webpack_exports__.__esModule) Object.defineProperty(__webpack_export_target__, "__esModule", { value: true }); -/******/ })() -; - -/***/ }), - -/***/ "./node_modules/webpack-dev-server/client/overlay.js": -/*!***********************************************************!*\ - !*** ./node_modules/webpack-dev-server/client/overlay.js ***! - \***********************************************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "formatProblem": function() { return /* binding */ formatProblem; }, -/* harmony export */ "hide": function() { return /* binding */ hide; }, -/* harmony export */ "show": function() { return /* binding */ show; } -/* harmony export */ }); -/* harmony import */ var ansi_html_community__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ansi-html-community */ "./node_modules/ansi-html-community/index.js"); -/* harmony import */ var ansi_html_community__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(ansi_html_community__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var html_entities__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! html-entities */ "./node_modules/html-entities/lib/index.js"); -/* harmony import */ var html_entities__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(html_entities__WEBPACK_IMPORTED_MODULE_1__); -// The error overlay is inspired (and mostly copied) from Create React App (https://github.com/facebookincubator/create-react-app) -// They, in turn, got inspired by webpack-hot-middleware (https://github.com/glenjamin/webpack-hot-middleware). - - -var colors = { - reset: ["transparent", "transparent"], - black: "181818", - red: "E36049", - green: "B3CB74", - yellow: "FFD080", - blue: "7CAFC2", - magenta: "7FACCA", - cyan: "C3C2EF", - lightgrey: "EBE7E3", - darkgrey: "6D7891" -}; -/** @type {HTMLIFrameElement | null | undefined} */ - -var iframeContainerElement; -/** @type {HTMLDivElement | null | undefined} */ - -var containerElement; -/** @type {Array<(element: HTMLDivElement) => void>} */ - -var onLoadQueue = []; -/** @type {TrustedTypePolicy | undefined} */ - -var overlayTrustedTypesPolicy; -ansi_html_community__WEBPACK_IMPORTED_MODULE_0___default().setColors(colors); -/** - * @param {string | null} trustedTypesPolicyName - */ - -function createContainer(trustedTypesPolicyName) { - // Enable Trusted Types if they are available in the current browser. - if (window.trustedTypes) { - overlayTrustedTypesPolicy = window.trustedTypes.createPolicy(trustedTypesPolicyName || "webpack-dev-server#overlay", { - createHTML: function createHTML(value) { - return value; - } - }); - } - - iframeContainerElement = document.createElement("iframe"); - iframeContainerElement.id = "webpack-dev-server-client-overlay"; - iframeContainerElement.src = "about:blank"; - iframeContainerElement.style.position = "fixed"; - iframeContainerElement.style.left = 0; - iframeContainerElement.style.top = 0; - iframeContainerElement.style.right = 0; - iframeContainerElement.style.bottom = 0; - iframeContainerElement.style.width = "100vw"; - iframeContainerElement.style.height = "100vh"; - iframeContainerElement.style.border = "none"; - iframeContainerElement.style.zIndex = 9999999999; - - iframeContainerElement.onload = function () { - containerElement = - /** @type {Document} */ - - /** @type {HTMLIFrameElement} */ - iframeContainerElement.contentDocument.createElement("div"); - containerElement.id = "webpack-dev-server-client-overlay-div"; - containerElement.style.position = "fixed"; - containerElement.style.boxSizing = "border-box"; - containerElement.style.left = 0; - containerElement.style.top = 0; - containerElement.style.right = 0; - containerElement.style.bottom = 0; - containerElement.style.width = "100vw"; - containerElement.style.height = "100vh"; - containerElement.style.backgroundColor = "rgba(0, 0, 0, 0.85)"; - containerElement.style.color = "#E8E8E8"; - containerElement.style.fontFamily = "Menlo, Consolas, monospace"; - containerElement.style.fontSize = "large"; - containerElement.style.padding = "2rem"; - containerElement.style.lineHeight = "1.2"; - containerElement.style.whiteSpace = "pre-wrap"; - containerElement.style.overflow = "auto"; - var headerElement = document.createElement("span"); - headerElement.innerText = "Compiled with problems:"; - var closeButtonElement = document.createElement("button"); - closeButtonElement.innerText = "X"; - closeButtonElement.style.background = "transparent"; - closeButtonElement.style.border = "none"; - closeButtonElement.style.fontSize = "20px"; - closeButtonElement.style.fontWeight = "bold"; - closeButtonElement.style.color = "white"; - closeButtonElement.style.cursor = "pointer"; - closeButtonElement.style.cssFloat = "right"; // @ts-ignore - - closeButtonElement.style.styleFloat = "right"; - closeButtonElement.addEventListener("click", function () { - hide(); - }); - containerElement.appendChild(headerElement); - containerElement.appendChild(closeButtonElement); - containerElement.appendChild(document.createElement("br")); - containerElement.appendChild(document.createElement("br")); - /** @type {Document} */ - - /** @type {HTMLIFrameElement} */ - iframeContainerElement.contentDocument.body.appendChild(containerElement); - onLoadQueue.forEach(function (onLoad) { - onLoad( - /** @type {HTMLDivElement} */ - containerElement); - }); - onLoadQueue = []; - /** @type {HTMLIFrameElement} */ - - iframeContainerElement.onload = null; - }; - - document.body.appendChild(iframeContainerElement); -} -/** - * @param {(element: HTMLDivElement) => void} callback - * @param {string | null} trustedTypesPolicyName - */ - - -function ensureOverlayExists(callback, trustedTypesPolicyName) { - if (containerElement) { - // Everything is ready, call the callback right away. - callback(containerElement); - return; - } - - onLoadQueue.push(callback); - - if (iframeContainerElement) { - return; - } - - createContainer(trustedTypesPolicyName); -} // Successful compilation. - - -function hide() { - if (!iframeContainerElement) { - return; - } // Clean up and reset internal state. - - - document.body.removeChild(iframeContainerElement); - iframeContainerElement = null; - containerElement = null; -} -/** - * @param {string} type - * @param {string | { file?: string, moduleName?: string, loc?: string, message?: string }} item - * @returns {{ header: string, body: string }} - */ - - -function formatProblem(type, item) { - var header = type === "warning" ? "WARNING" : "ERROR"; - var body = ""; - - if (typeof item === "string") { - body += item; - } else { - var file = item.file || ""; // eslint-disable-next-line no-nested-ternary - - var moduleName = item.moduleName ? item.moduleName.indexOf("!") !== -1 ? "".concat(item.moduleName.replace(/^(\s|\S)*!/, ""), " (").concat(item.moduleName, ")") : "".concat(item.moduleName) : ""; - var loc = item.loc; - header += "".concat(moduleName || file ? " in ".concat(moduleName ? "".concat(moduleName).concat(file ? " (".concat(file, ")") : "") : file).concat(loc ? " ".concat(loc) : "") : ""); - body += item.message || ""; - } - - return { - header: header, - body: body - }; -} // Compilation with errors (e.g. syntax error or missing modules). - -/** - * @param {string} type - * @param {Array} messages - * @param {string | null} trustedTypesPolicyName - */ - - -function show(type, messages, trustedTypesPolicyName) { - ensureOverlayExists(function () { - messages.forEach(function (message) { - var entryElement = document.createElement("div"); - var typeElement = document.createElement("span"); - - var _formatProblem = formatProblem(type, message), - header = _formatProblem.header, - body = _formatProblem.body; - - typeElement.innerText = header; - typeElement.style.color = "#".concat(colors.red); // Make it look similar to our terminal. - - var text = ansi_html_community__WEBPACK_IMPORTED_MODULE_0___default()((0,html_entities__WEBPACK_IMPORTED_MODULE_1__.encode)(body)); - var messageTextNode = document.createElement("div"); - messageTextNode.innerHTML = overlayTrustedTypesPolicy ? overlayTrustedTypesPolicy.createHTML(text) : text; - entryElement.appendChild(typeElement); - entryElement.appendChild(document.createElement("br")); - entryElement.appendChild(document.createElement("br")); - entryElement.appendChild(messageTextNode); - entryElement.appendChild(document.createElement("br")); - entryElement.appendChild(document.createElement("br")); - /** @type {HTMLDivElement} */ - - containerElement.appendChild(entryElement); - }); - }, trustedTypesPolicyName); -} - - - -/***/ }), - -/***/ "./node_modules/webpack-dev-server/client/socket.js": -/*!**********************************************************!*\ - !*** ./node_modules/webpack-dev-server/client/socket.js ***! - \**********************************************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "client": function() { return /* binding */ client; } -/* harmony export */ }); -/* harmony import */ var _clients_WebSocketClient_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./clients/WebSocketClient.js */ "./node_modules/webpack-dev-server/client/clients/WebSocketClient.js"); -/* harmony import */ var _utils_log_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils/log.js */ "./node_modules/webpack-dev-server/client/utils/log.js"); -/* provided dependency */ var __webpack_dev_server_client__ = __webpack_require__(/*! ./node_modules/webpack-dev-server/client/clients/WebSocketClient.js */ "./node_modules/webpack-dev-server/client/clients/WebSocketClient.js"); -/* global __webpack_dev_server_client__ */ - - // this WebsocketClient is here as a default fallback, in case the client is not injected - -/* eslint-disable camelcase */ - -var Client = // eslint-disable-next-line no-nested-ternary -typeof __webpack_dev_server_client__ !== "undefined" ? typeof __webpack_dev_server_client__.default !== "undefined" ? __webpack_dev_server_client__.default : __webpack_dev_server_client__ : _clients_WebSocketClient_js__WEBPACK_IMPORTED_MODULE_0__["default"]; -/* eslint-enable camelcase */ - -var retries = 0; -var maxRetries = 10; // Initialized client is exported so external consumers can utilize the same instance -// It is mutable to enforce singleton -// eslint-disable-next-line import/no-mutable-exports - -var client = null; -/** - * @param {string} url - * @param {{ [handler: string]: (data?: any, params?: any) => any }} handlers - * @param {number} [reconnect] - */ - -var socket = function initSocket(url, handlers, reconnect) { - client = new Client(url); - client.onOpen(function () { - retries = 0; - - if (typeof reconnect !== "undefined") { - maxRetries = reconnect; - } - }); - client.onClose(function () { - if (retries === 0) { - handlers.close(); - } // Try to reconnect. - - - client = null; // After 10 retries stop trying, to prevent logspam. - - if (retries < maxRetries) { - // Exponentially increase timeout to reconnect. - // Respectfully copied from the package `got`. - // eslint-disable-next-line no-restricted-properties - var retryInMs = 1000 * Math.pow(2, retries) + Math.random() * 100; - retries += 1; - _utils_log_js__WEBPACK_IMPORTED_MODULE_1__.log.info("Trying to reconnect..."); - setTimeout(function () { - socket(url, handlers, reconnect); - }, retryInMs); - } - }); - client.onMessage( - /** - * @param {any} data - */ - function (data) { - var message = JSON.parse(data); - - if (handlers[message.type]) { - handlers[message.type](message.data, message.params); - } - }); -}; - -/* harmony default export */ __webpack_exports__["default"] = (socket); - -/***/ }), - -/***/ "./node_modules/webpack-dev-server/client/utils/createSocketURL.js": -/*!*************************************************************************!*\ - !*** ./node_modules/webpack-dev-server/client/utils/createSocketURL.js ***! - \*************************************************************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/** - * @param {{ protocol?: string, auth?: string, hostname?: string, port?: string, pathname?: string, search?: string, hash?: string, slashes?: boolean }} objURL - * @returns {string} - */ -function format(objURL) { - var protocol = objURL.protocol || ""; - - if (protocol && protocol.substr(-1) !== ":") { - protocol += ":"; - } - - var auth = objURL.auth || ""; - - if (auth) { - auth = encodeURIComponent(auth); - auth = auth.replace(/%3A/i, ":"); - auth += "@"; - } - - var host = ""; - - if (objURL.hostname) { - host = auth + (objURL.hostname.indexOf(":") === -1 ? objURL.hostname : "[".concat(objURL.hostname, "]")); - - if (objURL.port) { - host += ":".concat(objURL.port); - } - } - - var pathname = objURL.pathname || ""; - - if (objURL.slashes) { - host = "//".concat(host || ""); - - if (pathname && pathname.charAt(0) !== "/") { - pathname = "/".concat(pathname); - } - } else if (!host) { - host = ""; - } - - var search = objURL.search || ""; - - if (search && search.charAt(0) !== "?") { - search = "?".concat(search); - } - - var hash = objURL.hash || ""; - - if (hash && hash.charAt(0) !== "#") { - hash = "#".concat(hash); - } - - pathname = pathname.replace(/[?#]/g, - /** - * @param {string} match - * @returns {string} - */ - function (match) { - return encodeURIComponent(match); - }); - search = search.replace("#", "%23"); - return "".concat(protocol).concat(host).concat(pathname).concat(search).concat(hash); -} -/** - * @param {URL & { fromCurrentScript?: boolean }} parsedURL - * @returns {string} - */ - - -function createSocketURL(parsedURL) { - var hostname = parsedURL.hostname; // Node.js module parses it as `::` - // `new URL(urlString, [baseURLString])` parses it as '[::]' - - var isInAddrAny = hostname === "0.0.0.0" || hostname === "::" || hostname === "[::]"; // why do we need this check? - // hostname n/a for file protocol (example, when using electron, ionic) - // see: https://github.com/webpack/webpack-dev-server/pull/384 - - if (isInAddrAny && self.location.hostname && self.location.protocol.indexOf("http") === 0) { - hostname = self.location.hostname; - } - - var socketURLProtocol = parsedURL.protocol || self.location.protocol; // When https is used in the app, secure web sockets are always necessary because the browser doesn't accept non-secure web sockets. - - if (socketURLProtocol === "auto:" || hostname && isInAddrAny && self.location.protocol === "https:") { - socketURLProtocol = self.location.protocol; - } - - socketURLProtocol = socketURLProtocol.replace(/^(?:http|.+-extension|file)/i, "ws"); - var socketURLAuth = ""; // `new URL(urlString, [baseURLstring])` doesn't have `auth` property - // Parse authentication credentials in case we need them - - if (parsedURL.username) { - socketURLAuth = parsedURL.username; // Since HTTP basic authentication does not allow empty username, - // we only include password if the username is not empty. - - if (parsedURL.password) { - // Result: : - socketURLAuth = socketURLAuth.concat(":", parsedURL.password); - } - } // In case the host is a raw IPv6 address, it can be enclosed in - // the brackets as the brackets are needed in the final URL string. - // Need to remove those as url.format blindly adds its own set of brackets - // if the host string contains colons. That would lead to non-working - // double brackets (e.g. [[::]]) host - // - // All of these web socket url params are optionally passed in through resourceQuery, - // so we need to fall back to the default if they are not provided - - - var socketURLHostname = (hostname || self.location.hostname || "localhost").replace(/^\[(.*)\]$/, "$1"); - var socketURLPort = parsedURL.port; - - if (!socketURLPort || socketURLPort === "0") { - socketURLPort = self.location.port; - } // If path is provided it'll be passed in via the resourceQuery as a - // query param so it has to be parsed out of the querystring in order for the - // client to open the socket to the correct location. - - - var socketURLPathname = "/ws"; - - if (parsedURL.pathname && !parsedURL.fromCurrentScript) { - socketURLPathname = parsedURL.pathname; - } - - return format({ - protocol: socketURLProtocol, - auth: socketURLAuth, - hostname: socketURLHostname, - port: socketURLPort, - pathname: socketURLPathname, - slashes: true - }); -} - -/* harmony default export */ __webpack_exports__["default"] = (createSocketURL); - -/***/ }), - -/***/ "./node_modules/webpack-dev-server/client/utils/getCurrentScriptSource.js": -/*!********************************************************************************!*\ - !*** ./node_modules/webpack-dev-server/client/utils/getCurrentScriptSource.js ***! - \********************************************************************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/** - * @returns {string} - */ -function getCurrentScriptSource() { - // `document.currentScript` is the most accurate way to find the current script, - // but is not supported in all browsers. - if (document.currentScript) { - return document.currentScript.getAttribute("src"); - } // Fallback to getting all scripts running in the document. - - - var scriptElements = document.scripts || []; - var scriptElementsWithSrc = Array.prototype.filter.call(scriptElements, function (element) { - return element.getAttribute("src"); - }); - - if (scriptElementsWithSrc.length > 0) { - var currentScript = scriptElementsWithSrc[scriptElementsWithSrc.length - 1]; - return currentScript.getAttribute("src"); - } // Fail as there was no script to use. - - - throw new Error("[webpack-dev-server] Failed to get current script source."); -} - -/* harmony default export */ __webpack_exports__["default"] = (getCurrentScriptSource); - -/***/ }), - -/***/ "./node_modules/webpack-dev-server/client/utils/log.js": -/*!*************************************************************!*\ - !*** ./node_modules/webpack-dev-server/client/utils/log.js ***! - \*************************************************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "log": function() { return /* binding */ log; }, -/* harmony export */ "setLogLevel": function() { return /* binding */ setLogLevel; } -/* harmony export */ }); -/* harmony import */ var _modules_logger_index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/logger/index.js */ "./node_modules/webpack-dev-server/client/modules/logger/index.js"); -/* harmony import */ var _modules_logger_index_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_modules_logger_index_js__WEBPACK_IMPORTED_MODULE_0__); - -var name = "webpack-dev-server"; // default level is set on the client side, so it does not need -// to be set by the CLI or API - -var defaultLevel = "info"; // options new options, merge with old options - -/** - * @param {false | true | "none" | "error" | "warn" | "info" | "log" | "verbose"} level - * @returns {void} - */ - -function setLogLevel(level) { - _modules_logger_index_js__WEBPACK_IMPORTED_MODULE_0___default().configureDefaultLogger({ - level: level - }); -} - -setLogLevel(defaultLevel); -var log = _modules_logger_index_js__WEBPACK_IMPORTED_MODULE_0___default().getLogger(name); - - -/***/ }), - -/***/ "./node_modules/webpack-dev-server/client/utils/parseURL.js": -/*!******************************************************************!*\ - !*** ./node_modules/webpack-dev-server/client/utils/parseURL.js ***! - \******************************************************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _getCurrentScriptSource_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getCurrentScriptSource.js */ "./node_modules/webpack-dev-server/client/utils/getCurrentScriptSource.js"); - -/** - * @param {string} resourceQuery - * @returns {{ [key: string]: string | boolean }} - */ - -function parseURL(resourceQuery) { - /** @type {{ [key: string]: string }} */ - var options = {}; - - if (typeof resourceQuery === "string" && resourceQuery !== "") { - var searchParams = resourceQuery.slice(1).split("&"); - - for (var i = 0; i < searchParams.length; i++) { - var pair = searchParams[i].split("="); - options[pair[0]] = decodeURIComponent(pair[1]); - } - } else { - // Else, get the url from the
Rotate Mode
R
RotateScale Mode
r
Scale Mode
s
Distort Mode
d
Drag Mode
D
Lock (Mode) / Unlock Image
l u
Stack up / down
q a
Add / Remove Image Border
b
Toggle Opacity
o
Deselect All
esc
Delete Image(s)
delete backspace
Export Image(s)
e
'),t.appendChild(i),t},this._keymapper.addTo(this._map)},_toggleKeymapper:function(t){t.preventDefault(),this._container.className="ldi-keymapper leaflet-control"===this._container.className?"ldi-keymapper-hide leaflet-control":"ldi-keymapper leaflet-control",this._scrollWrapper.style.display="none"===this._scrollWrapper.style.display?"block":"none",this._toggler.innerHTML="close"===this._toggler.innerHTML?L.IconUtil.create("keyboard_open"):"close",L.IconUtil.toggleTitle(this._toggler,"Show keymap","Hide keymap"),L.DomUtil.toggleClass(this._toggler,"close-icon")},_injectIconSet:function(){if(!document.querySelector("#keymapper-iconset")){var t=L.DomUtil.create("div","");t.id="keymapper-iconset",t.setAttribute("hidden","hidden"),this._iconset=(new L.KeymapperIconSet).render(),t.innerHTML=this._iconset,document.querySelector(".leaflet-control-container").appendChild(t)}}}),L.DistortableImage.Keymapper.addInitHook((function(){L.DistortableImage.Keymapper.prototype._n=L.DistortableImage.Keymapper.prototype._n?L.DistortableImage.Keymapper.prototype._n+1:1,1!==L.DistortableImage.Keymapper.prototype._n||L.Browser.mobile||(t.enable(),t._injectIconSet())})),L.distortableImage.keymapper=function(t,e){return new L.DistortableImage.Keymapper(t,e)}},428:function(){L.DistortableImage=L.DistortableImage||{},L.DistortableCollection.Edit=L.Handler.extend({options:{keymap:L.distortableImage.group_action_map},initialize:function(t,e){this._group=t,this._exportOpts=t.options.exportOpts,L.setOptions(this,e),L.distortableImage.group_action_map.Escape="_decollectAll"},addHooks:function(){var t=this._group._map;this.editActions=this.options.actions,this.runExporter=L.bind(L.Utils.getNestedVal(this,"_exportOpts","exporter")||this.startExport,this),L.DomEvent.on(document,"keydown",this._onKeyDown,this),t.doubleClickZoom.enabled()||t.doubleClickLabels.enabled()||L.DomEvent.on(t,"click",this._decollectAll,this),L.DomEvent.on(t,{singleclickon:this._singleClickListeners,singleclickoff:this._resetClickListeners,singleclick:this._singleClick,boxcollectend:this._addCollections},this),this._group.editable=!0,this._group.eachLayer((function(t){return t.editing.enable()}))},removeHooks:function(){var t=this._group._map;L.DomEvent.off(document,"keydown",this._onKeyDown,this),t.doubleClickZoom.enabled()||t.doubleClickLabels.enabled()||L.DomEvent.off(t,"click",this._decollectAll,this),L.DomEvent.off(t,{singleclickon:this._singleClickListeners,singleclickoff:this._resetClickListeners,singleclick:this._singleClick,boxcollectend:this._addCollections},this),this._decollectAll(),this._group.editable=!1,this._group.eachLayer((function(t){return t.editing.disable()}))},enable:function(){return this._enabled=!0,this.addHooks(),this},disable:function(){return this._enabled=!1,this.removeHooks(),this},_onKeyDown:function(t){var e=this.options.keymap[t.key];this[e]&&this._group.anyCollected()&&this[e].call(this)},_singleClick:function(t){"singleclick"===t.type&&this._decollectAll(t)},_singleClickListeners:function(){var t=this._group._map;L.DomEvent.off(t,"click",this._decollectAll,this),L.DomEvent.on(t,"singleclick",this._decollectAll,this)},_resetClickListeners:function(){var t=this._group._map;L.DomEvent.on(t,"click",this._decollectAll,this),L.DomEvent.off(t,"singleclick",this._decollectAll,this)},_decollectAll:function(t){var e;t&&(e=t.originalEvent),e&&(e.shiftKey||e.target instanceof HTMLImageElement)||(this._group.eachLayer((function(t){L.DomUtil.removeClass(t.getElement(),"collected"),t.deselect()})),this._removeToolbar(),t&&L.DomEvent.stopPropagation(t))},_unlockGroup:function(){var t=this;this.hasTool(L.UnlockAction)&&this._group.eachLayer((function(e){t._group.isCollected(e)&&(e.editing._unlock(),e.deselect())}))},_lockGroup:function(){var t=this;this.hasTool(L.LockAction)&&this._group.eachLayer((function(e){t._group.isCollected(e)&&(e.editing._lock(),L.DomUtil.addClass(e.getElement(),"collected"))}))},_addCollections:function(t){var e=this,i=t.boxCollectBounds,o=this._group._map;this._group.eachLayer((function(t){var n=t.editing;t.isSelected()&&t.deselect();var a=o.getZoom(),s=o.getCenter(),r=L.latLngBounds(t.getCorner(2),t.getCorner(1));r=o._latLngBoundsToNewLayerBounds(r,a,s),i.intersects(r)&&n.enabled()&&(e.toolbar||e._addToolbar(),L.DomUtil.addClass(t.getElement(),"collected"))}))},_removeGroup:function(t){var e=this;if(this.hasTool(L.DeleteAction)){var i=this._group._toRemove(),o=i.length;0!==o&&(L.DomUtil.confirmDeletes(o)&&(i.forEach((function(t){e._group.removeLayer(t)})),this._group.anyCollected()||this._removeToolbar()),t&&L.DomEvent.stopPropagation(t))}},cancelExport:function(){this.customCollection||(this._exportOpts.collection=void 0),clearInterval(this.updateInterval)},_addToolbar:function(){var t=this._group,e=t._map;t.options.suppressToolbar||this.toolbar||(this.toolbar=L.distortableImage.controlBar({actions:this.editActions,position:"topleft"}).addTo(e,t))},_removeToolbar:function(){var t=this._group._map;if(!this.toolbar)return!1;t.removeLayer(this.toolbar),this.toolbar=!1},hasTool:function(t){return this.editActions.some((function(e){return e===t}))},addTool:function(t){return"leaflet-toolbar-icon"!==t.baseClass||this.hasTool(t)||(this._removeToolbar(),this.editActions.push(t),this._addToolbar()),this},removeTool:function(t){var e=this;return this.editActions.some((function(i,o){return e.editActions[o]===t&&(e._removeToolbar(),e.editActions.splice(o,1),e._addToolbar(),!0)})),this},startExport:function(){var t=this;if(this.hasTool(L.ExportAction))return new Promise((function(e){var i,o=t._exportOpts;o.resolve=e,t.updateInterval=null,t.customCollection=!!o.collection,t.customCollection||(o.collection=t._group.generateExportJson().images),o.frequency=o.frequency||3e3,o.scale=o.scale||100,o.updater=o.updater||function(n){(n=JSON.parse(n)).status_url&&(i!==n.status_url&&n.status_url.match(".json")&&(i=n.status_url),"complete"===n.status&&(clearInterval(t.updateInterval),t.customCollection||(t._exportOpts.collection=void 0),e(),null!==n.jpg&&alert("Export succeeded. "+o.exportUrl+n.jpg)),console.log(n))},o.handleStatusRes=o.handleStatusRes||function(e){i=o.statusUrl+e,t.updateInterval=setInterval((function(){var t=new Request("".concat(i,"?").concat(Date.now()),{method:"GET"});fetch(t).then((function(t){if(t.ok)return t.text()})).then(o.updater)}),o.frequency)},o.fetchStatusUrl=o.fetchStatusUrl||function(t){var e=new FormData;e.append("collection",JSON.stringify(t.collection)),e.append("scale",t.scale),e.append("upload",!0);var i={method:"POST",body:e},o=new Request(t.exportStartUrl,i);fetch(o).then((function(t){if(t.ok)return t.text()})).then(t.handleStatusRes)},o.fetchStatusUrl(o)}))}}),L.distortableCollection.edit=function(t,e){return new L.DistortableCollection.Edit(t,e)}},397:function(){L.DistortableImage=L.DistortableImage||{},L.DistortableImage.Edit=L.Handler.extend({options:{opacity:.7,outline:"1px solid red",keymap:L.distortableImage.action_map},initialize:function(t,e){this._overlay=t,this._toggledImage=!1,this._mode=t.options.mode,this._transparent=!1,this._outlined=!1,L.setOptions(this,e),L.distortableImage.action_map.Escape="_deselect"},addHooks:function(){var t=this._overlay;this.editActions=this.options.actions,t.bringToFront(),this._initModes(),this._initHandles(),this._appendHandlesandDragable(),t.isSelected()&&!t.options.suppressToolbar&&this._addToolbar(),this.parentGroup=!!t.eP&&t.eP,L.DomEvent.on(t.getElement(),{dblclick:this.nextMode},this),L.DomEvent.on(window,"keydown",this._onKeyDown,this)},removeHooks:function(){var t=this._overlay,e=this.parentGroup;for(var i in this._disableDragging(),this.toolbar&&this._removeToolbar(),this._handles)L.DomUtil.remove(i);L.DomUtil.hasClass(t.getElement(),"collected")&&L.DomUtil.removeClass(t.getElement(),"collected"),e&&!e.anyCollected()&&e.editing.toolbar&&e.editing._removeToolbar(),L.DomEvent.off(t.getElement(),{dblclick:this.nextMode},this),L.DomEvent.off(window,"keydown",this._onKeyDown,this)},disable:function(){return this._enabled?(this._overlay.deselect(),this._enabled=!1,this.removeHooks(),this):this},_initModes:function(){for(var t in this._modes={},L.DistortableImage.Edit.MODES){var e=L.DistortableImage.Edit.MODES[t];-1!==this.editActions.indexOf(e)&&(this._modes[t]=e)}this._modes[this._mode]||(this._mode=Object.keys(this._modes)[0])},_initHandles:function(){var t,e=this._overlay;for(this._dragHandles=L.layerGroup(),t=0;t<4;t++)this._dragHandles.addLayer(L.dragHandle(e,t));for(this._scaleHandles=L.layerGroup(),t=0;t<4;t++)this._scaleHandles.addLayer(L.scaleHandle(e,t));for(this._distortHandles=L.layerGroup(),t=0;t<4;t++)this._distortHandles.addLayer(L.distortHandle(e,t));for(this._rotateHandles=L.layerGroup(),t=0;t<4;t++)this._rotateHandles.addLayer(L.rotateHandle(e,t));for(this._freeRotateHandles=L.layerGroup(),t=0;t<4;t++)this._freeRotateHandles.addLayer(L.freeRotateHandle(e,t));for(this._lockHandles=L.layerGroup(),t=0;t<4;t++)this._lockHandles.addLayer(L.lockHandle(e,t,{draggable:!1}));this._handles={drag:this._dragHandles,scale:this._scaleHandles,distort:this._distortHandles,rotate:this._rotateHandles,freeRotate:this._freeRotateHandles,lock:this._lockHandles}},_appendHandlesandDragable:function(){var t=this._overlay;this._mode?(this._updateHandle(),!t.isSelected()&&this.currentHandle&&this.currentHandle.eachLayer((function(t){t.setOpacity(0),t.dragging&&t.dragging.disable()})),this.isMode("lock")||this._enableDragging()):this._enableDragging()},_onKeyDown:function(t){var e=this.options.keymap[t.key],i=this._overlay,o=this.parentGroup;o&&o.anyCollected()||void 0===this[e]||i.options.suppressToolbar||i.isSelected()&&this.toolbar&&this[e].call(this)},replaceTool:function(t,e){var i=this;return"leaflet-toolbar-icon"!==e.baseClass||this.hasTool(e)||this.editActions.some((function(o,n){if(o===t){for(var a in i._removeToolbar(),i.editActions[n]=e,i._addToolbar(),L.DistortableImage.Edit.MODES)L.DistortableImage.Edit.MODES[a]===t?(delete i._modes[a],i._nextOrNone(a)):L.DistortableImage.Edit.MODES[a]===e&&(i._modes[a]=e);return!0}})),this},addTool:function(t){if("leaflet-toolbar-icon"===t.baseClass&&!this.hasTool(t)){for(var e in this._removeToolbar(),this.editActions.push(t),this._addToolbar(),L.DistortableImage.Edit.MODES)L.DistortableImage.Edit.MODES[e]===t&&(this._modes[e]=t);this._overlay.isSelected()||this._removeToolbar()}return this},hasTool:function(t){return this.editActions.some((function(e){return e===t}))},removeTool:function(t){var e=this;return this.editActions.some((function(i,o){if(i===t){for(var n in e._removeToolbar(),e.editActions.splice(o,1),e._addToolbar(),L.DistortableImage.Edit.MODES)L.DistortableImage.Edit.MODES[n]===t&&(delete e._modes[n],e._nextOrNone(n));return!0}})),this._overlay.isSelected()||this._removeToolbar(),this},_nextOrNone:function(t){this.isMode(t)&&(Object.keys(this.getModes()).length>=1?this.nextMode():("lock"===t&&this._enableDragging(),this._mode="",this._updateHandle()))},_removeToolbar:function(){var t=this._overlay._map;this.toolbar&&(t.removeLayer(this.toolbar),this.toolbar=!1)},_enableDragging:function(){var t=this,e=this._overlay,i=e._map;this.dragging=new L.Draggable(e.getElement()),this.dragging.enable(),this.dragging.on("dragstart",(function(){e.fire("dragstart"),t._removeToolbar()})),this.dragging._updatePosition=function(){var t,o,n=e.getCorner(0),a=this._newPos.subtract(i.latLngToLayerPoint(n)),s={};for(this.fire("predrag"),o=0;o<4;o++)t=i.latLngToLayerPoint(e.getCorner(o)),s[o]=i.layerPointToLatLng(t.add(a));e.setCorners(s),e.fire("drag"),this.fire("drag")},this.dragging.on("dragend",(function(){e.fire("dragend")}))},_disableDragging:function(){this.dragging&&(this.dragging.disable(),delete this.dragging)},_dragMode:function(){this.setMode("drag")},_scaleMode:function(){this.setMode("scale")},_distortMode:function(){this.setMode("distort")},_rotateMode:function(){this.setMode("rotate")},_freeRotateMode:function(){this.setMode("freeRotate")},_toggleLockMode:function(){this.isMode("lock")?this._unlock():this._lock()},_toggleOpacity:function(){var t=this._overlay.getElement();if(this.hasTool(L.OpacityAction)){this._transparent=!this._transparent;var e=this._transparent?this.options.opacity:1;L.DomUtil.setOpacity(t,e),t.setAttribute("opacity",e),this._refresh()}},_toggleBorder:function(){var t=this._overlay.getElement();if(this.hasTool(L.BorderAction)){this._outlined=!this._outlined;var e=this._outlined?this.options.outline:"none";t.style.outline=e,this._refresh()}},_toggleOrder:function(){this._toggledImage?this._stackUp():this._stackDown()},_removeOverlay:function(){var t=this._overlay,e=this.parentGroup;!this.isMode("lock")&&this.hasTool(L.DeleteAction)&&L.DomUtil.confirmDelete()&&(this._removeToolbar(),e?e.removeLayer(t):t._map.removeLayer(t))},_getExport:function(){var t=this._overlay,e=t._map,i=t.getElement();if(this.hasTool(L.ExportAction)){var o=new Image;o.id=o.id||"tempId12345",document.body.appendChild(o),o.onload=function(){var i=o.height,n=o.width,a=e.latLngToLayerPoint(t.getCorner(0)),s=e.latLngToLayerPoint(t.getCorner(1)),r=e.latLngToLayerPoint(t.getCorner(2)),l=e.latLngToLayerPoint(t.getCorner(3));o.onload=function(){L.DomUtil.remove(o)},window&&window.hasOwnProperty("warpWebGl")&&warpWebGl(o.id,[0,0,n,0,n,i,0,i],[a.x,a.y,s.x,s.y,l.x,l.y,r.x,r.y],!0)},o.src=t.options.fullResolutionSrc||i.src}},_stackUp:function(){this._toggledImage&&this.hasTool(L.StackAction)&&(this._toggledImage=!1,this._overlay.bringToFront(),this._refresh())},_stackDown:function(){!this._toggledImage&&this.hasTool(L.StackAction)&&(this._toggledImage=!0,this._overlay.bringToBack(),this._refresh())},_unlock:function(){var t=this._overlay,e=t._map,i=this.parentGroup;this.isMode("lock")&&((!i||i.isCollected(t))&&i||this.hasTool(L.LockAction))&&(this.currentHandle&&e.removeLayer(this.currentHandle),"lock"!==t.options.mode&&this.hasMode(t.options.mode)?this._mode=t.options.mode:(this._mode="",this.currentHandle=""),this._updateHandle(),this._enableDragging(),this._refresh())},_lock:function(){var t=this._overlay,e=t._map,i=this.parentGroup;this.isMode("lock")||((!i||i.isCollected(t))&&i||this.hasTool(L.LockAction))&&(this.currentHandle&&e.removeLayer(this.currentHandle),this._mode="lock",this._updateHandle(),this._disableDragging(),this._refresh())},_deselect:function(){this._overlay.deselect()},_showMarkers:function(t){var e=this.parentGroup;this.currentHandle&&(!this.isMode("lock")&&e&&e.anyCollected()||this.currentHandle.eachLayer((function(t){t.setOpacity(1),t.dragging&&t.dragging.enable(),L.DomUtil.addClass(t.getElement(),"leaflet-interactive")})))},_hideMarkers:function(){var t=this._overlay,e=this.parentGroup;this._handles||this._initHandles(),this.currentHandle&&(this.isMode("lock")&&e&&e.isCollected(t)||this.currentHandle.eachLayer((function(t){t.setOpacity(0),t.dragging&&t.dragging.disable(),L.DomUtil.removeClass(t.getElement(),"leaflet-interactive")})))},_updateHandle:function(){var t=this._overlay._map,e=this.getMode();this.currentHandle&&t.removeLayer(this.currentHandle),this.currentHandle=""===e?"":this._handles[e],""!==this.currentHandle&&t.addLayer(this.currentHandle)},_addToolbar:function(){var t=this._overlay,e=this.parentGroup,i=t._map,o=t.getCorners(),n=-1/0;if(e&&e.anyCollected())e.editing._addToolbar();else if(!t.options.suppressToolbar&&!this.toolbar){for(var a=0;an&&(n=o[a].lat);var s=t.getCenter();s.lat=n,this.toolbar=L.distortableImage.popupBar(s,{actions:this.editActions}).addTo(i,t),t.fire("toolbar:created")}},_refresh:function(){this.toolbar&&this._removeToolbar(),this._addToolbar()},_updateToolbarPos:function(){var t=this._overlay,e=t.getCorners(),i=this.toolbar,o=-1/0;if(i&&i instanceof L.DistortableImage.PopupBar){for(var n=0;no&&(o=e[n].lat);var a=t.getCenter();a.lat=o,t.options.suppressToolbar||this.toolbar.setLatLng(a)}},hasMode:function(t){return!!this._modes[t]},getMode:function(){if(this.enabled())return this._mode},getModes:function(){return this._modes},isMode:function(t){return!!this.enabled()&&this._mode===t},setMode:function(t){var e=this._overlay,i=this.parentGroup;if(this.getMode()!==t&&this.hasMode(t)&&this.enabled())return this.toolbar&&this.toolbar.clickTool(t),this.isMode("lock")&&!this.dragging&&this._enableDragging(),this._mode=t,this.isMode("lock")&&this._disableDragging(),this._updateHandle(),this._refresh(),i&&i.isCollected(e)&&e.deselect(),this},nextMode:function(t){var e=this.getMode(),i=this.parentGroup,o=Object.keys(this.getModes()),n=o.indexOf(e),a=o[(n+1)%o.length];if(t){if(i&&i.anyCollected())return;L.DomEvent.stop(t)}return this.setMode(a)}}),L.distortableImage.edit=function(t,e){return new L.DistortableImage.Edit(t,e)}},426:function(){L.BorderAction=L.EditAction.extend({initialize:function(t,e,i){var o,n,a=e.editing,s=a._mode;a._outlined?(o="border_outer",n=e.options.translation.removeBorder):(o="border_clear",n=e.options.translation.addBorder),(i=i||{}).toolbarIcon={svg:!0,html:o,tooltip:n,className:"lock"===s?"disabled":""},L.DistortableImage.action_map.b="lock"===s?"":"_toggleBorder",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){var t=this._overlay.editing;L.IconUtil.toggleXlink(this._link,"border_clear","border_outer"),L.IconUtil.toggleTitle(this._link,"Remove Border","Add Border"),t._toggleBorder()}})},114:function(){L.DeleteAction=L.EditAction.extend({initialize:function(t,e,i){var o,n=e.editing;n instanceof L.DistortableImage.Edit?(o=e.options.translation.deleteImage,L.DistortableImage.action_map.Backspace="lock"===n._mode?"":"_removeOverlay"):(o=e.options.translation.deleteImages,L.DistortableImage.group_action_map.Backspace="lock"===n._mode?"":"_removeGroup"),(i=i||{}).toolbarIcon={svg:!0,html:"delete_forever",tooltip:o,className:"lock"===n._mode?"disabled":""},L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){var t=this._overlay.editing;t instanceof L.DistortableImage.Edit?t._removeOverlay():t._removeGroup()}})},231:function(){L.DistortAction=L.EditAction.extend({initialize:function(t,e,i){(i=i||{}).toolbarIcon={svg:!0,html:"distort",tooltip:e.options.translation.distortImage,className:"distort"},L.DistortableImage.action_map.d="_distortMode",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){this._overlay.editing._distortMode()}})},541:function(){L.DragAction=L.EditAction.extend({initialize:function(t,e,i){(i=i||{}).toolbarIcon={svg:!0,html:"drag",tooltip:e.options.translation.dragImage,className:"drag"},L.DistortableImage.action_map.D="_dragMode",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){this._overlay.editing._dragMode()}})},280:function(){L.DistortableImage=L.DistortableImage||{},L.distortableImage=L.DistortableImage,L.DistortableImage.action_map={},L.EditAction=L.Toolbar2.Action.extend({options:{toolbarIcon:{svg:!1,html:"",className:"",tooltip:""}},initialize:function(t,e,i){this._overlay=e,this._map=t,L.setOptions(this,i),L.Toolbar2.Action.prototype.initialize.call(this,i),this._injectIconSet()},_createIcon:function(t,e,i){var o=this,n=this.options.toolbarIcon,a=n.className,s=this._overlay.editing;this.toolbar=t,this._icon=L.DomUtil.create("li","",e),this._link=L.DomUtil.create("a","",this._icon),n.svg?this._link.innerHTML=L.IconUtil.create(n.html):this._link.innerHTML=n.html,this._link.setAttribute("href","#"),this._link.setAttribute("title",n.tooltip),this._link.setAttribute("role","button"),L.DomUtil.addClass(this._link,this.constructor.baseClass),a&&(L.DomUtil.addClass(this._link,a),"disabled"===a&&L.DomUtil.addClass(this._icon,a),a===s._mode?L.DomUtil.addClass(this._link,"selected-mode"):L.DomUtil.removeClass(this._link,"selected-mode")),L.DomEvent.on(this._link,"click",this.enable,this),L.DomEvent.on(this._overlay,"update",(function(){var t=o._link.innerHTML.match(/xlink:href="#restore"/);t&&1===t.length&&o._enableAction()})),this._addSubToolbar(t,this._icon,i)},_injectIconSet:function(){if(!document.querySelector("#iconset")){var t=document.createElement("div");t.id="iconset",t.setAttribute("hidden","hidden"),t.innerHTML=(new L.ToolbarIconSet).render(),document.querySelector(".leaflet-marker-pane").appendChild(t)}},_enableAction:function(){L.DomUtil.removeClass(this._link.parentElement,"disabled"),L.DomUtil.removeClass(this._link,"disabled")},_disableAction:function(){L.DomUtil.addClass(this._link.parentElement,"disabled"),L.DomUtil.addClass(this._link,"disabled")}}),L.editAction=function(t,e,i){return new L.EditAction(t,e,i)}},149:function(){L.ExportAction=L.EditAction.extend({initialize:function(t,e,i){var o,n=e.editing;this.isExporting=!1,this.mouseLeaveSkip=!0,this.isHooksExecuted=!1,n instanceof L.DistortableImage.Edit?(L.DistortableImage.action_map.e="_getExport",o=e.options.translation.exportImage):(L.DistortableImage.group_action_map.e="runExporter",o=e.options.translation.exportImages),(i=i||{}).toolbarIcon={svg:!0,html:"get_app",tooltip:o},L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){var t=this._overlay.editing;if(t instanceof L.DistortableImage.Edit)t._getExport();else if(!this.isHooksExecuted){this.isHooksExecuted=!0;var e=this._link.parentElement;this.mouseEnterHandler=this.handleMouseEnter.bind(this),this.mouseLeaveHandler=this.handleMouseLeave.bind(this),L.DomEvent.on(e,"click",(function(){if(this.isExporting){if(this.mouseLeaveSkip)return;this.resetState(),this.detachMouseEventListeners(e),t.cancelExport()}else this.isExporting=!0,this.renderExportIcon(),setTimeout(this.attachMouseEventListeners.bind(this,e),100),t.runExporter().then(function(){this.resetState(),this.detachMouseEventListeners(e)}.bind(this))}),this)}},resetState:function(){this.renderDownloadIcon(),this.isExporting=!1,this.mouseLeaveSkip=!0},attachMouseEventListeners:function(t){t.addEventListener("mouseenter",this.mouseEnterHandler),t.addEventListener("mouseleave",this.mouseLeaveHandler)},detachMouseEventListeners:function(t){t.removeEventListener("mouseenter",this.mouseEnterHandler),t.removeEventListener("mouseleave",this.mouseLeaveHandler)},handleMouseEnter:function(){this.renderCancelIcon()},handleMouseLeave:function(){this.mouseLeaveSkip?this.mouseLeaveSkip=!1:this.renderExportIcon()},renderDownloadIcon:function(){L.IconUtil.toggleXlink(this._link,"get_app","spinner"),L.IconUtil.toggleTitle(this._link,"Export Images","Loading..."),L.DomUtil.removeClass(this._link.firstChild,"loader")},renderExportIcon:function(){L.IconUtil.toggleXlink(this._link,"spinner"),L.IconUtil.toggleTitle(this._link,"Export Images","Loading..."),L.IconUtil.addClassToSvg(this._link,"loader")},renderCancelIcon:function(){L.IconUtil.toggleXlink(this._link,"cancel"),L.IconUtil.toggleTitle(this._link,"Cancel Export","Loading..."),L.DomUtil.removeClass(this._link.firstChild,"loader")}})},74:function(){L.FreeRotateAction=L.EditAction.extend({initialize:function(t,e,i){(i=i||{}).toolbarIcon={svg:!0,html:"crop_rotate",tooltip:e.options.translation.freeRotateImage,className:"freeRotate"},L.DistortableImage.action_map.f="_freeRotateMode",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){this._overlay.editing._freeRotateMode()}})},691:function(){L.GeolocateAction=L.EditAction.extend({initialize:function(t,e,i){var o=e.editing;(i=i||{}).toolbarIcon={svg:!0,html:"explore",tooltip:e.options.translation.geolocateImage,className:"lock"===o._mode?"disabled":""},L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){var t=this._overlay.getElement();EXIF.getData(t,L.EXIF(t))}})},105:function(){L.LockAction=L.EditAction.extend({initialize:function(t,e,i){var o,n,a=e.editing;a instanceof L.DistortableImage.Edit?(L.DistortableImage.action_map.u="_unlock",L.DistortableImage.action_map.l="_lock",n=e.options.translation.lockMode,o=a.isMode("lock")?"lock":"unlock"):(L.DistortableImage.group_action_map.l="_lockGroup",n=e.options.translation.lockImages,o="lock"),(i=i||{}).toolbarIcon={svg:!0,html:o,tooltip:n,className:"lock"},L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){var t=this._overlay.editing;t instanceof L.DistortableImage.Edit?t._toggleLockMode():t._lockGroup()}})},944:function(){L.OpacityAction=L.EditAction.extend({initialize:function(t,e,i){var o,n,a=e.editing,s=a._mode;a._transparent?(o="opacity_empty",n=e.options.translation.makeImageOpaque):(o="opacity",n=e.options.translation.makeImageTransparent),(i=i||{}).toolbarIcon={svg:!0,html:o,tooltip:n,className:"lock"===s?"disabled":""},L.DistortableImage.action_map.o="lock"===s?"":"_toggleOpacity",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){var t=this._overlay.editing,e=this._link;L.IconUtil.toggleXlink(e,"opacity","opacity_empty"),L.IconUtil.toggleTitle(e,"Make Image Transparent","Make Image Opaque"),t._toggleOpacity()}})},954:function(){L.RestoreAction=L.EditAction.extend({initialize:function(t,e,i){var o=L.Utils.getNestedVal(e,"editing","_mode"),n=e.edited;(i=i||{}).toolbarIcon={svg:!0,html:"restore",tooltip:e.options.translation.restoreImage,className:n&&"lock"!==o?"":"disabled"},L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){var t=this._overlay;L.DomEvent.on(t,{edit:this._enableAction,restore:this._disableAction},this),t.restore()}})},178:function(){L.RotateAction=L.EditAction.extend({initialize:function(t,e,i){(i=i||{}).toolbarIcon={svg:!0,html:"rotate",tooltip:e.options.translation.rotateImage,className:"rotate"},L.DistortableImage.action_map.r="_rotateMode",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){this._overlay.editing._rotateMode()}})},547:function(){L.ScaleAction=L.EditAction.extend({initialize:function(t,e,i){(i=i||{}).toolbarIcon={svg:!0,html:"scale",tooltip:e.options.translation.scaleImage,className:"scale"},L.DistortableImage.action_map.s="_scaleMode",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){this._overlay.editing._scaleMode()}})},886:function(){L.StackAction=L.EditAction.extend({initialize:function(t,e,i){var o,n,a=e.editing;a._toggledImage?(o="flip_to_back",n=e.options.translation.stackToFront):(o="flip_to_front",n=e.options.translation.stackToBack),(i=i||{}).toolbarIcon={svg:!0,html:o,tooltip:n,className:"lock"===a._mode?"disabled":""},L.DistortableImage.action_map.q="lock"===a._mode?"":"_stackUp",L.DistortableImage.action_map.a="lock"===a._mode?"":"_stackDown",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){var t=this._overlay.editing;L.IconUtil.toggleXlink(this._link,"flip_to_front","flip_to_back"),L.IconUtil.toggleTitle(this._link,"Stack to Front","Stack to Back"),t._toggleOrder()}})},129:function(){L.UnlockAction=L.EditAction.extend({initialize:function(t,e,i){(i=i||{}).toolbarIcon={svg:!0,html:"unlock",tooltip:e.options.translation.unlockImages},L.DistortableImage.group_action_map.u="_unlockGroup",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){this._overlay.editing._unlockGroup()}})},743:function(){L.EXIF=function(t){if(0!==Object.keys(EXIF.getAllTags(t)).length){console.log(EXIF.getAllTags(t));var e=EXIF.getAllTags(t);void 0!==e.GPSLatitude&&void 0!==e.GPSLongitude&&(e.GPSLatitude[0],e.GPSLatitude[1],e.GPSLatitude[2],e.GPSLongitude[0],e.GPSLongitude[1],e.GPSLongitude[2],e.GPSLatitudeRef,e.GPSLongitudeRef),"T"===e.GPSImgDirectionRef||"M"===e.GPSImgDirectionRef?(Math.PI,e.GPSImgDirection.numerator,e.GPSImgDirection.denominator):console.log("No compass data found"),console.log("Orientation:",e.Orientation),(6===e.Orientation||8===e.Orientation||3===e.Orientation)&&Math.PI,void 0!==e.GPSAltitude&&void 0!==e.GPSAltitudeRef&&void 0!==e.GPSAltitude&&void 0!==e.GPSAltitudeRef&&(e.GPSAltitude.numerator,e.GPSAltitude.denominator,e.GPSAltitudeRef)}else alert("EXIF initialized. Press again to view data in console.")}},92:function(){L.DistortHandle=L.EditHandle.extend({options:{TYPE:"distort",icon:L.icon({iconUrl:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAChSURBVO3BIU4DURgGwNkvL2B6AkQTLBqP4QCoSm7DDXoBLBZHDbfgICAIZjEV3YTn9uVHdMZZtcnCfI13bIzxg0emg6Nm6QVbYz3jylEsXRrvwommb49X67jFkz80fR9Mb1YxTzqiWBSLYlEsikWxKBbFolgUi2JRLIpFsSgWxaJY03fHHOu40dH07bAzWCx9Ge/TiWbpHgdsjPGNB2f/yS+7xRCyiiZPJQAAAABJRU5ErkJggg==",iconSize:[32,32],iconAnchor:[16,16]})},_onHandleDrag:function(){this._handled.setCorner(this._corner,this.getLatLng())},updateHandle:function(){this.setLatLng(this._handled.getCorner(this._corner))}}),L.distortHandle=function(t,e,i){return new L.DistortHandle(t,e,i)}},194:function(){L.DragHandle=L.EditHandle.extend({options:{TYPE:"drag",icon:L.icon({iconUrl:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAsVJREFUeNrMVztLXEEUvnNVFAVBAhY2aRKbTZEHJNpYabuNjSgYg/GxdsmPSJkUAa/ZdVEX8mgWYVutbHxAHkVskjQBuUUgBISVhCQk3wnfwMlk1rusN1wHPubOzJlzvjlz5sxc01Ma/hUEwQnwDIjqc7uvgv9YYO86qgIwCXQbdNTlQ8kcCBHgBch8TcloF6oJGr6phk6EQAkfdz3zvgDr9Mr7Fg1fptEZoM8jsmrokpfsiIFO4IIjuE2v1EDmR4LRdlR5Gh51hj8D34ABtm8YTtqna0TgklIw5CgQguKxIojEjmFROg/MKQO27NkFAB+4wAPouGUJiIvWKHwbAxX2XyWRKWkqhT+pbJntJZJuUzISW0+5hW+obxrVBsfvoH/dqCCJuU97GBh2VteLSiYvArmErT8EVoAK9Bw7enbpVYmvAQlyowYforrH5jXL2rPHI/TKONDB7u9AlavdaTBPvPmazUeQuy8f7UomUgTEwIJPEQ3sQGE/6ll2l9H/KcEzBcfWn2IclluM3DpddJxSHujlFkscbUPvmB0LHVnLrId7nlaZVkEc6QGXQI1MAwZcWmVRHeNaQwJMMiU2cwy4s7p/RJ2ckpvIQs+cIs+5GzitloLKHUV3MPREuXbTOKO91dX387gGTONxIgEWm+E61FFrpcyqXLHsEwiDjEsjAksqw5XPoL9MHVrn6QR4q+XZrDaR4RoWzq2ymafuRA/Mq1stSsHLVkcbdf9VjOcx8ZH3+SFWcCWlVPyWuUBOwUWdC1wP5NVjYiXFWLO69PZ6CRTUY6KSIoEKdf6T3IzzgHxnsyHctNBEkmn6Oob8ExUDg/ahGybd177cDjzH5xHwgDiSvoS7I/LZyvxJZj0wod7tkX5G0XVC7rEyLhfLJjBGbKoLLEfZWObyKeZ6oY82g+yf5Zn/mJyHX7PMf04z/T3/LcAAu4E6iiyJqf0AAAAASUVORK5CYII=",iconSize:[32,32],iconAnchor:[16,16]})},_onHandleDrag:function(){var t=this._handled,e=t.getCorner(this._corner),i=this.getLatLng();t.dragBy(e,i)},updateHandle:function(){this.setLatLng(this._handled.getCorner(this._corner))}}),L.dragHandle=function(t,e,i){return new L.DragHandle(t,e,i)}},988:function(){L.EditHandle=L.Marker.extend({initialize:function(t,e,i){var o=t.getCorner(e);L.setOptions(this,i),this._handled=t,this._corner=e;var n={draggable:!0,zIndexOffset:10};i&&i.hasOwnProperty("draggable")&&(n.draggable=i.draggable),L.Marker.prototype.initialize.call(this,o,n)},onAdd:function(t){L.Marker.prototype.onAdd.call(this,t),this._bindListeners(),this.updateHandle()},onRemove:function(t){this._unbindListeners(),L.Marker.prototype.onRemove.call(this,t)},_onHandleDragStart:function(){this._handled.fire("editstart")},_onHandleDragEnd:function(){this._fireEdit()},_fireEdit:function(){this._handled.edited=!0,this._handled.fire("edit")},_bindListeners:function(){this.on({contextmenu:L.DomEvent.stop,dragstart:this._onHandleDragStart,drag:this._onHandleDrag,dragend:this._onHandleDragEnd},this),this._handled._map.on("zoomend",this.updateHandle,this),this._handled.on("update",this.updateHandle,this)},_unbindListeners:function(){this.off({contextmenu:L.DomEvent.stop,dragstart:this._onHandleDragStart,drag:this._onHandleDrag,dragend:this._onHandleDragEnd},this),this._handled._map.off("zoomend",this.updateHandle,this),this._handled.off("update",this.updateHandle,this)},_calculateScalingFactor:function(t,e){var i=this._handled,o=i._map,n=o.latLngToLayerPoint(i.getCenter()),a=o.latLngToLayerPoint(t),s=o.latLngToLayerPoint(e),r=this._d2(n,a),l=this._d2(n,s);return Math.sqrt(l/r)},_d2:function(t,e){var i=t.x-e.x,o=t.y-e.y;return Math.pow(i,2)+Math.pow(o,2)},calculateAngleDelta:function(t,e){var i=this._handled,o=i._map,n=o.latLngToLayerPoint(i.getCenter()),a=o.latLngToLayerPoint(t),s=o.latLngToLayerPoint(e),r=Math.atan2(n.y-a.y,n.x-a.x);return Math.atan2(n.y-s.y,n.x-s.x)-r}})},206:function(){L.FreeRotateHandle=L.EditHandle.extend({options:{TYPE:"freeRotate",icon:L.icon({iconUrl:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAHiSURBVMXBa3HbShgA0PMp/1sCCo8oCEpgTaCXgIXAJiDzyCJoAUTm4UVQAns1Y8+snWnTvJyeE16hkjDgDrfoNTMKcpC9UPiLSo8JyetkjEHxjPCMyoS199kFoz8Iv1HpMaN3qWDCHoegOKkkRwnJpRmroHgiPFEZ8IBekzEGxQtUEhKSS/fB7Ew4U+lxcGkVZG9QWWPSFAxBcdK59KApuA+yNwp2uEdx1GN25sZJZULSfAtm77SlbNjju6MvG75u+WHRWVR6rDVjMPsgwYyVZl3pLTpHkyYHOx8syMiayaJzlDTZ9YyaZNFVkiYH2ZUEBcVJJXVImuz6Js3Qofe59pq7DoOTILu+g+a288mCouk7/1iH4qTS+2QdDppbV1ZJmrnDXnPnc5UOs2Z0fUmTuyBr+krvSioJyUmQO0dZM7mepMkWnaNRkyrJB6uskTSjxY3Fll8bvmJwlDb83FJ8gMqAB80uyBY3Trb82PAfvjj6vuHnluIdKgMeNXOwctK5NKBoHitrb1RJeHRp5Ux4ojLg0aWMHGQvUOkxIWkKVsHsTPiNSo8HDC5lZIsgO6n0uMUdRvQuFQxB8UR4RmXC2vvsgtEfhL+o9JiQvE7GGBTPCK9QSUjoMWgKDthjDrIX+h/k0I7gth6N5gAAAABJRU5ErkJggg==",iconSize:[32,32],iconAnchor:[16,16]})},_onHandleDrag:function(){var t=this._handled,e=t._map,i=t.getCorner(this._corner),o=this.getLatLng(),n=this.calculateAngleDelta(i,o),a=this._calculateScalingFactor(i,o);0!==n&&t.rotateBy(n,"rad");var s=t.edgeMinWidth;s||(s=50);var r=e.latLngToContainerPoint(t.getCorner(0)),l=e.latLngToContainerPoint(t.getCorner(1)),c=Math.abs(r.x-l.x),d=Math.abs(r.y-l.y);Math.sqrt(c*c+d*d)>s||a>1?t.scaleBy(a):t.scaleBy(1)},updateHandle:function(){this.setLatLng(this._handled.getCorner(this._corner))}}),L.freeRotateHandle=function(t,e,i){return new L.FreeRotateHandle(t,e,i)}},789:function(){L.LockHandle=L.EditHandle.extend({options:{TYPE:"lock",interactive:!1,icon:L.icon({iconUrl:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAD8SURBVO3BPU7CYAAA0AdfjIcQlRCQBG7C3gk2uIPG2RC3Dk16Gz0FTO1WZs/gwGCMP/2+xsSl7+n1er1Iz9LtRQjaPeMeO+TinLDCJV78YqjdA04YodKuxhUaPGoRxMmxwRQZSt87Yo4KExGCeAUyLLFB4bMacxywEClIU2KDKXbInTUYo8JCgoFuGoxQO5uiwY1EA91VmDqrcKeDoX8WdNNgjApvmGGLXKIgXY0xGkxQYItrrFFIEKQ5Yo4KEx9yrDFDhlKkIF6NOQ5Y+KpAhiXWKEQI4pxwiwoLPyuxwQw75FoE7fZYocFEuwI7jHCBV39gL92TXq/Xi/AOcmczZmaIMScAAAAASUVORK5CYII=",iconSize:[32,32],iconAnchor:[16,16]})},onRemove:function(t){this.unbindTooltip(),L.EditHandle.prototype.onRemove.call(this,t)},_bindListeners:function(){var t=this.getElement();L.EditHandle.prototype._bindListeners.call(this),L.DomEvent.on(t,{mousedown:this._tooltipOn,mouseup:this._tooltipOff},this),L.DomEvent.on(document,"pointerleave",this._tooltipOff,this)},_unbindListeners:function(){var t=this.getElement();L.EditHandle.prototype._bindListeners.call(this),L.DomEvent.off(t,{mousedown:this._tooltipOn,mouseup:this._tooltipOff},this),L.DomEvent.off(document,"pointerleave",this._tooltipOff,this)},_onHandleDrag:function(){},updateHandle:function(){this.setLatLng(this._handled.getCorner(this._corner))},_tooltipOn:function(t){var e=this._handled.parentGroup,i=e?e.editing:this._handled.editing;if(!t.shiftKey&&(this._handled.isSelected()||!e||e.isCollected(this._handled))){var o=i._lockHandles;this._timer=setTimeout(L.bind((function(){this._timeout&&clearTimeout(this._timeout),this.getTooltip()?o.eachLayer((function(t){this!==t&&t.closeTooltip()})):this.bindTooltip("Locked!",{permanent:!0}),this.openTooltip()}),this),500)}},_tooltipOff:function(t){var e=this._handled.parentGroup,i=e?e.editing:this._handled.editing;if(!t.shiftKey&&(this._handled.isSelected()||!e||e.isCollected(this._handled))){var o=i._lockHandles;t.currentTarget===document&&o.eachLayer((function(t){t.closeTooltip()})),this._timer&&clearTimeout(this._timer),this._timeout=setTimeout(L.bind((function(){this.closeTooltip()}),this),400)}}}),L.lockHandle=function(t,e,i){return new L.LockHandle(t,e,i)}},337:function(){L.RotateHandle=L.EditHandle.extend({options:{TYPE:"rotate",icon:L.icon({iconUrl:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAHiSURBVMXBa3HbShgA0PMp/1sCCo8oCEpgTaCXgIXAJiDzyCJoAUTm4UVQAns1Y8+snWnTvJyeE16hkjDgDrfoNTMKcpC9UPiLSo8JyetkjEHxjPCMyoS199kFoz8Iv1HpMaN3qWDCHoegOKkkRwnJpRmroHgiPFEZ8IBekzEGxQtUEhKSS/fB7Ew4U+lxcGkVZG9QWWPSFAxBcdK59KApuA+yNwp2uEdx1GN25sZJZULSfAtm77SlbNjju6MvG75u+WHRWVR6rDVjMPsgwYyVZl3pLTpHkyYHOx8syMiayaJzlDTZ9YyaZNFVkiYH2ZUEBcVJJXVImuz6Js3Qofe59pq7DoOTILu+g+a288mCouk7/1iH4qTS+2QdDppbV1ZJmrnDXnPnc5UOs2Z0fUmTuyBr+krvSioJyUmQO0dZM7mepMkWnaNRkyrJB6uskTSjxY3Fll8bvmJwlDb83FJ8gMqAB80uyBY3Trb82PAfvjj6vuHnluIdKgMeNXOwctK5NKBoHitrb1RJeHRp5Ux4ojLg0aWMHGQvUOkxIWkKVsHsTPiNSo8HDC5lZIsgO6n0uMUdRvQuFQxB8UR4RmXC2vvsgtEfhL+o9JiQvE7GGBTPCK9QSUjoMWgKDthjDrIX+h/k0I7gth6N5gAAAABJRU5ErkJggg==",iconSize:[32,32],iconAnchor:[16,16]})},_onHandleDrag:function(){var t=this._handled,e=t.getCorner(this._corner),i=this.getLatLng(),o=this.calculateAngleDelta(e,i);t.rotateBy(o,"rad")},updateHandle:function(){this.setLatLng(this._handled.getCorner(this._corner))}}),L.rotateHandle=function(t,e,i){return new L.RotateHandle(t,e,i)}},350:function(){L.ScaleHandle=L.EditHandle.extend({options:{TYPE:"scale",icon:L.icon({iconUrl:"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2ZXJzaW9uPSIxLjEiIHdpZHRoPSI0NTkiIGhlaWdodD0iNDY0IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCA1MTIgNTEyIiB4bWw6c3BhY2U9InByZXNlcnZlIiBzdHlsZT0iIj48cmVjdCBpZD0iYmFja2dyb3VuZHJlY3QiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIHg9IjAiIHk9IjAiIGZpbGw9Im5vbmUiIHN0cm9rZT0ibm9uZSIgY2xhc3M9IiIgc3R5bGU9IiIvPjxnIGNsYXNzPSJjdXJyZW50TGF5ZXIiIHN0eWxlPSIiPjx0aXRsZT5MYXllciAxPC90aXRsZT48cGF0aCBkPSJNNDU5LjA0OTE1OTUzMDQ3MTM0LDg2LjkyNjIzNDUxMjU1MDAyIFYwIGgtODUuNzE0NTczMzU2MzEyMDkgdjI3LjA0MzcxNzQwMzkwNDQ1MiBIODUuNzE0NTczMzU2MzEyMDMgVjAgSDAgdjg2LjkyNjIzNDUxMjU1MDAyIGgyNS43MTQzNzIwMDY4OTM2MjYgdjI4OS43NTQxMTUwNDE4MzM0IEgwIHY4Ni45MjYyMzQ1MTI1NTAwMiBoODUuNzE0NTczMzU2MzEyMDkgdi0yNy4wNDM3MTc0MDM5MDQ0NTIgaDI4NS43MTUyNDQ1MjEwNDAzIHYyNy4wNDM3MTc0MDM5MDQ0NTIgaDg1LjcxNDU3MzM1NjMxMjA5IHYtODYuOTI2MjM0NTEyNTUwMDIgaC0yMy44MDk2MDM3MTAwODY2OSBWODYuOTI2MjM0NTEyNTUwMDIgSDQ1OS4wNDkxNTk1MzA0NzEzNCB6TTM4NC43NjMxOTU5NTUwMDA5LDEyLjU1NjAxMTY1MTgxMjc4MSBoNjEuOTA0OTY5NjQ2MjI1Mzk2IHY2Mi43ODAwNTgyNTkwNjM5MSBoLTYxLjkwNDk2OTY0NjIyNTM5NiBWMTIuNTU2MDExNjUxODEyNzgxIHpNMTIuMzgwOTkzOTI5MjQ1MDUsMTIuNTU2MDExNjUxODEyNzgxIGg2MS45MDQ5Njk2NDYyMjUzOTYgdjYyLjc4MDA1ODI1OTA2MzkxIEgxMi4zODA5OTM5MjkyNDUwNSBWMTIuNTU2MDExNjUxODEyNzgxIHpNNzQuMjg1OTYzNTc1NDcwNTMsNDUxLjA1MDU3MjQxNTEyMDY2IEgxMi4zODA5OTM5MjkyNDUwNSB2LTYyLjc4MDA1ODI1OTA2MzkxIGg2MS45MDQ5Njk2NDYyMjUzOTYgVjQ1MS4wNTA1NzI0MTUxMjA2NiB6TTQ0NS43MTU3ODE0NTI4MjI3NCw0NTEuMDUwNTcyNDE1MTIwNjYgaC02Mi44NTczNTM3OTQ2Mjg4NjQgdi02Mi43ODAwNTgyNTkwNjM5MSBoNjIuODU3MzUzNzk0NjI4ODY0IFY0NTEuMDUwNTcyNDE1MTIwNjYgek00MDcuNjIwNDE1NTE2Njg0MjYsMzc2LjY4MDM0OTU1NDM4MzQ0IGgtMzYuMTkwNTk3NjM5MzMxNzcgdjMyLjgzODc5OTcwNDc0MTEyIEg4NS43MTQ1NzMzNTYzMTIwMyB2LTMyLjgzODc5OTcwNDc0MTEyIEg0OS41MjM5NzU3MTY5ODAzMiBWODYuOTI2MjM0NTEyNTUwMDIgaDM2LjE5MDU5NzYzOTMzMTc3IFY1MC4yMjQwNDY2MDcyNTExMjUgaDI4Ny42MjAwMTI4MTc4NDcyIHYzNi43MDIxODc5MDUyOTg5IGgzNC4yODU4MjkzNDI1MjQ4MzUgVjM3Ni42ODAzNDk1NTQzODM0NCB6IiBpZD0ic3ZnXzIiIGNsYXNzPSIiIGZpbGw9IiMxYTFhZWIiIGZpbGwtb3BhY2l0eT0iMSIvPjwvZz48L3N2Zz4=",iconSize:[32,32],iconAnchor:[16,16]})},_onHandleDrag:function(){var t=this._handled,e=t._map,i=t.edgeMinWidth,o=t.getCorner(this._corner),n=this.getLatLng(),a=this._calculateScalingFactor(o,n);i||(i=50);var s=e.latLngToLayerPoint(t.getCorner(0)),r=e.latLngToLayerPoint(t.getCorner(1)),l=Math.abs(s.x-r.x),c=Math.abs(s.y-r.y);Math.sqrt(l*l+c*c)>i||a>1?t.scaleBy(a):t.scaleBy(1)},updateHandle:function(){this.setLatLng(this._handled.getCorner(this._corner))}}),L.scaleHandle=function(t,e,i){return new L.ScaleHandle(t,e,i)}},719:function(){L.distortableImage=L.DistortableImage||{},L.distortableImage=L.DistortableImage,L.DistortableImage.group_action_map={},L.DistortableImage.ControlBar=L.Toolbar2.Control.extend({}),L.distortableImage.controlBar=function(t){return new L.DistortableImage.ControlBar(t)},L.DistortableCollection.addInitHook((function(){this.ACTIONS=[L.ExportAction,L.DeleteAction,L.LockAction,L.UnlockAction],L.DistortableCollection.Edit.MODES={lock:L.LockAction,unlock:L.UnlockAction};var t=this.options.actions?this.options.actions:this.ACTIONS;this.editing=L.distortableCollection.edit(this,{actions:t})}))},93:function(){L.DistortableImage=L.DistortableImage||{},L.distortableImage=L.DistortableImage,L.DistortableImage.action_map={},L.DistortableImage.PopupBar=L.Toolbar2.Popup.extend({options:{anchor:[0,-10]},initialize:function(t,e){L.setOptions(this,e),L.Toolbar2.Popup.prototype.initialize.call(this,t,e)},addHooks:function(t,e){this.map=t,this.ov=e},tools:function(){if(this._ul)return this._ul.children},clickTool:function(t){for(var e=this.tools(),i=0;i',_symbols:"",render:function(){return this.addSymbols(this._symbols),this._svg},addSymbols:function(t){this._svg+=t}})},261:function(){L.KeymapperIconSet=L.IconSet.extend({_symbols:''})},929:function(){L.ToolbarIconSet=L.IconSet.extend({_symbols:''})},496:function(){L.Map.mergeOptions({boxCollector:!0,boxZoom:!1}),L.Map.BoxCollector=L.Map.BoxZoom.extend({initialize:function(t){this._map=t,this._container=t._container,this._pane=t._panes.overlayPane,this._resetStateTimeout=0,t.on("unload",this._destroy,this)},addHooks:function(){L.DomEvent.on(this._container,"mousedown",this._onMouseDown,this)},removeHooks:function(){L.DomEvent.off(this._container,"mousedown",this._onMouseDown,this)},moved:function(){return this._moved},_destroy:function(){L.DomUtil.remove(this._pane),delete this._pane},_resetState:function(){this._resetStateTimeout=0,this._moved=!1},_clearDeferredResetState:function(){0!==this._resetStateTimeout&&(clearTimeout(this._resetStateTimeout),this._resetStateTimeout=0)},_onMouseDown:function(t){if(!t.shiftKey||1!==t.which&&1!==t.button)return!1;this._clearDeferredResetState(),this._resetState(),L.DomUtil.disableTextSelection(),L.DomUtil.disableImageDrag(),this._startPoint=this._map.mouseEventToContainerPoint(t),L.DomEvent.on(document,{contextmenu:L.DomEvent.stop,mousemove:this._onMouseMove,mouseup:this._onMouseUp},this)},_onMouseMove:function(t){this._moved||(this._moved=!0,this._box=L.DomUtil.create("div","leaflet-zoom-box",this._container),L.DomUtil.addClass(this._container,"leaflet-crosshair"),this._map.fire("boxzoomstart")),this._point=this._map.mouseEventToContainerPoint(t),this._bounds=L.bounds(this._startPoint,this._point);var e=this._bounds.getSize();L.DomUtil.setPosition(this._box,this._bounds.min),this._box.style.width=e.x+"px",this._box.style.height=e.y+"px"},_finish:function(){this._moved&&(L.DomUtil.remove(this._box),L.DomUtil.removeClass(this._container,"leaflet-crosshair")),L.DomUtil.enableTextSelection(),L.DomUtil.enableImageDrag(),L.DomEvent.off(document,{contextmenu:L.DomEvent.stop,mousemove:this._onMouseMove,mouseup:this._onMouseUp},this)},_onMouseUp:function(t){if((1===t.which||1===t.button)&&(this._finish(),this._moved)){this._clearDeferredResetState(),this._resetStateTimeout=setTimeout(L.Util.bind(this._resetState,this),0);var e=L.latLngBounds(this._map.containerPointToLatLng(this._bounds.getBottomLeft()),this._map.containerPointToLatLng(this._bounds.getTopRight())),i=this._map.getZoom(),o=this._map.getCenter();e=this._map._latLngBoundsToNewLayerBounds(e,i,o),this._map.fire("boxcollectend",{boxCollectBounds:e})}}}),L.Map.addInitHook("addHandler","boxCollector",L.Map.BoxCollector)},291:function(){L.Map.mergeOptions({doubleClickLabels:!0}),L.Map.DoubleClickLabels=L.Map.DoubleClickZoom.extend({enable:function(){var t=this._map;return this._enabled||(t.doubleClickZoom.enabled()&&t.doubleClickZoom.disable(),this._map.fire("singleclickon"),this._enabled=!0,this.addHooks()),this},disable:function(){return this._enabled?(this._enabled=!1,this.removeHooks(),this):this},_fireIfSingle:function(t){var e=this._map,i=t.originalEvent;i&&i.shiftKey||(e._clicked+=1,this._map._clickTimeout=setTimeout((function(){1===e._clicked?(e._clicked=0,e.fire("singleclick",{type:"singleclick"})):L.Browser.touch&&i&&i.sourceCapabilities.firesTouchEvents&&e.fire("dblclick")}),250))},_onDoubleClick:function(){var t=this._map,e=t._labels;setTimeout((function(){t._clicked=0,clearTimeout(t._clickTimeout)}),0),e&&(1===e.options.opacity?(e.options.opacity=0,e.setOpacity(0)):(e.options.opacity=1,e.setOpacity(1)))}}),L.Map.addInitHook("addHandler","doubleClickLabels",L.Map.DoubleClickLabels)},752:function(){L.Map.DoubleClickZoom.include({addHooks:function(){this._map.on({click:this._fireIfSingle,dblclick:this._onDoubleClick},this)},removeHooks:function(){this._map.off({click:this._fireIfSingle,dblclick:this._onDoubleClick},this)},enable:function(){return this._enabled||this._map.doubleClickLabels&&this._map.doubleClickLabels.enabled()||(this._map.fire("singleclickon"),this._enabled=!0,this.addHooks()),this},disable:function(){return this._enabled?(this._map.fire("singleclickoff"),this._enabled=!1,this.removeHooks(),this):this},_fireIfSingle:function(t){var e=this._map,i=t.originalEvent;i&&i.shiftKey||(e._clicked+=1,this._map._clickTimeout=setTimeout((function(){1===e._clicked?(e._clicked=0,e.fire("singleclick",{type:"singleclick"})):L.Browser.touch&&i&&i.sourceCapabilities.firesTouchEvents&&e._fireDOMEvent(i,"dblclick",[e])}),250))},_onDoubleClick:function(t){var e=this._map,i=t.originalEvent;if(setTimeout((function(){e._clicked=0,clearTimeout(e._clickTimeout)}),0),!i)return!1;var o=e.getZoom(),n=e.options.zoomDelta,a=i.shiftKey?o-n:o+n;"center"===e.options.doubleClickZoom?e.setZoom(a):e.setZoomAround(t.containerPoint,a)}})},131:function(){L.Map.include({_clicked:0,addGoogleMutant:function(t){return(t=this.mutantOptions=L.extend({mutantOpacity:.8,maxZoom:24,maxNativeZoom:20,minZoom:0,labels:!0,labelOpacity:1,doubleClickLabels:!0},t)).labels||(this.mutantOptions=L.extend(this.mutantOptions,{labelOpacity:t.labels?1:void 0,doubleClickLabels:!!t.labels||void 0})),this._googleMutant=L.tileLayer("http://mt0.google.com/vt/lyrs=s&x={x}&y={y}&z={z}",{maxZoom:t.maxZoom,maxNativeZoom:t.maxNativeZoom,minZoom:t.minZoom,opacity:t.mutantOpacity}).addTo(this),t.labels?this._addLabels(t):this.doubleClickLabels=void 0,this},_addLabels:function(t){return 0!==t.labelOpacity&&1!==t.labelOpacity&&(t.labelOpacity=1),this._labels=L.tileLayer("https://stamen-tiles-{s}.a.ssl.fastly.net/toner-labels/{z}/{x}/{y}{r}.{ext}",{attribution:'Map tiles by Stamen Design, CC BY 3.0 — Map data © OpenStreetMap contributors',subdomains:"abcd",interactive:!1,opacity:t.labelOpacity,maxZoom:t.maxZoom,maxNativeZoom:t.maxNativeZoom,minZoom:t.minZoom,ext:"png"}).addTo(this),this.mutantOptions.doubleClickLabels&&this.doubleClickLabels.enable(),this}}),L.Map.addInitHook((function(){this.doubleClickLabels.disable(),this.doubleClickZoom.enable()}))},999:function(){L.DomUtil=L.extend(L.DomUtil,{initTranslation:function(t){this.translation=t},getMatrixString:function(t){var e=L.Browser.webkit3d||L.Browser.gecko3d||L.Browser.ie3d,i=[t[0],t[3],0,t[6],t[1],t[4],0,t[7],0,0,1,0,t[2],t[5],0,t[8]],o=e?"matrix3d("+i.join(",")+")":"";return e||console.log("Your browser must support 3D CSS transformsin order to use DistortableImageOverlay."),o},toggleClass:function(t,e){var i=e;return this.hasClass(t,i)?this.removeClass(t,i):this.addClass(t,i)},confirmDelete:function(){return window.confirm(this.translation.confirmImageDelete)},confirmDeletes:function(t){if(1===t)return this.confirmDelete();var e,i=this.translation.confirmImagesDeletes;return e="function"==typeof i?i(t):i,window.confirm(e)}})},85:function(){L.IconUtil={create:function(t){return/^#/.test(t)&&(t=t.replace(/^#/,"")),''},addClassToSvg:function(t,e){var i=t.querySelector("svg");i&&L.DomUtil.addClass(i,e)},toggleXlink:function(t,e,i){/^#/.test(e)||(e="#"+e),/^#/.test(i)||(i="#"+i);var o=t.querySelector("use");if(o){var n=o.getAttribute("xlink:href")===e?i:e;return o.setAttribute("xlink:href",n),n}return!1},toggleTitle:function(t,e,i){var o=t.getAttribute("title")===e?i:e;return t.setAttribute("title",o),t.hasAttribute("aria-label")&&t.setAttribute("aria-label",o),o}}},351:function(){L.ImageUtil={getCmPerPixel:function(t){var e=t._map;return 100*e.latLngToLayerPoint(t.getCorner(0)).distanceTo(e.latLngToLayerPoint(t.getCorner(1)))/t.getElement().width}}},360:function(){L.MatrixUtil={adj:function(t){return[t[4]*t[8]-t[5]*t[7],t[2]*t[7]-t[1]*t[8],t[1]*t[5]-t[2]*t[4],t[5]*t[6]-t[3]*t[8],t[0]*t[8]-t[2]*t[6],t[2]*t[3]-t[0]*t[5],t[3]*t[7]-t[4]*t[6],t[1]*t[6]-t[0]*t[7],t[0]*t[4]-t[1]*t[3]]},multmm:function(t,e){var i,o=[];for(i=0;i<3;i++)for(var n=0;n<3;n++){for(var a=0,s=0;s<3;s++)a+=t[3*i+s]*e[3*s+n];o[3*i+n]=a}return o},multmv:function(t,e){return[t[0]*e[0]+t[1]*e[1]+t[2]*e[2],t[3]*e[0]+t[4]*e[1]+t[5]*e[2],t[6]*e[0]+t[7]*e[1]+t[8]*e[2]]},multsm:function(t,e){for(var i=[],o=0,n=e.length;o2&&void 0!==arguments[2]?arguments[2]:"deg";return"deg"===i?this.radiansToDegrees(Math.atan2(e,t)):Math.atan2(e,t)},radiansToDegrees:function(t){return 180*t/Math.PI},degreesToRadians:function(t){return t*Math.PI/180}}},866:function(){L.Utils={initTranslation:function(){var t={deleteImage:"Delete Image",deleteImages:"Delete Images",distortImage:"Distort Image",dragImage:"Drag Image",exportImage:"Export Image",exportImages:"Export Images",removeBorder:"Remove Border",addBorder:"Add Border",freeRotateImage:"Free rotate Image",geolocateImage:"Geolocate Image",lockMode:"Lock Mode",lockImages:"Lock Images",makeImageOpaque:"Make Image Opaque",makeImageTransparent:"Make Image Transparent",restoreImage:"Restore Natural Image",rotateImage:"Rotate Image",scaleImage:"Scale Image",stackToFront:"Stack to Front",stackToBack:"Stack to Back",unlockImages:"Unlock Images",confirmImageDelete:"Are you sure? This image will be permanently deleted from the map.",confirmImagesDeletes:"Are you sure? These images will be permanently deleted from the map."};if(this.options.translation)for(var e in t)this.options.translation.hasOwnProperty(e)||(this.options.translation[e]=t[e]);else this.options.translation=t;L.DomUtil.initTranslation(this.options.translation)},getNestedVal:function(t,e,i){return[e,i].reduce((function(t,e){return t&&t[e]}),t)}}}};t[999](),t[85](),t[351](),t[360](),t[682](),t[866](),t[477](),t[808](),t[743](),t[988](),t[92](),t[194](),t[206](),t[789](),t[337](),t[350](),t[376](),t[261](),t[929](),t[280](),t[426](),t[114](),t[231](),t[541](),t[149](),t[74](),t[691](),t[105](),t[944](),t[954](),t[178](),t[547](),t[886](),t[129](),t[93](),t[719](),t[397](),t[428](),t[782](),t[752](),t[496](),t[291](),t[131]()}(); //# sourceMappingURL=leaflet.distortableimage.js.map \ No newline at end of file diff --git a/examples/archive.css b/examples/archive.css new file mode 100644 index 000000000..17e3d5327 --- /dev/null +++ b/examples/archive.css @@ -0,0 +1,8 @@ +.distortableImageTooltip { + position: relative; + display: inline-block; + border-bottom: 1px white; + z-index: 1800; + position: absolute; +} + diff --git a/examples/archive.html b/examples/archive.html index d27604f1c..4db9e37c6 100644 --- a/examples/archive.html +++ b/examples/archive.html @@ -12,6 +12,7 @@ + @@ -61,6 +62,8 @@
+ +
diff --git a/examples/js/archive.js b/examples/js/archive.js index ec0aa86e7..abe55d22c 100644 --- a/examples/js/archive.js +++ b/examples/js/archive.js @@ -1,4 +1,5 @@ let map; +let image; let imageOverlaytooltipText; const welcomeModal = document.getElementById('welcomeModal'); const tileMap = document.getElementById('map'); @@ -9,6 +10,9 @@ const input = document.getElementById('input'); const responseText = document.getElementById('response'); const imageContainer = document.getElementById('imgContainer'); const mapToggle = document.getElementById('mapToggle'); +const imageOverlaytooltip = document.getElementById('imageOverlaytooltip'); +const tooltipText = document.getElementById('tooltiptext'); + const setupMap = () => { map = L.map('map').setView([51.505, -0.09], 13); @@ -124,13 +128,43 @@ tileMap.addEventListener('click', (event) => { bootstrap.Offcanvas.getInstance(sidebar).hide(); }); +// --------------------------------------------------------------------------------------------- +// OPTION 1 - Runs independently of OPTION 2 document.addEventListener('click', (event) => { if (event.target.classList.contains('place-button')) { const imageURL = event.target.previousElementSibling.src; - const image = L.distortableImageOverlay( // <= SEGUN + // const image = L.distortableImageOverlay( + image = L.distortableImageOverlay( // <= SEGUN imageURL, {tooltipText: imageOverlaytooltipText} ); map.imgGroup.addLayer(image); } }); + +// --------------------------------------------------------------------------------------------- +// OPTION 2.1 - To run this option, uncomment OPTION 1 above too as well +document.addEventListener('mousemove', (event) => { + if (event.target.classList.contains('leaflet-image-layer')) { + if (!image.isSelected()) { + const xPos = event.layerX; + const yPos = event.layerY; + + tooltipText.textContent = imageOverlaytooltipText; + imageOverlaytooltip.style.position = 'absolute'; + imageOverlaytooltip.style.left = (xPos - 60) +'px'; + imageOverlaytooltip.style.top = (yPos - 40) +'px'; + imageOverlaytooltip.hidden = false; + } + + if (image.isSelected()) { + imageOverlaytooltip.hidden = true; + } + } +}); + +document.addEventListener('mouseout', (event) => { + if (event.target.classList.contains('leaflet-image-layer')) { + imageOverlaytooltip.hidden = true; + } +}); diff --git a/src/DistortableImageOverlay.js b/src/DistortableImageOverlay.js index cc0b19de9..c5cd4a4eb 100644 --- a/src/DistortableImageOverlay.js +++ b/src/DistortableImageOverlay.js @@ -91,9 +91,9 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ this.fire('add'); // SEGUN ------------------------------------------------------------------------------------------------------------------------------ - L.DomEvent.on(this.getElement(), 'mouseover mousemove', this._activateTooltip, this); + // L.DomEvent.on(this.getElement(), 'mouseover mousemove', this._activateTooltip, this); - L.DomEvent.on(this.getElement(), 'mouseout', this._closeTooltip, this); + // L.DomEvent.on(this.getElement(), 'mouseout', this._closeTooltip, this); }, onRemove(map) { From 9aec26ef2685324ea472ff1ae12836d5ac4207b2 Mon Sep 17 00:00:00 2001 From: segun Date: Fri, 6 Jan 2023 20:47:56 +0100 Subject: [PATCH 29/57] hot-fix --- dist/leaflet.distortableimage.js | 8350 +++++++++++++++++++++++++++++- examples/archive.css | 12 + 2 files changed, 8361 insertions(+), 1 deletion(-) diff --git a/dist/leaflet.distortableimage.js b/dist/leaflet.distortableimage.js index 50bcb0c3b..110b1a264 100644 --- a/dist/leaflet.distortableimage.js +++ b/dist/leaflet.distortableimage.js @@ -1,2 +1,8350 @@ -!function(){var t={808:function(){var t=[];L.DistortableCollection=L.FeatureGroup.extend({options:{editable:!0,exportOpts:{exportStartUrl:"//export.mapknitter.org/export",statusUrl:"//export.mapknitter.org",exportUrl:"http://export.mapknitter.org/"}},initialize:function(t){L.setOptions(this,t),L.FeatureGroup.prototype.initialize.call(this,t),L.Utils.initTranslation.call(this),this.editable=this.options.editable},onAdd:function(t){L.FeatureGroup.prototype.onAdd.call(this,t),this._map=t,this.editable&&this.editing.enable(),this.on("layeradd",this._addEvents,this),this.on("layerremove",this._removeEvents,this)},onRemove:function(){this.editing&&this.editing.disable(),this.off("layeradd",this._addEvents,this),this.off("layerremove",this._removeEvents,this)},_addEvents:function(t){var e=t.layer;L.DomEvent.on(e,{dragstart:this._dragStartMultiple,drag:this._dragMultiple},this),L.DomEvent.on(e.getElement(),{mousedown:this._deselectOthers,contextmenu:this._longPressMultiSelect},this)},_removeEvents:function(t){var e=t.layer;L.DomEvent.off(e,{dragstart:this._dragStartMultiple,drag:this._dragMultiple},this),L.DomEvent.off(e.getElement(),{mousedown:this._deselectOthers,contextmenu:this._longPressMultiSelect},this)},_longPressMultiSelect:function(t){var e=this;this.editable&&(t.preventDefault(),this.eachLayer((function(i){var o=i.editing;i.getElement()===t.target&&o.enabled()&&(L.DomUtil.toggleClass(i.getElement(),"collected"),e.anyCollected()?(i.deselect(),e.editing._addToolbar()):e.editing._removeToolbar())})))},isCollected:function(t){return L.DomUtil.hasClass(t.getElement(),"collected")},anyCollected:function(){return this.getLayers().some(this.isCollected.bind(this))},_toggleCollected:function(e,i){e.shiftKey&&i.editing.enabled()&&(L.DomUtil.toggleClass(e.target,"collected"),t.every((function(t){return t._leaflet_id!==i._leaflet_id}))?t.push(i):t.splice(t.indexOf(i),1)),this.anyCollected()?i.deselect():this.editing._removeToolbar()},_deselectOthers:function(t){var e=this;this.editable&&(this.eachLayer((function(i){i.getElement()!==t.target?i.deselect():e._toggleCollected(t,i)})),t&&L.DomEvent.stopPropagation(t))},_dragStartMultiple:function(t){var e,i=t.target,o=this._map;this.isCollected(i)&&this.eachLayer((function(t){for(t._dragStartPoints={},t.deselect(),e=0;e<4;e++){var i=t.getCorner(e);t._dragStartPoints[e]=o.latLngToLayerPoint(i)}}))},_dragMultiple:function(t){var e=t.target,i=this._map;if(this.isCollected(e)){var o=i.latLngToLayerPoint(e.getCorner(0)),n=e._dragStartPoints[0].subtract(o);this._updateCollectionFromPoints(n,e)}},_toRemove:function(){var t=this;return this.getLayers().filter((function(e){var i=e.editing._mode;return t.isCollected(e)&&"lock"!==i}))},_toMove:function(t){var e=this;return this.getLayers().filter((function(i){var o=i.editing._mode;return i!==t&&e.isCollected(i)&&"lock"!==o}))},_updateCollectionFromPoints:function(t,e){var i,o=this._toMove(e),n=new L.Transformation(1,-t.x,1,-t.y);o.forEach((function(t){var e={};for(i=0;i<4;i++)e[i]=n.transform(t._dragStartPoints[i]);t.setCornersFromPoints(e)}))},_getAvgCmPerPixel:function(t){return t.reduce((function(t,e){return t+e.cm_per_pixel}),0)/t.length},generateExportJson:function(){var t={images:[]};return this.eachLayer((function(e){if(this.isCollected(e)){var i=e._image.src.split("/"),o=i[i.length-1],n=e.getCorners(),a=[{lat:n[0].lat,lon:n[0].lng},{lat:n[1].lat,lon:n[1].lng},{lat:n[3].lat,lon:n[3].lng},{lat:n[2].lat,lon:n[2].lng}];t.images.push({id:e._leaflet_id,src:e._image.src,width:e._image.width,height:e._image.height,image_file_name:o,nodes:a,cm_per_pixel:L.ImageUtil.getCmPerPixel(e)})}}),this),t.images=t.images.reverse(),t.avg_cm_per_pixel=this._getAvgCmPerPixel(t.images),t}}),L.distortableCollection=function(t,e){return new L.DistortableCollection(t,e)}},477:function(){L.DistortableImageOverlay=L.ImageOverlay.extend({options:{height:200,crossOrigin:!0,edgeMinWidth:50,editable:!0,mode:"distort",selected:!1,interactive:!0,tooltipText:"Unknow image"},initialize:function(t,e){L.setOptions(this,e),L.Utils.initTranslation.call(this),this.edgeMinWidth=this.options.edgeMinWidth,this.editable=this.options.editable,this._selected=this.options.selected,this._url=t,this.rotation={},this.interactive=this.options.interactive,this.tooltipText=e.tooltipText},onAdd:function(t){var e=this;this._map=t,this.getElement()||this._initImage(),t.on("viewreset",this._reset,this),this.options.corners&&(this._corners=this.options.corners,t.options.zoomAnimation&&L.Browser.any3d&&t.on("zoomanim",this._animateZoom,this)),L.DomEvent.on(this.getElement(),"load",(function(){if(e.getPane().appendChild(e.getElement()),e._initImageDimensions(),e.options.rotation){var i=e.options.rotation.deg>=0?"deg":"rad";e.setAngle(e.options.rotation[i],i)}else e.rotation={deg:0,rad:0},e._reset();e._corners||t.options.zoomAnimation&&L.Browser.any3d&&t.on("zoomanim",e._animateZoom,e);var o=e._eventParents;o?(e.eP=o[Object.keys(o)[0]],e.eP.editable&&e.editing.enable()):(e.editable&&e.editing.enable(),e.eP=null)})),L.DomEvent.on(this.getElement(),"click",this.select,this),L.DomEvent.on(t,{singleclickon:this._singleClickListeners,singleclickoff:this._resetClickListeners,singleclick:this._singleClick},this),t.doubleClickZoom.enabled()||t.doubleClickLabels.enabled()||L.DomEvent.on(t,"click",this.deselect,this),this.fire("add")},onRemove:function(t){L.DomEvent.off(this.getElement(),"click",this.select,this),L.DomEvent.off(t,{singleclickon:this._singleClickListeners,singleclickoff:this._resetClickListeners,singleclick:this._singleClick},this),L.DomEvent.off(t,"click",this.deselect,this),this.editing&&this.editing.disable(),this.fire("remove"),L.ImageOverlay.prototype.onRemove.call(this,t),L.DomEvent.off(this.getElement(),"mouseover",this._deactivateTooltip,this)},_initImageDimensions:function(){var t=this._map,e=L.DomUtil.getStyle(this.getElement(),"width"),i=L.DomUtil.getStyle(this.getElement(),"height"),o=parseInt(e)/parseInt(i),n=this.options.height,a=parseInt(o*n),s=t.project(t.getCenter()),r=L.point(a,n).divideBy(2);this.options.corners?this._corners=this.options.corners:this._corners=[t.unproject(s.subtract(r)),t.unproject(s.add(L.point(r.x,-r.y))),t.unproject(s.add(L.point(-r.x,r.y))),t.unproject(s.add(r))],this._initialDimensions={center:s,offset:r,zoom:t.getZoom()},this.setBounds(L.latLngBounds(this.getCorners()))},_singleClick:function(t){"singleclick"===t.type&&this.deselect()},_singleClickListeners:function(){var t=this._map;L.DomEvent.off(t,"click",this.deselect,this),L.DomEvent.on(t,"singleclick",this.deselect,this)},_resetClickListeners:function(){var t=this._map;L.DomEvent.on(t,"click",this.deselect,this),L.DomEvent.off(t,"singleclick",this.deselect,this)},isSelected:function(){return this._selected},deselect:function(){var t=this.editing;if(t.enabled())return t._removeToolbar(),t._hideMarkers(),this._selected=!1,this.fire("deselect"),this},select:function(t){var e=this.editing,i=this.eP;if(e.enabled()){if(t&&L.DomEvent.stopPropagation(t),this._programmaticGrouping(),this._selected=!0,e._addToolbar(),e._showMarkers(),this.fire("select"),!i||!i.anyCollected())return this;this.deselect()}},_programmaticGrouping:function(){this._map.eachLayer((function(t){t instanceof L.DistortableImageOverlay&&t.deselect()}))},setCorner:function(t,e){var i=this.editing;return this._corners[t]=e,this.setBounds(L.latLngBounds(this.getCorners())),this.fire("update"),i.toolbar&&i.toolbar instanceof L.DistortableImage.PopupBar&&i._updateToolbarPos(),this.edited=!0,this},_cornerExceedsMapLats:function(t,e,i){return i.options.crs.Simple!=L.CRS.Simple&&(0===t?(o=i.project(e).y<2,n=i.project(e).y>=255):(o=i.project(e).y/t<2,n=i.project(e).y/Math.pow(2,t)>=255),o||n);var o,n},_activateTooltip:function(t){this._selected||(t.x,t.y,this.bindTooltip(this.tooltipText,{sticky:!0,direction:"top",offset:L.point([t.x-700,t.y-500])}).openTooltip())},_closeTooltip:function(){this.closeTooltip()},_deactivateTooltip:function(){this.unbindTooltip()},setCorners:function(t){var e=this._map,i=e.getZoom(),o=this.editing,n=0;for(var a in t)if(this._cornerExceedsMapLats(i,t[a],e))return this.setBounds(L.latLngBounds(this.getCorners())),void this.fire("update");for(var s in t)this._corners[n]=t[s],n+=1;return this.setBounds(L.latLngBounds(this.getCorners())),this.fire("update"),o.toolbar&&o.toolbar instanceof L.DistortableImage.PopupBar&&o._updateToolbarPos(),this.edited=!0,this},setCornersFromPoints:function(t){var e=this._map,i=e.getZoom(),o=this.editing,n=0;for(var a in t){var s=e.layerPointToLatLng(t[a]);if(this._cornerExceedsMapLats(i,s,e))return this.setBounds(L.latLngBounds(this.getCorners())),void this.fire("update")}for(var r in t)this._corners[n]=e.layerPointToLatLng(t[r]),n+=1;return this.setBounds(L.latLngBounds(this.getCorners())),this.fire("update"),o.toolbar&&o.toolbar instanceof L.DistortableImage.PopupBar&&o._updateToolbarPos(),this.edited=!0,this},scaleBy:function(t){var e,i,o=this._map,n=o.project(this.getCenter()),a={};if(0!==t){for(e=0;e<4;e++)i=o.project(this.getCorner(e)).subtract(n).multiplyBy(t).add(n),a[e]=o.unproject(i);return this.setCorners(a),this}},getAngle:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"deg",e=this.getElement().style[L.DomUtil.TRANSFORM].split("matrix3d")[1].slice(1,-1).split(","),i=e[0],o=e[1],n=e[4],a=e[5],s=i*a-o*n,r=L.TrigUtil.calcAngle(i,o,"rad");return s<0&&(r+=r<0?Math.PI:-Math.PI),r<0&&(r=2*Math.PI+r),"deg"===t?Math.round(L.TrigUtil.radiansToDegrees(r)):L.Util.formatNum(r,2)},setAngle:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"deg",i=this.getAngle(e),o=t-i;return this.rotateBy(o,e),this},rotateBy:function(t){var e,i,o,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"deg",a=this._map,s=a.project(this.getCenter()),r={};for("deg"===n&&(t=L.TrigUtil.degreesToRadians(t)),e=0;e<4;e++)i=a.project(this.getCorner(e)).subtract(s),o=L.point(Math.cos(t)*i.x-Math.sin(t)*i.y,Math.sin(t)*i.x+Math.cos(t)*i.y),r[e]=a.unproject(o.add(s));return this.setCorners(r),this},dragBy:function(t,e){var i,o,n=this._map,a={},s=n.project(t).subtract(n.project(e));for(i=0;i<4;i++)o=n.project(this.getCorner(i)).subtract(s),a[i]=n.unproject(o);this.setCorners(a)},restore:function(){for(var t=this._map,e=this._initialDimensions.center,i=this._initialDimensions.offset,o=this._initialDimensions.zoom,n=[e.subtract(i),e.add(L.point(i.x,-i.y)),e.add(L.point(-i.x,i.y)),e.add(i)],a=0;a<4;a++)t.unproject(n[a],o).equals(this.getCorner(a))||this.setCorner(a,t.unproject(n[a],o));return this.edited=!1,this.fire("restore"),this},_getTranslateString:function(t){var e=L.Browser.webkit3d,i=(e?",0":"")+")";return"translate"+(e?"3d":"")+"("+t.x+"px,"+t.y+"px"+i},_reset:function(){var t=this._map,e=this.getElement(),i=L.bind(t.latLngToLayerPoint,t),o=this._calculateProjectiveTransform(i),n=i(this.getCorner(0)),a=L.DomUtil.getMatrixString(o),s=this._getTranslateString(n);e._leaflet_pos=n,e.style[L.DomUtil.TRANSFORM]=[s,a].join(" "),e.style[L.DomUtil.TRANSFORM+"-origin"]="0 0 0",this.rotation.deg=this.getAngle(),this.rotation.rad=this.getAngle("rad")},_animateZoom:function(t){var e=this._map,i=this.getElement(),o=function(i){return e._latLngToNewLayerPoint(i,t.zoom,t.center)},n=this._calculateProjectiveTransform(o),a=o(this.getCorner(0)),s=L.DomUtil.getMatrixString(n),r=this._getTranslateString(a);i._leaflet_pos=a,i.style[L.DomUtil.TRANSFORM]=[r,s].join(" ")},getCorners:function(){return this._corners},getCorner:function(t){return this._corners[t]},getCenter:function(){var t=this._map,e=this.getCorners().reduce((function(e,i){return e.add(t.project(i))}),L.point(0,0));return t.unproject(e.divideBy(4))},_calculateProjectiveTransform:function(t){var e,i=t(this.getCorner(0)),o=this.getElement().offsetWidth||500,n=this.getElement().offsetHeight||375,a=[];for(e=0;e<4;e++)a.push(t(this.getCorner(e))._subtract(i));return L.MatrixUtil.general2DProjection(0,0,a[0].x,a[0].y,o,0,a[1].x,a[1].y,0,n,a[2].x,a[2].y,o,n,a[3].x,a[3].y)}}),L.distortableImageOverlay=function(t,e){return new L.DistortableImageOverlay(t,e)},L.Map.addInitHook((function(){L.DomUtil.hasClass(this.getContainer(),"ldi")||L.DomUtil.addClass(this.getContainer(),"ldi")}))},782:function(){var t=this;L.DomUtil=L.DomUtil||{},L.DistortableImage=L.DistortableImage||{},L.distortableImage=L.DistortableImage,L.DistortableImage.Keymapper=L.Handler.extend({options:{position:"topright"},initialize:function(t,e){this._map=t,L.setOptions(this,e)},addHooks:function(){this._keymapper||(this._container=this._buildContainer(),this._scrollWrapper=this._wrap(),this._toggler=this._createButton(),this._setMapper(this._container,this._scrollWrapper,this._toggler),L.DomEvent.on(this._toggler,"click",this._toggleKeymapper,this),L.DomEvent.disableClickPropagation(this._container),L.DomEvent.disableScrollPropagation(this._container))},removeHooks:function(){this._keymapper&&(L.DomEvent.off(this._toggler,"click",this._toggleKeymapper,this),L.DomUtil.remove(this._toggler),L.DomUtil.remove(this._scrollWrapper),L.DomUtil.remove(this._container),this._keymapper=!1)},_buildContainer:function(){var t=L.DomUtil.create("div","ldi-keymapper-hide");t.setAttribute("id","ldi-keymapper");var e=L.DomUtil.create("br","divider");return t.appendChild(e),t},_createButton:function(){var t=L.DomUtil.create("a","");return t.innerHTML=L.IconUtil.create("keyboard_open"),t.setAttribute("id","toggle-keymapper"),t.setAttribute("href","#"),t.setAttribute("title","Show keymap"),t.setAttribute("role","button"),t.setAttribute("aria-label","Show keymap"),t},_wrap:function(){var t=L.DomUtil.create("div","");return t.setAttribute("id","keymapper-wrapper"),t.style.display="none",t},_setMapper:function(t,e,i){this._keymapper=L.control({position:this.options.position}),this._keymapper.onAdd=function(){return t.appendChild(e),e.insertAdjacentHTML("beforeend",'
Rotate Mode
R
RotateScale Mode
r
Scale Mode
s
Distort Mode
d
Drag Mode
D
Lock (Mode) / Unlock Image
l u
Stack up / down
q a
Add / Remove Image Border
b
Toggle Opacity
o
Deselect All
esc
Delete Image(s)
delete backspace
Export Image(s)
e
'),t.appendChild(i),t},this._keymapper.addTo(this._map)},_toggleKeymapper:function(t){t.preventDefault(),this._container.className="ldi-keymapper leaflet-control"===this._container.className?"ldi-keymapper-hide leaflet-control":"ldi-keymapper leaflet-control",this._scrollWrapper.style.display="none"===this._scrollWrapper.style.display?"block":"none",this._toggler.innerHTML="close"===this._toggler.innerHTML?L.IconUtil.create("keyboard_open"):"close",L.IconUtil.toggleTitle(this._toggler,"Show keymap","Hide keymap"),L.DomUtil.toggleClass(this._toggler,"close-icon")},_injectIconSet:function(){if(!document.querySelector("#keymapper-iconset")){var t=L.DomUtil.create("div","");t.id="keymapper-iconset",t.setAttribute("hidden","hidden"),this._iconset=(new L.KeymapperIconSet).render(),t.innerHTML=this._iconset,document.querySelector(".leaflet-control-container").appendChild(t)}}}),L.DistortableImage.Keymapper.addInitHook((function(){L.DistortableImage.Keymapper.prototype._n=L.DistortableImage.Keymapper.prototype._n?L.DistortableImage.Keymapper.prototype._n+1:1,1!==L.DistortableImage.Keymapper.prototype._n||L.Browser.mobile||(t.enable(),t._injectIconSet())})),L.distortableImage.keymapper=function(t,e){return new L.DistortableImage.Keymapper(t,e)}},428:function(){L.DistortableImage=L.DistortableImage||{},L.DistortableCollection.Edit=L.Handler.extend({options:{keymap:L.distortableImage.group_action_map},initialize:function(t,e){this._group=t,this._exportOpts=t.options.exportOpts,L.setOptions(this,e),L.distortableImage.group_action_map.Escape="_decollectAll"},addHooks:function(){var t=this._group._map;this.editActions=this.options.actions,this.runExporter=L.bind(L.Utils.getNestedVal(this,"_exportOpts","exporter")||this.startExport,this),L.DomEvent.on(document,"keydown",this._onKeyDown,this),t.doubleClickZoom.enabled()||t.doubleClickLabels.enabled()||L.DomEvent.on(t,"click",this._decollectAll,this),L.DomEvent.on(t,{singleclickon:this._singleClickListeners,singleclickoff:this._resetClickListeners,singleclick:this._singleClick,boxcollectend:this._addCollections},this),this._group.editable=!0,this._group.eachLayer((function(t){return t.editing.enable()}))},removeHooks:function(){var t=this._group._map;L.DomEvent.off(document,"keydown",this._onKeyDown,this),t.doubleClickZoom.enabled()||t.doubleClickLabels.enabled()||L.DomEvent.off(t,"click",this._decollectAll,this),L.DomEvent.off(t,{singleclickon:this._singleClickListeners,singleclickoff:this._resetClickListeners,singleclick:this._singleClick,boxcollectend:this._addCollections},this),this._decollectAll(),this._group.editable=!1,this._group.eachLayer((function(t){return t.editing.disable()}))},enable:function(){return this._enabled=!0,this.addHooks(),this},disable:function(){return this._enabled=!1,this.removeHooks(),this},_onKeyDown:function(t){var e=this.options.keymap[t.key];this[e]&&this._group.anyCollected()&&this[e].call(this)},_singleClick:function(t){"singleclick"===t.type&&this._decollectAll(t)},_singleClickListeners:function(){var t=this._group._map;L.DomEvent.off(t,"click",this._decollectAll,this),L.DomEvent.on(t,"singleclick",this._decollectAll,this)},_resetClickListeners:function(){var t=this._group._map;L.DomEvent.on(t,"click",this._decollectAll,this),L.DomEvent.off(t,"singleclick",this._decollectAll,this)},_decollectAll:function(t){var e;t&&(e=t.originalEvent),e&&(e.shiftKey||e.target instanceof HTMLImageElement)||(this._group.eachLayer((function(t){L.DomUtil.removeClass(t.getElement(),"collected"),t.deselect()})),this._removeToolbar(),t&&L.DomEvent.stopPropagation(t))},_unlockGroup:function(){var t=this;this.hasTool(L.UnlockAction)&&this._group.eachLayer((function(e){t._group.isCollected(e)&&(e.editing._unlock(),e.deselect())}))},_lockGroup:function(){var t=this;this.hasTool(L.LockAction)&&this._group.eachLayer((function(e){t._group.isCollected(e)&&(e.editing._lock(),L.DomUtil.addClass(e.getElement(),"collected"))}))},_addCollections:function(t){var e=this,i=t.boxCollectBounds,o=this._group._map;this._group.eachLayer((function(t){var n=t.editing;t.isSelected()&&t.deselect();var a=o.getZoom(),s=o.getCenter(),r=L.latLngBounds(t.getCorner(2),t.getCorner(1));r=o._latLngBoundsToNewLayerBounds(r,a,s),i.intersects(r)&&n.enabled()&&(e.toolbar||e._addToolbar(),L.DomUtil.addClass(t.getElement(),"collected"))}))},_removeGroup:function(t){var e=this;if(this.hasTool(L.DeleteAction)){var i=this._group._toRemove(),o=i.length;0!==o&&(L.DomUtil.confirmDeletes(o)&&(i.forEach((function(t){e._group.removeLayer(t)})),this._group.anyCollected()||this._removeToolbar()),t&&L.DomEvent.stopPropagation(t))}},cancelExport:function(){this.customCollection||(this._exportOpts.collection=void 0),clearInterval(this.updateInterval)},_addToolbar:function(){var t=this._group,e=t._map;t.options.suppressToolbar||this.toolbar||(this.toolbar=L.distortableImage.controlBar({actions:this.editActions,position:"topleft"}).addTo(e,t))},_removeToolbar:function(){var t=this._group._map;if(!this.toolbar)return!1;t.removeLayer(this.toolbar),this.toolbar=!1},hasTool:function(t){return this.editActions.some((function(e){return e===t}))},addTool:function(t){return"leaflet-toolbar-icon"!==t.baseClass||this.hasTool(t)||(this._removeToolbar(),this.editActions.push(t),this._addToolbar()),this},removeTool:function(t){var e=this;return this.editActions.some((function(i,o){return e.editActions[o]===t&&(e._removeToolbar(),e.editActions.splice(o,1),e._addToolbar(),!0)})),this},startExport:function(){var t=this;if(this.hasTool(L.ExportAction))return new Promise((function(e){var i,o=t._exportOpts;o.resolve=e,t.updateInterval=null,t.customCollection=!!o.collection,t.customCollection||(o.collection=t._group.generateExportJson().images),o.frequency=o.frequency||3e3,o.scale=o.scale||100,o.updater=o.updater||function(n){(n=JSON.parse(n)).status_url&&(i!==n.status_url&&n.status_url.match(".json")&&(i=n.status_url),"complete"===n.status&&(clearInterval(t.updateInterval),t.customCollection||(t._exportOpts.collection=void 0),e(),null!==n.jpg&&alert("Export succeeded. "+o.exportUrl+n.jpg)),console.log(n))},o.handleStatusRes=o.handleStatusRes||function(e){i=o.statusUrl+e,t.updateInterval=setInterval((function(){var t=new Request("".concat(i,"?").concat(Date.now()),{method:"GET"});fetch(t).then((function(t){if(t.ok)return t.text()})).then(o.updater)}),o.frequency)},o.fetchStatusUrl=o.fetchStatusUrl||function(t){var e=new FormData;e.append("collection",JSON.stringify(t.collection)),e.append("scale",t.scale),e.append("upload",!0);var i={method:"POST",body:e},o=new Request(t.exportStartUrl,i);fetch(o).then((function(t){if(t.ok)return t.text()})).then(t.handleStatusRes)},o.fetchStatusUrl(o)}))}}),L.distortableCollection.edit=function(t,e){return new L.DistortableCollection.Edit(t,e)}},397:function(){L.DistortableImage=L.DistortableImage||{},L.DistortableImage.Edit=L.Handler.extend({options:{opacity:.7,outline:"1px solid red",keymap:L.distortableImage.action_map},initialize:function(t,e){this._overlay=t,this._toggledImage=!1,this._mode=t.options.mode,this._transparent=!1,this._outlined=!1,L.setOptions(this,e),L.distortableImage.action_map.Escape="_deselect"},addHooks:function(){var t=this._overlay;this.editActions=this.options.actions,t.bringToFront(),this._initModes(),this._initHandles(),this._appendHandlesandDragable(),t.isSelected()&&!t.options.suppressToolbar&&this._addToolbar(),this.parentGroup=!!t.eP&&t.eP,L.DomEvent.on(t.getElement(),{dblclick:this.nextMode},this),L.DomEvent.on(window,"keydown",this._onKeyDown,this)},removeHooks:function(){var t=this._overlay,e=this.parentGroup;for(var i in this._disableDragging(),this.toolbar&&this._removeToolbar(),this._handles)L.DomUtil.remove(i);L.DomUtil.hasClass(t.getElement(),"collected")&&L.DomUtil.removeClass(t.getElement(),"collected"),e&&!e.anyCollected()&&e.editing.toolbar&&e.editing._removeToolbar(),L.DomEvent.off(t.getElement(),{dblclick:this.nextMode},this),L.DomEvent.off(window,"keydown",this._onKeyDown,this)},disable:function(){return this._enabled?(this._overlay.deselect(),this._enabled=!1,this.removeHooks(),this):this},_initModes:function(){for(var t in this._modes={},L.DistortableImage.Edit.MODES){var e=L.DistortableImage.Edit.MODES[t];-1!==this.editActions.indexOf(e)&&(this._modes[t]=e)}this._modes[this._mode]||(this._mode=Object.keys(this._modes)[0])},_initHandles:function(){var t,e=this._overlay;for(this._dragHandles=L.layerGroup(),t=0;t<4;t++)this._dragHandles.addLayer(L.dragHandle(e,t));for(this._scaleHandles=L.layerGroup(),t=0;t<4;t++)this._scaleHandles.addLayer(L.scaleHandle(e,t));for(this._distortHandles=L.layerGroup(),t=0;t<4;t++)this._distortHandles.addLayer(L.distortHandle(e,t));for(this._rotateHandles=L.layerGroup(),t=0;t<4;t++)this._rotateHandles.addLayer(L.rotateHandle(e,t));for(this._freeRotateHandles=L.layerGroup(),t=0;t<4;t++)this._freeRotateHandles.addLayer(L.freeRotateHandle(e,t));for(this._lockHandles=L.layerGroup(),t=0;t<4;t++)this._lockHandles.addLayer(L.lockHandle(e,t,{draggable:!1}));this._handles={drag:this._dragHandles,scale:this._scaleHandles,distort:this._distortHandles,rotate:this._rotateHandles,freeRotate:this._freeRotateHandles,lock:this._lockHandles}},_appendHandlesandDragable:function(){var t=this._overlay;this._mode?(this._updateHandle(),!t.isSelected()&&this.currentHandle&&this.currentHandle.eachLayer((function(t){t.setOpacity(0),t.dragging&&t.dragging.disable()})),this.isMode("lock")||this._enableDragging()):this._enableDragging()},_onKeyDown:function(t){var e=this.options.keymap[t.key],i=this._overlay,o=this.parentGroup;o&&o.anyCollected()||void 0===this[e]||i.options.suppressToolbar||i.isSelected()&&this.toolbar&&this[e].call(this)},replaceTool:function(t,e){var i=this;return"leaflet-toolbar-icon"!==e.baseClass||this.hasTool(e)||this.editActions.some((function(o,n){if(o===t){for(var a in i._removeToolbar(),i.editActions[n]=e,i._addToolbar(),L.DistortableImage.Edit.MODES)L.DistortableImage.Edit.MODES[a]===t?(delete i._modes[a],i._nextOrNone(a)):L.DistortableImage.Edit.MODES[a]===e&&(i._modes[a]=e);return!0}})),this},addTool:function(t){if("leaflet-toolbar-icon"===t.baseClass&&!this.hasTool(t)){for(var e in this._removeToolbar(),this.editActions.push(t),this._addToolbar(),L.DistortableImage.Edit.MODES)L.DistortableImage.Edit.MODES[e]===t&&(this._modes[e]=t);this._overlay.isSelected()||this._removeToolbar()}return this},hasTool:function(t){return this.editActions.some((function(e){return e===t}))},removeTool:function(t){var e=this;return this.editActions.some((function(i,o){if(i===t){for(var n in e._removeToolbar(),e.editActions.splice(o,1),e._addToolbar(),L.DistortableImage.Edit.MODES)L.DistortableImage.Edit.MODES[n]===t&&(delete e._modes[n],e._nextOrNone(n));return!0}})),this._overlay.isSelected()||this._removeToolbar(),this},_nextOrNone:function(t){this.isMode(t)&&(Object.keys(this.getModes()).length>=1?this.nextMode():("lock"===t&&this._enableDragging(),this._mode="",this._updateHandle()))},_removeToolbar:function(){var t=this._overlay._map;this.toolbar&&(t.removeLayer(this.toolbar),this.toolbar=!1)},_enableDragging:function(){var t=this,e=this._overlay,i=e._map;this.dragging=new L.Draggable(e.getElement()),this.dragging.enable(),this.dragging.on("dragstart",(function(){e.fire("dragstart"),t._removeToolbar()})),this.dragging._updatePosition=function(){var t,o,n=e.getCorner(0),a=this._newPos.subtract(i.latLngToLayerPoint(n)),s={};for(this.fire("predrag"),o=0;o<4;o++)t=i.latLngToLayerPoint(e.getCorner(o)),s[o]=i.layerPointToLatLng(t.add(a));e.setCorners(s),e.fire("drag"),this.fire("drag")},this.dragging.on("dragend",(function(){e.fire("dragend")}))},_disableDragging:function(){this.dragging&&(this.dragging.disable(),delete this.dragging)},_dragMode:function(){this.setMode("drag")},_scaleMode:function(){this.setMode("scale")},_distortMode:function(){this.setMode("distort")},_rotateMode:function(){this.setMode("rotate")},_freeRotateMode:function(){this.setMode("freeRotate")},_toggleLockMode:function(){this.isMode("lock")?this._unlock():this._lock()},_toggleOpacity:function(){var t=this._overlay.getElement();if(this.hasTool(L.OpacityAction)){this._transparent=!this._transparent;var e=this._transparent?this.options.opacity:1;L.DomUtil.setOpacity(t,e),t.setAttribute("opacity",e),this._refresh()}},_toggleBorder:function(){var t=this._overlay.getElement();if(this.hasTool(L.BorderAction)){this._outlined=!this._outlined;var e=this._outlined?this.options.outline:"none";t.style.outline=e,this._refresh()}},_toggleOrder:function(){this._toggledImage?this._stackUp():this._stackDown()},_removeOverlay:function(){var t=this._overlay,e=this.parentGroup;!this.isMode("lock")&&this.hasTool(L.DeleteAction)&&L.DomUtil.confirmDelete()&&(this._removeToolbar(),e?e.removeLayer(t):t._map.removeLayer(t))},_getExport:function(){var t=this._overlay,e=t._map,i=t.getElement();if(this.hasTool(L.ExportAction)){var o=new Image;o.id=o.id||"tempId12345",document.body.appendChild(o),o.onload=function(){var i=o.height,n=o.width,a=e.latLngToLayerPoint(t.getCorner(0)),s=e.latLngToLayerPoint(t.getCorner(1)),r=e.latLngToLayerPoint(t.getCorner(2)),l=e.latLngToLayerPoint(t.getCorner(3));o.onload=function(){L.DomUtil.remove(o)},window&&window.hasOwnProperty("warpWebGl")&&warpWebGl(o.id,[0,0,n,0,n,i,0,i],[a.x,a.y,s.x,s.y,l.x,l.y,r.x,r.y],!0)},o.src=t.options.fullResolutionSrc||i.src}},_stackUp:function(){this._toggledImage&&this.hasTool(L.StackAction)&&(this._toggledImage=!1,this._overlay.bringToFront(),this._refresh())},_stackDown:function(){!this._toggledImage&&this.hasTool(L.StackAction)&&(this._toggledImage=!0,this._overlay.bringToBack(),this._refresh())},_unlock:function(){var t=this._overlay,e=t._map,i=this.parentGroup;this.isMode("lock")&&((!i||i.isCollected(t))&&i||this.hasTool(L.LockAction))&&(this.currentHandle&&e.removeLayer(this.currentHandle),"lock"!==t.options.mode&&this.hasMode(t.options.mode)?this._mode=t.options.mode:(this._mode="",this.currentHandle=""),this._updateHandle(),this._enableDragging(),this._refresh())},_lock:function(){var t=this._overlay,e=t._map,i=this.parentGroup;this.isMode("lock")||((!i||i.isCollected(t))&&i||this.hasTool(L.LockAction))&&(this.currentHandle&&e.removeLayer(this.currentHandle),this._mode="lock",this._updateHandle(),this._disableDragging(),this._refresh())},_deselect:function(){this._overlay.deselect()},_showMarkers:function(t){var e=this.parentGroup;this.currentHandle&&(!this.isMode("lock")&&e&&e.anyCollected()||this.currentHandle.eachLayer((function(t){t.setOpacity(1),t.dragging&&t.dragging.enable(),L.DomUtil.addClass(t.getElement(),"leaflet-interactive")})))},_hideMarkers:function(){var t=this._overlay,e=this.parentGroup;this._handles||this._initHandles(),this.currentHandle&&(this.isMode("lock")&&e&&e.isCollected(t)||this.currentHandle.eachLayer((function(t){t.setOpacity(0),t.dragging&&t.dragging.disable(),L.DomUtil.removeClass(t.getElement(),"leaflet-interactive")})))},_updateHandle:function(){var t=this._overlay._map,e=this.getMode();this.currentHandle&&t.removeLayer(this.currentHandle),this.currentHandle=""===e?"":this._handles[e],""!==this.currentHandle&&t.addLayer(this.currentHandle)},_addToolbar:function(){var t=this._overlay,e=this.parentGroup,i=t._map,o=t.getCorners(),n=-1/0;if(e&&e.anyCollected())e.editing._addToolbar();else if(!t.options.suppressToolbar&&!this.toolbar){for(var a=0;an&&(n=o[a].lat);var s=t.getCenter();s.lat=n,this.toolbar=L.distortableImage.popupBar(s,{actions:this.editActions}).addTo(i,t),t.fire("toolbar:created")}},_refresh:function(){this.toolbar&&this._removeToolbar(),this._addToolbar()},_updateToolbarPos:function(){var t=this._overlay,e=t.getCorners(),i=this.toolbar,o=-1/0;if(i&&i instanceof L.DistortableImage.PopupBar){for(var n=0;no&&(o=e[n].lat);var a=t.getCenter();a.lat=o,t.options.suppressToolbar||this.toolbar.setLatLng(a)}},hasMode:function(t){return!!this._modes[t]},getMode:function(){if(this.enabled())return this._mode},getModes:function(){return this._modes},isMode:function(t){return!!this.enabled()&&this._mode===t},setMode:function(t){var e=this._overlay,i=this.parentGroup;if(this.getMode()!==t&&this.hasMode(t)&&this.enabled())return this.toolbar&&this.toolbar.clickTool(t),this.isMode("lock")&&!this.dragging&&this._enableDragging(),this._mode=t,this.isMode("lock")&&this._disableDragging(),this._updateHandle(),this._refresh(),i&&i.isCollected(e)&&e.deselect(),this},nextMode:function(t){var e=this.getMode(),i=this.parentGroup,o=Object.keys(this.getModes()),n=o.indexOf(e),a=o[(n+1)%o.length];if(t){if(i&&i.anyCollected())return;L.DomEvent.stop(t)}return this.setMode(a)}}),L.distortableImage.edit=function(t,e){return new L.DistortableImage.Edit(t,e)}},426:function(){L.BorderAction=L.EditAction.extend({initialize:function(t,e,i){var o,n,a=e.editing,s=a._mode;a._outlined?(o="border_outer",n=e.options.translation.removeBorder):(o="border_clear",n=e.options.translation.addBorder),(i=i||{}).toolbarIcon={svg:!0,html:o,tooltip:n,className:"lock"===s?"disabled":""},L.DistortableImage.action_map.b="lock"===s?"":"_toggleBorder",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){var t=this._overlay.editing;L.IconUtil.toggleXlink(this._link,"border_clear","border_outer"),L.IconUtil.toggleTitle(this._link,"Remove Border","Add Border"),t._toggleBorder()}})},114:function(){L.DeleteAction=L.EditAction.extend({initialize:function(t,e,i){var o,n=e.editing;n instanceof L.DistortableImage.Edit?(o=e.options.translation.deleteImage,L.DistortableImage.action_map.Backspace="lock"===n._mode?"":"_removeOverlay"):(o=e.options.translation.deleteImages,L.DistortableImage.group_action_map.Backspace="lock"===n._mode?"":"_removeGroup"),(i=i||{}).toolbarIcon={svg:!0,html:"delete_forever",tooltip:o,className:"lock"===n._mode?"disabled":""},L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){var t=this._overlay.editing;t instanceof L.DistortableImage.Edit?t._removeOverlay():t._removeGroup()}})},231:function(){L.DistortAction=L.EditAction.extend({initialize:function(t,e,i){(i=i||{}).toolbarIcon={svg:!0,html:"distort",tooltip:e.options.translation.distortImage,className:"distort"},L.DistortableImage.action_map.d="_distortMode",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){this._overlay.editing._distortMode()}})},541:function(){L.DragAction=L.EditAction.extend({initialize:function(t,e,i){(i=i||{}).toolbarIcon={svg:!0,html:"drag",tooltip:e.options.translation.dragImage,className:"drag"},L.DistortableImage.action_map.D="_dragMode",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){this._overlay.editing._dragMode()}})},280:function(){L.DistortableImage=L.DistortableImage||{},L.distortableImage=L.DistortableImage,L.DistortableImage.action_map={},L.EditAction=L.Toolbar2.Action.extend({options:{toolbarIcon:{svg:!1,html:"",className:"",tooltip:""}},initialize:function(t,e,i){this._overlay=e,this._map=t,L.setOptions(this,i),L.Toolbar2.Action.prototype.initialize.call(this,i),this._injectIconSet()},_createIcon:function(t,e,i){var o=this,n=this.options.toolbarIcon,a=n.className,s=this._overlay.editing;this.toolbar=t,this._icon=L.DomUtil.create("li","",e),this._link=L.DomUtil.create("a","",this._icon),n.svg?this._link.innerHTML=L.IconUtil.create(n.html):this._link.innerHTML=n.html,this._link.setAttribute("href","#"),this._link.setAttribute("title",n.tooltip),this._link.setAttribute("role","button"),L.DomUtil.addClass(this._link,this.constructor.baseClass),a&&(L.DomUtil.addClass(this._link,a),"disabled"===a&&L.DomUtil.addClass(this._icon,a),a===s._mode?L.DomUtil.addClass(this._link,"selected-mode"):L.DomUtil.removeClass(this._link,"selected-mode")),L.DomEvent.on(this._link,"click",this.enable,this),L.DomEvent.on(this._overlay,"update",(function(){var t=o._link.innerHTML.match(/xlink:href="#restore"/);t&&1===t.length&&o._enableAction()})),this._addSubToolbar(t,this._icon,i)},_injectIconSet:function(){if(!document.querySelector("#iconset")){var t=document.createElement("div");t.id="iconset",t.setAttribute("hidden","hidden"),t.innerHTML=(new L.ToolbarIconSet).render(),document.querySelector(".leaflet-marker-pane").appendChild(t)}},_enableAction:function(){L.DomUtil.removeClass(this._link.parentElement,"disabled"),L.DomUtil.removeClass(this._link,"disabled")},_disableAction:function(){L.DomUtil.addClass(this._link.parentElement,"disabled"),L.DomUtil.addClass(this._link,"disabled")}}),L.editAction=function(t,e,i){return new L.EditAction(t,e,i)}},149:function(){L.ExportAction=L.EditAction.extend({initialize:function(t,e,i){var o,n=e.editing;this.isExporting=!1,this.mouseLeaveSkip=!0,this.isHooksExecuted=!1,n instanceof L.DistortableImage.Edit?(L.DistortableImage.action_map.e="_getExport",o=e.options.translation.exportImage):(L.DistortableImage.group_action_map.e="runExporter",o=e.options.translation.exportImages),(i=i||{}).toolbarIcon={svg:!0,html:"get_app",tooltip:o},L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){var t=this._overlay.editing;if(t instanceof L.DistortableImage.Edit)t._getExport();else if(!this.isHooksExecuted){this.isHooksExecuted=!0;var e=this._link.parentElement;this.mouseEnterHandler=this.handleMouseEnter.bind(this),this.mouseLeaveHandler=this.handleMouseLeave.bind(this),L.DomEvent.on(e,"click",(function(){if(this.isExporting){if(this.mouseLeaveSkip)return;this.resetState(),this.detachMouseEventListeners(e),t.cancelExport()}else this.isExporting=!0,this.renderExportIcon(),setTimeout(this.attachMouseEventListeners.bind(this,e),100),t.runExporter().then(function(){this.resetState(),this.detachMouseEventListeners(e)}.bind(this))}),this)}},resetState:function(){this.renderDownloadIcon(),this.isExporting=!1,this.mouseLeaveSkip=!0},attachMouseEventListeners:function(t){t.addEventListener("mouseenter",this.mouseEnterHandler),t.addEventListener("mouseleave",this.mouseLeaveHandler)},detachMouseEventListeners:function(t){t.removeEventListener("mouseenter",this.mouseEnterHandler),t.removeEventListener("mouseleave",this.mouseLeaveHandler)},handleMouseEnter:function(){this.renderCancelIcon()},handleMouseLeave:function(){this.mouseLeaveSkip?this.mouseLeaveSkip=!1:this.renderExportIcon()},renderDownloadIcon:function(){L.IconUtil.toggleXlink(this._link,"get_app","spinner"),L.IconUtil.toggleTitle(this._link,"Export Images","Loading..."),L.DomUtil.removeClass(this._link.firstChild,"loader")},renderExportIcon:function(){L.IconUtil.toggleXlink(this._link,"spinner"),L.IconUtil.toggleTitle(this._link,"Export Images","Loading..."),L.IconUtil.addClassToSvg(this._link,"loader")},renderCancelIcon:function(){L.IconUtil.toggleXlink(this._link,"cancel"),L.IconUtil.toggleTitle(this._link,"Cancel Export","Loading..."),L.DomUtil.removeClass(this._link.firstChild,"loader")}})},74:function(){L.FreeRotateAction=L.EditAction.extend({initialize:function(t,e,i){(i=i||{}).toolbarIcon={svg:!0,html:"crop_rotate",tooltip:e.options.translation.freeRotateImage,className:"freeRotate"},L.DistortableImage.action_map.f="_freeRotateMode",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){this._overlay.editing._freeRotateMode()}})},691:function(){L.GeolocateAction=L.EditAction.extend({initialize:function(t,e,i){var o=e.editing;(i=i||{}).toolbarIcon={svg:!0,html:"explore",tooltip:e.options.translation.geolocateImage,className:"lock"===o._mode?"disabled":""},L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){var t=this._overlay.getElement();EXIF.getData(t,L.EXIF(t))}})},105:function(){L.LockAction=L.EditAction.extend({initialize:function(t,e,i){var o,n,a=e.editing;a instanceof L.DistortableImage.Edit?(L.DistortableImage.action_map.u="_unlock",L.DistortableImage.action_map.l="_lock",n=e.options.translation.lockMode,o=a.isMode("lock")?"lock":"unlock"):(L.DistortableImage.group_action_map.l="_lockGroup",n=e.options.translation.lockImages,o="lock"),(i=i||{}).toolbarIcon={svg:!0,html:o,tooltip:n,className:"lock"},L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){var t=this._overlay.editing;t instanceof L.DistortableImage.Edit?t._toggleLockMode():t._lockGroup()}})},944:function(){L.OpacityAction=L.EditAction.extend({initialize:function(t,e,i){var o,n,a=e.editing,s=a._mode;a._transparent?(o="opacity_empty",n=e.options.translation.makeImageOpaque):(o="opacity",n=e.options.translation.makeImageTransparent),(i=i||{}).toolbarIcon={svg:!0,html:o,tooltip:n,className:"lock"===s?"disabled":""},L.DistortableImage.action_map.o="lock"===s?"":"_toggleOpacity",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){var t=this._overlay.editing,e=this._link;L.IconUtil.toggleXlink(e,"opacity","opacity_empty"),L.IconUtil.toggleTitle(e,"Make Image Transparent","Make Image Opaque"),t._toggleOpacity()}})},954:function(){L.RestoreAction=L.EditAction.extend({initialize:function(t,e,i){var o=L.Utils.getNestedVal(e,"editing","_mode"),n=e.edited;(i=i||{}).toolbarIcon={svg:!0,html:"restore",tooltip:e.options.translation.restoreImage,className:n&&"lock"!==o?"":"disabled"},L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){var t=this._overlay;L.DomEvent.on(t,{edit:this._enableAction,restore:this._disableAction},this),t.restore()}})},178:function(){L.RotateAction=L.EditAction.extend({initialize:function(t,e,i){(i=i||{}).toolbarIcon={svg:!0,html:"rotate",tooltip:e.options.translation.rotateImage,className:"rotate"},L.DistortableImage.action_map.r="_rotateMode",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){this._overlay.editing._rotateMode()}})},547:function(){L.ScaleAction=L.EditAction.extend({initialize:function(t,e,i){(i=i||{}).toolbarIcon={svg:!0,html:"scale",tooltip:e.options.translation.scaleImage,className:"scale"},L.DistortableImage.action_map.s="_scaleMode",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){this._overlay.editing._scaleMode()}})},886:function(){L.StackAction=L.EditAction.extend({initialize:function(t,e,i){var o,n,a=e.editing;a._toggledImage?(o="flip_to_back",n=e.options.translation.stackToFront):(o="flip_to_front",n=e.options.translation.stackToBack),(i=i||{}).toolbarIcon={svg:!0,html:o,tooltip:n,className:"lock"===a._mode?"disabled":""},L.DistortableImage.action_map.q="lock"===a._mode?"":"_stackUp",L.DistortableImage.action_map.a="lock"===a._mode?"":"_stackDown",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){var t=this._overlay.editing;L.IconUtil.toggleXlink(this._link,"flip_to_front","flip_to_back"),L.IconUtil.toggleTitle(this._link,"Stack to Front","Stack to Back"),t._toggleOrder()}})},129:function(){L.UnlockAction=L.EditAction.extend({initialize:function(t,e,i){(i=i||{}).toolbarIcon={svg:!0,html:"unlock",tooltip:e.options.translation.unlockImages},L.DistortableImage.group_action_map.u="_unlockGroup",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){this._overlay.editing._unlockGroup()}})},743:function(){L.EXIF=function(t){if(0!==Object.keys(EXIF.getAllTags(t)).length){console.log(EXIF.getAllTags(t));var e=EXIF.getAllTags(t);void 0!==e.GPSLatitude&&void 0!==e.GPSLongitude&&(e.GPSLatitude[0],e.GPSLatitude[1],e.GPSLatitude[2],e.GPSLongitude[0],e.GPSLongitude[1],e.GPSLongitude[2],e.GPSLatitudeRef,e.GPSLongitudeRef),"T"===e.GPSImgDirectionRef||"M"===e.GPSImgDirectionRef?(Math.PI,e.GPSImgDirection.numerator,e.GPSImgDirection.denominator):console.log("No compass data found"),console.log("Orientation:",e.Orientation),(6===e.Orientation||8===e.Orientation||3===e.Orientation)&&Math.PI,void 0!==e.GPSAltitude&&void 0!==e.GPSAltitudeRef&&void 0!==e.GPSAltitude&&void 0!==e.GPSAltitudeRef&&(e.GPSAltitude.numerator,e.GPSAltitude.denominator,e.GPSAltitudeRef)}else alert("EXIF initialized. Press again to view data in console.")}},92:function(){L.DistortHandle=L.EditHandle.extend({options:{TYPE:"distort",icon:L.icon({iconUrl:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAChSURBVO3BIU4DURgGwNkvL2B6AkQTLBqP4QCoSm7DDXoBLBZHDbfgICAIZjEV3YTn9uVHdMZZtcnCfI13bIzxg0emg6Nm6QVbYz3jylEsXRrvwommb49X67jFkz80fR9Mb1YxTzqiWBSLYlEsikWxKBbFolgUi2JRLIpFsSgWxaJY03fHHOu40dH07bAzWCx9Ge/TiWbpHgdsjPGNB2f/yS+7xRCyiiZPJQAAAABJRU5ErkJggg==",iconSize:[32,32],iconAnchor:[16,16]})},_onHandleDrag:function(){this._handled.setCorner(this._corner,this.getLatLng())},updateHandle:function(){this.setLatLng(this._handled.getCorner(this._corner))}}),L.distortHandle=function(t,e,i){return new L.DistortHandle(t,e,i)}},194:function(){L.DragHandle=L.EditHandle.extend({options:{TYPE:"drag",icon:L.icon({iconUrl:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAsVJREFUeNrMVztLXEEUvnNVFAVBAhY2aRKbTZEHJNpYabuNjSgYg/GxdsmPSJkUAa/ZdVEX8mgWYVutbHxAHkVskjQBuUUgBISVhCQk3wnfwMlk1rusN1wHPubOzJlzvjlz5sxc01Ma/hUEwQnwDIjqc7uvgv9YYO86qgIwCXQbdNTlQ8kcCBHgBch8TcloF6oJGr6phk6EQAkfdz3zvgDr9Mr7Fg1fptEZoM8jsmrokpfsiIFO4IIjuE2v1EDmR4LRdlR5Gh51hj8D34ABtm8YTtqna0TgklIw5CgQguKxIojEjmFROg/MKQO27NkFAB+4wAPouGUJiIvWKHwbAxX2XyWRKWkqhT+pbJntJZJuUzISW0+5hW+obxrVBsfvoH/dqCCJuU97GBh2VteLSiYvArmErT8EVoAK9Bw7enbpVYmvAQlyowYforrH5jXL2rPHI/TKONDB7u9AlavdaTBPvPmazUeQuy8f7UomUgTEwIJPEQ3sQGE/6ll2l9H/KcEzBcfWn2IclluM3DpddJxSHujlFkscbUPvmB0LHVnLrId7nlaZVkEc6QGXQI1MAwZcWmVRHeNaQwJMMiU2cwy4s7p/RJ2ckpvIQs+cIs+5GzitloLKHUV3MPREuXbTOKO91dX387gGTONxIgEWm+E61FFrpcyqXLHsEwiDjEsjAksqw5XPoL9MHVrn6QR4q+XZrDaR4RoWzq2ymafuRA/Mq1stSsHLVkcbdf9VjOcx8ZH3+SFWcCWlVPyWuUBOwUWdC1wP5NVjYiXFWLO69PZ6CRTUY6KSIoEKdf6T3IzzgHxnsyHctNBEkmn6Oob8ExUDg/ahGybd177cDjzH5xHwgDiSvoS7I/LZyvxJZj0wod7tkX5G0XVC7rEyLhfLJjBGbKoLLEfZWObyKeZ6oY82g+yf5Zn/mJyHX7PMf04z/T3/LcAAu4E6iiyJqf0AAAAASUVORK5CYII=",iconSize:[32,32],iconAnchor:[16,16]})},_onHandleDrag:function(){var t=this._handled,e=t.getCorner(this._corner),i=this.getLatLng();t.dragBy(e,i)},updateHandle:function(){this.setLatLng(this._handled.getCorner(this._corner))}}),L.dragHandle=function(t,e,i){return new L.DragHandle(t,e,i)}},988:function(){L.EditHandle=L.Marker.extend({initialize:function(t,e,i){var o=t.getCorner(e);L.setOptions(this,i),this._handled=t,this._corner=e;var n={draggable:!0,zIndexOffset:10};i&&i.hasOwnProperty("draggable")&&(n.draggable=i.draggable),L.Marker.prototype.initialize.call(this,o,n)},onAdd:function(t){L.Marker.prototype.onAdd.call(this,t),this._bindListeners(),this.updateHandle()},onRemove:function(t){this._unbindListeners(),L.Marker.prototype.onRemove.call(this,t)},_onHandleDragStart:function(){this._handled.fire("editstart")},_onHandleDragEnd:function(){this._fireEdit()},_fireEdit:function(){this._handled.edited=!0,this._handled.fire("edit")},_bindListeners:function(){this.on({contextmenu:L.DomEvent.stop,dragstart:this._onHandleDragStart,drag:this._onHandleDrag,dragend:this._onHandleDragEnd},this),this._handled._map.on("zoomend",this.updateHandle,this),this._handled.on("update",this.updateHandle,this)},_unbindListeners:function(){this.off({contextmenu:L.DomEvent.stop,dragstart:this._onHandleDragStart,drag:this._onHandleDrag,dragend:this._onHandleDragEnd},this),this._handled._map.off("zoomend",this.updateHandle,this),this._handled.off("update",this.updateHandle,this)},_calculateScalingFactor:function(t,e){var i=this._handled,o=i._map,n=o.latLngToLayerPoint(i.getCenter()),a=o.latLngToLayerPoint(t),s=o.latLngToLayerPoint(e),r=this._d2(n,a),l=this._d2(n,s);return Math.sqrt(l/r)},_d2:function(t,e){var i=t.x-e.x,o=t.y-e.y;return Math.pow(i,2)+Math.pow(o,2)},calculateAngleDelta:function(t,e){var i=this._handled,o=i._map,n=o.latLngToLayerPoint(i.getCenter()),a=o.latLngToLayerPoint(t),s=o.latLngToLayerPoint(e),r=Math.atan2(n.y-a.y,n.x-a.x);return Math.atan2(n.y-s.y,n.x-s.x)-r}})},206:function(){L.FreeRotateHandle=L.EditHandle.extend({options:{TYPE:"freeRotate",icon:L.icon({iconUrl:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAHiSURBVMXBa3HbShgA0PMp/1sCCo8oCEpgTaCXgIXAJiDzyCJoAUTm4UVQAns1Y8+snWnTvJyeE16hkjDgDrfoNTMKcpC9UPiLSo8JyetkjEHxjPCMyoS199kFoz8Iv1HpMaN3qWDCHoegOKkkRwnJpRmroHgiPFEZ8IBekzEGxQtUEhKSS/fB7Ew4U+lxcGkVZG9QWWPSFAxBcdK59KApuA+yNwp2uEdx1GN25sZJZULSfAtm77SlbNjju6MvG75u+WHRWVR6rDVjMPsgwYyVZl3pLTpHkyYHOx8syMiayaJzlDTZ9YyaZNFVkiYH2ZUEBcVJJXVImuz6Js3Qofe59pq7DoOTILu+g+a288mCouk7/1iH4qTS+2QdDppbV1ZJmrnDXnPnc5UOs2Z0fUmTuyBr+krvSioJyUmQO0dZM7mepMkWnaNRkyrJB6uskTSjxY3Fll8bvmJwlDb83FJ8gMqAB80uyBY3Trb82PAfvjj6vuHnluIdKgMeNXOwctK5NKBoHitrb1RJeHRp5Ux4ojLg0aWMHGQvUOkxIWkKVsHsTPiNSo8HDC5lZIsgO6n0uMUdRvQuFQxB8UR4RmXC2vvsgtEfhL+o9JiQvE7GGBTPCK9QSUjoMWgKDthjDrIX+h/k0I7gth6N5gAAAABJRU5ErkJggg==",iconSize:[32,32],iconAnchor:[16,16]})},_onHandleDrag:function(){var t=this._handled,e=t._map,i=t.getCorner(this._corner),o=this.getLatLng(),n=this.calculateAngleDelta(i,o),a=this._calculateScalingFactor(i,o);0!==n&&t.rotateBy(n,"rad");var s=t.edgeMinWidth;s||(s=50);var r=e.latLngToContainerPoint(t.getCorner(0)),l=e.latLngToContainerPoint(t.getCorner(1)),c=Math.abs(r.x-l.x),d=Math.abs(r.y-l.y);Math.sqrt(c*c+d*d)>s||a>1?t.scaleBy(a):t.scaleBy(1)},updateHandle:function(){this.setLatLng(this._handled.getCorner(this._corner))}}),L.freeRotateHandle=function(t,e,i){return new L.FreeRotateHandle(t,e,i)}},789:function(){L.LockHandle=L.EditHandle.extend({options:{TYPE:"lock",interactive:!1,icon:L.icon({iconUrl:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAD8SURBVO3BPU7CYAAA0AdfjIcQlRCQBG7C3gk2uIPG2RC3Dk16Gz0FTO1WZs/gwGCMP/2+xsSl7+n1er1Iz9LtRQjaPeMeO+TinLDCJV78YqjdA04YodKuxhUaPGoRxMmxwRQZSt87Yo4KExGCeAUyLLFB4bMacxywEClIU2KDKXbInTUYo8JCgoFuGoxQO5uiwY1EA91VmDqrcKeDoX8WdNNgjApvmGGLXKIgXY0xGkxQYItrrFFIEKQ5Yo4KEx9yrDFDhlKkIF6NOQ5Y+KpAhiXWKEQI4pxwiwoLPyuxwQw75FoE7fZYocFEuwI7jHCBV39gL92TXq/Xi/AOcmczZmaIMScAAAAASUVORK5CYII=",iconSize:[32,32],iconAnchor:[16,16]})},onRemove:function(t){this.unbindTooltip(),L.EditHandle.prototype.onRemove.call(this,t)},_bindListeners:function(){var t=this.getElement();L.EditHandle.prototype._bindListeners.call(this),L.DomEvent.on(t,{mousedown:this._tooltipOn,mouseup:this._tooltipOff},this),L.DomEvent.on(document,"pointerleave",this._tooltipOff,this)},_unbindListeners:function(){var t=this.getElement();L.EditHandle.prototype._bindListeners.call(this),L.DomEvent.off(t,{mousedown:this._tooltipOn,mouseup:this._tooltipOff},this),L.DomEvent.off(document,"pointerleave",this._tooltipOff,this)},_onHandleDrag:function(){},updateHandle:function(){this.setLatLng(this._handled.getCorner(this._corner))},_tooltipOn:function(t){var e=this._handled.parentGroup,i=e?e.editing:this._handled.editing;if(!t.shiftKey&&(this._handled.isSelected()||!e||e.isCollected(this._handled))){var o=i._lockHandles;this._timer=setTimeout(L.bind((function(){this._timeout&&clearTimeout(this._timeout),this.getTooltip()?o.eachLayer((function(t){this!==t&&t.closeTooltip()})):this.bindTooltip("Locked!",{permanent:!0}),this.openTooltip()}),this),500)}},_tooltipOff:function(t){var e=this._handled.parentGroup,i=e?e.editing:this._handled.editing;if(!t.shiftKey&&(this._handled.isSelected()||!e||e.isCollected(this._handled))){var o=i._lockHandles;t.currentTarget===document&&o.eachLayer((function(t){t.closeTooltip()})),this._timer&&clearTimeout(this._timer),this._timeout=setTimeout(L.bind((function(){this.closeTooltip()}),this),400)}}}),L.lockHandle=function(t,e,i){return new L.LockHandle(t,e,i)}},337:function(){L.RotateHandle=L.EditHandle.extend({options:{TYPE:"rotate",icon:L.icon({iconUrl:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAHiSURBVMXBa3HbShgA0PMp/1sCCo8oCEpgTaCXgIXAJiDzyCJoAUTm4UVQAns1Y8+snWnTvJyeE16hkjDgDrfoNTMKcpC9UPiLSo8JyetkjEHxjPCMyoS199kFoz8Iv1HpMaN3qWDCHoegOKkkRwnJpRmroHgiPFEZ8IBekzEGxQtUEhKSS/fB7Ew4U+lxcGkVZG9QWWPSFAxBcdK59KApuA+yNwp2uEdx1GN25sZJZULSfAtm77SlbNjju6MvG75u+WHRWVR6rDVjMPsgwYyVZl3pLTpHkyYHOx8syMiayaJzlDTZ9YyaZNFVkiYH2ZUEBcVJJXVImuz6Js3Qofe59pq7DoOTILu+g+a288mCouk7/1iH4qTS+2QdDppbV1ZJmrnDXnPnc5UOs2Z0fUmTuyBr+krvSioJyUmQO0dZM7mepMkWnaNRkyrJB6uskTSjxY3Fll8bvmJwlDb83FJ8gMqAB80uyBY3Trb82PAfvjj6vuHnluIdKgMeNXOwctK5NKBoHitrb1RJeHRp5Ux4ojLg0aWMHGQvUOkxIWkKVsHsTPiNSo8HDC5lZIsgO6n0uMUdRvQuFQxB8UR4RmXC2vvsgtEfhL+o9JiQvE7GGBTPCK9QSUjoMWgKDthjDrIX+h/k0I7gth6N5gAAAABJRU5ErkJggg==",iconSize:[32,32],iconAnchor:[16,16]})},_onHandleDrag:function(){var t=this._handled,e=t.getCorner(this._corner),i=this.getLatLng(),o=this.calculateAngleDelta(e,i);t.rotateBy(o,"rad")},updateHandle:function(){this.setLatLng(this._handled.getCorner(this._corner))}}),L.rotateHandle=function(t,e,i){return new L.RotateHandle(t,e,i)}},350:function(){L.ScaleHandle=L.EditHandle.extend({options:{TYPE:"scale",icon:L.icon({iconUrl:"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2ZXJzaW9uPSIxLjEiIHdpZHRoPSI0NTkiIGhlaWdodD0iNDY0IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCA1MTIgNTEyIiB4bWw6c3BhY2U9InByZXNlcnZlIiBzdHlsZT0iIj48cmVjdCBpZD0iYmFja2dyb3VuZHJlY3QiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIHg9IjAiIHk9IjAiIGZpbGw9Im5vbmUiIHN0cm9rZT0ibm9uZSIgY2xhc3M9IiIgc3R5bGU9IiIvPjxnIGNsYXNzPSJjdXJyZW50TGF5ZXIiIHN0eWxlPSIiPjx0aXRsZT5MYXllciAxPC90aXRsZT48cGF0aCBkPSJNNDU5LjA0OTE1OTUzMDQ3MTM0LDg2LjkyNjIzNDUxMjU1MDAyIFYwIGgtODUuNzE0NTczMzU2MzEyMDkgdjI3LjA0MzcxNzQwMzkwNDQ1MiBIODUuNzE0NTczMzU2MzEyMDMgVjAgSDAgdjg2LjkyNjIzNDUxMjU1MDAyIGgyNS43MTQzNzIwMDY4OTM2MjYgdjI4OS43NTQxMTUwNDE4MzM0IEgwIHY4Ni45MjYyMzQ1MTI1NTAwMiBoODUuNzE0NTczMzU2MzEyMDkgdi0yNy4wNDM3MTc0MDM5MDQ0NTIgaDI4NS43MTUyNDQ1MjEwNDAzIHYyNy4wNDM3MTc0MDM5MDQ0NTIgaDg1LjcxNDU3MzM1NjMxMjA5IHYtODYuOTI2MjM0NTEyNTUwMDIgaC0yMy44MDk2MDM3MTAwODY2OSBWODYuOTI2MjM0NTEyNTUwMDIgSDQ1OS4wNDkxNTk1MzA0NzEzNCB6TTM4NC43NjMxOTU5NTUwMDA5LDEyLjU1NjAxMTY1MTgxMjc4MSBoNjEuOTA0OTY5NjQ2MjI1Mzk2IHY2Mi43ODAwNTgyNTkwNjM5MSBoLTYxLjkwNDk2OTY0NjIyNTM5NiBWMTIuNTU2MDExNjUxODEyNzgxIHpNMTIuMzgwOTkzOTI5MjQ1MDUsMTIuNTU2MDExNjUxODEyNzgxIGg2MS45MDQ5Njk2NDYyMjUzOTYgdjYyLjc4MDA1ODI1OTA2MzkxIEgxMi4zODA5OTM5MjkyNDUwNSBWMTIuNTU2MDExNjUxODEyNzgxIHpNNzQuMjg1OTYzNTc1NDcwNTMsNDUxLjA1MDU3MjQxNTEyMDY2IEgxMi4zODA5OTM5MjkyNDUwNSB2LTYyLjc4MDA1ODI1OTA2MzkxIGg2MS45MDQ5Njk2NDYyMjUzOTYgVjQ1MS4wNTA1NzI0MTUxMjA2NiB6TTQ0NS43MTU3ODE0NTI4MjI3NCw0NTEuMDUwNTcyNDE1MTIwNjYgaC02Mi44NTczNTM3OTQ2Mjg4NjQgdi02Mi43ODAwNTgyNTkwNjM5MSBoNjIuODU3MzUzNzk0NjI4ODY0IFY0NTEuMDUwNTcyNDE1MTIwNjYgek00MDcuNjIwNDE1NTE2Njg0MjYsMzc2LjY4MDM0OTU1NDM4MzQ0IGgtMzYuMTkwNTk3NjM5MzMxNzcgdjMyLjgzODc5OTcwNDc0MTEyIEg4NS43MTQ1NzMzNTYzMTIwMyB2LTMyLjgzODc5OTcwNDc0MTEyIEg0OS41MjM5NzU3MTY5ODAzMiBWODYuOTI2MjM0NTEyNTUwMDIgaDM2LjE5MDU5NzYzOTMzMTc3IFY1MC4yMjQwNDY2MDcyNTExMjUgaDI4Ny42MjAwMTI4MTc4NDcyIHYzNi43MDIxODc5MDUyOTg5IGgzNC4yODU4MjkzNDI1MjQ4MzUgVjM3Ni42ODAzNDk1NTQzODM0NCB6IiBpZD0ic3ZnXzIiIGNsYXNzPSIiIGZpbGw9IiMxYTFhZWIiIGZpbGwtb3BhY2l0eT0iMSIvPjwvZz48L3N2Zz4=",iconSize:[32,32],iconAnchor:[16,16]})},_onHandleDrag:function(){var t=this._handled,e=t._map,i=t.edgeMinWidth,o=t.getCorner(this._corner),n=this.getLatLng(),a=this._calculateScalingFactor(o,n);i||(i=50);var s=e.latLngToLayerPoint(t.getCorner(0)),r=e.latLngToLayerPoint(t.getCorner(1)),l=Math.abs(s.x-r.x),c=Math.abs(s.y-r.y);Math.sqrt(l*l+c*c)>i||a>1?t.scaleBy(a):t.scaleBy(1)},updateHandle:function(){this.setLatLng(this._handled.getCorner(this._corner))}}),L.scaleHandle=function(t,e,i){return new L.ScaleHandle(t,e,i)}},719:function(){L.distortableImage=L.DistortableImage||{},L.distortableImage=L.DistortableImage,L.DistortableImage.group_action_map={},L.DistortableImage.ControlBar=L.Toolbar2.Control.extend({}),L.distortableImage.controlBar=function(t){return new L.DistortableImage.ControlBar(t)},L.DistortableCollection.addInitHook((function(){this.ACTIONS=[L.ExportAction,L.DeleteAction,L.LockAction,L.UnlockAction],L.DistortableCollection.Edit.MODES={lock:L.LockAction,unlock:L.UnlockAction};var t=this.options.actions?this.options.actions:this.ACTIONS;this.editing=L.distortableCollection.edit(this,{actions:t})}))},93:function(){L.DistortableImage=L.DistortableImage||{},L.distortableImage=L.DistortableImage,L.DistortableImage.action_map={},L.DistortableImage.PopupBar=L.Toolbar2.Popup.extend({options:{anchor:[0,-10]},initialize:function(t,e){L.setOptions(this,e),L.Toolbar2.Popup.prototype.initialize.call(this,t,e)},addHooks:function(t,e){this.map=t,this.ov=e},tools:function(){if(this._ul)return this._ul.children},clickTool:function(t){for(var e=this.tools(),i=0;i',_symbols:"",render:function(){return this.addSymbols(this._symbols),this._svg},addSymbols:function(t){this._svg+=t}})},261:function(){L.KeymapperIconSet=L.IconSet.extend({_symbols:''})},929:function(){L.ToolbarIconSet=L.IconSet.extend({_symbols:''})},496:function(){L.Map.mergeOptions({boxCollector:!0,boxZoom:!1}),L.Map.BoxCollector=L.Map.BoxZoom.extend({initialize:function(t){this._map=t,this._container=t._container,this._pane=t._panes.overlayPane,this._resetStateTimeout=0,t.on("unload",this._destroy,this)},addHooks:function(){L.DomEvent.on(this._container,"mousedown",this._onMouseDown,this)},removeHooks:function(){L.DomEvent.off(this._container,"mousedown",this._onMouseDown,this)},moved:function(){return this._moved},_destroy:function(){L.DomUtil.remove(this._pane),delete this._pane},_resetState:function(){this._resetStateTimeout=0,this._moved=!1},_clearDeferredResetState:function(){0!==this._resetStateTimeout&&(clearTimeout(this._resetStateTimeout),this._resetStateTimeout=0)},_onMouseDown:function(t){if(!t.shiftKey||1!==t.which&&1!==t.button)return!1;this._clearDeferredResetState(),this._resetState(),L.DomUtil.disableTextSelection(),L.DomUtil.disableImageDrag(),this._startPoint=this._map.mouseEventToContainerPoint(t),L.DomEvent.on(document,{contextmenu:L.DomEvent.stop,mousemove:this._onMouseMove,mouseup:this._onMouseUp},this)},_onMouseMove:function(t){this._moved||(this._moved=!0,this._box=L.DomUtil.create("div","leaflet-zoom-box",this._container),L.DomUtil.addClass(this._container,"leaflet-crosshair"),this._map.fire("boxzoomstart")),this._point=this._map.mouseEventToContainerPoint(t),this._bounds=L.bounds(this._startPoint,this._point);var e=this._bounds.getSize();L.DomUtil.setPosition(this._box,this._bounds.min),this._box.style.width=e.x+"px",this._box.style.height=e.y+"px"},_finish:function(){this._moved&&(L.DomUtil.remove(this._box),L.DomUtil.removeClass(this._container,"leaflet-crosshair")),L.DomUtil.enableTextSelection(),L.DomUtil.enableImageDrag(),L.DomEvent.off(document,{contextmenu:L.DomEvent.stop,mousemove:this._onMouseMove,mouseup:this._onMouseUp},this)},_onMouseUp:function(t){if((1===t.which||1===t.button)&&(this._finish(),this._moved)){this._clearDeferredResetState(),this._resetStateTimeout=setTimeout(L.Util.bind(this._resetState,this),0);var e=L.latLngBounds(this._map.containerPointToLatLng(this._bounds.getBottomLeft()),this._map.containerPointToLatLng(this._bounds.getTopRight())),i=this._map.getZoom(),o=this._map.getCenter();e=this._map._latLngBoundsToNewLayerBounds(e,i,o),this._map.fire("boxcollectend",{boxCollectBounds:e})}}}),L.Map.addInitHook("addHandler","boxCollector",L.Map.BoxCollector)},291:function(){L.Map.mergeOptions({doubleClickLabels:!0}),L.Map.DoubleClickLabels=L.Map.DoubleClickZoom.extend({enable:function(){var t=this._map;return this._enabled||(t.doubleClickZoom.enabled()&&t.doubleClickZoom.disable(),this._map.fire("singleclickon"),this._enabled=!0,this.addHooks()),this},disable:function(){return this._enabled?(this._enabled=!1,this.removeHooks(),this):this},_fireIfSingle:function(t){var e=this._map,i=t.originalEvent;i&&i.shiftKey||(e._clicked+=1,this._map._clickTimeout=setTimeout((function(){1===e._clicked?(e._clicked=0,e.fire("singleclick",{type:"singleclick"})):L.Browser.touch&&i&&i.sourceCapabilities.firesTouchEvents&&e.fire("dblclick")}),250))},_onDoubleClick:function(){var t=this._map,e=t._labels;setTimeout((function(){t._clicked=0,clearTimeout(t._clickTimeout)}),0),e&&(1===e.options.opacity?(e.options.opacity=0,e.setOpacity(0)):(e.options.opacity=1,e.setOpacity(1)))}}),L.Map.addInitHook("addHandler","doubleClickLabels",L.Map.DoubleClickLabels)},752:function(){L.Map.DoubleClickZoom.include({addHooks:function(){this._map.on({click:this._fireIfSingle,dblclick:this._onDoubleClick},this)},removeHooks:function(){this._map.off({click:this._fireIfSingle,dblclick:this._onDoubleClick},this)},enable:function(){return this._enabled||this._map.doubleClickLabels&&this._map.doubleClickLabels.enabled()||(this._map.fire("singleclickon"),this._enabled=!0,this.addHooks()),this},disable:function(){return this._enabled?(this._map.fire("singleclickoff"),this._enabled=!1,this.removeHooks(),this):this},_fireIfSingle:function(t){var e=this._map,i=t.originalEvent;i&&i.shiftKey||(e._clicked+=1,this._map._clickTimeout=setTimeout((function(){1===e._clicked?(e._clicked=0,e.fire("singleclick",{type:"singleclick"})):L.Browser.touch&&i&&i.sourceCapabilities.firesTouchEvents&&e._fireDOMEvent(i,"dblclick",[e])}),250))},_onDoubleClick:function(t){var e=this._map,i=t.originalEvent;if(setTimeout((function(){e._clicked=0,clearTimeout(e._clickTimeout)}),0),!i)return!1;var o=e.getZoom(),n=e.options.zoomDelta,a=i.shiftKey?o-n:o+n;"center"===e.options.doubleClickZoom?e.setZoom(a):e.setZoomAround(t.containerPoint,a)}})},131:function(){L.Map.include({_clicked:0,addGoogleMutant:function(t){return(t=this.mutantOptions=L.extend({mutantOpacity:.8,maxZoom:24,maxNativeZoom:20,minZoom:0,labels:!0,labelOpacity:1,doubleClickLabels:!0},t)).labels||(this.mutantOptions=L.extend(this.mutantOptions,{labelOpacity:t.labels?1:void 0,doubleClickLabels:!!t.labels||void 0})),this._googleMutant=L.tileLayer("http://mt0.google.com/vt/lyrs=s&x={x}&y={y}&z={z}",{maxZoom:t.maxZoom,maxNativeZoom:t.maxNativeZoom,minZoom:t.minZoom,opacity:t.mutantOpacity}).addTo(this),t.labels?this._addLabels(t):this.doubleClickLabels=void 0,this},_addLabels:function(t){return 0!==t.labelOpacity&&1!==t.labelOpacity&&(t.labelOpacity=1),this._labels=L.tileLayer("https://stamen-tiles-{s}.a.ssl.fastly.net/toner-labels/{z}/{x}/{y}{r}.{ext}",{attribution:'Map tiles by Stamen Design, CC BY 3.0 — Map data © OpenStreetMap contributors',subdomains:"abcd",interactive:!1,opacity:t.labelOpacity,maxZoom:t.maxZoom,maxNativeZoom:t.maxNativeZoom,minZoom:t.minZoom,ext:"png"}).addTo(this),this.mutantOptions.doubleClickLabels&&this.doubleClickLabels.enable(),this}}),L.Map.addInitHook((function(){this.doubleClickLabels.disable(),this.doubleClickZoom.enable()}))},999:function(){L.DomUtil=L.extend(L.DomUtil,{initTranslation:function(t){this.translation=t},getMatrixString:function(t){var e=L.Browser.webkit3d||L.Browser.gecko3d||L.Browser.ie3d,i=[t[0],t[3],0,t[6],t[1],t[4],0,t[7],0,0,1,0,t[2],t[5],0,t[8]],o=e?"matrix3d("+i.join(",")+")":"";return e||console.log("Your browser must support 3D CSS transformsin order to use DistortableImageOverlay."),o},toggleClass:function(t,e){var i=e;return this.hasClass(t,i)?this.removeClass(t,i):this.addClass(t,i)},confirmDelete:function(){return window.confirm(this.translation.confirmImageDelete)},confirmDeletes:function(t){if(1===t)return this.confirmDelete();var e,i=this.translation.confirmImagesDeletes;return e="function"==typeof i?i(t):i,window.confirm(e)}})},85:function(){L.IconUtil={create:function(t){return/^#/.test(t)&&(t=t.replace(/^#/,"")),''},addClassToSvg:function(t,e){var i=t.querySelector("svg");i&&L.DomUtil.addClass(i,e)},toggleXlink:function(t,e,i){/^#/.test(e)||(e="#"+e),/^#/.test(i)||(i="#"+i);var o=t.querySelector("use");if(o){var n=o.getAttribute("xlink:href")===e?i:e;return o.setAttribute("xlink:href",n),n}return!1},toggleTitle:function(t,e,i){var o=t.getAttribute("title")===e?i:e;return t.setAttribute("title",o),t.hasAttribute("aria-label")&&t.setAttribute("aria-label",o),o}}},351:function(){L.ImageUtil={getCmPerPixel:function(t){var e=t._map;return 100*e.latLngToLayerPoint(t.getCorner(0)).distanceTo(e.latLngToLayerPoint(t.getCorner(1)))/t.getElement().width}}},360:function(){L.MatrixUtil={adj:function(t){return[t[4]*t[8]-t[5]*t[7],t[2]*t[7]-t[1]*t[8],t[1]*t[5]-t[2]*t[4],t[5]*t[6]-t[3]*t[8],t[0]*t[8]-t[2]*t[6],t[2]*t[3]-t[0]*t[5],t[3]*t[7]-t[4]*t[6],t[1]*t[6]-t[0]*t[7],t[0]*t[4]-t[1]*t[3]]},multmm:function(t,e){var i,o=[];for(i=0;i<3;i++)for(var n=0;n<3;n++){for(var a=0,s=0;s<3;s++)a+=t[3*i+s]*e[3*s+n];o[3*i+n]=a}return o},multmv:function(t,e){return[t[0]*e[0]+t[1]*e[1]+t[2]*e[2],t[3]*e[0]+t[4]*e[1]+t[5]*e[2],t[6]*e[0]+t[7]*e[1]+t[8]*e[2]]},multsm:function(t,e){for(var i=[],o=0,n=e.length;o2&&void 0!==arguments[2]?arguments[2]:"deg";return"deg"===i?this.radiansToDegrees(Math.atan2(e,t)):Math.atan2(e,t)},radiansToDegrees:function(t){return 180*t/Math.PI},degreesToRadians:function(t){return t*Math.PI/180}}},866:function(){L.Utils={initTranslation:function(){var t={deleteImage:"Delete Image",deleteImages:"Delete Images",distortImage:"Distort Image",dragImage:"Drag Image",exportImage:"Export Image",exportImages:"Export Images",removeBorder:"Remove Border",addBorder:"Add Border",freeRotateImage:"Free rotate Image",geolocateImage:"Geolocate Image",lockMode:"Lock Mode",lockImages:"Lock Images",makeImageOpaque:"Make Image Opaque",makeImageTransparent:"Make Image Transparent",restoreImage:"Restore Natural Image",rotateImage:"Rotate Image",scaleImage:"Scale Image",stackToFront:"Stack to Front",stackToBack:"Stack to Back",unlockImages:"Unlock Images",confirmImageDelete:"Are you sure? This image will be permanently deleted from the map.",confirmImagesDeletes:"Are you sure? These images will be permanently deleted from the map."};if(this.options.translation)for(var e in t)this.options.translation.hasOwnProperty(e)||(this.options.translation[e]=t[e]);else this.options.translation=t;L.DomUtil.initTranslation(this.options.translation)},getNestedVal:function(t,e,i){return[e,i].reduce((function(t,e){return t&&t[e]}),t)}}}};t[999](),t[85](),t[351](),t[360](),t[682](),t[866](),t[477](),t[808](),t[743](),t[988](),t[92](),t[194](),t[206](),t[789](),t[337](),t[350](),t[376](),t[261](),t[929](),t[280](),t[426](),t[114](),t[231](),t[541](),t[149](),t[74](),t[691](),t[105](),t[944](),t[954](),t[178](),t[547](),t[886](),t[129](),t[93](),t[719](),t[397](),t[428](),t[782](),t[752](),t[496](),t[291](),t[131]()}(); +/******/ (function() { // webpackBootstrap +/******/ var __webpack_modules__ = ({ + +/***/ "./node_modules/ansi-html-community/index.js": +/*!***************************************************!*\ + !*** ./node_modules/ansi-html-community/index.js ***! + \***************************************************/ +/***/ (function(module) { + +"use strict"; + + +module.exports = ansiHTML + +// Reference to https://github.com/sindresorhus/ansi-regex +var _regANSI = /(?:(?:\u001b\[)|\u009b)(?:(?:[0-9]{1,3})?(?:(?:;[0-9]{0,3})*)?[A-M|f-m])|\u001b[A-M]/ + +var _defColors = { + reset: ['fff', '000'], // [FOREGROUD_COLOR, BACKGROUND_COLOR] + black: '000', + red: 'ff0000', + green: '209805', + yellow: 'e8bf03', + blue: '0000ff', + magenta: 'ff00ff', + cyan: '00ffee', + lightgrey: 'f0f0f0', + darkgrey: '888' +} +var _styles = { + 30: 'black', + 31: 'red', + 32: 'green', + 33: 'yellow', + 34: 'blue', + 35: 'magenta', + 36: 'cyan', + 37: 'lightgrey' +} +var _openTags = { + '1': 'font-weight:bold', // bold + '2': 'opacity:0.5', // dim + '3': '', // italic + '4': '', // underscore + '8': 'display:none', // hidden + '9': '' // delete +} +var _closeTags = { + '23': '', // reset italic + '24': '', // reset underscore + '29': '' // reset delete +} + +;[0, 21, 22, 27, 28, 39, 49].forEach(function (n) { + _closeTags[n] = '' +}) + +/** + * Converts text with ANSI color codes to HTML markup. + * @param {String} text + * @returns {*} + */ +function ansiHTML (text) { + // Returns the text if the string has no ANSI escape code. + if (!_regANSI.test(text)) { + return text + } + + // Cache opened sequence. + var ansiCodes = [] + // Replace with markup. + var ret = text.replace(/\033\[(\d+)m/g, function (match, seq) { + var ot = _openTags[seq] + if (ot) { + // If current sequence has been opened, close it. + if (!!~ansiCodes.indexOf(seq)) { // eslint-disable-line no-extra-boolean-cast + ansiCodes.pop() + return '' + } + // Open tag. + ansiCodes.push(seq) + return ot[0] === '<' ? ot : '' + } + + var ct = _closeTags[seq] + if (ct) { + // Pop sequence + ansiCodes.pop() + return ct + } + return '' + }) + + // Make sure tags are closed. + var l = ansiCodes.length + ;(l > 0) && (ret += Array(l + 1).join('')) + + return ret +} + +/** + * Customize colors. + * @param {Object} colors reference to _defColors + */ +ansiHTML.setColors = function (colors) { + if (typeof colors !== 'object') { + throw new Error('`colors` parameter must be an Object.') + } + + var _finalColors = {} + for (var key in _defColors) { + var hex = colors.hasOwnProperty(key) ? colors[key] : null + if (!hex) { + _finalColors[key] = _defColors[key] + continue + } + if ('reset' === key) { + if (typeof hex === 'string') { + hex = [hex] + } + if (!Array.isArray(hex) || hex.length === 0 || hex.some(function (h) { + return typeof h !== 'string' + })) { + throw new Error('The value of `' + key + '` property must be an Array and each item could only be a hex string, e.g.: FF0000') + } + var defHexColor = _defColors[key] + if (!hex[0]) { + hex[0] = defHexColor[0] + } + if (hex.length === 1 || !hex[1]) { + hex = [hex[0]] + hex.push(defHexColor[1]) + } + + hex = hex.slice(0, 2) + } else if (typeof hex !== 'string') { + throw new Error('The value of `' + key + '` property must be a hex string, e.g.: FF0000') + } + _finalColors[key] = hex + } + _setTags(_finalColors) +} + +/** + * Reset colors. + */ +ansiHTML.reset = function () { + _setTags(_defColors) +} + +/** + * Expose tags, including open and close. + * @type {Object} + */ +ansiHTML.tags = {} + +if (Object.defineProperty) { + Object.defineProperty(ansiHTML.tags, 'open', { + get: function () { return _openTags } + }) + Object.defineProperty(ansiHTML.tags, 'close', { + get: function () { return _closeTags } + }) +} else { + ansiHTML.tags.open = _openTags + ansiHTML.tags.close = _closeTags +} + +function _setTags (colors) { + // reset all + _openTags['0'] = 'font-weight:normal;opacity:1;color:#' + colors.reset[0] + ';background:#' + colors.reset[1] + // inverse + _openTags['7'] = 'color:#' + colors.reset[1] + ';background:#' + colors.reset[0] + // dark grey + _openTags['90'] = 'color:#' + colors.darkgrey + + for (var code in _styles) { + var color = _styles[code] + var oriColor = colors[color] || '000' + _openTags[code] = 'color:#' + oriColor + code = parseInt(code) + _openTags[(code + 10).toString()] = 'background:#' + oriColor + } +} + +ansiHTML.reset() + + +/***/ }), + +/***/ "./src/DistortableCollection.js": +/*!**************************************!*\ + !*** ./src/DistortableCollection.js ***! + \**************************************/ +/***/ (function() { + +var arr = []; +L.DistortableCollection = L.FeatureGroup.extend({ + options: { + editable: true, + exportOpts: { + exportStartUrl: '//export.mapknitter.org/export', + statusUrl: '//export.mapknitter.org', + exportUrl: 'http://export.mapknitter.org/' + } + }, + initialize: function initialize(options) { + L.setOptions(this, options); + L.FeatureGroup.prototype.initialize.call(this, options); + L.Utils.initTranslation.call(this); + this.editable = this.options.editable; + }, + onAdd: function onAdd(map) { + L.FeatureGroup.prototype.onAdd.call(this, map); + this._map = map; + + if (this.editable) { + this.editing.enable(); + } + /** + * although we have a DistortableCollection.Edit class that handles collection events to keep our code managable, + * events that need to be added on individual images are kept here to do so through `layeradd`. + */ + + + this.on('layeradd', this._addEvents, this); + this.on('layerremove', this._removeEvents, this); + }, + onRemove: function onRemove() { + if (this.editing) { + this.editing.disable(); + } + + this.off('layeradd', this._addEvents, this); + this.off('layerremove', this._removeEvents, this); + }, + _addEvents: function _addEvents(e) { + var layer = e.layer; + L.DomEvent.on(layer, { + dragstart: this._dragStartMultiple, + drag: this._dragMultiple + }, this); + L.DomEvent.on(layer.getElement(), { + mousedown: this._deselectOthers, + + /* Enable longpress for multi select for touch devices. */ + contextmenu: this._longPressMultiSelect + }, this); + }, + _removeEvents: function _removeEvents(e) { + var layer = e.layer; + L.DomEvent.off(layer, { + dragstart: this._dragStartMultiple, + drag: this._dragMultiple + }, this); + L.DomEvent.off(layer.getElement(), { + mousedown: this._deselectOthers, + contextmenu: this._longPressMultiSelect + }, this); + }, + _longPressMultiSelect: function _longPressMultiSelect(e) { + var _this = this; + + if (!this.editable) { + return; + } + + e.preventDefault(); + this.eachLayer(function (layer) { + var edit = layer.editing; + + if (layer.getElement() === e.target && edit.enabled()) { + L.DomUtil.toggleClass(layer.getElement(), 'collected'); + + if (_this.anyCollected()) { + layer.deselect(); + + _this.editing._addToolbar(); + } else { + _this.editing._removeToolbar(); + } + } + }); + }, + isCollected: function isCollected(overlay) { + return L.DomUtil.hasClass(overlay.getElement(), 'collected'); + }, + anyCollected: function anyCollected() { + var layerArr = this.getLayers(); + return layerArr.some(this.isCollected.bind(this)); + }, + _toggleCollected: function _toggleCollected(e, layer) { + if (e.shiftKey) { + /* conditional prevents disabled images from flickering multi-select mode */ + if (layer.editing.enabled()) { + L.DomUtil.toggleClass(e.target, 'collected'); // re-order layers by _leaflet_id to match their display order in UI + // add new layer to right position and avoid repitition + + var newArr = arr.every(function (each) { + return each._leaflet_id !== layer._leaflet_id; + }); + + if (newArr) { + arr.push(layer); + } else { + arr.splice(arr.indexOf(layer), 1); + } + } + } + + if (this.anyCollected()) { + layer.deselect(); + } else { + this.editing._removeToolbar(); + } + }, + _deselectOthers: function _deselectOthers(e) { + var _this2 = this; + + if (!this.editable) { + return; + } + + this.eachLayer(function (layer) { + if (layer.getElement() !== e.target) { + layer.deselect(); + } else { + _this2._toggleCollected(e, layer); + } + }); + + if (e) { + L.DomEvent.stopPropagation(e); + } + }, + _dragStartMultiple: function _dragStartMultiple(e) { + var overlay = e.target; + var map = this._map; + var i; + + if (!this.isCollected(overlay)) { + return; + } + + this.eachLayer(function (layer) { + layer._dragStartPoints = {}; + layer.deselect(); + + for (i = 0; i < 4; i++) { + var c = layer.getCorner(i); + layer._dragStartPoints[i] = map.latLngToLayerPoint(c); + } + }); + }, + _dragMultiple: function _dragMultiple(e) { + var overlay = e.target; + var map = this._map; + + if (!this.isCollected(overlay)) { + return; + } + + var topLeft = map.latLngToLayerPoint(overlay.getCorner(0)); + + var delta = overlay._dragStartPoints[0].subtract(topLeft); + + this._updateCollectionFromPoints(delta, overlay); + }, + _toRemove: function _toRemove() { + var _this3 = this; + + var layerArr = this.getLayers(); + return layerArr.filter(function (layer) { + var mode = layer.editing._mode; + return _this3.isCollected(layer) && mode !== 'lock'; + }); + }, + _toMove: function _toMove(overlay) { + var _this4 = this; + + var layerArr = this.getLayers(); + return layerArr.filter(function (layer) { + var mode = layer.editing._mode; + return layer !== overlay && _this4.isCollected(layer) && mode !== 'lock'; + }); + }, + _updateCollectionFromPoints: function _updateCollectionFromPoints(delta, overlay) { + var layersToMove = this._toMove(overlay); + + var p = new L.Transformation(1, -delta.x, 1, -delta.y); + var i; + layersToMove.forEach(function (layer) { + var movedPoints = {}; + + for (i = 0; i < 4; i++) { + movedPoints[i] = p.transform(layer._dragStartPoints[i]); + } + + layer.setCornersFromPoints(movedPoints); + }); + }, + _getAvgCmPerPixel: function _getAvgCmPerPixel(imgs) { + var reduce = imgs.reduce(function (sum, img) { + return sum + img.cm_per_pixel; + }, 0); + return reduce / imgs.length; + }, + generateExportJson: function generateExportJson() { + var json = {}; + json.images = []; + this.eachLayer(function (layer) { + if (this.isCollected(layer)) { + var sections = layer._image.src.split('/'); + + var filename = sections[sections.length - 1]; + var zc = layer.getCorners(); + var corners = [{ + lat: zc[0].lat, + lon: zc[0].lng + }, { + lat: zc[1].lat, + lon: zc[1].lng + }, { + lat: zc[3].lat, + lon: zc[3].lng + }, { + lat: zc[2].lat, + lon: zc[2].lng + }]; + json.images.push({ + id: layer._leaflet_id, + src: layer._image.src, + width: layer._image.width, + height: layer._image.height, + image_file_name: filename, + nodes: corners, + cm_per_pixel: L.ImageUtil.getCmPerPixel(layer) + }); + } + }, this); + json.images = json.images.reverse(); + json.avg_cm_per_pixel = this._getAvgCmPerPixel(json.images); + return json; + } +}); + +L.distortableCollection = function (id, options) { + return new L.DistortableCollection(id, options); +}; + +/***/ }), + +/***/ "./src/DistortableImageOverlay.js": +/*!****************************************!*\ + !*** ./src/DistortableImageOverlay.js ***! + \****************************************/ +/***/ (function() { + +L.DistortableImageOverlay = L.ImageOverlay.extend({ + options: { + height: 200, + crossOrigin: true, + // todo: find ideal number to prevent distortions during RotateScale, and make it dynamic (remove hardcoding) + edgeMinWidth: 50, + editable: true, + mode: 'distort', + selected: false, + // SEGUN ------------------------------------------------------------------------------------------------------------------------------ + interactive: true, + tooltipText: 'Unknow image' // default tooltipText + // SEGUN ------------------------------------------------------------------------------------------------------------------------------ + + }, + initialize: function initialize(url, options) { + L.setOptions(this, options); + L.Utils.initTranslation.call(this); + this.edgeMinWidth = this.options.edgeMinWidth; + this.editable = this.options.editable; + this._selected = this.options.selected; + this._url = url; + this.rotation = {}; // SEGUN ------------------------------------------------------------------------------------------------------------------------------ + + this.interactive = this.options.interactive; + this.tooltipText = options.tooltipText; // SEGUN ------------------------------------------------------------------------------------------------------------------------------ + }, + onAdd: function onAdd(map) { + var _this = this; + + this._map = map; + + if (!this.getElement()) { + this._initImage(); + } + + map.on('viewreset', this._reset, this); + + if (this.options.corners) { + this._corners = this.options.corners; + + if (map.options.zoomAnimation && L.Browser.any3d) { + map.on('zoomanim', this._animateZoom, this); + } + } // Have to wait for the image to load because need to access its w/h + + + L.DomEvent.on(this.getElement(), 'load', function () { + _this.getPane().appendChild(_this.getElement()); + + _this._initImageDimensions(); + + if (_this.options.rotation) { + var units = _this.options.rotation.deg >= 0 ? 'deg' : 'rad'; + + _this.setAngle(_this.options.rotation[units], units); + } else { + _this.rotation = { + deg: 0, + rad: 0 + }; + + _this._reset(); + } + /* Initialize default corners if not already set */ + + + if (!_this._corners) { + if (map.options.zoomAnimation && L.Browser.any3d) { + map.on('zoomanim', _this._animateZoom, _this); + } + } + /** if there is a featureGroup, only its editable option matters */ + + + var eventParents = _this._eventParents; + + if (eventParents) { + _this.eP = eventParents[Object.keys(eventParents)[0]]; + + if (_this.eP.editable) { + _this.editing.enable(); + } + } else { + if (_this.editable) { + _this.editing.enable(); + } + + _this.eP = null; + } + }); + L.DomEvent.on(this.getElement(), 'click', this.select, this); + L.DomEvent.on(map, { + singleclickon: this._singleClickListeners, + singleclickoff: this._resetClickListeners, + singleclick: this._singleClick + }, this); + /** + * custom events fired from DoubleClickLabels.js. Used to differentiate + * single / dblclick to not deselect images on map dblclick. + */ + + if (!(map.doubleClickZoom.enabled() || map.doubleClickLabels.enabled())) { + L.DomEvent.on(map, 'click', this.deselect, this); + } + + this.fire('add'); // SEGUN ------------------------------------------------------------------------------------------------------------------------------ + // L.DomEvent.on(this.getElement(), 'mouseover mousemove', this._activateTooltip, this); + // L.DomEvent.on(this.getElement(), 'mouseout', this._closeTooltip, this); + }, + onRemove: function onRemove(map) { + L.DomEvent.off(this.getElement(), 'click', this.select, this); + L.DomEvent.off(map, { + singleclickon: this._singleClickListeners, + singleclickoff: this._resetClickListeners, + singleclick: this._singleClick + }, this); + L.DomEvent.off(map, 'click', this.deselect, this); + + if (this.editing) { + this.editing.disable(); + } + + this.fire('remove'); + L.ImageOverlay.prototype.onRemove.call(this, map); // SEGUN ----------------------------------------------------------------------------------------------------------------------------- + + L.DomEvent.off(this.getElement(), 'mouseover', this._deactivateTooltip, this); // ENDS ------------------------------------------------------------------------------------------------------------------------------ + }, + _initImageDimensions: function _initImageDimensions() { + var map = this._map; + var originalImageWidth = L.DomUtil.getStyle(this.getElement(), 'width'); + var originalImageHeight = L.DomUtil.getStyle(this.getElement(), 'height'); + var aspectRatio = parseInt(originalImageWidth) / parseInt(originalImageHeight); + var imageHeight = this.options.height; + var imageWidth = parseInt(aspectRatio * imageHeight); + var center = map.project(map.getCenter()); + var offset = L.point(imageWidth, imageHeight).divideBy(2); + + if (this.options.corners) { + this._corners = this.options.corners; + } else { + this._corners = [map.unproject(center.subtract(offset)), map.unproject(center.add(L.point(offset.x, -offset.y))), map.unproject(center.add(L.point(-offset.x, offset.y))), map.unproject(center.add(offset))]; + } + + this._initialDimensions = { + 'center': center, + 'offset': offset, + 'zoom': map.getZoom() + }; + this.setBounds(L.latLngBounds(this.getCorners())); + }, + _singleClick: function _singleClick(e) { + if (e.type === 'singleclick') { + this.deselect(); + } else { + return; + } + }, + _singleClickListeners: function _singleClickListeners() { + var map = this._map; + L.DomEvent.off(map, 'click', this.deselect, this); + L.DomEvent.on(map, 'singleclick', this.deselect, this); + }, + _resetClickListeners: function _resetClickListeners() { + var map = this._map; + L.DomEvent.on(map, 'click', this.deselect, this); + L.DomEvent.off(map, 'singleclick', this.deselect, this); + }, + isSelected: function isSelected() { + return this._selected; // this._selected + }, + deselect: function deselect() { + var edit = this.editing; + + if (!edit.enabled()) { + return; + } + + edit._removeToolbar(); + + edit._hideMarkers(); + + this._selected = false; + this.fire('deselect'); + return this; + }, + select: function select(e) { + var edit = this.editing; + var eP = this.eP; + + if (!edit.enabled()) { + return; + } + + if (e) { + L.DomEvent.stopPropagation(e); + } // this ensures deselection of all other images, allowing us to keep collection group optional + + + this._programmaticGrouping(); + + this._selected = true; + + edit._addToolbar(); + + edit._showMarkers(); + + this.fire('select'); // we run the selection logic 1st anyway because the collection group's _addToolbar method depends on it + + if (eP && eP.anyCollected()) { + this.deselect(); + return; + } + + return this; + }, + _programmaticGrouping: function _programmaticGrouping() { + this._map.eachLayer(function (layer) { + if (layer instanceof L.DistortableImageOverlay) { + layer.deselect(); + } + }); + }, + setCorner: function setCorner(corner, latlng) { + var edit = this.editing; + this._corners[corner] = latlng; + this.setBounds(L.latLngBounds(this.getCorners())); + this.fire('update'); + + if (edit.toolbar && edit.toolbar instanceof L.DistortableImage.PopupBar) { + edit._updateToolbarPos(); + } + + this.edited = true; + return this; + }, + _cornerExceedsMapLats: function _cornerExceedsMapLats(zoom, corner, map) { + if (map.options.crs.Simple == L.CRS.Simple) { + return false; + } else { + var exceedsTop; + var exceedsBottom; + + if (zoom === 0) { + exceedsTop = map.project(corner).y < 2; + exceedsBottom = map.project(corner).y >= 255; + } else { + exceedsTop = map.project(corner).y / zoom < 2; + exceedsBottom = map.project(corner).y / Math.pow(2, zoom) >= 255; + } + + return exceedsTop || exceedsBottom; + } + }, + // SEGUN ------------------------------------------------------------------------------------------------------------------------------- + // Work in progress on this function + _activateTooltip: function _activateTooltip(ev) { + var index = 0; + var xAxis = []; // stores previous values of x coordinate + + var yAxis = []; // stores previous values of y coordinate, may be needed later + // let newPosX = 0; + + if (!this._selected) { + // Consider using "if (!this.selected)" instead + // console.log('mouseOVER_DONE/mouseMOVE_DONE-TOOLTIP-ACTIVATED'); // To be deleted + // console.log('x-axis:', ev.x); // To be deleted + // console.log('y-axis:', ev.y); // To be deleted + xAxis[index] = ev.x; + yAxis[index] = ev.y; // May be needed later + // newPosX = xAxis[index-1] - xAxis[index]; // - works but not perfect + // newPosX = (xAxis[index-1] - xAxis[index]) - ((xAxis[index])/4); // - better than above but not perfect + // newPosX =(xAxis[index-1] - xAxis[index]) - (xAxis[index] - this.imageWidth); // - works but no perfect + + ++index; + this.bindTooltip(this.tooltipText, { + sticky: true, + direction: 'top', + offset: L.point([ev.x - 700, ev.y - 500]) + }).openTooltip(); // POC only, work still in progress on this - hardcoded, works not perfect yet + } + }, + _closeTooltip: function _closeTooltip() { + // console.log('mouseOUT_DONE-TOOLTIP-CLOSED'); // To be deleted + this.closeTooltip(); + }, + _deactivateTooltip: function _deactivateTooltip() { + // console.log('MouseoverENDED & mousemoveENDED-TOOLTIP-DEACTIVATED'); - To be deleted + this.unbindTooltip(); + }, + // ENDS ------------------------------------------------------------------------------------------------------------------------------ + setCorners: function setCorners(latlngObj) { + var map = this._map; + var zoom = map.getZoom(); + var edit = this.editing; + var i = 0; // this is to fix https://github.com/publiclab/Leaflet.DistortableImage/issues/402 + + for (var k in latlngObj) { + if (this._cornerExceedsMapLats(zoom, latlngObj[k], map)) { + // calling reset / update w/ the same corners bc it prevents a marker flicker for rotate + this.setBounds(L.latLngBounds(this.getCorners())); + this.fire('update'); + return; + } + } + + for (var _k in latlngObj) { + this._corners[i] = latlngObj[_k]; + i += 1; + } + + this.setBounds(L.latLngBounds(this.getCorners())); + this.fire('update'); + + if (edit.toolbar && edit.toolbar instanceof L.DistortableImage.PopupBar) { + edit._updateToolbarPos(); + } + + this.edited = true; + return this; + }, + setCornersFromPoints: function setCornersFromPoints(pointsObj) { + var map = this._map; + var zoom = map.getZoom(); + var edit = this.editing; + var i = 0; + + for (var k in pointsObj) { + var corner = map.layerPointToLatLng(pointsObj[k]); + + if (this._cornerExceedsMapLats(zoom, corner, map)) { + // calling reset / update w/ the same corners bc it prevents a marker flicker for rotate + this.setBounds(L.latLngBounds(this.getCorners())); + this.fire('update'); + return; + } + } + + for (var _k2 in pointsObj) { + this._corners[i] = map.layerPointToLatLng(pointsObj[_k2]); + i += 1; + } + + this.setBounds(L.latLngBounds(this.getCorners())); + this.fire('update'); + + if (edit.toolbar && edit.toolbar instanceof L.DistortableImage.PopupBar) { + edit._updateToolbarPos(); + } + + this.edited = true; + return this; + }, + scaleBy: function scaleBy(scale) { + var map = this._map; + var center = map.project(this.getCenter()); + var i; + var p; + var scaledCorners = {}; + + if (scale === 0) { + return; + } + + for (i = 0; i < 4; i++) { + p = map.project(this.getCorner(i)).subtract(center).multiplyBy(scale).add(center); + scaledCorners[i] = map.unproject(p); + } + + this.setCorners(scaledCorners); + return this; + }, + getAngle: function getAngle() { + var unit = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'deg'; + var matrix = this.getElement().style[L.DomUtil.TRANSFORM].split('matrix3d')[1].slice(1, -1).split(','); + var row0x = matrix[0]; + var row0y = matrix[1]; + var row1x = matrix[4]; + var row1y = matrix[5]; + var determinant = row0x * row1y - row0y * row1x; + var angle = L.TrigUtil.calcAngle(row0x, row0y, 'rad'); + + if (determinant < 0) { + angle += angle < 0 ? Math.PI : -Math.PI; + } + + if (angle < 0) { + angle = 2 * Math.PI + angle; + } + + return unit === 'deg' ? Math.round(L.TrigUtil.radiansToDegrees(angle)) : L.Util.formatNum(angle, 2); + }, + setAngle: function setAngle(angle) { + var unit = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'deg'; + var currentAngle = this.getAngle(unit); + var angleToRotateBy = angle - currentAngle; + this.rotateBy(angleToRotateBy, unit); + return this; + }, + rotateBy: function rotateBy(angle) { + var unit = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'deg'; + var map = this._map; + var center = map.project(this.getCenter()); + var corners = {}; + var i; + var p; + var q; + + if (unit === 'deg') { + angle = L.TrigUtil.degreesToRadians(angle); + } + + for (i = 0; i < 4; i++) { + p = map.project(this.getCorner(i)).subtract(center); + q = L.point(Math.cos(angle) * p.x - Math.sin(angle) * p.y, Math.sin(angle) * p.x + Math.cos(angle) * p.y); + corners[i] = map.unproject(q.add(center)); + } + + this.setCorners(corners); + return this; + }, + dragBy: function dragBy(formerPoint, newPoint) { + var map = this._map; + var i; + var p; + var transCorners = {}; + var delta = map.project(formerPoint).subtract(map.project(newPoint)); + + for (i = 0; i < 4; i++) { + p = map.project(this.getCorner(i)).subtract(delta); + transCorners[i] = map.unproject(p); + } + + this.setCorners(transCorners); + }, + restore: function restore() { + var map = this._map; + var center = this._initialDimensions.center; + var offset = this._initialDimensions.offset; + var zoom = this._initialDimensions.zoom; + var corners = [center.subtract(offset), center.add(L.point(offset.x, -offset.y)), center.add(L.point(-offset.x, offset.y)), center.add(offset)]; + + for (var i = 0; i < 4; i++) { + if (!map.unproject(corners[i], zoom).equals(this.getCorner(i))) { + this.setCorner(i, map.unproject(corners[i], zoom)); + } + } + + this.edited = false; + this.fire('restore'); + return this; + }, + + /* Copied from Leaflet v0.7 https://github.com/Leaflet/Leaflet/blob/66282f14bcb180ec87d9818d9f3c9f75afd01b30/src/dom/DomUtil.js#L189-L199 */ + + /* since L.DomUtil.getTranslateString() is deprecated in Leaflet v1.0 */ + _getTranslateString: function _getTranslateString(point) { + // on WebKit browsers (Chrome/Safari/iOS Safari/Android) + // using translate3d instead of translate + // makes animation smoother as it ensures HW accel is used. + // Firefox 13 doesn't care + // (same speed either way), Opera 12 doesn't support translate3d + var is3d = L.Browser.webkit3d; + var open = 'translate' + (is3d ? '3d' : '') + '('; + var close = (is3d ? ',0' : '') + ')'; + return open + point.x + 'px,' + point.y + 'px' + close; + }, + _reset: function _reset() { + var map = this._map; + var image = this.getElement(); + var latLngToLayerPoint = L.bind(map.latLngToLayerPoint, map); + + var transformMatrix = this._calculateProjectiveTransform(latLngToLayerPoint); + + var topLeft = latLngToLayerPoint(this.getCorner(0)); + var warp = L.DomUtil.getMatrixString(transformMatrix); + + var translation = this._getTranslateString(topLeft); + /* See L.DomUtil.setPosition. Mainly for the purposes of L.Draggable. */ + + + image._leaflet_pos = topLeft; + image.style[L.DomUtil.TRANSFORM] = [translation, warp].join(' '); + /* Set origin to the upper-left corner rather than + * the center of the image, which is the default. + */ + + image.style[L.DomUtil.TRANSFORM + '-origin'] = '0 0 0'; + this.rotation.deg = this.getAngle(); + this.rotation.rad = this.getAngle('rad'); + }, + + /* + * Calculates the transform string that will be + * correct *at the end* of zooming. + * Leaflet then generates a CSS3 animation between the current transform and + * future transform which makes the transition appear smooth. + */ + _animateZoom: function _animateZoom(event) { + var map = this._map; + var image = this.getElement(); + + var latLngToNewLayerPoint = function latLngToNewLayerPoint(latlng) { + return map._latLngToNewLayerPoint(latlng, event.zoom, event.center); + }; + + var transformMatrix = this._calculateProjectiveTransform(latLngToNewLayerPoint); + + var topLeft = latLngToNewLayerPoint(this.getCorner(0)); + var warp = L.DomUtil.getMatrixString(transformMatrix); + + var translation = this._getTranslateString(topLeft); + /* See L.DomUtil.setPosition. Mainly for the purposes of L.Draggable. */ + + + image._leaflet_pos = topLeft; + image.style[L.DomUtil.TRANSFORM] = [translation, warp].join(' '); + }, + getCorners: function getCorners() { + return this._corners; + }, + getCorner: function getCorner(i) { + return this._corners[i]; + }, + // image (vertex) centroid calculation + getCenter: function getCenter() { + var map = this._map; + var reduce = this.getCorners().reduce(function (agg, corner) { + return agg.add(map.project(corner)); + }, L.point(0, 0)); + return map.unproject(reduce.divideBy(4)); + }, + _calculateProjectiveTransform: function _calculateProjectiveTransform(latLngToCartesian) { + /* Setting reasonable but made-up image defaults + * allow us to place images on the map before + * they've finished downloading. */ + var offset = latLngToCartesian(this.getCorner(0)); + var w = this.getElement().offsetWidth || 500; + var h = this.getElement().offsetHeight || 375; + var c = []; + var j; + /* Convert corners to container points (i.e. cartesian coordinates). */ + + for (j = 0; j < 4; j++) { + c.push(latLngToCartesian(this.getCorner(j))._subtract(offset)); + } + /* + * This matrix describes the action of + * the CSS transform on each corner of the image. + * It maps from the coordinate system centered + * at the upper left corner of the image + * to the region bounded by the latlngs in this._corners. + * For example: + * 0, 0, c[0].x, c[0].y + * says that the upper-left corner of the image + * maps to the first latlng in this._corners. + */ + + + return L.MatrixUtil.general2DProjection(0, 0, c[0].x, c[0].y, w, 0, c[1].x, c[1].y, 0, h, c[2].x, c[2].y, w, h, c[3].x, c[3].y); + } +}); + +L.distortableImageOverlay = function (id, options) { + // remove temp + return new L.DistortableImageOverlay(id, options); // remove temp +}; + +L.Map.addInitHook(function () { + if (!L.DomUtil.hasClass(this.getContainer(), 'ldi')) { + L.DomUtil.addClass(this.getContainer(), 'ldi'); + } +}); + +/***/ }), + +/***/ "./src/components/DistortableImage.Keymapper.js": +/*!******************************************************!*\ + !*** ./src/components/DistortableImage.Keymapper.js ***! + \******************************************************/ +/***/ (function() { + +var _this = this; + +L.DomUtil = L.DomUtil || {}; +L.DistortableImage = L.DistortableImage || {}; +L.distortableImage = L.DistortableImage; +L.DistortableImage.Keymapper = L.Handler.extend({ + options: { + position: 'topright' + }, + initialize: function initialize(map, options) { + this._map = map; + L.setOptions(this, options); + }, + addHooks: function addHooks() { + if (!this._keymapper) { + this._container = this._buildContainer(); + this._scrollWrapper = this._wrap(); + this._toggler = this._createButton(); + + this._setMapper(this._container, this._scrollWrapper, this._toggler); + + L.DomEvent.on(this._toggler, 'click', this._toggleKeymapper, this); + L.DomEvent.disableClickPropagation(this._container); + L.DomEvent.disableScrollPropagation(this._container); + } + }, + removeHooks: function removeHooks() { + if (this._keymapper) { + L.DomEvent.off(this._toggler, 'click', this._toggleKeymapper, this); + L.DomUtil.remove(this._toggler); + L.DomUtil.remove(this._scrollWrapper); + L.DomUtil.remove(this._container); + this._keymapper = false; + } + }, + _buildContainer: function _buildContainer() { + var container = L.DomUtil.create('div', 'ldi-keymapper-hide'); + container.setAttribute('id', 'ldi-keymapper'); + var divider = L.DomUtil.create('br', 'divider'); + container.appendChild(divider); + return container; + }, + _createButton: function _createButton() { + var toggler = L.DomUtil.create('a', ''); + toggler.innerHTML = L.IconUtil.create('keyboard_open'); + toggler.setAttribute('id', 'toggle-keymapper'); + toggler.setAttribute('href', '#'); + toggler.setAttribute('title', 'Show keymap'); // Will force screen readers like VoiceOver to read this as "Show keymap - button" + + toggler.setAttribute('role', 'button'); + toggler.setAttribute('aria-label', 'Show keymap'); + return toggler; + }, + _wrap: function _wrap() { + var wrap = L.DomUtil.create('div', ''); + wrap.setAttribute('id', 'keymapper-wrapper'); + wrap.style.display = 'none'; + return wrap; + }, + _setMapper: function _setMapper(container, wrap, button) { + this._keymapper = L.control({ + position: this.options.position + }); + + this._keymapper.onAdd = function () { + container.appendChild(wrap); + wrap.insertAdjacentHTML('beforeend', '' + '
' + + /* eslint-disable */ + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '
Rotate Mode
R
RotateScale Mode
r
Scale Mode
s
Distort Mode
d
Drag Mode
D
Lock (Mode) / Unlock Image
l\xa0u
Stack up / down
q\xa0a
Add / Remove Image Border
b
Toggle Opacity
o
Deselect All
esc
Delete Image(s)
delete\xa0backspace
Export Image(s)
e
'); + /* eslint-enable */ + + container.appendChild(button); + return container; + }; + + this._keymapper.addTo(this._map); + }, + _toggleKeymapper: function _toggleKeymapper(e) { + e.preventDefault(); + this._container.className = this._container.className === 'ldi-keymapper leaflet-control' ? 'ldi-keymapper-hide leaflet-control' : 'ldi-keymapper leaflet-control'; + this._scrollWrapper.style.display = this._scrollWrapper.style.display === 'none' ? 'block' : 'none'; + this._toggler.innerHTML = this._toggler.innerHTML === 'close' ? L.IconUtil.create('keyboard_open') : 'close'; + L.IconUtil.toggleTitle(this._toggler, 'Show keymap', 'Hide keymap'); + L.DomUtil.toggleClass(this._toggler, 'close-icon'); + }, + _injectIconSet: function _injectIconSet() { + if (document.querySelector('#keymapper-iconset')) { + return; + } + + var el = L.DomUtil.create('div', ''); + el.id = 'keymapper-iconset'; + el.setAttribute('hidden', 'hidden'); + this._iconset = new L.KeymapperIconSet().render(); + el.innerHTML = this._iconset; + document.querySelector('.leaflet-control-container').appendChild(el); + } +}); +L.DistortableImage.Keymapper.addInitHook(function () { + L.DistortableImage.Keymapper.prototype._n = L.DistortableImage.Keymapper.prototype._n ? L.DistortableImage.Keymapper.prototype._n + 1 : 1; // dont enable keymapper for mobile + + if (L.DistortableImage.Keymapper.prototype._n === 1 && !L.Browser.mobile) { + _this.enable(); + + _this._injectIconSet(); + } +}); + +L.distortableImage.keymapper = function (map, options) { + return new L.DistortableImage.Keymapper(map, options); +}; + +/***/ }), + +/***/ "./src/edit/DistortableCollection.Edit.js": +/*!************************************************!*\ + !*** ./src/edit/DistortableCollection.Edit.js ***! + \************************************************/ +/***/ (function() { + +L.DistortableImage = L.DistortableImage || {}; // this class holds the keybindings and toolbar API for an image collection instance + +L.DistortableCollection.Edit = L.Handler.extend({ + options: { + keymap: L.distortableImage.group_action_map + }, + initialize: function initialize(group, options) { + this._group = group; + this._exportOpts = group.options.exportOpts; + L.setOptions(this, options); + L.distortableImage.group_action_map.Escape = '_decollectAll'; + }, + addHooks: function addHooks() { + var group = this._group; + var map = group._map; + this.editActions = this.options.actions; + this.runExporter = L.bind(L.Utils.getNestedVal(this, '_exportOpts', 'exporter') || this.startExport, this); + L.DomEvent.on(document, 'keydown', this._onKeyDown, this); + + if (!(map.doubleClickZoom.enabled() || map.doubleClickLabels.enabled())) { + L.DomEvent.on(map, 'click', this._decollectAll, this); + } + + L.DomEvent.on(map, { + singleclickon: this._singleClickListeners, + singleclickoff: this._resetClickListeners, + singleclick: this._singleClick, + boxcollectend: this._addCollections + }, this); + this._group.editable = true; + + this._group.eachLayer(function (layer) { + return layer.editing.enable(); + }); + }, + removeHooks: function removeHooks() { + var group = this._group; + var map = group._map; + L.DomEvent.off(document, 'keydown', this._onKeyDown, this); + + if (!(map.doubleClickZoom.enabled() || map.doubleClickLabels.enabled())) { + L.DomEvent.off(map, 'click', this._decollectAll, this); + } + + L.DomEvent.off(map, { + singleclickon: this._singleClickListeners, + singleclickoff: this._resetClickListeners, + singleclick: this._singleClick, + boxcollectend: this._addCollections + }, this); + + this._decollectAll(); + + this._group.editable = false; + + this._group.eachLayer(function (layer) { + return layer.editing.disable(); + }); + }, + enable: function enable() { + this._enabled = true; + this.addHooks(); + return this; + }, + disable: function disable() { + this._enabled = false; + this.removeHooks(); + return this; + }, + _onKeyDown: function _onKeyDown(e) { + var keymap = this.options.keymap; + var handlerName = keymap[e.key]; + + if (!this[handlerName]) { + return; + } + + if (this._group.anyCollected()) { + this[handlerName].call(this); + } + }, + _singleClick: function _singleClick(e) { + if (e.type === 'singleclick') { + this._decollectAll(e); + } else { + return; + } + }, + _singleClickListeners: function _singleClickListeners() { + var map = this._group._map; + L.DomEvent.off(map, 'click', this._decollectAll, this); + L.DomEvent.on(map, 'singleclick', this._decollectAll, this); + }, + _resetClickListeners: function _resetClickListeners() { + var map = this._group._map; + L.DomEvent.on(map, 'click', this._decollectAll, this); + L.DomEvent.off(map, 'singleclick', this._decollectAll, this); + }, + _decollectAll: function _decollectAll(e) { + var oe; + + if (e) { + oe = e.originalEvent; + } + /** + * prevents image deselection following the 'boxcollectend' event - note 'shift' must not be released until dragging is complete + * also prevents deselection following a click on a disabled img by differentiating it from the map + */ + + + if (oe && (oe.shiftKey || oe.target instanceof HTMLImageElement)) { + return; + } + + this._group.eachLayer(function (layer) { + L.DomUtil.removeClass(layer.getElement(), 'collected'); + layer.deselect(); + }); + + this._removeToolbar(); + + if (e) { + L.DomEvent.stopPropagation(e); + } + }, + _unlockGroup: function _unlockGroup() { + var _this = this; + + if (!this.hasTool(L.UnlockAction)) { + return; + } + + this._group.eachLayer(function (layer) { + if (_this._group.isCollected(layer)) { + var edit = layer.editing; + + edit._unlock(); // unlock updates the layer's handles; deselect to ensure they're hidden + + + layer.deselect(); + } + }); + }, + _lockGroup: function _lockGroup() { + var _this2 = this; + + if (!this.hasTool(L.LockAction)) { + return; + } + + this._group.eachLayer(function (layer) { + if (_this2._group.isCollected(layer)) { + var edit = layer.editing; + + edit._lock(); // map.addLayer also deselects the image, so we reselect here + + + L.DomUtil.addClass(layer.getElement(), 'collected'); + } + }); + }, + _addCollections: function _addCollections(e) { + var _this3 = this; + + var box = e.boxCollectBounds; + var map = this._group._map; + + this._group.eachLayer(function (layer) { + var edit = layer.editing; + + if (layer.isSelected()) { + layer.deselect(); + } + + var zoom = map.getZoom(); + var center = map.getCenter(); + var imgBounds = L.latLngBounds(layer.getCorner(2), layer.getCorner(1)); + imgBounds = map._latLngBoundsToNewLayerBounds(imgBounds, zoom, center); + + if (box.intersects(imgBounds) && edit.enabled()) { + if (!_this3.toolbar) { + _this3._addToolbar(); + } + + L.DomUtil.addClass(layer.getElement(), 'collected'); + } + }); + }, + _removeGroup: function _removeGroup(e) { + var _this4 = this; + + if (!this.hasTool(L.DeleteAction)) { + return; + } + + var layersToRemove = this._group._toRemove(); + + var n = layersToRemove.length; + + if (n === 0) { + return; + } + + var choice = L.DomUtil.confirmDeletes(n); + + if (choice) { + layersToRemove.forEach(function (layer) { + _this4._group.removeLayer(layer); + }); + + if (!this._group.anyCollected()) { + this._removeToolbar(); + } + } + + if (e) { + L.DomEvent.stopPropagation(e); + } + }, + cancelExport: function cancelExport() { + if (!this.customCollection) { + this._exportOpts.collection = undefined; + } + + clearInterval(this.updateInterval); + }, + _addToolbar: function _addToolbar() { + var group = this._group; + var map = group._map; + + if (group.options.suppressToolbar || this.toolbar) { + return; + } + + this.toolbar = L.distortableImage.controlBar({ + actions: this.editActions, + position: 'topleft' + }).addTo(map, group); + }, + _removeToolbar: function _removeToolbar() { + var map = this._group._map; + + if (this.toolbar) { + map.removeLayer(this.toolbar); + this.toolbar = false; + } else { + return false; + } + }, + hasTool: function hasTool(value) { + return this.editActions.some(function (action) { + return action === value; + }); + }, + addTool: function addTool(value) { + if (value.baseClass === 'leaflet-toolbar-icon' && !this.hasTool(value)) { + this._removeToolbar(); + + this.editActions.push(value); + + this._addToolbar(); + } + + return this; + }, + removeTool: function removeTool(value) { + var _this5 = this; + + this.editActions.some(function (item, idx) { + if (_this5.editActions[idx] === value) { + _this5._removeToolbar(); + + _this5.editActions.splice(idx, 1); + + _this5._addToolbar(); + + return true; + } else { + return false; + } + }); + return this; + }, + startExport: function startExport() { + var _this6 = this; + + if (!this.hasTool(L.ExportAction)) { + return; + } + + return new Promise(function (resolve) { + var opts = _this6._exportOpts; + opts.resolve = resolve; // allow resolving promise in user-defined functions, to stop spinner on completion + + var statusUrl; + _this6.updateInterval = null; // this may be overridden to update the UI to show export progress or completion + + var _defaultUpdater = function _defaultUpdater(data) { + data = JSON.parse(data); // optimization: fetch status directly from google storage: + + if (data.status_url) { + if (statusUrl !== data.status_url && data.status_url.match('.json')) { + // if (data.status_url && data.status_url.substr(0,1) === "/") { + // opts.statusUrl = opts.statusUrl + data.status_url; + // } else { + statusUrl = data.status_url; // } + } + + if (data.status === 'complete') { + clearInterval(_this6.updateInterval); + + if (!_this6.customCollection) { + _this6._exportOpts.collection = undefined; + } + + resolve(); + + if (data.jpg !== null) { + alert('Export succeeded. ' + opts.exportUrl + data.jpg); + } + } // TODO: update to clearInterval when status == "failed" if we update that in this file: + // https://github.com/publiclab/mapknitter-exporter/blob/main/lib/mapknitterExporter.rb + + + console.log(data); + } + }; // receives the URL of status.json, and starts running the updater to repeatedly fetch from status.json; + // this may be overridden to integrate with any UI + + + var _defaultHandleStatusRes = function _defaultHandleStatusRes(data) { + statusUrl = opts.statusUrl + data; // repeatedly fetch the status.json + + _this6.updateInterval = setInterval(function () { + var reqOpts = { + method: 'GET' + }; + var req = new Request("".concat(statusUrl, "?").concat(Date.now()), reqOpts); + fetch(req).then(function (res) { + if (res.ok) { + return res.text(); + } + }).then(opts.updater); + }, opts.frequency); + }; // initiate the export + + + var _defaultFetchStatusUrl = function _defaultFetchStatusUrl(mergedOpts) { + var form = new FormData(); + form.append('collection', JSON.stringify(mergedOpts.collection)); + form.append('scale', mergedOpts.scale); + form.append('upload', true); + var reqOpts = { + method: 'POST', + body: form + }; + var req = new Request(mergedOpts.exportStartUrl, reqOpts); + fetch(req).then(function (res) { + if (res.ok) { + return res.text(); + } + }).then(mergedOpts.handleStatusRes); + }; // If the user has passed collection property + + + _this6.customCollection = !!opts.collection; + + if (!_this6.customCollection) { + opts.collection = _this6._group.generateExportJson().images; + } + + opts.frequency = opts.frequency || 3000; + opts.scale = opts.scale || 100; // switch it to _getAvgCmPerPixel ! + + opts.updater = opts.updater || _defaultUpdater; + opts.handleStatusRes = opts.handleStatusRes || _defaultHandleStatusRes; + opts.fetchStatusUrl = opts.fetchStatusUrl || _defaultFetchStatusUrl; + opts.fetchStatusUrl(opts); + }); + } +}); + +L.distortableCollection.edit = function (group, options) { + return new L.DistortableCollection.Edit(group, options); +}; + +/***/ }), + +/***/ "./src/edit/DistortableImage.Edit.js": +/*!*******************************************!*\ + !*** ./src/edit/DistortableImage.Edit.js ***! + \*******************************************/ +/***/ (function() { + +L.DistortableImage = L.DistortableImage || {}; // holds the keybindings & toolbar API for an individual image instance + +L.DistortableImage.Edit = L.Handler.extend({ + options: { + opacity: 0.7, + outline: '1px solid red', + keymap: L.distortableImage.action_map + }, + initialize: function initialize(overlay, options) { + this._overlay = overlay; + this._toggledImage = false; + this._mode = overlay.options.mode; + this._transparent = false; + this._outlined = false; + L.setOptions(this, options); + L.distortableImage.action_map.Escape = '_deselect'; + }, + + /* Run on image selection. */ + addHooks: function addHooks() { + var overlay = this._overlay; + this.editActions = this.options.actions; + /* bring the selected image into view */ + + overlay.bringToFront(); + + this._initModes(); + + this._initHandles(); + + this._appendHandlesandDragable(); + + if (overlay.isSelected() && !overlay.options.suppressToolbar) { + this._addToolbar(); + } + + this.parentGroup = overlay.eP ? overlay.eP : false; + L.DomEvent.on(overlay.getElement(), { + dblclick: this.nextMode + }, this); + L.DomEvent.on(window, 'keydown', this._onKeyDown, this); + }, + + /* Run on image deselection. */ + removeHooks: function removeHooks() { + var overlay = this._overlay; + var eP = this.parentGroup; // First, check if dragging exists - it may be off due to locking + + this._disableDragging(); + + if (this.toolbar) { + this._removeToolbar(); + } + + for (var handle in this._handles) { + L.DomUtil.remove(handle); + } + /** + * ensures if you disable an image while it is multi-selected + * additional deselection logic is run + */ + + + if (L.DomUtil.hasClass(overlay.getElement(), 'collected')) { + L.DomUtil.removeClass(overlay.getElement(), 'collected'); + } + + if (eP && !eP.anyCollected() && eP.editing.toolbar) { + eP.editing._removeToolbar(); + } + + L.DomEvent.off(overlay.getElement(), { + dblclick: this.nextMode + }, this); + L.DomEvent.off(window, 'keydown', this._onKeyDown, this); + }, + disable: function disable() { + if (!this._enabled) { + return this; + } + + this._overlay.deselect(); + + this._enabled = false; + this.removeHooks(); + return this; + }, + _initModes: function _initModes() { + this._modes = {}; // passed from L.DistortablImage.PopupBar. If the mode is one + // of the current toolbar actions, adds it to this._modes + + for (var mode in L.DistortableImage.Edit.MODES) { + var action = L.DistortableImage.Edit.MODES[mode]; + + if (this.editActions.indexOf(action) !== -1) { + this._modes[mode] = action; + } + } // sets the current mode to the 1st available one if the one selected + // during initialization is not available + + + if (!this._modes[this._mode]) { + this._mode = Object.keys(this._modes)[0]; + } + }, + _initHandles: function _initHandles() { + var overlay = this._overlay; + var i; + this._dragHandles = L.layerGroup(); + + for (i = 0; i < 4; i++) { + this._dragHandles.addLayer(L.dragHandle(overlay, i)); + } + + this._scaleHandles = L.layerGroup(); + + for (i = 0; i < 4; i++) { + this._scaleHandles.addLayer(L.scaleHandle(overlay, i)); + } + + this._distortHandles = L.layerGroup(); + + for (i = 0; i < 4; i++) { + this._distortHandles.addLayer(L.distortHandle(overlay, i)); + } + + this._rotateHandles = L.layerGroup(); // individual rotate + + for (i = 0; i < 4; i++) { + this._rotateHandles.addLayer(L.rotateHandle(overlay, i)); + } // handle includes rotate AND scale + + + this._freeRotateHandles = L.layerGroup(); + + for (i = 0; i < 4; i++) { + this._freeRotateHandles.addLayer(L.freeRotateHandle(overlay, i)); + } + + this._lockHandles = L.layerGroup(); + + for (i = 0; i < 4; i++) { + this._lockHandles.addLayer(L.lockHandle(overlay, i, { + draggable: false + })); + } + + this._handles = { + drag: this._dragHandles, + scale: this._scaleHandles, + distort: this._distortHandles, + rotate: this._rotateHandles, + freeRotate: this._freeRotateHandles, + lock: this._lockHandles + }; + }, + _appendHandlesandDragable: function _appendHandlesandDragable() { + var ov = this._overlay; // won't throw error if user adds 0 mode actions to toolbar + + if (!this._mode) { + this._enableDragging(); + + return; + } + + this._updateHandle(); + + if (!ov.isSelected() && this.currentHandle) { + this.currentHandle.eachLayer(function (handle) { + handle.setOpacity(0); + + if (handle.dragging) { + handle.dragging.disable(); + } + }); + } + + if (!this.isMode('lock')) { + this._enableDragging(); + } + }, + _onKeyDown: function _onKeyDown(e) { + var keymap = this.options.keymap; + var handlerName = keymap[e.key]; + var ov = this._overlay; + var eP = this.parentGroup; + + if (eP && eP.anyCollected()) { + return; + } + + if (this[handlerName] !== undefined && !ov.options.suppressToolbar) { + if (ov.isSelected() && this.toolbar) { + this[handlerName].call(this); + } + } + }, + replaceTool: function replaceTool(old, next) { + var _this = this; + + if (next.baseClass !== 'leaflet-toolbar-icon' || this.hasTool(next)) { + return this; + } + + this.editActions.some(function (item, idx) { + if (item === old) { + _this._removeToolbar(); + + _this.editActions[idx] = next; + + _this._addToolbar(); + + for (var mode in L.DistortableImage.Edit.MODES) { + if (L.DistortableImage.Edit.MODES[mode] === old) { + delete _this._modes[mode]; + + _this._nextOrNone(mode); + } else if (L.DistortableImage.Edit.MODES[mode] === next) { + _this._modes[mode] = next; + } + } + + return true; + } + }); + return this; + }, + addTool: function addTool(value) { + if (value.baseClass === 'leaflet-toolbar-icon' && !this.hasTool(value)) { + this._removeToolbar(); + + this.editActions.push(value); + + this._addToolbar(); + + for (var mode in L.DistortableImage.Edit.MODES) { + if (L.DistortableImage.Edit.MODES[mode] === value) { + this._modes[mode] = value; + } + } + + if (!this._overlay.isSelected()) { + this._removeToolbar(); + } + } + + return this; + }, + hasTool: function hasTool(value) { + return this.editActions.some(function (action) { + return action === value; + }); + }, + removeTool: function removeTool(value) { + var _this2 = this; + + this.editActions.some(function (item, idx) { + if (item === value) { + _this2._removeToolbar(); + + _this2.editActions.splice(idx, 1); + + _this2._addToolbar(); + + for (var mode in L.DistortableImage.Edit.MODES) { + if (L.DistortableImage.Edit.MODES[mode] === value) { + delete _this2._modes[mode]; + + _this2._nextOrNone(mode); + } + } + + return true; + } + }); + + if (!this._overlay.isSelected()) { + this._removeToolbar(); + } + + return this; + }, + // set the mode to the next mode or if that was the last one set mode to '' + _nextOrNone: function _nextOrNone(mode) { + if (this.isMode(mode)) { + if (Object.keys(this.getModes()).length >= 1) { + this.nextMode(); + } else { + if (mode === 'lock') { + this._enableDragging(); + } + + this._mode = ''; + + this._updateHandle(); + } + } + }, + _removeToolbar: function _removeToolbar() { + var ov = this._overlay; + var map = ov._map; + + if (this.toolbar) { + map.removeLayer(this.toolbar); + this.toolbar = false; + } + }, + _enableDragging: function _enableDragging() { + var _this3 = this; + + var overlay = this._overlay; + var map = overlay._map; + this.dragging = new L.Draggable(overlay.getElement()); + this.dragging.enable(); + /* Hide toolbars and markers while dragging; click will re-show it */ + + this.dragging.on('dragstart', function () { + overlay.fire('dragstart'); + + _this3._removeToolbar(); + }); + /* + * Adjust default behavior of L.Draggable, which overwrites the CSS3 + * distort transformations that we set when it calls L.DomUtil.setPosition. + */ + + this.dragging._updatePosition = function () { + var topLeft = overlay.getCorner(0); + + var delta = this._newPos.subtract(map.latLngToLayerPoint(topLeft)); + + var currentPoint; + var corners = {}; + var i; + this.fire('predrag'); + + for (i = 0; i < 4; i++) { + currentPoint = map.latLngToLayerPoint(overlay.getCorner(i)); + corners[i] = map.layerPointToLatLng(currentPoint.add(delta)); + } + + overlay.setCorners(corners); + overlay.fire('drag'); + this.fire('drag'); + }; + + this.dragging.on('dragend', function () { + overlay.fire('dragend'); + }); + }, + _disableDragging: function _disableDragging() { + if (this.dragging) { + this.dragging.disable(); + delete this.dragging; + } + }, + _dragMode: function _dragMode() { + this.setMode('drag'); + }, + _scaleMode: function _scaleMode() { + this.setMode('scale'); + }, + _distortMode: function _distortMode() { + this.setMode('distort'); + }, + _rotateMode: function _rotateMode() { + this.setMode('rotate'); + }, + _freeRotateMode: function _freeRotateMode() { + this.setMode('freeRotate'); + }, + _toggleLockMode: function _toggleLockMode() { + if (this.isMode('lock')) { + this._unlock(); + } else { + this._lock(); + } + }, + _toggleOpacity: function _toggleOpacity() { + var image = this._overlay.getElement(); + + if (!this.hasTool(L.OpacityAction)) { + return; + } + + this._transparent = !this._transparent; + var opacity = this._transparent ? this.options.opacity : 1; + L.DomUtil.setOpacity(image, opacity); + image.setAttribute('opacity', opacity); + + this._refresh(); + }, + _toggleBorder: function _toggleBorder() { + var image = this._overlay.getElement(); + + if (!this.hasTool(L.BorderAction)) { + return; + } + + this._outlined = !this._outlined; + var outline = this._outlined ? this.options.outline : 'none'; + image.style.outline = outline; + + this._refresh(); + }, + // compare this to using overlay zIndex + _toggleOrder: function _toggleOrder() { + if (this._toggledImage) { + this._stackUp(); + } else { + this._stackDown(); + } + }, + _removeOverlay: function _removeOverlay() { + var ov = this._overlay; + var eP = this.parentGroup; + + if (this.isMode('lock') || !this.hasTool(L.DeleteAction)) { + return; + } + + var choice = L.DomUtil.confirmDelete(); + + if (!choice) { + return; + } + + this._removeToolbar(); + + if (eP) { + eP.removeLayer(ov); + } else { + ov._map.removeLayer(ov); + } + }, + // Based on https://github.com/publiclab/mapknitter/blob/8d94132c81b3040ae0d0b4627e685ff75275b416/app/assets/javascripts/mapknitter/Map.js#L47-L82 + _getExport: function _getExport() { + var overlay = this._overlay; + var map = overlay._map; + var img = overlay.getElement(); + + if (!this.hasTool(L.ExportAction)) { + return; + } // make a new image + + + var downloadable = new Image(); + downloadable.id = downloadable.id || 'tempId12345'; + document.body.appendChild(downloadable); + + downloadable.onload = function onLoadDownloadableImage() { + var height = downloadable.height; + var width = downloadable.width; + var nw = map.latLngToLayerPoint(overlay.getCorner(0)); + var ne = map.latLngToLayerPoint(overlay.getCorner(1)); + var sw = map.latLngToLayerPoint(overlay.getCorner(2)); + var se = map.latLngToLayerPoint(overlay.getCorner(3)); // I think this is to move the image to the upper left corner, + // eslint-disable-next-line max-len + // jywarren: i think we may need these or the image goes off the edge of the canvas + // jywarren: but these seem to break the distortion math... + // jywarren: i think it should be rejiggered so it + // finds the most negative values of x and y and then + // adds those to all coordinates + // nw.x -= nw.x; + // ne.x -= nw.x; + // se.x -= nw.x; + // sw.x -= nw.x; + // nw.y -= nw.y; + // ne.y -= nw.y; + // se.y -= nw.y; + // sw.y -= nw.y; + // run once warping is complete + + downloadable.onload = function () { + L.DomUtil.remove(downloadable); + }; + + if (window && window.hasOwnProperty('warpWebGl')) { + warpWebGl(downloadable.id, [0, 0, width, 0, width, height, 0, height], [nw.x, nw.y, ne.x, ne.y, se.x, se.y, sw.x, sw.y], true // trigger download + ); + } + }; + + downloadable.src = overlay.options.fullResolutionSrc || img.src; + }, + _stackUp: function _stackUp() { + var t = this._toggledImage; + + if (!t || !this.hasTool(L.StackAction)) { + return; + } + + this._toggledImage = false; + + this._overlay.bringToFront(); + + this._refresh(); + }, + _stackDown: function _stackDown() { + var t = this._toggledImage; + + if (t || !this.hasTool(L.StackAction)) { + return; + } + + this._toggledImage = true; + + this._overlay.bringToBack(); + + this._refresh(); + }, + _unlock: function _unlock() { + var ov = this._overlay; + var map = ov._map; + var eP = this.parentGroup; + + if (!this.isMode('lock')) { + return; + } + + if (eP && !eP.isCollected(ov) || !eP) { + if (!this.hasTool(L.LockAction)) { + return; + } + } + + if (this.currentHandle) { + map.removeLayer(this.currentHandle); + } + + if (ov.options.mode === 'lock' || !this.hasMode(ov.options.mode)) { + this._mode = ''; + this.currentHandle = ''; + } else { + this._mode = ov.options.mode; + } + + this._updateHandle(); + + this._enableDragging(); + + this._refresh(); + }, + _lock: function _lock() { + var ov = this._overlay; + var map = ov._map; + var eP = this.parentGroup; + + if (this.isMode('lock')) { + return; + } + + if (eP && !eP.isCollected(ov) || !eP) { + if (!this.hasTool(L.LockAction)) { + return; + } + } + + if (this.currentHandle) { + map.removeLayer(this.currentHandle); + } + + this._mode = 'lock'; + + this._updateHandle(); + + this._disableDragging(); + + this._refresh(); + }, + _deselect: function _deselect() { + this._overlay.deselect(); + }, + _showMarkers: function _showMarkers(e) { + var eP = this.parentGroup; + + if (!this.currentHandle) { + return; + } // only markers we want in collect interface for now is lock + + + if (!this.isMode('lock') && eP && eP.anyCollected()) { + return; + } + + this.currentHandle.eachLayer(function (handle) { + handle.setOpacity(1); + + if (handle.dragging) { + handle.dragging.enable(); + } + + L.DomUtil.addClass(handle.getElement(), 'leaflet-interactive'); + }); + }, + _hideMarkers: function _hideMarkers() { + var ov = this._overlay; + var eP = this.parentGroup; // workaround for race condition w/ feature group + + if (!this._handles) { + this._initHandles(); + } + + if (!this.currentHandle) { + return; + } + + if (this.isMode('lock') && eP && eP.isCollected(ov)) { + return; + } + + this.currentHandle.eachLayer(function (handle) { + handle.setOpacity(0); + + if (handle.dragging) { + handle.dragging.disable(); + } + + L.DomUtil.removeClass(handle.getElement(), 'leaflet-interactive'); + }); + }, + _updateHandle: function _updateHandle() { + var ov = this._overlay; + var map = ov._map; + var mode = this.getMode(); + + if (this.currentHandle) { + map.removeLayer(this.currentHandle); + } + + this.currentHandle = mode === '' ? '' : this._handles[mode]; + + if (this.currentHandle !== '') { + map.addLayer(this.currentHandle); + } + }, + _addToolbar: function _addToolbar() { + var ov = this._overlay; + var eP = this.parentGroup; + var map = ov._map; // Find the topmost point on the image. + + var corners = ov.getCorners(); + var maxLat = -Infinity; + + if (eP && eP.anyCollected()) { + eP.editing._addToolbar(); + + return; + } + + if (ov.options.suppressToolbar || this.toolbar) { + return; + } + + for (var i = 0; i < corners.length; i++) { + if (corners[i].lat > maxLat) { + maxLat = corners[i].lat; + } + } // Longitude is based on the centroid of the image. + + + var raisedPoint = ov.getCenter(); + raisedPoint.lat = maxLat; + this.toolbar = L.distortableImage.popupBar(raisedPoint, { + actions: this.editActions + }).addTo(map, ov); + ov.fire('toolbar:created'); + }, + _refresh: function _refresh() { + if (this.toolbar) { + this._removeToolbar(); + } + + this._addToolbar(); + }, + _updateToolbarPos: function _updateToolbarPos() { + var overlay = this._overlay; // Find the topmost point on the image. + + var corners = overlay.getCorners(); + var toolbar = this.toolbar; + var maxLat = -Infinity; + + if (toolbar && toolbar instanceof L.DistortableImage.PopupBar) { + for (var i = 0; i < corners.length; i++) { + if (corners[i].lat > maxLat) { + maxLat = corners[i].lat; + } + } // Longitude is based on the centroid of the image. + + + var raisedPoint = overlay.getCenter(); + raisedPoint.lat = maxLat; + + if (!overlay.options.suppressToolbar) { + this.toolbar.setLatLng(raisedPoint); + } + } + }, + hasMode: function hasMode(mode) { + return !!this._modes[mode]; + }, + getMode: function getMode() { + if (!this.enabled()) { + return; + } + + return this._mode; + }, + getModes: function getModes() { + return this._modes; + }, + isMode: function isMode(mode) { + if (!this.enabled()) { + return false; + } + + return this._mode === mode; + }, + setMode: function setMode(newMode) { + var ov = this._overlay; + var eP = this.parentGroup; + var mode = this.getMode(); + + if (mode === newMode || !this.hasMode(newMode) || !this.enabled()) { + return; + } + + if (this.toolbar) { + this.toolbar.clickTool(newMode); + } + + if (this.isMode('lock') && !this.dragging) { + this._enableDragging(); + } + + this._mode = newMode; + + if (this.isMode('lock')) { + this._disableDragging(); + } + + this._updateHandle(); + + this._refresh(); + + if (eP && eP.isCollected(ov)) { + ov.deselect(); + } + + return this; + }, + + /** + * need to attach a stop to img dblclick or it will propagate to + * the map and fire the handler that shows map location labels on map dblclick. + */ + nextMode: function nextMode(e) { + var mode = this.getMode(); + var eP = this.parentGroup; + var modesArray = Object.keys(this.getModes()); + var idx = modesArray.indexOf(mode); + var nextIdx = (idx + 1) % modesArray.length; + var newMode = modesArray[nextIdx]; + + if (e) { + if (eP && eP.anyCollected()) { + return; + } + + L.DomEvent.stop(e); + } + + return this.setMode(newMode); + } +}); + +L.distortableImage.edit = function (overlay, options) { + return new L.DistortableImage.Edit(overlay, options); +}; + +/***/ }), + +/***/ "./src/edit/actions/BorderAction.js": +/*!******************************************!*\ + !*** ./src/edit/actions/BorderAction.js ***! + \******************************************/ +/***/ (function() { + +L.BorderAction = L.EditAction.extend({ + initialize: function initialize(map, overlay, options) { + var edit = overlay.editing; + var mode = edit._mode; + var use; + var tooltip; + + if (edit._outlined) { + use = 'border_outer'; + tooltip = overlay.options.translation.removeBorder; + } else { + use = 'border_clear'; + tooltip = overlay.options.translation.addBorder; + } + + options = options || {}; + options.toolbarIcon = { + svg: true, + html: use, + tooltip: tooltip, + className: mode === 'lock' ? 'disabled' : '' + }; // conditional for disabling keybindings for this action when the image is locked. + + L.DistortableImage.action_map.b = mode === 'lock' ? '' : '_toggleBorder'; + L.EditAction.prototype.initialize.call(this, map, overlay, options); + }, + addHooks: function addHooks() { + var edit = this._overlay.editing; + L.IconUtil.toggleXlink(this._link, 'border_clear', 'border_outer'); + L.IconUtil.toggleTitle(this._link, 'Remove Border', 'Add Border'); + + edit._toggleBorder(); + } +}); + +/***/ }), + +/***/ "./src/edit/actions/DeleteAction.js": +/*!******************************************!*\ + !*** ./src/edit/actions/DeleteAction.js ***! + \******************************************/ +/***/ (function() { + +L.DeleteAction = L.EditAction.extend({ + initialize: function initialize(map, overlay, options) { + var edit = overlay.editing; + var use = 'delete_forever'; + var tooltip; + /** + * we can tell whether the overlay is an instance of `L.DistortableImageOverlay` or `L.DistortableCollection` bc only + * the former should have `parentGroup` defined on it. From there we call the apporpriate keybindings and methods. + */ + + if (edit instanceof L.DistortableImage.Edit) { + tooltip = overlay.options.translation.deleteImage; // backspace windows / delete mac + + L.DistortableImage.action_map.Backspace = edit._mode === 'lock' ? '' : '_removeOverlay'; + } else { + tooltip = overlay.options.translation.deleteImages; + L.DistortableImage.group_action_map.Backspace = edit._mode === 'lock' ? '' : '_removeGroup'; + } + + options = options || {}; + options.toolbarIcon = { + svg: true, + html: use, + tooltip: tooltip, + className: edit._mode === 'lock' ? 'disabled' : '' + }; + L.EditAction.prototype.initialize.call(this, map, overlay, options); + }, + addHooks: function addHooks() { + var edit = this._overlay.editing; + + if (edit instanceof L.DistortableImage.Edit) { + edit._removeOverlay(); + } else { + edit._removeGroup(); + } + } +}); + +/***/ }), + +/***/ "./src/edit/actions/DistortAction.js": +/*!*******************************************!*\ + !*** ./src/edit/actions/DistortAction.js ***! + \*******************************************/ +/***/ (function() { + +L.DistortAction = L.EditAction.extend({ + initialize: function initialize(map, overlay, options) { + options = options || {}; + options.toolbarIcon = { + svg: true, + html: 'distort', + tooltip: overlay.options.translation.distortImage, + className: 'distort' + }; + L.DistortableImage.action_map.d = '_distortMode'; + L.EditAction.prototype.initialize.call(this, map, overlay, options); + }, + addHooks: function addHooks() { + var edit = this._overlay.editing; + + edit._distortMode(); + } +}); + +/***/ }), + +/***/ "./src/edit/actions/DragAction.js": +/*!****************************************!*\ + !*** ./src/edit/actions/DragAction.js ***! + \****************************************/ +/***/ (function() { + +L.DragAction = L.EditAction.extend({ + initialize: function initialize(map, overlay, options) { + options = options || {}; + options.toolbarIcon = { + svg: true, + html: 'drag', + tooltip: overlay.options.translation.dragImage, + className: 'drag' + }; + L.DistortableImage.action_map.D = '_dragMode'; + L.EditAction.prototype.initialize.call(this, map, overlay, options); + }, + addHooks: function addHooks() { + var edit = this._overlay.editing; + + edit._dragMode(); + } +}); + +/***/ }), + +/***/ "./src/edit/actions/EditAction.js": +/*!****************************************!*\ + !*** ./src/edit/actions/EditAction.js ***! + \****************************************/ +/***/ (function() { + +L.DistortableImage = L.DistortableImage || {}; +L.distortableImage = L.DistortableImage; +L.DistortableImage.action_map = {}; +L.EditAction = L.Toolbar2.Action.extend({ + options: { + toolbarIcon: { + svg: false, + html: '', + className: '', + tooltip: '' + } + }, + initialize: function initialize(map, overlay, options) { + this._overlay = overlay; + this._map = map; + L.setOptions(this, options); + L.Toolbar2.Action.prototype.initialize.call(this, options); + + this._injectIconSet(); + }, + _createIcon: function _createIcon(toolbar, container, args) { + var _this = this; + + var iconOptions = this.options.toolbarIcon; + var className = iconOptions.className; + var edit = this._overlay.editing; + this.toolbar = toolbar; + this._icon = L.DomUtil.create('li', '', container); + this._link = L.DomUtil.create('a', '', this._icon); + + if (iconOptions.svg) { + this._link.innerHTML = L.IconUtil.create(iconOptions.html); + } else { + this._link.innerHTML = iconOptions.html; + } + + this._link.setAttribute('href', '#'); + + this._link.setAttribute('title', iconOptions.tooltip); + + this._link.setAttribute('role', 'button'); + + L.DomUtil.addClass(this._link, this.constructor.baseClass); + + if (className) { + L.DomUtil.addClass(this._link, className); + + if (className === 'disabled') { + L.DomUtil.addClass(this._icon, className); + } + + if (className === edit._mode) { + L.DomUtil.addClass(this._link, 'selected-mode'); + } else { + L.DomUtil.removeClass(this._link, 'selected-mode'); + } + } + + L.DomEvent.on(this._link, 'click', this.enable, this); + L.DomEvent.on(this._overlay, 'update', function () { + var match = _this._link.innerHTML.match(/xlink:href="#restore"/); + + if (match && match.length === 1) { + _this._enableAction(); + } + }); + /* Add secondary toolbar */ + + this._addSubToolbar(toolbar, this._icon, args); + }, + _injectIconSet: function _injectIconSet() { + if (document.querySelector('#iconset')) { + return; + } + + var el = document.createElement('div'); + el.id = 'iconset'; + el.setAttribute('hidden', 'hidden'); + el.innerHTML = new L.ToolbarIconSet().render(); + document.querySelector('.leaflet-marker-pane').appendChild(el); + }, + _enableAction: function _enableAction() { + L.DomUtil.removeClass(this._link.parentElement, 'disabled'); + L.DomUtil.removeClass(this._link, 'disabled'); + }, + _disableAction: function _disableAction() { + L.DomUtil.addClass(this._link.parentElement, 'disabled'); + L.DomUtil.addClass(this._link, 'disabled'); + } +}); + +L.editAction = function (map, overlay, options) { + return new L.EditAction(map, overlay, options); +}; + +/***/ }), + +/***/ "./src/edit/actions/ExportAction.js": +/*!******************************************!*\ + !*** ./src/edit/actions/ExportAction.js ***! + \******************************************/ +/***/ (function() { + +L.ExportAction = L.EditAction.extend({ + // This function is executed every time we select an image + initialize: function initialize(map, overlay, options) { + var edit = overlay.editing; + var tooltip; + this.isExporting = false; + this.mouseLeaveSkip = true; + this.isHooksExecuted = false; + + if (edit instanceof L.DistortableImage.Edit) { + L.DistortableImage.action_map.e = '_getExport'; + tooltip = overlay.options.translation.exportImage; + } else { + L.DistortableImage.group_action_map.e = 'runExporter'; + tooltip = overlay.options.translation.exportImages; + } + + options = options || {}; + options.toolbarIcon = { + svg: true, + html: 'get_app', + tooltip: tooltip + }; + L.EditAction.prototype.initialize.call(this, map, overlay, options); + }, + addHooks: function addHooks() { + var edit = this._overlay.editing; + + if (edit instanceof L.DistortableImage.Edit) { + edit._getExport(); + + return; + } // Make sure that addHooks is executed only once, event listeners will handle the rest + + + if (this.isHooksExecuted) { + return; + } else { + this.isHooksExecuted = true; + } + + var exportTool = this._link.parentElement; + this.mouseEnterHandler = this.handleMouseEnter.bind(this); + this.mouseLeaveHandler = this.handleMouseLeave.bind(this); + L.DomEvent.on(exportTool, 'click', function () { + if (!this.isExporting) { + this.isExporting = true; + this.renderExportIcon(); + setTimeout(this.attachMouseEventListeners.bind(this, exportTool), 100); + edit.runExporter().then(function () { + this.resetState(); + this.detachMouseEventListeners(exportTool); + }.bind(this)); + } else { + // Clicking on the export icon after export has started will be ignored + if (this.mouseLeaveSkip) { + return; + } + + this.resetState(); + this.detachMouseEventListeners(exportTool); + edit.cancelExport(); + } + }, this); + }, + resetState: function resetState() { + this.renderDownloadIcon(); + this.isExporting = false; + this.mouseLeaveSkip = true; + }, + attachMouseEventListeners: function attachMouseEventListeners(element) { + element.addEventListener('mouseenter', this.mouseEnterHandler); + element.addEventListener('mouseleave', this.mouseLeaveHandler); + }, + detachMouseEventListeners: function detachMouseEventListeners(element) { + element.removeEventListener('mouseenter', this.mouseEnterHandler); + element.removeEventListener('mouseleave', this.mouseLeaveHandler); + }, + handleMouseEnter: function handleMouseEnter() { + this.renderCancelIcon(); + }, + handleMouseLeave: function handleMouseLeave() { + if (this.mouseLeaveSkip) { + this.mouseLeaveSkip = false; + } else { + this.renderExportIcon(); + } + }, + renderDownloadIcon: function renderDownloadIcon() { + L.IconUtil.toggleXlink(this._link, 'get_app', 'spinner'); + L.IconUtil.toggleTitle(this._link, 'Export Images', 'Loading...'); + L.DomUtil.removeClass(this._link.firstChild, 'loader'); + }, + renderExportIcon: function renderExportIcon() { + L.IconUtil.toggleXlink(this._link, 'spinner'); + L.IconUtil.toggleTitle(this._link, 'Export Images', 'Loading...'); + L.IconUtil.addClassToSvg(this._link, 'loader'); + }, + renderCancelIcon: function renderCancelIcon() { + L.IconUtil.toggleXlink(this._link, 'cancel'); + L.IconUtil.toggleTitle(this._link, 'Cancel Export', 'Loading...'); + L.DomUtil.removeClass(this._link.firstChild, 'loader'); + } +}); + +/***/ }), + +/***/ "./src/edit/actions/FreeRotateAction.js": +/*!**********************************************!*\ + !*** ./src/edit/actions/FreeRotateAction.js ***! + \**********************************************/ +/***/ (function() { + +L.FreeRotateAction = L.EditAction.extend({ + initialize: function initialize(map, overlay, options) { + options = options || {}; + options.toolbarIcon = { + svg: true, + html: 'crop_rotate', + tooltip: overlay.options.translation.freeRotateImage, + className: 'freeRotate' + }; + L.DistortableImage.action_map.f = '_freeRotateMode'; + L.EditAction.prototype.initialize.call(this, map, overlay, options); + }, + addHooks: function addHooks() { + var edit = this._overlay.editing; + + edit._freeRotateMode(); + } +}); + +/***/ }), + +/***/ "./src/edit/actions/GeolocateAction.js": +/*!*********************************************!*\ + !*** ./src/edit/actions/GeolocateAction.js ***! + \*********************************************/ +/***/ (function() { + +L.GeolocateAction = L.EditAction.extend({ + initialize: function initialize(map, overlay, options) { + var edit = overlay.editing; + options = options || {}; + options.toolbarIcon = { + svg: true, + html: 'explore', + tooltip: overlay.options.translation.geolocateImage, + className: edit._mode === 'lock' ? 'disabled' : '' + }; + L.EditAction.prototype.initialize.call(this, map, overlay, options); + }, + addHooks: function addHooks() { + var image = this._overlay.getElement(); + + EXIF.getData(image, L.EXIF(image)); + } +}); + +/***/ }), + +/***/ "./src/edit/actions/LockAction.js": +/*!****************************************!*\ + !*** ./src/edit/actions/LockAction.js ***! + \****************************************/ +/***/ (function() { + +L.LockAction = L.EditAction.extend({ + initialize: function initialize(map, overlay, options) { + var edit = overlay.editing; + var use; + var tooltip; + + if (edit instanceof L.DistortableImage.Edit) { + L.DistortableImage.action_map.u = '_unlock'; + L.DistortableImage.action_map.l = '_lock'; + tooltip = overlay.options.translation.lockMode; + use = edit.isMode('lock') ? 'lock' : 'unlock'; + } else { + L.DistortableImage.group_action_map.l = '_lockGroup'; + tooltip = overlay.options.translation.lockImages; + use = 'lock'; + } + + options = options || {}; + options.toolbarIcon = { + svg: true, + html: use, + tooltip: tooltip, + className: 'lock' + }; + L.EditAction.prototype.initialize.call(this, map, overlay, options); + }, + addHooks: function addHooks() { + var edit = this._overlay.editing; + + if (edit instanceof L.DistortableImage.Edit) { + edit._toggleLockMode(); + } else { + edit._lockGroup(); + } + } +}); + +/***/ }), + +/***/ "./src/edit/actions/OpacityAction.js": +/*!*******************************************!*\ + !*** ./src/edit/actions/OpacityAction.js ***! + \*******************************************/ +/***/ (function() { + +L.OpacityAction = L.EditAction.extend({ + initialize: function initialize(map, overlay, options) { + var edit = overlay.editing; + var mode = edit._mode; + var use; + var tooltip; + + if (edit._transparent) { + use = 'opacity_empty'; + tooltip = overlay.options.translation.makeImageOpaque; + } else { + use = 'opacity'; + tooltip = overlay.options.translation.makeImageTransparent; + } + + options = options || {}; + options.toolbarIcon = { + svg: true, + html: use, + tooltip: tooltip, + className: mode === 'lock' ? 'disabled' : '' + }; + L.DistortableImage.action_map.o = mode === 'lock' ? '' : '_toggleOpacity'; + L.EditAction.prototype.initialize.call(this, map, overlay, options); + }, + addHooks: function addHooks() { + var edit = this._overlay.editing; + var link = this._link; + L.IconUtil.toggleXlink(link, 'opacity', 'opacity_empty'); + L.IconUtil.toggleTitle(link, 'Make Image Transparent', 'Make Image Opaque'); + + edit._toggleOpacity(); + } +}); + +/***/ }), + +/***/ "./src/edit/actions/RestoreAction.js": +/*!*******************************************!*\ + !*** ./src/edit/actions/RestoreAction.js ***! + \*******************************************/ +/***/ (function() { + +L.RestoreAction = L.EditAction.extend({ + initialize: function initialize(map, overlay, options) { + var mode = L.Utils.getNestedVal(overlay, 'editing', '_mode'); + var edited = overlay.edited; + options = options || {}; + options.toolbarIcon = { + svg: true, + html: 'restore', + tooltip: overlay.options.translation.restoreImage, + className: edited && mode !== 'lock' ? '' : 'disabled' + }; + L.EditAction.prototype.initialize.call(this, map, overlay, options); + }, + addHooks: function addHooks() { + var ov = this._overlay; + L.DomEvent.on(ov, { + edit: this._enableAction, + restore: this._disableAction + }, this); + ov.restore(); + } +}); + +/***/ }), + +/***/ "./src/edit/actions/RotateAction.js": +/*!******************************************!*\ + !*** ./src/edit/actions/RotateAction.js ***! + \******************************************/ +/***/ (function() { + +L.RotateAction = L.EditAction.extend({ + initialize: function initialize(map, overlay, options) { + options = options || {}; + options.toolbarIcon = { + svg: true, + html: 'rotate', + tooltip: overlay.options.translation.rotateImage, + className: 'rotate' + }; + L.DistortableImage.action_map.r = '_rotateMode'; + L.EditAction.prototype.initialize.call(this, map, overlay, options); + }, + addHooks: function addHooks() { + var edit = this._overlay.editing; + + edit._rotateMode(); + } +}); + +/***/ }), + +/***/ "./src/edit/actions/ScaleAction.js": +/*!*****************************************!*\ + !*** ./src/edit/actions/ScaleAction.js ***! + \*****************************************/ +/***/ (function() { + +L.ScaleAction = L.EditAction.extend({ + initialize: function initialize(map, overlay, options) { + options = options || {}; + options.toolbarIcon = { + svg: true, + html: 'scale', + tooltip: overlay.options.translation.scaleImage, + className: 'scale' + }; + L.DistortableImage.action_map.s = '_scaleMode'; + L.EditAction.prototype.initialize.call(this, map, overlay, options); + }, + addHooks: function addHooks() { + var edit = this._overlay.editing; + + edit._scaleMode(); + } +}); + +/***/ }), + +/***/ "./src/edit/actions/StackAction.js": +/*!*****************************************!*\ + !*** ./src/edit/actions/StackAction.js ***! + \*****************************************/ +/***/ (function() { + +L.StackAction = L.EditAction.extend({ + initialize: function initialize(map, overlay, options) { + var edit = overlay.editing; + var use; + var tooltip; + + if (edit._toggledImage) { + use = 'flip_to_back'; + tooltip = overlay.options.translation.stackToFront; + } else { + use = 'flip_to_front'; + tooltip = overlay.options.translation.stackToBack; + } + + options = options || {}; + options.toolbarIcon = { + svg: true, + html: use, + tooltip: tooltip, + className: edit._mode === 'lock' ? 'disabled' : '' + }; + L.DistortableImage.action_map.q = edit._mode === 'lock' ? '' : '_stackUp'; + L.DistortableImage.action_map.a = edit._mode === 'lock' ? '' : '_stackDown'; + L.EditAction.prototype.initialize.call(this, map, overlay, options); + }, + addHooks: function addHooks() { + var edit = this._overlay.editing; + L.IconUtil.toggleXlink(this._link, 'flip_to_front', 'flip_to_back'); + L.IconUtil.toggleTitle(this._link, 'Stack to Front', 'Stack to Back'); + + edit._toggleOrder(); + } +}); + +/***/ }), + +/***/ "./src/edit/actions/UnlockAction.js": +/*!******************************************!*\ + !*** ./src/edit/actions/UnlockAction.js ***! + \******************************************/ +/***/ (function() { + +L.UnlockAction = L.EditAction.extend({ + initialize: function initialize(map, overlay, options) { + options = options || {}; + options.toolbarIcon = { + svg: true, + html: 'unlock', + tooltip: overlay.options.translation.unlockImages + }; + L.DistortableImage.group_action_map.u = '_unlockGroup'; + L.EditAction.prototype.initialize.call(this, map, overlay, options); + }, + addHooks: function addHooks() { + var edit = this._overlay.editing; + + edit._unlockGroup(); + } +}); + +/***/ }), + +/***/ "./src/edit/getEXIFdata.js": +/*!*********************************!*\ + !*** ./src/edit/getEXIFdata.js ***! + \*********************************/ +/***/ (function() { + +/* eslint-disable no-unused-vars */ +L.EXIF = function getEXIFdata(img) { + if (Object.keys(EXIF.getAllTags(img)).length !== 0) { + console.log(EXIF.getAllTags(img)); + var GPS = EXIF.getAllTags(img); + var altitude; + /* If the lat/lng is available. */ + + if (typeof GPS.GPSLatitude !== 'undefined' && typeof GPS.GPSLongitude !== 'undefined') { + // sadly, encoded in [degrees,minutes,seconds] + // primitive value = GPS.GPSLatitude[x].numerator + var lat = GPS.GPSLatitude[0] + GPS.GPSLatitude[1] / 60 + GPS.GPSLatitude[2] / 3600; + var lng = GPS.GPSLongitude[0] + GPS.GPSLongitude[1] / 60 + GPS.GPSLongitude[2] / 3600; + + if (GPS.GPSLatitudeRef !== 'N') { + lat = lat * -1; + } + + if (GPS.GPSLongitudeRef === 'W') { + lng = lng * -1; + } + } // Attempt to use GPS compass heading; will require + // some trig to calc corner points, which you can find below: + + + var angle = 0; // "T" refers to "True north", so -90. + + if (GPS.GPSImgDirectionRef === 'T') { + angle = Math.PI / 180 * (GPS.GPSImgDirection.numerator / GPS.GPSImgDirection.denominator - 90); // "M" refers to "Magnetic north" + } else if (GPS.GPSImgDirectionRef === 'M') { + angle = Math.PI / 180 * (GPS.GPSImgDirection.numerator / GPS.GPSImgDirection.denominator - 90); + } else { + console.log('No compass data found'); + } + + console.log('Orientation:', GPS.Orientation); + /* If there is orientation data -- i.e. landscape/portrait etc */ + + if (GPS.Orientation === 6) { + // CCW + angle += Math.PI / 180 * -90; + } else if (GPS.Orientation === 8) { + // CW + angle += Math.PI / 180 * 90; + } else if (GPS.Orientation === 3) { + // 180 + angle += Math.PI / 180 * 180; + } + /* If there is altitude data */ + + + if (typeof GPS.GPSAltitude !== 'undefined' && typeof GPS.GPSAltitudeRef !== 'undefined') { + // Attempt to use GPS altitude: + // (may eventually need to find EXIF field of view for correction) + if (typeof GPS.GPSAltitude !== 'undefined' && typeof GPS.GPSAltitudeRef !== 'undefined') { + altitude = GPS.GPSAltitude.numerator / GPS.GPSAltitude.denominator + GPS.GPSAltitudeRef; + } else { + altitude = 0; // none + } + } + } else { + alert('EXIF initialized. Press again to view data in console.'); + } +}; + +/***/ }), + +/***/ "./src/edit/handles/DistortHandle.js": +/*!*******************************************!*\ + !*** ./src/edit/handles/DistortHandle.js ***! + \*******************************************/ +/***/ (function() { + +L.DistortHandle = L.EditHandle.extend({ + options: { + TYPE: 'distort', + icon: L.icon({ + iconUrl: // eslint-disable-next-line max-len + 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAChSURBVO3BIU4DURgGwNkvL2B6AkQTLBqP4QCoSm7DDXoBLBZHDbfgICAIZjEV3YTn9uVHdMZZtcnCfI13bIzxg0emg6Nm6QVbYz3jylEsXRrvwommb49X67jFkz80fR9Mb1YxTzqiWBSLYlEsikWxKBbFolgUi2JRLIpFsSgWxaJY03fHHOu40dH07bAzWCx9Ge/TiWbpHgdsjPGNB2f/yS+7xRCyiiZPJQAAAABJRU5ErkJggg==', + iconSize: [32, 32], + iconAnchor: [16, 16] + }) + }, + _onHandleDrag: function _onHandleDrag() { + var overlay = this._handled; + overlay.setCorner(this._corner, this.getLatLng()); + }, + updateHandle: function updateHandle() { + this.setLatLng(this._handled.getCorner(this._corner)); + } +}); + +L.distortHandle = function (overlay, idx, options) { + return new L.DistortHandle(overlay, idx, options); +}; + +/***/ }), + +/***/ "./src/edit/handles/DragHandle.js": +/*!****************************************!*\ + !*** ./src/edit/handles/DragHandle.js ***! + \****************************************/ +/***/ (function() { + +L.DragHandle = L.EditHandle.extend({ + options: { + TYPE: 'drag', + icon: L.icon({ + // eslint-disable-next-line max-len + iconUrl: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAsVJREFUeNrMVztLXEEUvnNVFAVBAhY2aRKbTZEHJNpYabuNjSgYg/GxdsmPSJkUAa/ZdVEX8mgWYVutbHxAHkVskjQBuUUgBISVhCQk3wnfwMlk1rusN1wHPubOzJlzvjlz5sxc01Ma/hUEwQnwDIjqc7uvgv9YYO86qgIwCXQbdNTlQ8kcCBHgBch8TcloF6oJGr6phk6EQAkfdz3zvgDr9Mr7Fg1fptEZoM8jsmrokpfsiIFO4IIjuE2v1EDmR4LRdlR5Gh51hj8D34ABtm8YTtqna0TgklIw5CgQguKxIojEjmFROg/MKQO27NkFAB+4wAPouGUJiIvWKHwbAxX2XyWRKWkqhT+pbJntJZJuUzISW0+5hW+obxrVBsfvoH/dqCCJuU97GBh2VteLSiYvArmErT8EVoAK9Bw7enbpVYmvAQlyowYforrH5jXL2rPHI/TKONDB7u9AlavdaTBPvPmazUeQuy8f7UomUgTEwIJPEQ3sQGE/6ll2l9H/KcEzBcfWn2IclluM3DpddJxSHujlFkscbUPvmB0LHVnLrId7nlaZVkEc6QGXQI1MAwZcWmVRHeNaQwJMMiU2cwy4s7p/RJ2ckpvIQs+cIs+5GzitloLKHUV3MPREuXbTOKO91dX387gGTONxIgEWm+E61FFrpcyqXLHsEwiDjEsjAksqw5XPoL9MHVrn6QR4q+XZrDaR4RoWzq2ymafuRA/Mq1stSsHLVkcbdf9VjOcx8ZH3+SFWcCWlVPyWuUBOwUWdC1wP5NVjYiXFWLO69PZ6CRTUY6KSIoEKdf6T3IzzgHxnsyHctNBEkmn6Oob8ExUDg/ahGybd177cDjzH5xHwgDiSvoS7I/LZyvxJZj0wod7tkX5G0XVC7rEyLhfLJjBGbKoLLEfZWObyKeZ6oY82g+yf5Zn/mJyHX7PMf04z/T3/LcAAu4E6iiyJqf0AAAAASUVORK5CYII=', + iconSize: [32, 32], + iconAnchor: [16, 16] + }) + }, + _onHandleDrag: function _onHandleDrag() { + var overlay = this._handled; + var formerLatLng = overlay.getCorner(this._corner); + var newLatLng = this.getLatLng(); + overlay.dragBy(formerLatLng, newLatLng); + }, + updateHandle: function updateHandle() { + this.setLatLng(this._handled.getCorner(this._corner)); + } +}); + +L.dragHandle = function (overlay, idx, options) { + return new L.DragHandle(overlay, idx, options); +}; + +/***/ }), + +/***/ "./src/edit/handles/EditHandle.js": +/*!****************************************!*\ + !*** ./src/edit/handles/EditHandle.js ***! + \****************************************/ +/***/ (function() { + +L.EditHandle = L.Marker.extend({ + initialize: function initialize(overlay, corner, options) { + var latlng = overlay.getCorner(corner); + L.setOptions(this, options); + this._handled = overlay; + this._corner = corner; + var markerOptions = { + draggable: true, + zIndexOffset: 10 + }; + + if (options && options.hasOwnProperty('draggable')) { + markerOptions.draggable = options.draggable; + } + + L.Marker.prototype.initialize.call(this, latlng, markerOptions); + }, + onAdd: function onAdd(map) { + L.Marker.prototype.onAdd.call(this, map); + + this._bindListeners(); + + this.updateHandle(); + }, + onRemove: function onRemove(map) { + this._unbindListeners(); + + L.Marker.prototype.onRemove.call(this, map); + }, + _onHandleDragStart: function _onHandleDragStart() { + this._handled.fire('editstart'); + }, + _onHandleDragEnd: function _onHandleDragEnd() { + this._fireEdit(); + }, + _fireEdit: function _fireEdit() { + this._handled.edited = true; + + this._handled.fire('edit'); + }, + _bindListeners: function _bindListeners() { + this.on({ + contextmenu: L.DomEvent.stop, + dragstart: this._onHandleDragStart, + drag: this._onHandleDrag, + dragend: this._onHandleDragEnd + }, this); + + this._handled._map.on('zoomend', this.updateHandle, this); + + this._handled.on('update', this.updateHandle, this); + }, + _unbindListeners: function _unbindListeners() { + this.off({ + contextmenu: L.DomEvent.stop, + dragstart: this._onHandleDragStart, + drag: this._onHandleDrag, + dragend: this._onHandleDragEnd + }, this); + + this._handled._map.off('zoomend', this.updateHandle, this); + + this._handled.off('update', this.updateHandle, this); + }, + + /* Takes two latlngs and calculates the scaling difference. */ + _calculateScalingFactor: function _calculateScalingFactor(latlngA, latlngB) { + var overlay = this._handled; + var map = overlay._map; + var centerPoint = map.latLngToLayerPoint(overlay.getCenter()); + var formerPoint = map.latLngToLayerPoint(latlngA); + var newPoint = map.latLngToLayerPoint(latlngB); + + var formerRadiusSquared = this._d2(centerPoint, formerPoint); + + var newRadiusSquared = this._d2(centerPoint, newPoint); + + return Math.sqrt(newRadiusSquared / formerRadiusSquared); + }, + + /* Distance between two points in cartesian space, squared (distance formula). */ + _d2: function _d2(a, b) { + var dx = a.x - b.x; + var dy = a.y - b.y; + return Math.pow(dx, 2) + Math.pow(dy, 2); + }, + + /* Takes two latlngs and calculates the angle between them. */ + calculateAngleDelta: function calculateAngleDelta(latlngA, latlngB) { + var overlay = this._handled; + var map = overlay._map; + var centerPoint = map.latLngToLayerPoint(overlay.getCenter()); + var formerPoint = map.latLngToLayerPoint(latlngA); + var newPoint = map.latLngToLayerPoint(latlngB); + var initialAngle = Math.atan2(centerPoint.y - formerPoint.y, centerPoint.x - formerPoint.x); + var newAngle = Math.atan2(centerPoint.y - newPoint.y, centerPoint.x - newPoint.x); + return newAngle - initialAngle; + } +}); + +/***/ }), + +/***/ "./src/edit/handles/FreeRotateHandle.js": +/*!**********************************************!*\ + !*** ./src/edit/handles/FreeRotateHandle.js ***! + \**********************************************/ +/***/ (function() { + +L.FreeRotateHandle = L.EditHandle.extend({ + options: { + TYPE: 'freeRotate', + icon: L.icon({ + iconUrl: // eslint-disable-next-line max-len + 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAHiSURBVMXBa3HbShgA0PMp/1sCCo8oCEpgTaCXgIXAJiDzyCJoAUTm4UVQAns1Y8+snWnTvJyeE16hkjDgDrfoNTMKcpC9UPiLSo8JyetkjEHxjPCMyoS199kFoz8Iv1HpMaN3qWDCHoegOKkkRwnJpRmroHgiPFEZ8IBekzEGxQtUEhKSS/fB7Ew4U+lxcGkVZG9QWWPSFAxBcdK59KApuA+yNwp2uEdx1GN25sZJZULSfAtm77SlbNjju6MvG75u+WHRWVR6rDVjMPsgwYyVZl3pLTpHkyYHOx8syMiayaJzlDTZ9YyaZNFVkiYH2ZUEBcVJJXVImuz6Js3Qofe59pq7DoOTILu+g+a288mCouk7/1iH4qTS+2QdDppbV1ZJmrnDXnPnc5UOs2Z0fUmTuyBr+krvSioJyUmQO0dZM7mepMkWnaNRkyrJB6uskTSjxY3Fll8bvmJwlDb83FJ8gMqAB80uyBY3Trb82PAfvjj6vuHnluIdKgMeNXOwctK5NKBoHitrb1RJeHRp5Ux4ojLg0aWMHGQvUOkxIWkKVsHsTPiNSo8HDC5lZIsgO6n0uMUdRvQuFQxB8UR4RmXC2vvsgtEfhL+o9JiQvE7GGBTPCK9QSUjoMWgKDthjDrIX+h/k0I7gth6N5gAAAABJRU5ErkJggg==', + iconSize: [32, 32], + iconAnchor: [16, 16] + }) + }, + _onHandleDrag: function _onHandleDrag() { + var overlay = this._handled; + var map = overlay._map; + var formerLatLng = overlay.getCorner(this._corner); + var newLatLng = this.getLatLng(); + var angle = this.calculateAngleDelta(formerLatLng, newLatLng); + + var scale = this._calculateScalingFactor(formerLatLng, newLatLng); + + if (angle !== 0) { + overlay.rotateBy(angle, 'rad'); + } + + var edgeMinWidth = overlay.edgeMinWidth; + + if (!edgeMinWidth) { + edgeMinWidth = 50; + } + /* just in case */ + + + var corner1 = map.latLngToContainerPoint(overlay.getCorner(0)); + var corner2 = map.latLngToContainerPoint(overlay.getCorner(1)); + var w = Math.abs(corner1.x - corner2.x); + var h = Math.abs(corner1.y - corner2.y); + var distance = Math.sqrt(w * w + h * h); + + if (distance > edgeMinWidth || scale > 1) { + overlay.scaleBy(scale); + } else { + overlay.scaleBy(1); + } + }, + updateHandle: function updateHandle() { + this.setLatLng(this._handled.getCorner(this._corner)); + } +}); + +L.freeRotateHandle = function (overlay, idx, options) { + return new L.FreeRotateHandle(overlay, idx, options); +}; + +/***/ }), + +/***/ "./src/edit/handles/LockHandle.js": +/*!****************************************!*\ + !*** ./src/edit/handles/LockHandle.js ***! + \****************************************/ +/***/ (function() { + +L.LockHandle = L.EditHandle.extend({ + options: { + TYPE: 'lock', + interactive: false, + icon: L.icon({ + // eslint-disable-next-line max-len + iconUrl: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAD8SURBVO3BPU7CYAAA0AdfjIcQlRCQBG7C3gk2uIPG2RC3Dk16Gz0FTO1WZs/gwGCMP/2+xsSl7+n1er1Iz9LtRQjaPeMeO+TinLDCJV78YqjdA04YodKuxhUaPGoRxMmxwRQZSt87Yo4KExGCeAUyLLFB4bMacxywEClIU2KDKXbInTUYo8JCgoFuGoxQO5uiwY1EA91VmDqrcKeDoX8WdNNgjApvmGGLXKIgXY0xGkxQYItrrFFIEKQ5Yo4KEx9yrDFDhlKkIF6NOQ5Y+KpAhiXWKEQI4pxwiwoLPyuxwQw75FoE7fZYocFEuwI7jHCBV39gL92TXq/Xi/AOcmczZmaIMScAAAAASUVORK5CYII=', + iconSize: [32, 32], + iconAnchor: [16, 16] + }) + }, + onRemove: function onRemove(map) { + this.unbindTooltip(); + L.EditHandle.prototype.onRemove.call(this, map); + }, + _bindListeners: function _bindListeners() { + var icon = this.getElement(); + + L.EditHandle.prototype._bindListeners.call(this); + + L.DomEvent.on(icon, { + mousedown: this._tooltipOn, + mouseup: this._tooltipOff + }, this); + L.DomEvent.on(document, 'pointerleave', this._tooltipOff, this); + }, + _unbindListeners: function _unbindListeners() { + var icon = this.getElement(); + + L.EditHandle.prototype._bindListeners.call(this); + + L.DomEvent.off(icon, { + mousedown: this._tooltipOn, + mouseup: this._tooltipOff + }, this); + L.DomEvent.off(document, 'pointerleave', this._tooltipOff, this); + }, + + /* cannot be dragged */ + _onHandleDrag: function _onHandleDrag() {}, + updateHandle: function updateHandle() { + this.setLatLng(this._handled.getCorner(this._corner)); + }, + _tooltipOn: function _tooltipOn(e) { + var eP = this._handled.parentGroup; + var edit = eP ? eP.editing : this._handled.editing; + + if (e.shiftKey) { + return; + } + + if (!this._handled.isSelected() && eP && !eP.isCollected(this._handled)) { + return; + } + + var handlesArr = edit._lockHandles; + this._timer = setTimeout(L.bind(function () { + if (this._timeout) { + clearTimeout(this._timeout); + } + + if (!this.getTooltip()) { + this.bindTooltip('Locked!', { + permanent: true + }); + } else { + handlesArr.eachLayer(function (handle) { + if (this !== handle) { + handle.closeTooltip(); + } + }); + } + + this.openTooltip(); + }, this), 500); + }, + _tooltipOff: function _tooltipOff(e) { + var eP = this._handled.parentGroup; + var edit = eP ? eP.editing : this._handled.editing; + + if (e.shiftKey) { + return; + } + + if (!this._handled.isSelected() && eP && !eP.isCollected(this._handled)) { + return; + } + + var handlesArr = edit._lockHandles; + + if (e.currentTarget === document) { + handlesArr.eachLayer(function (handle) { + handle.closeTooltip(); + }); + } + + if (this._timer) { + clearTimeout(this._timer); + } + + this._timeout = setTimeout(L.bind(function () { + this.closeTooltip(); + }, this), 400); + } +}); + +L.lockHandle = function (overlay, idx, options) { + return new L.LockHandle(overlay, idx, options); +}; + +/***/ }), + +/***/ "./src/edit/handles/RotateHandle.js": +/*!******************************************!*\ + !*** ./src/edit/handles/RotateHandle.js ***! + \******************************************/ +/***/ (function() { + +L.RotateHandle = L.EditHandle.extend({ + options: { + TYPE: 'rotate', + icon: L.icon({ + iconUrl: // eslint-disable-next-line max-len + 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAHiSURBVMXBa3HbShgA0PMp/1sCCo8oCEpgTaCXgIXAJiDzyCJoAUTm4UVQAns1Y8+snWnTvJyeE16hkjDgDrfoNTMKcpC9UPiLSo8JyetkjEHxjPCMyoS199kFoz8Iv1HpMaN3qWDCHoegOKkkRwnJpRmroHgiPFEZ8IBekzEGxQtUEhKSS/fB7Ew4U+lxcGkVZG9QWWPSFAxBcdK59KApuA+yNwp2uEdx1GN25sZJZULSfAtm77SlbNjju6MvG75u+WHRWVR6rDVjMPsgwYyVZl3pLTpHkyYHOx8syMiayaJzlDTZ9YyaZNFVkiYH2ZUEBcVJJXVImuz6Js3Qofe59pq7DoOTILu+g+a288mCouk7/1iH4qTS+2QdDppbV1ZJmrnDXnPnc5UOs2Z0fUmTuyBr+krvSioJyUmQO0dZM7mepMkWnaNRkyrJB6uskTSjxY3Fll8bvmJwlDb83FJ8gMqAB80uyBY3Trb82PAfvjj6vuHnluIdKgMeNXOwctK5NKBoHitrb1RJeHRp5Ux4ojLg0aWMHGQvUOkxIWkKVsHsTPiNSo8HDC5lZIsgO6n0uMUdRvQuFQxB8UR4RmXC2vvsgtEfhL+o9JiQvE7GGBTPCK9QSUjoMWgKDthjDrIX+h/k0I7gth6N5gAAAABJRU5ErkJggg==', + iconSize: [32, 32], + iconAnchor: [16, 16] + }) + }, + _onHandleDrag: function _onHandleDrag() { + var overlay = this._handled; + var formerLatLng = overlay.getCorner(this._corner); + var newLatLng = this.getLatLng(); + var angle = this.calculateAngleDelta(formerLatLng, newLatLng); + /* + * running rotation logic even for an angle delta of 0 + * prevents a small, occasional marker flicker + */ + + overlay.rotateBy(angle, 'rad'); + }, + updateHandle: function updateHandle() { + this.setLatLng(this._handled.getCorner(this._corner)); + } +}); + +L.rotateHandle = function (overlay, idx, options) { + return new L.RotateHandle(overlay, idx, options); +}; + +/***/ }), + +/***/ "./src/edit/handles/ScaleHandle.js": +/*!*****************************************!*\ + !*** ./src/edit/handles/ScaleHandle.js ***! + \*****************************************/ +/***/ (function() { + +L.ScaleHandle = L.EditHandle.extend({ + options: { + TYPE: 'scale', + icon: L.icon({ + iconUrl: // eslint-disable-next-line max-len + 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2ZXJzaW9uPSIxLjEiIHdpZHRoPSI0NTkiIGhlaWdodD0iNDY0IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCA1MTIgNTEyIiB4bWw6c3BhY2U9InByZXNlcnZlIiBzdHlsZT0iIj48cmVjdCBpZD0iYmFja2dyb3VuZHJlY3QiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIHg9IjAiIHk9IjAiIGZpbGw9Im5vbmUiIHN0cm9rZT0ibm9uZSIgY2xhc3M9IiIgc3R5bGU9IiIvPjxnIGNsYXNzPSJjdXJyZW50TGF5ZXIiIHN0eWxlPSIiPjx0aXRsZT5MYXllciAxPC90aXRsZT48cGF0aCBkPSJNNDU5LjA0OTE1OTUzMDQ3MTM0LDg2LjkyNjIzNDUxMjU1MDAyIFYwIGgtODUuNzE0NTczMzU2MzEyMDkgdjI3LjA0MzcxNzQwMzkwNDQ1MiBIODUuNzE0NTczMzU2MzEyMDMgVjAgSDAgdjg2LjkyNjIzNDUxMjU1MDAyIGgyNS43MTQzNzIwMDY4OTM2MjYgdjI4OS43NTQxMTUwNDE4MzM0IEgwIHY4Ni45MjYyMzQ1MTI1NTAwMiBoODUuNzE0NTczMzU2MzEyMDkgdi0yNy4wNDM3MTc0MDM5MDQ0NTIgaDI4NS43MTUyNDQ1MjEwNDAzIHYyNy4wNDM3MTc0MDM5MDQ0NTIgaDg1LjcxNDU3MzM1NjMxMjA5IHYtODYuOTI2MjM0NTEyNTUwMDIgaC0yMy44MDk2MDM3MTAwODY2OSBWODYuOTI2MjM0NTEyNTUwMDIgSDQ1OS4wNDkxNTk1MzA0NzEzNCB6TTM4NC43NjMxOTU5NTUwMDA5LDEyLjU1NjAxMTY1MTgxMjc4MSBoNjEuOTA0OTY5NjQ2MjI1Mzk2IHY2Mi43ODAwNTgyNTkwNjM5MSBoLTYxLjkwNDk2OTY0NjIyNTM5NiBWMTIuNTU2MDExNjUxODEyNzgxIHpNMTIuMzgwOTkzOTI5MjQ1MDUsMTIuNTU2MDExNjUxODEyNzgxIGg2MS45MDQ5Njk2NDYyMjUzOTYgdjYyLjc4MDA1ODI1OTA2MzkxIEgxMi4zODA5OTM5MjkyNDUwNSBWMTIuNTU2MDExNjUxODEyNzgxIHpNNzQuMjg1OTYzNTc1NDcwNTMsNDUxLjA1MDU3MjQxNTEyMDY2IEgxMi4zODA5OTM5MjkyNDUwNSB2LTYyLjc4MDA1ODI1OTA2MzkxIGg2MS45MDQ5Njk2NDYyMjUzOTYgVjQ1MS4wNTA1NzI0MTUxMjA2NiB6TTQ0NS43MTU3ODE0NTI4MjI3NCw0NTEuMDUwNTcyNDE1MTIwNjYgaC02Mi44NTczNTM3OTQ2Mjg4NjQgdi02Mi43ODAwNTgyNTkwNjM5MSBoNjIuODU3MzUzNzk0NjI4ODY0IFY0NTEuMDUwNTcyNDE1MTIwNjYgek00MDcuNjIwNDE1NTE2Njg0MjYsMzc2LjY4MDM0OTU1NDM4MzQ0IGgtMzYuMTkwNTk3NjM5MzMxNzcgdjMyLjgzODc5OTcwNDc0MTEyIEg4NS43MTQ1NzMzNTYzMTIwMyB2LTMyLjgzODc5OTcwNDc0MTEyIEg0OS41MjM5NzU3MTY5ODAzMiBWODYuOTI2MjM0NTEyNTUwMDIgaDM2LjE5MDU5NzYzOTMzMTc3IFY1MC4yMjQwNDY2MDcyNTExMjUgaDI4Ny42MjAwMTI4MTc4NDcyIHYzNi43MDIxODc5MDUyOTg5IGgzNC4yODU4MjkzNDI1MjQ4MzUgVjM3Ni42ODAzNDk1NTQzODM0NCB6IiBpZD0ic3ZnXzIiIGNsYXNzPSIiIGZpbGw9IiMxYTFhZWIiIGZpbGwtb3BhY2l0eT0iMSIvPjwvZz48L3N2Zz4=', + iconSize: [32, 32], + iconAnchor: [16, 16] + }) + }, + _onHandleDrag: function _onHandleDrag() { + var overlay = this._handled; + var map = overlay._map; + var edgeMinWidth = overlay.edgeMinWidth; + var formerLatLng = overlay.getCorner(this._corner); + var newLatLng = this.getLatLng(); + + var scale = this._calculateScalingFactor(formerLatLng, newLatLng); + /* + * checks whether the "edgeMinWidth" property is set and tracks the minimum edge length; + * this enables preventing scaling to zero, but we might also add an overall scale limit + */ + + + if (!edgeMinWidth) { + edgeMinWidth = 50; + } + /* just in case */ + + + var corner1 = map.latLngToLayerPoint(overlay.getCorner(0)); + var corner2 = map.latLngToLayerPoint(overlay.getCorner(1)); + var w = Math.abs(corner1.x - corner2.x); + var h = Math.abs(corner1.y - corner2.y); + var distance = Math.sqrt(w * w + h * h); + + if (distance > edgeMinWidth || scale > 1) { + overlay.scaleBy(scale); + /* + * running scale logic even for a scale ratio of 1 + * prevents a small, occasional marker flicker + */ + } else { + overlay.scaleBy(1); + } + }, + updateHandle: function updateHandle() { + this.setLatLng(this._handled.getCorner(this._corner)); + } +}); + +L.scaleHandle = function (overlay, idx, options) { + return new L.ScaleHandle(overlay, idx, options); +}; + +/***/ }), + +/***/ "./src/edit/toolbars/DistortableImage.ControlBar.js": +/*!**********************************************************!*\ + !*** ./src/edit/toolbars/DistortableImage.ControlBar.js ***! + \**********************************************************/ +/***/ (function() { + +L.distortableImage = L.DistortableImage || {}; +L.distortableImage = L.DistortableImage; +L.DistortableImage.group_action_map = {}; +L.DistortableImage.ControlBar = L.Toolbar2.Control.extend({}); + +L.distortableImage.controlBar = function (options) { + return new L.DistortableImage.ControlBar(options); +}; +/** addInitHooks run before onAdd */ + + +L.DistortableCollection.addInitHook(function () { + /** Default actions */ + this.ACTIONS = [L.ExportAction, L.DeleteAction, L.LockAction, L.UnlockAction]; // all possible modes + + L.DistortableCollection.Edit.MODES = { + lock: L.LockAction, + unlock: L.UnlockAction + }; + var a = this.options.actions ? this.options.actions : this.ACTIONS; + this.editing = L.distortableCollection.edit(this, { + actions: a + }); +}); + +/***/ }), + +/***/ "./src/edit/toolbars/DistortableImage.PopupBar.js": +/*!********************************************************!*\ + !*** ./src/edit/toolbars/DistortableImage.PopupBar.js ***! + \********************************************************/ +/***/ (function() { + +L.DistortableImage = L.DistortableImage || {}; +L.distortableImage = L.DistortableImage; +L.DistortableImage.action_map = {}; +L.DistortableImage.PopupBar = L.Toolbar2.Popup.extend({ + options: { + anchor: [0, -10] + }, + initialize: function initialize(latlng, options) { + L.setOptions(this, options); + L.Toolbar2.Popup.prototype.initialize.call(this, latlng, options); + }, + addHooks: function addHooks(map, ov) { + this.map = map; + this.ov = ov; + }, + tools: function tools() { + if (this._ul) { + return this._ul.children; + } + }, + clickTool: function clickTool(name) { + var tools = this.tools(); + + for (var i = 0; i < tools.length; i++) { + var tool = tools.item(i).children[0]; + + if (L.DomUtil.hasClass(tool, name)) { + tool.click(); + return tool; + } + } + + return false; + } +}); + +L.distortableImage.popupBar = function (latlng, options) { + return new L.DistortableImage.PopupBar(latlng, options); +}; + +L.DistortableImageOverlay.addInitHook(function () { + /** Default actions */ + this.ACTIONS = [L.DragAction, L.ScaleAction, L.DistortAction, L.RotateAction, L.FreeRotateAction, L.LockAction, L.OpacityAction, L.BorderAction, L.ExportAction, L.DeleteAction]; // all possible modes + + L.DistortableImage.Edit.MODES = { + drag: L.DragAction, + scale: L.ScaleAction, + distort: L.DistortAction, + rotate: L.RotateAction, + freeRotate: L.FreeRotateAction, + lock: L.LockAction + }; + var a = this.options.actions ? this.options.actions : this.ACTIONS; + this.editing = L.distortableImage.edit(this, { + actions: a + }); +}); + +/***/ }), + +/***/ "./src/iconsets/IconSet.js": +/*!*********************************!*\ + !*** ./src/iconsets/IconSet.js ***! + \*********************************/ +/***/ (function() { + +/* this is the baseclass other IconSets inherit from, +* we don't use it directly */ +L.IconSet = L.Class.extend({ + _svg: '', + _symbols: '', + render: function render() { + this.addSymbols(this._symbols); + return this._svg; + }, + addSymbols: function addSymbols(symbols) { + this._svg += symbols; + } +}); + +/***/ }), + +/***/ "./src/iconsets/KeymapperIconSet.js": +/*!******************************************!*\ + !*** ./src/iconsets/KeymapperIconSet.js ***! + \******************************************/ +/***/ (function() { + +L.KeymapperIconSet = L.IconSet.extend({ + _symbols: // eslint-disable-next-line max-len + '' +}); + +/***/ }), + +/***/ "./src/iconsets/ToolbarIconSet.js": +/*!****************************************!*\ + !*** ./src/iconsets/ToolbarIconSet.js ***! + \****************************************/ +/***/ (function() { + +/* eslint-disable max-len */ +L.ToolbarIconSet = L.IconSet.extend({ + _symbols: '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' +}); + +/***/ }), + +/***/ "./src/mapmixins/BoxCollector.js": +/*!***************************************!*\ + !*** ./src/mapmixins/BoxCollector.js ***! + \***************************************/ +/***/ (function() { + +L.Map.mergeOptions({ + boxCollector: true, + boxZoom: false +}); +/** + * primarily Leaflet 1.5.1 source code. Overriden so that it's a collection box used with + * our `L.DistortableCollection` class instead of a zoom box. + * */ + +L.Map.BoxCollector = L.Map.BoxZoom.extend({ + initialize: function initialize(map) { + this._map = map; + this._container = map._container; + this._pane = map._panes.overlayPane; + this._resetStateTimeout = 0; + map.on('unload', this._destroy, this); + }, + addHooks: function addHooks() { + L.DomEvent.on(this._container, 'mousedown', this._onMouseDown, this); + }, + removeHooks: function removeHooks() { + L.DomEvent.off(this._container, 'mousedown', this._onMouseDown, this); + }, + moved: function moved() { + return this._moved; + }, + _destroy: function _destroy() { + L.DomUtil.remove(this._pane); + delete this._pane; + }, + _resetState: function _resetState() { + this._resetStateTimeout = 0; + this._moved = false; + }, + _clearDeferredResetState: function _clearDeferredResetState() { + if (this._resetStateTimeout !== 0) { + clearTimeout(this._resetStateTimeout); + this._resetStateTimeout = 0; + } + }, + _onMouseDown: function _onMouseDown(e) { + if (!e.shiftKey || e.which !== 1 && e.button !== 1) { + return false; + } // Clear the deferred resetState if it hasn't executed yet, otherwise it + // will interrupt the interaction and orphan a box element in the container. + + + this._clearDeferredResetState(); + + this._resetState(); + + L.DomUtil.disableTextSelection(); + L.DomUtil.disableImageDrag(); + this._startPoint = this._map.mouseEventToContainerPoint(e); + L.DomEvent.on(document, { + contextmenu: L.DomEvent.stop, + mousemove: this._onMouseMove, + mouseup: this._onMouseUp + }, this); + }, + _onMouseMove: function _onMouseMove(e) { + if (!this._moved) { + this._moved = true; + this._box = L.DomUtil.create('div', 'leaflet-zoom-box', this._container); + L.DomUtil.addClass(this._container, 'leaflet-crosshair'); + + this._map.fire('boxzoomstart'); + } + + this._point = this._map.mouseEventToContainerPoint(e); + this._bounds = L.bounds(this._startPoint, this._point); + + var size = this._bounds.getSize(); + + L.DomUtil.setPosition(this._box, this._bounds.min); + this._box.style.width = size.x + 'px'; + this._box.style.height = size.y + 'px'; + }, + _finish: function _finish() { + if (this._moved) { + L.DomUtil.remove(this._box); + L.DomUtil.removeClass(this._container, 'leaflet-crosshair'); + } + + L.DomUtil.enableTextSelection(); + L.DomUtil.enableImageDrag(); + L.DomEvent.off(document, { + contextmenu: L.DomEvent.stop, + mousemove: this._onMouseMove, + mouseup: this._onMouseUp + }, this); + }, + _onMouseUp: function _onMouseUp(e) { + if (e.which !== 1 && e.button !== 1) { + return; + } + + this._finish(); + + if (!this._moved) { + return; + } // Postpone to next JS tick so internal click event handling + // still see it as "moved". + + + this._clearDeferredResetState(); + + this._resetStateTimeout = setTimeout(L.Util.bind(this._resetState, this), 0); + var bounds = L.latLngBounds(this._map.containerPointToLatLng(this._bounds.getBottomLeft()), this._map.containerPointToLatLng(this._bounds.getTopRight())); + + var zoom = this._map.getZoom(); + + var center = this._map.getCenter(); // calls the `project` method but 1st updates the pixel origin - see https://github.com/publiclab/Leaflet.DistortableImage/pull/344 + + + bounds = this._map._latLngBoundsToNewLayerBounds(bounds, zoom, center); + + this._map.fire('boxcollectend', { + boxCollectBounds: bounds + }); + } +}); +L.Map.addInitHook('addHandler', 'boxCollector', L.Map.BoxCollector); + +/***/ }), + +/***/ "./src/mapmixins/DoubleClickLabels.js": +/*!********************************************!*\ + !*** ./src/mapmixins/DoubleClickLabels.js ***! + \********************************************/ +/***/ (function() { + +L.Map.mergeOptions({ + doubleClickLabels: true +}); +/** + * The `doubleClickLabels` handler replaces `doubleClickZoom` by default if `#addGoogleMutant` + * is used unless the options 'labels: false' or 'doubleClickZoom: false` were passed to it. + */ + +L.Map.DoubleClickLabels = L.Map.DoubleClickZoom.extend({ + enable: function enable() { + var map = this._map; + + if (this._enabled) { + return this; + } // disable 'doubleClickZoom' if 'doubleClickLabels' is enabled. + + + if (map.doubleClickZoom.enabled()) { + map.doubleClickZoom.disable(); + } + + this._map.fire('singleclickon'); + + this._enabled = true; + this.addHooks(); + return this; + }, + disable: function disable() { + if (!this._enabled) { + return this; + } + + this._enabled = false; + this.removeHooks(); + return this; + }, + _fireIfSingle: function _fireIfSingle(e) { + var map = this._map; + var oe = e.originalEvent; // prevents deselection in case of box selector + + if (oe && oe.shiftKey) { + return; + } + + map._clicked += 1; + this._map._clickTimeout = setTimeout(function () { + if (map._clicked === 1) { + map._clicked = 0; + map.fire('singleclick', { + type: 'singleclick' + }); + } else { + // manually fire doubleclick event only for touch screens that don't natively fire it + if (L.Browser.touch && oe && oe.sourceCapabilities.firesTouchEvents) { + map.fire('dblclick'); + } + } + }, 250); + }, + _onDoubleClick: function _onDoubleClick() { + var map = this._map; + var labels = map._labels; + setTimeout(function () { + map._clicked = 0; + clearTimeout(map._clickTimeout); + }, 0); + + if (!labels) { + return; + } + + if (labels.options.opacity === 1) { + labels.options.opacity = 0; + labels.setOpacity(0); + } else { + labels.options.opacity = 1; + labels.setOpacity(1); + } + } +}); +L.Map.addInitHook('addHandler', 'doubleClickLabels', L.Map.DoubleClickLabels); + +/***/ }), + +/***/ "./src/mapmixins/DoubleClickZoom.js": +/*!******************************************!*\ + !*** ./src/mapmixins/DoubleClickZoom.js ***! + \******************************************/ +/***/ (function() { + +/** + * `L.Map.DoubleClickZoom` from leaflet 1.5.1, overrwritten so that it + * 1) Fires a `singleclick` event to avoid deselecting images on `dblclick`. + * 2) Maintains a mutually exclusive relationship with the map's `DoubleClickLabels` handler + */ +L.Map.DoubleClickZoom.include({ + addHooks: function addHooks() { + this._map.on({ + click: this._fireIfSingle, + dblclick: this._onDoubleClick + }, this); + }, + removeHooks: function removeHooks() { + this._map.off({ + click: this._fireIfSingle, + dblclick: this._onDoubleClick + }, this); + }, + enable: function enable() { + if (this._enabled) { + return this; + } // don't enable 'doubleClickZoom' unless 'doubleClickLabels' is disabled first + + + if (this._map.doubleClickLabels) { + if (this._map.doubleClickLabels.enabled()) { + return this; + } + } // signify to collection/instance classes to turn on 'singleclick' listeners + + + this._map.fire('singleclickon'); + + this._enabled = true; + this.addHooks(); + return this; + }, + disable: function disable() { + if (!this._enabled) { + return this; + } // signify to collection/instance safe to swap 'singleclick' listeners with 'click' listeners. + + + this._map.fire('singleclickoff'); + + this._enabled = false; + this.removeHooks(); + return this; + }, + _fireIfSingle: function _fireIfSingle(e) { + var map = this._map; + var oe = e.originalEvent; // prevents deselection in case of box selector + + if (oe && oe.shiftKey) { + return; + } + + map._clicked += 1; + this._map._clickTimeout = setTimeout(function () { + if (map._clicked === 1) { + map._clicked = 0; + map.fire('singleclick', { + type: 'singleclick' + }); + } else { + // manually fire doubleclick event only for touch screens that don't natively fire it + if (L.Browser.touch && oe && oe.sourceCapabilities.firesTouchEvents) { + /* in `DoubleClickLabels.js`, we just do map.fire('dblclick') bc `_onDoublClick` doesn't use the + passed "e" (for now). To generate a 'real' DOM event that will have all of its corresponding core + properties (originalEvent, latlng, etc.), use Leaflet's `#map._fireDOMEvent` (Leaflet 1.5.1 source) */ + map._fireDOMEvent(oe, 'dblclick', [map]); + } + } + }, 250); + }, + _onDoubleClick: function _onDoubleClick(e) { + var map = this._map; + var oe = e.originalEvent; + setTimeout(function () { + map._clicked = 0; + clearTimeout(map._clickTimeout); + }, 0); + + if (!oe) { + return false; + } + + var oldZoom = map.getZoom(); + var delta = map.options.zoomDelta; + var zoom = oe.shiftKey ? oldZoom - delta : oldZoom + delta; + + if (map.options.doubleClickZoom === 'center') { + map.setZoom(zoom); + } else { + map.setZoomAround(e.containerPoint, zoom); + } + } +}); + +/***/ }), + +/***/ "./src/mapmixins/MapMixins.js": +/*!************************************!*\ + !*** ./src/mapmixins/MapMixins.js ***! + \************************************/ +/***/ (function() { + +/* eslint-disable max-len */ +L.Map.include({ + _clicked: 0, + addGoogleMutant: function addGoogleMutant(opts) { + var url = 'http://mt0.google.com/vt/lyrs=s&x={x}&y={y}&z={z}'; + opts = this.mutantOptions = L.extend({ + mutantOpacity: 0.8, + maxZoom: 24, + maxNativeZoom: 20, + minZoom: 0, + labels: true, + labelOpacity: 1, + doubleClickLabels: true + }, opts); + + if (!opts.labels) { + this.mutantOptions = L.extend(this.mutantOptions, { + labelOpacity: opts.labels ? 1 : undefined, + doubleClickLabels: opts.labels ? true : undefined + }); + } + + this._googleMutant = L.tileLayer(url, { + maxZoom: opts.maxZoom, + maxNativeZoom: opts.maxNativeZoom, + minZoom: opts.minZoom, + opacity: opts.mutantOpacity + }).addTo(this); + + if (opts.labels) { + this._addLabels(opts); + } // shouldn't have this handler at all if there are no labels to toggle + else { + this.doubleClickLabels = undefined; + } + + return this; + }, + _addLabels: function _addLabels(opts) { + var url = 'https://stamen-tiles-{s}.a.ssl.fastly.net/toner-labels/{z}/{x}/{y}{r}.{ext}'; + + if (opts.labelOpacity !== 0 && opts.labelOpacity !== 1) { + opts.labelOpacity = 1; + } + + this._labels = L.tileLayer(url, { + attribution: 'Map tiles by Stamen Design, CC BY 3.0 — Map data © OpenStreetMap contributors', + subdomains: 'abcd', + interactive: false, + opacity: opts.labelOpacity, + maxZoom: opts.maxZoom, + maxNativeZoom: opts.maxNativeZoom, + minZoom: opts.minZoom, + ext: 'png' + }).addTo(this); + + if (this.mutantOptions.doubleClickLabels) { + this.doubleClickLabels.enable(); + } + + return this; + } +}); // start off with doubleClickZoom enabled, doubleClickLabels can later be enabled instead +// during initialization + +L.Map.addInitHook(function () { + this.doubleClickLabels.disable(); + this.doubleClickZoom.enable(); +}); + +/***/ }), + +/***/ "./src/util/DomUtil.js": +/*!*****************************!*\ + !*** ./src/util/DomUtil.js ***! + \*****************************/ +/***/ (function() { + +L.DomUtil = L.extend(L.DomUtil, { + initTranslation: function initTranslation(obj) { + this.translation = obj; + }, + getMatrixString: function getMatrixString(m) { + var is3d = L.Browser.webkit3d || L.Browser.gecko3d || L.Browser.ie3d; + /* + * Since matrix3d takes a 4*4 matrix, we add in an empty row and column, + * which act as the identity on the z-axis. + * See: + * http://franklinta.com/2014/09/08/computing-css-matrix3d-transforms/ + * https://developer.mozilla.org/en-US/docs/Web/CSS/transform-function#M.C3.B6bius'_homogeneous_coordinates_in_projective_geometry + */ + + var matrix = [m[0], m[3], 0, m[6], m[1], m[4], 0, m[7], 0, 0, 1, 0, m[2], m[5], 0, m[8]]; + var str = is3d ? 'matrix3d(' + matrix.join(',') + ')' : ''; + + if (!is3d) { + console.log('Your browser must support 3D CSS transforms' + 'in order to use DistortableImageOverlay.'); + } + + return str; + }, + toggleClass: function toggleClass(el, className) { + var c = className; + return this.hasClass(el, c) ? this.removeClass(el, c) : this.addClass(el, c); + }, + confirmDelete: function confirmDelete() { + return window.confirm(this.translation.confirmImageDelete); + }, + confirmDeletes: function confirmDeletes(n) { + if (n === 1) { + return this.confirmDelete(); + } + + var translation = this.translation.confirmImagesDeletes; + var warningMsg = ''; + + if (typeof translation === 'function') { + warningMsg = translation(n); + } else { + warningMsg = translation; + } + + return window.confirm(warningMsg); + } +}); + +/***/ }), + +/***/ "./src/util/IconUtil.js": +/*!******************************!*\ + !*** ./src/util/IconUtil.js ***! + \******************************/ +/***/ (function() { + +L.IconUtil = { + /* creates an svg elemenet with built in accessibility properties + * and standardized classes for styling, takes in the fragment + * identifier (id) of the symbol to reference. note for symplicity + * we allow providing the icon target with or without the '#' prefix + */ + create: function create(ref) { + if (/^#/.test(ref)) { + ref = ref.replace(/^#/, ''); + } + + return '' + '' + ''; + }, + addClassToSvg: function addClassToSvg(container, loader) { + var svg = container.querySelector('svg'); + + if (svg) { + L.DomUtil.addClass(svg, loader); + } + }, + // finds the use element and toggles its icon reference + toggleXlink: function toggleXlink(container, ref1, ref2) { + if (!/^#/.test(ref1)) { + ref1 = '#' + ref1; + } + + if (!/^#/.test(ref2)) { + ref2 = '#' + ref2; + } + + var use = container.querySelector('use'); + + if (use) { + var toggled = use.getAttribute('xlink:href') === ref1 ? ref2 : ref1; + use.setAttribute('xlink:href', toggled); + return toggled; + } + + return false; + }, + toggleTitle: function toggleTitle(container, title1, title2) { + var toggled = container.getAttribute('title') === title1 ? title2 : title1; + container.setAttribute('title', toggled); + + if (container.hasAttribute('aria-label')) { + container.setAttribute('aria-label', toggled); + } + + return toggled; + } +}; + +/***/ }), + +/***/ "./src/util/ImageUtil.js": +/*!*******************************!*\ + !*** ./src/util/ImageUtil.js ***! + \*******************************/ +/***/ (function() { + +L.ImageUtil = { + getCmPerPixel: function getCmPerPixel(overlay) { + var map = overlay._map; + var dist = map.latLngToLayerPoint(overlay.getCorner(0)).distanceTo(map.latLngToLayerPoint(overlay.getCorner(1))); + return dist * 100 / overlay.getElement().width; + } +}; + +/***/ }), + +/***/ "./src/util/MatrixUtil.js": +/*!********************************!*\ + !*** ./src/util/MatrixUtil.js ***! + \********************************/ +/***/ (function() { + +L.MatrixUtil = { + // Compute the adjugate of m + adj: function adj(m) { + return [m[4] * m[8] - m[5] * m[7], m[2] * m[7] - m[1] * m[8], m[1] * m[5] - m[2] * m[4], m[5] * m[6] - m[3] * m[8], m[0] * m[8] - m[2] * m[6], m[2] * m[3] - m[0] * m[5], m[3] * m[7] - m[4] * m[6], m[1] * m[6] - m[0] * m[7], m[0] * m[4] - m[1] * m[3]]; + }, + // multiply two 3*3 matrices + multmm: function multmm(a, b) { + var c = []; + var i; + + for (i = 0; i < 3; i++) { + for (var j = 0; j < 3; j++) { + var cij = 0; + + for (var k = 0; k < 3; k++) { + cij += a[3 * i + k] * b[3 * k + j]; + } + + c[3 * i + j] = cij; + } + } + + return c; + }, + // multiply a 3*3 matrix and a 3-vector + multmv: function multmv(m, v) { + return [m[0] * v[0] + m[1] * v[1] + m[2] * v[2], m[3] * v[0] + m[4] * v[1] + m[5] * v[2], m[6] * v[0] + m[7] * v[1] + m[8] * v[2]]; + }, + // multiply a scalar and a 3*3 matrix + multsm: function multsm(s, m) { + var matrix = []; + + for (var i = 0, l = m.length; i < l; i++) { + matrix.push(s * m[i]); + } + + return matrix; + }, + basisToPoints: function basisToPoints(x1, y1, x2, y2, x3, y3, x4, y4) { + var m = [x1, x2, x3, y1, y2, y3, 1, 1, 1]; + var v = L.MatrixUtil.multmv(L.MatrixUtil.adj(m), [x4, y4, 1]); + return L.MatrixUtil.multmm(m, [v[0], 0, 0, 0, v[1], 0, 0, 0, v[2]]); + }, + project: function project(m, x, y) { + var v = L.MatrixUtil.multmv(m, [x, y, 1]); + return [v[0] / v[2], v[1] / v[2]]; + }, + general2DProjection: function general2DProjection(x1s, y1s, x1d, y1d, x2s, y2s, x2d, y2d, x3s, y3s, x3d, y3d, x4s, y4s, x4d, y4d) { + var s = L.MatrixUtil.basisToPoints(x1s, y1s, x2s, y2s, x3s, y3s, x4s, y4s); + var d = L.MatrixUtil.basisToPoints(x1d, y1d, x2d, y2d, x3d, y3d, x4d, y4d); + var m = L.MatrixUtil.multmm(d, L.MatrixUtil.adj(s)); // Normalize to the unique matrix with m[8] == 1. + // See: http://franklinta.com/2014/09/08/computing-css-matrix3d-transforms/ + + return L.MatrixUtil.multsm(1 / m[8], m); + } +}; + +/***/ }), + +/***/ "./src/util/TrigUtil.js": +/*!******************************!*\ + !*** ./src/util/TrigUtil.js ***! + \******************************/ +/***/ (function() { + +L.TrigUtil = { + calcAngle: function calcAngle(x, y) { + var unit = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'deg'; + return unit === 'deg' ? this.radiansToDegrees(Math.atan2(y, x)) : Math.atan2(y, x); + }, + radiansToDegrees: function radiansToDegrees(angle) { + return angle * 180 / Math.PI; + }, + degreesToRadians: function degreesToRadians(angle) { + return angle * Math.PI / 180; + } +}; + +/***/ }), + +/***/ "./src/util/Utils.js": +/*!***************************!*\ + !*** ./src/util/Utils.js ***! + \***************************/ +/***/ (function() { + +L.Utils = { + initTranslation: function initTranslation() { + var translation = { + deleteImage: 'Delete Image', + deleteImages: 'Delete Images', + distortImage: 'Distort Image', + dragImage: 'Drag Image', + exportImage: 'Export Image', + exportImages: 'Export Images', + removeBorder: 'Remove Border', + addBorder: 'Add Border', + freeRotateImage: 'Free rotate Image', + geolocateImage: 'Geolocate Image', + lockMode: 'Lock Mode', + lockImages: 'Lock Images', + makeImageOpaque: 'Make Image Opaque', + makeImageTransparent: 'Make Image Transparent', + restoreImage: 'Restore Natural Image', + rotateImage: 'Rotate Image', + scaleImage: 'Scale Image', + stackToFront: 'Stack to Front', + stackToBack: 'Stack to Back', + unlockImages: 'Unlock Images', + confirmImageDelete: 'Are you sure? This image will be permanently deleted from the map.', + confirmImagesDeletes: 'Are you sure? These images will be permanently deleted from the map.' + }; + + if (!this.options.translation) { + this.options.translation = translation; + } else { + // If the translation for a word is not specified, fallback to English. + for (var key in translation) { + if (!this.options.translation.hasOwnProperty(key)) { + this.options.translation[key] = translation[key]; + } + } + } + + L.DomUtil.initTranslation(this.options.translation); + }, + getNestedVal: function getNestedVal(obj, key, nestedKey) { + var dig = [key, nestedKey]; + return dig.reduce(function (obj, k) { + return obj && obj[k]; + }, obj); + } +}; + +/***/ }), + +/***/ "./node_modules/events/events.js": +/*!***************************************!*\ + !*** ./node_modules/events/events.js ***! + \***************************************/ +/***/ (function(module) { + +"use strict"; +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + + + +var R = typeof Reflect === 'object' ? Reflect : null +var ReflectApply = R && typeof R.apply === 'function' + ? R.apply + : function ReflectApply(target, receiver, args) { + return Function.prototype.apply.call(target, receiver, args); + } + +var ReflectOwnKeys +if (R && typeof R.ownKeys === 'function') { + ReflectOwnKeys = R.ownKeys +} else if (Object.getOwnPropertySymbols) { + ReflectOwnKeys = function ReflectOwnKeys(target) { + return Object.getOwnPropertyNames(target) + .concat(Object.getOwnPropertySymbols(target)); + }; +} else { + ReflectOwnKeys = function ReflectOwnKeys(target) { + return Object.getOwnPropertyNames(target); + }; +} + +function ProcessEmitWarning(warning) { + if (console && console.warn) console.warn(warning); +} + +var NumberIsNaN = Number.isNaN || function NumberIsNaN(value) { + return value !== value; +} + +function EventEmitter() { + EventEmitter.init.call(this); +} +module.exports = EventEmitter; +module.exports.once = once; + +// Backwards-compat with node 0.10.x +EventEmitter.EventEmitter = EventEmitter; + +EventEmitter.prototype._events = undefined; +EventEmitter.prototype._eventsCount = 0; +EventEmitter.prototype._maxListeners = undefined; + +// By default EventEmitters will print a warning if more than 10 listeners are +// added to it. This is a useful default which helps finding memory leaks. +var defaultMaxListeners = 10; + +function checkListener(listener) { + if (typeof listener !== 'function') { + throw new TypeError('The "listener" argument must be of type Function. Received type ' + typeof listener); + } +} + +Object.defineProperty(EventEmitter, 'defaultMaxListeners', { + enumerable: true, + get: function() { + return defaultMaxListeners; + }, + set: function(arg) { + if (typeof arg !== 'number' || arg < 0 || NumberIsNaN(arg)) { + throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received ' + arg + '.'); + } + defaultMaxListeners = arg; + } +}); + +EventEmitter.init = function() { + + if (this._events === undefined || + this._events === Object.getPrototypeOf(this)._events) { + this._events = Object.create(null); + this._eventsCount = 0; + } + + this._maxListeners = this._maxListeners || undefined; +}; + +// Obviously not all Emitters should be limited to 10. This function allows +// that to be increased. Set to zero for unlimited. +EventEmitter.prototype.setMaxListeners = function setMaxListeners(n) { + if (typeof n !== 'number' || n < 0 || NumberIsNaN(n)) { + throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received ' + n + '.'); + } + this._maxListeners = n; + return this; +}; + +function _getMaxListeners(that) { + if (that._maxListeners === undefined) + return EventEmitter.defaultMaxListeners; + return that._maxListeners; +} + +EventEmitter.prototype.getMaxListeners = function getMaxListeners() { + return _getMaxListeners(this); +}; + +EventEmitter.prototype.emit = function emit(type) { + var args = []; + for (var i = 1; i < arguments.length; i++) args.push(arguments[i]); + var doError = (type === 'error'); + + var events = this._events; + if (events !== undefined) + doError = (doError && events.error === undefined); + else if (!doError) + return false; + + // If there is no 'error' event listener then throw. + if (doError) { + var er; + if (args.length > 0) + er = args[0]; + if (er instanceof Error) { + // Note: The comments on the `throw` lines are intentional, they show + // up in Node's output if this results in an unhandled exception. + throw er; // Unhandled 'error' event + } + // At least give some kind of context to the user + var err = new Error('Unhandled error.' + (er ? ' (' + er.message + ')' : '')); + err.context = er; + throw err; // Unhandled 'error' event + } + + var handler = events[type]; + + if (handler === undefined) + return false; + + if (typeof handler === 'function') { + ReflectApply(handler, this, args); + } else { + var len = handler.length; + var listeners = arrayClone(handler, len); + for (var i = 0; i < len; ++i) + ReflectApply(listeners[i], this, args); + } + + return true; +}; + +function _addListener(target, type, listener, prepend) { + var m; + var events; + var existing; + + checkListener(listener); + + events = target._events; + if (events === undefined) { + events = target._events = Object.create(null); + target._eventsCount = 0; + } else { + // To avoid recursion in the case that type === "newListener"! Before + // adding it to the listeners, first emit "newListener". + if (events.newListener !== undefined) { + target.emit('newListener', type, + listener.listener ? listener.listener : listener); + + // Re-assign `events` because a newListener handler could have caused the + // this._events to be assigned to a new object + events = target._events; + } + existing = events[type]; + } + + if (existing === undefined) { + // Optimize the case of one listener. Don't need the extra array object. + existing = events[type] = listener; + ++target._eventsCount; + } else { + if (typeof existing === 'function') { + // Adding the second element, need to change to array. + existing = events[type] = + prepend ? [listener, existing] : [existing, listener]; + // If we've already got an array, just append. + } else if (prepend) { + existing.unshift(listener); + } else { + existing.push(listener); + } + + // Check for listener leak + m = _getMaxListeners(target); + if (m > 0 && existing.length > m && !existing.warned) { + existing.warned = true; + // No error code for this since it is a Warning + // eslint-disable-next-line no-restricted-syntax + var w = new Error('Possible EventEmitter memory leak detected. ' + + existing.length + ' ' + String(type) + ' listeners ' + + 'added. Use emitter.setMaxListeners() to ' + + 'increase limit'); + w.name = 'MaxListenersExceededWarning'; + w.emitter = target; + w.type = type; + w.count = existing.length; + ProcessEmitWarning(w); + } + } + + return target; +} + +EventEmitter.prototype.addListener = function addListener(type, listener) { + return _addListener(this, type, listener, false); +}; + +EventEmitter.prototype.on = EventEmitter.prototype.addListener; + +EventEmitter.prototype.prependListener = + function prependListener(type, listener) { + return _addListener(this, type, listener, true); + }; + +function onceWrapper() { + if (!this.fired) { + this.target.removeListener(this.type, this.wrapFn); + this.fired = true; + if (arguments.length === 0) + return this.listener.call(this.target); + return this.listener.apply(this.target, arguments); + } +} + +function _onceWrap(target, type, listener) { + var state = { fired: false, wrapFn: undefined, target: target, type: type, listener: listener }; + var wrapped = onceWrapper.bind(state); + wrapped.listener = listener; + state.wrapFn = wrapped; + return wrapped; +} + +EventEmitter.prototype.once = function once(type, listener) { + checkListener(listener); + this.on(type, _onceWrap(this, type, listener)); + return this; +}; + +EventEmitter.prototype.prependOnceListener = + function prependOnceListener(type, listener) { + checkListener(listener); + this.prependListener(type, _onceWrap(this, type, listener)); + return this; + }; + +// Emits a 'removeListener' event if and only if the listener was removed. +EventEmitter.prototype.removeListener = + function removeListener(type, listener) { + var list, events, position, i, originalListener; + + checkListener(listener); + + events = this._events; + if (events === undefined) + return this; + + list = events[type]; + if (list === undefined) + return this; + + if (list === listener || list.listener === listener) { + if (--this._eventsCount === 0) + this._events = Object.create(null); + else { + delete events[type]; + if (events.removeListener) + this.emit('removeListener', type, list.listener || listener); + } + } else if (typeof list !== 'function') { + position = -1; + + for (i = list.length - 1; i >= 0; i--) { + if (list[i] === listener || list[i].listener === listener) { + originalListener = list[i].listener; + position = i; + break; + } + } + + if (position < 0) + return this; + + if (position === 0) + list.shift(); + else { + spliceOne(list, position); + } + + if (list.length === 1) + events[type] = list[0]; + + if (events.removeListener !== undefined) + this.emit('removeListener', type, originalListener || listener); + } + + return this; + }; + +EventEmitter.prototype.off = EventEmitter.prototype.removeListener; + +EventEmitter.prototype.removeAllListeners = + function removeAllListeners(type) { + var listeners, events, i; + + events = this._events; + if (events === undefined) + return this; + + // not listening for removeListener, no need to emit + if (events.removeListener === undefined) { + if (arguments.length === 0) { + this._events = Object.create(null); + this._eventsCount = 0; + } else if (events[type] !== undefined) { + if (--this._eventsCount === 0) + this._events = Object.create(null); + else + delete events[type]; + } + return this; + } + + // emit removeListener for all listeners on all events + if (arguments.length === 0) { + var keys = Object.keys(events); + var key; + for (i = 0; i < keys.length; ++i) { + key = keys[i]; + if (key === 'removeListener') continue; + this.removeAllListeners(key); + } + this.removeAllListeners('removeListener'); + this._events = Object.create(null); + this._eventsCount = 0; + return this; + } + + listeners = events[type]; + + if (typeof listeners === 'function') { + this.removeListener(type, listeners); + } else if (listeners !== undefined) { + // LIFO order + for (i = listeners.length - 1; i >= 0; i--) { + this.removeListener(type, listeners[i]); + } + } + + return this; + }; + +function _listeners(target, type, unwrap) { + var events = target._events; + + if (events === undefined) + return []; + + var evlistener = events[type]; + if (evlistener === undefined) + return []; + + if (typeof evlistener === 'function') + return unwrap ? [evlistener.listener || evlistener] : [evlistener]; + + return unwrap ? + unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length); +} + +EventEmitter.prototype.listeners = function listeners(type) { + return _listeners(this, type, true); +}; + +EventEmitter.prototype.rawListeners = function rawListeners(type) { + return _listeners(this, type, false); +}; + +EventEmitter.listenerCount = function(emitter, type) { + if (typeof emitter.listenerCount === 'function') { + return emitter.listenerCount(type); + } else { + return listenerCount.call(emitter, type); + } +}; + +EventEmitter.prototype.listenerCount = listenerCount; +function listenerCount(type) { + var events = this._events; + + if (events !== undefined) { + var evlistener = events[type]; + + if (typeof evlistener === 'function') { + return 1; + } else if (evlistener !== undefined) { + return evlistener.length; + } + } + + return 0; +} + +EventEmitter.prototype.eventNames = function eventNames() { + return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : []; +}; + +function arrayClone(arr, n) { + var copy = new Array(n); + for (var i = 0; i < n; ++i) + copy[i] = arr[i]; + return copy; +} + +function spliceOne(list, index) { + for (; index + 1 < list.length; index++) + list[index] = list[index + 1]; + list.pop(); +} + +function unwrapListeners(arr) { + var ret = new Array(arr.length); + for (var i = 0; i < ret.length; ++i) { + ret[i] = arr[i].listener || arr[i]; + } + return ret; +} + +function once(emitter, name) { + return new Promise(function (resolve, reject) { + function errorListener(err) { + emitter.removeListener(name, resolver); + reject(err); + } + + function resolver() { + if (typeof emitter.removeListener === 'function') { + emitter.removeListener('error', errorListener); + } + resolve([].slice.call(arguments)); + }; + + eventTargetAgnosticAddListener(emitter, name, resolver, { once: true }); + if (name !== 'error') { + addErrorHandlerIfEventEmitter(emitter, errorListener, { once: true }); + } + }); +} + +function addErrorHandlerIfEventEmitter(emitter, handler, flags) { + if (typeof emitter.on === 'function') { + eventTargetAgnosticAddListener(emitter, 'error', handler, flags); + } +} + +function eventTargetAgnosticAddListener(emitter, name, listener, flags) { + if (typeof emitter.on === 'function') { + if (flags.once) { + emitter.once(name, listener); + } else { + emitter.on(name, listener); + } + } else if (typeof emitter.addEventListener === 'function') { + // EventTarget does not have `error` event semantics like Node + // EventEmitters, we do not listen for `error` events here. + emitter.addEventListener(name, function wrapListener(arg) { + // IE does not have builtin `{ once: true }` support so we + // have to do it manually. + if (flags.once) { + emitter.removeEventListener(name, wrapListener); + } + listener(arg); + }); + } else { + throw new TypeError('The "emitter" argument must be of type EventEmitter. Received type ' + typeof emitter); + } +} + + +/***/ }), + +/***/ "./node_modules/html-entities/lib/index.js": +/*!*************************************************!*\ + !*** ./node_modules/html-entities/lib/index.js ***! + \*************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +var __assign = (this && this.__assign) || function () { + __assign = Object.assign || function(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +var named_references_1 = __webpack_require__(/*! ./named-references */ "./node_modules/html-entities/lib/named-references.js"); +var numeric_unicode_map_1 = __webpack_require__(/*! ./numeric-unicode-map */ "./node_modules/html-entities/lib/numeric-unicode-map.js"); +var surrogate_pairs_1 = __webpack_require__(/*! ./surrogate-pairs */ "./node_modules/html-entities/lib/surrogate-pairs.js"); +var allNamedReferences = __assign(__assign({}, named_references_1.namedReferences), { all: named_references_1.namedReferences.html5 }); +var encodeRegExps = { + specialChars: /[<>'"&]/g, + nonAscii: /(?:[<>'"&\u0080-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])/g, + nonAsciiPrintable: /(?:[<>'"&\x01-\x08\x11-\x15\x17-\x1F\x7f-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])/g, + extensive: /(?:[\x01-\x0c\x0e-\x1f\x21-\x2c\x2e-\x2f\x3a-\x40\x5b-\x60\x7b-\x7d\x7f-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])/g +}; +var defaultEncodeOptions = { + mode: 'specialChars', + level: 'all', + numeric: 'decimal' +}; +/** Encodes all the necessary (specified by `level`) characters in the text */ +function encode(text, _a) { + var _b = _a === void 0 ? defaultEncodeOptions : _a, _c = _b.mode, mode = _c === void 0 ? 'specialChars' : _c, _d = _b.numeric, numeric = _d === void 0 ? 'decimal' : _d, _e = _b.level, level = _e === void 0 ? 'all' : _e; + if (!text) { + return ''; + } + var encodeRegExp = encodeRegExps[mode]; + var references = allNamedReferences[level].characters; + var isHex = numeric === 'hexadecimal'; + encodeRegExp.lastIndex = 0; + var _b = encodeRegExp.exec(text); + var _c; + if (_b) { + _c = ''; + var _d = 0; + do { + if (_d !== _b.index) { + _c += text.substring(_d, _b.index); + } + var _e = _b[0]; + var result_1 = references[_e]; + if (!result_1) { + var code_1 = _e.length > 1 ? surrogate_pairs_1.getCodePoint(_e, 0) : _e.charCodeAt(0); + result_1 = (isHex ? '&#x' + code_1.toString(16) : '&#' + code_1) + ';'; + } + _c += result_1; + _d = _b.index + _e.length; + } while ((_b = encodeRegExp.exec(text))); + if (_d !== text.length) { + _c += text.substring(_d); + } + } + else { + _c = + text; + } + return _c; +} +exports.encode = encode; +var defaultDecodeOptions = { + scope: 'body', + level: 'all' +}; +var strict = /&(?:#\d+|#[xX][\da-fA-F]+|[0-9a-zA-Z]+);/g; +var attribute = /&(?:#\d+|#[xX][\da-fA-F]+|[0-9a-zA-Z]+)[;=]?/g; +var baseDecodeRegExps = { + xml: { + strict: strict, + attribute: attribute, + body: named_references_1.bodyRegExps.xml + }, + html4: { + strict: strict, + attribute: attribute, + body: named_references_1.bodyRegExps.html4 + }, + html5: { + strict: strict, + attribute: attribute, + body: named_references_1.bodyRegExps.html5 + } +}; +var decodeRegExps = __assign(__assign({}, baseDecodeRegExps), { all: baseDecodeRegExps.html5 }); +var fromCharCode = String.fromCharCode; +var outOfBoundsChar = fromCharCode(65533); +var defaultDecodeEntityOptions = { + level: 'all' +}; +/** Decodes a single entity */ +function decodeEntity(entity, _a) { + var _b = (_a === void 0 ? defaultDecodeEntityOptions : _a).level, level = _b === void 0 ? 'all' : _b; + if (!entity) { + return ''; + } + var _b = entity; + var decodeEntityLastChar_1 = entity[entity.length - 1]; + if (false) {} + else if (false) {} + else { + var decodeResultByReference_1 = allNamedReferences[level].entities[entity]; + if (decodeResultByReference_1) { + _b = decodeResultByReference_1; + } + else if (entity[0] === '&' && entity[1] === '#') { + var decodeSecondChar_1 = entity[2]; + var decodeCode_1 = decodeSecondChar_1 == 'x' || decodeSecondChar_1 == 'X' + ? parseInt(entity.substr(3), 16) + : parseInt(entity.substr(2)); + _b = + decodeCode_1 >= 0x10ffff + ? outOfBoundsChar + : decodeCode_1 > 65535 + ? surrogate_pairs_1.fromCodePoint(decodeCode_1) + : fromCharCode(numeric_unicode_map_1.numericUnicodeMap[decodeCode_1] || decodeCode_1); + } + } + return _b; +} +exports.decodeEntity = decodeEntity; +/** Decodes all entities in the text */ +function decode(text, _a) { + var decodeSecondChar_1 = _a === void 0 ? defaultDecodeOptions : _a, decodeCode_1 = decodeSecondChar_1.level, level = decodeCode_1 === void 0 ? 'all' : decodeCode_1, _b = decodeSecondChar_1.scope, scope = _b === void 0 ? level === 'xml' ? 'strict' : 'body' : _b; + if (!text) { + return ''; + } + var decodeRegExp = decodeRegExps[level][scope]; + var references = allNamedReferences[level].entities; + var isAttribute = scope === 'attribute'; + var isStrict = scope === 'strict'; + decodeRegExp.lastIndex = 0; + var replaceMatch_1 = decodeRegExp.exec(text); + var replaceResult_1; + if (replaceMatch_1) { + replaceResult_1 = ''; + var replaceLastIndex_1 = 0; + do { + if (replaceLastIndex_1 !== replaceMatch_1.index) { + replaceResult_1 += text.substring(replaceLastIndex_1, replaceMatch_1.index); + } + var replaceInput_1 = replaceMatch_1[0]; + var decodeResult_1 = replaceInput_1; + var decodeEntityLastChar_2 = replaceInput_1[replaceInput_1.length - 1]; + if (isAttribute + && decodeEntityLastChar_2 === '=') { + decodeResult_1 = replaceInput_1; + } + else if (isStrict + && decodeEntityLastChar_2 !== ';') { + decodeResult_1 = replaceInput_1; + } + else { + var decodeResultByReference_2 = references[replaceInput_1]; + if (decodeResultByReference_2) { + decodeResult_1 = decodeResultByReference_2; + } + else if (replaceInput_1[0] === '&' && replaceInput_1[1] === '#') { + var decodeSecondChar_2 = replaceInput_1[2]; + var decodeCode_2 = decodeSecondChar_2 == 'x' || decodeSecondChar_2 == 'X' + ? parseInt(replaceInput_1.substr(3), 16) + : parseInt(replaceInput_1.substr(2)); + decodeResult_1 = + decodeCode_2 >= 0x10ffff + ? outOfBoundsChar + : decodeCode_2 > 65535 + ? surrogate_pairs_1.fromCodePoint(decodeCode_2) + : fromCharCode(numeric_unicode_map_1.numericUnicodeMap[decodeCode_2] || decodeCode_2); + } + } + replaceResult_1 += decodeResult_1; + replaceLastIndex_1 = replaceMatch_1.index + replaceInput_1.length; + } while ((replaceMatch_1 = decodeRegExp.exec(text))); + if (replaceLastIndex_1 !== text.length) { + replaceResult_1 += text.substring(replaceLastIndex_1); + } + } + else { + replaceResult_1 = + text; + } + return replaceResult_1; +} +exports.decode = decode; + + +/***/ }), + +/***/ "./node_modules/html-entities/lib/named-references.js": +/*!************************************************************!*\ + !*** ./node_modules/html-entities/lib/named-references.js ***! + \************************************************************/ +/***/ (function(__unused_webpack_module, exports) { + +"use strict"; +Object.defineProperty(exports, "__esModule", ({value:true}));exports.bodyRegExps={xml:/&(?:#\d+|#[xX][\da-fA-F]+|[0-9a-zA-Z]+);?/g,html4:/&(?:nbsp|iexcl|cent|pound|curren|yen|brvbar|sect|uml|copy|ordf|laquo|not|shy|reg|macr|deg|plusmn|sup2|sup3|acute|micro|para|middot|cedil|sup1|ordm|raquo|frac14|frac12|frac34|iquest|Agrave|Aacute|Acirc|Atilde|Auml|Aring|AElig|Ccedil|Egrave|Eacute|Ecirc|Euml|Igrave|Iacute|Icirc|Iuml|ETH|Ntilde|Ograve|Oacute|Ocirc|Otilde|Ouml|times|Oslash|Ugrave|Uacute|Ucirc|Uuml|Yacute|THORN|szlig|agrave|aacute|acirc|atilde|auml|aring|aelig|ccedil|egrave|eacute|ecirc|euml|igrave|iacute|icirc|iuml|eth|ntilde|ograve|oacute|ocirc|otilde|ouml|divide|oslash|ugrave|uacute|ucirc|uuml|yacute|thorn|yuml|quot|amp|lt|gt|#\d+|#[xX][\da-fA-F]+|[0-9a-zA-Z]+);?/g,html5:/&(?:AElig|AMP|Aacute|Acirc|Agrave|Aring|Atilde|Auml|COPY|Ccedil|ETH|Eacute|Ecirc|Egrave|Euml|GT|Iacute|Icirc|Igrave|Iuml|LT|Ntilde|Oacute|Ocirc|Ograve|Oslash|Otilde|Ouml|QUOT|REG|THORN|Uacute|Ucirc|Ugrave|Uuml|Yacute|aacute|acirc|acute|aelig|agrave|amp|aring|atilde|auml|brvbar|ccedil|cedil|cent|copy|curren|deg|divide|eacute|ecirc|egrave|eth|euml|frac12|frac14|frac34|gt|iacute|icirc|iexcl|igrave|iquest|iuml|laquo|lt|macr|micro|middot|nbsp|not|ntilde|oacute|ocirc|ograve|ordf|ordm|oslash|otilde|ouml|para|plusmn|pound|quot|raquo|reg|sect|shy|sup1|sup2|sup3|szlig|thorn|times|uacute|ucirc|ugrave|uml|uuml|yacute|yen|yuml|#\d+|#[xX][\da-fA-F]+|[0-9a-zA-Z]+);?/g};exports.namedReferences={xml:{entities:{"<":"<",">":">",""":'"',"'":"'","&":"&"},characters:{"<":"<",">":">",'"':""","'":"'","&":"&"}},html4:{entities:{"'":"'"," ":" "," ":" ","¡":"¡","¡":"¡","¢":"¢","¢":"¢","£":"£","£":"£","¤":"¤","¤":"¤","¥":"¥","¥":"¥","¦":"¦","¦":"¦","§":"§","§":"§","¨":"¨","¨":"¨","©":"©","©":"©","ª":"ª","ª":"ª","«":"«","«":"«","¬":"¬","¬":"¬","­":"­","­":"­","®":"®","®":"®","¯":"¯","¯":"¯","°":"°","°":"°","±":"±","±":"±","²":"²","²":"²","³":"³","³":"³","´":"´","´":"´","µ":"µ","µ":"µ","¶":"¶","¶":"¶","·":"·","·":"·","¸":"¸","¸":"¸","¹":"¹","¹":"¹","º":"º","º":"º","»":"»","»":"»","¼":"¼","¼":"¼","½":"½","½":"½","¾":"¾","¾":"¾","¿":"¿","¿":"¿","À":"À","À":"À","Á":"Á","Á":"Á","Â":"Â","Â":"Â","Ã":"Ã","Ã":"Ã","Ä":"Ä","Ä":"Ä","Å":"Å","Å":"Å","Æ":"Æ","Æ":"Æ","Ç":"Ç","Ç":"Ç","È":"È","È":"È","É":"É","É":"É","Ê":"Ê","Ê":"Ê","Ë":"Ë","Ë":"Ë","Ì":"Ì","Ì":"Ì","Í":"Í","Í":"Í","Î":"Î","Î":"Î","Ï":"Ï","Ï":"Ï","Ð":"Ð","Ð":"Ð","Ñ":"Ñ","Ñ":"Ñ","Ò":"Ò","Ò":"Ò","Ó":"Ó","Ó":"Ó","Ô":"Ô","Ô":"Ô","Õ":"Õ","Õ":"Õ","Ö":"Ö","Ö":"Ö","×":"×","×":"×","Ø":"Ø","Ø":"Ø","Ù":"Ù","Ù":"Ù","Ú":"Ú","Ú":"Ú","Û":"Û","Û":"Û","Ü":"Ü","Ü":"Ü","Ý":"Ý","Ý":"Ý","Þ":"Þ","Þ":"Þ","ß":"ß","ß":"ß","à":"à","à":"à","á":"á","á":"á","â":"â","â":"â","ã":"ã","ã":"ã","ä":"ä","ä":"ä","å":"å","å":"å","æ":"æ","æ":"æ","ç":"ç","ç":"ç","è":"è","è":"è","é":"é","é":"é","ê":"ê","ê":"ê","ë":"ë","ë":"ë","ì":"ì","ì":"ì","í":"í","í":"í","î":"î","î":"î","ï":"ï","ï":"ï","ð":"ð","ð":"ð","ñ":"ñ","ñ":"ñ","ò":"ò","ò":"ò","ó":"ó","ó":"ó","ô":"ô","ô":"ô","õ":"õ","õ":"õ","ö":"ö","ö":"ö","÷":"÷","÷":"÷","ø":"ø","ø":"ø","ù":"ù","ù":"ù","ú":"ú","ú":"ú","û":"û","û":"û","ü":"ü","ü":"ü","ý":"ý","ý":"ý","þ":"þ","þ":"þ","ÿ":"ÿ","ÿ":"ÿ",""":'"',""":'"',"&":"&","&":"&","<":"<","<":"<",">":">",">":">","Œ":"Œ","œ":"œ","Š":"Š","š":"š","Ÿ":"Ÿ","ˆ":"ˆ","˜":"˜"," ":" "," ":" "," ":" ","‌":"‌","‍":"‍","‎":"‎","‏":"‏","–":"–","—":"—","‘":"‘","’":"’","‚":"‚","“":"“","”":"”","„":"„","†":"†","‡":"‡","‰":"‰","‹":"‹","›":"›","€":"€","ƒ":"ƒ","Α":"Α","Β":"Β","Γ":"Γ","Δ":"Δ","Ε":"Ε","Ζ":"Ζ","Η":"Η","Θ":"Θ","Ι":"Ι","Κ":"Κ","Λ":"Λ","Μ":"Μ","Ν":"Ν","Ξ":"Ξ","Ο":"Ο","Π":"Π","Ρ":"Ρ","Σ":"Σ","Τ":"Τ","Υ":"Υ","Φ":"Φ","Χ":"Χ","Ψ":"Ψ","Ω":"Ω","α":"α","β":"β","γ":"γ","δ":"δ","ε":"ε","ζ":"ζ","η":"η","θ":"θ","ι":"ι","κ":"κ","λ":"λ","μ":"μ","ν":"ν","ξ":"ξ","ο":"ο","π":"π","ρ":"ρ","ς":"ς","σ":"σ","τ":"τ","υ":"υ","φ":"φ","χ":"χ","ψ":"ψ","ω":"ω","ϑ":"ϑ","ϒ":"ϒ","ϖ":"ϖ","•":"•","…":"…","′":"′","″":"″","‾":"‾","⁄":"⁄","℘":"℘","ℑ":"ℑ","ℜ":"ℜ","™":"™","ℵ":"ℵ","←":"←","↑":"↑","→":"→","↓":"↓","↔":"↔","↵":"↵","⇐":"⇐","⇑":"⇑","⇒":"⇒","⇓":"⇓","⇔":"⇔","∀":"∀","∂":"∂","∃":"∃","∅":"∅","∇":"∇","∈":"∈","∉":"∉","∋":"∋","∏":"∏","∑":"∑","−":"−","∗":"∗","√":"√","∝":"∝","∞":"∞","∠":"∠","∧":"∧","∨":"∨","∩":"∩","∪":"∪","∫":"∫","∴":"∴","∼":"∼","≅":"≅","≈":"≈","≠":"≠","≡":"≡","≤":"≤","≥":"≥","⊂":"⊂","⊃":"⊃","⊄":"⊄","⊆":"⊆","⊇":"⊇","⊕":"⊕","⊗":"⊗","⊥":"⊥","⋅":"⋅","⌈":"⌈","⌉":"⌉","⌊":"⌊","⌋":"⌋","⟨":"〈","⟩":"〉","◊":"◊","♠":"♠","♣":"♣","♥":"♥","♦":"♦"},characters:{"'":"'"," ":" ","¡":"¡","¢":"¢","£":"£","¤":"¤","¥":"¥","¦":"¦","§":"§","¨":"¨","©":"©","ª":"ª","«":"«","¬":"¬","­":"­","®":"®","¯":"¯","°":"°","±":"±","²":"²","³":"³","´":"´","µ":"µ","¶":"¶","·":"·","¸":"¸","¹":"¹","º":"º","»":"»","¼":"¼","½":"½","¾":"¾","¿":"¿","À":"À","Á":"Á","Â":"Â","Ã":"Ã","Ä":"Ä","Å":"Å","Æ":"Æ","Ç":"Ç","È":"È","É":"É","Ê":"Ê","Ë":"Ë","Ì":"Ì","Í":"Í","Î":"Î","Ï":"Ï","Ð":"Ð","Ñ":"Ñ","Ò":"Ò","Ó":"Ó","Ô":"Ô","Õ":"Õ","Ö":"Ö","×":"×","Ø":"Ø","Ù":"Ù","Ú":"Ú","Û":"Û","Ü":"Ü","Ý":"Ý","Þ":"Þ","ß":"ß","à":"à","á":"á","â":"â","ã":"ã","ä":"ä","å":"å","æ":"æ","ç":"ç","è":"è","é":"é","ê":"ê","ë":"ë","ì":"ì","í":"í","î":"î","ï":"ï","ð":"ð","ñ":"ñ","ò":"ò","ó":"ó","ô":"ô","õ":"õ","ö":"ö","÷":"÷","ø":"ø","ù":"ù","ú":"ú","û":"û","ü":"ü","ý":"ý","þ":"þ","ÿ":"ÿ",'"':""","&":"&","<":"<",">":">","Œ":"Œ","œ":"œ","Š":"Š","š":"š","Ÿ":"Ÿ","ˆ":"ˆ","˜":"˜"," ":" "," ":" "," ":" ","‌":"‌","‍":"‍","‎":"‎","‏":"‏","–":"–","—":"—","‘":"‘","’":"’","‚":"‚","“":"“","”":"”","„":"„","†":"†","‡":"‡","‰":"‰","‹":"‹","›":"›","€":"€","ƒ":"ƒ","Α":"Α","Β":"Β","Γ":"Γ","Δ":"Δ","Ε":"Ε","Ζ":"Ζ","Η":"Η","Θ":"Θ","Ι":"Ι","Κ":"Κ","Λ":"Λ","Μ":"Μ","Ν":"Ν","Ξ":"Ξ","Ο":"Ο","Π":"Π","Ρ":"Ρ","Σ":"Σ","Τ":"Τ","Υ":"Υ","Φ":"Φ","Χ":"Χ","Ψ":"Ψ","Ω":"Ω","α":"α","β":"β","γ":"γ","δ":"δ","ε":"ε","ζ":"ζ","η":"η","θ":"θ","ι":"ι","κ":"κ","λ":"λ","μ":"μ","ν":"ν","ξ":"ξ","ο":"ο","π":"π","ρ":"ρ","ς":"ς","σ":"σ","τ":"τ","υ":"υ","φ":"φ","χ":"χ","ψ":"ψ","ω":"ω","ϑ":"ϑ","ϒ":"ϒ","ϖ":"ϖ","•":"•","…":"…","′":"′","″":"″","‾":"‾","⁄":"⁄","℘":"℘","ℑ":"ℑ","ℜ":"ℜ","™":"™","ℵ":"ℵ","←":"←","↑":"↑","→":"→","↓":"↓","↔":"↔","↵":"↵","⇐":"⇐","⇑":"⇑","⇒":"⇒","⇓":"⇓","⇔":"⇔","∀":"∀","∂":"∂","∃":"∃","∅":"∅","∇":"∇","∈":"∈","∉":"∉","∋":"∋","∏":"∏","∑":"∑","−":"−","∗":"∗","√":"√","∝":"∝","∞":"∞","∠":"∠","∧":"∧","∨":"∨","∩":"∩","∪":"∪","∫":"∫","∴":"∴","∼":"∼","≅":"≅","≈":"≈","≠":"≠","≡":"≡","≤":"≤","≥":"≥","⊂":"⊂","⊃":"⊃","⊄":"⊄","⊆":"⊆","⊇":"⊇","⊕":"⊕","⊗":"⊗","⊥":"⊥","⋅":"⋅","⌈":"⌈","⌉":"⌉","⌊":"⌊","⌋":"⌋","〈":"⟨","〉":"⟩","◊":"◊","♠":"♠","♣":"♣","♥":"♥","♦":"♦"}},html5:{entities:{"Æ":"Æ","Æ":"Æ","&":"&","&":"&","Á":"Á","Á":"Á","Ă":"Ă","Â":"Â","Â":"Â","А":"А","𝔄":"𝔄","À":"À","À":"À","Α":"Α","Ā":"Ā","⩓":"⩓","Ą":"Ą","𝔸":"𝔸","⁡":"⁡","Å":"Å","Å":"Å","𝒜":"𝒜","≔":"≔","Ã":"Ã","Ã":"Ã","Ä":"Ä","Ä":"Ä","∖":"∖","⫧":"⫧","⌆":"⌆","Б":"Б","∵":"∵","ℬ":"ℬ","Β":"Β","𝔅":"𝔅","𝔹":"𝔹","˘":"˘","ℬ":"ℬ","≎":"≎","Ч":"Ч","©":"©","©":"©","Ć":"Ć","⋒":"⋒","ⅅ":"ⅅ","ℭ":"ℭ","Č":"Č","Ç":"Ç","Ç":"Ç","Ĉ":"Ĉ","∰":"∰","Ċ":"Ċ","¸":"¸","·":"·","ℭ":"ℭ","Χ":"Χ","⊙":"⊙","⊖":"⊖","⊕":"⊕","⊗":"⊗","∲":"∲","”":"”","’":"’","∷":"∷","⩴":"⩴","≡":"≡","∯":"∯","∮":"∮","ℂ":"ℂ","∐":"∐","∳":"∳","⨯":"⨯","𝒞":"𝒞","⋓":"⋓","≍":"≍","ⅅ":"ⅅ","⤑":"⤑","Ђ":"Ђ","Ѕ":"Ѕ","Џ":"Џ","‡":"‡","↡":"↡","⫤":"⫤","Ď":"Ď","Д":"Д","∇":"∇","Δ":"Δ","𝔇":"𝔇","´":"´","˙":"˙","˝":"˝","`":"`","˜":"˜","⋄":"⋄","ⅆ":"ⅆ","𝔻":"𝔻","¨":"¨","⃜":"⃜","≐":"≐","∯":"∯","¨":"¨","⇓":"⇓","⇐":"⇐","⇔":"⇔","⫤":"⫤","⟸":"⟸","⟺":"⟺","⟹":"⟹","⇒":"⇒","⊨":"⊨","⇑":"⇑","⇕":"⇕","∥":"∥","↓":"↓","⤓":"⤓","⇵":"⇵","̑":"̑","⥐":"⥐","⥞":"⥞","↽":"↽","⥖":"⥖","⥟":"⥟","⇁":"⇁","⥗":"⥗","⊤":"⊤","↧":"↧","⇓":"⇓","𝒟":"𝒟","Đ":"Đ","Ŋ":"Ŋ","Ð":"Ð","Ð":"Ð","É":"É","É":"É","Ě":"Ě","Ê":"Ê","Ê":"Ê","Э":"Э","Ė":"Ė","𝔈":"𝔈","È":"È","È":"È","∈":"∈","Ē":"Ē","◻":"◻","▫":"▫","Ę":"Ę","𝔼":"𝔼","Ε":"Ε","⩵":"⩵","≂":"≂","⇌":"⇌","ℰ":"ℰ","⩳":"⩳","Η":"Η","Ë":"Ë","Ë":"Ë","∃":"∃","ⅇ":"ⅇ","Ф":"Ф","𝔉":"𝔉","◼":"◼","▪":"▪","𝔽":"𝔽","∀":"∀","ℱ":"ℱ","ℱ":"ℱ","Ѓ":"Ѓ",">":">",">":">","Γ":"Γ","Ϝ":"Ϝ","Ğ":"Ğ","Ģ":"Ģ","Ĝ":"Ĝ","Г":"Г","Ġ":"Ġ","𝔊":"𝔊","⋙":"⋙","𝔾":"𝔾","≥":"≥","⋛":"⋛","≧":"≧","⪢":"⪢","≷":"≷","⩾":"⩾","≳":"≳","𝒢":"𝒢","≫":"≫","Ъ":"Ъ","ˇ":"ˇ","^":"^","Ĥ":"Ĥ","ℌ":"ℌ","ℋ":"ℋ","ℍ":"ℍ","─":"─","ℋ":"ℋ","Ħ":"Ħ","≎":"≎","≏":"≏","Е":"Е","IJ":"IJ","Ё":"Ё","Í":"Í","Í":"Í","Î":"Î","Î":"Î","И":"И","İ":"İ","ℑ":"ℑ","Ì":"Ì","Ì":"Ì","ℑ":"ℑ","Ī":"Ī","ⅈ":"ⅈ","⇒":"⇒","∬":"∬","∫":"∫","⋂":"⋂","⁣":"⁣","⁢":"⁢","Į":"Į","𝕀":"𝕀","Ι":"Ι","ℐ":"ℐ","Ĩ":"Ĩ","І":"І","Ï":"Ï","Ï":"Ï","Ĵ":"Ĵ","Й":"Й","𝔍":"𝔍","𝕁":"𝕁","𝒥":"𝒥","Ј":"Ј","Є":"Є","Х":"Х","Ќ":"Ќ","Κ":"Κ","Ķ":"Ķ","К":"К","𝔎":"𝔎","𝕂":"𝕂","𝒦":"𝒦","Љ":"Љ","<":"<","<":"<","Ĺ":"Ĺ","Λ":"Λ","⟪":"⟪","ℒ":"ℒ","↞":"↞","Ľ":"Ľ","Ļ":"Ļ","Л":"Л","⟨":"⟨","←":"←","⇤":"⇤","⇆":"⇆","⌈":"⌈","⟦":"⟦","⥡":"⥡","⇃":"⇃","⥙":"⥙","⌊":"⌊","↔":"↔","⥎":"⥎","⊣":"⊣","↤":"↤","⥚":"⥚","⊲":"⊲","⧏":"⧏","⊴":"⊴","⥑":"⥑","⥠":"⥠","↿":"↿","⥘":"⥘","↼":"↼","⥒":"⥒","⇐":"⇐","⇔":"⇔","⋚":"⋚","≦":"≦","≶":"≶","⪡":"⪡","⩽":"⩽","≲":"≲","𝔏":"𝔏","⋘":"⋘","⇚":"⇚","Ŀ":"Ŀ","⟵":"⟵","⟷":"⟷","⟶":"⟶","⟸":"⟸","⟺":"⟺","⟹":"⟹","𝕃":"𝕃","↙":"↙","↘":"↘","ℒ":"ℒ","↰":"↰","Ł":"Ł","≪":"≪","⤅":"⤅","М":"М"," ":" ","ℳ":"ℳ","𝔐":"𝔐","∓":"∓","𝕄":"𝕄","ℳ":"ℳ","Μ":"Μ","Њ":"Њ","Ń":"Ń","Ň":"Ň","Ņ":"Ņ","Н":"Н","​":"​","​":"​","​":"​","​":"​","≫":"≫","≪":"≪"," ":"\n","𝔑":"𝔑","⁠":"⁠"," ":" ","ℕ":"ℕ","⫬":"⫬","≢":"≢","≭":"≭","∦":"∦","∉":"∉","≠":"≠","≂̸":"≂̸","∄":"∄","≯":"≯","≱":"≱","≧̸":"≧̸","≫̸":"≫̸","≹":"≹","⩾̸":"⩾̸","≵":"≵","≎̸":"≎̸","≏̸":"≏̸","⋪":"⋪","⧏̸":"⧏̸","⋬":"⋬","≮":"≮","≰":"≰","≸":"≸","≪̸":"≪̸","⩽̸":"⩽̸","≴":"≴","⪢̸":"⪢̸","⪡̸":"⪡̸","⊀":"⊀","⪯̸":"⪯̸","⋠":"⋠","∌":"∌","⋫":"⋫","⧐̸":"⧐̸","⋭":"⋭","⊏̸":"⊏̸","⋢":"⋢","⊐̸":"⊐̸","⋣":"⋣","⊂⃒":"⊂⃒","⊈":"⊈","⊁":"⊁","⪰̸":"⪰̸","⋡":"⋡","≿̸":"≿̸","⊃⃒":"⊃⃒","⊉":"⊉","≁":"≁","≄":"≄","≇":"≇","≉":"≉","∤":"∤","𝒩":"𝒩","Ñ":"Ñ","Ñ":"Ñ","Ν":"Ν","Œ":"Œ","Ó":"Ó","Ó":"Ó","Ô":"Ô","Ô":"Ô","О":"О","Ő":"Ő","𝔒":"𝔒","Ò":"Ò","Ò":"Ò","Ō":"Ō","Ω":"Ω","Ο":"Ο","𝕆":"𝕆","“":"“","‘":"‘","⩔":"⩔","𝒪":"𝒪","Ø":"Ø","Ø":"Ø","Õ":"Õ","Õ":"Õ","⨷":"⨷","Ö":"Ö","Ö":"Ö","‾":"‾","⏞":"⏞","⎴":"⎴","⏜":"⏜","∂":"∂","П":"П","𝔓":"𝔓","Φ":"Φ","Π":"Π","±":"±","ℌ":"ℌ","ℙ":"ℙ","⪻":"⪻","≺":"≺","⪯":"⪯","≼":"≼","≾":"≾","″":"″","∏":"∏","∷":"∷","∝":"∝","𝒫":"𝒫","Ψ":"Ψ",""":'"',""":'"',"𝔔":"𝔔","ℚ":"ℚ","𝒬":"𝒬","⤐":"⤐","®":"®","®":"®","Ŕ":"Ŕ","⟫":"⟫","↠":"↠","⤖":"⤖","Ř":"Ř","Ŗ":"Ŗ","Р":"Р","ℜ":"ℜ","∋":"∋","⇋":"⇋","⥯":"⥯","ℜ":"ℜ","Ρ":"Ρ","⟩":"⟩","→":"→","⇥":"⇥","⇄":"⇄","⌉":"⌉","⟧":"⟧","⥝":"⥝","⇂":"⇂","⥕":"⥕","⌋":"⌋","⊢":"⊢","↦":"↦","⥛":"⥛","⊳":"⊳","⧐":"⧐","⊵":"⊵","⥏":"⥏","⥜":"⥜","↾":"↾","⥔":"⥔","⇀":"⇀","⥓":"⥓","⇒":"⇒","ℝ":"ℝ","⥰":"⥰","⇛":"⇛","ℛ":"ℛ","↱":"↱","⧴":"⧴","Щ":"Щ","Ш":"Ш","Ь":"Ь","Ś":"Ś","⪼":"⪼","Š":"Š","Ş":"Ş","Ŝ":"Ŝ","С":"С","𝔖":"𝔖","↓":"↓","←":"←","→":"→","↑":"↑","Σ":"Σ","∘":"∘","𝕊":"𝕊","√":"√","□":"□","⊓":"⊓","⊏":"⊏","⊑":"⊑","⊐":"⊐","⊒":"⊒","⊔":"⊔","𝒮":"𝒮","⋆":"⋆","⋐":"⋐","⋐":"⋐","⊆":"⊆","≻":"≻","⪰":"⪰","≽":"≽","≿":"≿","∋":"∋","∑":"∑","⋑":"⋑","⊃":"⊃","⊇":"⊇","⋑":"⋑","Þ":"Þ","Þ":"Þ","™":"™","Ћ":"Ћ","Ц":"Ц"," ":"\t","Τ":"Τ","Ť":"Ť","Ţ":"Ţ","Т":"Т","𝔗":"𝔗","∴":"∴","Θ":"Θ","  ":"  "," ":" ","∼":"∼","≃":"≃","≅":"≅","≈":"≈","𝕋":"𝕋","⃛":"⃛","𝒯":"𝒯","Ŧ":"Ŧ","Ú":"Ú","Ú":"Ú","↟":"↟","⥉":"⥉","Ў":"Ў","Ŭ":"Ŭ","Û":"Û","Û":"Û","У":"У","Ű":"Ű","𝔘":"𝔘","Ù":"Ù","Ù":"Ù","Ū":"Ū","_":"_","⏟":"⏟","⎵":"⎵","⏝":"⏝","⋃":"⋃","⊎":"⊎","Ų":"Ų","𝕌":"𝕌","↑":"↑","⤒":"⤒","⇅":"⇅","↕":"↕","⥮":"⥮","⊥":"⊥","↥":"↥","⇑":"⇑","⇕":"⇕","↖":"↖","↗":"↗","ϒ":"ϒ","Υ":"Υ","Ů":"Ů","𝒰":"𝒰","Ũ":"Ũ","Ü":"Ü","Ü":"Ü","⊫":"⊫","⫫":"⫫","В":"В","⊩":"⊩","⫦":"⫦","⋁":"⋁","‖":"‖","‖":"‖","∣":"∣","|":"|","❘":"❘","≀":"≀"," ":" ","𝔙":"𝔙","𝕍":"𝕍","𝒱":"𝒱","⊪":"⊪","Ŵ":"Ŵ","⋀":"⋀","𝔚":"𝔚","𝕎":"𝕎","𝒲":"𝒲","𝔛":"𝔛","Ξ":"Ξ","𝕏":"𝕏","𝒳":"𝒳","Я":"Я","Ї":"Ї","Ю":"Ю","Ý":"Ý","Ý":"Ý","Ŷ":"Ŷ","Ы":"Ы","𝔜":"𝔜","𝕐":"𝕐","𝒴":"𝒴","Ÿ":"Ÿ","Ж":"Ж","Ź":"Ź","Ž":"Ž","З":"З","Ż":"Ż","​":"​","Ζ":"Ζ","ℨ":"ℨ","ℤ":"ℤ","𝒵":"𝒵","á":"á","á":"á","ă":"ă","∾":"∾","∾̳":"∾̳","∿":"∿","â":"â","â":"â","´":"´","´":"´","а":"а","æ":"æ","æ":"æ","⁡":"⁡","𝔞":"𝔞","à":"à","à":"à","ℵ":"ℵ","ℵ":"ℵ","α":"α","ā":"ā","⨿":"⨿","&":"&","&":"&","∧":"∧","⩕":"⩕","⩜":"⩜","⩘":"⩘","⩚":"⩚","∠":"∠","⦤":"⦤","∠":"∠","∡":"∡","⦨":"⦨","⦩":"⦩","⦪":"⦪","⦫":"⦫","⦬":"⦬","⦭":"⦭","⦮":"⦮","⦯":"⦯","∟":"∟","⊾":"⊾","⦝":"⦝","∢":"∢","Å":"Å","⍼":"⍼","ą":"ą","𝕒":"𝕒","≈":"≈","⩰":"⩰","⩯":"⩯","≊":"≊","≋":"≋","'":"'","≈":"≈","≊":"≊","å":"å","å":"å","𝒶":"𝒶","*":"*","≈":"≈","≍":"≍","ã":"ã","ã":"ã","ä":"ä","ä":"ä","∳":"∳","⨑":"⨑","⫭":"⫭","≌":"≌","϶":"϶","‵":"‵","∽":"∽","⋍":"⋍","⊽":"⊽","⌅":"⌅","⌅":"⌅","⎵":"⎵","⎶":"⎶","≌":"≌","б":"б","„":"„","∵":"∵","∵":"∵","⦰":"⦰","϶":"϶","ℬ":"ℬ","β":"β","ℶ":"ℶ","≬":"≬","𝔟":"𝔟","⋂":"⋂","◯":"◯","⋃":"⋃","⨀":"⨀","⨁":"⨁","⨂":"⨂","⨆":"⨆","★":"★","▽":"▽","△":"△","⨄":"⨄","⋁":"⋁","⋀":"⋀","⤍":"⤍","⧫":"⧫","▪":"▪","▴":"▴","▾":"▾","◂":"◂","▸":"▸","␣":"␣","▒":"▒","░":"░","▓":"▓","█":"█","=⃥":"=⃥","≡⃥":"≡⃥","⌐":"⌐","𝕓":"𝕓","⊥":"⊥","⊥":"⊥","⋈":"⋈","╗":"╗","╔":"╔","╖":"╖","╓":"╓","═":"═","╦":"╦","╩":"╩","╤":"╤","╧":"╧","╝":"╝","╚":"╚","╜":"╜","╙":"╙","║":"║","╬":"╬","╣":"╣","╠":"╠","╫":"╫","╢":"╢","╟":"╟","⧉":"⧉","╕":"╕","╒":"╒","┐":"┐","┌":"┌","─":"─","╥":"╥","╨":"╨","┬":"┬","┴":"┴","⊟":"⊟","⊞":"⊞","⊠":"⊠","╛":"╛","╘":"╘","┘":"┘","└":"└","│":"│","╪":"╪","╡":"╡","╞":"╞","┼":"┼","┤":"┤","├":"├","‵":"‵","˘":"˘","¦":"¦","¦":"¦","𝒷":"𝒷","⁏":"⁏","∽":"∽","⋍":"⋍","\":"\\","⧅":"⧅","⟈":"⟈","•":"•","•":"•","≎":"≎","⪮":"⪮","≏":"≏","≏":"≏","ć":"ć","∩":"∩","⩄":"⩄","⩉":"⩉","⩋":"⩋","⩇":"⩇","⩀":"⩀","∩︀":"∩︀","⁁":"⁁","ˇ":"ˇ","⩍":"⩍","č":"č","ç":"ç","ç":"ç","ĉ":"ĉ","⩌":"⩌","⩐":"⩐","ċ":"ċ","¸":"¸","¸":"¸","⦲":"⦲","¢":"¢","¢":"¢","·":"·","𝔠":"𝔠","ч":"ч","✓":"✓","✓":"✓","χ":"χ","○":"○","⧃":"⧃","ˆ":"ˆ","≗":"≗","↺":"↺","↻":"↻","®":"®","Ⓢ":"Ⓢ","⊛":"⊛","⊚":"⊚","⊝":"⊝","≗":"≗","⨐":"⨐","⫯":"⫯","⧂":"⧂","♣":"♣","♣":"♣",":":":","≔":"≔","≔":"≔",",":",","@":"@","∁":"∁","∘":"∘","∁":"∁","ℂ":"ℂ","≅":"≅","⩭":"⩭","∮":"∮","𝕔":"𝕔","∐":"∐","©":"©","©":"©","℗":"℗","↵":"↵","✗":"✗","𝒸":"𝒸","⫏":"⫏","⫑":"⫑","⫐":"⫐","⫒":"⫒","⋯":"⋯","⤸":"⤸","⤵":"⤵","⋞":"⋞","⋟":"⋟","↶":"↶","⤽":"⤽","∪":"∪","⩈":"⩈","⩆":"⩆","⩊":"⩊","⊍":"⊍","⩅":"⩅","∪︀":"∪︀","↷":"↷","⤼":"⤼","⋞":"⋞","⋟":"⋟","⋎":"⋎","⋏":"⋏","¤":"¤","¤":"¤","↶":"↶","↷":"↷","⋎":"⋎","⋏":"⋏","∲":"∲","∱":"∱","⌭":"⌭","⇓":"⇓","⥥":"⥥","†":"†","ℸ":"ℸ","↓":"↓","‐":"‐","⊣":"⊣","⤏":"⤏","˝":"˝","ď":"ď","д":"д","ⅆ":"ⅆ","‡":"‡","⇊":"⇊","⩷":"⩷","°":"°","°":"°","δ":"δ","⦱":"⦱","⥿":"⥿","𝔡":"𝔡","⇃":"⇃","⇂":"⇂","⋄":"⋄","⋄":"⋄","♦":"♦","♦":"♦","¨":"¨","ϝ":"ϝ","⋲":"⋲","÷":"÷","÷":"÷","÷":"÷","⋇":"⋇","⋇":"⋇","ђ":"ђ","⌞":"⌞","⌍":"⌍","$":"$","𝕕":"𝕕","˙":"˙","≐":"≐","≑":"≑","∸":"∸","∔":"∔","⊡":"⊡","⌆":"⌆","↓":"↓","⇊":"⇊","⇃":"⇃","⇂":"⇂","⤐":"⤐","⌟":"⌟","⌌":"⌌","𝒹":"𝒹","ѕ":"ѕ","⧶":"⧶","đ":"đ","⋱":"⋱","▿":"▿","▾":"▾","⇵":"⇵","⥯":"⥯","⦦":"⦦","џ":"џ","⟿":"⟿","⩷":"⩷","≑":"≑","é":"é","é":"é","⩮":"⩮","ě":"ě","≖":"≖","ê":"ê","ê":"ê","≕":"≕","э":"э","ė":"ė","ⅇ":"ⅇ","≒":"≒","𝔢":"𝔢","⪚":"⪚","è":"è","è":"è","⪖":"⪖","⪘":"⪘","⪙":"⪙","⏧":"⏧","ℓ":"ℓ","⪕":"⪕","⪗":"⪗","ē":"ē","∅":"∅","∅":"∅","∅":"∅"," ":" "," ":" "," ":" ","ŋ":"ŋ"," ":" ","ę":"ę","𝕖":"𝕖","⋕":"⋕","⧣":"⧣","⩱":"⩱","ε":"ε","ε":"ε","ϵ":"ϵ","≖":"≖","≕":"≕","≂":"≂","⪖":"⪖","⪕":"⪕","=":"=","≟":"≟","≡":"≡","⩸":"⩸","⧥":"⧥","≓":"≓","⥱":"⥱","ℯ":"ℯ","≐":"≐","≂":"≂","η":"η","ð":"ð","ð":"ð","ë":"ë","ë":"ë","€":"€","!":"!","∃":"∃","ℰ":"ℰ","ⅇ":"ⅇ","≒":"≒","ф":"ф","♀":"♀","ffi":"ffi","ff":"ff","ffl":"ffl","𝔣":"𝔣","fi":"fi","fj":"fj","♭":"♭","fl":"fl","▱":"▱","ƒ":"ƒ","𝕗":"𝕗","∀":"∀","⋔":"⋔","⫙":"⫙","⨍":"⨍","½":"½","½":"½","⅓":"⅓","¼":"¼","¼":"¼","⅕":"⅕","⅙":"⅙","⅛":"⅛","⅔":"⅔","⅖":"⅖","¾":"¾","¾":"¾","⅗":"⅗","⅜":"⅜","⅘":"⅘","⅚":"⅚","⅝":"⅝","⅞":"⅞","⁄":"⁄","⌢":"⌢","𝒻":"𝒻","≧":"≧","⪌":"⪌","ǵ":"ǵ","γ":"γ","ϝ":"ϝ","⪆":"⪆","ğ":"ğ","ĝ":"ĝ","г":"г","ġ":"ġ","≥":"≥","⋛":"⋛","≥":"≥","≧":"≧","⩾":"⩾","⩾":"⩾","⪩":"⪩","⪀":"⪀","⪂":"⪂","⪄":"⪄","⋛︀":"⋛︀","⪔":"⪔","𝔤":"𝔤","≫":"≫","⋙":"⋙","ℷ":"ℷ","ѓ":"ѓ","≷":"≷","⪒":"⪒","⪥":"⪥","⪤":"⪤","≩":"≩","⪊":"⪊","⪊":"⪊","⪈":"⪈","⪈":"⪈","≩":"≩","⋧":"⋧","𝕘":"𝕘","`":"`","ℊ":"ℊ","≳":"≳","⪎":"⪎","⪐":"⪐",">":">",">":">","⪧":"⪧","⩺":"⩺","⋗":"⋗","⦕":"⦕","⩼":"⩼","⪆":"⪆","⥸":"⥸","⋗":"⋗","⋛":"⋛","⪌":"⪌","≷":"≷","≳":"≳","≩︀":"≩︀","≩︀":"≩︀","⇔":"⇔"," ":" ","½":"½","ℋ":"ℋ","ъ":"ъ","↔":"↔","⥈":"⥈","↭":"↭","ℏ":"ℏ","ĥ":"ĥ","♥":"♥","♥":"♥","…":"…","⊹":"⊹","𝔥":"𝔥","⤥":"⤥","⤦":"⤦","⇿":"⇿","∻":"∻","↩":"↩","↪":"↪","𝕙":"𝕙","―":"―","𝒽":"𝒽","ℏ":"ℏ","ħ":"ħ","⁃":"⁃","‐":"‐","í":"í","í":"í","⁣":"⁣","î":"î","î":"î","и":"и","е":"е","¡":"¡","¡":"¡","⇔":"⇔","𝔦":"𝔦","ì":"ì","ì":"ì","ⅈ":"ⅈ","⨌":"⨌","∭":"∭","⧜":"⧜","℩":"℩","ij":"ij","ī":"ī","ℑ":"ℑ","ℐ":"ℐ","ℑ":"ℑ","ı":"ı","⊷":"⊷","Ƶ":"Ƶ","∈":"∈","℅":"℅","∞":"∞","⧝":"⧝","ı":"ı","∫":"∫","⊺":"⊺","ℤ":"ℤ","⊺":"⊺","⨗":"⨗","⨼":"⨼","ё":"ё","į":"į","𝕚":"𝕚","ι":"ι","⨼":"⨼","¿":"¿","¿":"¿","𝒾":"𝒾","∈":"∈","⋹":"⋹","⋵":"⋵","⋴":"⋴","⋳":"⋳","∈":"∈","⁢":"⁢","ĩ":"ĩ","і":"і","ï":"ï","ï":"ï","ĵ":"ĵ","й":"й","𝔧":"𝔧","ȷ":"ȷ","𝕛":"𝕛","𝒿":"𝒿","ј":"ј","є":"є","κ":"κ","ϰ":"ϰ","ķ":"ķ","к":"к","𝔨":"𝔨","ĸ":"ĸ","х":"х","ќ":"ќ","𝕜":"𝕜","𝓀":"𝓀","⇚":"⇚","⇐":"⇐","⤛":"⤛","⤎":"⤎","≦":"≦","⪋":"⪋","⥢":"⥢","ĺ":"ĺ","⦴":"⦴","ℒ":"ℒ","λ":"λ","⟨":"⟨","⦑":"⦑","⟨":"⟨","⪅":"⪅","«":"«","«":"«","←":"←","⇤":"⇤","⤟":"⤟","⤝":"⤝","↩":"↩","↫":"↫","⤹":"⤹","⥳":"⥳","↢":"↢","⪫":"⪫","⤙":"⤙","⪭":"⪭","⪭︀":"⪭︀","⤌":"⤌","❲":"❲","{":"{","[":"[","⦋":"⦋","⦏":"⦏","⦍":"⦍","ľ":"ľ","ļ":"ļ","⌈":"⌈","{":"{","л":"л","⤶":"⤶","“":"“","„":"„","⥧":"⥧","⥋":"⥋","↲":"↲","≤":"≤","←":"←","↢":"↢","↽":"↽","↼":"↼","⇇":"⇇","↔":"↔","⇆":"⇆","⇋":"⇋","↭":"↭","⋋":"⋋","⋚":"⋚","≤":"≤","≦":"≦","⩽":"⩽","⩽":"⩽","⪨":"⪨","⩿":"⩿","⪁":"⪁","⪃":"⪃","⋚︀":"⋚︀","⪓":"⪓","⪅":"⪅","⋖":"⋖","⋚":"⋚","⪋":"⪋","≶":"≶","≲":"≲","⥼":"⥼","⌊":"⌊","𝔩":"𝔩","≶":"≶","⪑":"⪑","↽":"↽","↼":"↼","⥪":"⥪","▄":"▄","љ":"љ","≪":"≪","⇇":"⇇","⌞":"⌞","⥫":"⥫","◺":"◺","ŀ":"ŀ","⎰":"⎰","⎰":"⎰","≨":"≨","⪉":"⪉","⪉":"⪉","⪇":"⪇","⪇":"⪇","≨":"≨","⋦":"⋦","⟬":"⟬","⇽":"⇽","⟦":"⟦","⟵":"⟵","⟷":"⟷","⟼":"⟼","⟶":"⟶","↫":"↫","↬":"↬","⦅":"⦅","𝕝":"𝕝","⨭":"⨭","⨴":"⨴","∗":"∗","_":"_","◊":"◊","◊":"◊","⧫":"⧫","(":"(","⦓":"⦓","⇆":"⇆","⌟":"⌟","⇋":"⇋","⥭":"⥭","‎":"‎","⊿":"⊿","‹":"‹","𝓁":"𝓁","↰":"↰","≲":"≲","⪍":"⪍","⪏":"⪏","[":"[","‘":"‘","‚":"‚","ł":"ł","<":"<","<":"<","⪦":"⪦","⩹":"⩹","⋖":"⋖","⋋":"⋋","⋉":"⋉","⥶":"⥶","⩻":"⩻","⦖":"⦖","◃":"◃","⊴":"⊴","◂":"◂","⥊":"⥊","⥦":"⥦","≨︀":"≨︀","≨︀":"≨︀","∺":"∺","¯":"¯","¯":"¯","♂":"♂","✠":"✠","✠":"✠","↦":"↦","↦":"↦","↧":"↧","↤":"↤","↥":"↥","▮":"▮","⨩":"⨩","м":"м","—":"—","∡":"∡","𝔪":"𝔪","℧":"℧","µ":"µ","µ":"µ","∣":"∣","*":"*","⫰":"⫰","·":"·","·":"·","−":"−","⊟":"⊟","∸":"∸","⨪":"⨪","⫛":"⫛","…":"…","∓":"∓","⊧":"⊧","𝕞":"𝕞","∓":"∓","𝓂":"𝓂","∾":"∾","μ":"μ","⊸":"⊸","⊸":"⊸","⋙̸":"⋙̸","≫⃒":"≫⃒","≫̸":"≫̸","⇍":"⇍","⇎":"⇎","⋘̸":"⋘̸","≪⃒":"≪⃒","≪̸":"≪̸","⇏":"⇏","⊯":"⊯","⊮":"⊮","∇":"∇","ń":"ń","∠⃒":"∠⃒","≉":"≉","⩰̸":"⩰̸","≋̸":"≋̸","ʼn":"ʼn","≉":"≉","♮":"♮","♮":"♮","ℕ":"ℕ"," ":" "," ":" ","≎̸":"≎̸","≏̸":"≏̸","⩃":"⩃","ň":"ň","ņ":"ņ","≇":"≇","⩭̸":"⩭̸","⩂":"⩂","н":"н","–":"–","≠":"≠","⇗":"⇗","⤤":"⤤","↗":"↗","↗":"↗","≐̸":"≐̸","≢":"≢","⤨":"⤨","≂̸":"≂̸","∄":"∄","∄":"∄","𝔫":"𝔫","≧̸":"≧̸","≱":"≱","≱":"≱","≧̸":"≧̸","⩾̸":"⩾̸","⩾̸":"⩾̸","≵":"≵","≯":"≯","≯":"≯","⇎":"⇎","↮":"↮","⫲":"⫲","∋":"∋","⋼":"⋼","⋺":"⋺","∋":"∋","њ":"њ","⇍":"⇍","≦̸":"≦̸","↚":"↚","‥":"‥","≰":"≰","↚":"↚","↮":"↮","≰":"≰","≦̸":"≦̸","⩽̸":"⩽̸","⩽̸":"⩽̸","≮":"≮","≴":"≴","≮":"≮","⋪":"⋪","⋬":"⋬","∤":"∤","𝕟":"𝕟","¬":"¬","¬":"¬","∉":"∉","⋹̸":"⋹̸","⋵̸":"⋵̸","∉":"∉","⋷":"⋷","⋶":"⋶","∌":"∌","∌":"∌","⋾":"⋾","⋽":"⋽","∦":"∦","∦":"∦","⫽⃥":"⫽⃥","∂̸":"∂̸","⨔":"⨔","⊀":"⊀","⋠":"⋠","⪯̸":"⪯̸","⊀":"⊀","⪯̸":"⪯̸","⇏":"⇏","↛":"↛","⤳̸":"⤳̸","↝̸":"↝̸","↛":"↛","⋫":"⋫","⋭":"⋭","⊁":"⊁","⋡":"⋡","⪰̸":"⪰̸","𝓃":"𝓃","∤":"∤","∦":"∦","≁":"≁","≄":"≄","≄":"≄","∤":"∤","∦":"∦","⋢":"⋢","⋣":"⋣","⊄":"⊄","⫅̸":"⫅̸","⊈":"⊈","⊂⃒":"⊂⃒","⊈":"⊈","⫅̸":"⫅̸","⊁":"⊁","⪰̸":"⪰̸","⊅":"⊅","⫆̸":"⫆̸","⊉":"⊉","⊃⃒":"⊃⃒","⊉":"⊉","⫆̸":"⫆̸","≹":"≹","ñ":"ñ","ñ":"ñ","≸":"≸","⋪":"⋪","⋬":"⋬","⋫":"⋫","⋭":"⋭","ν":"ν","#":"#","№":"№"," ":" ","⊭":"⊭","⤄":"⤄","≍⃒":"≍⃒","⊬":"⊬","≥⃒":"≥⃒",">⃒":">⃒","⧞":"⧞","⤂":"⤂","≤⃒":"≤⃒","<⃒":"<⃒","⊴⃒":"⊴⃒","⤃":"⤃","⊵⃒":"⊵⃒","∼⃒":"∼⃒","⇖":"⇖","⤣":"⤣","↖":"↖","↖":"↖","⤧":"⤧","Ⓢ":"Ⓢ","ó":"ó","ó":"ó","⊛":"⊛","⊚":"⊚","ô":"ô","ô":"ô","о":"о","⊝":"⊝","ő":"ő","⨸":"⨸","⊙":"⊙","⦼":"⦼","œ":"œ","⦿":"⦿","𝔬":"𝔬","˛":"˛","ò":"ò","ò":"ò","⧁":"⧁","⦵":"⦵","Ω":"Ω","∮":"∮","↺":"↺","⦾":"⦾","⦻":"⦻","‾":"‾","⧀":"⧀","ō":"ō","ω":"ω","ο":"ο","⦶":"⦶","⊖":"⊖","𝕠":"𝕠","⦷":"⦷","⦹":"⦹","⊕":"⊕","∨":"∨","↻":"↻","⩝":"⩝","ℴ":"ℴ","ℴ":"ℴ","ª":"ª","ª":"ª","º":"º","º":"º","⊶":"⊶","⩖":"⩖","⩗":"⩗","⩛":"⩛","ℴ":"ℴ","ø":"ø","ø":"ø","⊘":"⊘","õ":"õ","õ":"õ","⊗":"⊗","⨶":"⨶","ö":"ö","ö":"ö","⌽":"⌽","∥":"∥","¶":"¶","¶":"¶","∥":"∥","⫳":"⫳","⫽":"⫽","∂":"∂","п":"п","%":"%",".":".","‰":"‰","⊥":"⊥","‱":"‱","𝔭":"𝔭","φ":"φ","ϕ":"ϕ","ℳ":"ℳ","☎":"☎","π":"π","⋔":"⋔","ϖ":"ϖ","ℏ":"ℏ","ℎ":"ℎ","ℏ":"ℏ","+":"+","⨣":"⨣","⊞":"⊞","⨢":"⨢","∔":"∔","⨥":"⨥","⩲":"⩲","±":"±","±":"±","⨦":"⨦","⨧":"⨧","±":"±","⨕":"⨕","𝕡":"𝕡","£":"£","£":"£","≺":"≺","⪳":"⪳","⪷":"⪷","≼":"≼","⪯":"⪯","≺":"≺","⪷":"⪷","≼":"≼","⪯":"⪯","⪹":"⪹","⪵":"⪵","⋨":"⋨","≾":"≾","′":"′","ℙ":"ℙ","⪵":"⪵","⪹":"⪹","⋨":"⋨","∏":"∏","⌮":"⌮","⌒":"⌒","⌓":"⌓","∝":"∝","∝":"∝","≾":"≾","⊰":"⊰","𝓅":"𝓅","ψ":"ψ"," ":" ","𝔮":"𝔮","⨌":"⨌","𝕢":"𝕢","⁗":"⁗","𝓆":"𝓆","ℍ":"ℍ","⨖":"⨖","?":"?","≟":"≟",""":'"',""":'"',"⇛":"⇛","⇒":"⇒","⤜":"⤜","⤏":"⤏","⥤":"⥤","∽̱":"∽̱","ŕ":"ŕ","√":"√","⦳":"⦳","⟩":"⟩","⦒":"⦒","⦥":"⦥","⟩":"⟩","»":"»","»":"»","→":"→","⥵":"⥵","⇥":"⇥","⤠":"⤠","⤳":"⤳","⤞":"⤞","↪":"↪","↬":"↬","⥅":"⥅","⥴":"⥴","↣":"↣","↝":"↝","⤚":"⤚","∶":"∶","ℚ":"ℚ","⤍":"⤍","❳":"❳","}":"}","]":"]","⦌":"⦌","⦎":"⦎","⦐":"⦐","ř":"ř","ŗ":"ŗ","⌉":"⌉","}":"}","р":"р","⤷":"⤷","⥩":"⥩","”":"”","”":"”","↳":"↳","ℜ":"ℜ","ℛ":"ℛ","ℜ":"ℜ","ℝ":"ℝ","▭":"▭","®":"®","®":"®","⥽":"⥽","⌋":"⌋","𝔯":"𝔯","⇁":"⇁","⇀":"⇀","⥬":"⥬","ρ":"ρ","ϱ":"ϱ","→":"→","↣":"↣","⇁":"⇁","⇀":"⇀","⇄":"⇄","⇌":"⇌","⇉":"⇉","↝":"↝","⋌":"⋌","˚":"˚","≓":"≓","⇄":"⇄","⇌":"⇌","‏":"‏","⎱":"⎱","⎱":"⎱","⫮":"⫮","⟭":"⟭","⇾":"⇾","⟧":"⟧","⦆":"⦆","𝕣":"𝕣","⨮":"⨮","⨵":"⨵",")":")","⦔":"⦔","⨒":"⨒","⇉":"⇉","›":"›","𝓇":"𝓇","↱":"↱","]":"]","’":"’","’":"’","⋌":"⋌","⋊":"⋊","▹":"▹","⊵":"⊵","▸":"▸","⧎":"⧎","⥨":"⥨","℞":"℞","ś":"ś","‚":"‚","≻":"≻","⪴":"⪴","⪸":"⪸","š":"š","≽":"≽","⪰":"⪰","ş":"ş","ŝ":"ŝ","⪶":"⪶","⪺":"⪺","⋩":"⋩","⨓":"⨓","≿":"≿","с":"с","⋅":"⋅","⊡":"⊡","⩦":"⩦","⇘":"⇘","⤥":"⤥","↘":"↘","↘":"↘","§":"§","§":"§",";":";","⤩":"⤩","∖":"∖","∖":"∖","✶":"✶","𝔰":"𝔰","⌢":"⌢","♯":"♯","щ":"щ","ш":"ш","∣":"∣","∥":"∥","­":"­","­":"­","σ":"σ","ς":"ς","ς":"ς","∼":"∼","⩪":"⩪","≃":"≃","≃":"≃","⪞":"⪞","⪠":"⪠","⪝":"⪝","⪟":"⪟","≆":"≆","⨤":"⨤","⥲":"⥲","←":"←","∖":"∖","⨳":"⨳","⧤":"⧤","∣":"∣","⌣":"⌣","⪪":"⪪","⪬":"⪬","⪬︀":"⪬︀","ь":"ь","/":"/","⧄":"⧄","⌿":"⌿","𝕤":"𝕤","♠":"♠","♠":"♠","∥":"∥","⊓":"⊓","⊓︀":"⊓︀","⊔":"⊔","⊔︀":"⊔︀","⊏":"⊏","⊑":"⊑","⊏":"⊏","⊑":"⊑","⊐":"⊐","⊒":"⊒","⊐":"⊐","⊒":"⊒","□":"□","□":"□","▪":"▪","▪":"▪","→":"→","𝓈":"𝓈","∖":"∖","⌣":"⌣","⋆":"⋆","☆":"☆","★":"★","ϵ":"ϵ","ϕ":"ϕ","¯":"¯","⊂":"⊂","⫅":"⫅","⪽":"⪽","⊆":"⊆","⫃":"⫃","⫁":"⫁","⫋":"⫋","⊊":"⊊","⪿":"⪿","⥹":"⥹","⊂":"⊂","⊆":"⊆","⫅":"⫅","⊊":"⊊","⫋":"⫋","⫇":"⫇","⫕":"⫕","⫓":"⫓","≻":"≻","⪸":"⪸","≽":"≽","⪰":"⪰","⪺":"⪺","⪶":"⪶","⋩":"⋩","≿":"≿","∑":"∑","♪":"♪","¹":"¹","¹":"¹","²":"²","²":"²","³":"³","³":"³","⊃":"⊃","⫆":"⫆","⪾":"⪾","⫘":"⫘","⊇":"⊇","⫄":"⫄","⟉":"⟉","⫗":"⫗","⥻":"⥻","⫂":"⫂","⫌":"⫌","⊋":"⊋","⫀":"⫀","⊃":"⊃","⊇":"⊇","⫆":"⫆","⊋":"⊋","⫌":"⫌","⫈":"⫈","⫔":"⫔","⫖":"⫖","⇙":"⇙","⤦":"⤦","↙":"↙","↙":"↙","⤪":"⤪","ß":"ß","ß":"ß","⌖":"⌖","τ":"τ","⎴":"⎴","ť":"ť","ţ":"ţ","т":"т","⃛":"⃛","⌕":"⌕","𝔱":"𝔱","∴":"∴","∴":"∴","θ":"θ","ϑ":"ϑ","ϑ":"ϑ","≈":"≈","∼":"∼"," ":" ","≈":"≈","∼":"∼","þ":"þ","þ":"þ","˜":"˜","×":"×","×":"×","⊠":"⊠","⨱":"⨱","⨰":"⨰","∭":"∭","⤨":"⤨","⊤":"⊤","⌶":"⌶","⫱":"⫱","𝕥":"𝕥","⫚":"⫚","⤩":"⤩","‴":"‴","™":"™","▵":"▵","▿":"▿","◃":"◃","⊴":"⊴","≜":"≜","▹":"▹","⊵":"⊵","◬":"◬","≜":"≜","⨺":"⨺","⨹":"⨹","⧍":"⧍","⨻":"⨻","⏢":"⏢","𝓉":"𝓉","ц":"ц","ћ":"ћ","ŧ":"ŧ","≬":"≬","↞":"↞","↠":"↠","⇑":"⇑","⥣":"⥣","ú":"ú","ú":"ú","↑":"↑","ў":"ў","ŭ":"ŭ","û":"û","û":"û","у":"у","⇅":"⇅","ű":"ű","⥮":"⥮","⥾":"⥾","𝔲":"𝔲","ù":"ù","ù":"ù","↿":"↿","↾":"↾","▀":"▀","⌜":"⌜","⌜":"⌜","⌏":"⌏","◸":"◸","ū":"ū","¨":"¨","¨":"¨","ų":"ų","𝕦":"𝕦","↑":"↑","↕":"↕","↿":"↿","↾":"↾","⊎":"⊎","υ":"υ","ϒ":"ϒ","υ":"υ","⇈":"⇈","⌝":"⌝","⌝":"⌝","⌎":"⌎","ů":"ů","◹":"◹","𝓊":"𝓊","⋰":"⋰","ũ":"ũ","▵":"▵","▴":"▴","⇈":"⇈","ü":"ü","ü":"ü","⦧":"⦧","⇕":"⇕","⫨":"⫨","⫩":"⫩","⊨":"⊨","⦜":"⦜","ϵ":"ϵ","ϰ":"ϰ","∅":"∅","ϕ":"ϕ","ϖ":"ϖ","∝":"∝","↕":"↕","ϱ":"ϱ","ς":"ς","⊊︀":"⊊︀","⫋︀":"⫋︀","⊋︀":"⊋︀","⫌︀":"⫌︀","ϑ":"ϑ","⊲":"⊲","⊳":"⊳","в":"в","⊢":"⊢","∨":"∨","⊻":"⊻","≚":"≚","⋮":"⋮","|":"|","|":"|","𝔳":"𝔳","⊲":"⊲","⊂⃒":"⊂⃒","⊃⃒":"⊃⃒","𝕧":"𝕧","∝":"∝","⊳":"⊳","𝓋":"𝓋","⫋︀":"⫋︀","⊊︀":"⊊︀","⫌︀":"⫌︀","⊋︀":"⊋︀","⦚":"⦚","ŵ":"ŵ","⩟":"⩟","∧":"∧","≙":"≙","℘":"℘","𝔴":"𝔴","𝕨":"𝕨","℘":"℘","≀":"≀","≀":"≀","𝓌":"𝓌","⋂":"⋂","◯":"◯","⋃":"⋃","▽":"▽","𝔵":"𝔵","⟺":"⟺","⟷":"⟷","ξ":"ξ","⟸":"⟸","⟵":"⟵","⟼":"⟼","⋻":"⋻","⨀":"⨀","𝕩":"𝕩","⨁":"⨁","⨂":"⨂","⟹":"⟹","⟶":"⟶","𝓍":"𝓍","⨆":"⨆","⨄":"⨄","△":"△","⋁":"⋁","⋀":"⋀","ý":"ý","ý":"ý","я":"я","ŷ":"ŷ","ы":"ы","¥":"¥","¥":"¥","𝔶":"𝔶","ї":"ї","𝕪":"𝕪","𝓎":"𝓎","ю":"ю","ÿ":"ÿ","ÿ":"ÿ","ź":"ź","ž":"ž","з":"з","ż":"ż","ℨ":"ℨ","ζ":"ζ","𝔷":"𝔷","ж":"ж","⇝":"⇝","𝕫":"𝕫","𝓏":"𝓏","‍":"‍","‌":"‌"},characters:{"Æ":"Æ","&":"&","Á":"Á","Ă":"Ă","Â":"Â","А":"А","𝔄":"𝔄","À":"À","Α":"Α","Ā":"Ā","⩓":"⩓","Ą":"Ą","𝔸":"𝔸","⁡":"⁡","Å":"Å","𝒜":"𝒜","≔":"≔","Ã":"Ã","Ä":"Ä","∖":"∖","⫧":"⫧","⌆":"⌆","Б":"Б","∵":"∵","ℬ":"ℬ","Β":"Β","𝔅":"𝔅","𝔹":"𝔹","˘":"˘","≎":"≎","Ч":"Ч","©":"©","Ć":"Ć","⋒":"⋒","ⅅ":"ⅅ","ℭ":"ℭ","Č":"Č","Ç":"Ç","Ĉ":"Ĉ","∰":"∰","Ċ":"Ċ","¸":"¸","·":"·","Χ":"Χ","⊙":"⊙","⊖":"⊖","⊕":"⊕","⊗":"⊗","∲":"∲","”":"”","’":"’","∷":"∷","⩴":"⩴","≡":"≡","∯":"∯","∮":"∮","ℂ":"ℂ","∐":"∐","∳":"∳","⨯":"⨯","𝒞":"𝒞","⋓":"⋓","≍":"≍","⤑":"⤑","Ђ":"Ђ","Ѕ":"Ѕ","Џ":"Џ","‡":"‡","↡":"↡","⫤":"⫤","Ď":"Ď","Д":"Д","∇":"∇","Δ":"Δ","𝔇":"𝔇","´":"´","˙":"˙","˝":"˝","`":"`","˜":"˜","⋄":"⋄","ⅆ":"ⅆ","𝔻":"𝔻","¨":"¨","⃜":"⃜","≐":"≐","⇓":"⇓","⇐":"⇐","⇔":"⇔","⟸":"⟸","⟺":"⟺","⟹":"⟹","⇒":"⇒","⊨":"⊨","⇑":"⇑","⇕":"⇕","∥":"∥","↓":"↓","⤓":"⤓","⇵":"⇵","̑":"̑","⥐":"⥐","⥞":"⥞","↽":"↽","⥖":"⥖","⥟":"⥟","⇁":"⇁","⥗":"⥗","⊤":"⊤","↧":"↧","𝒟":"𝒟","Đ":"Đ","Ŋ":"Ŋ","Ð":"Ð","É":"É","Ě":"Ě","Ê":"Ê","Э":"Э","Ė":"Ė","𝔈":"𝔈","È":"È","∈":"∈","Ē":"Ē","◻":"◻","▫":"▫","Ę":"Ę","𝔼":"𝔼","Ε":"Ε","⩵":"⩵","≂":"≂","⇌":"⇌","ℰ":"ℰ","⩳":"⩳","Η":"Η","Ë":"Ë","∃":"∃","ⅇ":"ⅇ","Ф":"Ф","𝔉":"𝔉","◼":"◼","▪":"▪","𝔽":"𝔽","∀":"∀","ℱ":"ℱ","Ѓ":"Ѓ",">":">","Γ":"Γ","Ϝ":"Ϝ","Ğ":"Ğ","Ģ":"Ģ","Ĝ":"Ĝ","Г":"Г","Ġ":"Ġ","𝔊":"𝔊","⋙":"⋙","𝔾":"𝔾","≥":"≥","⋛":"⋛","≧":"≧","⪢":"⪢","≷":"≷","⩾":"⩾","≳":"≳","𝒢":"𝒢","≫":"≫","Ъ":"Ъ","ˇ":"ˇ","^":"^","Ĥ":"Ĥ","ℌ":"ℌ","ℋ":"ℋ","ℍ":"ℍ","─":"─","Ħ":"Ħ","≏":"≏","Е":"Е","IJ":"IJ","Ё":"Ё","Í":"Í","Î":"Î","И":"И","İ":"İ","ℑ":"ℑ","Ì":"Ì","Ī":"Ī","ⅈ":"ⅈ","∬":"∬","∫":"∫","⋂":"⋂","⁣":"⁣","⁢":"⁢","Į":"Į","𝕀":"𝕀","Ι":"Ι","ℐ":"ℐ","Ĩ":"Ĩ","І":"І","Ï":"Ï","Ĵ":"Ĵ","Й":"Й","𝔍":"𝔍","𝕁":"𝕁","𝒥":"𝒥","Ј":"Ј","Є":"Є","Х":"Х","Ќ":"Ќ","Κ":"Κ","Ķ":"Ķ","К":"К","𝔎":"𝔎","𝕂":"𝕂","𝒦":"𝒦","Љ":"Љ","<":"<","Ĺ":"Ĺ","Λ":"Λ","⟪":"⟪","ℒ":"ℒ","↞":"↞","Ľ":"Ľ","Ļ":"Ļ","Л":"Л","⟨":"⟨","←":"←","⇤":"⇤","⇆":"⇆","⌈":"⌈","⟦":"⟦","⥡":"⥡","⇃":"⇃","⥙":"⥙","⌊":"⌊","↔":"↔","⥎":"⥎","⊣":"⊣","↤":"↤","⥚":"⥚","⊲":"⊲","⧏":"⧏","⊴":"⊴","⥑":"⥑","⥠":"⥠","↿":"↿","⥘":"⥘","↼":"↼","⥒":"⥒","⋚":"⋚","≦":"≦","≶":"≶","⪡":"⪡","⩽":"⩽","≲":"≲","𝔏":"𝔏","⋘":"⋘","⇚":"⇚","Ŀ":"Ŀ","⟵":"⟵","⟷":"⟷","⟶":"⟶","𝕃":"𝕃","↙":"↙","↘":"↘","↰":"↰","Ł":"Ł","≪":"≪","⤅":"⤅","М":"М"," ":" ","ℳ":"ℳ","𝔐":"𝔐","∓":"∓","𝕄":"𝕄","Μ":"Μ","Њ":"Њ","Ń":"Ń","Ň":"Ň","Ņ":"Ņ","Н":"Н","​":"​","\n":" ","𝔑":"𝔑","⁠":"⁠"," ":" ","ℕ":"ℕ","⫬":"⫬","≢":"≢","≭":"≭","∦":"∦","∉":"∉","≠":"≠","≂̸":"≂̸","∄":"∄","≯":"≯","≱":"≱","≧̸":"≧̸","≫̸":"≫̸","≹":"≹","⩾̸":"⩾̸","≵":"≵","≎̸":"≎̸","≏̸":"≏̸","⋪":"⋪","⧏̸":"⧏̸","⋬":"⋬","≮":"≮","≰":"≰","≸":"≸","≪̸":"≪̸","⩽̸":"⩽̸","≴":"≴","⪢̸":"⪢̸","⪡̸":"⪡̸","⊀":"⊀","⪯̸":"⪯̸","⋠":"⋠","∌":"∌","⋫":"⋫","⧐̸":"⧐̸","⋭":"⋭","⊏̸":"⊏̸","⋢":"⋢","⊐̸":"⊐̸","⋣":"⋣","⊂⃒":"⊂⃒","⊈":"⊈","⊁":"⊁","⪰̸":"⪰̸","⋡":"⋡","≿̸":"≿̸","⊃⃒":"⊃⃒","⊉":"⊉","≁":"≁","≄":"≄","≇":"≇","≉":"≉","∤":"∤","𝒩":"𝒩","Ñ":"Ñ","Ν":"Ν","Œ":"Œ","Ó":"Ó","Ô":"Ô","О":"О","Ő":"Ő","𝔒":"𝔒","Ò":"Ò","Ō":"Ō","Ω":"Ω","Ο":"Ο","𝕆":"𝕆","“":"“","‘":"‘","⩔":"⩔","𝒪":"𝒪","Ø":"Ø","Õ":"Õ","⨷":"⨷","Ö":"Ö","‾":"‾","⏞":"⏞","⎴":"⎴","⏜":"⏜","∂":"∂","П":"П","𝔓":"𝔓","Φ":"Φ","Π":"Π","±":"±","ℙ":"ℙ","⪻":"⪻","≺":"≺","⪯":"⪯","≼":"≼","≾":"≾","″":"″","∏":"∏","∝":"∝","𝒫":"𝒫","Ψ":"Ψ",'"':""","𝔔":"𝔔","ℚ":"ℚ","𝒬":"𝒬","⤐":"⤐","®":"®","Ŕ":"Ŕ","⟫":"⟫","↠":"↠","⤖":"⤖","Ř":"Ř","Ŗ":"Ŗ","Р":"Р","ℜ":"ℜ","∋":"∋","⇋":"⇋","⥯":"⥯","Ρ":"Ρ","⟩":"⟩","→":"→","⇥":"⇥","⇄":"⇄","⌉":"⌉","⟧":"⟧","⥝":"⥝","⇂":"⇂","⥕":"⥕","⌋":"⌋","⊢":"⊢","↦":"↦","⥛":"⥛","⊳":"⊳","⧐":"⧐","⊵":"⊵","⥏":"⥏","⥜":"⥜","↾":"↾","⥔":"⥔","⇀":"⇀","⥓":"⥓","ℝ":"ℝ","⥰":"⥰","⇛":"⇛","ℛ":"ℛ","↱":"↱","⧴":"⧴","Щ":"Щ","Ш":"Ш","Ь":"Ь","Ś":"Ś","⪼":"⪼","Š":"Š","Ş":"Ş","Ŝ":"Ŝ","С":"С","𝔖":"𝔖","↑":"↑","Σ":"Σ","∘":"∘","𝕊":"𝕊","√":"√","□":"□","⊓":"⊓","⊏":"⊏","⊑":"⊑","⊐":"⊐","⊒":"⊒","⊔":"⊔","𝒮":"𝒮","⋆":"⋆","⋐":"⋐","⊆":"⊆","≻":"≻","⪰":"⪰","≽":"≽","≿":"≿","∑":"∑","⋑":"⋑","⊃":"⊃","⊇":"⊇","Þ":"Þ","™":"™","Ћ":"Ћ","Ц":"Ц","\t":" ","Τ":"Τ","Ť":"Ť","Ţ":"Ţ","Т":"Т","𝔗":"𝔗","∴":"∴","Θ":"Θ","  ":"  "," ":" ","∼":"∼","≃":"≃","≅":"≅","≈":"≈","𝕋":"𝕋","⃛":"⃛","𝒯":"𝒯","Ŧ":"Ŧ","Ú":"Ú","↟":"↟","⥉":"⥉","Ў":"Ў","Ŭ":"Ŭ","Û":"Û","У":"У","Ű":"Ű","𝔘":"𝔘","Ù":"Ù","Ū":"Ū",_:"_","⏟":"⏟","⎵":"⎵","⏝":"⏝","⋃":"⋃","⊎":"⊎","Ų":"Ų","𝕌":"𝕌","⤒":"⤒","⇅":"⇅","↕":"↕","⥮":"⥮","⊥":"⊥","↥":"↥","↖":"↖","↗":"↗","ϒ":"ϒ","Υ":"Υ","Ů":"Ů","𝒰":"𝒰","Ũ":"Ũ","Ü":"Ü","⊫":"⊫","⫫":"⫫","В":"В","⊩":"⊩","⫦":"⫦","⋁":"⋁","‖":"‖","∣":"∣","|":"|","❘":"❘","≀":"≀"," ":" ","𝔙":"𝔙","𝕍":"𝕍","𝒱":"𝒱","⊪":"⊪","Ŵ":"Ŵ","⋀":"⋀","𝔚":"𝔚","𝕎":"𝕎","𝒲":"𝒲","𝔛":"𝔛","Ξ":"Ξ","𝕏":"𝕏","𝒳":"𝒳","Я":"Я","Ї":"Ї","Ю":"Ю","Ý":"Ý","Ŷ":"Ŷ","Ы":"Ы","𝔜":"𝔜","𝕐":"𝕐","𝒴":"𝒴","Ÿ":"Ÿ","Ж":"Ж","Ź":"Ź","Ž":"Ž","З":"З","Ż":"Ż","Ζ":"Ζ","ℨ":"ℨ","ℤ":"ℤ","𝒵":"𝒵","á":"á","ă":"ă","∾":"∾","∾̳":"∾̳","∿":"∿","â":"â","а":"а","æ":"æ","𝔞":"𝔞","à":"à","ℵ":"ℵ","α":"α","ā":"ā","⨿":"⨿","∧":"∧","⩕":"⩕","⩜":"⩜","⩘":"⩘","⩚":"⩚","∠":"∠","⦤":"⦤","∡":"∡","⦨":"⦨","⦩":"⦩","⦪":"⦪","⦫":"⦫","⦬":"⦬","⦭":"⦭","⦮":"⦮","⦯":"⦯","∟":"∟","⊾":"⊾","⦝":"⦝","∢":"∢","⍼":"⍼","ą":"ą","𝕒":"𝕒","⩰":"⩰","⩯":"⩯","≊":"≊","≋":"≋","'":"'","å":"å","𝒶":"𝒶","*":"*","ã":"ã","ä":"ä","⨑":"⨑","⫭":"⫭","≌":"≌","϶":"϶","‵":"‵","∽":"∽","⋍":"⋍","⊽":"⊽","⌅":"⌅","⎶":"⎶","б":"б","„":"„","⦰":"⦰","β":"β","ℶ":"ℶ","≬":"≬","𝔟":"𝔟","◯":"◯","⨀":"⨀","⨁":"⨁","⨂":"⨂","⨆":"⨆","★":"★","▽":"▽","△":"△","⨄":"⨄","⤍":"⤍","⧫":"⧫","▴":"▴","▾":"▾","◂":"◂","▸":"▸","␣":"␣","▒":"▒","░":"░","▓":"▓","█":"█","=⃥":"=⃥","≡⃥":"≡⃥","⌐":"⌐","𝕓":"𝕓","⋈":"⋈","╗":"╗","╔":"╔","╖":"╖","╓":"╓","═":"═","╦":"╦","╩":"╩","╤":"╤","╧":"╧","╝":"╝","╚":"╚","╜":"╜","╙":"╙","║":"║","╬":"╬","╣":"╣","╠":"╠","╫":"╫","╢":"╢","╟":"╟","⧉":"⧉","╕":"╕","╒":"╒","┐":"┐","┌":"┌","╥":"╥","╨":"╨","┬":"┬","┴":"┴","⊟":"⊟","⊞":"⊞","⊠":"⊠","╛":"╛","╘":"╘","┘":"┘","└":"└","│":"│","╪":"╪","╡":"╡","╞":"╞","┼":"┼","┤":"┤","├":"├","¦":"¦","𝒷":"𝒷","⁏":"⁏","\\":"\","⧅":"⧅","⟈":"⟈","•":"•","⪮":"⪮","ć":"ć","∩":"∩","⩄":"⩄","⩉":"⩉","⩋":"⩋","⩇":"⩇","⩀":"⩀","∩︀":"∩︀","⁁":"⁁","⩍":"⩍","č":"č","ç":"ç","ĉ":"ĉ","⩌":"⩌","⩐":"⩐","ċ":"ċ","⦲":"⦲","¢":"¢","𝔠":"𝔠","ч":"ч","✓":"✓","χ":"χ","○":"○","⧃":"⧃","ˆ":"ˆ","≗":"≗","↺":"↺","↻":"↻","Ⓢ":"Ⓢ","⊛":"⊛","⊚":"⊚","⊝":"⊝","⨐":"⨐","⫯":"⫯","⧂":"⧂","♣":"♣",":":":",",":",","@":"@","∁":"∁","⩭":"⩭","𝕔":"𝕔","℗":"℗","↵":"↵","✗":"✗","𝒸":"𝒸","⫏":"⫏","⫑":"⫑","⫐":"⫐","⫒":"⫒","⋯":"⋯","⤸":"⤸","⤵":"⤵","⋞":"⋞","⋟":"⋟","↶":"↶","⤽":"⤽","∪":"∪","⩈":"⩈","⩆":"⩆","⩊":"⩊","⊍":"⊍","⩅":"⩅","∪︀":"∪︀","↷":"↷","⤼":"⤼","⋎":"⋎","⋏":"⋏","¤":"¤","∱":"∱","⌭":"⌭","⥥":"⥥","†":"†","ℸ":"ℸ","‐":"‐","⤏":"⤏","ď":"ď","д":"д","⇊":"⇊","⩷":"⩷","°":"°","δ":"δ","⦱":"⦱","⥿":"⥿","𝔡":"𝔡","♦":"♦","ϝ":"ϝ","⋲":"⋲","÷":"÷","⋇":"⋇","ђ":"ђ","⌞":"⌞","⌍":"⌍",$:"$","𝕕":"𝕕","≑":"≑","∸":"∸","∔":"∔","⊡":"⊡","⌟":"⌟","⌌":"⌌","𝒹":"𝒹","ѕ":"ѕ","⧶":"⧶","đ":"đ","⋱":"⋱","▿":"▿","⦦":"⦦","џ":"џ","⟿":"⟿","é":"é","⩮":"⩮","ě":"ě","≖":"≖","ê":"ê","≕":"≕","э":"э","ė":"ė","≒":"≒","𝔢":"𝔢","⪚":"⪚","è":"è","⪖":"⪖","⪘":"⪘","⪙":"⪙","⏧":"⏧","ℓ":"ℓ","⪕":"⪕","⪗":"⪗","ē":"ē","∅":"∅"," ":" "," ":" "," ":" ","ŋ":"ŋ"," ":" ","ę":"ę","𝕖":"𝕖","⋕":"⋕","⧣":"⧣","⩱":"⩱","ε":"ε","ϵ":"ϵ","=":"=","≟":"≟","⩸":"⩸","⧥":"⧥","≓":"≓","⥱":"⥱","ℯ":"ℯ","η":"η","ð":"ð","ë":"ë","€":"€","!":"!","ф":"ф","♀":"♀","ffi":"ffi","ff":"ff","ffl":"ffl","𝔣":"𝔣","fi":"fi",fj:"fj","♭":"♭","fl":"fl","▱":"▱","ƒ":"ƒ","𝕗":"𝕗","⋔":"⋔","⫙":"⫙","⨍":"⨍","½":"½","⅓":"⅓","¼":"¼","⅕":"⅕","⅙":"⅙","⅛":"⅛","⅔":"⅔","⅖":"⅖","¾":"¾","⅗":"⅗","⅜":"⅜","⅘":"⅘","⅚":"⅚","⅝":"⅝","⅞":"⅞","⁄":"⁄","⌢":"⌢","𝒻":"𝒻","⪌":"⪌","ǵ":"ǵ","γ":"γ","⪆":"⪆","ğ":"ğ","ĝ":"ĝ","г":"г","ġ":"ġ","⪩":"⪩","⪀":"⪀","⪂":"⪂","⪄":"⪄","⋛︀":"⋛︀","⪔":"⪔","𝔤":"𝔤","ℷ":"ℷ","ѓ":"ѓ","⪒":"⪒","⪥":"⪥","⪤":"⪤","≩":"≩","⪊":"⪊","⪈":"⪈","⋧":"⋧","𝕘":"𝕘","ℊ":"ℊ","⪎":"⪎","⪐":"⪐","⪧":"⪧","⩺":"⩺","⋗":"⋗","⦕":"⦕","⩼":"⩼","⥸":"⥸","≩︀":"≩︀","ъ":"ъ","⥈":"⥈","↭":"↭","ℏ":"ℏ","ĥ":"ĥ","♥":"♥","…":"…","⊹":"⊹","𝔥":"𝔥","⤥":"⤥","⤦":"⤦","⇿":"⇿","∻":"∻","↩":"↩","↪":"↪","𝕙":"𝕙","―":"―","𝒽":"𝒽","ħ":"ħ","⁃":"⁃","í":"í","î":"î","и":"и","е":"е","¡":"¡","𝔦":"𝔦","ì":"ì","⨌":"⨌","∭":"∭","⧜":"⧜","℩":"℩","ij":"ij","ī":"ī","ı":"ı","⊷":"⊷","Ƶ":"Ƶ","℅":"℅","∞":"∞","⧝":"⧝","⊺":"⊺","⨗":"⨗","⨼":"⨼","ё":"ё","į":"į","𝕚":"𝕚","ι":"ι","¿":"¿","𝒾":"𝒾","⋹":"⋹","⋵":"⋵","⋴":"⋴","⋳":"⋳","ĩ":"ĩ","і":"і","ï":"ï","ĵ":"ĵ","й":"й","𝔧":"𝔧","ȷ":"ȷ","𝕛":"𝕛","𝒿":"𝒿","ј":"ј","є":"є","κ":"κ","ϰ":"ϰ","ķ":"ķ","к":"к","𝔨":"𝔨","ĸ":"ĸ","х":"х","ќ":"ќ","𝕜":"𝕜","𝓀":"𝓀","⤛":"⤛","⤎":"⤎","⪋":"⪋","⥢":"⥢","ĺ":"ĺ","⦴":"⦴","λ":"λ","⦑":"⦑","⪅":"⪅","«":"«","⤟":"⤟","⤝":"⤝","↫":"↫","⤹":"⤹","⥳":"⥳","↢":"↢","⪫":"⪫","⤙":"⤙","⪭":"⪭","⪭︀":"⪭︀","⤌":"⤌","❲":"❲","{":"{","[":"[","⦋":"⦋","⦏":"⦏","⦍":"⦍","ľ":"ľ","ļ":"ļ","л":"л","⤶":"⤶","⥧":"⥧","⥋":"⥋","↲":"↲","≤":"≤","⇇":"⇇","⋋":"⋋","⪨":"⪨","⩿":"⩿","⪁":"⪁","⪃":"⪃","⋚︀":"⋚︀","⪓":"⪓","⋖":"⋖","⥼":"⥼","𝔩":"𝔩","⪑":"⪑","⥪":"⥪","▄":"▄","љ":"љ","⥫":"⥫","◺":"◺","ŀ":"ŀ","⎰":"⎰","≨":"≨","⪉":"⪉","⪇":"⪇","⋦":"⋦","⟬":"⟬","⇽":"⇽","⟼":"⟼","↬":"↬","⦅":"⦅","𝕝":"𝕝","⨭":"⨭","⨴":"⨴","∗":"∗","◊":"◊","(":"(","⦓":"⦓","⥭":"⥭","‎":"‎","⊿":"⊿","‹":"‹","𝓁":"𝓁","⪍":"⪍","⪏":"⪏","‚":"‚","ł":"ł","⪦":"⪦","⩹":"⩹","⋉":"⋉","⥶":"⥶","⩻":"⩻","⦖":"⦖","◃":"◃","⥊":"⥊","⥦":"⥦","≨︀":"≨︀","∺":"∺","¯":"¯","♂":"♂","✠":"✠","▮":"▮","⨩":"⨩","м":"м","—":"—","𝔪":"𝔪","℧":"℧","µ":"µ","⫰":"⫰","−":"−","⨪":"⨪","⫛":"⫛","⊧":"⊧","𝕞":"𝕞","𝓂":"𝓂","μ":"μ","⊸":"⊸","⋙̸":"⋙̸","≫⃒":"≫⃒","⇍":"⇍","⇎":"⇎","⋘̸":"⋘̸","≪⃒":"≪⃒","⇏":"⇏","⊯":"⊯","⊮":"⊮","ń":"ń","∠⃒":"∠⃒","⩰̸":"⩰̸","≋̸":"≋̸","ʼn":"ʼn","♮":"♮","⩃":"⩃","ň":"ň","ņ":"ņ","⩭̸":"⩭̸","⩂":"⩂","н":"н","–":"–","⇗":"⇗","⤤":"⤤","≐̸":"≐̸","⤨":"⤨","𝔫":"𝔫","↮":"↮","⫲":"⫲","⋼":"⋼","⋺":"⋺","њ":"њ","≦̸":"≦̸","↚":"↚","‥":"‥","𝕟":"𝕟","¬":"¬","⋹̸":"⋹̸","⋵̸":"⋵̸","⋷":"⋷","⋶":"⋶","⋾":"⋾","⋽":"⋽","⫽⃥":"⫽⃥","∂̸":"∂̸","⨔":"⨔","↛":"↛","⤳̸":"⤳̸","↝̸":"↝̸","𝓃":"𝓃","⊄":"⊄","⫅̸":"⫅̸","⊅":"⊅","⫆̸":"⫆̸","ñ":"ñ","ν":"ν","#":"#","№":"№"," ":" ","⊭":"⊭","⤄":"⤄","≍⃒":"≍⃒","⊬":"⊬","≥⃒":"≥⃒",">⃒":">⃒","⧞":"⧞","⤂":"⤂","≤⃒":"≤⃒","<⃒":"<⃒","⊴⃒":"⊴⃒","⤃":"⤃","⊵⃒":"⊵⃒","∼⃒":"∼⃒","⇖":"⇖","⤣":"⤣","⤧":"⤧","ó":"ó","ô":"ô","о":"о","ő":"ő","⨸":"⨸","⦼":"⦼","œ":"œ","⦿":"⦿","𝔬":"𝔬","˛":"˛","ò":"ò","⧁":"⧁","⦵":"⦵","⦾":"⦾","⦻":"⦻","⧀":"⧀","ō":"ō","ω":"ω","ο":"ο","⦶":"⦶","𝕠":"𝕠","⦷":"⦷","⦹":"⦹","∨":"∨","⩝":"⩝","ℴ":"ℴ","ª":"ª","º":"º","⊶":"⊶","⩖":"⩖","⩗":"⩗","⩛":"⩛","ø":"ø","⊘":"⊘","õ":"õ","⨶":"⨶","ö":"ö","⌽":"⌽","¶":"¶","⫳":"⫳","⫽":"⫽","п":"п","%":"%",".":".","‰":"‰","‱":"‱","𝔭":"𝔭","φ":"φ","ϕ":"ϕ","☎":"☎","π":"π","ϖ":"ϖ","ℎ":"ℎ","+":"+","⨣":"⨣","⨢":"⨢","⨥":"⨥","⩲":"⩲","⨦":"⨦","⨧":"⨧","⨕":"⨕","𝕡":"𝕡","£":"£","⪳":"⪳","⪷":"⪷","⪹":"⪹","⪵":"⪵","⋨":"⋨","′":"′","⌮":"⌮","⌒":"⌒","⌓":"⌓","⊰":"⊰","𝓅":"𝓅","ψ":"ψ"," ":" ","𝔮":"𝔮","𝕢":"𝕢","⁗":"⁗","𝓆":"𝓆","⨖":"⨖","?":"?","⤜":"⤜","⥤":"⥤","∽̱":"∽̱","ŕ":"ŕ","⦳":"⦳","⦒":"⦒","⦥":"⦥","»":"»","⥵":"⥵","⤠":"⤠","⤳":"⤳","⤞":"⤞","⥅":"⥅","⥴":"⥴","↣":"↣","↝":"↝","⤚":"⤚","∶":"∶","❳":"❳","}":"}","]":"]","⦌":"⦌","⦎":"⦎","⦐":"⦐","ř":"ř","ŗ":"ŗ","р":"р","⤷":"⤷","⥩":"⥩","↳":"↳","▭":"▭","⥽":"⥽","𝔯":"𝔯","⥬":"⥬","ρ":"ρ","ϱ":"ϱ","⇉":"⇉","⋌":"⋌","˚":"˚","‏":"‏","⎱":"⎱","⫮":"⫮","⟭":"⟭","⇾":"⇾","⦆":"⦆","𝕣":"𝕣","⨮":"⨮","⨵":"⨵",")":")","⦔":"⦔","⨒":"⨒","›":"›","𝓇":"𝓇","⋊":"⋊","▹":"▹","⧎":"⧎","⥨":"⥨","℞":"℞","ś":"ś","⪴":"⪴","⪸":"⪸","š":"š","ş":"ş","ŝ":"ŝ","⪶":"⪶","⪺":"⪺","⋩":"⋩","⨓":"⨓","с":"с","⋅":"⋅","⩦":"⩦","⇘":"⇘","§":"§",";":";","⤩":"⤩","✶":"✶","𝔰":"𝔰","♯":"♯","щ":"щ","ш":"ш","­":"­","σ":"σ","ς":"ς","⩪":"⩪","⪞":"⪞","⪠":"⪠","⪝":"⪝","⪟":"⪟","≆":"≆","⨤":"⨤","⥲":"⥲","⨳":"⨳","⧤":"⧤","⌣":"⌣","⪪":"⪪","⪬":"⪬","⪬︀":"⪬︀","ь":"ь","/":"/","⧄":"⧄","⌿":"⌿","𝕤":"𝕤","♠":"♠","⊓︀":"⊓︀","⊔︀":"⊔︀","𝓈":"𝓈","☆":"☆","⊂":"⊂","⫅":"⫅","⪽":"⪽","⫃":"⫃","⫁":"⫁","⫋":"⫋","⊊":"⊊","⪿":"⪿","⥹":"⥹","⫇":"⫇","⫕":"⫕","⫓":"⫓","♪":"♪","¹":"¹","²":"²","³":"³","⫆":"⫆","⪾":"⪾","⫘":"⫘","⫄":"⫄","⟉":"⟉","⫗":"⫗","⥻":"⥻","⫂":"⫂","⫌":"⫌","⊋":"⊋","⫀":"⫀","⫈":"⫈","⫔":"⫔","⫖":"⫖","⇙":"⇙","⤪":"⤪","ß":"ß","⌖":"⌖","τ":"τ","ť":"ť","ţ":"ţ","т":"т","⌕":"⌕","𝔱":"𝔱","θ":"θ","ϑ":"ϑ","þ":"þ","×":"×","⨱":"⨱","⨰":"⨰","⌶":"⌶","⫱":"⫱","𝕥":"𝕥","⫚":"⫚","‴":"‴","▵":"▵","≜":"≜","◬":"◬","⨺":"⨺","⨹":"⨹","⧍":"⧍","⨻":"⨻","⏢":"⏢","𝓉":"𝓉","ц":"ц","ћ":"ћ","ŧ":"ŧ","⥣":"⥣","ú":"ú","ў":"ў","ŭ":"ŭ","û":"û","у":"у","ű":"ű","⥾":"⥾","𝔲":"𝔲","ù":"ù","▀":"▀","⌜":"⌜","⌏":"⌏","◸":"◸","ū":"ū","ų":"ų","𝕦":"𝕦","υ":"υ","⇈":"⇈","⌝":"⌝","⌎":"⌎","ů":"ů","◹":"◹","𝓊":"𝓊","⋰":"⋰","ũ":"ũ","ü":"ü","⦧":"⦧","⫨":"⫨","⫩":"⫩","⦜":"⦜","⊊︀":"⊊︀","⫋︀":"⫋︀","⊋︀":"⊋︀","⫌︀":"⫌︀","в":"в","⊻":"⊻","≚":"≚","⋮":"⋮","𝔳":"𝔳","𝕧":"𝕧","𝓋":"𝓋","⦚":"⦚","ŵ":"ŵ","⩟":"⩟","≙":"≙","℘":"℘","𝔴":"𝔴","𝕨":"𝕨","𝓌":"𝓌","𝔵":"𝔵","ξ":"ξ","⋻":"⋻","𝕩":"𝕩","𝓍":"𝓍","ý":"ý","я":"я","ŷ":"ŷ","ы":"ы","¥":"¥","𝔶":"𝔶","ї":"ї","𝕪":"𝕪","𝓎":"𝓎","ю":"ю","ÿ":"ÿ","ź":"ź","ž":"ž","з":"з","ż":"ż","ζ":"ζ","𝔷":"𝔷","ж":"ж","⇝":"⇝","𝕫":"𝕫","𝓏":"𝓏","‍":"‍","‌":"‌"}}}; + +/***/ }), + +/***/ "./node_modules/html-entities/lib/numeric-unicode-map.js": +/*!***************************************************************!*\ + !*** ./node_modules/html-entities/lib/numeric-unicode-map.js ***! + \***************************************************************/ +/***/ (function(__unused_webpack_module, exports) { + +"use strict"; +Object.defineProperty(exports, "__esModule", ({value:true}));exports.numericUnicodeMap={0:65533,128:8364,130:8218,131:402,132:8222,133:8230,134:8224,135:8225,136:710,137:8240,138:352,139:8249,140:338,142:381,145:8216,146:8217,147:8220,148:8221,149:8226,150:8211,151:8212,152:732,153:8482,154:353,155:8250,156:339,158:382,159:376}; + +/***/ }), + +/***/ "./node_modules/html-entities/lib/surrogate-pairs.js": +/*!***********************************************************!*\ + !*** ./node_modules/html-entities/lib/surrogate-pairs.js ***! + \***********************************************************/ +/***/ (function(__unused_webpack_module, exports) { + +"use strict"; +Object.defineProperty(exports, "__esModule", ({value:true}));exports.fromCodePoint=String.fromCodePoint||function(astralCodePoint){return String.fromCharCode(Math.floor((astralCodePoint-65536)/1024)+55296,(astralCodePoint-65536)%1024+56320)};exports.getCodePoint=String.prototype.codePointAt?function(input,position){return input.codePointAt(position)}:function(input,position){return(input.charCodeAt(position)-55296)*1024+input.charCodeAt(position+1)-56320+65536};exports.highSurrogateFrom=55296;exports.highSurrogateTo=56319; + +/***/ }), + +/***/ "./node_modules/webpack-dev-server/client/clients/WebSocketClient.js": +/*!***************************************************************************!*\ + !*** ./node_modules/webpack-dev-server/client/clients/WebSocketClient.js ***! + \***************************************************************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": function() { return /* binding */ WebSocketClient; } +/* harmony export */ }); +/* harmony import */ var _utils_log_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils/log.js */ "./node_modules/webpack-dev-server/client/utils/log.js"); +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + + + +var WebSocketClient = /*#__PURE__*/function () { + /** + * @param {string} url + */ + function WebSocketClient(url) { + _classCallCheck(this, WebSocketClient); + + this.client = new WebSocket(url); + + this.client.onerror = function (error) { + _utils_log_js__WEBPACK_IMPORTED_MODULE_0__.log.error(error); + }; + } + /** + * @param {(...args: any[]) => void} f + */ + + + _createClass(WebSocketClient, [{ + key: "onOpen", + value: function onOpen(f) { + this.client.onopen = f; + } + /** + * @param {(...args: any[]) => void} f + */ + + }, { + key: "onClose", + value: function onClose(f) { + this.client.onclose = f; + } // call f with the message string as the first argument + + /** + * @param {(...args: any[]) => void} f + */ + + }, { + key: "onMessage", + value: function onMessage(f) { + this.client.onmessage = function (e) { + f(e.data); + }; + } + }]); + + return WebSocketClient; +}(); + + + +/***/ }), + +/***/ "./node_modules/webpack-dev-server/client/index.js?protocol=ws%3A&hostname=localhost&port=8081&pathname=%2Fws&logging=none&reconnect=10": +/*!**********************************************************************************************************************************************!*\ + !*** ./node_modules/webpack-dev-server/client/index.js?protocol=ws%3A&hostname=localhost&port=8081&pathname=%2Fws&logging=none&reconnect=10 ***! + \**********************************************************************************************************************************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +"use strict"; +var __resourceQuery = "?protocol=ws%3A&hostname=localhost&port=8081&pathname=%2Fws&logging=none&reconnect=10"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var webpack_hot_log_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! webpack/hot/log.js */ "./node_modules/webpack/hot/log.js"); +/* harmony import */ var webpack_hot_log_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(webpack_hot_log_js__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var _utils_stripAnsi_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils/stripAnsi.js */ "./node_modules/webpack-dev-server/client/utils/stripAnsi.js"); +/* harmony import */ var _utils_parseURL_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utils/parseURL.js */ "./node_modules/webpack-dev-server/client/utils/parseURL.js"); +/* harmony import */ var _socket_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./socket.js */ "./node_modules/webpack-dev-server/client/socket.js"); +/* harmony import */ var _overlay_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./overlay.js */ "./node_modules/webpack-dev-server/client/overlay.js"); +/* harmony import */ var _utils_log_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./utils/log.js */ "./node_modules/webpack-dev-server/client/utils/log.js"); +/* harmony import */ var _utils_sendMessage_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./utils/sendMessage.js */ "./node_modules/webpack-dev-server/client/utils/sendMessage.js"); +/* harmony import */ var _utils_reloadApp_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./utils/reloadApp.js */ "./node_modules/webpack-dev-server/client/utils/reloadApp.js"); +/* harmony import */ var _utils_createSocketURL_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./utils/createSocketURL.js */ "./node_modules/webpack-dev-server/client/utils/createSocketURL.js"); +/* global __resourceQuery, __webpack_hash__ */ +/// + + + + + + + + + +/** + * @typedef {Object} Options + * @property {boolean} hot + * @property {boolean} liveReload + * @property {boolean} progress + * @property {boolean | { warnings?: boolean, errors?: boolean, trustedTypesPolicyName?: string }} overlay + * @property {string} [logging] + * @property {number} [reconnect] + */ + +/** + * @typedef {Object} Status + * @property {boolean} isUnloading + * @property {string} currentHash + * @property {string} [previousHash] + */ + +/** + * @type {Status} + */ + +var status = { + isUnloading: false, + // TODO Workaround for webpack v4, `__webpack_hash__` is not replaced without HotModuleReplacement + // eslint-disable-next-line camelcase + currentHash: true ? __webpack_require__.h() : 0 +}; +/** @type {Options} */ + +var options = { + hot: false, + liveReload: false, + progress: false, + overlay: false +}; +var parsedResourceQuery = (0,_utils_parseURL_js__WEBPACK_IMPORTED_MODULE_2__["default"])(__resourceQuery); + +if (parsedResourceQuery.hot === "true") { + options.hot = true; + _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.info("Hot Module Replacement enabled."); +} + +if (parsedResourceQuery["live-reload"] === "true") { + options.liveReload = true; + _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.info("Live Reloading enabled."); +} + +if (parsedResourceQuery.logging) { + options.logging = parsedResourceQuery.logging; +} + +if (typeof parsedResourceQuery.reconnect !== "undefined") { + options.reconnect = Number(parsedResourceQuery.reconnect); +} +/** + * @param {string} level + */ + + +function setAllLogLevel(level) { + // This is needed because the HMR logger operate separately from dev server logger + webpack_hot_log_js__WEBPACK_IMPORTED_MODULE_0___default().setLogLevel(level === "verbose" || level === "log" ? "info" : level); + (0,_utils_log_js__WEBPACK_IMPORTED_MODULE_5__.setLogLevel)(level); +} + +if (options.logging) { + setAllLogLevel(options.logging); +} + +self.addEventListener("beforeunload", function () { + status.isUnloading = true; +}); +var onSocketMessage = { + hot: function hot() { + if (parsedResourceQuery.hot === "false") { + return; + } + + options.hot = true; + _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.info("Hot Module Replacement enabled."); + }, + liveReload: function liveReload() { + if (parsedResourceQuery["live-reload"] === "false") { + return; + } + + options.liveReload = true; + _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.info("Live Reloading enabled."); + }, + invalid: function invalid() { + _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.info("App updated. Recompiling..."); // Fixes #1042. overlay doesn't clear if errors are fixed but warnings remain. + + if (options.overlay) { + (0,_overlay_js__WEBPACK_IMPORTED_MODULE_4__.hide)(); + } + + (0,_utils_sendMessage_js__WEBPACK_IMPORTED_MODULE_6__["default"])("Invalid"); + }, + + /** + * @param {string} hash + */ + hash: function hash(_hash) { + status.previousHash = status.currentHash; + status.currentHash = _hash; + }, + logging: setAllLogLevel, + + /** + * @param {boolean} value + */ + overlay: function overlay(value) { + if (typeof document === "undefined") { + return; + } + + options.overlay = value; + }, + + /** + * @param {number} value + */ + reconnect: function reconnect(value) { + if (parsedResourceQuery.reconnect === "false") { + return; + } + + options.reconnect = value; + }, + + /** + * @param {boolean} value + */ + progress: function progress(value) { + options.progress = value; + }, + + /** + * @param {{ pluginName?: string, percent: number, msg: string }} data + */ + "progress-update": function progressUpdate(data) { + if (options.progress) { + _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.info("".concat(data.pluginName ? "[".concat(data.pluginName, "] ") : "").concat(data.percent, "% - ").concat(data.msg, ".")); + } + + (0,_utils_sendMessage_js__WEBPACK_IMPORTED_MODULE_6__["default"])("Progress", data); + }, + "still-ok": function stillOk() { + _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.info("Nothing changed."); + + if (options.overlay) { + (0,_overlay_js__WEBPACK_IMPORTED_MODULE_4__.hide)(); + } + + (0,_utils_sendMessage_js__WEBPACK_IMPORTED_MODULE_6__["default"])("StillOk"); + }, + ok: function ok() { + (0,_utils_sendMessage_js__WEBPACK_IMPORTED_MODULE_6__["default"])("Ok"); + + if (options.overlay) { + (0,_overlay_js__WEBPACK_IMPORTED_MODULE_4__.hide)(); + } + + (0,_utils_reloadApp_js__WEBPACK_IMPORTED_MODULE_7__["default"])(options, status); + }, + // TODO: remove in v5 in favor of 'static-changed' + + /** + * @param {string} file + */ + "content-changed": function contentChanged(file) { + _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.info("".concat(file ? "\"".concat(file, "\"") : "Content", " from static directory was changed. Reloading...")); + self.location.reload(); + }, + + /** + * @param {string} file + */ + "static-changed": function staticChanged(file) { + _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.info("".concat(file ? "\"".concat(file, "\"") : "Content", " from static directory was changed. Reloading...")); + self.location.reload(); + }, + + /** + * @param {Error[]} warnings + * @param {any} params + */ + warnings: function warnings(_warnings, params) { + _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.warn("Warnings while compiling."); + + var printableWarnings = _warnings.map(function (error) { + var _formatProblem = (0,_overlay_js__WEBPACK_IMPORTED_MODULE_4__.formatProblem)("warning", error), + header = _formatProblem.header, + body = _formatProblem.body; + + return "".concat(header, "\n").concat((0,_utils_stripAnsi_js__WEBPACK_IMPORTED_MODULE_1__["default"])(body)); + }); + + (0,_utils_sendMessage_js__WEBPACK_IMPORTED_MODULE_6__["default"])("Warnings", printableWarnings); + + for (var i = 0; i < printableWarnings.length; i++) { + _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.warn(printableWarnings[i]); + } + + var needShowOverlayForWarnings = typeof options.overlay === "boolean" ? options.overlay : options.overlay && options.overlay.warnings; + + if (needShowOverlayForWarnings) { + var trustedTypesPolicyName = typeof options.overlay === "object" && options.overlay.trustedTypesPolicyName; + (0,_overlay_js__WEBPACK_IMPORTED_MODULE_4__.show)("warning", _warnings, trustedTypesPolicyName || null); + } + + if (params && params.preventReloading) { + return; + } + + (0,_utils_reloadApp_js__WEBPACK_IMPORTED_MODULE_7__["default"])(options, status); + }, + + /** + * @param {Error[]} errors + */ + errors: function errors(_errors) { + _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.error("Errors while compiling. Reload prevented."); + + var printableErrors = _errors.map(function (error) { + var _formatProblem2 = (0,_overlay_js__WEBPACK_IMPORTED_MODULE_4__.formatProblem)("error", error), + header = _formatProblem2.header, + body = _formatProblem2.body; + + return "".concat(header, "\n").concat((0,_utils_stripAnsi_js__WEBPACK_IMPORTED_MODULE_1__["default"])(body)); + }); + + (0,_utils_sendMessage_js__WEBPACK_IMPORTED_MODULE_6__["default"])("Errors", printableErrors); + + for (var i = 0; i < printableErrors.length; i++) { + _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.error(printableErrors[i]); + } + + var needShowOverlayForErrors = typeof options.overlay === "boolean" ? options.overlay : options.overlay && options.overlay.errors; + + if (needShowOverlayForErrors) { + var trustedTypesPolicyName = typeof options.overlay === "object" && options.overlay.trustedTypesPolicyName; + (0,_overlay_js__WEBPACK_IMPORTED_MODULE_4__.show)("error", _errors, trustedTypesPolicyName || null); + } + }, + + /** + * @param {Error} error + */ + error: function error(_error) { + _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.error(_error); + }, + close: function close() { + _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.info("Disconnected!"); + + if (options.overlay) { + (0,_overlay_js__WEBPACK_IMPORTED_MODULE_4__.hide)(); + } + + (0,_utils_sendMessage_js__WEBPACK_IMPORTED_MODULE_6__["default"])("Close"); + } +}; +var socketURL = (0,_utils_createSocketURL_js__WEBPACK_IMPORTED_MODULE_8__["default"])(parsedResourceQuery); +(0,_socket_js__WEBPACK_IMPORTED_MODULE_3__["default"])(socketURL, onSocketMessage, options.reconnect); + +/***/ }), + +/***/ "./node_modules/webpack-dev-server/client/modules/logger/index.js": +/*!************************************************************************!*\ + !*** ./node_modules/webpack-dev-server/client/modules/logger/index.js ***! + \************************************************************************/ +/***/ (function(__unused_webpack_module, exports) { + +/******/ (function() { // webpackBootstrap +/******/ "use strict"; +/******/ var __webpack_modules__ = ({ + +/***/ "./client-src/modules/logger/SyncBailHookFake.js": +/*!*******************************************************!*\ + !*** ./client-src/modules/logger/SyncBailHookFake.js ***! + \*******************************************************/ +/***/ (function(module) { + + +/** + * Client stub for tapable SyncBailHook + */ + +module.exports = function clientTapableSyncBailHook() { + return { + call: function call() {} + }; +}; + +/***/ }), + +/***/ "./node_modules/webpack/lib/logging/Logger.js": +/*!****************************************************!*\ + !*** ./node_modules/webpack/lib/logging/Logger.js ***! + \****************************************************/ +/***/ (function(__unused_webpack_module, exports) { + +/* + MIT License http://www.opensource.org/licenses/mit-license.php + Author Tobias Koppers @sokra +*/ + + +function _toConsumableArray(arr) { + return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); +} + +function _nonIterableSpread() { + throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); +} + +function _unsupportedIterableToArray(o, minLen) { + if (!o) return; + if (typeof o === "string") return _arrayLikeToArray(o, minLen); + var n = Object.prototype.toString.call(o).slice(8, -1); + if (n === "Object" && o.constructor) n = o.constructor.name; + if (n === "Map" || n === "Set") return Array.from(o); + if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); +} + +function _iterableToArray(iter) { + if (typeof (typeof Symbol !== "undefined" ? Symbol : function (i) { return i; }) !== "undefined" && iter[(typeof Symbol !== "undefined" ? Symbol : function (i) { return i; }).iterator] != null || iter["@@iterator"] != null) return Array.from(iter); +} + +function _arrayWithoutHoles(arr) { + if (Array.isArray(arr)) return _arrayLikeToArray(arr); +} + +function _arrayLikeToArray(arr, len) { + if (len == null || len > arr.length) len = arr.length; + + for (var i = 0, arr2 = new Array(len); i < len; i++) { + arr2[i] = arr[i]; + } + + return arr2; +} + +function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } +} + +function _defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } +} + +function _createClass(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties(Constructor.prototype, protoProps); + if (staticProps) _defineProperties(Constructor, staticProps); + Object.defineProperty(Constructor, "prototype", { + writable: false + }); + return Constructor; +} + +var LogType = Object.freeze({ + error: + /** @type {"error"} */ + "error", + // message, c style arguments + warn: + /** @type {"warn"} */ + "warn", + // message, c style arguments + info: + /** @type {"info"} */ + "info", + // message, c style arguments + log: + /** @type {"log"} */ + "log", + // message, c style arguments + debug: + /** @type {"debug"} */ + "debug", + // message, c style arguments + trace: + /** @type {"trace"} */ + "trace", + // no arguments + group: + /** @type {"group"} */ + "group", + // [label] + groupCollapsed: + /** @type {"groupCollapsed"} */ + "groupCollapsed", + // [label] + groupEnd: + /** @type {"groupEnd"} */ + "groupEnd", + // [label] + profile: + /** @type {"profile"} */ + "profile", + // [profileName] + profileEnd: + /** @type {"profileEnd"} */ + "profileEnd", + // [profileName] + time: + /** @type {"time"} */ + "time", + // name, time as [seconds, nanoseconds] + clear: + /** @type {"clear"} */ + "clear", + // no arguments + status: + /** @type {"status"} */ + "status" // message, arguments + +}); +exports.LogType = LogType; +/** @typedef {typeof LogType[keyof typeof LogType]} LogTypeEnum */ + +var LOG_SYMBOL = (typeof Symbol !== "undefined" ? Symbol : function (i) { return i; })("webpack logger raw log method"); +var TIMERS_SYMBOL = (typeof Symbol !== "undefined" ? Symbol : function (i) { return i; })("webpack logger times"); +var TIMERS_AGGREGATES_SYMBOL = (typeof Symbol !== "undefined" ? Symbol : function (i) { return i; })("webpack logger aggregated times"); + +var WebpackLogger = /*#__PURE__*/function () { + /** + * @param {function(LogTypeEnum, any[]=): void} log log function + * @param {function(string | function(): string): WebpackLogger} getChildLogger function to create child logger + */ + function WebpackLogger(log, getChildLogger) { + _classCallCheck(this, WebpackLogger); + + this[LOG_SYMBOL] = log; + this.getChildLogger = getChildLogger; + } + + _createClass(WebpackLogger, [{ + key: "error", + value: function error() { + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + this[LOG_SYMBOL](LogType.error, args); + } + }, { + key: "warn", + value: function warn() { + for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { + args[_key2] = arguments[_key2]; + } + + this[LOG_SYMBOL](LogType.warn, args); + } + }, { + key: "info", + value: function info() { + for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) { + args[_key3] = arguments[_key3]; + } + + this[LOG_SYMBOL](LogType.info, args); + } + }, { + key: "log", + value: function log() { + for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) { + args[_key4] = arguments[_key4]; + } + + this[LOG_SYMBOL](LogType.log, args); + } + }, { + key: "debug", + value: function debug() { + for (var _len5 = arguments.length, args = new Array(_len5), _key5 = 0; _key5 < _len5; _key5++) { + args[_key5] = arguments[_key5]; + } + + this[LOG_SYMBOL](LogType.debug, args); + } + }, { + key: "assert", + value: function assert(assertion) { + if (!assertion) { + for (var _len6 = arguments.length, args = new Array(_len6 > 1 ? _len6 - 1 : 0), _key6 = 1; _key6 < _len6; _key6++) { + args[_key6 - 1] = arguments[_key6]; + } + + this[LOG_SYMBOL](LogType.error, args); + } + } + }, { + key: "trace", + value: function trace() { + this[LOG_SYMBOL](LogType.trace, ["Trace"]); + } + }, { + key: "clear", + value: function clear() { + this[LOG_SYMBOL](LogType.clear); + } + }, { + key: "status", + value: function status() { + for (var _len7 = arguments.length, args = new Array(_len7), _key7 = 0; _key7 < _len7; _key7++) { + args[_key7] = arguments[_key7]; + } + + this[LOG_SYMBOL](LogType.status, args); + } + }, { + key: "group", + value: function group() { + for (var _len8 = arguments.length, args = new Array(_len8), _key8 = 0; _key8 < _len8; _key8++) { + args[_key8] = arguments[_key8]; + } + + this[LOG_SYMBOL](LogType.group, args); + } + }, { + key: "groupCollapsed", + value: function groupCollapsed() { + for (var _len9 = arguments.length, args = new Array(_len9), _key9 = 0; _key9 < _len9; _key9++) { + args[_key9] = arguments[_key9]; + } + + this[LOG_SYMBOL](LogType.groupCollapsed, args); + } + }, { + key: "groupEnd", + value: function groupEnd() { + for (var _len10 = arguments.length, args = new Array(_len10), _key10 = 0; _key10 < _len10; _key10++) { + args[_key10] = arguments[_key10]; + } + + this[LOG_SYMBOL](LogType.groupEnd, args); + } + }, { + key: "profile", + value: function profile(label) { + this[LOG_SYMBOL](LogType.profile, [label]); + } + }, { + key: "profileEnd", + value: function profileEnd(label) { + this[LOG_SYMBOL](LogType.profileEnd, [label]); + } + }, { + key: "time", + value: function time(label) { + this[TIMERS_SYMBOL] = this[TIMERS_SYMBOL] || new Map(); + this[TIMERS_SYMBOL].set(label, process.hrtime()); + } + }, { + key: "timeLog", + value: function timeLog(label) { + var prev = this[TIMERS_SYMBOL] && this[TIMERS_SYMBOL].get(label); + + if (!prev) { + throw new Error("No such label '".concat(label, "' for WebpackLogger.timeLog()")); + } + + var time = process.hrtime(prev); + this[LOG_SYMBOL](LogType.time, [label].concat(_toConsumableArray(time))); + } + }, { + key: "timeEnd", + value: function timeEnd(label) { + var prev = this[TIMERS_SYMBOL] && this[TIMERS_SYMBOL].get(label); + + if (!prev) { + throw new Error("No such label '".concat(label, "' for WebpackLogger.timeEnd()")); + } + + var time = process.hrtime(prev); + this[TIMERS_SYMBOL].delete(label); + this[LOG_SYMBOL](LogType.time, [label].concat(_toConsumableArray(time))); + } + }, { + key: "timeAggregate", + value: function timeAggregate(label) { + var prev = this[TIMERS_SYMBOL] && this[TIMERS_SYMBOL].get(label); + + if (!prev) { + throw new Error("No such label '".concat(label, "' for WebpackLogger.timeAggregate()")); + } + + var time = process.hrtime(prev); + this[TIMERS_SYMBOL].delete(label); + this[TIMERS_AGGREGATES_SYMBOL] = this[TIMERS_AGGREGATES_SYMBOL] || new Map(); + var current = this[TIMERS_AGGREGATES_SYMBOL].get(label); + + if (current !== undefined) { + if (time[1] + current[1] > 1e9) { + time[0] += current[0] + 1; + time[1] = time[1] - 1e9 + current[1]; + } else { + time[0] += current[0]; + time[1] += current[1]; + } + } + + this[TIMERS_AGGREGATES_SYMBOL].set(label, time); + } + }, { + key: "timeAggregateEnd", + value: function timeAggregateEnd(label) { + if (this[TIMERS_AGGREGATES_SYMBOL] === undefined) return; + var time = this[TIMERS_AGGREGATES_SYMBOL].get(label); + if (time === undefined) return; + this[TIMERS_AGGREGATES_SYMBOL].delete(label); + this[LOG_SYMBOL](LogType.time, [label].concat(_toConsumableArray(time))); + } + }]); + + return WebpackLogger; +}(); + +exports.Logger = WebpackLogger; + +/***/ }), + +/***/ "./node_modules/webpack/lib/logging/createConsoleLogger.js": +/*!*****************************************************************!*\ + !*** ./node_modules/webpack/lib/logging/createConsoleLogger.js ***! + \*****************************************************************/ +/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_10785__) { + +/* + MIT License http://www.opensource.org/licenses/mit-license.php + Author Tobias Koppers @sokra +*/ + + +function _toConsumableArray(arr) { + return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); +} + +function _nonIterableSpread() { + throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); +} + +function _unsupportedIterableToArray(o, minLen) { + if (!o) return; + if (typeof o === "string") return _arrayLikeToArray(o, minLen); + var n = Object.prototype.toString.call(o).slice(8, -1); + if (n === "Object" && o.constructor) n = o.constructor.name; + if (n === "Map" || n === "Set") return Array.from(o); + if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); +} + +function _iterableToArray(iter) { + if (typeof (typeof Symbol !== "undefined" ? Symbol : function (i) { return i; }) !== "undefined" && iter[(typeof Symbol !== "undefined" ? Symbol : function (i) { return i; }).iterator] != null || iter["@@iterator"] != null) return Array.from(iter); +} + +function _arrayWithoutHoles(arr) { + if (Array.isArray(arr)) return _arrayLikeToArray(arr); +} + +function _arrayLikeToArray(arr, len) { + if (len == null || len > arr.length) len = arr.length; + + for (var i = 0, arr2 = new Array(len); i < len; i++) { + arr2[i] = arr[i]; + } + + return arr2; +} + +var _require = __nested_webpack_require_10785__(/*! ./Logger */ "./node_modules/webpack/lib/logging/Logger.js"), + LogType = _require.LogType; +/** @typedef {import("../../declarations/WebpackOptions").FilterItemTypes} FilterItemTypes */ + +/** @typedef {import("../../declarations/WebpackOptions").FilterTypes} FilterTypes */ + +/** @typedef {import("./Logger").LogTypeEnum} LogTypeEnum */ + +/** @typedef {function(string): boolean} FilterFunction */ + +/** + * @typedef {Object} LoggerConsole + * @property {function(): void} clear + * @property {function(): void} trace + * @property {(...args: any[]) => void} info + * @property {(...args: any[]) => void} log + * @property {(...args: any[]) => void} warn + * @property {(...args: any[]) => void} error + * @property {(...args: any[]) => void=} debug + * @property {(...args: any[]) => void=} group + * @property {(...args: any[]) => void=} groupCollapsed + * @property {(...args: any[]) => void=} groupEnd + * @property {(...args: any[]) => void=} status + * @property {(...args: any[]) => void=} profile + * @property {(...args: any[]) => void=} profileEnd + * @property {(...args: any[]) => void=} logTime + */ + +/** + * @typedef {Object} LoggerOptions + * @property {false|true|"none"|"error"|"warn"|"info"|"log"|"verbose"} level loglevel + * @property {FilterTypes|boolean} debug filter for debug logging + * @property {LoggerConsole} console the console to log to + */ + +/** + * @param {FilterItemTypes} item an input item + * @returns {FilterFunction} filter function + */ + + +var filterToFunction = function filterToFunction(item) { + if (typeof item === "string") { + var regExp = new RegExp("[\\\\/]".concat(item.replace( // eslint-disable-next-line no-useless-escape + /[-[\]{}()*+?.\\^$|]/g, "\\$&"), "([\\\\/]|$|!|\\?)")); + return function (ident) { + return regExp.test(ident); + }; + } + + if (item && typeof item === "object" && typeof item.test === "function") { + return function (ident) { + return item.test(ident); + }; + } + + if (typeof item === "function") { + return item; + } + + if (typeof item === "boolean") { + return function () { + return item; + }; + } +}; +/** + * @enum {number} + */ + + +var LogLevel = { + none: 6, + false: 6, + error: 5, + warn: 4, + info: 3, + log: 2, + true: 2, + verbose: 1 +}; +/** + * @param {LoggerOptions} options options object + * @returns {function(string, LogTypeEnum, any[]): void} logging function + */ + +module.exports = function (_ref) { + var _ref$level = _ref.level, + level = _ref$level === void 0 ? "info" : _ref$level, + _ref$debug = _ref.debug, + debug = _ref$debug === void 0 ? false : _ref$debug, + console = _ref.console; + var debugFilters = typeof debug === "boolean" ? [function () { + return debug; + }] : + /** @type {FilterItemTypes[]} */ + [].concat(debug).map(filterToFunction); + /** @type {number} */ + + var loglevel = LogLevel["".concat(level)] || 0; + /** + * @param {string} name name of the logger + * @param {LogTypeEnum} type type of the log entry + * @param {any[]} args arguments of the log entry + * @returns {void} + */ + + var logger = function logger(name, type, args) { + var labeledArgs = function labeledArgs() { + if (Array.isArray(args)) { + if (args.length > 0 && typeof args[0] === "string") { + return ["[".concat(name, "] ").concat(args[0])].concat(_toConsumableArray(args.slice(1))); + } else { + return ["[".concat(name, "]")].concat(_toConsumableArray(args)); + } + } else { + return []; + } + }; + + var debug = debugFilters.some(function (f) { + return f(name); + }); + + switch (type) { + case LogType.debug: + if (!debug) return; // eslint-disable-next-line node/no-unsupported-features/node-builtins + + if (typeof console.debug === "function") { + // eslint-disable-next-line node/no-unsupported-features/node-builtins + console.debug.apply(console, _toConsumableArray(labeledArgs())); + } else { + console.log.apply(console, _toConsumableArray(labeledArgs())); + } + + break; + + case LogType.log: + if (!debug && loglevel > LogLevel.log) return; + console.log.apply(console, _toConsumableArray(labeledArgs())); + break; + + case LogType.info: + if (!debug && loglevel > LogLevel.info) return; + console.info.apply(console, _toConsumableArray(labeledArgs())); + break; + + case LogType.warn: + if (!debug && loglevel > LogLevel.warn) return; + console.warn.apply(console, _toConsumableArray(labeledArgs())); + break; + + case LogType.error: + if (!debug && loglevel > LogLevel.error) return; + console.error.apply(console, _toConsumableArray(labeledArgs())); + break; + + case LogType.trace: + if (!debug) return; + console.trace(); + break; + + case LogType.groupCollapsed: + if (!debug && loglevel > LogLevel.log) return; + + if (!debug && loglevel > LogLevel.verbose) { + // eslint-disable-next-line node/no-unsupported-features/node-builtins + if (typeof console.groupCollapsed === "function") { + // eslint-disable-next-line node/no-unsupported-features/node-builtins + console.groupCollapsed.apply(console, _toConsumableArray(labeledArgs())); + } else { + console.log.apply(console, _toConsumableArray(labeledArgs())); + } + + break; + } + + // falls through + + case LogType.group: + if (!debug && loglevel > LogLevel.log) return; // eslint-disable-next-line node/no-unsupported-features/node-builtins + + if (typeof console.group === "function") { + // eslint-disable-next-line node/no-unsupported-features/node-builtins + console.group.apply(console, _toConsumableArray(labeledArgs())); + } else { + console.log.apply(console, _toConsumableArray(labeledArgs())); + } + + break; + + case LogType.groupEnd: + if (!debug && loglevel > LogLevel.log) return; // eslint-disable-next-line node/no-unsupported-features/node-builtins + + if (typeof console.groupEnd === "function") { + // eslint-disable-next-line node/no-unsupported-features/node-builtins + console.groupEnd(); + } + + break; + + case LogType.time: + { + if (!debug && loglevel > LogLevel.log) return; + var ms = args[1] * 1000 + args[2] / 1000000; + var msg = "[".concat(name, "] ").concat(args[0], ": ").concat(ms, " ms"); + + if (typeof console.logTime === "function") { + console.logTime(msg); + } else { + console.log(msg); + } + + break; + } + + case LogType.profile: + // eslint-disable-next-line node/no-unsupported-features/node-builtins + if (typeof console.profile === "function") { + // eslint-disable-next-line node/no-unsupported-features/node-builtins + console.profile.apply(console, _toConsumableArray(labeledArgs())); + } + + break; + + case LogType.profileEnd: + // eslint-disable-next-line node/no-unsupported-features/node-builtins + if (typeof console.profileEnd === "function") { + // eslint-disable-next-line node/no-unsupported-features/node-builtins + console.profileEnd.apply(console, _toConsumableArray(labeledArgs())); + } + + break; + + case LogType.clear: + if (!debug && loglevel > LogLevel.log) return; // eslint-disable-next-line node/no-unsupported-features/node-builtins + + if (typeof console.clear === "function") { + // eslint-disable-next-line node/no-unsupported-features/node-builtins + console.clear(); + } + + break; + + case LogType.status: + if (!debug && loglevel > LogLevel.info) return; + + if (typeof console.status === "function") { + if (args.length === 0) { + console.status(); + } else { + console.status.apply(console, _toConsumableArray(labeledArgs())); + } + } else { + if (args.length !== 0) { + console.info.apply(console, _toConsumableArray(labeledArgs())); + } + } + + break; + + default: + throw new Error("Unexpected LogType ".concat(type)); + } + }; + + return logger; +}; + +/***/ }), + +/***/ "./node_modules/webpack/lib/logging/runtime.js": +/*!*****************************************************!*\ + !*** ./node_modules/webpack/lib/logging/runtime.js ***! + \*****************************************************/ +/***/ (function(__unused_webpack_module, exports, __nested_webpack_require_20872__) { + +/* + MIT License http://www.opensource.org/licenses/mit-license.php + Author Tobias Koppers @sokra +*/ + + +function _extends() { + _extends = Object.assign ? Object.assign.bind() : function (target) { + for (var i = 1; i < arguments.length; i++) { + var source = arguments[i]; + + for (var key in source) { + if (Object.prototype.hasOwnProperty.call(source, key)) { + target[key] = source[key]; + } + } + } + + return target; + }; + return _extends.apply(this, arguments); +} + +var SyncBailHook = __nested_webpack_require_20872__(/*! tapable/lib/SyncBailHook */ "./client-src/modules/logger/SyncBailHookFake.js"); + +var _require = __nested_webpack_require_20872__(/*! ./Logger */ "./node_modules/webpack/lib/logging/Logger.js"), + Logger = _require.Logger; + +var createConsoleLogger = __nested_webpack_require_20872__(/*! ./createConsoleLogger */ "./node_modules/webpack/lib/logging/createConsoleLogger.js"); +/** @type {createConsoleLogger.LoggerOptions} */ + + +var currentDefaultLoggerOptions = { + level: "info", + debug: false, + console: console +}; +var currentDefaultLogger = createConsoleLogger(currentDefaultLoggerOptions); +/** + * @param {string} name name of the logger + * @returns {Logger} a logger + */ + +exports.getLogger = function (name) { + return new Logger(function (type, args) { + if (exports.hooks.log.call(name, type, args) === undefined) { + currentDefaultLogger(name, type, args); + } + }, function (childName) { + return exports.getLogger("".concat(name, "/").concat(childName)); + }); +}; +/** + * @param {createConsoleLogger.LoggerOptions} options new options, merge with old options + * @returns {void} + */ + + +exports.configureDefaultLogger = function (options) { + _extends(currentDefaultLoggerOptions, options); + + currentDefaultLogger = createConsoleLogger(currentDefaultLoggerOptions); +}; + +exports.hooks = { + log: new SyncBailHook(["origin", "type", "args"]) +}; + +/***/ }) + +/******/ }); +/************************************************************************/ +/******/ // The module cache +/******/ var __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __nested_webpack_require_23009__(moduleId) { +/******/ // Check if module is in cache +/******/ var cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ __webpack_modules__[moduleId](module, module.exports, __nested_webpack_require_23009__); +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/define property getters */ +/******/ !function() { +/******/ // define getter functions for harmony exports +/******/ __nested_webpack_require_23009__.d = function(exports, definition) { +/******/ for(var key in definition) { +/******/ if(__nested_webpack_require_23009__.o(definition, key) && !__nested_webpack_require_23009__.o(exports, key)) { +/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); +/******/ } +/******/ } +/******/ }; +/******/ }(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ !function() { +/******/ __nested_webpack_require_23009__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); } +/******/ }(); +/******/ +/******/ /* webpack/runtime/make namespace object */ +/******/ !function() { +/******/ // define __esModule on exports +/******/ __nested_webpack_require_23009__.r = function(exports) { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ }(); +/******/ +/************************************************************************/ +var __webpack_exports__ = {}; +// This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk. +!function() { +/*!********************************************!*\ + !*** ./client-src/modules/logger/index.js ***! + \********************************************/ +__nested_webpack_require_23009__.r(__webpack_exports__); +/* harmony export */ __nested_webpack_require_23009__.d(__webpack_exports__, { +/* harmony export */ "default": function() { return /* reexport default export from named module */ webpack_lib_logging_runtime_js__WEBPACK_IMPORTED_MODULE_0__; } +/* harmony export */ }); +/* harmony import */ var webpack_lib_logging_runtime_js__WEBPACK_IMPORTED_MODULE_0__ = __nested_webpack_require_23009__(/*! webpack/lib/logging/runtime.js */ "./node_modules/webpack/lib/logging/runtime.js"); + +}(); +var __webpack_export_target__ = exports; +for(var i in __webpack_exports__) __webpack_export_target__[i] = __webpack_exports__[i]; +if(__webpack_exports__.__esModule) Object.defineProperty(__webpack_export_target__, "__esModule", { value: true }); +/******/ })() +; + +/***/ }), + +/***/ "./node_modules/webpack-dev-server/client/overlay.js": +/*!***********************************************************!*\ + !*** ./node_modules/webpack-dev-server/client/overlay.js ***! + \***********************************************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "formatProblem": function() { return /* binding */ formatProblem; }, +/* harmony export */ "hide": function() { return /* binding */ hide; }, +/* harmony export */ "show": function() { return /* binding */ show; } +/* harmony export */ }); +/* harmony import */ var ansi_html_community__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ansi-html-community */ "./node_modules/ansi-html-community/index.js"); +/* harmony import */ var ansi_html_community__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(ansi_html_community__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var html_entities__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! html-entities */ "./node_modules/html-entities/lib/index.js"); +/* harmony import */ var html_entities__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(html_entities__WEBPACK_IMPORTED_MODULE_1__); +// The error overlay is inspired (and mostly copied) from Create React App (https://github.com/facebookincubator/create-react-app) +// They, in turn, got inspired by webpack-hot-middleware (https://github.com/glenjamin/webpack-hot-middleware). + + +var colors = { + reset: ["transparent", "transparent"], + black: "181818", + red: "E36049", + green: "B3CB74", + yellow: "FFD080", + blue: "7CAFC2", + magenta: "7FACCA", + cyan: "C3C2EF", + lightgrey: "EBE7E3", + darkgrey: "6D7891" +}; +/** @type {HTMLIFrameElement | null | undefined} */ + +var iframeContainerElement; +/** @type {HTMLDivElement | null | undefined} */ + +var containerElement; +/** @type {Array<(element: HTMLDivElement) => void>} */ + +var onLoadQueue = []; +/** @type {TrustedTypePolicy | undefined} */ + +var overlayTrustedTypesPolicy; +ansi_html_community__WEBPACK_IMPORTED_MODULE_0___default().setColors(colors); +/** + * @param {string | null} trustedTypesPolicyName + */ + +function createContainer(trustedTypesPolicyName) { + // Enable Trusted Types if they are available in the current browser. + if (window.trustedTypes) { + overlayTrustedTypesPolicy = window.trustedTypes.createPolicy(trustedTypesPolicyName || "webpack-dev-server#overlay", { + createHTML: function createHTML(value) { + return value; + } + }); + } + + iframeContainerElement = document.createElement("iframe"); + iframeContainerElement.id = "webpack-dev-server-client-overlay"; + iframeContainerElement.src = "about:blank"; + iframeContainerElement.style.position = "fixed"; + iframeContainerElement.style.left = 0; + iframeContainerElement.style.top = 0; + iframeContainerElement.style.right = 0; + iframeContainerElement.style.bottom = 0; + iframeContainerElement.style.width = "100vw"; + iframeContainerElement.style.height = "100vh"; + iframeContainerElement.style.border = "none"; + iframeContainerElement.style.zIndex = 9999999999; + + iframeContainerElement.onload = function () { + containerElement = + /** @type {Document} */ + + /** @type {HTMLIFrameElement} */ + iframeContainerElement.contentDocument.createElement("div"); + containerElement.id = "webpack-dev-server-client-overlay-div"; + containerElement.style.position = "fixed"; + containerElement.style.boxSizing = "border-box"; + containerElement.style.left = 0; + containerElement.style.top = 0; + containerElement.style.right = 0; + containerElement.style.bottom = 0; + containerElement.style.width = "100vw"; + containerElement.style.height = "100vh"; + containerElement.style.backgroundColor = "rgba(0, 0, 0, 0.85)"; + containerElement.style.color = "#E8E8E8"; + containerElement.style.fontFamily = "Menlo, Consolas, monospace"; + containerElement.style.fontSize = "large"; + containerElement.style.padding = "2rem"; + containerElement.style.lineHeight = "1.2"; + containerElement.style.whiteSpace = "pre-wrap"; + containerElement.style.overflow = "auto"; + var headerElement = document.createElement("span"); + headerElement.innerText = "Compiled with problems:"; + var closeButtonElement = document.createElement("button"); + closeButtonElement.innerText = "X"; + closeButtonElement.style.background = "transparent"; + closeButtonElement.style.border = "none"; + closeButtonElement.style.fontSize = "20px"; + closeButtonElement.style.fontWeight = "bold"; + closeButtonElement.style.color = "white"; + closeButtonElement.style.cursor = "pointer"; + closeButtonElement.style.cssFloat = "right"; // @ts-ignore + + closeButtonElement.style.styleFloat = "right"; + closeButtonElement.addEventListener("click", function () { + hide(); + }); + containerElement.appendChild(headerElement); + containerElement.appendChild(closeButtonElement); + containerElement.appendChild(document.createElement("br")); + containerElement.appendChild(document.createElement("br")); + /** @type {Document} */ + + /** @type {HTMLIFrameElement} */ + iframeContainerElement.contentDocument.body.appendChild(containerElement); + onLoadQueue.forEach(function (onLoad) { + onLoad( + /** @type {HTMLDivElement} */ + containerElement); + }); + onLoadQueue = []; + /** @type {HTMLIFrameElement} */ + + iframeContainerElement.onload = null; + }; + + document.body.appendChild(iframeContainerElement); +} +/** + * @param {(element: HTMLDivElement) => void} callback + * @param {string | null} trustedTypesPolicyName + */ + + +function ensureOverlayExists(callback, trustedTypesPolicyName) { + if (containerElement) { + // Everything is ready, call the callback right away. + callback(containerElement); + return; + } + + onLoadQueue.push(callback); + + if (iframeContainerElement) { + return; + } + + createContainer(trustedTypesPolicyName); +} // Successful compilation. + + +function hide() { + if (!iframeContainerElement) { + return; + } // Clean up and reset internal state. + + + document.body.removeChild(iframeContainerElement); + iframeContainerElement = null; + containerElement = null; +} +/** + * @param {string} type + * @param {string | { file?: string, moduleName?: string, loc?: string, message?: string }} item + * @returns {{ header: string, body: string }} + */ + + +function formatProblem(type, item) { + var header = type === "warning" ? "WARNING" : "ERROR"; + var body = ""; + + if (typeof item === "string") { + body += item; + } else { + var file = item.file || ""; // eslint-disable-next-line no-nested-ternary + + var moduleName = item.moduleName ? item.moduleName.indexOf("!") !== -1 ? "".concat(item.moduleName.replace(/^(\s|\S)*!/, ""), " (").concat(item.moduleName, ")") : "".concat(item.moduleName) : ""; + var loc = item.loc; + header += "".concat(moduleName || file ? " in ".concat(moduleName ? "".concat(moduleName).concat(file ? " (".concat(file, ")") : "") : file).concat(loc ? " ".concat(loc) : "") : ""); + body += item.message || ""; + } + + return { + header: header, + body: body + }; +} // Compilation with errors (e.g. syntax error or missing modules). + +/** + * @param {string} type + * @param {Array} messages + * @param {string | null} trustedTypesPolicyName + */ + + +function show(type, messages, trustedTypesPolicyName) { + ensureOverlayExists(function () { + messages.forEach(function (message) { + var entryElement = document.createElement("div"); + var typeElement = document.createElement("span"); + + var _formatProblem = formatProblem(type, message), + header = _formatProblem.header, + body = _formatProblem.body; + + typeElement.innerText = header; + typeElement.style.color = "#".concat(colors.red); // Make it look similar to our terminal. + + var text = ansi_html_community__WEBPACK_IMPORTED_MODULE_0___default()((0,html_entities__WEBPACK_IMPORTED_MODULE_1__.encode)(body)); + var messageTextNode = document.createElement("div"); + messageTextNode.innerHTML = overlayTrustedTypesPolicy ? overlayTrustedTypesPolicy.createHTML(text) : text; + entryElement.appendChild(typeElement); + entryElement.appendChild(document.createElement("br")); + entryElement.appendChild(document.createElement("br")); + entryElement.appendChild(messageTextNode); + entryElement.appendChild(document.createElement("br")); + entryElement.appendChild(document.createElement("br")); + /** @type {HTMLDivElement} */ + + containerElement.appendChild(entryElement); + }); + }, trustedTypesPolicyName); +} + + + +/***/ }), + +/***/ "./node_modules/webpack-dev-server/client/socket.js": +/*!**********************************************************!*\ + !*** ./node_modules/webpack-dev-server/client/socket.js ***! + \**********************************************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "client": function() { return /* binding */ client; } +/* harmony export */ }); +/* harmony import */ var _clients_WebSocketClient_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./clients/WebSocketClient.js */ "./node_modules/webpack-dev-server/client/clients/WebSocketClient.js"); +/* harmony import */ var _utils_log_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils/log.js */ "./node_modules/webpack-dev-server/client/utils/log.js"); +/* provided dependency */ var __webpack_dev_server_client__ = __webpack_require__(/*! ./node_modules/webpack-dev-server/client/clients/WebSocketClient.js */ "./node_modules/webpack-dev-server/client/clients/WebSocketClient.js"); +/* global __webpack_dev_server_client__ */ + + // this WebsocketClient is here as a default fallback, in case the client is not injected + +/* eslint-disable camelcase */ + +var Client = // eslint-disable-next-line no-nested-ternary +typeof __webpack_dev_server_client__ !== "undefined" ? typeof __webpack_dev_server_client__.default !== "undefined" ? __webpack_dev_server_client__.default : __webpack_dev_server_client__ : _clients_WebSocketClient_js__WEBPACK_IMPORTED_MODULE_0__["default"]; +/* eslint-enable camelcase */ + +var retries = 0; +var maxRetries = 10; // Initialized client is exported so external consumers can utilize the same instance +// It is mutable to enforce singleton +// eslint-disable-next-line import/no-mutable-exports + +var client = null; +/** + * @param {string} url + * @param {{ [handler: string]: (data?: any, params?: any) => any }} handlers + * @param {number} [reconnect] + */ + +var socket = function initSocket(url, handlers, reconnect) { + client = new Client(url); + client.onOpen(function () { + retries = 0; + + if (typeof reconnect !== "undefined") { + maxRetries = reconnect; + } + }); + client.onClose(function () { + if (retries === 0) { + handlers.close(); + } // Try to reconnect. + + + client = null; // After 10 retries stop trying, to prevent logspam. + + if (retries < maxRetries) { + // Exponentially increase timeout to reconnect. + // Respectfully copied from the package `got`. + // eslint-disable-next-line no-restricted-properties + var retryInMs = 1000 * Math.pow(2, retries) + Math.random() * 100; + retries += 1; + _utils_log_js__WEBPACK_IMPORTED_MODULE_1__.log.info("Trying to reconnect..."); + setTimeout(function () { + socket(url, handlers, reconnect); + }, retryInMs); + } + }); + client.onMessage( + /** + * @param {any} data + */ + function (data) { + var message = JSON.parse(data); + + if (handlers[message.type]) { + handlers[message.type](message.data, message.params); + } + }); +}; + +/* harmony default export */ __webpack_exports__["default"] = (socket); + +/***/ }), + +/***/ "./node_modules/webpack-dev-server/client/utils/createSocketURL.js": +/*!*************************************************************************!*\ + !*** ./node_modules/webpack-dev-server/client/utils/createSocketURL.js ***! + \*************************************************************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/** + * @param {{ protocol?: string, auth?: string, hostname?: string, port?: string, pathname?: string, search?: string, hash?: string, slashes?: boolean }} objURL + * @returns {string} + */ +function format(objURL) { + var protocol = objURL.protocol || ""; + + if (protocol && protocol.substr(-1) !== ":") { + protocol += ":"; + } + + var auth = objURL.auth || ""; + + if (auth) { + auth = encodeURIComponent(auth); + auth = auth.replace(/%3A/i, ":"); + auth += "@"; + } + + var host = ""; + + if (objURL.hostname) { + host = auth + (objURL.hostname.indexOf(":") === -1 ? objURL.hostname : "[".concat(objURL.hostname, "]")); + + if (objURL.port) { + host += ":".concat(objURL.port); + } + } + + var pathname = objURL.pathname || ""; + + if (objURL.slashes) { + host = "//".concat(host || ""); + + if (pathname && pathname.charAt(0) !== "/") { + pathname = "/".concat(pathname); + } + } else if (!host) { + host = ""; + } + + var search = objURL.search || ""; + + if (search && search.charAt(0) !== "?") { + search = "?".concat(search); + } + + var hash = objURL.hash || ""; + + if (hash && hash.charAt(0) !== "#") { + hash = "#".concat(hash); + } + + pathname = pathname.replace(/[?#]/g, + /** + * @param {string} match + * @returns {string} + */ + function (match) { + return encodeURIComponent(match); + }); + search = search.replace("#", "%23"); + return "".concat(protocol).concat(host).concat(pathname).concat(search).concat(hash); +} +/** + * @param {URL & { fromCurrentScript?: boolean }} parsedURL + * @returns {string} + */ + + +function createSocketURL(parsedURL) { + var hostname = parsedURL.hostname; // Node.js module parses it as `::` + // `new URL(urlString, [baseURLString])` parses it as '[::]' + + var isInAddrAny = hostname === "0.0.0.0" || hostname === "::" || hostname === "[::]"; // why do we need this check? + // hostname n/a for file protocol (example, when using electron, ionic) + // see: https://github.com/webpack/webpack-dev-server/pull/384 + + if (isInAddrAny && self.location.hostname && self.location.protocol.indexOf("http") === 0) { + hostname = self.location.hostname; + } + + var socketURLProtocol = parsedURL.protocol || self.location.protocol; // When https is used in the app, secure web sockets are always necessary because the browser doesn't accept non-secure web sockets. + + if (socketURLProtocol === "auto:" || hostname && isInAddrAny && self.location.protocol === "https:") { + socketURLProtocol = self.location.protocol; + } + + socketURLProtocol = socketURLProtocol.replace(/^(?:http|.+-extension|file)/i, "ws"); + var socketURLAuth = ""; // `new URL(urlString, [baseURLstring])` doesn't have `auth` property + // Parse authentication credentials in case we need them + + if (parsedURL.username) { + socketURLAuth = parsedURL.username; // Since HTTP basic authentication does not allow empty username, + // we only include password if the username is not empty. + + if (parsedURL.password) { + // Result: : + socketURLAuth = socketURLAuth.concat(":", parsedURL.password); + } + } // In case the host is a raw IPv6 address, it can be enclosed in + // the brackets as the brackets are needed in the final URL string. + // Need to remove those as url.format blindly adds its own set of brackets + // if the host string contains colons. That would lead to non-working + // double brackets (e.g. [[::]]) host + // + // All of these web socket url params are optionally passed in through resourceQuery, + // so we need to fall back to the default if they are not provided + + + var socketURLHostname = (hostname || self.location.hostname || "localhost").replace(/^\[(.*)\]$/, "$1"); + var socketURLPort = parsedURL.port; + + if (!socketURLPort || socketURLPort === "0") { + socketURLPort = self.location.port; + } // If path is provided it'll be passed in via the resourceQuery as a + // query param so it has to be parsed out of the querystring in order for the + // client to open the socket to the correct location. + + + var socketURLPathname = "/ws"; + + if (parsedURL.pathname && !parsedURL.fromCurrentScript) { + socketURLPathname = parsedURL.pathname; + } + + return format({ + protocol: socketURLProtocol, + auth: socketURLAuth, + hostname: socketURLHostname, + port: socketURLPort, + pathname: socketURLPathname, + slashes: true + }); +} + +/* harmony default export */ __webpack_exports__["default"] = (createSocketURL); + +/***/ }), + +/***/ "./node_modules/webpack-dev-server/client/utils/getCurrentScriptSource.js": +/*!********************************************************************************!*\ + !*** ./node_modules/webpack-dev-server/client/utils/getCurrentScriptSource.js ***! + \********************************************************************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/** + * @returns {string} + */ +function getCurrentScriptSource() { + // `document.currentScript` is the most accurate way to find the current script, + // but is not supported in all browsers. + if (document.currentScript) { + return document.currentScript.getAttribute("src"); + } // Fallback to getting all scripts running in the document. + + + var scriptElements = document.scripts || []; + var scriptElementsWithSrc = Array.prototype.filter.call(scriptElements, function (element) { + return element.getAttribute("src"); + }); + + if (scriptElementsWithSrc.length > 0) { + var currentScript = scriptElementsWithSrc[scriptElementsWithSrc.length - 1]; + return currentScript.getAttribute("src"); + } // Fail as there was no script to use. + + + throw new Error("[webpack-dev-server] Failed to get current script source."); +} + +/* harmony default export */ __webpack_exports__["default"] = (getCurrentScriptSource); + +/***/ }), + +/***/ "./node_modules/webpack-dev-server/client/utils/log.js": +/*!*************************************************************!*\ + !*** ./node_modules/webpack-dev-server/client/utils/log.js ***! + \*************************************************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "log": function() { return /* binding */ log; }, +/* harmony export */ "setLogLevel": function() { return /* binding */ setLogLevel; } +/* harmony export */ }); +/* harmony import */ var _modules_logger_index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/logger/index.js */ "./node_modules/webpack-dev-server/client/modules/logger/index.js"); +/* harmony import */ var _modules_logger_index_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_modules_logger_index_js__WEBPACK_IMPORTED_MODULE_0__); + +var name = "webpack-dev-server"; // default level is set on the client side, so it does not need +// to be set by the CLI or API + +var defaultLevel = "info"; // options new options, merge with old options + +/** + * @param {false | true | "none" | "error" | "warn" | "info" | "log" | "verbose"} level + * @returns {void} + */ + +function setLogLevel(level) { + _modules_logger_index_js__WEBPACK_IMPORTED_MODULE_0___default().configureDefaultLogger({ + level: level + }); +} + +setLogLevel(defaultLevel); +var log = _modules_logger_index_js__WEBPACK_IMPORTED_MODULE_0___default().getLogger(name); + + +/***/ }), + +/***/ "./node_modules/webpack-dev-server/client/utils/parseURL.js": +/*!******************************************************************!*\ + !*** ./node_modules/webpack-dev-server/client/utils/parseURL.js ***! + \******************************************************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _getCurrentScriptSource_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getCurrentScriptSource.js */ "./node_modules/webpack-dev-server/client/utils/getCurrentScriptSource.js"); + +/** + * @param {string} resourceQuery + * @returns {{ [key: string]: string | boolean }} + */ + +function parseURL(resourceQuery) { + /** @type {{ [key: string]: string }} */ + var options = {}; + + if (typeof resourceQuery === "string" && resourceQuery !== "") { + var searchParams = resourceQuery.slice(1).split("&"); + + for (var i = 0; i < searchParams.length; i++) { + var pair = searchParams[i].split("="); + options[pair[0]] = decodeURIComponent(pair[1]); + } + } else { + // Else, get the url from the
- -
+
diff --git a/examples/js/archive.js b/examples/js/archive.js index abe55d22c..e21557ef0 100644 --- a/examples/js/archive.js +++ b/examples/js/archive.js @@ -10,8 +10,8 @@ const input = document.getElementById('input'); const responseText = document.getElementById('response'); const imageContainer = document.getElementById('imgContainer'); const mapToggle = document.getElementById('mapToggle'); -const imageOverlaytooltip = document.getElementById('imageOverlaytooltip'); -const tooltipText = document.getElementById('tooltiptext'); +// const imageOverlaytooltip = document.getElementById('imageOverlaytooltip'); +// const tooltipText = document.getElementById('tooltiptext'); const setupMap = () => { @@ -144,27 +144,27 @@ document.addEventListener('click', (event) => { // --------------------------------------------------------------------------------------------- // OPTION 2.1 - To run this option, uncomment OPTION 1 above too as well -document.addEventListener('mousemove', (event) => { - if (event.target.classList.contains('leaflet-image-layer')) { - if (!image.isSelected()) { - const xPos = event.layerX; - const yPos = event.layerY; - - tooltipText.textContent = imageOverlaytooltipText; - imageOverlaytooltip.style.position = 'absolute'; - imageOverlaytooltip.style.left = (xPos - 60) +'px'; - imageOverlaytooltip.style.top = (yPos - 40) +'px'; - imageOverlaytooltip.hidden = false; - } - - if (image.isSelected()) { - imageOverlaytooltip.hidden = true; - } - } -}); - -document.addEventListener('mouseout', (event) => { - if (event.target.classList.contains('leaflet-image-layer')) { - imageOverlaytooltip.hidden = true; - } -}); +// document.addEventListener('mousemove', (event) => { +// if (event.target.classList.contains('leaflet-image-layer')) { +// if (!image.isSelected()) { +// const xPos = event.layerX; +// const yPos = event.layerY; + +// tooltipText.textContent = imageOverlaytooltipText; +// imageOverlaytooltip.style.position = 'absolute'; +// imageOverlaytooltip.style.left = (xPos - 60) +'px'; +// imageOverlaytooltip.style.top = (yPos - 40) +'px'; +// imageOverlaytooltip.hidden = false; +// } + +// if (image.isSelected()) { +// imageOverlaytooltip.hidden = true; +// } +// } +// }); + +// document.addEventListener('mouseout', (event) => { +// if (event.target.classList.contains('leaflet-image-layer')) { +// imageOverlaytooltip.hidden = true; +// } +// }); diff --git a/examples/select.html b/examples/select.html index 888cde8b8..3a6e2196d 100644 --- a/examples/select.html +++ b/examples/select.html @@ -20,7 +20,6 @@
-
diff --git a/src/DistortableImageOverlay.js b/src/DistortableImageOverlay.js index c5cd4a4eb..9b012085f 100644 --- a/src/DistortableImageOverlay.js +++ b/src/DistortableImageOverlay.js @@ -91,9 +91,9 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ this.fire('add'); // SEGUN ------------------------------------------------------------------------------------------------------------------------------ - // L.DomEvent.on(this.getElement(), 'mouseover mousemove', this._activateTooltip, this); + L.DomEvent.on(this.getElement(), 'mouseover mousemove', this._activateTooltip, this); - // L.DomEvent.on(this.getElement(), 'mouseout', this._closeTooltip, this); + L.DomEvent.on(this.getElement(), 'mouseout', this._closeTooltip, this); }, onRemove(map) { @@ -245,39 +245,28 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ }, // SEGUN ------------------------------------------------------------------------------------------------------------------------------- - // Work in progress on this function _activateTooltip(ev) { - let index = 0; - const xAxis = []; // stores previous values of x coordinate - const yAxis = []; // stores previous values of y coordinate, may be needed later + // let index = 0; + // const xAxis = []; // stores previous values of x coordinate + // const yAxis = []; // stores previous values of y coordinate, may be needed later // let newPosX = 0; - if (!this._selected) { // Consider using "if (!this.selected)" instead - // console.log('mouseOVER_DONE/mouseMOVE_DONE-TOOLTIP-ACTIVATED'); // To be deleted - // console.log('x-axis:', ev.x); // To be deleted - // console.log('y-axis:', ev.y); // To be deleted + if (!this._selected) { + // xAxis[index] = ev.x; + // yAxis[index] = ev.y; // May be needed later + // ++index; - xAxis[index] = ev.x; - yAxis[index] = ev.y; // May be needed later - - // newPosX = xAxis[index-1] - xAxis[index]; // - works but not perfect - // newPosX = (xAxis[index-1] - xAxis[index]) - ((xAxis[index])/4); // - better than above but not perfect - // newPosX =(xAxis[index-1] - xAxis[index]) - (xAxis[index] - this.imageWidth); // - works but no perfect - ++index; - - this.bindTooltip( - this.tooltipText, - {sticky: true, direction: 'top', offset: L.point([ev.x - 700, ev.y - 500])}).openTooltip(); // POC only, work still in progress on this - hardcoded, works not perfect yet + this.bindTooltip(this.tooltipText, {direction: 'top'}).openTooltip(); + // {sticky: true, direction: 'top', offset: L.point([ev.x - xAxis[index-1], ev.y])}).openTooltip(); - cursor consistently in same X-axis for each y-axis position + // {sticky: true, direction: 'top', offset: L.point([ev.x - 700, ev.y - 500])}).openTooltip(); } }, _closeTooltip() { - // console.log('mouseOUT_DONE-TOOLTIP-CLOSED'); // To be deleted this.closeTooltip(); }, _deactivateTooltip() { - // console.log('MouseoverENDED & mousemoveENDED-TOOLTIP-DEACTIVATED'); - To be deleted this.unbindTooltip(); }, // ENDS ------------------------------------------------------------------------------------------------------------------------------ From 413267e097aa46f9d3cb9a3755acdb26950a17d5 Mon Sep 17 00:00:00 2001 From: segun Date: Fri, 6 Jan 2023 23:30:14 +0100 Subject: [PATCH 31/57] quick update --- dist/leaflet.distortableimage.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/leaflet.distortableimage.js b/dist/leaflet.distortableimage.js index e56219cae..84c3fce6f 100644 --- a/dist/leaflet.distortableimage.js +++ b/dist/leaflet.distortableimage.js @@ -7302,7 +7302,7 @@ module.exports.formatError = function (err) { /******/ /******/ /* webpack/runtime/getFullHash */ /******/ !function() { -/******/ __webpack_require__.h = function() { return "a5289b9128fad5053cbd"; } +/******/ __webpack_require__.h = function() { return "81d46b266f3645c3d530"; } /******/ }(); /******/ /******/ /* webpack/runtime/hasOwnProperty shorthand */ From 4d7663a029906aacc3d23447d1c1ed36e93d5c5e Mon Sep 17 00:00:00 2001 From: segun Date: Sat, 7 Jan 2023 21:17:48 +0100 Subject: [PATCH 32/57] update --- dist/leaflet.distortableimage.js | 4 +++- src/DistortableImageOverlay.js | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/dist/leaflet.distortableimage.js b/dist/leaflet.distortableimage.js index 84c3fce6f..c6fb3caad 100644 --- a/dist/leaflet.distortableimage.js +++ b/dist/leaflet.distortableimage.js @@ -717,6 +717,8 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ // const xAxis = []; // stores previous values of x coordinate // const yAxis = []; // stores previous values of y coordinate, may be needed later // let newPosX = 0; + console.log('ev.x: ', ev.x, 'ev.y: ', ev.y); + if (!this._selected) { // xAxis[index] = ev.x; // yAxis[index] = ev.y; // May be needed later @@ -7302,7 +7304,7 @@ module.exports.formatError = function (err) { /******/ /******/ /* webpack/runtime/getFullHash */ /******/ !function() { -/******/ __webpack_require__.h = function() { return "81d46b266f3645c3d530"; } +/******/ __webpack_require__.h = function() { return "847ac218345fd6ca06a2"; } /******/ }(); /******/ /******/ /* webpack/runtime/hasOwnProperty shorthand */ diff --git a/src/DistortableImageOverlay.js b/src/DistortableImageOverlay.js index 9b012085f..25b431560 100644 --- a/src/DistortableImageOverlay.js +++ b/src/DistortableImageOverlay.js @@ -250,7 +250,7 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ // const xAxis = []; // stores previous values of x coordinate // const yAxis = []; // stores previous values of y coordinate, may be needed later // let newPosX = 0; - + console.log('ev.x: ', ev.x, 'ev.y: ', ev.y); if (!this._selected) { // xAxis[index] = ev.x; // yAxis[index] = ev.y; // May be needed later From 20dd15366b1f4a5270981c726997cfaaf1b3139d Mon Sep 17 00:00:00 2001 From: segun Date: Mon, 9 Jan 2023 20:00:47 +0100 Subject: [PATCH 33/57] switchable tooltip feature --- dist/leaflet.distortableimage.js | 76 +++++++++++++++++++------------- examples/archive.html | 5 ++- examples/js/archive.js | 41 +++-------------- src/DistortableCollection.js | 37 +++++++++++++++- src/DistortableImageOverlay.js | 35 +++------------ 5 files changed, 96 insertions(+), 98 deletions(-) diff --git a/dist/leaflet.distortableimage.js b/dist/leaflet.distortableimage.js index c6fb3caad..3e1155807 100644 --- a/dist/leaflet.distortableimage.js +++ b/dist/leaflet.distortableimage.js @@ -209,6 +209,8 @@ L.DistortableCollection = L.FeatureGroup.extend({ L.FeatureGroup.prototype.initialize.call(this, options); L.Utils.initTranslation.call(this); this.editable = this.options.editable; + this.tooltipControl = options.tooltipControl; + console.log('optionTest: tested'); // - delete }, onAdd: function onAdd(map) { L.FeatureGroup.prototype.onAdd.call(this, map); @@ -225,6 +227,27 @@ L.DistortableCollection = L.FeatureGroup.extend({ this.on('layeradd', this._addEvents, this); this.on('layerremove', this._removeEvents, this); + L.DomEvent.on(this.tooltipControl, 'click', this._updateTooltipBtn, this); + }, + _updateTooltipBtn: function _updateTooltipBtn(e) { + if (e.target.textContent === 'Open Tooltip') { + e.target.textContent = 'Close Tooltip'; + this.eachLayer(function (layer) { + L.DomEvent.on(layer.getElement(), 'mousemove', layer.activateTooltip, layer); + L.DomEvent.on(layer.getElement(), 'mouseout', layer.closeToolTip, layer); + e.target.textContent = 'Close Tooltip'; + }); + return; + } + + if (e.target.textContent === 'Close Tooltip') { + e.target.textContent = 'Open Tooltip'; + this.eachLayer(function (layer) { + L.DomEvent.off(layer.getElement(), 'mouseout'); + L.DomEvent.off(layer.getElement(), 'mousemove'); + }); + return; + } }, onRemove: function onRemove() { if (this.editing) { @@ -233,6 +256,15 @@ L.DistortableCollection = L.FeatureGroup.extend({ this.off('layeradd', this._addEvents, this); this.off('layerremove', this._removeEvents, this); + + if (e.target.textContent === 'Close Tooltip') { + e.target.textContent = 'Open Tooltip'; + this.eachLayer(function (layer) { + L.DomEvent.off(layer.getElement(), 'mouseout'); + L.DomEvent.off(layer.getElement(), 'mousemove'); + }); + return; + } }, _addEvents: function _addEvents(e) { var layer = e.layer; @@ -465,11 +497,10 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ editable: true, mode: 'distort', selected: false, - // SEGUN ------------------------------------------------------------------------------------------------------------------------------ interactive: true, - tooltipText: 'Unknow image' // default tooltipText - // SEGUN ------------------------------------------------------------------------------------------------------------------------------ - + tooltipText: 'Unknow image', + // default tooltipText + tooltipOpen: false }, initialize: function initialize(url, options) { L.setOptions(this, options); @@ -478,10 +509,10 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ this.editable = this.options.editable; this._selected = this.options.selected; this._url = url; - this.rotation = {}; // SEGUN ------------------------------------------------------------------------------------------------------------------------------ - + this.rotation = {}; this.interactive = this.options.interactive; - this.tooltipText = options.tooltipText; // SEGUN ------------------------------------------------------------------------------------------------------------------------------ + this.tooltipText = options.tooltipText; + this.tooltipOpen = false; }, onAdd: function onAdd(map) { var _this = this; @@ -562,10 +593,7 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ L.DomEvent.on(map, 'click', this.deselect, this); } - this.fire('add'); // SEGUN ------------------------------------------------------------------------------------------------------------------------------ - - L.DomEvent.on(this.getElement(), 'mouseover mousemove', this._activateTooltip, this); - L.DomEvent.on(this.getElement(), 'mouseout', this._closeTooltip, this); + this.fire('add'); }, onRemove: function onRemove(map) { L.DomEvent.off(this.getElement(), 'click', this.select, this); @@ -581,9 +609,7 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ } this.fire('remove'); - L.ImageOverlay.prototype.onRemove.call(this, map); // SEGUN ----------------------------------------------------------------------------------------------------------------------------- - - L.DomEvent.off(this.getElement(), 'mouseover', this._deactivateTooltip, this); // ENDS ------------------------------------------------------------------------------------------------------------------------------ + L.ImageOverlay.prototype.onRemove.call(this, map); }, _initImageDimensions: function _initImageDimensions() { var map = this._map; @@ -711,31 +737,19 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ return exceedsTop || exceedsBottom; } }, - // SEGUN ------------------------------------------------------------------------------------------------------------------------------- - _activateTooltip: function _activateTooltip(ev) { - // let index = 0; - // const xAxis = []; // stores previous values of x coordinate - // const yAxis = []; // stores previous values of y coordinate, may be needed later - // let newPosX = 0; - console.log('ev.x: ', ev.x, 'ev.y: ', ev.y); - + activateTooltip: function activateTooltip() { if (!this._selected) { - // xAxis[index] = ev.x; - // yAxis[index] = ev.y; // May be needed later - // ++index; this.bindTooltip(this.tooltipText, { direction: 'top' - }).openTooltip(); // {sticky: true, direction: 'top', offset: L.point([ev.x - xAxis[index-1], ev.y])}).openTooltip(); - cursor consistently in same X-axis for each y-axis position - // {sticky: true, direction: 'top', offset: L.point([ev.x - 700, ev.y - 500])}).openTooltip(); + }).openTooltip(); } }, - _closeTooltip: function _closeTooltip() { + closeToolTip: function closeToolTip() { this.closeTooltip(); }, - _deactivateTooltip: function _deactivateTooltip() { + deactivateTooltip: function deactivateTooltip() { this.unbindTooltip(); }, - // ENDS ------------------------------------------------------------------------------------------------------------------------------ setCorners: function setCorners(latlngObj) { var map = this._map; var zoom = map.getZoom(); @@ -7304,7 +7318,7 @@ module.exports.formatError = function (err) { /******/ /******/ /* webpack/runtime/getFullHash */ /******/ !function() { -/******/ __webpack_require__.h = function() { return "847ac218345fd6ca06a2"; } +/******/ __webpack_require__.h = function() { return "1e41307615290d67d4e5"; } /******/ }(); /******/ /******/ /* webpack/runtime/hasOwnProperty shorthand */ diff --git a/examples/archive.html b/examples/archive.html index 3d839ba83..370bc57dd 100644 --- a/examples/archive.html +++ b/examples/archive.html @@ -67,8 +67,9 @@

Images

- - + + +

diff --git a/examples/js/archive.js b/examples/js/archive.js index e21557ef0..1b365852d 100644 --- a/examples/js/archive.js +++ b/examples/js/archive.js @@ -10,9 +10,7 @@ const input = document.getElementById('input'); const responseText = document.getElementById('response'); const imageContainer = document.getElementById('imgContainer'); const mapToggle = document.getElementById('mapToggle'); -// const imageOverlaytooltip = document.getElementById('imageOverlaytooltip'); -// const tooltipText = document.getElementById('tooltiptext'); - +const switchTooltipBtn = document.getElementById('switchTooltipBtn'); const setupMap = () => { map = L.map('map').setView([51.505, -0.09], 13); @@ -26,7 +24,9 @@ const setupMap = () => { }; const setupCollection = () => { - map.imgGroup = L.distortableCollection().addTo(map); + map.imgGroup = L.distortableCollection( + {tooltipControl: switchTooltipBtn} + ).addTo(map); }; setupMap(); @@ -96,7 +96,7 @@ function showImages(getUrl) { if (response.data.files && response.data.files.length != 0) { response.data.files.forEach((file) => { renderImages(file, url); - imageOverlaytooltipText = response.data.metadata.description; // <= SEGUN + imageOverlaytooltipText = response.data.metadata.description; }); responseText.innerHTML = imageCount ? `${imageCount} image(s) fetched successfully from ${fetchedFrom.innerHTML}.` : 'No images found in the link provided...'; } else { @@ -128,13 +128,10 @@ tileMap.addEventListener('click', (event) => { bootstrap.Offcanvas.getInstance(sidebar).hide(); }); -// --------------------------------------------------------------------------------------------- -// OPTION 1 - Runs independently of OPTION 2 document.addEventListener('click', (event) => { if (event.target.classList.contains('place-button')) { const imageURL = event.target.previousElementSibling.src; - // const image = L.distortableImageOverlay( - image = L.distortableImageOverlay( // <= SEGUN + image = L.distortableImageOverlay( imageURL, {tooltipText: imageOverlaytooltipText} ); @@ -142,29 +139,3 @@ document.addEventListener('click', (event) => { } }); -// --------------------------------------------------------------------------------------------- -// OPTION 2.1 - To run this option, uncomment OPTION 1 above too as well -// document.addEventListener('mousemove', (event) => { -// if (event.target.classList.contains('leaflet-image-layer')) { -// if (!image.isSelected()) { -// const xPos = event.layerX; -// const yPos = event.layerY; - -// tooltipText.textContent = imageOverlaytooltipText; -// imageOverlaytooltip.style.position = 'absolute'; -// imageOverlaytooltip.style.left = (xPos - 60) +'px'; -// imageOverlaytooltip.style.top = (yPos - 40) +'px'; -// imageOverlaytooltip.hidden = false; -// } - -// if (image.isSelected()) { -// imageOverlaytooltip.hidden = true; -// } -// } -// }); - -// document.addEventListener('mouseout', (event) => { -// if (event.target.classList.contains('leaflet-image-layer')) { -// imageOverlaytooltip.hidden = true; -// } -// }); diff --git a/src/DistortableCollection.js b/src/DistortableCollection.js index 75d43026b..7808fb850 100644 --- a/src/DistortableCollection.js +++ b/src/DistortableCollection.js @@ -15,6 +15,8 @@ L.DistortableCollection = L.FeatureGroup.extend({ L.Utils.initTranslation.call(this); this.editable = this.options.editable; + this.tooltipControl = options.tooltipControl; + console.log('optionTest: tested'); // - delete }, onAdd(map) { @@ -30,13 +32,46 @@ L.DistortableCollection = L.FeatureGroup.extend({ */ this.on('layeradd', this._addEvents, this); this.on('layerremove', this._removeEvents, this); + L.DomEvent.on(this.tooltipControl, 'click', this._updateTooltipBtn, this); + }, + + _updateTooltipBtn(e) { + if (e.target.textContent === 'Open Tooltip') { + e.target.textContent = 'Close Tooltip'; + this.eachLayer((layer) => { + L.DomEvent.on(layer.getElement(), 'mousemove', layer.activateTooltip, layer); + L.DomEvent.on(layer.getElement(), 'mouseout', layer.closeToolTip, layer); + e.target.textContent = 'Close Tooltip'; + }); + + return; + } + + if (e.target.textContent === 'Close Tooltip') { + e.target.textContent = 'Open Tooltip'; + this.eachLayer((layer) => { + L.DomEvent.off(layer.getElement(), 'mouseout'); + L.DomEvent.off(layer.getElement(), 'mousemove'); + }); + + return; + } }, onRemove() { if (this.editing) { this.editing.disable(); } - this.off('layeradd', this._addEvents, this); this.off('layerremove', this._removeEvents, this); + + if (e.target.textContent === 'Close Tooltip') { + e.target.textContent = 'Open Tooltip'; + this.eachLayer((layer) => { + L.DomEvent.off(layer.getElement(), 'mouseout'); + L.DomEvent.off(layer.getElement(), 'mousemove'); + }); + + return; + } }, _addEvents(e) { diff --git a/src/DistortableImageOverlay.js b/src/DistortableImageOverlay.js index 25b431560..7d7281467 100644 --- a/src/DistortableImageOverlay.js +++ b/src/DistortableImageOverlay.js @@ -8,10 +8,9 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ editable: true, mode: 'distort', selected: false, - // SEGUN ------------------------------------------------------------------------------------------------------------------------------ interactive: true, tooltipText: 'Unknow image', // default tooltipText - // SEGUN ------------------------------------------------------------------------------------------------------------------------------ + tooltipOpen: false, }, initialize(url, options) { @@ -23,10 +22,10 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ this._selected = this.options.selected; this._url = url; this.rotation = {}; - // SEGUN ------------------------------------------------------------------------------------------------------------------------------ + this.interactive = this.options.interactive; this.tooltipText = options.tooltipText; - // SEGUN ------------------------------------------------------------------------------------------------------------------------------ + this.tooltipOpen = false; }, onAdd(map) { @@ -89,11 +88,6 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ } this.fire('add'); - - // SEGUN ------------------------------------------------------------------------------------------------------------------------------ - L.DomEvent.on(this.getElement(), 'mouseover mousemove', this._activateTooltip, this); - - L.DomEvent.on(this.getElement(), 'mouseout', this._closeTooltip, this); }, onRemove(map) { @@ -109,10 +103,6 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ this.fire('remove'); L.ImageOverlay.prototype.onRemove.call(this, map); - - // SEGUN ----------------------------------------------------------------------------------------------------------------------------- - L.DomEvent.off(this.getElement(), 'mouseover', this._deactivateTooltip, this); - // ENDS ------------------------------------------------------------------------------------------------------------------------------ }, _initImageDimensions() { @@ -244,32 +234,19 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ } }, - // SEGUN ------------------------------------------------------------------------------------------------------------------------------- - _activateTooltip(ev) { - // let index = 0; - // const xAxis = []; // stores previous values of x coordinate - // const yAxis = []; // stores previous values of y coordinate, may be needed later - // let newPosX = 0; - console.log('ev.x: ', ev.x, 'ev.y: ', ev.y); + activateTooltip() { if (!this._selected) { - // xAxis[index] = ev.x; - // yAxis[index] = ev.y; // May be needed later - // ++index; - this.bindTooltip(this.tooltipText, {direction: 'top'}).openTooltip(); - // {sticky: true, direction: 'top', offset: L.point([ev.x - xAxis[index-1], ev.y])}).openTooltip(); - cursor consistently in same X-axis for each y-axis position - // {sticky: true, direction: 'top', offset: L.point([ev.x - 700, ev.y - 500])}).openTooltip(); } }, - _closeTooltip() { + closeToolTip() { this.closeTooltip(); }, - _deactivateTooltip() { + deactivateTooltip() { this.unbindTooltip(); }, - // ENDS ------------------------------------------------------------------------------------------------------------------------------ setCorners(latlngObj) { const map = this._map; From c5de57f2f5c3cae6b4d15c03243139636ec15a68 Mon Sep 17 00:00:00 2001 From: segun Date: Mon, 9 Jan 2023 20:34:48 +0100 Subject: [PATCH 34/57] update --- dist/leaflet.distortableimage.js | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/dist/leaflet.distortableimage.js b/dist/leaflet.distortableimage.js index a0ebf47b9..987221e63 100644 --- a/dist/leaflet.distortableimage.js +++ b/dist/leaflet.distortableimage.js @@ -7318,12 +7318,7 @@ module.exports.formatError = function (err) { /******/ /******/ /* webpack/runtime/getFullHash */ /******/ !function() { -<<<<<<< HEAD -/******/ __webpack_require__.h = function() { return "1e41307615290d67d4e5"; } -======= -/******/ __webpack_require__.h = function() { return "81d46b266f3645c3d530"; } -/******/ __webpack_require__.h = function() { return "d06aea7ce8d056523b19"; } ->>>>>>> 75165028ec3da846cf156df80def375219951069 +/******/ __webpack_require__.h = function() { return "f4bb84ad97d91af87325"; } /******/ }(); /******/ /******/ /* webpack/runtime/hasOwnProperty shorthand */ From ef2fb6ea54c96e3bd6fd46ea62aca8360f4b9f98 Mon Sep 17 00:00:00 2001 From: segun Date: Thu, 12 Jan 2023 12:31:28 +0100 Subject: [PATCH 35/57] updated and cleared failed test issue --- dist/leaflet.distortableimage.js | 8353 +----------------------------- examples/js/export.js | 2 - examples/js/index.js | 1 - examples/js/listeners.js | 1 - examples/js/local.js | 1 - examples/js/select.js | 4 - src/DistortableCollection.js | 4 +- src/DistortableImageOverlay.js | 2 +- 8 files changed, 4 insertions(+), 8364 deletions(-) diff --git a/dist/leaflet.distortableimage.js b/dist/leaflet.distortableimage.js index 3e1155807..9104f0c6d 100644 --- a/dist/leaflet.distortableimage.js +++ b/dist/leaflet.distortableimage.js @@ -1,8353 +1,2 @@ -/******/ (function() { // webpackBootstrap -/******/ var __webpack_modules__ = ({ - -/***/ "./node_modules/ansi-html-community/index.js": -/*!***************************************************!*\ - !*** ./node_modules/ansi-html-community/index.js ***! - \***************************************************/ -/***/ (function(module) { - -"use strict"; - - -module.exports = ansiHTML - -// Reference to https://github.com/sindresorhus/ansi-regex -var _regANSI = /(?:(?:\u001b\[)|\u009b)(?:(?:[0-9]{1,3})?(?:(?:;[0-9]{0,3})*)?[A-M|f-m])|\u001b[A-M]/ - -var _defColors = { - reset: ['fff', '000'], // [FOREGROUD_COLOR, BACKGROUND_COLOR] - black: '000', - red: 'ff0000', - green: '209805', - yellow: 'e8bf03', - blue: '0000ff', - magenta: 'ff00ff', - cyan: '00ffee', - lightgrey: 'f0f0f0', - darkgrey: '888' -} -var _styles = { - 30: 'black', - 31: 'red', - 32: 'green', - 33: 'yellow', - 34: 'blue', - 35: 'magenta', - 36: 'cyan', - 37: 'lightgrey' -} -var _openTags = { - '1': 'font-weight:bold', // bold - '2': 'opacity:0.5', // dim - '3': '', // italic - '4': '', // underscore - '8': 'display:none', // hidden - '9': '' // delete -} -var _closeTags = { - '23': '', // reset italic - '24': '', // reset underscore - '29': '' // reset delete -} - -;[0, 21, 22, 27, 28, 39, 49].forEach(function (n) { - _closeTags[n] = '' -}) - -/** - * Converts text with ANSI color codes to HTML markup. - * @param {String} text - * @returns {*} - */ -function ansiHTML (text) { - // Returns the text if the string has no ANSI escape code. - if (!_regANSI.test(text)) { - return text - } - - // Cache opened sequence. - var ansiCodes = [] - // Replace with markup. - var ret = text.replace(/\033\[(\d+)m/g, function (match, seq) { - var ot = _openTags[seq] - if (ot) { - // If current sequence has been opened, close it. - if (!!~ansiCodes.indexOf(seq)) { // eslint-disable-line no-extra-boolean-cast - ansiCodes.pop() - return '' - } - // Open tag. - ansiCodes.push(seq) - return ot[0] === '<' ? ot : '' - } - - var ct = _closeTags[seq] - if (ct) { - // Pop sequence - ansiCodes.pop() - return ct - } - return '' - }) - - // Make sure tags are closed. - var l = ansiCodes.length - ;(l > 0) && (ret += Array(l + 1).join('')) - - return ret -} - -/** - * Customize colors. - * @param {Object} colors reference to _defColors - */ -ansiHTML.setColors = function (colors) { - if (typeof colors !== 'object') { - throw new Error('`colors` parameter must be an Object.') - } - - var _finalColors = {} - for (var key in _defColors) { - var hex = colors.hasOwnProperty(key) ? colors[key] : null - if (!hex) { - _finalColors[key] = _defColors[key] - continue - } - if ('reset' === key) { - if (typeof hex === 'string') { - hex = [hex] - } - if (!Array.isArray(hex) || hex.length === 0 || hex.some(function (h) { - return typeof h !== 'string' - })) { - throw new Error('The value of `' + key + '` property must be an Array and each item could only be a hex string, e.g.: FF0000') - } - var defHexColor = _defColors[key] - if (!hex[0]) { - hex[0] = defHexColor[0] - } - if (hex.length === 1 || !hex[1]) { - hex = [hex[0]] - hex.push(defHexColor[1]) - } - - hex = hex.slice(0, 2) - } else if (typeof hex !== 'string') { - throw new Error('The value of `' + key + '` property must be a hex string, e.g.: FF0000') - } - _finalColors[key] = hex - } - _setTags(_finalColors) -} - -/** - * Reset colors. - */ -ansiHTML.reset = function () { - _setTags(_defColors) -} - -/** - * Expose tags, including open and close. - * @type {Object} - */ -ansiHTML.tags = {} - -if (Object.defineProperty) { - Object.defineProperty(ansiHTML.tags, 'open', { - get: function () { return _openTags } - }) - Object.defineProperty(ansiHTML.tags, 'close', { - get: function () { return _closeTags } - }) -} else { - ansiHTML.tags.open = _openTags - ansiHTML.tags.close = _closeTags -} - -function _setTags (colors) { - // reset all - _openTags['0'] = 'font-weight:normal;opacity:1;color:#' + colors.reset[0] + ';background:#' + colors.reset[1] - // inverse - _openTags['7'] = 'color:#' + colors.reset[1] + ';background:#' + colors.reset[0] - // dark grey - _openTags['90'] = 'color:#' + colors.darkgrey - - for (var code in _styles) { - var color = _styles[code] - var oriColor = colors[color] || '000' - _openTags[code] = 'color:#' + oriColor - code = parseInt(code) - _openTags[(code + 10).toString()] = 'background:#' + oriColor - } -} - -ansiHTML.reset() - - -/***/ }), - -/***/ "./src/DistortableCollection.js": -/*!**************************************!*\ - !*** ./src/DistortableCollection.js ***! - \**************************************/ -/***/ (function() { - -var arr = []; -L.DistortableCollection = L.FeatureGroup.extend({ - options: { - editable: true, - exportOpts: { - exportStartUrl: '//export.mapknitter.org/export', - statusUrl: '//export.mapknitter.org', - exportUrl: 'http://export.mapknitter.org/' - } - }, - initialize: function initialize(options) { - L.setOptions(this, options); - L.FeatureGroup.prototype.initialize.call(this, options); - L.Utils.initTranslation.call(this); - this.editable = this.options.editable; - this.tooltipControl = options.tooltipControl; - console.log('optionTest: tested'); // - delete - }, - onAdd: function onAdd(map) { - L.FeatureGroup.prototype.onAdd.call(this, map); - this._map = map; - - if (this.editable) { - this.editing.enable(); - } - /** - * although we have a DistortableCollection.Edit class that handles collection events to keep our code managable, - * events that need to be added on individual images are kept here to do so through `layeradd`. - */ - - - this.on('layeradd', this._addEvents, this); - this.on('layerremove', this._removeEvents, this); - L.DomEvent.on(this.tooltipControl, 'click', this._updateTooltipBtn, this); - }, - _updateTooltipBtn: function _updateTooltipBtn(e) { - if (e.target.textContent === 'Open Tooltip') { - e.target.textContent = 'Close Tooltip'; - this.eachLayer(function (layer) { - L.DomEvent.on(layer.getElement(), 'mousemove', layer.activateTooltip, layer); - L.DomEvent.on(layer.getElement(), 'mouseout', layer.closeToolTip, layer); - e.target.textContent = 'Close Tooltip'; - }); - return; - } - - if (e.target.textContent === 'Close Tooltip') { - e.target.textContent = 'Open Tooltip'; - this.eachLayer(function (layer) { - L.DomEvent.off(layer.getElement(), 'mouseout'); - L.DomEvent.off(layer.getElement(), 'mousemove'); - }); - return; - } - }, - onRemove: function onRemove() { - if (this.editing) { - this.editing.disable(); - } - - this.off('layeradd', this._addEvents, this); - this.off('layerremove', this._removeEvents, this); - - if (e.target.textContent === 'Close Tooltip') { - e.target.textContent = 'Open Tooltip'; - this.eachLayer(function (layer) { - L.DomEvent.off(layer.getElement(), 'mouseout'); - L.DomEvent.off(layer.getElement(), 'mousemove'); - }); - return; - } - }, - _addEvents: function _addEvents(e) { - var layer = e.layer; - L.DomEvent.on(layer, { - dragstart: this._dragStartMultiple, - drag: this._dragMultiple - }, this); - L.DomEvent.on(layer.getElement(), { - mousedown: this._deselectOthers, - - /* Enable longpress for multi select for touch devices. */ - contextmenu: this._longPressMultiSelect - }, this); - }, - _removeEvents: function _removeEvents(e) { - var layer = e.layer; - L.DomEvent.off(layer, { - dragstart: this._dragStartMultiple, - drag: this._dragMultiple - }, this); - L.DomEvent.off(layer.getElement(), { - mousedown: this._deselectOthers, - contextmenu: this._longPressMultiSelect - }, this); - }, - _longPressMultiSelect: function _longPressMultiSelect(e) { - var _this = this; - - if (!this.editable) { - return; - } - - e.preventDefault(); - this.eachLayer(function (layer) { - var edit = layer.editing; - - if (layer.getElement() === e.target && edit.enabled()) { - L.DomUtil.toggleClass(layer.getElement(), 'collected'); - - if (_this.anyCollected()) { - layer.deselect(); - - _this.editing._addToolbar(); - } else { - _this.editing._removeToolbar(); - } - } - }); - }, - isCollected: function isCollected(overlay) { - return L.DomUtil.hasClass(overlay.getElement(), 'collected'); - }, - anyCollected: function anyCollected() { - var layerArr = this.getLayers(); - return layerArr.some(this.isCollected.bind(this)); - }, - _toggleCollected: function _toggleCollected(e, layer) { - if (e.shiftKey) { - /* conditional prevents disabled images from flickering multi-select mode */ - if (layer.editing.enabled()) { - L.DomUtil.toggleClass(e.target, 'collected'); // re-order layers by _leaflet_id to match their display order in UI - // add new layer to right position and avoid repitition - - var newArr = arr.every(function (each) { - return each._leaflet_id !== layer._leaflet_id; - }); - - if (newArr) { - arr.push(layer); - } else { - arr.splice(arr.indexOf(layer), 1); - } - } - } - - if (this.anyCollected()) { - layer.deselect(); - } else { - this.editing._removeToolbar(); - } - }, - _deselectOthers: function _deselectOthers(e) { - var _this2 = this; - - if (!this.editable) { - return; - } - - this.eachLayer(function (layer) { - if (layer.getElement() !== e.target) { - layer.deselect(); - } else { - _this2._toggleCollected(e, layer); - } - }); - - if (e) { - L.DomEvent.stopPropagation(e); - } - }, - _dragStartMultiple: function _dragStartMultiple(e) { - var overlay = e.target; - var map = this._map; - var i; - - if (!this.isCollected(overlay)) { - return; - } - - this.eachLayer(function (layer) { - layer._dragStartPoints = {}; - layer.deselect(); - - for (i = 0; i < 4; i++) { - var c = layer.getCorner(i); - layer._dragStartPoints[i] = map.latLngToLayerPoint(c); - } - }); - }, - _dragMultiple: function _dragMultiple(e) { - var overlay = e.target; - var map = this._map; - - if (!this.isCollected(overlay)) { - return; - } - - var topLeft = map.latLngToLayerPoint(overlay.getCorner(0)); - - var delta = overlay._dragStartPoints[0].subtract(topLeft); - - this._updateCollectionFromPoints(delta, overlay); - }, - _toRemove: function _toRemove() { - var _this3 = this; - - var layerArr = this.getLayers(); - return layerArr.filter(function (layer) { - var mode = layer.editing._mode; - return _this3.isCollected(layer) && mode !== 'lock'; - }); - }, - _toMove: function _toMove(overlay) { - var _this4 = this; - - var layerArr = this.getLayers(); - return layerArr.filter(function (layer) { - var mode = layer.editing._mode; - return layer !== overlay && _this4.isCollected(layer) && mode !== 'lock'; - }); - }, - _updateCollectionFromPoints: function _updateCollectionFromPoints(delta, overlay) { - var layersToMove = this._toMove(overlay); - - var p = new L.Transformation(1, -delta.x, 1, -delta.y); - var i; - layersToMove.forEach(function (layer) { - var movedPoints = {}; - - for (i = 0; i < 4; i++) { - movedPoints[i] = p.transform(layer._dragStartPoints[i]); - } - - layer.setCornersFromPoints(movedPoints); - }); - }, - _getAvgCmPerPixel: function _getAvgCmPerPixel(imgs) { - var reduce = imgs.reduce(function (sum, img) { - return sum + img.cm_per_pixel; - }, 0); - return reduce / imgs.length; - }, - generateExportJson: function generateExportJson() { - var json = {}; - json.images = []; - this.eachLayer(function (layer) { - if (this.isCollected(layer)) { - var sections = layer._image.src.split('/'); - - var filename = sections[sections.length - 1]; - var zc = layer.getCorners(); - var corners = [{ - lat: zc[0].lat, - lon: zc[0].lng - }, { - lat: zc[1].lat, - lon: zc[1].lng - }, { - lat: zc[3].lat, - lon: zc[3].lng - }, { - lat: zc[2].lat, - lon: zc[2].lng - }]; - json.images.push({ - id: layer._leaflet_id, - src: layer._image.src, - width: layer._image.width, - height: layer._image.height, - image_file_name: filename, - nodes: corners, - cm_per_pixel: L.ImageUtil.getCmPerPixel(layer) - }); - } - }, this); - json.images = json.images.reverse(); - json.avg_cm_per_pixel = this._getAvgCmPerPixel(json.images); - return json; - } -}); - -L.distortableCollection = function (id, options) { - return new L.DistortableCollection(id, options); -}; - -/***/ }), - -/***/ "./src/DistortableImageOverlay.js": -/*!****************************************!*\ - !*** ./src/DistortableImageOverlay.js ***! - \****************************************/ -/***/ (function() { - -L.DistortableImageOverlay = L.ImageOverlay.extend({ - options: { - height: 200, - crossOrigin: true, - // todo: find ideal number to prevent distortions during RotateScale, and make it dynamic (remove hardcoding) - edgeMinWidth: 50, - editable: true, - mode: 'distort', - selected: false, - interactive: true, - tooltipText: 'Unknow image', - // default tooltipText - tooltipOpen: false - }, - initialize: function initialize(url, options) { - L.setOptions(this, options); - L.Utils.initTranslation.call(this); - this.edgeMinWidth = this.options.edgeMinWidth; - this.editable = this.options.editable; - this._selected = this.options.selected; - this._url = url; - this.rotation = {}; - this.interactive = this.options.interactive; - this.tooltipText = options.tooltipText; - this.tooltipOpen = false; - }, - onAdd: function onAdd(map) { - var _this = this; - - this._map = map; - - if (!this.getElement()) { - this._initImage(); - } - - map.on('viewreset', this._reset, this); - - if (this.options.corners) { - this._corners = this.options.corners; - - if (map.options.zoomAnimation && L.Browser.any3d) { - map.on('zoomanim', this._animateZoom, this); - } - } // Have to wait for the image to load because need to access its w/h - - - L.DomEvent.on(this.getElement(), 'load', function () { - _this.getPane().appendChild(_this.getElement()); - - _this._initImageDimensions(); - - if (_this.options.rotation) { - var units = _this.options.rotation.deg >= 0 ? 'deg' : 'rad'; - - _this.setAngle(_this.options.rotation[units], units); - } else { - _this.rotation = { - deg: 0, - rad: 0 - }; - - _this._reset(); - } - /* Initialize default corners if not already set */ - - - if (!_this._corners) { - if (map.options.zoomAnimation && L.Browser.any3d) { - map.on('zoomanim', _this._animateZoom, _this); - } - } - /** if there is a featureGroup, only its editable option matters */ - - - var eventParents = _this._eventParents; - - if (eventParents) { - _this.eP = eventParents[Object.keys(eventParents)[0]]; - - if (_this.eP.editable) { - _this.editing.enable(); - } - } else { - if (_this.editable) { - _this.editing.enable(); - } - - _this.eP = null; - } - }); - L.DomEvent.on(this.getElement(), 'click', this.select, this); - L.DomEvent.on(map, { - singleclickon: this._singleClickListeners, - singleclickoff: this._resetClickListeners, - singleclick: this._singleClick - }, this); - /** - * custom events fired from DoubleClickLabels.js. Used to differentiate - * single / dblclick to not deselect images on map dblclick. - */ - - if (!(map.doubleClickZoom.enabled() || map.doubleClickLabels.enabled())) { - L.DomEvent.on(map, 'click', this.deselect, this); - } - - this.fire('add'); - }, - onRemove: function onRemove(map) { - L.DomEvent.off(this.getElement(), 'click', this.select, this); - L.DomEvent.off(map, { - singleclickon: this._singleClickListeners, - singleclickoff: this._resetClickListeners, - singleclick: this._singleClick - }, this); - L.DomEvent.off(map, 'click', this.deselect, this); - - if (this.editing) { - this.editing.disable(); - } - - this.fire('remove'); - L.ImageOverlay.prototype.onRemove.call(this, map); - }, - _initImageDimensions: function _initImageDimensions() { - var map = this._map; - var originalImageWidth = L.DomUtil.getStyle(this.getElement(), 'width'); - var originalImageHeight = L.DomUtil.getStyle(this.getElement(), 'height'); - var aspectRatio = parseInt(originalImageWidth) / parseInt(originalImageHeight); - var imageHeight = this.options.height; - var imageWidth = parseInt(aspectRatio * imageHeight); - var center = map.project(map.getCenter()); - var offset = L.point(imageWidth, imageHeight).divideBy(2); - - if (this.options.corners) { - this._corners = this.options.corners; - } else { - this._corners = [map.unproject(center.subtract(offset)), map.unproject(center.add(L.point(offset.x, -offset.y))), map.unproject(center.add(L.point(-offset.x, offset.y))), map.unproject(center.add(offset))]; - } - - this._initialDimensions = { - 'center': center, - 'offset': offset, - 'zoom': map.getZoom() - }; - this.setBounds(L.latLngBounds(this.getCorners())); - }, - _singleClick: function _singleClick(e) { - if (e.type === 'singleclick') { - this.deselect(); - } else { - return; - } - }, - _singleClickListeners: function _singleClickListeners() { - var map = this._map; - L.DomEvent.off(map, 'click', this.deselect, this); - L.DomEvent.on(map, 'singleclick', this.deselect, this); - }, - _resetClickListeners: function _resetClickListeners() { - var map = this._map; - L.DomEvent.on(map, 'click', this.deselect, this); - L.DomEvent.off(map, 'singleclick', this.deselect, this); - }, - isSelected: function isSelected() { - return this._selected; // this._selected - }, - deselect: function deselect() { - var edit = this.editing; - - if (!edit.enabled()) { - return; - } - - edit._removeToolbar(); - - edit._hideMarkers(); - - this._selected = false; - this.fire('deselect'); - return this; - }, - select: function select(e) { - var edit = this.editing; - var eP = this.eP; - - if (!edit.enabled()) { - return; - } - - if (e) { - L.DomEvent.stopPropagation(e); - } // this ensures deselection of all other images, allowing us to keep collection group optional - - - this._programmaticGrouping(); - - this._selected = true; - - edit._addToolbar(); - - edit._showMarkers(); - - this.fire('select'); // we run the selection logic 1st anyway because the collection group's _addToolbar method depends on it - - if (eP && eP.anyCollected()) { - this.deselect(); - return; - } - - return this; - }, - _programmaticGrouping: function _programmaticGrouping() { - this._map.eachLayer(function (layer) { - if (layer instanceof L.DistortableImageOverlay) { - layer.deselect(); - } - }); - }, - setCorner: function setCorner(corner, latlng) { - var edit = this.editing; - this._corners[corner] = latlng; - this.setBounds(L.latLngBounds(this.getCorners())); - this.fire('update'); - - if (edit.toolbar && edit.toolbar instanceof L.DistortableImage.PopupBar) { - edit._updateToolbarPos(); - } - - this.edited = true; - return this; - }, - _cornerExceedsMapLats: function _cornerExceedsMapLats(zoom, corner, map) { - if (map.options.crs.Simple == L.CRS.Simple) { - return false; - } else { - var exceedsTop; - var exceedsBottom; - - if (zoom === 0) { - exceedsTop = map.project(corner).y < 2; - exceedsBottom = map.project(corner).y >= 255; - } else { - exceedsTop = map.project(corner).y / zoom < 2; - exceedsBottom = map.project(corner).y / Math.pow(2, zoom) >= 255; - } - - return exceedsTop || exceedsBottom; - } - }, - activateTooltip: function activateTooltip() { - if (!this._selected) { - this.bindTooltip(this.tooltipText, { - direction: 'top' - }).openTooltip(); - } - }, - closeToolTip: function closeToolTip() { - this.closeTooltip(); - }, - deactivateTooltip: function deactivateTooltip() { - this.unbindTooltip(); - }, - setCorners: function setCorners(latlngObj) { - var map = this._map; - var zoom = map.getZoom(); - var edit = this.editing; - var i = 0; // this is to fix https://github.com/publiclab/Leaflet.DistortableImage/issues/402 - - for (var k in latlngObj) { - if (this._cornerExceedsMapLats(zoom, latlngObj[k], map)) { - // calling reset / update w/ the same corners bc it prevents a marker flicker for rotate - this.setBounds(L.latLngBounds(this.getCorners())); - this.fire('update'); - return; - } - } - - for (var _k in latlngObj) { - this._corners[i] = latlngObj[_k]; - i += 1; - } - - this.setBounds(L.latLngBounds(this.getCorners())); - this.fire('update'); - - if (edit.toolbar && edit.toolbar instanceof L.DistortableImage.PopupBar) { - edit._updateToolbarPos(); - } - - this.edited = true; - return this; - }, - setCornersFromPoints: function setCornersFromPoints(pointsObj) { - var map = this._map; - var zoom = map.getZoom(); - var edit = this.editing; - var i = 0; - - for (var k in pointsObj) { - var corner = map.layerPointToLatLng(pointsObj[k]); - - if (this._cornerExceedsMapLats(zoom, corner, map)) { - // calling reset / update w/ the same corners bc it prevents a marker flicker for rotate - this.setBounds(L.latLngBounds(this.getCorners())); - this.fire('update'); - return; - } - } - - for (var _k2 in pointsObj) { - this._corners[i] = map.layerPointToLatLng(pointsObj[_k2]); - i += 1; - } - - this.setBounds(L.latLngBounds(this.getCorners())); - this.fire('update'); - - if (edit.toolbar && edit.toolbar instanceof L.DistortableImage.PopupBar) { - edit._updateToolbarPos(); - } - - this.edited = true; - return this; - }, - scaleBy: function scaleBy(scale) { - var map = this._map; - var center = map.project(this.getCenter()); - var i; - var p; - var scaledCorners = {}; - - if (scale === 0) { - return; - } - - for (i = 0; i < 4; i++) { - p = map.project(this.getCorner(i)).subtract(center).multiplyBy(scale).add(center); - scaledCorners[i] = map.unproject(p); - } - - this.setCorners(scaledCorners); - return this; - }, - getAngle: function getAngle() { - var unit = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'deg'; - var matrix = this.getElement().style[L.DomUtil.TRANSFORM].split('matrix3d')[1].slice(1, -1).split(','); - var row0x = matrix[0]; - var row0y = matrix[1]; - var row1x = matrix[4]; - var row1y = matrix[5]; - var determinant = row0x * row1y - row0y * row1x; - var angle = L.TrigUtil.calcAngle(row0x, row0y, 'rad'); - - if (determinant < 0) { - angle += angle < 0 ? Math.PI : -Math.PI; - } - - if (angle < 0) { - angle = 2 * Math.PI + angle; - } - - return unit === 'deg' ? Math.round(L.TrigUtil.radiansToDegrees(angle)) : L.Util.formatNum(angle, 2); - }, - setAngle: function setAngle(angle) { - var unit = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'deg'; - var currentAngle = this.getAngle(unit); - var angleToRotateBy = angle - currentAngle; - this.rotateBy(angleToRotateBy, unit); - return this; - }, - rotateBy: function rotateBy(angle) { - var unit = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'deg'; - var map = this._map; - var center = map.project(this.getCenter()); - var corners = {}; - var i; - var p; - var q; - - if (unit === 'deg') { - angle = L.TrigUtil.degreesToRadians(angle); - } - - for (i = 0; i < 4; i++) { - p = map.project(this.getCorner(i)).subtract(center); - q = L.point(Math.cos(angle) * p.x - Math.sin(angle) * p.y, Math.sin(angle) * p.x + Math.cos(angle) * p.y); - corners[i] = map.unproject(q.add(center)); - } - - this.setCorners(corners); - return this; - }, - dragBy: function dragBy(formerPoint, newPoint) { - var map = this._map; - var i; - var p; - var transCorners = {}; - var delta = map.project(formerPoint).subtract(map.project(newPoint)); - - for (i = 0; i < 4; i++) { - p = map.project(this.getCorner(i)).subtract(delta); - transCorners[i] = map.unproject(p); - } - - this.setCorners(transCorners); - }, - restore: function restore() { - var map = this._map; - var center = this._initialDimensions.center; - var offset = this._initialDimensions.offset; - var zoom = this._initialDimensions.zoom; - var corners = [center.subtract(offset), center.add(L.point(offset.x, -offset.y)), center.add(L.point(-offset.x, offset.y)), center.add(offset)]; - - for (var i = 0; i < 4; i++) { - if (!map.unproject(corners[i], zoom).equals(this.getCorner(i))) { - this.setCorner(i, map.unproject(corners[i], zoom)); - } - } - - this.edited = false; - this.fire('restore'); - return this; - }, - - /* Copied from Leaflet v0.7 https://github.com/Leaflet/Leaflet/blob/66282f14bcb180ec87d9818d9f3c9f75afd01b30/src/dom/DomUtil.js#L189-L199 */ - - /* since L.DomUtil.getTranslateString() is deprecated in Leaflet v1.0 */ - _getTranslateString: function _getTranslateString(point) { - // on WebKit browsers (Chrome/Safari/iOS Safari/Android) - // using translate3d instead of translate - // makes animation smoother as it ensures HW accel is used. - // Firefox 13 doesn't care - // (same speed either way), Opera 12 doesn't support translate3d - var is3d = L.Browser.webkit3d; - var open = 'translate' + (is3d ? '3d' : '') + '('; - var close = (is3d ? ',0' : '') + ')'; - return open + point.x + 'px,' + point.y + 'px' + close; - }, - _reset: function _reset() { - var map = this._map; - var image = this.getElement(); - var latLngToLayerPoint = L.bind(map.latLngToLayerPoint, map); - - var transformMatrix = this._calculateProjectiveTransform(latLngToLayerPoint); - - var topLeft = latLngToLayerPoint(this.getCorner(0)); - var warp = L.DomUtil.getMatrixString(transformMatrix); - - var translation = this._getTranslateString(topLeft); - /* See L.DomUtil.setPosition. Mainly for the purposes of L.Draggable. */ - - - image._leaflet_pos = topLeft; - image.style[L.DomUtil.TRANSFORM] = [translation, warp].join(' '); - /* Set origin to the upper-left corner rather than - * the center of the image, which is the default. - */ - - image.style[L.DomUtil.TRANSFORM + '-origin'] = '0 0 0'; - this.rotation.deg = this.getAngle(); - this.rotation.rad = this.getAngle('rad'); - }, - - /* - * Calculates the transform string that will be - * correct *at the end* of zooming. - * Leaflet then generates a CSS3 animation between the current transform and - * future transform which makes the transition appear smooth. - */ - _animateZoom: function _animateZoom(event) { - var map = this._map; - var image = this.getElement(); - - var latLngToNewLayerPoint = function latLngToNewLayerPoint(latlng) { - return map._latLngToNewLayerPoint(latlng, event.zoom, event.center); - }; - - var transformMatrix = this._calculateProjectiveTransform(latLngToNewLayerPoint); - - var topLeft = latLngToNewLayerPoint(this.getCorner(0)); - var warp = L.DomUtil.getMatrixString(transformMatrix); - - var translation = this._getTranslateString(topLeft); - /* See L.DomUtil.setPosition. Mainly for the purposes of L.Draggable. */ - - - image._leaflet_pos = topLeft; - image.style[L.DomUtil.TRANSFORM] = [translation, warp].join(' '); - }, - getCorners: function getCorners() { - return this._corners; - }, - getCorner: function getCorner(i) { - return this._corners[i]; - }, - // image (vertex) centroid calculation - getCenter: function getCenter() { - var map = this._map; - var reduce = this.getCorners().reduce(function (agg, corner) { - return agg.add(map.project(corner)); - }, L.point(0, 0)); - return map.unproject(reduce.divideBy(4)); - }, - _calculateProjectiveTransform: function _calculateProjectiveTransform(latLngToCartesian) { - /* Setting reasonable but made-up image defaults - * allow us to place images on the map before - * they've finished downloading. */ - var offset = latLngToCartesian(this.getCorner(0)); - var w = this.getElement().offsetWidth || 500; - var h = this.getElement().offsetHeight || 375; - var c = []; - var j; - /* Convert corners to container points (i.e. cartesian coordinates). */ - - for (j = 0; j < 4; j++) { - c.push(latLngToCartesian(this.getCorner(j))._subtract(offset)); - } - /* - * This matrix describes the action of - * the CSS transform on each corner of the image. - * It maps from the coordinate system centered - * at the upper left corner of the image - * to the region bounded by the latlngs in this._corners. - * For example: - * 0, 0, c[0].x, c[0].y - * says that the upper-left corner of the image - * maps to the first latlng in this._corners. - */ - - - return L.MatrixUtil.general2DProjection(0, 0, c[0].x, c[0].y, w, 0, c[1].x, c[1].y, 0, h, c[2].x, c[2].y, w, h, c[3].x, c[3].y); - } -}); - -L.distortableImageOverlay = function (id, options) { - // remove temp - return new L.DistortableImageOverlay(id, options); // remove temp -}; - -L.Map.addInitHook(function () { - if (!L.DomUtil.hasClass(this.getContainer(), 'ldi')) { - L.DomUtil.addClass(this.getContainer(), 'ldi'); - } -}); - -/***/ }), - -/***/ "./src/components/DistortableImage.Keymapper.js": -/*!******************************************************!*\ - !*** ./src/components/DistortableImage.Keymapper.js ***! - \******************************************************/ -/***/ (function() { - -var _this = this; - -L.DomUtil = L.DomUtil || {}; -L.DistortableImage = L.DistortableImage || {}; -L.distortableImage = L.DistortableImage; -L.DistortableImage.Keymapper = L.Handler.extend({ - options: { - position: 'topright' - }, - initialize: function initialize(map, options) { - this._map = map; - L.setOptions(this, options); - }, - addHooks: function addHooks() { - if (!this._keymapper) { - this._container = this._buildContainer(); - this._scrollWrapper = this._wrap(); - this._toggler = this._createButton(); - - this._setMapper(this._container, this._scrollWrapper, this._toggler); - - L.DomEvent.on(this._toggler, 'click', this._toggleKeymapper, this); - L.DomEvent.disableClickPropagation(this._container); - L.DomEvent.disableScrollPropagation(this._container); - } - }, - removeHooks: function removeHooks() { - if (this._keymapper) { - L.DomEvent.off(this._toggler, 'click', this._toggleKeymapper, this); - L.DomUtil.remove(this._toggler); - L.DomUtil.remove(this._scrollWrapper); - L.DomUtil.remove(this._container); - this._keymapper = false; - } - }, - _buildContainer: function _buildContainer() { - var container = L.DomUtil.create('div', 'ldi-keymapper-hide'); - container.setAttribute('id', 'ldi-keymapper'); - var divider = L.DomUtil.create('br', 'divider'); - container.appendChild(divider); - return container; - }, - _createButton: function _createButton() { - var toggler = L.DomUtil.create('a', ''); - toggler.innerHTML = L.IconUtil.create('keyboard_open'); - toggler.setAttribute('id', 'toggle-keymapper'); - toggler.setAttribute('href', '#'); - toggler.setAttribute('title', 'Show keymap'); // Will force screen readers like VoiceOver to read this as "Show keymap - button" - - toggler.setAttribute('role', 'button'); - toggler.setAttribute('aria-label', 'Show keymap'); - return toggler; - }, - _wrap: function _wrap() { - var wrap = L.DomUtil.create('div', ''); - wrap.setAttribute('id', 'keymapper-wrapper'); - wrap.style.display = 'none'; - return wrap; - }, - _setMapper: function _setMapper(container, wrap, button) { - this._keymapper = L.control({ - position: this.options.position - }); - - this._keymapper.onAdd = function () { - container.appendChild(wrap); - wrap.insertAdjacentHTML('beforeend', '' + '
' + - /* eslint-disable */ - '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '
Rotate Mode
R
RotateScale Mode
r
Scale Mode
s
Distort Mode
d
Drag Mode
D
Lock (Mode) / Unlock Image
l\xa0u
Stack up / down
q\xa0a
Add / Remove Image Border
b
Toggle Opacity
o
Deselect All
esc
Delete Image(s)
delete\xa0backspace
Export Image(s)
e
'); - /* eslint-enable */ - - container.appendChild(button); - return container; - }; - - this._keymapper.addTo(this._map); - }, - _toggleKeymapper: function _toggleKeymapper(e) { - e.preventDefault(); - this._container.className = this._container.className === 'ldi-keymapper leaflet-control' ? 'ldi-keymapper-hide leaflet-control' : 'ldi-keymapper leaflet-control'; - this._scrollWrapper.style.display = this._scrollWrapper.style.display === 'none' ? 'block' : 'none'; - this._toggler.innerHTML = this._toggler.innerHTML === 'close' ? L.IconUtil.create('keyboard_open') : 'close'; - L.IconUtil.toggleTitle(this._toggler, 'Show keymap', 'Hide keymap'); - L.DomUtil.toggleClass(this._toggler, 'close-icon'); - }, - _injectIconSet: function _injectIconSet() { - if (document.querySelector('#keymapper-iconset')) { - return; - } - - var el = L.DomUtil.create('div', ''); - el.id = 'keymapper-iconset'; - el.setAttribute('hidden', 'hidden'); - this._iconset = new L.KeymapperIconSet().render(); - el.innerHTML = this._iconset; - document.querySelector('.leaflet-control-container').appendChild(el); - } -}); -L.DistortableImage.Keymapper.addInitHook(function () { - L.DistortableImage.Keymapper.prototype._n = L.DistortableImage.Keymapper.prototype._n ? L.DistortableImage.Keymapper.prototype._n + 1 : 1; // dont enable keymapper for mobile - - if (L.DistortableImage.Keymapper.prototype._n === 1 && !L.Browser.mobile) { - _this.enable(); - - _this._injectIconSet(); - } -}); - -L.distortableImage.keymapper = function (map, options) { - return new L.DistortableImage.Keymapper(map, options); -}; - -/***/ }), - -/***/ "./src/edit/DistortableCollection.Edit.js": -/*!************************************************!*\ - !*** ./src/edit/DistortableCollection.Edit.js ***! - \************************************************/ -/***/ (function() { - -L.DistortableImage = L.DistortableImage || {}; // this class holds the keybindings and toolbar API for an image collection instance - -L.DistortableCollection.Edit = L.Handler.extend({ - options: { - keymap: L.distortableImage.group_action_map - }, - initialize: function initialize(group, options) { - this._group = group; - this._exportOpts = group.options.exportOpts; - L.setOptions(this, options); - L.distortableImage.group_action_map.Escape = '_decollectAll'; - }, - addHooks: function addHooks() { - var group = this._group; - var map = group._map; - this.editActions = this.options.actions; - this.runExporter = L.bind(L.Utils.getNestedVal(this, '_exportOpts', 'exporter') || this.startExport, this); - L.DomEvent.on(document, 'keydown', this._onKeyDown, this); - - if (!(map.doubleClickZoom.enabled() || map.doubleClickLabels.enabled())) { - L.DomEvent.on(map, 'click', this._decollectAll, this); - } - - L.DomEvent.on(map, { - singleclickon: this._singleClickListeners, - singleclickoff: this._resetClickListeners, - singleclick: this._singleClick, - boxcollectend: this._addCollections - }, this); - this._group.editable = true; - - this._group.eachLayer(function (layer) { - return layer.editing.enable(); - }); - }, - removeHooks: function removeHooks() { - var group = this._group; - var map = group._map; - L.DomEvent.off(document, 'keydown', this._onKeyDown, this); - - if (!(map.doubleClickZoom.enabled() || map.doubleClickLabels.enabled())) { - L.DomEvent.off(map, 'click', this._decollectAll, this); - } - - L.DomEvent.off(map, { - singleclickon: this._singleClickListeners, - singleclickoff: this._resetClickListeners, - singleclick: this._singleClick, - boxcollectend: this._addCollections - }, this); - - this._decollectAll(); - - this._group.editable = false; - - this._group.eachLayer(function (layer) { - return layer.editing.disable(); - }); - }, - enable: function enable() { - this._enabled = true; - this.addHooks(); - return this; - }, - disable: function disable() { - this._enabled = false; - this.removeHooks(); - return this; - }, - _onKeyDown: function _onKeyDown(e) { - var keymap = this.options.keymap; - var handlerName = keymap[e.key]; - - if (!this[handlerName]) { - return; - } - - if (this._group.anyCollected()) { - this[handlerName].call(this); - } - }, - _singleClick: function _singleClick(e) { - if (e.type === 'singleclick') { - this._decollectAll(e); - } else { - return; - } - }, - _singleClickListeners: function _singleClickListeners() { - var map = this._group._map; - L.DomEvent.off(map, 'click', this._decollectAll, this); - L.DomEvent.on(map, 'singleclick', this._decollectAll, this); - }, - _resetClickListeners: function _resetClickListeners() { - var map = this._group._map; - L.DomEvent.on(map, 'click', this._decollectAll, this); - L.DomEvent.off(map, 'singleclick', this._decollectAll, this); - }, - _decollectAll: function _decollectAll(e) { - var oe; - - if (e) { - oe = e.originalEvent; - } - /** - * prevents image deselection following the 'boxcollectend' event - note 'shift' must not be released until dragging is complete - * also prevents deselection following a click on a disabled img by differentiating it from the map - */ - - - if (oe && (oe.shiftKey || oe.target instanceof HTMLImageElement)) { - return; - } - - this._group.eachLayer(function (layer) { - L.DomUtil.removeClass(layer.getElement(), 'collected'); - layer.deselect(); - }); - - this._removeToolbar(); - - if (e) { - L.DomEvent.stopPropagation(e); - } - }, - _unlockGroup: function _unlockGroup() { - var _this = this; - - if (!this.hasTool(L.UnlockAction)) { - return; - } - - this._group.eachLayer(function (layer) { - if (_this._group.isCollected(layer)) { - var edit = layer.editing; - - edit._unlock(); // unlock updates the layer's handles; deselect to ensure they're hidden - - - layer.deselect(); - } - }); - }, - _lockGroup: function _lockGroup() { - var _this2 = this; - - if (!this.hasTool(L.LockAction)) { - return; - } - - this._group.eachLayer(function (layer) { - if (_this2._group.isCollected(layer)) { - var edit = layer.editing; - - edit._lock(); // map.addLayer also deselects the image, so we reselect here - - - L.DomUtil.addClass(layer.getElement(), 'collected'); - } - }); - }, - _addCollections: function _addCollections(e) { - var _this3 = this; - - var box = e.boxCollectBounds; - var map = this._group._map; - - this._group.eachLayer(function (layer) { - var edit = layer.editing; - - if (layer.isSelected()) { - layer.deselect(); - } - - var zoom = map.getZoom(); - var center = map.getCenter(); - var imgBounds = L.latLngBounds(layer.getCorner(2), layer.getCorner(1)); - imgBounds = map._latLngBoundsToNewLayerBounds(imgBounds, zoom, center); - - if (box.intersects(imgBounds) && edit.enabled()) { - if (!_this3.toolbar) { - _this3._addToolbar(); - } - - L.DomUtil.addClass(layer.getElement(), 'collected'); - } - }); - }, - _removeGroup: function _removeGroup(e) { - var _this4 = this; - - if (!this.hasTool(L.DeleteAction)) { - return; - } - - var layersToRemove = this._group._toRemove(); - - var n = layersToRemove.length; - - if (n === 0) { - return; - } - - var choice = L.DomUtil.confirmDeletes(n); - - if (choice) { - layersToRemove.forEach(function (layer) { - _this4._group.removeLayer(layer); - }); - - if (!this._group.anyCollected()) { - this._removeToolbar(); - } - } - - if (e) { - L.DomEvent.stopPropagation(e); - } - }, - cancelExport: function cancelExport() { - if (!this.customCollection) { - this._exportOpts.collection = undefined; - } - - clearInterval(this.updateInterval); - }, - _addToolbar: function _addToolbar() { - var group = this._group; - var map = group._map; - - if (group.options.suppressToolbar || this.toolbar) { - return; - } - - this.toolbar = L.distortableImage.controlBar({ - actions: this.editActions, - position: 'topleft' - }).addTo(map, group); - }, - _removeToolbar: function _removeToolbar() { - var map = this._group._map; - - if (this.toolbar) { - map.removeLayer(this.toolbar); - this.toolbar = false; - } else { - return false; - } - }, - hasTool: function hasTool(value) { - return this.editActions.some(function (action) { - return action === value; - }); - }, - addTool: function addTool(value) { - if (value.baseClass === 'leaflet-toolbar-icon' && !this.hasTool(value)) { - this._removeToolbar(); - - this.editActions.push(value); - - this._addToolbar(); - } - - return this; - }, - removeTool: function removeTool(value) { - var _this5 = this; - - this.editActions.some(function (item, idx) { - if (_this5.editActions[idx] === value) { - _this5._removeToolbar(); - - _this5.editActions.splice(idx, 1); - - _this5._addToolbar(); - - return true; - } else { - return false; - } - }); - return this; - }, - startExport: function startExport() { - var _this6 = this; - - if (!this.hasTool(L.ExportAction)) { - return; - } - - return new Promise(function (resolve) { - var opts = _this6._exportOpts; - opts.resolve = resolve; // allow resolving promise in user-defined functions, to stop spinner on completion - - var statusUrl; - _this6.updateInterval = null; // this may be overridden to update the UI to show export progress or completion - - var _defaultUpdater = function _defaultUpdater(data) { - data = JSON.parse(data); // optimization: fetch status directly from google storage: - - if (data.status_url) { - if (statusUrl !== data.status_url && data.status_url.match('.json')) { - // if (data.status_url && data.status_url.substr(0,1) === "/") { - // opts.statusUrl = opts.statusUrl + data.status_url; - // } else { - statusUrl = data.status_url; // } - } - - if (data.status === 'complete') { - clearInterval(_this6.updateInterval); - - if (!_this6.customCollection) { - _this6._exportOpts.collection = undefined; - } - - resolve(); - - if (data.jpg !== null) { - alert('Export succeeded. ' + opts.exportUrl + data.jpg); - } - } // TODO: update to clearInterval when status == "failed" if we update that in this file: - // https://github.com/publiclab/mapknitter-exporter/blob/main/lib/mapknitterExporter.rb - - - console.log(data); - } - }; // receives the URL of status.json, and starts running the updater to repeatedly fetch from status.json; - // this may be overridden to integrate with any UI - - - var _defaultHandleStatusRes = function _defaultHandleStatusRes(data) { - statusUrl = opts.statusUrl + data; // repeatedly fetch the status.json - - _this6.updateInterval = setInterval(function () { - var reqOpts = { - method: 'GET' - }; - var req = new Request("".concat(statusUrl, "?").concat(Date.now()), reqOpts); - fetch(req).then(function (res) { - if (res.ok) { - return res.text(); - } - }).then(opts.updater); - }, opts.frequency); - }; // initiate the export - - - var _defaultFetchStatusUrl = function _defaultFetchStatusUrl(mergedOpts) { - var form = new FormData(); - form.append('collection', JSON.stringify(mergedOpts.collection)); - form.append('scale', mergedOpts.scale); - form.append('upload', true); - var reqOpts = { - method: 'POST', - body: form - }; - var req = new Request(mergedOpts.exportStartUrl, reqOpts); - fetch(req).then(function (res) { - if (res.ok) { - return res.text(); - } - }).then(mergedOpts.handleStatusRes); - }; // If the user has passed collection property - - - _this6.customCollection = !!opts.collection; - - if (!_this6.customCollection) { - opts.collection = _this6._group.generateExportJson().images; - } - - opts.frequency = opts.frequency || 3000; - opts.scale = opts.scale || 100; // switch it to _getAvgCmPerPixel ! - - opts.updater = opts.updater || _defaultUpdater; - opts.handleStatusRes = opts.handleStatusRes || _defaultHandleStatusRes; - opts.fetchStatusUrl = opts.fetchStatusUrl || _defaultFetchStatusUrl; - opts.fetchStatusUrl(opts); - }); - } -}); - -L.distortableCollection.edit = function (group, options) { - return new L.DistortableCollection.Edit(group, options); -}; - -/***/ }), - -/***/ "./src/edit/DistortableImage.Edit.js": -/*!*******************************************!*\ - !*** ./src/edit/DistortableImage.Edit.js ***! - \*******************************************/ -/***/ (function() { - -L.DistortableImage = L.DistortableImage || {}; // holds the keybindings & toolbar API for an individual image instance - -L.DistortableImage.Edit = L.Handler.extend({ - options: { - opacity: 0.7, - outline: '1px solid red', - keymap: L.distortableImage.action_map - }, - initialize: function initialize(overlay, options) { - this._overlay = overlay; - this._toggledImage = false; - this._mode = overlay.options.mode; - this._transparent = false; - this._outlined = false; - L.setOptions(this, options); - L.distortableImage.action_map.Escape = '_deselect'; - }, - - /* Run on image selection. */ - addHooks: function addHooks() { - var overlay = this._overlay; - this.editActions = this.options.actions; - /* bring the selected image into view */ - - overlay.bringToFront(); - - this._initModes(); - - this._initHandles(); - - this._appendHandlesandDragable(); - - if (overlay.isSelected() && !overlay.options.suppressToolbar) { - this._addToolbar(); - } - - this.parentGroup = overlay.eP ? overlay.eP : false; - L.DomEvent.on(overlay.getElement(), { - dblclick: this.nextMode - }, this); - L.DomEvent.on(window, 'keydown', this._onKeyDown, this); - }, - - /* Run on image deselection. */ - removeHooks: function removeHooks() { - var overlay = this._overlay; - var eP = this.parentGroup; // First, check if dragging exists - it may be off due to locking - - this._disableDragging(); - - if (this.toolbar) { - this._removeToolbar(); - } - - for (var handle in this._handles) { - L.DomUtil.remove(handle); - } - /** - * ensures if you disable an image while it is multi-selected - * additional deselection logic is run - */ - - - if (L.DomUtil.hasClass(overlay.getElement(), 'collected')) { - L.DomUtil.removeClass(overlay.getElement(), 'collected'); - } - - if (eP && !eP.anyCollected() && eP.editing.toolbar) { - eP.editing._removeToolbar(); - } - - L.DomEvent.off(overlay.getElement(), { - dblclick: this.nextMode - }, this); - L.DomEvent.off(window, 'keydown', this._onKeyDown, this); - }, - disable: function disable() { - if (!this._enabled) { - return this; - } - - this._overlay.deselect(); - - this._enabled = false; - this.removeHooks(); - return this; - }, - _initModes: function _initModes() { - this._modes = {}; // passed from L.DistortablImage.PopupBar. If the mode is one - // of the current toolbar actions, adds it to this._modes - - for (var mode in L.DistortableImage.Edit.MODES) { - var action = L.DistortableImage.Edit.MODES[mode]; - - if (this.editActions.indexOf(action) !== -1) { - this._modes[mode] = action; - } - } // sets the current mode to the 1st available one if the one selected - // during initialization is not available - - - if (!this._modes[this._mode]) { - this._mode = Object.keys(this._modes)[0]; - } - }, - _initHandles: function _initHandles() { - var overlay = this._overlay; - var i; - this._dragHandles = L.layerGroup(); - - for (i = 0; i < 4; i++) { - this._dragHandles.addLayer(L.dragHandle(overlay, i)); - } - - this._scaleHandles = L.layerGroup(); - - for (i = 0; i < 4; i++) { - this._scaleHandles.addLayer(L.scaleHandle(overlay, i)); - } - - this._distortHandles = L.layerGroup(); - - for (i = 0; i < 4; i++) { - this._distortHandles.addLayer(L.distortHandle(overlay, i)); - } - - this._rotateHandles = L.layerGroup(); // individual rotate - - for (i = 0; i < 4; i++) { - this._rotateHandles.addLayer(L.rotateHandle(overlay, i)); - } // handle includes rotate AND scale - - - this._freeRotateHandles = L.layerGroup(); - - for (i = 0; i < 4; i++) { - this._freeRotateHandles.addLayer(L.freeRotateHandle(overlay, i)); - } - - this._lockHandles = L.layerGroup(); - - for (i = 0; i < 4; i++) { - this._lockHandles.addLayer(L.lockHandle(overlay, i, { - draggable: false - })); - } - - this._handles = { - drag: this._dragHandles, - scale: this._scaleHandles, - distort: this._distortHandles, - rotate: this._rotateHandles, - freeRotate: this._freeRotateHandles, - lock: this._lockHandles - }; - }, - _appendHandlesandDragable: function _appendHandlesandDragable() { - var ov = this._overlay; // won't throw error if user adds 0 mode actions to toolbar - - if (!this._mode) { - this._enableDragging(); - - return; - } - - this._updateHandle(); - - if (!ov.isSelected() && this.currentHandle) { - this.currentHandle.eachLayer(function (handle) { - handle.setOpacity(0); - - if (handle.dragging) { - handle.dragging.disable(); - } - }); - } - - if (!this.isMode('lock')) { - this._enableDragging(); - } - }, - _onKeyDown: function _onKeyDown(e) { - var keymap = this.options.keymap; - var handlerName = keymap[e.key]; - var ov = this._overlay; - var eP = this.parentGroup; - - if (eP && eP.anyCollected()) { - return; - } - - if (this[handlerName] !== undefined && !ov.options.suppressToolbar) { - if (ov.isSelected() && this.toolbar) { - this[handlerName].call(this); - } - } - }, - replaceTool: function replaceTool(old, next) { - var _this = this; - - if (next.baseClass !== 'leaflet-toolbar-icon' || this.hasTool(next)) { - return this; - } - - this.editActions.some(function (item, idx) { - if (item === old) { - _this._removeToolbar(); - - _this.editActions[idx] = next; - - _this._addToolbar(); - - for (var mode in L.DistortableImage.Edit.MODES) { - if (L.DistortableImage.Edit.MODES[mode] === old) { - delete _this._modes[mode]; - - _this._nextOrNone(mode); - } else if (L.DistortableImage.Edit.MODES[mode] === next) { - _this._modes[mode] = next; - } - } - - return true; - } - }); - return this; - }, - addTool: function addTool(value) { - if (value.baseClass === 'leaflet-toolbar-icon' && !this.hasTool(value)) { - this._removeToolbar(); - - this.editActions.push(value); - - this._addToolbar(); - - for (var mode in L.DistortableImage.Edit.MODES) { - if (L.DistortableImage.Edit.MODES[mode] === value) { - this._modes[mode] = value; - } - } - - if (!this._overlay.isSelected()) { - this._removeToolbar(); - } - } - - return this; - }, - hasTool: function hasTool(value) { - return this.editActions.some(function (action) { - return action === value; - }); - }, - removeTool: function removeTool(value) { - var _this2 = this; - - this.editActions.some(function (item, idx) { - if (item === value) { - _this2._removeToolbar(); - - _this2.editActions.splice(idx, 1); - - _this2._addToolbar(); - - for (var mode in L.DistortableImage.Edit.MODES) { - if (L.DistortableImage.Edit.MODES[mode] === value) { - delete _this2._modes[mode]; - - _this2._nextOrNone(mode); - } - } - - return true; - } - }); - - if (!this._overlay.isSelected()) { - this._removeToolbar(); - } - - return this; - }, - // set the mode to the next mode or if that was the last one set mode to '' - _nextOrNone: function _nextOrNone(mode) { - if (this.isMode(mode)) { - if (Object.keys(this.getModes()).length >= 1) { - this.nextMode(); - } else { - if (mode === 'lock') { - this._enableDragging(); - } - - this._mode = ''; - - this._updateHandle(); - } - } - }, - _removeToolbar: function _removeToolbar() { - var ov = this._overlay; - var map = ov._map; - - if (this.toolbar) { - map.removeLayer(this.toolbar); - this.toolbar = false; - } - }, - _enableDragging: function _enableDragging() { - var _this3 = this; - - var overlay = this._overlay; - var map = overlay._map; - this.dragging = new L.Draggable(overlay.getElement()); - this.dragging.enable(); - /* Hide toolbars and markers while dragging; click will re-show it */ - - this.dragging.on('dragstart', function () { - overlay.fire('dragstart'); - - _this3._removeToolbar(); - }); - /* - * Adjust default behavior of L.Draggable, which overwrites the CSS3 - * distort transformations that we set when it calls L.DomUtil.setPosition. - */ - - this.dragging._updatePosition = function () { - var topLeft = overlay.getCorner(0); - - var delta = this._newPos.subtract(map.latLngToLayerPoint(topLeft)); - - var currentPoint; - var corners = {}; - var i; - this.fire('predrag'); - - for (i = 0; i < 4; i++) { - currentPoint = map.latLngToLayerPoint(overlay.getCorner(i)); - corners[i] = map.layerPointToLatLng(currentPoint.add(delta)); - } - - overlay.setCorners(corners); - overlay.fire('drag'); - this.fire('drag'); - }; - - this.dragging.on('dragend', function () { - overlay.fire('dragend'); - }); - }, - _disableDragging: function _disableDragging() { - if (this.dragging) { - this.dragging.disable(); - delete this.dragging; - } - }, - _dragMode: function _dragMode() { - this.setMode('drag'); - }, - _scaleMode: function _scaleMode() { - this.setMode('scale'); - }, - _distortMode: function _distortMode() { - this.setMode('distort'); - }, - _rotateMode: function _rotateMode() { - this.setMode('rotate'); - }, - _freeRotateMode: function _freeRotateMode() { - this.setMode('freeRotate'); - }, - _toggleLockMode: function _toggleLockMode() { - if (this.isMode('lock')) { - this._unlock(); - } else { - this._lock(); - } - }, - _toggleOpacity: function _toggleOpacity() { - var image = this._overlay.getElement(); - - if (!this.hasTool(L.OpacityAction)) { - return; - } - - this._transparent = !this._transparent; - var opacity = this._transparent ? this.options.opacity : 1; - L.DomUtil.setOpacity(image, opacity); - image.setAttribute('opacity', opacity); - - this._refresh(); - }, - _toggleBorder: function _toggleBorder() { - var image = this._overlay.getElement(); - - if (!this.hasTool(L.BorderAction)) { - return; - } - - this._outlined = !this._outlined; - var outline = this._outlined ? this.options.outline : 'none'; - image.style.outline = outline; - - this._refresh(); - }, - // compare this to using overlay zIndex - _toggleOrder: function _toggleOrder() { - if (this._toggledImage) { - this._stackUp(); - } else { - this._stackDown(); - } - }, - _removeOverlay: function _removeOverlay() { - var ov = this._overlay; - var eP = this.parentGroup; - - if (this.isMode('lock') || !this.hasTool(L.DeleteAction)) { - return; - } - - var choice = L.DomUtil.confirmDelete(); - - if (!choice) { - return; - } - - this._removeToolbar(); - - if (eP) { - eP.removeLayer(ov); - } else { - ov._map.removeLayer(ov); - } - }, - // Based on https://github.com/publiclab/mapknitter/blob/8d94132c81b3040ae0d0b4627e685ff75275b416/app/assets/javascripts/mapknitter/Map.js#L47-L82 - _getExport: function _getExport() { - var overlay = this._overlay; - var map = overlay._map; - var img = overlay.getElement(); - - if (!this.hasTool(L.ExportAction)) { - return; - } // make a new image - - - var downloadable = new Image(); - downloadable.id = downloadable.id || 'tempId12345'; - document.body.appendChild(downloadable); - - downloadable.onload = function onLoadDownloadableImage() { - var height = downloadable.height; - var width = downloadable.width; - var nw = map.latLngToLayerPoint(overlay.getCorner(0)); - var ne = map.latLngToLayerPoint(overlay.getCorner(1)); - var sw = map.latLngToLayerPoint(overlay.getCorner(2)); - var se = map.latLngToLayerPoint(overlay.getCorner(3)); // I think this is to move the image to the upper left corner, - // eslint-disable-next-line max-len - // jywarren: i think we may need these or the image goes off the edge of the canvas - // jywarren: but these seem to break the distortion math... - // jywarren: i think it should be rejiggered so it - // finds the most negative values of x and y and then - // adds those to all coordinates - // nw.x -= nw.x; - // ne.x -= nw.x; - // se.x -= nw.x; - // sw.x -= nw.x; - // nw.y -= nw.y; - // ne.y -= nw.y; - // se.y -= nw.y; - // sw.y -= nw.y; - // run once warping is complete - - downloadable.onload = function () { - L.DomUtil.remove(downloadable); - }; - - if (window && window.hasOwnProperty('warpWebGl')) { - warpWebGl(downloadable.id, [0, 0, width, 0, width, height, 0, height], [nw.x, nw.y, ne.x, ne.y, se.x, se.y, sw.x, sw.y], true // trigger download - ); - } - }; - - downloadable.src = overlay.options.fullResolutionSrc || img.src; - }, - _stackUp: function _stackUp() { - var t = this._toggledImage; - - if (!t || !this.hasTool(L.StackAction)) { - return; - } - - this._toggledImage = false; - - this._overlay.bringToFront(); - - this._refresh(); - }, - _stackDown: function _stackDown() { - var t = this._toggledImage; - - if (t || !this.hasTool(L.StackAction)) { - return; - } - - this._toggledImage = true; - - this._overlay.bringToBack(); - - this._refresh(); - }, - _unlock: function _unlock() { - var ov = this._overlay; - var map = ov._map; - var eP = this.parentGroup; - - if (!this.isMode('lock')) { - return; - } - - if (eP && !eP.isCollected(ov) || !eP) { - if (!this.hasTool(L.LockAction)) { - return; - } - } - - if (this.currentHandle) { - map.removeLayer(this.currentHandle); - } - - if (ov.options.mode === 'lock' || !this.hasMode(ov.options.mode)) { - this._mode = ''; - this.currentHandle = ''; - } else { - this._mode = ov.options.mode; - } - - this._updateHandle(); - - this._enableDragging(); - - this._refresh(); - }, - _lock: function _lock() { - var ov = this._overlay; - var map = ov._map; - var eP = this.parentGroup; - - if (this.isMode('lock')) { - return; - } - - if (eP && !eP.isCollected(ov) || !eP) { - if (!this.hasTool(L.LockAction)) { - return; - } - } - - if (this.currentHandle) { - map.removeLayer(this.currentHandle); - } - - this._mode = 'lock'; - - this._updateHandle(); - - this._disableDragging(); - - this._refresh(); - }, - _deselect: function _deselect() { - this._overlay.deselect(); - }, - _showMarkers: function _showMarkers(e) { - var eP = this.parentGroup; - - if (!this.currentHandle) { - return; - } // only markers we want in collect interface for now is lock - - - if (!this.isMode('lock') && eP && eP.anyCollected()) { - return; - } - - this.currentHandle.eachLayer(function (handle) { - handle.setOpacity(1); - - if (handle.dragging) { - handle.dragging.enable(); - } - - L.DomUtil.addClass(handle.getElement(), 'leaflet-interactive'); - }); - }, - _hideMarkers: function _hideMarkers() { - var ov = this._overlay; - var eP = this.parentGroup; // workaround for race condition w/ feature group - - if (!this._handles) { - this._initHandles(); - } - - if (!this.currentHandle) { - return; - } - - if (this.isMode('lock') && eP && eP.isCollected(ov)) { - return; - } - - this.currentHandle.eachLayer(function (handle) { - handle.setOpacity(0); - - if (handle.dragging) { - handle.dragging.disable(); - } - - L.DomUtil.removeClass(handle.getElement(), 'leaflet-interactive'); - }); - }, - _updateHandle: function _updateHandle() { - var ov = this._overlay; - var map = ov._map; - var mode = this.getMode(); - - if (this.currentHandle) { - map.removeLayer(this.currentHandle); - } - - this.currentHandle = mode === '' ? '' : this._handles[mode]; - - if (this.currentHandle !== '') { - map.addLayer(this.currentHandle); - } - }, - _addToolbar: function _addToolbar() { - var ov = this._overlay; - var eP = this.parentGroup; - var map = ov._map; // Find the topmost point on the image. - - var corners = ov.getCorners(); - var maxLat = -Infinity; - - if (eP && eP.anyCollected()) { - eP.editing._addToolbar(); - - return; - } - - if (ov.options.suppressToolbar || this.toolbar) { - return; - } - - for (var i = 0; i < corners.length; i++) { - if (corners[i].lat > maxLat) { - maxLat = corners[i].lat; - } - } // Longitude is based on the centroid of the image. - - - var raisedPoint = ov.getCenter(); - raisedPoint.lat = maxLat; - this.toolbar = L.distortableImage.popupBar(raisedPoint, { - actions: this.editActions - }).addTo(map, ov); - ov.fire('toolbar:created'); - }, - _refresh: function _refresh() { - if (this.toolbar) { - this._removeToolbar(); - } - - this._addToolbar(); - }, - _updateToolbarPos: function _updateToolbarPos() { - var overlay = this._overlay; // Find the topmost point on the image. - - var corners = overlay.getCorners(); - var toolbar = this.toolbar; - var maxLat = -Infinity; - - if (toolbar && toolbar instanceof L.DistortableImage.PopupBar) { - for (var i = 0; i < corners.length; i++) { - if (corners[i].lat > maxLat) { - maxLat = corners[i].lat; - } - } // Longitude is based on the centroid of the image. - - - var raisedPoint = overlay.getCenter(); - raisedPoint.lat = maxLat; - - if (!overlay.options.suppressToolbar) { - this.toolbar.setLatLng(raisedPoint); - } - } - }, - hasMode: function hasMode(mode) { - return !!this._modes[mode]; - }, - getMode: function getMode() { - if (!this.enabled()) { - return; - } - - return this._mode; - }, - getModes: function getModes() { - return this._modes; - }, - isMode: function isMode(mode) { - if (!this.enabled()) { - return false; - } - - return this._mode === mode; - }, - setMode: function setMode(newMode) { - var ov = this._overlay; - var eP = this.parentGroup; - var mode = this.getMode(); - - if (mode === newMode || !this.hasMode(newMode) || !this.enabled()) { - return; - } - - if (this.toolbar) { - this.toolbar.clickTool(newMode); - } - - if (this.isMode('lock') && !this.dragging) { - this._enableDragging(); - } - - this._mode = newMode; - - if (this.isMode('lock')) { - this._disableDragging(); - } - - this._updateHandle(); - - this._refresh(); - - if (eP && eP.isCollected(ov)) { - ov.deselect(); - } - - return this; - }, - - /** - * need to attach a stop to img dblclick or it will propagate to - * the map and fire the handler that shows map location labels on map dblclick. - */ - nextMode: function nextMode(e) { - var mode = this.getMode(); - var eP = this.parentGroup; - var modesArray = Object.keys(this.getModes()); - var idx = modesArray.indexOf(mode); - var nextIdx = (idx + 1) % modesArray.length; - var newMode = modesArray[nextIdx]; - - if (e) { - if (eP && eP.anyCollected()) { - return; - } - - L.DomEvent.stop(e); - } - - return this.setMode(newMode); - } -}); - -L.distortableImage.edit = function (overlay, options) { - return new L.DistortableImage.Edit(overlay, options); -}; - -/***/ }), - -/***/ "./src/edit/actions/BorderAction.js": -/*!******************************************!*\ - !*** ./src/edit/actions/BorderAction.js ***! - \******************************************/ -/***/ (function() { - -L.BorderAction = L.EditAction.extend({ - initialize: function initialize(map, overlay, options) { - var edit = overlay.editing; - var mode = edit._mode; - var use; - var tooltip; - - if (edit._outlined) { - use = 'border_outer'; - tooltip = overlay.options.translation.removeBorder; - } else { - use = 'border_clear'; - tooltip = overlay.options.translation.addBorder; - } - - options = options || {}; - options.toolbarIcon = { - svg: true, - html: use, - tooltip: tooltip, - className: mode === 'lock' ? 'disabled' : '' - }; // conditional for disabling keybindings for this action when the image is locked. - - L.DistortableImage.action_map.b = mode === 'lock' ? '' : '_toggleBorder'; - L.EditAction.prototype.initialize.call(this, map, overlay, options); - }, - addHooks: function addHooks() { - var edit = this._overlay.editing; - L.IconUtil.toggleXlink(this._link, 'border_clear', 'border_outer'); - L.IconUtil.toggleTitle(this._link, 'Remove Border', 'Add Border'); - - edit._toggleBorder(); - } -}); - -/***/ }), - -/***/ "./src/edit/actions/DeleteAction.js": -/*!******************************************!*\ - !*** ./src/edit/actions/DeleteAction.js ***! - \******************************************/ -/***/ (function() { - -L.DeleteAction = L.EditAction.extend({ - initialize: function initialize(map, overlay, options) { - var edit = overlay.editing; - var use = 'delete_forever'; - var tooltip; - /** - * we can tell whether the overlay is an instance of `L.DistortableImageOverlay` or `L.DistortableCollection` bc only - * the former should have `parentGroup` defined on it. From there we call the apporpriate keybindings and methods. - */ - - if (edit instanceof L.DistortableImage.Edit) { - tooltip = overlay.options.translation.deleteImage; // backspace windows / delete mac - - L.DistortableImage.action_map.Backspace = edit._mode === 'lock' ? '' : '_removeOverlay'; - } else { - tooltip = overlay.options.translation.deleteImages; - L.DistortableImage.group_action_map.Backspace = edit._mode === 'lock' ? '' : '_removeGroup'; - } - - options = options || {}; - options.toolbarIcon = { - svg: true, - html: use, - tooltip: tooltip, - className: edit._mode === 'lock' ? 'disabled' : '' - }; - L.EditAction.prototype.initialize.call(this, map, overlay, options); - }, - addHooks: function addHooks() { - var edit = this._overlay.editing; - - if (edit instanceof L.DistortableImage.Edit) { - edit._removeOverlay(); - } else { - edit._removeGroup(); - } - } -}); - -/***/ }), - -/***/ "./src/edit/actions/DistortAction.js": -/*!*******************************************!*\ - !*** ./src/edit/actions/DistortAction.js ***! - \*******************************************/ -/***/ (function() { - -L.DistortAction = L.EditAction.extend({ - initialize: function initialize(map, overlay, options) { - options = options || {}; - options.toolbarIcon = { - svg: true, - html: 'distort', - tooltip: overlay.options.translation.distortImage, - className: 'distort' - }; - L.DistortableImage.action_map.d = '_distortMode'; - L.EditAction.prototype.initialize.call(this, map, overlay, options); - }, - addHooks: function addHooks() { - var edit = this._overlay.editing; - - edit._distortMode(); - } -}); - -/***/ }), - -/***/ "./src/edit/actions/DragAction.js": -/*!****************************************!*\ - !*** ./src/edit/actions/DragAction.js ***! - \****************************************/ -/***/ (function() { - -L.DragAction = L.EditAction.extend({ - initialize: function initialize(map, overlay, options) { - options = options || {}; - options.toolbarIcon = { - svg: true, - html: 'drag', - tooltip: overlay.options.translation.dragImage, - className: 'drag' - }; - L.DistortableImage.action_map.D = '_dragMode'; - L.EditAction.prototype.initialize.call(this, map, overlay, options); - }, - addHooks: function addHooks() { - var edit = this._overlay.editing; - - edit._dragMode(); - } -}); - -/***/ }), - -/***/ "./src/edit/actions/EditAction.js": -/*!****************************************!*\ - !*** ./src/edit/actions/EditAction.js ***! - \****************************************/ -/***/ (function() { - -L.DistortableImage = L.DistortableImage || {}; -L.distortableImage = L.DistortableImage; -L.DistortableImage.action_map = {}; -L.EditAction = L.Toolbar2.Action.extend({ - options: { - toolbarIcon: { - svg: false, - html: '', - className: '', - tooltip: '' - } - }, - initialize: function initialize(map, overlay, options) { - this._overlay = overlay; - this._map = map; - L.setOptions(this, options); - L.Toolbar2.Action.prototype.initialize.call(this, options); - - this._injectIconSet(); - }, - _createIcon: function _createIcon(toolbar, container, args) { - var _this = this; - - var iconOptions = this.options.toolbarIcon; - var className = iconOptions.className; - var edit = this._overlay.editing; - this.toolbar = toolbar; - this._icon = L.DomUtil.create('li', '', container); - this._link = L.DomUtil.create('a', '', this._icon); - - if (iconOptions.svg) { - this._link.innerHTML = L.IconUtil.create(iconOptions.html); - } else { - this._link.innerHTML = iconOptions.html; - } - - this._link.setAttribute('href', '#'); - - this._link.setAttribute('title', iconOptions.tooltip); - - this._link.setAttribute('role', 'button'); - - L.DomUtil.addClass(this._link, this.constructor.baseClass); - - if (className) { - L.DomUtil.addClass(this._link, className); - - if (className === 'disabled') { - L.DomUtil.addClass(this._icon, className); - } - - if (className === edit._mode) { - L.DomUtil.addClass(this._link, 'selected-mode'); - } else { - L.DomUtil.removeClass(this._link, 'selected-mode'); - } - } - - L.DomEvent.on(this._link, 'click', this.enable, this); - L.DomEvent.on(this._overlay, 'update', function () { - var match = _this._link.innerHTML.match(/xlink:href="#restore"/); - - if (match && match.length === 1) { - _this._enableAction(); - } - }); - /* Add secondary toolbar */ - - this._addSubToolbar(toolbar, this._icon, args); - }, - _injectIconSet: function _injectIconSet() { - if (document.querySelector('#iconset')) { - return; - } - - var el = document.createElement('div'); - el.id = 'iconset'; - el.setAttribute('hidden', 'hidden'); - el.innerHTML = new L.ToolbarIconSet().render(); - document.querySelector('.leaflet-marker-pane').appendChild(el); - }, - _enableAction: function _enableAction() { - L.DomUtil.removeClass(this._link.parentElement, 'disabled'); - L.DomUtil.removeClass(this._link, 'disabled'); - }, - _disableAction: function _disableAction() { - L.DomUtil.addClass(this._link.parentElement, 'disabled'); - L.DomUtil.addClass(this._link, 'disabled'); - } -}); - -L.editAction = function (map, overlay, options) { - return new L.EditAction(map, overlay, options); -}; - -/***/ }), - -/***/ "./src/edit/actions/ExportAction.js": -/*!******************************************!*\ - !*** ./src/edit/actions/ExportAction.js ***! - \******************************************/ -/***/ (function() { - -L.ExportAction = L.EditAction.extend({ - // This function is executed every time we select an image - initialize: function initialize(map, overlay, options) { - var edit = overlay.editing; - var tooltip; - this.isExporting = false; - this.mouseLeaveSkip = true; - this.isHooksExecuted = false; - - if (edit instanceof L.DistortableImage.Edit) { - L.DistortableImage.action_map.e = '_getExport'; - tooltip = overlay.options.translation.exportImage; - } else { - L.DistortableImage.group_action_map.e = 'runExporter'; - tooltip = overlay.options.translation.exportImages; - } - - options = options || {}; - options.toolbarIcon = { - svg: true, - html: 'get_app', - tooltip: tooltip - }; - L.EditAction.prototype.initialize.call(this, map, overlay, options); - }, - addHooks: function addHooks() { - var edit = this._overlay.editing; - - if (edit instanceof L.DistortableImage.Edit) { - edit._getExport(); - - return; - } // Make sure that addHooks is executed only once, event listeners will handle the rest - - - if (this.isHooksExecuted) { - return; - } else { - this.isHooksExecuted = true; - } - - var exportTool = this._link.parentElement; - this.mouseEnterHandler = this.handleMouseEnter.bind(this); - this.mouseLeaveHandler = this.handleMouseLeave.bind(this); - L.DomEvent.on(exportTool, 'click', function () { - if (!this.isExporting) { - this.isExporting = true; - this.renderExportIcon(); - setTimeout(this.attachMouseEventListeners.bind(this, exportTool), 100); - edit.runExporter().then(function () { - this.resetState(); - this.detachMouseEventListeners(exportTool); - }.bind(this)); - } else { - // Clicking on the export icon after export has started will be ignored - if (this.mouseLeaveSkip) { - return; - } - - this.resetState(); - this.detachMouseEventListeners(exportTool); - edit.cancelExport(); - } - }, this); - }, - resetState: function resetState() { - this.renderDownloadIcon(); - this.isExporting = false; - this.mouseLeaveSkip = true; - }, - attachMouseEventListeners: function attachMouseEventListeners(element) { - element.addEventListener('mouseenter', this.mouseEnterHandler); - element.addEventListener('mouseleave', this.mouseLeaveHandler); - }, - detachMouseEventListeners: function detachMouseEventListeners(element) { - element.removeEventListener('mouseenter', this.mouseEnterHandler); - element.removeEventListener('mouseleave', this.mouseLeaveHandler); - }, - handleMouseEnter: function handleMouseEnter() { - this.renderCancelIcon(); - }, - handleMouseLeave: function handleMouseLeave() { - if (this.mouseLeaveSkip) { - this.mouseLeaveSkip = false; - } else { - this.renderExportIcon(); - } - }, - renderDownloadIcon: function renderDownloadIcon() { - L.IconUtil.toggleXlink(this._link, 'get_app', 'spinner'); - L.IconUtil.toggleTitle(this._link, 'Export Images', 'Loading...'); - L.DomUtil.removeClass(this._link.firstChild, 'loader'); - }, - renderExportIcon: function renderExportIcon() { - L.IconUtil.toggleXlink(this._link, 'spinner'); - L.IconUtil.toggleTitle(this._link, 'Export Images', 'Loading...'); - L.IconUtil.addClassToSvg(this._link, 'loader'); - }, - renderCancelIcon: function renderCancelIcon() { - L.IconUtil.toggleXlink(this._link, 'cancel'); - L.IconUtil.toggleTitle(this._link, 'Cancel Export', 'Loading...'); - L.DomUtil.removeClass(this._link.firstChild, 'loader'); - } -}); - -/***/ }), - -/***/ "./src/edit/actions/FreeRotateAction.js": -/*!**********************************************!*\ - !*** ./src/edit/actions/FreeRotateAction.js ***! - \**********************************************/ -/***/ (function() { - -L.FreeRotateAction = L.EditAction.extend({ - initialize: function initialize(map, overlay, options) { - options = options || {}; - options.toolbarIcon = { - svg: true, - html: 'crop_rotate', - tooltip: overlay.options.translation.freeRotateImage, - className: 'freeRotate' - }; - L.DistortableImage.action_map.f = '_freeRotateMode'; - L.EditAction.prototype.initialize.call(this, map, overlay, options); - }, - addHooks: function addHooks() { - var edit = this._overlay.editing; - - edit._freeRotateMode(); - } -}); - -/***/ }), - -/***/ "./src/edit/actions/GeolocateAction.js": -/*!*********************************************!*\ - !*** ./src/edit/actions/GeolocateAction.js ***! - \*********************************************/ -/***/ (function() { - -L.GeolocateAction = L.EditAction.extend({ - initialize: function initialize(map, overlay, options) { - var edit = overlay.editing; - options = options || {}; - options.toolbarIcon = { - svg: true, - html: 'explore', - tooltip: overlay.options.translation.geolocateImage, - className: edit._mode === 'lock' ? 'disabled' : '' - }; - L.EditAction.prototype.initialize.call(this, map, overlay, options); - }, - addHooks: function addHooks() { - var image = this._overlay.getElement(); - - EXIF.getData(image, L.EXIF(image)); - } -}); - -/***/ }), - -/***/ "./src/edit/actions/LockAction.js": -/*!****************************************!*\ - !*** ./src/edit/actions/LockAction.js ***! - \****************************************/ -/***/ (function() { - -L.LockAction = L.EditAction.extend({ - initialize: function initialize(map, overlay, options) { - var edit = overlay.editing; - var use; - var tooltip; - - if (edit instanceof L.DistortableImage.Edit) { - L.DistortableImage.action_map.u = '_unlock'; - L.DistortableImage.action_map.l = '_lock'; - tooltip = overlay.options.translation.lockMode; - use = edit.isMode('lock') ? 'lock' : 'unlock'; - } else { - L.DistortableImage.group_action_map.l = '_lockGroup'; - tooltip = overlay.options.translation.lockImages; - use = 'lock'; - } - - options = options || {}; - options.toolbarIcon = { - svg: true, - html: use, - tooltip: tooltip, - className: 'lock' - }; - L.EditAction.prototype.initialize.call(this, map, overlay, options); - }, - addHooks: function addHooks() { - var edit = this._overlay.editing; - - if (edit instanceof L.DistortableImage.Edit) { - edit._toggleLockMode(); - } else { - edit._lockGroup(); - } - } -}); - -/***/ }), - -/***/ "./src/edit/actions/OpacityAction.js": -/*!*******************************************!*\ - !*** ./src/edit/actions/OpacityAction.js ***! - \*******************************************/ -/***/ (function() { - -L.OpacityAction = L.EditAction.extend({ - initialize: function initialize(map, overlay, options) { - var edit = overlay.editing; - var mode = edit._mode; - var use; - var tooltip; - - if (edit._transparent) { - use = 'opacity_empty'; - tooltip = overlay.options.translation.makeImageOpaque; - } else { - use = 'opacity'; - tooltip = overlay.options.translation.makeImageTransparent; - } - - options = options || {}; - options.toolbarIcon = { - svg: true, - html: use, - tooltip: tooltip, - className: mode === 'lock' ? 'disabled' : '' - }; - L.DistortableImage.action_map.o = mode === 'lock' ? '' : '_toggleOpacity'; - L.EditAction.prototype.initialize.call(this, map, overlay, options); - }, - addHooks: function addHooks() { - var edit = this._overlay.editing; - var link = this._link; - L.IconUtil.toggleXlink(link, 'opacity', 'opacity_empty'); - L.IconUtil.toggleTitle(link, 'Make Image Transparent', 'Make Image Opaque'); - - edit._toggleOpacity(); - } -}); - -/***/ }), - -/***/ "./src/edit/actions/RestoreAction.js": -/*!*******************************************!*\ - !*** ./src/edit/actions/RestoreAction.js ***! - \*******************************************/ -/***/ (function() { - -L.RestoreAction = L.EditAction.extend({ - initialize: function initialize(map, overlay, options) { - var mode = L.Utils.getNestedVal(overlay, 'editing', '_mode'); - var edited = overlay.edited; - options = options || {}; - options.toolbarIcon = { - svg: true, - html: 'restore', - tooltip: overlay.options.translation.restoreImage, - className: edited && mode !== 'lock' ? '' : 'disabled' - }; - L.EditAction.prototype.initialize.call(this, map, overlay, options); - }, - addHooks: function addHooks() { - var ov = this._overlay; - L.DomEvent.on(ov, { - edit: this._enableAction, - restore: this._disableAction - }, this); - ov.restore(); - } -}); - -/***/ }), - -/***/ "./src/edit/actions/RotateAction.js": -/*!******************************************!*\ - !*** ./src/edit/actions/RotateAction.js ***! - \******************************************/ -/***/ (function() { - -L.RotateAction = L.EditAction.extend({ - initialize: function initialize(map, overlay, options) { - options = options || {}; - options.toolbarIcon = { - svg: true, - html: 'rotate', - tooltip: overlay.options.translation.rotateImage, - className: 'rotate' - }; - L.DistortableImage.action_map.r = '_rotateMode'; - L.EditAction.prototype.initialize.call(this, map, overlay, options); - }, - addHooks: function addHooks() { - var edit = this._overlay.editing; - - edit._rotateMode(); - } -}); - -/***/ }), - -/***/ "./src/edit/actions/ScaleAction.js": -/*!*****************************************!*\ - !*** ./src/edit/actions/ScaleAction.js ***! - \*****************************************/ -/***/ (function() { - -L.ScaleAction = L.EditAction.extend({ - initialize: function initialize(map, overlay, options) { - options = options || {}; - options.toolbarIcon = { - svg: true, - html: 'scale', - tooltip: overlay.options.translation.scaleImage, - className: 'scale' - }; - L.DistortableImage.action_map.s = '_scaleMode'; - L.EditAction.prototype.initialize.call(this, map, overlay, options); - }, - addHooks: function addHooks() { - var edit = this._overlay.editing; - - edit._scaleMode(); - } -}); - -/***/ }), - -/***/ "./src/edit/actions/StackAction.js": -/*!*****************************************!*\ - !*** ./src/edit/actions/StackAction.js ***! - \*****************************************/ -/***/ (function() { - -L.StackAction = L.EditAction.extend({ - initialize: function initialize(map, overlay, options) { - var edit = overlay.editing; - var use; - var tooltip; - - if (edit._toggledImage) { - use = 'flip_to_back'; - tooltip = overlay.options.translation.stackToFront; - } else { - use = 'flip_to_front'; - tooltip = overlay.options.translation.stackToBack; - } - - options = options || {}; - options.toolbarIcon = { - svg: true, - html: use, - tooltip: tooltip, - className: edit._mode === 'lock' ? 'disabled' : '' - }; - L.DistortableImage.action_map.q = edit._mode === 'lock' ? '' : '_stackUp'; - L.DistortableImage.action_map.a = edit._mode === 'lock' ? '' : '_stackDown'; - L.EditAction.prototype.initialize.call(this, map, overlay, options); - }, - addHooks: function addHooks() { - var edit = this._overlay.editing; - L.IconUtil.toggleXlink(this._link, 'flip_to_front', 'flip_to_back'); - L.IconUtil.toggleTitle(this._link, 'Stack to Front', 'Stack to Back'); - - edit._toggleOrder(); - } -}); - -/***/ }), - -/***/ "./src/edit/actions/UnlockAction.js": -/*!******************************************!*\ - !*** ./src/edit/actions/UnlockAction.js ***! - \******************************************/ -/***/ (function() { - -L.UnlockAction = L.EditAction.extend({ - initialize: function initialize(map, overlay, options) { - options = options || {}; - options.toolbarIcon = { - svg: true, - html: 'unlock', - tooltip: overlay.options.translation.unlockImages - }; - L.DistortableImage.group_action_map.u = '_unlockGroup'; - L.EditAction.prototype.initialize.call(this, map, overlay, options); - }, - addHooks: function addHooks() { - var edit = this._overlay.editing; - - edit._unlockGroup(); - } -}); - -/***/ }), - -/***/ "./src/edit/getEXIFdata.js": -/*!*********************************!*\ - !*** ./src/edit/getEXIFdata.js ***! - \*********************************/ -/***/ (function() { - -/* eslint-disable no-unused-vars */ -L.EXIF = function getEXIFdata(img) { - if (Object.keys(EXIF.getAllTags(img)).length !== 0) { - console.log(EXIF.getAllTags(img)); - var GPS = EXIF.getAllTags(img); - var altitude; - /* If the lat/lng is available. */ - - if (typeof GPS.GPSLatitude !== 'undefined' && typeof GPS.GPSLongitude !== 'undefined') { - // sadly, encoded in [degrees,minutes,seconds] - // primitive value = GPS.GPSLatitude[x].numerator - var lat = GPS.GPSLatitude[0] + GPS.GPSLatitude[1] / 60 + GPS.GPSLatitude[2] / 3600; - var lng = GPS.GPSLongitude[0] + GPS.GPSLongitude[1] / 60 + GPS.GPSLongitude[2] / 3600; - - if (GPS.GPSLatitudeRef !== 'N') { - lat = lat * -1; - } - - if (GPS.GPSLongitudeRef === 'W') { - lng = lng * -1; - } - } // Attempt to use GPS compass heading; will require - // some trig to calc corner points, which you can find below: - - - var angle = 0; // "T" refers to "True north", so -90. - - if (GPS.GPSImgDirectionRef === 'T') { - angle = Math.PI / 180 * (GPS.GPSImgDirection.numerator / GPS.GPSImgDirection.denominator - 90); // "M" refers to "Magnetic north" - } else if (GPS.GPSImgDirectionRef === 'M') { - angle = Math.PI / 180 * (GPS.GPSImgDirection.numerator / GPS.GPSImgDirection.denominator - 90); - } else { - console.log('No compass data found'); - } - - console.log('Orientation:', GPS.Orientation); - /* If there is orientation data -- i.e. landscape/portrait etc */ - - if (GPS.Orientation === 6) { - // CCW - angle += Math.PI / 180 * -90; - } else if (GPS.Orientation === 8) { - // CW - angle += Math.PI / 180 * 90; - } else if (GPS.Orientation === 3) { - // 180 - angle += Math.PI / 180 * 180; - } - /* If there is altitude data */ - - - if (typeof GPS.GPSAltitude !== 'undefined' && typeof GPS.GPSAltitudeRef !== 'undefined') { - // Attempt to use GPS altitude: - // (may eventually need to find EXIF field of view for correction) - if (typeof GPS.GPSAltitude !== 'undefined' && typeof GPS.GPSAltitudeRef !== 'undefined') { - altitude = GPS.GPSAltitude.numerator / GPS.GPSAltitude.denominator + GPS.GPSAltitudeRef; - } else { - altitude = 0; // none - } - } - } else { - alert('EXIF initialized. Press again to view data in console.'); - } -}; - -/***/ }), - -/***/ "./src/edit/handles/DistortHandle.js": -/*!*******************************************!*\ - !*** ./src/edit/handles/DistortHandle.js ***! - \*******************************************/ -/***/ (function() { - -L.DistortHandle = L.EditHandle.extend({ - options: { - TYPE: 'distort', - icon: L.icon({ - iconUrl: // eslint-disable-next-line max-len - 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAChSURBVO3BIU4DURgGwNkvL2B6AkQTLBqP4QCoSm7DDXoBLBZHDbfgICAIZjEV3YTn9uVHdMZZtcnCfI13bIzxg0emg6Nm6QVbYz3jylEsXRrvwommb49X67jFkz80fR9Mb1YxTzqiWBSLYlEsikWxKBbFolgUi2JRLIpFsSgWxaJY03fHHOu40dH07bAzWCx9Ge/TiWbpHgdsjPGNB2f/yS+7xRCyiiZPJQAAAABJRU5ErkJggg==', - iconSize: [32, 32], - iconAnchor: [16, 16] - }) - }, - _onHandleDrag: function _onHandleDrag() { - var overlay = this._handled; - overlay.setCorner(this._corner, this.getLatLng()); - }, - updateHandle: function updateHandle() { - this.setLatLng(this._handled.getCorner(this._corner)); - } -}); - -L.distortHandle = function (overlay, idx, options) { - return new L.DistortHandle(overlay, idx, options); -}; - -/***/ }), - -/***/ "./src/edit/handles/DragHandle.js": -/*!****************************************!*\ - !*** ./src/edit/handles/DragHandle.js ***! - \****************************************/ -/***/ (function() { - -L.DragHandle = L.EditHandle.extend({ - options: { - TYPE: 'drag', - icon: L.icon({ - // eslint-disable-next-line max-len - iconUrl: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAsVJREFUeNrMVztLXEEUvnNVFAVBAhY2aRKbTZEHJNpYabuNjSgYg/GxdsmPSJkUAa/ZdVEX8mgWYVutbHxAHkVskjQBuUUgBISVhCQk3wnfwMlk1rusN1wHPubOzJlzvjlz5sxc01Ma/hUEwQnwDIjqc7uvgv9YYO86qgIwCXQbdNTlQ8kcCBHgBch8TcloF6oJGr6phk6EQAkfdz3zvgDr9Mr7Fg1fptEZoM8jsmrokpfsiIFO4IIjuE2v1EDmR4LRdlR5Gh51hj8D34ABtm8YTtqna0TgklIw5CgQguKxIojEjmFROg/MKQO27NkFAB+4wAPouGUJiIvWKHwbAxX2XyWRKWkqhT+pbJntJZJuUzISW0+5hW+obxrVBsfvoH/dqCCJuU97GBh2VteLSiYvArmErT8EVoAK9Bw7enbpVYmvAQlyowYforrH5jXL2rPHI/TKONDB7u9AlavdaTBPvPmazUeQuy8f7UomUgTEwIJPEQ3sQGE/6ll2l9H/KcEzBcfWn2IclluM3DpddJxSHujlFkscbUPvmB0LHVnLrId7nlaZVkEc6QGXQI1MAwZcWmVRHeNaQwJMMiU2cwy4s7p/RJ2ckpvIQs+cIs+5GzitloLKHUV3MPREuXbTOKO91dX387gGTONxIgEWm+E61FFrpcyqXLHsEwiDjEsjAksqw5XPoL9MHVrn6QR4q+XZrDaR4RoWzq2ymafuRA/Mq1stSsHLVkcbdf9VjOcx8ZH3+SFWcCWlVPyWuUBOwUWdC1wP5NVjYiXFWLO69PZ6CRTUY6KSIoEKdf6T3IzzgHxnsyHctNBEkmn6Oob8ExUDg/ahGybd177cDjzH5xHwgDiSvoS7I/LZyvxJZj0wod7tkX5G0XVC7rEyLhfLJjBGbKoLLEfZWObyKeZ6oY82g+yf5Zn/mJyHX7PMf04z/T3/LcAAu4E6iiyJqf0AAAAASUVORK5CYII=', - iconSize: [32, 32], - iconAnchor: [16, 16] - }) - }, - _onHandleDrag: function _onHandleDrag() { - var overlay = this._handled; - var formerLatLng = overlay.getCorner(this._corner); - var newLatLng = this.getLatLng(); - overlay.dragBy(formerLatLng, newLatLng); - }, - updateHandle: function updateHandle() { - this.setLatLng(this._handled.getCorner(this._corner)); - } -}); - -L.dragHandle = function (overlay, idx, options) { - return new L.DragHandle(overlay, idx, options); -}; - -/***/ }), - -/***/ "./src/edit/handles/EditHandle.js": -/*!****************************************!*\ - !*** ./src/edit/handles/EditHandle.js ***! - \****************************************/ -/***/ (function() { - -L.EditHandle = L.Marker.extend({ - initialize: function initialize(overlay, corner, options) { - var latlng = overlay.getCorner(corner); - L.setOptions(this, options); - this._handled = overlay; - this._corner = corner; - var markerOptions = { - draggable: true, - zIndexOffset: 10 - }; - - if (options && options.hasOwnProperty('draggable')) { - markerOptions.draggable = options.draggable; - } - - L.Marker.prototype.initialize.call(this, latlng, markerOptions); - }, - onAdd: function onAdd(map) { - L.Marker.prototype.onAdd.call(this, map); - - this._bindListeners(); - - this.updateHandle(); - }, - onRemove: function onRemove(map) { - this._unbindListeners(); - - L.Marker.prototype.onRemove.call(this, map); - }, - _onHandleDragStart: function _onHandleDragStart() { - this._handled.fire('editstart'); - }, - _onHandleDragEnd: function _onHandleDragEnd() { - this._fireEdit(); - }, - _fireEdit: function _fireEdit() { - this._handled.edited = true; - - this._handled.fire('edit'); - }, - _bindListeners: function _bindListeners() { - this.on({ - contextmenu: L.DomEvent.stop, - dragstart: this._onHandleDragStart, - drag: this._onHandleDrag, - dragend: this._onHandleDragEnd - }, this); - - this._handled._map.on('zoomend', this.updateHandle, this); - - this._handled.on('update', this.updateHandle, this); - }, - _unbindListeners: function _unbindListeners() { - this.off({ - contextmenu: L.DomEvent.stop, - dragstart: this._onHandleDragStart, - drag: this._onHandleDrag, - dragend: this._onHandleDragEnd - }, this); - - this._handled._map.off('zoomend', this.updateHandle, this); - - this._handled.off('update', this.updateHandle, this); - }, - - /* Takes two latlngs and calculates the scaling difference. */ - _calculateScalingFactor: function _calculateScalingFactor(latlngA, latlngB) { - var overlay = this._handled; - var map = overlay._map; - var centerPoint = map.latLngToLayerPoint(overlay.getCenter()); - var formerPoint = map.latLngToLayerPoint(latlngA); - var newPoint = map.latLngToLayerPoint(latlngB); - - var formerRadiusSquared = this._d2(centerPoint, formerPoint); - - var newRadiusSquared = this._d2(centerPoint, newPoint); - - return Math.sqrt(newRadiusSquared / formerRadiusSquared); - }, - - /* Distance between two points in cartesian space, squared (distance formula). */ - _d2: function _d2(a, b) { - var dx = a.x - b.x; - var dy = a.y - b.y; - return Math.pow(dx, 2) + Math.pow(dy, 2); - }, - - /* Takes two latlngs and calculates the angle between them. */ - calculateAngleDelta: function calculateAngleDelta(latlngA, latlngB) { - var overlay = this._handled; - var map = overlay._map; - var centerPoint = map.latLngToLayerPoint(overlay.getCenter()); - var formerPoint = map.latLngToLayerPoint(latlngA); - var newPoint = map.latLngToLayerPoint(latlngB); - var initialAngle = Math.atan2(centerPoint.y - formerPoint.y, centerPoint.x - formerPoint.x); - var newAngle = Math.atan2(centerPoint.y - newPoint.y, centerPoint.x - newPoint.x); - return newAngle - initialAngle; - } -}); - -/***/ }), - -/***/ "./src/edit/handles/FreeRotateHandle.js": -/*!**********************************************!*\ - !*** ./src/edit/handles/FreeRotateHandle.js ***! - \**********************************************/ -/***/ (function() { - -L.FreeRotateHandle = L.EditHandle.extend({ - options: { - TYPE: 'freeRotate', - icon: L.icon({ - iconUrl: // eslint-disable-next-line max-len - 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAHiSURBVMXBa3HbShgA0PMp/1sCCo8oCEpgTaCXgIXAJiDzyCJoAUTm4UVQAns1Y8+snWnTvJyeE16hkjDgDrfoNTMKcpC9UPiLSo8JyetkjEHxjPCMyoS199kFoz8Iv1HpMaN3qWDCHoegOKkkRwnJpRmroHgiPFEZ8IBekzEGxQtUEhKSS/fB7Ew4U+lxcGkVZG9QWWPSFAxBcdK59KApuA+yNwp2uEdx1GN25sZJZULSfAtm77SlbNjju6MvG75u+WHRWVR6rDVjMPsgwYyVZl3pLTpHkyYHOx8syMiayaJzlDTZ9YyaZNFVkiYH2ZUEBcVJJXVImuz6Js3Qofe59pq7DoOTILu+g+a288mCouk7/1iH4qTS+2QdDppbV1ZJmrnDXnPnc5UOs2Z0fUmTuyBr+krvSioJyUmQO0dZM7mepMkWnaNRkyrJB6uskTSjxY3Fll8bvmJwlDb83FJ8gMqAB80uyBY3Trb82PAfvjj6vuHnluIdKgMeNXOwctK5NKBoHitrb1RJeHRp5Ux4ojLg0aWMHGQvUOkxIWkKVsHsTPiNSo8HDC5lZIsgO6n0uMUdRvQuFQxB8UR4RmXC2vvsgtEfhL+o9JiQvE7GGBTPCK9QSUjoMWgKDthjDrIX+h/k0I7gth6N5gAAAABJRU5ErkJggg==', - iconSize: [32, 32], - iconAnchor: [16, 16] - }) - }, - _onHandleDrag: function _onHandleDrag() { - var overlay = this._handled; - var map = overlay._map; - var formerLatLng = overlay.getCorner(this._corner); - var newLatLng = this.getLatLng(); - var angle = this.calculateAngleDelta(formerLatLng, newLatLng); - - var scale = this._calculateScalingFactor(formerLatLng, newLatLng); - - if (angle !== 0) { - overlay.rotateBy(angle, 'rad'); - } - - var edgeMinWidth = overlay.edgeMinWidth; - - if (!edgeMinWidth) { - edgeMinWidth = 50; - } - /* just in case */ - - - var corner1 = map.latLngToContainerPoint(overlay.getCorner(0)); - var corner2 = map.latLngToContainerPoint(overlay.getCorner(1)); - var w = Math.abs(corner1.x - corner2.x); - var h = Math.abs(corner1.y - corner2.y); - var distance = Math.sqrt(w * w + h * h); - - if (distance > edgeMinWidth || scale > 1) { - overlay.scaleBy(scale); - } else { - overlay.scaleBy(1); - } - }, - updateHandle: function updateHandle() { - this.setLatLng(this._handled.getCorner(this._corner)); - } -}); - -L.freeRotateHandle = function (overlay, idx, options) { - return new L.FreeRotateHandle(overlay, idx, options); -}; - -/***/ }), - -/***/ "./src/edit/handles/LockHandle.js": -/*!****************************************!*\ - !*** ./src/edit/handles/LockHandle.js ***! - \****************************************/ -/***/ (function() { - -L.LockHandle = L.EditHandle.extend({ - options: { - TYPE: 'lock', - interactive: false, - icon: L.icon({ - // eslint-disable-next-line max-len - iconUrl: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAD8SURBVO3BPU7CYAAA0AdfjIcQlRCQBG7C3gk2uIPG2RC3Dk16Gz0FTO1WZs/gwGCMP/2+xsSl7+n1er1Iz9LtRQjaPeMeO+TinLDCJV78YqjdA04YodKuxhUaPGoRxMmxwRQZSt87Yo4KExGCeAUyLLFB4bMacxywEClIU2KDKXbInTUYo8JCgoFuGoxQO5uiwY1EA91VmDqrcKeDoX8WdNNgjApvmGGLXKIgXY0xGkxQYItrrFFIEKQ5Yo4KEx9yrDFDhlKkIF6NOQ5Y+KpAhiXWKEQI4pxwiwoLPyuxwQw75FoE7fZYocFEuwI7jHCBV39gL92TXq/Xi/AOcmczZmaIMScAAAAASUVORK5CYII=', - iconSize: [32, 32], - iconAnchor: [16, 16] - }) - }, - onRemove: function onRemove(map) { - this.unbindTooltip(); - L.EditHandle.prototype.onRemove.call(this, map); - }, - _bindListeners: function _bindListeners() { - var icon = this.getElement(); - - L.EditHandle.prototype._bindListeners.call(this); - - L.DomEvent.on(icon, { - mousedown: this._tooltipOn, - mouseup: this._tooltipOff - }, this); - L.DomEvent.on(document, 'pointerleave', this._tooltipOff, this); - }, - _unbindListeners: function _unbindListeners() { - var icon = this.getElement(); - - L.EditHandle.prototype._bindListeners.call(this); - - L.DomEvent.off(icon, { - mousedown: this._tooltipOn, - mouseup: this._tooltipOff - }, this); - L.DomEvent.off(document, 'pointerleave', this._tooltipOff, this); - }, - - /* cannot be dragged */ - _onHandleDrag: function _onHandleDrag() {}, - updateHandle: function updateHandle() { - this.setLatLng(this._handled.getCorner(this._corner)); - }, - _tooltipOn: function _tooltipOn(e) { - var eP = this._handled.parentGroup; - var edit = eP ? eP.editing : this._handled.editing; - - if (e.shiftKey) { - return; - } - - if (!this._handled.isSelected() && eP && !eP.isCollected(this._handled)) { - return; - } - - var handlesArr = edit._lockHandles; - this._timer = setTimeout(L.bind(function () { - if (this._timeout) { - clearTimeout(this._timeout); - } - - if (!this.getTooltip()) { - this.bindTooltip('Locked!', { - permanent: true - }); - } else { - handlesArr.eachLayer(function (handle) { - if (this !== handle) { - handle.closeTooltip(); - } - }); - } - - this.openTooltip(); - }, this), 500); - }, - _tooltipOff: function _tooltipOff(e) { - var eP = this._handled.parentGroup; - var edit = eP ? eP.editing : this._handled.editing; - - if (e.shiftKey) { - return; - } - - if (!this._handled.isSelected() && eP && !eP.isCollected(this._handled)) { - return; - } - - var handlesArr = edit._lockHandles; - - if (e.currentTarget === document) { - handlesArr.eachLayer(function (handle) { - handle.closeTooltip(); - }); - } - - if (this._timer) { - clearTimeout(this._timer); - } - - this._timeout = setTimeout(L.bind(function () { - this.closeTooltip(); - }, this), 400); - } -}); - -L.lockHandle = function (overlay, idx, options) { - return new L.LockHandle(overlay, idx, options); -}; - -/***/ }), - -/***/ "./src/edit/handles/RotateHandle.js": -/*!******************************************!*\ - !*** ./src/edit/handles/RotateHandle.js ***! - \******************************************/ -/***/ (function() { - -L.RotateHandle = L.EditHandle.extend({ - options: { - TYPE: 'rotate', - icon: L.icon({ - iconUrl: // eslint-disable-next-line max-len - 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAHiSURBVMXBa3HbShgA0PMp/1sCCo8oCEpgTaCXgIXAJiDzyCJoAUTm4UVQAns1Y8+snWnTvJyeE16hkjDgDrfoNTMKcpC9UPiLSo8JyetkjEHxjPCMyoS199kFoz8Iv1HpMaN3qWDCHoegOKkkRwnJpRmroHgiPFEZ8IBekzEGxQtUEhKSS/fB7Ew4U+lxcGkVZG9QWWPSFAxBcdK59KApuA+yNwp2uEdx1GN25sZJZULSfAtm77SlbNjju6MvG75u+WHRWVR6rDVjMPsgwYyVZl3pLTpHkyYHOx8syMiayaJzlDTZ9YyaZNFVkiYH2ZUEBcVJJXVImuz6Js3Qofe59pq7DoOTILu+g+a288mCouk7/1iH4qTS+2QdDppbV1ZJmrnDXnPnc5UOs2Z0fUmTuyBr+krvSioJyUmQO0dZM7mepMkWnaNRkyrJB6uskTSjxY3Fll8bvmJwlDb83FJ8gMqAB80uyBY3Trb82PAfvjj6vuHnluIdKgMeNXOwctK5NKBoHitrb1RJeHRp5Ux4ojLg0aWMHGQvUOkxIWkKVsHsTPiNSo8HDC5lZIsgO6n0uMUdRvQuFQxB8UR4RmXC2vvsgtEfhL+o9JiQvE7GGBTPCK9QSUjoMWgKDthjDrIX+h/k0I7gth6N5gAAAABJRU5ErkJggg==', - iconSize: [32, 32], - iconAnchor: [16, 16] - }) - }, - _onHandleDrag: function _onHandleDrag() { - var overlay = this._handled; - var formerLatLng = overlay.getCorner(this._corner); - var newLatLng = this.getLatLng(); - var angle = this.calculateAngleDelta(formerLatLng, newLatLng); - /* - * running rotation logic even for an angle delta of 0 - * prevents a small, occasional marker flicker - */ - - overlay.rotateBy(angle, 'rad'); - }, - updateHandle: function updateHandle() { - this.setLatLng(this._handled.getCorner(this._corner)); - } -}); - -L.rotateHandle = function (overlay, idx, options) { - return new L.RotateHandle(overlay, idx, options); -}; - -/***/ }), - -/***/ "./src/edit/handles/ScaleHandle.js": -/*!*****************************************!*\ - !*** ./src/edit/handles/ScaleHandle.js ***! - \*****************************************/ -/***/ (function() { - -L.ScaleHandle = L.EditHandle.extend({ - options: { - TYPE: 'scale', - icon: L.icon({ - iconUrl: // eslint-disable-next-line max-len - 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2ZXJzaW9uPSIxLjEiIHdpZHRoPSI0NTkiIGhlaWdodD0iNDY0IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCA1MTIgNTEyIiB4bWw6c3BhY2U9InByZXNlcnZlIiBzdHlsZT0iIj48cmVjdCBpZD0iYmFja2dyb3VuZHJlY3QiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIHg9IjAiIHk9IjAiIGZpbGw9Im5vbmUiIHN0cm9rZT0ibm9uZSIgY2xhc3M9IiIgc3R5bGU9IiIvPjxnIGNsYXNzPSJjdXJyZW50TGF5ZXIiIHN0eWxlPSIiPjx0aXRsZT5MYXllciAxPC90aXRsZT48cGF0aCBkPSJNNDU5LjA0OTE1OTUzMDQ3MTM0LDg2LjkyNjIzNDUxMjU1MDAyIFYwIGgtODUuNzE0NTczMzU2MzEyMDkgdjI3LjA0MzcxNzQwMzkwNDQ1MiBIODUuNzE0NTczMzU2MzEyMDMgVjAgSDAgdjg2LjkyNjIzNDUxMjU1MDAyIGgyNS43MTQzNzIwMDY4OTM2MjYgdjI4OS43NTQxMTUwNDE4MzM0IEgwIHY4Ni45MjYyMzQ1MTI1NTAwMiBoODUuNzE0NTczMzU2MzEyMDkgdi0yNy4wNDM3MTc0MDM5MDQ0NTIgaDI4NS43MTUyNDQ1MjEwNDAzIHYyNy4wNDM3MTc0MDM5MDQ0NTIgaDg1LjcxNDU3MzM1NjMxMjA5IHYtODYuOTI2MjM0NTEyNTUwMDIgaC0yMy44MDk2MDM3MTAwODY2OSBWODYuOTI2MjM0NTEyNTUwMDIgSDQ1OS4wNDkxNTk1MzA0NzEzNCB6TTM4NC43NjMxOTU5NTUwMDA5LDEyLjU1NjAxMTY1MTgxMjc4MSBoNjEuOTA0OTY5NjQ2MjI1Mzk2IHY2Mi43ODAwNTgyNTkwNjM5MSBoLTYxLjkwNDk2OTY0NjIyNTM5NiBWMTIuNTU2MDExNjUxODEyNzgxIHpNMTIuMzgwOTkzOTI5MjQ1MDUsMTIuNTU2MDExNjUxODEyNzgxIGg2MS45MDQ5Njk2NDYyMjUzOTYgdjYyLjc4MDA1ODI1OTA2MzkxIEgxMi4zODA5OTM5MjkyNDUwNSBWMTIuNTU2MDExNjUxODEyNzgxIHpNNzQuMjg1OTYzNTc1NDcwNTMsNDUxLjA1MDU3MjQxNTEyMDY2IEgxMi4zODA5OTM5MjkyNDUwNSB2LTYyLjc4MDA1ODI1OTA2MzkxIGg2MS45MDQ5Njk2NDYyMjUzOTYgVjQ1MS4wNTA1NzI0MTUxMjA2NiB6TTQ0NS43MTU3ODE0NTI4MjI3NCw0NTEuMDUwNTcyNDE1MTIwNjYgaC02Mi44NTczNTM3OTQ2Mjg4NjQgdi02Mi43ODAwNTgyNTkwNjM5MSBoNjIuODU3MzUzNzk0NjI4ODY0IFY0NTEuMDUwNTcyNDE1MTIwNjYgek00MDcuNjIwNDE1NTE2Njg0MjYsMzc2LjY4MDM0OTU1NDM4MzQ0IGgtMzYuMTkwNTk3NjM5MzMxNzcgdjMyLjgzODc5OTcwNDc0MTEyIEg4NS43MTQ1NzMzNTYzMTIwMyB2LTMyLjgzODc5OTcwNDc0MTEyIEg0OS41MjM5NzU3MTY5ODAzMiBWODYuOTI2MjM0NTEyNTUwMDIgaDM2LjE5MDU5NzYzOTMzMTc3IFY1MC4yMjQwNDY2MDcyNTExMjUgaDI4Ny42MjAwMTI4MTc4NDcyIHYzNi43MDIxODc5MDUyOTg5IGgzNC4yODU4MjkzNDI1MjQ4MzUgVjM3Ni42ODAzNDk1NTQzODM0NCB6IiBpZD0ic3ZnXzIiIGNsYXNzPSIiIGZpbGw9IiMxYTFhZWIiIGZpbGwtb3BhY2l0eT0iMSIvPjwvZz48L3N2Zz4=', - iconSize: [32, 32], - iconAnchor: [16, 16] - }) - }, - _onHandleDrag: function _onHandleDrag() { - var overlay = this._handled; - var map = overlay._map; - var edgeMinWidth = overlay.edgeMinWidth; - var formerLatLng = overlay.getCorner(this._corner); - var newLatLng = this.getLatLng(); - - var scale = this._calculateScalingFactor(formerLatLng, newLatLng); - /* - * checks whether the "edgeMinWidth" property is set and tracks the minimum edge length; - * this enables preventing scaling to zero, but we might also add an overall scale limit - */ - - - if (!edgeMinWidth) { - edgeMinWidth = 50; - } - /* just in case */ - - - var corner1 = map.latLngToLayerPoint(overlay.getCorner(0)); - var corner2 = map.latLngToLayerPoint(overlay.getCorner(1)); - var w = Math.abs(corner1.x - corner2.x); - var h = Math.abs(corner1.y - corner2.y); - var distance = Math.sqrt(w * w + h * h); - - if (distance > edgeMinWidth || scale > 1) { - overlay.scaleBy(scale); - /* - * running scale logic even for a scale ratio of 1 - * prevents a small, occasional marker flicker - */ - } else { - overlay.scaleBy(1); - } - }, - updateHandle: function updateHandle() { - this.setLatLng(this._handled.getCorner(this._corner)); - } -}); - -L.scaleHandle = function (overlay, idx, options) { - return new L.ScaleHandle(overlay, idx, options); -}; - -/***/ }), - -/***/ "./src/edit/toolbars/DistortableImage.ControlBar.js": -/*!**********************************************************!*\ - !*** ./src/edit/toolbars/DistortableImage.ControlBar.js ***! - \**********************************************************/ -/***/ (function() { - -L.distortableImage = L.DistortableImage || {}; -L.distortableImage = L.DistortableImage; -L.DistortableImage.group_action_map = {}; -L.DistortableImage.ControlBar = L.Toolbar2.Control.extend({}); - -L.distortableImage.controlBar = function (options) { - return new L.DistortableImage.ControlBar(options); -}; -/** addInitHooks run before onAdd */ - - -L.DistortableCollection.addInitHook(function () { - /** Default actions */ - this.ACTIONS = [L.ExportAction, L.DeleteAction, L.LockAction, L.UnlockAction]; // all possible modes - - L.DistortableCollection.Edit.MODES = { - lock: L.LockAction, - unlock: L.UnlockAction - }; - var a = this.options.actions ? this.options.actions : this.ACTIONS; - this.editing = L.distortableCollection.edit(this, { - actions: a - }); -}); - -/***/ }), - -/***/ "./src/edit/toolbars/DistortableImage.PopupBar.js": -/*!********************************************************!*\ - !*** ./src/edit/toolbars/DistortableImage.PopupBar.js ***! - \********************************************************/ -/***/ (function() { - -L.DistortableImage = L.DistortableImage || {}; -L.distortableImage = L.DistortableImage; -L.DistortableImage.action_map = {}; -L.DistortableImage.PopupBar = L.Toolbar2.Popup.extend({ - options: { - anchor: [0, -10] - }, - initialize: function initialize(latlng, options) { - L.setOptions(this, options); - L.Toolbar2.Popup.prototype.initialize.call(this, latlng, options); - }, - addHooks: function addHooks(map, ov) { - this.map = map; - this.ov = ov; - }, - tools: function tools() { - if (this._ul) { - return this._ul.children; - } - }, - clickTool: function clickTool(name) { - var tools = this.tools(); - - for (var i = 0; i < tools.length; i++) { - var tool = tools.item(i).children[0]; - - if (L.DomUtil.hasClass(tool, name)) { - tool.click(); - return tool; - } - } - - return false; - } -}); - -L.distortableImage.popupBar = function (latlng, options) { - return new L.DistortableImage.PopupBar(latlng, options); -}; - -L.DistortableImageOverlay.addInitHook(function () { - /** Default actions */ - this.ACTIONS = [L.DragAction, L.ScaleAction, L.DistortAction, L.RotateAction, L.FreeRotateAction, L.LockAction, L.OpacityAction, L.BorderAction, L.ExportAction, L.DeleteAction]; // all possible modes - - L.DistortableImage.Edit.MODES = { - drag: L.DragAction, - scale: L.ScaleAction, - distort: L.DistortAction, - rotate: L.RotateAction, - freeRotate: L.FreeRotateAction, - lock: L.LockAction - }; - var a = this.options.actions ? this.options.actions : this.ACTIONS; - this.editing = L.distortableImage.edit(this, { - actions: a - }); -}); - -/***/ }), - -/***/ "./src/iconsets/IconSet.js": -/*!*********************************!*\ - !*** ./src/iconsets/IconSet.js ***! - \*********************************/ -/***/ (function() { - -/* this is the baseclass other IconSets inherit from, -* we don't use it directly */ -L.IconSet = L.Class.extend({ - _svg: '', - _symbols: '', - render: function render() { - this.addSymbols(this._symbols); - return this._svg; - }, - addSymbols: function addSymbols(symbols) { - this._svg += symbols; - } -}); - -/***/ }), - -/***/ "./src/iconsets/KeymapperIconSet.js": -/*!******************************************!*\ - !*** ./src/iconsets/KeymapperIconSet.js ***! - \******************************************/ -/***/ (function() { - -L.KeymapperIconSet = L.IconSet.extend({ - _symbols: // eslint-disable-next-line max-len - '' -}); - -/***/ }), - -/***/ "./src/iconsets/ToolbarIconSet.js": -/*!****************************************!*\ - !*** ./src/iconsets/ToolbarIconSet.js ***! - \****************************************/ -/***/ (function() { - -/* eslint-disable max-len */ -L.ToolbarIconSet = L.IconSet.extend({ - _symbols: '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' -}); - -/***/ }), - -/***/ "./src/mapmixins/BoxCollector.js": -/*!***************************************!*\ - !*** ./src/mapmixins/BoxCollector.js ***! - \***************************************/ -/***/ (function() { - -L.Map.mergeOptions({ - boxCollector: true, - boxZoom: false -}); -/** - * primarily Leaflet 1.5.1 source code. Overriden so that it's a collection box used with - * our `L.DistortableCollection` class instead of a zoom box. - * */ - -L.Map.BoxCollector = L.Map.BoxZoom.extend({ - initialize: function initialize(map) { - this._map = map; - this._container = map._container; - this._pane = map._panes.overlayPane; - this._resetStateTimeout = 0; - map.on('unload', this._destroy, this); - }, - addHooks: function addHooks() { - L.DomEvent.on(this._container, 'mousedown', this._onMouseDown, this); - }, - removeHooks: function removeHooks() { - L.DomEvent.off(this._container, 'mousedown', this._onMouseDown, this); - }, - moved: function moved() { - return this._moved; - }, - _destroy: function _destroy() { - L.DomUtil.remove(this._pane); - delete this._pane; - }, - _resetState: function _resetState() { - this._resetStateTimeout = 0; - this._moved = false; - }, - _clearDeferredResetState: function _clearDeferredResetState() { - if (this._resetStateTimeout !== 0) { - clearTimeout(this._resetStateTimeout); - this._resetStateTimeout = 0; - } - }, - _onMouseDown: function _onMouseDown(e) { - if (!e.shiftKey || e.which !== 1 && e.button !== 1) { - return false; - } // Clear the deferred resetState if it hasn't executed yet, otherwise it - // will interrupt the interaction and orphan a box element in the container. - - - this._clearDeferredResetState(); - - this._resetState(); - - L.DomUtil.disableTextSelection(); - L.DomUtil.disableImageDrag(); - this._startPoint = this._map.mouseEventToContainerPoint(e); - L.DomEvent.on(document, { - contextmenu: L.DomEvent.stop, - mousemove: this._onMouseMove, - mouseup: this._onMouseUp - }, this); - }, - _onMouseMove: function _onMouseMove(e) { - if (!this._moved) { - this._moved = true; - this._box = L.DomUtil.create('div', 'leaflet-zoom-box', this._container); - L.DomUtil.addClass(this._container, 'leaflet-crosshair'); - - this._map.fire('boxzoomstart'); - } - - this._point = this._map.mouseEventToContainerPoint(e); - this._bounds = L.bounds(this._startPoint, this._point); - - var size = this._bounds.getSize(); - - L.DomUtil.setPosition(this._box, this._bounds.min); - this._box.style.width = size.x + 'px'; - this._box.style.height = size.y + 'px'; - }, - _finish: function _finish() { - if (this._moved) { - L.DomUtil.remove(this._box); - L.DomUtil.removeClass(this._container, 'leaflet-crosshair'); - } - - L.DomUtil.enableTextSelection(); - L.DomUtil.enableImageDrag(); - L.DomEvent.off(document, { - contextmenu: L.DomEvent.stop, - mousemove: this._onMouseMove, - mouseup: this._onMouseUp - }, this); - }, - _onMouseUp: function _onMouseUp(e) { - if (e.which !== 1 && e.button !== 1) { - return; - } - - this._finish(); - - if (!this._moved) { - return; - } // Postpone to next JS tick so internal click event handling - // still see it as "moved". - - - this._clearDeferredResetState(); - - this._resetStateTimeout = setTimeout(L.Util.bind(this._resetState, this), 0); - var bounds = L.latLngBounds(this._map.containerPointToLatLng(this._bounds.getBottomLeft()), this._map.containerPointToLatLng(this._bounds.getTopRight())); - - var zoom = this._map.getZoom(); - - var center = this._map.getCenter(); // calls the `project` method but 1st updates the pixel origin - see https://github.com/publiclab/Leaflet.DistortableImage/pull/344 - - - bounds = this._map._latLngBoundsToNewLayerBounds(bounds, zoom, center); - - this._map.fire('boxcollectend', { - boxCollectBounds: bounds - }); - } -}); -L.Map.addInitHook('addHandler', 'boxCollector', L.Map.BoxCollector); - -/***/ }), - -/***/ "./src/mapmixins/DoubleClickLabels.js": -/*!********************************************!*\ - !*** ./src/mapmixins/DoubleClickLabels.js ***! - \********************************************/ -/***/ (function() { - -L.Map.mergeOptions({ - doubleClickLabels: true -}); -/** - * The `doubleClickLabels` handler replaces `doubleClickZoom` by default if `#addGoogleMutant` - * is used unless the options 'labels: false' or 'doubleClickZoom: false` were passed to it. - */ - -L.Map.DoubleClickLabels = L.Map.DoubleClickZoom.extend({ - enable: function enable() { - var map = this._map; - - if (this._enabled) { - return this; - } // disable 'doubleClickZoom' if 'doubleClickLabels' is enabled. - - - if (map.doubleClickZoom.enabled()) { - map.doubleClickZoom.disable(); - } - - this._map.fire('singleclickon'); - - this._enabled = true; - this.addHooks(); - return this; - }, - disable: function disable() { - if (!this._enabled) { - return this; - } - - this._enabled = false; - this.removeHooks(); - return this; - }, - _fireIfSingle: function _fireIfSingle(e) { - var map = this._map; - var oe = e.originalEvent; // prevents deselection in case of box selector - - if (oe && oe.shiftKey) { - return; - } - - map._clicked += 1; - this._map._clickTimeout = setTimeout(function () { - if (map._clicked === 1) { - map._clicked = 0; - map.fire('singleclick', { - type: 'singleclick' - }); - } else { - // manually fire doubleclick event only for touch screens that don't natively fire it - if (L.Browser.touch && oe && oe.sourceCapabilities.firesTouchEvents) { - map.fire('dblclick'); - } - } - }, 250); - }, - _onDoubleClick: function _onDoubleClick() { - var map = this._map; - var labels = map._labels; - setTimeout(function () { - map._clicked = 0; - clearTimeout(map._clickTimeout); - }, 0); - - if (!labels) { - return; - } - - if (labels.options.opacity === 1) { - labels.options.opacity = 0; - labels.setOpacity(0); - } else { - labels.options.opacity = 1; - labels.setOpacity(1); - } - } -}); -L.Map.addInitHook('addHandler', 'doubleClickLabels', L.Map.DoubleClickLabels); - -/***/ }), - -/***/ "./src/mapmixins/DoubleClickZoom.js": -/*!******************************************!*\ - !*** ./src/mapmixins/DoubleClickZoom.js ***! - \******************************************/ -/***/ (function() { - -/** - * `L.Map.DoubleClickZoom` from leaflet 1.5.1, overrwritten so that it - * 1) Fires a `singleclick` event to avoid deselecting images on `dblclick`. - * 2) Maintains a mutually exclusive relationship with the map's `DoubleClickLabels` handler - */ -L.Map.DoubleClickZoom.include({ - addHooks: function addHooks() { - this._map.on({ - click: this._fireIfSingle, - dblclick: this._onDoubleClick - }, this); - }, - removeHooks: function removeHooks() { - this._map.off({ - click: this._fireIfSingle, - dblclick: this._onDoubleClick - }, this); - }, - enable: function enable() { - if (this._enabled) { - return this; - } // don't enable 'doubleClickZoom' unless 'doubleClickLabels' is disabled first - - - if (this._map.doubleClickLabels) { - if (this._map.doubleClickLabels.enabled()) { - return this; - } - } // signify to collection/instance classes to turn on 'singleclick' listeners - - - this._map.fire('singleclickon'); - - this._enabled = true; - this.addHooks(); - return this; - }, - disable: function disable() { - if (!this._enabled) { - return this; - } // signify to collection/instance safe to swap 'singleclick' listeners with 'click' listeners. - - - this._map.fire('singleclickoff'); - - this._enabled = false; - this.removeHooks(); - return this; - }, - _fireIfSingle: function _fireIfSingle(e) { - var map = this._map; - var oe = e.originalEvent; // prevents deselection in case of box selector - - if (oe && oe.shiftKey) { - return; - } - - map._clicked += 1; - this._map._clickTimeout = setTimeout(function () { - if (map._clicked === 1) { - map._clicked = 0; - map.fire('singleclick', { - type: 'singleclick' - }); - } else { - // manually fire doubleclick event only for touch screens that don't natively fire it - if (L.Browser.touch && oe && oe.sourceCapabilities.firesTouchEvents) { - /* in `DoubleClickLabels.js`, we just do map.fire('dblclick') bc `_onDoublClick` doesn't use the - passed "e" (for now). To generate a 'real' DOM event that will have all of its corresponding core - properties (originalEvent, latlng, etc.), use Leaflet's `#map._fireDOMEvent` (Leaflet 1.5.1 source) */ - map._fireDOMEvent(oe, 'dblclick', [map]); - } - } - }, 250); - }, - _onDoubleClick: function _onDoubleClick(e) { - var map = this._map; - var oe = e.originalEvent; - setTimeout(function () { - map._clicked = 0; - clearTimeout(map._clickTimeout); - }, 0); - - if (!oe) { - return false; - } - - var oldZoom = map.getZoom(); - var delta = map.options.zoomDelta; - var zoom = oe.shiftKey ? oldZoom - delta : oldZoom + delta; - - if (map.options.doubleClickZoom === 'center') { - map.setZoom(zoom); - } else { - map.setZoomAround(e.containerPoint, zoom); - } - } -}); - -/***/ }), - -/***/ "./src/mapmixins/MapMixins.js": -/*!************************************!*\ - !*** ./src/mapmixins/MapMixins.js ***! - \************************************/ -/***/ (function() { - -/* eslint-disable max-len */ -L.Map.include({ - _clicked: 0, - addGoogleMutant: function addGoogleMutant(opts) { - var url = 'http://mt0.google.com/vt/lyrs=s&x={x}&y={y}&z={z}'; - opts = this.mutantOptions = L.extend({ - mutantOpacity: 0.8, - maxZoom: 24, - maxNativeZoom: 20, - minZoom: 0, - labels: true, - labelOpacity: 1, - doubleClickLabels: true - }, opts); - - if (!opts.labels) { - this.mutantOptions = L.extend(this.mutantOptions, { - labelOpacity: opts.labels ? 1 : undefined, - doubleClickLabels: opts.labels ? true : undefined - }); - } - - this._googleMutant = L.tileLayer(url, { - maxZoom: opts.maxZoom, - maxNativeZoom: opts.maxNativeZoom, - minZoom: opts.minZoom, - opacity: opts.mutantOpacity - }).addTo(this); - - if (opts.labels) { - this._addLabels(opts); - } // shouldn't have this handler at all if there are no labels to toggle - else { - this.doubleClickLabels = undefined; - } - - return this; - }, - _addLabels: function _addLabels(opts) { - var url = 'https://stamen-tiles-{s}.a.ssl.fastly.net/toner-labels/{z}/{x}/{y}{r}.{ext}'; - - if (opts.labelOpacity !== 0 && opts.labelOpacity !== 1) { - opts.labelOpacity = 1; - } - - this._labels = L.tileLayer(url, { - attribution: 'Map tiles by Stamen Design, CC BY 3.0 — Map data © OpenStreetMap contributors', - subdomains: 'abcd', - interactive: false, - opacity: opts.labelOpacity, - maxZoom: opts.maxZoom, - maxNativeZoom: opts.maxNativeZoom, - minZoom: opts.minZoom, - ext: 'png' - }).addTo(this); - - if (this.mutantOptions.doubleClickLabels) { - this.doubleClickLabels.enable(); - } - - return this; - } -}); // start off with doubleClickZoom enabled, doubleClickLabels can later be enabled instead -// during initialization - -L.Map.addInitHook(function () { - this.doubleClickLabels.disable(); - this.doubleClickZoom.enable(); -}); - -/***/ }), - -/***/ "./src/util/DomUtil.js": -/*!*****************************!*\ - !*** ./src/util/DomUtil.js ***! - \*****************************/ -/***/ (function() { - -L.DomUtil = L.extend(L.DomUtil, { - initTranslation: function initTranslation(obj) { - this.translation = obj; - }, - getMatrixString: function getMatrixString(m) { - var is3d = L.Browser.webkit3d || L.Browser.gecko3d || L.Browser.ie3d; - /* - * Since matrix3d takes a 4*4 matrix, we add in an empty row and column, - * which act as the identity on the z-axis. - * See: - * http://franklinta.com/2014/09/08/computing-css-matrix3d-transforms/ - * https://developer.mozilla.org/en-US/docs/Web/CSS/transform-function#M.C3.B6bius'_homogeneous_coordinates_in_projective_geometry - */ - - var matrix = [m[0], m[3], 0, m[6], m[1], m[4], 0, m[7], 0, 0, 1, 0, m[2], m[5], 0, m[8]]; - var str = is3d ? 'matrix3d(' + matrix.join(',') + ')' : ''; - - if (!is3d) { - console.log('Your browser must support 3D CSS transforms' + 'in order to use DistortableImageOverlay.'); - } - - return str; - }, - toggleClass: function toggleClass(el, className) { - var c = className; - return this.hasClass(el, c) ? this.removeClass(el, c) : this.addClass(el, c); - }, - confirmDelete: function confirmDelete() { - return window.confirm(this.translation.confirmImageDelete); - }, - confirmDeletes: function confirmDeletes(n) { - if (n === 1) { - return this.confirmDelete(); - } - - var translation = this.translation.confirmImagesDeletes; - var warningMsg = ''; - - if (typeof translation === 'function') { - warningMsg = translation(n); - } else { - warningMsg = translation; - } - - return window.confirm(warningMsg); - } -}); - -/***/ }), - -/***/ "./src/util/IconUtil.js": -/*!******************************!*\ - !*** ./src/util/IconUtil.js ***! - \******************************/ -/***/ (function() { - -L.IconUtil = { - /* creates an svg elemenet with built in accessibility properties - * and standardized classes for styling, takes in the fragment - * identifier (id) of the symbol to reference. note for symplicity - * we allow providing the icon target with or without the '#' prefix - */ - create: function create(ref) { - if (/^#/.test(ref)) { - ref = ref.replace(/^#/, ''); - } - - return '' + '' + ''; - }, - addClassToSvg: function addClassToSvg(container, loader) { - var svg = container.querySelector('svg'); - - if (svg) { - L.DomUtil.addClass(svg, loader); - } - }, - // finds the use element and toggles its icon reference - toggleXlink: function toggleXlink(container, ref1, ref2) { - if (!/^#/.test(ref1)) { - ref1 = '#' + ref1; - } - - if (!/^#/.test(ref2)) { - ref2 = '#' + ref2; - } - - var use = container.querySelector('use'); - - if (use) { - var toggled = use.getAttribute('xlink:href') === ref1 ? ref2 : ref1; - use.setAttribute('xlink:href', toggled); - return toggled; - } - - return false; - }, - toggleTitle: function toggleTitle(container, title1, title2) { - var toggled = container.getAttribute('title') === title1 ? title2 : title1; - container.setAttribute('title', toggled); - - if (container.hasAttribute('aria-label')) { - container.setAttribute('aria-label', toggled); - } - - return toggled; - } -}; - -/***/ }), - -/***/ "./src/util/ImageUtil.js": -/*!*******************************!*\ - !*** ./src/util/ImageUtil.js ***! - \*******************************/ -/***/ (function() { - -L.ImageUtil = { - getCmPerPixel: function getCmPerPixel(overlay) { - var map = overlay._map; - var dist = map.latLngToLayerPoint(overlay.getCorner(0)).distanceTo(map.latLngToLayerPoint(overlay.getCorner(1))); - return dist * 100 / overlay.getElement().width; - } -}; - -/***/ }), - -/***/ "./src/util/MatrixUtil.js": -/*!********************************!*\ - !*** ./src/util/MatrixUtil.js ***! - \********************************/ -/***/ (function() { - -L.MatrixUtil = { - // Compute the adjugate of m - adj: function adj(m) { - return [m[4] * m[8] - m[5] * m[7], m[2] * m[7] - m[1] * m[8], m[1] * m[5] - m[2] * m[4], m[5] * m[6] - m[3] * m[8], m[0] * m[8] - m[2] * m[6], m[2] * m[3] - m[0] * m[5], m[3] * m[7] - m[4] * m[6], m[1] * m[6] - m[0] * m[7], m[0] * m[4] - m[1] * m[3]]; - }, - // multiply two 3*3 matrices - multmm: function multmm(a, b) { - var c = []; - var i; - - for (i = 0; i < 3; i++) { - for (var j = 0; j < 3; j++) { - var cij = 0; - - for (var k = 0; k < 3; k++) { - cij += a[3 * i + k] * b[3 * k + j]; - } - - c[3 * i + j] = cij; - } - } - - return c; - }, - // multiply a 3*3 matrix and a 3-vector - multmv: function multmv(m, v) { - return [m[0] * v[0] + m[1] * v[1] + m[2] * v[2], m[3] * v[0] + m[4] * v[1] + m[5] * v[2], m[6] * v[0] + m[7] * v[1] + m[8] * v[2]]; - }, - // multiply a scalar and a 3*3 matrix - multsm: function multsm(s, m) { - var matrix = []; - - for (var i = 0, l = m.length; i < l; i++) { - matrix.push(s * m[i]); - } - - return matrix; - }, - basisToPoints: function basisToPoints(x1, y1, x2, y2, x3, y3, x4, y4) { - var m = [x1, x2, x3, y1, y2, y3, 1, 1, 1]; - var v = L.MatrixUtil.multmv(L.MatrixUtil.adj(m), [x4, y4, 1]); - return L.MatrixUtil.multmm(m, [v[0], 0, 0, 0, v[1], 0, 0, 0, v[2]]); - }, - project: function project(m, x, y) { - var v = L.MatrixUtil.multmv(m, [x, y, 1]); - return [v[0] / v[2], v[1] / v[2]]; - }, - general2DProjection: function general2DProjection(x1s, y1s, x1d, y1d, x2s, y2s, x2d, y2d, x3s, y3s, x3d, y3d, x4s, y4s, x4d, y4d) { - var s = L.MatrixUtil.basisToPoints(x1s, y1s, x2s, y2s, x3s, y3s, x4s, y4s); - var d = L.MatrixUtil.basisToPoints(x1d, y1d, x2d, y2d, x3d, y3d, x4d, y4d); - var m = L.MatrixUtil.multmm(d, L.MatrixUtil.adj(s)); // Normalize to the unique matrix with m[8] == 1. - // See: http://franklinta.com/2014/09/08/computing-css-matrix3d-transforms/ - - return L.MatrixUtil.multsm(1 / m[8], m); - } -}; - -/***/ }), - -/***/ "./src/util/TrigUtil.js": -/*!******************************!*\ - !*** ./src/util/TrigUtil.js ***! - \******************************/ -/***/ (function() { - -L.TrigUtil = { - calcAngle: function calcAngle(x, y) { - var unit = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'deg'; - return unit === 'deg' ? this.radiansToDegrees(Math.atan2(y, x)) : Math.atan2(y, x); - }, - radiansToDegrees: function radiansToDegrees(angle) { - return angle * 180 / Math.PI; - }, - degreesToRadians: function degreesToRadians(angle) { - return angle * Math.PI / 180; - } -}; - -/***/ }), - -/***/ "./src/util/Utils.js": -/*!***************************!*\ - !*** ./src/util/Utils.js ***! - \***************************/ -/***/ (function() { - -L.Utils = { - initTranslation: function initTranslation() { - var translation = { - deleteImage: 'Delete Image', - deleteImages: 'Delete Images', - distortImage: 'Distort Image', - dragImage: 'Drag Image', - exportImage: 'Export Image', - exportImages: 'Export Images', - removeBorder: 'Remove Border', - addBorder: 'Add Border', - freeRotateImage: 'Free rotate Image', - geolocateImage: 'Geolocate Image', - lockMode: 'Lock Mode', - lockImages: 'Lock Images', - makeImageOpaque: 'Make Image Opaque', - makeImageTransparent: 'Make Image Transparent', - restoreImage: 'Restore Natural Image', - rotateImage: 'Rotate Image', - scaleImage: 'Scale Image', - stackToFront: 'Stack to Front', - stackToBack: 'Stack to Back', - unlockImages: 'Unlock Images', - confirmImageDelete: 'Are you sure? This image will be permanently deleted from the map.', - confirmImagesDeletes: 'Are you sure? These images will be permanently deleted from the map.' - }; - - if (!this.options.translation) { - this.options.translation = translation; - } else { - // If the translation for a word is not specified, fallback to English. - for (var key in translation) { - if (!this.options.translation.hasOwnProperty(key)) { - this.options.translation[key] = translation[key]; - } - } - } - - L.DomUtil.initTranslation(this.options.translation); - }, - getNestedVal: function getNestedVal(obj, key, nestedKey) { - var dig = [key, nestedKey]; - return dig.reduce(function (obj, k) { - return obj && obj[k]; - }, obj); - } -}; - -/***/ }), - -/***/ "./node_modules/events/events.js": -/*!***************************************!*\ - !*** ./node_modules/events/events.js ***! - \***************************************/ -/***/ (function(module) { - -"use strict"; -// Copyright Joyent, Inc. and other Node contributors. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to permit -// persons to whom the Software is furnished to do so, subject to the -// following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -// USE OR OTHER DEALINGS IN THE SOFTWARE. - - - -var R = typeof Reflect === 'object' ? Reflect : null -var ReflectApply = R && typeof R.apply === 'function' - ? R.apply - : function ReflectApply(target, receiver, args) { - return Function.prototype.apply.call(target, receiver, args); - } - -var ReflectOwnKeys -if (R && typeof R.ownKeys === 'function') { - ReflectOwnKeys = R.ownKeys -} else if (Object.getOwnPropertySymbols) { - ReflectOwnKeys = function ReflectOwnKeys(target) { - return Object.getOwnPropertyNames(target) - .concat(Object.getOwnPropertySymbols(target)); - }; -} else { - ReflectOwnKeys = function ReflectOwnKeys(target) { - return Object.getOwnPropertyNames(target); - }; -} - -function ProcessEmitWarning(warning) { - if (console && console.warn) console.warn(warning); -} - -var NumberIsNaN = Number.isNaN || function NumberIsNaN(value) { - return value !== value; -} - -function EventEmitter() { - EventEmitter.init.call(this); -} -module.exports = EventEmitter; -module.exports.once = once; - -// Backwards-compat with node 0.10.x -EventEmitter.EventEmitter = EventEmitter; - -EventEmitter.prototype._events = undefined; -EventEmitter.prototype._eventsCount = 0; -EventEmitter.prototype._maxListeners = undefined; - -// By default EventEmitters will print a warning if more than 10 listeners are -// added to it. This is a useful default which helps finding memory leaks. -var defaultMaxListeners = 10; - -function checkListener(listener) { - if (typeof listener !== 'function') { - throw new TypeError('The "listener" argument must be of type Function. Received type ' + typeof listener); - } -} - -Object.defineProperty(EventEmitter, 'defaultMaxListeners', { - enumerable: true, - get: function() { - return defaultMaxListeners; - }, - set: function(arg) { - if (typeof arg !== 'number' || arg < 0 || NumberIsNaN(arg)) { - throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received ' + arg + '.'); - } - defaultMaxListeners = arg; - } -}); - -EventEmitter.init = function() { - - if (this._events === undefined || - this._events === Object.getPrototypeOf(this)._events) { - this._events = Object.create(null); - this._eventsCount = 0; - } - - this._maxListeners = this._maxListeners || undefined; -}; - -// Obviously not all Emitters should be limited to 10. This function allows -// that to be increased. Set to zero for unlimited. -EventEmitter.prototype.setMaxListeners = function setMaxListeners(n) { - if (typeof n !== 'number' || n < 0 || NumberIsNaN(n)) { - throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received ' + n + '.'); - } - this._maxListeners = n; - return this; -}; - -function _getMaxListeners(that) { - if (that._maxListeners === undefined) - return EventEmitter.defaultMaxListeners; - return that._maxListeners; -} - -EventEmitter.prototype.getMaxListeners = function getMaxListeners() { - return _getMaxListeners(this); -}; - -EventEmitter.prototype.emit = function emit(type) { - var args = []; - for (var i = 1; i < arguments.length; i++) args.push(arguments[i]); - var doError = (type === 'error'); - - var events = this._events; - if (events !== undefined) - doError = (doError && events.error === undefined); - else if (!doError) - return false; - - // If there is no 'error' event listener then throw. - if (doError) { - var er; - if (args.length > 0) - er = args[0]; - if (er instanceof Error) { - // Note: The comments on the `throw` lines are intentional, they show - // up in Node's output if this results in an unhandled exception. - throw er; // Unhandled 'error' event - } - // At least give some kind of context to the user - var err = new Error('Unhandled error.' + (er ? ' (' + er.message + ')' : '')); - err.context = er; - throw err; // Unhandled 'error' event - } - - var handler = events[type]; - - if (handler === undefined) - return false; - - if (typeof handler === 'function') { - ReflectApply(handler, this, args); - } else { - var len = handler.length; - var listeners = arrayClone(handler, len); - for (var i = 0; i < len; ++i) - ReflectApply(listeners[i], this, args); - } - - return true; -}; - -function _addListener(target, type, listener, prepend) { - var m; - var events; - var existing; - - checkListener(listener); - - events = target._events; - if (events === undefined) { - events = target._events = Object.create(null); - target._eventsCount = 0; - } else { - // To avoid recursion in the case that type === "newListener"! Before - // adding it to the listeners, first emit "newListener". - if (events.newListener !== undefined) { - target.emit('newListener', type, - listener.listener ? listener.listener : listener); - - // Re-assign `events` because a newListener handler could have caused the - // this._events to be assigned to a new object - events = target._events; - } - existing = events[type]; - } - - if (existing === undefined) { - // Optimize the case of one listener. Don't need the extra array object. - existing = events[type] = listener; - ++target._eventsCount; - } else { - if (typeof existing === 'function') { - // Adding the second element, need to change to array. - existing = events[type] = - prepend ? [listener, existing] : [existing, listener]; - // If we've already got an array, just append. - } else if (prepend) { - existing.unshift(listener); - } else { - existing.push(listener); - } - - // Check for listener leak - m = _getMaxListeners(target); - if (m > 0 && existing.length > m && !existing.warned) { - existing.warned = true; - // No error code for this since it is a Warning - // eslint-disable-next-line no-restricted-syntax - var w = new Error('Possible EventEmitter memory leak detected. ' + - existing.length + ' ' + String(type) + ' listeners ' + - 'added. Use emitter.setMaxListeners() to ' + - 'increase limit'); - w.name = 'MaxListenersExceededWarning'; - w.emitter = target; - w.type = type; - w.count = existing.length; - ProcessEmitWarning(w); - } - } - - return target; -} - -EventEmitter.prototype.addListener = function addListener(type, listener) { - return _addListener(this, type, listener, false); -}; - -EventEmitter.prototype.on = EventEmitter.prototype.addListener; - -EventEmitter.prototype.prependListener = - function prependListener(type, listener) { - return _addListener(this, type, listener, true); - }; - -function onceWrapper() { - if (!this.fired) { - this.target.removeListener(this.type, this.wrapFn); - this.fired = true; - if (arguments.length === 0) - return this.listener.call(this.target); - return this.listener.apply(this.target, arguments); - } -} - -function _onceWrap(target, type, listener) { - var state = { fired: false, wrapFn: undefined, target: target, type: type, listener: listener }; - var wrapped = onceWrapper.bind(state); - wrapped.listener = listener; - state.wrapFn = wrapped; - return wrapped; -} - -EventEmitter.prototype.once = function once(type, listener) { - checkListener(listener); - this.on(type, _onceWrap(this, type, listener)); - return this; -}; - -EventEmitter.prototype.prependOnceListener = - function prependOnceListener(type, listener) { - checkListener(listener); - this.prependListener(type, _onceWrap(this, type, listener)); - return this; - }; - -// Emits a 'removeListener' event if and only if the listener was removed. -EventEmitter.prototype.removeListener = - function removeListener(type, listener) { - var list, events, position, i, originalListener; - - checkListener(listener); - - events = this._events; - if (events === undefined) - return this; - - list = events[type]; - if (list === undefined) - return this; - - if (list === listener || list.listener === listener) { - if (--this._eventsCount === 0) - this._events = Object.create(null); - else { - delete events[type]; - if (events.removeListener) - this.emit('removeListener', type, list.listener || listener); - } - } else if (typeof list !== 'function') { - position = -1; - - for (i = list.length - 1; i >= 0; i--) { - if (list[i] === listener || list[i].listener === listener) { - originalListener = list[i].listener; - position = i; - break; - } - } - - if (position < 0) - return this; - - if (position === 0) - list.shift(); - else { - spliceOne(list, position); - } - - if (list.length === 1) - events[type] = list[0]; - - if (events.removeListener !== undefined) - this.emit('removeListener', type, originalListener || listener); - } - - return this; - }; - -EventEmitter.prototype.off = EventEmitter.prototype.removeListener; - -EventEmitter.prototype.removeAllListeners = - function removeAllListeners(type) { - var listeners, events, i; - - events = this._events; - if (events === undefined) - return this; - - // not listening for removeListener, no need to emit - if (events.removeListener === undefined) { - if (arguments.length === 0) { - this._events = Object.create(null); - this._eventsCount = 0; - } else if (events[type] !== undefined) { - if (--this._eventsCount === 0) - this._events = Object.create(null); - else - delete events[type]; - } - return this; - } - - // emit removeListener for all listeners on all events - if (arguments.length === 0) { - var keys = Object.keys(events); - var key; - for (i = 0; i < keys.length; ++i) { - key = keys[i]; - if (key === 'removeListener') continue; - this.removeAllListeners(key); - } - this.removeAllListeners('removeListener'); - this._events = Object.create(null); - this._eventsCount = 0; - return this; - } - - listeners = events[type]; - - if (typeof listeners === 'function') { - this.removeListener(type, listeners); - } else if (listeners !== undefined) { - // LIFO order - for (i = listeners.length - 1; i >= 0; i--) { - this.removeListener(type, listeners[i]); - } - } - - return this; - }; - -function _listeners(target, type, unwrap) { - var events = target._events; - - if (events === undefined) - return []; - - var evlistener = events[type]; - if (evlistener === undefined) - return []; - - if (typeof evlistener === 'function') - return unwrap ? [evlistener.listener || evlistener] : [evlistener]; - - return unwrap ? - unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length); -} - -EventEmitter.prototype.listeners = function listeners(type) { - return _listeners(this, type, true); -}; - -EventEmitter.prototype.rawListeners = function rawListeners(type) { - return _listeners(this, type, false); -}; - -EventEmitter.listenerCount = function(emitter, type) { - if (typeof emitter.listenerCount === 'function') { - return emitter.listenerCount(type); - } else { - return listenerCount.call(emitter, type); - } -}; - -EventEmitter.prototype.listenerCount = listenerCount; -function listenerCount(type) { - var events = this._events; - - if (events !== undefined) { - var evlistener = events[type]; - - if (typeof evlistener === 'function') { - return 1; - } else if (evlistener !== undefined) { - return evlistener.length; - } - } - - return 0; -} - -EventEmitter.prototype.eventNames = function eventNames() { - return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : []; -}; - -function arrayClone(arr, n) { - var copy = new Array(n); - for (var i = 0; i < n; ++i) - copy[i] = arr[i]; - return copy; -} - -function spliceOne(list, index) { - for (; index + 1 < list.length; index++) - list[index] = list[index + 1]; - list.pop(); -} - -function unwrapListeners(arr) { - var ret = new Array(arr.length); - for (var i = 0; i < ret.length; ++i) { - ret[i] = arr[i].listener || arr[i]; - } - return ret; -} - -function once(emitter, name) { - return new Promise(function (resolve, reject) { - function errorListener(err) { - emitter.removeListener(name, resolver); - reject(err); - } - - function resolver() { - if (typeof emitter.removeListener === 'function') { - emitter.removeListener('error', errorListener); - } - resolve([].slice.call(arguments)); - }; - - eventTargetAgnosticAddListener(emitter, name, resolver, { once: true }); - if (name !== 'error') { - addErrorHandlerIfEventEmitter(emitter, errorListener, { once: true }); - } - }); -} - -function addErrorHandlerIfEventEmitter(emitter, handler, flags) { - if (typeof emitter.on === 'function') { - eventTargetAgnosticAddListener(emitter, 'error', handler, flags); - } -} - -function eventTargetAgnosticAddListener(emitter, name, listener, flags) { - if (typeof emitter.on === 'function') { - if (flags.once) { - emitter.once(name, listener); - } else { - emitter.on(name, listener); - } - } else if (typeof emitter.addEventListener === 'function') { - // EventTarget does not have `error` event semantics like Node - // EventEmitters, we do not listen for `error` events here. - emitter.addEventListener(name, function wrapListener(arg) { - // IE does not have builtin `{ once: true }` support so we - // have to do it manually. - if (flags.once) { - emitter.removeEventListener(name, wrapListener); - } - listener(arg); - }); - } else { - throw new TypeError('The "emitter" argument must be of type EventEmitter. Received type ' + typeof emitter); - } -} - - -/***/ }), - -/***/ "./node_modules/html-entities/lib/index.js": -/*!*************************************************!*\ - !*** ./node_modules/html-entities/lib/index.js ***! - \*************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - -"use strict"; - -var __assign = (this && this.__assign) || function () { - __assign = Object.assign || function(t) { - for (var s, i = 1, n = arguments.length; i < n; i++) { - s = arguments[i]; - for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) - t[p] = s[p]; - } - return t; - }; - return __assign.apply(this, arguments); -}; -Object.defineProperty(exports, "__esModule", ({ value: true })); -var named_references_1 = __webpack_require__(/*! ./named-references */ "./node_modules/html-entities/lib/named-references.js"); -var numeric_unicode_map_1 = __webpack_require__(/*! ./numeric-unicode-map */ "./node_modules/html-entities/lib/numeric-unicode-map.js"); -var surrogate_pairs_1 = __webpack_require__(/*! ./surrogate-pairs */ "./node_modules/html-entities/lib/surrogate-pairs.js"); -var allNamedReferences = __assign(__assign({}, named_references_1.namedReferences), { all: named_references_1.namedReferences.html5 }); -var encodeRegExps = { - specialChars: /[<>'"&]/g, - nonAscii: /(?:[<>'"&\u0080-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])/g, - nonAsciiPrintable: /(?:[<>'"&\x01-\x08\x11-\x15\x17-\x1F\x7f-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])/g, - extensive: /(?:[\x01-\x0c\x0e-\x1f\x21-\x2c\x2e-\x2f\x3a-\x40\x5b-\x60\x7b-\x7d\x7f-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])/g -}; -var defaultEncodeOptions = { - mode: 'specialChars', - level: 'all', - numeric: 'decimal' -}; -/** Encodes all the necessary (specified by `level`) characters in the text */ -function encode(text, _a) { - var _b = _a === void 0 ? defaultEncodeOptions : _a, _c = _b.mode, mode = _c === void 0 ? 'specialChars' : _c, _d = _b.numeric, numeric = _d === void 0 ? 'decimal' : _d, _e = _b.level, level = _e === void 0 ? 'all' : _e; - if (!text) { - return ''; - } - var encodeRegExp = encodeRegExps[mode]; - var references = allNamedReferences[level].characters; - var isHex = numeric === 'hexadecimal'; - encodeRegExp.lastIndex = 0; - var _b = encodeRegExp.exec(text); - var _c; - if (_b) { - _c = ''; - var _d = 0; - do { - if (_d !== _b.index) { - _c += text.substring(_d, _b.index); - } - var _e = _b[0]; - var result_1 = references[_e]; - if (!result_1) { - var code_1 = _e.length > 1 ? surrogate_pairs_1.getCodePoint(_e, 0) : _e.charCodeAt(0); - result_1 = (isHex ? '&#x' + code_1.toString(16) : '&#' + code_1) + ';'; - } - _c += result_1; - _d = _b.index + _e.length; - } while ((_b = encodeRegExp.exec(text))); - if (_d !== text.length) { - _c += text.substring(_d); - } - } - else { - _c = - text; - } - return _c; -} -exports.encode = encode; -var defaultDecodeOptions = { - scope: 'body', - level: 'all' -}; -var strict = /&(?:#\d+|#[xX][\da-fA-F]+|[0-9a-zA-Z]+);/g; -var attribute = /&(?:#\d+|#[xX][\da-fA-F]+|[0-9a-zA-Z]+)[;=]?/g; -var baseDecodeRegExps = { - xml: { - strict: strict, - attribute: attribute, - body: named_references_1.bodyRegExps.xml - }, - html4: { - strict: strict, - attribute: attribute, - body: named_references_1.bodyRegExps.html4 - }, - html5: { - strict: strict, - attribute: attribute, - body: named_references_1.bodyRegExps.html5 - } -}; -var decodeRegExps = __assign(__assign({}, baseDecodeRegExps), { all: baseDecodeRegExps.html5 }); -var fromCharCode = String.fromCharCode; -var outOfBoundsChar = fromCharCode(65533); -var defaultDecodeEntityOptions = { - level: 'all' -}; -/** Decodes a single entity */ -function decodeEntity(entity, _a) { - var _b = (_a === void 0 ? defaultDecodeEntityOptions : _a).level, level = _b === void 0 ? 'all' : _b; - if (!entity) { - return ''; - } - var _b = entity; - var decodeEntityLastChar_1 = entity[entity.length - 1]; - if (false) {} - else if (false) {} - else { - var decodeResultByReference_1 = allNamedReferences[level].entities[entity]; - if (decodeResultByReference_1) { - _b = decodeResultByReference_1; - } - else if (entity[0] === '&' && entity[1] === '#') { - var decodeSecondChar_1 = entity[2]; - var decodeCode_1 = decodeSecondChar_1 == 'x' || decodeSecondChar_1 == 'X' - ? parseInt(entity.substr(3), 16) - : parseInt(entity.substr(2)); - _b = - decodeCode_1 >= 0x10ffff - ? outOfBoundsChar - : decodeCode_1 > 65535 - ? surrogate_pairs_1.fromCodePoint(decodeCode_1) - : fromCharCode(numeric_unicode_map_1.numericUnicodeMap[decodeCode_1] || decodeCode_1); - } - } - return _b; -} -exports.decodeEntity = decodeEntity; -/** Decodes all entities in the text */ -function decode(text, _a) { - var decodeSecondChar_1 = _a === void 0 ? defaultDecodeOptions : _a, decodeCode_1 = decodeSecondChar_1.level, level = decodeCode_1 === void 0 ? 'all' : decodeCode_1, _b = decodeSecondChar_1.scope, scope = _b === void 0 ? level === 'xml' ? 'strict' : 'body' : _b; - if (!text) { - return ''; - } - var decodeRegExp = decodeRegExps[level][scope]; - var references = allNamedReferences[level].entities; - var isAttribute = scope === 'attribute'; - var isStrict = scope === 'strict'; - decodeRegExp.lastIndex = 0; - var replaceMatch_1 = decodeRegExp.exec(text); - var replaceResult_1; - if (replaceMatch_1) { - replaceResult_1 = ''; - var replaceLastIndex_1 = 0; - do { - if (replaceLastIndex_1 !== replaceMatch_1.index) { - replaceResult_1 += text.substring(replaceLastIndex_1, replaceMatch_1.index); - } - var replaceInput_1 = replaceMatch_1[0]; - var decodeResult_1 = replaceInput_1; - var decodeEntityLastChar_2 = replaceInput_1[replaceInput_1.length - 1]; - if (isAttribute - && decodeEntityLastChar_2 === '=') { - decodeResult_1 = replaceInput_1; - } - else if (isStrict - && decodeEntityLastChar_2 !== ';') { - decodeResult_1 = replaceInput_1; - } - else { - var decodeResultByReference_2 = references[replaceInput_1]; - if (decodeResultByReference_2) { - decodeResult_1 = decodeResultByReference_2; - } - else if (replaceInput_1[0] === '&' && replaceInput_1[1] === '#') { - var decodeSecondChar_2 = replaceInput_1[2]; - var decodeCode_2 = decodeSecondChar_2 == 'x' || decodeSecondChar_2 == 'X' - ? parseInt(replaceInput_1.substr(3), 16) - : parseInt(replaceInput_1.substr(2)); - decodeResult_1 = - decodeCode_2 >= 0x10ffff - ? outOfBoundsChar - : decodeCode_2 > 65535 - ? surrogate_pairs_1.fromCodePoint(decodeCode_2) - : fromCharCode(numeric_unicode_map_1.numericUnicodeMap[decodeCode_2] || decodeCode_2); - } - } - replaceResult_1 += decodeResult_1; - replaceLastIndex_1 = replaceMatch_1.index + replaceInput_1.length; - } while ((replaceMatch_1 = decodeRegExp.exec(text))); - if (replaceLastIndex_1 !== text.length) { - replaceResult_1 += text.substring(replaceLastIndex_1); - } - } - else { - replaceResult_1 = - text; - } - return replaceResult_1; -} -exports.decode = decode; - - -/***/ }), - -/***/ "./node_modules/html-entities/lib/named-references.js": -/*!************************************************************!*\ - !*** ./node_modules/html-entities/lib/named-references.js ***! - \************************************************************/ -/***/ (function(__unused_webpack_module, exports) { - -"use strict"; -Object.defineProperty(exports, "__esModule", ({value:true}));exports.bodyRegExps={xml:/&(?:#\d+|#[xX][\da-fA-F]+|[0-9a-zA-Z]+);?/g,html4:/&(?:nbsp|iexcl|cent|pound|curren|yen|brvbar|sect|uml|copy|ordf|laquo|not|shy|reg|macr|deg|plusmn|sup2|sup3|acute|micro|para|middot|cedil|sup1|ordm|raquo|frac14|frac12|frac34|iquest|Agrave|Aacute|Acirc|Atilde|Auml|Aring|AElig|Ccedil|Egrave|Eacute|Ecirc|Euml|Igrave|Iacute|Icirc|Iuml|ETH|Ntilde|Ograve|Oacute|Ocirc|Otilde|Ouml|times|Oslash|Ugrave|Uacute|Ucirc|Uuml|Yacute|THORN|szlig|agrave|aacute|acirc|atilde|auml|aring|aelig|ccedil|egrave|eacute|ecirc|euml|igrave|iacute|icirc|iuml|eth|ntilde|ograve|oacute|ocirc|otilde|ouml|divide|oslash|ugrave|uacute|ucirc|uuml|yacute|thorn|yuml|quot|amp|lt|gt|#\d+|#[xX][\da-fA-F]+|[0-9a-zA-Z]+);?/g,html5:/&(?:AElig|AMP|Aacute|Acirc|Agrave|Aring|Atilde|Auml|COPY|Ccedil|ETH|Eacute|Ecirc|Egrave|Euml|GT|Iacute|Icirc|Igrave|Iuml|LT|Ntilde|Oacute|Ocirc|Ograve|Oslash|Otilde|Ouml|QUOT|REG|THORN|Uacute|Ucirc|Ugrave|Uuml|Yacute|aacute|acirc|acute|aelig|agrave|amp|aring|atilde|auml|brvbar|ccedil|cedil|cent|copy|curren|deg|divide|eacute|ecirc|egrave|eth|euml|frac12|frac14|frac34|gt|iacute|icirc|iexcl|igrave|iquest|iuml|laquo|lt|macr|micro|middot|nbsp|not|ntilde|oacute|ocirc|ograve|ordf|ordm|oslash|otilde|ouml|para|plusmn|pound|quot|raquo|reg|sect|shy|sup1|sup2|sup3|szlig|thorn|times|uacute|ucirc|ugrave|uml|uuml|yacute|yen|yuml|#\d+|#[xX][\da-fA-F]+|[0-9a-zA-Z]+);?/g};exports.namedReferences={xml:{entities:{"<":"<",">":">",""":'"',"'":"'","&":"&"},characters:{"<":"<",">":">",'"':""","'":"'","&":"&"}},html4:{entities:{"'":"'"," ":" "," ":" ","¡":"¡","¡":"¡","¢":"¢","¢":"¢","£":"£","£":"£","¤":"¤","¤":"¤","¥":"¥","¥":"¥","¦":"¦","¦":"¦","§":"§","§":"§","¨":"¨","¨":"¨","©":"©","©":"©","ª":"ª","ª":"ª","«":"«","«":"«","¬":"¬","¬":"¬","­":"­","­":"­","®":"®","®":"®","¯":"¯","¯":"¯","°":"°","°":"°","±":"±","±":"±","²":"²","²":"²","³":"³","³":"³","´":"´","´":"´","µ":"µ","µ":"µ","¶":"¶","¶":"¶","·":"·","·":"·","¸":"¸","¸":"¸","¹":"¹","¹":"¹","º":"º","º":"º","»":"»","»":"»","¼":"¼","¼":"¼","½":"½","½":"½","¾":"¾","¾":"¾","¿":"¿","¿":"¿","À":"À","À":"À","Á":"Á","Á":"Á","Â":"Â","Â":"Â","Ã":"Ã","Ã":"Ã","Ä":"Ä","Ä":"Ä","Å":"Å","Å":"Å","Æ":"Æ","Æ":"Æ","Ç":"Ç","Ç":"Ç","È":"È","È":"È","É":"É","É":"É","Ê":"Ê","Ê":"Ê","Ë":"Ë","Ë":"Ë","Ì":"Ì","Ì":"Ì","Í":"Í","Í":"Í","Î":"Î","Î":"Î","Ï":"Ï","Ï":"Ï","Ð":"Ð","Ð":"Ð","Ñ":"Ñ","Ñ":"Ñ","Ò":"Ò","Ò":"Ò","Ó":"Ó","Ó":"Ó","Ô":"Ô","Ô":"Ô","Õ":"Õ","Õ":"Õ","Ö":"Ö","Ö":"Ö","×":"×","×":"×","Ø":"Ø","Ø":"Ø","Ù":"Ù","Ù":"Ù","Ú":"Ú","Ú":"Ú","Û":"Û","Û":"Û","Ü":"Ü","Ü":"Ü","Ý":"Ý","Ý":"Ý","Þ":"Þ","Þ":"Þ","ß":"ß","ß":"ß","à":"à","à":"à","á":"á","á":"á","â":"â","â":"â","ã":"ã","ã":"ã","ä":"ä","ä":"ä","å":"å","å":"å","æ":"æ","æ":"æ","ç":"ç","ç":"ç","è":"è","è":"è","é":"é","é":"é","ê":"ê","ê":"ê","ë":"ë","ë":"ë","ì":"ì","ì":"ì","í":"í","í":"í","î":"î","î":"î","ï":"ï","ï":"ï","ð":"ð","ð":"ð","ñ":"ñ","ñ":"ñ","ò":"ò","ò":"ò","ó":"ó","ó":"ó","ô":"ô","ô":"ô","õ":"õ","õ":"õ","ö":"ö","ö":"ö","÷":"÷","÷":"÷","ø":"ø","ø":"ø","ù":"ù","ù":"ù","ú":"ú","ú":"ú","û":"û","û":"û","ü":"ü","ü":"ü","ý":"ý","ý":"ý","þ":"þ","þ":"þ","ÿ":"ÿ","ÿ":"ÿ",""":'"',""":'"',"&":"&","&":"&","<":"<","<":"<",">":">",">":">","Œ":"Œ","œ":"œ","Š":"Š","š":"š","Ÿ":"Ÿ","ˆ":"ˆ","˜":"˜"," ":" "," ":" "," ":" ","‌":"‌","‍":"‍","‎":"‎","‏":"‏","–":"–","—":"—","‘":"‘","’":"’","‚":"‚","“":"“","”":"”","„":"„","†":"†","‡":"‡","‰":"‰","‹":"‹","›":"›","€":"€","ƒ":"ƒ","Α":"Α","Β":"Β","Γ":"Γ","Δ":"Δ","Ε":"Ε","Ζ":"Ζ","Η":"Η","Θ":"Θ","Ι":"Ι","Κ":"Κ","Λ":"Λ","Μ":"Μ","Ν":"Ν","Ξ":"Ξ","Ο":"Ο","Π":"Π","Ρ":"Ρ","Σ":"Σ","Τ":"Τ","Υ":"Υ","Φ":"Φ","Χ":"Χ","Ψ":"Ψ","Ω":"Ω","α":"α","β":"β","γ":"γ","δ":"δ","ε":"ε","ζ":"ζ","η":"η","θ":"θ","ι":"ι","κ":"κ","λ":"λ","μ":"μ","ν":"ν","ξ":"ξ","ο":"ο","π":"π","ρ":"ρ","ς":"ς","σ":"σ","τ":"τ","υ":"υ","φ":"φ","χ":"χ","ψ":"ψ","ω":"ω","ϑ":"ϑ","ϒ":"ϒ","ϖ":"ϖ","•":"•","…":"…","′":"′","″":"″","‾":"‾","⁄":"⁄","℘":"℘","ℑ":"ℑ","ℜ":"ℜ","™":"™","ℵ":"ℵ","←":"←","↑":"↑","→":"→","↓":"↓","↔":"↔","↵":"↵","⇐":"⇐","⇑":"⇑","⇒":"⇒","⇓":"⇓","⇔":"⇔","∀":"∀","∂":"∂","∃":"∃","∅":"∅","∇":"∇","∈":"∈","∉":"∉","∋":"∋","∏":"∏","∑":"∑","−":"−","∗":"∗","√":"√","∝":"∝","∞":"∞","∠":"∠","∧":"∧","∨":"∨","∩":"∩","∪":"∪","∫":"∫","∴":"∴","∼":"∼","≅":"≅","≈":"≈","≠":"≠","≡":"≡","≤":"≤","≥":"≥","⊂":"⊂","⊃":"⊃","⊄":"⊄","⊆":"⊆","⊇":"⊇","⊕":"⊕","⊗":"⊗","⊥":"⊥","⋅":"⋅","⌈":"⌈","⌉":"⌉","⌊":"⌊","⌋":"⌋","⟨":"〈","⟩":"〉","◊":"◊","♠":"♠","♣":"♣","♥":"♥","♦":"♦"},characters:{"'":"'"," ":" ","¡":"¡","¢":"¢","£":"£","¤":"¤","¥":"¥","¦":"¦","§":"§","¨":"¨","©":"©","ª":"ª","«":"«","¬":"¬","­":"­","®":"®","¯":"¯","°":"°","±":"±","²":"²","³":"³","´":"´","µ":"µ","¶":"¶","·":"·","¸":"¸","¹":"¹","º":"º","»":"»","¼":"¼","½":"½","¾":"¾","¿":"¿","À":"À","Á":"Á","Â":"Â","Ã":"Ã","Ä":"Ä","Å":"Å","Æ":"Æ","Ç":"Ç","È":"È","É":"É","Ê":"Ê","Ë":"Ë","Ì":"Ì","Í":"Í","Î":"Î","Ï":"Ï","Ð":"Ð","Ñ":"Ñ","Ò":"Ò","Ó":"Ó","Ô":"Ô","Õ":"Õ","Ö":"Ö","×":"×","Ø":"Ø","Ù":"Ù","Ú":"Ú","Û":"Û","Ü":"Ü","Ý":"Ý","Þ":"Þ","ß":"ß","à":"à","á":"á","â":"â","ã":"ã","ä":"ä","å":"å","æ":"æ","ç":"ç","è":"è","é":"é","ê":"ê","ë":"ë","ì":"ì","í":"í","î":"î","ï":"ï","ð":"ð","ñ":"ñ","ò":"ò","ó":"ó","ô":"ô","õ":"õ","ö":"ö","÷":"÷","ø":"ø","ù":"ù","ú":"ú","û":"û","ü":"ü","ý":"ý","þ":"þ","ÿ":"ÿ",'"':""","&":"&","<":"<",">":">","Œ":"Œ","œ":"œ","Š":"Š","š":"š","Ÿ":"Ÿ","ˆ":"ˆ","˜":"˜"," ":" "," ":" "," ":" ","‌":"‌","‍":"‍","‎":"‎","‏":"‏","–":"–","—":"—","‘":"‘","’":"’","‚":"‚","“":"“","”":"”","„":"„","†":"†","‡":"‡","‰":"‰","‹":"‹","›":"›","€":"€","ƒ":"ƒ","Α":"Α","Β":"Β","Γ":"Γ","Δ":"Δ","Ε":"Ε","Ζ":"Ζ","Η":"Η","Θ":"Θ","Ι":"Ι","Κ":"Κ","Λ":"Λ","Μ":"Μ","Ν":"Ν","Ξ":"Ξ","Ο":"Ο","Π":"Π","Ρ":"Ρ","Σ":"Σ","Τ":"Τ","Υ":"Υ","Φ":"Φ","Χ":"Χ","Ψ":"Ψ","Ω":"Ω","α":"α","β":"β","γ":"γ","δ":"δ","ε":"ε","ζ":"ζ","η":"η","θ":"θ","ι":"ι","κ":"κ","λ":"λ","μ":"μ","ν":"ν","ξ":"ξ","ο":"ο","π":"π","ρ":"ρ","ς":"ς","σ":"σ","τ":"τ","υ":"υ","φ":"φ","χ":"χ","ψ":"ψ","ω":"ω","ϑ":"ϑ","ϒ":"ϒ","ϖ":"ϖ","•":"•","…":"…","′":"′","″":"″","‾":"‾","⁄":"⁄","℘":"℘","ℑ":"ℑ","ℜ":"ℜ","™":"™","ℵ":"ℵ","←":"←","↑":"↑","→":"→","↓":"↓","↔":"↔","↵":"↵","⇐":"⇐","⇑":"⇑","⇒":"⇒","⇓":"⇓","⇔":"⇔","∀":"∀","∂":"∂","∃":"∃","∅":"∅","∇":"∇","∈":"∈","∉":"∉","∋":"∋","∏":"∏","∑":"∑","−":"−","∗":"∗","√":"√","∝":"∝","∞":"∞","∠":"∠","∧":"∧","∨":"∨","∩":"∩","∪":"∪","∫":"∫","∴":"∴","∼":"∼","≅":"≅","≈":"≈","≠":"≠","≡":"≡","≤":"≤","≥":"≥","⊂":"⊂","⊃":"⊃","⊄":"⊄","⊆":"⊆","⊇":"⊇","⊕":"⊕","⊗":"⊗","⊥":"⊥","⋅":"⋅","⌈":"⌈","⌉":"⌉","⌊":"⌊","⌋":"⌋","〈":"⟨","〉":"⟩","◊":"◊","♠":"♠","♣":"♣","♥":"♥","♦":"♦"}},html5:{entities:{"Æ":"Æ","Æ":"Æ","&":"&","&":"&","Á":"Á","Á":"Á","Ă":"Ă","Â":"Â","Â":"Â","А":"А","𝔄":"𝔄","À":"À","À":"À","Α":"Α","Ā":"Ā","⩓":"⩓","Ą":"Ą","𝔸":"𝔸","⁡":"⁡","Å":"Å","Å":"Å","𝒜":"𝒜","≔":"≔","Ã":"Ã","Ã":"Ã","Ä":"Ä","Ä":"Ä","∖":"∖","⫧":"⫧","⌆":"⌆","Б":"Б","∵":"∵","ℬ":"ℬ","Β":"Β","𝔅":"𝔅","𝔹":"𝔹","˘":"˘","ℬ":"ℬ","≎":"≎","Ч":"Ч","©":"©","©":"©","Ć":"Ć","⋒":"⋒","ⅅ":"ⅅ","ℭ":"ℭ","Č":"Č","Ç":"Ç","Ç":"Ç","Ĉ":"Ĉ","∰":"∰","Ċ":"Ċ","¸":"¸","·":"·","ℭ":"ℭ","Χ":"Χ","⊙":"⊙","⊖":"⊖","⊕":"⊕","⊗":"⊗","∲":"∲","”":"”","’":"’","∷":"∷","⩴":"⩴","≡":"≡","∯":"∯","∮":"∮","ℂ":"ℂ","∐":"∐","∳":"∳","⨯":"⨯","𝒞":"𝒞","⋓":"⋓","≍":"≍","ⅅ":"ⅅ","⤑":"⤑","Ђ":"Ђ","Ѕ":"Ѕ","Џ":"Џ","‡":"‡","↡":"↡","⫤":"⫤","Ď":"Ď","Д":"Д","∇":"∇","Δ":"Δ","𝔇":"𝔇","´":"´","˙":"˙","˝":"˝","`":"`","˜":"˜","⋄":"⋄","ⅆ":"ⅆ","𝔻":"𝔻","¨":"¨","⃜":"⃜","≐":"≐","∯":"∯","¨":"¨","⇓":"⇓","⇐":"⇐","⇔":"⇔","⫤":"⫤","⟸":"⟸","⟺":"⟺","⟹":"⟹","⇒":"⇒","⊨":"⊨","⇑":"⇑","⇕":"⇕","∥":"∥","↓":"↓","⤓":"⤓","⇵":"⇵","̑":"̑","⥐":"⥐","⥞":"⥞","↽":"↽","⥖":"⥖","⥟":"⥟","⇁":"⇁","⥗":"⥗","⊤":"⊤","↧":"↧","⇓":"⇓","𝒟":"𝒟","Đ":"Đ","Ŋ":"Ŋ","Ð":"Ð","Ð":"Ð","É":"É","É":"É","Ě":"Ě","Ê":"Ê","Ê":"Ê","Э":"Э","Ė":"Ė","𝔈":"𝔈","È":"È","È":"È","∈":"∈","Ē":"Ē","◻":"◻","▫":"▫","Ę":"Ę","𝔼":"𝔼","Ε":"Ε","⩵":"⩵","≂":"≂","⇌":"⇌","ℰ":"ℰ","⩳":"⩳","Η":"Η","Ë":"Ë","Ë":"Ë","∃":"∃","ⅇ":"ⅇ","Ф":"Ф","𝔉":"𝔉","◼":"◼","▪":"▪","𝔽":"𝔽","∀":"∀","ℱ":"ℱ","ℱ":"ℱ","Ѓ":"Ѓ",">":">",">":">","Γ":"Γ","Ϝ":"Ϝ","Ğ":"Ğ","Ģ":"Ģ","Ĝ":"Ĝ","Г":"Г","Ġ":"Ġ","𝔊":"𝔊","⋙":"⋙","𝔾":"𝔾","≥":"≥","⋛":"⋛","≧":"≧","⪢":"⪢","≷":"≷","⩾":"⩾","≳":"≳","𝒢":"𝒢","≫":"≫","Ъ":"Ъ","ˇ":"ˇ","^":"^","Ĥ":"Ĥ","ℌ":"ℌ","ℋ":"ℋ","ℍ":"ℍ","─":"─","ℋ":"ℋ","Ħ":"Ħ","≎":"≎","≏":"≏","Е":"Е","IJ":"IJ","Ё":"Ё","Í":"Í","Í":"Í","Î":"Î","Î":"Î","И":"И","İ":"İ","ℑ":"ℑ","Ì":"Ì","Ì":"Ì","ℑ":"ℑ","Ī":"Ī","ⅈ":"ⅈ","⇒":"⇒","∬":"∬","∫":"∫","⋂":"⋂","⁣":"⁣","⁢":"⁢","Į":"Į","𝕀":"𝕀","Ι":"Ι","ℐ":"ℐ","Ĩ":"Ĩ","І":"І","Ï":"Ï","Ï":"Ï","Ĵ":"Ĵ","Й":"Й","𝔍":"𝔍","𝕁":"𝕁","𝒥":"𝒥","Ј":"Ј","Є":"Є","Х":"Х","Ќ":"Ќ","Κ":"Κ","Ķ":"Ķ","К":"К","𝔎":"𝔎","𝕂":"𝕂","𝒦":"𝒦","Љ":"Љ","<":"<","<":"<","Ĺ":"Ĺ","Λ":"Λ","⟪":"⟪","ℒ":"ℒ","↞":"↞","Ľ":"Ľ","Ļ":"Ļ","Л":"Л","⟨":"⟨","←":"←","⇤":"⇤","⇆":"⇆","⌈":"⌈","⟦":"⟦","⥡":"⥡","⇃":"⇃","⥙":"⥙","⌊":"⌊","↔":"↔","⥎":"⥎","⊣":"⊣","↤":"↤","⥚":"⥚","⊲":"⊲","⧏":"⧏","⊴":"⊴","⥑":"⥑","⥠":"⥠","↿":"↿","⥘":"⥘","↼":"↼","⥒":"⥒","⇐":"⇐","⇔":"⇔","⋚":"⋚","≦":"≦","≶":"≶","⪡":"⪡","⩽":"⩽","≲":"≲","𝔏":"𝔏","⋘":"⋘","⇚":"⇚","Ŀ":"Ŀ","⟵":"⟵","⟷":"⟷","⟶":"⟶","⟸":"⟸","⟺":"⟺","⟹":"⟹","𝕃":"𝕃","↙":"↙","↘":"↘","ℒ":"ℒ","↰":"↰","Ł":"Ł","≪":"≪","⤅":"⤅","М":"М"," ":" ","ℳ":"ℳ","𝔐":"𝔐","∓":"∓","𝕄":"𝕄","ℳ":"ℳ","Μ":"Μ","Њ":"Њ","Ń":"Ń","Ň":"Ň","Ņ":"Ņ","Н":"Н","​":"​","​":"​","​":"​","​":"​","≫":"≫","≪":"≪"," ":"\n","𝔑":"𝔑","⁠":"⁠"," ":" ","ℕ":"ℕ","⫬":"⫬","≢":"≢","≭":"≭","∦":"∦","∉":"∉","≠":"≠","≂̸":"≂̸","∄":"∄","≯":"≯","≱":"≱","≧̸":"≧̸","≫̸":"≫̸","≹":"≹","⩾̸":"⩾̸","≵":"≵","≎̸":"≎̸","≏̸":"≏̸","⋪":"⋪","⧏̸":"⧏̸","⋬":"⋬","≮":"≮","≰":"≰","≸":"≸","≪̸":"≪̸","⩽̸":"⩽̸","≴":"≴","⪢̸":"⪢̸","⪡̸":"⪡̸","⊀":"⊀","⪯̸":"⪯̸","⋠":"⋠","∌":"∌","⋫":"⋫","⧐̸":"⧐̸","⋭":"⋭","⊏̸":"⊏̸","⋢":"⋢","⊐̸":"⊐̸","⋣":"⋣","⊂⃒":"⊂⃒","⊈":"⊈","⊁":"⊁","⪰̸":"⪰̸","⋡":"⋡","≿̸":"≿̸","⊃⃒":"⊃⃒","⊉":"⊉","≁":"≁","≄":"≄","≇":"≇","≉":"≉","∤":"∤","𝒩":"𝒩","Ñ":"Ñ","Ñ":"Ñ","Ν":"Ν","Œ":"Œ","Ó":"Ó","Ó":"Ó","Ô":"Ô","Ô":"Ô","О":"О","Ő":"Ő","𝔒":"𝔒","Ò":"Ò","Ò":"Ò","Ō":"Ō","Ω":"Ω","Ο":"Ο","𝕆":"𝕆","“":"“","‘":"‘","⩔":"⩔","𝒪":"𝒪","Ø":"Ø","Ø":"Ø","Õ":"Õ","Õ":"Õ","⨷":"⨷","Ö":"Ö","Ö":"Ö","‾":"‾","⏞":"⏞","⎴":"⎴","⏜":"⏜","∂":"∂","П":"П","𝔓":"𝔓","Φ":"Φ","Π":"Π","±":"±","ℌ":"ℌ","ℙ":"ℙ","⪻":"⪻","≺":"≺","⪯":"⪯","≼":"≼","≾":"≾","″":"″","∏":"∏","∷":"∷","∝":"∝","𝒫":"𝒫","Ψ":"Ψ",""":'"',""":'"',"𝔔":"𝔔","ℚ":"ℚ","𝒬":"𝒬","⤐":"⤐","®":"®","®":"®","Ŕ":"Ŕ","⟫":"⟫","↠":"↠","⤖":"⤖","Ř":"Ř","Ŗ":"Ŗ","Р":"Р","ℜ":"ℜ","∋":"∋","⇋":"⇋","⥯":"⥯","ℜ":"ℜ","Ρ":"Ρ","⟩":"⟩","→":"→","⇥":"⇥","⇄":"⇄","⌉":"⌉","⟧":"⟧","⥝":"⥝","⇂":"⇂","⥕":"⥕","⌋":"⌋","⊢":"⊢","↦":"↦","⥛":"⥛","⊳":"⊳","⧐":"⧐","⊵":"⊵","⥏":"⥏","⥜":"⥜","↾":"↾","⥔":"⥔","⇀":"⇀","⥓":"⥓","⇒":"⇒","ℝ":"ℝ","⥰":"⥰","⇛":"⇛","ℛ":"ℛ","↱":"↱","⧴":"⧴","Щ":"Щ","Ш":"Ш","Ь":"Ь","Ś":"Ś","⪼":"⪼","Š":"Š","Ş":"Ş","Ŝ":"Ŝ","С":"С","𝔖":"𝔖","↓":"↓","←":"←","→":"→","↑":"↑","Σ":"Σ","∘":"∘","𝕊":"𝕊","√":"√","□":"□","⊓":"⊓","⊏":"⊏","⊑":"⊑","⊐":"⊐","⊒":"⊒","⊔":"⊔","𝒮":"𝒮","⋆":"⋆","⋐":"⋐","⋐":"⋐","⊆":"⊆","≻":"≻","⪰":"⪰","≽":"≽","≿":"≿","∋":"∋","∑":"∑","⋑":"⋑","⊃":"⊃","⊇":"⊇","⋑":"⋑","Þ":"Þ","Þ":"Þ","™":"™","Ћ":"Ћ","Ц":"Ц"," ":"\t","Τ":"Τ","Ť":"Ť","Ţ":"Ţ","Т":"Т","𝔗":"𝔗","∴":"∴","Θ":"Θ","  ":"  "," ":" ","∼":"∼","≃":"≃","≅":"≅","≈":"≈","𝕋":"𝕋","⃛":"⃛","𝒯":"𝒯","Ŧ":"Ŧ","Ú":"Ú","Ú":"Ú","↟":"↟","⥉":"⥉","Ў":"Ў","Ŭ":"Ŭ","Û":"Û","Û":"Û","У":"У","Ű":"Ű","𝔘":"𝔘","Ù":"Ù","Ù":"Ù","Ū":"Ū","_":"_","⏟":"⏟","⎵":"⎵","⏝":"⏝","⋃":"⋃","⊎":"⊎","Ų":"Ų","𝕌":"𝕌","↑":"↑","⤒":"⤒","⇅":"⇅","↕":"↕","⥮":"⥮","⊥":"⊥","↥":"↥","⇑":"⇑","⇕":"⇕","↖":"↖","↗":"↗","ϒ":"ϒ","Υ":"Υ","Ů":"Ů","𝒰":"𝒰","Ũ":"Ũ","Ü":"Ü","Ü":"Ü","⊫":"⊫","⫫":"⫫","В":"В","⊩":"⊩","⫦":"⫦","⋁":"⋁","‖":"‖","‖":"‖","∣":"∣","|":"|","❘":"❘","≀":"≀"," ":" ","𝔙":"𝔙","𝕍":"𝕍","𝒱":"𝒱","⊪":"⊪","Ŵ":"Ŵ","⋀":"⋀","𝔚":"𝔚","𝕎":"𝕎","𝒲":"𝒲","𝔛":"𝔛","Ξ":"Ξ","𝕏":"𝕏","𝒳":"𝒳","Я":"Я","Ї":"Ї","Ю":"Ю","Ý":"Ý","Ý":"Ý","Ŷ":"Ŷ","Ы":"Ы","𝔜":"𝔜","𝕐":"𝕐","𝒴":"𝒴","Ÿ":"Ÿ","Ж":"Ж","Ź":"Ź","Ž":"Ž","З":"З","Ż":"Ż","​":"​","Ζ":"Ζ","ℨ":"ℨ","ℤ":"ℤ","𝒵":"𝒵","á":"á","á":"á","ă":"ă","∾":"∾","∾̳":"∾̳","∿":"∿","â":"â","â":"â","´":"´","´":"´","а":"а","æ":"æ","æ":"æ","⁡":"⁡","𝔞":"𝔞","à":"à","à":"à","ℵ":"ℵ","ℵ":"ℵ","α":"α","ā":"ā","⨿":"⨿","&":"&","&":"&","∧":"∧","⩕":"⩕","⩜":"⩜","⩘":"⩘","⩚":"⩚","∠":"∠","⦤":"⦤","∠":"∠","∡":"∡","⦨":"⦨","⦩":"⦩","⦪":"⦪","⦫":"⦫","⦬":"⦬","⦭":"⦭","⦮":"⦮","⦯":"⦯","∟":"∟","⊾":"⊾","⦝":"⦝","∢":"∢","Å":"Å","⍼":"⍼","ą":"ą","𝕒":"𝕒","≈":"≈","⩰":"⩰","⩯":"⩯","≊":"≊","≋":"≋","'":"'","≈":"≈","≊":"≊","å":"å","å":"å","𝒶":"𝒶","*":"*","≈":"≈","≍":"≍","ã":"ã","ã":"ã","ä":"ä","ä":"ä","∳":"∳","⨑":"⨑","⫭":"⫭","≌":"≌","϶":"϶","‵":"‵","∽":"∽","⋍":"⋍","⊽":"⊽","⌅":"⌅","⌅":"⌅","⎵":"⎵","⎶":"⎶","≌":"≌","б":"б","„":"„","∵":"∵","∵":"∵","⦰":"⦰","϶":"϶","ℬ":"ℬ","β":"β","ℶ":"ℶ","≬":"≬","𝔟":"𝔟","⋂":"⋂","◯":"◯","⋃":"⋃","⨀":"⨀","⨁":"⨁","⨂":"⨂","⨆":"⨆","★":"★","▽":"▽","△":"△","⨄":"⨄","⋁":"⋁","⋀":"⋀","⤍":"⤍","⧫":"⧫","▪":"▪","▴":"▴","▾":"▾","◂":"◂","▸":"▸","␣":"␣","▒":"▒","░":"░","▓":"▓","█":"█","=⃥":"=⃥","≡⃥":"≡⃥","⌐":"⌐","𝕓":"𝕓","⊥":"⊥","⊥":"⊥","⋈":"⋈","╗":"╗","╔":"╔","╖":"╖","╓":"╓","═":"═","╦":"╦","╩":"╩","╤":"╤","╧":"╧","╝":"╝","╚":"╚","╜":"╜","╙":"╙","║":"║","╬":"╬","╣":"╣","╠":"╠","╫":"╫","╢":"╢","╟":"╟","⧉":"⧉","╕":"╕","╒":"╒","┐":"┐","┌":"┌","─":"─","╥":"╥","╨":"╨","┬":"┬","┴":"┴","⊟":"⊟","⊞":"⊞","⊠":"⊠","╛":"╛","╘":"╘","┘":"┘","└":"└","│":"│","╪":"╪","╡":"╡","╞":"╞","┼":"┼","┤":"┤","├":"├","‵":"‵","˘":"˘","¦":"¦","¦":"¦","𝒷":"𝒷","⁏":"⁏","∽":"∽","⋍":"⋍","\":"\\","⧅":"⧅","⟈":"⟈","•":"•","•":"•","≎":"≎","⪮":"⪮","≏":"≏","≏":"≏","ć":"ć","∩":"∩","⩄":"⩄","⩉":"⩉","⩋":"⩋","⩇":"⩇","⩀":"⩀","∩︀":"∩︀","⁁":"⁁","ˇ":"ˇ","⩍":"⩍","č":"č","ç":"ç","ç":"ç","ĉ":"ĉ","⩌":"⩌","⩐":"⩐","ċ":"ċ","¸":"¸","¸":"¸","⦲":"⦲","¢":"¢","¢":"¢","·":"·","𝔠":"𝔠","ч":"ч","✓":"✓","✓":"✓","χ":"χ","○":"○","⧃":"⧃","ˆ":"ˆ","≗":"≗","↺":"↺","↻":"↻","®":"®","Ⓢ":"Ⓢ","⊛":"⊛","⊚":"⊚","⊝":"⊝","≗":"≗","⨐":"⨐","⫯":"⫯","⧂":"⧂","♣":"♣","♣":"♣",":":":","≔":"≔","≔":"≔",",":",","@":"@","∁":"∁","∘":"∘","∁":"∁","ℂ":"ℂ","≅":"≅","⩭":"⩭","∮":"∮","𝕔":"𝕔","∐":"∐","©":"©","©":"©","℗":"℗","↵":"↵","✗":"✗","𝒸":"𝒸","⫏":"⫏","⫑":"⫑","⫐":"⫐","⫒":"⫒","⋯":"⋯","⤸":"⤸","⤵":"⤵","⋞":"⋞","⋟":"⋟","↶":"↶","⤽":"⤽","∪":"∪","⩈":"⩈","⩆":"⩆","⩊":"⩊","⊍":"⊍","⩅":"⩅","∪︀":"∪︀","↷":"↷","⤼":"⤼","⋞":"⋞","⋟":"⋟","⋎":"⋎","⋏":"⋏","¤":"¤","¤":"¤","↶":"↶","↷":"↷","⋎":"⋎","⋏":"⋏","∲":"∲","∱":"∱","⌭":"⌭","⇓":"⇓","⥥":"⥥","†":"†","ℸ":"ℸ","↓":"↓","‐":"‐","⊣":"⊣","⤏":"⤏","˝":"˝","ď":"ď","д":"д","ⅆ":"ⅆ","‡":"‡","⇊":"⇊","⩷":"⩷","°":"°","°":"°","δ":"δ","⦱":"⦱","⥿":"⥿","𝔡":"𝔡","⇃":"⇃","⇂":"⇂","⋄":"⋄","⋄":"⋄","♦":"♦","♦":"♦","¨":"¨","ϝ":"ϝ","⋲":"⋲","÷":"÷","÷":"÷","÷":"÷","⋇":"⋇","⋇":"⋇","ђ":"ђ","⌞":"⌞","⌍":"⌍","$":"$","𝕕":"𝕕","˙":"˙","≐":"≐","≑":"≑","∸":"∸","∔":"∔","⊡":"⊡","⌆":"⌆","↓":"↓","⇊":"⇊","⇃":"⇃","⇂":"⇂","⤐":"⤐","⌟":"⌟","⌌":"⌌","𝒹":"𝒹","ѕ":"ѕ","⧶":"⧶","đ":"đ","⋱":"⋱","▿":"▿","▾":"▾","⇵":"⇵","⥯":"⥯","⦦":"⦦","џ":"џ","⟿":"⟿","⩷":"⩷","≑":"≑","é":"é","é":"é","⩮":"⩮","ě":"ě","≖":"≖","ê":"ê","ê":"ê","≕":"≕","э":"э","ė":"ė","ⅇ":"ⅇ","≒":"≒","𝔢":"𝔢","⪚":"⪚","è":"è","è":"è","⪖":"⪖","⪘":"⪘","⪙":"⪙","⏧":"⏧","ℓ":"ℓ","⪕":"⪕","⪗":"⪗","ē":"ē","∅":"∅","∅":"∅","∅":"∅"," ":" "," ":" "," ":" ","ŋ":"ŋ"," ":" ","ę":"ę","𝕖":"𝕖","⋕":"⋕","⧣":"⧣","⩱":"⩱","ε":"ε","ε":"ε","ϵ":"ϵ","≖":"≖","≕":"≕","≂":"≂","⪖":"⪖","⪕":"⪕","=":"=","≟":"≟","≡":"≡","⩸":"⩸","⧥":"⧥","≓":"≓","⥱":"⥱","ℯ":"ℯ","≐":"≐","≂":"≂","η":"η","ð":"ð","ð":"ð","ë":"ë","ë":"ë","€":"€","!":"!","∃":"∃","ℰ":"ℰ","ⅇ":"ⅇ","≒":"≒","ф":"ф","♀":"♀","ffi":"ffi","ff":"ff","ffl":"ffl","𝔣":"𝔣","fi":"fi","fj":"fj","♭":"♭","fl":"fl","▱":"▱","ƒ":"ƒ","𝕗":"𝕗","∀":"∀","⋔":"⋔","⫙":"⫙","⨍":"⨍","½":"½","½":"½","⅓":"⅓","¼":"¼","¼":"¼","⅕":"⅕","⅙":"⅙","⅛":"⅛","⅔":"⅔","⅖":"⅖","¾":"¾","¾":"¾","⅗":"⅗","⅜":"⅜","⅘":"⅘","⅚":"⅚","⅝":"⅝","⅞":"⅞","⁄":"⁄","⌢":"⌢","𝒻":"𝒻","≧":"≧","⪌":"⪌","ǵ":"ǵ","γ":"γ","ϝ":"ϝ","⪆":"⪆","ğ":"ğ","ĝ":"ĝ","г":"г","ġ":"ġ","≥":"≥","⋛":"⋛","≥":"≥","≧":"≧","⩾":"⩾","⩾":"⩾","⪩":"⪩","⪀":"⪀","⪂":"⪂","⪄":"⪄","⋛︀":"⋛︀","⪔":"⪔","𝔤":"𝔤","≫":"≫","⋙":"⋙","ℷ":"ℷ","ѓ":"ѓ","≷":"≷","⪒":"⪒","⪥":"⪥","⪤":"⪤","≩":"≩","⪊":"⪊","⪊":"⪊","⪈":"⪈","⪈":"⪈","≩":"≩","⋧":"⋧","𝕘":"𝕘","`":"`","ℊ":"ℊ","≳":"≳","⪎":"⪎","⪐":"⪐",">":">",">":">","⪧":"⪧","⩺":"⩺","⋗":"⋗","⦕":"⦕","⩼":"⩼","⪆":"⪆","⥸":"⥸","⋗":"⋗","⋛":"⋛","⪌":"⪌","≷":"≷","≳":"≳","≩︀":"≩︀","≩︀":"≩︀","⇔":"⇔"," ":" ","½":"½","ℋ":"ℋ","ъ":"ъ","↔":"↔","⥈":"⥈","↭":"↭","ℏ":"ℏ","ĥ":"ĥ","♥":"♥","♥":"♥","…":"…","⊹":"⊹","𝔥":"𝔥","⤥":"⤥","⤦":"⤦","⇿":"⇿","∻":"∻","↩":"↩","↪":"↪","𝕙":"𝕙","―":"―","𝒽":"𝒽","ℏ":"ℏ","ħ":"ħ","⁃":"⁃","‐":"‐","í":"í","í":"í","⁣":"⁣","î":"î","î":"î","и":"и","е":"е","¡":"¡","¡":"¡","⇔":"⇔","𝔦":"𝔦","ì":"ì","ì":"ì","ⅈ":"ⅈ","⨌":"⨌","∭":"∭","⧜":"⧜","℩":"℩","ij":"ij","ī":"ī","ℑ":"ℑ","ℐ":"ℐ","ℑ":"ℑ","ı":"ı","⊷":"⊷","Ƶ":"Ƶ","∈":"∈","℅":"℅","∞":"∞","⧝":"⧝","ı":"ı","∫":"∫","⊺":"⊺","ℤ":"ℤ","⊺":"⊺","⨗":"⨗","⨼":"⨼","ё":"ё","į":"į","𝕚":"𝕚","ι":"ι","⨼":"⨼","¿":"¿","¿":"¿","𝒾":"𝒾","∈":"∈","⋹":"⋹","⋵":"⋵","⋴":"⋴","⋳":"⋳","∈":"∈","⁢":"⁢","ĩ":"ĩ","і":"і","ï":"ï","ï":"ï","ĵ":"ĵ","й":"й","𝔧":"𝔧","ȷ":"ȷ","𝕛":"𝕛","𝒿":"𝒿","ј":"ј","є":"є","κ":"κ","ϰ":"ϰ","ķ":"ķ","к":"к","𝔨":"𝔨","ĸ":"ĸ","х":"х","ќ":"ќ","𝕜":"𝕜","𝓀":"𝓀","⇚":"⇚","⇐":"⇐","⤛":"⤛","⤎":"⤎","≦":"≦","⪋":"⪋","⥢":"⥢","ĺ":"ĺ","⦴":"⦴","ℒ":"ℒ","λ":"λ","⟨":"⟨","⦑":"⦑","⟨":"⟨","⪅":"⪅","«":"«","«":"«","←":"←","⇤":"⇤","⤟":"⤟","⤝":"⤝","↩":"↩","↫":"↫","⤹":"⤹","⥳":"⥳","↢":"↢","⪫":"⪫","⤙":"⤙","⪭":"⪭","⪭︀":"⪭︀","⤌":"⤌","❲":"❲","{":"{","[":"[","⦋":"⦋","⦏":"⦏","⦍":"⦍","ľ":"ľ","ļ":"ļ","⌈":"⌈","{":"{","л":"л","⤶":"⤶","“":"“","„":"„","⥧":"⥧","⥋":"⥋","↲":"↲","≤":"≤","←":"←","↢":"↢","↽":"↽","↼":"↼","⇇":"⇇","↔":"↔","⇆":"⇆","⇋":"⇋","↭":"↭","⋋":"⋋","⋚":"⋚","≤":"≤","≦":"≦","⩽":"⩽","⩽":"⩽","⪨":"⪨","⩿":"⩿","⪁":"⪁","⪃":"⪃","⋚︀":"⋚︀","⪓":"⪓","⪅":"⪅","⋖":"⋖","⋚":"⋚","⪋":"⪋","≶":"≶","≲":"≲","⥼":"⥼","⌊":"⌊","𝔩":"𝔩","≶":"≶","⪑":"⪑","↽":"↽","↼":"↼","⥪":"⥪","▄":"▄","љ":"љ","≪":"≪","⇇":"⇇","⌞":"⌞","⥫":"⥫","◺":"◺","ŀ":"ŀ","⎰":"⎰","⎰":"⎰","≨":"≨","⪉":"⪉","⪉":"⪉","⪇":"⪇","⪇":"⪇","≨":"≨","⋦":"⋦","⟬":"⟬","⇽":"⇽","⟦":"⟦","⟵":"⟵","⟷":"⟷","⟼":"⟼","⟶":"⟶","↫":"↫","↬":"↬","⦅":"⦅","𝕝":"𝕝","⨭":"⨭","⨴":"⨴","∗":"∗","_":"_","◊":"◊","◊":"◊","⧫":"⧫","(":"(","⦓":"⦓","⇆":"⇆","⌟":"⌟","⇋":"⇋","⥭":"⥭","‎":"‎","⊿":"⊿","‹":"‹","𝓁":"𝓁","↰":"↰","≲":"≲","⪍":"⪍","⪏":"⪏","[":"[","‘":"‘","‚":"‚","ł":"ł","<":"<","<":"<","⪦":"⪦","⩹":"⩹","⋖":"⋖","⋋":"⋋","⋉":"⋉","⥶":"⥶","⩻":"⩻","⦖":"⦖","◃":"◃","⊴":"⊴","◂":"◂","⥊":"⥊","⥦":"⥦","≨︀":"≨︀","≨︀":"≨︀","∺":"∺","¯":"¯","¯":"¯","♂":"♂","✠":"✠","✠":"✠","↦":"↦","↦":"↦","↧":"↧","↤":"↤","↥":"↥","▮":"▮","⨩":"⨩","м":"м","—":"—","∡":"∡","𝔪":"𝔪","℧":"℧","µ":"µ","µ":"µ","∣":"∣","*":"*","⫰":"⫰","·":"·","·":"·","−":"−","⊟":"⊟","∸":"∸","⨪":"⨪","⫛":"⫛","…":"…","∓":"∓","⊧":"⊧","𝕞":"𝕞","∓":"∓","𝓂":"𝓂","∾":"∾","μ":"μ","⊸":"⊸","⊸":"⊸","⋙̸":"⋙̸","≫⃒":"≫⃒","≫̸":"≫̸","⇍":"⇍","⇎":"⇎","⋘̸":"⋘̸","≪⃒":"≪⃒","≪̸":"≪̸","⇏":"⇏","⊯":"⊯","⊮":"⊮","∇":"∇","ń":"ń","∠⃒":"∠⃒","≉":"≉","⩰̸":"⩰̸","≋̸":"≋̸","ʼn":"ʼn","≉":"≉","♮":"♮","♮":"♮","ℕ":"ℕ"," ":" "," ":" ","≎̸":"≎̸","≏̸":"≏̸","⩃":"⩃","ň":"ň","ņ":"ņ","≇":"≇","⩭̸":"⩭̸","⩂":"⩂","н":"н","–":"–","≠":"≠","⇗":"⇗","⤤":"⤤","↗":"↗","↗":"↗","≐̸":"≐̸","≢":"≢","⤨":"⤨","≂̸":"≂̸","∄":"∄","∄":"∄","𝔫":"𝔫","≧̸":"≧̸","≱":"≱","≱":"≱","≧̸":"≧̸","⩾̸":"⩾̸","⩾̸":"⩾̸","≵":"≵","≯":"≯","≯":"≯","⇎":"⇎","↮":"↮","⫲":"⫲","∋":"∋","⋼":"⋼","⋺":"⋺","∋":"∋","њ":"њ","⇍":"⇍","≦̸":"≦̸","↚":"↚","‥":"‥","≰":"≰","↚":"↚","↮":"↮","≰":"≰","≦̸":"≦̸","⩽̸":"⩽̸","⩽̸":"⩽̸","≮":"≮","≴":"≴","≮":"≮","⋪":"⋪","⋬":"⋬","∤":"∤","𝕟":"𝕟","¬":"¬","¬":"¬","∉":"∉","⋹̸":"⋹̸","⋵̸":"⋵̸","∉":"∉","⋷":"⋷","⋶":"⋶","∌":"∌","∌":"∌","⋾":"⋾","⋽":"⋽","∦":"∦","∦":"∦","⫽⃥":"⫽⃥","∂̸":"∂̸","⨔":"⨔","⊀":"⊀","⋠":"⋠","⪯̸":"⪯̸","⊀":"⊀","⪯̸":"⪯̸","⇏":"⇏","↛":"↛","⤳̸":"⤳̸","↝̸":"↝̸","↛":"↛","⋫":"⋫","⋭":"⋭","⊁":"⊁","⋡":"⋡","⪰̸":"⪰̸","𝓃":"𝓃","∤":"∤","∦":"∦","≁":"≁","≄":"≄","≄":"≄","∤":"∤","∦":"∦","⋢":"⋢","⋣":"⋣","⊄":"⊄","⫅̸":"⫅̸","⊈":"⊈","⊂⃒":"⊂⃒","⊈":"⊈","⫅̸":"⫅̸","⊁":"⊁","⪰̸":"⪰̸","⊅":"⊅","⫆̸":"⫆̸","⊉":"⊉","⊃⃒":"⊃⃒","⊉":"⊉","⫆̸":"⫆̸","≹":"≹","ñ":"ñ","ñ":"ñ","≸":"≸","⋪":"⋪","⋬":"⋬","⋫":"⋫","⋭":"⋭","ν":"ν","#":"#","№":"№"," ":" ","⊭":"⊭","⤄":"⤄","≍⃒":"≍⃒","⊬":"⊬","≥⃒":"≥⃒",">⃒":">⃒","⧞":"⧞","⤂":"⤂","≤⃒":"≤⃒","<⃒":"<⃒","⊴⃒":"⊴⃒","⤃":"⤃","⊵⃒":"⊵⃒","∼⃒":"∼⃒","⇖":"⇖","⤣":"⤣","↖":"↖","↖":"↖","⤧":"⤧","Ⓢ":"Ⓢ","ó":"ó","ó":"ó","⊛":"⊛","⊚":"⊚","ô":"ô","ô":"ô","о":"о","⊝":"⊝","ő":"ő","⨸":"⨸","⊙":"⊙","⦼":"⦼","œ":"œ","⦿":"⦿","𝔬":"𝔬","˛":"˛","ò":"ò","ò":"ò","⧁":"⧁","⦵":"⦵","Ω":"Ω","∮":"∮","↺":"↺","⦾":"⦾","⦻":"⦻","‾":"‾","⧀":"⧀","ō":"ō","ω":"ω","ο":"ο","⦶":"⦶","⊖":"⊖","𝕠":"𝕠","⦷":"⦷","⦹":"⦹","⊕":"⊕","∨":"∨","↻":"↻","⩝":"⩝","ℴ":"ℴ","ℴ":"ℴ","ª":"ª","ª":"ª","º":"º","º":"º","⊶":"⊶","⩖":"⩖","⩗":"⩗","⩛":"⩛","ℴ":"ℴ","ø":"ø","ø":"ø","⊘":"⊘","õ":"õ","õ":"õ","⊗":"⊗","⨶":"⨶","ö":"ö","ö":"ö","⌽":"⌽","∥":"∥","¶":"¶","¶":"¶","∥":"∥","⫳":"⫳","⫽":"⫽","∂":"∂","п":"п","%":"%",".":".","‰":"‰","⊥":"⊥","‱":"‱","𝔭":"𝔭","φ":"φ","ϕ":"ϕ","ℳ":"ℳ","☎":"☎","π":"π","⋔":"⋔","ϖ":"ϖ","ℏ":"ℏ","ℎ":"ℎ","ℏ":"ℏ","+":"+","⨣":"⨣","⊞":"⊞","⨢":"⨢","∔":"∔","⨥":"⨥","⩲":"⩲","±":"±","±":"±","⨦":"⨦","⨧":"⨧","±":"±","⨕":"⨕","𝕡":"𝕡","£":"£","£":"£","≺":"≺","⪳":"⪳","⪷":"⪷","≼":"≼","⪯":"⪯","≺":"≺","⪷":"⪷","≼":"≼","⪯":"⪯","⪹":"⪹","⪵":"⪵","⋨":"⋨","≾":"≾","′":"′","ℙ":"ℙ","⪵":"⪵","⪹":"⪹","⋨":"⋨","∏":"∏","⌮":"⌮","⌒":"⌒","⌓":"⌓","∝":"∝","∝":"∝","≾":"≾","⊰":"⊰","𝓅":"𝓅","ψ":"ψ"," ":" ","𝔮":"𝔮","⨌":"⨌","𝕢":"𝕢","⁗":"⁗","𝓆":"𝓆","ℍ":"ℍ","⨖":"⨖","?":"?","≟":"≟",""":'"',""":'"',"⇛":"⇛","⇒":"⇒","⤜":"⤜","⤏":"⤏","⥤":"⥤","∽̱":"∽̱","ŕ":"ŕ","√":"√","⦳":"⦳","⟩":"⟩","⦒":"⦒","⦥":"⦥","⟩":"⟩","»":"»","»":"»","→":"→","⥵":"⥵","⇥":"⇥","⤠":"⤠","⤳":"⤳","⤞":"⤞","↪":"↪","↬":"↬","⥅":"⥅","⥴":"⥴","↣":"↣","↝":"↝","⤚":"⤚","∶":"∶","ℚ":"ℚ","⤍":"⤍","❳":"❳","}":"}","]":"]","⦌":"⦌","⦎":"⦎","⦐":"⦐","ř":"ř","ŗ":"ŗ","⌉":"⌉","}":"}","р":"р","⤷":"⤷","⥩":"⥩","”":"”","”":"”","↳":"↳","ℜ":"ℜ","ℛ":"ℛ","ℜ":"ℜ","ℝ":"ℝ","▭":"▭","®":"®","®":"®","⥽":"⥽","⌋":"⌋","𝔯":"𝔯","⇁":"⇁","⇀":"⇀","⥬":"⥬","ρ":"ρ","ϱ":"ϱ","→":"→","↣":"↣","⇁":"⇁","⇀":"⇀","⇄":"⇄","⇌":"⇌","⇉":"⇉","↝":"↝","⋌":"⋌","˚":"˚","≓":"≓","⇄":"⇄","⇌":"⇌","‏":"‏","⎱":"⎱","⎱":"⎱","⫮":"⫮","⟭":"⟭","⇾":"⇾","⟧":"⟧","⦆":"⦆","𝕣":"𝕣","⨮":"⨮","⨵":"⨵",")":")","⦔":"⦔","⨒":"⨒","⇉":"⇉","›":"›","𝓇":"𝓇","↱":"↱","]":"]","’":"’","’":"’","⋌":"⋌","⋊":"⋊","▹":"▹","⊵":"⊵","▸":"▸","⧎":"⧎","⥨":"⥨","℞":"℞","ś":"ś","‚":"‚","≻":"≻","⪴":"⪴","⪸":"⪸","š":"š","≽":"≽","⪰":"⪰","ş":"ş","ŝ":"ŝ","⪶":"⪶","⪺":"⪺","⋩":"⋩","⨓":"⨓","≿":"≿","с":"с","⋅":"⋅","⊡":"⊡","⩦":"⩦","⇘":"⇘","⤥":"⤥","↘":"↘","↘":"↘","§":"§","§":"§",";":";","⤩":"⤩","∖":"∖","∖":"∖","✶":"✶","𝔰":"𝔰","⌢":"⌢","♯":"♯","щ":"щ","ш":"ш","∣":"∣","∥":"∥","­":"­","­":"­","σ":"σ","ς":"ς","ς":"ς","∼":"∼","⩪":"⩪","≃":"≃","≃":"≃","⪞":"⪞","⪠":"⪠","⪝":"⪝","⪟":"⪟","≆":"≆","⨤":"⨤","⥲":"⥲","←":"←","∖":"∖","⨳":"⨳","⧤":"⧤","∣":"∣","⌣":"⌣","⪪":"⪪","⪬":"⪬","⪬︀":"⪬︀","ь":"ь","/":"/","⧄":"⧄","⌿":"⌿","𝕤":"𝕤","♠":"♠","♠":"♠","∥":"∥","⊓":"⊓","⊓︀":"⊓︀","⊔":"⊔","⊔︀":"⊔︀","⊏":"⊏","⊑":"⊑","⊏":"⊏","⊑":"⊑","⊐":"⊐","⊒":"⊒","⊐":"⊐","⊒":"⊒","□":"□","□":"□","▪":"▪","▪":"▪","→":"→","𝓈":"𝓈","∖":"∖","⌣":"⌣","⋆":"⋆","☆":"☆","★":"★","ϵ":"ϵ","ϕ":"ϕ","¯":"¯","⊂":"⊂","⫅":"⫅","⪽":"⪽","⊆":"⊆","⫃":"⫃","⫁":"⫁","⫋":"⫋","⊊":"⊊","⪿":"⪿","⥹":"⥹","⊂":"⊂","⊆":"⊆","⫅":"⫅","⊊":"⊊","⫋":"⫋","⫇":"⫇","⫕":"⫕","⫓":"⫓","≻":"≻","⪸":"⪸","≽":"≽","⪰":"⪰","⪺":"⪺","⪶":"⪶","⋩":"⋩","≿":"≿","∑":"∑","♪":"♪","¹":"¹","¹":"¹","²":"²","²":"²","³":"³","³":"³","⊃":"⊃","⫆":"⫆","⪾":"⪾","⫘":"⫘","⊇":"⊇","⫄":"⫄","⟉":"⟉","⫗":"⫗","⥻":"⥻","⫂":"⫂","⫌":"⫌","⊋":"⊋","⫀":"⫀","⊃":"⊃","⊇":"⊇","⫆":"⫆","⊋":"⊋","⫌":"⫌","⫈":"⫈","⫔":"⫔","⫖":"⫖","⇙":"⇙","⤦":"⤦","↙":"↙","↙":"↙","⤪":"⤪","ß":"ß","ß":"ß","⌖":"⌖","τ":"τ","⎴":"⎴","ť":"ť","ţ":"ţ","т":"т","⃛":"⃛","⌕":"⌕","𝔱":"𝔱","∴":"∴","∴":"∴","θ":"θ","ϑ":"ϑ","ϑ":"ϑ","≈":"≈","∼":"∼"," ":" ","≈":"≈","∼":"∼","þ":"þ","þ":"þ","˜":"˜","×":"×","×":"×","⊠":"⊠","⨱":"⨱","⨰":"⨰","∭":"∭","⤨":"⤨","⊤":"⊤","⌶":"⌶","⫱":"⫱","𝕥":"𝕥","⫚":"⫚","⤩":"⤩","‴":"‴","™":"™","▵":"▵","▿":"▿","◃":"◃","⊴":"⊴","≜":"≜","▹":"▹","⊵":"⊵","◬":"◬","≜":"≜","⨺":"⨺","⨹":"⨹","⧍":"⧍","⨻":"⨻","⏢":"⏢","𝓉":"𝓉","ц":"ц","ћ":"ћ","ŧ":"ŧ","≬":"≬","↞":"↞","↠":"↠","⇑":"⇑","⥣":"⥣","ú":"ú","ú":"ú","↑":"↑","ў":"ў","ŭ":"ŭ","û":"û","û":"û","у":"у","⇅":"⇅","ű":"ű","⥮":"⥮","⥾":"⥾","𝔲":"𝔲","ù":"ù","ù":"ù","↿":"↿","↾":"↾","▀":"▀","⌜":"⌜","⌜":"⌜","⌏":"⌏","◸":"◸","ū":"ū","¨":"¨","¨":"¨","ų":"ų","𝕦":"𝕦","↑":"↑","↕":"↕","↿":"↿","↾":"↾","⊎":"⊎","υ":"υ","ϒ":"ϒ","υ":"υ","⇈":"⇈","⌝":"⌝","⌝":"⌝","⌎":"⌎","ů":"ů","◹":"◹","𝓊":"𝓊","⋰":"⋰","ũ":"ũ","▵":"▵","▴":"▴","⇈":"⇈","ü":"ü","ü":"ü","⦧":"⦧","⇕":"⇕","⫨":"⫨","⫩":"⫩","⊨":"⊨","⦜":"⦜","ϵ":"ϵ","ϰ":"ϰ","∅":"∅","ϕ":"ϕ","ϖ":"ϖ","∝":"∝","↕":"↕","ϱ":"ϱ","ς":"ς","⊊︀":"⊊︀","⫋︀":"⫋︀","⊋︀":"⊋︀","⫌︀":"⫌︀","ϑ":"ϑ","⊲":"⊲","⊳":"⊳","в":"в","⊢":"⊢","∨":"∨","⊻":"⊻","≚":"≚","⋮":"⋮","|":"|","|":"|","𝔳":"𝔳","⊲":"⊲","⊂⃒":"⊂⃒","⊃⃒":"⊃⃒","𝕧":"𝕧","∝":"∝","⊳":"⊳","𝓋":"𝓋","⫋︀":"⫋︀","⊊︀":"⊊︀","⫌︀":"⫌︀","⊋︀":"⊋︀","⦚":"⦚","ŵ":"ŵ","⩟":"⩟","∧":"∧","≙":"≙","℘":"℘","𝔴":"𝔴","𝕨":"𝕨","℘":"℘","≀":"≀","≀":"≀","𝓌":"𝓌","⋂":"⋂","◯":"◯","⋃":"⋃","▽":"▽","𝔵":"𝔵","⟺":"⟺","⟷":"⟷","ξ":"ξ","⟸":"⟸","⟵":"⟵","⟼":"⟼","⋻":"⋻","⨀":"⨀","𝕩":"𝕩","⨁":"⨁","⨂":"⨂","⟹":"⟹","⟶":"⟶","𝓍":"𝓍","⨆":"⨆","⨄":"⨄","△":"△","⋁":"⋁","⋀":"⋀","ý":"ý","ý":"ý","я":"я","ŷ":"ŷ","ы":"ы","¥":"¥","¥":"¥","𝔶":"𝔶","ї":"ї","𝕪":"𝕪","𝓎":"𝓎","ю":"ю","ÿ":"ÿ","ÿ":"ÿ","ź":"ź","ž":"ž","з":"з","ż":"ż","ℨ":"ℨ","ζ":"ζ","𝔷":"𝔷","ж":"ж","⇝":"⇝","𝕫":"𝕫","𝓏":"𝓏","‍":"‍","‌":"‌"},characters:{"Æ":"Æ","&":"&","Á":"Á","Ă":"Ă","Â":"Â","А":"А","𝔄":"𝔄","À":"À","Α":"Α","Ā":"Ā","⩓":"⩓","Ą":"Ą","𝔸":"𝔸","⁡":"⁡","Å":"Å","𝒜":"𝒜","≔":"≔","Ã":"Ã","Ä":"Ä","∖":"∖","⫧":"⫧","⌆":"⌆","Б":"Б","∵":"∵","ℬ":"ℬ","Β":"Β","𝔅":"𝔅","𝔹":"𝔹","˘":"˘","≎":"≎","Ч":"Ч","©":"©","Ć":"Ć","⋒":"⋒","ⅅ":"ⅅ","ℭ":"ℭ","Č":"Č","Ç":"Ç","Ĉ":"Ĉ","∰":"∰","Ċ":"Ċ","¸":"¸","·":"·","Χ":"Χ","⊙":"⊙","⊖":"⊖","⊕":"⊕","⊗":"⊗","∲":"∲","”":"”","’":"’","∷":"∷","⩴":"⩴","≡":"≡","∯":"∯","∮":"∮","ℂ":"ℂ","∐":"∐","∳":"∳","⨯":"⨯","𝒞":"𝒞","⋓":"⋓","≍":"≍","⤑":"⤑","Ђ":"Ђ","Ѕ":"Ѕ","Џ":"Џ","‡":"‡","↡":"↡","⫤":"⫤","Ď":"Ď","Д":"Д","∇":"∇","Δ":"Δ","𝔇":"𝔇","´":"´","˙":"˙","˝":"˝","`":"`","˜":"˜","⋄":"⋄","ⅆ":"ⅆ","𝔻":"𝔻","¨":"¨","⃜":"⃜","≐":"≐","⇓":"⇓","⇐":"⇐","⇔":"⇔","⟸":"⟸","⟺":"⟺","⟹":"⟹","⇒":"⇒","⊨":"⊨","⇑":"⇑","⇕":"⇕","∥":"∥","↓":"↓","⤓":"⤓","⇵":"⇵","̑":"̑","⥐":"⥐","⥞":"⥞","↽":"↽","⥖":"⥖","⥟":"⥟","⇁":"⇁","⥗":"⥗","⊤":"⊤","↧":"↧","𝒟":"𝒟","Đ":"Đ","Ŋ":"Ŋ","Ð":"Ð","É":"É","Ě":"Ě","Ê":"Ê","Э":"Э","Ė":"Ė","𝔈":"𝔈","È":"È","∈":"∈","Ē":"Ē","◻":"◻","▫":"▫","Ę":"Ę","𝔼":"𝔼","Ε":"Ε","⩵":"⩵","≂":"≂","⇌":"⇌","ℰ":"ℰ","⩳":"⩳","Η":"Η","Ë":"Ë","∃":"∃","ⅇ":"ⅇ","Ф":"Ф","𝔉":"𝔉","◼":"◼","▪":"▪","𝔽":"𝔽","∀":"∀","ℱ":"ℱ","Ѓ":"Ѓ",">":">","Γ":"Γ","Ϝ":"Ϝ","Ğ":"Ğ","Ģ":"Ģ","Ĝ":"Ĝ","Г":"Г","Ġ":"Ġ","𝔊":"𝔊","⋙":"⋙","𝔾":"𝔾","≥":"≥","⋛":"⋛","≧":"≧","⪢":"⪢","≷":"≷","⩾":"⩾","≳":"≳","𝒢":"𝒢","≫":"≫","Ъ":"Ъ","ˇ":"ˇ","^":"^","Ĥ":"Ĥ","ℌ":"ℌ","ℋ":"ℋ","ℍ":"ℍ","─":"─","Ħ":"Ħ","≏":"≏","Е":"Е","IJ":"IJ","Ё":"Ё","Í":"Í","Î":"Î","И":"И","İ":"İ","ℑ":"ℑ","Ì":"Ì","Ī":"Ī","ⅈ":"ⅈ","∬":"∬","∫":"∫","⋂":"⋂","⁣":"⁣","⁢":"⁢","Į":"Į","𝕀":"𝕀","Ι":"Ι","ℐ":"ℐ","Ĩ":"Ĩ","І":"І","Ï":"Ï","Ĵ":"Ĵ","Й":"Й","𝔍":"𝔍","𝕁":"𝕁","𝒥":"𝒥","Ј":"Ј","Є":"Є","Х":"Х","Ќ":"Ќ","Κ":"Κ","Ķ":"Ķ","К":"К","𝔎":"𝔎","𝕂":"𝕂","𝒦":"𝒦","Љ":"Љ","<":"<","Ĺ":"Ĺ","Λ":"Λ","⟪":"⟪","ℒ":"ℒ","↞":"↞","Ľ":"Ľ","Ļ":"Ļ","Л":"Л","⟨":"⟨","←":"←","⇤":"⇤","⇆":"⇆","⌈":"⌈","⟦":"⟦","⥡":"⥡","⇃":"⇃","⥙":"⥙","⌊":"⌊","↔":"↔","⥎":"⥎","⊣":"⊣","↤":"↤","⥚":"⥚","⊲":"⊲","⧏":"⧏","⊴":"⊴","⥑":"⥑","⥠":"⥠","↿":"↿","⥘":"⥘","↼":"↼","⥒":"⥒","⋚":"⋚","≦":"≦","≶":"≶","⪡":"⪡","⩽":"⩽","≲":"≲","𝔏":"𝔏","⋘":"⋘","⇚":"⇚","Ŀ":"Ŀ","⟵":"⟵","⟷":"⟷","⟶":"⟶","𝕃":"𝕃","↙":"↙","↘":"↘","↰":"↰","Ł":"Ł","≪":"≪","⤅":"⤅","М":"М"," ":" ","ℳ":"ℳ","𝔐":"𝔐","∓":"∓","𝕄":"𝕄","Μ":"Μ","Њ":"Њ","Ń":"Ń","Ň":"Ň","Ņ":"Ņ","Н":"Н","​":"​","\n":" ","𝔑":"𝔑","⁠":"⁠"," ":" ","ℕ":"ℕ","⫬":"⫬","≢":"≢","≭":"≭","∦":"∦","∉":"∉","≠":"≠","≂̸":"≂̸","∄":"∄","≯":"≯","≱":"≱","≧̸":"≧̸","≫̸":"≫̸","≹":"≹","⩾̸":"⩾̸","≵":"≵","≎̸":"≎̸","≏̸":"≏̸","⋪":"⋪","⧏̸":"⧏̸","⋬":"⋬","≮":"≮","≰":"≰","≸":"≸","≪̸":"≪̸","⩽̸":"⩽̸","≴":"≴","⪢̸":"⪢̸","⪡̸":"⪡̸","⊀":"⊀","⪯̸":"⪯̸","⋠":"⋠","∌":"∌","⋫":"⋫","⧐̸":"⧐̸","⋭":"⋭","⊏̸":"⊏̸","⋢":"⋢","⊐̸":"⊐̸","⋣":"⋣","⊂⃒":"⊂⃒","⊈":"⊈","⊁":"⊁","⪰̸":"⪰̸","⋡":"⋡","≿̸":"≿̸","⊃⃒":"⊃⃒","⊉":"⊉","≁":"≁","≄":"≄","≇":"≇","≉":"≉","∤":"∤","𝒩":"𝒩","Ñ":"Ñ","Ν":"Ν","Œ":"Œ","Ó":"Ó","Ô":"Ô","О":"О","Ő":"Ő","𝔒":"𝔒","Ò":"Ò","Ō":"Ō","Ω":"Ω","Ο":"Ο","𝕆":"𝕆","“":"“","‘":"‘","⩔":"⩔","𝒪":"𝒪","Ø":"Ø","Õ":"Õ","⨷":"⨷","Ö":"Ö","‾":"‾","⏞":"⏞","⎴":"⎴","⏜":"⏜","∂":"∂","П":"П","𝔓":"𝔓","Φ":"Φ","Π":"Π","±":"±","ℙ":"ℙ","⪻":"⪻","≺":"≺","⪯":"⪯","≼":"≼","≾":"≾","″":"″","∏":"∏","∝":"∝","𝒫":"𝒫","Ψ":"Ψ",'"':""","𝔔":"𝔔","ℚ":"ℚ","𝒬":"𝒬","⤐":"⤐","®":"®","Ŕ":"Ŕ","⟫":"⟫","↠":"↠","⤖":"⤖","Ř":"Ř","Ŗ":"Ŗ","Р":"Р","ℜ":"ℜ","∋":"∋","⇋":"⇋","⥯":"⥯","Ρ":"Ρ","⟩":"⟩","→":"→","⇥":"⇥","⇄":"⇄","⌉":"⌉","⟧":"⟧","⥝":"⥝","⇂":"⇂","⥕":"⥕","⌋":"⌋","⊢":"⊢","↦":"↦","⥛":"⥛","⊳":"⊳","⧐":"⧐","⊵":"⊵","⥏":"⥏","⥜":"⥜","↾":"↾","⥔":"⥔","⇀":"⇀","⥓":"⥓","ℝ":"ℝ","⥰":"⥰","⇛":"⇛","ℛ":"ℛ","↱":"↱","⧴":"⧴","Щ":"Щ","Ш":"Ш","Ь":"Ь","Ś":"Ś","⪼":"⪼","Š":"Š","Ş":"Ş","Ŝ":"Ŝ","С":"С","𝔖":"𝔖","↑":"↑","Σ":"Σ","∘":"∘","𝕊":"𝕊","√":"√","□":"□","⊓":"⊓","⊏":"⊏","⊑":"⊑","⊐":"⊐","⊒":"⊒","⊔":"⊔","𝒮":"𝒮","⋆":"⋆","⋐":"⋐","⊆":"⊆","≻":"≻","⪰":"⪰","≽":"≽","≿":"≿","∑":"∑","⋑":"⋑","⊃":"⊃","⊇":"⊇","Þ":"Þ","™":"™","Ћ":"Ћ","Ц":"Ц","\t":" ","Τ":"Τ","Ť":"Ť","Ţ":"Ţ","Т":"Т","𝔗":"𝔗","∴":"∴","Θ":"Θ","  ":"  "," ":" ","∼":"∼","≃":"≃","≅":"≅","≈":"≈","𝕋":"𝕋","⃛":"⃛","𝒯":"𝒯","Ŧ":"Ŧ","Ú":"Ú","↟":"↟","⥉":"⥉","Ў":"Ў","Ŭ":"Ŭ","Û":"Û","У":"У","Ű":"Ű","𝔘":"𝔘","Ù":"Ù","Ū":"Ū",_:"_","⏟":"⏟","⎵":"⎵","⏝":"⏝","⋃":"⋃","⊎":"⊎","Ų":"Ų","𝕌":"𝕌","⤒":"⤒","⇅":"⇅","↕":"↕","⥮":"⥮","⊥":"⊥","↥":"↥","↖":"↖","↗":"↗","ϒ":"ϒ","Υ":"Υ","Ů":"Ů","𝒰":"𝒰","Ũ":"Ũ","Ü":"Ü","⊫":"⊫","⫫":"⫫","В":"В","⊩":"⊩","⫦":"⫦","⋁":"⋁","‖":"‖","∣":"∣","|":"|","❘":"❘","≀":"≀"," ":" ","𝔙":"𝔙","𝕍":"𝕍","𝒱":"𝒱","⊪":"⊪","Ŵ":"Ŵ","⋀":"⋀","𝔚":"𝔚","𝕎":"𝕎","𝒲":"𝒲","𝔛":"𝔛","Ξ":"Ξ","𝕏":"𝕏","𝒳":"𝒳","Я":"Я","Ї":"Ї","Ю":"Ю","Ý":"Ý","Ŷ":"Ŷ","Ы":"Ы","𝔜":"𝔜","𝕐":"𝕐","𝒴":"𝒴","Ÿ":"Ÿ","Ж":"Ж","Ź":"Ź","Ž":"Ž","З":"З","Ż":"Ż","Ζ":"Ζ","ℨ":"ℨ","ℤ":"ℤ","𝒵":"𝒵","á":"á","ă":"ă","∾":"∾","∾̳":"∾̳","∿":"∿","â":"â","а":"а","æ":"æ","𝔞":"𝔞","à":"à","ℵ":"ℵ","α":"α","ā":"ā","⨿":"⨿","∧":"∧","⩕":"⩕","⩜":"⩜","⩘":"⩘","⩚":"⩚","∠":"∠","⦤":"⦤","∡":"∡","⦨":"⦨","⦩":"⦩","⦪":"⦪","⦫":"⦫","⦬":"⦬","⦭":"⦭","⦮":"⦮","⦯":"⦯","∟":"∟","⊾":"⊾","⦝":"⦝","∢":"∢","⍼":"⍼","ą":"ą","𝕒":"𝕒","⩰":"⩰","⩯":"⩯","≊":"≊","≋":"≋","'":"'","å":"å","𝒶":"𝒶","*":"*","ã":"ã","ä":"ä","⨑":"⨑","⫭":"⫭","≌":"≌","϶":"϶","‵":"‵","∽":"∽","⋍":"⋍","⊽":"⊽","⌅":"⌅","⎶":"⎶","б":"б","„":"„","⦰":"⦰","β":"β","ℶ":"ℶ","≬":"≬","𝔟":"𝔟","◯":"◯","⨀":"⨀","⨁":"⨁","⨂":"⨂","⨆":"⨆","★":"★","▽":"▽","△":"△","⨄":"⨄","⤍":"⤍","⧫":"⧫","▴":"▴","▾":"▾","◂":"◂","▸":"▸","␣":"␣","▒":"▒","░":"░","▓":"▓","█":"█","=⃥":"=⃥","≡⃥":"≡⃥","⌐":"⌐","𝕓":"𝕓","⋈":"⋈","╗":"╗","╔":"╔","╖":"╖","╓":"╓","═":"═","╦":"╦","╩":"╩","╤":"╤","╧":"╧","╝":"╝","╚":"╚","╜":"╜","╙":"╙","║":"║","╬":"╬","╣":"╣","╠":"╠","╫":"╫","╢":"╢","╟":"╟","⧉":"⧉","╕":"╕","╒":"╒","┐":"┐","┌":"┌","╥":"╥","╨":"╨","┬":"┬","┴":"┴","⊟":"⊟","⊞":"⊞","⊠":"⊠","╛":"╛","╘":"╘","┘":"┘","└":"└","│":"│","╪":"╪","╡":"╡","╞":"╞","┼":"┼","┤":"┤","├":"├","¦":"¦","𝒷":"𝒷","⁏":"⁏","\\":"\","⧅":"⧅","⟈":"⟈","•":"•","⪮":"⪮","ć":"ć","∩":"∩","⩄":"⩄","⩉":"⩉","⩋":"⩋","⩇":"⩇","⩀":"⩀","∩︀":"∩︀","⁁":"⁁","⩍":"⩍","č":"č","ç":"ç","ĉ":"ĉ","⩌":"⩌","⩐":"⩐","ċ":"ċ","⦲":"⦲","¢":"¢","𝔠":"𝔠","ч":"ч","✓":"✓","χ":"χ","○":"○","⧃":"⧃","ˆ":"ˆ","≗":"≗","↺":"↺","↻":"↻","Ⓢ":"Ⓢ","⊛":"⊛","⊚":"⊚","⊝":"⊝","⨐":"⨐","⫯":"⫯","⧂":"⧂","♣":"♣",":":":",",":",","@":"@","∁":"∁","⩭":"⩭","𝕔":"𝕔","℗":"℗","↵":"↵","✗":"✗","𝒸":"𝒸","⫏":"⫏","⫑":"⫑","⫐":"⫐","⫒":"⫒","⋯":"⋯","⤸":"⤸","⤵":"⤵","⋞":"⋞","⋟":"⋟","↶":"↶","⤽":"⤽","∪":"∪","⩈":"⩈","⩆":"⩆","⩊":"⩊","⊍":"⊍","⩅":"⩅","∪︀":"∪︀","↷":"↷","⤼":"⤼","⋎":"⋎","⋏":"⋏","¤":"¤","∱":"∱","⌭":"⌭","⥥":"⥥","†":"†","ℸ":"ℸ","‐":"‐","⤏":"⤏","ď":"ď","д":"д","⇊":"⇊","⩷":"⩷","°":"°","δ":"δ","⦱":"⦱","⥿":"⥿","𝔡":"𝔡","♦":"♦","ϝ":"ϝ","⋲":"⋲","÷":"÷","⋇":"⋇","ђ":"ђ","⌞":"⌞","⌍":"⌍",$:"$","𝕕":"𝕕","≑":"≑","∸":"∸","∔":"∔","⊡":"⊡","⌟":"⌟","⌌":"⌌","𝒹":"𝒹","ѕ":"ѕ","⧶":"⧶","đ":"đ","⋱":"⋱","▿":"▿","⦦":"⦦","џ":"џ","⟿":"⟿","é":"é","⩮":"⩮","ě":"ě","≖":"≖","ê":"ê","≕":"≕","э":"э","ė":"ė","≒":"≒","𝔢":"𝔢","⪚":"⪚","è":"è","⪖":"⪖","⪘":"⪘","⪙":"⪙","⏧":"⏧","ℓ":"ℓ","⪕":"⪕","⪗":"⪗","ē":"ē","∅":"∅"," ":" "," ":" "," ":" ","ŋ":"ŋ"," ":" ","ę":"ę","𝕖":"𝕖","⋕":"⋕","⧣":"⧣","⩱":"⩱","ε":"ε","ϵ":"ϵ","=":"=","≟":"≟","⩸":"⩸","⧥":"⧥","≓":"≓","⥱":"⥱","ℯ":"ℯ","η":"η","ð":"ð","ë":"ë","€":"€","!":"!","ф":"ф","♀":"♀","ffi":"ffi","ff":"ff","ffl":"ffl","𝔣":"𝔣","fi":"fi",fj:"fj","♭":"♭","fl":"fl","▱":"▱","ƒ":"ƒ","𝕗":"𝕗","⋔":"⋔","⫙":"⫙","⨍":"⨍","½":"½","⅓":"⅓","¼":"¼","⅕":"⅕","⅙":"⅙","⅛":"⅛","⅔":"⅔","⅖":"⅖","¾":"¾","⅗":"⅗","⅜":"⅜","⅘":"⅘","⅚":"⅚","⅝":"⅝","⅞":"⅞","⁄":"⁄","⌢":"⌢","𝒻":"𝒻","⪌":"⪌","ǵ":"ǵ","γ":"γ","⪆":"⪆","ğ":"ğ","ĝ":"ĝ","г":"г","ġ":"ġ","⪩":"⪩","⪀":"⪀","⪂":"⪂","⪄":"⪄","⋛︀":"⋛︀","⪔":"⪔","𝔤":"𝔤","ℷ":"ℷ","ѓ":"ѓ","⪒":"⪒","⪥":"⪥","⪤":"⪤","≩":"≩","⪊":"⪊","⪈":"⪈","⋧":"⋧","𝕘":"𝕘","ℊ":"ℊ","⪎":"⪎","⪐":"⪐","⪧":"⪧","⩺":"⩺","⋗":"⋗","⦕":"⦕","⩼":"⩼","⥸":"⥸","≩︀":"≩︀","ъ":"ъ","⥈":"⥈","↭":"↭","ℏ":"ℏ","ĥ":"ĥ","♥":"♥","…":"…","⊹":"⊹","𝔥":"𝔥","⤥":"⤥","⤦":"⤦","⇿":"⇿","∻":"∻","↩":"↩","↪":"↪","𝕙":"𝕙","―":"―","𝒽":"𝒽","ħ":"ħ","⁃":"⁃","í":"í","î":"î","и":"и","е":"е","¡":"¡","𝔦":"𝔦","ì":"ì","⨌":"⨌","∭":"∭","⧜":"⧜","℩":"℩","ij":"ij","ī":"ī","ı":"ı","⊷":"⊷","Ƶ":"Ƶ","℅":"℅","∞":"∞","⧝":"⧝","⊺":"⊺","⨗":"⨗","⨼":"⨼","ё":"ё","į":"į","𝕚":"𝕚","ι":"ι","¿":"¿","𝒾":"𝒾","⋹":"⋹","⋵":"⋵","⋴":"⋴","⋳":"⋳","ĩ":"ĩ","і":"і","ï":"ï","ĵ":"ĵ","й":"й","𝔧":"𝔧","ȷ":"ȷ","𝕛":"𝕛","𝒿":"𝒿","ј":"ј","є":"є","κ":"κ","ϰ":"ϰ","ķ":"ķ","к":"к","𝔨":"𝔨","ĸ":"ĸ","х":"х","ќ":"ќ","𝕜":"𝕜","𝓀":"𝓀","⤛":"⤛","⤎":"⤎","⪋":"⪋","⥢":"⥢","ĺ":"ĺ","⦴":"⦴","λ":"λ","⦑":"⦑","⪅":"⪅","«":"«","⤟":"⤟","⤝":"⤝","↫":"↫","⤹":"⤹","⥳":"⥳","↢":"↢","⪫":"⪫","⤙":"⤙","⪭":"⪭","⪭︀":"⪭︀","⤌":"⤌","❲":"❲","{":"{","[":"[","⦋":"⦋","⦏":"⦏","⦍":"⦍","ľ":"ľ","ļ":"ļ","л":"л","⤶":"⤶","⥧":"⥧","⥋":"⥋","↲":"↲","≤":"≤","⇇":"⇇","⋋":"⋋","⪨":"⪨","⩿":"⩿","⪁":"⪁","⪃":"⪃","⋚︀":"⋚︀","⪓":"⪓","⋖":"⋖","⥼":"⥼","𝔩":"𝔩","⪑":"⪑","⥪":"⥪","▄":"▄","љ":"љ","⥫":"⥫","◺":"◺","ŀ":"ŀ","⎰":"⎰","≨":"≨","⪉":"⪉","⪇":"⪇","⋦":"⋦","⟬":"⟬","⇽":"⇽","⟼":"⟼","↬":"↬","⦅":"⦅","𝕝":"𝕝","⨭":"⨭","⨴":"⨴","∗":"∗","◊":"◊","(":"(","⦓":"⦓","⥭":"⥭","‎":"‎","⊿":"⊿","‹":"‹","𝓁":"𝓁","⪍":"⪍","⪏":"⪏","‚":"‚","ł":"ł","⪦":"⪦","⩹":"⩹","⋉":"⋉","⥶":"⥶","⩻":"⩻","⦖":"⦖","◃":"◃","⥊":"⥊","⥦":"⥦","≨︀":"≨︀","∺":"∺","¯":"¯","♂":"♂","✠":"✠","▮":"▮","⨩":"⨩","м":"м","—":"—","𝔪":"𝔪","℧":"℧","µ":"µ","⫰":"⫰","−":"−","⨪":"⨪","⫛":"⫛","⊧":"⊧","𝕞":"𝕞","𝓂":"𝓂","μ":"μ","⊸":"⊸","⋙̸":"⋙̸","≫⃒":"≫⃒","⇍":"⇍","⇎":"⇎","⋘̸":"⋘̸","≪⃒":"≪⃒","⇏":"⇏","⊯":"⊯","⊮":"⊮","ń":"ń","∠⃒":"∠⃒","⩰̸":"⩰̸","≋̸":"≋̸","ʼn":"ʼn","♮":"♮","⩃":"⩃","ň":"ň","ņ":"ņ","⩭̸":"⩭̸","⩂":"⩂","н":"н","–":"–","⇗":"⇗","⤤":"⤤","≐̸":"≐̸","⤨":"⤨","𝔫":"𝔫","↮":"↮","⫲":"⫲","⋼":"⋼","⋺":"⋺","њ":"њ","≦̸":"≦̸","↚":"↚","‥":"‥","𝕟":"𝕟","¬":"¬","⋹̸":"⋹̸","⋵̸":"⋵̸","⋷":"⋷","⋶":"⋶","⋾":"⋾","⋽":"⋽","⫽⃥":"⫽⃥","∂̸":"∂̸","⨔":"⨔","↛":"↛","⤳̸":"⤳̸","↝̸":"↝̸","𝓃":"𝓃","⊄":"⊄","⫅̸":"⫅̸","⊅":"⊅","⫆̸":"⫆̸","ñ":"ñ","ν":"ν","#":"#","№":"№"," ":" ","⊭":"⊭","⤄":"⤄","≍⃒":"≍⃒","⊬":"⊬","≥⃒":"≥⃒",">⃒":">⃒","⧞":"⧞","⤂":"⤂","≤⃒":"≤⃒","<⃒":"<⃒","⊴⃒":"⊴⃒","⤃":"⤃","⊵⃒":"⊵⃒","∼⃒":"∼⃒","⇖":"⇖","⤣":"⤣","⤧":"⤧","ó":"ó","ô":"ô","о":"о","ő":"ő","⨸":"⨸","⦼":"⦼","œ":"œ","⦿":"⦿","𝔬":"𝔬","˛":"˛","ò":"ò","⧁":"⧁","⦵":"⦵","⦾":"⦾","⦻":"⦻","⧀":"⧀","ō":"ō","ω":"ω","ο":"ο","⦶":"⦶","𝕠":"𝕠","⦷":"⦷","⦹":"⦹","∨":"∨","⩝":"⩝","ℴ":"ℴ","ª":"ª","º":"º","⊶":"⊶","⩖":"⩖","⩗":"⩗","⩛":"⩛","ø":"ø","⊘":"⊘","õ":"õ","⨶":"⨶","ö":"ö","⌽":"⌽","¶":"¶","⫳":"⫳","⫽":"⫽","п":"п","%":"%",".":".","‰":"‰","‱":"‱","𝔭":"𝔭","φ":"φ","ϕ":"ϕ","☎":"☎","π":"π","ϖ":"ϖ","ℎ":"ℎ","+":"+","⨣":"⨣","⨢":"⨢","⨥":"⨥","⩲":"⩲","⨦":"⨦","⨧":"⨧","⨕":"⨕","𝕡":"𝕡","£":"£","⪳":"⪳","⪷":"⪷","⪹":"⪹","⪵":"⪵","⋨":"⋨","′":"′","⌮":"⌮","⌒":"⌒","⌓":"⌓","⊰":"⊰","𝓅":"𝓅","ψ":"ψ"," ":" ","𝔮":"𝔮","𝕢":"𝕢","⁗":"⁗","𝓆":"𝓆","⨖":"⨖","?":"?","⤜":"⤜","⥤":"⥤","∽̱":"∽̱","ŕ":"ŕ","⦳":"⦳","⦒":"⦒","⦥":"⦥","»":"»","⥵":"⥵","⤠":"⤠","⤳":"⤳","⤞":"⤞","⥅":"⥅","⥴":"⥴","↣":"↣","↝":"↝","⤚":"⤚","∶":"∶","❳":"❳","}":"}","]":"]","⦌":"⦌","⦎":"⦎","⦐":"⦐","ř":"ř","ŗ":"ŗ","р":"р","⤷":"⤷","⥩":"⥩","↳":"↳","▭":"▭","⥽":"⥽","𝔯":"𝔯","⥬":"⥬","ρ":"ρ","ϱ":"ϱ","⇉":"⇉","⋌":"⋌","˚":"˚","‏":"‏","⎱":"⎱","⫮":"⫮","⟭":"⟭","⇾":"⇾","⦆":"⦆","𝕣":"𝕣","⨮":"⨮","⨵":"⨵",")":")","⦔":"⦔","⨒":"⨒","›":"›","𝓇":"𝓇","⋊":"⋊","▹":"▹","⧎":"⧎","⥨":"⥨","℞":"℞","ś":"ś","⪴":"⪴","⪸":"⪸","š":"š","ş":"ş","ŝ":"ŝ","⪶":"⪶","⪺":"⪺","⋩":"⋩","⨓":"⨓","с":"с","⋅":"⋅","⩦":"⩦","⇘":"⇘","§":"§",";":";","⤩":"⤩","✶":"✶","𝔰":"𝔰","♯":"♯","щ":"щ","ш":"ш","­":"­","σ":"σ","ς":"ς","⩪":"⩪","⪞":"⪞","⪠":"⪠","⪝":"⪝","⪟":"⪟","≆":"≆","⨤":"⨤","⥲":"⥲","⨳":"⨳","⧤":"⧤","⌣":"⌣","⪪":"⪪","⪬":"⪬","⪬︀":"⪬︀","ь":"ь","/":"/","⧄":"⧄","⌿":"⌿","𝕤":"𝕤","♠":"♠","⊓︀":"⊓︀","⊔︀":"⊔︀","𝓈":"𝓈","☆":"☆","⊂":"⊂","⫅":"⫅","⪽":"⪽","⫃":"⫃","⫁":"⫁","⫋":"⫋","⊊":"⊊","⪿":"⪿","⥹":"⥹","⫇":"⫇","⫕":"⫕","⫓":"⫓","♪":"♪","¹":"¹","²":"²","³":"³","⫆":"⫆","⪾":"⪾","⫘":"⫘","⫄":"⫄","⟉":"⟉","⫗":"⫗","⥻":"⥻","⫂":"⫂","⫌":"⫌","⊋":"⊋","⫀":"⫀","⫈":"⫈","⫔":"⫔","⫖":"⫖","⇙":"⇙","⤪":"⤪","ß":"ß","⌖":"⌖","τ":"τ","ť":"ť","ţ":"ţ","т":"т","⌕":"⌕","𝔱":"𝔱","θ":"θ","ϑ":"ϑ","þ":"þ","×":"×","⨱":"⨱","⨰":"⨰","⌶":"⌶","⫱":"⫱","𝕥":"𝕥","⫚":"⫚","‴":"‴","▵":"▵","≜":"≜","◬":"◬","⨺":"⨺","⨹":"⨹","⧍":"⧍","⨻":"⨻","⏢":"⏢","𝓉":"𝓉","ц":"ц","ћ":"ћ","ŧ":"ŧ","⥣":"⥣","ú":"ú","ў":"ў","ŭ":"ŭ","û":"û","у":"у","ű":"ű","⥾":"⥾","𝔲":"𝔲","ù":"ù","▀":"▀","⌜":"⌜","⌏":"⌏","◸":"◸","ū":"ū","ų":"ų","𝕦":"𝕦","υ":"υ","⇈":"⇈","⌝":"⌝","⌎":"⌎","ů":"ů","◹":"◹","𝓊":"𝓊","⋰":"⋰","ũ":"ũ","ü":"ü","⦧":"⦧","⫨":"⫨","⫩":"⫩","⦜":"⦜","⊊︀":"⊊︀","⫋︀":"⫋︀","⊋︀":"⊋︀","⫌︀":"⫌︀","в":"в","⊻":"⊻","≚":"≚","⋮":"⋮","𝔳":"𝔳","𝕧":"𝕧","𝓋":"𝓋","⦚":"⦚","ŵ":"ŵ","⩟":"⩟","≙":"≙","℘":"℘","𝔴":"𝔴","𝕨":"𝕨","𝓌":"𝓌","𝔵":"𝔵","ξ":"ξ","⋻":"⋻","𝕩":"𝕩","𝓍":"𝓍","ý":"ý","я":"я","ŷ":"ŷ","ы":"ы","¥":"¥","𝔶":"𝔶","ї":"ї","𝕪":"𝕪","𝓎":"𝓎","ю":"ю","ÿ":"ÿ","ź":"ź","ž":"ž","з":"з","ż":"ż","ζ":"ζ","𝔷":"𝔷","ж":"ж","⇝":"⇝","𝕫":"𝕫","𝓏":"𝓏","‍":"‍","‌":"‌"}}}; - -/***/ }), - -/***/ "./node_modules/html-entities/lib/numeric-unicode-map.js": -/*!***************************************************************!*\ - !*** ./node_modules/html-entities/lib/numeric-unicode-map.js ***! - \***************************************************************/ -/***/ (function(__unused_webpack_module, exports) { - -"use strict"; -Object.defineProperty(exports, "__esModule", ({value:true}));exports.numericUnicodeMap={0:65533,128:8364,130:8218,131:402,132:8222,133:8230,134:8224,135:8225,136:710,137:8240,138:352,139:8249,140:338,142:381,145:8216,146:8217,147:8220,148:8221,149:8226,150:8211,151:8212,152:732,153:8482,154:353,155:8250,156:339,158:382,159:376}; - -/***/ }), - -/***/ "./node_modules/html-entities/lib/surrogate-pairs.js": -/*!***********************************************************!*\ - !*** ./node_modules/html-entities/lib/surrogate-pairs.js ***! - \***********************************************************/ -/***/ (function(__unused_webpack_module, exports) { - -"use strict"; -Object.defineProperty(exports, "__esModule", ({value:true}));exports.fromCodePoint=String.fromCodePoint||function(astralCodePoint){return String.fromCharCode(Math.floor((astralCodePoint-65536)/1024)+55296,(astralCodePoint-65536)%1024+56320)};exports.getCodePoint=String.prototype.codePointAt?function(input,position){return input.codePointAt(position)}:function(input,position){return(input.charCodeAt(position)-55296)*1024+input.charCodeAt(position+1)-56320+65536};exports.highSurrogateFrom=55296;exports.highSurrogateTo=56319; - -/***/ }), - -/***/ "./node_modules/webpack-dev-server/client/clients/WebSocketClient.js": -/*!***************************************************************************!*\ - !*** ./node_modules/webpack-dev-server/client/clients/WebSocketClient.js ***! - \***************************************************************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ WebSocketClient; } -/* harmony export */ }); -/* harmony import */ var _utils_log_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils/log.js */ "./node_modules/webpack-dev-server/client/utils/log.js"); -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } - -function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } - - - -var WebSocketClient = /*#__PURE__*/function () { - /** - * @param {string} url - */ - function WebSocketClient(url) { - _classCallCheck(this, WebSocketClient); - - this.client = new WebSocket(url); - - this.client.onerror = function (error) { - _utils_log_js__WEBPACK_IMPORTED_MODULE_0__.log.error(error); - }; - } - /** - * @param {(...args: any[]) => void} f - */ - - - _createClass(WebSocketClient, [{ - key: "onOpen", - value: function onOpen(f) { - this.client.onopen = f; - } - /** - * @param {(...args: any[]) => void} f - */ - - }, { - key: "onClose", - value: function onClose(f) { - this.client.onclose = f; - } // call f with the message string as the first argument - - /** - * @param {(...args: any[]) => void} f - */ - - }, { - key: "onMessage", - value: function onMessage(f) { - this.client.onmessage = function (e) { - f(e.data); - }; - } - }]); - - return WebSocketClient; -}(); - - - -/***/ }), - -/***/ "./node_modules/webpack-dev-server/client/index.js?protocol=ws%3A&hostname=localhost&port=8081&pathname=%2Fws&logging=none&reconnect=10": -/*!**********************************************************************************************************************************************!*\ - !*** ./node_modules/webpack-dev-server/client/index.js?protocol=ws%3A&hostname=localhost&port=8081&pathname=%2Fws&logging=none&reconnect=10 ***! - \**********************************************************************************************************************************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { - -"use strict"; -var __resourceQuery = "?protocol=ws%3A&hostname=localhost&port=8081&pathname=%2Fws&logging=none&reconnect=10"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var webpack_hot_log_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! webpack/hot/log.js */ "./node_modules/webpack/hot/log.js"); -/* harmony import */ var webpack_hot_log_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(webpack_hot_log_js__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _utils_stripAnsi_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils/stripAnsi.js */ "./node_modules/webpack-dev-server/client/utils/stripAnsi.js"); -/* harmony import */ var _utils_parseURL_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utils/parseURL.js */ "./node_modules/webpack-dev-server/client/utils/parseURL.js"); -/* harmony import */ var _socket_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./socket.js */ "./node_modules/webpack-dev-server/client/socket.js"); -/* harmony import */ var _overlay_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./overlay.js */ "./node_modules/webpack-dev-server/client/overlay.js"); -/* harmony import */ var _utils_log_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./utils/log.js */ "./node_modules/webpack-dev-server/client/utils/log.js"); -/* harmony import */ var _utils_sendMessage_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./utils/sendMessage.js */ "./node_modules/webpack-dev-server/client/utils/sendMessage.js"); -/* harmony import */ var _utils_reloadApp_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./utils/reloadApp.js */ "./node_modules/webpack-dev-server/client/utils/reloadApp.js"); -/* harmony import */ var _utils_createSocketURL_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./utils/createSocketURL.js */ "./node_modules/webpack-dev-server/client/utils/createSocketURL.js"); -/* global __resourceQuery, __webpack_hash__ */ -/// - - - - - - - - - -/** - * @typedef {Object} Options - * @property {boolean} hot - * @property {boolean} liveReload - * @property {boolean} progress - * @property {boolean | { warnings?: boolean, errors?: boolean, trustedTypesPolicyName?: string }} overlay - * @property {string} [logging] - * @property {number} [reconnect] - */ - -/** - * @typedef {Object} Status - * @property {boolean} isUnloading - * @property {string} currentHash - * @property {string} [previousHash] - */ - -/** - * @type {Status} - */ - -var status = { - isUnloading: false, - // TODO Workaround for webpack v4, `__webpack_hash__` is not replaced without HotModuleReplacement - // eslint-disable-next-line camelcase - currentHash: true ? __webpack_require__.h() : 0 -}; -/** @type {Options} */ - -var options = { - hot: false, - liveReload: false, - progress: false, - overlay: false -}; -var parsedResourceQuery = (0,_utils_parseURL_js__WEBPACK_IMPORTED_MODULE_2__["default"])(__resourceQuery); - -if (parsedResourceQuery.hot === "true") { - options.hot = true; - _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.info("Hot Module Replacement enabled."); -} - -if (parsedResourceQuery["live-reload"] === "true") { - options.liveReload = true; - _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.info("Live Reloading enabled."); -} - -if (parsedResourceQuery.logging) { - options.logging = parsedResourceQuery.logging; -} - -if (typeof parsedResourceQuery.reconnect !== "undefined") { - options.reconnect = Number(parsedResourceQuery.reconnect); -} -/** - * @param {string} level - */ - - -function setAllLogLevel(level) { - // This is needed because the HMR logger operate separately from dev server logger - webpack_hot_log_js__WEBPACK_IMPORTED_MODULE_0___default().setLogLevel(level === "verbose" || level === "log" ? "info" : level); - (0,_utils_log_js__WEBPACK_IMPORTED_MODULE_5__.setLogLevel)(level); -} - -if (options.logging) { - setAllLogLevel(options.logging); -} - -self.addEventListener("beforeunload", function () { - status.isUnloading = true; -}); -var onSocketMessage = { - hot: function hot() { - if (parsedResourceQuery.hot === "false") { - return; - } - - options.hot = true; - _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.info("Hot Module Replacement enabled."); - }, - liveReload: function liveReload() { - if (parsedResourceQuery["live-reload"] === "false") { - return; - } - - options.liveReload = true; - _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.info("Live Reloading enabled."); - }, - invalid: function invalid() { - _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.info("App updated. Recompiling..."); // Fixes #1042. overlay doesn't clear if errors are fixed but warnings remain. - - if (options.overlay) { - (0,_overlay_js__WEBPACK_IMPORTED_MODULE_4__.hide)(); - } - - (0,_utils_sendMessage_js__WEBPACK_IMPORTED_MODULE_6__["default"])("Invalid"); - }, - - /** - * @param {string} hash - */ - hash: function hash(_hash) { - status.previousHash = status.currentHash; - status.currentHash = _hash; - }, - logging: setAllLogLevel, - - /** - * @param {boolean} value - */ - overlay: function overlay(value) { - if (typeof document === "undefined") { - return; - } - - options.overlay = value; - }, - - /** - * @param {number} value - */ - reconnect: function reconnect(value) { - if (parsedResourceQuery.reconnect === "false") { - return; - } - - options.reconnect = value; - }, - - /** - * @param {boolean} value - */ - progress: function progress(value) { - options.progress = value; - }, - - /** - * @param {{ pluginName?: string, percent: number, msg: string }} data - */ - "progress-update": function progressUpdate(data) { - if (options.progress) { - _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.info("".concat(data.pluginName ? "[".concat(data.pluginName, "] ") : "").concat(data.percent, "% - ").concat(data.msg, ".")); - } - - (0,_utils_sendMessage_js__WEBPACK_IMPORTED_MODULE_6__["default"])("Progress", data); - }, - "still-ok": function stillOk() { - _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.info("Nothing changed."); - - if (options.overlay) { - (0,_overlay_js__WEBPACK_IMPORTED_MODULE_4__.hide)(); - } - - (0,_utils_sendMessage_js__WEBPACK_IMPORTED_MODULE_6__["default"])("StillOk"); - }, - ok: function ok() { - (0,_utils_sendMessage_js__WEBPACK_IMPORTED_MODULE_6__["default"])("Ok"); - - if (options.overlay) { - (0,_overlay_js__WEBPACK_IMPORTED_MODULE_4__.hide)(); - } - - (0,_utils_reloadApp_js__WEBPACK_IMPORTED_MODULE_7__["default"])(options, status); - }, - // TODO: remove in v5 in favor of 'static-changed' - - /** - * @param {string} file - */ - "content-changed": function contentChanged(file) { - _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.info("".concat(file ? "\"".concat(file, "\"") : "Content", " from static directory was changed. Reloading...")); - self.location.reload(); - }, - - /** - * @param {string} file - */ - "static-changed": function staticChanged(file) { - _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.info("".concat(file ? "\"".concat(file, "\"") : "Content", " from static directory was changed. Reloading...")); - self.location.reload(); - }, - - /** - * @param {Error[]} warnings - * @param {any} params - */ - warnings: function warnings(_warnings, params) { - _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.warn("Warnings while compiling."); - - var printableWarnings = _warnings.map(function (error) { - var _formatProblem = (0,_overlay_js__WEBPACK_IMPORTED_MODULE_4__.formatProblem)("warning", error), - header = _formatProblem.header, - body = _formatProblem.body; - - return "".concat(header, "\n").concat((0,_utils_stripAnsi_js__WEBPACK_IMPORTED_MODULE_1__["default"])(body)); - }); - - (0,_utils_sendMessage_js__WEBPACK_IMPORTED_MODULE_6__["default"])("Warnings", printableWarnings); - - for (var i = 0; i < printableWarnings.length; i++) { - _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.warn(printableWarnings[i]); - } - - var needShowOverlayForWarnings = typeof options.overlay === "boolean" ? options.overlay : options.overlay && options.overlay.warnings; - - if (needShowOverlayForWarnings) { - var trustedTypesPolicyName = typeof options.overlay === "object" && options.overlay.trustedTypesPolicyName; - (0,_overlay_js__WEBPACK_IMPORTED_MODULE_4__.show)("warning", _warnings, trustedTypesPolicyName || null); - } - - if (params && params.preventReloading) { - return; - } - - (0,_utils_reloadApp_js__WEBPACK_IMPORTED_MODULE_7__["default"])(options, status); - }, - - /** - * @param {Error[]} errors - */ - errors: function errors(_errors) { - _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.error("Errors while compiling. Reload prevented."); - - var printableErrors = _errors.map(function (error) { - var _formatProblem2 = (0,_overlay_js__WEBPACK_IMPORTED_MODULE_4__.formatProblem)("error", error), - header = _formatProblem2.header, - body = _formatProblem2.body; - - return "".concat(header, "\n").concat((0,_utils_stripAnsi_js__WEBPACK_IMPORTED_MODULE_1__["default"])(body)); - }); - - (0,_utils_sendMessage_js__WEBPACK_IMPORTED_MODULE_6__["default"])("Errors", printableErrors); - - for (var i = 0; i < printableErrors.length; i++) { - _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.error(printableErrors[i]); - } - - var needShowOverlayForErrors = typeof options.overlay === "boolean" ? options.overlay : options.overlay && options.overlay.errors; - - if (needShowOverlayForErrors) { - var trustedTypesPolicyName = typeof options.overlay === "object" && options.overlay.trustedTypesPolicyName; - (0,_overlay_js__WEBPACK_IMPORTED_MODULE_4__.show)("error", _errors, trustedTypesPolicyName || null); - } - }, - - /** - * @param {Error} error - */ - error: function error(_error) { - _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.error(_error); - }, - close: function close() { - _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.info("Disconnected!"); - - if (options.overlay) { - (0,_overlay_js__WEBPACK_IMPORTED_MODULE_4__.hide)(); - } - - (0,_utils_sendMessage_js__WEBPACK_IMPORTED_MODULE_6__["default"])("Close"); - } -}; -var socketURL = (0,_utils_createSocketURL_js__WEBPACK_IMPORTED_MODULE_8__["default"])(parsedResourceQuery); -(0,_socket_js__WEBPACK_IMPORTED_MODULE_3__["default"])(socketURL, onSocketMessage, options.reconnect); - -/***/ }), - -/***/ "./node_modules/webpack-dev-server/client/modules/logger/index.js": -/*!************************************************************************!*\ - !*** ./node_modules/webpack-dev-server/client/modules/logger/index.js ***! - \************************************************************************/ -/***/ (function(__unused_webpack_module, exports) { - -/******/ (function() { // webpackBootstrap -/******/ "use strict"; -/******/ var __webpack_modules__ = ({ - -/***/ "./client-src/modules/logger/SyncBailHookFake.js": -/*!*******************************************************!*\ - !*** ./client-src/modules/logger/SyncBailHookFake.js ***! - \*******************************************************/ -/***/ (function(module) { - - -/** - * Client stub for tapable SyncBailHook - */ - -module.exports = function clientTapableSyncBailHook() { - return { - call: function call() {} - }; -}; - -/***/ }), - -/***/ "./node_modules/webpack/lib/logging/Logger.js": -/*!****************************************************!*\ - !*** ./node_modules/webpack/lib/logging/Logger.js ***! - \****************************************************/ -/***/ (function(__unused_webpack_module, exports) { - -/* - MIT License http://www.opensource.org/licenses/mit-license.php - Author Tobias Koppers @sokra -*/ - - -function _toConsumableArray(arr) { - return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); -} - -function _nonIterableSpread() { - throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); -} - -function _unsupportedIterableToArray(o, minLen) { - if (!o) return; - if (typeof o === "string") return _arrayLikeToArray(o, minLen); - var n = Object.prototype.toString.call(o).slice(8, -1); - if (n === "Object" && o.constructor) n = o.constructor.name; - if (n === "Map" || n === "Set") return Array.from(o); - if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); -} - -function _iterableToArray(iter) { - if (typeof (typeof Symbol !== "undefined" ? Symbol : function (i) { return i; }) !== "undefined" && iter[(typeof Symbol !== "undefined" ? Symbol : function (i) { return i; }).iterator] != null || iter["@@iterator"] != null) return Array.from(iter); -} - -function _arrayWithoutHoles(arr) { - if (Array.isArray(arr)) return _arrayLikeToArray(arr); -} - -function _arrayLikeToArray(arr, len) { - if (len == null || len > arr.length) len = arr.length; - - for (var i = 0, arr2 = new Array(len); i < len; i++) { - arr2[i] = arr[i]; - } - - return arr2; -} - -function _classCallCheck(instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a function"); - } -} - -function _defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i]; - descriptor.enumerable = descriptor.enumerable || false; - descriptor.configurable = true; - if ("value" in descriptor) descriptor.writable = true; - Object.defineProperty(target, descriptor.key, descriptor); - } -} - -function _createClass(Constructor, protoProps, staticProps) { - if (protoProps) _defineProperties(Constructor.prototype, protoProps); - if (staticProps) _defineProperties(Constructor, staticProps); - Object.defineProperty(Constructor, "prototype", { - writable: false - }); - return Constructor; -} - -var LogType = Object.freeze({ - error: - /** @type {"error"} */ - "error", - // message, c style arguments - warn: - /** @type {"warn"} */ - "warn", - // message, c style arguments - info: - /** @type {"info"} */ - "info", - // message, c style arguments - log: - /** @type {"log"} */ - "log", - // message, c style arguments - debug: - /** @type {"debug"} */ - "debug", - // message, c style arguments - trace: - /** @type {"trace"} */ - "trace", - // no arguments - group: - /** @type {"group"} */ - "group", - // [label] - groupCollapsed: - /** @type {"groupCollapsed"} */ - "groupCollapsed", - // [label] - groupEnd: - /** @type {"groupEnd"} */ - "groupEnd", - // [label] - profile: - /** @type {"profile"} */ - "profile", - // [profileName] - profileEnd: - /** @type {"profileEnd"} */ - "profileEnd", - // [profileName] - time: - /** @type {"time"} */ - "time", - // name, time as [seconds, nanoseconds] - clear: - /** @type {"clear"} */ - "clear", - // no arguments - status: - /** @type {"status"} */ - "status" // message, arguments - -}); -exports.LogType = LogType; -/** @typedef {typeof LogType[keyof typeof LogType]} LogTypeEnum */ - -var LOG_SYMBOL = (typeof Symbol !== "undefined" ? Symbol : function (i) { return i; })("webpack logger raw log method"); -var TIMERS_SYMBOL = (typeof Symbol !== "undefined" ? Symbol : function (i) { return i; })("webpack logger times"); -var TIMERS_AGGREGATES_SYMBOL = (typeof Symbol !== "undefined" ? Symbol : function (i) { return i; })("webpack logger aggregated times"); - -var WebpackLogger = /*#__PURE__*/function () { - /** - * @param {function(LogTypeEnum, any[]=): void} log log function - * @param {function(string | function(): string): WebpackLogger} getChildLogger function to create child logger - */ - function WebpackLogger(log, getChildLogger) { - _classCallCheck(this, WebpackLogger); - - this[LOG_SYMBOL] = log; - this.getChildLogger = getChildLogger; - } - - _createClass(WebpackLogger, [{ - key: "error", - value: function error() { - for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { - args[_key] = arguments[_key]; - } - - this[LOG_SYMBOL](LogType.error, args); - } - }, { - key: "warn", - value: function warn() { - for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { - args[_key2] = arguments[_key2]; - } - - this[LOG_SYMBOL](LogType.warn, args); - } - }, { - key: "info", - value: function info() { - for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) { - args[_key3] = arguments[_key3]; - } - - this[LOG_SYMBOL](LogType.info, args); - } - }, { - key: "log", - value: function log() { - for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) { - args[_key4] = arguments[_key4]; - } - - this[LOG_SYMBOL](LogType.log, args); - } - }, { - key: "debug", - value: function debug() { - for (var _len5 = arguments.length, args = new Array(_len5), _key5 = 0; _key5 < _len5; _key5++) { - args[_key5] = arguments[_key5]; - } - - this[LOG_SYMBOL](LogType.debug, args); - } - }, { - key: "assert", - value: function assert(assertion) { - if (!assertion) { - for (var _len6 = arguments.length, args = new Array(_len6 > 1 ? _len6 - 1 : 0), _key6 = 1; _key6 < _len6; _key6++) { - args[_key6 - 1] = arguments[_key6]; - } - - this[LOG_SYMBOL](LogType.error, args); - } - } - }, { - key: "trace", - value: function trace() { - this[LOG_SYMBOL](LogType.trace, ["Trace"]); - } - }, { - key: "clear", - value: function clear() { - this[LOG_SYMBOL](LogType.clear); - } - }, { - key: "status", - value: function status() { - for (var _len7 = arguments.length, args = new Array(_len7), _key7 = 0; _key7 < _len7; _key7++) { - args[_key7] = arguments[_key7]; - } - - this[LOG_SYMBOL](LogType.status, args); - } - }, { - key: "group", - value: function group() { - for (var _len8 = arguments.length, args = new Array(_len8), _key8 = 0; _key8 < _len8; _key8++) { - args[_key8] = arguments[_key8]; - } - - this[LOG_SYMBOL](LogType.group, args); - } - }, { - key: "groupCollapsed", - value: function groupCollapsed() { - for (var _len9 = arguments.length, args = new Array(_len9), _key9 = 0; _key9 < _len9; _key9++) { - args[_key9] = arguments[_key9]; - } - - this[LOG_SYMBOL](LogType.groupCollapsed, args); - } - }, { - key: "groupEnd", - value: function groupEnd() { - for (var _len10 = arguments.length, args = new Array(_len10), _key10 = 0; _key10 < _len10; _key10++) { - args[_key10] = arguments[_key10]; - } - - this[LOG_SYMBOL](LogType.groupEnd, args); - } - }, { - key: "profile", - value: function profile(label) { - this[LOG_SYMBOL](LogType.profile, [label]); - } - }, { - key: "profileEnd", - value: function profileEnd(label) { - this[LOG_SYMBOL](LogType.profileEnd, [label]); - } - }, { - key: "time", - value: function time(label) { - this[TIMERS_SYMBOL] = this[TIMERS_SYMBOL] || new Map(); - this[TIMERS_SYMBOL].set(label, process.hrtime()); - } - }, { - key: "timeLog", - value: function timeLog(label) { - var prev = this[TIMERS_SYMBOL] && this[TIMERS_SYMBOL].get(label); - - if (!prev) { - throw new Error("No such label '".concat(label, "' for WebpackLogger.timeLog()")); - } - - var time = process.hrtime(prev); - this[LOG_SYMBOL](LogType.time, [label].concat(_toConsumableArray(time))); - } - }, { - key: "timeEnd", - value: function timeEnd(label) { - var prev = this[TIMERS_SYMBOL] && this[TIMERS_SYMBOL].get(label); - - if (!prev) { - throw new Error("No such label '".concat(label, "' for WebpackLogger.timeEnd()")); - } - - var time = process.hrtime(prev); - this[TIMERS_SYMBOL].delete(label); - this[LOG_SYMBOL](LogType.time, [label].concat(_toConsumableArray(time))); - } - }, { - key: "timeAggregate", - value: function timeAggregate(label) { - var prev = this[TIMERS_SYMBOL] && this[TIMERS_SYMBOL].get(label); - - if (!prev) { - throw new Error("No such label '".concat(label, "' for WebpackLogger.timeAggregate()")); - } - - var time = process.hrtime(prev); - this[TIMERS_SYMBOL].delete(label); - this[TIMERS_AGGREGATES_SYMBOL] = this[TIMERS_AGGREGATES_SYMBOL] || new Map(); - var current = this[TIMERS_AGGREGATES_SYMBOL].get(label); - - if (current !== undefined) { - if (time[1] + current[1] > 1e9) { - time[0] += current[0] + 1; - time[1] = time[1] - 1e9 + current[1]; - } else { - time[0] += current[0]; - time[1] += current[1]; - } - } - - this[TIMERS_AGGREGATES_SYMBOL].set(label, time); - } - }, { - key: "timeAggregateEnd", - value: function timeAggregateEnd(label) { - if (this[TIMERS_AGGREGATES_SYMBOL] === undefined) return; - var time = this[TIMERS_AGGREGATES_SYMBOL].get(label); - if (time === undefined) return; - this[TIMERS_AGGREGATES_SYMBOL].delete(label); - this[LOG_SYMBOL](LogType.time, [label].concat(_toConsumableArray(time))); - } - }]); - - return WebpackLogger; -}(); - -exports.Logger = WebpackLogger; - -/***/ }), - -/***/ "./node_modules/webpack/lib/logging/createConsoleLogger.js": -/*!*****************************************************************!*\ - !*** ./node_modules/webpack/lib/logging/createConsoleLogger.js ***! - \*****************************************************************/ -/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_10785__) { - -/* - MIT License http://www.opensource.org/licenses/mit-license.php - Author Tobias Koppers @sokra -*/ - - -function _toConsumableArray(arr) { - return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); -} - -function _nonIterableSpread() { - throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); -} - -function _unsupportedIterableToArray(o, minLen) { - if (!o) return; - if (typeof o === "string") return _arrayLikeToArray(o, minLen); - var n = Object.prototype.toString.call(o).slice(8, -1); - if (n === "Object" && o.constructor) n = o.constructor.name; - if (n === "Map" || n === "Set") return Array.from(o); - if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); -} - -function _iterableToArray(iter) { - if (typeof (typeof Symbol !== "undefined" ? Symbol : function (i) { return i; }) !== "undefined" && iter[(typeof Symbol !== "undefined" ? Symbol : function (i) { return i; }).iterator] != null || iter["@@iterator"] != null) return Array.from(iter); -} - -function _arrayWithoutHoles(arr) { - if (Array.isArray(arr)) return _arrayLikeToArray(arr); -} - -function _arrayLikeToArray(arr, len) { - if (len == null || len > arr.length) len = arr.length; - - for (var i = 0, arr2 = new Array(len); i < len; i++) { - arr2[i] = arr[i]; - } - - return arr2; -} - -var _require = __nested_webpack_require_10785__(/*! ./Logger */ "./node_modules/webpack/lib/logging/Logger.js"), - LogType = _require.LogType; -/** @typedef {import("../../declarations/WebpackOptions").FilterItemTypes} FilterItemTypes */ - -/** @typedef {import("../../declarations/WebpackOptions").FilterTypes} FilterTypes */ - -/** @typedef {import("./Logger").LogTypeEnum} LogTypeEnum */ - -/** @typedef {function(string): boolean} FilterFunction */ - -/** - * @typedef {Object} LoggerConsole - * @property {function(): void} clear - * @property {function(): void} trace - * @property {(...args: any[]) => void} info - * @property {(...args: any[]) => void} log - * @property {(...args: any[]) => void} warn - * @property {(...args: any[]) => void} error - * @property {(...args: any[]) => void=} debug - * @property {(...args: any[]) => void=} group - * @property {(...args: any[]) => void=} groupCollapsed - * @property {(...args: any[]) => void=} groupEnd - * @property {(...args: any[]) => void=} status - * @property {(...args: any[]) => void=} profile - * @property {(...args: any[]) => void=} profileEnd - * @property {(...args: any[]) => void=} logTime - */ - -/** - * @typedef {Object} LoggerOptions - * @property {false|true|"none"|"error"|"warn"|"info"|"log"|"verbose"} level loglevel - * @property {FilterTypes|boolean} debug filter for debug logging - * @property {LoggerConsole} console the console to log to - */ - -/** - * @param {FilterItemTypes} item an input item - * @returns {FilterFunction} filter function - */ - - -var filterToFunction = function filterToFunction(item) { - if (typeof item === "string") { - var regExp = new RegExp("[\\\\/]".concat(item.replace( // eslint-disable-next-line no-useless-escape - /[-[\]{}()*+?.\\^$|]/g, "\\$&"), "([\\\\/]|$|!|\\?)")); - return function (ident) { - return regExp.test(ident); - }; - } - - if (item && typeof item === "object" && typeof item.test === "function") { - return function (ident) { - return item.test(ident); - }; - } - - if (typeof item === "function") { - return item; - } - - if (typeof item === "boolean") { - return function () { - return item; - }; - } -}; -/** - * @enum {number} - */ - - -var LogLevel = { - none: 6, - false: 6, - error: 5, - warn: 4, - info: 3, - log: 2, - true: 2, - verbose: 1 -}; -/** - * @param {LoggerOptions} options options object - * @returns {function(string, LogTypeEnum, any[]): void} logging function - */ - -module.exports = function (_ref) { - var _ref$level = _ref.level, - level = _ref$level === void 0 ? "info" : _ref$level, - _ref$debug = _ref.debug, - debug = _ref$debug === void 0 ? false : _ref$debug, - console = _ref.console; - var debugFilters = typeof debug === "boolean" ? [function () { - return debug; - }] : - /** @type {FilterItemTypes[]} */ - [].concat(debug).map(filterToFunction); - /** @type {number} */ - - var loglevel = LogLevel["".concat(level)] || 0; - /** - * @param {string} name name of the logger - * @param {LogTypeEnum} type type of the log entry - * @param {any[]} args arguments of the log entry - * @returns {void} - */ - - var logger = function logger(name, type, args) { - var labeledArgs = function labeledArgs() { - if (Array.isArray(args)) { - if (args.length > 0 && typeof args[0] === "string") { - return ["[".concat(name, "] ").concat(args[0])].concat(_toConsumableArray(args.slice(1))); - } else { - return ["[".concat(name, "]")].concat(_toConsumableArray(args)); - } - } else { - return []; - } - }; - - var debug = debugFilters.some(function (f) { - return f(name); - }); - - switch (type) { - case LogType.debug: - if (!debug) return; // eslint-disable-next-line node/no-unsupported-features/node-builtins - - if (typeof console.debug === "function") { - // eslint-disable-next-line node/no-unsupported-features/node-builtins - console.debug.apply(console, _toConsumableArray(labeledArgs())); - } else { - console.log.apply(console, _toConsumableArray(labeledArgs())); - } - - break; - - case LogType.log: - if (!debug && loglevel > LogLevel.log) return; - console.log.apply(console, _toConsumableArray(labeledArgs())); - break; - - case LogType.info: - if (!debug && loglevel > LogLevel.info) return; - console.info.apply(console, _toConsumableArray(labeledArgs())); - break; - - case LogType.warn: - if (!debug && loglevel > LogLevel.warn) return; - console.warn.apply(console, _toConsumableArray(labeledArgs())); - break; - - case LogType.error: - if (!debug && loglevel > LogLevel.error) return; - console.error.apply(console, _toConsumableArray(labeledArgs())); - break; - - case LogType.trace: - if (!debug) return; - console.trace(); - break; - - case LogType.groupCollapsed: - if (!debug && loglevel > LogLevel.log) return; - - if (!debug && loglevel > LogLevel.verbose) { - // eslint-disable-next-line node/no-unsupported-features/node-builtins - if (typeof console.groupCollapsed === "function") { - // eslint-disable-next-line node/no-unsupported-features/node-builtins - console.groupCollapsed.apply(console, _toConsumableArray(labeledArgs())); - } else { - console.log.apply(console, _toConsumableArray(labeledArgs())); - } - - break; - } - - // falls through - - case LogType.group: - if (!debug && loglevel > LogLevel.log) return; // eslint-disable-next-line node/no-unsupported-features/node-builtins - - if (typeof console.group === "function") { - // eslint-disable-next-line node/no-unsupported-features/node-builtins - console.group.apply(console, _toConsumableArray(labeledArgs())); - } else { - console.log.apply(console, _toConsumableArray(labeledArgs())); - } - - break; - - case LogType.groupEnd: - if (!debug && loglevel > LogLevel.log) return; // eslint-disable-next-line node/no-unsupported-features/node-builtins - - if (typeof console.groupEnd === "function") { - // eslint-disable-next-line node/no-unsupported-features/node-builtins - console.groupEnd(); - } - - break; - - case LogType.time: - { - if (!debug && loglevel > LogLevel.log) return; - var ms = args[1] * 1000 + args[2] / 1000000; - var msg = "[".concat(name, "] ").concat(args[0], ": ").concat(ms, " ms"); - - if (typeof console.logTime === "function") { - console.logTime(msg); - } else { - console.log(msg); - } - - break; - } - - case LogType.profile: - // eslint-disable-next-line node/no-unsupported-features/node-builtins - if (typeof console.profile === "function") { - // eslint-disable-next-line node/no-unsupported-features/node-builtins - console.profile.apply(console, _toConsumableArray(labeledArgs())); - } - - break; - - case LogType.profileEnd: - // eslint-disable-next-line node/no-unsupported-features/node-builtins - if (typeof console.profileEnd === "function") { - // eslint-disable-next-line node/no-unsupported-features/node-builtins - console.profileEnd.apply(console, _toConsumableArray(labeledArgs())); - } - - break; - - case LogType.clear: - if (!debug && loglevel > LogLevel.log) return; // eslint-disable-next-line node/no-unsupported-features/node-builtins - - if (typeof console.clear === "function") { - // eslint-disable-next-line node/no-unsupported-features/node-builtins - console.clear(); - } - - break; - - case LogType.status: - if (!debug && loglevel > LogLevel.info) return; - - if (typeof console.status === "function") { - if (args.length === 0) { - console.status(); - } else { - console.status.apply(console, _toConsumableArray(labeledArgs())); - } - } else { - if (args.length !== 0) { - console.info.apply(console, _toConsumableArray(labeledArgs())); - } - } - - break; - - default: - throw new Error("Unexpected LogType ".concat(type)); - } - }; - - return logger; -}; - -/***/ }), - -/***/ "./node_modules/webpack/lib/logging/runtime.js": -/*!*****************************************************!*\ - !*** ./node_modules/webpack/lib/logging/runtime.js ***! - \*****************************************************/ -/***/ (function(__unused_webpack_module, exports, __nested_webpack_require_20872__) { - -/* - MIT License http://www.opensource.org/licenses/mit-license.php - Author Tobias Koppers @sokra -*/ - - -function _extends() { - _extends = Object.assign ? Object.assign.bind() : function (target) { - for (var i = 1; i < arguments.length; i++) { - var source = arguments[i]; - - for (var key in source) { - if (Object.prototype.hasOwnProperty.call(source, key)) { - target[key] = source[key]; - } - } - } - - return target; - }; - return _extends.apply(this, arguments); -} - -var SyncBailHook = __nested_webpack_require_20872__(/*! tapable/lib/SyncBailHook */ "./client-src/modules/logger/SyncBailHookFake.js"); - -var _require = __nested_webpack_require_20872__(/*! ./Logger */ "./node_modules/webpack/lib/logging/Logger.js"), - Logger = _require.Logger; - -var createConsoleLogger = __nested_webpack_require_20872__(/*! ./createConsoleLogger */ "./node_modules/webpack/lib/logging/createConsoleLogger.js"); -/** @type {createConsoleLogger.LoggerOptions} */ - - -var currentDefaultLoggerOptions = { - level: "info", - debug: false, - console: console -}; -var currentDefaultLogger = createConsoleLogger(currentDefaultLoggerOptions); -/** - * @param {string} name name of the logger - * @returns {Logger} a logger - */ - -exports.getLogger = function (name) { - return new Logger(function (type, args) { - if (exports.hooks.log.call(name, type, args) === undefined) { - currentDefaultLogger(name, type, args); - } - }, function (childName) { - return exports.getLogger("".concat(name, "/").concat(childName)); - }); -}; -/** - * @param {createConsoleLogger.LoggerOptions} options new options, merge with old options - * @returns {void} - */ - - -exports.configureDefaultLogger = function (options) { - _extends(currentDefaultLoggerOptions, options); - - currentDefaultLogger = createConsoleLogger(currentDefaultLoggerOptions); -}; - -exports.hooks = { - log: new SyncBailHook(["origin", "type", "args"]) -}; - -/***/ }) - -/******/ }); -/************************************************************************/ -/******/ // The module cache -/******/ var __webpack_module_cache__ = {}; -/******/ -/******/ // The require function -/******/ function __nested_webpack_require_23009__(moduleId) { -/******/ // Check if module is in cache -/******/ var cachedModule = __webpack_module_cache__[moduleId]; -/******/ if (cachedModule !== undefined) { -/******/ return cachedModule.exports; -/******/ } -/******/ // Create a new module (and put it into the cache) -/******/ var module = __webpack_module_cache__[moduleId] = { -/******/ // no module.id needed -/******/ // no module.loaded needed -/******/ exports: {} -/******/ }; -/******/ -/******/ // Execute the module function -/******/ __webpack_modules__[moduleId](module, module.exports, __nested_webpack_require_23009__); -/******/ -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } -/******/ -/************************************************************************/ -/******/ /* webpack/runtime/define property getters */ -/******/ !function() { -/******/ // define getter functions for harmony exports -/******/ __nested_webpack_require_23009__.d = function(exports, definition) { -/******/ for(var key in definition) { -/******/ if(__nested_webpack_require_23009__.o(definition, key) && !__nested_webpack_require_23009__.o(exports, key)) { -/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); -/******/ } -/******/ } -/******/ }; -/******/ }(); -/******/ -/******/ /* webpack/runtime/hasOwnProperty shorthand */ -/******/ !function() { -/******/ __nested_webpack_require_23009__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); } -/******/ }(); -/******/ -/******/ /* webpack/runtime/make namespace object */ -/******/ !function() { -/******/ // define __esModule on exports -/******/ __nested_webpack_require_23009__.r = function(exports) { -/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { -/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); -/******/ } -/******/ Object.defineProperty(exports, '__esModule', { value: true }); -/******/ }; -/******/ }(); -/******/ -/************************************************************************/ -var __webpack_exports__ = {}; -// This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk. -!function() { -/*!********************************************!*\ - !*** ./client-src/modules/logger/index.js ***! - \********************************************/ -__nested_webpack_require_23009__.r(__webpack_exports__); -/* harmony export */ __nested_webpack_require_23009__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* reexport default export from named module */ webpack_lib_logging_runtime_js__WEBPACK_IMPORTED_MODULE_0__; } -/* harmony export */ }); -/* harmony import */ var webpack_lib_logging_runtime_js__WEBPACK_IMPORTED_MODULE_0__ = __nested_webpack_require_23009__(/*! webpack/lib/logging/runtime.js */ "./node_modules/webpack/lib/logging/runtime.js"); - -}(); -var __webpack_export_target__ = exports; -for(var i in __webpack_exports__) __webpack_export_target__[i] = __webpack_exports__[i]; -if(__webpack_exports__.__esModule) Object.defineProperty(__webpack_export_target__, "__esModule", { value: true }); -/******/ })() -; - -/***/ }), - -/***/ "./node_modules/webpack-dev-server/client/overlay.js": -/*!***********************************************************!*\ - !*** ./node_modules/webpack-dev-server/client/overlay.js ***! - \***********************************************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "formatProblem": function() { return /* binding */ formatProblem; }, -/* harmony export */ "hide": function() { return /* binding */ hide; }, -/* harmony export */ "show": function() { return /* binding */ show; } -/* harmony export */ }); -/* harmony import */ var ansi_html_community__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ansi-html-community */ "./node_modules/ansi-html-community/index.js"); -/* harmony import */ var ansi_html_community__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(ansi_html_community__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var html_entities__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! html-entities */ "./node_modules/html-entities/lib/index.js"); -/* harmony import */ var html_entities__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(html_entities__WEBPACK_IMPORTED_MODULE_1__); -// The error overlay is inspired (and mostly copied) from Create React App (https://github.com/facebookincubator/create-react-app) -// They, in turn, got inspired by webpack-hot-middleware (https://github.com/glenjamin/webpack-hot-middleware). - - -var colors = { - reset: ["transparent", "transparent"], - black: "181818", - red: "E36049", - green: "B3CB74", - yellow: "FFD080", - blue: "7CAFC2", - magenta: "7FACCA", - cyan: "C3C2EF", - lightgrey: "EBE7E3", - darkgrey: "6D7891" -}; -/** @type {HTMLIFrameElement | null | undefined} */ - -var iframeContainerElement; -/** @type {HTMLDivElement | null | undefined} */ - -var containerElement; -/** @type {Array<(element: HTMLDivElement) => void>} */ - -var onLoadQueue = []; -/** @type {TrustedTypePolicy | undefined} */ - -var overlayTrustedTypesPolicy; -ansi_html_community__WEBPACK_IMPORTED_MODULE_0___default().setColors(colors); -/** - * @param {string | null} trustedTypesPolicyName - */ - -function createContainer(trustedTypesPolicyName) { - // Enable Trusted Types if they are available in the current browser. - if (window.trustedTypes) { - overlayTrustedTypesPolicy = window.trustedTypes.createPolicy(trustedTypesPolicyName || "webpack-dev-server#overlay", { - createHTML: function createHTML(value) { - return value; - } - }); - } - - iframeContainerElement = document.createElement("iframe"); - iframeContainerElement.id = "webpack-dev-server-client-overlay"; - iframeContainerElement.src = "about:blank"; - iframeContainerElement.style.position = "fixed"; - iframeContainerElement.style.left = 0; - iframeContainerElement.style.top = 0; - iframeContainerElement.style.right = 0; - iframeContainerElement.style.bottom = 0; - iframeContainerElement.style.width = "100vw"; - iframeContainerElement.style.height = "100vh"; - iframeContainerElement.style.border = "none"; - iframeContainerElement.style.zIndex = 9999999999; - - iframeContainerElement.onload = function () { - containerElement = - /** @type {Document} */ - - /** @type {HTMLIFrameElement} */ - iframeContainerElement.contentDocument.createElement("div"); - containerElement.id = "webpack-dev-server-client-overlay-div"; - containerElement.style.position = "fixed"; - containerElement.style.boxSizing = "border-box"; - containerElement.style.left = 0; - containerElement.style.top = 0; - containerElement.style.right = 0; - containerElement.style.bottom = 0; - containerElement.style.width = "100vw"; - containerElement.style.height = "100vh"; - containerElement.style.backgroundColor = "rgba(0, 0, 0, 0.85)"; - containerElement.style.color = "#E8E8E8"; - containerElement.style.fontFamily = "Menlo, Consolas, monospace"; - containerElement.style.fontSize = "large"; - containerElement.style.padding = "2rem"; - containerElement.style.lineHeight = "1.2"; - containerElement.style.whiteSpace = "pre-wrap"; - containerElement.style.overflow = "auto"; - var headerElement = document.createElement("span"); - headerElement.innerText = "Compiled with problems:"; - var closeButtonElement = document.createElement("button"); - closeButtonElement.innerText = "X"; - closeButtonElement.style.background = "transparent"; - closeButtonElement.style.border = "none"; - closeButtonElement.style.fontSize = "20px"; - closeButtonElement.style.fontWeight = "bold"; - closeButtonElement.style.color = "white"; - closeButtonElement.style.cursor = "pointer"; - closeButtonElement.style.cssFloat = "right"; // @ts-ignore - - closeButtonElement.style.styleFloat = "right"; - closeButtonElement.addEventListener("click", function () { - hide(); - }); - containerElement.appendChild(headerElement); - containerElement.appendChild(closeButtonElement); - containerElement.appendChild(document.createElement("br")); - containerElement.appendChild(document.createElement("br")); - /** @type {Document} */ - - /** @type {HTMLIFrameElement} */ - iframeContainerElement.contentDocument.body.appendChild(containerElement); - onLoadQueue.forEach(function (onLoad) { - onLoad( - /** @type {HTMLDivElement} */ - containerElement); - }); - onLoadQueue = []; - /** @type {HTMLIFrameElement} */ - - iframeContainerElement.onload = null; - }; - - document.body.appendChild(iframeContainerElement); -} -/** - * @param {(element: HTMLDivElement) => void} callback - * @param {string | null} trustedTypesPolicyName - */ - - -function ensureOverlayExists(callback, trustedTypesPolicyName) { - if (containerElement) { - // Everything is ready, call the callback right away. - callback(containerElement); - return; - } - - onLoadQueue.push(callback); - - if (iframeContainerElement) { - return; - } - - createContainer(trustedTypesPolicyName); -} // Successful compilation. - - -function hide() { - if (!iframeContainerElement) { - return; - } // Clean up and reset internal state. - - - document.body.removeChild(iframeContainerElement); - iframeContainerElement = null; - containerElement = null; -} -/** - * @param {string} type - * @param {string | { file?: string, moduleName?: string, loc?: string, message?: string }} item - * @returns {{ header: string, body: string }} - */ - - -function formatProblem(type, item) { - var header = type === "warning" ? "WARNING" : "ERROR"; - var body = ""; - - if (typeof item === "string") { - body += item; - } else { - var file = item.file || ""; // eslint-disable-next-line no-nested-ternary - - var moduleName = item.moduleName ? item.moduleName.indexOf("!") !== -1 ? "".concat(item.moduleName.replace(/^(\s|\S)*!/, ""), " (").concat(item.moduleName, ")") : "".concat(item.moduleName) : ""; - var loc = item.loc; - header += "".concat(moduleName || file ? " in ".concat(moduleName ? "".concat(moduleName).concat(file ? " (".concat(file, ")") : "") : file).concat(loc ? " ".concat(loc) : "") : ""); - body += item.message || ""; - } - - return { - header: header, - body: body - }; -} // Compilation with errors (e.g. syntax error or missing modules). - -/** - * @param {string} type - * @param {Array} messages - * @param {string | null} trustedTypesPolicyName - */ - - -function show(type, messages, trustedTypesPolicyName) { - ensureOverlayExists(function () { - messages.forEach(function (message) { - var entryElement = document.createElement("div"); - var typeElement = document.createElement("span"); - - var _formatProblem = formatProblem(type, message), - header = _formatProblem.header, - body = _formatProblem.body; - - typeElement.innerText = header; - typeElement.style.color = "#".concat(colors.red); // Make it look similar to our terminal. - - var text = ansi_html_community__WEBPACK_IMPORTED_MODULE_0___default()((0,html_entities__WEBPACK_IMPORTED_MODULE_1__.encode)(body)); - var messageTextNode = document.createElement("div"); - messageTextNode.innerHTML = overlayTrustedTypesPolicy ? overlayTrustedTypesPolicy.createHTML(text) : text; - entryElement.appendChild(typeElement); - entryElement.appendChild(document.createElement("br")); - entryElement.appendChild(document.createElement("br")); - entryElement.appendChild(messageTextNode); - entryElement.appendChild(document.createElement("br")); - entryElement.appendChild(document.createElement("br")); - /** @type {HTMLDivElement} */ - - containerElement.appendChild(entryElement); - }); - }, trustedTypesPolicyName); -} - - - -/***/ }), - -/***/ "./node_modules/webpack-dev-server/client/socket.js": -/*!**********************************************************!*\ - !*** ./node_modules/webpack-dev-server/client/socket.js ***! - \**********************************************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "client": function() { return /* binding */ client; } -/* harmony export */ }); -/* harmony import */ var _clients_WebSocketClient_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./clients/WebSocketClient.js */ "./node_modules/webpack-dev-server/client/clients/WebSocketClient.js"); -/* harmony import */ var _utils_log_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils/log.js */ "./node_modules/webpack-dev-server/client/utils/log.js"); -/* provided dependency */ var __webpack_dev_server_client__ = __webpack_require__(/*! ./node_modules/webpack-dev-server/client/clients/WebSocketClient.js */ "./node_modules/webpack-dev-server/client/clients/WebSocketClient.js"); -/* global __webpack_dev_server_client__ */ - - // this WebsocketClient is here as a default fallback, in case the client is not injected - -/* eslint-disable camelcase */ - -var Client = // eslint-disable-next-line no-nested-ternary -typeof __webpack_dev_server_client__ !== "undefined" ? typeof __webpack_dev_server_client__.default !== "undefined" ? __webpack_dev_server_client__.default : __webpack_dev_server_client__ : _clients_WebSocketClient_js__WEBPACK_IMPORTED_MODULE_0__["default"]; -/* eslint-enable camelcase */ - -var retries = 0; -var maxRetries = 10; // Initialized client is exported so external consumers can utilize the same instance -// It is mutable to enforce singleton -// eslint-disable-next-line import/no-mutable-exports - -var client = null; -/** - * @param {string} url - * @param {{ [handler: string]: (data?: any, params?: any) => any }} handlers - * @param {number} [reconnect] - */ - -var socket = function initSocket(url, handlers, reconnect) { - client = new Client(url); - client.onOpen(function () { - retries = 0; - - if (typeof reconnect !== "undefined") { - maxRetries = reconnect; - } - }); - client.onClose(function () { - if (retries === 0) { - handlers.close(); - } // Try to reconnect. - - - client = null; // After 10 retries stop trying, to prevent logspam. - - if (retries < maxRetries) { - // Exponentially increase timeout to reconnect. - // Respectfully copied from the package `got`. - // eslint-disable-next-line no-restricted-properties - var retryInMs = 1000 * Math.pow(2, retries) + Math.random() * 100; - retries += 1; - _utils_log_js__WEBPACK_IMPORTED_MODULE_1__.log.info("Trying to reconnect..."); - setTimeout(function () { - socket(url, handlers, reconnect); - }, retryInMs); - } - }); - client.onMessage( - /** - * @param {any} data - */ - function (data) { - var message = JSON.parse(data); - - if (handlers[message.type]) { - handlers[message.type](message.data, message.params); - } - }); -}; - -/* harmony default export */ __webpack_exports__["default"] = (socket); - -/***/ }), - -/***/ "./node_modules/webpack-dev-server/client/utils/createSocketURL.js": -/*!*************************************************************************!*\ - !*** ./node_modules/webpack-dev-server/client/utils/createSocketURL.js ***! - \*************************************************************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/** - * @param {{ protocol?: string, auth?: string, hostname?: string, port?: string, pathname?: string, search?: string, hash?: string, slashes?: boolean }} objURL - * @returns {string} - */ -function format(objURL) { - var protocol = objURL.protocol || ""; - - if (protocol && protocol.substr(-1) !== ":") { - protocol += ":"; - } - - var auth = objURL.auth || ""; - - if (auth) { - auth = encodeURIComponent(auth); - auth = auth.replace(/%3A/i, ":"); - auth += "@"; - } - - var host = ""; - - if (objURL.hostname) { - host = auth + (objURL.hostname.indexOf(":") === -1 ? objURL.hostname : "[".concat(objURL.hostname, "]")); - - if (objURL.port) { - host += ":".concat(objURL.port); - } - } - - var pathname = objURL.pathname || ""; - - if (objURL.slashes) { - host = "//".concat(host || ""); - - if (pathname && pathname.charAt(0) !== "/") { - pathname = "/".concat(pathname); - } - } else if (!host) { - host = ""; - } - - var search = objURL.search || ""; - - if (search && search.charAt(0) !== "?") { - search = "?".concat(search); - } - - var hash = objURL.hash || ""; - - if (hash && hash.charAt(0) !== "#") { - hash = "#".concat(hash); - } - - pathname = pathname.replace(/[?#]/g, - /** - * @param {string} match - * @returns {string} - */ - function (match) { - return encodeURIComponent(match); - }); - search = search.replace("#", "%23"); - return "".concat(protocol).concat(host).concat(pathname).concat(search).concat(hash); -} -/** - * @param {URL & { fromCurrentScript?: boolean }} parsedURL - * @returns {string} - */ - - -function createSocketURL(parsedURL) { - var hostname = parsedURL.hostname; // Node.js module parses it as `::` - // `new URL(urlString, [baseURLString])` parses it as '[::]' - - var isInAddrAny = hostname === "0.0.0.0" || hostname === "::" || hostname === "[::]"; // why do we need this check? - // hostname n/a for file protocol (example, when using electron, ionic) - // see: https://github.com/webpack/webpack-dev-server/pull/384 - - if (isInAddrAny && self.location.hostname && self.location.protocol.indexOf("http") === 0) { - hostname = self.location.hostname; - } - - var socketURLProtocol = parsedURL.protocol || self.location.protocol; // When https is used in the app, secure web sockets are always necessary because the browser doesn't accept non-secure web sockets. - - if (socketURLProtocol === "auto:" || hostname && isInAddrAny && self.location.protocol === "https:") { - socketURLProtocol = self.location.protocol; - } - - socketURLProtocol = socketURLProtocol.replace(/^(?:http|.+-extension|file)/i, "ws"); - var socketURLAuth = ""; // `new URL(urlString, [baseURLstring])` doesn't have `auth` property - // Parse authentication credentials in case we need them - - if (parsedURL.username) { - socketURLAuth = parsedURL.username; // Since HTTP basic authentication does not allow empty username, - // we only include password if the username is not empty. - - if (parsedURL.password) { - // Result: : - socketURLAuth = socketURLAuth.concat(":", parsedURL.password); - } - } // In case the host is a raw IPv6 address, it can be enclosed in - // the brackets as the brackets are needed in the final URL string. - // Need to remove those as url.format blindly adds its own set of brackets - // if the host string contains colons. That would lead to non-working - // double brackets (e.g. [[::]]) host - // - // All of these web socket url params are optionally passed in through resourceQuery, - // so we need to fall back to the default if they are not provided - - - var socketURLHostname = (hostname || self.location.hostname || "localhost").replace(/^\[(.*)\]$/, "$1"); - var socketURLPort = parsedURL.port; - - if (!socketURLPort || socketURLPort === "0") { - socketURLPort = self.location.port; - } // If path is provided it'll be passed in via the resourceQuery as a - // query param so it has to be parsed out of the querystring in order for the - // client to open the socket to the correct location. - - - var socketURLPathname = "/ws"; - - if (parsedURL.pathname && !parsedURL.fromCurrentScript) { - socketURLPathname = parsedURL.pathname; - } - - return format({ - protocol: socketURLProtocol, - auth: socketURLAuth, - hostname: socketURLHostname, - port: socketURLPort, - pathname: socketURLPathname, - slashes: true - }); -} - -/* harmony default export */ __webpack_exports__["default"] = (createSocketURL); - -/***/ }), - -/***/ "./node_modules/webpack-dev-server/client/utils/getCurrentScriptSource.js": -/*!********************************************************************************!*\ - !*** ./node_modules/webpack-dev-server/client/utils/getCurrentScriptSource.js ***! - \********************************************************************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/** - * @returns {string} - */ -function getCurrentScriptSource() { - // `document.currentScript` is the most accurate way to find the current script, - // but is not supported in all browsers. - if (document.currentScript) { - return document.currentScript.getAttribute("src"); - } // Fallback to getting all scripts running in the document. - - - var scriptElements = document.scripts || []; - var scriptElementsWithSrc = Array.prototype.filter.call(scriptElements, function (element) { - return element.getAttribute("src"); - }); - - if (scriptElementsWithSrc.length > 0) { - var currentScript = scriptElementsWithSrc[scriptElementsWithSrc.length - 1]; - return currentScript.getAttribute("src"); - } // Fail as there was no script to use. - - - throw new Error("[webpack-dev-server] Failed to get current script source."); -} - -/* harmony default export */ __webpack_exports__["default"] = (getCurrentScriptSource); - -/***/ }), - -/***/ "./node_modules/webpack-dev-server/client/utils/log.js": -/*!*************************************************************!*\ - !*** ./node_modules/webpack-dev-server/client/utils/log.js ***! - \*************************************************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "log": function() { return /* binding */ log; }, -/* harmony export */ "setLogLevel": function() { return /* binding */ setLogLevel; } -/* harmony export */ }); -/* harmony import */ var _modules_logger_index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/logger/index.js */ "./node_modules/webpack-dev-server/client/modules/logger/index.js"); -/* harmony import */ var _modules_logger_index_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_modules_logger_index_js__WEBPACK_IMPORTED_MODULE_0__); - -var name = "webpack-dev-server"; // default level is set on the client side, so it does not need -// to be set by the CLI or API - -var defaultLevel = "info"; // options new options, merge with old options - -/** - * @param {false | true | "none" | "error" | "warn" | "info" | "log" | "verbose"} level - * @returns {void} - */ - -function setLogLevel(level) { - _modules_logger_index_js__WEBPACK_IMPORTED_MODULE_0___default().configureDefaultLogger({ - level: level - }); -} - -setLogLevel(defaultLevel); -var log = _modules_logger_index_js__WEBPACK_IMPORTED_MODULE_0___default().getLogger(name); - - -/***/ }), - -/***/ "./node_modules/webpack-dev-server/client/utils/parseURL.js": -/*!******************************************************************!*\ - !*** ./node_modules/webpack-dev-server/client/utils/parseURL.js ***! - \******************************************************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _getCurrentScriptSource_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getCurrentScriptSource.js */ "./node_modules/webpack-dev-server/client/utils/getCurrentScriptSource.js"); - -/** - * @param {string} resourceQuery - * @returns {{ [key: string]: string | boolean }} - */ - -function parseURL(resourceQuery) { - /** @type {{ [key: string]: string }} */ - var options = {}; - - if (typeof resourceQuery === "string" && resourceQuery !== "") { - var searchParams = resourceQuery.slice(1).split("&"); - - for (var i = 0; i < searchParams.length; i++) { - var pair = searchParams[i].split("="); - options[pair[0]] = decodeURIComponent(pair[1]); - } - } else { - // Else, get the url from the
Rotate Mode
R
RotateScale Mode
r
Scale Mode
s
Distort Mode
d
Drag Mode
D
Lock (Mode) / Unlock Image
l u
Stack up / down
q a
Add / Remove Image Border
b
Toggle Opacity
o
Deselect All
esc
Delete Image(s)
delete backspace
Export Image(s)
e
'),t.appendChild(i),t},this._keymapper.addTo(this._map)},_toggleKeymapper:function(t){t.preventDefault(),this._container.className="ldi-keymapper leaflet-control"===this._container.className?"ldi-keymapper-hide leaflet-control":"ldi-keymapper leaflet-control",this._scrollWrapper.style.display="none"===this._scrollWrapper.style.display?"block":"none",this._toggler.innerHTML="close"===this._toggler.innerHTML?L.IconUtil.create("keyboard_open"):"close",L.IconUtil.toggleTitle(this._toggler,"Show keymap","Hide keymap"),L.DomUtil.toggleClass(this._toggler,"close-icon")},_injectIconSet:function(){if(!document.querySelector("#keymapper-iconset")){var t=L.DomUtil.create("div","");t.id="keymapper-iconset",t.setAttribute("hidden","hidden"),this._iconset=(new L.KeymapperIconSet).render(),t.innerHTML=this._iconset,document.querySelector(".leaflet-control-container").appendChild(t)}}}),L.DistortableImage.Keymapper.addInitHook((function(){L.DistortableImage.Keymapper.prototype._n=L.DistortableImage.Keymapper.prototype._n?L.DistortableImage.Keymapper.prototype._n+1:1,1!==L.DistortableImage.Keymapper.prototype._n||L.Browser.mobile||(t.enable(),t._injectIconSet())})),L.distortableImage.keymapper=function(t,e){return new L.DistortableImage.Keymapper(t,e)}},428:function(){L.DistortableImage=L.DistortableImage||{},L.DistortableCollection.Edit=L.Handler.extend({options:{keymap:L.distortableImage.group_action_map},initialize:function(t,e){this._group=t,this._exportOpts=t.options.exportOpts,L.setOptions(this,e),L.distortableImage.group_action_map.Escape="_decollectAll"},addHooks:function(){var t=this._group._map;this.editActions=this.options.actions,this.runExporter=L.bind(L.Utils.getNestedVal(this,"_exportOpts","exporter")||this.startExport,this),L.DomEvent.on(document,"keydown",this._onKeyDown,this),t.doubleClickZoom.enabled()||t.doubleClickLabels.enabled()||L.DomEvent.on(t,"click",this._decollectAll,this),L.DomEvent.on(t,{singleclickon:this._singleClickListeners,singleclickoff:this._resetClickListeners,singleclick:this._singleClick,boxcollectend:this._addCollections},this),this._group.editable=!0,this._group.eachLayer((function(t){return t.editing.enable()}))},removeHooks:function(){var t=this._group._map;L.DomEvent.off(document,"keydown",this._onKeyDown,this),t.doubleClickZoom.enabled()||t.doubleClickLabels.enabled()||L.DomEvent.off(t,"click",this._decollectAll,this),L.DomEvent.off(t,{singleclickon:this._singleClickListeners,singleclickoff:this._resetClickListeners,singleclick:this._singleClick,boxcollectend:this._addCollections},this),this._decollectAll(),this._group.editable=!1,this._group.eachLayer((function(t){return t.editing.disable()}))},enable:function(){return this._enabled=!0,this.addHooks(),this},disable:function(){return this._enabled=!1,this.removeHooks(),this},_onKeyDown:function(t){var e=this.options.keymap[t.key];this[e]&&this._group.anyCollected()&&this[e].call(this)},_singleClick:function(t){"singleclick"===t.type&&this._decollectAll(t)},_singleClickListeners:function(){var t=this._group._map;L.DomEvent.off(t,"click",this._decollectAll,this),L.DomEvent.on(t,"singleclick",this._decollectAll,this)},_resetClickListeners:function(){var t=this._group._map;L.DomEvent.on(t,"click",this._decollectAll,this),L.DomEvent.off(t,"singleclick",this._decollectAll,this)},_decollectAll:function(t){var e;t&&(e=t.originalEvent),e&&(e.shiftKey||e.target instanceof HTMLImageElement)||(this._group.eachLayer((function(t){L.DomUtil.removeClass(t.getElement(),"collected"),t.deselect()})),this._removeToolbar(),t&&L.DomEvent.stopPropagation(t))},_unlockGroup:function(){var t=this;this.hasTool(L.UnlockAction)&&this._group.eachLayer((function(e){t._group.isCollected(e)&&(e.editing._unlock(),e.deselect())}))},_lockGroup:function(){var t=this;this.hasTool(L.LockAction)&&this._group.eachLayer((function(e){t._group.isCollected(e)&&(e.editing._lock(),L.DomUtil.addClass(e.getElement(),"collected"))}))},_addCollections:function(t){var e=this,i=t.boxCollectBounds,o=this._group._map;this._group.eachLayer((function(t){var n=t.editing;t.isSelected()&&t.deselect();var a=o.getZoom(),s=o.getCenter(),r=L.latLngBounds(t.getCorner(2),t.getCorner(1));r=o._latLngBoundsToNewLayerBounds(r,a,s),i.intersects(r)&&n.enabled()&&(e.toolbar||e._addToolbar(),L.DomUtil.addClass(t.getElement(),"collected"))}))},_removeGroup:function(t){var e=this;if(this.hasTool(L.DeleteAction)){var i=this._group._toRemove(),o=i.length;0!==o&&(L.DomUtil.confirmDeletes(o)&&(i.forEach((function(t){e._group.removeLayer(t)})),this._group.anyCollected()||this._removeToolbar()),t&&L.DomEvent.stopPropagation(t))}},cancelExport:function(){this.customCollection||(this._exportOpts.collection=void 0),clearInterval(this.updateInterval)},_addToolbar:function(){var t=this._group,e=t._map;t.options.suppressToolbar||this.toolbar||(this.toolbar=L.distortableImage.controlBar({actions:this.editActions,position:"topleft"}).addTo(e,t))},_removeToolbar:function(){var t=this._group._map;if(!this.toolbar)return!1;t.removeLayer(this.toolbar),this.toolbar=!1},hasTool:function(t){return this.editActions.some((function(e){return e===t}))},addTool:function(t){return"leaflet-toolbar-icon"!==t.baseClass||this.hasTool(t)||(this._removeToolbar(),this.editActions.push(t),this._addToolbar()),this},removeTool:function(t){var e=this;return this.editActions.some((function(i,o){return e.editActions[o]===t&&(e._removeToolbar(),e.editActions.splice(o,1),e._addToolbar(),!0)})),this},startExport:function(){var t=this;if(this.hasTool(L.ExportAction))return new Promise((function(e){var i,o=t._exportOpts;o.resolve=e,t.updateInterval=null,t.customCollection=!!o.collection,t.customCollection||(o.collection=t._group.generateExportJson().images),o.frequency=o.frequency||3e3,o.scale=o.scale||100,o.updater=o.updater||function(n){(n=JSON.parse(n)).status_url&&(i!==n.status_url&&n.status_url.match(".json")&&(i=n.status_url),"complete"===n.status&&(clearInterval(t.updateInterval),t.customCollection||(t._exportOpts.collection=void 0),e(),null!==n.jpg&&alert("Export succeeded. "+o.exportUrl+n.jpg)),console.log(n))},o.handleStatusRes=o.handleStatusRes||function(e){i=o.statusUrl+e,t.updateInterval=setInterval((function(){var t=new Request("".concat(i,"?").concat(Date.now()),{method:"GET"});fetch(t).then((function(t){if(t.ok)return t.text()})).then(o.updater)}),o.frequency)},o.fetchStatusUrl=o.fetchStatusUrl||function(t){var e=new FormData;e.append("collection",JSON.stringify(t.collection)),e.append("scale",t.scale),e.append("upload",!0);var i={method:"POST",body:e},o=new Request(t.exportStartUrl,i);fetch(o).then((function(t){if(t.ok)return t.text()})).then(t.handleStatusRes)},o.fetchStatusUrl(o)}))}}),L.distortableCollection.edit=function(t,e){return new L.DistortableCollection.Edit(t,e)}},397:function(){L.DistortableImage=L.DistortableImage||{},L.DistortableImage.Edit=L.Handler.extend({options:{opacity:.7,outline:"1px solid red",keymap:L.distortableImage.action_map},initialize:function(t,e){this._overlay=t,this._toggledImage=!1,this._mode=t.options.mode,this._transparent=!1,this._outlined=!1,L.setOptions(this,e),L.distortableImage.action_map.Escape="_deselect"},addHooks:function(){var t=this._overlay;this.editActions=this.options.actions,t.bringToFront(),this._initModes(),this._initHandles(),this._appendHandlesandDragable(),t.isSelected()&&!t.options.suppressToolbar&&this._addToolbar(),this.parentGroup=!!t.eP&&t.eP,L.DomEvent.on(t.getElement(),{dblclick:this.nextMode},this),L.DomEvent.on(window,"keydown",this._onKeyDown,this)},removeHooks:function(){var t=this._overlay,e=this.parentGroup;for(var i in this._disableDragging(),this.toolbar&&this._removeToolbar(),this._handles)L.DomUtil.remove(i);L.DomUtil.hasClass(t.getElement(),"collected")&&L.DomUtil.removeClass(t.getElement(),"collected"),e&&!e.anyCollected()&&e.editing.toolbar&&e.editing._removeToolbar(),L.DomEvent.off(t.getElement(),{dblclick:this.nextMode},this),L.DomEvent.off(window,"keydown",this._onKeyDown,this)},disable:function(){return this._enabled?(this._overlay.deselect(),this._enabled=!1,this.removeHooks(),this):this},_initModes:function(){for(var t in this._modes={},L.DistortableImage.Edit.MODES){var e=L.DistortableImage.Edit.MODES[t];-1!==this.editActions.indexOf(e)&&(this._modes[t]=e)}this._modes[this._mode]||(this._mode=Object.keys(this._modes)[0])},_initHandles:function(){var t,e=this._overlay;for(this._dragHandles=L.layerGroup(),t=0;t<4;t++)this._dragHandles.addLayer(L.dragHandle(e,t));for(this._scaleHandles=L.layerGroup(),t=0;t<4;t++)this._scaleHandles.addLayer(L.scaleHandle(e,t));for(this._distortHandles=L.layerGroup(),t=0;t<4;t++)this._distortHandles.addLayer(L.distortHandle(e,t));for(this._rotateHandles=L.layerGroup(),t=0;t<4;t++)this._rotateHandles.addLayer(L.rotateHandle(e,t));for(this._freeRotateHandles=L.layerGroup(),t=0;t<4;t++)this._freeRotateHandles.addLayer(L.freeRotateHandle(e,t));for(this._lockHandles=L.layerGroup(),t=0;t<4;t++)this._lockHandles.addLayer(L.lockHandle(e,t,{draggable:!1}));this._handles={drag:this._dragHandles,scale:this._scaleHandles,distort:this._distortHandles,rotate:this._rotateHandles,freeRotate:this._freeRotateHandles,lock:this._lockHandles}},_appendHandlesandDragable:function(){var t=this._overlay;this._mode?(this._updateHandle(),!t.isSelected()&&this.currentHandle&&this.currentHandle.eachLayer((function(t){t.setOpacity(0),t.dragging&&t.dragging.disable()})),this.isMode("lock")||this._enableDragging()):this._enableDragging()},_onKeyDown:function(t){var e=this.options.keymap[t.key],i=this._overlay,o=this.parentGroup;o&&o.anyCollected()||void 0===this[e]||i.options.suppressToolbar||i.isSelected()&&this.toolbar&&this[e].call(this)},replaceTool:function(t,e){var i=this;return"leaflet-toolbar-icon"!==e.baseClass||this.hasTool(e)||this.editActions.some((function(o,n){if(o===t){for(var a in i._removeToolbar(),i.editActions[n]=e,i._addToolbar(),L.DistortableImage.Edit.MODES)L.DistortableImage.Edit.MODES[a]===t?(delete i._modes[a],i._nextOrNone(a)):L.DistortableImage.Edit.MODES[a]===e&&(i._modes[a]=e);return!0}})),this},addTool:function(t){if("leaflet-toolbar-icon"===t.baseClass&&!this.hasTool(t)){for(var e in this._removeToolbar(),this.editActions.push(t),this._addToolbar(),L.DistortableImage.Edit.MODES)L.DistortableImage.Edit.MODES[e]===t&&(this._modes[e]=t);this._overlay.isSelected()||this._removeToolbar()}return this},hasTool:function(t){return this.editActions.some((function(e){return e===t}))},removeTool:function(t){var e=this;return this.editActions.some((function(i,o){if(i===t){for(var n in e._removeToolbar(),e.editActions.splice(o,1),e._addToolbar(),L.DistortableImage.Edit.MODES)L.DistortableImage.Edit.MODES[n]===t&&(delete e._modes[n],e._nextOrNone(n));return!0}})),this._overlay.isSelected()||this._removeToolbar(),this},_nextOrNone:function(t){this.isMode(t)&&(Object.keys(this.getModes()).length>=1?this.nextMode():("lock"===t&&this._enableDragging(),this._mode="",this._updateHandle()))},_removeToolbar:function(){var t=this._overlay._map;this.toolbar&&(t.removeLayer(this.toolbar),this.toolbar=!1)},_enableDragging:function(){var t=this,e=this._overlay,i=e._map;this.dragging=new L.Draggable(e.getElement()),this.dragging.enable(),this.dragging.on("dragstart",(function(){e.fire("dragstart"),t._removeToolbar()})),this.dragging._updatePosition=function(){var t,o,n=e.getCorner(0),a=this._newPos.subtract(i.latLngToLayerPoint(n)),s={};for(this.fire("predrag"),o=0;o<4;o++)t=i.latLngToLayerPoint(e.getCorner(o)),s[o]=i.layerPointToLatLng(t.add(a));e.setCorners(s),e.fire("drag"),this.fire("drag")},this.dragging.on("dragend",(function(){e.fire("dragend")}))},_disableDragging:function(){this.dragging&&(this.dragging.disable(),delete this.dragging)},_dragMode:function(){this.setMode("drag")},_scaleMode:function(){this.setMode("scale")},_distortMode:function(){this.setMode("distort")},_rotateMode:function(){this.setMode("rotate")},_freeRotateMode:function(){this.setMode("freeRotate")},_toggleLockMode:function(){this.isMode("lock")?this._unlock():this._lock()},_toggleOpacity:function(){var t=this._overlay.getElement();if(this.hasTool(L.OpacityAction)){this._transparent=!this._transparent;var e=this._transparent?this.options.opacity:1;L.DomUtil.setOpacity(t,e),t.setAttribute("opacity",e),this._refresh()}},_toggleBorder:function(){var t=this._overlay.getElement();if(this.hasTool(L.BorderAction)){this._outlined=!this._outlined;var e=this._outlined?this.options.outline:"none";t.style.outline=e,this._refresh()}},_toggleOrder:function(){this._toggledImage?this._stackUp():this._stackDown()},_removeOverlay:function(){var t=this._overlay,e=this.parentGroup;!this.isMode("lock")&&this.hasTool(L.DeleteAction)&&L.DomUtil.confirmDelete()&&(this._removeToolbar(),e?e.removeLayer(t):t._map.removeLayer(t))},_getExport:function(){var t=this._overlay,e=t._map,i=t.getElement();if(this.hasTool(L.ExportAction)){var o=new Image;o.id=o.id||"tempId12345",document.body.appendChild(o),o.onload=function(){var i=o.height,n=o.width,a=e.latLngToLayerPoint(t.getCorner(0)),s=e.latLngToLayerPoint(t.getCorner(1)),r=e.latLngToLayerPoint(t.getCorner(2)),l=e.latLngToLayerPoint(t.getCorner(3));o.onload=function(){L.DomUtil.remove(o)},window&&window.hasOwnProperty("warpWebGl")&&warpWebGl(o.id,[0,0,n,0,n,i,0,i],[a.x,a.y,s.x,s.y,l.x,l.y,r.x,r.y],!0)},o.src=t.options.fullResolutionSrc||i.src}},_stackUp:function(){this._toggledImage&&this.hasTool(L.StackAction)&&(this._toggledImage=!1,this._overlay.bringToFront(),this._refresh())},_stackDown:function(){!this._toggledImage&&this.hasTool(L.StackAction)&&(this._toggledImage=!0,this._overlay.bringToBack(),this._refresh())},_unlock:function(){var t=this._overlay,e=t._map,i=this.parentGroup;this.isMode("lock")&&((!i||i.isCollected(t))&&i||this.hasTool(L.LockAction))&&(this.currentHandle&&e.removeLayer(this.currentHandle),"lock"!==t.options.mode&&this.hasMode(t.options.mode)?this._mode=t.options.mode:(this._mode="",this.currentHandle=""),this._updateHandle(),this._enableDragging(),this._refresh())},_lock:function(){var t=this._overlay,e=t._map,i=this.parentGroup;this.isMode("lock")||((!i||i.isCollected(t))&&i||this.hasTool(L.LockAction))&&(this.currentHandle&&e.removeLayer(this.currentHandle),this._mode="lock",this._updateHandle(),this._disableDragging(),this._refresh())},_deselect:function(){this._overlay.deselect()},_showMarkers:function(t){var e=this.parentGroup;this.currentHandle&&(!this.isMode("lock")&&e&&e.anyCollected()||this.currentHandle.eachLayer((function(t){t.setOpacity(1),t.dragging&&t.dragging.enable(),L.DomUtil.addClass(t.getElement(),"leaflet-interactive")})))},_hideMarkers:function(){var t=this._overlay,e=this.parentGroup;this._handles||this._initHandles(),this.currentHandle&&(this.isMode("lock")&&e&&e.isCollected(t)||this.currentHandle.eachLayer((function(t){t.setOpacity(0),t.dragging&&t.dragging.disable(),L.DomUtil.removeClass(t.getElement(),"leaflet-interactive")})))},_updateHandle:function(){var t=this._overlay._map,e=this.getMode();this.currentHandle&&t.removeLayer(this.currentHandle),this.currentHandle=""===e?"":this._handles[e],""!==this.currentHandle&&t.addLayer(this.currentHandle)},_addToolbar:function(){var t=this._overlay,e=this.parentGroup,i=t._map,o=t.getCorners(),n=-1/0;if(e&&e.anyCollected())e.editing._addToolbar();else if(!t.options.suppressToolbar&&!this.toolbar){for(var a=0;an&&(n=o[a].lat);var s=t.getCenter();s.lat=n,this.toolbar=L.distortableImage.popupBar(s,{actions:this.editActions}).addTo(i,t),t.fire("toolbar:created")}},_refresh:function(){this.toolbar&&this._removeToolbar(),this._addToolbar()},_updateToolbarPos:function(){var t=this._overlay,e=t.getCorners(),i=this.toolbar,o=-1/0;if(i&&i instanceof L.DistortableImage.PopupBar){for(var n=0;no&&(o=e[n].lat);var a=t.getCenter();a.lat=o,t.options.suppressToolbar||this.toolbar.setLatLng(a)}},hasMode:function(t){return!!this._modes[t]},getMode:function(){if(this.enabled())return this._mode},getModes:function(){return this._modes},isMode:function(t){return!!this.enabled()&&this._mode===t},setMode:function(t){var e=this._overlay,i=this.parentGroup;if(this.getMode()!==t&&this.hasMode(t)&&this.enabled())return this.toolbar&&this.toolbar.clickTool(t),this.isMode("lock")&&!this.dragging&&this._enableDragging(),this._mode=t,this.isMode("lock")&&this._disableDragging(),this._updateHandle(),this._refresh(),i&&i.isCollected(e)&&e.deselect(),this},nextMode:function(t){var e=this.getMode(),i=this.parentGroup,o=Object.keys(this.getModes()),n=o.indexOf(e),a=o[(n+1)%o.length];if(t){if(i&&i.anyCollected())return;L.DomEvent.stop(t)}return this.setMode(a)}}),L.distortableImage.edit=function(t,e){return new L.DistortableImage.Edit(t,e)}},426:function(){L.BorderAction=L.EditAction.extend({initialize:function(t,e,i){var o,n,a=e.editing,s=a._mode;a._outlined?(o="border_outer",n=e.options.translation.removeBorder):(o="border_clear",n=e.options.translation.addBorder),(i=i||{}).toolbarIcon={svg:!0,html:o,tooltip:n,className:"lock"===s?"disabled":""},L.DistortableImage.action_map.b="lock"===s?"":"_toggleBorder",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){var t=this._overlay.editing;L.IconUtil.toggleXlink(this._link,"border_clear","border_outer"),L.IconUtil.toggleTitle(this._link,"Remove Border","Add Border"),t._toggleBorder()}})},114:function(){L.DeleteAction=L.EditAction.extend({initialize:function(t,e,i){var o,n=e.editing;n instanceof L.DistortableImage.Edit?(o=e.options.translation.deleteImage,L.DistortableImage.action_map.Backspace="lock"===n._mode?"":"_removeOverlay"):(o=e.options.translation.deleteImages,L.DistortableImage.group_action_map.Backspace="lock"===n._mode?"":"_removeGroup"),(i=i||{}).toolbarIcon={svg:!0,html:"delete_forever",tooltip:o,className:"lock"===n._mode?"disabled":""},L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){var t=this._overlay.editing;t instanceof L.DistortableImage.Edit?t._removeOverlay():t._removeGroup()}})},231:function(){L.DistortAction=L.EditAction.extend({initialize:function(t,e,i){(i=i||{}).toolbarIcon={svg:!0,html:"distort",tooltip:e.options.translation.distortImage,className:"distort"},L.DistortableImage.action_map.d="_distortMode",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){this._overlay.editing._distortMode()}})},541:function(){L.DragAction=L.EditAction.extend({initialize:function(t,e,i){(i=i||{}).toolbarIcon={svg:!0,html:"drag",tooltip:e.options.translation.dragImage,className:"drag"},L.DistortableImage.action_map.D="_dragMode",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){this._overlay.editing._dragMode()}})},280:function(){L.DistortableImage=L.DistortableImage||{},L.distortableImage=L.DistortableImage,L.DistortableImage.action_map={},L.EditAction=L.Toolbar2.Action.extend({options:{toolbarIcon:{svg:!1,html:"",className:"",tooltip:""}},initialize:function(t,e,i){this._overlay=e,this._map=t,L.setOptions(this,i),L.Toolbar2.Action.prototype.initialize.call(this,i),this._injectIconSet()},_createIcon:function(t,e,i){var o=this,n=this.options.toolbarIcon,a=n.className,s=this._overlay.editing;this.toolbar=t,this._icon=L.DomUtil.create("li","",e),this._link=L.DomUtil.create("a","",this._icon),n.svg?this._link.innerHTML=L.IconUtil.create(n.html):this._link.innerHTML=n.html,this._link.setAttribute("href","#"),this._link.setAttribute("title",n.tooltip),this._link.setAttribute("role","button"),L.DomUtil.addClass(this._link,this.constructor.baseClass),a&&(L.DomUtil.addClass(this._link,a),"disabled"===a&&L.DomUtil.addClass(this._icon,a),a===s._mode?L.DomUtil.addClass(this._link,"selected-mode"):L.DomUtil.removeClass(this._link,"selected-mode")),L.DomEvent.on(this._link,"click",this.enable,this),L.DomEvent.on(this._overlay,"update",(function(){var t=o._link.innerHTML.match(/xlink:href="#restore"/);t&&1===t.length&&o._enableAction()})),this._addSubToolbar(t,this._icon,i)},_injectIconSet:function(){if(!document.querySelector("#iconset")){var t=document.createElement("div");t.id="iconset",t.setAttribute("hidden","hidden"),t.innerHTML=(new L.ToolbarIconSet).render(),document.querySelector(".leaflet-marker-pane").appendChild(t)}},_enableAction:function(){L.DomUtil.removeClass(this._link.parentElement,"disabled"),L.DomUtil.removeClass(this._link,"disabled")},_disableAction:function(){L.DomUtil.addClass(this._link.parentElement,"disabled"),L.DomUtil.addClass(this._link,"disabled")}}),L.editAction=function(t,e,i){return new L.EditAction(t,e,i)}},149:function(){L.ExportAction=L.EditAction.extend({initialize:function(t,e,i){var o,n=e.editing;this.isExporting=!1,this.mouseLeaveSkip=!0,this.isHooksExecuted=!1,n instanceof L.DistortableImage.Edit?(L.DistortableImage.action_map.e="_getExport",o=e.options.translation.exportImage):(L.DistortableImage.group_action_map.e="runExporter",o=e.options.translation.exportImages),(i=i||{}).toolbarIcon={svg:!0,html:"get_app",tooltip:o},L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){var t=this._overlay.editing;if(t instanceof L.DistortableImage.Edit)t._getExport();else if(!this.isHooksExecuted){this.isHooksExecuted=!0;var e=this._link.parentElement;this.mouseEnterHandler=this.handleMouseEnter.bind(this),this.mouseLeaveHandler=this.handleMouseLeave.bind(this),L.DomEvent.on(e,"click",(function(){if(this.isExporting){if(this.mouseLeaveSkip)return;this.resetState(),this.detachMouseEventListeners(e),t.cancelExport()}else this.isExporting=!0,this.renderExportIcon(),setTimeout(this.attachMouseEventListeners.bind(this,e),100),t.runExporter().then(function(){this.resetState(),this.detachMouseEventListeners(e)}.bind(this))}),this)}},resetState:function(){this.renderDownloadIcon(),this.isExporting=!1,this.mouseLeaveSkip=!0},attachMouseEventListeners:function(t){t.addEventListener("mouseenter",this.mouseEnterHandler),t.addEventListener("mouseleave",this.mouseLeaveHandler)},detachMouseEventListeners:function(t){t.removeEventListener("mouseenter",this.mouseEnterHandler),t.removeEventListener("mouseleave",this.mouseLeaveHandler)},handleMouseEnter:function(){this.renderCancelIcon()},handleMouseLeave:function(){this.mouseLeaveSkip?this.mouseLeaveSkip=!1:this.renderExportIcon()},renderDownloadIcon:function(){L.IconUtil.toggleXlink(this._link,"get_app","spinner"),L.IconUtil.toggleTitle(this._link,"Export Images","Loading..."),L.DomUtil.removeClass(this._link.firstChild,"loader")},renderExportIcon:function(){L.IconUtil.toggleXlink(this._link,"spinner"),L.IconUtil.toggleTitle(this._link,"Export Images","Loading..."),L.IconUtil.addClassToSvg(this._link,"loader")},renderCancelIcon:function(){L.IconUtil.toggleXlink(this._link,"cancel"),L.IconUtil.toggleTitle(this._link,"Cancel Export","Loading..."),L.DomUtil.removeClass(this._link.firstChild,"loader")}})},74:function(){L.FreeRotateAction=L.EditAction.extend({initialize:function(t,e,i){(i=i||{}).toolbarIcon={svg:!0,html:"crop_rotate",tooltip:e.options.translation.freeRotateImage,className:"freeRotate"},L.DistortableImage.action_map.f="_freeRotateMode",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){this._overlay.editing._freeRotateMode()}})},691:function(){L.GeolocateAction=L.EditAction.extend({initialize:function(t,e,i){var o=e.editing;(i=i||{}).toolbarIcon={svg:!0,html:"explore",tooltip:e.options.translation.geolocateImage,className:"lock"===o._mode?"disabled":""},L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){var t=this._overlay.getElement();EXIF.getData(t,L.EXIF(t))}})},105:function(){L.LockAction=L.EditAction.extend({initialize:function(t,e,i){var o,n,a=e.editing;a instanceof L.DistortableImage.Edit?(L.DistortableImage.action_map.u="_unlock",L.DistortableImage.action_map.l="_lock",n=e.options.translation.lockMode,o=a.isMode("lock")?"lock":"unlock"):(L.DistortableImage.group_action_map.l="_lockGroup",n=e.options.translation.lockImages,o="lock"),(i=i||{}).toolbarIcon={svg:!0,html:o,tooltip:n,className:"lock"},L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){var t=this._overlay.editing;t instanceof L.DistortableImage.Edit?t._toggleLockMode():t._lockGroup()}})},944:function(){L.OpacityAction=L.EditAction.extend({initialize:function(t,e,i){var o,n,a=e.editing,s=a._mode;a._transparent?(o="opacity_empty",n=e.options.translation.makeImageOpaque):(o="opacity",n=e.options.translation.makeImageTransparent),(i=i||{}).toolbarIcon={svg:!0,html:o,tooltip:n,className:"lock"===s?"disabled":""},L.DistortableImage.action_map.o="lock"===s?"":"_toggleOpacity",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){var t=this._overlay.editing,e=this._link;L.IconUtil.toggleXlink(e,"opacity","opacity_empty"),L.IconUtil.toggleTitle(e,"Make Image Transparent","Make Image Opaque"),t._toggleOpacity()}})},954:function(){L.RestoreAction=L.EditAction.extend({initialize:function(t,e,i){var o=L.Utils.getNestedVal(e,"editing","_mode"),n=e.edited;(i=i||{}).toolbarIcon={svg:!0,html:"restore",tooltip:e.options.translation.restoreImage,className:n&&"lock"!==o?"":"disabled"},L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){var t=this._overlay;L.DomEvent.on(t,{edit:this._enableAction,restore:this._disableAction},this),t.restore()}})},178:function(){L.RotateAction=L.EditAction.extend({initialize:function(t,e,i){(i=i||{}).toolbarIcon={svg:!0,html:"rotate",tooltip:e.options.translation.rotateImage,className:"rotate"},L.DistortableImage.action_map.r="_rotateMode",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){this._overlay.editing._rotateMode()}})},547:function(){L.ScaleAction=L.EditAction.extend({initialize:function(t,e,i){(i=i||{}).toolbarIcon={svg:!0,html:"scale",tooltip:e.options.translation.scaleImage,className:"scale"},L.DistortableImage.action_map.s="_scaleMode",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){this._overlay.editing._scaleMode()}})},886:function(){L.StackAction=L.EditAction.extend({initialize:function(t,e,i){var o,n,a=e.editing;a._toggledImage?(o="flip_to_back",n=e.options.translation.stackToFront):(o="flip_to_front",n=e.options.translation.stackToBack),(i=i||{}).toolbarIcon={svg:!0,html:o,tooltip:n,className:"lock"===a._mode?"disabled":""},L.DistortableImage.action_map.q="lock"===a._mode?"":"_stackUp",L.DistortableImage.action_map.a="lock"===a._mode?"":"_stackDown",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){var t=this._overlay.editing;L.IconUtil.toggleXlink(this._link,"flip_to_front","flip_to_back"),L.IconUtil.toggleTitle(this._link,"Stack to Front","Stack to Back"),t._toggleOrder()}})},129:function(){L.UnlockAction=L.EditAction.extend({initialize:function(t,e,i){(i=i||{}).toolbarIcon={svg:!0,html:"unlock",tooltip:e.options.translation.unlockImages},L.DistortableImage.group_action_map.u="_unlockGroup",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){this._overlay.editing._unlockGroup()}})},743:function(){L.EXIF=function(t){if(0!==Object.keys(EXIF.getAllTags(t)).length){console.log(EXIF.getAllTags(t));var e=EXIF.getAllTags(t);void 0!==e.GPSLatitude&&void 0!==e.GPSLongitude&&(e.GPSLatitude[0],e.GPSLatitude[1],e.GPSLatitude[2],e.GPSLongitude[0],e.GPSLongitude[1],e.GPSLongitude[2],e.GPSLatitudeRef,e.GPSLongitudeRef),"T"===e.GPSImgDirectionRef||"M"===e.GPSImgDirectionRef?(Math.PI,e.GPSImgDirection.numerator,e.GPSImgDirection.denominator):console.log("No compass data found"),console.log("Orientation:",e.Orientation),(6===e.Orientation||8===e.Orientation||3===e.Orientation)&&Math.PI,void 0!==e.GPSAltitude&&void 0!==e.GPSAltitudeRef&&void 0!==e.GPSAltitude&&void 0!==e.GPSAltitudeRef&&(e.GPSAltitude.numerator,e.GPSAltitude.denominator,e.GPSAltitudeRef)}else alert("EXIF initialized. Press again to view data in console.")}},92:function(){L.DistortHandle=L.EditHandle.extend({options:{TYPE:"distort",icon:L.icon({iconUrl:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAChSURBVO3BIU4DURgGwNkvL2B6AkQTLBqP4QCoSm7DDXoBLBZHDbfgICAIZjEV3YTn9uVHdMZZtcnCfI13bIzxg0emg6Nm6QVbYz3jylEsXRrvwommb49X67jFkz80fR9Mb1YxTzqiWBSLYlEsikWxKBbFolgUi2JRLIpFsSgWxaJY03fHHOu40dH07bAzWCx9Ge/TiWbpHgdsjPGNB2f/yS+7xRCyiiZPJQAAAABJRU5ErkJggg==",iconSize:[32,32],iconAnchor:[16,16]})},_onHandleDrag:function(){this._handled.setCorner(this._corner,this.getLatLng())},updateHandle:function(){this.setLatLng(this._handled.getCorner(this._corner))}}),L.distortHandle=function(t,e,i){return new L.DistortHandle(t,e,i)}},194:function(){L.DragHandle=L.EditHandle.extend({options:{TYPE:"drag",icon:L.icon({iconUrl:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAsVJREFUeNrMVztLXEEUvnNVFAVBAhY2aRKbTZEHJNpYabuNjSgYg/GxdsmPSJkUAa/ZdVEX8mgWYVutbHxAHkVskjQBuUUgBISVhCQk3wnfwMlk1rusN1wHPubOzJlzvjlz5sxc01Ma/hUEwQnwDIjqc7uvgv9YYO86qgIwCXQbdNTlQ8kcCBHgBch8TcloF6oJGr6phk6EQAkfdz3zvgDr9Mr7Fg1fptEZoM8jsmrokpfsiIFO4IIjuE2v1EDmR4LRdlR5Gh51hj8D34ABtm8YTtqna0TgklIw5CgQguKxIojEjmFROg/MKQO27NkFAB+4wAPouGUJiIvWKHwbAxX2XyWRKWkqhT+pbJntJZJuUzISW0+5hW+obxrVBsfvoH/dqCCJuU97GBh2VteLSiYvArmErT8EVoAK9Bw7enbpVYmvAQlyowYforrH5jXL2rPHI/TKONDB7u9AlavdaTBPvPmazUeQuy8f7UomUgTEwIJPEQ3sQGE/6ll2l9H/KcEzBcfWn2IclluM3DpddJxSHujlFkscbUPvmB0LHVnLrId7nlaZVkEc6QGXQI1MAwZcWmVRHeNaQwJMMiU2cwy4s7p/RJ2ckpvIQs+cIs+5GzitloLKHUV3MPREuXbTOKO91dX387gGTONxIgEWm+E61FFrpcyqXLHsEwiDjEsjAksqw5XPoL9MHVrn6QR4q+XZrDaR4RoWzq2ymafuRA/Mq1stSsHLVkcbdf9VjOcx8ZH3+SFWcCWlVPyWuUBOwUWdC1wP5NVjYiXFWLO69PZ6CRTUY6KSIoEKdf6T3IzzgHxnsyHctNBEkmn6Oob8ExUDg/ahGybd177cDjzH5xHwgDiSvoS7I/LZyvxJZj0wod7tkX5G0XVC7rEyLhfLJjBGbKoLLEfZWObyKeZ6oY82g+yf5Zn/mJyHX7PMf04z/T3/LcAAu4E6iiyJqf0AAAAASUVORK5CYII=",iconSize:[32,32],iconAnchor:[16,16]})},_onHandleDrag:function(){var t=this._handled,e=t.getCorner(this._corner),i=this.getLatLng();t.dragBy(e,i)},updateHandle:function(){this.setLatLng(this._handled.getCorner(this._corner))}}),L.dragHandle=function(t,e,i){return new L.DragHandle(t,e,i)}},988:function(){L.EditHandle=L.Marker.extend({initialize:function(t,e,i){var o=t.getCorner(e);L.setOptions(this,i),this._handled=t,this._corner=e;var n={draggable:!0,zIndexOffset:10};i&&i.hasOwnProperty("draggable")&&(n.draggable=i.draggable),L.Marker.prototype.initialize.call(this,o,n)},onAdd:function(t){L.Marker.prototype.onAdd.call(this,t),this._bindListeners(),this.updateHandle()},onRemove:function(t){this._unbindListeners(),L.Marker.prototype.onRemove.call(this,t)},_onHandleDragStart:function(){this._handled.fire("editstart")},_onHandleDragEnd:function(){this._fireEdit()},_fireEdit:function(){this._handled.edited=!0,this._handled.fire("edit")},_bindListeners:function(){this.on({contextmenu:L.DomEvent.stop,dragstart:this._onHandleDragStart,drag:this._onHandleDrag,dragend:this._onHandleDragEnd},this),this._handled._map.on("zoomend",this.updateHandle,this),this._handled.on("update",this.updateHandle,this)},_unbindListeners:function(){this.off({contextmenu:L.DomEvent.stop,dragstart:this._onHandleDragStart,drag:this._onHandleDrag,dragend:this._onHandleDragEnd},this),this._handled._map.off("zoomend",this.updateHandle,this),this._handled.off("update",this.updateHandle,this)},_calculateScalingFactor:function(t,e){var i=this._handled,o=i._map,n=o.latLngToLayerPoint(i.getCenter()),a=o.latLngToLayerPoint(t),s=o.latLngToLayerPoint(e),r=this._d2(n,a),l=this._d2(n,s);return Math.sqrt(l/r)},_d2:function(t,e){var i=t.x-e.x,o=t.y-e.y;return Math.pow(i,2)+Math.pow(o,2)},calculateAngleDelta:function(t,e){var i=this._handled,o=i._map,n=o.latLngToLayerPoint(i.getCenter()),a=o.latLngToLayerPoint(t),s=o.latLngToLayerPoint(e),r=Math.atan2(n.y-a.y,n.x-a.x);return Math.atan2(n.y-s.y,n.x-s.x)-r}})},206:function(){L.FreeRotateHandle=L.EditHandle.extend({options:{TYPE:"freeRotate",icon:L.icon({iconUrl:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAHiSURBVMXBa3HbShgA0PMp/1sCCo8oCEpgTaCXgIXAJiDzyCJoAUTm4UVQAns1Y8+snWnTvJyeE16hkjDgDrfoNTMKcpC9UPiLSo8JyetkjEHxjPCMyoS199kFoz8Iv1HpMaN3qWDCHoegOKkkRwnJpRmroHgiPFEZ8IBekzEGxQtUEhKSS/fB7Ew4U+lxcGkVZG9QWWPSFAxBcdK59KApuA+yNwp2uEdx1GN25sZJZULSfAtm77SlbNjju6MvG75u+WHRWVR6rDVjMPsgwYyVZl3pLTpHkyYHOx8syMiayaJzlDTZ9YyaZNFVkiYH2ZUEBcVJJXVImuz6Js3Qofe59pq7DoOTILu+g+a288mCouk7/1iH4qTS+2QdDppbV1ZJmrnDXnPnc5UOs2Z0fUmTuyBr+krvSioJyUmQO0dZM7mepMkWnaNRkyrJB6uskTSjxY3Fll8bvmJwlDb83FJ8gMqAB80uyBY3Trb82PAfvjj6vuHnluIdKgMeNXOwctK5NKBoHitrb1RJeHRp5Ux4ojLg0aWMHGQvUOkxIWkKVsHsTPiNSo8HDC5lZIsgO6n0uMUdRvQuFQxB8UR4RmXC2vvsgtEfhL+o9JiQvE7GGBTPCK9QSUjoMWgKDthjDrIX+h/k0I7gth6N5gAAAABJRU5ErkJggg==",iconSize:[32,32],iconAnchor:[16,16]})},_onHandleDrag:function(){var t=this._handled,e=t._map,i=t.getCorner(this._corner),o=this.getLatLng(),n=this.calculateAngleDelta(i,o),a=this._calculateScalingFactor(i,o);0!==n&&t.rotateBy(n,"rad");var s=t.edgeMinWidth;s||(s=50);var r=e.latLngToContainerPoint(t.getCorner(0)),l=e.latLngToContainerPoint(t.getCorner(1)),c=Math.abs(r.x-l.x),d=Math.abs(r.y-l.y);Math.sqrt(c*c+d*d)>s||a>1?t.scaleBy(a):t.scaleBy(1)},updateHandle:function(){this.setLatLng(this._handled.getCorner(this._corner))}}),L.freeRotateHandle=function(t,e,i){return new L.FreeRotateHandle(t,e,i)}},789:function(){L.LockHandle=L.EditHandle.extend({options:{TYPE:"lock",interactive:!1,icon:L.icon({iconUrl:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAD8SURBVO3BPU7CYAAA0AdfjIcQlRCQBG7C3gk2uIPG2RC3Dk16Gz0FTO1WZs/gwGCMP/2+xsSl7+n1er1Iz9LtRQjaPeMeO+TinLDCJV78YqjdA04YodKuxhUaPGoRxMmxwRQZSt87Yo4KExGCeAUyLLFB4bMacxywEClIU2KDKXbInTUYo8JCgoFuGoxQO5uiwY1EA91VmDqrcKeDoX8WdNNgjApvmGGLXKIgXY0xGkxQYItrrFFIEKQ5Yo4KEx9yrDFDhlKkIF6NOQ5Y+KpAhiXWKEQI4pxwiwoLPyuxwQw75FoE7fZYocFEuwI7jHCBV39gL92TXq/Xi/AOcmczZmaIMScAAAAASUVORK5CYII=",iconSize:[32,32],iconAnchor:[16,16]})},onRemove:function(t){this.unbindTooltip(),L.EditHandle.prototype.onRemove.call(this,t)},_bindListeners:function(){var t=this.getElement();L.EditHandle.prototype._bindListeners.call(this),L.DomEvent.on(t,{mousedown:this._tooltipOn,mouseup:this._tooltipOff},this),L.DomEvent.on(document,"pointerleave",this._tooltipOff,this)},_unbindListeners:function(){var t=this.getElement();L.EditHandle.prototype._bindListeners.call(this),L.DomEvent.off(t,{mousedown:this._tooltipOn,mouseup:this._tooltipOff},this),L.DomEvent.off(document,"pointerleave",this._tooltipOff,this)},_onHandleDrag:function(){},updateHandle:function(){this.setLatLng(this._handled.getCorner(this._corner))},_tooltipOn:function(t){var e=this._handled.parentGroup,i=e?e.editing:this._handled.editing;if(!t.shiftKey&&(this._handled.isSelected()||!e||e.isCollected(this._handled))){var o=i._lockHandles;this._timer=setTimeout(L.bind((function(){this._timeout&&clearTimeout(this._timeout),this.getTooltip()?o.eachLayer((function(t){this!==t&&t.closeTooltip()})):this.bindTooltip("Locked!",{permanent:!0}),this.openTooltip()}),this),500)}},_tooltipOff:function(t){var e=this._handled.parentGroup,i=e?e.editing:this._handled.editing;if(!t.shiftKey&&(this._handled.isSelected()||!e||e.isCollected(this._handled))){var o=i._lockHandles;t.currentTarget===document&&o.eachLayer((function(t){t.closeTooltip()})),this._timer&&clearTimeout(this._timer),this._timeout=setTimeout(L.bind((function(){this.closeTooltip()}),this),400)}}}),L.lockHandle=function(t,e,i){return new L.LockHandle(t,e,i)}},337:function(){L.RotateHandle=L.EditHandle.extend({options:{TYPE:"rotate",icon:L.icon({iconUrl:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAHiSURBVMXBa3HbShgA0PMp/1sCCo8oCEpgTaCXgIXAJiDzyCJoAUTm4UVQAns1Y8+snWnTvJyeE16hkjDgDrfoNTMKcpC9UPiLSo8JyetkjEHxjPCMyoS199kFoz8Iv1HpMaN3qWDCHoegOKkkRwnJpRmroHgiPFEZ8IBekzEGxQtUEhKSS/fB7Ew4U+lxcGkVZG9QWWPSFAxBcdK59KApuA+yNwp2uEdx1GN25sZJZULSfAtm77SlbNjju6MvG75u+WHRWVR6rDVjMPsgwYyVZl3pLTpHkyYHOx8syMiayaJzlDTZ9YyaZNFVkiYH2ZUEBcVJJXVImuz6Js3Qofe59pq7DoOTILu+g+a288mCouk7/1iH4qTS+2QdDppbV1ZJmrnDXnPnc5UOs2Z0fUmTuyBr+krvSioJyUmQO0dZM7mepMkWnaNRkyrJB6uskTSjxY3Fll8bvmJwlDb83FJ8gMqAB80uyBY3Trb82PAfvjj6vuHnluIdKgMeNXOwctK5NKBoHitrb1RJeHRp5Ux4ojLg0aWMHGQvUOkxIWkKVsHsTPiNSo8HDC5lZIsgO6n0uMUdRvQuFQxB8UR4RmXC2vvsgtEfhL+o9JiQvE7GGBTPCK9QSUjoMWgKDthjDrIX+h/k0I7gth6N5gAAAABJRU5ErkJggg==",iconSize:[32,32],iconAnchor:[16,16]})},_onHandleDrag:function(){var t=this._handled,e=t.getCorner(this._corner),i=this.getLatLng(),o=this.calculateAngleDelta(e,i);t.rotateBy(o,"rad")},updateHandle:function(){this.setLatLng(this._handled.getCorner(this._corner))}}),L.rotateHandle=function(t,e,i){return new L.RotateHandle(t,e,i)}},350:function(){L.ScaleHandle=L.EditHandle.extend({options:{TYPE:"scale",icon:L.icon({iconUrl:"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2ZXJzaW9uPSIxLjEiIHdpZHRoPSI0NTkiIGhlaWdodD0iNDY0IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCA1MTIgNTEyIiB4bWw6c3BhY2U9InByZXNlcnZlIiBzdHlsZT0iIj48cmVjdCBpZD0iYmFja2dyb3VuZHJlY3QiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIHg9IjAiIHk9IjAiIGZpbGw9Im5vbmUiIHN0cm9rZT0ibm9uZSIgY2xhc3M9IiIgc3R5bGU9IiIvPjxnIGNsYXNzPSJjdXJyZW50TGF5ZXIiIHN0eWxlPSIiPjx0aXRsZT5MYXllciAxPC90aXRsZT48cGF0aCBkPSJNNDU5LjA0OTE1OTUzMDQ3MTM0LDg2LjkyNjIzNDUxMjU1MDAyIFYwIGgtODUuNzE0NTczMzU2MzEyMDkgdjI3LjA0MzcxNzQwMzkwNDQ1MiBIODUuNzE0NTczMzU2MzEyMDMgVjAgSDAgdjg2LjkyNjIzNDUxMjU1MDAyIGgyNS43MTQzNzIwMDY4OTM2MjYgdjI4OS43NTQxMTUwNDE4MzM0IEgwIHY4Ni45MjYyMzQ1MTI1NTAwMiBoODUuNzE0NTczMzU2MzEyMDkgdi0yNy4wNDM3MTc0MDM5MDQ0NTIgaDI4NS43MTUyNDQ1MjEwNDAzIHYyNy4wNDM3MTc0MDM5MDQ0NTIgaDg1LjcxNDU3MzM1NjMxMjA5IHYtODYuOTI2MjM0NTEyNTUwMDIgaC0yMy44MDk2MDM3MTAwODY2OSBWODYuOTI2MjM0NTEyNTUwMDIgSDQ1OS4wNDkxNTk1MzA0NzEzNCB6TTM4NC43NjMxOTU5NTUwMDA5LDEyLjU1NjAxMTY1MTgxMjc4MSBoNjEuOTA0OTY5NjQ2MjI1Mzk2IHY2Mi43ODAwNTgyNTkwNjM5MSBoLTYxLjkwNDk2OTY0NjIyNTM5NiBWMTIuNTU2MDExNjUxODEyNzgxIHpNMTIuMzgwOTkzOTI5MjQ1MDUsMTIuNTU2MDExNjUxODEyNzgxIGg2MS45MDQ5Njk2NDYyMjUzOTYgdjYyLjc4MDA1ODI1OTA2MzkxIEgxMi4zODA5OTM5MjkyNDUwNSBWMTIuNTU2MDExNjUxODEyNzgxIHpNNzQuMjg1OTYzNTc1NDcwNTMsNDUxLjA1MDU3MjQxNTEyMDY2IEgxMi4zODA5OTM5MjkyNDUwNSB2LTYyLjc4MDA1ODI1OTA2MzkxIGg2MS45MDQ5Njk2NDYyMjUzOTYgVjQ1MS4wNTA1NzI0MTUxMjA2NiB6TTQ0NS43MTU3ODE0NTI4MjI3NCw0NTEuMDUwNTcyNDE1MTIwNjYgaC02Mi44NTczNTM3OTQ2Mjg4NjQgdi02Mi43ODAwNTgyNTkwNjM5MSBoNjIuODU3MzUzNzk0NjI4ODY0IFY0NTEuMDUwNTcyNDE1MTIwNjYgek00MDcuNjIwNDE1NTE2Njg0MjYsMzc2LjY4MDM0OTU1NDM4MzQ0IGgtMzYuMTkwNTk3NjM5MzMxNzcgdjMyLjgzODc5OTcwNDc0MTEyIEg4NS43MTQ1NzMzNTYzMTIwMyB2LTMyLjgzODc5OTcwNDc0MTEyIEg0OS41MjM5NzU3MTY5ODAzMiBWODYuOTI2MjM0NTEyNTUwMDIgaDM2LjE5MDU5NzYzOTMzMTc3IFY1MC4yMjQwNDY2MDcyNTExMjUgaDI4Ny42MjAwMTI4MTc4NDcyIHYzNi43MDIxODc5MDUyOTg5IGgzNC4yODU4MjkzNDI1MjQ4MzUgVjM3Ni42ODAzNDk1NTQzODM0NCB6IiBpZD0ic3ZnXzIiIGNsYXNzPSIiIGZpbGw9IiMxYTFhZWIiIGZpbGwtb3BhY2l0eT0iMSIvPjwvZz48L3N2Zz4=",iconSize:[32,32],iconAnchor:[16,16]})},_onHandleDrag:function(){var t=this._handled,e=t._map,i=t.edgeMinWidth,o=t.getCorner(this._corner),n=this.getLatLng(),a=this._calculateScalingFactor(o,n);i||(i=50);var s=e.latLngToLayerPoint(t.getCorner(0)),r=e.latLngToLayerPoint(t.getCorner(1)),l=Math.abs(s.x-r.x),c=Math.abs(s.y-r.y);Math.sqrt(l*l+c*c)>i||a>1?t.scaleBy(a):t.scaleBy(1)},updateHandle:function(){this.setLatLng(this._handled.getCorner(this._corner))}}),L.scaleHandle=function(t,e,i){return new L.ScaleHandle(t,e,i)}},719:function(){L.distortableImage=L.DistortableImage||{},L.distortableImage=L.DistortableImage,L.DistortableImage.group_action_map={},L.DistortableImage.ControlBar=L.Toolbar2.Control.extend({}),L.distortableImage.controlBar=function(t){return new L.DistortableImage.ControlBar(t)},L.DistortableCollection.addInitHook((function(){this.ACTIONS=[L.ExportAction,L.DeleteAction,L.LockAction,L.UnlockAction],L.DistortableCollection.Edit.MODES={lock:L.LockAction,unlock:L.UnlockAction};var t=this.options.actions?this.options.actions:this.ACTIONS;this.editing=L.distortableCollection.edit(this,{actions:t})}))},93:function(){L.DistortableImage=L.DistortableImage||{},L.distortableImage=L.DistortableImage,L.DistortableImage.action_map={},L.DistortableImage.PopupBar=L.Toolbar2.Popup.extend({options:{anchor:[0,-10]},initialize:function(t,e){L.setOptions(this,e),L.Toolbar2.Popup.prototype.initialize.call(this,t,e)},addHooks:function(t,e){this.map=t,this.ov=e},tools:function(){if(this._ul)return this._ul.children},clickTool:function(t){for(var e=this.tools(),i=0;i',_symbols:"",render:function(){return this.addSymbols(this._symbols),this._svg},addSymbols:function(t){this._svg+=t}})},261:function(){L.KeymapperIconSet=L.IconSet.extend({_symbols:''})},929:function(){L.ToolbarIconSet=L.IconSet.extend({_symbols:''})},496:function(){L.Map.mergeOptions({boxCollector:!0,boxZoom:!1}),L.Map.BoxCollector=L.Map.BoxZoom.extend({initialize:function(t){this._map=t,this._container=t._container,this._pane=t._panes.overlayPane,this._resetStateTimeout=0,t.on("unload",this._destroy,this)},addHooks:function(){L.DomEvent.on(this._container,"mousedown",this._onMouseDown,this)},removeHooks:function(){L.DomEvent.off(this._container,"mousedown",this._onMouseDown,this)},moved:function(){return this._moved},_destroy:function(){L.DomUtil.remove(this._pane),delete this._pane},_resetState:function(){this._resetStateTimeout=0,this._moved=!1},_clearDeferredResetState:function(){0!==this._resetStateTimeout&&(clearTimeout(this._resetStateTimeout),this._resetStateTimeout=0)},_onMouseDown:function(t){if(!t.shiftKey||1!==t.which&&1!==t.button)return!1;this._clearDeferredResetState(),this._resetState(),L.DomUtil.disableTextSelection(),L.DomUtil.disableImageDrag(),this._startPoint=this._map.mouseEventToContainerPoint(t),L.DomEvent.on(document,{contextmenu:L.DomEvent.stop,mousemove:this._onMouseMove,mouseup:this._onMouseUp},this)},_onMouseMove:function(t){this._moved||(this._moved=!0,this._box=L.DomUtil.create("div","leaflet-zoom-box",this._container),L.DomUtil.addClass(this._container,"leaflet-crosshair"),this._map.fire("boxzoomstart")),this._point=this._map.mouseEventToContainerPoint(t),this._bounds=L.bounds(this._startPoint,this._point);var e=this._bounds.getSize();L.DomUtil.setPosition(this._box,this._bounds.min),this._box.style.width=e.x+"px",this._box.style.height=e.y+"px"},_finish:function(){this._moved&&(L.DomUtil.remove(this._box),L.DomUtil.removeClass(this._container,"leaflet-crosshair")),L.DomUtil.enableTextSelection(),L.DomUtil.enableImageDrag(),L.DomEvent.off(document,{contextmenu:L.DomEvent.stop,mousemove:this._onMouseMove,mouseup:this._onMouseUp},this)},_onMouseUp:function(t){if((1===t.which||1===t.button)&&(this._finish(),this._moved)){this._clearDeferredResetState(),this._resetStateTimeout=setTimeout(L.Util.bind(this._resetState,this),0);var e=L.latLngBounds(this._map.containerPointToLatLng(this._bounds.getBottomLeft()),this._map.containerPointToLatLng(this._bounds.getTopRight())),i=this._map.getZoom(),o=this._map.getCenter();e=this._map._latLngBoundsToNewLayerBounds(e,i,o),this._map.fire("boxcollectend",{boxCollectBounds:e})}}}),L.Map.addInitHook("addHandler","boxCollector",L.Map.BoxCollector)},291:function(){L.Map.mergeOptions({doubleClickLabels:!0}),L.Map.DoubleClickLabels=L.Map.DoubleClickZoom.extend({enable:function(){var t=this._map;return this._enabled||(t.doubleClickZoom.enabled()&&t.doubleClickZoom.disable(),this._map.fire("singleclickon"),this._enabled=!0,this.addHooks()),this},disable:function(){return this._enabled?(this._enabled=!1,this.removeHooks(),this):this},_fireIfSingle:function(t){var e=this._map,i=t.originalEvent;i&&i.shiftKey||(e._clicked+=1,this._map._clickTimeout=setTimeout((function(){1===e._clicked?(e._clicked=0,e.fire("singleclick",{type:"singleclick"})):L.Browser.touch&&i&&i.sourceCapabilities.firesTouchEvents&&e.fire("dblclick")}),250))},_onDoubleClick:function(){var t=this._map,e=t._labels;setTimeout((function(){t._clicked=0,clearTimeout(t._clickTimeout)}),0),e&&(1===e.options.opacity?(e.options.opacity=0,e.setOpacity(0)):(e.options.opacity=1,e.setOpacity(1)))}}),L.Map.addInitHook("addHandler","doubleClickLabels",L.Map.DoubleClickLabels)},752:function(){L.Map.DoubleClickZoom.include({addHooks:function(){this._map.on({click:this._fireIfSingle,dblclick:this._onDoubleClick},this)},removeHooks:function(){this._map.off({click:this._fireIfSingle,dblclick:this._onDoubleClick},this)},enable:function(){return this._enabled||this._map.doubleClickLabels&&this._map.doubleClickLabels.enabled()||(this._map.fire("singleclickon"),this._enabled=!0,this.addHooks()),this},disable:function(){return this._enabled?(this._map.fire("singleclickoff"),this._enabled=!1,this.removeHooks(),this):this},_fireIfSingle:function(t){var e=this._map,i=t.originalEvent;i&&i.shiftKey||(e._clicked+=1,this._map._clickTimeout=setTimeout((function(){1===e._clicked?(e._clicked=0,e.fire("singleclick",{type:"singleclick"})):L.Browser.touch&&i&&i.sourceCapabilities.firesTouchEvents&&e._fireDOMEvent(i,"dblclick",[e])}),250))},_onDoubleClick:function(t){var e=this._map,i=t.originalEvent;if(setTimeout((function(){e._clicked=0,clearTimeout(e._clickTimeout)}),0),!i)return!1;var o=e.getZoom(),n=e.options.zoomDelta,a=i.shiftKey?o-n:o+n;"center"===e.options.doubleClickZoom?e.setZoom(a):e.setZoomAround(t.containerPoint,a)}})},131:function(){L.Map.include({_clicked:0,addGoogleMutant:function(t){return(t=this.mutantOptions=L.extend({mutantOpacity:.8,maxZoom:24,maxNativeZoom:20,minZoom:0,labels:!0,labelOpacity:1,doubleClickLabels:!0},t)).labels||(this.mutantOptions=L.extend(this.mutantOptions,{labelOpacity:t.labels?1:void 0,doubleClickLabels:!!t.labels||void 0})),this._googleMutant=L.tileLayer("http://mt0.google.com/vt/lyrs=s&x={x}&y={y}&z={z}",{maxZoom:t.maxZoom,maxNativeZoom:t.maxNativeZoom,minZoom:t.minZoom,opacity:t.mutantOpacity}).addTo(this),t.labels?this._addLabels(t):this.doubleClickLabels=void 0,this},_addLabels:function(t){return 0!==t.labelOpacity&&1!==t.labelOpacity&&(t.labelOpacity=1),this._labels=L.tileLayer("https://stamen-tiles-{s}.a.ssl.fastly.net/toner-labels/{z}/{x}/{y}{r}.{ext}",{attribution:'Map tiles by Stamen Design, CC BY 3.0 — Map data © OpenStreetMap contributors',subdomains:"abcd",interactive:!1,opacity:t.labelOpacity,maxZoom:t.maxZoom,maxNativeZoom:t.maxNativeZoom,minZoom:t.minZoom,ext:"png"}).addTo(this),this.mutantOptions.doubleClickLabels&&this.doubleClickLabels.enable(),this}}),L.Map.addInitHook((function(){this.doubleClickLabels.disable(),this.doubleClickZoom.enable()}))},999:function(){L.DomUtil=L.extend(L.DomUtil,{initTranslation:function(t){this.translation=t},getMatrixString:function(t){var e=L.Browser.webkit3d||L.Browser.gecko3d||L.Browser.ie3d,i=[t[0],t[3],0,t[6],t[1],t[4],0,t[7],0,0,1,0,t[2],t[5],0,t[8]],o=e?"matrix3d("+i.join(",")+")":"";return e||console.log("Your browser must support 3D CSS transformsin order to use DistortableImageOverlay."),o},toggleClass:function(t,e){var i=e;return this.hasClass(t,i)?this.removeClass(t,i):this.addClass(t,i)},confirmDelete:function(){return window.confirm(this.translation.confirmImageDelete)},confirmDeletes:function(t){if(1===t)return this.confirmDelete();var e,i=this.translation.confirmImagesDeletes;return e="function"==typeof i?i(t):i,window.confirm(e)}})},85:function(){L.IconUtil={create:function(t){return/^#/.test(t)&&(t=t.replace(/^#/,"")),''},addClassToSvg:function(t,e){var i=t.querySelector("svg");i&&L.DomUtil.addClass(i,e)},toggleXlink:function(t,e,i){/^#/.test(e)||(e="#"+e),/^#/.test(i)||(i="#"+i);var o=t.querySelector("use");if(o){var n=o.getAttribute("xlink:href")===e?i:e;return o.setAttribute("xlink:href",n),n}return!1},toggleTitle:function(t,e,i){var o=t.getAttribute("title")===e?i:e;return t.setAttribute("title",o),t.hasAttribute("aria-label")&&t.setAttribute("aria-label",o),o}}},351:function(){L.ImageUtil={getCmPerPixel:function(t){var e=t._map;return 100*e.latLngToLayerPoint(t.getCorner(0)).distanceTo(e.latLngToLayerPoint(t.getCorner(1)))/t.getElement().width}}},360:function(){L.MatrixUtil={adj:function(t){return[t[4]*t[8]-t[5]*t[7],t[2]*t[7]-t[1]*t[8],t[1]*t[5]-t[2]*t[4],t[5]*t[6]-t[3]*t[8],t[0]*t[8]-t[2]*t[6],t[2]*t[3]-t[0]*t[5],t[3]*t[7]-t[4]*t[6],t[1]*t[6]-t[0]*t[7],t[0]*t[4]-t[1]*t[3]]},multmm:function(t,e){var i,o=[];for(i=0;i<3;i++)for(var n=0;n<3;n++){for(var a=0,s=0;s<3;s++)a+=t[3*i+s]*e[3*s+n];o[3*i+n]=a}return o},multmv:function(t,e){return[t[0]*e[0]+t[1]*e[1]+t[2]*e[2],t[3]*e[0]+t[4]*e[1]+t[5]*e[2],t[6]*e[0]+t[7]*e[1]+t[8]*e[2]]},multsm:function(t,e){for(var i=[],o=0,n=e.length;o2&&void 0!==arguments[2]?arguments[2]:"deg";return"deg"===i?this.radiansToDegrees(Math.atan2(e,t)):Math.atan2(e,t)},radiansToDegrees:function(t){return 180*t/Math.PI},degreesToRadians:function(t){return t*Math.PI/180}}},866:function(){L.Utils={initTranslation:function(){var t={deleteImage:"Delete Image",deleteImages:"Delete Images",distortImage:"Distort Image",dragImage:"Drag Image",exportImage:"Export Image",exportImages:"Export Images",removeBorder:"Remove Border",addBorder:"Add Border",freeRotateImage:"Free rotate Image",geolocateImage:"Geolocate Image",lockMode:"Lock Mode",lockImages:"Lock Images",makeImageOpaque:"Make Image Opaque",makeImageTransparent:"Make Image Transparent",restoreImage:"Restore Natural Image",rotateImage:"Rotate Image",scaleImage:"Scale Image",stackToFront:"Stack to Front",stackToBack:"Stack to Back",unlockImages:"Unlock Images",confirmImageDelete:"Are you sure? This image will be permanently deleted from the map.",confirmImagesDeletes:"Are you sure? These images will be permanently deleted from the map."};if(this.options.translation)for(var e in t)this.options.translation.hasOwnProperty(e)||(this.options.translation[e]=t[e]);else this.options.translation=t;L.DomUtil.initTranslation(this.options.translation)},getNestedVal:function(t,e,i){return[e,i].reduce((function(t,e){return t&&t[e]}),t)}}}};t[999](),t[85](),t[351](),t[360](),t[682](),t[866](),t[477](),t[808](),t[743](),t[988](),t[92](),t[194](),t[206](),t[789](),t[337](),t[350](),t[376](),t[261](),t[929](),t[280](),t[426](),t[114](),t[231](),t[541](),t[149](),t[74](),t[691](),t[105](),t[944](),t[954](),t[178](),t[547](),t[886](),t[129](),t[93](),t[719](),t[397](),t[428](),t[782](),t[752](),t[496](),t[291](),t[131]()}(); //# sourceMappingURL=leaflet.distortableimage.js.map \ No newline at end of file diff --git a/examples/js/export.js b/examples/js/export.js index 6ebd66225..4891e3983 100644 --- a/examples/js/export.js +++ b/examples/js/export.js @@ -13,7 +13,6 @@ let map; L.latLng(51.50, -0.10), ], mode: 'lock', - tooltipText: 'Aerial map of NY', }); // create a second image @@ -26,7 +25,6 @@ let map; ], mode: 'freeRotate', suppressToolbar: true, - tooltipText: 'Aerial map of NY', }); let json = [{'nodes': [ diff --git a/examples/js/index.js b/examples/js/index.js index 182894360..bfea75aec 100644 --- a/examples/js/index.js +++ b/examples/js/index.js @@ -8,7 +8,6 @@ let map; img = L.distortableImageOverlay('example.jpg', { selected: true, fullResolutionSrc: 'large.jpg', - tooltipText: 'Aerial map of NY', // is it actually New York?? ...hardcoded into place since it's for example purposes only }).addTo(map); }); })(); diff --git a/examples/js/listeners.js b/examples/js/listeners.js index c14c037fd..39a96829e 100644 --- a/examples/js/listeners.js +++ b/examples/js/listeners.js @@ -7,7 +7,6 @@ let map; map.whenReady(function() { img = L.distortableImageOverlay('example.jpg', { selected: true, - tooltipText: 'Aerial map of NY', }).addTo(map); // Wait until image is loaded before setting up DOM element listeners diff --git a/examples/js/local.js b/examples/js/local.js index bd3af73d1..1d3144792 100644 --- a/examples/js/local.js +++ b/examples/js/local.js @@ -39,7 +39,6 @@ const loadMap = (image) => { img = L.distortableImageOverlay(image, { selected: true, fullResolutionSrc: 'large.jpg', - tooltipText: 'Aerial map of NY', }).addTo(map); }); }; diff --git a/examples/js/select.js b/examples/js/select.js index f4eccd6f7..9b2639d1d 100644 --- a/examples/js/select.js +++ b/examples/js/select.js @@ -13,7 +13,6 @@ let map; L.latLng(51.50, -0.10), ], mode: 'lock', - tooltipText: 'Aerial map of NY', }); // create a second image @@ -26,7 +25,6 @@ let map; ], mode: 'freeRotate', suppressToolbar: true, - tooltipText: 'Aerial map of NY', }); img3 = L.distortableImageOverlay('example.jpg', { @@ -44,7 +42,6 @@ let map; L.DeleteAction, L.StackAction, ], - tooltipText: 'Aerial map of NY', }); img4 = L.distortableImageOverlay('example.jpg', { @@ -64,7 +61,6 @@ let map; L.latLng(51.49, -0.08), L.latLng(51.49, -0.04), ], - tooltipText: 'Aerial map of NY', }); imgGroup = L.distortableCollection().addTo(map); diff --git a/src/DistortableCollection.js b/src/DistortableCollection.js index 7808fb850..b536b84ca 100644 --- a/src/DistortableCollection.js +++ b/src/DistortableCollection.js @@ -2,6 +2,7 @@ const arr = []; L.DistortableCollection = L.FeatureGroup.extend({ options: { editable: true, + tooltipControl: document.createElement('button'), exportOpts: { exportStartUrl: '//export.mapknitter.org/export', statusUrl: '//export.mapknitter.org', @@ -15,8 +16,7 @@ L.DistortableCollection = L.FeatureGroup.extend({ L.Utils.initTranslation.call(this); this.editable = this.options.editable; - this.tooltipControl = options.tooltipControl; - console.log('optionTest: tested'); // - delete + this.tooltipControl = this.options.tooltipControl; }, onAdd(map) { diff --git a/src/DistortableImageOverlay.js b/src/DistortableImageOverlay.js index 7d7281467..dcc7fb3be 100644 --- a/src/DistortableImageOverlay.js +++ b/src/DistortableImageOverlay.js @@ -25,7 +25,7 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ this.interactive = this.options.interactive; this.tooltipText = options.tooltipText; - this.tooltipOpen = false; + this.tooltipOpen = options.tooltipOpen; }, onAdd(map) { From 7b006044ca6b6b612b4894d6cee24c1d609cb9c3 Mon Sep 17 00:00:00 2001 From: segun Date: Thu, 12 Jan 2023 12:33:06 +0100 Subject: [PATCH 36/57] update --- dist/leaflet.distortableimage.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/leaflet.distortableimage.js b/dist/leaflet.distortableimage.js index 987221e63..86cd451b3 100644 --- a/dist/leaflet.distortableimage.js +++ b/dist/leaflet.distortableimage.js @@ -7318,7 +7318,7 @@ module.exports.formatError = function (err) { /******/ /******/ /* webpack/runtime/getFullHash */ /******/ !function() { -/******/ __webpack_require__.h = function() { return "f4bb84ad97d91af87325"; } +/******/ __webpack_require__.h = function() { return "805ac63fe182507481d6"; } /******/ }(); /******/ /******/ /* webpack/runtime/hasOwnProperty shorthand */ From a0cc2d1c9951db743e24882ed4c1a37024c80a0d Mon Sep 17 00:00:00 2001 From: segun Date: Thu, 12 Jan 2023 13:29:40 +0100 Subject: [PATCH 37/57] hotfix --- examples/js/archive.js | 1 - 1 file changed, 1 deletion(-) diff --git a/examples/js/archive.js b/examples/js/archive.js index bef2199bd..fa5fcdf5c 100644 --- a/examples/js/archive.js +++ b/examples/js/archive.js @@ -132,7 +132,6 @@ function showImages(getUrl) { axios.get(url) .then((response) => { if (response.data.files && response.data.files.length != 0) { - response.data.files.forEach((file) => { renderImages(file, url); imageOverlaytooltipText = response.data.metadata.description; From 63953c6b2f3bcddd1ccf9d1812477b6e8df685d9 Mon Sep 17 00:00:00 2001 From: segun Date: Thu, 12 Jan 2023 13:40:48 +0100 Subject: [PATCH 38/57] update --- examples/js/archive.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/js/archive.js b/examples/js/archive.js index 1b365852d..d64eb4018 100644 --- a/examples/js/archive.js +++ b/examples/js/archive.js @@ -1,6 +1,6 @@ let map; let image; -let imageOverlaytooltipText; +let imageTooltipText; const welcomeModal = document.getElementById('welcomeModal'); const tileMap = document.getElementById('map'); const restoreWelcomeModal = document.getElementById('restoreWelcomeModalBtn'); @@ -96,7 +96,7 @@ function showImages(getUrl) { if (response.data.files && response.data.files.length != 0) { response.data.files.forEach((file) => { renderImages(file, url); - imageOverlaytooltipText = response.data.metadata.description; + imageTooltipText = response.data.metadata.description; }); responseText.innerHTML = imageCount ? `${imageCount} image(s) fetched successfully from ${fetchedFrom.innerHTML}.` : 'No images found in the link provided...'; } else { @@ -133,7 +133,7 @@ document.addEventListener('click', (event) => { const imageURL = event.target.previousElementSibling.src; image = L.distortableImageOverlay( imageURL, - {tooltipText: imageOverlaytooltipText} + {tooltipText: imageTooltipText} ); map.imgGroup.addLayer(image); } From 13e04f9bfc7c8f44b41be2f17cd3a29b6b94763d Mon Sep 17 00:00:00 2001 From: segun Date: Thu, 12 Jan 2023 16:34:17 +0100 Subject: [PATCH 39/57] hotfix --- dist/leaflet.distortableimage.js | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/dist/leaflet.distortableimage.js b/dist/leaflet.distortableimage.js index 35babe65f..fc47b5538 100644 --- a/dist/leaflet.distortableimage.js +++ b/dist/leaflet.distortableimage.js @@ -1,4 +1,3 @@ -<<<<<<< HEAD /******/ (function() { // webpackBootstrap /******/ var __webpack_modules__ = ({ @@ -199,6 +198,7 @@ var arr = []; L.DistortableCollection = L.FeatureGroup.extend({ options: { editable: true, + tooltipControl: document.createElement('button'), exportOpts: { exportStartUrl: '//export.mapknitter.org/export', statusUrl: '//export.mapknitter.org', @@ -210,8 +210,7 @@ L.DistortableCollection = L.FeatureGroup.extend({ L.FeatureGroup.prototype.initialize.call(this, options); L.Utils.initTranslation.call(this); this.editable = this.options.editable; - this.tooltipControl = options.tooltipControl; - console.log('optionTest: tested'); // - delete + this.tooltipControl = this.options.tooltipControl; }, onAdd: function onAdd(map) { L.FeatureGroup.prototype.onAdd.call(this, map); @@ -513,7 +512,7 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ this.rotation = {}; this.interactive = this.options.interactive; this.tooltipText = options.tooltipText; - this.tooltipOpen = false; + this.tooltipOpen = options.tooltipOpen; }, onAdd: function onAdd(map) { var _this = this; @@ -7319,7 +7318,7 @@ module.exports.formatError = function (err) { /******/ /******/ /* webpack/runtime/getFullHash */ /******/ !function() { -/******/ __webpack_require__.h = function() { return "805ac63fe182507481d6"; } +/******/ __webpack_require__.h = function() { return "e9590d49f7739dc9f26a"; } /******/ }(); /******/ /******/ /* webpack/runtime/hasOwnProperty shorthand */ @@ -8351,7 +8350,4 @@ module.exports.formatError = function (err) { /******/ /******/ })() ; -======= -!function(){var t={808:function(){var t=[];L.DistortableCollection=L.FeatureGroup.extend({options:{editable:!0,tooltipControl:document.createElement("button"),exportOpts:{exportStartUrl:"//export.mapknitter.org/export",statusUrl:"//export.mapknitter.org",exportUrl:"http://export.mapknitter.org/"}},initialize:function(t){L.setOptions(this,t),L.FeatureGroup.prototype.initialize.call(this,t),L.Utils.initTranslation.call(this),this.editable=this.options.editable,this.tooltipControl=this.options.tooltipControl},onAdd:function(t){L.FeatureGroup.prototype.onAdd.call(this,t),this._map=t,this.editable&&this.editing.enable(),this.on("layeradd",this._addEvents,this),this.on("layerremove",this._removeEvents,this),L.DomEvent.on(this.tooltipControl,"click",this._updateTooltipBtn,this)},_updateTooltipBtn:function(t){return"Open Tooltip"===t.target.textContent?(t.target.textContent="Close Tooltip",void this.eachLayer((function(e){L.DomEvent.on(e.getElement(),"mousemove",e.activateTooltip,e),L.DomEvent.on(e.getElement(),"mouseout",e.closeToolTip,e),t.target.textContent="Close Tooltip"}))):"Close Tooltip"===t.target.textContent?(t.target.textContent="Open Tooltip",void this.eachLayer((function(t){L.DomEvent.off(t.getElement(),"mouseout"),L.DomEvent.off(t.getElement(),"mousemove")}))):void 0},onRemove:function(){if(this.editing&&this.editing.disable(),this.off("layeradd",this._addEvents,this),this.off("layerremove",this._removeEvents,this),"Close Tooltip"===e.target.textContent)return e.target.textContent="Open Tooltip",void this.eachLayer((function(t){L.DomEvent.off(t.getElement(),"mouseout"),L.DomEvent.off(t.getElement(),"mousemove")}))},_addEvents:function(t){var e=t.layer;L.DomEvent.on(e,{dragstart:this._dragStartMultiple,drag:this._dragMultiple},this),L.DomEvent.on(e.getElement(),{mousedown:this._deselectOthers,contextmenu:this._longPressMultiSelect},this)},_removeEvents:function(t){var e=t.layer;L.DomEvent.off(e,{dragstart:this._dragStartMultiple,drag:this._dragMultiple},this),L.DomEvent.off(e.getElement(),{mousedown:this._deselectOthers,contextmenu:this._longPressMultiSelect},this)},_longPressMultiSelect:function(t){var e=this;this.editable&&(t.preventDefault(),this.eachLayer((function(i){var o=i.editing;i.getElement()===t.target&&o.enabled()&&(L.DomUtil.toggleClass(i.getElement(),"collected"),e.anyCollected()?(i.deselect(),e.editing._addToolbar()):e.editing._removeToolbar())})))},isCollected:function(t){return L.DomUtil.hasClass(t.getElement(),"collected")},anyCollected:function(){return this.getLayers().some(this.isCollected.bind(this))},_toggleCollected:function(e,i){e.shiftKey&&i.editing.enabled()&&(L.DomUtil.toggleClass(e.target,"collected"),t.every((function(t){return t._leaflet_id!==i._leaflet_id}))?t.push(i):t.splice(t.indexOf(i),1)),this.anyCollected()?i.deselect():this.editing._removeToolbar()},_deselectOthers:function(t){var e=this;this.editable&&(this.eachLayer((function(i){i.getElement()!==t.target?i.deselect():e._toggleCollected(t,i)})),t&&L.DomEvent.stopPropagation(t))},_dragStartMultiple:function(t){var e,i=t.target,o=this._map;this.isCollected(i)&&this.eachLayer((function(t){for(t._dragStartPoints={},t.deselect(),e=0;e<4;e++){var i=t.getCorner(e);t._dragStartPoints[e]=o.latLngToLayerPoint(i)}}))},_dragMultiple:function(t){var e=t.target,i=this._map;if(this.isCollected(e)){var o=i.latLngToLayerPoint(e.getCorner(0)),n=e._dragStartPoints[0].subtract(o);this._updateCollectionFromPoints(n,e)}},_toRemove:function(){var t=this;return this.getLayers().filter((function(e){var i=e.editing._mode;return t.isCollected(e)&&"lock"!==i}))},_toMove:function(t){var e=this;return this.getLayers().filter((function(i){var o=i.editing._mode;return i!==t&&e.isCollected(i)&&"lock"!==o}))},_updateCollectionFromPoints:function(t,e){var i,o=this._toMove(e),n=new L.Transformation(1,-t.x,1,-t.y);o.forEach((function(t){var e={};for(i=0;i<4;i++)e[i]=n.transform(t._dragStartPoints[i]);t.setCornersFromPoints(e)}))},_getAvgCmPerPixel:function(t){return t.reduce((function(t,e){return t+e.cm_per_pixel}),0)/t.length},generateExportJson:function(){var t={images:[]};return this.eachLayer((function(e){if(this.isCollected(e)){var i=e._image.src.split("/"),o=i[i.length-1],n=e.getCorners(),a=[{lat:n[0].lat,lon:n[0].lng},{lat:n[1].lat,lon:n[1].lng},{lat:n[3].lat,lon:n[3].lng},{lat:n[2].lat,lon:n[2].lng}];t.images.push({id:e._leaflet_id,src:e._image.src,width:e._image.width,height:e._image.height,image_file_name:o,nodes:a,cm_per_pixel:L.ImageUtil.getCmPerPixel(e)})}}),this),t.images=t.images.reverse(),t.avg_cm_per_pixel=this._getAvgCmPerPixel(t.images),t}}),L.distortableCollection=function(t,e){return new L.DistortableCollection(t,e)}},477:function(){L.DistortableImageOverlay=L.ImageOverlay.extend({options:{height:200,crossOrigin:!0,edgeMinWidth:50,editable:!0,mode:"distort",selected:!1,interactive:!0,tooltipText:"Unknow image",tooltipOpen:!1},initialize:function(t,e){L.setOptions(this,e),L.Utils.initTranslation.call(this),this.edgeMinWidth=this.options.edgeMinWidth,this.editable=this.options.editable,this._selected=this.options.selected,this._url=t,this.rotation={},this.interactive=this.options.interactive,this.tooltipText=e.tooltipText,this.tooltipOpen=e.tooltipOpen},onAdd:function(t){var e=this;this._map=t,this.getElement()||this._initImage(),t.on("viewreset",this._reset,this),this.options.corners&&(this._corners=this.options.corners,t.options.zoomAnimation&&L.Browser.any3d&&t.on("zoomanim",this._animateZoom,this)),L.DomEvent.on(this.getElement(),"load",(function(){if(e.getPane().appendChild(e.getElement()),e._initImageDimensions(),e.options.rotation){var i=e.options.rotation.deg>=0?"deg":"rad";e.setAngle(e.options.rotation[i],i)}else e.rotation={deg:0,rad:0},e._reset();e._corners||t.options.zoomAnimation&&L.Browser.any3d&&t.on("zoomanim",e._animateZoom,e);var o=e._eventParents;o?(e.eP=o[Object.keys(o)[0]],e.eP.editable&&e.editing.enable()):(e.editable&&e.editing.enable(),e.eP=null)})),L.DomEvent.on(this.getElement(),"click",this.select,this),L.DomEvent.on(t,{singleclickon:this._singleClickListeners,singleclickoff:this._resetClickListeners,singleclick:this._singleClick},this),t.doubleClickZoom.enabled()||t.doubleClickLabels.enabled()||L.DomEvent.on(t,"click",this.deselect,this),this.fire("add")},onRemove:function(t){L.DomEvent.off(this.getElement(),"click",this.select,this),L.DomEvent.off(t,{singleclickon:this._singleClickListeners,singleclickoff:this._resetClickListeners,singleclick:this._singleClick},this),L.DomEvent.off(t,"click",this.deselect,this),this.editing&&this.editing.disable(),this.fire("remove"),L.ImageOverlay.prototype.onRemove.call(this,t)},_initImageDimensions:function(){var t=this._map,e=L.DomUtil.getStyle(this.getElement(),"width"),i=L.DomUtil.getStyle(this.getElement(),"height"),o=parseInt(e)/parseInt(i),n=this.options.height,a=parseInt(o*n),s=t.project(t.getCenter()),r=L.point(a,n).divideBy(2);this.options.corners?this._corners=this.options.corners:this._corners=[t.unproject(s.subtract(r)),t.unproject(s.add(L.point(r.x,-r.y))),t.unproject(s.add(L.point(-r.x,r.y))),t.unproject(s.add(r))],this._initialDimensions={center:s,offset:r,zoom:t.getZoom()},this.setBounds(L.latLngBounds(this.getCorners()))},_singleClick:function(t){"singleclick"===t.type&&this.deselect()},_singleClickListeners:function(){var t=this._map;L.DomEvent.off(t,"click",this.deselect,this),L.DomEvent.on(t,"singleclick",this.deselect,this)},_resetClickListeners:function(){var t=this._map;L.DomEvent.on(t,"click",this.deselect,this),L.DomEvent.off(t,"singleclick",this.deselect,this)},isSelected:function(){return this._selected},deselect:function(){var t=this.editing;if(t.enabled())return t._removeToolbar(),t._hideMarkers(),this._selected=!1,this.fire("deselect"),this},select:function(t){var e=this.editing,i=this.eP;if(e.enabled()){if(t&&L.DomEvent.stopPropagation(t),this._programmaticGrouping(),this._selected=!0,e._addToolbar(),e._showMarkers(),this.fire("select"),!i||!i.anyCollected())return this;this.deselect()}},_programmaticGrouping:function(){this._map.eachLayer((function(t){t instanceof L.DistortableImageOverlay&&t.deselect()}))},setCorner:function(t,e){var i=this.editing;return this._corners[t]=e,this.setBounds(L.latLngBounds(this.getCorners())),this.fire("update"),i.toolbar&&i.toolbar instanceof L.DistortableImage.PopupBar&&i._updateToolbarPos(),this.edited=!0,this},_cornerExceedsMapLats:function(t,e,i){return i.options.crs.Simple!=L.CRS.Simple&&(0===t?(o=i.project(e).y<2,n=i.project(e).y>=255):(o=i.project(e).y/t<2,n=i.project(e).y/Math.pow(2,t)>=255),o||n);var o,n},activateTooltip:function(){this._selected||this.bindTooltip(this.tooltipText,{direction:"top"}).openTooltip()},closeToolTip:function(){this.closeTooltip()},deactivateTooltip:function(){this.unbindTooltip()},setCorners:function(t){var e=this._map,i=e.getZoom(),o=this.editing,n=0;for(var a in t)if(this._cornerExceedsMapLats(i,t[a],e))return this.setBounds(L.latLngBounds(this.getCorners())),void this.fire("update");for(var s in t)this._corners[n]=t[s],n+=1;return this.setBounds(L.latLngBounds(this.getCorners())),this.fire("update"),o.toolbar&&o.toolbar instanceof L.DistortableImage.PopupBar&&o._updateToolbarPos(),this.edited=!0,this},setCornersFromPoints:function(t){var e=this._map,i=e.getZoom(),o=this.editing,n=0;for(var a in t){var s=e.layerPointToLatLng(t[a]);if(this._cornerExceedsMapLats(i,s,e))return this.setBounds(L.latLngBounds(this.getCorners())),void this.fire("update")}for(var r in t)this._corners[n]=e.layerPointToLatLng(t[r]),n+=1;return this.setBounds(L.latLngBounds(this.getCorners())),this.fire("update"),o.toolbar&&o.toolbar instanceof L.DistortableImage.PopupBar&&o._updateToolbarPos(),this.edited=!0,this},scaleBy:function(t){var e,i,o=this._map,n=o.project(this.getCenter()),a={};if(0!==t){for(e=0;e<4;e++)i=o.project(this.getCorner(e)).subtract(n).multiplyBy(t).add(n),a[e]=o.unproject(i);return this.setCorners(a),this}},getAngle:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"deg",e=this.getElement().style[L.DomUtil.TRANSFORM].split("matrix3d")[1].slice(1,-1).split(","),i=e[0],o=e[1],n=e[4],a=e[5],s=i*a-o*n,r=L.TrigUtil.calcAngle(i,o,"rad");return s<0&&(r+=r<0?Math.PI:-Math.PI),r<0&&(r=2*Math.PI+r),"deg"===t?Math.round(L.TrigUtil.radiansToDegrees(r)):L.Util.formatNum(r,2)},setAngle:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"deg",i=this.getAngle(e),o=t-i;return this.rotateBy(o,e),this},rotateBy:function(t){var e,i,o,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"deg",a=this._map,s=a.project(this.getCenter()),r={};for("deg"===n&&(t=L.TrigUtil.degreesToRadians(t)),e=0;e<4;e++)i=a.project(this.getCorner(e)).subtract(s),o=L.point(Math.cos(t)*i.x-Math.sin(t)*i.y,Math.sin(t)*i.x+Math.cos(t)*i.y),r[e]=a.unproject(o.add(s));return this.setCorners(r),this},dragBy:function(t,e){var i,o,n=this._map,a={},s=n.project(t).subtract(n.project(e));for(i=0;i<4;i++)o=n.project(this.getCorner(i)).subtract(s),a[i]=n.unproject(o);this.setCorners(a)},restore:function(){for(var t=this._map,e=this._initialDimensions.center,i=this._initialDimensions.offset,o=this._initialDimensions.zoom,n=[e.subtract(i),e.add(L.point(i.x,-i.y)),e.add(L.point(-i.x,i.y)),e.add(i)],a=0;a<4;a++)t.unproject(n[a],o).equals(this.getCorner(a))||this.setCorner(a,t.unproject(n[a],o));return this.edited=!1,this.fire("restore"),this},_getTranslateString:function(t){var e=L.Browser.webkit3d,i=(e?",0":"")+")";return"translate"+(e?"3d":"")+"("+t.x+"px,"+t.y+"px"+i},_reset:function(){var t=this._map,e=this.getElement(),i=L.bind(t.latLngToLayerPoint,t),o=this._calculateProjectiveTransform(i),n=i(this.getCorner(0)),a=L.DomUtil.getMatrixString(o),s=this._getTranslateString(n);e._leaflet_pos=n,e.style[L.DomUtil.TRANSFORM]=[s,a].join(" "),e.style[L.DomUtil.TRANSFORM+"-origin"]="0 0 0",this.rotation.deg=this.getAngle(),this.rotation.rad=this.getAngle("rad")},_animateZoom:function(t){var e=this._map,i=this.getElement(),o=function(i){return e._latLngToNewLayerPoint(i,t.zoom,t.center)},n=this._calculateProjectiveTransform(o),a=o(this.getCorner(0)),s=L.DomUtil.getMatrixString(n),r=this._getTranslateString(a);i._leaflet_pos=a,i.style[L.DomUtil.TRANSFORM]=[r,s].join(" ")},getCorners:function(){return this._corners},getCorner:function(t){return this._corners[t]},getCenter:function(){var t=this._map,e=this.getCorners().reduce((function(e,i){return e.add(t.project(i))}),L.point(0,0));return t.unproject(e.divideBy(4))},_calculateProjectiveTransform:function(t){var e,i=t(this.getCorner(0)),o=this.getElement().offsetWidth||500,n=this.getElement().offsetHeight||375,a=[];for(e=0;e<4;e++)a.push(t(this.getCorner(e))._subtract(i));return L.MatrixUtil.general2DProjection(0,0,a[0].x,a[0].y,o,0,a[1].x,a[1].y,0,n,a[2].x,a[2].y,o,n,a[3].x,a[3].y)}}),L.distortableImageOverlay=function(t,e){return new L.DistortableImageOverlay(t,e)},L.Map.addInitHook((function(){L.DomUtil.hasClass(this.getContainer(),"ldi")||L.DomUtil.addClass(this.getContainer(),"ldi")}))},782:function(){var t=this;L.DomUtil=L.DomUtil||{},L.DistortableImage=L.DistortableImage||{},L.distortableImage=L.DistortableImage,L.DistortableImage.Keymapper=L.Handler.extend({options:{position:"topright"},initialize:function(t,e){this._map=t,L.setOptions(this,e)},addHooks:function(){this._keymapper||(this._container=this._buildContainer(),this._scrollWrapper=this._wrap(),this._toggler=this._createButton(),this._setMapper(this._container,this._scrollWrapper,this._toggler),L.DomEvent.on(this._toggler,"click",this._toggleKeymapper,this),L.DomEvent.disableClickPropagation(this._container),L.DomEvent.disableScrollPropagation(this._container))},removeHooks:function(){this._keymapper&&(L.DomEvent.off(this._toggler,"click",this._toggleKeymapper,this),L.DomUtil.remove(this._toggler),L.DomUtil.remove(this._scrollWrapper),L.DomUtil.remove(this._container),this._keymapper=!1)},_buildContainer:function(){var t=L.DomUtil.create("div","ldi-keymapper-hide");t.setAttribute("id","ldi-keymapper");var e=L.DomUtil.create("br","divider");return t.appendChild(e),t},_createButton:function(){var t=L.DomUtil.create("a","");return t.innerHTML=L.IconUtil.create("keyboard_open"),t.setAttribute("id","toggle-keymapper"),t.setAttribute("href","#"),t.setAttribute("title","Show keymap"),t.setAttribute("role","button"),t.setAttribute("aria-label","Show keymap"),t},_wrap:function(){var t=L.DomUtil.create("div","");return t.setAttribute("id","keymapper-wrapper"),t.style.display="none",t},_setMapper:function(t,e,i){this._keymapper=L.control({position:this.options.position}),this._keymapper.onAdd=function(){return t.appendChild(e),e.insertAdjacentHTML("beforeend",'
Rotate Mode
R
RotateScale Mode
r
Scale Mode
s
Distort Mode
d
Drag Mode
D
Lock (Mode) / Unlock Image
l u
Stack up / down
q a
Add / Remove Image Border
b
Toggle Opacity
o
Deselect All
esc
Delete Image(s)
delete backspace
Export Image(s)
e
'),t.appendChild(i),t},this._keymapper.addTo(this._map)},_toggleKeymapper:function(t){t.preventDefault(),this._container.className="ldi-keymapper leaflet-control"===this._container.className?"ldi-keymapper-hide leaflet-control":"ldi-keymapper leaflet-control",this._scrollWrapper.style.display="none"===this._scrollWrapper.style.display?"block":"none",this._toggler.innerHTML="close"===this._toggler.innerHTML?L.IconUtil.create("keyboard_open"):"close",L.IconUtil.toggleTitle(this._toggler,"Show keymap","Hide keymap"),L.DomUtil.toggleClass(this._toggler,"close-icon")},_injectIconSet:function(){if(!document.querySelector("#keymapper-iconset")){var t=L.DomUtil.create("div","");t.id="keymapper-iconset",t.setAttribute("hidden","hidden"),this._iconset=(new L.KeymapperIconSet).render(),t.innerHTML=this._iconset,document.querySelector(".leaflet-control-container").appendChild(t)}}}),L.DistortableImage.Keymapper.addInitHook((function(){L.DistortableImage.Keymapper.prototype._n=L.DistortableImage.Keymapper.prototype._n?L.DistortableImage.Keymapper.prototype._n+1:1,1!==L.DistortableImage.Keymapper.prototype._n||L.Browser.mobile||(t.enable(),t._injectIconSet())})),L.distortableImage.keymapper=function(t,e){return new L.DistortableImage.Keymapper(t,e)}},428:function(){L.DistortableImage=L.DistortableImage||{},L.DistortableCollection.Edit=L.Handler.extend({options:{keymap:L.distortableImage.group_action_map},initialize:function(t,e){this._group=t,this._exportOpts=t.options.exportOpts,L.setOptions(this,e),L.distortableImage.group_action_map.Escape="_decollectAll"},addHooks:function(){var t=this._group._map;this.editActions=this.options.actions,this.runExporter=L.bind(L.Utils.getNestedVal(this,"_exportOpts","exporter")||this.startExport,this),L.DomEvent.on(document,"keydown",this._onKeyDown,this),t.doubleClickZoom.enabled()||t.doubleClickLabels.enabled()||L.DomEvent.on(t,"click",this._decollectAll,this),L.DomEvent.on(t,{singleclickon:this._singleClickListeners,singleclickoff:this._resetClickListeners,singleclick:this._singleClick,boxcollectend:this._addCollections},this),this._group.editable=!0,this._group.eachLayer((function(t){return t.editing.enable()}))},removeHooks:function(){var t=this._group._map;L.DomEvent.off(document,"keydown",this._onKeyDown,this),t.doubleClickZoom.enabled()||t.doubleClickLabels.enabled()||L.DomEvent.off(t,"click",this._decollectAll,this),L.DomEvent.off(t,{singleclickon:this._singleClickListeners,singleclickoff:this._resetClickListeners,singleclick:this._singleClick,boxcollectend:this._addCollections},this),this._decollectAll(),this._group.editable=!1,this._group.eachLayer((function(t){return t.editing.disable()}))},enable:function(){return this._enabled=!0,this.addHooks(),this},disable:function(){return this._enabled=!1,this.removeHooks(),this},_onKeyDown:function(t){var e=this.options.keymap[t.key];this[e]&&this._group.anyCollected()&&this[e].call(this)},_singleClick:function(t){"singleclick"===t.type&&this._decollectAll(t)},_singleClickListeners:function(){var t=this._group._map;L.DomEvent.off(t,"click",this._decollectAll,this),L.DomEvent.on(t,"singleclick",this._decollectAll,this)},_resetClickListeners:function(){var t=this._group._map;L.DomEvent.on(t,"click",this._decollectAll,this),L.DomEvent.off(t,"singleclick",this._decollectAll,this)},_decollectAll:function(t){var e;t&&(e=t.originalEvent),e&&(e.shiftKey||e.target instanceof HTMLImageElement)||(this._group.eachLayer((function(t){L.DomUtil.removeClass(t.getElement(),"collected"),t.deselect()})),this._removeToolbar(),t&&L.DomEvent.stopPropagation(t))},_unlockGroup:function(){var t=this;this.hasTool(L.UnlockAction)&&this._group.eachLayer((function(e){t._group.isCollected(e)&&(e.editing._unlock(),e.deselect())}))},_lockGroup:function(){var t=this;this.hasTool(L.LockAction)&&this._group.eachLayer((function(e){t._group.isCollected(e)&&(e.editing._lock(),L.DomUtil.addClass(e.getElement(),"collected"))}))},_addCollections:function(t){var e=this,i=t.boxCollectBounds,o=this._group._map;this._group.eachLayer((function(t){var n=t.editing;t.isSelected()&&t.deselect();var a=o.getZoom(),s=o.getCenter(),r=L.latLngBounds(t.getCorner(2),t.getCorner(1));r=o._latLngBoundsToNewLayerBounds(r,a,s),i.intersects(r)&&n.enabled()&&(e.toolbar||e._addToolbar(),L.DomUtil.addClass(t.getElement(),"collected"))}))},_removeGroup:function(t){var e=this;if(this.hasTool(L.DeleteAction)){var i=this._group._toRemove(),o=i.length;0!==o&&(L.DomUtil.confirmDeletes(o)&&(i.forEach((function(t){e._group.removeLayer(t)})),this._group.anyCollected()||this._removeToolbar()),t&&L.DomEvent.stopPropagation(t))}},cancelExport:function(){this.customCollection||(this._exportOpts.collection=void 0),clearInterval(this.updateInterval)},_addToolbar:function(){var t=this._group,e=t._map;t.options.suppressToolbar||this.toolbar||(this.toolbar=L.distortableImage.controlBar({actions:this.editActions,position:"topleft"}).addTo(e,t))},_removeToolbar:function(){var t=this._group._map;if(!this.toolbar)return!1;t.removeLayer(this.toolbar),this.toolbar=!1},hasTool:function(t){return this.editActions.some((function(e){return e===t}))},addTool:function(t){return"leaflet-toolbar-icon"!==t.baseClass||this.hasTool(t)||(this._removeToolbar(),this.editActions.push(t),this._addToolbar()),this},removeTool:function(t){var e=this;return this.editActions.some((function(i,o){return e.editActions[o]===t&&(e._removeToolbar(),e.editActions.splice(o,1),e._addToolbar(),!0)})),this},startExport:function(){var t=this;if(this.hasTool(L.ExportAction))return new Promise((function(e){var i,o=t._exportOpts;o.resolve=e,t.updateInterval=null,t.customCollection=!!o.collection,t.customCollection||(o.collection=t._group.generateExportJson().images),o.frequency=o.frequency||3e3,o.scale=o.scale||100,o.updater=o.updater||function(n){(n=JSON.parse(n)).status_url&&(i!==n.status_url&&n.status_url.match(".json")&&(i=n.status_url),"complete"===n.status&&(clearInterval(t.updateInterval),t.customCollection||(t._exportOpts.collection=void 0),e(),null!==n.jpg&&alert("Export succeeded. "+o.exportUrl+n.jpg)),console.log(n))},o.handleStatusRes=o.handleStatusRes||function(e){i=o.statusUrl+e,t.updateInterval=setInterval((function(){var t=new Request("".concat(i,"?").concat(Date.now()),{method:"GET"});fetch(t).then((function(t){if(t.ok)return t.text()})).then(o.updater)}),o.frequency)},o.fetchStatusUrl=o.fetchStatusUrl||function(t){var e=new FormData;e.append("collection",JSON.stringify(t.collection)),e.append("scale",t.scale),e.append("upload",!0);var i={method:"POST",body:e},o=new Request(t.exportStartUrl,i);fetch(o).then((function(t){if(t.ok)return t.text()})).then(t.handleStatusRes)},o.fetchStatusUrl(o)}))}}),L.distortableCollection.edit=function(t,e){return new L.DistortableCollection.Edit(t,e)}},397:function(){L.DistortableImage=L.DistortableImage||{},L.DistortableImage.Edit=L.Handler.extend({options:{opacity:.7,outline:"1px solid red",keymap:L.distortableImage.action_map},initialize:function(t,e){this._overlay=t,this._toggledImage=!1,this._mode=t.options.mode,this._transparent=!1,this._outlined=!1,L.setOptions(this,e),L.distortableImage.action_map.Escape="_deselect"},addHooks:function(){var t=this._overlay;this.editActions=this.options.actions,t.bringToFront(),this._initModes(),this._initHandles(),this._appendHandlesandDragable(),t.isSelected()&&!t.options.suppressToolbar&&this._addToolbar(),this.parentGroup=!!t.eP&&t.eP,L.DomEvent.on(t.getElement(),{dblclick:this.nextMode},this),L.DomEvent.on(window,"keydown",this._onKeyDown,this)},removeHooks:function(){var t=this._overlay,e=this.parentGroup;for(var i in this._disableDragging(),this.toolbar&&this._removeToolbar(),this._handles)L.DomUtil.remove(i);L.DomUtil.hasClass(t.getElement(),"collected")&&L.DomUtil.removeClass(t.getElement(),"collected"),e&&!e.anyCollected()&&e.editing.toolbar&&e.editing._removeToolbar(),L.DomEvent.off(t.getElement(),{dblclick:this.nextMode},this),L.DomEvent.off(window,"keydown",this._onKeyDown,this)},disable:function(){return this._enabled?(this._overlay.deselect(),this._enabled=!1,this.removeHooks(),this):this},_initModes:function(){for(var t in this._modes={},L.DistortableImage.Edit.MODES){var e=L.DistortableImage.Edit.MODES[t];-1!==this.editActions.indexOf(e)&&(this._modes[t]=e)}this._modes[this._mode]||(this._mode=Object.keys(this._modes)[0])},_initHandles:function(){var t,e=this._overlay;for(this._dragHandles=L.layerGroup(),t=0;t<4;t++)this._dragHandles.addLayer(L.dragHandle(e,t));for(this._scaleHandles=L.layerGroup(),t=0;t<4;t++)this._scaleHandles.addLayer(L.scaleHandle(e,t));for(this._distortHandles=L.layerGroup(),t=0;t<4;t++)this._distortHandles.addLayer(L.distortHandle(e,t));for(this._rotateHandles=L.layerGroup(),t=0;t<4;t++)this._rotateHandles.addLayer(L.rotateHandle(e,t));for(this._freeRotateHandles=L.layerGroup(),t=0;t<4;t++)this._freeRotateHandles.addLayer(L.freeRotateHandle(e,t));for(this._lockHandles=L.layerGroup(),t=0;t<4;t++)this._lockHandles.addLayer(L.lockHandle(e,t,{draggable:!1}));this._handles={drag:this._dragHandles,scale:this._scaleHandles,distort:this._distortHandles,rotate:this._rotateHandles,freeRotate:this._freeRotateHandles,lock:this._lockHandles}},_appendHandlesandDragable:function(){var t=this._overlay;this._mode?(this._updateHandle(),!t.isSelected()&&this.currentHandle&&this.currentHandle.eachLayer((function(t){t.setOpacity(0),t.dragging&&t.dragging.disable()})),this.isMode("lock")||this._enableDragging()):this._enableDragging()},_onKeyDown:function(t){var e=this.options.keymap[t.key],i=this._overlay,o=this.parentGroup;o&&o.anyCollected()||void 0===this[e]||i.options.suppressToolbar||i.isSelected()&&this.toolbar&&this[e].call(this)},replaceTool:function(t,e){var i=this;return"leaflet-toolbar-icon"!==e.baseClass||this.hasTool(e)||this.editActions.some((function(o,n){if(o===t){for(var a in i._removeToolbar(),i.editActions[n]=e,i._addToolbar(),L.DistortableImage.Edit.MODES)L.DistortableImage.Edit.MODES[a]===t?(delete i._modes[a],i._nextOrNone(a)):L.DistortableImage.Edit.MODES[a]===e&&(i._modes[a]=e);return!0}})),this},addTool:function(t){if("leaflet-toolbar-icon"===t.baseClass&&!this.hasTool(t)){for(var e in this._removeToolbar(),this.editActions.push(t),this._addToolbar(),L.DistortableImage.Edit.MODES)L.DistortableImage.Edit.MODES[e]===t&&(this._modes[e]=t);this._overlay.isSelected()||this._removeToolbar()}return this},hasTool:function(t){return this.editActions.some((function(e){return e===t}))},removeTool:function(t){var e=this;return this.editActions.some((function(i,o){if(i===t){for(var n in e._removeToolbar(),e.editActions.splice(o,1),e._addToolbar(),L.DistortableImage.Edit.MODES)L.DistortableImage.Edit.MODES[n]===t&&(delete e._modes[n],e._nextOrNone(n));return!0}})),this._overlay.isSelected()||this._removeToolbar(),this},_nextOrNone:function(t){this.isMode(t)&&(Object.keys(this.getModes()).length>=1?this.nextMode():("lock"===t&&this._enableDragging(),this._mode="",this._updateHandle()))},_removeToolbar:function(){var t=this._overlay._map;this.toolbar&&(t.removeLayer(this.toolbar),this.toolbar=!1)},_enableDragging:function(){var t=this,e=this._overlay,i=e._map;this.dragging=new L.Draggable(e.getElement()),this.dragging.enable(),this.dragging.on("dragstart",(function(){e.fire("dragstart"),t._removeToolbar()})),this.dragging._updatePosition=function(){var t,o,n=e.getCorner(0),a=this._newPos.subtract(i.latLngToLayerPoint(n)),s={};for(this.fire("predrag"),o=0;o<4;o++)t=i.latLngToLayerPoint(e.getCorner(o)),s[o]=i.layerPointToLatLng(t.add(a));e.setCorners(s),e.fire("drag"),this.fire("drag")},this.dragging.on("dragend",(function(){e.fire("dragend")}))},_disableDragging:function(){this.dragging&&(this.dragging.disable(),delete this.dragging)},_dragMode:function(){this.setMode("drag")},_scaleMode:function(){this.setMode("scale")},_distortMode:function(){this.setMode("distort")},_rotateMode:function(){this.setMode("rotate")},_freeRotateMode:function(){this.setMode("freeRotate")},_toggleLockMode:function(){this.isMode("lock")?this._unlock():this._lock()},_toggleOpacity:function(){var t=this._overlay.getElement();if(this.hasTool(L.OpacityAction)){this._transparent=!this._transparent;var e=this._transparent?this.options.opacity:1;L.DomUtil.setOpacity(t,e),t.setAttribute("opacity",e),this._refresh()}},_toggleBorder:function(){var t=this._overlay.getElement();if(this.hasTool(L.BorderAction)){this._outlined=!this._outlined;var e=this._outlined?this.options.outline:"none";t.style.outline=e,this._refresh()}},_toggleOrder:function(){this._toggledImage?this._stackUp():this._stackDown()},_removeOverlay:function(){var t=this._overlay,e=this.parentGroup;!this.isMode("lock")&&this.hasTool(L.DeleteAction)&&L.DomUtil.confirmDelete()&&(this._removeToolbar(),e?e.removeLayer(t):t._map.removeLayer(t))},_getExport:function(){var t=this._overlay,e=t._map,i=t.getElement();if(this.hasTool(L.ExportAction)){var o=new Image;o.id=o.id||"tempId12345",document.body.appendChild(o),o.onload=function(){var i=o.height,n=o.width,a=e.latLngToLayerPoint(t.getCorner(0)),s=e.latLngToLayerPoint(t.getCorner(1)),r=e.latLngToLayerPoint(t.getCorner(2)),l=e.latLngToLayerPoint(t.getCorner(3));o.onload=function(){L.DomUtil.remove(o)},window&&window.hasOwnProperty("warpWebGl")&&warpWebGl(o.id,[0,0,n,0,n,i,0,i],[a.x,a.y,s.x,s.y,l.x,l.y,r.x,r.y],!0)},o.src=t.options.fullResolutionSrc||i.src}},_stackUp:function(){this._toggledImage&&this.hasTool(L.StackAction)&&(this._toggledImage=!1,this._overlay.bringToFront(),this._refresh())},_stackDown:function(){!this._toggledImage&&this.hasTool(L.StackAction)&&(this._toggledImage=!0,this._overlay.bringToBack(),this._refresh())},_unlock:function(){var t=this._overlay,e=t._map,i=this.parentGroup;this.isMode("lock")&&((!i||i.isCollected(t))&&i||this.hasTool(L.LockAction))&&(this.currentHandle&&e.removeLayer(this.currentHandle),"lock"!==t.options.mode&&this.hasMode(t.options.mode)?this._mode=t.options.mode:(this._mode="",this.currentHandle=""),this._updateHandle(),this._enableDragging(),this._refresh())},_lock:function(){var t=this._overlay,e=t._map,i=this.parentGroup;this.isMode("lock")||((!i||i.isCollected(t))&&i||this.hasTool(L.LockAction))&&(this.currentHandle&&e.removeLayer(this.currentHandle),this._mode="lock",this._updateHandle(),this._disableDragging(),this._refresh())},_deselect:function(){this._overlay.deselect()},_showMarkers:function(t){var e=this.parentGroup;this.currentHandle&&(!this.isMode("lock")&&e&&e.anyCollected()||this.currentHandle.eachLayer((function(t){t.setOpacity(1),t.dragging&&t.dragging.enable(),L.DomUtil.addClass(t.getElement(),"leaflet-interactive")})))},_hideMarkers:function(){var t=this._overlay,e=this.parentGroup;this._handles||this._initHandles(),this.currentHandle&&(this.isMode("lock")&&e&&e.isCollected(t)||this.currentHandle.eachLayer((function(t){t.setOpacity(0),t.dragging&&t.dragging.disable(),L.DomUtil.removeClass(t.getElement(),"leaflet-interactive")})))},_updateHandle:function(){var t=this._overlay._map,e=this.getMode();this.currentHandle&&t.removeLayer(this.currentHandle),this.currentHandle=""===e?"":this._handles[e],""!==this.currentHandle&&t.addLayer(this.currentHandle)},_addToolbar:function(){var t=this._overlay,e=this.parentGroup,i=t._map,o=t.getCorners(),n=-1/0;if(e&&e.anyCollected())e.editing._addToolbar();else if(!t.options.suppressToolbar&&!this.toolbar){for(var a=0;an&&(n=o[a].lat);var s=t.getCenter();s.lat=n,this.toolbar=L.distortableImage.popupBar(s,{actions:this.editActions}).addTo(i,t),t.fire("toolbar:created")}},_refresh:function(){this.toolbar&&this._removeToolbar(),this._addToolbar()},_updateToolbarPos:function(){var t=this._overlay,e=t.getCorners(),i=this.toolbar,o=-1/0;if(i&&i instanceof L.DistortableImage.PopupBar){for(var n=0;no&&(o=e[n].lat);var a=t.getCenter();a.lat=o,t.options.suppressToolbar||this.toolbar.setLatLng(a)}},hasMode:function(t){return!!this._modes[t]},getMode:function(){if(this.enabled())return this._mode},getModes:function(){return this._modes},isMode:function(t){return!!this.enabled()&&this._mode===t},setMode:function(t){var e=this._overlay,i=this.parentGroup;if(this.getMode()!==t&&this.hasMode(t)&&this.enabled())return this.toolbar&&this.toolbar.clickTool(t),this.isMode("lock")&&!this.dragging&&this._enableDragging(),this._mode=t,this.isMode("lock")&&this._disableDragging(),this._updateHandle(),this._refresh(),i&&i.isCollected(e)&&e.deselect(),this},nextMode:function(t){var e=this.getMode(),i=this.parentGroup,o=Object.keys(this.getModes()),n=o.indexOf(e),a=o[(n+1)%o.length];if(t){if(i&&i.anyCollected())return;L.DomEvent.stop(t)}return this.setMode(a)}}),L.distortableImage.edit=function(t,e){return new L.DistortableImage.Edit(t,e)}},426:function(){L.BorderAction=L.EditAction.extend({initialize:function(t,e,i){var o,n,a=e.editing,s=a._mode;a._outlined?(o="border_outer",n=e.options.translation.removeBorder):(o="border_clear",n=e.options.translation.addBorder),(i=i||{}).toolbarIcon={svg:!0,html:o,tooltip:n,className:"lock"===s?"disabled":""},L.DistortableImage.action_map.b="lock"===s?"":"_toggleBorder",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){var t=this._overlay.editing;L.IconUtil.toggleXlink(this._link,"border_clear","border_outer"),L.IconUtil.toggleTitle(this._link,"Remove Border","Add Border"),t._toggleBorder()}})},114:function(){L.DeleteAction=L.EditAction.extend({initialize:function(t,e,i){var o,n=e.editing;n instanceof L.DistortableImage.Edit?(o=e.options.translation.deleteImage,L.DistortableImage.action_map.Backspace="lock"===n._mode?"":"_removeOverlay"):(o=e.options.translation.deleteImages,L.DistortableImage.group_action_map.Backspace="lock"===n._mode?"":"_removeGroup"),(i=i||{}).toolbarIcon={svg:!0,html:"delete_forever",tooltip:o,className:"lock"===n._mode?"disabled":""},L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){var t=this._overlay.editing;t instanceof L.DistortableImage.Edit?t._removeOverlay():t._removeGroup()}})},231:function(){L.DistortAction=L.EditAction.extend({initialize:function(t,e,i){(i=i||{}).toolbarIcon={svg:!0,html:"distort",tooltip:e.options.translation.distortImage,className:"distort"},L.DistortableImage.action_map.d="_distortMode",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){this._overlay.editing._distortMode()}})},541:function(){L.DragAction=L.EditAction.extend({initialize:function(t,e,i){(i=i||{}).toolbarIcon={svg:!0,html:"drag",tooltip:e.options.translation.dragImage,className:"drag"},L.DistortableImage.action_map.D="_dragMode",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){this._overlay.editing._dragMode()}})},280:function(){L.DistortableImage=L.DistortableImage||{},L.distortableImage=L.DistortableImage,L.DistortableImage.action_map={},L.EditAction=L.Toolbar2.Action.extend({options:{toolbarIcon:{svg:!1,html:"",className:"",tooltip:""}},initialize:function(t,e,i){this._overlay=e,this._map=t,L.setOptions(this,i),L.Toolbar2.Action.prototype.initialize.call(this,i),this._injectIconSet()},_createIcon:function(t,e,i){var o=this,n=this.options.toolbarIcon,a=n.className,s=this._overlay.editing;this.toolbar=t,this._icon=L.DomUtil.create("li","",e),this._link=L.DomUtil.create("a","",this._icon),n.svg?this._link.innerHTML=L.IconUtil.create(n.html):this._link.innerHTML=n.html,this._link.setAttribute("href","#"),this._link.setAttribute("title",n.tooltip),this._link.setAttribute("role","button"),L.DomUtil.addClass(this._link,this.constructor.baseClass),a&&(L.DomUtil.addClass(this._link,a),"disabled"===a&&L.DomUtil.addClass(this._icon,a),a===s._mode?L.DomUtil.addClass(this._link,"selected-mode"):L.DomUtil.removeClass(this._link,"selected-mode")),L.DomEvent.on(this._link,"click",this.enable,this),L.DomEvent.on(this._overlay,"update",(function(){var t=o._link.innerHTML.match(/xlink:href="#restore"/);t&&1===t.length&&o._enableAction()})),this._addSubToolbar(t,this._icon,i)},_injectIconSet:function(){if(!document.querySelector("#iconset")){var t=document.createElement("div");t.id="iconset",t.setAttribute("hidden","hidden"),t.innerHTML=(new L.ToolbarIconSet).render(),document.querySelector(".leaflet-marker-pane").appendChild(t)}},_enableAction:function(){L.DomUtil.removeClass(this._link.parentElement,"disabled"),L.DomUtil.removeClass(this._link,"disabled")},_disableAction:function(){L.DomUtil.addClass(this._link.parentElement,"disabled"),L.DomUtil.addClass(this._link,"disabled")}}),L.editAction=function(t,e,i){return new L.EditAction(t,e,i)}},149:function(){L.ExportAction=L.EditAction.extend({initialize:function(t,e,i){var o,n=e.editing;this.isExporting=!1,this.mouseLeaveSkip=!0,this.isHooksExecuted=!1,n instanceof L.DistortableImage.Edit?(L.DistortableImage.action_map.e="_getExport",o=e.options.translation.exportImage):(L.DistortableImage.group_action_map.e="runExporter",o=e.options.translation.exportImages),(i=i||{}).toolbarIcon={svg:!0,html:"get_app",tooltip:o},L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){var t=this._overlay.editing;if(t instanceof L.DistortableImage.Edit)t._getExport();else if(!this.isHooksExecuted){this.isHooksExecuted=!0;var e=this._link.parentElement;this.mouseEnterHandler=this.handleMouseEnter.bind(this),this.mouseLeaveHandler=this.handleMouseLeave.bind(this),L.DomEvent.on(e,"click",(function(){if(this.isExporting){if(this.mouseLeaveSkip)return;this.resetState(),this.detachMouseEventListeners(e),t.cancelExport()}else this.isExporting=!0,this.renderExportIcon(),setTimeout(this.attachMouseEventListeners.bind(this,e),100),t.runExporter().then(function(){this.resetState(),this.detachMouseEventListeners(e)}.bind(this))}),this)}},resetState:function(){this.renderDownloadIcon(),this.isExporting=!1,this.mouseLeaveSkip=!0},attachMouseEventListeners:function(t){t.addEventListener("mouseenter",this.mouseEnterHandler),t.addEventListener("mouseleave",this.mouseLeaveHandler)},detachMouseEventListeners:function(t){t.removeEventListener("mouseenter",this.mouseEnterHandler),t.removeEventListener("mouseleave",this.mouseLeaveHandler)},handleMouseEnter:function(){this.renderCancelIcon()},handleMouseLeave:function(){this.mouseLeaveSkip?this.mouseLeaveSkip=!1:this.renderExportIcon()},renderDownloadIcon:function(){L.IconUtil.toggleXlink(this._link,"get_app","spinner"),L.IconUtil.toggleTitle(this._link,"Export Images","Loading..."),L.DomUtil.removeClass(this._link.firstChild,"loader")},renderExportIcon:function(){L.IconUtil.toggleXlink(this._link,"spinner"),L.IconUtil.toggleTitle(this._link,"Export Images","Loading..."),L.IconUtil.addClassToSvg(this._link,"loader")},renderCancelIcon:function(){L.IconUtil.toggleXlink(this._link,"cancel"),L.IconUtil.toggleTitle(this._link,"Cancel Export","Loading..."),L.DomUtil.removeClass(this._link.firstChild,"loader")}})},74:function(){L.FreeRotateAction=L.EditAction.extend({initialize:function(t,e,i){(i=i||{}).toolbarIcon={svg:!0,html:"crop_rotate",tooltip:e.options.translation.freeRotateImage,className:"freeRotate"},L.DistortableImage.action_map.f="_freeRotateMode",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){this._overlay.editing._freeRotateMode()}})},691:function(){L.GeolocateAction=L.EditAction.extend({initialize:function(t,e,i){var o=e.editing;(i=i||{}).toolbarIcon={svg:!0,html:"explore",tooltip:e.options.translation.geolocateImage,className:"lock"===o._mode?"disabled":""},L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){var t=this._overlay.getElement();EXIF.getData(t,L.EXIF(t))}})},105:function(){L.LockAction=L.EditAction.extend({initialize:function(t,e,i){var o,n,a=e.editing;a instanceof L.DistortableImage.Edit?(L.DistortableImage.action_map.u="_unlock",L.DistortableImage.action_map.l="_lock",n=e.options.translation.lockMode,o=a.isMode("lock")?"lock":"unlock"):(L.DistortableImage.group_action_map.l="_lockGroup",n=e.options.translation.lockImages,o="lock"),(i=i||{}).toolbarIcon={svg:!0,html:o,tooltip:n,className:"lock"},L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){var t=this._overlay.editing;t instanceof L.DistortableImage.Edit?t._toggleLockMode():t._lockGroup()}})},944:function(){L.OpacityAction=L.EditAction.extend({initialize:function(t,e,i){var o,n,a=e.editing,s=a._mode;a._transparent?(o="opacity_empty",n=e.options.translation.makeImageOpaque):(o="opacity",n=e.options.translation.makeImageTransparent),(i=i||{}).toolbarIcon={svg:!0,html:o,tooltip:n,className:"lock"===s?"disabled":""},L.DistortableImage.action_map.o="lock"===s?"":"_toggleOpacity",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){var t=this._overlay.editing,e=this._link;L.IconUtil.toggleXlink(e,"opacity","opacity_empty"),L.IconUtil.toggleTitle(e,"Make Image Transparent","Make Image Opaque"),t._toggleOpacity()}})},954:function(){L.RestoreAction=L.EditAction.extend({initialize:function(t,e,i){var o=L.Utils.getNestedVal(e,"editing","_mode"),n=e.edited;(i=i||{}).toolbarIcon={svg:!0,html:"restore",tooltip:e.options.translation.restoreImage,className:n&&"lock"!==o?"":"disabled"},L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){var t=this._overlay;L.DomEvent.on(t,{edit:this._enableAction,restore:this._disableAction},this),t.restore()}})},178:function(){L.RotateAction=L.EditAction.extend({initialize:function(t,e,i){(i=i||{}).toolbarIcon={svg:!0,html:"rotate",tooltip:e.options.translation.rotateImage,className:"rotate"},L.DistortableImage.action_map.r="_rotateMode",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){this._overlay.editing._rotateMode()}})},547:function(){L.ScaleAction=L.EditAction.extend({initialize:function(t,e,i){(i=i||{}).toolbarIcon={svg:!0,html:"scale",tooltip:e.options.translation.scaleImage,className:"scale"},L.DistortableImage.action_map.s="_scaleMode",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){this._overlay.editing._scaleMode()}})},886:function(){L.StackAction=L.EditAction.extend({initialize:function(t,e,i){var o,n,a=e.editing;a._toggledImage?(o="flip_to_back",n=e.options.translation.stackToFront):(o="flip_to_front",n=e.options.translation.stackToBack),(i=i||{}).toolbarIcon={svg:!0,html:o,tooltip:n,className:"lock"===a._mode?"disabled":""},L.DistortableImage.action_map.q="lock"===a._mode?"":"_stackUp",L.DistortableImage.action_map.a="lock"===a._mode?"":"_stackDown",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){var t=this._overlay.editing;L.IconUtil.toggleXlink(this._link,"flip_to_front","flip_to_back"),L.IconUtil.toggleTitle(this._link,"Stack to Front","Stack to Back"),t._toggleOrder()}})},129:function(){L.UnlockAction=L.EditAction.extend({initialize:function(t,e,i){(i=i||{}).toolbarIcon={svg:!0,html:"unlock",tooltip:e.options.translation.unlockImages},L.DistortableImage.group_action_map.u="_unlockGroup",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){this._overlay.editing._unlockGroup()}})},743:function(){L.EXIF=function(t){if(0!==Object.keys(EXIF.getAllTags(t)).length){console.log(EXIF.getAllTags(t));var e=EXIF.getAllTags(t);void 0!==e.GPSLatitude&&void 0!==e.GPSLongitude&&(e.GPSLatitude[0],e.GPSLatitude[1],e.GPSLatitude[2],e.GPSLongitude[0],e.GPSLongitude[1],e.GPSLongitude[2],e.GPSLatitudeRef,e.GPSLongitudeRef),"T"===e.GPSImgDirectionRef||"M"===e.GPSImgDirectionRef?(Math.PI,e.GPSImgDirection.numerator,e.GPSImgDirection.denominator):console.log("No compass data found"),console.log("Orientation:",e.Orientation),(6===e.Orientation||8===e.Orientation||3===e.Orientation)&&Math.PI,void 0!==e.GPSAltitude&&void 0!==e.GPSAltitudeRef&&void 0!==e.GPSAltitude&&void 0!==e.GPSAltitudeRef&&(e.GPSAltitude.numerator,e.GPSAltitude.denominator,e.GPSAltitudeRef)}else alert("EXIF initialized. Press again to view data in console.")}},92:function(){L.DistortHandle=L.EditHandle.extend({options:{TYPE:"distort",icon:L.icon({iconUrl:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAChSURBVO3BIU4DURgGwNkvL2B6AkQTLBqP4QCoSm7DDXoBLBZHDbfgICAIZjEV3YTn9uVHdMZZtcnCfI13bIzxg0emg6Nm6QVbYz3jylEsXRrvwommb49X67jFkz80fR9Mb1YxTzqiWBSLYlEsikWxKBbFolgUi2JRLIpFsSgWxaJY03fHHOu40dH07bAzWCx9Ge/TiWbpHgdsjPGNB2f/yS+7xRCyiiZPJQAAAABJRU5ErkJggg==",iconSize:[32,32],iconAnchor:[16,16]})},_onHandleDrag:function(){this._handled.setCorner(this._corner,this.getLatLng())},updateHandle:function(){this.setLatLng(this._handled.getCorner(this._corner))}}),L.distortHandle=function(t,e,i){return new L.DistortHandle(t,e,i)}},194:function(){L.DragHandle=L.EditHandle.extend({options:{TYPE:"drag",icon:L.icon({iconUrl:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAsVJREFUeNrMVztLXEEUvnNVFAVBAhY2aRKbTZEHJNpYabuNjSgYg/GxdsmPSJkUAa/ZdVEX8mgWYVutbHxAHkVskjQBuUUgBISVhCQk3wnfwMlk1rusN1wHPubOzJlzvjlz5sxc01Ma/hUEwQnwDIjqc7uvgv9YYO86qgIwCXQbdNTlQ8kcCBHgBch8TcloF6oJGr6phk6EQAkfdz3zvgDr9Mr7Fg1fptEZoM8jsmrokpfsiIFO4IIjuE2v1EDmR4LRdlR5Gh51hj8D34ABtm8YTtqna0TgklIw5CgQguKxIojEjmFROg/MKQO27NkFAB+4wAPouGUJiIvWKHwbAxX2XyWRKWkqhT+pbJntJZJuUzISW0+5hW+obxrVBsfvoH/dqCCJuU97GBh2VteLSiYvArmErT8EVoAK9Bw7enbpVYmvAQlyowYforrH5jXL2rPHI/TKONDB7u9AlavdaTBPvPmazUeQuy8f7UomUgTEwIJPEQ3sQGE/6ll2l9H/KcEzBcfWn2IclluM3DpddJxSHujlFkscbUPvmB0LHVnLrId7nlaZVkEc6QGXQI1MAwZcWmVRHeNaQwJMMiU2cwy4s7p/RJ2ckpvIQs+cIs+5GzitloLKHUV3MPREuXbTOKO91dX387gGTONxIgEWm+E61FFrpcyqXLHsEwiDjEsjAksqw5XPoL9MHVrn6QR4q+XZrDaR4RoWzq2ymafuRA/Mq1stSsHLVkcbdf9VjOcx8ZH3+SFWcCWlVPyWuUBOwUWdC1wP5NVjYiXFWLO69PZ6CRTUY6KSIoEKdf6T3IzzgHxnsyHctNBEkmn6Oob8ExUDg/ahGybd177cDjzH5xHwgDiSvoS7I/LZyvxJZj0wod7tkX5G0XVC7rEyLhfLJjBGbKoLLEfZWObyKeZ6oY82g+yf5Zn/mJyHX7PMf04z/T3/LcAAu4E6iiyJqf0AAAAASUVORK5CYII=",iconSize:[32,32],iconAnchor:[16,16]})},_onHandleDrag:function(){var t=this._handled,e=t.getCorner(this._corner),i=this.getLatLng();t.dragBy(e,i)},updateHandle:function(){this.setLatLng(this._handled.getCorner(this._corner))}}),L.dragHandle=function(t,e,i){return new L.DragHandle(t,e,i)}},988:function(){L.EditHandle=L.Marker.extend({initialize:function(t,e,i){var o=t.getCorner(e);L.setOptions(this,i),this._handled=t,this._corner=e;var n={draggable:!0,zIndexOffset:10};i&&i.hasOwnProperty("draggable")&&(n.draggable=i.draggable),L.Marker.prototype.initialize.call(this,o,n)},onAdd:function(t){L.Marker.prototype.onAdd.call(this,t),this._bindListeners(),this.updateHandle()},onRemove:function(t){this._unbindListeners(),L.Marker.prototype.onRemove.call(this,t)},_onHandleDragStart:function(){this._handled.fire("editstart")},_onHandleDragEnd:function(){this._fireEdit()},_fireEdit:function(){this._handled.edited=!0,this._handled.fire("edit")},_bindListeners:function(){this.on({contextmenu:L.DomEvent.stop,dragstart:this._onHandleDragStart,drag:this._onHandleDrag,dragend:this._onHandleDragEnd},this),this._handled._map.on("zoomend",this.updateHandle,this),this._handled.on("update",this.updateHandle,this)},_unbindListeners:function(){this.off({contextmenu:L.DomEvent.stop,dragstart:this._onHandleDragStart,drag:this._onHandleDrag,dragend:this._onHandleDragEnd},this),this._handled._map.off("zoomend",this.updateHandle,this),this._handled.off("update",this.updateHandle,this)},_calculateScalingFactor:function(t,e){var i=this._handled,o=i._map,n=o.latLngToLayerPoint(i.getCenter()),a=o.latLngToLayerPoint(t),s=o.latLngToLayerPoint(e),r=this._d2(n,a),l=this._d2(n,s);return Math.sqrt(l/r)},_d2:function(t,e){var i=t.x-e.x,o=t.y-e.y;return Math.pow(i,2)+Math.pow(o,2)},calculateAngleDelta:function(t,e){var i=this._handled,o=i._map,n=o.latLngToLayerPoint(i.getCenter()),a=o.latLngToLayerPoint(t),s=o.latLngToLayerPoint(e),r=Math.atan2(n.y-a.y,n.x-a.x);return Math.atan2(n.y-s.y,n.x-s.x)-r}})},206:function(){L.FreeRotateHandle=L.EditHandle.extend({options:{TYPE:"freeRotate",icon:L.icon({iconUrl:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAHiSURBVMXBa3HbShgA0PMp/1sCCo8oCEpgTaCXgIXAJiDzyCJoAUTm4UVQAns1Y8+snWnTvJyeE16hkjDgDrfoNTMKcpC9UPiLSo8JyetkjEHxjPCMyoS199kFoz8Iv1HpMaN3qWDCHoegOKkkRwnJpRmroHgiPFEZ8IBekzEGxQtUEhKSS/fB7Ew4U+lxcGkVZG9QWWPSFAxBcdK59KApuA+yNwp2uEdx1GN25sZJZULSfAtm77SlbNjju6MvG75u+WHRWVR6rDVjMPsgwYyVZl3pLTpHkyYHOx8syMiayaJzlDTZ9YyaZNFVkiYH2ZUEBcVJJXVImuz6Js3Qofe59pq7DoOTILu+g+a288mCouk7/1iH4qTS+2QdDppbV1ZJmrnDXnPnc5UOs2Z0fUmTuyBr+krvSioJyUmQO0dZM7mepMkWnaNRkyrJB6uskTSjxY3Fll8bvmJwlDb83FJ8gMqAB80uyBY3Trb82PAfvjj6vuHnluIdKgMeNXOwctK5NKBoHitrb1RJeHRp5Ux4ojLg0aWMHGQvUOkxIWkKVsHsTPiNSo8HDC5lZIsgO6n0uMUdRvQuFQxB8UR4RmXC2vvsgtEfhL+o9JiQvE7GGBTPCK9QSUjoMWgKDthjDrIX+h/k0I7gth6N5gAAAABJRU5ErkJggg==",iconSize:[32,32],iconAnchor:[16,16]})},_onHandleDrag:function(){var t=this._handled,e=t._map,i=t.getCorner(this._corner),o=this.getLatLng(),n=this.calculateAngleDelta(i,o),a=this._calculateScalingFactor(i,o);0!==n&&t.rotateBy(n,"rad");var s=t.edgeMinWidth;s||(s=50);var r=e.latLngToContainerPoint(t.getCorner(0)),l=e.latLngToContainerPoint(t.getCorner(1)),c=Math.abs(r.x-l.x),d=Math.abs(r.y-l.y);Math.sqrt(c*c+d*d)>s||a>1?t.scaleBy(a):t.scaleBy(1)},updateHandle:function(){this.setLatLng(this._handled.getCorner(this._corner))}}),L.freeRotateHandle=function(t,e,i){return new L.FreeRotateHandle(t,e,i)}},789:function(){L.LockHandle=L.EditHandle.extend({options:{TYPE:"lock",interactive:!1,icon:L.icon({iconUrl:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAD8SURBVO3BPU7CYAAA0AdfjIcQlRCQBG7C3gk2uIPG2RC3Dk16Gz0FTO1WZs/gwGCMP/2+xsSl7+n1er1Iz9LtRQjaPeMeO+TinLDCJV78YqjdA04YodKuxhUaPGoRxMmxwRQZSt87Yo4KExGCeAUyLLFB4bMacxywEClIU2KDKXbInTUYo8JCgoFuGoxQO5uiwY1EA91VmDqrcKeDoX8WdNNgjApvmGGLXKIgXY0xGkxQYItrrFFIEKQ5Yo4KEx9yrDFDhlKkIF6NOQ5Y+KpAhiXWKEQI4pxwiwoLPyuxwQw75FoE7fZYocFEuwI7jHCBV39gL92TXq/Xi/AOcmczZmaIMScAAAAASUVORK5CYII=",iconSize:[32,32],iconAnchor:[16,16]})},onRemove:function(t){this.unbindTooltip(),L.EditHandle.prototype.onRemove.call(this,t)},_bindListeners:function(){var t=this.getElement();L.EditHandle.prototype._bindListeners.call(this),L.DomEvent.on(t,{mousedown:this._tooltipOn,mouseup:this._tooltipOff},this),L.DomEvent.on(document,"pointerleave",this._tooltipOff,this)},_unbindListeners:function(){var t=this.getElement();L.EditHandle.prototype._bindListeners.call(this),L.DomEvent.off(t,{mousedown:this._tooltipOn,mouseup:this._tooltipOff},this),L.DomEvent.off(document,"pointerleave",this._tooltipOff,this)},_onHandleDrag:function(){},updateHandle:function(){this.setLatLng(this._handled.getCorner(this._corner))},_tooltipOn:function(t){var e=this._handled.parentGroup,i=e?e.editing:this._handled.editing;if(!t.shiftKey&&(this._handled.isSelected()||!e||e.isCollected(this._handled))){var o=i._lockHandles;this._timer=setTimeout(L.bind((function(){this._timeout&&clearTimeout(this._timeout),this.getTooltip()?o.eachLayer((function(t){this!==t&&t.closeTooltip()})):this.bindTooltip("Locked!",{permanent:!0}),this.openTooltip()}),this),500)}},_tooltipOff:function(t){var e=this._handled.parentGroup,i=e?e.editing:this._handled.editing;if(!t.shiftKey&&(this._handled.isSelected()||!e||e.isCollected(this._handled))){var o=i._lockHandles;t.currentTarget===document&&o.eachLayer((function(t){t.closeTooltip()})),this._timer&&clearTimeout(this._timer),this._timeout=setTimeout(L.bind((function(){this.closeTooltip()}),this),400)}}}),L.lockHandle=function(t,e,i){return new L.LockHandle(t,e,i)}},337:function(){L.RotateHandle=L.EditHandle.extend({options:{TYPE:"rotate",icon:L.icon({iconUrl:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAHiSURBVMXBa3HbShgA0PMp/1sCCo8oCEpgTaCXgIXAJiDzyCJoAUTm4UVQAns1Y8+snWnTvJyeE16hkjDgDrfoNTMKcpC9UPiLSo8JyetkjEHxjPCMyoS199kFoz8Iv1HpMaN3qWDCHoegOKkkRwnJpRmroHgiPFEZ8IBekzEGxQtUEhKSS/fB7Ew4U+lxcGkVZG9QWWPSFAxBcdK59KApuA+yNwp2uEdx1GN25sZJZULSfAtm77SlbNjju6MvG75u+WHRWVR6rDVjMPsgwYyVZl3pLTpHkyYHOx8syMiayaJzlDTZ9YyaZNFVkiYH2ZUEBcVJJXVImuz6Js3Qofe59pq7DoOTILu+g+a288mCouk7/1iH4qTS+2QdDppbV1ZJmrnDXnPnc5UOs2Z0fUmTuyBr+krvSioJyUmQO0dZM7mepMkWnaNRkyrJB6uskTSjxY3Fll8bvmJwlDb83FJ8gMqAB80uyBY3Trb82PAfvjj6vuHnluIdKgMeNXOwctK5NKBoHitrb1RJeHRp5Ux4ojLg0aWMHGQvUOkxIWkKVsHsTPiNSo8HDC5lZIsgO6n0uMUdRvQuFQxB8UR4RmXC2vvsgtEfhL+o9JiQvE7GGBTPCK9QSUjoMWgKDthjDrIX+h/k0I7gth6N5gAAAABJRU5ErkJggg==",iconSize:[32,32],iconAnchor:[16,16]})},_onHandleDrag:function(){var t=this._handled,e=t.getCorner(this._corner),i=this.getLatLng(),o=this.calculateAngleDelta(e,i);t.rotateBy(o,"rad")},updateHandle:function(){this.setLatLng(this._handled.getCorner(this._corner))}}),L.rotateHandle=function(t,e,i){return new L.RotateHandle(t,e,i)}},350:function(){L.ScaleHandle=L.EditHandle.extend({options:{TYPE:"scale",icon:L.icon({iconUrl:"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2ZXJzaW9uPSIxLjEiIHdpZHRoPSI0NTkiIGhlaWdodD0iNDY0IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCA1MTIgNTEyIiB4bWw6c3BhY2U9InByZXNlcnZlIiBzdHlsZT0iIj48cmVjdCBpZD0iYmFja2dyb3VuZHJlY3QiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIHg9IjAiIHk9IjAiIGZpbGw9Im5vbmUiIHN0cm9rZT0ibm9uZSIgY2xhc3M9IiIgc3R5bGU9IiIvPjxnIGNsYXNzPSJjdXJyZW50TGF5ZXIiIHN0eWxlPSIiPjx0aXRsZT5MYXllciAxPC90aXRsZT48cGF0aCBkPSJNNDU5LjA0OTE1OTUzMDQ3MTM0LDg2LjkyNjIzNDUxMjU1MDAyIFYwIGgtODUuNzE0NTczMzU2MzEyMDkgdjI3LjA0MzcxNzQwMzkwNDQ1MiBIODUuNzE0NTczMzU2MzEyMDMgVjAgSDAgdjg2LjkyNjIzNDUxMjU1MDAyIGgyNS43MTQzNzIwMDY4OTM2MjYgdjI4OS43NTQxMTUwNDE4MzM0IEgwIHY4Ni45MjYyMzQ1MTI1NTAwMiBoODUuNzE0NTczMzU2MzEyMDkgdi0yNy4wNDM3MTc0MDM5MDQ0NTIgaDI4NS43MTUyNDQ1MjEwNDAzIHYyNy4wNDM3MTc0MDM5MDQ0NTIgaDg1LjcxNDU3MzM1NjMxMjA5IHYtODYuOTI2MjM0NTEyNTUwMDIgaC0yMy44MDk2MDM3MTAwODY2OSBWODYuOTI2MjM0NTEyNTUwMDIgSDQ1OS4wNDkxNTk1MzA0NzEzNCB6TTM4NC43NjMxOTU5NTUwMDA5LDEyLjU1NjAxMTY1MTgxMjc4MSBoNjEuOTA0OTY5NjQ2MjI1Mzk2IHY2Mi43ODAwNTgyNTkwNjM5MSBoLTYxLjkwNDk2OTY0NjIyNTM5NiBWMTIuNTU2MDExNjUxODEyNzgxIHpNMTIuMzgwOTkzOTI5MjQ1MDUsMTIuNTU2MDExNjUxODEyNzgxIGg2MS45MDQ5Njk2NDYyMjUzOTYgdjYyLjc4MDA1ODI1OTA2MzkxIEgxMi4zODA5OTM5MjkyNDUwNSBWMTIuNTU2MDExNjUxODEyNzgxIHpNNzQuMjg1OTYzNTc1NDcwNTMsNDUxLjA1MDU3MjQxNTEyMDY2IEgxMi4zODA5OTM5MjkyNDUwNSB2LTYyLjc4MDA1ODI1OTA2MzkxIGg2MS45MDQ5Njk2NDYyMjUzOTYgVjQ1MS4wNTA1NzI0MTUxMjA2NiB6TTQ0NS43MTU3ODE0NTI4MjI3NCw0NTEuMDUwNTcyNDE1MTIwNjYgaC02Mi44NTczNTM3OTQ2Mjg4NjQgdi02Mi43ODAwNTgyNTkwNjM5MSBoNjIuODU3MzUzNzk0NjI4ODY0IFY0NTEuMDUwNTcyNDE1MTIwNjYgek00MDcuNjIwNDE1NTE2Njg0MjYsMzc2LjY4MDM0OTU1NDM4MzQ0IGgtMzYuMTkwNTk3NjM5MzMxNzcgdjMyLjgzODc5OTcwNDc0MTEyIEg4NS43MTQ1NzMzNTYzMTIwMyB2LTMyLjgzODc5OTcwNDc0MTEyIEg0OS41MjM5NzU3MTY5ODAzMiBWODYuOTI2MjM0NTEyNTUwMDIgaDM2LjE5MDU5NzYzOTMzMTc3IFY1MC4yMjQwNDY2MDcyNTExMjUgaDI4Ny42MjAwMTI4MTc4NDcyIHYzNi43MDIxODc5MDUyOTg5IGgzNC4yODU4MjkzNDI1MjQ4MzUgVjM3Ni42ODAzNDk1NTQzODM0NCB6IiBpZD0ic3ZnXzIiIGNsYXNzPSIiIGZpbGw9IiMxYTFhZWIiIGZpbGwtb3BhY2l0eT0iMSIvPjwvZz48L3N2Zz4=",iconSize:[32,32],iconAnchor:[16,16]})},_onHandleDrag:function(){var t=this._handled,e=t._map,i=t.edgeMinWidth,o=t.getCorner(this._corner),n=this.getLatLng(),a=this._calculateScalingFactor(o,n);i||(i=50);var s=e.latLngToLayerPoint(t.getCorner(0)),r=e.latLngToLayerPoint(t.getCorner(1)),l=Math.abs(s.x-r.x),c=Math.abs(s.y-r.y);Math.sqrt(l*l+c*c)>i||a>1?t.scaleBy(a):t.scaleBy(1)},updateHandle:function(){this.setLatLng(this._handled.getCorner(this._corner))}}),L.scaleHandle=function(t,e,i){return new L.ScaleHandle(t,e,i)}},719:function(){L.distortableImage=L.DistortableImage||{},L.distortableImage=L.DistortableImage,L.DistortableImage.group_action_map={},L.DistortableImage.ControlBar=L.Toolbar2.Control.extend({}),L.distortableImage.controlBar=function(t){return new L.DistortableImage.ControlBar(t)},L.DistortableCollection.addInitHook((function(){this.ACTIONS=[L.ExportAction,L.DeleteAction,L.LockAction,L.UnlockAction],L.DistortableCollection.Edit.MODES={lock:L.LockAction,unlock:L.UnlockAction};var t=this.options.actions?this.options.actions:this.ACTIONS;this.editing=L.distortableCollection.edit(this,{actions:t})}))},93:function(){L.DistortableImage=L.DistortableImage||{},L.distortableImage=L.DistortableImage,L.DistortableImage.action_map={},L.DistortableImage.PopupBar=L.Toolbar2.Popup.extend({options:{anchor:[0,-10]},initialize:function(t,e){L.setOptions(this,e),L.Toolbar2.Popup.prototype.initialize.call(this,t,e)},addHooks:function(t,e){this.map=t,this.ov=e},tools:function(){if(this._ul)return this._ul.children},clickTool:function(t){for(var e=this.tools(),i=0;i',_symbols:"",render:function(){return this.addSymbols(this._symbols),this._svg},addSymbols:function(t){this._svg+=t}})},261:function(){L.KeymapperIconSet=L.IconSet.extend({_symbols:''})},929:function(){L.ToolbarIconSet=L.IconSet.extend({_symbols:''})},496:function(){L.Map.mergeOptions({boxCollector:!0,boxZoom:!1}),L.Map.BoxCollector=L.Map.BoxZoom.extend({initialize:function(t){this._map=t,this._container=t._container,this._pane=t._panes.overlayPane,this._resetStateTimeout=0,t.on("unload",this._destroy,this)},addHooks:function(){L.DomEvent.on(this._container,"mousedown",this._onMouseDown,this)},removeHooks:function(){L.DomEvent.off(this._container,"mousedown",this._onMouseDown,this)},moved:function(){return this._moved},_destroy:function(){L.DomUtil.remove(this._pane),delete this._pane},_resetState:function(){this._resetStateTimeout=0,this._moved=!1},_clearDeferredResetState:function(){0!==this._resetStateTimeout&&(clearTimeout(this._resetStateTimeout),this._resetStateTimeout=0)},_onMouseDown:function(t){if(!t.shiftKey||1!==t.which&&1!==t.button)return!1;this._clearDeferredResetState(),this._resetState(),L.DomUtil.disableTextSelection(),L.DomUtil.disableImageDrag(),this._startPoint=this._map.mouseEventToContainerPoint(t),L.DomEvent.on(document,{contextmenu:L.DomEvent.stop,mousemove:this._onMouseMove,mouseup:this._onMouseUp},this)},_onMouseMove:function(t){this._moved||(this._moved=!0,this._box=L.DomUtil.create("div","leaflet-zoom-box",this._container),L.DomUtil.addClass(this._container,"leaflet-crosshair"),this._map.fire("boxzoomstart")),this._point=this._map.mouseEventToContainerPoint(t),this._bounds=L.bounds(this._startPoint,this._point);var e=this._bounds.getSize();L.DomUtil.setPosition(this._box,this._bounds.min),this._box.style.width=e.x+"px",this._box.style.height=e.y+"px"},_finish:function(){this._moved&&(L.DomUtil.remove(this._box),L.DomUtil.removeClass(this._container,"leaflet-crosshair")),L.DomUtil.enableTextSelection(),L.DomUtil.enableImageDrag(),L.DomEvent.off(document,{contextmenu:L.DomEvent.stop,mousemove:this._onMouseMove,mouseup:this._onMouseUp},this)},_onMouseUp:function(t){if((1===t.which||1===t.button)&&(this._finish(),this._moved)){this._clearDeferredResetState(),this._resetStateTimeout=setTimeout(L.Util.bind(this._resetState,this),0);var e=L.latLngBounds(this._map.containerPointToLatLng(this._bounds.getBottomLeft()),this._map.containerPointToLatLng(this._bounds.getTopRight())),i=this._map.getZoom(),o=this._map.getCenter();e=this._map._latLngBoundsToNewLayerBounds(e,i,o),this._map.fire("boxcollectend",{boxCollectBounds:e})}}}),L.Map.addInitHook("addHandler","boxCollector",L.Map.BoxCollector)},291:function(){L.Map.mergeOptions({doubleClickLabels:!0}),L.Map.DoubleClickLabels=L.Map.DoubleClickZoom.extend({enable:function(){var t=this._map;return this._enabled||(t.doubleClickZoom.enabled()&&t.doubleClickZoom.disable(),this._map.fire("singleclickon"),this._enabled=!0,this.addHooks()),this},disable:function(){return this._enabled?(this._enabled=!1,this.removeHooks(),this):this},_fireIfSingle:function(t){var e=this._map,i=t.originalEvent;i&&i.shiftKey||(e._clicked+=1,this._map._clickTimeout=setTimeout((function(){1===e._clicked?(e._clicked=0,e.fire("singleclick",{type:"singleclick"})):L.Browser.touch&&i&&i.sourceCapabilities.firesTouchEvents&&e.fire("dblclick")}),250))},_onDoubleClick:function(){var t=this._map,e=t._labels;setTimeout((function(){t._clicked=0,clearTimeout(t._clickTimeout)}),0),e&&(1===e.options.opacity?(e.options.opacity=0,e.setOpacity(0)):(e.options.opacity=1,e.setOpacity(1)))}}),L.Map.addInitHook("addHandler","doubleClickLabels",L.Map.DoubleClickLabels)},752:function(){L.Map.DoubleClickZoom.include({addHooks:function(){this._map.on({click:this._fireIfSingle,dblclick:this._onDoubleClick},this)},removeHooks:function(){this._map.off({click:this._fireIfSingle,dblclick:this._onDoubleClick},this)},enable:function(){return this._enabled||this._map.doubleClickLabels&&this._map.doubleClickLabels.enabled()||(this._map.fire("singleclickon"),this._enabled=!0,this.addHooks()),this},disable:function(){return this._enabled?(this._map.fire("singleclickoff"),this._enabled=!1,this.removeHooks(),this):this},_fireIfSingle:function(t){var e=this._map,i=t.originalEvent;i&&i.shiftKey||(e._clicked+=1,this._map._clickTimeout=setTimeout((function(){1===e._clicked?(e._clicked=0,e.fire("singleclick",{type:"singleclick"})):L.Browser.touch&&i&&i.sourceCapabilities.firesTouchEvents&&e._fireDOMEvent(i,"dblclick",[e])}),250))},_onDoubleClick:function(t){var e=this._map,i=t.originalEvent;if(setTimeout((function(){e._clicked=0,clearTimeout(e._clickTimeout)}),0),!i)return!1;var o=e.getZoom(),n=e.options.zoomDelta,a=i.shiftKey?o-n:o+n;"center"===e.options.doubleClickZoom?e.setZoom(a):e.setZoomAround(t.containerPoint,a)}})},131:function(){L.Map.include({_clicked:0,addGoogleMutant:function(t){return(t=this.mutantOptions=L.extend({mutantOpacity:.8,maxZoom:24,maxNativeZoom:20,minZoom:0,labels:!0,labelOpacity:1,doubleClickLabels:!0},t)).labels||(this.mutantOptions=L.extend(this.mutantOptions,{labelOpacity:t.labels?1:void 0,doubleClickLabels:!!t.labels||void 0})),this._googleMutant=L.tileLayer("http://mt0.google.com/vt/lyrs=s&x={x}&y={y}&z={z}",{maxZoom:t.maxZoom,maxNativeZoom:t.maxNativeZoom,minZoom:t.minZoom,opacity:t.mutantOpacity}).addTo(this),t.labels?this._addLabels(t):this.doubleClickLabels=void 0,this},_addLabels:function(t){return 0!==t.labelOpacity&&1!==t.labelOpacity&&(t.labelOpacity=1),this._labels=L.tileLayer("https://stamen-tiles-{s}.a.ssl.fastly.net/toner-labels/{z}/{x}/{y}{r}.{ext}",{attribution:'Map tiles by Stamen Design, CC BY 3.0 — Map data © OpenStreetMap contributors',subdomains:"abcd",interactive:!1,opacity:t.labelOpacity,maxZoom:t.maxZoom,maxNativeZoom:t.maxNativeZoom,minZoom:t.minZoom,ext:"png"}).addTo(this),this.mutantOptions.doubleClickLabels&&this.doubleClickLabels.enable(),this}}),L.Map.addInitHook((function(){this.doubleClickLabels.disable(),this.doubleClickZoom.enable()}))},999:function(){L.DomUtil=L.extend(L.DomUtil,{initTranslation:function(t){this.translation=t},getMatrixString:function(t){var e=L.Browser.webkit3d||L.Browser.gecko3d||L.Browser.ie3d,i=[t[0],t[3],0,t[6],t[1],t[4],0,t[7],0,0,1,0,t[2],t[5],0,t[8]],o=e?"matrix3d("+i.join(",")+")":"";return e||console.log("Your browser must support 3D CSS transformsin order to use DistortableImageOverlay."),o},toggleClass:function(t,e){var i=e;return this.hasClass(t,i)?this.removeClass(t,i):this.addClass(t,i)},confirmDelete:function(){return window.confirm(this.translation.confirmImageDelete)},confirmDeletes:function(t){if(1===t)return this.confirmDelete();var e,i=this.translation.confirmImagesDeletes;return e="function"==typeof i?i(t):i,window.confirm(e)}})},85:function(){L.IconUtil={create:function(t){return/^#/.test(t)&&(t=t.replace(/^#/,"")),''},addClassToSvg:function(t,e){var i=t.querySelector("svg");i&&L.DomUtil.addClass(i,e)},toggleXlink:function(t,e,i){/^#/.test(e)||(e="#"+e),/^#/.test(i)||(i="#"+i);var o=t.querySelector("use");if(o){var n=o.getAttribute("xlink:href")===e?i:e;return o.setAttribute("xlink:href",n),n}return!1},toggleTitle:function(t,e,i){var o=t.getAttribute("title")===e?i:e;return t.setAttribute("title",o),t.hasAttribute("aria-label")&&t.setAttribute("aria-label",o),o}}},351:function(){L.ImageUtil={getCmPerPixel:function(t){var e=t._map;return 100*e.latLngToLayerPoint(t.getCorner(0)).distanceTo(e.latLngToLayerPoint(t.getCorner(1)))/t.getElement().width}}},360:function(){L.MatrixUtil={adj:function(t){return[t[4]*t[8]-t[5]*t[7],t[2]*t[7]-t[1]*t[8],t[1]*t[5]-t[2]*t[4],t[5]*t[6]-t[3]*t[8],t[0]*t[8]-t[2]*t[6],t[2]*t[3]-t[0]*t[5],t[3]*t[7]-t[4]*t[6],t[1]*t[6]-t[0]*t[7],t[0]*t[4]-t[1]*t[3]]},multmm:function(t,e){var i,o=[];for(i=0;i<3;i++)for(var n=0;n<3;n++){for(var a=0,s=0;s<3;s++)a+=t[3*i+s]*e[3*s+n];o[3*i+n]=a}return o},multmv:function(t,e){return[t[0]*e[0]+t[1]*e[1]+t[2]*e[2],t[3]*e[0]+t[4]*e[1]+t[5]*e[2],t[6]*e[0]+t[7]*e[1]+t[8]*e[2]]},multsm:function(t,e){for(var i=[],o=0,n=e.length;o2&&void 0!==arguments[2]?arguments[2]:"deg";return"deg"===i?this.radiansToDegrees(Math.atan2(e,t)):Math.atan2(e,t)},radiansToDegrees:function(t){return 180*t/Math.PI},degreesToRadians:function(t){return t*Math.PI/180}}},866:function(){L.Utils={initTranslation:function(){var t={deleteImage:"Delete Image",deleteImages:"Delete Images",distortImage:"Distort Image",dragImage:"Drag Image",exportImage:"Export Image",exportImages:"Export Images",removeBorder:"Remove Border",addBorder:"Add Border",freeRotateImage:"Free rotate Image",geolocateImage:"Geolocate Image",lockMode:"Lock Mode",lockImages:"Lock Images",makeImageOpaque:"Make Image Opaque",makeImageTransparent:"Make Image Transparent",restoreImage:"Restore Natural Image",rotateImage:"Rotate Image",scaleImage:"Scale Image",stackToFront:"Stack to Front",stackToBack:"Stack to Back",unlockImages:"Unlock Images",confirmImageDelete:"Are you sure? This image will be permanently deleted from the map.",confirmImagesDeletes:"Are you sure? These images will be permanently deleted from the map."};if(this.options.translation)for(var e in t)this.options.translation.hasOwnProperty(e)||(this.options.translation[e]=t[e]);else this.options.translation=t;L.DomUtil.initTranslation(this.options.translation)},getNestedVal:function(t,e,i){return[e,i].reduce((function(t,e){return t&&t[e]}),t)}}}};t[999](),t[85](),t[351](),t[360](),t[682](),t[866](),t[477](),t[808](),t[743](),t[988](),t[92](),t[194](),t[206](),t[789](),t[337](),t[350](),t[376](),t[261](),t[929](),t[280](),t[426](),t[114](),t[231](),t[541](),t[149](),t[74](),t[691](),t[105](),t[944](),t[954](),t[178](),t[547](),t[886](),t[129](),t[93](),t[719](),t[397](),t[428](),t[782](),t[752](),t[496](),t[291](),t[131]()}(); ->>>>>>> feature-suppresstooltip //# sourceMappingURL=leaflet.distortableimage.js.map \ No newline at end of file From f79faf8235454a3aa7ac3b663214a46c2dfc74c1 Mon Sep 17 00:00:00 2001 From: segun Date: Thu, 12 Jan 2023 17:16:34 +0100 Subject: [PATCH 40/57] update --- examples/js/archive.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/examples/js/archive.js b/examples/js/archive.js index 54169b3c1..8d65a5fc7 100644 --- a/examples/js/archive.js +++ b/examples/js/archive.js @@ -67,6 +67,8 @@ let fetchedFrom; const renderImages = (fullResImages, url) => { + // console.log('fullResImages-inside render images: ', fullResImages); + fullResImages.forEach((file) => { const imageRow = document.createElement('div'); const image = new Image(150, 150); @@ -95,6 +97,8 @@ const renderImages = (fullResImages, url) => { const renderThumbnails = (thumbnails = [], url, fullResImgs) => { const imagesToRender = thumbnails || fullResImgs; + console.log('imagesToRender-inside render thumbnail: ', imagesToRender); + imagesToRender.forEach((file) => { const imageRow = document.createElement('div'); const image = new Image(65, 65); @@ -132,10 +136,10 @@ function showImages(getUrl) { axios.get(url) .then((response) => { if (response.data.files && response.data.files.length != 0) { - response.data.files.forEach((file) => { - renderImages(file, url); + response.data.files.forEach(() => { imageTooltipText = response.data.metadata.description; }); + const imageThumbnails = response.data.files.filter(file => file.source === 'derivative'); const fullResImages = response.data.files.filter(file => file.format === 'PNG' || file.format === 'JPEG'); count = response.data.files.filter((file)=> { From 24c08afffbd3bd1a91a1ae26c8c22af7e484bb90 Mon Sep 17 00:00:00 2001 From: segun Date: Thu, 12 Jan 2023 17:25:23 +0100 Subject: [PATCH 41/57] fixed typo --- dist/leaflet.distortableimage.js | 4 ++-- src/DistortableImageOverlay.js | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/dist/leaflet.distortableimage.js b/dist/leaflet.distortableimage.js index fc47b5538..9fd3ad095 100644 --- a/dist/leaflet.distortableimage.js +++ b/dist/leaflet.distortableimage.js @@ -498,7 +498,7 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ mode: 'distort', selected: false, interactive: true, - tooltipText: 'Unknow image', + tooltipText: 'Unknown image', // default tooltipText tooltipOpen: false }, @@ -7318,7 +7318,7 @@ module.exports.formatError = function (err) { /******/ /******/ /* webpack/runtime/getFullHash */ /******/ !function() { -/******/ __webpack_require__.h = function() { return "e9590d49f7739dc9f26a"; } +/******/ __webpack_require__.h = function() { return "1599ccb50a3537105b01"; } /******/ }(); /******/ /******/ /* webpack/runtime/hasOwnProperty shorthand */ diff --git a/src/DistortableImageOverlay.js b/src/DistortableImageOverlay.js index dcc7fb3be..05b3d1501 100644 --- a/src/DistortableImageOverlay.js +++ b/src/DistortableImageOverlay.js @@ -9,7 +9,7 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ mode: 'distort', selected: false, interactive: true, - tooltipText: 'Unknow image', // default tooltipText + tooltipText: 'Unknown image', // default tooltipText tooltipOpen: false, }, From 0afd5d77ec9a12c4bd14b863db4075d2abf8c797 Mon Sep 17 00:00:00 2001 From: segun Date: Mon, 16 Jan 2023 21:23:51 +0100 Subject: [PATCH 42/57] non-switchable tooltip --- dist/leaflet.distortableimage.js | 8339 +----------------------------- examples/archive.css | 20 - examples/archive.html | 1 - examples/js/archive.js | 50 +- src/DistortableImageOverlay.js | 29 +- 5 files changed, 17 insertions(+), 8422 deletions(-) delete mode 100644 examples/archive.css diff --git a/dist/leaflet.distortableimage.js b/dist/leaflet.distortableimage.js index c6fb3caad..19cbfd3c0 100644 --- a/dist/leaflet.distortableimage.js +++ b/dist/leaflet.distortableimage.js @@ -1,8339 +1,2 @@ -/******/ (function() { // webpackBootstrap -/******/ var __webpack_modules__ = ({ - -/***/ "./node_modules/ansi-html-community/index.js": -/*!***************************************************!*\ - !*** ./node_modules/ansi-html-community/index.js ***! - \***************************************************/ -/***/ (function(module) { - -"use strict"; - - -module.exports = ansiHTML - -// Reference to https://github.com/sindresorhus/ansi-regex -var _regANSI = /(?:(?:\u001b\[)|\u009b)(?:(?:[0-9]{1,3})?(?:(?:;[0-9]{0,3})*)?[A-M|f-m])|\u001b[A-M]/ - -var _defColors = { - reset: ['fff', '000'], // [FOREGROUD_COLOR, BACKGROUND_COLOR] - black: '000', - red: 'ff0000', - green: '209805', - yellow: 'e8bf03', - blue: '0000ff', - magenta: 'ff00ff', - cyan: '00ffee', - lightgrey: 'f0f0f0', - darkgrey: '888' -} -var _styles = { - 30: 'black', - 31: 'red', - 32: 'green', - 33: 'yellow', - 34: 'blue', - 35: 'magenta', - 36: 'cyan', - 37: 'lightgrey' -} -var _openTags = { - '1': 'font-weight:bold', // bold - '2': 'opacity:0.5', // dim - '3': '', // italic - '4': '', // underscore - '8': 'display:none', // hidden - '9': '' // delete -} -var _closeTags = { - '23': '', // reset italic - '24': '', // reset underscore - '29': '' // reset delete -} - -;[0, 21, 22, 27, 28, 39, 49].forEach(function (n) { - _closeTags[n] = '' -}) - -/** - * Converts text with ANSI color codes to HTML markup. - * @param {String} text - * @returns {*} - */ -function ansiHTML (text) { - // Returns the text if the string has no ANSI escape code. - if (!_regANSI.test(text)) { - return text - } - - // Cache opened sequence. - var ansiCodes = [] - // Replace with markup. - var ret = text.replace(/\033\[(\d+)m/g, function (match, seq) { - var ot = _openTags[seq] - if (ot) { - // If current sequence has been opened, close it. - if (!!~ansiCodes.indexOf(seq)) { // eslint-disable-line no-extra-boolean-cast - ansiCodes.pop() - return '' - } - // Open tag. - ansiCodes.push(seq) - return ot[0] === '<' ? ot : '' - } - - var ct = _closeTags[seq] - if (ct) { - // Pop sequence - ansiCodes.pop() - return ct - } - return '' - }) - - // Make sure tags are closed. - var l = ansiCodes.length - ;(l > 0) && (ret += Array(l + 1).join('')) - - return ret -} - -/** - * Customize colors. - * @param {Object} colors reference to _defColors - */ -ansiHTML.setColors = function (colors) { - if (typeof colors !== 'object') { - throw new Error('`colors` parameter must be an Object.') - } - - var _finalColors = {} - for (var key in _defColors) { - var hex = colors.hasOwnProperty(key) ? colors[key] : null - if (!hex) { - _finalColors[key] = _defColors[key] - continue - } - if ('reset' === key) { - if (typeof hex === 'string') { - hex = [hex] - } - if (!Array.isArray(hex) || hex.length === 0 || hex.some(function (h) { - return typeof h !== 'string' - })) { - throw new Error('The value of `' + key + '` property must be an Array and each item could only be a hex string, e.g.: FF0000') - } - var defHexColor = _defColors[key] - if (!hex[0]) { - hex[0] = defHexColor[0] - } - if (hex.length === 1 || !hex[1]) { - hex = [hex[0]] - hex.push(defHexColor[1]) - } - - hex = hex.slice(0, 2) - } else if (typeof hex !== 'string') { - throw new Error('The value of `' + key + '` property must be a hex string, e.g.: FF0000') - } - _finalColors[key] = hex - } - _setTags(_finalColors) -} - -/** - * Reset colors. - */ -ansiHTML.reset = function () { - _setTags(_defColors) -} - -/** - * Expose tags, including open and close. - * @type {Object} - */ -ansiHTML.tags = {} - -if (Object.defineProperty) { - Object.defineProperty(ansiHTML.tags, 'open', { - get: function () { return _openTags } - }) - Object.defineProperty(ansiHTML.tags, 'close', { - get: function () { return _closeTags } - }) -} else { - ansiHTML.tags.open = _openTags - ansiHTML.tags.close = _closeTags -} - -function _setTags (colors) { - // reset all - _openTags['0'] = 'font-weight:normal;opacity:1;color:#' + colors.reset[0] + ';background:#' + colors.reset[1] - // inverse - _openTags['7'] = 'color:#' + colors.reset[1] + ';background:#' + colors.reset[0] - // dark grey - _openTags['90'] = 'color:#' + colors.darkgrey - - for (var code in _styles) { - var color = _styles[code] - var oriColor = colors[color] || '000' - _openTags[code] = 'color:#' + oriColor - code = parseInt(code) - _openTags[(code + 10).toString()] = 'background:#' + oriColor - } -} - -ansiHTML.reset() - - -/***/ }), - -/***/ "./src/DistortableCollection.js": -/*!**************************************!*\ - !*** ./src/DistortableCollection.js ***! - \**************************************/ -/***/ (function() { - -var arr = []; -L.DistortableCollection = L.FeatureGroup.extend({ - options: { - editable: true, - exportOpts: { - exportStartUrl: '//export.mapknitter.org/export', - statusUrl: '//export.mapknitter.org', - exportUrl: 'http://export.mapknitter.org/' - } - }, - initialize: function initialize(options) { - L.setOptions(this, options); - L.FeatureGroup.prototype.initialize.call(this, options); - L.Utils.initTranslation.call(this); - this.editable = this.options.editable; - }, - onAdd: function onAdd(map) { - L.FeatureGroup.prototype.onAdd.call(this, map); - this._map = map; - - if (this.editable) { - this.editing.enable(); - } - /** - * although we have a DistortableCollection.Edit class that handles collection events to keep our code managable, - * events that need to be added on individual images are kept here to do so through `layeradd`. - */ - - - this.on('layeradd', this._addEvents, this); - this.on('layerremove', this._removeEvents, this); - }, - onRemove: function onRemove() { - if (this.editing) { - this.editing.disable(); - } - - this.off('layeradd', this._addEvents, this); - this.off('layerremove', this._removeEvents, this); - }, - _addEvents: function _addEvents(e) { - var layer = e.layer; - L.DomEvent.on(layer, { - dragstart: this._dragStartMultiple, - drag: this._dragMultiple - }, this); - L.DomEvent.on(layer.getElement(), { - mousedown: this._deselectOthers, - - /* Enable longpress for multi select for touch devices. */ - contextmenu: this._longPressMultiSelect - }, this); - }, - _removeEvents: function _removeEvents(e) { - var layer = e.layer; - L.DomEvent.off(layer, { - dragstart: this._dragStartMultiple, - drag: this._dragMultiple - }, this); - L.DomEvent.off(layer.getElement(), { - mousedown: this._deselectOthers, - contextmenu: this._longPressMultiSelect - }, this); - }, - _longPressMultiSelect: function _longPressMultiSelect(e) { - var _this = this; - - if (!this.editable) { - return; - } - - e.preventDefault(); - this.eachLayer(function (layer) { - var edit = layer.editing; - - if (layer.getElement() === e.target && edit.enabled()) { - L.DomUtil.toggleClass(layer.getElement(), 'collected'); - - if (_this.anyCollected()) { - layer.deselect(); - - _this.editing._addToolbar(); - } else { - _this.editing._removeToolbar(); - } - } - }); - }, - isCollected: function isCollected(overlay) { - return L.DomUtil.hasClass(overlay.getElement(), 'collected'); - }, - anyCollected: function anyCollected() { - var layerArr = this.getLayers(); - return layerArr.some(this.isCollected.bind(this)); - }, - _toggleCollected: function _toggleCollected(e, layer) { - if (e.shiftKey) { - /* conditional prevents disabled images from flickering multi-select mode */ - if (layer.editing.enabled()) { - L.DomUtil.toggleClass(e.target, 'collected'); // re-order layers by _leaflet_id to match their display order in UI - // add new layer to right position and avoid repitition - - var newArr = arr.every(function (each) { - return each._leaflet_id !== layer._leaflet_id; - }); - - if (newArr) { - arr.push(layer); - } else { - arr.splice(arr.indexOf(layer), 1); - } - } - } - - if (this.anyCollected()) { - layer.deselect(); - } else { - this.editing._removeToolbar(); - } - }, - _deselectOthers: function _deselectOthers(e) { - var _this2 = this; - - if (!this.editable) { - return; - } - - this.eachLayer(function (layer) { - if (layer.getElement() !== e.target) { - layer.deselect(); - } else { - _this2._toggleCollected(e, layer); - } - }); - - if (e) { - L.DomEvent.stopPropagation(e); - } - }, - _dragStartMultiple: function _dragStartMultiple(e) { - var overlay = e.target; - var map = this._map; - var i; - - if (!this.isCollected(overlay)) { - return; - } - - this.eachLayer(function (layer) { - layer._dragStartPoints = {}; - layer.deselect(); - - for (i = 0; i < 4; i++) { - var c = layer.getCorner(i); - layer._dragStartPoints[i] = map.latLngToLayerPoint(c); - } - }); - }, - _dragMultiple: function _dragMultiple(e) { - var overlay = e.target; - var map = this._map; - - if (!this.isCollected(overlay)) { - return; - } - - var topLeft = map.latLngToLayerPoint(overlay.getCorner(0)); - - var delta = overlay._dragStartPoints[0].subtract(topLeft); - - this._updateCollectionFromPoints(delta, overlay); - }, - _toRemove: function _toRemove() { - var _this3 = this; - - var layerArr = this.getLayers(); - return layerArr.filter(function (layer) { - var mode = layer.editing._mode; - return _this3.isCollected(layer) && mode !== 'lock'; - }); - }, - _toMove: function _toMove(overlay) { - var _this4 = this; - - var layerArr = this.getLayers(); - return layerArr.filter(function (layer) { - var mode = layer.editing._mode; - return layer !== overlay && _this4.isCollected(layer) && mode !== 'lock'; - }); - }, - _updateCollectionFromPoints: function _updateCollectionFromPoints(delta, overlay) { - var layersToMove = this._toMove(overlay); - - var p = new L.Transformation(1, -delta.x, 1, -delta.y); - var i; - layersToMove.forEach(function (layer) { - var movedPoints = {}; - - for (i = 0; i < 4; i++) { - movedPoints[i] = p.transform(layer._dragStartPoints[i]); - } - - layer.setCornersFromPoints(movedPoints); - }); - }, - _getAvgCmPerPixel: function _getAvgCmPerPixel(imgs) { - var reduce = imgs.reduce(function (sum, img) { - return sum + img.cm_per_pixel; - }, 0); - return reduce / imgs.length; - }, - generateExportJson: function generateExportJson() { - var json = {}; - json.images = []; - this.eachLayer(function (layer) { - if (this.isCollected(layer)) { - var sections = layer._image.src.split('/'); - - var filename = sections[sections.length - 1]; - var zc = layer.getCorners(); - var corners = [{ - lat: zc[0].lat, - lon: zc[0].lng - }, { - lat: zc[1].lat, - lon: zc[1].lng - }, { - lat: zc[3].lat, - lon: zc[3].lng - }, { - lat: zc[2].lat, - lon: zc[2].lng - }]; - json.images.push({ - id: layer._leaflet_id, - src: layer._image.src, - width: layer._image.width, - height: layer._image.height, - image_file_name: filename, - nodes: corners, - cm_per_pixel: L.ImageUtil.getCmPerPixel(layer) - }); - } - }, this); - json.images = json.images.reverse(); - json.avg_cm_per_pixel = this._getAvgCmPerPixel(json.images); - return json; - } -}); - -L.distortableCollection = function (id, options) { - return new L.DistortableCollection(id, options); -}; - -/***/ }), - -/***/ "./src/DistortableImageOverlay.js": -/*!****************************************!*\ - !*** ./src/DistortableImageOverlay.js ***! - \****************************************/ -/***/ (function() { - -L.DistortableImageOverlay = L.ImageOverlay.extend({ - options: { - height: 200, - crossOrigin: true, - // todo: find ideal number to prevent distortions during RotateScale, and make it dynamic (remove hardcoding) - edgeMinWidth: 50, - editable: true, - mode: 'distort', - selected: false, - // SEGUN ------------------------------------------------------------------------------------------------------------------------------ - interactive: true, - tooltipText: 'Unknow image' // default tooltipText - // SEGUN ------------------------------------------------------------------------------------------------------------------------------ - - }, - initialize: function initialize(url, options) { - L.setOptions(this, options); - L.Utils.initTranslation.call(this); - this.edgeMinWidth = this.options.edgeMinWidth; - this.editable = this.options.editable; - this._selected = this.options.selected; - this._url = url; - this.rotation = {}; // SEGUN ------------------------------------------------------------------------------------------------------------------------------ - - this.interactive = this.options.interactive; - this.tooltipText = options.tooltipText; // SEGUN ------------------------------------------------------------------------------------------------------------------------------ - }, - onAdd: function onAdd(map) { - var _this = this; - - this._map = map; - - if (!this.getElement()) { - this._initImage(); - } - - map.on('viewreset', this._reset, this); - - if (this.options.corners) { - this._corners = this.options.corners; - - if (map.options.zoomAnimation && L.Browser.any3d) { - map.on('zoomanim', this._animateZoom, this); - } - } // Have to wait for the image to load because need to access its w/h - - - L.DomEvent.on(this.getElement(), 'load', function () { - _this.getPane().appendChild(_this.getElement()); - - _this._initImageDimensions(); - - if (_this.options.rotation) { - var units = _this.options.rotation.deg >= 0 ? 'deg' : 'rad'; - - _this.setAngle(_this.options.rotation[units], units); - } else { - _this.rotation = { - deg: 0, - rad: 0 - }; - - _this._reset(); - } - /* Initialize default corners if not already set */ - - - if (!_this._corners) { - if (map.options.zoomAnimation && L.Browser.any3d) { - map.on('zoomanim', _this._animateZoom, _this); - } - } - /** if there is a featureGroup, only its editable option matters */ - - - var eventParents = _this._eventParents; - - if (eventParents) { - _this.eP = eventParents[Object.keys(eventParents)[0]]; - - if (_this.eP.editable) { - _this.editing.enable(); - } - } else { - if (_this.editable) { - _this.editing.enable(); - } - - _this.eP = null; - } - }); - L.DomEvent.on(this.getElement(), 'click', this.select, this); - L.DomEvent.on(map, { - singleclickon: this._singleClickListeners, - singleclickoff: this._resetClickListeners, - singleclick: this._singleClick - }, this); - /** - * custom events fired from DoubleClickLabels.js. Used to differentiate - * single / dblclick to not deselect images on map dblclick. - */ - - if (!(map.doubleClickZoom.enabled() || map.doubleClickLabels.enabled())) { - L.DomEvent.on(map, 'click', this.deselect, this); - } - - this.fire('add'); // SEGUN ------------------------------------------------------------------------------------------------------------------------------ - - L.DomEvent.on(this.getElement(), 'mouseover mousemove', this._activateTooltip, this); - L.DomEvent.on(this.getElement(), 'mouseout', this._closeTooltip, this); - }, - onRemove: function onRemove(map) { - L.DomEvent.off(this.getElement(), 'click', this.select, this); - L.DomEvent.off(map, { - singleclickon: this._singleClickListeners, - singleclickoff: this._resetClickListeners, - singleclick: this._singleClick - }, this); - L.DomEvent.off(map, 'click', this.deselect, this); - - if (this.editing) { - this.editing.disable(); - } - - this.fire('remove'); - L.ImageOverlay.prototype.onRemove.call(this, map); // SEGUN ----------------------------------------------------------------------------------------------------------------------------- - - L.DomEvent.off(this.getElement(), 'mouseover', this._deactivateTooltip, this); // ENDS ------------------------------------------------------------------------------------------------------------------------------ - }, - _initImageDimensions: function _initImageDimensions() { - var map = this._map; - var originalImageWidth = L.DomUtil.getStyle(this.getElement(), 'width'); - var originalImageHeight = L.DomUtil.getStyle(this.getElement(), 'height'); - var aspectRatio = parseInt(originalImageWidth) / parseInt(originalImageHeight); - var imageHeight = this.options.height; - var imageWidth = parseInt(aspectRatio * imageHeight); - var center = map.project(map.getCenter()); - var offset = L.point(imageWidth, imageHeight).divideBy(2); - - if (this.options.corners) { - this._corners = this.options.corners; - } else { - this._corners = [map.unproject(center.subtract(offset)), map.unproject(center.add(L.point(offset.x, -offset.y))), map.unproject(center.add(L.point(-offset.x, offset.y))), map.unproject(center.add(offset))]; - } - - this._initialDimensions = { - 'center': center, - 'offset': offset, - 'zoom': map.getZoom() - }; - this.setBounds(L.latLngBounds(this.getCorners())); - }, - _singleClick: function _singleClick(e) { - if (e.type === 'singleclick') { - this.deselect(); - } else { - return; - } - }, - _singleClickListeners: function _singleClickListeners() { - var map = this._map; - L.DomEvent.off(map, 'click', this.deselect, this); - L.DomEvent.on(map, 'singleclick', this.deselect, this); - }, - _resetClickListeners: function _resetClickListeners() { - var map = this._map; - L.DomEvent.on(map, 'click', this.deselect, this); - L.DomEvent.off(map, 'singleclick', this.deselect, this); - }, - isSelected: function isSelected() { - return this._selected; // this._selected - }, - deselect: function deselect() { - var edit = this.editing; - - if (!edit.enabled()) { - return; - } - - edit._removeToolbar(); - - edit._hideMarkers(); - - this._selected = false; - this.fire('deselect'); - return this; - }, - select: function select(e) { - var edit = this.editing; - var eP = this.eP; - - if (!edit.enabled()) { - return; - } - - if (e) { - L.DomEvent.stopPropagation(e); - } // this ensures deselection of all other images, allowing us to keep collection group optional - - - this._programmaticGrouping(); - - this._selected = true; - - edit._addToolbar(); - - edit._showMarkers(); - - this.fire('select'); // we run the selection logic 1st anyway because the collection group's _addToolbar method depends on it - - if (eP && eP.anyCollected()) { - this.deselect(); - return; - } - - return this; - }, - _programmaticGrouping: function _programmaticGrouping() { - this._map.eachLayer(function (layer) { - if (layer instanceof L.DistortableImageOverlay) { - layer.deselect(); - } - }); - }, - setCorner: function setCorner(corner, latlng) { - var edit = this.editing; - this._corners[corner] = latlng; - this.setBounds(L.latLngBounds(this.getCorners())); - this.fire('update'); - - if (edit.toolbar && edit.toolbar instanceof L.DistortableImage.PopupBar) { - edit._updateToolbarPos(); - } - - this.edited = true; - return this; - }, - _cornerExceedsMapLats: function _cornerExceedsMapLats(zoom, corner, map) { - if (map.options.crs.Simple == L.CRS.Simple) { - return false; - } else { - var exceedsTop; - var exceedsBottom; - - if (zoom === 0) { - exceedsTop = map.project(corner).y < 2; - exceedsBottom = map.project(corner).y >= 255; - } else { - exceedsTop = map.project(corner).y / zoom < 2; - exceedsBottom = map.project(corner).y / Math.pow(2, zoom) >= 255; - } - - return exceedsTop || exceedsBottom; - } - }, - // SEGUN ------------------------------------------------------------------------------------------------------------------------------- - _activateTooltip: function _activateTooltip(ev) { - // let index = 0; - // const xAxis = []; // stores previous values of x coordinate - // const yAxis = []; // stores previous values of y coordinate, may be needed later - // let newPosX = 0; - console.log('ev.x: ', ev.x, 'ev.y: ', ev.y); - - if (!this._selected) { - // xAxis[index] = ev.x; - // yAxis[index] = ev.y; // May be needed later - // ++index; - this.bindTooltip(this.tooltipText, { - direction: 'top' - }).openTooltip(); // {sticky: true, direction: 'top', offset: L.point([ev.x - xAxis[index-1], ev.y])}).openTooltip(); - cursor consistently in same X-axis for each y-axis position - // {sticky: true, direction: 'top', offset: L.point([ev.x - 700, ev.y - 500])}).openTooltip(); - } - }, - _closeTooltip: function _closeTooltip() { - this.closeTooltip(); - }, - _deactivateTooltip: function _deactivateTooltip() { - this.unbindTooltip(); - }, - // ENDS ------------------------------------------------------------------------------------------------------------------------------ - setCorners: function setCorners(latlngObj) { - var map = this._map; - var zoom = map.getZoom(); - var edit = this.editing; - var i = 0; // this is to fix https://github.com/publiclab/Leaflet.DistortableImage/issues/402 - - for (var k in latlngObj) { - if (this._cornerExceedsMapLats(zoom, latlngObj[k], map)) { - // calling reset / update w/ the same corners bc it prevents a marker flicker for rotate - this.setBounds(L.latLngBounds(this.getCorners())); - this.fire('update'); - return; - } - } - - for (var _k in latlngObj) { - this._corners[i] = latlngObj[_k]; - i += 1; - } - - this.setBounds(L.latLngBounds(this.getCorners())); - this.fire('update'); - - if (edit.toolbar && edit.toolbar instanceof L.DistortableImage.PopupBar) { - edit._updateToolbarPos(); - } - - this.edited = true; - return this; - }, - setCornersFromPoints: function setCornersFromPoints(pointsObj) { - var map = this._map; - var zoom = map.getZoom(); - var edit = this.editing; - var i = 0; - - for (var k in pointsObj) { - var corner = map.layerPointToLatLng(pointsObj[k]); - - if (this._cornerExceedsMapLats(zoom, corner, map)) { - // calling reset / update w/ the same corners bc it prevents a marker flicker for rotate - this.setBounds(L.latLngBounds(this.getCorners())); - this.fire('update'); - return; - } - } - - for (var _k2 in pointsObj) { - this._corners[i] = map.layerPointToLatLng(pointsObj[_k2]); - i += 1; - } - - this.setBounds(L.latLngBounds(this.getCorners())); - this.fire('update'); - - if (edit.toolbar && edit.toolbar instanceof L.DistortableImage.PopupBar) { - edit._updateToolbarPos(); - } - - this.edited = true; - return this; - }, - scaleBy: function scaleBy(scale) { - var map = this._map; - var center = map.project(this.getCenter()); - var i; - var p; - var scaledCorners = {}; - - if (scale === 0) { - return; - } - - for (i = 0; i < 4; i++) { - p = map.project(this.getCorner(i)).subtract(center).multiplyBy(scale).add(center); - scaledCorners[i] = map.unproject(p); - } - - this.setCorners(scaledCorners); - return this; - }, - getAngle: function getAngle() { - var unit = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'deg'; - var matrix = this.getElement().style[L.DomUtil.TRANSFORM].split('matrix3d')[1].slice(1, -1).split(','); - var row0x = matrix[0]; - var row0y = matrix[1]; - var row1x = matrix[4]; - var row1y = matrix[5]; - var determinant = row0x * row1y - row0y * row1x; - var angle = L.TrigUtil.calcAngle(row0x, row0y, 'rad'); - - if (determinant < 0) { - angle += angle < 0 ? Math.PI : -Math.PI; - } - - if (angle < 0) { - angle = 2 * Math.PI + angle; - } - - return unit === 'deg' ? Math.round(L.TrigUtil.radiansToDegrees(angle)) : L.Util.formatNum(angle, 2); - }, - setAngle: function setAngle(angle) { - var unit = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'deg'; - var currentAngle = this.getAngle(unit); - var angleToRotateBy = angle - currentAngle; - this.rotateBy(angleToRotateBy, unit); - return this; - }, - rotateBy: function rotateBy(angle) { - var unit = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'deg'; - var map = this._map; - var center = map.project(this.getCenter()); - var corners = {}; - var i; - var p; - var q; - - if (unit === 'deg') { - angle = L.TrigUtil.degreesToRadians(angle); - } - - for (i = 0; i < 4; i++) { - p = map.project(this.getCorner(i)).subtract(center); - q = L.point(Math.cos(angle) * p.x - Math.sin(angle) * p.y, Math.sin(angle) * p.x + Math.cos(angle) * p.y); - corners[i] = map.unproject(q.add(center)); - } - - this.setCorners(corners); - return this; - }, - dragBy: function dragBy(formerPoint, newPoint) { - var map = this._map; - var i; - var p; - var transCorners = {}; - var delta = map.project(formerPoint).subtract(map.project(newPoint)); - - for (i = 0; i < 4; i++) { - p = map.project(this.getCorner(i)).subtract(delta); - transCorners[i] = map.unproject(p); - } - - this.setCorners(transCorners); - }, - restore: function restore() { - var map = this._map; - var center = this._initialDimensions.center; - var offset = this._initialDimensions.offset; - var zoom = this._initialDimensions.zoom; - var corners = [center.subtract(offset), center.add(L.point(offset.x, -offset.y)), center.add(L.point(-offset.x, offset.y)), center.add(offset)]; - - for (var i = 0; i < 4; i++) { - if (!map.unproject(corners[i], zoom).equals(this.getCorner(i))) { - this.setCorner(i, map.unproject(corners[i], zoom)); - } - } - - this.edited = false; - this.fire('restore'); - return this; - }, - - /* Copied from Leaflet v0.7 https://github.com/Leaflet/Leaflet/blob/66282f14bcb180ec87d9818d9f3c9f75afd01b30/src/dom/DomUtil.js#L189-L199 */ - - /* since L.DomUtil.getTranslateString() is deprecated in Leaflet v1.0 */ - _getTranslateString: function _getTranslateString(point) { - // on WebKit browsers (Chrome/Safari/iOS Safari/Android) - // using translate3d instead of translate - // makes animation smoother as it ensures HW accel is used. - // Firefox 13 doesn't care - // (same speed either way), Opera 12 doesn't support translate3d - var is3d = L.Browser.webkit3d; - var open = 'translate' + (is3d ? '3d' : '') + '('; - var close = (is3d ? ',0' : '') + ')'; - return open + point.x + 'px,' + point.y + 'px' + close; - }, - _reset: function _reset() { - var map = this._map; - var image = this.getElement(); - var latLngToLayerPoint = L.bind(map.latLngToLayerPoint, map); - - var transformMatrix = this._calculateProjectiveTransform(latLngToLayerPoint); - - var topLeft = latLngToLayerPoint(this.getCorner(0)); - var warp = L.DomUtil.getMatrixString(transformMatrix); - - var translation = this._getTranslateString(topLeft); - /* See L.DomUtil.setPosition. Mainly for the purposes of L.Draggable. */ - - - image._leaflet_pos = topLeft; - image.style[L.DomUtil.TRANSFORM] = [translation, warp].join(' '); - /* Set origin to the upper-left corner rather than - * the center of the image, which is the default. - */ - - image.style[L.DomUtil.TRANSFORM + '-origin'] = '0 0 0'; - this.rotation.deg = this.getAngle(); - this.rotation.rad = this.getAngle('rad'); - }, - - /* - * Calculates the transform string that will be - * correct *at the end* of zooming. - * Leaflet then generates a CSS3 animation between the current transform and - * future transform which makes the transition appear smooth. - */ - _animateZoom: function _animateZoom(event) { - var map = this._map; - var image = this.getElement(); - - var latLngToNewLayerPoint = function latLngToNewLayerPoint(latlng) { - return map._latLngToNewLayerPoint(latlng, event.zoom, event.center); - }; - - var transformMatrix = this._calculateProjectiveTransform(latLngToNewLayerPoint); - - var topLeft = latLngToNewLayerPoint(this.getCorner(0)); - var warp = L.DomUtil.getMatrixString(transformMatrix); - - var translation = this._getTranslateString(topLeft); - /* See L.DomUtil.setPosition. Mainly for the purposes of L.Draggable. */ - - - image._leaflet_pos = topLeft; - image.style[L.DomUtil.TRANSFORM] = [translation, warp].join(' '); - }, - getCorners: function getCorners() { - return this._corners; - }, - getCorner: function getCorner(i) { - return this._corners[i]; - }, - // image (vertex) centroid calculation - getCenter: function getCenter() { - var map = this._map; - var reduce = this.getCorners().reduce(function (agg, corner) { - return agg.add(map.project(corner)); - }, L.point(0, 0)); - return map.unproject(reduce.divideBy(4)); - }, - _calculateProjectiveTransform: function _calculateProjectiveTransform(latLngToCartesian) { - /* Setting reasonable but made-up image defaults - * allow us to place images on the map before - * they've finished downloading. */ - var offset = latLngToCartesian(this.getCorner(0)); - var w = this.getElement().offsetWidth || 500; - var h = this.getElement().offsetHeight || 375; - var c = []; - var j; - /* Convert corners to container points (i.e. cartesian coordinates). */ - - for (j = 0; j < 4; j++) { - c.push(latLngToCartesian(this.getCorner(j))._subtract(offset)); - } - /* - * This matrix describes the action of - * the CSS transform on each corner of the image. - * It maps from the coordinate system centered - * at the upper left corner of the image - * to the region bounded by the latlngs in this._corners. - * For example: - * 0, 0, c[0].x, c[0].y - * says that the upper-left corner of the image - * maps to the first latlng in this._corners. - */ - - - return L.MatrixUtil.general2DProjection(0, 0, c[0].x, c[0].y, w, 0, c[1].x, c[1].y, 0, h, c[2].x, c[2].y, w, h, c[3].x, c[3].y); - } -}); - -L.distortableImageOverlay = function (id, options) { - // remove temp - return new L.DistortableImageOverlay(id, options); // remove temp -}; - -L.Map.addInitHook(function () { - if (!L.DomUtil.hasClass(this.getContainer(), 'ldi')) { - L.DomUtil.addClass(this.getContainer(), 'ldi'); - } -}); - -/***/ }), - -/***/ "./src/components/DistortableImage.Keymapper.js": -/*!******************************************************!*\ - !*** ./src/components/DistortableImage.Keymapper.js ***! - \******************************************************/ -/***/ (function() { - -var _this = this; - -L.DomUtil = L.DomUtil || {}; -L.DistortableImage = L.DistortableImage || {}; -L.distortableImage = L.DistortableImage; -L.DistortableImage.Keymapper = L.Handler.extend({ - options: { - position: 'topright' - }, - initialize: function initialize(map, options) { - this._map = map; - L.setOptions(this, options); - }, - addHooks: function addHooks() { - if (!this._keymapper) { - this._container = this._buildContainer(); - this._scrollWrapper = this._wrap(); - this._toggler = this._createButton(); - - this._setMapper(this._container, this._scrollWrapper, this._toggler); - - L.DomEvent.on(this._toggler, 'click', this._toggleKeymapper, this); - L.DomEvent.disableClickPropagation(this._container); - L.DomEvent.disableScrollPropagation(this._container); - } - }, - removeHooks: function removeHooks() { - if (this._keymapper) { - L.DomEvent.off(this._toggler, 'click', this._toggleKeymapper, this); - L.DomUtil.remove(this._toggler); - L.DomUtil.remove(this._scrollWrapper); - L.DomUtil.remove(this._container); - this._keymapper = false; - } - }, - _buildContainer: function _buildContainer() { - var container = L.DomUtil.create('div', 'ldi-keymapper-hide'); - container.setAttribute('id', 'ldi-keymapper'); - var divider = L.DomUtil.create('br', 'divider'); - container.appendChild(divider); - return container; - }, - _createButton: function _createButton() { - var toggler = L.DomUtil.create('a', ''); - toggler.innerHTML = L.IconUtil.create('keyboard_open'); - toggler.setAttribute('id', 'toggle-keymapper'); - toggler.setAttribute('href', '#'); - toggler.setAttribute('title', 'Show keymap'); // Will force screen readers like VoiceOver to read this as "Show keymap - button" - - toggler.setAttribute('role', 'button'); - toggler.setAttribute('aria-label', 'Show keymap'); - return toggler; - }, - _wrap: function _wrap() { - var wrap = L.DomUtil.create('div', ''); - wrap.setAttribute('id', 'keymapper-wrapper'); - wrap.style.display = 'none'; - return wrap; - }, - _setMapper: function _setMapper(container, wrap, button) { - this._keymapper = L.control({ - position: this.options.position - }); - - this._keymapper.onAdd = function () { - container.appendChild(wrap); - wrap.insertAdjacentHTML('beforeend', '' + '
' + - /* eslint-disable */ - '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '
Rotate Mode
R
RotateScale Mode
r
Scale Mode
s
Distort Mode
d
Drag Mode
D
Lock (Mode) / Unlock Image
l\xa0u
Stack up / down
q\xa0a
Add / Remove Image Border
b
Toggle Opacity
o
Deselect All
esc
Delete Image(s)
delete\xa0backspace
Export Image(s)
e
'); - /* eslint-enable */ - - container.appendChild(button); - return container; - }; - - this._keymapper.addTo(this._map); - }, - _toggleKeymapper: function _toggleKeymapper(e) { - e.preventDefault(); - this._container.className = this._container.className === 'ldi-keymapper leaflet-control' ? 'ldi-keymapper-hide leaflet-control' : 'ldi-keymapper leaflet-control'; - this._scrollWrapper.style.display = this._scrollWrapper.style.display === 'none' ? 'block' : 'none'; - this._toggler.innerHTML = this._toggler.innerHTML === 'close' ? L.IconUtil.create('keyboard_open') : 'close'; - L.IconUtil.toggleTitle(this._toggler, 'Show keymap', 'Hide keymap'); - L.DomUtil.toggleClass(this._toggler, 'close-icon'); - }, - _injectIconSet: function _injectIconSet() { - if (document.querySelector('#keymapper-iconset')) { - return; - } - - var el = L.DomUtil.create('div', ''); - el.id = 'keymapper-iconset'; - el.setAttribute('hidden', 'hidden'); - this._iconset = new L.KeymapperIconSet().render(); - el.innerHTML = this._iconset; - document.querySelector('.leaflet-control-container').appendChild(el); - } -}); -L.DistortableImage.Keymapper.addInitHook(function () { - L.DistortableImage.Keymapper.prototype._n = L.DistortableImage.Keymapper.prototype._n ? L.DistortableImage.Keymapper.prototype._n + 1 : 1; // dont enable keymapper for mobile - - if (L.DistortableImage.Keymapper.prototype._n === 1 && !L.Browser.mobile) { - _this.enable(); - - _this._injectIconSet(); - } -}); - -L.distortableImage.keymapper = function (map, options) { - return new L.DistortableImage.Keymapper(map, options); -}; - -/***/ }), - -/***/ "./src/edit/DistortableCollection.Edit.js": -/*!************************************************!*\ - !*** ./src/edit/DistortableCollection.Edit.js ***! - \************************************************/ -/***/ (function() { - -L.DistortableImage = L.DistortableImage || {}; // this class holds the keybindings and toolbar API for an image collection instance - -L.DistortableCollection.Edit = L.Handler.extend({ - options: { - keymap: L.distortableImage.group_action_map - }, - initialize: function initialize(group, options) { - this._group = group; - this._exportOpts = group.options.exportOpts; - L.setOptions(this, options); - L.distortableImage.group_action_map.Escape = '_decollectAll'; - }, - addHooks: function addHooks() { - var group = this._group; - var map = group._map; - this.editActions = this.options.actions; - this.runExporter = L.bind(L.Utils.getNestedVal(this, '_exportOpts', 'exporter') || this.startExport, this); - L.DomEvent.on(document, 'keydown', this._onKeyDown, this); - - if (!(map.doubleClickZoom.enabled() || map.doubleClickLabels.enabled())) { - L.DomEvent.on(map, 'click', this._decollectAll, this); - } - - L.DomEvent.on(map, { - singleclickon: this._singleClickListeners, - singleclickoff: this._resetClickListeners, - singleclick: this._singleClick, - boxcollectend: this._addCollections - }, this); - this._group.editable = true; - - this._group.eachLayer(function (layer) { - return layer.editing.enable(); - }); - }, - removeHooks: function removeHooks() { - var group = this._group; - var map = group._map; - L.DomEvent.off(document, 'keydown', this._onKeyDown, this); - - if (!(map.doubleClickZoom.enabled() || map.doubleClickLabels.enabled())) { - L.DomEvent.off(map, 'click', this._decollectAll, this); - } - - L.DomEvent.off(map, { - singleclickon: this._singleClickListeners, - singleclickoff: this._resetClickListeners, - singleclick: this._singleClick, - boxcollectend: this._addCollections - }, this); - - this._decollectAll(); - - this._group.editable = false; - - this._group.eachLayer(function (layer) { - return layer.editing.disable(); - }); - }, - enable: function enable() { - this._enabled = true; - this.addHooks(); - return this; - }, - disable: function disable() { - this._enabled = false; - this.removeHooks(); - return this; - }, - _onKeyDown: function _onKeyDown(e) { - var keymap = this.options.keymap; - var handlerName = keymap[e.key]; - - if (!this[handlerName]) { - return; - } - - if (this._group.anyCollected()) { - this[handlerName].call(this); - } - }, - _singleClick: function _singleClick(e) { - if (e.type === 'singleclick') { - this._decollectAll(e); - } else { - return; - } - }, - _singleClickListeners: function _singleClickListeners() { - var map = this._group._map; - L.DomEvent.off(map, 'click', this._decollectAll, this); - L.DomEvent.on(map, 'singleclick', this._decollectAll, this); - }, - _resetClickListeners: function _resetClickListeners() { - var map = this._group._map; - L.DomEvent.on(map, 'click', this._decollectAll, this); - L.DomEvent.off(map, 'singleclick', this._decollectAll, this); - }, - _decollectAll: function _decollectAll(e) { - var oe; - - if (e) { - oe = e.originalEvent; - } - /** - * prevents image deselection following the 'boxcollectend' event - note 'shift' must not be released until dragging is complete - * also prevents deselection following a click on a disabled img by differentiating it from the map - */ - - - if (oe && (oe.shiftKey || oe.target instanceof HTMLImageElement)) { - return; - } - - this._group.eachLayer(function (layer) { - L.DomUtil.removeClass(layer.getElement(), 'collected'); - layer.deselect(); - }); - - this._removeToolbar(); - - if (e) { - L.DomEvent.stopPropagation(e); - } - }, - _unlockGroup: function _unlockGroup() { - var _this = this; - - if (!this.hasTool(L.UnlockAction)) { - return; - } - - this._group.eachLayer(function (layer) { - if (_this._group.isCollected(layer)) { - var edit = layer.editing; - - edit._unlock(); // unlock updates the layer's handles; deselect to ensure they're hidden - - - layer.deselect(); - } - }); - }, - _lockGroup: function _lockGroup() { - var _this2 = this; - - if (!this.hasTool(L.LockAction)) { - return; - } - - this._group.eachLayer(function (layer) { - if (_this2._group.isCollected(layer)) { - var edit = layer.editing; - - edit._lock(); // map.addLayer also deselects the image, so we reselect here - - - L.DomUtil.addClass(layer.getElement(), 'collected'); - } - }); - }, - _addCollections: function _addCollections(e) { - var _this3 = this; - - var box = e.boxCollectBounds; - var map = this._group._map; - - this._group.eachLayer(function (layer) { - var edit = layer.editing; - - if (layer.isSelected()) { - layer.deselect(); - } - - var zoom = map.getZoom(); - var center = map.getCenter(); - var imgBounds = L.latLngBounds(layer.getCorner(2), layer.getCorner(1)); - imgBounds = map._latLngBoundsToNewLayerBounds(imgBounds, zoom, center); - - if (box.intersects(imgBounds) && edit.enabled()) { - if (!_this3.toolbar) { - _this3._addToolbar(); - } - - L.DomUtil.addClass(layer.getElement(), 'collected'); - } - }); - }, - _removeGroup: function _removeGroup(e) { - var _this4 = this; - - if (!this.hasTool(L.DeleteAction)) { - return; - } - - var layersToRemove = this._group._toRemove(); - - var n = layersToRemove.length; - - if (n === 0) { - return; - } - - var choice = L.DomUtil.confirmDeletes(n); - - if (choice) { - layersToRemove.forEach(function (layer) { - _this4._group.removeLayer(layer); - }); - - if (!this._group.anyCollected()) { - this._removeToolbar(); - } - } - - if (e) { - L.DomEvent.stopPropagation(e); - } - }, - cancelExport: function cancelExport() { - if (!this.customCollection) { - this._exportOpts.collection = undefined; - } - - clearInterval(this.updateInterval); - }, - _addToolbar: function _addToolbar() { - var group = this._group; - var map = group._map; - - if (group.options.suppressToolbar || this.toolbar) { - return; - } - - this.toolbar = L.distortableImage.controlBar({ - actions: this.editActions, - position: 'topleft' - }).addTo(map, group); - }, - _removeToolbar: function _removeToolbar() { - var map = this._group._map; - - if (this.toolbar) { - map.removeLayer(this.toolbar); - this.toolbar = false; - } else { - return false; - } - }, - hasTool: function hasTool(value) { - return this.editActions.some(function (action) { - return action === value; - }); - }, - addTool: function addTool(value) { - if (value.baseClass === 'leaflet-toolbar-icon' && !this.hasTool(value)) { - this._removeToolbar(); - - this.editActions.push(value); - - this._addToolbar(); - } - - return this; - }, - removeTool: function removeTool(value) { - var _this5 = this; - - this.editActions.some(function (item, idx) { - if (_this5.editActions[idx] === value) { - _this5._removeToolbar(); - - _this5.editActions.splice(idx, 1); - - _this5._addToolbar(); - - return true; - } else { - return false; - } - }); - return this; - }, - startExport: function startExport() { - var _this6 = this; - - if (!this.hasTool(L.ExportAction)) { - return; - } - - return new Promise(function (resolve) { - var opts = _this6._exportOpts; - opts.resolve = resolve; // allow resolving promise in user-defined functions, to stop spinner on completion - - var statusUrl; - _this6.updateInterval = null; // this may be overridden to update the UI to show export progress or completion - - var _defaultUpdater = function _defaultUpdater(data) { - data = JSON.parse(data); // optimization: fetch status directly from google storage: - - if (data.status_url) { - if (statusUrl !== data.status_url && data.status_url.match('.json')) { - // if (data.status_url && data.status_url.substr(0,1) === "/") { - // opts.statusUrl = opts.statusUrl + data.status_url; - // } else { - statusUrl = data.status_url; // } - } - - if (data.status === 'complete') { - clearInterval(_this6.updateInterval); - - if (!_this6.customCollection) { - _this6._exportOpts.collection = undefined; - } - - resolve(); - - if (data.jpg !== null) { - alert('Export succeeded. ' + opts.exportUrl + data.jpg); - } - } // TODO: update to clearInterval when status == "failed" if we update that in this file: - // https://github.com/publiclab/mapknitter-exporter/blob/main/lib/mapknitterExporter.rb - - - console.log(data); - } - }; // receives the URL of status.json, and starts running the updater to repeatedly fetch from status.json; - // this may be overridden to integrate with any UI - - - var _defaultHandleStatusRes = function _defaultHandleStatusRes(data) { - statusUrl = opts.statusUrl + data; // repeatedly fetch the status.json - - _this6.updateInterval = setInterval(function () { - var reqOpts = { - method: 'GET' - }; - var req = new Request("".concat(statusUrl, "?").concat(Date.now()), reqOpts); - fetch(req).then(function (res) { - if (res.ok) { - return res.text(); - } - }).then(opts.updater); - }, opts.frequency); - }; // initiate the export - - - var _defaultFetchStatusUrl = function _defaultFetchStatusUrl(mergedOpts) { - var form = new FormData(); - form.append('collection', JSON.stringify(mergedOpts.collection)); - form.append('scale', mergedOpts.scale); - form.append('upload', true); - var reqOpts = { - method: 'POST', - body: form - }; - var req = new Request(mergedOpts.exportStartUrl, reqOpts); - fetch(req).then(function (res) { - if (res.ok) { - return res.text(); - } - }).then(mergedOpts.handleStatusRes); - }; // If the user has passed collection property - - - _this6.customCollection = !!opts.collection; - - if (!_this6.customCollection) { - opts.collection = _this6._group.generateExportJson().images; - } - - opts.frequency = opts.frequency || 3000; - opts.scale = opts.scale || 100; // switch it to _getAvgCmPerPixel ! - - opts.updater = opts.updater || _defaultUpdater; - opts.handleStatusRes = opts.handleStatusRes || _defaultHandleStatusRes; - opts.fetchStatusUrl = opts.fetchStatusUrl || _defaultFetchStatusUrl; - opts.fetchStatusUrl(opts); - }); - } -}); - -L.distortableCollection.edit = function (group, options) { - return new L.DistortableCollection.Edit(group, options); -}; - -/***/ }), - -/***/ "./src/edit/DistortableImage.Edit.js": -/*!*******************************************!*\ - !*** ./src/edit/DistortableImage.Edit.js ***! - \*******************************************/ -/***/ (function() { - -L.DistortableImage = L.DistortableImage || {}; // holds the keybindings & toolbar API for an individual image instance - -L.DistortableImage.Edit = L.Handler.extend({ - options: { - opacity: 0.7, - outline: '1px solid red', - keymap: L.distortableImage.action_map - }, - initialize: function initialize(overlay, options) { - this._overlay = overlay; - this._toggledImage = false; - this._mode = overlay.options.mode; - this._transparent = false; - this._outlined = false; - L.setOptions(this, options); - L.distortableImage.action_map.Escape = '_deselect'; - }, - - /* Run on image selection. */ - addHooks: function addHooks() { - var overlay = this._overlay; - this.editActions = this.options.actions; - /* bring the selected image into view */ - - overlay.bringToFront(); - - this._initModes(); - - this._initHandles(); - - this._appendHandlesandDragable(); - - if (overlay.isSelected() && !overlay.options.suppressToolbar) { - this._addToolbar(); - } - - this.parentGroup = overlay.eP ? overlay.eP : false; - L.DomEvent.on(overlay.getElement(), { - dblclick: this.nextMode - }, this); - L.DomEvent.on(window, 'keydown', this._onKeyDown, this); - }, - - /* Run on image deselection. */ - removeHooks: function removeHooks() { - var overlay = this._overlay; - var eP = this.parentGroup; // First, check if dragging exists - it may be off due to locking - - this._disableDragging(); - - if (this.toolbar) { - this._removeToolbar(); - } - - for (var handle in this._handles) { - L.DomUtil.remove(handle); - } - /** - * ensures if you disable an image while it is multi-selected - * additional deselection logic is run - */ - - - if (L.DomUtil.hasClass(overlay.getElement(), 'collected')) { - L.DomUtil.removeClass(overlay.getElement(), 'collected'); - } - - if (eP && !eP.anyCollected() && eP.editing.toolbar) { - eP.editing._removeToolbar(); - } - - L.DomEvent.off(overlay.getElement(), { - dblclick: this.nextMode - }, this); - L.DomEvent.off(window, 'keydown', this._onKeyDown, this); - }, - disable: function disable() { - if (!this._enabled) { - return this; - } - - this._overlay.deselect(); - - this._enabled = false; - this.removeHooks(); - return this; - }, - _initModes: function _initModes() { - this._modes = {}; // passed from L.DistortablImage.PopupBar. If the mode is one - // of the current toolbar actions, adds it to this._modes - - for (var mode in L.DistortableImage.Edit.MODES) { - var action = L.DistortableImage.Edit.MODES[mode]; - - if (this.editActions.indexOf(action) !== -1) { - this._modes[mode] = action; - } - } // sets the current mode to the 1st available one if the one selected - // during initialization is not available - - - if (!this._modes[this._mode]) { - this._mode = Object.keys(this._modes)[0]; - } - }, - _initHandles: function _initHandles() { - var overlay = this._overlay; - var i; - this._dragHandles = L.layerGroup(); - - for (i = 0; i < 4; i++) { - this._dragHandles.addLayer(L.dragHandle(overlay, i)); - } - - this._scaleHandles = L.layerGroup(); - - for (i = 0; i < 4; i++) { - this._scaleHandles.addLayer(L.scaleHandle(overlay, i)); - } - - this._distortHandles = L.layerGroup(); - - for (i = 0; i < 4; i++) { - this._distortHandles.addLayer(L.distortHandle(overlay, i)); - } - - this._rotateHandles = L.layerGroup(); // individual rotate - - for (i = 0; i < 4; i++) { - this._rotateHandles.addLayer(L.rotateHandle(overlay, i)); - } // handle includes rotate AND scale - - - this._freeRotateHandles = L.layerGroup(); - - for (i = 0; i < 4; i++) { - this._freeRotateHandles.addLayer(L.freeRotateHandle(overlay, i)); - } - - this._lockHandles = L.layerGroup(); - - for (i = 0; i < 4; i++) { - this._lockHandles.addLayer(L.lockHandle(overlay, i, { - draggable: false - })); - } - - this._handles = { - drag: this._dragHandles, - scale: this._scaleHandles, - distort: this._distortHandles, - rotate: this._rotateHandles, - freeRotate: this._freeRotateHandles, - lock: this._lockHandles - }; - }, - _appendHandlesandDragable: function _appendHandlesandDragable() { - var ov = this._overlay; // won't throw error if user adds 0 mode actions to toolbar - - if (!this._mode) { - this._enableDragging(); - - return; - } - - this._updateHandle(); - - if (!ov.isSelected() && this.currentHandle) { - this.currentHandle.eachLayer(function (handle) { - handle.setOpacity(0); - - if (handle.dragging) { - handle.dragging.disable(); - } - }); - } - - if (!this.isMode('lock')) { - this._enableDragging(); - } - }, - _onKeyDown: function _onKeyDown(e) { - var keymap = this.options.keymap; - var handlerName = keymap[e.key]; - var ov = this._overlay; - var eP = this.parentGroup; - - if (eP && eP.anyCollected()) { - return; - } - - if (this[handlerName] !== undefined && !ov.options.suppressToolbar) { - if (ov.isSelected() && this.toolbar) { - this[handlerName].call(this); - } - } - }, - replaceTool: function replaceTool(old, next) { - var _this = this; - - if (next.baseClass !== 'leaflet-toolbar-icon' || this.hasTool(next)) { - return this; - } - - this.editActions.some(function (item, idx) { - if (item === old) { - _this._removeToolbar(); - - _this.editActions[idx] = next; - - _this._addToolbar(); - - for (var mode in L.DistortableImage.Edit.MODES) { - if (L.DistortableImage.Edit.MODES[mode] === old) { - delete _this._modes[mode]; - - _this._nextOrNone(mode); - } else if (L.DistortableImage.Edit.MODES[mode] === next) { - _this._modes[mode] = next; - } - } - - return true; - } - }); - return this; - }, - addTool: function addTool(value) { - if (value.baseClass === 'leaflet-toolbar-icon' && !this.hasTool(value)) { - this._removeToolbar(); - - this.editActions.push(value); - - this._addToolbar(); - - for (var mode in L.DistortableImage.Edit.MODES) { - if (L.DistortableImage.Edit.MODES[mode] === value) { - this._modes[mode] = value; - } - } - - if (!this._overlay.isSelected()) { - this._removeToolbar(); - } - } - - return this; - }, - hasTool: function hasTool(value) { - return this.editActions.some(function (action) { - return action === value; - }); - }, - removeTool: function removeTool(value) { - var _this2 = this; - - this.editActions.some(function (item, idx) { - if (item === value) { - _this2._removeToolbar(); - - _this2.editActions.splice(idx, 1); - - _this2._addToolbar(); - - for (var mode in L.DistortableImage.Edit.MODES) { - if (L.DistortableImage.Edit.MODES[mode] === value) { - delete _this2._modes[mode]; - - _this2._nextOrNone(mode); - } - } - - return true; - } - }); - - if (!this._overlay.isSelected()) { - this._removeToolbar(); - } - - return this; - }, - // set the mode to the next mode or if that was the last one set mode to '' - _nextOrNone: function _nextOrNone(mode) { - if (this.isMode(mode)) { - if (Object.keys(this.getModes()).length >= 1) { - this.nextMode(); - } else { - if (mode === 'lock') { - this._enableDragging(); - } - - this._mode = ''; - - this._updateHandle(); - } - } - }, - _removeToolbar: function _removeToolbar() { - var ov = this._overlay; - var map = ov._map; - - if (this.toolbar) { - map.removeLayer(this.toolbar); - this.toolbar = false; - } - }, - _enableDragging: function _enableDragging() { - var _this3 = this; - - var overlay = this._overlay; - var map = overlay._map; - this.dragging = new L.Draggable(overlay.getElement()); - this.dragging.enable(); - /* Hide toolbars and markers while dragging; click will re-show it */ - - this.dragging.on('dragstart', function () { - overlay.fire('dragstart'); - - _this3._removeToolbar(); - }); - /* - * Adjust default behavior of L.Draggable, which overwrites the CSS3 - * distort transformations that we set when it calls L.DomUtil.setPosition. - */ - - this.dragging._updatePosition = function () { - var topLeft = overlay.getCorner(0); - - var delta = this._newPos.subtract(map.latLngToLayerPoint(topLeft)); - - var currentPoint; - var corners = {}; - var i; - this.fire('predrag'); - - for (i = 0; i < 4; i++) { - currentPoint = map.latLngToLayerPoint(overlay.getCorner(i)); - corners[i] = map.layerPointToLatLng(currentPoint.add(delta)); - } - - overlay.setCorners(corners); - overlay.fire('drag'); - this.fire('drag'); - }; - - this.dragging.on('dragend', function () { - overlay.fire('dragend'); - }); - }, - _disableDragging: function _disableDragging() { - if (this.dragging) { - this.dragging.disable(); - delete this.dragging; - } - }, - _dragMode: function _dragMode() { - this.setMode('drag'); - }, - _scaleMode: function _scaleMode() { - this.setMode('scale'); - }, - _distortMode: function _distortMode() { - this.setMode('distort'); - }, - _rotateMode: function _rotateMode() { - this.setMode('rotate'); - }, - _freeRotateMode: function _freeRotateMode() { - this.setMode('freeRotate'); - }, - _toggleLockMode: function _toggleLockMode() { - if (this.isMode('lock')) { - this._unlock(); - } else { - this._lock(); - } - }, - _toggleOpacity: function _toggleOpacity() { - var image = this._overlay.getElement(); - - if (!this.hasTool(L.OpacityAction)) { - return; - } - - this._transparent = !this._transparent; - var opacity = this._transparent ? this.options.opacity : 1; - L.DomUtil.setOpacity(image, opacity); - image.setAttribute('opacity', opacity); - - this._refresh(); - }, - _toggleBorder: function _toggleBorder() { - var image = this._overlay.getElement(); - - if (!this.hasTool(L.BorderAction)) { - return; - } - - this._outlined = !this._outlined; - var outline = this._outlined ? this.options.outline : 'none'; - image.style.outline = outline; - - this._refresh(); - }, - // compare this to using overlay zIndex - _toggleOrder: function _toggleOrder() { - if (this._toggledImage) { - this._stackUp(); - } else { - this._stackDown(); - } - }, - _removeOverlay: function _removeOverlay() { - var ov = this._overlay; - var eP = this.parentGroup; - - if (this.isMode('lock') || !this.hasTool(L.DeleteAction)) { - return; - } - - var choice = L.DomUtil.confirmDelete(); - - if (!choice) { - return; - } - - this._removeToolbar(); - - if (eP) { - eP.removeLayer(ov); - } else { - ov._map.removeLayer(ov); - } - }, - // Based on https://github.com/publiclab/mapknitter/blob/8d94132c81b3040ae0d0b4627e685ff75275b416/app/assets/javascripts/mapknitter/Map.js#L47-L82 - _getExport: function _getExport() { - var overlay = this._overlay; - var map = overlay._map; - var img = overlay.getElement(); - - if (!this.hasTool(L.ExportAction)) { - return; - } // make a new image - - - var downloadable = new Image(); - downloadable.id = downloadable.id || 'tempId12345'; - document.body.appendChild(downloadable); - - downloadable.onload = function onLoadDownloadableImage() { - var height = downloadable.height; - var width = downloadable.width; - var nw = map.latLngToLayerPoint(overlay.getCorner(0)); - var ne = map.latLngToLayerPoint(overlay.getCorner(1)); - var sw = map.latLngToLayerPoint(overlay.getCorner(2)); - var se = map.latLngToLayerPoint(overlay.getCorner(3)); // I think this is to move the image to the upper left corner, - // eslint-disable-next-line max-len - // jywarren: i think we may need these or the image goes off the edge of the canvas - // jywarren: but these seem to break the distortion math... - // jywarren: i think it should be rejiggered so it - // finds the most negative values of x and y and then - // adds those to all coordinates - // nw.x -= nw.x; - // ne.x -= nw.x; - // se.x -= nw.x; - // sw.x -= nw.x; - // nw.y -= nw.y; - // ne.y -= nw.y; - // se.y -= nw.y; - // sw.y -= nw.y; - // run once warping is complete - - downloadable.onload = function () { - L.DomUtil.remove(downloadable); - }; - - if (window && window.hasOwnProperty('warpWebGl')) { - warpWebGl(downloadable.id, [0, 0, width, 0, width, height, 0, height], [nw.x, nw.y, ne.x, ne.y, se.x, se.y, sw.x, sw.y], true // trigger download - ); - } - }; - - downloadable.src = overlay.options.fullResolutionSrc || img.src; - }, - _stackUp: function _stackUp() { - var t = this._toggledImage; - - if (!t || !this.hasTool(L.StackAction)) { - return; - } - - this._toggledImage = false; - - this._overlay.bringToFront(); - - this._refresh(); - }, - _stackDown: function _stackDown() { - var t = this._toggledImage; - - if (t || !this.hasTool(L.StackAction)) { - return; - } - - this._toggledImage = true; - - this._overlay.bringToBack(); - - this._refresh(); - }, - _unlock: function _unlock() { - var ov = this._overlay; - var map = ov._map; - var eP = this.parentGroup; - - if (!this.isMode('lock')) { - return; - } - - if (eP && !eP.isCollected(ov) || !eP) { - if (!this.hasTool(L.LockAction)) { - return; - } - } - - if (this.currentHandle) { - map.removeLayer(this.currentHandle); - } - - if (ov.options.mode === 'lock' || !this.hasMode(ov.options.mode)) { - this._mode = ''; - this.currentHandle = ''; - } else { - this._mode = ov.options.mode; - } - - this._updateHandle(); - - this._enableDragging(); - - this._refresh(); - }, - _lock: function _lock() { - var ov = this._overlay; - var map = ov._map; - var eP = this.parentGroup; - - if (this.isMode('lock')) { - return; - } - - if (eP && !eP.isCollected(ov) || !eP) { - if (!this.hasTool(L.LockAction)) { - return; - } - } - - if (this.currentHandle) { - map.removeLayer(this.currentHandle); - } - - this._mode = 'lock'; - - this._updateHandle(); - - this._disableDragging(); - - this._refresh(); - }, - _deselect: function _deselect() { - this._overlay.deselect(); - }, - _showMarkers: function _showMarkers(e) { - var eP = this.parentGroup; - - if (!this.currentHandle) { - return; - } // only markers we want in collect interface for now is lock - - - if (!this.isMode('lock') && eP && eP.anyCollected()) { - return; - } - - this.currentHandle.eachLayer(function (handle) { - handle.setOpacity(1); - - if (handle.dragging) { - handle.dragging.enable(); - } - - L.DomUtil.addClass(handle.getElement(), 'leaflet-interactive'); - }); - }, - _hideMarkers: function _hideMarkers() { - var ov = this._overlay; - var eP = this.parentGroup; // workaround for race condition w/ feature group - - if (!this._handles) { - this._initHandles(); - } - - if (!this.currentHandle) { - return; - } - - if (this.isMode('lock') && eP && eP.isCollected(ov)) { - return; - } - - this.currentHandle.eachLayer(function (handle) { - handle.setOpacity(0); - - if (handle.dragging) { - handle.dragging.disable(); - } - - L.DomUtil.removeClass(handle.getElement(), 'leaflet-interactive'); - }); - }, - _updateHandle: function _updateHandle() { - var ov = this._overlay; - var map = ov._map; - var mode = this.getMode(); - - if (this.currentHandle) { - map.removeLayer(this.currentHandle); - } - - this.currentHandle = mode === '' ? '' : this._handles[mode]; - - if (this.currentHandle !== '') { - map.addLayer(this.currentHandle); - } - }, - _addToolbar: function _addToolbar() { - var ov = this._overlay; - var eP = this.parentGroup; - var map = ov._map; // Find the topmost point on the image. - - var corners = ov.getCorners(); - var maxLat = -Infinity; - - if (eP && eP.anyCollected()) { - eP.editing._addToolbar(); - - return; - } - - if (ov.options.suppressToolbar || this.toolbar) { - return; - } - - for (var i = 0; i < corners.length; i++) { - if (corners[i].lat > maxLat) { - maxLat = corners[i].lat; - } - } // Longitude is based on the centroid of the image. - - - var raisedPoint = ov.getCenter(); - raisedPoint.lat = maxLat; - this.toolbar = L.distortableImage.popupBar(raisedPoint, { - actions: this.editActions - }).addTo(map, ov); - ov.fire('toolbar:created'); - }, - _refresh: function _refresh() { - if (this.toolbar) { - this._removeToolbar(); - } - - this._addToolbar(); - }, - _updateToolbarPos: function _updateToolbarPos() { - var overlay = this._overlay; // Find the topmost point on the image. - - var corners = overlay.getCorners(); - var toolbar = this.toolbar; - var maxLat = -Infinity; - - if (toolbar && toolbar instanceof L.DistortableImage.PopupBar) { - for (var i = 0; i < corners.length; i++) { - if (corners[i].lat > maxLat) { - maxLat = corners[i].lat; - } - } // Longitude is based on the centroid of the image. - - - var raisedPoint = overlay.getCenter(); - raisedPoint.lat = maxLat; - - if (!overlay.options.suppressToolbar) { - this.toolbar.setLatLng(raisedPoint); - } - } - }, - hasMode: function hasMode(mode) { - return !!this._modes[mode]; - }, - getMode: function getMode() { - if (!this.enabled()) { - return; - } - - return this._mode; - }, - getModes: function getModes() { - return this._modes; - }, - isMode: function isMode(mode) { - if (!this.enabled()) { - return false; - } - - return this._mode === mode; - }, - setMode: function setMode(newMode) { - var ov = this._overlay; - var eP = this.parentGroup; - var mode = this.getMode(); - - if (mode === newMode || !this.hasMode(newMode) || !this.enabled()) { - return; - } - - if (this.toolbar) { - this.toolbar.clickTool(newMode); - } - - if (this.isMode('lock') && !this.dragging) { - this._enableDragging(); - } - - this._mode = newMode; - - if (this.isMode('lock')) { - this._disableDragging(); - } - - this._updateHandle(); - - this._refresh(); - - if (eP && eP.isCollected(ov)) { - ov.deselect(); - } - - return this; - }, - - /** - * need to attach a stop to img dblclick or it will propagate to - * the map and fire the handler that shows map location labels on map dblclick. - */ - nextMode: function nextMode(e) { - var mode = this.getMode(); - var eP = this.parentGroup; - var modesArray = Object.keys(this.getModes()); - var idx = modesArray.indexOf(mode); - var nextIdx = (idx + 1) % modesArray.length; - var newMode = modesArray[nextIdx]; - - if (e) { - if (eP && eP.anyCollected()) { - return; - } - - L.DomEvent.stop(e); - } - - return this.setMode(newMode); - } -}); - -L.distortableImage.edit = function (overlay, options) { - return new L.DistortableImage.Edit(overlay, options); -}; - -/***/ }), - -/***/ "./src/edit/actions/BorderAction.js": -/*!******************************************!*\ - !*** ./src/edit/actions/BorderAction.js ***! - \******************************************/ -/***/ (function() { - -L.BorderAction = L.EditAction.extend({ - initialize: function initialize(map, overlay, options) { - var edit = overlay.editing; - var mode = edit._mode; - var use; - var tooltip; - - if (edit._outlined) { - use = 'border_outer'; - tooltip = overlay.options.translation.removeBorder; - } else { - use = 'border_clear'; - tooltip = overlay.options.translation.addBorder; - } - - options = options || {}; - options.toolbarIcon = { - svg: true, - html: use, - tooltip: tooltip, - className: mode === 'lock' ? 'disabled' : '' - }; // conditional for disabling keybindings for this action when the image is locked. - - L.DistortableImage.action_map.b = mode === 'lock' ? '' : '_toggleBorder'; - L.EditAction.prototype.initialize.call(this, map, overlay, options); - }, - addHooks: function addHooks() { - var edit = this._overlay.editing; - L.IconUtil.toggleXlink(this._link, 'border_clear', 'border_outer'); - L.IconUtil.toggleTitle(this._link, 'Remove Border', 'Add Border'); - - edit._toggleBorder(); - } -}); - -/***/ }), - -/***/ "./src/edit/actions/DeleteAction.js": -/*!******************************************!*\ - !*** ./src/edit/actions/DeleteAction.js ***! - \******************************************/ -/***/ (function() { - -L.DeleteAction = L.EditAction.extend({ - initialize: function initialize(map, overlay, options) { - var edit = overlay.editing; - var use = 'delete_forever'; - var tooltip; - /** - * we can tell whether the overlay is an instance of `L.DistortableImageOverlay` or `L.DistortableCollection` bc only - * the former should have `parentGroup` defined on it. From there we call the apporpriate keybindings and methods. - */ - - if (edit instanceof L.DistortableImage.Edit) { - tooltip = overlay.options.translation.deleteImage; // backspace windows / delete mac - - L.DistortableImage.action_map.Backspace = edit._mode === 'lock' ? '' : '_removeOverlay'; - } else { - tooltip = overlay.options.translation.deleteImages; - L.DistortableImage.group_action_map.Backspace = edit._mode === 'lock' ? '' : '_removeGroup'; - } - - options = options || {}; - options.toolbarIcon = { - svg: true, - html: use, - tooltip: tooltip, - className: edit._mode === 'lock' ? 'disabled' : '' - }; - L.EditAction.prototype.initialize.call(this, map, overlay, options); - }, - addHooks: function addHooks() { - var edit = this._overlay.editing; - - if (edit instanceof L.DistortableImage.Edit) { - edit._removeOverlay(); - } else { - edit._removeGroup(); - } - } -}); - -/***/ }), - -/***/ "./src/edit/actions/DistortAction.js": -/*!*******************************************!*\ - !*** ./src/edit/actions/DistortAction.js ***! - \*******************************************/ -/***/ (function() { - -L.DistortAction = L.EditAction.extend({ - initialize: function initialize(map, overlay, options) { - options = options || {}; - options.toolbarIcon = { - svg: true, - html: 'distort', - tooltip: overlay.options.translation.distortImage, - className: 'distort' - }; - L.DistortableImage.action_map.d = '_distortMode'; - L.EditAction.prototype.initialize.call(this, map, overlay, options); - }, - addHooks: function addHooks() { - var edit = this._overlay.editing; - - edit._distortMode(); - } -}); - -/***/ }), - -/***/ "./src/edit/actions/DragAction.js": -/*!****************************************!*\ - !*** ./src/edit/actions/DragAction.js ***! - \****************************************/ -/***/ (function() { - -L.DragAction = L.EditAction.extend({ - initialize: function initialize(map, overlay, options) { - options = options || {}; - options.toolbarIcon = { - svg: true, - html: 'drag', - tooltip: overlay.options.translation.dragImage, - className: 'drag' - }; - L.DistortableImage.action_map.D = '_dragMode'; - L.EditAction.prototype.initialize.call(this, map, overlay, options); - }, - addHooks: function addHooks() { - var edit = this._overlay.editing; - - edit._dragMode(); - } -}); - -/***/ }), - -/***/ "./src/edit/actions/EditAction.js": -/*!****************************************!*\ - !*** ./src/edit/actions/EditAction.js ***! - \****************************************/ -/***/ (function() { - -L.DistortableImage = L.DistortableImage || {}; -L.distortableImage = L.DistortableImage; -L.DistortableImage.action_map = {}; -L.EditAction = L.Toolbar2.Action.extend({ - options: { - toolbarIcon: { - svg: false, - html: '', - className: '', - tooltip: '' - } - }, - initialize: function initialize(map, overlay, options) { - this._overlay = overlay; - this._map = map; - L.setOptions(this, options); - L.Toolbar2.Action.prototype.initialize.call(this, options); - - this._injectIconSet(); - }, - _createIcon: function _createIcon(toolbar, container, args) { - var _this = this; - - var iconOptions = this.options.toolbarIcon; - var className = iconOptions.className; - var edit = this._overlay.editing; - this.toolbar = toolbar; - this._icon = L.DomUtil.create('li', '', container); - this._link = L.DomUtil.create('a', '', this._icon); - - if (iconOptions.svg) { - this._link.innerHTML = L.IconUtil.create(iconOptions.html); - } else { - this._link.innerHTML = iconOptions.html; - } - - this._link.setAttribute('href', '#'); - - this._link.setAttribute('title', iconOptions.tooltip); - - this._link.setAttribute('role', 'button'); - - L.DomUtil.addClass(this._link, this.constructor.baseClass); - - if (className) { - L.DomUtil.addClass(this._link, className); - - if (className === 'disabled') { - L.DomUtil.addClass(this._icon, className); - } - - if (className === edit._mode) { - L.DomUtil.addClass(this._link, 'selected-mode'); - } else { - L.DomUtil.removeClass(this._link, 'selected-mode'); - } - } - - L.DomEvent.on(this._link, 'click', this.enable, this); - L.DomEvent.on(this._overlay, 'update', function () { - var match = _this._link.innerHTML.match(/xlink:href="#restore"/); - - if (match && match.length === 1) { - _this._enableAction(); - } - }); - /* Add secondary toolbar */ - - this._addSubToolbar(toolbar, this._icon, args); - }, - _injectIconSet: function _injectIconSet() { - if (document.querySelector('#iconset')) { - return; - } - - var el = document.createElement('div'); - el.id = 'iconset'; - el.setAttribute('hidden', 'hidden'); - el.innerHTML = new L.ToolbarIconSet().render(); - document.querySelector('.leaflet-marker-pane').appendChild(el); - }, - _enableAction: function _enableAction() { - L.DomUtil.removeClass(this._link.parentElement, 'disabled'); - L.DomUtil.removeClass(this._link, 'disabled'); - }, - _disableAction: function _disableAction() { - L.DomUtil.addClass(this._link.parentElement, 'disabled'); - L.DomUtil.addClass(this._link, 'disabled'); - } -}); - -L.editAction = function (map, overlay, options) { - return new L.EditAction(map, overlay, options); -}; - -/***/ }), - -/***/ "./src/edit/actions/ExportAction.js": -/*!******************************************!*\ - !*** ./src/edit/actions/ExportAction.js ***! - \******************************************/ -/***/ (function() { - -L.ExportAction = L.EditAction.extend({ - // This function is executed every time we select an image - initialize: function initialize(map, overlay, options) { - var edit = overlay.editing; - var tooltip; - this.isExporting = false; - this.mouseLeaveSkip = true; - this.isHooksExecuted = false; - - if (edit instanceof L.DistortableImage.Edit) { - L.DistortableImage.action_map.e = '_getExport'; - tooltip = overlay.options.translation.exportImage; - } else { - L.DistortableImage.group_action_map.e = 'runExporter'; - tooltip = overlay.options.translation.exportImages; - } - - options = options || {}; - options.toolbarIcon = { - svg: true, - html: 'get_app', - tooltip: tooltip - }; - L.EditAction.prototype.initialize.call(this, map, overlay, options); - }, - addHooks: function addHooks() { - var edit = this._overlay.editing; - - if (edit instanceof L.DistortableImage.Edit) { - edit._getExport(); - - return; - } // Make sure that addHooks is executed only once, event listeners will handle the rest - - - if (this.isHooksExecuted) { - return; - } else { - this.isHooksExecuted = true; - } - - var exportTool = this._link.parentElement; - this.mouseEnterHandler = this.handleMouseEnter.bind(this); - this.mouseLeaveHandler = this.handleMouseLeave.bind(this); - L.DomEvent.on(exportTool, 'click', function () { - if (!this.isExporting) { - this.isExporting = true; - this.renderExportIcon(); - setTimeout(this.attachMouseEventListeners.bind(this, exportTool), 100); - edit.runExporter().then(function () { - this.resetState(); - this.detachMouseEventListeners(exportTool); - }.bind(this)); - } else { - // Clicking on the export icon after export has started will be ignored - if (this.mouseLeaveSkip) { - return; - } - - this.resetState(); - this.detachMouseEventListeners(exportTool); - edit.cancelExport(); - } - }, this); - }, - resetState: function resetState() { - this.renderDownloadIcon(); - this.isExporting = false; - this.mouseLeaveSkip = true; - }, - attachMouseEventListeners: function attachMouseEventListeners(element) { - element.addEventListener('mouseenter', this.mouseEnterHandler); - element.addEventListener('mouseleave', this.mouseLeaveHandler); - }, - detachMouseEventListeners: function detachMouseEventListeners(element) { - element.removeEventListener('mouseenter', this.mouseEnterHandler); - element.removeEventListener('mouseleave', this.mouseLeaveHandler); - }, - handleMouseEnter: function handleMouseEnter() { - this.renderCancelIcon(); - }, - handleMouseLeave: function handleMouseLeave() { - if (this.mouseLeaveSkip) { - this.mouseLeaveSkip = false; - } else { - this.renderExportIcon(); - } - }, - renderDownloadIcon: function renderDownloadIcon() { - L.IconUtil.toggleXlink(this._link, 'get_app', 'spinner'); - L.IconUtil.toggleTitle(this._link, 'Export Images', 'Loading...'); - L.DomUtil.removeClass(this._link.firstChild, 'loader'); - }, - renderExportIcon: function renderExportIcon() { - L.IconUtil.toggleXlink(this._link, 'spinner'); - L.IconUtil.toggleTitle(this._link, 'Export Images', 'Loading...'); - L.IconUtil.addClassToSvg(this._link, 'loader'); - }, - renderCancelIcon: function renderCancelIcon() { - L.IconUtil.toggleXlink(this._link, 'cancel'); - L.IconUtil.toggleTitle(this._link, 'Cancel Export', 'Loading...'); - L.DomUtil.removeClass(this._link.firstChild, 'loader'); - } -}); - -/***/ }), - -/***/ "./src/edit/actions/FreeRotateAction.js": -/*!**********************************************!*\ - !*** ./src/edit/actions/FreeRotateAction.js ***! - \**********************************************/ -/***/ (function() { - -L.FreeRotateAction = L.EditAction.extend({ - initialize: function initialize(map, overlay, options) { - options = options || {}; - options.toolbarIcon = { - svg: true, - html: 'crop_rotate', - tooltip: overlay.options.translation.freeRotateImage, - className: 'freeRotate' - }; - L.DistortableImage.action_map.f = '_freeRotateMode'; - L.EditAction.prototype.initialize.call(this, map, overlay, options); - }, - addHooks: function addHooks() { - var edit = this._overlay.editing; - - edit._freeRotateMode(); - } -}); - -/***/ }), - -/***/ "./src/edit/actions/GeolocateAction.js": -/*!*********************************************!*\ - !*** ./src/edit/actions/GeolocateAction.js ***! - \*********************************************/ -/***/ (function() { - -L.GeolocateAction = L.EditAction.extend({ - initialize: function initialize(map, overlay, options) { - var edit = overlay.editing; - options = options || {}; - options.toolbarIcon = { - svg: true, - html: 'explore', - tooltip: overlay.options.translation.geolocateImage, - className: edit._mode === 'lock' ? 'disabled' : '' - }; - L.EditAction.prototype.initialize.call(this, map, overlay, options); - }, - addHooks: function addHooks() { - var image = this._overlay.getElement(); - - EXIF.getData(image, L.EXIF(image)); - } -}); - -/***/ }), - -/***/ "./src/edit/actions/LockAction.js": -/*!****************************************!*\ - !*** ./src/edit/actions/LockAction.js ***! - \****************************************/ -/***/ (function() { - -L.LockAction = L.EditAction.extend({ - initialize: function initialize(map, overlay, options) { - var edit = overlay.editing; - var use; - var tooltip; - - if (edit instanceof L.DistortableImage.Edit) { - L.DistortableImage.action_map.u = '_unlock'; - L.DistortableImage.action_map.l = '_lock'; - tooltip = overlay.options.translation.lockMode; - use = edit.isMode('lock') ? 'lock' : 'unlock'; - } else { - L.DistortableImage.group_action_map.l = '_lockGroup'; - tooltip = overlay.options.translation.lockImages; - use = 'lock'; - } - - options = options || {}; - options.toolbarIcon = { - svg: true, - html: use, - tooltip: tooltip, - className: 'lock' - }; - L.EditAction.prototype.initialize.call(this, map, overlay, options); - }, - addHooks: function addHooks() { - var edit = this._overlay.editing; - - if (edit instanceof L.DistortableImage.Edit) { - edit._toggleLockMode(); - } else { - edit._lockGroup(); - } - } -}); - -/***/ }), - -/***/ "./src/edit/actions/OpacityAction.js": -/*!*******************************************!*\ - !*** ./src/edit/actions/OpacityAction.js ***! - \*******************************************/ -/***/ (function() { - -L.OpacityAction = L.EditAction.extend({ - initialize: function initialize(map, overlay, options) { - var edit = overlay.editing; - var mode = edit._mode; - var use; - var tooltip; - - if (edit._transparent) { - use = 'opacity_empty'; - tooltip = overlay.options.translation.makeImageOpaque; - } else { - use = 'opacity'; - tooltip = overlay.options.translation.makeImageTransparent; - } - - options = options || {}; - options.toolbarIcon = { - svg: true, - html: use, - tooltip: tooltip, - className: mode === 'lock' ? 'disabled' : '' - }; - L.DistortableImage.action_map.o = mode === 'lock' ? '' : '_toggleOpacity'; - L.EditAction.prototype.initialize.call(this, map, overlay, options); - }, - addHooks: function addHooks() { - var edit = this._overlay.editing; - var link = this._link; - L.IconUtil.toggleXlink(link, 'opacity', 'opacity_empty'); - L.IconUtil.toggleTitle(link, 'Make Image Transparent', 'Make Image Opaque'); - - edit._toggleOpacity(); - } -}); - -/***/ }), - -/***/ "./src/edit/actions/RestoreAction.js": -/*!*******************************************!*\ - !*** ./src/edit/actions/RestoreAction.js ***! - \*******************************************/ -/***/ (function() { - -L.RestoreAction = L.EditAction.extend({ - initialize: function initialize(map, overlay, options) { - var mode = L.Utils.getNestedVal(overlay, 'editing', '_mode'); - var edited = overlay.edited; - options = options || {}; - options.toolbarIcon = { - svg: true, - html: 'restore', - tooltip: overlay.options.translation.restoreImage, - className: edited && mode !== 'lock' ? '' : 'disabled' - }; - L.EditAction.prototype.initialize.call(this, map, overlay, options); - }, - addHooks: function addHooks() { - var ov = this._overlay; - L.DomEvent.on(ov, { - edit: this._enableAction, - restore: this._disableAction - }, this); - ov.restore(); - } -}); - -/***/ }), - -/***/ "./src/edit/actions/RotateAction.js": -/*!******************************************!*\ - !*** ./src/edit/actions/RotateAction.js ***! - \******************************************/ -/***/ (function() { - -L.RotateAction = L.EditAction.extend({ - initialize: function initialize(map, overlay, options) { - options = options || {}; - options.toolbarIcon = { - svg: true, - html: 'rotate', - tooltip: overlay.options.translation.rotateImage, - className: 'rotate' - }; - L.DistortableImage.action_map.r = '_rotateMode'; - L.EditAction.prototype.initialize.call(this, map, overlay, options); - }, - addHooks: function addHooks() { - var edit = this._overlay.editing; - - edit._rotateMode(); - } -}); - -/***/ }), - -/***/ "./src/edit/actions/ScaleAction.js": -/*!*****************************************!*\ - !*** ./src/edit/actions/ScaleAction.js ***! - \*****************************************/ -/***/ (function() { - -L.ScaleAction = L.EditAction.extend({ - initialize: function initialize(map, overlay, options) { - options = options || {}; - options.toolbarIcon = { - svg: true, - html: 'scale', - tooltip: overlay.options.translation.scaleImage, - className: 'scale' - }; - L.DistortableImage.action_map.s = '_scaleMode'; - L.EditAction.prototype.initialize.call(this, map, overlay, options); - }, - addHooks: function addHooks() { - var edit = this._overlay.editing; - - edit._scaleMode(); - } -}); - -/***/ }), - -/***/ "./src/edit/actions/StackAction.js": -/*!*****************************************!*\ - !*** ./src/edit/actions/StackAction.js ***! - \*****************************************/ -/***/ (function() { - -L.StackAction = L.EditAction.extend({ - initialize: function initialize(map, overlay, options) { - var edit = overlay.editing; - var use; - var tooltip; - - if (edit._toggledImage) { - use = 'flip_to_back'; - tooltip = overlay.options.translation.stackToFront; - } else { - use = 'flip_to_front'; - tooltip = overlay.options.translation.stackToBack; - } - - options = options || {}; - options.toolbarIcon = { - svg: true, - html: use, - tooltip: tooltip, - className: edit._mode === 'lock' ? 'disabled' : '' - }; - L.DistortableImage.action_map.q = edit._mode === 'lock' ? '' : '_stackUp'; - L.DistortableImage.action_map.a = edit._mode === 'lock' ? '' : '_stackDown'; - L.EditAction.prototype.initialize.call(this, map, overlay, options); - }, - addHooks: function addHooks() { - var edit = this._overlay.editing; - L.IconUtil.toggleXlink(this._link, 'flip_to_front', 'flip_to_back'); - L.IconUtil.toggleTitle(this._link, 'Stack to Front', 'Stack to Back'); - - edit._toggleOrder(); - } -}); - -/***/ }), - -/***/ "./src/edit/actions/UnlockAction.js": -/*!******************************************!*\ - !*** ./src/edit/actions/UnlockAction.js ***! - \******************************************/ -/***/ (function() { - -L.UnlockAction = L.EditAction.extend({ - initialize: function initialize(map, overlay, options) { - options = options || {}; - options.toolbarIcon = { - svg: true, - html: 'unlock', - tooltip: overlay.options.translation.unlockImages - }; - L.DistortableImage.group_action_map.u = '_unlockGroup'; - L.EditAction.prototype.initialize.call(this, map, overlay, options); - }, - addHooks: function addHooks() { - var edit = this._overlay.editing; - - edit._unlockGroup(); - } -}); - -/***/ }), - -/***/ "./src/edit/getEXIFdata.js": -/*!*********************************!*\ - !*** ./src/edit/getEXIFdata.js ***! - \*********************************/ -/***/ (function() { - -/* eslint-disable no-unused-vars */ -L.EXIF = function getEXIFdata(img) { - if (Object.keys(EXIF.getAllTags(img)).length !== 0) { - console.log(EXIF.getAllTags(img)); - var GPS = EXIF.getAllTags(img); - var altitude; - /* If the lat/lng is available. */ - - if (typeof GPS.GPSLatitude !== 'undefined' && typeof GPS.GPSLongitude !== 'undefined') { - // sadly, encoded in [degrees,minutes,seconds] - // primitive value = GPS.GPSLatitude[x].numerator - var lat = GPS.GPSLatitude[0] + GPS.GPSLatitude[1] / 60 + GPS.GPSLatitude[2] / 3600; - var lng = GPS.GPSLongitude[0] + GPS.GPSLongitude[1] / 60 + GPS.GPSLongitude[2] / 3600; - - if (GPS.GPSLatitudeRef !== 'N') { - lat = lat * -1; - } - - if (GPS.GPSLongitudeRef === 'W') { - lng = lng * -1; - } - } // Attempt to use GPS compass heading; will require - // some trig to calc corner points, which you can find below: - - - var angle = 0; // "T" refers to "True north", so -90. - - if (GPS.GPSImgDirectionRef === 'T') { - angle = Math.PI / 180 * (GPS.GPSImgDirection.numerator / GPS.GPSImgDirection.denominator - 90); // "M" refers to "Magnetic north" - } else if (GPS.GPSImgDirectionRef === 'M') { - angle = Math.PI / 180 * (GPS.GPSImgDirection.numerator / GPS.GPSImgDirection.denominator - 90); - } else { - console.log('No compass data found'); - } - - console.log('Orientation:', GPS.Orientation); - /* If there is orientation data -- i.e. landscape/portrait etc */ - - if (GPS.Orientation === 6) { - // CCW - angle += Math.PI / 180 * -90; - } else if (GPS.Orientation === 8) { - // CW - angle += Math.PI / 180 * 90; - } else if (GPS.Orientation === 3) { - // 180 - angle += Math.PI / 180 * 180; - } - /* If there is altitude data */ - - - if (typeof GPS.GPSAltitude !== 'undefined' && typeof GPS.GPSAltitudeRef !== 'undefined') { - // Attempt to use GPS altitude: - // (may eventually need to find EXIF field of view for correction) - if (typeof GPS.GPSAltitude !== 'undefined' && typeof GPS.GPSAltitudeRef !== 'undefined') { - altitude = GPS.GPSAltitude.numerator / GPS.GPSAltitude.denominator + GPS.GPSAltitudeRef; - } else { - altitude = 0; // none - } - } - } else { - alert('EXIF initialized. Press again to view data in console.'); - } -}; - -/***/ }), - -/***/ "./src/edit/handles/DistortHandle.js": -/*!*******************************************!*\ - !*** ./src/edit/handles/DistortHandle.js ***! - \*******************************************/ -/***/ (function() { - -L.DistortHandle = L.EditHandle.extend({ - options: { - TYPE: 'distort', - icon: L.icon({ - iconUrl: // eslint-disable-next-line max-len - 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAChSURBVO3BIU4DURgGwNkvL2B6AkQTLBqP4QCoSm7DDXoBLBZHDbfgICAIZjEV3YTn9uVHdMZZtcnCfI13bIzxg0emg6Nm6QVbYz3jylEsXRrvwommb49X67jFkz80fR9Mb1YxTzqiWBSLYlEsikWxKBbFolgUi2JRLIpFsSgWxaJY03fHHOu40dH07bAzWCx9Ge/TiWbpHgdsjPGNB2f/yS+7xRCyiiZPJQAAAABJRU5ErkJggg==', - iconSize: [32, 32], - iconAnchor: [16, 16] - }) - }, - _onHandleDrag: function _onHandleDrag() { - var overlay = this._handled; - overlay.setCorner(this._corner, this.getLatLng()); - }, - updateHandle: function updateHandle() { - this.setLatLng(this._handled.getCorner(this._corner)); - } -}); - -L.distortHandle = function (overlay, idx, options) { - return new L.DistortHandle(overlay, idx, options); -}; - -/***/ }), - -/***/ "./src/edit/handles/DragHandle.js": -/*!****************************************!*\ - !*** ./src/edit/handles/DragHandle.js ***! - \****************************************/ -/***/ (function() { - -L.DragHandle = L.EditHandle.extend({ - options: { - TYPE: 'drag', - icon: L.icon({ - // eslint-disable-next-line max-len - iconUrl: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAsVJREFUeNrMVztLXEEUvnNVFAVBAhY2aRKbTZEHJNpYabuNjSgYg/GxdsmPSJkUAa/ZdVEX8mgWYVutbHxAHkVskjQBuUUgBISVhCQk3wnfwMlk1rusN1wHPubOzJlzvjlz5sxc01Ma/hUEwQnwDIjqc7uvgv9YYO86qgIwCXQbdNTlQ8kcCBHgBch8TcloF6oJGr6phk6EQAkfdz3zvgDr9Mr7Fg1fptEZoM8jsmrokpfsiIFO4IIjuE2v1EDmR4LRdlR5Gh51hj8D34ABtm8YTtqna0TgklIw5CgQguKxIojEjmFROg/MKQO27NkFAB+4wAPouGUJiIvWKHwbAxX2XyWRKWkqhT+pbJntJZJuUzISW0+5hW+obxrVBsfvoH/dqCCJuU97GBh2VteLSiYvArmErT8EVoAK9Bw7enbpVYmvAQlyowYforrH5jXL2rPHI/TKONDB7u9AlavdaTBPvPmazUeQuy8f7UomUgTEwIJPEQ3sQGE/6ll2l9H/KcEzBcfWn2IclluM3DpddJxSHujlFkscbUPvmB0LHVnLrId7nlaZVkEc6QGXQI1MAwZcWmVRHeNaQwJMMiU2cwy4s7p/RJ2ckpvIQs+cIs+5GzitloLKHUV3MPREuXbTOKO91dX387gGTONxIgEWm+E61FFrpcyqXLHsEwiDjEsjAksqw5XPoL9MHVrn6QR4q+XZrDaR4RoWzq2ymafuRA/Mq1stSsHLVkcbdf9VjOcx8ZH3+SFWcCWlVPyWuUBOwUWdC1wP5NVjYiXFWLO69PZ6CRTUY6KSIoEKdf6T3IzzgHxnsyHctNBEkmn6Oob8ExUDg/ahGybd177cDjzH5xHwgDiSvoS7I/LZyvxJZj0wod7tkX5G0XVC7rEyLhfLJjBGbKoLLEfZWObyKeZ6oY82g+yf5Zn/mJyHX7PMf04z/T3/LcAAu4E6iiyJqf0AAAAASUVORK5CYII=', - iconSize: [32, 32], - iconAnchor: [16, 16] - }) - }, - _onHandleDrag: function _onHandleDrag() { - var overlay = this._handled; - var formerLatLng = overlay.getCorner(this._corner); - var newLatLng = this.getLatLng(); - overlay.dragBy(formerLatLng, newLatLng); - }, - updateHandle: function updateHandle() { - this.setLatLng(this._handled.getCorner(this._corner)); - } -}); - -L.dragHandle = function (overlay, idx, options) { - return new L.DragHandle(overlay, idx, options); -}; - -/***/ }), - -/***/ "./src/edit/handles/EditHandle.js": -/*!****************************************!*\ - !*** ./src/edit/handles/EditHandle.js ***! - \****************************************/ -/***/ (function() { - -L.EditHandle = L.Marker.extend({ - initialize: function initialize(overlay, corner, options) { - var latlng = overlay.getCorner(corner); - L.setOptions(this, options); - this._handled = overlay; - this._corner = corner; - var markerOptions = { - draggable: true, - zIndexOffset: 10 - }; - - if (options && options.hasOwnProperty('draggable')) { - markerOptions.draggable = options.draggable; - } - - L.Marker.prototype.initialize.call(this, latlng, markerOptions); - }, - onAdd: function onAdd(map) { - L.Marker.prototype.onAdd.call(this, map); - - this._bindListeners(); - - this.updateHandle(); - }, - onRemove: function onRemove(map) { - this._unbindListeners(); - - L.Marker.prototype.onRemove.call(this, map); - }, - _onHandleDragStart: function _onHandleDragStart() { - this._handled.fire('editstart'); - }, - _onHandleDragEnd: function _onHandleDragEnd() { - this._fireEdit(); - }, - _fireEdit: function _fireEdit() { - this._handled.edited = true; - - this._handled.fire('edit'); - }, - _bindListeners: function _bindListeners() { - this.on({ - contextmenu: L.DomEvent.stop, - dragstart: this._onHandleDragStart, - drag: this._onHandleDrag, - dragend: this._onHandleDragEnd - }, this); - - this._handled._map.on('zoomend', this.updateHandle, this); - - this._handled.on('update', this.updateHandle, this); - }, - _unbindListeners: function _unbindListeners() { - this.off({ - contextmenu: L.DomEvent.stop, - dragstart: this._onHandleDragStart, - drag: this._onHandleDrag, - dragend: this._onHandleDragEnd - }, this); - - this._handled._map.off('zoomend', this.updateHandle, this); - - this._handled.off('update', this.updateHandle, this); - }, - - /* Takes two latlngs and calculates the scaling difference. */ - _calculateScalingFactor: function _calculateScalingFactor(latlngA, latlngB) { - var overlay = this._handled; - var map = overlay._map; - var centerPoint = map.latLngToLayerPoint(overlay.getCenter()); - var formerPoint = map.latLngToLayerPoint(latlngA); - var newPoint = map.latLngToLayerPoint(latlngB); - - var formerRadiusSquared = this._d2(centerPoint, formerPoint); - - var newRadiusSquared = this._d2(centerPoint, newPoint); - - return Math.sqrt(newRadiusSquared / formerRadiusSquared); - }, - - /* Distance between two points in cartesian space, squared (distance formula). */ - _d2: function _d2(a, b) { - var dx = a.x - b.x; - var dy = a.y - b.y; - return Math.pow(dx, 2) + Math.pow(dy, 2); - }, - - /* Takes two latlngs and calculates the angle between them. */ - calculateAngleDelta: function calculateAngleDelta(latlngA, latlngB) { - var overlay = this._handled; - var map = overlay._map; - var centerPoint = map.latLngToLayerPoint(overlay.getCenter()); - var formerPoint = map.latLngToLayerPoint(latlngA); - var newPoint = map.latLngToLayerPoint(latlngB); - var initialAngle = Math.atan2(centerPoint.y - formerPoint.y, centerPoint.x - formerPoint.x); - var newAngle = Math.atan2(centerPoint.y - newPoint.y, centerPoint.x - newPoint.x); - return newAngle - initialAngle; - } -}); - -/***/ }), - -/***/ "./src/edit/handles/FreeRotateHandle.js": -/*!**********************************************!*\ - !*** ./src/edit/handles/FreeRotateHandle.js ***! - \**********************************************/ -/***/ (function() { - -L.FreeRotateHandle = L.EditHandle.extend({ - options: { - TYPE: 'freeRotate', - icon: L.icon({ - iconUrl: // eslint-disable-next-line max-len - 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAHiSURBVMXBa3HbShgA0PMp/1sCCo8oCEpgTaCXgIXAJiDzyCJoAUTm4UVQAns1Y8+snWnTvJyeE16hkjDgDrfoNTMKcpC9UPiLSo8JyetkjEHxjPCMyoS199kFoz8Iv1HpMaN3qWDCHoegOKkkRwnJpRmroHgiPFEZ8IBekzEGxQtUEhKSS/fB7Ew4U+lxcGkVZG9QWWPSFAxBcdK59KApuA+yNwp2uEdx1GN25sZJZULSfAtm77SlbNjju6MvG75u+WHRWVR6rDVjMPsgwYyVZl3pLTpHkyYHOx8syMiayaJzlDTZ9YyaZNFVkiYH2ZUEBcVJJXVImuz6Js3Qofe59pq7DoOTILu+g+a288mCouk7/1iH4qTS+2QdDppbV1ZJmrnDXnPnc5UOs2Z0fUmTuyBr+krvSioJyUmQO0dZM7mepMkWnaNRkyrJB6uskTSjxY3Fll8bvmJwlDb83FJ8gMqAB80uyBY3Trb82PAfvjj6vuHnluIdKgMeNXOwctK5NKBoHitrb1RJeHRp5Ux4ojLg0aWMHGQvUOkxIWkKVsHsTPiNSo8HDC5lZIsgO6n0uMUdRvQuFQxB8UR4RmXC2vvsgtEfhL+o9JiQvE7GGBTPCK9QSUjoMWgKDthjDrIX+h/k0I7gth6N5gAAAABJRU5ErkJggg==', - iconSize: [32, 32], - iconAnchor: [16, 16] - }) - }, - _onHandleDrag: function _onHandleDrag() { - var overlay = this._handled; - var map = overlay._map; - var formerLatLng = overlay.getCorner(this._corner); - var newLatLng = this.getLatLng(); - var angle = this.calculateAngleDelta(formerLatLng, newLatLng); - - var scale = this._calculateScalingFactor(formerLatLng, newLatLng); - - if (angle !== 0) { - overlay.rotateBy(angle, 'rad'); - } - - var edgeMinWidth = overlay.edgeMinWidth; - - if (!edgeMinWidth) { - edgeMinWidth = 50; - } - /* just in case */ - - - var corner1 = map.latLngToContainerPoint(overlay.getCorner(0)); - var corner2 = map.latLngToContainerPoint(overlay.getCorner(1)); - var w = Math.abs(corner1.x - corner2.x); - var h = Math.abs(corner1.y - corner2.y); - var distance = Math.sqrt(w * w + h * h); - - if (distance > edgeMinWidth || scale > 1) { - overlay.scaleBy(scale); - } else { - overlay.scaleBy(1); - } - }, - updateHandle: function updateHandle() { - this.setLatLng(this._handled.getCorner(this._corner)); - } -}); - -L.freeRotateHandle = function (overlay, idx, options) { - return new L.FreeRotateHandle(overlay, idx, options); -}; - -/***/ }), - -/***/ "./src/edit/handles/LockHandle.js": -/*!****************************************!*\ - !*** ./src/edit/handles/LockHandle.js ***! - \****************************************/ -/***/ (function() { - -L.LockHandle = L.EditHandle.extend({ - options: { - TYPE: 'lock', - interactive: false, - icon: L.icon({ - // eslint-disable-next-line max-len - iconUrl: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAD8SURBVO3BPU7CYAAA0AdfjIcQlRCQBG7C3gk2uIPG2RC3Dk16Gz0FTO1WZs/gwGCMP/2+xsSl7+n1er1Iz9LtRQjaPeMeO+TinLDCJV78YqjdA04YodKuxhUaPGoRxMmxwRQZSt87Yo4KExGCeAUyLLFB4bMacxywEClIU2KDKXbInTUYo8JCgoFuGoxQO5uiwY1EA91VmDqrcKeDoX8WdNNgjApvmGGLXKIgXY0xGkxQYItrrFFIEKQ5Yo4KEx9yrDFDhlKkIF6NOQ5Y+KpAhiXWKEQI4pxwiwoLPyuxwQw75FoE7fZYocFEuwI7jHCBV39gL92TXq/Xi/AOcmczZmaIMScAAAAASUVORK5CYII=', - iconSize: [32, 32], - iconAnchor: [16, 16] - }) - }, - onRemove: function onRemove(map) { - this.unbindTooltip(); - L.EditHandle.prototype.onRemove.call(this, map); - }, - _bindListeners: function _bindListeners() { - var icon = this.getElement(); - - L.EditHandle.prototype._bindListeners.call(this); - - L.DomEvent.on(icon, { - mousedown: this._tooltipOn, - mouseup: this._tooltipOff - }, this); - L.DomEvent.on(document, 'pointerleave', this._tooltipOff, this); - }, - _unbindListeners: function _unbindListeners() { - var icon = this.getElement(); - - L.EditHandle.prototype._bindListeners.call(this); - - L.DomEvent.off(icon, { - mousedown: this._tooltipOn, - mouseup: this._tooltipOff - }, this); - L.DomEvent.off(document, 'pointerleave', this._tooltipOff, this); - }, - - /* cannot be dragged */ - _onHandleDrag: function _onHandleDrag() {}, - updateHandle: function updateHandle() { - this.setLatLng(this._handled.getCorner(this._corner)); - }, - _tooltipOn: function _tooltipOn(e) { - var eP = this._handled.parentGroup; - var edit = eP ? eP.editing : this._handled.editing; - - if (e.shiftKey) { - return; - } - - if (!this._handled.isSelected() && eP && !eP.isCollected(this._handled)) { - return; - } - - var handlesArr = edit._lockHandles; - this._timer = setTimeout(L.bind(function () { - if (this._timeout) { - clearTimeout(this._timeout); - } - - if (!this.getTooltip()) { - this.bindTooltip('Locked!', { - permanent: true - }); - } else { - handlesArr.eachLayer(function (handle) { - if (this !== handle) { - handle.closeTooltip(); - } - }); - } - - this.openTooltip(); - }, this), 500); - }, - _tooltipOff: function _tooltipOff(e) { - var eP = this._handled.parentGroup; - var edit = eP ? eP.editing : this._handled.editing; - - if (e.shiftKey) { - return; - } - - if (!this._handled.isSelected() && eP && !eP.isCollected(this._handled)) { - return; - } - - var handlesArr = edit._lockHandles; - - if (e.currentTarget === document) { - handlesArr.eachLayer(function (handle) { - handle.closeTooltip(); - }); - } - - if (this._timer) { - clearTimeout(this._timer); - } - - this._timeout = setTimeout(L.bind(function () { - this.closeTooltip(); - }, this), 400); - } -}); - -L.lockHandle = function (overlay, idx, options) { - return new L.LockHandle(overlay, idx, options); -}; - -/***/ }), - -/***/ "./src/edit/handles/RotateHandle.js": -/*!******************************************!*\ - !*** ./src/edit/handles/RotateHandle.js ***! - \******************************************/ -/***/ (function() { - -L.RotateHandle = L.EditHandle.extend({ - options: { - TYPE: 'rotate', - icon: L.icon({ - iconUrl: // eslint-disable-next-line max-len - 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAHiSURBVMXBa3HbShgA0PMp/1sCCo8oCEpgTaCXgIXAJiDzyCJoAUTm4UVQAns1Y8+snWnTvJyeE16hkjDgDrfoNTMKcpC9UPiLSo8JyetkjEHxjPCMyoS199kFoz8Iv1HpMaN3qWDCHoegOKkkRwnJpRmroHgiPFEZ8IBekzEGxQtUEhKSS/fB7Ew4U+lxcGkVZG9QWWPSFAxBcdK59KApuA+yNwp2uEdx1GN25sZJZULSfAtm77SlbNjju6MvG75u+WHRWVR6rDVjMPsgwYyVZl3pLTpHkyYHOx8syMiayaJzlDTZ9YyaZNFVkiYH2ZUEBcVJJXVImuz6Js3Qofe59pq7DoOTILu+g+a288mCouk7/1iH4qTS+2QdDppbV1ZJmrnDXnPnc5UOs2Z0fUmTuyBr+krvSioJyUmQO0dZM7mepMkWnaNRkyrJB6uskTSjxY3Fll8bvmJwlDb83FJ8gMqAB80uyBY3Trb82PAfvjj6vuHnluIdKgMeNXOwctK5NKBoHitrb1RJeHRp5Ux4ojLg0aWMHGQvUOkxIWkKVsHsTPiNSo8HDC5lZIsgO6n0uMUdRvQuFQxB8UR4RmXC2vvsgtEfhL+o9JiQvE7GGBTPCK9QSUjoMWgKDthjDrIX+h/k0I7gth6N5gAAAABJRU5ErkJggg==', - iconSize: [32, 32], - iconAnchor: [16, 16] - }) - }, - _onHandleDrag: function _onHandleDrag() { - var overlay = this._handled; - var formerLatLng = overlay.getCorner(this._corner); - var newLatLng = this.getLatLng(); - var angle = this.calculateAngleDelta(formerLatLng, newLatLng); - /* - * running rotation logic even for an angle delta of 0 - * prevents a small, occasional marker flicker - */ - - overlay.rotateBy(angle, 'rad'); - }, - updateHandle: function updateHandle() { - this.setLatLng(this._handled.getCorner(this._corner)); - } -}); - -L.rotateHandle = function (overlay, idx, options) { - return new L.RotateHandle(overlay, idx, options); -}; - -/***/ }), - -/***/ "./src/edit/handles/ScaleHandle.js": -/*!*****************************************!*\ - !*** ./src/edit/handles/ScaleHandle.js ***! - \*****************************************/ -/***/ (function() { - -L.ScaleHandle = L.EditHandle.extend({ - options: { - TYPE: 'scale', - icon: L.icon({ - iconUrl: // eslint-disable-next-line max-len - 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2ZXJzaW9uPSIxLjEiIHdpZHRoPSI0NTkiIGhlaWdodD0iNDY0IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCA1MTIgNTEyIiB4bWw6c3BhY2U9InByZXNlcnZlIiBzdHlsZT0iIj48cmVjdCBpZD0iYmFja2dyb3VuZHJlY3QiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIHg9IjAiIHk9IjAiIGZpbGw9Im5vbmUiIHN0cm9rZT0ibm9uZSIgY2xhc3M9IiIgc3R5bGU9IiIvPjxnIGNsYXNzPSJjdXJyZW50TGF5ZXIiIHN0eWxlPSIiPjx0aXRsZT5MYXllciAxPC90aXRsZT48cGF0aCBkPSJNNDU5LjA0OTE1OTUzMDQ3MTM0LDg2LjkyNjIzNDUxMjU1MDAyIFYwIGgtODUuNzE0NTczMzU2MzEyMDkgdjI3LjA0MzcxNzQwMzkwNDQ1MiBIODUuNzE0NTczMzU2MzEyMDMgVjAgSDAgdjg2LjkyNjIzNDUxMjU1MDAyIGgyNS43MTQzNzIwMDY4OTM2MjYgdjI4OS43NTQxMTUwNDE4MzM0IEgwIHY4Ni45MjYyMzQ1MTI1NTAwMiBoODUuNzE0NTczMzU2MzEyMDkgdi0yNy4wNDM3MTc0MDM5MDQ0NTIgaDI4NS43MTUyNDQ1MjEwNDAzIHYyNy4wNDM3MTc0MDM5MDQ0NTIgaDg1LjcxNDU3MzM1NjMxMjA5IHYtODYuOTI2MjM0NTEyNTUwMDIgaC0yMy44MDk2MDM3MTAwODY2OSBWODYuOTI2MjM0NTEyNTUwMDIgSDQ1OS4wNDkxNTk1MzA0NzEzNCB6TTM4NC43NjMxOTU5NTUwMDA5LDEyLjU1NjAxMTY1MTgxMjc4MSBoNjEuOTA0OTY5NjQ2MjI1Mzk2IHY2Mi43ODAwNTgyNTkwNjM5MSBoLTYxLjkwNDk2OTY0NjIyNTM5NiBWMTIuNTU2MDExNjUxODEyNzgxIHpNMTIuMzgwOTkzOTI5MjQ1MDUsMTIuNTU2MDExNjUxODEyNzgxIGg2MS45MDQ5Njk2NDYyMjUzOTYgdjYyLjc4MDA1ODI1OTA2MzkxIEgxMi4zODA5OTM5MjkyNDUwNSBWMTIuNTU2MDExNjUxODEyNzgxIHpNNzQuMjg1OTYzNTc1NDcwNTMsNDUxLjA1MDU3MjQxNTEyMDY2IEgxMi4zODA5OTM5MjkyNDUwNSB2LTYyLjc4MDA1ODI1OTA2MzkxIGg2MS45MDQ5Njk2NDYyMjUzOTYgVjQ1MS4wNTA1NzI0MTUxMjA2NiB6TTQ0NS43MTU3ODE0NTI4MjI3NCw0NTEuMDUwNTcyNDE1MTIwNjYgaC02Mi44NTczNTM3OTQ2Mjg4NjQgdi02Mi43ODAwNTgyNTkwNjM5MSBoNjIuODU3MzUzNzk0NjI4ODY0IFY0NTEuMDUwNTcyNDE1MTIwNjYgek00MDcuNjIwNDE1NTE2Njg0MjYsMzc2LjY4MDM0OTU1NDM4MzQ0IGgtMzYuMTkwNTk3NjM5MzMxNzcgdjMyLjgzODc5OTcwNDc0MTEyIEg4NS43MTQ1NzMzNTYzMTIwMyB2LTMyLjgzODc5OTcwNDc0MTEyIEg0OS41MjM5NzU3MTY5ODAzMiBWODYuOTI2MjM0NTEyNTUwMDIgaDM2LjE5MDU5NzYzOTMzMTc3IFY1MC4yMjQwNDY2MDcyNTExMjUgaDI4Ny42MjAwMTI4MTc4NDcyIHYzNi43MDIxODc5MDUyOTg5IGgzNC4yODU4MjkzNDI1MjQ4MzUgVjM3Ni42ODAzNDk1NTQzODM0NCB6IiBpZD0ic3ZnXzIiIGNsYXNzPSIiIGZpbGw9IiMxYTFhZWIiIGZpbGwtb3BhY2l0eT0iMSIvPjwvZz48L3N2Zz4=', - iconSize: [32, 32], - iconAnchor: [16, 16] - }) - }, - _onHandleDrag: function _onHandleDrag() { - var overlay = this._handled; - var map = overlay._map; - var edgeMinWidth = overlay.edgeMinWidth; - var formerLatLng = overlay.getCorner(this._corner); - var newLatLng = this.getLatLng(); - - var scale = this._calculateScalingFactor(formerLatLng, newLatLng); - /* - * checks whether the "edgeMinWidth" property is set and tracks the minimum edge length; - * this enables preventing scaling to zero, but we might also add an overall scale limit - */ - - - if (!edgeMinWidth) { - edgeMinWidth = 50; - } - /* just in case */ - - - var corner1 = map.latLngToLayerPoint(overlay.getCorner(0)); - var corner2 = map.latLngToLayerPoint(overlay.getCorner(1)); - var w = Math.abs(corner1.x - corner2.x); - var h = Math.abs(corner1.y - corner2.y); - var distance = Math.sqrt(w * w + h * h); - - if (distance > edgeMinWidth || scale > 1) { - overlay.scaleBy(scale); - /* - * running scale logic even for a scale ratio of 1 - * prevents a small, occasional marker flicker - */ - } else { - overlay.scaleBy(1); - } - }, - updateHandle: function updateHandle() { - this.setLatLng(this._handled.getCorner(this._corner)); - } -}); - -L.scaleHandle = function (overlay, idx, options) { - return new L.ScaleHandle(overlay, idx, options); -}; - -/***/ }), - -/***/ "./src/edit/toolbars/DistortableImage.ControlBar.js": -/*!**********************************************************!*\ - !*** ./src/edit/toolbars/DistortableImage.ControlBar.js ***! - \**********************************************************/ -/***/ (function() { - -L.distortableImage = L.DistortableImage || {}; -L.distortableImage = L.DistortableImage; -L.DistortableImage.group_action_map = {}; -L.DistortableImage.ControlBar = L.Toolbar2.Control.extend({}); - -L.distortableImage.controlBar = function (options) { - return new L.DistortableImage.ControlBar(options); -}; -/** addInitHooks run before onAdd */ - - -L.DistortableCollection.addInitHook(function () { - /** Default actions */ - this.ACTIONS = [L.ExportAction, L.DeleteAction, L.LockAction, L.UnlockAction]; // all possible modes - - L.DistortableCollection.Edit.MODES = { - lock: L.LockAction, - unlock: L.UnlockAction - }; - var a = this.options.actions ? this.options.actions : this.ACTIONS; - this.editing = L.distortableCollection.edit(this, { - actions: a - }); -}); - -/***/ }), - -/***/ "./src/edit/toolbars/DistortableImage.PopupBar.js": -/*!********************************************************!*\ - !*** ./src/edit/toolbars/DistortableImage.PopupBar.js ***! - \********************************************************/ -/***/ (function() { - -L.DistortableImage = L.DistortableImage || {}; -L.distortableImage = L.DistortableImage; -L.DistortableImage.action_map = {}; -L.DistortableImage.PopupBar = L.Toolbar2.Popup.extend({ - options: { - anchor: [0, -10] - }, - initialize: function initialize(latlng, options) { - L.setOptions(this, options); - L.Toolbar2.Popup.prototype.initialize.call(this, latlng, options); - }, - addHooks: function addHooks(map, ov) { - this.map = map; - this.ov = ov; - }, - tools: function tools() { - if (this._ul) { - return this._ul.children; - } - }, - clickTool: function clickTool(name) { - var tools = this.tools(); - - for (var i = 0; i < tools.length; i++) { - var tool = tools.item(i).children[0]; - - if (L.DomUtil.hasClass(tool, name)) { - tool.click(); - return tool; - } - } - - return false; - } -}); - -L.distortableImage.popupBar = function (latlng, options) { - return new L.DistortableImage.PopupBar(latlng, options); -}; - -L.DistortableImageOverlay.addInitHook(function () { - /** Default actions */ - this.ACTIONS = [L.DragAction, L.ScaleAction, L.DistortAction, L.RotateAction, L.FreeRotateAction, L.LockAction, L.OpacityAction, L.BorderAction, L.ExportAction, L.DeleteAction]; // all possible modes - - L.DistortableImage.Edit.MODES = { - drag: L.DragAction, - scale: L.ScaleAction, - distort: L.DistortAction, - rotate: L.RotateAction, - freeRotate: L.FreeRotateAction, - lock: L.LockAction - }; - var a = this.options.actions ? this.options.actions : this.ACTIONS; - this.editing = L.distortableImage.edit(this, { - actions: a - }); -}); - -/***/ }), - -/***/ "./src/iconsets/IconSet.js": -/*!*********************************!*\ - !*** ./src/iconsets/IconSet.js ***! - \*********************************/ -/***/ (function() { - -/* this is the baseclass other IconSets inherit from, -* we don't use it directly */ -L.IconSet = L.Class.extend({ - _svg: '', - _symbols: '', - render: function render() { - this.addSymbols(this._symbols); - return this._svg; - }, - addSymbols: function addSymbols(symbols) { - this._svg += symbols; - } -}); - -/***/ }), - -/***/ "./src/iconsets/KeymapperIconSet.js": -/*!******************************************!*\ - !*** ./src/iconsets/KeymapperIconSet.js ***! - \******************************************/ -/***/ (function() { - -L.KeymapperIconSet = L.IconSet.extend({ - _symbols: // eslint-disable-next-line max-len - '' -}); - -/***/ }), - -/***/ "./src/iconsets/ToolbarIconSet.js": -/*!****************************************!*\ - !*** ./src/iconsets/ToolbarIconSet.js ***! - \****************************************/ -/***/ (function() { - -/* eslint-disable max-len */ -L.ToolbarIconSet = L.IconSet.extend({ - _symbols: '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' -}); - -/***/ }), - -/***/ "./src/mapmixins/BoxCollector.js": -/*!***************************************!*\ - !*** ./src/mapmixins/BoxCollector.js ***! - \***************************************/ -/***/ (function() { - -L.Map.mergeOptions({ - boxCollector: true, - boxZoom: false -}); -/** - * primarily Leaflet 1.5.1 source code. Overriden so that it's a collection box used with - * our `L.DistortableCollection` class instead of a zoom box. - * */ - -L.Map.BoxCollector = L.Map.BoxZoom.extend({ - initialize: function initialize(map) { - this._map = map; - this._container = map._container; - this._pane = map._panes.overlayPane; - this._resetStateTimeout = 0; - map.on('unload', this._destroy, this); - }, - addHooks: function addHooks() { - L.DomEvent.on(this._container, 'mousedown', this._onMouseDown, this); - }, - removeHooks: function removeHooks() { - L.DomEvent.off(this._container, 'mousedown', this._onMouseDown, this); - }, - moved: function moved() { - return this._moved; - }, - _destroy: function _destroy() { - L.DomUtil.remove(this._pane); - delete this._pane; - }, - _resetState: function _resetState() { - this._resetStateTimeout = 0; - this._moved = false; - }, - _clearDeferredResetState: function _clearDeferredResetState() { - if (this._resetStateTimeout !== 0) { - clearTimeout(this._resetStateTimeout); - this._resetStateTimeout = 0; - } - }, - _onMouseDown: function _onMouseDown(e) { - if (!e.shiftKey || e.which !== 1 && e.button !== 1) { - return false; - } // Clear the deferred resetState if it hasn't executed yet, otherwise it - // will interrupt the interaction and orphan a box element in the container. - - - this._clearDeferredResetState(); - - this._resetState(); - - L.DomUtil.disableTextSelection(); - L.DomUtil.disableImageDrag(); - this._startPoint = this._map.mouseEventToContainerPoint(e); - L.DomEvent.on(document, { - contextmenu: L.DomEvent.stop, - mousemove: this._onMouseMove, - mouseup: this._onMouseUp - }, this); - }, - _onMouseMove: function _onMouseMove(e) { - if (!this._moved) { - this._moved = true; - this._box = L.DomUtil.create('div', 'leaflet-zoom-box', this._container); - L.DomUtil.addClass(this._container, 'leaflet-crosshair'); - - this._map.fire('boxzoomstart'); - } - - this._point = this._map.mouseEventToContainerPoint(e); - this._bounds = L.bounds(this._startPoint, this._point); - - var size = this._bounds.getSize(); - - L.DomUtil.setPosition(this._box, this._bounds.min); - this._box.style.width = size.x + 'px'; - this._box.style.height = size.y + 'px'; - }, - _finish: function _finish() { - if (this._moved) { - L.DomUtil.remove(this._box); - L.DomUtil.removeClass(this._container, 'leaflet-crosshair'); - } - - L.DomUtil.enableTextSelection(); - L.DomUtil.enableImageDrag(); - L.DomEvent.off(document, { - contextmenu: L.DomEvent.stop, - mousemove: this._onMouseMove, - mouseup: this._onMouseUp - }, this); - }, - _onMouseUp: function _onMouseUp(e) { - if (e.which !== 1 && e.button !== 1) { - return; - } - - this._finish(); - - if (!this._moved) { - return; - } // Postpone to next JS tick so internal click event handling - // still see it as "moved". - - - this._clearDeferredResetState(); - - this._resetStateTimeout = setTimeout(L.Util.bind(this._resetState, this), 0); - var bounds = L.latLngBounds(this._map.containerPointToLatLng(this._bounds.getBottomLeft()), this._map.containerPointToLatLng(this._bounds.getTopRight())); - - var zoom = this._map.getZoom(); - - var center = this._map.getCenter(); // calls the `project` method but 1st updates the pixel origin - see https://github.com/publiclab/Leaflet.DistortableImage/pull/344 - - - bounds = this._map._latLngBoundsToNewLayerBounds(bounds, zoom, center); - - this._map.fire('boxcollectend', { - boxCollectBounds: bounds - }); - } -}); -L.Map.addInitHook('addHandler', 'boxCollector', L.Map.BoxCollector); - -/***/ }), - -/***/ "./src/mapmixins/DoubleClickLabels.js": -/*!********************************************!*\ - !*** ./src/mapmixins/DoubleClickLabels.js ***! - \********************************************/ -/***/ (function() { - -L.Map.mergeOptions({ - doubleClickLabels: true -}); -/** - * The `doubleClickLabels` handler replaces `doubleClickZoom` by default if `#addGoogleMutant` - * is used unless the options 'labels: false' or 'doubleClickZoom: false` were passed to it. - */ - -L.Map.DoubleClickLabels = L.Map.DoubleClickZoom.extend({ - enable: function enable() { - var map = this._map; - - if (this._enabled) { - return this; - } // disable 'doubleClickZoom' if 'doubleClickLabels' is enabled. - - - if (map.doubleClickZoom.enabled()) { - map.doubleClickZoom.disable(); - } - - this._map.fire('singleclickon'); - - this._enabled = true; - this.addHooks(); - return this; - }, - disable: function disable() { - if (!this._enabled) { - return this; - } - - this._enabled = false; - this.removeHooks(); - return this; - }, - _fireIfSingle: function _fireIfSingle(e) { - var map = this._map; - var oe = e.originalEvent; // prevents deselection in case of box selector - - if (oe && oe.shiftKey) { - return; - } - - map._clicked += 1; - this._map._clickTimeout = setTimeout(function () { - if (map._clicked === 1) { - map._clicked = 0; - map.fire('singleclick', { - type: 'singleclick' - }); - } else { - // manually fire doubleclick event only for touch screens that don't natively fire it - if (L.Browser.touch && oe && oe.sourceCapabilities.firesTouchEvents) { - map.fire('dblclick'); - } - } - }, 250); - }, - _onDoubleClick: function _onDoubleClick() { - var map = this._map; - var labels = map._labels; - setTimeout(function () { - map._clicked = 0; - clearTimeout(map._clickTimeout); - }, 0); - - if (!labels) { - return; - } - - if (labels.options.opacity === 1) { - labels.options.opacity = 0; - labels.setOpacity(0); - } else { - labels.options.opacity = 1; - labels.setOpacity(1); - } - } -}); -L.Map.addInitHook('addHandler', 'doubleClickLabels', L.Map.DoubleClickLabels); - -/***/ }), - -/***/ "./src/mapmixins/DoubleClickZoom.js": -/*!******************************************!*\ - !*** ./src/mapmixins/DoubleClickZoom.js ***! - \******************************************/ -/***/ (function() { - -/** - * `L.Map.DoubleClickZoom` from leaflet 1.5.1, overrwritten so that it - * 1) Fires a `singleclick` event to avoid deselecting images on `dblclick`. - * 2) Maintains a mutually exclusive relationship with the map's `DoubleClickLabels` handler - */ -L.Map.DoubleClickZoom.include({ - addHooks: function addHooks() { - this._map.on({ - click: this._fireIfSingle, - dblclick: this._onDoubleClick - }, this); - }, - removeHooks: function removeHooks() { - this._map.off({ - click: this._fireIfSingle, - dblclick: this._onDoubleClick - }, this); - }, - enable: function enable() { - if (this._enabled) { - return this; - } // don't enable 'doubleClickZoom' unless 'doubleClickLabels' is disabled first - - - if (this._map.doubleClickLabels) { - if (this._map.doubleClickLabels.enabled()) { - return this; - } - } // signify to collection/instance classes to turn on 'singleclick' listeners - - - this._map.fire('singleclickon'); - - this._enabled = true; - this.addHooks(); - return this; - }, - disable: function disable() { - if (!this._enabled) { - return this; - } // signify to collection/instance safe to swap 'singleclick' listeners with 'click' listeners. - - - this._map.fire('singleclickoff'); - - this._enabled = false; - this.removeHooks(); - return this; - }, - _fireIfSingle: function _fireIfSingle(e) { - var map = this._map; - var oe = e.originalEvent; // prevents deselection in case of box selector - - if (oe && oe.shiftKey) { - return; - } - - map._clicked += 1; - this._map._clickTimeout = setTimeout(function () { - if (map._clicked === 1) { - map._clicked = 0; - map.fire('singleclick', { - type: 'singleclick' - }); - } else { - // manually fire doubleclick event only for touch screens that don't natively fire it - if (L.Browser.touch && oe && oe.sourceCapabilities.firesTouchEvents) { - /* in `DoubleClickLabels.js`, we just do map.fire('dblclick') bc `_onDoublClick` doesn't use the - passed "e" (for now). To generate a 'real' DOM event that will have all of its corresponding core - properties (originalEvent, latlng, etc.), use Leaflet's `#map._fireDOMEvent` (Leaflet 1.5.1 source) */ - map._fireDOMEvent(oe, 'dblclick', [map]); - } - } - }, 250); - }, - _onDoubleClick: function _onDoubleClick(e) { - var map = this._map; - var oe = e.originalEvent; - setTimeout(function () { - map._clicked = 0; - clearTimeout(map._clickTimeout); - }, 0); - - if (!oe) { - return false; - } - - var oldZoom = map.getZoom(); - var delta = map.options.zoomDelta; - var zoom = oe.shiftKey ? oldZoom - delta : oldZoom + delta; - - if (map.options.doubleClickZoom === 'center') { - map.setZoom(zoom); - } else { - map.setZoomAround(e.containerPoint, zoom); - } - } -}); - -/***/ }), - -/***/ "./src/mapmixins/MapMixins.js": -/*!************************************!*\ - !*** ./src/mapmixins/MapMixins.js ***! - \************************************/ -/***/ (function() { - -/* eslint-disable max-len */ -L.Map.include({ - _clicked: 0, - addGoogleMutant: function addGoogleMutant(opts) { - var url = 'http://mt0.google.com/vt/lyrs=s&x={x}&y={y}&z={z}'; - opts = this.mutantOptions = L.extend({ - mutantOpacity: 0.8, - maxZoom: 24, - maxNativeZoom: 20, - minZoom: 0, - labels: true, - labelOpacity: 1, - doubleClickLabels: true - }, opts); - - if (!opts.labels) { - this.mutantOptions = L.extend(this.mutantOptions, { - labelOpacity: opts.labels ? 1 : undefined, - doubleClickLabels: opts.labels ? true : undefined - }); - } - - this._googleMutant = L.tileLayer(url, { - maxZoom: opts.maxZoom, - maxNativeZoom: opts.maxNativeZoom, - minZoom: opts.minZoom, - opacity: opts.mutantOpacity - }).addTo(this); - - if (opts.labels) { - this._addLabels(opts); - } // shouldn't have this handler at all if there are no labels to toggle - else { - this.doubleClickLabels = undefined; - } - - return this; - }, - _addLabels: function _addLabels(opts) { - var url = 'https://stamen-tiles-{s}.a.ssl.fastly.net/toner-labels/{z}/{x}/{y}{r}.{ext}'; - - if (opts.labelOpacity !== 0 && opts.labelOpacity !== 1) { - opts.labelOpacity = 1; - } - - this._labels = L.tileLayer(url, { - attribution: 'Map tiles by Stamen Design, CC BY 3.0 — Map data © OpenStreetMap contributors', - subdomains: 'abcd', - interactive: false, - opacity: opts.labelOpacity, - maxZoom: opts.maxZoom, - maxNativeZoom: opts.maxNativeZoom, - minZoom: opts.minZoom, - ext: 'png' - }).addTo(this); - - if (this.mutantOptions.doubleClickLabels) { - this.doubleClickLabels.enable(); - } - - return this; - } -}); // start off with doubleClickZoom enabled, doubleClickLabels can later be enabled instead -// during initialization - -L.Map.addInitHook(function () { - this.doubleClickLabels.disable(); - this.doubleClickZoom.enable(); -}); - -/***/ }), - -/***/ "./src/util/DomUtil.js": -/*!*****************************!*\ - !*** ./src/util/DomUtil.js ***! - \*****************************/ -/***/ (function() { - -L.DomUtil = L.extend(L.DomUtil, { - initTranslation: function initTranslation(obj) { - this.translation = obj; - }, - getMatrixString: function getMatrixString(m) { - var is3d = L.Browser.webkit3d || L.Browser.gecko3d || L.Browser.ie3d; - /* - * Since matrix3d takes a 4*4 matrix, we add in an empty row and column, - * which act as the identity on the z-axis. - * See: - * http://franklinta.com/2014/09/08/computing-css-matrix3d-transforms/ - * https://developer.mozilla.org/en-US/docs/Web/CSS/transform-function#M.C3.B6bius'_homogeneous_coordinates_in_projective_geometry - */ - - var matrix = [m[0], m[3], 0, m[6], m[1], m[4], 0, m[7], 0, 0, 1, 0, m[2], m[5], 0, m[8]]; - var str = is3d ? 'matrix3d(' + matrix.join(',') + ')' : ''; - - if (!is3d) { - console.log('Your browser must support 3D CSS transforms' + 'in order to use DistortableImageOverlay.'); - } - - return str; - }, - toggleClass: function toggleClass(el, className) { - var c = className; - return this.hasClass(el, c) ? this.removeClass(el, c) : this.addClass(el, c); - }, - confirmDelete: function confirmDelete() { - return window.confirm(this.translation.confirmImageDelete); - }, - confirmDeletes: function confirmDeletes(n) { - if (n === 1) { - return this.confirmDelete(); - } - - var translation = this.translation.confirmImagesDeletes; - var warningMsg = ''; - - if (typeof translation === 'function') { - warningMsg = translation(n); - } else { - warningMsg = translation; - } - - return window.confirm(warningMsg); - } -}); - -/***/ }), - -/***/ "./src/util/IconUtil.js": -/*!******************************!*\ - !*** ./src/util/IconUtil.js ***! - \******************************/ -/***/ (function() { - -L.IconUtil = { - /* creates an svg elemenet with built in accessibility properties - * and standardized classes for styling, takes in the fragment - * identifier (id) of the symbol to reference. note for symplicity - * we allow providing the icon target with or without the '#' prefix - */ - create: function create(ref) { - if (/^#/.test(ref)) { - ref = ref.replace(/^#/, ''); - } - - return '' + '' + ''; - }, - addClassToSvg: function addClassToSvg(container, loader) { - var svg = container.querySelector('svg'); - - if (svg) { - L.DomUtil.addClass(svg, loader); - } - }, - // finds the use element and toggles its icon reference - toggleXlink: function toggleXlink(container, ref1, ref2) { - if (!/^#/.test(ref1)) { - ref1 = '#' + ref1; - } - - if (!/^#/.test(ref2)) { - ref2 = '#' + ref2; - } - - var use = container.querySelector('use'); - - if (use) { - var toggled = use.getAttribute('xlink:href') === ref1 ? ref2 : ref1; - use.setAttribute('xlink:href', toggled); - return toggled; - } - - return false; - }, - toggleTitle: function toggleTitle(container, title1, title2) { - var toggled = container.getAttribute('title') === title1 ? title2 : title1; - container.setAttribute('title', toggled); - - if (container.hasAttribute('aria-label')) { - container.setAttribute('aria-label', toggled); - } - - return toggled; - } -}; - -/***/ }), - -/***/ "./src/util/ImageUtil.js": -/*!*******************************!*\ - !*** ./src/util/ImageUtil.js ***! - \*******************************/ -/***/ (function() { - -L.ImageUtil = { - getCmPerPixel: function getCmPerPixel(overlay) { - var map = overlay._map; - var dist = map.latLngToLayerPoint(overlay.getCorner(0)).distanceTo(map.latLngToLayerPoint(overlay.getCorner(1))); - return dist * 100 / overlay.getElement().width; - } -}; - -/***/ }), - -/***/ "./src/util/MatrixUtil.js": -/*!********************************!*\ - !*** ./src/util/MatrixUtil.js ***! - \********************************/ -/***/ (function() { - -L.MatrixUtil = { - // Compute the adjugate of m - adj: function adj(m) { - return [m[4] * m[8] - m[5] * m[7], m[2] * m[7] - m[1] * m[8], m[1] * m[5] - m[2] * m[4], m[5] * m[6] - m[3] * m[8], m[0] * m[8] - m[2] * m[6], m[2] * m[3] - m[0] * m[5], m[3] * m[7] - m[4] * m[6], m[1] * m[6] - m[0] * m[7], m[0] * m[4] - m[1] * m[3]]; - }, - // multiply two 3*3 matrices - multmm: function multmm(a, b) { - var c = []; - var i; - - for (i = 0; i < 3; i++) { - for (var j = 0; j < 3; j++) { - var cij = 0; - - for (var k = 0; k < 3; k++) { - cij += a[3 * i + k] * b[3 * k + j]; - } - - c[3 * i + j] = cij; - } - } - - return c; - }, - // multiply a 3*3 matrix and a 3-vector - multmv: function multmv(m, v) { - return [m[0] * v[0] + m[1] * v[1] + m[2] * v[2], m[3] * v[0] + m[4] * v[1] + m[5] * v[2], m[6] * v[0] + m[7] * v[1] + m[8] * v[2]]; - }, - // multiply a scalar and a 3*3 matrix - multsm: function multsm(s, m) { - var matrix = []; - - for (var i = 0, l = m.length; i < l; i++) { - matrix.push(s * m[i]); - } - - return matrix; - }, - basisToPoints: function basisToPoints(x1, y1, x2, y2, x3, y3, x4, y4) { - var m = [x1, x2, x3, y1, y2, y3, 1, 1, 1]; - var v = L.MatrixUtil.multmv(L.MatrixUtil.adj(m), [x4, y4, 1]); - return L.MatrixUtil.multmm(m, [v[0], 0, 0, 0, v[1], 0, 0, 0, v[2]]); - }, - project: function project(m, x, y) { - var v = L.MatrixUtil.multmv(m, [x, y, 1]); - return [v[0] / v[2], v[1] / v[2]]; - }, - general2DProjection: function general2DProjection(x1s, y1s, x1d, y1d, x2s, y2s, x2d, y2d, x3s, y3s, x3d, y3d, x4s, y4s, x4d, y4d) { - var s = L.MatrixUtil.basisToPoints(x1s, y1s, x2s, y2s, x3s, y3s, x4s, y4s); - var d = L.MatrixUtil.basisToPoints(x1d, y1d, x2d, y2d, x3d, y3d, x4d, y4d); - var m = L.MatrixUtil.multmm(d, L.MatrixUtil.adj(s)); // Normalize to the unique matrix with m[8] == 1. - // See: http://franklinta.com/2014/09/08/computing-css-matrix3d-transforms/ - - return L.MatrixUtil.multsm(1 / m[8], m); - } -}; - -/***/ }), - -/***/ "./src/util/TrigUtil.js": -/*!******************************!*\ - !*** ./src/util/TrigUtil.js ***! - \******************************/ -/***/ (function() { - -L.TrigUtil = { - calcAngle: function calcAngle(x, y) { - var unit = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'deg'; - return unit === 'deg' ? this.radiansToDegrees(Math.atan2(y, x)) : Math.atan2(y, x); - }, - radiansToDegrees: function radiansToDegrees(angle) { - return angle * 180 / Math.PI; - }, - degreesToRadians: function degreesToRadians(angle) { - return angle * Math.PI / 180; - } -}; - -/***/ }), - -/***/ "./src/util/Utils.js": -/*!***************************!*\ - !*** ./src/util/Utils.js ***! - \***************************/ -/***/ (function() { - -L.Utils = { - initTranslation: function initTranslation() { - var translation = { - deleteImage: 'Delete Image', - deleteImages: 'Delete Images', - distortImage: 'Distort Image', - dragImage: 'Drag Image', - exportImage: 'Export Image', - exportImages: 'Export Images', - removeBorder: 'Remove Border', - addBorder: 'Add Border', - freeRotateImage: 'Free rotate Image', - geolocateImage: 'Geolocate Image', - lockMode: 'Lock Mode', - lockImages: 'Lock Images', - makeImageOpaque: 'Make Image Opaque', - makeImageTransparent: 'Make Image Transparent', - restoreImage: 'Restore Natural Image', - rotateImage: 'Rotate Image', - scaleImage: 'Scale Image', - stackToFront: 'Stack to Front', - stackToBack: 'Stack to Back', - unlockImages: 'Unlock Images', - confirmImageDelete: 'Are you sure? This image will be permanently deleted from the map.', - confirmImagesDeletes: 'Are you sure? These images will be permanently deleted from the map.' - }; - - if (!this.options.translation) { - this.options.translation = translation; - } else { - // If the translation for a word is not specified, fallback to English. - for (var key in translation) { - if (!this.options.translation.hasOwnProperty(key)) { - this.options.translation[key] = translation[key]; - } - } - } - - L.DomUtil.initTranslation(this.options.translation); - }, - getNestedVal: function getNestedVal(obj, key, nestedKey) { - var dig = [key, nestedKey]; - return dig.reduce(function (obj, k) { - return obj && obj[k]; - }, obj); - } -}; - -/***/ }), - -/***/ "./node_modules/events/events.js": -/*!***************************************!*\ - !*** ./node_modules/events/events.js ***! - \***************************************/ -/***/ (function(module) { - -"use strict"; -// Copyright Joyent, Inc. and other Node contributors. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to permit -// persons to whom the Software is furnished to do so, subject to the -// following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -// USE OR OTHER DEALINGS IN THE SOFTWARE. - - - -var R = typeof Reflect === 'object' ? Reflect : null -var ReflectApply = R && typeof R.apply === 'function' - ? R.apply - : function ReflectApply(target, receiver, args) { - return Function.prototype.apply.call(target, receiver, args); - } - -var ReflectOwnKeys -if (R && typeof R.ownKeys === 'function') { - ReflectOwnKeys = R.ownKeys -} else if (Object.getOwnPropertySymbols) { - ReflectOwnKeys = function ReflectOwnKeys(target) { - return Object.getOwnPropertyNames(target) - .concat(Object.getOwnPropertySymbols(target)); - }; -} else { - ReflectOwnKeys = function ReflectOwnKeys(target) { - return Object.getOwnPropertyNames(target); - }; -} - -function ProcessEmitWarning(warning) { - if (console && console.warn) console.warn(warning); -} - -var NumberIsNaN = Number.isNaN || function NumberIsNaN(value) { - return value !== value; -} - -function EventEmitter() { - EventEmitter.init.call(this); -} -module.exports = EventEmitter; -module.exports.once = once; - -// Backwards-compat with node 0.10.x -EventEmitter.EventEmitter = EventEmitter; - -EventEmitter.prototype._events = undefined; -EventEmitter.prototype._eventsCount = 0; -EventEmitter.prototype._maxListeners = undefined; - -// By default EventEmitters will print a warning if more than 10 listeners are -// added to it. This is a useful default which helps finding memory leaks. -var defaultMaxListeners = 10; - -function checkListener(listener) { - if (typeof listener !== 'function') { - throw new TypeError('The "listener" argument must be of type Function. Received type ' + typeof listener); - } -} - -Object.defineProperty(EventEmitter, 'defaultMaxListeners', { - enumerable: true, - get: function() { - return defaultMaxListeners; - }, - set: function(arg) { - if (typeof arg !== 'number' || arg < 0 || NumberIsNaN(arg)) { - throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received ' + arg + '.'); - } - defaultMaxListeners = arg; - } -}); - -EventEmitter.init = function() { - - if (this._events === undefined || - this._events === Object.getPrototypeOf(this)._events) { - this._events = Object.create(null); - this._eventsCount = 0; - } - - this._maxListeners = this._maxListeners || undefined; -}; - -// Obviously not all Emitters should be limited to 10. This function allows -// that to be increased. Set to zero for unlimited. -EventEmitter.prototype.setMaxListeners = function setMaxListeners(n) { - if (typeof n !== 'number' || n < 0 || NumberIsNaN(n)) { - throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received ' + n + '.'); - } - this._maxListeners = n; - return this; -}; - -function _getMaxListeners(that) { - if (that._maxListeners === undefined) - return EventEmitter.defaultMaxListeners; - return that._maxListeners; -} - -EventEmitter.prototype.getMaxListeners = function getMaxListeners() { - return _getMaxListeners(this); -}; - -EventEmitter.prototype.emit = function emit(type) { - var args = []; - for (var i = 1; i < arguments.length; i++) args.push(arguments[i]); - var doError = (type === 'error'); - - var events = this._events; - if (events !== undefined) - doError = (doError && events.error === undefined); - else if (!doError) - return false; - - // If there is no 'error' event listener then throw. - if (doError) { - var er; - if (args.length > 0) - er = args[0]; - if (er instanceof Error) { - // Note: The comments on the `throw` lines are intentional, they show - // up in Node's output if this results in an unhandled exception. - throw er; // Unhandled 'error' event - } - // At least give some kind of context to the user - var err = new Error('Unhandled error.' + (er ? ' (' + er.message + ')' : '')); - err.context = er; - throw err; // Unhandled 'error' event - } - - var handler = events[type]; - - if (handler === undefined) - return false; - - if (typeof handler === 'function') { - ReflectApply(handler, this, args); - } else { - var len = handler.length; - var listeners = arrayClone(handler, len); - for (var i = 0; i < len; ++i) - ReflectApply(listeners[i], this, args); - } - - return true; -}; - -function _addListener(target, type, listener, prepend) { - var m; - var events; - var existing; - - checkListener(listener); - - events = target._events; - if (events === undefined) { - events = target._events = Object.create(null); - target._eventsCount = 0; - } else { - // To avoid recursion in the case that type === "newListener"! Before - // adding it to the listeners, first emit "newListener". - if (events.newListener !== undefined) { - target.emit('newListener', type, - listener.listener ? listener.listener : listener); - - // Re-assign `events` because a newListener handler could have caused the - // this._events to be assigned to a new object - events = target._events; - } - existing = events[type]; - } - - if (existing === undefined) { - // Optimize the case of one listener. Don't need the extra array object. - existing = events[type] = listener; - ++target._eventsCount; - } else { - if (typeof existing === 'function') { - // Adding the second element, need to change to array. - existing = events[type] = - prepend ? [listener, existing] : [existing, listener]; - // If we've already got an array, just append. - } else if (prepend) { - existing.unshift(listener); - } else { - existing.push(listener); - } - - // Check for listener leak - m = _getMaxListeners(target); - if (m > 0 && existing.length > m && !existing.warned) { - existing.warned = true; - // No error code for this since it is a Warning - // eslint-disable-next-line no-restricted-syntax - var w = new Error('Possible EventEmitter memory leak detected. ' + - existing.length + ' ' + String(type) + ' listeners ' + - 'added. Use emitter.setMaxListeners() to ' + - 'increase limit'); - w.name = 'MaxListenersExceededWarning'; - w.emitter = target; - w.type = type; - w.count = existing.length; - ProcessEmitWarning(w); - } - } - - return target; -} - -EventEmitter.prototype.addListener = function addListener(type, listener) { - return _addListener(this, type, listener, false); -}; - -EventEmitter.prototype.on = EventEmitter.prototype.addListener; - -EventEmitter.prototype.prependListener = - function prependListener(type, listener) { - return _addListener(this, type, listener, true); - }; - -function onceWrapper() { - if (!this.fired) { - this.target.removeListener(this.type, this.wrapFn); - this.fired = true; - if (arguments.length === 0) - return this.listener.call(this.target); - return this.listener.apply(this.target, arguments); - } -} - -function _onceWrap(target, type, listener) { - var state = { fired: false, wrapFn: undefined, target: target, type: type, listener: listener }; - var wrapped = onceWrapper.bind(state); - wrapped.listener = listener; - state.wrapFn = wrapped; - return wrapped; -} - -EventEmitter.prototype.once = function once(type, listener) { - checkListener(listener); - this.on(type, _onceWrap(this, type, listener)); - return this; -}; - -EventEmitter.prototype.prependOnceListener = - function prependOnceListener(type, listener) { - checkListener(listener); - this.prependListener(type, _onceWrap(this, type, listener)); - return this; - }; - -// Emits a 'removeListener' event if and only if the listener was removed. -EventEmitter.prototype.removeListener = - function removeListener(type, listener) { - var list, events, position, i, originalListener; - - checkListener(listener); - - events = this._events; - if (events === undefined) - return this; - - list = events[type]; - if (list === undefined) - return this; - - if (list === listener || list.listener === listener) { - if (--this._eventsCount === 0) - this._events = Object.create(null); - else { - delete events[type]; - if (events.removeListener) - this.emit('removeListener', type, list.listener || listener); - } - } else if (typeof list !== 'function') { - position = -1; - - for (i = list.length - 1; i >= 0; i--) { - if (list[i] === listener || list[i].listener === listener) { - originalListener = list[i].listener; - position = i; - break; - } - } - - if (position < 0) - return this; - - if (position === 0) - list.shift(); - else { - spliceOne(list, position); - } - - if (list.length === 1) - events[type] = list[0]; - - if (events.removeListener !== undefined) - this.emit('removeListener', type, originalListener || listener); - } - - return this; - }; - -EventEmitter.prototype.off = EventEmitter.prototype.removeListener; - -EventEmitter.prototype.removeAllListeners = - function removeAllListeners(type) { - var listeners, events, i; - - events = this._events; - if (events === undefined) - return this; - - // not listening for removeListener, no need to emit - if (events.removeListener === undefined) { - if (arguments.length === 0) { - this._events = Object.create(null); - this._eventsCount = 0; - } else if (events[type] !== undefined) { - if (--this._eventsCount === 0) - this._events = Object.create(null); - else - delete events[type]; - } - return this; - } - - // emit removeListener for all listeners on all events - if (arguments.length === 0) { - var keys = Object.keys(events); - var key; - for (i = 0; i < keys.length; ++i) { - key = keys[i]; - if (key === 'removeListener') continue; - this.removeAllListeners(key); - } - this.removeAllListeners('removeListener'); - this._events = Object.create(null); - this._eventsCount = 0; - return this; - } - - listeners = events[type]; - - if (typeof listeners === 'function') { - this.removeListener(type, listeners); - } else if (listeners !== undefined) { - // LIFO order - for (i = listeners.length - 1; i >= 0; i--) { - this.removeListener(type, listeners[i]); - } - } - - return this; - }; - -function _listeners(target, type, unwrap) { - var events = target._events; - - if (events === undefined) - return []; - - var evlistener = events[type]; - if (evlistener === undefined) - return []; - - if (typeof evlistener === 'function') - return unwrap ? [evlistener.listener || evlistener] : [evlistener]; - - return unwrap ? - unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length); -} - -EventEmitter.prototype.listeners = function listeners(type) { - return _listeners(this, type, true); -}; - -EventEmitter.prototype.rawListeners = function rawListeners(type) { - return _listeners(this, type, false); -}; - -EventEmitter.listenerCount = function(emitter, type) { - if (typeof emitter.listenerCount === 'function') { - return emitter.listenerCount(type); - } else { - return listenerCount.call(emitter, type); - } -}; - -EventEmitter.prototype.listenerCount = listenerCount; -function listenerCount(type) { - var events = this._events; - - if (events !== undefined) { - var evlistener = events[type]; - - if (typeof evlistener === 'function') { - return 1; - } else if (evlistener !== undefined) { - return evlistener.length; - } - } - - return 0; -} - -EventEmitter.prototype.eventNames = function eventNames() { - return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : []; -}; - -function arrayClone(arr, n) { - var copy = new Array(n); - for (var i = 0; i < n; ++i) - copy[i] = arr[i]; - return copy; -} - -function spliceOne(list, index) { - for (; index + 1 < list.length; index++) - list[index] = list[index + 1]; - list.pop(); -} - -function unwrapListeners(arr) { - var ret = new Array(arr.length); - for (var i = 0; i < ret.length; ++i) { - ret[i] = arr[i].listener || arr[i]; - } - return ret; -} - -function once(emitter, name) { - return new Promise(function (resolve, reject) { - function errorListener(err) { - emitter.removeListener(name, resolver); - reject(err); - } - - function resolver() { - if (typeof emitter.removeListener === 'function') { - emitter.removeListener('error', errorListener); - } - resolve([].slice.call(arguments)); - }; - - eventTargetAgnosticAddListener(emitter, name, resolver, { once: true }); - if (name !== 'error') { - addErrorHandlerIfEventEmitter(emitter, errorListener, { once: true }); - } - }); -} - -function addErrorHandlerIfEventEmitter(emitter, handler, flags) { - if (typeof emitter.on === 'function') { - eventTargetAgnosticAddListener(emitter, 'error', handler, flags); - } -} - -function eventTargetAgnosticAddListener(emitter, name, listener, flags) { - if (typeof emitter.on === 'function') { - if (flags.once) { - emitter.once(name, listener); - } else { - emitter.on(name, listener); - } - } else if (typeof emitter.addEventListener === 'function') { - // EventTarget does not have `error` event semantics like Node - // EventEmitters, we do not listen for `error` events here. - emitter.addEventListener(name, function wrapListener(arg) { - // IE does not have builtin `{ once: true }` support so we - // have to do it manually. - if (flags.once) { - emitter.removeEventListener(name, wrapListener); - } - listener(arg); - }); - } else { - throw new TypeError('The "emitter" argument must be of type EventEmitter. Received type ' + typeof emitter); - } -} - - -/***/ }), - -/***/ "./node_modules/html-entities/lib/index.js": -/*!*************************************************!*\ - !*** ./node_modules/html-entities/lib/index.js ***! - \*************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - -"use strict"; - -var __assign = (this && this.__assign) || function () { - __assign = Object.assign || function(t) { - for (var s, i = 1, n = arguments.length; i < n; i++) { - s = arguments[i]; - for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) - t[p] = s[p]; - } - return t; - }; - return __assign.apply(this, arguments); -}; -Object.defineProperty(exports, "__esModule", ({ value: true })); -var named_references_1 = __webpack_require__(/*! ./named-references */ "./node_modules/html-entities/lib/named-references.js"); -var numeric_unicode_map_1 = __webpack_require__(/*! ./numeric-unicode-map */ "./node_modules/html-entities/lib/numeric-unicode-map.js"); -var surrogate_pairs_1 = __webpack_require__(/*! ./surrogate-pairs */ "./node_modules/html-entities/lib/surrogate-pairs.js"); -var allNamedReferences = __assign(__assign({}, named_references_1.namedReferences), { all: named_references_1.namedReferences.html5 }); -var encodeRegExps = { - specialChars: /[<>'"&]/g, - nonAscii: /(?:[<>'"&\u0080-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])/g, - nonAsciiPrintable: /(?:[<>'"&\x01-\x08\x11-\x15\x17-\x1F\x7f-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])/g, - extensive: /(?:[\x01-\x0c\x0e-\x1f\x21-\x2c\x2e-\x2f\x3a-\x40\x5b-\x60\x7b-\x7d\x7f-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])/g -}; -var defaultEncodeOptions = { - mode: 'specialChars', - level: 'all', - numeric: 'decimal' -}; -/** Encodes all the necessary (specified by `level`) characters in the text */ -function encode(text, _a) { - var _b = _a === void 0 ? defaultEncodeOptions : _a, _c = _b.mode, mode = _c === void 0 ? 'specialChars' : _c, _d = _b.numeric, numeric = _d === void 0 ? 'decimal' : _d, _e = _b.level, level = _e === void 0 ? 'all' : _e; - if (!text) { - return ''; - } - var encodeRegExp = encodeRegExps[mode]; - var references = allNamedReferences[level].characters; - var isHex = numeric === 'hexadecimal'; - encodeRegExp.lastIndex = 0; - var _b = encodeRegExp.exec(text); - var _c; - if (_b) { - _c = ''; - var _d = 0; - do { - if (_d !== _b.index) { - _c += text.substring(_d, _b.index); - } - var _e = _b[0]; - var result_1 = references[_e]; - if (!result_1) { - var code_1 = _e.length > 1 ? surrogate_pairs_1.getCodePoint(_e, 0) : _e.charCodeAt(0); - result_1 = (isHex ? '&#x' + code_1.toString(16) : '&#' + code_1) + ';'; - } - _c += result_1; - _d = _b.index + _e.length; - } while ((_b = encodeRegExp.exec(text))); - if (_d !== text.length) { - _c += text.substring(_d); - } - } - else { - _c = - text; - } - return _c; -} -exports.encode = encode; -var defaultDecodeOptions = { - scope: 'body', - level: 'all' -}; -var strict = /&(?:#\d+|#[xX][\da-fA-F]+|[0-9a-zA-Z]+);/g; -var attribute = /&(?:#\d+|#[xX][\da-fA-F]+|[0-9a-zA-Z]+)[;=]?/g; -var baseDecodeRegExps = { - xml: { - strict: strict, - attribute: attribute, - body: named_references_1.bodyRegExps.xml - }, - html4: { - strict: strict, - attribute: attribute, - body: named_references_1.bodyRegExps.html4 - }, - html5: { - strict: strict, - attribute: attribute, - body: named_references_1.bodyRegExps.html5 - } -}; -var decodeRegExps = __assign(__assign({}, baseDecodeRegExps), { all: baseDecodeRegExps.html5 }); -var fromCharCode = String.fromCharCode; -var outOfBoundsChar = fromCharCode(65533); -var defaultDecodeEntityOptions = { - level: 'all' -}; -/** Decodes a single entity */ -function decodeEntity(entity, _a) { - var _b = (_a === void 0 ? defaultDecodeEntityOptions : _a).level, level = _b === void 0 ? 'all' : _b; - if (!entity) { - return ''; - } - var _b = entity; - var decodeEntityLastChar_1 = entity[entity.length - 1]; - if (false) {} - else if (false) {} - else { - var decodeResultByReference_1 = allNamedReferences[level].entities[entity]; - if (decodeResultByReference_1) { - _b = decodeResultByReference_1; - } - else if (entity[0] === '&' && entity[1] === '#') { - var decodeSecondChar_1 = entity[2]; - var decodeCode_1 = decodeSecondChar_1 == 'x' || decodeSecondChar_1 == 'X' - ? parseInt(entity.substr(3), 16) - : parseInt(entity.substr(2)); - _b = - decodeCode_1 >= 0x10ffff - ? outOfBoundsChar - : decodeCode_1 > 65535 - ? surrogate_pairs_1.fromCodePoint(decodeCode_1) - : fromCharCode(numeric_unicode_map_1.numericUnicodeMap[decodeCode_1] || decodeCode_1); - } - } - return _b; -} -exports.decodeEntity = decodeEntity; -/** Decodes all entities in the text */ -function decode(text, _a) { - var decodeSecondChar_1 = _a === void 0 ? defaultDecodeOptions : _a, decodeCode_1 = decodeSecondChar_1.level, level = decodeCode_1 === void 0 ? 'all' : decodeCode_1, _b = decodeSecondChar_1.scope, scope = _b === void 0 ? level === 'xml' ? 'strict' : 'body' : _b; - if (!text) { - return ''; - } - var decodeRegExp = decodeRegExps[level][scope]; - var references = allNamedReferences[level].entities; - var isAttribute = scope === 'attribute'; - var isStrict = scope === 'strict'; - decodeRegExp.lastIndex = 0; - var replaceMatch_1 = decodeRegExp.exec(text); - var replaceResult_1; - if (replaceMatch_1) { - replaceResult_1 = ''; - var replaceLastIndex_1 = 0; - do { - if (replaceLastIndex_1 !== replaceMatch_1.index) { - replaceResult_1 += text.substring(replaceLastIndex_1, replaceMatch_1.index); - } - var replaceInput_1 = replaceMatch_1[0]; - var decodeResult_1 = replaceInput_1; - var decodeEntityLastChar_2 = replaceInput_1[replaceInput_1.length - 1]; - if (isAttribute - && decodeEntityLastChar_2 === '=') { - decodeResult_1 = replaceInput_1; - } - else if (isStrict - && decodeEntityLastChar_2 !== ';') { - decodeResult_1 = replaceInput_1; - } - else { - var decodeResultByReference_2 = references[replaceInput_1]; - if (decodeResultByReference_2) { - decodeResult_1 = decodeResultByReference_2; - } - else if (replaceInput_1[0] === '&' && replaceInput_1[1] === '#') { - var decodeSecondChar_2 = replaceInput_1[2]; - var decodeCode_2 = decodeSecondChar_2 == 'x' || decodeSecondChar_2 == 'X' - ? parseInt(replaceInput_1.substr(3), 16) - : parseInt(replaceInput_1.substr(2)); - decodeResult_1 = - decodeCode_2 >= 0x10ffff - ? outOfBoundsChar - : decodeCode_2 > 65535 - ? surrogate_pairs_1.fromCodePoint(decodeCode_2) - : fromCharCode(numeric_unicode_map_1.numericUnicodeMap[decodeCode_2] || decodeCode_2); - } - } - replaceResult_1 += decodeResult_1; - replaceLastIndex_1 = replaceMatch_1.index + replaceInput_1.length; - } while ((replaceMatch_1 = decodeRegExp.exec(text))); - if (replaceLastIndex_1 !== text.length) { - replaceResult_1 += text.substring(replaceLastIndex_1); - } - } - else { - replaceResult_1 = - text; - } - return replaceResult_1; -} -exports.decode = decode; - - -/***/ }), - -/***/ "./node_modules/html-entities/lib/named-references.js": -/*!************************************************************!*\ - !*** ./node_modules/html-entities/lib/named-references.js ***! - \************************************************************/ -/***/ (function(__unused_webpack_module, exports) { - -"use strict"; -Object.defineProperty(exports, "__esModule", ({value:true}));exports.bodyRegExps={xml:/&(?:#\d+|#[xX][\da-fA-F]+|[0-9a-zA-Z]+);?/g,html4:/&(?:nbsp|iexcl|cent|pound|curren|yen|brvbar|sect|uml|copy|ordf|laquo|not|shy|reg|macr|deg|plusmn|sup2|sup3|acute|micro|para|middot|cedil|sup1|ordm|raquo|frac14|frac12|frac34|iquest|Agrave|Aacute|Acirc|Atilde|Auml|Aring|AElig|Ccedil|Egrave|Eacute|Ecirc|Euml|Igrave|Iacute|Icirc|Iuml|ETH|Ntilde|Ograve|Oacute|Ocirc|Otilde|Ouml|times|Oslash|Ugrave|Uacute|Ucirc|Uuml|Yacute|THORN|szlig|agrave|aacute|acirc|atilde|auml|aring|aelig|ccedil|egrave|eacute|ecirc|euml|igrave|iacute|icirc|iuml|eth|ntilde|ograve|oacute|ocirc|otilde|ouml|divide|oslash|ugrave|uacute|ucirc|uuml|yacute|thorn|yuml|quot|amp|lt|gt|#\d+|#[xX][\da-fA-F]+|[0-9a-zA-Z]+);?/g,html5:/&(?:AElig|AMP|Aacute|Acirc|Agrave|Aring|Atilde|Auml|COPY|Ccedil|ETH|Eacute|Ecirc|Egrave|Euml|GT|Iacute|Icirc|Igrave|Iuml|LT|Ntilde|Oacute|Ocirc|Ograve|Oslash|Otilde|Ouml|QUOT|REG|THORN|Uacute|Ucirc|Ugrave|Uuml|Yacute|aacute|acirc|acute|aelig|agrave|amp|aring|atilde|auml|brvbar|ccedil|cedil|cent|copy|curren|deg|divide|eacute|ecirc|egrave|eth|euml|frac12|frac14|frac34|gt|iacute|icirc|iexcl|igrave|iquest|iuml|laquo|lt|macr|micro|middot|nbsp|not|ntilde|oacute|ocirc|ograve|ordf|ordm|oslash|otilde|ouml|para|plusmn|pound|quot|raquo|reg|sect|shy|sup1|sup2|sup3|szlig|thorn|times|uacute|ucirc|ugrave|uml|uuml|yacute|yen|yuml|#\d+|#[xX][\da-fA-F]+|[0-9a-zA-Z]+);?/g};exports.namedReferences={xml:{entities:{"<":"<",">":">",""":'"',"'":"'","&":"&"},characters:{"<":"<",">":">",'"':""","'":"'","&":"&"}},html4:{entities:{"'":"'"," ":" "," ":" ","¡":"¡","¡":"¡","¢":"¢","¢":"¢","£":"£","£":"£","¤":"¤","¤":"¤","¥":"¥","¥":"¥","¦":"¦","¦":"¦","§":"§","§":"§","¨":"¨","¨":"¨","©":"©","©":"©","ª":"ª","ª":"ª","«":"«","«":"«","¬":"¬","¬":"¬","­":"­","­":"­","®":"®","®":"®","¯":"¯","¯":"¯","°":"°","°":"°","±":"±","±":"±","²":"²","²":"²","³":"³","³":"³","´":"´","´":"´","µ":"µ","µ":"µ","¶":"¶","¶":"¶","·":"·","·":"·","¸":"¸","¸":"¸","¹":"¹","¹":"¹","º":"º","º":"º","»":"»","»":"»","¼":"¼","¼":"¼","½":"½","½":"½","¾":"¾","¾":"¾","¿":"¿","¿":"¿","À":"À","À":"À","Á":"Á","Á":"Á","Â":"Â","Â":"Â","Ã":"Ã","Ã":"Ã","Ä":"Ä","Ä":"Ä","Å":"Å","Å":"Å","Æ":"Æ","Æ":"Æ","Ç":"Ç","Ç":"Ç","È":"È","È":"È","É":"É","É":"É","Ê":"Ê","Ê":"Ê","Ë":"Ë","Ë":"Ë","Ì":"Ì","Ì":"Ì","Í":"Í","Í":"Í","Î":"Î","Î":"Î","Ï":"Ï","Ï":"Ï","Ð":"Ð","Ð":"Ð","Ñ":"Ñ","Ñ":"Ñ","Ò":"Ò","Ò":"Ò","Ó":"Ó","Ó":"Ó","Ô":"Ô","Ô":"Ô","Õ":"Õ","Õ":"Õ","Ö":"Ö","Ö":"Ö","×":"×","×":"×","Ø":"Ø","Ø":"Ø","Ù":"Ù","Ù":"Ù","Ú":"Ú","Ú":"Ú","Û":"Û","Û":"Û","Ü":"Ü","Ü":"Ü","Ý":"Ý","Ý":"Ý","Þ":"Þ","Þ":"Þ","ß":"ß","ß":"ß","à":"à","à":"à","á":"á","á":"á","â":"â","â":"â","ã":"ã","ã":"ã","ä":"ä","ä":"ä","å":"å","å":"å","æ":"æ","æ":"æ","ç":"ç","ç":"ç","è":"è","è":"è","é":"é","é":"é","ê":"ê","ê":"ê","ë":"ë","ë":"ë","ì":"ì","ì":"ì","í":"í","í":"í","î":"î","î":"î","ï":"ï","ï":"ï","ð":"ð","ð":"ð","ñ":"ñ","ñ":"ñ","ò":"ò","ò":"ò","ó":"ó","ó":"ó","ô":"ô","ô":"ô","õ":"õ","õ":"õ","ö":"ö","ö":"ö","÷":"÷","÷":"÷","ø":"ø","ø":"ø","ù":"ù","ù":"ù","ú":"ú","ú":"ú","û":"û","û":"û","ü":"ü","ü":"ü","ý":"ý","ý":"ý","þ":"þ","þ":"þ","ÿ":"ÿ","ÿ":"ÿ",""":'"',""":'"',"&":"&","&":"&","<":"<","<":"<",">":">",">":">","Œ":"Œ","œ":"œ","Š":"Š","š":"š","Ÿ":"Ÿ","ˆ":"ˆ","˜":"˜"," ":" "," ":" "," ":" ","‌":"‌","‍":"‍","‎":"‎","‏":"‏","–":"–","—":"—","‘":"‘","’":"’","‚":"‚","“":"“","”":"”","„":"„","†":"†","‡":"‡","‰":"‰","‹":"‹","›":"›","€":"€","ƒ":"ƒ","Α":"Α","Β":"Β","Γ":"Γ","Δ":"Δ","Ε":"Ε","Ζ":"Ζ","Η":"Η","Θ":"Θ","Ι":"Ι","Κ":"Κ","Λ":"Λ","Μ":"Μ","Ν":"Ν","Ξ":"Ξ","Ο":"Ο","Π":"Π","Ρ":"Ρ","Σ":"Σ","Τ":"Τ","Υ":"Υ","Φ":"Φ","Χ":"Χ","Ψ":"Ψ","Ω":"Ω","α":"α","β":"β","γ":"γ","δ":"δ","ε":"ε","ζ":"ζ","η":"η","θ":"θ","ι":"ι","κ":"κ","λ":"λ","μ":"μ","ν":"ν","ξ":"ξ","ο":"ο","π":"π","ρ":"ρ","ς":"ς","σ":"σ","τ":"τ","υ":"υ","φ":"φ","χ":"χ","ψ":"ψ","ω":"ω","ϑ":"ϑ","ϒ":"ϒ","ϖ":"ϖ","•":"•","…":"…","′":"′","″":"″","‾":"‾","⁄":"⁄","℘":"℘","ℑ":"ℑ","ℜ":"ℜ","™":"™","ℵ":"ℵ","←":"←","↑":"↑","→":"→","↓":"↓","↔":"↔","↵":"↵","⇐":"⇐","⇑":"⇑","⇒":"⇒","⇓":"⇓","⇔":"⇔","∀":"∀","∂":"∂","∃":"∃","∅":"∅","∇":"∇","∈":"∈","∉":"∉","∋":"∋","∏":"∏","∑":"∑","−":"−","∗":"∗","√":"√","∝":"∝","∞":"∞","∠":"∠","∧":"∧","∨":"∨","∩":"∩","∪":"∪","∫":"∫","∴":"∴","∼":"∼","≅":"≅","≈":"≈","≠":"≠","≡":"≡","≤":"≤","≥":"≥","⊂":"⊂","⊃":"⊃","⊄":"⊄","⊆":"⊆","⊇":"⊇","⊕":"⊕","⊗":"⊗","⊥":"⊥","⋅":"⋅","⌈":"⌈","⌉":"⌉","⌊":"⌊","⌋":"⌋","⟨":"〈","⟩":"〉","◊":"◊","♠":"♠","♣":"♣","♥":"♥","♦":"♦"},characters:{"'":"'"," ":" ","¡":"¡","¢":"¢","£":"£","¤":"¤","¥":"¥","¦":"¦","§":"§","¨":"¨","©":"©","ª":"ª","«":"«","¬":"¬","­":"­","®":"®","¯":"¯","°":"°","±":"±","²":"²","³":"³","´":"´","µ":"µ","¶":"¶","·":"·","¸":"¸","¹":"¹","º":"º","»":"»","¼":"¼","½":"½","¾":"¾","¿":"¿","À":"À","Á":"Á","Â":"Â","Ã":"Ã","Ä":"Ä","Å":"Å","Æ":"Æ","Ç":"Ç","È":"È","É":"É","Ê":"Ê","Ë":"Ë","Ì":"Ì","Í":"Í","Î":"Î","Ï":"Ï","Ð":"Ð","Ñ":"Ñ","Ò":"Ò","Ó":"Ó","Ô":"Ô","Õ":"Õ","Ö":"Ö","×":"×","Ø":"Ø","Ù":"Ù","Ú":"Ú","Û":"Û","Ü":"Ü","Ý":"Ý","Þ":"Þ","ß":"ß","à":"à","á":"á","â":"â","ã":"ã","ä":"ä","å":"å","æ":"æ","ç":"ç","è":"è","é":"é","ê":"ê","ë":"ë","ì":"ì","í":"í","î":"î","ï":"ï","ð":"ð","ñ":"ñ","ò":"ò","ó":"ó","ô":"ô","õ":"õ","ö":"ö","÷":"÷","ø":"ø","ù":"ù","ú":"ú","û":"û","ü":"ü","ý":"ý","þ":"þ","ÿ":"ÿ",'"':""","&":"&","<":"<",">":">","Œ":"Œ","œ":"œ","Š":"Š","š":"š","Ÿ":"Ÿ","ˆ":"ˆ","˜":"˜"," ":" "," ":" "," ":" ","‌":"‌","‍":"‍","‎":"‎","‏":"‏","–":"–","—":"—","‘":"‘","’":"’","‚":"‚","“":"“","”":"”","„":"„","†":"†","‡":"‡","‰":"‰","‹":"‹","›":"›","€":"€","ƒ":"ƒ","Α":"Α","Β":"Β","Γ":"Γ","Δ":"Δ","Ε":"Ε","Ζ":"Ζ","Η":"Η","Θ":"Θ","Ι":"Ι","Κ":"Κ","Λ":"Λ","Μ":"Μ","Ν":"Ν","Ξ":"Ξ","Ο":"Ο","Π":"Π","Ρ":"Ρ","Σ":"Σ","Τ":"Τ","Υ":"Υ","Φ":"Φ","Χ":"Χ","Ψ":"Ψ","Ω":"Ω","α":"α","β":"β","γ":"γ","δ":"δ","ε":"ε","ζ":"ζ","η":"η","θ":"θ","ι":"ι","κ":"κ","λ":"λ","μ":"μ","ν":"ν","ξ":"ξ","ο":"ο","π":"π","ρ":"ρ","ς":"ς","σ":"σ","τ":"τ","υ":"υ","φ":"φ","χ":"χ","ψ":"ψ","ω":"ω","ϑ":"ϑ","ϒ":"ϒ","ϖ":"ϖ","•":"•","…":"…","′":"′","″":"″","‾":"‾","⁄":"⁄","℘":"℘","ℑ":"ℑ","ℜ":"ℜ","™":"™","ℵ":"ℵ","←":"←","↑":"↑","→":"→","↓":"↓","↔":"↔","↵":"↵","⇐":"⇐","⇑":"⇑","⇒":"⇒","⇓":"⇓","⇔":"⇔","∀":"∀","∂":"∂","∃":"∃","∅":"∅","∇":"∇","∈":"∈","∉":"∉","∋":"∋","∏":"∏","∑":"∑","−":"−","∗":"∗","√":"√","∝":"∝","∞":"∞","∠":"∠","∧":"∧","∨":"∨","∩":"∩","∪":"∪","∫":"∫","∴":"∴","∼":"∼","≅":"≅","≈":"≈","≠":"≠","≡":"≡","≤":"≤","≥":"≥","⊂":"⊂","⊃":"⊃","⊄":"⊄","⊆":"⊆","⊇":"⊇","⊕":"⊕","⊗":"⊗","⊥":"⊥","⋅":"⋅","⌈":"⌈","⌉":"⌉","⌊":"⌊","⌋":"⌋","〈":"⟨","〉":"⟩","◊":"◊","♠":"♠","♣":"♣","♥":"♥","♦":"♦"}},html5:{entities:{"Æ":"Æ","Æ":"Æ","&":"&","&":"&","Á":"Á","Á":"Á","Ă":"Ă","Â":"Â","Â":"Â","А":"А","𝔄":"𝔄","À":"À","À":"À","Α":"Α","Ā":"Ā","⩓":"⩓","Ą":"Ą","𝔸":"𝔸","⁡":"⁡","Å":"Å","Å":"Å","𝒜":"𝒜","≔":"≔","Ã":"Ã","Ã":"Ã","Ä":"Ä","Ä":"Ä","∖":"∖","⫧":"⫧","⌆":"⌆","Б":"Б","∵":"∵","ℬ":"ℬ","Β":"Β","𝔅":"𝔅","𝔹":"𝔹","˘":"˘","ℬ":"ℬ","≎":"≎","Ч":"Ч","©":"©","©":"©","Ć":"Ć","⋒":"⋒","ⅅ":"ⅅ","ℭ":"ℭ","Č":"Č","Ç":"Ç","Ç":"Ç","Ĉ":"Ĉ","∰":"∰","Ċ":"Ċ","¸":"¸","·":"·","ℭ":"ℭ","Χ":"Χ","⊙":"⊙","⊖":"⊖","⊕":"⊕","⊗":"⊗","∲":"∲","”":"”","’":"’","∷":"∷","⩴":"⩴","≡":"≡","∯":"∯","∮":"∮","ℂ":"ℂ","∐":"∐","∳":"∳","⨯":"⨯","𝒞":"𝒞","⋓":"⋓","≍":"≍","ⅅ":"ⅅ","⤑":"⤑","Ђ":"Ђ","Ѕ":"Ѕ","Џ":"Џ","‡":"‡","↡":"↡","⫤":"⫤","Ď":"Ď","Д":"Д","∇":"∇","Δ":"Δ","𝔇":"𝔇","´":"´","˙":"˙","˝":"˝","`":"`","˜":"˜","⋄":"⋄","ⅆ":"ⅆ","𝔻":"𝔻","¨":"¨","⃜":"⃜","≐":"≐","∯":"∯","¨":"¨","⇓":"⇓","⇐":"⇐","⇔":"⇔","⫤":"⫤","⟸":"⟸","⟺":"⟺","⟹":"⟹","⇒":"⇒","⊨":"⊨","⇑":"⇑","⇕":"⇕","∥":"∥","↓":"↓","⤓":"⤓","⇵":"⇵","̑":"̑","⥐":"⥐","⥞":"⥞","↽":"↽","⥖":"⥖","⥟":"⥟","⇁":"⇁","⥗":"⥗","⊤":"⊤","↧":"↧","⇓":"⇓","𝒟":"𝒟","Đ":"Đ","Ŋ":"Ŋ","Ð":"Ð","Ð":"Ð","É":"É","É":"É","Ě":"Ě","Ê":"Ê","Ê":"Ê","Э":"Э","Ė":"Ė","𝔈":"𝔈","È":"È","È":"È","∈":"∈","Ē":"Ē","◻":"◻","▫":"▫","Ę":"Ę","𝔼":"𝔼","Ε":"Ε","⩵":"⩵","≂":"≂","⇌":"⇌","ℰ":"ℰ","⩳":"⩳","Η":"Η","Ë":"Ë","Ë":"Ë","∃":"∃","ⅇ":"ⅇ","Ф":"Ф","𝔉":"𝔉","◼":"◼","▪":"▪","𝔽":"𝔽","∀":"∀","ℱ":"ℱ","ℱ":"ℱ","Ѓ":"Ѓ",">":">",">":">","Γ":"Γ","Ϝ":"Ϝ","Ğ":"Ğ","Ģ":"Ģ","Ĝ":"Ĝ","Г":"Г","Ġ":"Ġ","𝔊":"𝔊","⋙":"⋙","𝔾":"𝔾","≥":"≥","⋛":"⋛","≧":"≧","⪢":"⪢","≷":"≷","⩾":"⩾","≳":"≳","𝒢":"𝒢","≫":"≫","Ъ":"Ъ","ˇ":"ˇ","^":"^","Ĥ":"Ĥ","ℌ":"ℌ","ℋ":"ℋ","ℍ":"ℍ","─":"─","ℋ":"ℋ","Ħ":"Ħ","≎":"≎","≏":"≏","Е":"Е","IJ":"IJ","Ё":"Ё","Í":"Í","Í":"Í","Î":"Î","Î":"Î","И":"И","İ":"İ","ℑ":"ℑ","Ì":"Ì","Ì":"Ì","ℑ":"ℑ","Ī":"Ī","ⅈ":"ⅈ","⇒":"⇒","∬":"∬","∫":"∫","⋂":"⋂","⁣":"⁣","⁢":"⁢","Į":"Į","𝕀":"𝕀","Ι":"Ι","ℐ":"ℐ","Ĩ":"Ĩ","І":"І","Ï":"Ï","Ï":"Ï","Ĵ":"Ĵ","Й":"Й","𝔍":"𝔍","𝕁":"𝕁","𝒥":"𝒥","Ј":"Ј","Є":"Є","Х":"Х","Ќ":"Ќ","Κ":"Κ","Ķ":"Ķ","К":"К","𝔎":"𝔎","𝕂":"𝕂","𝒦":"𝒦","Љ":"Љ","<":"<","<":"<","Ĺ":"Ĺ","Λ":"Λ","⟪":"⟪","ℒ":"ℒ","↞":"↞","Ľ":"Ľ","Ļ":"Ļ","Л":"Л","⟨":"⟨","←":"←","⇤":"⇤","⇆":"⇆","⌈":"⌈","⟦":"⟦","⥡":"⥡","⇃":"⇃","⥙":"⥙","⌊":"⌊","↔":"↔","⥎":"⥎","⊣":"⊣","↤":"↤","⥚":"⥚","⊲":"⊲","⧏":"⧏","⊴":"⊴","⥑":"⥑","⥠":"⥠","↿":"↿","⥘":"⥘","↼":"↼","⥒":"⥒","⇐":"⇐","⇔":"⇔","⋚":"⋚","≦":"≦","≶":"≶","⪡":"⪡","⩽":"⩽","≲":"≲","𝔏":"𝔏","⋘":"⋘","⇚":"⇚","Ŀ":"Ŀ","⟵":"⟵","⟷":"⟷","⟶":"⟶","⟸":"⟸","⟺":"⟺","⟹":"⟹","𝕃":"𝕃","↙":"↙","↘":"↘","ℒ":"ℒ","↰":"↰","Ł":"Ł","≪":"≪","⤅":"⤅","М":"М"," ":" ","ℳ":"ℳ","𝔐":"𝔐","∓":"∓","𝕄":"𝕄","ℳ":"ℳ","Μ":"Μ","Њ":"Њ","Ń":"Ń","Ň":"Ň","Ņ":"Ņ","Н":"Н","​":"​","​":"​","​":"​","​":"​","≫":"≫","≪":"≪"," ":"\n","𝔑":"𝔑","⁠":"⁠"," ":" ","ℕ":"ℕ","⫬":"⫬","≢":"≢","≭":"≭","∦":"∦","∉":"∉","≠":"≠","≂̸":"≂̸","∄":"∄","≯":"≯","≱":"≱","≧̸":"≧̸","≫̸":"≫̸","≹":"≹","⩾̸":"⩾̸","≵":"≵","≎̸":"≎̸","≏̸":"≏̸","⋪":"⋪","⧏̸":"⧏̸","⋬":"⋬","≮":"≮","≰":"≰","≸":"≸","≪̸":"≪̸","⩽̸":"⩽̸","≴":"≴","⪢̸":"⪢̸","⪡̸":"⪡̸","⊀":"⊀","⪯̸":"⪯̸","⋠":"⋠","∌":"∌","⋫":"⋫","⧐̸":"⧐̸","⋭":"⋭","⊏̸":"⊏̸","⋢":"⋢","⊐̸":"⊐̸","⋣":"⋣","⊂⃒":"⊂⃒","⊈":"⊈","⊁":"⊁","⪰̸":"⪰̸","⋡":"⋡","≿̸":"≿̸","⊃⃒":"⊃⃒","⊉":"⊉","≁":"≁","≄":"≄","≇":"≇","≉":"≉","∤":"∤","𝒩":"𝒩","Ñ":"Ñ","Ñ":"Ñ","Ν":"Ν","Œ":"Œ","Ó":"Ó","Ó":"Ó","Ô":"Ô","Ô":"Ô","О":"О","Ő":"Ő","𝔒":"𝔒","Ò":"Ò","Ò":"Ò","Ō":"Ō","Ω":"Ω","Ο":"Ο","𝕆":"𝕆","“":"“","‘":"‘","⩔":"⩔","𝒪":"𝒪","Ø":"Ø","Ø":"Ø","Õ":"Õ","Õ":"Õ","⨷":"⨷","Ö":"Ö","Ö":"Ö","‾":"‾","⏞":"⏞","⎴":"⎴","⏜":"⏜","∂":"∂","П":"П","𝔓":"𝔓","Φ":"Φ","Π":"Π","±":"±","ℌ":"ℌ","ℙ":"ℙ","⪻":"⪻","≺":"≺","⪯":"⪯","≼":"≼","≾":"≾","″":"″","∏":"∏","∷":"∷","∝":"∝","𝒫":"𝒫","Ψ":"Ψ",""":'"',""":'"',"𝔔":"𝔔","ℚ":"ℚ","𝒬":"𝒬","⤐":"⤐","®":"®","®":"®","Ŕ":"Ŕ","⟫":"⟫","↠":"↠","⤖":"⤖","Ř":"Ř","Ŗ":"Ŗ","Р":"Р","ℜ":"ℜ","∋":"∋","⇋":"⇋","⥯":"⥯","ℜ":"ℜ","Ρ":"Ρ","⟩":"⟩","→":"→","⇥":"⇥","⇄":"⇄","⌉":"⌉","⟧":"⟧","⥝":"⥝","⇂":"⇂","⥕":"⥕","⌋":"⌋","⊢":"⊢","↦":"↦","⥛":"⥛","⊳":"⊳","⧐":"⧐","⊵":"⊵","⥏":"⥏","⥜":"⥜","↾":"↾","⥔":"⥔","⇀":"⇀","⥓":"⥓","⇒":"⇒","ℝ":"ℝ","⥰":"⥰","⇛":"⇛","ℛ":"ℛ","↱":"↱","⧴":"⧴","Щ":"Щ","Ш":"Ш","Ь":"Ь","Ś":"Ś","⪼":"⪼","Š":"Š","Ş":"Ş","Ŝ":"Ŝ","С":"С","𝔖":"𝔖","↓":"↓","←":"←","→":"→","↑":"↑","Σ":"Σ","∘":"∘","𝕊":"𝕊","√":"√","□":"□","⊓":"⊓","⊏":"⊏","⊑":"⊑","⊐":"⊐","⊒":"⊒","⊔":"⊔","𝒮":"𝒮","⋆":"⋆","⋐":"⋐","⋐":"⋐","⊆":"⊆","≻":"≻","⪰":"⪰","≽":"≽","≿":"≿","∋":"∋","∑":"∑","⋑":"⋑","⊃":"⊃","⊇":"⊇","⋑":"⋑","Þ":"Þ","Þ":"Þ","™":"™","Ћ":"Ћ","Ц":"Ц"," ":"\t","Τ":"Τ","Ť":"Ť","Ţ":"Ţ","Т":"Т","𝔗":"𝔗","∴":"∴","Θ":"Θ","  ":"  "," ":" ","∼":"∼","≃":"≃","≅":"≅","≈":"≈","𝕋":"𝕋","⃛":"⃛","𝒯":"𝒯","Ŧ":"Ŧ","Ú":"Ú","Ú":"Ú","↟":"↟","⥉":"⥉","Ў":"Ў","Ŭ":"Ŭ","Û":"Û","Û":"Û","У":"У","Ű":"Ű","𝔘":"𝔘","Ù":"Ù","Ù":"Ù","Ū":"Ū","_":"_","⏟":"⏟","⎵":"⎵","⏝":"⏝","⋃":"⋃","⊎":"⊎","Ų":"Ų","𝕌":"𝕌","↑":"↑","⤒":"⤒","⇅":"⇅","↕":"↕","⥮":"⥮","⊥":"⊥","↥":"↥","⇑":"⇑","⇕":"⇕","↖":"↖","↗":"↗","ϒ":"ϒ","Υ":"Υ","Ů":"Ů","𝒰":"𝒰","Ũ":"Ũ","Ü":"Ü","Ü":"Ü","⊫":"⊫","⫫":"⫫","В":"В","⊩":"⊩","⫦":"⫦","⋁":"⋁","‖":"‖","‖":"‖","∣":"∣","|":"|","❘":"❘","≀":"≀"," ":" ","𝔙":"𝔙","𝕍":"𝕍","𝒱":"𝒱","⊪":"⊪","Ŵ":"Ŵ","⋀":"⋀","𝔚":"𝔚","𝕎":"𝕎","𝒲":"𝒲","𝔛":"𝔛","Ξ":"Ξ","𝕏":"𝕏","𝒳":"𝒳","Я":"Я","Ї":"Ї","Ю":"Ю","Ý":"Ý","Ý":"Ý","Ŷ":"Ŷ","Ы":"Ы","𝔜":"𝔜","𝕐":"𝕐","𝒴":"𝒴","Ÿ":"Ÿ","Ж":"Ж","Ź":"Ź","Ž":"Ž","З":"З","Ż":"Ż","​":"​","Ζ":"Ζ","ℨ":"ℨ","ℤ":"ℤ","𝒵":"𝒵","á":"á","á":"á","ă":"ă","∾":"∾","∾̳":"∾̳","∿":"∿","â":"â","â":"â","´":"´","´":"´","а":"а","æ":"æ","æ":"æ","⁡":"⁡","𝔞":"𝔞","à":"à","à":"à","ℵ":"ℵ","ℵ":"ℵ","α":"α","ā":"ā","⨿":"⨿","&":"&","&":"&","∧":"∧","⩕":"⩕","⩜":"⩜","⩘":"⩘","⩚":"⩚","∠":"∠","⦤":"⦤","∠":"∠","∡":"∡","⦨":"⦨","⦩":"⦩","⦪":"⦪","⦫":"⦫","⦬":"⦬","⦭":"⦭","⦮":"⦮","⦯":"⦯","∟":"∟","⊾":"⊾","⦝":"⦝","∢":"∢","Å":"Å","⍼":"⍼","ą":"ą","𝕒":"𝕒","≈":"≈","⩰":"⩰","⩯":"⩯","≊":"≊","≋":"≋","'":"'","≈":"≈","≊":"≊","å":"å","å":"å","𝒶":"𝒶","*":"*","≈":"≈","≍":"≍","ã":"ã","ã":"ã","ä":"ä","ä":"ä","∳":"∳","⨑":"⨑","⫭":"⫭","≌":"≌","϶":"϶","‵":"‵","∽":"∽","⋍":"⋍","⊽":"⊽","⌅":"⌅","⌅":"⌅","⎵":"⎵","⎶":"⎶","≌":"≌","б":"б","„":"„","∵":"∵","∵":"∵","⦰":"⦰","϶":"϶","ℬ":"ℬ","β":"β","ℶ":"ℶ","≬":"≬","𝔟":"𝔟","⋂":"⋂","◯":"◯","⋃":"⋃","⨀":"⨀","⨁":"⨁","⨂":"⨂","⨆":"⨆","★":"★","▽":"▽","△":"△","⨄":"⨄","⋁":"⋁","⋀":"⋀","⤍":"⤍","⧫":"⧫","▪":"▪","▴":"▴","▾":"▾","◂":"◂","▸":"▸","␣":"␣","▒":"▒","░":"░","▓":"▓","█":"█","=⃥":"=⃥","≡⃥":"≡⃥","⌐":"⌐","𝕓":"𝕓","⊥":"⊥","⊥":"⊥","⋈":"⋈","╗":"╗","╔":"╔","╖":"╖","╓":"╓","═":"═","╦":"╦","╩":"╩","╤":"╤","╧":"╧","╝":"╝","╚":"╚","╜":"╜","╙":"╙","║":"║","╬":"╬","╣":"╣","╠":"╠","╫":"╫","╢":"╢","╟":"╟","⧉":"⧉","╕":"╕","╒":"╒","┐":"┐","┌":"┌","─":"─","╥":"╥","╨":"╨","┬":"┬","┴":"┴","⊟":"⊟","⊞":"⊞","⊠":"⊠","╛":"╛","╘":"╘","┘":"┘","└":"└","│":"│","╪":"╪","╡":"╡","╞":"╞","┼":"┼","┤":"┤","├":"├","‵":"‵","˘":"˘","¦":"¦","¦":"¦","𝒷":"𝒷","⁏":"⁏","∽":"∽","⋍":"⋍","\":"\\","⧅":"⧅","⟈":"⟈","•":"•","•":"•","≎":"≎","⪮":"⪮","≏":"≏","≏":"≏","ć":"ć","∩":"∩","⩄":"⩄","⩉":"⩉","⩋":"⩋","⩇":"⩇","⩀":"⩀","∩︀":"∩︀","⁁":"⁁","ˇ":"ˇ","⩍":"⩍","č":"č","ç":"ç","ç":"ç","ĉ":"ĉ","⩌":"⩌","⩐":"⩐","ċ":"ċ","¸":"¸","¸":"¸","⦲":"⦲","¢":"¢","¢":"¢","·":"·","𝔠":"𝔠","ч":"ч","✓":"✓","✓":"✓","χ":"χ","○":"○","⧃":"⧃","ˆ":"ˆ","≗":"≗","↺":"↺","↻":"↻","®":"®","Ⓢ":"Ⓢ","⊛":"⊛","⊚":"⊚","⊝":"⊝","≗":"≗","⨐":"⨐","⫯":"⫯","⧂":"⧂","♣":"♣","♣":"♣",":":":","≔":"≔","≔":"≔",",":",","@":"@","∁":"∁","∘":"∘","∁":"∁","ℂ":"ℂ","≅":"≅","⩭":"⩭","∮":"∮","𝕔":"𝕔","∐":"∐","©":"©","©":"©","℗":"℗","↵":"↵","✗":"✗","𝒸":"𝒸","⫏":"⫏","⫑":"⫑","⫐":"⫐","⫒":"⫒","⋯":"⋯","⤸":"⤸","⤵":"⤵","⋞":"⋞","⋟":"⋟","↶":"↶","⤽":"⤽","∪":"∪","⩈":"⩈","⩆":"⩆","⩊":"⩊","⊍":"⊍","⩅":"⩅","∪︀":"∪︀","↷":"↷","⤼":"⤼","⋞":"⋞","⋟":"⋟","⋎":"⋎","⋏":"⋏","¤":"¤","¤":"¤","↶":"↶","↷":"↷","⋎":"⋎","⋏":"⋏","∲":"∲","∱":"∱","⌭":"⌭","⇓":"⇓","⥥":"⥥","†":"†","ℸ":"ℸ","↓":"↓","‐":"‐","⊣":"⊣","⤏":"⤏","˝":"˝","ď":"ď","д":"д","ⅆ":"ⅆ","‡":"‡","⇊":"⇊","⩷":"⩷","°":"°","°":"°","δ":"δ","⦱":"⦱","⥿":"⥿","𝔡":"𝔡","⇃":"⇃","⇂":"⇂","⋄":"⋄","⋄":"⋄","♦":"♦","♦":"♦","¨":"¨","ϝ":"ϝ","⋲":"⋲","÷":"÷","÷":"÷","÷":"÷","⋇":"⋇","⋇":"⋇","ђ":"ђ","⌞":"⌞","⌍":"⌍","$":"$","𝕕":"𝕕","˙":"˙","≐":"≐","≑":"≑","∸":"∸","∔":"∔","⊡":"⊡","⌆":"⌆","↓":"↓","⇊":"⇊","⇃":"⇃","⇂":"⇂","⤐":"⤐","⌟":"⌟","⌌":"⌌","𝒹":"𝒹","ѕ":"ѕ","⧶":"⧶","đ":"đ","⋱":"⋱","▿":"▿","▾":"▾","⇵":"⇵","⥯":"⥯","⦦":"⦦","џ":"џ","⟿":"⟿","⩷":"⩷","≑":"≑","é":"é","é":"é","⩮":"⩮","ě":"ě","≖":"≖","ê":"ê","ê":"ê","≕":"≕","э":"э","ė":"ė","ⅇ":"ⅇ","≒":"≒","𝔢":"𝔢","⪚":"⪚","è":"è","è":"è","⪖":"⪖","⪘":"⪘","⪙":"⪙","⏧":"⏧","ℓ":"ℓ","⪕":"⪕","⪗":"⪗","ē":"ē","∅":"∅","∅":"∅","∅":"∅"," ":" "," ":" "," ":" ","ŋ":"ŋ"," ":" ","ę":"ę","𝕖":"𝕖","⋕":"⋕","⧣":"⧣","⩱":"⩱","ε":"ε","ε":"ε","ϵ":"ϵ","≖":"≖","≕":"≕","≂":"≂","⪖":"⪖","⪕":"⪕","=":"=","≟":"≟","≡":"≡","⩸":"⩸","⧥":"⧥","≓":"≓","⥱":"⥱","ℯ":"ℯ","≐":"≐","≂":"≂","η":"η","ð":"ð","ð":"ð","ë":"ë","ë":"ë","€":"€","!":"!","∃":"∃","ℰ":"ℰ","ⅇ":"ⅇ","≒":"≒","ф":"ф","♀":"♀","ffi":"ffi","ff":"ff","ffl":"ffl","𝔣":"𝔣","fi":"fi","fj":"fj","♭":"♭","fl":"fl","▱":"▱","ƒ":"ƒ","𝕗":"𝕗","∀":"∀","⋔":"⋔","⫙":"⫙","⨍":"⨍","½":"½","½":"½","⅓":"⅓","¼":"¼","¼":"¼","⅕":"⅕","⅙":"⅙","⅛":"⅛","⅔":"⅔","⅖":"⅖","¾":"¾","¾":"¾","⅗":"⅗","⅜":"⅜","⅘":"⅘","⅚":"⅚","⅝":"⅝","⅞":"⅞","⁄":"⁄","⌢":"⌢","𝒻":"𝒻","≧":"≧","⪌":"⪌","ǵ":"ǵ","γ":"γ","ϝ":"ϝ","⪆":"⪆","ğ":"ğ","ĝ":"ĝ","г":"г","ġ":"ġ","≥":"≥","⋛":"⋛","≥":"≥","≧":"≧","⩾":"⩾","⩾":"⩾","⪩":"⪩","⪀":"⪀","⪂":"⪂","⪄":"⪄","⋛︀":"⋛︀","⪔":"⪔","𝔤":"𝔤","≫":"≫","⋙":"⋙","ℷ":"ℷ","ѓ":"ѓ","≷":"≷","⪒":"⪒","⪥":"⪥","⪤":"⪤","≩":"≩","⪊":"⪊","⪊":"⪊","⪈":"⪈","⪈":"⪈","≩":"≩","⋧":"⋧","𝕘":"𝕘","`":"`","ℊ":"ℊ","≳":"≳","⪎":"⪎","⪐":"⪐",">":">",">":">","⪧":"⪧","⩺":"⩺","⋗":"⋗","⦕":"⦕","⩼":"⩼","⪆":"⪆","⥸":"⥸","⋗":"⋗","⋛":"⋛","⪌":"⪌","≷":"≷","≳":"≳","≩︀":"≩︀","≩︀":"≩︀","⇔":"⇔"," ":" ","½":"½","ℋ":"ℋ","ъ":"ъ","↔":"↔","⥈":"⥈","↭":"↭","ℏ":"ℏ","ĥ":"ĥ","♥":"♥","♥":"♥","…":"…","⊹":"⊹","𝔥":"𝔥","⤥":"⤥","⤦":"⤦","⇿":"⇿","∻":"∻","↩":"↩","↪":"↪","𝕙":"𝕙","―":"―","𝒽":"𝒽","ℏ":"ℏ","ħ":"ħ","⁃":"⁃","‐":"‐","í":"í","í":"í","⁣":"⁣","î":"î","î":"î","и":"и","е":"е","¡":"¡","¡":"¡","⇔":"⇔","𝔦":"𝔦","ì":"ì","ì":"ì","ⅈ":"ⅈ","⨌":"⨌","∭":"∭","⧜":"⧜","℩":"℩","ij":"ij","ī":"ī","ℑ":"ℑ","ℐ":"ℐ","ℑ":"ℑ","ı":"ı","⊷":"⊷","Ƶ":"Ƶ","∈":"∈","℅":"℅","∞":"∞","⧝":"⧝","ı":"ı","∫":"∫","⊺":"⊺","ℤ":"ℤ","⊺":"⊺","⨗":"⨗","⨼":"⨼","ё":"ё","į":"į","𝕚":"𝕚","ι":"ι","⨼":"⨼","¿":"¿","¿":"¿","𝒾":"𝒾","∈":"∈","⋹":"⋹","⋵":"⋵","⋴":"⋴","⋳":"⋳","∈":"∈","⁢":"⁢","ĩ":"ĩ","і":"і","ï":"ï","ï":"ï","ĵ":"ĵ","й":"й","𝔧":"𝔧","ȷ":"ȷ","𝕛":"𝕛","𝒿":"𝒿","ј":"ј","є":"є","κ":"κ","ϰ":"ϰ","ķ":"ķ","к":"к","𝔨":"𝔨","ĸ":"ĸ","х":"х","ќ":"ќ","𝕜":"𝕜","𝓀":"𝓀","⇚":"⇚","⇐":"⇐","⤛":"⤛","⤎":"⤎","≦":"≦","⪋":"⪋","⥢":"⥢","ĺ":"ĺ","⦴":"⦴","ℒ":"ℒ","λ":"λ","⟨":"⟨","⦑":"⦑","⟨":"⟨","⪅":"⪅","«":"«","«":"«","←":"←","⇤":"⇤","⤟":"⤟","⤝":"⤝","↩":"↩","↫":"↫","⤹":"⤹","⥳":"⥳","↢":"↢","⪫":"⪫","⤙":"⤙","⪭":"⪭","⪭︀":"⪭︀","⤌":"⤌","❲":"❲","{":"{","[":"[","⦋":"⦋","⦏":"⦏","⦍":"⦍","ľ":"ľ","ļ":"ļ","⌈":"⌈","{":"{","л":"л","⤶":"⤶","“":"“","„":"„","⥧":"⥧","⥋":"⥋","↲":"↲","≤":"≤","←":"←","↢":"↢","↽":"↽","↼":"↼","⇇":"⇇","↔":"↔","⇆":"⇆","⇋":"⇋","↭":"↭","⋋":"⋋","⋚":"⋚","≤":"≤","≦":"≦","⩽":"⩽","⩽":"⩽","⪨":"⪨","⩿":"⩿","⪁":"⪁","⪃":"⪃","⋚︀":"⋚︀","⪓":"⪓","⪅":"⪅","⋖":"⋖","⋚":"⋚","⪋":"⪋","≶":"≶","≲":"≲","⥼":"⥼","⌊":"⌊","𝔩":"𝔩","≶":"≶","⪑":"⪑","↽":"↽","↼":"↼","⥪":"⥪","▄":"▄","љ":"љ","≪":"≪","⇇":"⇇","⌞":"⌞","⥫":"⥫","◺":"◺","ŀ":"ŀ","⎰":"⎰","⎰":"⎰","≨":"≨","⪉":"⪉","⪉":"⪉","⪇":"⪇","⪇":"⪇","≨":"≨","⋦":"⋦","⟬":"⟬","⇽":"⇽","⟦":"⟦","⟵":"⟵","⟷":"⟷","⟼":"⟼","⟶":"⟶","↫":"↫","↬":"↬","⦅":"⦅","𝕝":"𝕝","⨭":"⨭","⨴":"⨴","∗":"∗","_":"_","◊":"◊","◊":"◊","⧫":"⧫","(":"(","⦓":"⦓","⇆":"⇆","⌟":"⌟","⇋":"⇋","⥭":"⥭","‎":"‎","⊿":"⊿","‹":"‹","𝓁":"𝓁","↰":"↰","≲":"≲","⪍":"⪍","⪏":"⪏","[":"[","‘":"‘","‚":"‚","ł":"ł","<":"<","<":"<","⪦":"⪦","⩹":"⩹","⋖":"⋖","⋋":"⋋","⋉":"⋉","⥶":"⥶","⩻":"⩻","⦖":"⦖","◃":"◃","⊴":"⊴","◂":"◂","⥊":"⥊","⥦":"⥦","≨︀":"≨︀","≨︀":"≨︀","∺":"∺","¯":"¯","¯":"¯","♂":"♂","✠":"✠","✠":"✠","↦":"↦","↦":"↦","↧":"↧","↤":"↤","↥":"↥","▮":"▮","⨩":"⨩","м":"м","—":"—","∡":"∡","𝔪":"𝔪","℧":"℧","µ":"µ","µ":"µ","∣":"∣","*":"*","⫰":"⫰","·":"·","·":"·","−":"−","⊟":"⊟","∸":"∸","⨪":"⨪","⫛":"⫛","…":"…","∓":"∓","⊧":"⊧","𝕞":"𝕞","∓":"∓","𝓂":"𝓂","∾":"∾","μ":"μ","⊸":"⊸","⊸":"⊸","⋙̸":"⋙̸","≫⃒":"≫⃒","≫̸":"≫̸","⇍":"⇍","⇎":"⇎","⋘̸":"⋘̸","≪⃒":"≪⃒","≪̸":"≪̸","⇏":"⇏","⊯":"⊯","⊮":"⊮","∇":"∇","ń":"ń","∠⃒":"∠⃒","≉":"≉","⩰̸":"⩰̸","≋̸":"≋̸","ʼn":"ʼn","≉":"≉","♮":"♮","♮":"♮","ℕ":"ℕ"," ":" "," ":" ","≎̸":"≎̸","≏̸":"≏̸","⩃":"⩃","ň":"ň","ņ":"ņ","≇":"≇","⩭̸":"⩭̸","⩂":"⩂","н":"н","–":"–","≠":"≠","⇗":"⇗","⤤":"⤤","↗":"↗","↗":"↗","≐̸":"≐̸","≢":"≢","⤨":"⤨","≂̸":"≂̸","∄":"∄","∄":"∄","𝔫":"𝔫","≧̸":"≧̸","≱":"≱","≱":"≱","≧̸":"≧̸","⩾̸":"⩾̸","⩾̸":"⩾̸","≵":"≵","≯":"≯","≯":"≯","⇎":"⇎","↮":"↮","⫲":"⫲","∋":"∋","⋼":"⋼","⋺":"⋺","∋":"∋","њ":"њ","⇍":"⇍","≦̸":"≦̸","↚":"↚","‥":"‥","≰":"≰","↚":"↚","↮":"↮","≰":"≰","≦̸":"≦̸","⩽̸":"⩽̸","⩽̸":"⩽̸","≮":"≮","≴":"≴","≮":"≮","⋪":"⋪","⋬":"⋬","∤":"∤","𝕟":"𝕟","¬":"¬","¬":"¬","∉":"∉","⋹̸":"⋹̸","⋵̸":"⋵̸","∉":"∉","⋷":"⋷","⋶":"⋶","∌":"∌","∌":"∌","⋾":"⋾","⋽":"⋽","∦":"∦","∦":"∦","⫽⃥":"⫽⃥","∂̸":"∂̸","⨔":"⨔","⊀":"⊀","⋠":"⋠","⪯̸":"⪯̸","⊀":"⊀","⪯̸":"⪯̸","⇏":"⇏","↛":"↛","⤳̸":"⤳̸","↝̸":"↝̸","↛":"↛","⋫":"⋫","⋭":"⋭","⊁":"⊁","⋡":"⋡","⪰̸":"⪰̸","𝓃":"𝓃","∤":"∤","∦":"∦","≁":"≁","≄":"≄","≄":"≄","∤":"∤","∦":"∦","⋢":"⋢","⋣":"⋣","⊄":"⊄","⫅̸":"⫅̸","⊈":"⊈","⊂⃒":"⊂⃒","⊈":"⊈","⫅̸":"⫅̸","⊁":"⊁","⪰̸":"⪰̸","⊅":"⊅","⫆̸":"⫆̸","⊉":"⊉","⊃⃒":"⊃⃒","⊉":"⊉","⫆̸":"⫆̸","≹":"≹","ñ":"ñ","ñ":"ñ","≸":"≸","⋪":"⋪","⋬":"⋬","⋫":"⋫","⋭":"⋭","ν":"ν","#":"#","№":"№"," ":" ","⊭":"⊭","⤄":"⤄","≍⃒":"≍⃒","⊬":"⊬","≥⃒":"≥⃒",">⃒":">⃒","⧞":"⧞","⤂":"⤂","≤⃒":"≤⃒","<⃒":"<⃒","⊴⃒":"⊴⃒","⤃":"⤃","⊵⃒":"⊵⃒","∼⃒":"∼⃒","⇖":"⇖","⤣":"⤣","↖":"↖","↖":"↖","⤧":"⤧","Ⓢ":"Ⓢ","ó":"ó","ó":"ó","⊛":"⊛","⊚":"⊚","ô":"ô","ô":"ô","о":"о","⊝":"⊝","ő":"ő","⨸":"⨸","⊙":"⊙","⦼":"⦼","œ":"œ","⦿":"⦿","𝔬":"𝔬","˛":"˛","ò":"ò","ò":"ò","⧁":"⧁","⦵":"⦵","Ω":"Ω","∮":"∮","↺":"↺","⦾":"⦾","⦻":"⦻","‾":"‾","⧀":"⧀","ō":"ō","ω":"ω","ο":"ο","⦶":"⦶","⊖":"⊖","𝕠":"𝕠","⦷":"⦷","⦹":"⦹","⊕":"⊕","∨":"∨","↻":"↻","⩝":"⩝","ℴ":"ℴ","ℴ":"ℴ","ª":"ª","ª":"ª","º":"º","º":"º","⊶":"⊶","⩖":"⩖","⩗":"⩗","⩛":"⩛","ℴ":"ℴ","ø":"ø","ø":"ø","⊘":"⊘","õ":"õ","õ":"õ","⊗":"⊗","⨶":"⨶","ö":"ö","ö":"ö","⌽":"⌽","∥":"∥","¶":"¶","¶":"¶","∥":"∥","⫳":"⫳","⫽":"⫽","∂":"∂","п":"п","%":"%",".":".","‰":"‰","⊥":"⊥","‱":"‱","𝔭":"𝔭","φ":"φ","ϕ":"ϕ","ℳ":"ℳ","☎":"☎","π":"π","⋔":"⋔","ϖ":"ϖ","ℏ":"ℏ","ℎ":"ℎ","ℏ":"ℏ","+":"+","⨣":"⨣","⊞":"⊞","⨢":"⨢","∔":"∔","⨥":"⨥","⩲":"⩲","±":"±","±":"±","⨦":"⨦","⨧":"⨧","±":"±","⨕":"⨕","𝕡":"𝕡","£":"£","£":"£","≺":"≺","⪳":"⪳","⪷":"⪷","≼":"≼","⪯":"⪯","≺":"≺","⪷":"⪷","≼":"≼","⪯":"⪯","⪹":"⪹","⪵":"⪵","⋨":"⋨","≾":"≾","′":"′","ℙ":"ℙ","⪵":"⪵","⪹":"⪹","⋨":"⋨","∏":"∏","⌮":"⌮","⌒":"⌒","⌓":"⌓","∝":"∝","∝":"∝","≾":"≾","⊰":"⊰","𝓅":"𝓅","ψ":"ψ"," ":" ","𝔮":"𝔮","⨌":"⨌","𝕢":"𝕢","⁗":"⁗","𝓆":"𝓆","ℍ":"ℍ","⨖":"⨖","?":"?","≟":"≟",""":'"',""":'"',"⇛":"⇛","⇒":"⇒","⤜":"⤜","⤏":"⤏","⥤":"⥤","∽̱":"∽̱","ŕ":"ŕ","√":"√","⦳":"⦳","⟩":"⟩","⦒":"⦒","⦥":"⦥","⟩":"⟩","»":"»","»":"»","→":"→","⥵":"⥵","⇥":"⇥","⤠":"⤠","⤳":"⤳","⤞":"⤞","↪":"↪","↬":"↬","⥅":"⥅","⥴":"⥴","↣":"↣","↝":"↝","⤚":"⤚","∶":"∶","ℚ":"ℚ","⤍":"⤍","❳":"❳","}":"}","]":"]","⦌":"⦌","⦎":"⦎","⦐":"⦐","ř":"ř","ŗ":"ŗ","⌉":"⌉","}":"}","р":"р","⤷":"⤷","⥩":"⥩","”":"”","”":"”","↳":"↳","ℜ":"ℜ","ℛ":"ℛ","ℜ":"ℜ","ℝ":"ℝ","▭":"▭","®":"®","®":"®","⥽":"⥽","⌋":"⌋","𝔯":"𝔯","⇁":"⇁","⇀":"⇀","⥬":"⥬","ρ":"ρ","ϱ":"ϱ","→":"→","↣":"↣","⇁":"⇁","⇀":"⇀","⇄":"⇄","⇌":"⇌","⇉":"⇉","↝":"↝","⋌":"⋌","˚":"˚","≓":"≓","⇄":"⇄","⇌":"⇌","‏":"‏","⎱":"⎱","⎱":"⎱","⫮":"⫮","⟭":"⟭","⇾":"⇾","⟧":"⟧","⦆":"⦆","𝕣":"𝕣","⨮":"⨮","⨵":"⨵",")":")","⦔":"⦔","⨒":"⨒","⇉":"⇉","›":"›","𝓇":"𝓇","↱":"↱","]":"]","’":"’","’":"’","⋌":"⋌","⋊":"⋊","▹":"▹","⊵":"⊵","▸":"▸","⧎":"⧎","⥨":"⥨","℞":"℞","ś":"ś","‚":"‚","≻":"≻","⪴":"⪴","⪸":"⪸","š":"š","≽":"≽","⪰":"⪰","ş":"ş","ŝ":"ŝ","⪶":"⪶","⪺":"⪺","⋩":"⋩","⨓":"⨓","≿":"≿","с":"с","⋅":"⋅","⊡":"⊡","⩦":"⩦","⇘":"⇘","⤥":"⤥","↘":"↘","↘":"↘","§":"§","§":"§",";":";","⤩":"⤩","∖":"∖","∖":"∖","✶":"✶","𝔰":"𝔰","⌢":"⌢","♯":"♯","щ":"щ","ш":"ш","∣":"∣","∥":"∥","­":"­","­":"­","σ":"σ","ς":"ς","ς":"ς","∼":"∼","⩪":"⩪","≃":"≃","≃":"≃","⪞":"⪞","⪠":"⪠","⪝":"⪝","⪟":"⪟","≆":"≆","⨤":"⨤","⥲":"⥲","←":"←","∖":"∖","⨳":"⨳","⧤":"⧤","∣":"∣","⌣":"⌣","⪪":"⪪","⪬":"⪬","⪬︀":"⪬︀","ь":"ь","/":"/","⧄":"⧄","⌿":"⌿","𝕤":"𝕤","♠":"♠","♠":"♠","∥":"∥","⊓":"⊓","⊓︀":"⊓︀","⊔":"⊔","⊔︀":"⊔︀","⊏":"⊏","⊑":"⊑","⊏":"⊏","⊑":"⊑","⊐":"⊐","⊒":"⊒","⊐":"⊐","⊒":"⊒","□":"□","□":"□","▪":"▪","▪":"▪","→":"→","𝓈":"𝓈","∖":"∖","⌣":"⌣","⋆":"⋆","☆":"☆","★":"★","ϵ":"ϵ","ϕ":"ϕ","¯":"¯","⊂":"⊂","⫅":"⫅","⪽":"⪽","⊆":"⊆","⫃":"⫃","⫁":"⫁","⫋":"⫋","⊊":"⊊","⪿":"⪿","⥹":"⥹","⊂":"⊂","⊆":"⊆","⫅":"⫅","⊊":"⊊","⫋":"⫋","⫇":"⫇","⫕":"⫕","⫓":"⫓","≻":"≻","⪸":"⪸","≽":"≽","⪰":"⪰","⪺":"⪺","⪶":"⪶","⋩":"⋩","≿":"≿","∑":"∑","♪":"♪","¹":"¹","¹":"¹","²":"²","²":"²","³":"³","³":"³","⊃":"⊃","⫆":"⫆","⪾":"⪾","⫘":"⫘","⊇":"⊇","⫄":"⫄","⟉":"⟉","⫗":"⫗","⥻":"⥻","⫂":"⫂","⫌":"⫌","⊋":"⊋","⫀":"⫀","⊃":"⊃","⊇":"⊇","⫆":"⫆","⊋":"⊋","⫌":"⫌","⫈":"⫈","⫔":"⫔","⫖":"⫖","⇙":"⇙","⤦":"⤦","↙":"↙","↙":"↙","⤪":"⤪","ß":"ß","ß":"ß","⌖":"⌖","τ":"τ","⎴":"⎴","ť":"ť","ţ":"ţ","т":"т","⃛":"⃛","⌕":"⌕","𝔱":"𝔱","∴":"∴","∴":"∴","θ":"θ","ϑ":"ϑ","ϑ":"ϑ","≈":"≈","∼":"∼"," ":" ","≈":"≈","∼":"∼","þ":"þ","þ":"þ","˜":"˜","×":"×","×":"×","⊠":"⊠","⨱":"⨱","⨰":"⨰","∭":"∭","⤨":"⤨","⊤":"⊤","⌶":"⌶","⫱":"⫱","𝕥":"𝕥","⫚":"⫚","⤩":"⤩","‴":"‴","™":"™","▵":"▵","▿":"▿","◃":"◃","⊴":"⊴","≜":"≜","▹":"▹","⊵":"⊵","◬":"◬","≜":"≜","⨺":"⨺","⨹":"⨹","⧍":"⧍","⨻":"⨻","⏢":"⏢","𝓉":"𝓉","ц":"ц","ћ":"ћ","ŧ":"ŧ","≬":"≬","↞":"↞","↠":"↠","⇑":"⇑","⥣":"⥣","ú":"ú","ú":"ú","↑":"↑","ў":"ў","ŭ":"ŭ","û":"û","û":"û","у":"у","⇅":"⇅","ű":"ű","⥮":"⥮","⥾":"⥾","𝔲":"𝔲","ù":"ù","ù":"ù","↿":"↿","↾":"↾","▀":"▀","⌜":"⌜","⌜":"⌜","⌏":"⌏","◸":"◸","ū":"ū","¨":"¨","¨":"¨","ų":"ų","𝕦":"𝕦","↑":"↑","↕":"↕","↿":"↿","↾":"↾","⊎":"⊎","υ":"υ","ϒ":"ϒ","υ":"υ","⇈":"⇈","⌝":"⌝","⌝":"⌝","⌎":"⌎","ů":"ů","◹":"◹","𝓊":"𝓊","⋰":"⋰","ũ":"ũ","▵":"▵","▴":"▴","⇈":"⇈","ü":"ü","ü":"ü","⦧":"⦧","⇕":"⇕","⫨":"⫨","⫩":"⫩","⊨":"⊨","⦜":"⦜","ϵ":"ϵ","ϰ":"ϰ","∅":"∅","ϕ":"ϕ","ϖ":"ϖ","∝":"∝","↕":"↕","ϱ":"ϱ","ς":"ς","⊊︀":"⊊︀","⫋︀":"⫋︀","⊋︀":"⊋︀","⫌︀":"⫌︀","ϑ":"ϑ","⊲":"⊲","⊳":"⊳","в":"в","⊢":"⊢","∨":"∨","⊻":"⊻","≚":"≚","⋮":"⋮","|":"|","|":"|","𝔳":"𝔳","⊲":"⊲","⊂⃒":"⊂⃒","⊃⃒":"⊃⃒","𝕧":"𝕧","∝":"∝","⊳":"⊳","𝓋":"𝓋","⫋︀":"⫋︀","⊊︀":"⊊︀","⫌︀":"⫌︀","⊋︀":"⊋︀","⦚":"⦚","ŵ":"ŵ","⩟":"⩟","∧":"∧","≙":"≙","℘":"℘","𝔴":"𝔴","𝕨":"𝕨","℘":"℘","≀":"≀","≀":"≀","𝓌":"𝓌","⋂":"⋂","◯":"◯","⋃":"⋃","▽":"▽","𝔵":"𝔵","⟺":"⟺","⟷":"⟷","ξ":"ξ","⟸":"⟸","⟵":"⟵","⟼":"⟼","⋻":"⋻","⨀":"⨀","𝕩":"𝕩","⨁":"⨁","⨂":"⨂","⟹":"⟹","⟶":"⟶","𝓍":"𝓍","⨆":"⨆","⨄":"⨄","△":"△","⋁":"⋁","⋀":"⋀","ý":"ý","ý":"ý","я":"я","ŷ":"ŷ","ы":"ы","¥":"¥","¥":"¥","𝔶":"𝔶","ї":"ї","𝕪":"𝕪","𝓎":"𝓎","ю":"ю","ÿ":"ÿ","ÿ":"ÿ","ź":"ź","ž":"ž","з":"з","ż":"ż","ℨ":"ℨ","ζ":"ζ","𝔷":"𝔷","ж":"ж","⇝":"⇝","𝕫":"𝕫","𝓏":"𝓏","‍":"‍","‌":"‌"},characters:{"Æ":"Æ","&":"&","Á":"Á","Ă":"Ă","Â":"Â","А":"А","𝔄":"𝔄","À":"À","Α":"Α","Ā":"Ā","⩓":"⩓","Ą":"Ą","𝔸":"𝔸","⁡":"⁡","Å":"Å","𝒜":"𝒜","≔":"≔","Ã":"Ã","Ä":"Ä","∖":"∖","⫧":"⫧","⌆":"⌆","Б":"Б","∵":"∵","ℬ":"ℬ","Β":"Β","𝔅":"𝔅","𝔹":"𝔹","˘":"˘","≎":"≎","Ч":"Ч","©":"©","Ć":"Ć","⋒":"⋒","ⅅ":"ⅅ","ℭ":"ℭ","Č":"Č","Ç":"Ç","Ĉ":"Ĉ","∰":"∰","Ċ":"Ċ","¸":"¸","·":"·","Χ":"Χ","⊙":"⊙","⊖":"⊖","⊕":"⊕","⊗":"⊗","∲":"∲","”":"”","’":"’","∷":"∷","⩴":"⩴","≡":"≡","∯":"∯","∮":"∮","ℂ":"ℂ","∐":"∐","∳":"∳","⨯":"⨯","𝒞":"𝒞","⋓":"⋓","≍":"≍","⤑":"⤑","Ђ":"Ђ","Ѕ":"Ѕ","Џ":"Џ","‡":"‡","↡":"↡","⫤":"⫤","Ď":"Ď","Д":"Д","∇":"∇","Δ":"Δ","𝔇":"𝔇","´":"´","˙":"˙","˝":"˝","`":"`","˜":"˜","⋄":"⋄","ⅆ":"ⅆ","𝔻":"𝔻","¨":"¨","⃜":"⃜","≐":"≐","⇓":"⇓","⇐":"⇐","⇔":"⇔","⟸":"⟸","⟺":"⟺","⟹":"⟹","⇒":"⇒","⊨":"⊨","⇑":"⇑","⇕":"⇕","∥":"∥","↓":"↓","⤓":"⤓","⇵":"⇵","̑":"̑","⥐":"⥐","⥞":"⥞","↽":"↽","⥖":"⥖","⥟":"⥟","⇁":"⇁","⥗":"⥗","⊤":"⊤","↧":"↧","𝒟":"𝒟","Đ":"Đ","Ŋ":"Ŋ","Ð":"Ð","É":"É","Ě":"Ě","Ê":"Ê","Э":"Э","Ė":"Ė","𝔈":"𝔈","È":"È","∈":"∈","Ē":"Ē","◻":"◻","▫":"▫","Ę":"Ę","𝔼":"𝔼","Ε":"Ε","⩵":"⩵","≂":"≂","⇌":"⇌","ℰ":"ℰ","⩳":"⩳","Η":"Η","Ë":"Ë","∃":"∃","ⅇ":"ⅇ","Ф":"Ф","𝔉":"𝔉","◼":"◼","▪":"▪","𝔽":"𝔽","∀":"∀","ℱ":"ℱ","Ѓ":"Ѓ",">":">","Γ":"Γ","Ϝ":"Ϝ","Ğ":"Ğ","Ģ":"Ģ","Ĝ":"Ĝ","Г":"Г","Ġ":"Ġ","𝔊":"𝔊","⋙":"⋙","𝔾":"𝔾","≥":"≥","⋛":"⋛","≧":"≧","⪢":"⪢","≷":"≷","⩾":"⩾","≳":"≳","𝒢":"𝒢","≫":"≫","Ъ":"Ъ","ˇ":"ˇ","^":"^","Ĥ":"Ĥ","ℌ":"ℌ","ℋ":"ℋ","ℍ":"ℍ","─":"─","Ħ":"Ħ","≏":"≏","Е":"Е","IJ":"IJ","Ё":"Ё","Í":"Í","Î":"Î","И":"И","İ":"İ","ℑ":"ℑ","Ì":"Ì","Ī":"Ī","ⅈ":"ⅈ","∬":"∬","∫":"∫","⋂":"⋂","⁣":"⁣","⁢":"⁢","Į":"Į","𝕀":"𝕀","Ι":"Ι","ℐ":"ℐ","Ĩ":"Ĩ","І":"І","Ï":"Ï","Ĵ":"Ĵ","Й":"Й","𝔍":"𝔍","𝕁":"𝕁","𝒥":"𝒥","Ј":"Ј","Є":"Є","Х":"Х","Ќ":"Ќ","Κ":"Κ","Ķ":"Ķ","К":"К","𝔎":"𝔎","𝕂":"𝕂","𝒦":"𝒦","Љ":"Љ","<":"<","Ĺ":"Ĺ","Λ":"Λ","⟪":"⟪","ℒ":"ℒ","↞":"↞","Ľ":"Ľ","Ļ":"Ļ","Л":"Л","⟨":"⟨","←":"←","⇤":"⇤","⇆":"⇆","⌈":"⌈","⟦":"⟦","⥡":"⥡","⇃":"⇃","⥙":"⥙","⌊":"⌊","↔":"↔","⥎":"⥎","⊣":"⊣","↤":"↤","⥚":"⥚","⊲":"⊲","⧏":"⧏","⊴":"⊴","⥑":"⥑","⥠":"⥠","↿":"↿","⥘":"⥘","↼":"↼","⥒":"⥒","⋚":"⋚","≦":"≦","≶":"≶","⪡":"⪡","⩽":"⩽","≲":"≲","𝔏":"𝔏","⋘":"⋘","⇚":"⇚","Ŀ":"Ŀ","⟵":"⟵","⟷":"⟷","⟶":"⟶","𝕃":"𝕃","↙":"↙","↘":"↘","↰":"↰","Ł":"Ł","≪":"≪","⤅":"⤅","М":"М"," ":" ","ℳ":"ℳ","𝔐":"𝔐","∓":"∓","𝕄":"𝕄","Μ":"Μ","Њ":"Њ","Ń":"Ń","Ň":"Ň","Ņ":"Ņ","Н":"Н","​":"​","\n":" ","𝔑":"𝔑","⁠":"⁠"," ":" ","ℕ":"ℕ","⫬":"⫬","≢":"≢","≭":"≭","∦":"∦","∉":"∉","≠":"≠","≂̸":"≂̸","∄":"∄","≯":"≯","≱":"≱","≧̸":"≧̸","≫̸":"≫̸","≹":"≹","⩾̸":"⩾̸","≵":"≵","≎̸":"≎̸","≏̸":"≏̸","⋪":"⋪","⧏̸":"⧏̸","⋬":"⋬","≮":"≮","≰":"≰","≸":"≸","≪̸":"≪̸","⩽̸":"⩽̸","≴":"≴","⪢̸":"⪢̸","⪡̸":"⪡̸","⊀":"⊀","⪯̸":"⪯̸","⋠":"⋠","∌":"∌","⋫":"⋫","⧐̸":"⧐̸","⋭":"⋭","⊏̸":"⊏̸","⋢":"⋢","⊐̸":"⊐̸","⋣":"⋣","⊂⃒":"⊂⃒","⊈":"⊈","⊁":"⊁","⪰̸":"⪰̸","⋡":"⋡","≿̸":"≿̸","⊃⃒":"⊃⃒","⊉":"⊉","≁":"≁","≄":"≄","≇":"≇","≉":"≉","∤":"∤","𝒩":"𝒩","Ñ":"Ñ","Ν":"Ν","Œ":"Œ","Ó":"Ó","Ô":"Ô","О":"О","Ő":"Ő","𝔒":"𝔒","Ò":"Ò","Ō":"Ō","Ω":"Ω","Ο":"Ο","𝕆":"𝕆","“":"“","‘":"‘","⩔":"⩔","𝒪":"𝒪","Ø":"Ø","Õ":"Õ","⨷":"⨷","Ö":"Ö","‾":"‾","⏞":"⏞","⎴":"⎴","⏜":"⏜","∂":"∂","П":"П","𝔓":"𝔓","Φ":"Φ","Π":"Π","±":"±","ℙ":"ℙ","⪻":"⪻","≺":"≺","⪯":"⪯","≼":"≼","≾":"≾","″":"″","∏":"∏","∝":"∝","𝒫":"𝒫","Ψ":"Ψ",'"':""","𝔔":"𝔔","ℚ":"ℚ","𝒬":"𝒬","⤐":"⤐","®":"®","Ŕ":"Ŕ","⟫":"⟫","↠":"↠","⤖":"⤖","Ř":"Ř","Ŗ":"Ŗ","Р":"Р","ℜ":"ℜ","∋":"∋","⇋":"⇋","⥯":"⥯","Ρ":"Ρ","⟩":"⟩","→":"→","⇥":"⇥","⇄":"⇄","⌉":"⌉","⟧":"⟧","⥝":"⥝","⇂":"⇂","⥕":"⥕","⌋":"⌋","⊢":"⊢","↦":"↦","⥛":"⥛","⊳":"⊳","⧐":"⧐","⊵":"⊵","⥏":"⥏","⥜":"⥜","↾":"↾","⥔":"⥔","⇀":"⇀","⥓":"⥓","ℝ":"ℝ","⥰":"⥰","⇛":"⇛","ℛ":"ℛ","↱":"↱","⧴":"⧴","Щ":"Щ","Ш":"Ш","Ь":"Ь","Ś":"Ś","⪼":"⪼","Š":"Š","Ş":"Ş","Ŝ":"Ŝ","С":"С","𝔖":"𝔖","↑":"↑","Σ":"Σ","∘":"∘","𝕊":"𝕊","√":"√","□":"□","⊓":"⊓","⊏":"⊏","⊑":"⊑","⊐":"⊐","⊒":"⊒","⊔":"⊔","𝒮":"𝒮","⋆":"⋆","⋐":"⋐","⊆":"⊆","≻":"≻","⪰":"⪰","≽":"≽","≿":"≿","∑":"∑","⋑":"⋑","⊃":"⊃","⊇":"⊇","Þ":"Þ","™":"™","Ћ":"Ћ","Ц":"Ц","\t":" ","Τ":"Τ","Ť":"Ť","Ţ":"Ţ","Т":"Т","𝔗":"𝔗","∴":"∴","Θ":"Θ","  ":"  "," ":" ","∼":"∼","≃":"≃","≅":"≅","≈":"≈","𝕋":"𝕋","⃛":"⃛","𝒯":"𝒯","Ŧ":"Ŧ","Ú":"Ú","↟":"↟","⥉":"⥉","Ў":"Ў","Ŭ":"Ŭ","Û":"Û","У":"У","Ű":"Ű","𝔘":"𝔘","Ù":"Ù","Ū":"Ū",_:"_","⏟":"⏟","⎵":"⎵","⏝":"⏝","⋃":"⋃","⊎":"⊎","Ų":"Ų","𝕌":"𝕌","⤒":"⤒","⇅":"⇅","↕":"↕","⥮":"⥮","⊥":"⊥","↥":"↥","↖":"↖","↗":"↗","ϒ":"ϒ","Υ":"Υ","Ů":"Ů","𝒰":"𝒰","Ũ":"Ũ","Ü":"Ü","⊫":"⊫","⫫":"⫫","В":"В","⊩":"⊩","⫦":"⫦","⋁":"⋁","‖":"‖","∣":"∣","|":"|","❘":"❘","≀":"≀"," ":" ","𝔙":"𝔙","𝕍":"𝕍","𝒱":"𝒱","⊪":"⊪","Ŵ":"Ŵ","⋀":"⋀","𝔚":"𝔚","𝕎":"𝕎","𝒲":"𝒲","𝔛":"𝔛","Ξ":"Ξ","𝕏":"𝕏","𝒳":"𝒳","Я":"Я","Ї":"Ї","Ю":"Ю","Ý":"Ý","Ŷ":"Ŷ","Ы":"Ы","𝔜":"𝔜","𝕐":"𝕐","𝒴":"𝒴","Ÿ":"Ÿ","Ж":"Ж","Ź":"Ź","Ž":"Ž","З":"З","Ż":"Ż","Ζ":"Ζ","ℨ":"ℨ","ℤ":"ℤ","𝒵":"𝒵","á":"á","ă":"ă","∾":"∾","∾̳":"∾̳","∿":"∿","â":"â","а":"а","æ":"æ","𝔞":"𝔞","à":"à","ℵ":"ℵ","α":"α","ā":"ā","⨿":"⨿","∧":"∧","⩕":"⩕","⩜":"⩜","⩘":"⩘","⩚":"⩚","∠":"∠","⦤":"⦤","∡":"∡","⦨":"⦨","⦩":"⦩","⦪":"⦪","⦫":"⦫","⦬":"⦬","⦭":"⦭","⦮":"⦮","⦯":"⦯","∟":"∟","⊾":"⊾","⦝":"⦝","∢":"∢","⍼":"⍼","ą":"ą","𝕒":"𝕒","⩰":"⩰","⩯":"⩯","≊":"≊","≋":"≋","'":"'","å":"å","𝒶":"𝒶","*":"*","ã":"ã","ä":"ä","⨑":"⨑","⫭":"⫭","≌":"≌","϶":"϶","‵":"‵","∽":"∽","⋍":"⋍","⊽":"⊽","⌅":"⌅","⎶":"⎶","б":"б","„":"„","⦰":"⦰","β":"β","ℶ":"ℶ","≬":"≬","𝔟":"𝔟","◯":"◯","⨀":"⨀","⨁":"⨁","⨂":"⨂","⨆":"⨆","★":"★","▽":"▽","△":"△","⨄":"⨄","⤍":"⤍","⧫":"⧫","▴":"▴","▾":"▾","◂":"◂","▸":"▸","␣":"␣","▒":"▒","░":"░","▓":"▓","█":"█","=⃥":"=⃥","≡⃥":"≡⃥","⌐":"⌐","𝕓":"𝕓","⋈":"⋈","╗":"╗","╔":"╔","╖":"╖","╓":"╓","═":"═","╦":"╦","╩":"╩","╤":"╤","╧":"╧","╝":"╝","╚":"╚","╜":"╜","╙":"╙","║":"║","╬":"╬","╣":"╣","╠":"╠","╫":"╫","╢":"╢","╟":"╟","⧉":"⧉","╕":"╕","╒":"╒","┐":"┐","┌":"┌","╥":"╥","╨":"╨","┬":"┬","┴":"┴","⊟":"⊟","⊞":"⊞","⊠":"⊠","╛":"╛","╘":"╘","┘":"┘","└":"└","│":"│","╪":"╪","╡":"╡","╞":"╞","┼":"┼","┤":"┤","├":"├","¦":"¦","𝒷":"𝒷","⁏":"⁏","\\":"\","⧅":"⧅","⟈":"⟈","•":"•","⪮":"⪮","ć":"ć","∩":"∩","⩄":"⩄","⩉":"⩉","⩋":"⩋","⩇":"⩇","⩀":"⩀","∩︀":"∩︀","⁁":"⁁","⩍":"⩍","č":"č","ç":"ç","ĉ":"ĉ","⩌":"⩌","⩐":"⩐","ċ":"ċ","⦲":"⦲","¢":"¢","𝔠":"𝔠","ч":"ч","✓":"✓","χ":"χ","○":"○","⧃":"⧃","ˆ":"ˆ","≗":"≗","↺":"↺","↻":"↻","Ⓢ":"Ⓢ","⊛":"⊛","⊚":"⊚","⊝":"⊝","⨐":"⨐","⫯":"⫯","⧂":"⧂","♣":"♣",":":":",",":",","@":"@","∁":"∁","⩭":"⩭","𝕔":"𝕔","℗":"℗","↵":"↵","✗":"✗","𝒸":"𝒸","⫏":"⫏","⫑":"⫑","⫐":"⫐","⫒":"⫒","⋯":"⋯","⤸":"⤸","⤵":"⤵","⋞":"⋞","⋟":"⋟","↶":"↶","⤽":"⤽","∪":"∪","⩈":"⩈","⩆":"⩆","⩊":"⩊","⊍":"⊍","⩅":"⩅","∪︀":"∪︀","↷":"↷","⤼":"⤼","⋎":"⋎","⋏":"⋏","¤":"¤","∱":"∱","⌭":"⌭","⥥":"⥥","†":"†","ℸ":"ℸ","‐":"‐","⤏":"⤏","ď":"ď","д":"д","⇊":"⇊","⩷":"⩷","°":"°","δ":"δ","⦱":"⦱","⥿":"⥿","𝔡":"𝔡","♦":"♦","ϝ":"ϝ","⋲":"⋲","÷":"÷","⋇":"⋇","ђ":"ђ","⌞":"⌞","⌍":"⌍",$:"$","𝕕":"𝕕","≑":"≑","∸":"∸","∔":"∔","⊡":"⊡","⌟":"⌟","⌌":"⌌","𝒹":"𝒹","ѕ":"ѕ","⧶":"⧶","đ":"đ","⋱":"⋱","▿":"▿","⦦":"⦦","џ":"џ","⟿":"⟿","é":"é","⩮":"⩮","ě":"ě","≖":"≖","ê":"ê","≕":"≕","э":"э","ė":"ė","≒":"≒","𝔢":"𝔢","⪚":"⪚","è":"è","⪖":"⪖","⪘":"⪘","⪙":"⪙","⏧":"⏧","ℓ":"ℓ","⪕":"⪕","⪗":"⪗","ē":"ē","∅":"∅"," ":" "," ":" "," ":" ","ŋ":"ŋ"," ":" ","ę":"ę","𝕖":"𝕖","⋕":"⋕","⧣":"⧣","⩱":"⩱","ε":"ε","ϵ":"ϵ","=":"=","≟":"≟","⩸":"⩸","⧥":"⧥","≓":"≓","⥱":"⥱","ℯ":"ℯ","η":"η","ð":"ð","ë":"ë","€":"€","!":"!","ф":"ф","♀":"♀","ffi":"ffi","ff":"ff","ffl":"ffl","𝔣":"𝔣","fi":"fi",fj:"fj","♭":"♭","fl":"fl","▱":"▱","ƒ":"ƒ","𝕗":"𝕗","⋔":"⋔","⫙":"⫙","⨍":"⨍","½":"½","⅓":"⅓","¼":"¼","⅕":"⅕","⅙":"⅙","⅛":"⅛","⅔":"⅔","⅖":"⅖","¾":"¾","⅗":"⅗","⅜":"⅜","⅘":"⅘","⅚":"⅚","⅝":"⅝","⅞":"⅞","⁄":"⁄","⌢":"⌢","𝒻":"𝒻","⪌":"⪌","ǵ":"ǵ","γ":"γ","⪆":"⪆","ğ":"ğ","ĝ":"ĝ","г":"г","ġ":"ġ","⪩":"⪩","⪀":"⪀","⪂":"⪂","⪄":"⪄","⋛︀":"⋛︀","⪔":"⪔","𝔤":"𝔤","ℷ":"ℷ","ѓ":"ѓ","⪒":"⪒","⪥":"⪥","⪤":"⪤","≩":"≩","⪊":"⪊","⪈":"⪈","⋧":"⋧","𝕘":"𝕘","ℊ":"ℊ","⪎":"⪎","⪐":"⪐","⪧":"⪧","⩺":"⩺","⋗":"⋗","⦕":"⦕","⩼":"⩼","⥸":"⥸","≩︀":"≩︀","ъ":"ъ","⥈":"⥈","↭":"↭","ℏ":"ℏ","ĥ":"ĥ","♥":"♥","…":"…","⊹":"⊹","𝔥":"𝔥","⤥":"⤥","⤦":"⤦","⇿":"⇿","∻":"∻","↩":"↩","↪":"↪","𝕙":"𝕙","―":"―","𝒽":"𝒽","ħ":"ħ","⁃":"⁃","í":"í","î":"î","и":"и","е":"е","¡":"¡","𝔦":"𝔦","ì":"ì","⨌":"⨌","∭":"∭","⧜":"⧜","℩":"℩","ij":"ij","ī":"ī","ı":"ı","⊷":"⊷","Ƶ":"Ƶ","℅":"℅","∞":"∞","⧝":"⧝","⊺":"⊺","⨗":"⨗","⨼":"⨼","ё":"ё","į":"į","𝕚":"𝕚","ι":"ι","¿":"¿","𝒾":"𝒾","⋹":"⋹","⋵":"⋵","⋴":"⋴","⋳":"⋳","ĩ":"ĩ","і":"і","ï":"ï","ĵ":"ĵ","й":"й","𝔧":"𝔧","ȷ":"ȷ","𝕛":"𝕛","𝒿":"𝒿","ј":"ј","є":"є","κ":"κ","ϰ":"ϰ","ķ":"ķ","к":"к","𝔨":"𝔨","ĸ":"ĸ","х":"х","ќ":"ќ","𝕜":"𝕜","𝓀":"𝓀","⤛":"⤛","⤎":"⤎","⪋":"⪋","⥢":"⥢","ĺ":"ĺ","⦴":"⦴","λ":"λ","⦑":"⦑","⪅":"⪅","«":"«","⤟":"⤟","⤝":"⤝","↫":"↫","⤹":"⤹","⥳":"⥳","↢":"↢","⪫":"⪫","⤙":"⤙","⪭":"⪭","⪭︀":"⪭︀","⤌":"⤌","❲":"❲","{":"{","[":"[","⦋":"⦋","⦏":"⦏","⦍":"⦍","ľ":"ľ","ļ":"ļ","л":"л","⤶":"⤶","⥧":"⥧","⥋":"⥋","↲":"↲","≤":"≤","⇇":"⇇","⋋":"⋋","⪨":"⪨","⩿":"⩿","⪁":"⪁","⪃":"⪃","⋚︀":"⋚︀","⪓":"⪓","⋖":"⋖","⥼":"⥼","𝔩":"𝔩","⪑":"⪑","⥪":"⥪","▄":"▄","љ":"љ","⥫":"⥫","◺":"◺","ŀ":"ŀ","⎰":"⎰","≨":"≨","⪉":"⪉","⪇":"⪇","⋦":"⋦","⟬":"⟬","⇽":"⇽","⟼":"⟼","↬":"↬","⦅":"⦅","𝕝":"𝕝","⨭":"⨭","⨴":"⨴","∗":"∗","◊":"◊","(":"(","⦓":"⦓","⥭":"⥭","‎":"‎","⊿":"⊿","‹":"‹","𝓁":"𝓁","⪍":"⪍","⪏":"⪏","‚":"‚","ł":"ł","⪦":"⪦","⩹":"⩹","⋉":"⋉","⥶":"⥶","⩻":"⩻","⦖":"⦖","◃":"◃","⥊":"⥊","⥦":"⥦","≨︀":"≨︀","∺":"∺","¯":"¯","♂":"♂","✠":"✠","▮":"▮","⨩":"⨩","м":"м","—":"—","𝔪":"𝔪","℧":"℧","µ":"µ","⫰":"⫰","−":"−","⨪":"⨪","⫛":"⫛","⊧":"⊧","𝕞":"𝕞","𝓂":"𝓂","μ":"μ","⊸":"⊸","⋙̸":"⋙̸","≫⃒":"≫⃒","⇍":"⇍","⇎":"⇎","⋘̸":"⋘̸","≪⃒":"≪⃒","⇏":"⇏","⊯":"⊯","⊮":"⊮","ń":"ń","∠⃒":"∠⃒","⩰̸":"⩰̸","≋̸":"≋̸","ʼn":"ʼn","♮":"♮","⩃":"⩃","ň":"ň","ņ":"ņ","⩭̸":"⩭̸","⩂":"⩂","н":"н","–":"–","⇗":"⇗","⤤":"⤤","≐̸":"≐̸","⤨":"⤨","𝔫":"𝔫","↮":"↮","⫲":"⫲","⋼":"⋼","⋺":"⋺","њ":"њ","≦̸":"≦̸","↚":"↚","‥":"‥","𝕟":"𝕟","¬":"¬","⋹̸":"⋹̸","⋵̸":"⋵̸","⋷":"⋷","⋶":"⋶","⋾":"⋾","⋽":"⋽","⫽⃥":"⫽⃥","∂̸":"∂̸","⨔":"⨔","↛":"↛","⤳̸":"⤳̸","↝̸":"↝̸","𝓃":"𝓃","⊄":"⊄","⫅̸":"⫅̸","⊅":"⊅","⫆̸":"⫆̸","ñ":"ñ","ν":"ν","#":"#","№":"№"," ":" ","⊭":"⊭","⤄":"⤄","≍⃒":"≍⃒","⊬":"⊬","≥⃒":"≥⃒",">⃒":">⃒","⧞":"⧞","⤂":"⤂","≤⃒":"≤⃒","<⃒":"<⃒","⊴⃒":"⊴⃒","⤃":"⤃","⊵⃒":"⊵⃒","∼⃒":"∼⃒","⇖":"⇖","⤣":"⤣","⤧":"⤧","ó":"ó","ô":"ô","о":"о","ő":"ő","⨸":"⨸","⦼":"⦼","œ":"œ","⦿":"⦿","𝔬":"𝔬","˛":"˛","ò":"ò","⧁":"⧁","⦵":"⦵","⦾":"⦾","⦻":"⦻","⧀":"⧀","ō":"ō","ω":"ω","ο":"ο","⦶":"⦶","𝕠":"𝕠","⦷":"⦷","⦹":"⦹","∨":"∨","⩝":"⩝","ℴ":"ℴ","ª":"ª","º":"º","⊶":"⊶","⩖":"⩖","⩗":"⩗","⩛":"⩛","ø":"ø","⊘":"⊘","õ":"õ","⨶":"⨶","ö":"ö","⌽":"⌽","¶":"¶","⫳":"⫳","⫽":"⫽","п":"п","%":"%",".":".","‰":"‰","‱":"‱","𝔭":"𝔭","φ":"φ","ϕ":"ϕ","☎":"☎","π":"π","ϖ":"ϖ","ℎ":"ℎ","+":"+","⨣":"⨣","⨢":"⨢","⨥":"⨥","⩲":"⩲","⨦":"⨦","⨧":"⨧","⨕":"⨕","𝕡":"𝕡","£":"£","⪳":"⪳","⪷":"⪷","⪹":"⪹","⪵":"⪵","⋨":"⋨","′":"′","⌮":"⌮","⌒":"⌒","⌓":"⌓","⊰":"⊰","𝓅":"𝓅","ψ":"ψ"," ":" ","𝔮":"𝔮","𝕢":"𝕢","⁗":"⁗","𝓆":"𝓆","⨖":"⨖","?":"?","⤜":"⤜","⥤":"⥤","∽̱":"∽̱","ŕ":"ŕ","⦳":"⦳","⦒":"⦒","⦥":"⦥","»":"»","⥵":"⥵","⤠":"⤠","⤳":"⤳","⤞":"⤞","⥅":"⥅","⥴":"⥴","↣":"↣","↝":"↝","⤚":"⤚","∶":"∶","❳":"❳","}":"}","]":"]","⦌":"⦌","⦎":"⦎","⦐":"⦐","ř":"ř","ŗ":"ŗ","р":"р","⤷":"⤷","⥩":"⥩","↳":"↳","▭":"▭","⥽":"⥽","𝔯":"𝔯","⥬":"⥬","ρ":"ρ","ϱ":"ϱ","⇉":"⇉","⋌":"⋌","˚":"˚","‏":"‏","⎱":"⎱","⫮":"⫮","⟭":"⟭","⇾":"⇾","⦆":"⦆","𝕣":"𝕣","⨮":"⨮","⨵":"⨵",")":")","⦔":"⦔","⨒":"⨒","›":"›","𝓇":"𝓇","⋊":"⋊","▹":"▹","⧎":"⧎","⥨":"⥨","℞":"℞","ś":"ś","⪴":"⪴","⪸":"⪸","š":"š","ş":"ş","ŝ":"ŝ","⪶":"⪶","⪺":"⪺","⋩":"⋩","⨓":"⨓","с":"с","⋅":"⋅","⩦":"⩦","⇘":"⇘","§":"§",";":";","⤩":"⤩","✶":"✶","𝔰":"𝔰","♯":"♯","щ":"щ","ш":"ш","­":"­","σ":"σ","ς":"ς","⩪":"⩪","⪞":"⪞","⪠":"⪠","⪝":"⪝","⪟":"⪟","≆":"≆","⨤":"⨤","⥲":"⥲","⨳":"⨳","⧤":"⧤","⌣":"⌣","⪪":"⪪","⪬":"⪬","⪬︀":"⪬︀","ь":"ь","/":"/","⧄":"⧄","⌿":"⌿","𝕤":"𝕤","♠":"♠","⊓︀":"⊓︀","⊔︀":"⊔︀","𝓈":"𝓈","☆":"☆","⊂":"⊂","⫅":"⫅","⪽":"⪽","⫃":"⫃","⫁":"⫁","⫋":"⫋","⊊":"⊊","⪿":"⪿","⥹":"⥹","⫇":"⫇","⫕":"⫕","⫓":"⫓","♪":"♪","¹":"¹","²":"²","³":"³","⫆":"⫆","⪾":"⪾","⫘":"⫘","⫄":"⫄","⟉":"⟉","⫗":"⫗","⥻":"⥻","⫂":"⫂","⫌":"⫌","⊋":"⊋","⫀":"⫀","⫈":"⫈","⫔":"⫔","⫖":"⫖","⇙":"⇙","⤪":"⤪","ß":"ß","⌖":"⌖","τ":"τ","ť":"ť","ţ":"ţ","т":"т","⌕":"⌕","𝔱":"𝔱","θ":"θ","ϑ":"ϑ","þ":"þ","×":"×","⨱":"⨱","⨰":"⨰","⌶":"⌶","⫱":"⫱","𝕥":"𝕥","⫚":"⫚","‴":"‴","▵":"▵","≜":"≜","◬":"◬","⨺":"⨺","⨹":"⨹","⧍":"⧍","⨻":"⨻","⏢":"⏢","𝓉":"𝓉","ц":"ц","ћ":"ћ","ŧ":"ŧ","⥣":"⥣","ú":"ú","ў":"ў","ŭ":"ŭ","û":"û","у":"у","ű":"ű","⥾":"⥾","𝔲":"𝔲","ù":"ù","▀":"▀","⌜":"⌜","⌏":"⌏","◸":"◸","ū":"ū","ų":"ų","𝕦":"𝕦","υ":"υ","⇈":"⇈","⌝":"⌝","⌎":"⌎","ů":"ů","◹":"◹","𝓊":"𝓊","⋰":"⋰","ũ":"ũ","ü":"ü","⦧":"⦧","⫨":"⫨","⫩":"⫩","⦜":"⦜","⊊︀":"⊊︀","⫋︀":"⫋︀","⊋︀":"⊋︀","⫌︀":"⫌︀","в":"в","⊻":"⊻","≚":"≚","⋮":"⋮","𝔳":"𝔳","𝕧":"𝕧","𝓋":"𝓋","⦚":"⦚","ŵ":"ŵ","⩟":"⩟","≙":"≙","℘":"℘","𝔴":"𝔴","𝕨":"𝕨","𝓌":"𝓌","𝔵":"𝔵","ξ":"ξ","⋻":"⋻","𝕩":"𝕩","𝓍":"𝓍","ý":"ý","я":"я","ŷ":"ŷ","ы":"ы","¥":"¥","𝔶":"𝔶","ї":"ї","𝕪":"𝕪","𝓎":"𝓎","ю":"ю","ÿ":"ÿ","ź":"ź","ž":"ž","з":"з","ż":"ż","ζ":"ζ","𝔷":"𝔷","ж":"ж","⇝":"⇝","𝕫":"𝕫","𝓏":"𝓏","‍":"‍","‌":"‌"}}}; - -/***/ }), - -/***/ "./node_modules/html-entities/lib/numeric-unicode-map.js": -/*!***************************************************************!*\ - !*** ./node_modules/html-entities/lib/numeric-unicode-map.js ***! - \***************************************************************/ -/***/ (function(__unused_webpack_module, exports) { - -"use strict"; -Object.defineProperty(exports, "__esModule", ({value:true}));exports.numericUnicodeMap={0:65533,128:8364,130:8218,131:402,132:8222,133:8230,134:8224,135:8225,136:710,137:8240,138:352,139:8249,140:338,142:381,145:8216,146:8217,147:8220,148:8221,149:8226,150:8211,151:8212,152:732,153:8482,154:353,155:8250,156:339,158:382,159:376}; - -/***/ }), - -/***/ "./node_modules/html-entities/lib/surrogate-pairs.js": -/*!***********************************************************!*\ - !*** ./node_modules/html-entities/lib/surrogate-pairs.js ***! - \***********************************************************/ -/***/ (function(__unused_webpack_module, exports) { - -"use strict"; -Object.defineProperty(exports, "__esModule", ({value:true}));exports.fromCodePoint=String.fromCodePoint||function(astralCodePoint){return String.fromCharCode(Math.floor((astralCodePoint-65536)/1024)+55296,(astralCodePoint-65536)%1024+56320)};exports.getCodePoint=String.prototype.codePointAt?function(input,position){return input.codePointAt(position)}:function(input,position){return(input.charCodeAt(position)-55296)*1024+input.charCodeAt(position+1)-56320+65536};exports.highSurrogateFrom=55296;exports.highSurrogateTo=56319; - -/***/ }), - -/***/ "./node_modules/webpack-dev-server/client/clients/WebSocketClient.js": -/*!***************************************************************************!*\ - !*** ./node_modules/webpack-dev-server/client/clients/WebSocketClient.js ***! - \***************************************************************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ WebSocketClient; } -/* harmony export */ }); -/* harmony import */ var _utils_log_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils/log.js */ "./node_modules/webpack-dev-server/client/utils/log.js"); -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } - -function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } - - - -var WebSocketClient = /*#__PURE__*/function () { - /** - * @param {string} url - */ - function WebSocketClient(url) { - _classCallCheck(this, WebSocketClient); - - this.client = new WebSocket(url); - - this.client.onerror = function (error) { - _utils_log_js__WEBPACK_IMPORTED_MODULE_0__.log.error(error); - }; - } - /** - * @param {(...args: any[]) => void} f - */ - - - _createClass(WebSocketClient, [{ - key: "onOpen", - value: function onOpen(f) { - this.client.onopen = f; - } - /** - * @param {(...args: any[]) => void} f - */ - - }, { - key: "onClose", - value: function onClose(f) { - this.client.onclose = f; - } // call f with the message string as the first argument - - /** - * @param {(...args: any[]) => void} f - */ - - }, { - key: "onMessage", - value: function onMessage(f) { - this.client.onmessage = function (e) { - f(e.data); - }; - } - }]); - - return WebSocketClient; -}(); - - - -/***/ }), - -/***/ "./node_modules/webpack-dev-server/client/index.js?protocol=ws%3A&hostname=localhost&port=8081&pathname=%2Fws&logging=none&reconnect=10": -/*!**********************************************************************************************************************************************!*\ - !*** ./node_modules/webpack-dev-server/client/index.js?protocol=ws%3A&hostname=localhost&port=8081&pathname=%2Fws&logging=none&reconnect=10 ***! - \**********************************************************************************************************************************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { - -"use strict"; -var __resourceQuery = "?protocol=ws%3A&hostname=localhost&port=8081&pathname=%2Fws&logging=none&reconnect=10"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var webpack_hot_log_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! webpack/hot/log.js */ "./node_modules/webpack/hot/log.js"); -/* harmony import */ var webpack_hot_log_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(webpack_hot_log_js__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _utils_stripAnsi_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils/stripAnsi.js */ "./node_modules/webpack-dev-server/client/utils/stripAnsi.js"); -/* harmony import */ var _utils_parseURL_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utils/parseURL.js */ "./node_modules/webpack-dev-server/client/utils/parseURL.js"); -/* harmony import */ var _socket_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./socket.js */ "./node_modules/webpack-dev-server/client/socket.js"); -/* harmony import */ var _overlay_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./overlay.js */ "./node_modules/webpack-dev-server/client/overlay.js"); -/* harmony import */ var _utils_log_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./utils/log.js */ "./node_modules/webpack-dev-server/client/utils/log.js"); -/* harmony import */ var _utils_sendMessage_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./utils/sendMessage.js */ "./node_modules/webpack-dev-server/client/utils/sendMessage.js"); -/* harmony import */ var _utils_reloadApp_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./utils/reloadApp.js */ "./node_modules/webpack-dev-server/client/utils/reloadApp.js"); -/* harmony import */ var _utils_createSocketURL_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./utils/createSocketURL.js */ "./node_modules/webpack-dev-server/client/utils/createSocketURL.js"); -/* global __resourceQuery, __webpack_hash__ */ -/// - - - - - - - - - -/** - * @typedef {Object} Options - * @property {boolean} hot - * @property {boolean} liveReload - * @property {boolean} progress - * @property {boolean | { warnings?: boolean, errors?: boolean, trustedTypesPolicyName?: string }} overlay - * @property {string} [logging] - * @property {number} [reconnect] - */ - -/** - * @typedef {Object} Status - * @property {boolean} isUnloading - * @property {string} currentHash - * @property {string} [previousHash] - */ - -/** - * @type {Status} - */ - -var status = { - isUnloading: false, - // TODO Workaround for webpack v4, `__webpack_hash__` is not replaced without HotModuleReplacement - // eslint-disable-next-line camelcase - currentHash: true ? __webpack_require__.h() : 0 -}; -/** @type {Options} */ - -var options = { - hot: false, - liveReload: false, - progress: false, - overlay: false -}; -var parsedResourceQuery = (0,_utils_parseURL_js__WEBPACK_IMPORTED_MODULE_2__["default"])(__resourceQuery); - -if (parsedResourceQuery.hot === "true") { - options.hot = true; - _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.info("Hot Module Replacement enabled."); -} - -if (parsedResourceQuery["live-reload"] === "true") { - options.liveReload = true; - _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.info("Live Reloading enabled."); -} - -if (parsedResourceQuery.logging) { - options.logging = parsedResourceQuery.logging; -} - -if (typeof parsedResourceQuery.reconnect !== "undefined") { - options.reconnect = Number(parsedResourceQuery.reconnect); -} -/** - * @param {string} level - */ - - -function setAllLogLevel(level) { - // This is needed because the HMR logger operate separately from dev server logger - webpack_hot_log_js__WEBPACK_IMPORTED_MODULE_0___default().setLogLevel(level === "verbose" || level === "log" ? "info" : level); - (0,_utils_log_js__WEBPACK_IMPORTED_MODULE_5__.setLogLevel)(level); -} - -if (options.logging) { - setAllLogLevel(options.logging); -} - -self.addEventListener("beforeunload", function () { - status.isUnloading = true; -}); -var onSocketMessage = { - hot: function hot() { - if (parsedResourceQuery.hot === "false") { - return; - } - - options.hot = true; - _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.info("Hot Module Replacement enabled."); - }, - liveReload: function liveReload() { - if (parsedResourceQuery["live-reload"] === "false") { - return; - } - - options.liveReload = true; - _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.info("Live Reloading enabled."); - }, - invalid: function invalid() { - _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.info("App updated. Recompiling..."); // Fixes #1042. overlay doesn't clear if errors are fixed but warnings remain. - - if (options.overlay) { - (0,_overlay_js__WEBPACK_IMPORTED_MODULE_4__.hide)(); - } - - (0,_utils_sendMessage_js__WEBPACK_IMPORTED_MODULE_6__["default"])("Invalid"); - }, - - /** - * @param {string} hash - */ - hash: function hash(_hash) { - status.previousHash = status.currentHash; - status.currentHash = _hash; - }, - logging: setAllLogLevel, - - /** - * @param {boolean} value - */ - overlay: function overlay(value) { - if (typeof document === "undefined") { - return; - } - - options.overlay = value; - }, - - /** - * @param {number} value - */ - reconnect: function reconnect(value) { - if (parsedResourceQuery.reconnect === "false") { - return; - } - - options.reconnect = value; - }, - - /** - * @param {boolean} value - */ - progress: function progress(value) { - options.progress = value; - }, - - /** - * @param {{ pluginName?: string, percent: number, msg: string }} data - */ - "progress-update": function progressUpdate(data) { - if (options.progress) { - _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.info("".concat(data.pluginName ? "[".concat(data.pluginName, "] ") : "").concat(data.percent, "% - ").concat(data.msg, ".")); - } - - (0,_utils_sendMessage_js__WEBPACK_IMPORTED_MODULE_6__["default"])("Progress", data); - }, - "still-ok": function stillOk() { - _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.info("Nothing changed."); - - if (options.overlay) { - (0,_overlay_js__WEBPACK_IMPORTED_MODULE_4__.hide)(); - } - - (0,_utils_sendMessage_js__WEBPACK_IMPORTED_MODULE_6__["default"])("StillOk"); - }, - ok: function ok() { - (0,_utils_sendMessage_js__WEBPACK_IMPORTED_MODULE_6__["default"])("Ok"); - - if (options.overlay) { - (0,_overlay_js__WEBPACK_IMPORTED_MODULE_4__.hide)(); - } - - (0,_utils_reloadApp_js__WEBPACK_IMPORTED_MODULE_7__["default"])(options, status); - }, - // TODO: remove in v5 in favor of 'static-changed' - - /** - * @param {string} file - */ - "content-changed": function contentChanged(file) { - _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.info("".concat(file ? "\"".concat(file, "\"") : "Content", " from static directory was changed. Reloading...")); - self.location.reload(); - }, - - /** - * @param {string} file - */ - "static-changed": function staticChanged(file) { - _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.info("".concat(file ? "\"".concat(file, "\"") : "Content", " from static directory was changed. Reloading...")); - self.location.reload(); - }, - - /** - * @param {Error[]} warnings - * @param {any} params - */ - warnings: function warnings(_warnings, params) { - _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.warn("Warnings while compiling."); - - var printableWarnings = _warnings.map(function (error) { - var _formatProblem = (0,_overlay_js__WEBPACK_IMPORTED_MODULE_4__.formatProblem)("warning", error), - header = _formatProblem.header, - body = _formatProblem.body; - - return "".concat(header, "\n").concat((0,_utils_stripAnsi_js__WEBPACK_IMPORTED_MODULE_1__["default"])(body)); - }); - - (0,_utils_sendMessage_js__WEBPACK_IMPORTED_MODULE_6__["default"])("Warnings", printableWarnings); - - for (var i = 0; i < printableWarnings.length; i++) { - _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.warn(printableWarnings[i]); - } - - var needShowOverlayForWarnings = typeof options.overlay === "boolean" ? options.overlay : options.overlay && options.overlay.warnings; - - if (needShowOverlayForWarnings) { - var trustedTypesPolicyName = typeof options.overlay === "object" && options.overlay.trustedTypesPolicyName; - (0,_overlay_js__WEBPACK_IMPORTED_MODULE_4__.show)("warning", _warnings, trustedTypesPolicyName || null); - } - - if (params && params.preventReloading) { - return; - } - - (0,_utils_reloadApp_js__WEBPACK_IMPORTED_MODULE_7__["default"])(options, status); - }, - - /** - * @param {Error[]} errors - */ - errors: function errors(_errors) { - _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.error("Errors while compiling. Reload prevented."); - - var printableErrors = _errors.map(function (error) { - var _formatProblem2 = (0,_overlay_js__WEBPACK_IMPORTED_MODULE_4__.formatProblem)("error", error), - header = _formatProblem2.header, - body = _formatProblem2.body; - - return "".concat(header, "\n").concat((0,_utils_stripAnsi_js__WEBPACK_IMPORTED_MODULE_1__["default"])(body)); - }); - - (0,_utils_sendMessage_js__WEBPACK_IMPORTED_MODULE_6__["default"])("Errors", printableErrors); - - for (var i = 0; i < printableErrors.length; i++) { - _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.error(printableErrors[i]); - } - - var needShowOverlayForErrors = typeof options.overlay === "boolean" ? options.overlay : options.overlay && options.overlay.errors; - - if (needShowOverlayForErrors) { - var trustedTypesPolicyName = typeof options.overlay === "object" && options.overlay.trustedTypesPolicyName; - (0,_overlay_js__WEBPACK_IMPORTED_MODULE_4__.show)("error", _errors, trustedTypesPolicyName || null); - } - }, - - /** - * @param {Error} error - */ - error: function error(_error) { - _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.error(_error); - }, - close: function close() { - _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.info("Disconnected!"); - - if (options.overlay) { - (0,_overlay_js__WEBPACK_IMPORTED_MODULE_4__.hide)(); - } - - (0,_utils_sendMessage_js__WEBPACK_IMPORTED_MODULE_6__["default"])("Close"); - } -}; -var socketURL = (0,_utils_createSocketURL_js__WEBPACK_IMPORTED_MODULE_8__["default"])(parsedResourceQuery); -(0,_socket_js__WEBPACK_IMPORTED_MODULE_3__["default"])(socketURL, onSocketMessage, options.reconnect); - -/***/ }), - -/***/ "./node_modules/webpack-dev-server/client/modules/logger/index.js": -/*!************************************************************************!*\ - !*** ./node_modules/webpack-dev-server/client/modules/logger/index.js ***! - \************************************************************************/ -/***/ (function(__unused_webpack_module, exports) { - -/******/ (function() { // webpackBootstrap -/******/ "use strict"; -/******/ var __webpack_modules__ = ({ - -/***/ "./client-src/modules/logger/SyncBailHookFake.js": -/*!*******************************************************!*\ - !*** ./client-src/modules/logger/SyncBailHookFake.js ***! - \*******************************************************/ -/***/ (function(module) { - - -/** - * Client stub for tapable SyncBailHook - */ - -module.exports = function clientTapableSyncBailHook() { - return { - call: function call() {} - }; -}; - -/***/ }), - -/***/ "./node_modules/webpack/lib/logging/Logger.js": -/*!****************************************************!*\ - !*** ./node_modules/webpack/lib/logging/Logger.js ***! - \****************************************************/ -/***/ (function(__unused_webpack_module, exports) { - -/* - MIT License http://www.opensource.org/licenses/mit-license.php - Author Tobias Koppers @sokra -*/ - - -function _toConsumableArray(arr) { - return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); -} - -function _nonIterableSpread() { - throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); -} - -function _unsupportedIterableToArray(o, minLen) { - if (!o) return; - if (typeof o === "string") return _arrayLikeToArray(o, minLen); - var n = Object.prototype.toString.call(o).slice(8, -1); - if (n === "Object" && o.constructor) n = o.constructor.name; - if (n === "Map" || n === "Set") return Array.from(o); - if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); -} - -function _iterableToArray(iter) { - if (typeof (typeof Symbol !== "undefined" ? Symbol : function (i) { return i; }) !== "undefined" && iter[(typeof Symbol !== "undefined" ? Symbol : function (i) { return i; }).iterator] != null || iter["@@iterator"] != null) return Array.from(iter); -} - -function _arrayWithoutHoles(arr) { - if (Array.isArray(arr)) return _arrayLikeToArray(arr); -} - -function _arrayLikeToArray(arr, len) { - if (len == null || len > arr.length) len = arr.length; - - for (var i = 0, arr2 = new Array(len); i < len; i++) { - arr2[i] = arr[i]; - } - - return arr2; -} - -function _classCallCheck(instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a function"); - } -} - -function _defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i]; - descriptor.enumerable = descriptor.enumerable || false; - descriptor.configurable = true; - if ("value" in descriptor) descriptor.writable = true; - Object.defineProperty(target, descriptor.key, descriptor); - } -} - -function _createClass(Constructor, protoProps, staticProps) { - if (protoProps) _defineProperties(Constructor.prototype, protoProps); - if (staticProps) _defineProperties(Constructor, staticProps); - Object.defineProperty(Constructor, "prototype", { - writable: false - }); - return Constructor; -} - -var LogType = Object.freeze({ - error: - /** @type {"error"} */ - "error", - // message, c style arguments - warn: - /** @type {"warn"} */ - "warn", - // message, c style arguments - info: - /** @type {"info"} */ - "info", - // message, c style arguments - log: - /** @type {"log"} */ - "log", - // message, c style arguments - debug: - /** @type {"debug"} */ - "debug", - // message, c style arguments - trace: - /** @type {"trace"} */ - "trace", - // no arguments - group: - /** @type {"group"} */ - "group", - // [label] - groupCollapsed: - /** @type {"groupCollapsed"} */ - "groupCollapsed", - // [label] - groupEnd: - /** @type {"groupEnd"} */ - "groupEnd", - // [label] - profile: - /** @type {"profile"} */ - "profile", - // [profileName] - profileEnd: - /** @type {"profileEnd"} */ - "profileEnd", - // [profileName] - time: - /** @type {"time"} */ - "time", - // name, time as [seconds, nanoseconds] - clear: - /** @type {"clear"} */ - "clear", - // no arguments - status: - /** @type {"status"} */ - "status" // message, arguments - -}); -exports.LogType = LogType; -/** @typedef {typeof LogType[keyof typeof LogType]} LogTypeEnum */ - -var LOG_SYMBOL = (typeof Symbol !== "undefined" ? Symbol : function (i) { return i; })("webpack logger raw log method"); -var TIMERS_SYMBOL = (typeof Symbol !== "undefined" ? Symbol : function (i) { return i; })("webpack logger times"); -var TIMERS_AGGREGATES_SYMBOL = (typeof Symbol !== "undefined" ? Symbol : function (i) { return i; })("webpack logger aggregated times"); - -var WebpackLogger = /*#__PURE__*/function () { - /** - * @param {function(LogTypeEnum, any[]=): void} log log function - * @param {function(string | function(): string): WebpackLogger} getChildLogger function to create child logger - */ - function WebpackLogger(log, getChildLogger) { - _classCallCheck(this, WebpackLogger); - - this[LOG_SYMBOL] = log; - this.getChildLogger = getChildLogger; - } - - _createClass(WebpackLogger, [{ - key: "error", - value: function error() { - for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { - args[_key] = arguments[_key]; - } - - this[LOG_SYMBOL](LogType.error, args); - } - }, { - key: "warn", - value: function warn() { - for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { - args[_key2] = arguments[_key2]; - } - - this[LOG_SYMBOL](LogType.warn, args); - } - }, { - key: "info", - value: function info() { - for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) { - args[_key3] = arguments[_key3]; - } - - this[LOG_SYMBOL](LogType.info, args); - } - }, { - key: "log", - value: function log() { - for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) { - args[_key4] = arguments[_key4]; - } - - this[LOG_SYMBOL](LogType.log, args); - } - }, { - key: "debug", - value: function debug() { - for (var _len5 = arguments.length, args = new Array(_len5), _key5 = 0; _key5 < _len5; _key5++) { - args[_key5] = arguments[_key5]; - } - - this[LOG_SYMBOL](LogType.debug, args); - } - }, { - key: "assert", - value: function assert(assertion) { - if (!assertion) { - for (var _len6 = arguments.length, args = new Array(_len6 > 1 ? _len6 - 1 : 0), _key6 = 1; _key6 < _len6; _key6++) { - args[_key6 - 1] = arguments[_key6]; - } - - this[LOG_SYMBOL](LogType.error, args); - } - } - }, { - key: "trace", - value: function trace() { - this[LOG_SYMBOL](LogType.trace, ["Trace"]); - } - }, { - key: "clear", - value: function clear() { - this[LOG_SYMBOL](LogType.clear); - } - }, { - key: "status", - value: function status() { - for (var _len7 = arguments.length, args = new Array(_len7), _key7 = 0; _key7 < _len7; _key7++) { - args[_key7] = arguments[_key7]; - } - - this[LOG_SYMBOL](LogType.status, args); - } - }, { - key: "group", - value: function group() { - for (var _len8 = arguments.length, args = new Array(_len8), _key8 = 0; _key8 < _len8; _key8++) { - args[_key8] = arguments[_key8]; - } - - this[LOG_SYMBOL](LogType.group, args); - } - }, { - key: "groupCollapsed", - value: function groupCollapsed() { - for (var _len9 = arguments.length, args = new Array(_len9), _key9 = 0; _key9 < _len9; _key9++) { - args[_key9] = arguments[_key9]; - } - - this[LOG_SYMBOL](LogType.groupCollapsed, args); - } - }, { - key: "groupEnd", - value: function groupEnd() { - for (var _len10 = arguments.length, args = new Array(_len10), _key10 = 0; _key10 < _len10; _key10++) { - args[_key10] = arguments[_key10]; - } - - this[LOG_SYMBOL](LogType.groupEnd, args); - } - }, { - key: "profile", - value: function profile(label) { - this[LOG_SYMBOL](LogType.profile, [label]); - } - }, { - key: "profileEnd", - value: function profileEnd(label) { - this[LOG_SYMBOL](LogType.profileEnd, [label]); - } - }, { - key: "time", - value: function time(label) { - this[TIMERS_SYMBOL] = this[TIMERS_SYMBOL] || new Map(); - this[TIMERS_SYMBOL].set(label, process.hrtime()); - } - }, { - key: "timeLog", - value: function timeLog(label) { - var prev = this[TIMERS_SYMBOL] && this[TIMERS_SYMBOL].get(label); - - if (!prev) { - throw new Error("No such label '".concat(label, "' for WebpackLogger.timeLog()")); - } - - var time = process.hrtime(prev); - this[LOG_SYMBOL](LogType.time, [label].concat(_toConsumableArray(time))); - } - }, { - key: "timeEnd", - value: function timeEnd(label) { - var prev = this[TIMERS_SYMBOL] && this[TIMERS_SYMBOL].get(label); - - if (!prev) { - throw new Error("No such label '".concat(label, "' for WebpackLogger.timeEnd()")); - } - - var time = process.hrtime(prev); - this[TIMERS_SYMBOL].delete(label); - this[LOG_SYMBOL](LogType.time, [label].concat(_toConsumableArray(time))); - } - }, { - key: "timeAggregate", - value: function timeAggregate(label) { - var prev = this[TIMERS_SYMBOL] && this[TIMERS_SYMBOL].get(label); - - if (!prev) { - throw new Error("No such label '".concat(label, "' for WebpackLogger.timeAggregate()")); - } - - var time = process.hrtime(prev); - this[TIMERS_SYMBOL].delete(label); - this[TIMERS_AGGREGATES_SYMBOL] = this[TIMERS_AGGREGATES_SYMBOL] || new Map(); - var current = this[TIMERS_AGGREGATES_SYMBOL].get(label); - - if (current !== undefined) { - if (time[1] + current[1] > 1e9) { - time[0] += current[0] + 1; - time[1] = time[1] - 1e9 + current[1]; - } else { - time[0] += current[0]; - time[1] += current[1]; - } - } - - this[TIMERS_AGGREGATES_SYMBOL].set(label, time); - } - }, { - key: "timeAggregateEnd", - value: function timeAggregateEnd(label) { - if (this[TIMERS_AGGREGATES_SYMBOL] === undefined) return; - var time = this[TIMERS_AGGREGATES_SYMBOL].get(label); - if (time === undefined) return; - this[TIMERS_AGGREGATES_SYMBOL].delete(label); - this[LOG_SYMBOL](LogType.time, [label].concat(_toConsumableArray(time))); - } - }]); - - return WebpackLogger; -}(); - -exports.Logger = WebpackLogger; - -/***/ }), - -/***/ "./node_modules/webpack/lib/logging/createConsoleLogger.js": -/*!*****************************************************************!*\ - !*** ./node_modules/webpack/lib/logging/createConsoleLogger.js ***! - \*****************************************************************/ -/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_10785__) { - -/* - MIT License http://www.opensource.org/licenses/mit-license.php - Author Tobias Koppers @sokra -*/ - - -function _toConsumableArray(arr) { - return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); -} - -function _nonIterableSpread() { - throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); -} - -function _unsupportedIterableToArray(o, minLen) { - if (!o) return; - if (typeof o === "string") return _arrayLikeToArray(o, minLen); - var n = Object.prototype.toString.call(o).slice(8, -1); - if (n === "Object" && o.constructor) n = o.constructor.name; - if (n === "Map" || n === "Set") return Array.from(o); - if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); -} - -function _iterableToArray(iter) { - if (typeof (typeof Symbol !== "undefined" ? Symbol : function (i) { return i; }) !== "undefined" && iter[(typeof Symbol !== "undefined" ? Symbol : function (i) { return i; }).iterator] != null || iter["@@iterator"] != null) return Array.from(iter); -} - -function _arrayWithoutHoles(arr) { - if (Array.isArray(arr)) return _arrayLikeToArray(arr); -} - -function _arrayLikeToArray(arr, len) { - if (len == null || len > arr.length) len = arr.length; - - for (var i = 0, arr2 = new Array(len); i < len; i++) { - arr2[i] = arr[i]; - } - - return arr2; -} - -var _require = __nested_webpack_require_10785__(/*! ./Logger */ "./node_modules/webpack/lib/logging/Logger.js"), - LogType = _require.LogType; -/** @typedef {import("../../declarations/WebpackOptions").FilterItemTypes} FilterItemTypes */ - -/** @typedef {import("../../declarations/WebpackOptions").FilterTypes} FilterTypes */ - -/** @typedef {import("./Logger").LogTypeEnum} LogTypeEnum */ - -/** @typedef {function(string): boolean} FilterFunction */ - -/** - * @typedef {Object} LoggerConsole - * @property {function(): void} clear - * @property {function(): void} trace - * @property {(...args: any[]) => void} info - * @property {(...args: any[]) => void} log - * @property {(...args: any[]) => void} warn - * @property {(...args: any[]) => void} error - * @property {(...args: any[]) => void=} debug - * @property {(...args: any[]) => void=} group - * @property {(...args: any[]) => void=} groupCollapsed - * @property {(...args: any[]) => void=} groupEnd - * @property {(...args: any[]) => void=} status - * @property {(...args: any[]) => void=} profile - * @property {(...args: any[]) => void=} profileEnd - * @property {(...args: any[]) => void=} logTime - */ - -/** - * @typedef {Object} LoggerOptions - * @property {false|true|"none"|"error"|"warn"|"info"|"log"|"verbose"} level loglevel - * @property {FilterTypes|boolean} debug filter for debug logging - * @property {LoggerConsole} console the console to log to - */ - -/** - * @param {FilterItemTypes} item an input item - * @returns {FilterFunction} filter function - */ - - -var filterToFunction = function filterToFunction(item) { - if (typeof item === "string") { - var regExp = new RegExp("[\\\\/]".concat(item.replace( // eslint-disable-next-line no-useless-escape - /[-[\]{}()*+?.\\^$|]/g, "\\$&"), "([\\\\/]|$|!|\\?)")); - return function (ident) { - return regExp.test(ident); - }; - } - - if (item && typeof item === "object" && typeof item.test === "function") { - return function (ident) { - return item.test(ident); - }; - } - - if (typeof item === "function") { - return item; - } - - if (typeof item === "boolean") { - return function () { - return item; - }; - } -}; -/** - * @enum {number} - */ - - -var LogLevel = { - none: 6, - false: 6, - error: 5, - warn: 4, - info: 3, - log: 2, - true: 2, - verbose: 1 -}; -/** - * @param {LoggerOptions} options options object - * @returns {function(string, LogTypeEnum, any[]): void} logging function - */ - -module.exports = function (_ref) { - var _ref$level = _ref.level, - level = _ref$level === void 0 ? "info" : _ref$level, - _ref$debug = _ref.debug, - debug = _ref$debug === void 0 ? false : _ref$debug, - console = _ref.console; - var debugFilters = typeof debug === "boolean" ? [function () { - return debug; - }] : - /** @type {FilterItemTypes[]} */ - [].concat(debug).map(filterToFunction); - /** @type {number} */ - - var loglevel = LogLevel["".concat(level)] || 0; - /** - * @param {string} name name of the logger - * @param {LogTypeEnum} type type of the log entry - * @param {any[]} args arguments of the log entry - * @returns {void} - */ - - var logger = function logger(name, type, args) { - var labeledArgs = function labeledArgs() { - if (Array.isArray(args)) { - if (args.length > 0 && typeof args[0] === "string") { - return ["[".concat(name, "] ").concat(args[0])].concat(_toConsumableArray(args.slice(1))); - } else { - return ["[".concat(name, "]")].concat(_toConsumableArray(args)); - } - } else { - return []; - } - }; - - var debug = debugFilters.some(function (f) { - return f(name); - }); - - switch (type) { - case LogType.debug: - if (!debug) return; // eslint-disable-next-line node/no-unsupported-features/node-builtins - - if (typeof console.debug === "function") { - // eslint-disable-next-line node/no-unsupported-features/node-builtins - console.debug.apply(console, _toConsumableArray(labeledArgs())); - } else { - console.log.apply(console, _toConsumableArray(labeledArgs())); - } - - break; - - case LogType.log: - if (!debug && loglevel > LogLevel.log) return; - console.log.apply(console, _toConsumableArray(labeledArgs())); - break; - - case LogType.info: - if (!debug && loglevel > LogLevel.info) return; - console.info.apply(console, _toConsumableArray(labeledArgs())); - break; - - case LogType.warn: - if (!debug && loglevel > LogLevel.warn) return; - console.warn.apply(console, _toConsumableArray(labeledArgs())); - break; - - case LogType.error: - if (!debug && loglevel > LogLevel.error) return; - console.error.apply(console, _toConsumableArray(labeledArgs())); - break; - - case LogType.trace: - if (!debug) return; - console.trace(); - break; - - case LogType.groupCollapsed: - if (!debug && loglevel > LogLevel.log) return; - - if (!debug && loglevel > LogLevel.verbose) { - // eslint-disable-next-line node/no-unsupported-features/node-builtins - if (typeof console.groupCollapsed === "function") { - // eslint-disable-next-line node/no-unsupported-features/node-builtins - console.groupCollapsed.apply(console, _toConsumableArray(labeledArgs())); - } else { - console.log.apply(console, _toConsumableArray(labeledArgs())); - } - - break; - } - - // falls through - - case LogType.group: - if (!debug && loglevel > LogLevel.log) return; // eslint-disable-next-line node/no-unsupported-features/node-builtins - - if (typeof console.group === "function") { - // eslint-disable-next-line node/no-unsupported-features/node-builtins - console.group.apply(console, _toConsumableArray(labeledArgs())); - } else { - console.log.apply(console, _toConsumableArray(labeledArgs())); - } - - break; - - case LogType.groupEnd: - if (!debug && loglevel > LogLevel.log) return; // eslint-disable-next-line node/no-unsupported-features/node-builtins - - if (typeof console.groupEnd === "function") { - // eslint-disable-next-line node/no-unsupported-features/node-builtins - console.groupEnd(); - } - - break; - - case LogType.time: - { - if (!debug && loglevel > LogLevel.log) return; - var ms = args[1] * 1000 + args[2] / 1000000; - var msg = "[".concat(name, "] ").concat(args[0], ": ").concat(ms, " ms"); - - if (typeof console.logTime === "function") { - console.logTime(msg); - } else { - console.log(msg); - } - - break; - } - - case LogType.profile: - // eslint-disable-next-line node/no-unsupported-features/node-builtins - if (typeof console.profile === "function") { - // eslint-disable-next-line node/no-unsupported-features/node-builtins - console.profile.apply(console, _toConsumableArray(labeledArgs())); - } - - break; - - case LogType.profileEnd: - // eslint-disable-next-line node/no-unsupported-features/node-builtins - if (typeof console.profileEnd === "function") { - // eslint-disable-next-line node/no-unsupported-features/node-builtins - console.profileEnd.apply(console, _toConsumableArray(labeledArgs())); - } - - break; - - case LogType.clear: - if (!debug && loglevel > LogLevel.log) return; // eslint-disable-next-line node/no-unsupported-features/node-builtins - - if (typeof console.clear === "function") { - // eslint-disable-next-line node/no-unsupported-features/node-builtins - console.clear(); - } - - break; - - case LogType.status: - if (!debug && loglevel > LogLevel.info) return; - - if (typeof console.status === "function") { - if (args.length === 0) { - console.status(); - } else { - console.status.apply(console, _toConsumableArray(labeledArgs())); - } - } else { - if (args.length !== 0) { - console.info.apply(console, _toConsumableArray(labeledArgs())); - } - } - - break; - - default: - throw new Error("Unexpected LogType ".concat(type)); - } - }; - - return logger; -}; - -/***/ }), - -/***/ "./node_modules/webpack/lib/logging/runtime.js": -/*!*****************************************************!*\ - !*** ./node_modules/webpack/lib/logging/runtime.js ***! - \*****************************************************/ -/***/ (function(__unused_webpack_module, exports, __nested_webpack_require_20872__) { - -/* - MIT License http://www.opensource.org/licenses/mit-license.php - Author Tobias Koppers @sokra -*/ - - -function _extends() { - _extends = Object.assign ? Object.assign.bind() : function (target) { - for (var i = 1; i < arguments.length; i++) { - var source = arguments[i]; - - for (var key in source) { - if (Object.prototype.hasOwnProperty.call(source, key)) { - target[key] = source[key]; - } - } - } - - return target; - }; - return _extends.apply(this, arguments); -} - -var SyncBailHook = __nested_webpack_require_20872__(/*! tapable/lib/SyncBailHook */ "./client-src/modules/logger/SyncBailHookFake.js"); - -var _require = __nested_webpack_require_20872__(/*! ./Logger */ "./node_modules/webpack/lib/logging/Logger.js"), - Logger = _require.Logger; - -var createConsoleLogger = __nested_webpack_require_20872__(/*! ./createConsoleLogger */ "./node_modules/webpack/lib/logging/createConsoleLogger.js"); -/** @type {createConsoleLogger.LoggerOptions} */ - - -var currentDefaultLoggerOptions = { - level: "info", - debug: false, - console: console -}; -var currentDefaultLogger = createConsoleLogger(currentDefaultLoggerOptions); -/** - * @param {string} name name of the logger - * @returns {Logger} a logger - */ - -exports.getLogger = function (name) { - return new Logger(function (type, args) { - if (exports.hooks.log.call(name, type, args) === undefined) { - currentDefaultLogger(name, type, args); - } - }, function (childName) { - return exports.getLogger("".concat(name, "/").concat(childName)); - }); -}; -/** - * @param {createConsoleLogger.LoggerOptions} options new options, merge with old options - * @returns {void} - */ - - -exports.configureDefaultLogger = function (options) { - _extends(currentDefaultLoggerOptions, options); - - currentDefaultLogger = createConsoleLogger(currentDefaultLoggerOptions); -}; - -exports.hooks = { - log: new SyncBailHook(["origin", "type", "args"]) -}; - -/***/ }) - -/******/ }); -/************************************************************************/ -/******/ // The module cache -/******/ var __webpack_module_cache__ = {}; -/******/ -/******/ // The require function -/******/ function __nested_webpack_require_23009__(moduleId) { -/******/ // Check if module is in cache -/******/ var cachedModule = __webpack_module_cache__[moduleId]; -/******/ if (cachedModule !== undefined) { -/******/ return cachedModule.exports; -/******/ } -/******/ // Create a new module (and put it into the cache) -/******/ var module = __webpack_module_cache__[moduleId] = { -/******/ // no module.id needed -/******/ // no module.loaded needed -/******/ exports: {} -/******/ }; -/******/ -/******/ // Execute the module function -/******/ __webpack_modules__[moduleId](module, module.exports, __nested_webpack_require_23009__); -/******/ -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } -/******/ -/************************************************************************/ -/******/ /* webpack/runtime/define property getters */ -/******/ !function() { -/******/ // define getter functions for harmony exports -/******/ __nested_webpack_require_23009__.d = function(exports, definition) { -/******/ for(var key in definition) { -/******/ if(__nested_webpack_require_23009__.o(definition, key) && !__nested_webpack_require_23009__.o(exports, key)) { -/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); -/******/ } -/******/ } -/******/ }; -/******/ }(); -/******/ -/******/ /* webpack/runtime/hasOwnProperty shorthand */ -/******/ !function() { -/******/ __nested_webpack_require_23009__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); } -/******/ }(); -/******/ -/******/ /* webpack/runtime/make namespace object */ -/******/ !function() { -/******/ // define __esModule on exports -/******/ __nested_webpack_require_23009__.r = function(exports) { -/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { -/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); -/******/ } -/******/ Object.defineProperty(exports, '__esModule', { value: true }); -/******/ }; -/******/ }(); -/******/ -/************************************************************************/ -var __webpack_exports__ = {}; -// This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk. -!function() { -/*!********************************************!*\ - !*** ./client-src/modules/logger/index.js ***! - \********************************************/ -__nested_webpack_require_23009__.r(__webpack_exports__); -/* harmony export */ __nested_webpack_require_23009__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* reexport default export from named module */ webpack_lib_logging_runtime_js__WEBPACK_IMPORTED_MODULE_0__; } -/* harmony export */ }); -/* harmony import */ var webpack_lib_logging_runtime_js__WEBPACK_IMPORTED_MODULE_0__ = __nested_webpack_require_23009__(/*! webpack/lib/logging/runtime.js */ "./node_modules/webpack/lib/logging/runtime.js"); - -}(); -var __webpack_export_target__ = exports; -for(var i in __webpack_exports__) __webpack_export_target__[i] = __webpack_exports__[i]; -if(__webpack_exports__.__esModule) Object.defineProperty(__webpack_export_target__, "__esModule", { value: true }); -/******/ })() -; - -/***/ }), - -/***/ "./node_modules/webpack-dev-server/client/overlay.js": -/*!***********************************************************!*\ - !*** ./node_modules/webpack-dev-server/client/overlay.js ***! - \***********************************************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "formatProblem": function() { return /* binding */ formatProblem; }, -/* harmony export */ "hide": function() { return /* binding */ hide; }, -/* harmony export */ "show": function() { return /* binding */ show; } -/* harmony export */ }); -/* harmony import */ var ansi_html_community__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ansi-html-community */ "./node_modules/ansi-html-community/index.js"); -/* harmony import */ var ansi_html_community__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(ansi_html_community__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var html_entities__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! html-entities */ "./node_modules/html-entities/lib/index.js"); -/* harmony import */ var html_entities__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(html_entities__WEBPACK_IMPORTED_MODULE_1__); -// The error overlay is inspired (and mostly copied) from Create React App (https://github.com/facebookincubator/create-react-app) -// They, in turn, got inspired by webpack-hot-middleware (https://github.com/glenjamin/webpack-hot-middleware). - - -var colors = { - reset: ["transparent", "transparent"], - black: "181818", - red: "E36049", - green: "B3CB74", - yellow: "FFD080", - blue: "7CAFC2", - magenta: "7FACCA", - cyan: "C3C2EF", - lightgrey: "EBE7E3", - darkgrey: "6D7891" -}; -/** @type {HTMLIFrameElement | null | undefined} */ - -var iframeContainerElement; -/** @type {HTMLDivElement | null | undefined} */ - -var containerElement; -/** @type {Array<(element: HTMLDivElement) => void>} */ - -var onLoadQueue = []; -/** @type {TrustedTypePolicy | undefined} */ - -var overlayTrustedTypesPolicy; -ansi_html_community__WEBPACK_IMPORTED_MODULE_0___default().setColors(colors); -/** - * @param {string | null} trustedTypesPolicyName - */ - -function createContainer(trustedTypesPolicyName) { - // Enable Trusted Types if they are available in the current browser. - if (window.trustedTypes) { - overlayTrustedTypesPolicy = window.trustedTypes.createPolicy(trustedTypesPolicyName || "webpack-dev-server#overlay", { - createHTML: function createHTML(value) { - return value; - } - }); - } - - iframeContainerElement = document.createElement("iframe"); - iframeContainerElement.id = "webpack-dev-server-client-overlay"; - iframeContainerElement.src = "about:blank"; - iframeContainerElement.style.position = "fixed"; - iframeContainerElement.style.left = 0; - iframeContainerElement.style.top = 0; - iframeContainerElement.style.right = 0; - iframeContainerElement.style.bottom = 0; - iframeContainerElement.style.width = "100vw"; - iframeContainerElement.style.height = "100vh"; - iframeContainerElement.style.border = "none"; - iframeContainerElement.style.zIndex = 9999999999; - - iframeContainerElement.onload = function () { - containerElement = - /** @type {Document} */ - - /** @type {HTMLIFrameElement} */ - iframeContainerElement.contentDocument.createElement("div"); - containerElement.id = "webpack-dev-server-client-overlay-div"; - containerElement.style.position = "fixed"; - containerElement.style.boxSizing = "border-box"; - containerElement.style.left = 0; - containerElement.style.top = 0; - containerElement.style.right = 0; - containerElement.style.bottom = 0; - containerElement.style.width = "100vw"; - containerElement.style.height = "100vh"; - containerElement.style.backgroundColor = "rgba(0, 0, 0, 0.85)"; - containerElement.style.color = "#E8E8E8"; - containerElement.style.fontFamily = "Menlo, Consolas, monospace"; - containerElement.style.fontSize = "large"; - containerElement.style.padding = "2rem"; - containerElement.style.lineHeight = "1.2"; - containerElement.style.whiteSpace = "pre-wrap"; - containerElement.style.overflow = "auto"; - var headerElement = document.createElement("span"); - headerElement.innerText = "Compiled with problems:"; - var closeButtonElement = document.createElement("button"); - closeButtonElement.innerText = "X"; - closeButtonElement.style.background = "transparent"; - closeButtonElement.style.border = "none"; - closeButtonElement.style.fontSize = "20px"; - closeButtonElement.style.fontWeight = "bold"; - closeButtonElement.style.color = "white"; - closeButtonElement.style.cursor = "pointer"; - closeButtonElement.style.cssFloat = "right"; // @ts-ignore - - closeButtonElement.style.styleFloat = "right"; - closeButtonElement.addEventListener("click", function () { - hide(); - }); - containerElement.appendChild(headerElement); - containerElement.appendChild(closeButtonElement); - containerElement.appendChild(document.createElement("br")); - containerElement.appendChild(document.createElement("br")); - /** @type {Document} */ - - /** @type {HTMLIFrameElement} */ - iframeContainerElement.contentDocument.body.appendChild(containerElement); - onLoadQueue.forEach(function (onLoad) { - onLoad( - /** @type {HTMLDivElement} */ - containerElement); - }); - onLoadQueue = []; - /** @type {HTMLIFrameElement} */ - - iframeContainerElement.onload = null; - }; - - document.body.appendChild(iframeContainerElement); -} -/** - * @param {(element: HTMLDivElement) => void} callback - * @param {string | null} trustedTypesPolicyName - */ - - -function ensureOverlayExists(callback, trustedTypesPolicyName) { - if (containerElement) { - // Everything is ready, call the callback right away. - callback(containerElement); - return; - } - - onLoadQueue.push(callback); - - if (iframeContainerElement) { - return; - } - - createContainer(trustedTypesPolicyName); -} // Successful compilation. - - -function hide() { - if (!iframeContainerElement) { - return; - } // Clean up and reset internal state. - - - document.body.removeChild(iframeContainerElement); - iframeContainerElement = null; - containerElement = null; -} -/** - * @param {string} type - * @param {string | { file?: string, moduleName?: string, loc?: string, message?: string }} item - * @returns {{ header: string, body: string }} - */ - - -function formatProblem(type, item) { - var header = type === "warning" ? "WARNING" : "ERROR"; - var body = ""; - - if (typeof item === "string") { - body += item; - } else { - var file = item.file || ""; // eslint-disable-next-line no-nested-ternary - - var moduleName = item.moduleName ? item.moduleName.indexOf("!") !== -1 ? "".concat(item.moduleName.replace(/^(\s|\S)*!/, ""), " (").concat(item.moduleName, ")") : "".concat(item.moduleName) : ""; - var loc = item.loc; - header += "".concat(moduleName || file ? " in ".concat(moduleName ? "".concat(moduleName).concat(file ? " (".concat(file, ")") : "") : file).concat(loc ? " ".concat(loc) : "") : ""); - body += item.message || ""; - } - - return { - header: header, - body: body - }; -} // Compilation with errors (e.g. syntax error or missing modules). - -/** - * @param {string} type - * @param {Array} messages - * @param {string | null} trustedTypesPolicyName - */ - - -function show(type, messages, trustedTypesPolicyName) { - ensureOverlayExists(function () { - messages.forEach(function (message) { - var entryElement = document.createElement("div"); - var typeElement = document.createElement("span"); - - var _formatProblem = formatProblem(type, message), - header = _formatProblem.header, - body = _formatProblem.body; - - typeElement.innerText = header; - typeElement.style.color = "#".concat(colors.red); // Make it look similar to our terminal. - - var text = ansi_html_community__WEBPACK_IMPORTED_MODULE_0___default()((0,html_entities__WEBPACK_IMPORTED_MODULE_1__.encode)(body)); - var messageTextNode = document.createElement("div"); - messageTextNode.innerHTML = overlayTrustedTypesPolicy ? overlayTrustedTypesPolicy.createHTML(text) : text; - entryElement.appendChild(typeElement); - entryElement.appendChild(document.createElement("br")); - entryElement.appendChild(document.createElement("br")); - entryElement.appendChild(messageTextNode); - entryElement.appendChild(document.createElement("br")); - entryElement.appendChild(document.createElement("br")); - /** @type {HTMLDivElement} */ - - containerElement.appendChild(entryElement); - }); - }, trustedTypesPolicyName); -} - - - -/***/ }), - -/***/ "./node_modules/webpack-dev-server/client/socket.js": -/*!**********************************************************!*\ - !*** ./node_modules/webpack-dev-server/client/socket.js ***! - \**********************************************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "client": function() { return /* binding */ client; } -/* harmony export */ }); -/* harmony import */ var _clients_WebSocketClient_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./clients/WebSocketClient.js */ "./node_modules/webpack-dev-server/client/clients/WebSocketClient.js"); -/* harmony import */ var _utils_log_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils/log.js */ "./node_modules/webpack-dev-server/client/utils/log.js"); -/* provided dependency */ var __webpack_dev_server_client__ = __webpack_require__(/*! ./node_modules/webpack-dev-server/client/clients/WebSocketClient.js */ "./node_modules/webpack-dev-server/client/clients/WebSocketClient.js"); -/* global __webpack_dev_server_client__ */ - - // this WebsocketClient is here as a default fallback, in case the client is not injected - -/* eslint-disable camelcase */ - -var Client = // eslint-disable-next-line no-nested-ternary -typeof __webpack_dev_server_client__ !== "undefined" ? typeof __webpack_dev_server_client__.default !== "undefined" ? __webpack_dev_server_client__.default : __webpack_dev_server_client__ : _clients_WebSocketClient_js__WEBPACK_IMPORTED_MODULE_0__["default"]; -/* eslint-enable camelcase */ - -var retries = 0; -var maxRetries = 10; // Initialized client is exported so external consumers can utilize the same instance -// It is mutable to enforce singleton -// eslint-disable-next-line import/no-mutable-exports - -var client = null; -/** - * @param {string} url - * @param {{ [handler: string]: (data?: any, params?: any) => any }} handlers - * @param {number} [reconnect] - */ - -var socket = function initSocket(url, handlers, reconnect) { - client = new Client(url); - client.onOpen(function () { - retries = 0; - - if (typeof reconnect !== "undefined") { - maxRetries = reconnect; - } - }); - client.onClose(function () { - if (retries === 0) { - handlers.close(); - } // Try to reconnect. - - - client = null; // After 10 retries stop trying, to prevent logspam. - - if (retries < maxRetries) { - // Exponentially increase timeout to reconnect. - // Respectfully copied from the package `got`. - // eslint-disable-next-line no-restricted-properties - var retryInMs = 1000 * Math.pow(2, retries) + Math.random() * 100; - retries += 1; - _utils_log_js__WEBPACK_IMPORTED_MODULE_1__.log.info("Trying to reconnect..."); - setTimeout(function () { - socket(url, handlers, reconnect); - }, retryInMs); - } - }); - client.onMessage( - /** - * @param {any} data - */ - function (data) { - var message = JSON.parse(data); - - if (handlers[message.type]) { - handlers[message.type](message.data, message.params); - } - }); -}; - -/* harmony default export */ __webpack_exports__["default"] = (socket); - -/***/ }), - -/***/ "./node_modules/webpack-dev-server/client/utils/createSocketURL.js": -/*!*************************************************************************!*\ - !*** ./node_modules/webpack-dev-server/client/utils/createSocketURL.js ***! - \*************************************************************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/** - * @param {{ protocol?: string, auth?: string, hostname?: string, port?: string, pathname?: string, search?: string, hash?: string, slashes?: boolean }} objURL - * @returns {string} - */ -function format(objURL) { - var protocol = objURL.protocol || ""; - - if (protocol && protocol.substr(-1) !== ":") { - protocol += ":"; - } - - var auth = objURL.auth || ""; - - if (auth) { - auth = encodeURIComponent(auth); - auth = auth.replace(/%3A/i, ":"); - auth += "@"; - } - - var host = ""; - - if (objURL.hostname) { - host = auth + (objURL.hostname.indexOf(":") === -1 ? objURL.hostname : "[".concat(objURL.hostname, "]")); - - if (objURL.port) { - host += ":".concat(objURL.port); - } - } - - var pathname = objURL.pathname || ""; - - if (objURL.slashes) { - host = "//".concat(host || ""); - - if (pathname && pathname.charAt(0) !== "/") { - pathname = "/".concat(pathname); - } - } else if (!host) { - host = ""; - } - - var search = objURL.search || ""; - - if (search && search.charAt(0) !== "?") { - search = "?".concat(search); - } - - var hash = objURL.hash || ""; - - if (hash && hash.charAt(0) !== "#") { - hash = "#".concat(hash); - } - - pathname = pathname.replace(/[?#]/g, - /** - * @param {string} match - * @returns {string} - */ - function (match) { - return encodeURIComponent(match); - }); - search = search.replace("#", "%23"); - return "".concat(protocol).concat(host).concat(pathname).concat(search).concat(hash); -} -/** - * @param {URL & { fromCurrentScript?: boolean }} parsedURL - * @returns {string} - */ - - -function createSocketURL(parsedURL) { - var hostname = parsedURL.hostname; // Node.js module parses it as `::` - // `new URL(urlString, [baseURLString])` parses it as '[::]' - - var isInAddrAny = hostname === "0.0.0.0" || hostname === "::" || hostname === "[::]"; // why do we need this check? - // hostname n/a for file protocol (example, when using electron, ionic) - // see: https://github.com/webpack/webpack-dev-server/pull/384 - - if (isInAddrAny && self.location.hostname && self.location.protocol.indexOf("http") === 0) { - hostname = self.location.hostname; - } - - var socketURLProtocol = parsedURL.protocol || self.location.protocol; // When https is used in the app, secure web sockets are always necessary because the browser doesn't accept non-secure web sockets. - - if (socketURLProtocol === "auto:" || hostname && isInAddrAny && self.location.protocol === "https:") { - socketURLProtocol = self.location.protocol; - } - - socketURLProtocol = socketURLProtocol.replace(/^(?:http|.+-extension|file)/i, "ws"); - var socketURLAuth = ""; // `new URL(urlString, [baseURLstring])` doesn't have `auth` property - // Parse authentication credentials in case we need them - - if (parsedURL.username) { - socketURLAuth = parsedURL.username; // Since HTTP basic authentication does not allow empty username, - // we only include password if the username is not empty. - - if (parsedURL.password) { - // Result: : - socketURLAuth = socketURLAuth.concat(":", parsedURL.password); - } - } // In case the host is a raw IPv6 address, it can be enclosed in - // the brackets as the brackets are needed in the final URL string. - // Need to remove those as url.format blindly adds its own set of brackets - // if the host string contains colons. That would lead to non-working - // double brackets (e.g. [[::]]) host - // - // All of these web socket url params are optionally passed in through resourceQuery, - // so we need to fall back to the default if they are not provided - - - var socketURLHostname = (hostname || self.location.hostname || "localhost").replace(/^\[(.*)\]$/, "$1"); - var socketURLPort = parsedURL.port; - - if (!socketURLPort || socketURLPort === "0") { - socketURLPort = self.location.port; - } // If path is provided it'll be passed in via the resourceQuery as a - // query param so it has to be parsed out of the querystring in order for the - // client to open the socket to the correct location. - - - var socketURLPathname = "/ws"; - - if (parsedURL.pathname && !parsedURL.fromCurrentScript) { - socketURLPathname = parsedURL.pathname; - } - - return format({ - protocol: socketURLProtocol, - auth: socketURLAuth, - hostname: socketURLHostname, - port: socketURLPort, - pathname: socketURLPathname, - slashes: true - }); -} - -/* harmony default export */ __webpack_exports__["default"] = (createSocketURL); - -/***/ }), - -/***/ "./node_modules/webpack-dev-server/client/utils/getCurrentScriptSource.js": -/*!********************************************************************************!*\ - !*** ./node_modules/webpack-dev-server/client/utils/getCurrentScriptSource.js ***! - \********************************************************************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/** - * @returns {string} - */ -function getCurrentScriptSource() { - // `document.currentScript` is the most accurate way to find the current script, - // but is not supported in all browsers. - if (document.currentScript) { - return document.currentScript.getAttribute("src"); - } // Fallback to getting all scripts running in the document. - - - var scriptElements = document.scripts || []; - var scriptElementsWithSrc = Array.prototype.filter.call(scriptElements, function (element) { - return element.getAttribute("src"); - }); - - if (scriptElementsWithSrc.length > 0) { - var currentScript = scriptElementsWithSrc[scriptElementsWithSrc.length - 1]; - return currentScript.getAttribute("src"); - } // Fail as there was no script to use. - - - throw new Error("[webpack-dev-server] Failed to get current script source."); -} - -/* harmony default export */ __webpack_exports__["default"] = (getCurrentScriptSource); - -/***/ }), - -/***/ "./node_modules/webpack-dev-server/client/utils/log.js": -/*!*************************************************************!*\ - !*** ./node_modules/webpack-dev-server/client/utils/log.js ***! - \*************************************************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "log": function() { return /* binding */ log; }, -/* harmony export */ "setLogLevel": function() { return /* binding */ setLogLevel; } -/* harmony export */ }); -/* harmony import */ var _modules_logger_index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/logger/index.js */ "./node_modules/webpack-dev-server/client/modules/logger/index.js"); -/* harmony import */ var _modules_logger_index_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_modules_logger_index_js__WEBPACK_IMPORTED_MODULE_0__); - -var name = "webpack-dev-server"; // default level is set on the client side, so it does not need -// to be set by the CLI or API - -var defaultLevel = "info"; // options new options, merge with old options - -/** - * @param {false | true | "none" | "error" | "warn" | "info" | "log" | "verbose"} level - * @returns {void} - */ - -function setLogLevel(level) { - _modules_logger_index_js__WEBPACK_IMPORTED_MODULE_0___default().configureDefaultLogger({ - level: level - }); -} - -setLogLevel(defaultLevel); -var log = _modules_logger_index_js__WEBPACK_IMPORTED_MODULE_0___default().getLogger(name); - - -/***/ }), - -/***/ "./node_modules/webpack-dev-server/client/utils/parseURL.js": -/*!******************************************************************!*\ - !*** ./node_modules/webpack-dev-server/client/utils/parseURL.js ***! - \******************************************************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _getCurrentScriptSource_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getCurrentScriptSource.js */ "./node_modules/webpack-dev-server/client/utils/getCurrentScriptSource.js"); - -/** - * @param {string} resourceQuery - * @returns {{ [key: string]: string | boolean }} - */ - -function parseURL(resourceQuery) { - /** @type {{ [key: string]: string }} */ - var options = {}; - - if (typeof resourceQuery === "string" && resourceQuery !== "") { - var searchParams = resourceQuery.slice(1).split("&"); - - for (var i = 0; i < searchParams.length; i++) { - var pair = searchParams[i].split("="); - options[pair[0]] = decodeURIComponent(pair[1]); - } - } else { - // Else, get the url from the
Rotate Mode
R
RotateScale Mode
r
Scale Mode
s
Distort Mode
d
Drag Mode
D
Lock (Mode) / Unlock Image
l u
Stack up / down
q a
Add / Remove Image Border
b
Toggle Opacity
o
Deselect All
esc
Delete Image(s)
delete backspace
Export Image(s)
e
'),t.appendChild(i),t},this._keymapper.addTo(this._map)},_toggleKeymapper:function(t){t.preventDefault(),this._container.className="ldi-keymapper leaflet-control"===this._container.className?"ldi-keymapper-hide leaflet-control":"ldi-keymapper leaflet-control",this._scrollWrapper.style.display="none"===this._scrollWrapper.style.display?"block":"none",this._toggler.innerHTML="close"===this._toggler.innerHTML?L.IconUtil.create("keyboard_open"):"close",L.IconUtil.toggleTitle(this._toggler,"Show keymap","Hide keymap"),L.DomUtil.toggleClass(this._toggler,"close-icon")},_injectIconSet:function(){if(!document.querySelector("#keymapper-iconset")){var t=L.DomUtil.create("div","");t.id="keymapper-iconset",t.setAttribute("hidden","hidden"),this._iconset=(new L.KeymapperIconSet).render(),t.innerHTML=this._iconset,document.querySelector(".leaflet-control-container").appendChild(t)}}}),L.DistortableImage.Keymapper.addInitHook((function(){L.DistortableImage.Keymapper.prototype._n=L.DistortableImage.Keymapper.prototype._n?L.DistortableImage.Keymapper.prototype._n+1:1,1!==L.DistortableImage.Keymapper.prototype._n||L.Browser.mobile||(t.enable(),t._injectIconSet())})),L.distortableImage.keymapper=function(t,e){return new L.DistortableImage.Keymapper(t,e)}},428:function(){L.DistortableImage=L.DistortableImage||{},L.DistortableCollection.Edit=L.Handler.extend({options:{keymap:L.distortableImage.group_action_map},initialize:function(t,e){this._group=t,this._exportOpts=t.options.exportOpts,L.setOptions(this,e),L.distortableImage.group_action_map.Escape="_decollectAll"},addHooks:function(){var t=this._group._map;this.editActions=this.options.actions,this.runExporter=L.bind(L.Utils.getNestedVal(this,"_exportOpts","exporter")||this.startExport,this),L.DomEvent.on(document,"keydown",this._onKeyDown,this),t.doubleClickZoom.enabled()||t.doubleClickLabels.enabled()||L.DomEvent.on(t,"click",this._decollectAll,this),L.DomEvent.on(t,{singleclickon:this._singleClickListeners,singleclickoff:this._resetClickListeners,singleclick:this._singleClick,boxcollectend:this._addCollections},this),this._group.editable=!0,this._group.eachLayer((function(t){return t.editing.enable()}))},removeHooks:function(){var t=this._group._map;L.DomEvent.off(document,"keydown",this._onKeyDown,this),t.doubleClickZoom.enabled()||t.doubleClickLabels.enabled()||L.DomEvent.off(t,"click",this._decollectAll,this),L.DomEvent.off(t,{singleclickon:this._singleClickListeners,singleclickoff:this._resetClickListeners,singleclick:this._singleClick,boxcollectend:this._addCollections},this),this._decollectAll(),this._group.editable=!1,this._group.eachLayer((function(t){return t.editing.disable()}))},enable:function(){return this._enabled=!0,this.addHooks(),this},disable:function(){return this._enabled=!1,this.removeHooks(),this},_onKeyDown:function(t){var e=this.options.keymap[t.key];this[e]&&this._group.anyCollected()&&this[e].call(this)},_singleClick:function(t){"singleclick"===t.type&&this._decollectAll(t)},_singleClickListeners:function(){var t=this._group._map;L.DomEvent.off(t,"click",this._decollectAll,this),L.DomEvent.on(t,"singleclick",this._decollectAll,this)},_resetClickListeners:function(){var t=this._group._map;L.DomEvent.on(t,"click",this._decollectAll,this),L.DomEvent.off(t,"singleclick",this._decollectAll,this)},_decollectAll:function(t){var e;t&&(e=t.originalEvent),e&&(e.shiftKey||e.target instanceof HTMLImageElement)||(this._group.eachLayer((function(t){L.DomUtil.removeClass(t.getElement(),"collected"),t.deselect()})),this._removeToolbar(),t&&L.DomEvent.stopPropagation(t))},_unlockGroup:function(){var t=this;this.hasTool(L.UnlockAction)&&this._group.eachLayer((function(e){t._group.isCollected(e)&&(e.editing._unlock(),e.deselect())}))},_lockGroup:function(){var t=this;this.hasTool(L.LockAction)&&this._group.eachLayer((function(e){t._group.isCollected(e)&&(e.editing._lock(),L.DomUtil.addClass(e.getElement(),"collected"))}))},_addCollections:function(t){var e=this,i=t.boxCollectBounds,o=this._group._map;this._group.eachLayer((function(t){var n=t.editing;t.isSelected()&&t.deselect();var a=o.getZoom(),s=o.getCenter(),r=L.latLngBounds(t.getCorner(2),t.getCorner(1));r=o._latLngBoundsToNewLayerBounds(r,a,s),i.intersects(r)&&n.enabled()&&(e.toolbar||e._addToolbar(),L.DomUtil.addClass(t.getElement(),"collected"))}))},_removeGroup:function(t){var e=this;if(this.hasTool(L.DeleteAction)){var i=this._group._toRemove(),o=i.length;0!==o&&(L.DomUtil.confirmDeletes(o)&&(i.forEach((function(t){e._group.removeLayer(t)})),this._group.anyCollected()||this._removeToolbar()),t&&L.DomEvent.stopPropagation(t))}},cancelExport:function(){this.customCollection||(this._exportOpts.collection=void 0),clearInterval(this.updateInterval)},_addToolbar:function(){var t=this._group,e=t._map;t.options.suppressToolbar||this.toolbar||(this.toolbar=L.distortableImage.controlBar({actions:this.editActions,position:"topleft"}).addTo(e,t))},_removeToolbar:function(){var t=this._group._map;if(!this.toolbar)return!1;t.removeLayer(this.toolbar),this.toolbar=!1},hasTool:function(t){return this.editActions.some((function(e){return e===t}))},addTool:function(t){return"leaflet-toolbar-icon"!==t.baseClass||this.hasTool(t)||(this._removeToolbar(),this.editActions.push(t),this._addToolbar()),this},removeTool:function(t){var e=this;return this.editActions.some((function(i,o){return e.editActions[o]===t&&(e._removeToolbar(),e.editActions.splice(o,1),e._addToolbar(),!0)})),this},startExport:function(){var t=this;if(this.hasTool(L.ExportAction))return new Promise((function(e){var i,o=t._exportOpts;o.resolve=e,t.updateInterval=null,t.customCollection=!!o.collection,t.customCollection||(o.collection=t._group.generateExportJson().images),o.frequency=o.frequency||3e3,o.scale=o.scale||100,o.updater=o.updater||function(n){(n=JSON.parse(n)).status_url&&(i!==n.status_url&&n.status_url.match(".json")&&(i=n.status_url),"complete"===n.status&&(clearInterval(t.updateInterval),t.customCollection||(t._exportOpts.collection=void 0),e(),null!==n.jpg&&alert("Export succeeded. "+o.exportUrl+n.jpg)),console.log(n))},o.handleStatusRes=o.handleStatusRes||function(e){i=o.statusUrl+e,t.updateInterval=setInterval((function(){var t=new Request("".concat(i,"?").concat(Date.now()),{method:"GET"});fetch(t).then((function(t){if(t.ok)return t.text()})).then(o.updater)}),o.frequency)},o.fetchStatusUrl=o.fetchStatusUrl||function(t){var e=new FormData;e.append("collection",JSON.stringify(t.collection)),e.append("scale",t.scale),e.append("upload",!0);var i={method:"POST",body:e},o=new Request(t.exportStartUrl,i);fetch(o).then((function(t){if(t.ok)return t.text()})).then(t.handleStatusRes)},o.fetchStatusUrl(o)}))}}),L.distortableCollection.edit=function(t,e){return new L.DistortableCollection.Edit(t,e)}},397:function(){L.DistortableImage=L.DistortableImage||{},L.DistortableImage.Edit=L.Handler.extend({options:{opacity:.7,outline:"1px solid red",keymap:L.distortableImage.action_map},initialize:function(t,e){this._overlay=t,this._toggledImage=!1,this._mode=t.options.mode,this._transparent=!1,this._outlined=!1,L.setOptions(this,e),L.distortableImage.action_map.Escape="_deselect"},addHooks:function(){var t=this._overlay;this.editActions=this.options.actions,t.bringToFront(),this._initModes(),this._initHandles(),this._appendHandlesandDragable(),t.isSelected()&&!t.options.suppressToolbar&&this._addToolbar(),this.parentGroup=!!t.eP&&t.eP,L.DomEvent.on(t.getElement(),{dblclick:this.nextMode},this),L.DomEvent.on(window,"keydown",this._onKeyDown,this)},removeHooks:function(){var t=this._overlay,e=this.parentGroup;for(var i in this._disableDragging(),this.toolbar&&this._removeToolbar(),this._handles)L.DomUtil.remove(i);L.DomUtil.hasClass(t.getElement(),"collected")&&L.DomUtil.removeClass(t.getElement(),"collected"),e&&!e.anyCollected()&&e.editing.toolbar&&e.editing._removeToolbar(),L.DomEvent.off(t.getElement(),{dblclick:this.nextMode},this),L.DomEvent.off(window,"keydown",this._onKeyDown,this)},disable:function(){return this._enabled?(this._overlay.deselect(),this._enabled=!1,this.removeHooks(),this):this},_initModes:function(){for(var t in this._modes={},L.DistortableImage.Edit.MODES){var e=L.DistortableImage.Edit.MODES[t];-1!==this.editActions.indexOf(e)&&(this._modes[t]=e)}this._modes[this._mode]||(this._mode=Object.keys(this._modes)[0])},_initHandles:function(){var t,e=this._overlay;for(this._dragHandles=L.layerGroup(),t=0;t<4;t++)this._dragHandles.addLayer(L.dragHandle(e,t));for(this._scaleHandles=L.layerGroup(),t=0;t<4;t++)this._scaleHandles.addLayer(L.scaleHandle(e,t));for(this._distortHandles=L.layerGroup(),t=0;t<4;t++)this._distortHandles.addLayer(L.distortHandle(e,t));for(this._rotateHandles=L.layerGroup(),t=0;t<4;t++)this._rotateHandles.addLayer(L.rotateHandle(e,t));for(this._freeRotateHandles=L.layerGroup(),t=0;t<4;t++)this._freeRotateHandles.addLayer(L.freeRotateHandle(e,t));for(this._lockHandles=L.layerGroup(),t=0;t<4;t++)this._lockHandles.addLayer(L.lockHandle(e,t,{draggable:!1}));this._handles={drag:this._dragHandles,scale:this._scaleHandles,distort:this._distortHandles,rotate:this._rotateHandles,freeRotate:this._freeRotateHandles,lock:this._lockHandles}},_appendHandlesandDragable:function(){var t=this._overlay;this._mode?(this._updateHandle(),!t.isSelected()&&this.currentHandle&&this.currentHandle.eachLayer((function(t){t.setOpacity(0),t.dragging&&t.dragging.disable()})),this.isMode("lock")||this._enableDragging()):this._enableDragging()},_onKeyDown:function(t){var e=this.options.keymap[t.key],i=this._overlay,o=this.parentGroup;o&&o.anyCollected()||void 0===this[e]||i.options.suppressToolbar||i.isSelected()&&this.toolbar&&this[e].call(this)},replaceTool:function(t,e){var i=this;return"leaflet-toolbar-icon"!==e.baseClass||this.hasTool(e)||this.editActions.some((function(o,n){if(o===t){for(var a in i._removeToolbar(),i.editActions[n]=e,i._addToolbar(),L.DistortableImage.Edit.MODES)L.DistortableImage.Edit.MODES[a]===t?(delete i._modes[a],i._nextOrNone(a)):L.DistortableImage.Edit.MODES[a]===e&&(i._modes[a]=e);return!0}})),this},addTool:function(t){if("leaflet-toolbar-icon"===t.baseClass&&!this.hasTool(t)){for(var e in this._removeToolbar(),this.editActions.push(t),this._addToolbar(),L.DistortableImage.Edit.MODES)L.DistortableImage.Edit.MODES[e]===t&&(this._modes[e]=t);this._overlay.isSelected()||this._removeToolbar()}return this},hasTool:function(t){return this.editActions.some((function(e){return e===t}))},removeTool:function(t){var e=this;return this.editActions.some((function(i,o){if(i===t){for(var n in e._removeToolbar(),e.editActions.splice(o,1),e._addToolbar(),L.DistortableImage.Edit.MODES)L.DistortableImage.Edit.MODES[n]===t&&(delete e._modes[n],e._nextOrNone(n));return!0}})),this._overlay.isSelected()||this._removeToolbar(),this},_nextOrNone:function(t){this.isMode(t)&&(Object.keys(this.getModes()).length>=1?this.nextMode():("lock"===t&&this._enableDragging(),this._mode="",this._updateHandle()))},_removeToolbar:function(){var t=this._overlay._map;this.toolbar&&(t.removeLayer(this.toolbar),this.toolbar=!1)},_enableDragging:function(){var t=this,e=this._overlay,i=e._map;this.dragging=new L.Draggable(e.getElement()),this.dragging.enable(),this.dragging.on("dragstart",(function(){e.fire("dragstart"),t._removeToolbar()})),this.dragging._updatePosition=function(){var t,o,n=e.getCorner(0),a=this._newPos.subtract(i.latLngToLayerPoint(n)),s={};for(this.fire("predrag"),o=0;o<4;o++)t=i.latLngToLayerPoint(e.getCorner(o)),s[o]=i.layerPointToLatLng(t.add(a));e.setCorners(s),e.fire("drag"),this.fire("drag")},this.dragging.on("dragend",(function(){e.fire("dragend")}))},_disableDragging:function(){this.dragging&&(this.dragging.disable(),delete this.dragging)},_dragMode:function(){this.setMode("drag")},_scaleMode:function(){this.setMode("scale")},_distortMode:function(){this.setMode("distort")},_rotateMode:function(){this.setMode("rotate")},_freeRotateMode:function(){this.setMode("freeRotate")},_toggleLockMode:function(){this.isMode("lock")?this._unlock():this._lock()},_toggleOpacity:function(){var t=this._overlay.getElement();if(this.hasTool(L.OpacityAction)){this._transparent=!this._transparent;var e=this._transparent?this.options.opacity:1;L.DomUtil.setOpacity(t,e),t.setAttribute("opacity",e),this._refresh()}},_toggleBorder:function(){var t=this._overlay.getElement();if(this.hasTool(L.BorderAction)){this._outlined=!this._outlined;var e=this._outlined?this.options.outline:"none";t.style.outline=e,this._refresh()}},_toggleOrder:function(){this._toggledImage?this._stackUp():this._stackDown()},_removeOverlay:function(){var t=this._overlay,e=this.parentGroup;!this.isMode("lock")&&this.hasTool(L.DeleteAction)&&L.DomUtil.confirmDelete()&&(this._removeToolbar(),e?e.removeLayer(t):t._map.removeLayer(t))},_getExport:function(){var t=this._overlay,e=t._map,i=t.getElement();if(this.hasTool(L.ExportAction)){var o=new Image;o.id=o.id||"tempId12345",document.body.appendChild(o),o.onload=function(){var i=o.height,n=o.width,a=e.latLngToLayerPoint(t.getCorner(0)),s=e.latLngToLayerPoint(t.getCorner(1)),r=e.latLngToLayerPoint(t.getCorner(2)),l=e.latLngToLayerPoint(t.getCorner(3));o.onload=function(){L.DomUtil.remove(o)},window&&window.hasOwnProperty("warpWebGl")&&warpWebGl(o.id,[0,0,n,0,n,i,0,i],[a.x,a.y,s.x,s.y,l.x,l.y,r.x,r.y],!0)},o.src=t.options.fullResolutionSrc||i.src}},_stackUp:function(){this._toggledImage&&this.hasTool(L.StackAction)&&(this._toggledImage=!1,this._overlay.bringToFront(),this._refresh())},_stackDown:function(){!this._toggledImage&&this.hasTool(L.StackAction)&&(this._toggledImage=!0,this._overlay.bringToBack(),this._refresh())},_unlock:function(){var t=this._overlay,e=t._map,i=this.parentGroup;this.isMode("lock")&&((!i||i.isCollected(t))&&i||this.hasTool(L.LockAction))&&(this.currentHandle&&e.removeLayer(this.currentHandle),"lock"!==t.options.mode&&this.hasMode(t.options.mode)?this._mode=t.options.mode:(this._mode="",this.currentHandle=""),this._updateHandle(),this._enableDragging(),this._refresh())},_lock:function(){var t=this._overlay,e=t._map,i=this.parentGroup;this.isMode("lock")||((!i||i.isCollected(t))&&i||this.hasTool(L.LockAction))&&(this.currentHandle&&e.removeLayer(this.currentHandle),this._mode="lock",this._updateHandle(),this._disableDragging(),this._refresh())},_deselect:function(){this._overlay.deselect()},_showMarkers:function(t){var e=this.parentGroup;this.currentHandle&&(!this.isMode("lock")&&e&&e.anyCollected()||this.currentHandle.eachLayer((function(t){t.setOpacity(1),t.dragging&&t.dragging.enable(),L.DomUtil.addClass(t.getElement(),"leaflet-interactive")})))},_hideMarkers:function(){var t=this._overlay,e=this.parentGroup;this._handles||this._initHandles(),this.currentHandle&&(this.isMode("lock")&&e&&e.isCollected(t)||this.currentHandle.eachLayer((function(t){t.setOpacity(0),t.dragging&&t.dragging.disable(),L.DomUtil.removeClass(t.getElement(),"leaflet-interactive")})))},_updateHandle:function(){var t=this._overlay._map,e=this.getMode();this.currentHandle&&t.removeLayer(this.currentHandle),this.currentHandle=""===e?"":this._handles[e],""!==this.currentHandle&&t.addLayer(this.currentHandle)},_addToolbar:function(){var t=this._overlay,e=this.parentGroup,i=t._map,o=t.getCorners(),n=-1/0;if(e&&e.anyCollected())e.editing._addToolbar();else if(!t.options.suppressToolbar&&!this.toolbar){for(var a=0;an&&(n=o[a].lat);var s=t.getCenter();s.lat=n,this.toolbar=L.distortableImage.popupBar(s,{actions:this.editActions}).addTo(i,t),t.fire("toolbar:created")}},_refresh:function(){this.toolbar&&this._removeToolbar(),this._addToolbar()},_updateToolbarPos:function(){var t=this._overlay,e=t.getCorners(),i=this.toolbar,o=-1/0;if(i&&i instanceof L.DistortableImage.PopupBar){for(var n=0;no&&(o=e[n].lat);var a=t.getCenter();a.lat=o,t.options.suppressToolbar||this.toolbar.setLatLng(a)}},hasMode:function(t){return!!this._modes[t]},getMode:function(){if(this.enabled())return this._mode},getModes:function(){return this._modes},isMode:function(t){return!!this.enabled()&&this._mode===t},setMode:function(t){var e=this._overlay,i=this.parentGroup;if(this.getMode()!==t&&this.hasMode(t)&&this.enabled())return this.toolbar&&this.toolbar.clickTool(t),this.isMode("lock")&&!this.dragging&&this._enableDragging(),this._mode=t,this.isMode("lock")&&this._disableDragging(),this._updateHandle(),this._refresh(),i&&i.isCollected(e)&&e.deselect(),this},nextMode:function(t){var e=this.getMode(),i=this.parentGroup,o=Object.keys(this.getModes()),n=o.indexOf(e),a=o[(n+1)%o.length];if(t){if(i&&i.anyCollected())return;L.DomEvent.stop(t)}return this.setMode(a)}}),L.distortableImage.edit=function(t,e){return new L.DistortableImage.Edit(t,e)}},426:function(){L.BorderAction=L.EditAction.extend({initialize:function(t,e,i){var o,n,a=e.editing,s=a._mode;a._outlined?(o="border_outer",n=e.options.translation.removeBorder):(o="border_clear",n=e.options.translation.addBorder),(i=i||{}).toolbarIcon={svg:!0,html:o,tooltip:n,className:"lock"===s?"disabled":""},L.DistortableImage.action_map.b="lock"===s?"":"_toggleBorder",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){var t=this._overlay.editing;L.IconUtil.toggleXlink(this._link,"border_clear","border_outer"),L.IconUtil.toggleTitle(this._link,"Remove Border","Add Border"),t._toggleBorder()}})},114:function(){L.DeleteAction=L.EditAction.extend({initialize:function(t,e,i){var o,n=e.editing;n instanceof L.DistortableImage.Edit?(o=e.options.translation.deleteImage,L.DistortableImage.action_map.Backspace="lock"===n._mode?"":"_removeOverlay"):(o=e.options.translation.deleteImages,L.DistortableImage.group_action_map.Backspace="lock"===n._mode?"":"_removeGroup"),(i=i||{}).toolbarIcon={svg:!0,html:"delete_forever",tooltip:o,className:"lock"===n._mode?"disabled":""},L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){var t=this._overlay.editing;t instanceof L.DistortableImage.Edit?t._removeOverlay():t._removeGroup()}})},231:function(){L.DistortAction=L.EditAction.extend({initialize:function(t,e,i){(i=i||{}).toolbarIcon={svg:!0,html:"distort",tooltip:e.options.translation.distortImage,className:"distort"},L.DistortableImage.action_map.d="_distortMode",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){this._overlay.editing._distortMode()}})},541:function(){L.DragAction=L.EditAction.extend({initialize:function(t,e,i){(i=i||{}).toolbarIcon={svg:!0,html:"drag",tooltip:e.options.translation.dragImage,className:"drag"},L.DistortableImage.action_map.D="_dragMode",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){this._overlay.editing._dragMode()}})},280:function(){L.DistortableImage=L.DistortableImage||{},L.distortableImage=L.DistortableImage,L.DistortableImage.action_map={},L.EditAction=L.Toolbar2.Action.extend({options:{toolbarIcon:{svg:!1,html:"",className:"",tooltip:""}},initialize:function(t,e,i){this._overlay=e,this._map=t,L.setOptions(this,i),L.Toolbar2.Action.prototype.initialize.call(this,i),this._injectIconSet()},_createIcon:function(t,e,i){var o=this,n=this.options.toolbarIcon,a=n.className,s=this._overlay.editing;this.toolbar=t,this._icon=L.DomUtil.create("li","",e),this._link=L.DomUtil.create("a","",this._icon),n.svg?this._link.innerHTML=L.IconUtil.create(n.html):this._link.innerHTML=n.html,this._link.setAttribute("href","#"),this._link.setAttribute("title",n.tooltip),this._link.setAttribute("role","button"),L.DomUtil.addClass(this._link,this.constructor.baseClass),a&&(L.DomUtil.addClass(this._link,a),"disabled"===a&&L.DomUtil.addClass(this._icon,a),a===s._mode?L.DomUtil.addClass(this._link,"selected-mode"):L.DomUtil.removeClass(this._link,"selected-mode")),L.DomEvent.on(this._link,"click",this.enable,this),L.DomEvent.on(this._overlay,"update",(function(){var t=o._link.innerHTML.match(/xlink:href="#restore"/);t&&1===t.length&&o._enableAction()})),this._addSubToolbar(t,this._icon,i)},_injectIconSet:function(){if(!document.querySelector("#iconset")){var t=document.createElement("div");t.id="iconset",t.setAttribute("hidden","hidden"),t.innerHTML=(new L.ToolbarIconSet).render(),document.querySelector(".leaflet-marker-pane").appendChild(t)}},_enableAction:function(){L.DomUtil.removeClass(this._link.parentElement,"disabled"),L.DomUtil.removeClass(this._link,"disabled")},_disableAction:function(){L.DomUtil.addClass(this._link.parentElement,"disabled"),L.DomUtil.addClass(this._link,"disabled")}}),L.editAction=function(t,e,i){return new L.EditAction(t,e,i)}},149:function(){L.ExportAction=L.EditAction.extend({initialize:function(t,e,i){var o,n=e.editing;this.isExporting=!1,this.mouseLeaveSkip=!0,this.isHooksExecuted=!1,n instanceof L.DistortableImage.Edit?(L.DistortableImage.action_map.e="_getExport",o=e.options.translation.exportImage):(L.DistortableImage.group_action_map.e="runExporter",o=e.options.translation.exportImages),(i=i||{}).toolbarIcon={svg:!0,html:"get_app",tooltip:o},L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){var t=this._overlay.editing;if(t instanceof L.DistortableImage.Edit)t._getExport();else if(!this.isHooksExecuted){this.isHooksExecuted=!0;var e=this._link.parentElement;this.mouseEnterHandler=this.handleMouseEnter.bind(this),this.mouseLeaveHandler=this.handleMouseLeave.bind(this),L.DomEvent.on(e,"click",(function(){if(this.isExporting){if(this.mouseLeaveSkip)return;this.resetState(),this.detachMouseEventListeners(e),t.cancelExport()}else this.isExporting=!0,this.renderExportIcon(),setTimeout(this.attachMouseEventListeners.bind(this,e),100),t.runExporter().then(function(){this.resetState(),this.detachMouseEventListeners(e)}.bind(this))}),this)}},resetState:function(){this.renderDownloadIcon(),this.isExporting=!1,this.mouseLeaveSkip=!0},attachMouseEventListeners:function(t){t.addEventListener("mouseenter",this.mouseEnterHandler),t.addEventListener("mouseleave",this.mouseLeaveHandler)},detachMouseEventListeners:function(t){t.removeEventListener("mouseenter",this.mouseEnterHandler),t.removeEventListener("mouseleave",this.mouseLeaveHandler)},handleMouseEnter:function(){this.renderCancelIcon()},handleMouseLeave:function(){this.mouseLeaveSkip?this.mouseLeaveSkip=!1:this.renderExportIcon()},renderDownloadIcon:function(){L.IconUtil.toggleXlink(this._link,"get_app","spinner"),L.IconUtil.toggleTitle(this._link,"Export Images","Loading..."),L.DomUtil.removeClass(this._link.firstChild,"loader")},renderExportIcon:function(){L.IconUtil.toggleXlink(this._link,"spinner"),L.IconUtil.toggleTitle(this._link,"Export Images","Loading..."),L.IconUtil.addClassToSvg(this._link,"loader")},renderCancelIcon:function(){L.IconUtil.toggleXlink(this._link,"cancel"),L.IconUtil.toggleTitle(this._link,"Cancel Export","Loading..."),L.DomUtil.removeClass(this._link.firstChild,"loader")}})},74:function(){L.FreeRotateAction=L.EditAction.extend({initialize:function(t,e,i){(i=i||{}).toolbarIcon={svg:!0,html:"crop_rotate",tooltip:e.options.translation.freeRotateImage,className:"freeRotate"},L.DistortableImage.action_map.f="_freeRotateMode",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){this._overlay.editing._freeRotateMode()}})},691:function(){L.GeolocateAction=L.EditAction.extend({initialize:function(t,e,i){var o=e.editing;(i=i||{}).toolbarIcon={svg:!0,html:"explore",tooltip:e.options.translation.geolocateImage,className:"lock"===o._mode?"disabled":""},L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){var t=this._overlay.getElement();EXIF.getData(t,L.EXIF(t))}})},105:function(){L.LockAction=L.EditAction.extend({initialize:function(t,e,i){var o,n,a=e.editing;a instanceof L.DistortableImage.Edit?(L.DistortableImage.action_map.u="_unlock",L.DistortableImage.action_map.l="_lock",n=e.options.translation.lockMode,o=a.isMode("lock")?"lock":"unlock"):(L.DistortableImage.group_action_map.l="_lockGroup",n=e.options.translation.lockImages,o="lock"),(i=i||{}).toolbarIcon={svg:!0,html:o,tooltip:n,className:"lock"},L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){var t=this._overlay.editing;t instanceof L.DistortableImage.Edit?t._toggleLockMode():t._lockGroup()}})},944:function(){L.OpacityAction=L.EditAction.extend({initialize:function(t,e,i){var o,n,a=e.editing,s=a._mode;a._transparent?(o="opacity_empty",n=e.options.translation.makeImageOpaque):(o="opacity",n=e.options.translation.makeImageTransparent),(i=i||{}).toolbarIcon={svg:!0,html:o,tooltip:n,className:"lock"===s?"disabled":""},L.DistortableImage.action_map.o="lock"===s?"":"_toggleOpacity",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){var t=this._overlay.editing,e=this._link;L.IconUtil.toggleXlink(e,"opacity","opacity_empty"),L.IconUtil.toggleTitle(e,"Make Image Transparent","Make Image Opaque"),t._toggleOpacity()}})},954:function(){L.RestoreAction=L.EditAction.extend({initialize:function(t,e,i){var o=L.Utils.getNestedVal(e,"editing","_mode"),n=e.edited;(i=i||{}).toolbarIcon={svg:!0,html:"restore",tooltip:e.options.translation.restoreImage,className:n&&"lock"!==o?"":"disabled"},L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){var t=this._overlay;L.DomEvent.on(t,{edit:this._enableAction,restore:this._disableAction},this),t.restore()}})},178:function(){L.RotateAction=L.EditAction.extend({initialize:function(t,e,i){(i=i||{}).toolbarIcon={svg:!0,html:"rotate",tooltip:e.options.translation.rotateImage,className:"rotate"},L.DistortableImage.action_map.r="_rotateMode",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){this._overlay.editing._rotateMode()}})},547:function(){L.ScaleAction=L.EditAction.extend({initialize:function(t,e,i){(i=i||{}).toolbarIcon={svg:!0,html:"scale",tooltip:e.options.translation.scaleImage,className:"scale"},L.DistortableImage.action_map.s="_scaleMode",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){this._overlay.editing._scaleMode()}})},886:function(){L.StackAction=L.EditAction.extend({initialize:function(t,e,i){var o,n,a=e.editing;a._toggledImage?(o="flip_to_back",n=e.options.translation.stackToFront):(o="flip_to_front",n=e.options.translation.stackToBack),(i=i||{}).toolbarIcon={svg:!0,html:o,tooltip:n,className:"lock"===a._mode?"disabled":""},L.DistortableImage.action_map.q="lock"===a._mode?"":"_stackUp",L.DistortableImage.action_map.a="lock"===a._mode?"":"_stackDown",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){var t=this._overlay.editing;L.IconUtil.toggleXlink(this._link,"flip_to_front","flip_to_back"),L.IconUtil.toggleTitle(this._link,"Stack to Front","Stack to Back"),t._toggleOrder()}})},129:function(){L.UnlockAction=L.EditAction.extend({initialize:function(t,e,i){(i=i||{}).toolbarIcon={svg:!0,html:"unlock",tooltip:e.options.translation.unlockImages},L.DistortableImage.group_action_map.u="_unlockGroup",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){this._overlay.editing._unlockGroup()}})},743:function(){L.EXIF=function(t){if(0!==Object.keys(EXIF.getAllTags(t)).length){console.log(EXIF.getAllTags(t));var e=EXIF.getAllTags(t);void 0!==e.GPSLatitude&&void 0!==e.GPSLongitude&&(e.GPSLatitude[0],e.GPSLatitude[1],e.GPSLatitude[2],e.GPSLongitude[0],e.GPSLongitude[1],e.GPSLongitude[2],e.GPSLatitudeRef,e.GPSLongitudeRef),"T"===e.GPSImgDirectionRef||"M"===e.GPSImgDirectionRef?(Math.PI,e.GPSImgDirection.numerator,e.GPSImgDirection.denominator):console.log("No compass data found"),console.log("Orientation:",e.Orientation),(6===e.Orientation||8===e.Orientation||3===e.Orientation)&&Math.PI,void 0!==e.GPSAltitude&&void 0!==e.GPSAltitudeRef&&void 0!==e.GPSAltitude&&void 0!==e.GPSAltitudeRef&&(e.GPSAltitude.numerator,e.GPSAltitude.denominator,e.GPSAltitudeRef)}else alert("EXIF initialized. Press again to view data in console.")}},92:function(){L.DistortHandle=L.EditHandle.extend({options:{TYPE:"distort",icon:L.icon({iconUrl:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAChSURBVO3BIU4DURgGwNkvL2B6AkQTLBqP4QCoSm7DDXoBLBZHDbfgICAIZjEV3YTn9uVHdMZZtcnCfI13bIzxg0emg6Nm6QVbYz3jylEsXRrvwommb49X67jFkz80fR9Mb1YxTzqiWBSLYlEsikWxKBbFolgUi2JRLIpFsSgWxaJY03fHHOu40dH07bAzWCx9Ge/TiWbpHgdsjPGNB2f/yS+7xRCyiiZPJQAAAABJRU5ErkJggg==",iconSize:[32,32],iconAnchor:[16,16]})},_onHandleDrag:function(){this._handled.setCorner(this._corner,this.getLatLng())},updateHandle:function(){this.setLatLng(this._handled.getCorner(this._corner))}}),L.distortHandle=function(t,e,i){return new L.DistortHandle(t,e,i)}},194:function(){L.DragHandle=L.EditHandle.extend({options:{TYPE:"drag",icon:L.icon({iconUrl:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAsVJREFUeNrMVztLXEEUvnNVFAVBAhY2aRKbTZEHJNpYabuNjSgYg/GxdsmPSJkUAa/ZdVEX8mgWYVutbHxAHkVskjQBuUUgBISVhCQk3wnfwMlk1rusN1wHPubOzJlzvjlz5sxc01Ma/hUEwQnwDIjqc7uvgv9YYO86qgIwCXQbdNTlQ8kcCBHgBch8TcloF6oJGr6phk6EQAkfdz3zvgDr9Mr7Fg1fptEZoM8jsmrokpfsiIFO4IIjuE2v1EDmR4LRdlR5Gh51hj8D34ABtm8YTtqna0TgklIw5CgQguKxIojEjmFROg/MKQO27NkFAB+4wAPouGUJiIvWKHwbAxX2XyWRKWkqhT+pbJntJZJuUzISW0+5hW+obxrVBsfvoH/dqCCJuU97GBh2VteLSiYvArmErT8EVoAK9Bw7enbpVYmvAQlyowYforrH5jXL2rPHI/TKONDB7u9AlavdaTBPvPmazUeQuy8f7UomUgTEwIJPEQ3sQGE/6ll2l9H/KcEzBcfWn2IclluM3DpddJxSHujlFkscbUPvmB0LHVnLrId7nlaZVkEc6QGXQI1MAwZcWmVRHeNaQwJMMiU2cwy4s7p/RJ2ckpvIQs+cIs+5GzitloLKHUV3MPREuXbTOKO91dX387gGTONxIgEWm+E61FFrpcyqXLHsEwiDjEsjAksqw5XPoL9MHVrn6QR4q+XZrDaR4RoWzq2ymafuRA/Mq1stSsHLVkcbdf9VjOcx8ZH3+SFWcCWlVPyWuUBOwUWdC1wP5NVjYiXFWLO69PZ6CRTUY6KSIoEKdf6T3IzzgHxnsyHctNBEkmn6Oob8ExUDg/ahGybd177cDjzH5xHwgDiSvoS7I/LZyvxJZj0wod7tkX5G0XVC7rEyLhfLJjBGbKoLLEfZWObyKeZ6oY82g+yf5Zn/mJyHX7PMf04z/T3/LcAAu4E6iiyJqf0AAAAASUVORK5CYII=",iconSize:[32,32],iconAnchor:[16,16]})},_onHandleDrag:function(){var t=this._handled,e=t.getCorner(this._corner),i=this.getLatLng();t.dragBy(e,i)},updateHandle:function(){this.setLatLng(this._handled.getCorner(this._corner))}}),L.dragHandle=function(t,e,i){return new L.DragHandle(t,e,i)}},988:function(){L.EditHandle=L.Marker.extend({initialize:function(t,e,i){var o=t.getCorner(e);L.setOptions(this,i),this._handled=t,this._corner=e;var n={draggable:!0,zIndexOffset:10};i&&i.hasOwnProperty("draggable")&&(n.draggable=i.draggable),L.Marker.prototype.initialize.call(this,o,n)},onAdd:function(t){L.Marker.prototype.onAdd.call(this,t),this._bindListeners(),this.updateHandle()},onRemove:function(t){this._unbindListeners(),L.Marker.prototype.onRemove.call(this,t)},_onHandleDragStart:function(){this._handled.fire("editstart")},_onHandleDragEnd:function(){this._fireEdit()},_fireEdit:function(){this._handled.edited=!0,this._handled.fire("edit")},_bindListeners:function(){this.on({contextmenu:L.DomEvent.stop,dragstart:this._onHandleDragStart,drag:this._onHandleDrag,dragend:this._onHandleDragEnd},this),this._handled._map.on("zoomend",this.updateHandle,this),this._handled.on("update",this.updateHandle,this)},_unbindListeners:function(){this.off({contextmenu:L.DomEvent.stop,dragstart:this._onHandleDragStart,drag:this._onHandleDrag,dragend:this._onHandleDragEnd},this),this._handled._map.off("zoomend",this.updateHandle,this),this._handled.off("update",this.updateHandle,this)},_calculateScalingFactor:function(t,e){var i=this._handled,o=i._map,n=o.latLngToLayerPoint(i.getCenter()),a=o.latLngToLayerPoint(t),s=o.latLngToLayerPoint(e),r=this._d2(n,a),l=this._d2(n,s);return Math.sqrt(l/r)},_d2:function(t,e){var i=t.x-e.x,o=t.y-e.y;return Math.pow(i,2)+Math.pow(o,2)},calculateAngleDelta:function(t,e){var i=this._handled,o=i._map,n=o.latLngToLayerPoint(i.getCenter()),a=o.latLngToLayerPoint(t),s=o.latLngToLayerPoint(e),r=Math.atan2(n.y-a.y,n.x-a.x);return Math.atan2(n.y-s.y,n.x-s.x)-r}})},206:function(){L.FreeRotateHandle=L.EditHandle.extend({options:{TYPE:"freeRotate",icon:L.icon({iconUrl:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAHiSURBVMXBa3HbShgA0PMp/1sCCo8oCEpgTaCXgIXAJiDzyCJoAUTm4UVQAns1Y8+snWnTvJyeE16hkjDgDrfoNTMKcpC9UPiLSo8JyetkjEHxjPCMyoS199kFoz8Iv1HpMaN3qWDCHoegOKkkRwnJpRmroHgiPFEZ8IBekzEGxQtUEhKSS/fB7Ew4U+lxcGkVZG9QWWPSFAxBcdK59KApuA+yNwp2uEdx1GN25sZJZULSfAtm77SlbNjju6MvG75u+WHRWVR6rDVjMPsgwYyVZl3pLTpHkyYHOx8syMiayaJzlDTZ9YyaZNFVkiYH2ZUEBcVJJXVImuz6Js3Qofe59pq7DoOTILu+g+a288mCouk7/1iH4qTS+2QdDppbV1ZJmrnDXnPnc5UOs2Z0fUmTuyBr+krvSioJyUmQO0dZM7mepMkWnaNRkyrJB6uskTSjxY3Fll8bvmJwlDb83FJ8gMqAB80uyBY3Trb82PAfvjj6vuHnluIdKgMeNXOwctK5NKBoHitrb1RJeHRp5Ux4ojLg0aWMHGQvUOkxIWkKVsHsTPiNSo8HDC5lZIsgO6n0uMUdRvQuFQxB8UR4RmXC2vvsgtEfhL+o9JiQvE7GGBTPCK9QSUjoMWgKDthjDrIX+h/k0I7gth6N5gAAAABJRU5ErkJggg==",iconSize:[32,32],iconAnchor:[16,16]})},_onHandleDrag:function(){var t=this._handled,e=t._map,i=t.getCorner(this._corner),o=this.getLatLng(),n=this.calculateAngleDelta(i,o),a=this._calculateScalingFactor(i,o);0!==n&&t.rotateBy(n,"rad");var s=t.edgeMinWidth;s||(s=50);var r=e.latLngToContainerPoint(t.getCorner(0)),l=e.latLngToContainerPoint(t.getCorner(1)),c=Math.abs(r.x-l.x),d=Math.abs(r.y-l.y);Math.sqrt(c*c+d*d)>s||a>1?t.scaleBy(a):t.scaleBy(1)},updateHandle:function(){this.setLatLng(this._handled.getCorner(this._corner))}}),L.freeRotateHandle=function(t,e,i){return new L.FreeRotateHandle(t,e,i)}},789:function(){L.LockHandle=L.EditHandle.extend({options:{TYPE:"lock",interactive:!1,icon:L.icon({iconUrl:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAD8SURBVO3BPU7CYAAA0AdfjIcQlRCQBG7C3gk2uIPG2RC3Dk16Gz0FTO1WZs/gwGCMP/2+xsSl7+n1er1Iz9LtRQjaPeMeO+TinLDCJV78YqjdA04YodKuxhUaPGoRxMmxwRQZSt87Yo4KExGCeAUyLLFB4bMacxywEClIU2KDKXbInTUYo8JCgoFuGoxQO5uiwY1EA91VmDqrcKeDoX8WdNNgjApvmGGLXKIgXY0xGkxQYItrrFFIEKQ5Yo4KEx9yrDFDhlKkIF6NOQ5Y+KpAhiXWKEQI4pxwiwoLPyuxwQw75FoE7fZYocFEuwI7jHCBV39gL92TXq/Xi/AOcmczZmaIMScAAAAASUVORK5CYII=",iconSize:[32,32],iconAnchor:[16,16]})},onRemove:function(t){this.unbindTooltip(),L.EditHandle.prototype.onRemove.call(this,t)},_bindListeners:function(){var t=this.getElement();L.EditHandle.prototype._bindListeners.call(this),L.DomEvent.on(t,{mousedown:this._tooltipOn,mouseup:this._tooltipOff},this),L.DomEvent.on(document,"pointerleave",this._tooltipOff,this)},_unbindListeners:function(){var t=this.getElement();L.EditHandle.prototype._bindListeners.call(this),L.DomEvent.off(t,{mousedown:this._tooltipOn,mouseup:this._tooltipOff},this),L.DomEvent.off(document,"pointerleave",this._tooltipOff,this)},_onHandleDrag:function(){},updateHandle:function(){this.setLatLng(this._handled.getCorner(this._corner))},_tooltipOn:function(t){var e=this._handled.parentGroup,i=e?e.editing:this._handled.editing;if(!t.shiftKey&&(this._handled.isSelected()||!e||e.isCollected(this._handled))){var o=i._lockHandles;this._timer=setTimeout(L.bind((function(){this._timeout&&clearTimeout(this._timeout),this.getTooltip()?o.eachLayer((function(t){this!==t&&t.closeTooltip()})):this.bindTooltip("Locked!",{permanent:!0}),this.openTooltip()}),this),500)}},_tooltipOff:function(t){var e=this._handled.parentGroup,i=e?e.editing:this._handled.editing;if(!t.shiftKey&&(this._handled.isSelected()||!e||e.isCollected(this._handled))){var o=i._lockHandles;t.currentTarget===document&&o.eachLayer((function(t){t.closeTooltip()})),this._timer&&clearTimeout(this._timer),this._timeout=setTimeout(L.bind((function(){this.closeTooltip()}),this),400)}}}),L.lockHandle=function(t,e,i){return new L.LockHandle(t,e,i)}},337:function(){L.RotateHandle=L.EditHandle.extend({options:{TYPE:"rotate",icon:L.icon({iconUrl:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAHiSURBVMXBa3HbShgA0PMp/1sCCo8oCEpgTaCXgIXAJiDzyCJoAUTm4UVQAns1Y8+snWnTvJyeE16hkjDgDrfoNTMKcpC9UPiLSo8JyetkjEHxjPCMyoS199kFoz8Iv1HpMaN3qWDCHoegOKkkRwnJpRmroHgiPFEZ8IBekzEGxQtUEhKSS/fB7Ew4U+lxcGkVZG9QWWPSFAxBcdK59KApuA+yNwp2uEdx1GN25sZJZULSfAtm77SlbNjju6MvG75u+WHRWVR6rDVjMPsgwYyVZl3pLTpHkyYHOx8syMiayaJzlDTZ9YyaZNFVkiYH2ZUEBcVJJXVImuz6Js3Qofe59pq7DoOTILu+g+a288mCouk7/1iH4qTS+2QdDppbV1ZJmrnDXnPnc5UOs2Z0fUmTuyBr+krvSioJyUmQO0dZM7mepMkWnaNRkyrJB6uskTSjxY3Fll8bvmJwlDb83FJ8gMqAB80uyBY3Trb82PAfvjj6vuHnluIdKgMeNXOwctK5NKBoHitrb1RJeHRp5Ux4ojLg0aWMHGQvUOkxIWkKVsHsTPiNSo8HDC5lZIsgO6n0uMUdRvQuFQxB8UR4RmXC2vvsgtEfhL+o9JiQvE7GGBTPCK9QSUjoMWgKDthjDrIX+h/k0I7gth6N5gAAAABJRU5ErkJggg==",iconSize:[32,32],iconAnchor:[16,16]})},_onHandleDrag:function(){var t=this._handled,e=t.getCorner(this._corner),i=this.getLatLng(),o=this.calculateAngleDelta(e,i);t.rotateBy(o,"rad")},updateHandle:function(){this.setLatLng(this._handled.getCorner(this._corner))}}),L.rotateHandle=function(t,e,i){return new L.RotateHandle(t,e,i)}},350:function(){L.ScaleHandle=L.EditHandle.extend({options:{TYPE:"scale",icon:L.icon({iconUrl:"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2ZXJzaW9uPSIxLjEiIHdpZHRoPSI0NTkiIGhlaWdodD0iNDY0IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCA1MTIgNTEyIiB4bWw6c3BhY2U9InByZXNlcnZlIiBzdHlsZT0iIj48cmVjdCBpZD0iYmFja2dyb3VuZHJlY3QiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIHg9IjAiIHk9IjAiIGZpbGw9Im5vbmUiIHN0cm9rZT0ibm9uZSIgY2xhc3M9IiIgc3R5bGU9IiIvPjxnIGNsYXNzPSJjdXJyZW50TGF5ZXIiIHN0eWxlPSIiPjx0aXRsZT5MYXllciAxPC90aXRsZT48cGF0aCBkPSJNNDU5LjA0OTE1OTUzMDQ3MTM0LDg2LjkyNjIzNDUxMjU1MDAyIFYwIGgtODUuNzE0NTczMzU2MzEyMDkgdjI3LjA0MzcxNzQwMzkwNDQ1MiBIODUuNzE0NTczMzU2MzEyMDMgVjAgSDAgdjg2LjkyNjIzNDUxMjU1MDAyIGgyNS43MTQzNzIwMDY4OTM2MjYgdjI4OS43NTQxMTUwNDE4MzM0IEgwIHY4Ni45MjYyMzQ1MTI1NTAwMiBoODUuNzE0NTczMzU2MzEyMDkgdi0yNy4wNDM3MTc0MDM5MDQ0NTIgaDI4NS43MTUyNDQ1MjEwNDAzIHYyNy4wNDM3MTc0MDM5MDQ0NTIgaDg1LjcxNDU3MzM1NjMxMjA5IHYtODYuOTI2MjM0NTEyNTUwMDIgaC0yMy44MDk2MDM3MTAwODY2OSBWODYuOTI2MjM0NTEyNTUwMDIgSDQ1OS4wNDkxNTk1MzA0NzEzNCB6TTM4NC43NjMxOTU5NTUwMDA5LDEyLjU1NjAxMTY1MTgxMjc4MSBoNjEuOTA0OTY5NjQ2MjI1Mzk2IHY2Mi43ODAwNTgyNTkwNjM5MSBoLTYxLjkwNDk2OTY0NjIyNTM5NiBWMTIuNTU2MDExNjUxODEyNzgxIHpNMTIuMzgwOTkzOTI5MjQ1MDUsMTIuNTU2MDExNjUxODEyNzgxIGg2MS45MDQ5Njk2NDYyMjUzOTYgdjYyLjc4MDA1ODI1OTA2MzkxIEgxMi4zODA5OTM5MjkyNDUwNSBWMTIuNTU2MDExNjUxODEyNzgxIHpNNzQuMjg1OTYzNTc1NDcwNTMsNDUxLjA1MDU3MjQxNTEyMDY2IEgxMi4zODA5OTM5MjkyNDUwNSB2LTYyLjc4MDA1ODI1OTA2MzkxIGg2MS45MDQ5Njk2NDYyMjUzOTYgVjQ1MS4wNTA1NzI0MTUxMjA2NiB6TTQ0NS43MTU3ODE0NTI4MjI3NCw0NTEuMDUwNTcyNDE1MTIwNjYgaC02Mi44NTczNTM3OTQ2Mjg4NjQgdi02Mi43ODAwNTgyNTkwNjM5MSBoNjIuODU3MzUzNzk0NjI4ODY0IFY0NTEuMDUwNTcyNDE1MTIwNjYgek00MDcuNjIwNDE1NTE2Njg0MjYsMzc2LjY4MDM0OTU1NDM4MzQ0IGgtMzYuMTkwNTk3NjM5MzMxNzcgdjMyLjgzODc5OTcwNDc0MTEyIEg4NS43MTQ1NzMzNTYzMTIwMyB2LTMyLjgzODc5OTcwNDc0MTEyIEg0OS41MjM5NzU3MTY5ODAzMiBWODYuOTI2MjM0NTEyNTUwMDIgaDM2LjE5MDU5NzYzOTMzMTc3IFY1MC4yMjQwNDY2MDcyNTExMjUgaDI4Ny42MjAwMTI4MTc4NDcyIHYzNi43MDIxODc5MDUyOTg5IGgzNC4yODU4MjkzNDI1MjQ4MzUgVjM3Ni42ODAzNDk1NTQzODM0NCB6IiBpZD0ic3ZnXzIiIGNsYXNzPSIiIGZpbGw9IiMxYTFhZWIiIGZpbGwtb3BhY2l0eT0iMSIvPjwvZz48L3N2Zz4=",iconSize:[32,32],iconAnchor:[16,16]})},_onHandleDrag:function(){var t=this._handled,e=t._map,i=t.edgeMinWidth,o=t.getCorner(this._corner),n=this.getLatLng(),a=this._calculateScalingFactor(o,n);i||(i=50);var s=e.latLngToLayerPoint(t.getCorner(0)),r=e.latLngToLayerPoint(t.getCorner(1)),l=Math.abs(s.x-r.x),c=Math.abs(s.y-r.y);Math.sqrt(l*l+c*c)>i||a>1?t.scaleBy(a):t.scaleBy(1)},updateHandle:function(){this.setLatLng(this._handled.getCorner(this._corner))}}),L.scaleHandle=function(t,e,i){return new L.ScaleHandle(t,e,i)}},719:function(){L.distortableImage=L.DistortableImage||{},L.distortableImage=L.DistortableImage,L.DistortableImage.group_action_map={},L.DistortableImage.ControlBar=L.Toolbar2.Control.extend({}),L.distortableImage.controlBar=function(t){return new L.DistortableImage.ControlBar(t)},L.DistortableCollection.addInitHook((function(){this.ACTIONS=[L.ExportAction,L.DeleteAction,L.LockAction,L.UnlockAction],L.DistortableCollection.Edit.MODES={lock:L.LockAction,unlock:L.UnlockAction};var t=this.options.actions?this.options.actions:this.ACTIONS;this.editing=L.distortableCollection.edit(this,{actions:t})}))},93:function(){L.DistortableImage=L.DistortableImage||{},L.distortableImage=L.DistortableImage,L.DistortableImage.action_map={},L.DistortableImage.PopupBar=L.Toolbar2.Popup.extend({options:{anchor:[0,-10]},initialize:function(t,e){L.setOptions(this,e),L.Toolbar2.Popup.prototype.initialize.call(this,t,e)},addHooks:function(t,e){this.map=t,this.ov=e},tools:function(){if(this._ul)return this._ul.children},clickTool:function(t){for(var e=this.tools(),i=0;i',_symbols:"",render:function(){return this.addSymbols(this._symbols),this._svg},addSymbols:function(t){this._svg+=t}})},261:function(){L.KeymapperIconSet=L.IconSet.extend({_symbols:''})},929:function(){L.ToolbarIconSet=L.IconSet.extend({_symbols:''})},496:function(){L.Map.mergeOptions({boxCollector:!0,boxZoom:!1}),L.Map.BoxCollector=L.Map.BoxZoom.extend({initialize:function(t){this._map=t,this._container=t._container,this._pane=t._panes.overlayPane,this._resetStateTimeout=0,t.on("unload",this._destroy,this)},addHooks:function(){L.DomEvent.on(this._container,"mousedown",this._onMouseDown,this)},removeHooks:function(){L.DomEvent.off(this._container,"mousedown",this._onMouseDown,this)},moved:function(){return this._moved},_destroy:function(){L.DomUtil.remove(this._pane),delete this._pane},_resetState:function(){this._resetStateTimeout=0,this._moved=!1},_clearDeferredResetState:function(){0!==this._resetStateTimeout&&(clearTimeout(this._resetStateTimeout),this._resetStateTimeout=0)},_onMouseDown:function(t){if(!t.shiftKey||1!==t.which&&1!==t.button)return!1;this._clearDeferredResetState(),this._resetState(),L.DomUtil.disableTextSelection(),L.DomUtil.disableImageDrag(),this._startPoint=this._map.mouseEventToContainerPoint(t),L.DomEvent.on(document,{contextmenu:L.DomEvent.stop,mousemove:this._onMouseMove,mouseup:this._onMouseUp},this)},_onMouseMove:function(t){this._moved||(this._moved=!0,this._box=L.DomUtil.create("div","leaflet-zoom-box",this._container),L.DomUtil.addClass(this._container,"leaflet-crosshair"),this._map.fire("boxzoomstart")),this._point=this._map.mouseEventToContainerPoint(t),this._bounds=L.bounds(this._startPoint,this._point);var e=this._bounds.getSize();L.DomUtil.setPosition(this._box,this._bounds.min),this._box.style.width=e.x+"px",this._box.style.height=e.y+"px"},_finish:function(){this._moved&&(L.DomUtil.remove(this._box),L.DomUtil.removeClass(this._container,"leaflet-crosshair")),L.DomUtil.enableTextSelection(),L.DomUtil.enableImageDrag(),L.DomEvent.off(document,{contextmenu:L.DomEvent.stop,mousemove:this._onMouseMove,mouseup:this._onMouseUp},this)},_onMouseUp:function(t){if((1===t.which||1===t.button)&&(this._finish(),this._moved)){this._clearDeferredResetState(),this._resetStateTimeout=setTimeout(L.Util.bind(this._resetState,this),0);var e=L.latLngBounds(this._map.containerPointToLatLng(this._bounds.getBottomLeft()),this._map.containerPointToLatLng(this._bounds.getTopRight())),i=this._map.getZoom(),o=this._map.getCenter();e=this._map._latLngBoundsToNewLayerBounds(e,i,o),this._map.fire("boxcollectend",{boxCollectBounds:e})}}}),L.Map.addInitHook("addHandler","boxCollector",L.Map.BoxCollector)},291:function(){L.Map.mergeOptions({doubleClickLabels:!0}),L.Map.DoubleClickLabels=L.Map.DoubleClickZoom.extend({enable:function(){var t=this._map;return this._enabled||(t.doubleClickZoom.enabled()&&t.doubleClickZoom.disable(),this._map.fire("singleclickon"),this._enabled=!0,this.addHooks()),this},disable:function(){return this._enabled?(this._enabled=!1,this.removeHooks(),this):this},_fireIfSingle:function(t){var e=this._map,i=t.originalEvent;i&&i.shiftKey||(e._clicked+=1,this._map._clickTimeout=setTimeout((function(){1===e._clicked?(e._clicked=0,e.fire("singleclick",{type:"singleclick"})):L.Browser.touch&&i&&i.sourceCapabilities.firesTouchEvents&&e.fire("dblclick")}),250))},_onDoubleClick:function(){var t=this._map,e=t._labels;setTimeout((function(){t._clicked=0,clearTimeout(t._clickTimeout)}),0),e&&(1===e.options.opacity?(e.options.opacity=0,e.setOpacity(0)):(e.options.opacity=1,e.setOpacity(1)))}}),L.Map.addInitHook("addHandler","doubleClickLabels",L.Map.DoubleClickLabels)},752:function(){L.Map.DoubleClickZoom.include({addHooks:function(){this._map.on({click:this._fireIfSingle,dblclick:this._onDoubleClick},this)},removeHooks:function(){this._map.off({click:this._fireIfSingle,dblclick:this._onDoubleClick},this)},enable:function(){return this._enabled||this._map.doubleClickLabels&&this._map.doubleClickLabels.enabled()||(this._map.fire("singleclickon"),this._enabled=!0,this.addHooks()),this},disable:function(){return this._enabled?(this._map.fire("singleclickoff"),this._enabled=!1,this.removeHooks(),this):this},_fireIfSingle:function(t){var e=this._map,i=t.originalEvent;i&&i.shiftKey||(e._clicked+=1,this._map._clickTimeout=setTimeout((function(){1===e._clicked?(e._clicked=0,e.fire("singleclick",{type:"singleclick"})):L.Browser.touch&&i&&i.sourceCapabilities.firesTouchEvents&&e._fireDOMEvent(i,"dblclick",[e])}),250))},_onDoubleClick:function(t){var e=this._map,i=t.originalEvent;if(setTimeout((function(){e._clicked=0,clearTimeout(e._clickTimeout)}),0),!i)return!1;var o=e.getZoom(),n=e.options.zoomDelta,a=i.shiftKey?o-n:o+n;"center"===e.options.doubleClickZoom?e.setZoom(a):e.setZoomAround(t.containerPoint,a)}})},131:function(){L.Map.include({_clicked:0,addGoogleMutant:function(t){return(t=this.mutantOptions=L.extend({mutantOpacity:.8,maxZoom:24,maxNativeZoom:20,minZoom:0,labels:!0,labelOpacity:1,doubleClickLabels:!0},t)).labels||(this.mutantOptions=L.extend(this.mutantOptions,{labelOpacity:t.labels?1:void 0,doubleClickLabels:!!t.labels||void 0})),this._googleMutant=L.tileLayer("http://mt0.google.com/vt/lyrs=s&x={x}&y={y}&z={z}",{maxZoom:t.maxZoom,maxNativeZoom:t.maxNativeZoom,minZoom:t.minZoom,opacity:t.mutantOpacity}).addTo(this),t.labels?this._addLabels(t):this.doubleClickLabels=void 0,this},_addLabels:function(t){return 0!==t.labelOpacity&&1!==t.labelOpacity&&(t.labelOpacity=1),this._labels=L.tileLayer("https://stamen-tiles-{s}.a.ssl.fastly.net/toner-labels/{z}/{x}/{y}{r}.{ext}",{attribution:'Map tiles by Stamen Design, CC BY 3.0 — Map data © OpenStreetMap contributors',subdomains:"abcd",interactive:!1,opacity:t.labelOpacity,maxZoom:t.maxZoom,maxNativeZoom:t.maxNativeZoom,minZoom:t.minZoom,ext:"png"}).addTo(this),this.mutantOptions.doubleClickLabels&&this.doubleClickLabels.enable(),this}}),L.Map.addInitHook((function(){this.doubleClickLabels.disable(),this.doubleClickZoom.enable()}))},999:function(){L.DomUtil=L.extend(L.DomUtil,{initTranslation:function(t){this.translation=t},getMatrixString:function(t){var e=L.Browser.webkit3d||L.Browser.gecko3d||L.Browser.ie3d,i=[t[0],t[3],0,t[6],t[1],t[4],0,t[7],0,0,1,0,t[2],t[5],0,t[8]],o=e?"matrix3d("+i.join(",")+")":"";return e||console.log("Your browser must support 3D CSS transformsin order to use DistortableImageOverlay."),o},toggleClass:function(t,e){var i=e;return this.hasClass(t,i)?this.removeClass(t,i):this.addClass(t,i)},confirmDelete:function(){return window.confirm(this.translation.confirmImageDelete)},confirmDeletes:function(t){if(1===t)return this.confirmDelete();var e,i=this.translation.confirmImagesDeletes;return e="function"==typeof i?i(t):i,window.confirm(e)}})},85:function(){L.IconUtil={create:function(t){return/^#/.test(t)&&(t=t.replace(/^#/,"")),''},addClassToSvg:function(t,e){var i=t.querySelector("svg");i&&L.DomUtil.addClass(i,e)},toggleXlink:function(t,e,i){/^#/.test(e)||(e="#"+e),/^#/.test(i)||(i="#"+i);var o=t.querySelector("use");if(o){var n=o.getAttribute("xlink:href")===e?i:e;return o.setAttribute("xlink:href",n),n}return!1},toggleTitle:function(t,e,i){var o=t.getAttribute("title")===e?i:e;return t.setAttribute("title",o),t.hasAttribute("aria-label")&&t.setAttribute("aria-label",o),o}}},351:function(){L.ImageUtil={getCmPerPixel:function(t){var e=t._map;return 100*e.latLngToLayerPoint(t.getCorner(0)).distanceTo(e.latLngToLayerPoint(t.getCorner(1)))/t.getElement().width}}},360:function(){L.MatrixUtil={adj:function(t){return[t[4]*t[8]-t[5]*t[7],t[2]*t[7]-t[1]*t[8],t[1]*t[5]-t[2]*t[4],t[5]*t[6]-t[3]*t[8],t[0]*t[8]-t[2]*t[6],t[2]*t[3]-t[0]*t[5],t[3]*t[7]-t[4]*t[6],t[1]*t[6]-t[0]*t[7],t[0]*t[4]-t[1]*t[3]]},multmm:function(t,e){var i,o=[];for(i=0;i<3;i++)for(var n=0;n<3;n++){for(var a=0,s=0;s<3;s++)a+=t[3*i+s]*e[3*s+n];o[3*i+n]=a}return o},multmv:function(t,e){return[t[0]*e[0]+t[1]*e[1]+t[2]*e[2],t[3]*e[0]+t[4]*e[1]+t[5]*e[2],t[6]*e[0]+t[7]*e[1]+t[8]*e[2]]},multsm:function(t,e){for(var i=[],o=0,n=e.length;o2&&void 0!==arguments[2]?arguments[2]:"deg";return"deg"===i?this.radiansToDegrees(Math.atan2(e,t)):Math.atan2(e,t)},radiansToDegrees:function(t){return 180*t/Math.PI},degreesToRadians:function(t){return t*Math.PI/180}}},866:function(){L.Utils={initTranslation:function(){var t={deleteImage:"Delete Image",deleteImages:"Delete Images",distortImage:"Distort Image",dragImage:"Drag Image",exportImage:"Export Image",exportImages:"Export Images",removeBorder:"Remove Border",addBorder:"Add Border",freeRotateImage:"Free rotate Image",geolocateImage:"Geolocate Image",lockMode:"Lock Mode",lockImages:"Lock Images",makeImageOpaque:"Make Image Opaque",makeImageTransparent:"Make Image Transparent",restoreImage:"Restore Natural Image",rotateImage:"Rotate Image",scaleImage:"Scale Image",stackToFront:"Stack to Front",stackToBack:"Stack to Back",unlockImages:"Unlock Images",confirmImageDelete:"Are you sure? This image will be permanently deleted from the map.",confirmImagesDeletes:"Are you sure? These images will be permanently deleted from the map."};if(this.options.translation)for(var e in t)this.options.translation.hasOwnProperty(e)||(this.options.translation[e]=t[e]);else this.options.translation=t;L.DomUtil.initTranslation(this.options.translation)},getNestedVal:function(t,e,i){return[e,i].reduce((function(t,e){return t&&t[e]}),t)}}}};t[999](),t[85](),t[351](),t[360](),t[682](),t[866](),t[477](),t[808](),t[743](),t[988](),t[92](),t[194](),t[206](),t[789](),t[337](),t[350](),t[376](),t[261](),t[929](),t[280](),t[426](),t[114](),t[231](),t[541](),t[149](),t[74](),t[691](),t[105](),t[944](),t[954](),t[178](),t[547](),t[886](),t[129](),t[93](),t[719](),t[397](),t[428](),t[782](),t[752](),t[496](),t[291](),t[131]()}(); //# sourceMappingURL=leaflet.distortableimage.js.map \ No newline at end of file diff --git a/examples/archive.css b/examples/archive.css deleted file mode 100644 index 11d957a15..000000000 --- a/examples/archive.css +++ /dev/null @@ -1,20 +0,0 @@ -.distortableImageTooltip { - position: relative; - display: inline-block; - border-bottom: 1px white; - z-index: 1800; - position: absolute; -} - -/* .tooltipText { - width: 120px; - bottom: 100%; - left: 50%; - margin-left: -60px; - visibility: hidden; - background-color: #fff; - color: red; - text-align: center; - padding: 5px 0; - border-radius: 6px; -} */ \ No newline at end of file diff --git a/examples/archive.html b/examples/archive.html index 3d839ba83..6ba5a51ab 100644 --- a/examples/archive.html +++ b/examples/archive.html @@ -12,7 +12,6 @@ - diff --git a/examples/js/archive.js b/examples/js/archive.js index e21557ef0..0bf3549d5 100644 --- a/examples/js/archive.js +++ b/examples/js/archive.js @@ -1,6 +1,4 @@ let map; -let image; -let imageOverlaytooltipText; const welcomeModal = document.getElementById('welcomeModal'); const tileMap = document.getElementById('map'); const restoreWelcomeModal = document.getElementById('restoreWelcomeModalBtn'); @@ -10,9 +8,6 @@ const input = document.getElementById('input'); const responseText = document.getElementById('response'); const imageContainer = document.getElementById('imgContainer'); const mapToggle = document.getElementById('mapToggle'); -// const imageOverlaytooltip = document.getElementById('imageOverlaytooltip'); -// const tooltipText = document.getElementById('tooltiptext'); - const setupMap = () => { map = L.map('map').setView([51.505, -0.09], 13); @@ -96,7 +91,6 @@ function showImages(getUrl) { if (response.data.files && response.data.files.length != 0) { response.data.files.forEach((file) => { renderImages(file, url); - imageOverlaytooltipText = response.data.metadata.description; // <= SEGUN }); responseText.innerHTML = imageCount ? `${imageCount} image(s) fetched successfully from ${fetchedFrom.innerHTML}.` : 'No images found in the link provided...'; } else { @@ -128,43 +122,23 @@ tileMap.addEventListener('click', (event) => { bootstrap.Offcanvas.getInstance(sidebar).hide(); }); -// --------------------------------------------------------------------------------------------- -// OPTION 1 - Runs independently of OPTION 2 +function getImageName(imageURL) { + startIndex = imageURL.lastIndexOf('/') + 1; + endIndex = imageURL.lastIndexOf('.'); + const imageName = imageURL.substring(startIndex, endIndex); + + return imageName; +} + document.addEventListener('click', (event) => { if (event.target.classList.contains('place-button')) { const imageURL = event.target.previousElementSibling.src; - // const image = L.distortableImageOverlay( - image = L.distortableImageOverlay( // <= SEGUN + const imageTooltipText = getImageName(imageURL); + + const image = L.distortableImageOverlay( imageURL, - {tooltipText: imageOverlaytooltipText} + {tooltipText: imageTooltipText} ); map.imgGroup.addLayer(image); } }); - -// --------------------------------------------------------------------------------------------- -// OPTION 2.1 - To run this option, uncomment OPTION 1 above too as well -// document.addEventListener('mousemove', (event) => { -// if (event.target.classList.contains('leaflet-image-layer')) { -// if (!image.isSelected()) { -// const xPos = event.layerX; -// const yPos = event.layerY; - -// tooltipText.textContent = imageOverlaytooltipText; -// imageOverlaytooltip.style.position = 'absolute'; -// imageOverlaytooltip.style.left = (xPos - 60) +'px'; -// imageOverlaytooltip.style.top = (yPos - 40) +'px'; -// imageOverlaytooltip.hidden = false; -// } - -// if (image.isSelected()) { -// imageOverlaytooltip.hidden = true; -// } -// } -// }); - -// document.addEventListener('mouseout', (event) => { -// if (event.target.classList.contains('leaflet-image-layer')) { -// imageOverlaytooltip.hidden = true; -// } -// }); diff --git a/src/DistortableImageOverlay.js b/src/DistortableImageOverlay.js index 25b431560..35dc60ff5 100644 --- a/src/DistortableImageOverlay.js +++ b/src/DistortableImageOverlay.js @@ -8,10 +8,8 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ editable: true, mode: 'distort', selected: false, - // SEGUN ------------------------------------------------------------------------------------------------------------------------------ interactive: true, - tooltipText: 'Unknow image', // default tooltipText - // SEGUN ------------------------------------------------------------------------------------------------------------------------------ + tooltipText: 'Unknow image', }, initialize(url, options) { @@ -23,10 +21,8 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ this._selected = this.options.selected; this._url = url; this.rotation = {}; - // SEGUN ------------------------------------------------------------------------------------------------------------------------------ this.interactive = this.options.interactive; - this.tooltipText = options.tooltipText; - // SEGUN ------------------------------------------------------------------------------------------------------------------------------ + this.tooltipText = this.options.tooltipText; }, onAdd(map) { @@ -90,9 +86,7 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ this.fire('add'); - // SEGUN ------------------------------------------------------------------------------------------------------------------------------ - L.DomEvent.on(this.getElement(), 'mouseover mousemove', this._activateTooltip, this); - + L.DomEvent.on(this.getElement(), 'mousemove', this._activateTooltip, this); L.DomEvent.on(this.getElement(), 'mouseout', this._closeTooltip, this); }, @@ -110,9 +104,7 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ L.ImageOverlay.prototype.onRemove.call(this, map); - // SEGUN ----------------------------------------------------------------------------------------------------------------------------- L.DomEvent.off(this.getElement(), 'mouseover', this._deactivateTooltip, this); - // ENDS ------------------------------------------------------------------------------------------------------------------------------ }, _initImageDimensions() { @@ -163,7 +155,7 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ }, isSelected() { - return this._selected; // this._selected + return this._selected; }, deselect() { @@ -244,21 +236,9 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ } }, - // SEGUN ------------------------------------------------------------------------------------------------------------------------------- _activateTooltip(ev) { - // let index = 0; - // const xAxis = []; // stores previous values of x coordinate - // const yAxis = []; // stores previous values of y coordinate, may be needed later - // let newPosX = 0; - console.log('ev.x: ', ev.x, 'ev.y: ', ev.y); if (!this._selected) { - // xAxis[index] = ev.x; - // yAxis[index] = ev.y; // May be needed later - // ++index; - this.bindTooltip(this.tooltipText, {direction: 'top'}).openTooltip(); - // {sticky: true, direction: 'top', offset: L.point([ev.x - xAxis[index-1], ev.y])}).openTooltip(); - cursor consistently in same X-axis for each y-axis position - // {sticky: true, direction: 'top', offset: L.point([ev.x - 700, ev.y - 500])}).openTooltip(); } }, @@ -269,7 +249,6 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ _deactivateTooltip() { this.unbindTooltip(); }, - // ENDS ------------------------------------------------------------------------------------------------------------------------------ setCorners(latlngObj) { const map = this._map; From 96ad807f4c9fcb1172943ec8e5f6ec86f474499b Mon Sep 17 00:00:00 2001 From: segun Date: Mon, 16 Jan 2023 21:32:13 +0100 Subject: [PATCH 43/57] Quick cleanup --- examples/archive.html | 1 - examples/js/export.js | 2 -- examples/js/index.js | 1 - examples/js/listeners.js | 1 - examples/js/local.js | 1 - examples/js/select.js | 4 ---- 6 files changed, 10 deletions(-) diff --git a/examples/archive.html b/examples/archive.html index 6ba5a51ab..d27604f1c 100644 --- a/examples/archive.html +++ b/examples/archive.html @@ -61,7 +61,6 @@
-
diff --git a/examples/js/export.js b/examples/js/export.js index 6ebd66225..4891e3983 100644 --- a/examples/js/export.js +++ b/examples/js/export.js @@ -13,7 +13,6 @@ let map; L.latLng(51.50, -0.10), ], mode: 'lock', - tooltipText: 'Aerial map of NY', }); // create a second image @@ -26,7 +25,6 @@ let map; ], mode: 'freeRotate', suppressToolbar: true, - tooltipText: 'Aerial map of NY', }); let json = [{'nodes': [ diff --git a/examples/js/index.js b/examples/js/index.js index 182894360..bfea75aec 100644 --- a/examples/js/index.js +++ b/examples/js/index.js @@ -8,7 +8,6 @@ let map; img = L.distortableImageOverlay('example.jpg', { selected: true, fullResolutionSrc: 'large.jpg', - tooltipText: 'Aerial map of NY', // is it actually New York?? ...hardcoded into place since it's for example purposes only }).addTo(map); }); })(); diff --git a/examples/js/listeners.js b/examples/js/listeners.js index c14c037fd..39a96829e 100644 --- a/examples/js/listeners.js +++ b/examples/js/listeners.js @@ -7,7 +7,6 @@ let map; map.whenReady(function() { img = L.distortableImageOverlay('example.jpg', { selected: true, - tooltipText: 'Aerial map of NY', }).addTo(map); // Wait until image is loaded before setting up DOM element listeners diff --git a/examples/js/local.js b/examples/js/local.js index bd3af73d1..1d3144792 100644 --- a/examples/js/local.js +++ b/examples/js/local.js @@ -39,7 +39,6 @@ const loadMap = (image) => { img = L.distortableImageOverlay(image, { selected: true, fullResolutionSrc: 'large.jpg', - tooltipText: 'Aerial map of NY', }).addTo(map); }); }; diff --git a/examples/js/select.js b/examples/js/select.js index f4eccd6f7..9b2639d1d 100644 --- a/examples/js/select.js +++ b/examples/js/select.js @@ -13,7 +13,6 @@ let map; L.latLng(51.50, -0.10), ], mode: 'lock', - tooltipText: 'Aerial map of NY', }); // create a second image @@ -26,7 +25,6 @@ let map; ], mode: 'freeRotate', suppressToolbar: true, - tooltipText: 'Aerial map of NY', }); img3 = L.distortableImageOverlay('example.jpg', { @@ -44,7 +42,6 @@ let map; L.DeleteAction, L.StackAction, ], - tooltipText: 'Aerial map of NY', }); img4 = L.distortableImageOverlay('example.jpg', { @@ -64,7 +61,6 @@ let map; L.latLng(51.49, -0.08), L.latLng(51.49, -0.04), ], - tooltipText: 'Aerial map of NY', }); imgGroup = L.distortableCollection().addTo(map); From 0a0807dc6c59a5bb7e30baa726322cb665ed937b Mon Sep 17 00:00:00 2001 From: segun Date: Mon, 16 Jan 2023 21:38:55 +0100 Subject: [PATCH 44/57] hotfix --- dist/leaflet.distortableimage.js | 8321 +++++++++++++++++++++++++++++- 1 file changed, 8320 insertions(+), 1 deletion(-) diff --git a/dist/leaflet.distortableimage.js b/dist/leaflet.distortableimage.js index 19cbfd3c0..635fa1ac2 100644 --- a/dist/leaflet.distortableimage.js +++ b/dist/leaflet.distortableimage.js @@ -1,2 +1,8321 @@ -!function(){var t={808:function(){var t=[];L.DistortableCollection=L.FeatureGroup.extend({options:{editable:!0,exportOpts:{exportStartUrl:"//export.mapknitter.org/export",statusUrl:"//export.mapknitter.org",exportUrl:"http://export.mapknitter.org/"}},initialize:function(t){L.setOptions(this,t),L.FeatureGroup.prototype.initialize.call(this,t),L.Utils.initTranslation.call(this),this.editable=this.options.editable},onAdd:function(t){L.FeatureGroup.prototype.onAdd.call(this,t),this._map=t,this.editable&&this.editing.enable(),this.on("layeradd",this._addEvents,this),this.on("layerremove",this._removeEvents,this)},onRemove:function(){this.editing&&this.editing.disable(),this.off("layeradd",this._addEvents,this),this.off("layerremove",this._removeEvents,this)},_addEvents:function(t){var e=t.layer;L.DomEvent.on(e,{dragstart:this._dragStartMultiple,drag:this._dragMultiple},this),L.DomEvent.on(e.getElement(),{mousedown:this._deselectOthers,contextmenu:this._longPressMultiSelect},this)},_removeEvents:function(t){var e=t.layer;L.DomEvent.off(e,{dragstart:this._dragStartMultiple,drag:this._dragMultiple},this),L.DomEvent.off(e.getElement(),{mousedown:this._deselectOthers,contextmenu:this._longPressMultiSelect},this)},_longPressMultiSelect:function(t){var e=this;this.editable&&(t.preventDefault(),this.eachLayer((function(i){var o=i.editing;i.getElement()===t.target&&o.enabled()&&(L.DomUtil.toggleClass(i.getElement(),"collected"),e.anyCollected()?(i.deselect(),e.editing._addToolbar()):e.editing._removeToolbar())})))},isCollected:function(t){return L.DomUtil.hasClass(t.getElement(),"collected")},anyCollected:function(){return this.getLayers().some(this.isCollected.bind(this))},_toggleCollected:function(e,i){e.shiftKey&&i.editing.enabled()&&(L.DomUtil.toggleClass(e.target,"collected"),t.every((function(t){return t._leaflet_id!==i._leaflet_id}))?t.push(i):t.splice(t.indexOf(i),1)),this.anyCollected()?i.deselect():this.editing._removeToolbar()},_deselectOthers:function(t){var e=this;this.editable&&(this.eachLayer((function(i){i.getElement()!==t.target?i.deselect():e._toggleCollected(t,i)})),t&&L.DomEvent.stopPropagation(t))},_dragStartMultiple:function(t){var e,i=t.target,o=this._map;this.isCollected(i)&&this.eachLayer((function(t){for(t._dragStartPoints={},t.deselect(),e=0;e<4;e++){var i=t.getCorner(e);t._dragStartPoints[e]=o.latLngToLayerPoint(i)}}))},_dragMultiple:function(t){var e=t.target,i=this._map;if(this.isCollected(e)){var o=i.latLngToLayerPoint(e.getCorner(0)),n=e._dragStartPoints[0].subtract(o);this._updateCollectionFromPoints(n,e)}},_toRemove:function(){var t=this;return this.getLayers().filter((function(e){var i=e.editing._mode;return t.isCollected(e)&&"lock"!==i}))},_toMove:function(t){var e=this;return this.getLayers().filter((function(i){var o=i.editing._mode;return i!==t&&e.isCollected(i)&&"lock"!==o}))},_updateCollectionFromPoints:function(t,e){var i,o=this._toMove(e),n=new L.Transformation(1,-t.x,1,-t.y);o.forEach((function(t){var e={};for(i=0;i<4;i++)e[i]=n.transform(t._dragStartPoints[i]);t.setCornersFromPoints(e)}))},_getAvgCmPerPixel:function(t){return t.reduce((function(t,e){return t+e.cm_per_pixel}),0)/t.length},generateExportJson:function(){var t={images:[]};return this.eachLayer((function(e){if(this.isCollected(e)){var i=e._image.src.split("/"),o=i[i.length-1],n=e.getCorners(),a=[{lat:n[0].lat,lon:n[0].lng},{lat:n[1].lat,lon:n[1].lng},{lat:n[3].lat,lon:n[3].lng},{lat:n[2].lat,lon:n[2].lng}];t.images.push({id:e._leaflet_id,src:e._image.src,width:e._image.width,height:e._image.height,image_file_name:o,nodes:a,cm_per_pixel:L.ImageUtil.getCmPerPixel(e)})}}),this),t.images=t.images.reverse(),t.avg_cm_per_pixel=this._getAvgCmPerPixel(t.images),t}}),L.distortableCollection=function(t,e){return new L.DistortableCollection(t,e)}},477:function(){L.DistortableImageOverlay=L.ImageOverlay.extend({options:{height:200,crossOrigin:!0,edgeMinWidth:50,editable:!0,mode:"distort",selected:!1,interactive:!0,tooltipText:"Unknow image"},initialize:function(t,e){L.setOptions(this,e),L.Utils.initTranslation.call(this),this.edgeMinWidth=this.options.edgeMinWidth,this.editable=this.options.editable,this._selected=this.options.selected,this._url=t,this.rotation={},this.interactive=this.options.interactive,this.tooltipText=this.options.tooltipText},onAdd:function(t){var e=this;this._map=t,this.getElement()||this._initImage(),t.on("viewreset",this._reset,this),this.options.corners&&(this._corners=this.options.corners,t.options.zoomAnimation&&L.Browser.any3d&&t.on("zoomanim",this._animateZoom,this)),L.DomEvent.on(this.getElement(),"load",(function(){if(e.getPane().appendChild(e.getElement()),e._initImageDimensions(),e.options.rotation){var i=e.options.rotation.deg>=0?"deg":"rad";e.setAngle(e.options.rotation[i],i)}else e.rotation={deg:0,rad:0},e._reset();e._corners||t.options.zoomAnimation&&L.Browser.any3d&&t.on("zoomanim",e._animateZoom,e);var o=e._eventParents;o?(e.eP=o[Object.keys(o)[0]],e.eP.editable&&e.editing.enable()):(e.editable&&e.editing.enable(),e.eP=null)})),L.DomEvent.on(this.getElement(),"click",this.select,this),L.DomEvent.on(t,{singleclickon:this._singleClickListeners,singleclickoff:this._resetClickListeners,singleclick:this._singleClick},this),t.doubleClickZoom.enabled()||t.doubleClickLabels.enabled()||L.DomEvent.on(t,"click",this.deselect,this),this.fire("add"),L.DomEvent.on(this.getElement(),"mousemove",this._activateTooltip,this),L.DomEvent.on(this.getElement(),"mouseout",this._closeTooltip,this)},onRemove:function(t){L.DomEvent.off(this.getElement(),"click",this.select,this),L.DomEvent.off(t,{singleclickon:this._singleClickListeners,singleclickoff:this._resetClickListeners,singleclick:this._singleClick},this),L.DomEvent.off(t,"click",this.deselect,this),this.editing&&this.editing.disable(),this.fire("remove"),L.ImageOverlay.prototype.onRemove.call(this,t),L.DomEvent.off(this.getElement(),"mouseover",this._deactivateTooltip,this)},_initImageDimensions:function(){var t=this._map,e=L.DomUtil.getStyle(this.getElement(),"width"),i=L.DomUtil.getStyle(this.getElement(),"height"),o=parseInt(e)/parseInt(i),n=this.options.height,a=parseInt(o*n),s=t.project(t.getCenter()),r=L.point(a,n).divideBy(2);this.options.corners?this._corners=this.options.corners:this._corners=[t.unproject(s.subtract(r)),t.unproject(s.add(L.point(r.x,-r.y))),t.unproject(s.add(L.point(-r.x,r.y))),t.unproject(s.add(r))],this._initialDimensions={center:s,offset:r,zoom:t.getZoom()},this.setBounds(L.latLngBounds(this.getCorners()))},_singleClick:function(t){"singleclick"===t.type&&this.deselect()},_singleClickListeners:function(){var t=this._map;L.DomEvent.off(t,"click",this.deselect,this),L.DomEvent.on(t,"singleclick",this.deselect,this)},_resetClickListeners:function(){var t=this._map;L.DomEvent.on(t,"click",this.deselect,this),L.DomEvent.off(t,"singleclick",this.deselect,this)},isSelected:function(){return this._selected},deselect:function(){var t=this.editing;if(t.enabled())return t._removeToolbar(),t._hideMarkers(),this._selected=!1,this.fire("deselect"),this},select:function(t){var e=this.editing,i=this.eP;if(e.enabled()){if(t&&L.DomEvent.stopPropagation(t),this._programmaticGrouping(),this._selected=!0,e._addToolbar(),e._showMarkers(),this.fire("select"),!i||!i.anyCollected())return this;this.deselect()}},_programmaticGrouping:function(){this._map.eachLayer((function(t){t instanceof L.DistortableImageOverlay&&t.deselect()}))},setCorner:function(t,e){var i=this.editing;return this._corners[t]=e,this.setBounds(L.latLngBounds(this.getCorners())),this.fire("update"),i.toolbar&&i.toolbar instanceof L.DistortableImage.PopupBar&&i._updateToolbarPos(),this.edited=!0,this},_cornerExceedsMapLats:function(t,e,i){return i.options.crs.Simple!=L.CRS.Simple&&(0===t?(o=i.project(e).y<2,n=i.project(e).y>=255):(o=i.project(e).y/t<2,n=i.project(e).y/Math.pow(2,t)>=255),o||n);var o,n},_activateTooltip:function(t){this._selected||this.bindTooltip(this.tooltipText,{direction:"top"}).openTooltip()},_closeTooltip:function(){this.closeTooltip()},_deactivateTooltip:function(){this.unbindTooltip()},setCorners:function(t){var e=this._map,i=e.getZoom(),o=this.editing,n=0;for(var a in t)if(this._cornerExceedsMapLats(i,t[a],e))return this.setBounds(L.latLngBounds(this.getCorners())),void this.fire("update");for(var s in t)this._corners[n]=t[s],n+=1;return this.setBounds(L.latLngBounds(this.getCorners())),this.fire("update"),o.toolbar&&o.toolbar instanceof L.DistortableImage.PopupBar&&o._updateToolbarPos(),this.edited=!0,this},setCornersFromPoints:function(t){var e=this._map,i=e.getZoom(),o=this.editing,n=0;for(var a in t){var s=e.layerPointToLatLng(t[a]);if(this._cornerExceedsMapLats(i,s,e))return this.setBounds(L.latLngBounds(this.getCorners())),void this.fire("update")}for(var r in t)this._corners[n]=e.layerPointToLatLng(t[r]),n+=1;return this.setBounds(L.latLngBounds(this.getCorners())),this.fire("update"),o.toolbar&&o.toolbar instanceof L.DistortableImage.PopupBar&&o._updateToolbarPos(),this.edited=!0,this},scaleBy:function(t){var e,i,o=this._map,n=o.project(this.getCenter()),a={};if(0!==t){for(e=0;e<4;e++)i=o.project(this.getCorner(e)).subtract(n).multiplyBy(t).add(n),a[e]=o.unproject(i);return this.setCorners(a),this}},getAngle:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"deg",e=this.getElement().style[L.DomUtil.TRANSFORM].split("matrix3d")[1].slice(1,-1).split(","),i=e[0],o=e[1],n=e[4],a=e[5],s=i*a-o*n,r=L.TrigUtil.calcAngle(i,o,"rad");return s<0&&(r+=r<0?Math.PI:-Math.PI),r<0&&(r=2*Math.PI+r),"deg"===t?Math.round(L.TrigUtil.radiansToDegrees(r)):L.Util.formatNum(r,2)},setAngle:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"deg",i=this.getAngle(e),o=t-i;return this.rotateBy(o,e),this},rotateBy:function(t){var e,i,o,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"deg",a=this._map,s=a.project(this.getCenter()),r={};for("deg"===n&&(t=L.TrigUtil.degreesToRadians(t)),e=0;e<4;e++)i=a.project(this.getCorner(e)).subtract(s),o=L.point(Math.cos(t)*i.x-Math.sin(t)*i.y,Math.sin(t)*i.x+Math.cos(t)*i.y),r[e]=a.unproject(o.add(s));return this.setCorners(r),this},dragBy:function(t,e){var i,o,n=this._map,a={},s=n.project(t).subtract(n.project(e));for(i=0;i<4;i++)o=n.project(this.getCorner(i)).subtract(s),a[i]=n.unproject(o);this.setCorners(a)},restore:function(){for(var t=this._map,e=this._initialDimensions.center,i=this._initialDimensions.offset,o=this._initialDimensions.zoom,n=[e.subtract(i),e.add(L.point(i.x,-i.y)),e.add(L.point(-i.x,i.y)),e.add(i)],a=0;a<4;a++)t.unproject(n[a],o).equals(this.getCorner(a))||this.setCorner(a,t.unproject(n[a],o));return this.edited=!1,this.fire("restore"),this},_getTranslateString:function(t){var e=L.Browser.webkit3d,i=(e?",0":"")+")";return"translate"+(e?"3d":"")+"("+t.x+"px,"+t.y+"px"+i},_reset:function(){var t=this._map,e=this.getElement(),i=L.bind(t.latLngToLayerPoint,t),o=this._calculateProjectiveTransform(i),n=i(this.getCorner(0)),a=L.DomUtil.getMatrixString(o),s=this._getTranslateString(n);e._leaflet_pos=n,e.style[L.DomUtil.TRANSFORM]=[s,a].join(" "),e.style[L.DomUtil.TRANSFORM+"-origin"]="0 0 0",this.rotation.deg=this.getAngle(),this.rotation.rad=this.getAngle("rad")},_animateZoom:function(t){var e=this._map,i=this.getElement(),o=function(i){return e._latLngToNewLayerPoint(i,t.zoom,t.center)},n=this._calculateProjectiveTransform(o),a=o(this.getCorner(0)),s=L.DomUtil.getMatrixString(n),r=this._getTranslateString(a);i._leaflet_pos=a,i.style[L.DomUtil.TRANSFORM]=[r,s].join(" ")},getCorners:function(){return this._corners},getCorner:function(t){return this._corners[t]},getCenter:function(){var t=this._map,e=this.getCorners().reduce((function(e,i){return e.add(t.project(i))}),L.point(0,0));return t.unproject(e.divideBy(4))},_calculateProjectiveTransform:function(t){var e,i=t(this.getCorner(0)),o=this.getElement().offsetWidth||500,n=this.getElement().offsetHeight||375,a=[];for(e=0;e<4;e++)a.push(t(this.getCorner(e))._subtract(i));return L.MatrixUtil.general2DProjection(0,0,a[0].x,a[0].y,o,0,a[1].x,a[1].y,0,n,a[2].x,a[2].y,o,n,a[3].x,a[3].y)}}),L.distortableImageOverlay=function(t,e){return new L.DistortableImageOverlay(t,e)},L.Map.addInitHook((function(){L.DomUtil.hasClass(this.getContainer(),"ldi")||L.DomUtil.addClass(this.getContainer(),"ldi")}))},782:function(){var t=this;L.DomUtil=L.DomUtil||{},L.DistortableImage=L.DistortableImage||{},L.distortableImage=L.DistortableImage,L.DistortableImage.Keymapper=L.Handler.extend({options:{position:"topright"},initialize:function(t,e){this._map=t,L.setOptions(this,e)},addHooks:function(){this._keymapper||(this._container=this._buildContainer(),this._scrollWrapper=this._wrap(),this._toggler=this._createButton(),this._setMapper(this._container,this._scrollWrapper,this._toggler),L.DomEvent.on(this._toggler,"click",this._toggleKeymapper,this),L.DomEvent.disableClickPropagation(this._container),L.DomEvent.disableScrollPropagation(this._container))},removeHooks:function(){this._keymapper&&(L.DomEvent.off(this._toggler,"click",this._toggleKeymapper,this),L.DomUtil.remove(this._toggler),L.DomUtil.remove(this._scrollWrapper),L.DomUtil.remove(this._container),this._keymapper=!1)},_buildContainer:function(){var t=L.DomUtil.create("div","ldi-keymapper-hide");t.setAttribute("id","ldi-keymapper");var e=L.DomUtil.create("br","divider");return t.appendChild(e),t},_createButton:function(){var t=L.DomUtil.create("a","");return t.innerHTML=L.IconUtil.create("keyboard_open"),t.setAttribute("id","toggle-keymapper"),t.setAttribute("href","#"),t.setAttribute("title","Show keymap"),t.setAttribute("role","button"),t.setAttribute("aria-label","Show keymap"),t},_wrap:function(){var t=L.DomUtil.create("div","");return t.setAttribute("id","keymapper-wrapper"),t.style.display="none",t},_setMapper:function(t,e,i){this._keymapper=L.control({position:this.options.position}),this._keymapper.onAdd=function(){return t.appendChild(e),e.insertAdjacentHTML("beforeend",'
Rotate Mode
R
RotateScale Mode
r
Scale Mode
s
Distort Mode
d
Drag Mode
D
Lock (Mode) / Unlock Image
l u
Stack up / down
q a
Add / Remove Image Border
b
Toggle Opacity
o
Deselect All
esc
Delete Image(s)
delete backspace
Export Image(s)
e
'),t.appendChild(i),t},this._keymapper.addTo(this._map)},_toggleKeymapper:function(t){t.preventDefault(),this._container.className="ldi-keymapper leaflet-control"===this._container.className?"ldi-keymapper-hide leaflet-control":"ldi-keymapper leaflet-control",this._scrollWrapper.style.display="none"===this._scrollWrapper.style.display?"block":"none",this._toggler.innerHTML="close"===this._toggler.innerHTML?L.IconUtil.create("keyboard_open"):"close",L.IconUtil.toggleTitle(this._toggler,"Show keymap","Hide keymap"),L.DomUtil.toggleClass(this._toggler,"close-icon")},_injectIconSet:function(){if(!document.querySelector("#keymapper-iconset")){var t=L.DomUtil.create("div","");t.id="keymapper-iconset",t.setAttribute("hidden","hidden"),this._iconset=(new L.KeymapperIconSet).render(),t.innerHTML=this._iconset,document.querySelector(".leaflet-control-container").appendChild(t)}}}),L.DistortableImage.Keymapper.addInitHook((function(){L.DistortableImage.Keymapper.prototype._n=L.DistortableImage.Keymapper.prototype._n?L.DistortableImage.Keymapper.prototype._n+1:1,1!==L.DistortableImage.Keymapper.prototype._n||L.Browser.mobile||(t.enable(),t._injectIconSet())})),L.distortableImage.keymapper=function(t,e){return new L.DistortableImage.Keymapper(t,e)}},428:function(){L.DistortableImage=L.DistortableImage||{},L.DistortableCollection.Edit=L.Handler.extend({options:{keymap:L.distortableImage.group_action_map},initialize:function(t,e){this._group=t,this._exportOpts=t.options.exportOpts,L.setOptions(this,e),L.distortableImage.group_action_map.Escape="_decollectAll"},addHooks:function(){var t=this._group._map;this.editActions=this.options.actions,this.runExporter=L.bind(L.Utils.getNestedVal(this,"_exportOpts","exporter")||this.startExport,this),L.DomEvent.on(document,"keydown",this._onKeyDown,this),t.doubleClickZoom.enabled()||t.doubleClickLabels.enabled()||L.DomEvent.on(t,"click",this._decollectAll,this),L.DomEvent.on(t,{singleclickon:this._singleClickListeners,singleclickoff:this._resetClickListeners,singleclick:this._singleClick,boxcollectend:this._addCollections},this),this._group.editable=!0,this._group.eachLayer((function(t){return t.editing.enable()}))},removeHooks:function(){var t=this._group._map;L.DomEvent.off(document,"keydown",this._onKeyDown,this),t.doubleClickZoom.enabled()||t.doubleClickLabels.enabled()||L.DomEvent.off(t,"click",this._decollectAll,this),L.DomEvent.off(t,{singleclickon:this._singleClickListeners,singleclickoff:this._resetClickListeners,singleclick:this._singleClick,boxcollectend:this._addCollections},this),this._decollectAll(),this._group.editable=!1,this._group.eachLayer((function(t){return t.editing.disable()}))},enable:function(){return this._enabled=!0,this.addHooks(),this},disable:function(){return this._enabled=!1,this.removeHooks(),this},_onKeyDown:function(t){var e=this.options.keymap[t.key];this[e]&&this._group.anyCollected()&&this[e].call(this)},_singleClick:function(t){"singleclick"===t.type&&this._decollectAll(t)},_singleClickListeners:function(){var t=this._group._map;L.DomEvent.off(t,"click",this._decollectAll,this),L.DomEvent.on(t,"singleclick",this._decollectAll,this)},_resetClickListeners:function(){var t=this._group._map;L.DomEvent.on(t,"click",this._decollectAll,this),L.DomEvent.off(t,"singleclick",this._decollectAll,this)},_decollectAll:function(t){var e;t&&(e=t.originalEvent),e&&(e.shiftKey||e.target instanceof HTMLImageElement)||(this._group.eachLayer((function(t){L.DomUtil.removeClass(t.getElement(),"collected"),t.deselect()})),this._removeToolbar(),t&&L.DomEvent.stopPropagation(t))},_unlockGroup:function(){var t=this;this.hasTool(L.UnlockAction)&&this._group.eachLayer((function(e){t._group.isCollected(e)&&(e.editing._unlock(),e.deselect())}))},_lockGroup:function(){var t=this;this.hasTool(L.LockAction)&&this._group.eachLayer((function(e){t._group.isCollected(e)&&(e.editing._lock(),L.DomUtil.addClass(e.getElement(),"collected"))}))},_addCollections:function(t){var e=this,i=t.boxCollectBounds,o=this._group._map;this._group.eachLayer((function(t){var n=t.editing;t.isSelected()&&t.deselect();var a=o.getZoom(),s=o.getCenter(),r=L.latLngBounds(t.getCorner(2),t.getCorner(1));r=o._latLngBoundsToNewLayerBounds(r,a,s),i.intersects(r)&&n.enabled()&&(e.toolbar||e._addToolbar(),L.DomUtil.addClass(t.getElement(),"collected"))}))},_removeGroup:function(t){var e=this;if(this.hasTool(L.DeleteAction)){var i=this._group._toRemove(),o=i.length;0!==o&&(L.DomUtil.confirmDeletes(o)&&(i.forEach((function(t){e._group.removeLayer(t)})),this._group.anyCollected()||this._removeToolbar()),t&&L.DomEvent.stopPropagation(t))}},cancelExport:function(){this.customCollection||(this._exportOpts.collection=void 0),clearInterval(this.updateInterval)},_addToolbar:function(){var t=this._group,e=t._map;t.options.suppressToolbar||this.toolbar||(this.toolbar=L.distortableImage.controlBar({actions:this.editActions,position:"topleft"}).addTo(e,t))},_removeToolbar:function(){var t=this._group._map;if(!this.toolbar)return!1;t.removeLayer(this.toolbar),this.toolbar=!1},hasTool:function(t){return this.editActions.some((function(e){return e===t}))},addTool:function(t){return"leaflet-toolbar-icon"!==t.baseClass||this.hasTool(t)||(this._removeToolbar(),this.editActions.push(t),this._addToolbar()),this},removeTool:function(t){var e=this;return this.editActions.some((function(i,o){return e.editActions[o]===t&&(e._removeToolbar(),e.editActions.splice(o,1),e._addToolbar(),!0)})),this},startExport:function(){var t=this;if(this.hasTool(L.ExportAction))return new Promise((function(e){var i,o=t._exportOpts;o.resolve=e,t.updateInterval=null,t.customCollection=!!o.collection,t.customCollection||(o.collection=t._group.generateExportJson().images),o.frequency=o.frequency||3e3,o.scale=o.scale||100,o.updater=o.updater||function(n){(n=JSON.parse(n)).status_url&&(i!==n.status_url&&n.status_url.match(".json")&&(i=n.status_url),"complete"===n.status&&(clearInterval(t.updateInterval),t.customCollection||(t._exportOpts.collection=void 0),e(),null!==n.jpg&&alert("Export succeeded. "+o.exportUrl+n.jpg)),console.log(n))},o.handleStatusRes=o.handleStatusRes||function(e){i=o.statusUrl+e,t.updateInterval=setInterval((function(){var t=new Request("".concat(i,"?").concat(Date.now()),{method:"GET"});fetch(t).then((function(t){if(t.ok)return t.text()})).then(o.updater)}),o.frequency)},o.fetchStatusUrl=o.fetchStatusUrl||function(t){var e=new FormData;e.append("collection",JSON.stringify(t.collection)),e.append("scale",t.scale),e.append("upload",!0);var i={method:"POST",body:e},o=new Request(t.exportStartUrl,i);fetch(o).then((function(t){if(t.ok)return t.text()})).then(t.handleStatusRes)},o.fetchStatusUrl(o)}))}}),L.distortableCollection.edit=function(t,e){return new L.DistortableCollection.Edit(t,e)}},397:function(){L.DistortableImage=L.DistortableImage||{},L.DistortableImage.Edit=L.Handler.extend({options:{opacity:.7,outline:"1px solid red",keymap:L.distortableImage.action_map},initialize:function(t,e){this._overlay=t,this._toggledImage=!1,this._mode=t.options.mode,this._transparent=!1,this._outlined=!1,L.setOptions(this,e),L.distortableImage.action_map.Escape="_deselect"},addHooks:function(){var t=this._overlay;this.editActions=this.options.actions,t.bringToFront(),this._initModes(),this._initHandles(),this._appendHandlesandDragable(),t.isSelected()&&!t.options.suppressToolbar&&this._addToolbar(),this.parentGroup=!!t.eP&&t.eP,L.DomEvent.on(t.getElement(),{dblclick:this.nextMode},this),L.DomEvent.on(window,"keydown",this._onKeyDown,this)},removeHooks:function(){var t=this._overlay,e=this.parentGroup;for(var i in this._disableDragging(),this.toolbar&&this._removeToolbar(),this._handles)L.DomUtil.remove(i);L.DomUtil.hasClass(t.getElement(),"collected")&&L.DomUtil.removeClass(t.getElement(),"collected"),e&&!e.anyCollected()&&e.editing.toolbar&&e.editing._removeToolbar(),L.DomEvent.off(t.getElement(),{dblclick:this.nextMode},this),L.DomEvent.off(window,"keydown",this._onKeyDown,this)},disable:function(){return this._enabled?(this._overlay.deselect(),this._enabled=!1,this.removeHooks(),this):this},_initModes:function(){for(var t in this._modes={},L.DistortableImage.Edit.MODES){var e=L.DistortableImage.Edit.MODES[t];-1!==this.editActions.indexOf(e)&&(this._modes[t]=e)}this._modes[this._mode]||(this._mode=Object.keys(this._modes)[0])},_initHandles:function(){var t,e=this._overlay;for(this._dragHandles=L.layerGroup(),t=0;t<4;t++)this._dragHandles.addLayer(L.dragHandle(e,t));for(this._scaleHandles=L.layerGroup(),t=0;t<4;t++)this._scaleHandles.addLayer(L.scaleHandle(e,t));for(this._distortHandles=L.layerGroup(),t=0;t<4;t++)this._distortHandles.addLayer(L.distortHandle(e,t));for(this._rotateHandles=L.layerGroup(),t=0;t<4;t++)this._rotateHandles.addLayer(L.rotateHandle(e,t));for(this._freeRotateHandles=L.layerGroup(),t=0;t<4;t++)this._freeRotateHandles.addLayer(L.freeRotateHandle(e,t));for(this._lockHandles=L.layerGroup(),t=0;t<4;t++)this._lockHandles.addLayer(L.lockHandle(e,t,{draggable:!1}));this._handles={drag:this._dragHandles,scale:this._scaleHandles,distort:this._distortHandles,rotate:this._rotateHandles,freeRotate:this._freeRotateHandles,lock:this._lockHandles}},_appendHandlesandDragable:function(){var t=this._overlay;this._mode?(this._updateHandle(),!t.isSelected()&&this.currentHandle&&this.currentHandle.eachLayer((function(t){t.setOpacity(0),t.dragging&&t.dragging.disable()})),this.isMode("lock")||this._enableDragging()):this._enableDragging()},_onKeyDown:function(t){var e=this.options.keymap[t.key],i=this._overlay,o=this.parentGroup;o&&o.anyCollected()||void 0===this[e]||i.options.suppressToolbar||i.isSelected()&&this.toolbar&&this[e].call(this)},replaceTool:function(t,e){var i=this;return"leaflet-toolbar-icon"!==e.baseClass||this.hasTool(e)||this.editActions.some((function(o,n){if(o===t){for(var a in i._removeToolbar(),i.editActions[n]=e,i._addToolbar(),L.DistortableImage.Edit.MODES)L.DistortableImage.Edit.MODES[a]===t?(delete i._modes[a],i._nextOrNone(a)):L.DistortableImage.Edit.MODES[a]===e&&(i._modes[a]=e);return!0}})),this},addTool:function(t){if("leaflet-toolbar-icon"===t.baseClass&&!this.hasTool(t)){for(var e in this._removeToolbar(),this.editActions.push(t),this._addToolbar(),L.DistortableImage.Edit.MODES)L.DistortableImage.Edit.MODES[e]===t&&(this._modes[e]=t);this._overlay.isSelected()||this._removeToolbar()}return this},hasTool:function(t){return this.editActions.some((function(e){return e===t}))},removeTool:function(t){var e=this;return this.editActions.some((function(i,o){if(i===t){for(var n in e._removeToolbar(),e.editActions.splice(o,1),e._addToolbar(),L.DistortableImage.Edit.MODES)L.DistortableImage.Edit.MODES[n]===t&&(delete e._modes[n],e._nextOrNone(n));return!0}})),this._overlay.isSelected()||this._removeToolbar(),this},_nextOrNone:function(t){this.isMode(t)&&(Object.keys(this.getModes()).length>=1?this.nextMode():("lock"===t&&this._enableDragging(),this._mode="",this._updateHandle()))},_removeToolbar:function(){var t=this._overlay._map;this.toolbar&&(t.removeLayer(this.toolbar),this.toolbar=!1)},_enableDragging:function(){var t=this,e=this._overlay,i=e._map;this.dragging=new L.Draggable(e.getElement()),this.dragging.enable(),this.dragging.on("dragstart",(function(){e.fire("dragstart"),t._removeToolbar()})),this.dragging._updatePosition=function(){var t,o,n=e.getCorner(0),a=this._newPos.subtract(i.latLngToLayerPoint(n)),s={};for(this.fire("predrag"),o=0;o<4;o++)t=i.latLngToLayerPoint(e.getCorner(o)),s[o]=i.layerPointToLatLng(t.add(a));e.setCorners(s),e.fire("drag"),this.fire("drag")},this.dragging.on("dragend",(function(){e.fire("dragend")}))},_disableDragging:function(){this.dragging&&(this.dragging.disable(),delete this.dragging)},_dragMode:function(){this.setMode("drag")},_scaleMode:function(){this.setMode("scale")},_distortMode:function(){this.setMode("distort")},_rotateMode:function(){this.setMode("rotate")},_freeRotateMode:function(){this.setMode("freeRotate")},_toggleLockMode:function(){this.isMode("lock")?this._unlock():this._lock()},_toggleOpacity:function(){var t=this._overlay.getElement();if(this.hasTool(L.OpacityAction)){this._transparent=!this._transparent;var e=this._transparent?this.options.opacity:1;L.DomUtil.setOpacity(t,e),t.setAttribute("opacity",e),this._refresh()}},_toggleBorder:function(){var t=this._overlay.getElement();if(this.hasTool(L.BorderAction)){this._outlined=!this._outlined;var e=this._outlined?this.options.outline:"none";t.style.outline=e,this._refresh()}},_toggleOrder:function(){this._toggledImage?this._stackUp():this._stackDown()},_removeOverlay:function(){var t=this._overlay,e=this.parentGroup;!this.isMode("lock")&&this.hasTool(L.DeleteAction)&&L.DomUtil.confirmDelete()&&(this._removeToolbar(),e?e.removeLayer(t):t._map.removeLayer(t))},_getExport:function(){var t=this._overlay,e=t._map,i=t.getElement();if(this.hasTool(L.ExportAction)){var o=new Image;o.id=o.id||"tempId12345",document.body.appendChild(o),o.onload=function(){var i=o.height,n=o.width,a=e.latLngToLayerPoint(t.getCorner(0)),s=e.latLngToLayerPoint(t.getCorner(1)),r=e.latLngToLayerPoint(t.getCorner(2)),l=e.latLngToLayerPoint(t.getCorner(3));o.onload=function(){L.DomUtil.remove(o)},window&&window.hasOwnProperty("warpWebGl")&&warpWebGl(o.id,[0,0,n,0,n,i,0,i],[a.x,a.y,s.x,s.y,l.x,l.y,r.x,r.y],!0)},o.src=t.options.fullResolutionSrc||i.src}},_stackUp:function(){this._toggledImage&&this.hasTool(L.StackAction)&&(this._toggledImage=!1,this._overlay.bringToFront(),this._refresh())},_stackDown:function(){!this._toggledImage&&this.hasTool(L.StackAction)&&(this._toggledImage=!0,this._overlay.bringToBack(),this._refresh())},_unlock:function(){var t=this._overlay,e=t._map,i=this.parentGroup;this.isMode("lock")&&((!i||i.isCollected(t))&&i||this.hasTool(L.LockAction))&&(this.currentHandle&&e.removeLayer(this.currentHandle),"lock"!==t.options.mode&&this.hasMode(t.options.mode)?this._mode=t.options.mode:(this._mode="",this.currentHandle=""),this._updateHandle(),this._enableDragging(),this._refresh())},_lock:function(){var t=this._overlay,e=t._map,i=this.parentGroup;this.isMode("lock")||((!i||i.isCollected(t))&&i||this.hasTool(L.LockAction))&&(this.currentHandle&&e.removeLayer(this.currentHandle),this._mode="lock",this._updateHandle(),this._disableDragging(),this._refresh())},_deselect:function(){this._overlay.deselect()},_showMarkers:function(t){var e=this.parentGroup;this.currentHandle&&(!this.isMode("lock")&&e&&e.anyCollected()||this.currentHandle.eachLayer((function(t){t.setOpacity(1),t.dragging&&t.dragging.enable(),L.DomUtil.addClass(t.getElement(),"leaflet-interactive")})))},_hideMarkers:function(){var t=this._overlay,e=this.parentGroup;this._handles||this._initHandles(),this.currentHandle&&(this.isMode("lock")&&e&&e.isCollected(t)||this.currentHandle.eachLayer((function(t){t.setOpacity(0),t.dragging&&t.dragging.disable(),L.DomUtil.removeClass(t.getElement(),"leaflet-interactive")})))},_updateHandle:function(){var t=this._overlay._map,e=this.getMode();this.currentHandle&&t.removeLayer(this.currentHandle),this.currentHandle=""===e?"":this._handles[e],""!==this.currentHandle&&t.addLayer(this.currentHandle)},_addToolbar:function(){var t=this._overlay,e=this.parentGroup,i=t._map,o=t.getCorners(),n=-1/0;if(e&&e.anyCollected())e.editing._addToolbar();else if(!t.options.suppressToolbar&&!this.toolbar){for(var a=0;an&&(n=o[a].lat);var s=t.getCenter();s.lat=n,this.toolbar=L.distortableImage.popupBar(s,{actions:this.editActions}).addTo(i,t),t.fire("toolbar:created")}},_refresh:function(){this.toolbar&&this._removeToolbar(),this._addToolbar()},_updateToolbarPos:function(){var t=this._overlay,e=t.getCorners(),i=this.toolbar,o=-1/0;if(i&&i instanceof L.DistortableImage.PopupBar){for(var n=0;no&&(o=e[n].lat);var a=t.getCenter();a.lat=o,t.options.suppressToolbar||this.toolbar.setLatLng(a)}},hasMode:function(t){return!!this._modes[t]},getMode:function(){if(this.enabled())return this._mode},getModes:function(){return this._modes},isMode:function(t){return!!this.enabled()&&this._mode===t},setMode:function(t){var e=this._overlay,i=this.parentGroup;if(this.getMode()!==t&&this.hasMode(t)&&this.enabled())return this.toolbar&&this.toolbar.clickTool(t),this.isMode("lock")&&!this.dragging&&this._enableDragging(),this._mode=t,this.isMode("lock")&&this._disableDragging(),this._updateHandle(),this._refresh(),i&&i.isCollected(e)&&e.deselect(),this},nextMode:function(t){var e=this.getMode(),i=this.parentGroup,o=Object.keys(this.getModes()),n=o.indexOf(e),a=o[(n+1)%o.length];if(t){if(i&&i.anyCollected())return;L.DomEvent.stop(t)}return this.setMode(a)}}),L.distortableImage.edit=function(t,e){return new L.DistortableImage.Edit(t,e)}},426:function(){L.BorderAction=L.EditAction.extend({initialize:function(t,e,i){var o,n,a=e.editing,s=a._mode;a._outlined?(o="border_outer",n=e.options.translation.removeBorder):(o="border_clear",n=e.options.translation.addBorder),(i=i||{}).toolbarIcon={svg:!0,html:o,tooltip:n,className:"lock"===s?"disabled":""},L.DistortableImage.action_map.b="lock"===s?"":"_toggleBorder",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){var t=this._overlay.editing;L.IconUtil.toggleXlink(this._link,"border_clear","border_outer"),L.IconUtil.toggleTitle(this._link,"Remove Border","Add Border"),t._toggleBorder()}})},114:function(){L.DeleteAction=L.EditAction.extend({initialize:function(t,e,i){var o,n=e.editing;n instanceof L.DistortableImage.Edit?(o=e.options.translation.deleteImage,L.DistortableImage.action_map.Backspace="lock"===n._mode?"":"_removeOverlay"):(o=e.options.translation.deleteImages,L.DistortableImage.group_action_map.Backspace="lock"===n._mode?"":"_removeGroup"),(i=i||{}).toolbarIcon={svg:!0,html:"delete_forever",tooltip:o,className:"lock"===n._mode?"disabled":""},L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){var t=this._overlay.editing;t instanceof L.DistortableImage.Edit?t._removeOverlay():t._removeGroup()}})},231:function(){L.DistortAction=L.EditAction.extend({initialize:function(t,e,i){(i=i||{}).toolbarIcon={svg:!0,html:"distort",tooltip:e.options.translation.distortImage,className:"distort"},L.DistortableImage.action_map.d="_distortMode",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){this._overlay.editing._distortMode()}})},541:function(){L.DragAction=L.EditAction.extend({initialize:function(t,e,i){(i=i||{}).toolbarIcon={svg:!0,html:"drag",tooltip:e.options.translation.dragImage,className:"drag"},L.DistortableImage.action_map.D="_dragMode",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){this._overlay.editing._dragMode()}})},280:function(){L.DistortableImage=L.DistortableImage||{},L.distortableImage=L.DistortableImage,L.DistortableImage.action_map={},L.EditAction=L.Toolbar2.Action.extend({options:{toolbarIcon:{svg:!1,html:"",className:"",tooltip:""}},initialize:function(t,e,i){this._overlay=e,this._map=t,L.setOptions(this,i),L.Toolbar2.Action.prototype.initialize.call(this,i),this._injectIconSet()},_createIcon:function(t,e,i){var o=this,n=this.options.toolbarIcon,a=n.className,s=this._overlay.editing;this.toolbar=t,this._icon=L.DomUtil.create("li","",e),this._link=L.DomUtil.create("a","",this._icon),n.svg?this._link.innerHTML=L.IconUtil.create(n.html):this._link.innerHTML=n.html,this._link.setAttribute("href","#"),this._link.setAttribute("title",n.tooltip),this._link.setAttribute("role","button"),L.DomUtil.addClass(this._link,this.constructor.baseClass),a&&(L.DomUtil.addClass(this._link,a),"disabled"===a&&L.DomUtil.addClass(this._icon,a),a===s._mode?L.DomUtil.addClass(this._link,"selected-mode"):L.DomUtil.removeClass(this._link,"selected-mode")),L.DomEvent.on(this._link,"click",this.enable,this),L.DomEvent.on(this._overlay,"update",(function(){var t=o._link.innerHTML.match(/xlink:href="#restore"/);t&&1===t.length&&o._enableAction()})),this._addSubToolbar(t,this._icon,i)},_injectIconSet:function(){if(!document.querySelector("#iconset")){var t=document.createElement("div");t.id="iconset",t.setAttribute("hidden","hidden"),t.innerHTML=(new L.ToolbarIconSet).render(),document.querySelector(".leaflet-marker-pane").appendChild(t)}},_enableAction:function(){L.DomUtil.removeClass(this._link.parentElement,"disabled"),L.DomUtil.removeClass(this._link,"disabled")},_disableAction:function(){L.DomUtil.addClass(this._link.parentElement,"disabled"),L.DomUtil.addClass(this._link,"disabled")}}),L.editAction=function(t,e,i){return new L.EditAction(t,e,i)}},149:function(){L.ExportAction=L.EditAction.extend({initialize:function(t,e,i){var o,n=e.editing;this.isExporting=!1,this.mouseLeaveSkip=!0,this.isHooksExecuted=!1,n instanceof L.DistortableImage.Edit?(L.DistortableImage.action_map.e="_getExport",o=e.options.translation.exportImage):(L.DistortableImage.group_action_map.e="runExporter",o=e.options.translation.exportImages),(i=i||{}).toolbarIcon={svg:!0,html:"get_app",tooltip:o},L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){var t=this._overlay.editing;if(t instanceof L.DistortableImage.Edit)t._getExport();else if(!this.isHooksExecuted){this.isHooksExecuted=!0;var e=this._link.parentElement;this.mouseEnterHandler=this.handleMouseEnter.bind(this),this.mouseLeaveHandler=this.handleMouseLeave.bind(this),L.DomEvent.on(e,"click",(function(){if(this.isExporting){if(this.mouseLeaveSkip)return;this.resetState(),this.detachMouseEventListeners(e),t.cancelExport()}else this.isExporting=!0,this.renderExportIcon(),setTimeout(this.attachMouseEventListeners.bind(this,e),100),t.runExporter().then(function(){this.resetState(),this.detachMouseEventListeners(e)}.bind(this))}),this)}},resetState:function(){this.renderDownloadIcon(),this.isExporting=!1,this.mouseLeaveSkip=!0},attachMouseEventListeners:function(t){t.addEventListener("mouseenter",this.mouseEnterHandler),t.addEventListener("mouseleave",this.mouseLeaveHandler)},detachMouseEventListeners:function(t){t.removeEventListener("mouseenter",this.mouseEnterHandler),t.removeEventListener("mouseleave",this.mouseLeaveHandler)},handleMouseEnter:function(){this.renderCancelIcon()},handleMouseLeave:function(){this.mouseLeaveSkip?this.mouseLeaveSkip=!1:this.renderExportIcon()},renderDownloadIcon:function(){L.IconUtil.toggleXlink(this._link,"get_app","spinner"),L.IconUtil.toggleTitle(this._link,"Export Images","Loading..."),L.DomUtil.removeClass(this._link.firstChild,"loader")},renderExportIcon:function(){L.IconUtil.toggleXlink(this._link,"spinner"),L.IconUtil.toggleTitle(this._link,"Export Images","Loading..."),L.IconUtil.addClassToSvg(this._link,"loader")},renderCancelIcon:function(){L.IconUtil.toggleXlink(this._link,"cancel"),L.IconUtil.toggleTitle(this._link,"Cancel Export","Loading..."),L.DomUtil.removeClass(this._link.firstChild,"loader")}})},74:function(){L.FreeRotateAction=L.EditAction.extend({initialize:function(t,e,i){(i=i||{}).toolbarIcon={svg:!0,html:"crop_rotate",tooltip:e.options.translation.freeRotateImage,className:"freeRotate"},L.DistortableImage.action_map.f="_freeRotateMode",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){this._overlay.editing._freeRotateMode()}})},691:function(){L.GeolocateAction=L.EditAction.extend({initialize:function(t,e,i){var o=e.editing;(i=i||{}).toolbarIcon={svg:!0,html:"explore",tooltip:e.options.translation.geolocateImage,className:"lock"===o._mode?"disabled":""},L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){var t=this._overlay.getElement();EXIF.getData(t,L.EXIF(t))}})},105:function(){L.LockAction=L.EditAction.extend({initialize:function(t,e,i){var o,n,a=e.editing;a instanceof L.DistortableImage.Edit?(L.DistortableImage.action_map.u="_unlock",L.DistortableImage.action_map.l="_lock",n=e.options.translation.lockMode,o=a.isMode("lock")?"lock":"unlock"):(L.DistortableImage.group_action_map.l="_lockGroup",n=e.options.translation.lockImages,o="lock"),(i=i||{}).toolbarIcon={svg:!0,html:o,tooltip:n,className:"lock"},L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){var t=this._overlay.editing;t instanceof L.DistortableImage.Edit?t._toggleLockMode():t._lockGroup()}})},944:function(){L.OpacityAction=L.EditAction.extend({initialize:function(t,e,i){var o,n,a=e.editing,s=a._mode;a._transparent?(o="opacity_empty",n=e.options.translation.makeImageOpaque):(o="opacity",n=e.options.translation.makeImageTransparent),(i=i||{}).toolbarIcon={svg:!0,html:o,tooltip:n,className:"lock"===s?"disabled":""},L.DistortableImage.action_map.o="lock"===s?"":"_toggleOpacity",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){var t=this._overlay.editing,e=this._link;L.IconUtil.toggleXlink(e,"opacity","opacity_empty"),L.IconUtil.toggleTitle(e,"Make Image Transparent","Make Image Opaque"),t._toggleOpacity()}})},954:function(){L.RestoreAction=L.EditAction.extend({initialize:function(t,e,i){var o=L.Utils.getNestedVal(e,"editing","_mode"),n=e.edited;(i=i||{}).toolbarIcon={svg:!0,html:"restore",tooltip:e.options.translation.restoreImage,className:n&&"lock"!==o?"":"disabled"},L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){var t=this._overlay;L.DomEvent.on(t,{edit:this._enableAction,restore:this._disableAction},this),t.restore()}})},178:function(){L.RotateAction=L.EditAction.extend({initialize:function(t,e,i){(i=i||{}).toolbarIcon={svg:!0,html:"rotate",tooltip:e.options.translation.rotateImage,className:"rotate"},L.DistortableImage.action_map.r="_rotateMode",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){this._overlay.editing._rotateMode()}})},547:function(){L.ScaleAction=L.EditAction.extend({initialize:function(t,e,i){(i=i||{}).toolbarIcon={svg:!0,html:"scale",tooltip:e.options.translation.scaleImage,className:"scale"},L.DistortableImage.action_map.s="_scaleMode",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){this._overlay.editing._scaleMode()}})},886:function(){L.StackAction=L.EditAction.extend({initialize:function(t,e,i){var o,n,a=e.editing;a._toggledImage?(o="flip_to_back",n=e.options.translation.stackToFront):(o="flip_to_front",n=e.options.translation.stackToBack),(i=i||{}).toolbarIcon={svg:!0,html:o,tooltip:n,className:"lock"===a._mode?"disabled":""},L.DistortableImage.action_map.q="lock"===a._mode?"":"_stackUp",L.DistortableImage.action_map.a="lock"===a._mode?"":"_stackDown",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){var t=this._overlay.editing;L.IconUtil.toggleXlink(this._link,"flip_to_front","flip_to_back"),L.IconUtil.toggleTitle(this._link,"Stack to Front","Stack to Back"),t._toggleOrder()}})},129:function(){L.UnlockAction=L.EditAction.extend({initialize:function(t,e,i){(i=i||{}).toolbarIcon={svg:!0,html:"unlock",tooltip:e.options.translation.unlockImages},L.DistortableImage.group_action_map.u="_unlockGroup",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){this._overlay.editing._unlockGroup()}})},743:function(){L.EXIF=function(t){if(0!==Object.keys(EXIF.getAllTags(t)).length){console.log(EXIF.getAllTags(t));var e=EXIF.getAllTags(t);void 0!==e.GPSLatitude&&void 0!==e.GPSLongitude&&(e.GPSLatitude[0],e.GPSLatitude[1],e.GPSLatitude[2],e.GPSLongitude[0],e.GPSLongitude[1],e.GPSLongitude[2],e.GPSLatitudeRef,e.GPSLongitudeRef),"T"===e.GPSImgDirectionRef||"M"===e.GPSImgDirectionRef?(Math.PI,e.GPSImgDirection.numerator,e.GPSImgDirection.denominator):console.log("No compass data found"),console.log("Orientation:",e.Orientation),(6===e.Orientation||8===e.Orientation||3===e.Orientation)&&Math.PI,void 0!==e.GPSAltitude&&void 0!==e.GPSAltitudeRef&&void 0!==e.GPSAltitude&&void 0!==e.GPSAltitudeRef&&(e.GPSAltitude.numerator,e.GPSAltitude.denominator,e.GPSAltitudeRef)}else alert("EXIF initialized. Press again to view data in console.")}},92:function(){L.DistortHandle=L.EditHandle.extend({options:{TYPE:"distort",icon:L.icon({iconUrl:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAChSURBVO3BIU4DURgGwNkvL2B6AkQTLBqP4QCoSm7DDXoBLBZHDbfgICAIZjEV3YTn9uVHdMZZtcnCfI13bIzxg0emg6Nm6QVbYz3jylEsXRrvwommb49X67jFkz80fR9Mb1YxTzqiWBSLYlEsikWxKBbFolgUi2JRLIpFsSgWxaJY03fHHOu40dH07bAzWCx9Ge/TiWbpHgdsjPGNB2f/yS+7xRCyiiZPJQAAAABJRU5ErkJggg==",iconSize:[32,32],iconAnchor:[16,16]})},_onHandleDrag:function(){this._handled.setCorner(this._corner,this.getLatLng())},updateHandle:function(){this.setLatLng(this._handled.getCorner(this._corner))}}),L.distortHandle=function(t,e,i){return new L.DistortHandle(t,e,i)}},194:function(){L.DragHandle=L.EditHandle.extend({options:{TYPE:"drag",icon:L.icon({iconUrl:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAsVJREFUeNrMVztLXEEUvnNVFAVBAhY2aRKbTZEHJNpYabuNjSgYg/GxdsmPSJkUAa/ZdVEX8mgWYVutbHxAHkVskjQBuUUgBISVhCQk3wnfwMlk1rusN1wHPubOzJlzvjlz5sxc01Ma/hUEwQnwDIjqc7uvgv9YYO86qgIwCXQbdNTlQ8kcCBHgBch8TcloF6oJGr6phk6EQAkfdz3zvgDr9Mr7Fg1fptEZoM8jsmrokpfsiIFO4IIjuE2v1EDmR4LRdlR5Gh51hj8D34ABtm8YTtqna0TgklIw5CgQguKxIojEjmFROg/MKQO27NkFAB+4wAPouGUJiIvWKHwbAxX2XyWRKWkqhT+pbJntJZJuUzISW0+5hW+obxrVBsfvoH/dqCCJuU97GBh2VteLSiYvArmErT8EVoAK9Bw7enbpVYmvAQlyowYforrH5jXL2rPHI/TKONDB7u9AlavdaTBPvPmazUeQuy8f7UomUgTEwIJPEQ3sQGE/6ll2l9H/KcEzBcfWn2IclluM3DpddJxSHujlFkscbUPvmB0LHVnLrId7nlaZVkEc6QGXQI1MAwZcWmVRHeNaQwJMMiU2cwy4s7p/RJ2ckpvIQs+cIs+5GzitloLKHUV3MPREuXbTOKO91dX387gGTONxIgEWm+E61FFrpcyqXLHsEwiDjEsjAksqw5XPoL9MHVrn6QR4q+XZrDaR4RoWzq2ymafuRA/Mq1stSsHLVkcbdf9VjOcx8ZH3+SFWcCWlVPyWuUBOwUWdC1wP5NVjYiXFWLO69PZ6CRTUY6KSIoEKdf6T3IzzgHxnsyHctNBEkmn6Oob8ExUDg/ahGybd177cDjzH5xHwgDiSvoS7I/LZyvxJZj0wod7tkX5G0XVC7rEyLhfLJjBGbKoLLEfZWObyKeZ6oY82g+yf5Zn/mJyHX7PMf04z/T3/LcAAu4E6iiyJqf0AAAAASUVORK5CYII=",iconSize:[32,32],iconAnchor:[16,16]})},_onHandleDrag:function(){var t=this._handled,e=t.getCorner(this._corner),i=this.getLatLng();t.dragBy(e,i)},updateHandle:function(){this.setLatLng(this._handled.getCorner(this._corner))}}),L.dragHandle=function(t,e,i){return new L.DragHandle(t,e,i)}},988:function(){L.EditHandle=L.Marker.extend({initialize:function(t,e,i){var o=t.getCorner(e);L.setOptions(this,i),this._handled=t,this._corner=e;var n={draggable:!0,zIndexOffset:10};i&&i.hasOwnProperty("draggable")&&(n.draggable=i.draggable),L.Marker.prototype.initialize.call(this,o,n)},onAdd:function(t){L.Marker.prototype.onAdd.call(this,t),this._bindListeners(),this.updateHandle()},onRemove:function(t){this._unbindListeners(),L.Marker.prototype.onRemove.call(this,t)},_onHandleDragStart:function(){this._handled.fire("editstart")},_onHandleDragEnd:function(){this._fireEdit()},_fireEdit:function(){this._handled.edited=!0,this._handled.fire("edit")},_bindListeners:function(){this.on({contextmenu:L.DomEvent.stop,dragstart:this._onHandleDragStart,drag:this._onHandleDrag,dragend:this._onHandleDragEnd},this),this._handled._map.on("zoomend",this.updateHandle,this),this._handled.on("update",this.updateHandle,this)},_unbindListeners:function(){this.off({contextmenu:L.DomEvent.stop,dragstart:this._onHandleDragStart,drag:this._onHandleDrag,dragend:this._onHandleDragEnd},this),this._handled._map.off("zoomend",this.updateHandle,this),this._handled.off("update",this.updateHandle,this)},_calculateScalingFactor:function(t,e){var i=this._handled,o=i._map,n=o.latLngToLayerPoint(i.getCenter()),a=o.latLngToLayerPoint(t),s=o.latLngToLayerPoint(e),r=this._d2(n,a),l=this._d2(n,s);return Math.sqrt(l/r)},_d2:function(t,e){var i=t.x-e.x,o=t.y-e.y;return Math.pow(i,2)+Math.pow(o,2)},calculateAngleDelta:function(t,e){var i=this._handled,o=i._map,n=o.latLngToLayerPoint(i.getCenter()),a=o.latLngToLayerPoint(t),s=o.latLngToLayerPoint(e),r=Math.atan2(n.y-a.y,n.x-a.x);return Math.atan2(n.y-s.y,n.x-s.x)-r}})},206:function(){L.FreeRotateHandle=L.EditHandle.extend({options:{TYPE:"freeRotate",icon:L.icon({iconUrl:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAHiSURBVMXBa3HbShgA0PMp/1sCCo8oCEpgTaCXgIXAJiDzyCJoAUTm4UVQAns1Y8+snWnTvJyeE16hkjDgDrfoNTMKcpC9UPiLSo8JyetkjEHxjPCMyoS199kFoz8Iv1HpMaN3qWDCHoegOKkkRwnJpRmroHgiPFEZ8IBekzEGxQtUEhKSS/fB7Ew4U+lxcGkVZG9QWWPSFAxBcdK59KApuA+yNwp2uEdx1GN25sZJZULSfAtm77SlbNjju6MvG75u+WHRWVR6rDVjMPsgwYyVZl3pLTpHkyYHOx8syMiayaJzlDTZ9YyaZNFVkiYH2ZUEBcVJJXVImuz6Js3Qofe59pq7DoOTILu+g+a288mCouk7/1iH4qTS+2QdDppbV1ZJmrnDXnPnc5UOs2Z0fUmTuyBr+krvSioJyUmQO0dZM7mepMkWnaNRkyrJB6uskTSjxY3Fll8bvmJwlDb83FJ8gMqAB80uyBY3Trb82PAfvjj6vuHnluIdKgMeNXOwctK5NKBoHitrb1RJeHRp5Ux4ojLg0aWMHGQvUOkxIWkKVsHsTPiNSo8HDC5lZIsgO6n0uMUdRvQuFQxB8UR4RmXC2vvsgtEfhL+o9JiQvE7GGBTPCK9QSUjoMWgKDthjDrIX+h/k0I7gth6N5gAAAABJRU5ErkJggg==",iconSize:[32,32],iconAnchor:[16,16]})},_onHandleDrag:function(){var t=this._handled,e=t._map,i=t.getCorner(this._corner),o=this.getLatLng(),n=this.calculateAngleDelta(i,o),a=this._calculateScalingFactor(i,o);0!==n&&t.rotateBy(n,"rad");var s=t.edgeMinWidth;s||(s=50);var r=e.latLngToContainerPoint(t.getCorner(0)),l=e.latLngToContainerPoint(t.getCorner(1)),c=Math.abs(r.x-l.x),d=Math.abs(r.y-l.y);Math.sqrt(c*c+d*d)>s||a>1?t.scaleBy(a):t.scaleBy(1)},updateHandle:function(){this.setLatLng(this._handled.getCorner(this._corner))}}),L.freeRotateHandle=function(t,e,i){return new L.FreeRotateHandle(t,e,i)}},789:function(){L.LockHandle=L.EditHandle.extend({options:{TYPE:"lock",interactive:!1,icon:L.icon({iconUrl:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAD8SURBVO3BPU7CYAAA0AdfjIcQlRCQBG7C3gk2uIPG2RC3Dk16Gz0FTO1WZs/gwGCMP/2+xsSl7+n1er1Iz9LtRQjaPeMeO+TinLDCJV78YqjdA04YodKuxhUaPGoRxMmxwRQZSt87Yo4KExGCeAUyLLFB4bMacxywEClIU2KDKXbInTUYo8JCgoFuGoxQO5uiwY1EA91VmDqrcKeDoX8WdNNgjApvmGGLXKIgXY0xGkxQYItrrFFIEKQ5Yo4KEx9yrDFDhlKkIF6NOQ5Y+KpAhiXWKEQI4pxwiwoLPyuxwQw75FoE7fZYocFEuwI7jHCBV39gL92TXq/Xi/AOcmczZmaIMScAAAAASUVORK5CYII=",iconSize:[32,32],iconAnchor:[16,16]})},onRemove:function(t){this.unbindTooltip(),L.EditHandle.prototype.onRemove.call(this,t)},_bindListeners:function(){var t=this.getElement();L.EditHandle.prototype._bindListeners.call(this),L.DomEvent.on(t,{mousedown:this._tooltipOn,mouseup:this._tooltipOff},this),L.DomEvent.on(document,"pointerleave",this._tooltipOff,this)},_unbindListeners:function(){var t=this.getElement();L.EditHandle.prototype._bindListeners.call(this),L.DomEvent.off(t,{mousedown:this._tooltipOn,mouseup:this._tooltipOff},this),L.DomEvent.off(document,"pointerleave",this._tooltipOff,this)},_onHandleDrag:function(){},updateHandle:function(){this.setLatLng(this._handled.getCorner(this._corner))},_tooltipOn:function(t){var e=this._handled.parentGroup,i=e?e.editing:this._handled.editing;if(!t.shiftKey&&(this._handled.isSelected()||!e||e.isCollected(this._handled))){var o=i._lockHandles;this._timer=setTimeout(L.bind((function(){this._timeout&&clearTimeout(this._timeout),this.getTooltip()?o.eachLayer((function(t){this!==t&&t.closeTooltip()})):this.bindTooltip("Locked!",{permanent:!0}),this.openTooltip()}),this),500)}},_tooltipOff:function(t){var e=this._handled.parentGroup,i=e?e.editing:this._handled.editing;if(!t.shiftKey&&(this._handled.isSelected()||!e||e.isCollected(this._handled))){var o=i._lockHandles;t.currentTarget===document&&o.eachLayer((function(t){t.closeTooltip()})),this._timer&&clearTimeout(this._timer),this._timeout=setTimeout(L.bind((function(){this.closeTooltip()}),this),400)}}}),L.lockHandle=function(t,e,i){return new L.LockHandle(t,e,i)}},337:function(){L.RotateHandle=L.EditHandle.extend({options:{TYPE:"rotate",icon:L.icon({iconUrl:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAHiSURBVMXBa3HbShgA0PMp/1sCCo8oCEpgTaCXgIXAJiDzyCJoAUTm4UVQAns1Y8+snWnTvJyeE16hkjDgDrfoNTMKcpC9UPiLSo8JyetkjEHxjPCMyoS199kFoz8Iv1HpMaN3qWDCHoegOKkkRwnJpRmroHgiPFEZ8IBekzEGxQtUEhKSS/fB7Ew4U+lxcGkVZG9QWWPSFAxBcdK59KApuA+yNwp2uEdx1GN25sZJZULSfAtm77SlbNjju6MvG75u+WHRWVR6rDVjMPsgwYyVZl3pLTpHkyYHOx8syMiayaJzlDTZ9YyaZNFVkiYH2ZUEBcVJJXVImuz6Js3Qofe59pq7DoOTILu+g+a288mCouk7/1iH4qTS+2QdDppbV1ZJmrnDXnPnc5UOs2Z0fUmTuyBr+krvSioJyUmQO0dZM7mepMkWnaNRkyrJB6uskTSjxY3Fll8bvmJwlDb83FJ8gMqAB80uyBY3Trb82PAfvjj6vuHnluIdKgMeNXOwctK5NKBoHitrb1RJeHRp5Ux4ojLg0aWMHGQvUOkxIWkKVsHsTPiNSo8HDC5lZIsgO6n0uMUdRvQuFQxB8UR4RmXC2vvsgtEfhL+o9JiQvE7GGBTPCK9QSUjoMWgKDthjDrIX+h/k0I7gth6N5gAAAABJRU5ErkJggg==",iconSize:[32,32],iconAnchor:[16,16]})},_onHandleDrag:function(){var t=this._handled,e=t.getCorner(this._corner),i=this.getLatLng(),o=this.calculateAngleDelta(e,i);t.rotateBy(o,"rad")},updateHandle:function(){this.setLatLng(this._handled.getCorner(this._corner))}}),L.rotateHandle=function(t,e,i){return new L.RotateHandle(t,e,i)}},350:function(){L.ScaleHandle=L.EditHandle.extend({options:{TYPE:"scale",icon:L.icon({iconUrl:"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2ZXJzaW9uPSIxLjEiIHdpZHRoPSI0NTkiIGhlaWdodD0iNDY0IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCA1MTIgNTEyIiB4bWw6c3BhY2U9InByZXNlcnZlIiBzdHlsZT0iIj48cmVjdCBpZD0iYmFja2dyb3VuZHJlY3QiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIHg9IjAiIHk9IjAiIGZpbGw9Im5vbmUiIHN0cm9rZT0ibm9uZSIgY2xhc3M9IiIgc3R5bGU9IiIvPjxnIGNsYXNzPSJjdXJyZW50TGF5ZXIiIHN0eWxlPSIiPjx0aXRsZT5MYXllciAxPC90aXRsZT48cGF0aCBkPSJNNDU5LjA0OTE1OTUzMDQ3MTM0LDg2LjkyNjIzNDUxMjU1MDAyIFYwIGgtODUuNzE0NTczMzU2MzEyMDkgdjI3LjA0MzcxNzQwMzkwNDQ1MiBIODUuNzE0NTczMzU2MzEyMDMgVjAgSDAgdjg2LjkyNjIzNDUxMjU1MDAyIGgyNS43MTQzNzIwMDY4OTM2MjYgdjI4OS43NTQxMTUwNDE4MzM0IEgwIHY4Ni45MjYyMzQ1MTI1NTAwMiBoODUuNzE0NTczMzU2MzEyMDkgdi0yNy4wNDM3MTc0MDM5MDQ0NTIgaDI4NS43MTUyNDQ1MjEwNDAzIHYyNy4wNDM3MTc0MDM5MDQ0NTIgaDg1LjcxNDU3MzM1NjMxMjA5IHYtODYuOTI2MjM0NTEyNTUwMDIgaC0yMy44MDk2MDM3MTAwODY2OSBWODYuOTI2MjM0NTEyNTUwMDIgSDQ1OS4wNDkxNTk1MzA0NzEzNCB6TTM4NC43NjMxOTU5NTUwMDA5LDEyLjU1NjAxMTY1MTgxMjc4MSBoNjEuOTA0OTY5NjQ2MjI1Mzk2IHY2Mi43ODAwNTgyNTkwNjM5MSBoLTYxLjkwNDk2OTY0NjIyNTM5NiBWMTIuNTU2MDExNjUxODEyNzgxIHpNMTIuMzgwOTkzOTI5MjQ1MDUsMTIuNTU2MDExNjUxODEyNzgxIGg2MS45MDQ5Njk2NDYyMjUzOTYgdjYyLjc4MDA1ODI1OTA2MzkxIEgxMi4zODA5OTM5MjkyNDUwNSBWMTIuNTU2MDExNjUxODEyNzgxIHpNNzQuMjg1OTYzNTc1NDcwNTMsNDUxLjA1MDU3MjQxNTEyMDY2IEgxMi4zODA5OTM5MjkyNDUwNSB2LTYyLjc4MDA1ODI1OTA2MzkxIGg2MS45MDQ5Njk2NDYyMjUzOTYgVjQ1MS4wNTA1NzI0MTUxMjA2NiB6TTQ0NS43MTU3ODE0NTI4MjI3NCw0NTEuMDUwNTcyNDE1MTIwNjYgaC02Mi44NTczNTM3OTQ2Mjg4NjQgdi02Mi43ODAwNTgyNTkwNjM5MSBoNjIuODU3MzUzNzk0NjI4ODY0IFY0NTEuMDUwNTcyNDE1MTIwNjYgek00MDcuNjIwNDE1NTE2Njg0MjYsMzc2LjY4MDM0OTU1NDM4MzQ0IGgtMzYuMTkwNTk3NjM5MzMxNzcgdjMyLjgzODc5OTcwNDc0MTEyIEg4NS43MTQ1NzMzNTYzMTIwMyB2LTMyLjgzODc5OTcwNDc0MTEyIEg0OS41MjM5NzU3MTY5ODAzMiBWODYuOTI2MjM0NTEyNTUwMDIgaDM2LjE5MDU5NzYzOTMzMTc3IFY1MC4yMjQwNDY2MDcyNTExMjUgaDI4Ny42MjAwMTI4MTc4NDcyIHYzNi43MDIxODc5MDUyOTg5IGgzNC4yODU4MjkzNDI1MjQ4MzUgVjM3Ni42ODAzNDk1NTQzODM0NCB6IiBpZD0ic3ZnXzIiIGNsYXNzPSIiIGZpbGw9IiMxYTFhZWIiIGZpbGwtb3BhY2l0eT0iMSIvPjwvZz48L3N2Zz4=",iconSize:[32,32],iconAnchor:[16,16]})},_onHandleDrag:function(){var t=this._handled,e=t._map,i=t.edgeMinWidth,o=t.getCorner(this._corner),n=this.getLatLng(),a=this._calculateScalingFactor(o,n);i||(i=50);var s=e.latLngToLayerPoint(t.getCorner(0)),r=e.latLngToLayerPoint(t.getCorner(1)),l=Math.abs(s.x-r.x),c=Math.abs(s.y-r.y);Math.sqrt(l*l+c*c)>i||a>1?t.scaleBy(a):t.scaleBy(1)},updateHandle:function(){this.setLatLng(this._handled.getCorner(this._corner))}}),L.scaleHandle=function(t,e,i){return new L.ScaleHandle(t,e,i)}},719:function(){L.distortableImage=L.DistortableImage||{},L.distortableImage=L.DistortableImage,L.DistortableImage.group_action_map={},L.DistortableImage.ControlBar=L.Toolbar2.Control.extend({}),L.distortableImage.controlBar=function(t){return new L.DistortableImage.ControlBar(t)},L.DistortableCollection.addInitHook((function(){this.ACTIONS=[L.ExportAction,L.DeleteAction,L.LockAction,L.UnlockAction],L.DistortableCollection.Edit.MODES={lock:L.LockAction,unlock:L.UnlockAction};var t=this.options.actions?this.options.actions:this.ACTIONS;this.editing=L.distortableCollection.edit(this,{actions:t})}))},93:function(){L.DistortableImage=L.DistortableImage||{},L.distortableImage=L.DistortableImage,L.DistortableImage.action_map={},L.DistortableImage.PopupBar=L.Toolbar2.Popup.extend({options:{anchor:[0,-10]},initialize:function(t,e){L.setOptions(this,e),L.Toolbar2.Popup.prototype.initialize.call(this,t,e)},addHooks:function(t,e){this.map=t,this.ov=e},tools:function(){if(this._ul)return this._ul.children},clickTool:function(t){for(var e=this.tools(),i=0;i',_symbols:"",render:function(){return this.addSymbols(this._symbols),this._svg},addSymbols:function(t){this._svg+=t}})},261:function(){L.KeymapperIconSet=L.IconSet.extend({_symbols:''})},929:function(){L.ToolbarIconSet=L.IconSet.extend({_symbols:''})},496:function(){L.Map.mergeOptions({boxCollector:!0,boxZoom:!1}),L.Map.BoxCollector=L.Map.BoxZoom.extend({initialize:function(t){this._map=t,this._container=t._container,this._pane=t._panes.overlayPane,this._resetStateTimeout=0,t.on("unload",this._destroy,this)},addHooks:function(){L.DomEvent.on(this._container,"mousedown",this._onMouseDown,this)},removeHooks:function(){L.DomEvent.off(this._container,"mousedown",this._onMouseDown,this)},moved:function(){return this._moved},_destroy:function(){L.DomUtil.remove(this._pane),delete this._pane},_resetState:function(){this._resetStateTimeout=0,this._moved=!1},_clearDeferredResetState:function(){0!==this._resetStateTimeout&&(clearTimeout(this._resetStateTimeout),this._resetStateTimeout=0)},_onMouseDown:function(t){if(!t.shiftKey||1!==t.which&&1!==t.button)return!1;this._clearDeferredResetState(),this._resetState(),L.DomUtil.disableTextSelection(),L.DomUtil.disableImageDrag(),this._startPoint=this._map.mouseEventToContainerPoint(t),L.DomEvent.on(document,{contextmenu:L.DomEvent.stop,mousemove:this._onMouseMove,mouseup:this._onMouseUp},this)},_onMouseMove:function(t){this._moved||(this._moved=!0,this._box=L.DomUtil.create("div","leaflet-zoom-box",this._container),L.DomUtil.addClass(this._container,"leaflet-crosshair"),this._map.fire("boxzoomstart")),this._point=this._map.mouseEventToContainerPoint(t),this._bounds=L.bounds(this._startPoint,this._point);var e=this._bounds.getSize();L.DomUtil.setPosition(this._box,this._bounds.min),this._box.style.width=e.x+"px",this._box.style.height=e.y+"px"},_finish:function(){this._moved&&(L.DomUtil.remove(this._box),L.DomUtil.removeClass(this._container,"leaflet-crosshair")),L.DomUtil.enableTextSelection(),L.DomUtil.enableImageDrag(),L.DomEvent.off(document,{contextmenu:L.DomEvent.stop,mousemove:this._onMouseMove,mouseup:this._onMouseUp},this)},_onMouseUp:function(t){if((1===t.which||1===t.button)&&(this._finish(),this._moved)){this._clearDeferredResetState(),this._resetStateTimeout=setTimeout(L.Util.bind(this._resetState,this),0);var e=L.latLngBounds(this._map.containerPointToLatLng(this._bounds.getBottomLeft()),this._map.containerPointToLatLng(this._bounds.getTopRight())),i=this._map.getZoom(),o=this._map.getCenter();e=this._map._latLngBoundsToNewLayerBounds(e,i,o),this._map.fire("boxcollectend",{boxCollectBounds:e})}}}),L.Map.addInitHook("addHandler","boxCollector",L.Map.BoxCollector)},291:function(){L.Map.mergeOptions({doubleClickLabels:!0}),L.Map.DoubleClickLabels=L.Map.DoubleClickZoom.extend({enable:function(){var t=this._map;return this._enabled||(t.doubleClickZoom.enabled()&&t.doubleClickZoom.disable(),this._map.fire("singleclickon"),this._enabled=!0,this.addHooks()),this},disable:function(){return this._enabled?(this._enabled=!1,this.removeHooks(),this):this},_fireIfSingle:function(t){var e=this._map,i=t.originalEvent;i&&i.shiftKey||(e._clicked+=1,this._map._clickTimeout=setTimeout((function(){1===e._clicked?(e._clicked=0,e.fire("singleclick",{type:"singleclick"})):L.Browser.touch&&i&&i.sourceCapabilities.firesTouchEvents&&e.fire("dblclick")}),250))},_onDoubleClick:function(){var t=this._map,e=t._labels;setTimeout((function(){t._clicked=0,clearTimeout(t._clickTimeout)}),0),e&&(1===e.options.opacity?(e.options.opacity=0,e.setOpacity(0)):(e.options.opacity=1,e.setOpacity(1)))}}),L.Map.addInitHook("addHandler","doubleClickLabels",L.Map.DoubleClickLabels)},752:function(){L.Map.DoubleClickZoom.include({addHooks:function(){this._map.on({click:this._fireIfSingle,dblclick:this._onDoubleClick},this)},removeHooks:function(){this._map.off({click:this._fireIfSingle,dblclick:this._onDoubleClick},this)},enable:function(){return this._enabled||this._map.doubleClickLabels&&this._map.doubleClickLabels.enabled()||(this._map.fire("singleclickon"),this._enabled=!0,this.addHooks()),this},disable:function(){return this._enabled?(this._map.fire("singleclickoff"),this._enabled=!1,this.removeHooks(),this):this},_fireIfSingle:function(t){var e=this._map,i=t.originalEvent;i&&i.shiftKey||(e._clicked+=1,this._map._clickTimeout=setTimeout((function(){1===e._clicked?(e._clicked=0,e.fire("singleclick",{type:"singleclick"})):L.Browser.touch&&i&&i.sourceCapabilities.firesTouchEvents&&e._fireDOMEvent(i,"dblclick",[e])}),250))},_onDoubleClick:function(t){var e=this._map,i=t.originalEvent;if(setTimeout((function(){e._clicked=0,clearTimeout(e._clickTimeout)}),0),!i)return!1;var o=e.getZoom(),n=e.options.zoomDelta,a=i.shiftKey?o-n:o+n;"center"===e.options.doubleClickZoom?e.setZoom(a):e.setZoomAround(t.containerPoint,a)}})},131:function(){L.Map.include({_clicked:0,addGoogleMutant:function(t){return(t=this.mutantOptions=L.extend({mutantOpacity:.8,maxZoom:24,maxNativeZoom:20,minZoom:0,labels:!0,labelOpacity:1,doubleClickLabels:!0},t)).labels||(this.mutantOptions=L.extend(this.mutantOptions,{labelOpacity:t.labels?1:void 0,doubleClickLabels:!!t.labels||void 0})),this._googleMutant=L.tileLayer("http://mt0.google.com/vt/lyrs=s&x={x}&y={y}&z={z}",{maxZoom:t.maxZoom,maxNativeZoom:t.maxNativeZoom,minZoom:t.minZoom,opacity:t.mutantOpacity}).addTo(this),t.labels?this._addLabels(t):this.doubleClickLabels=void 0,this},_addLabels:function(t){return 0!==t.labelOpacity&&1!==t.labelOpacity&&(t.labelOpacity=1),this._labels=L.tileLayer("https://stamen-tiles-{s}.a.ssl.fastly.net/toner-labels/{z}/{x}/{y}{r}.{ext}",{attribution:'Map tiles by Stamen Design, CC BY 3.0 — Map data © OpenStreetMap contributors',subdomains:"abcd",interactive:!1,opacity:t.labelOpacity,maxZoom:t.maxZoom,maxNativeZoom:t.maxNativeZoom,minZoom:t.minZoom,ext:"png"}).addTo(this),this.mutantOptions.doubleClickLabels&&this.doubleClickLabels.enable(),this}}),L.Map.addInitHook((function(){this.doubleClickLabels.disable(),this.doubleClickZoom.enable()}))},999:function(){L.DomUtil=L.extend(L.DomUtil,{initTranslation:function(t){this.translation=t},getMatrixString:function(t){var e=L.Browser.webkit3d||L.Browser.gecko3d||L.Browser.ie3d,i=[t[0],t[3],0,t[6],t[1],t[4],0,t[7],0,0,1,0,t[2],t[5],0,t[8]],o=e?"matrix3d("+i.join(",")+")":"";return e||console.log("Your browser must support 3D CSS transformsin order to use DistortableImageOverlay."),o},toggleClass:function(t,e){var i=e;return this.hasClass(t,i)?this.removeClass(t,i):this.addClass(t,i)},confirmDelete:function(){return window.confirm(this.translation.confirmImageDelete)},confirmDeletes:function(t){if(1===t)return this.confirmDelete();var e,i=this.translation.confirmImagesDeletes;return e="function"==typeof i?i(t):i,window.confirm(e)}})},85:function(){L.IconUtil={create:function(t){return/^#/.test(t)&&(t=t.replace(/^#/,"")),''},addClassToSvg:function(t,e){var i=t.querySelector("svg");i&&L.DomUtil.addClass(i,e)},toggleXlink:function(t,e,i){/^#/.test(e)||(e="#"+e),/^#/.test(i)||(i="#"+i);var o=t.querySelector("use");if(o){var n=o.getAttribute("xlink:href")===e?i:e;return o.setAttribute("xlink:href",n),n}return!1},toggleTitle:function(t,e,i){var o=t.getAttribute("title")===e?i:e;return t.setAttribute("title",o),t.hasAttribute("aria-label")&&t.setAttribute("aria-label",o),o}}},351:function(){L.ImageUtil={getCmPerPixel:function(t){var e=t._map;return 100*e.latLngToLayerPoint(t.getCorner(0)).distanceTo(e.latLngToLayerPoint(t.getCorner(1)))/t.getElement().width}}},360:function(){L.MatrixUtil={adj:function(t){return[t[4]*t[8]-t[5]*t[7],t[2]*t[7]-t[1]*t[8],t[1]*t[5]-t[2]*t[4],t[5]*t[6]-t[3]*t[8],t[0]*t[8]-t[2]*t[6],t[2]*t[3]-t[0]*t[5],t[3]*t[7]-t[4]*t[6],t[1]*t[6]-t[0]*t[7],t[0]*t[4]-t[1]*t[3]]},multmm:function(t,e){var i,o=[];for(i=0;i<3;i++)for(var n=0;n<3;n++){for(var a=0,s=0;s<3;s++)a+=t[3*i+s]*e[3*s+n];o[3*i+n]=a}return o},multmv:function(t,e){return[t[0]*e[0]+t[1]*e[1]+t[2]*e[2],t[3]*e[0]+t[4]*e[1]+t[5]*e[2],t[6]*e[0]+t[7]*e[1]+t[8]*e[2]]},multsm:function(t,e){for(var i=[],o=0,n=e.length;o2&&void 0!==arguments[2]?arguments[2]:"deg";return"deg"===i?this.radiansToDegrees(Math.atan2(e,t)):Math.atan2(e,t)},radiansToDegrees:function(t){return 180*t/Math.PI},degreesToRadians:function(t){return t*Math.PI/180}}},866:function(){L.Utils={initTranslation:function(){var t={deleteImage:"Delete Image",deleteImages:"Delete Images",distortImage:"Distort Image",dragImage:"Drag Image",exportImage:"Export Image",exportImages:"Export Images",removeBorder:"Remove Border",addBorder:"Add Border",freeRotateImage:"Free rotate Image",geolocateImage:"Geolocate Image",lockMode:"Lock Mode",lockImages:"Lock Images",makeImageOpaque:"Make Image Opaque",makeImageTransparent:"Make Image Transparent",restoreImage:"Restore Natural Image",rotateImage:"Rotate Image",scaleImage:"Scale Image",stackToFront:"Stack to Front",stackToBack:"Stack to Back",unlockImages:"Unlock Images",confirmImageDelete:"Are you sure? This image will be permanently deleted from the map.",confirmImagesDeletes:"Are you sure? These images will be permanently deleted from the map."};if(this.options.translation)for(var e in t)this.options.translation.hasOwnProperty(e)||(this.options.translation[e]=t[e]);else this.options.translation=t;L.DomUtil.initTranslation(this.options.translation)},getNestedVal:function(t,e,i){return[e,i].reduce((function(t,e){return t&&t[e]}),t)}}}};t[999](),t[85](),t[351](),t[360](),t[682](),t[866](),t[477](),t[808](),t[743](),t[988](),t[92](),t[194](),t[206](),t[789](),t[337](),t[350](),t[376](),t[261](),t[929](),t[280](),t[426](),t[114](),t[231](),t[541](),t[149](),t[74](),t[691](),t[105](),t[944](),t[954](),t[178](),t[547](),t[886](),t[129](),t[93](),t[719](),t[397](),t[428](),t[782](),t[752](),t[496](),t[291](),t[131]()}(); +/******/ (function() { // webpackBootstrap +/******/ var __webpack_modules__ = ({ + +/***/ "./node_modules/ansi-html-community/index.js": +/*!***************************************************!*\ + !*** ./node_modules/ansi-html-community/index.js ***! + \***************************************************/ +/***/ (function(module) { + +"use strict"; + + +module.exports = ansiHTML + +// Reference to https://github.com/sindresorhus/ansi-regex +var _regANSI = /(?:(?:\u001b\[)|\u009b)(?:(?:[0-9]{1,3})?(?:(?:;[0-9]{0,3})*)?[A-M|f-m])|\u001b[A-M]/ + +var _defColors = { + reset: ['fff', '000'], // [FOREGROUD_COLOR, BACKGROUND_COLOR] + black: '000', + red: 'ff0000', + green: '209805', + yellow: 'e8bf03', + blue: '0000ff', + magenta: 'ff00ff', + cyan: '00ffee', + lightgrey: 'f0f0f0', + darkgrey: '888' +} +var _styles = { + 30: 'black', + 31: 'red', + 32: 'green', + 33: 'yellow', + 34: 'blue', + 35: 'magenta', + 36: 'cyan', + 37: 'lightgrey' +} +var _openTags = { + '1': 'font-weight:bold', // bold + '2': 'opacity:0.5', // dim + '3': '', // italic + '4': '', // underscore + '8': 'display:none', // hidden + '9': '' // delete +} +var _closeTags = { + '23': '', // reset italic + '24': '', // reset underscore + '29': '' // reset delete +} + +;[0, 21, 22, 27, 28, 39, 49].forEach(function (n) { + _closeTags[n] = '' +}) + +/** + * Converts text with ANSI color codes to HTML markup. + * @param {String} text + * @returns {*} + */ +function ansiHTML (text) { + // Returns the text if the string has no ANSI escape code. + if (!_regANSI.test(text)) { + return text + } + + // Cache opened sequence. + var ansiCodes = [] + // Replace with markup. + var ret = text.replace(/\033\[(\d+)m/g, function (match, seq) { + var ot = _openTags[seq] + if (ot) { + // If current sequence has been opened, close it. + if (!!~ansiCodes.indexOf(seq)) { // eslint-disable-line no-extra-boolean-cast + ansiCodes.pop() + return '' + } + // Open tag. + ansiCodes.push(seq) + return ot[0] === '<' ? ot : '' + } + + var ct = _closeTags[seq] + if (ct) { + // Pop sequence + ansiCodes.pop() + return ct + } + return '' + }) + + // Make sure tags are closed. + var l = ansiCodes.length + ;(l > 0) && (ret += Array(l + 1).join('')) + + return ret +} + +/** + * Customize colors. + * @param {Object} colors reference to _defColors + */ +ansiHTML.setColors = function (colors) { + if (typeof colors !== 'object') { + throw new Error('`colors` parameter must be an Object.') + } + + var _finalColors = {} + for (var key in _defColors) { + var hex = colors.hasOwnProperty(key) ? colors[key] : null + if (!hex) { + _finalColors[key] = _defColors[key] + continue + } + if ('reset' === key) { + if (typeof hex === 'string') { + hex = [hex] + } + if (!Array.isArray(hex) || hex.length === 0 || hex.some(function (h) { + return typeof h !== 'string' + })) { + throw new Error('The value of `' + key + '` property must be an Array and each item could only be a hex string, e.g.: FF0000') + } + var defHexColor = _defColors[key] + if (!hex[0]) { + hex[0] = defHexColor[0] + } + if (hex.length === 1 || !hex[1]) { + hex = [hex[0]] + hex.push(defHexColor[1]) + } + + hex = hex.slice(0, 2) + } else if (typeof hex !== 'string') { + throw new Error('The value of `' + key + '` property must be a hex string, e.g.: FF0000') + } + _finalColors[key] = hex + } + _setTags(_finalColors) +} + +/** + * Reset colors. + */ +ansiHTML.reset = function () { + _setTags(_defColors) +} + +/** + * Expose tags, including open and close. + * @type {Object} + */ +ansiHTML.tags = {} + +if (Object.defineProperty) { + Object.defineProperty(ansiHTML.tags, 'open', { + get: function () { return _openTags } + }) + Object.defineProperty(ansiHTML.tags, 'close', { + get: function () { return _closeTags } + }) +} else { + ansiHTML.tags.open = _openTags + ansiHTML.tags.close = _closeTags +} + +function _setTags (colors) { + // reset all + _openTags['0'] = 'font-weight:normal;opacity:1;color:#' + colors.reset[0] + ';background:#' + colors.reset[1] + // inverse + _openTags['7'] = 'color:#' + colors.reset[1] + ';background:#' + colors.reset[0] + // dark grey + _openTags['90'] = 'color:#' + colors.darkgrey + + for (var code in _styles) { + var color = _styles[code] + var oriColor = colors[color] || '000' + _openTags[code] = 'color:#' + oriColor + code = parseInt(code) + _openTags[(code + 10).toString()] = 'background:#' + oriColor + } +} + +ansiHTML.reset() + + +/***/ }), + +/***/ "./src/DistortableCollection.js": +/*!**************************************!*\ + !*** ./src/DistortableCollection.js ***! + \**************************************/ +/***/ (function() { + +var arr = []; +L.DistortableCollection = L.FeatureGroup.extend({ + options: { + editable: true, + exportOpts: { + exportStartUrl: '//export.mapknitter.org/export', + statusUrl: '//export.mapknitter.org', + exportUrl: 'http://export.mapknitter.org/' + } + }, + initialize: function initialize(options) { + L.setOptions(this, options); + L.FeatureGroup.prototype.initialize.call(this, options); + L.Utils.initTranslation.call(this); + this.editable = this.options.editable; + }, + onAdd: function onAdd(map) { + L.FeatureGroup.prototype.onAdd.call(this, map); + this._map = map; + + if (this.editable) { + this.editing.enable(); + } + /** + * although we have a DistortableCollection.Edit class that handles collection events to keep our code managable, + * events that need to be added on individual images are kept here to do so through `layeradd`. + */ + + + this.on('layeradd', this._addEvents, this); + this.on('layerremove', this._removeEvents, this); + }, + onRemove: function onRemove() { + if (this.editing) { + this.editing.disable(); + } + + this.off('layeradd', this._addEvents, this); + this.off('layerremove', this._removeEvents, this); + }, + _addEvents: function _addEvents(e) { + var layer = e.layer; + L.DomEvent.on(layer, { + dragstart: this._dragStartMultiple, + drag: this._dragMultiple + }, this); + L.DomEvent.on(layer.getElement(), { + mousedown: this._deselectOthers, + + /* Enable longpress for multi select for touch devices. */ + contextmenu: this._longPressMultiSelect + }, this); + }, + _removeEvents: function _removeEvents(e) { + var layer = e.layer; + L.DomEvent.off(layer, { + dragstart: this._dragStartMultiple, + drag: this._dragMultiple + }, this); + L.DomEvent.off(layer.getElement(), { + mousedown: this._deselectOthers, + contextmenu: this._longPressMultiSelect + }, this); + }, + _longPressMultiSelect: function _longPressMultiSelect(e) { + var _this = this; + + if (!this.editable) { + return; + } + + e.preventDefault(); + this.eachLayer(function (layer) { + var edit = layer.editing; + + if (layer.getElement() === e.target && edit.enabled()) { + L.DomUtil.toggleClass(layer.getElement(), 'collected'); + + if (_this.anyCollected()) { + layer.deselect(); + + _this.editing._addToolbar(); + } else { + _this.editing._removeToolbar(); + } + } + }); + }, + isCollected: function isCollected(overlay) { + return L.DomUtil.hasClass(overlay.getElement(), 'collected'); + }, + anyCollected: function anyCollected() { + var layerArr = this.getLayers(); + return layerArr.some(this.isCollected.bind(this)); + }, + _toggleCollected: function _toggleCollected(e, layer) { + if (e.shiftKey) { + /* conditional prevents disabled images from flickering multi-select mode */ + if (layer.editing.enabled()) { + L.DomUtil.toggleClass(e.target, 'collected'); // re-order layers by _leaflet_id to match their display order in UI + // add new layer to right position and avoid repitition + + var newArr = arr.every(function (each) { + return each._leaflet_id !== layer._leaflet_id; + }); + + if (newArr) { + arr.push(layer); + } else { + arr.splice(arr.indexOf(layer), 1); + } + } + } + + if (this.anyCollected()) { + layer.deselect(); + } else { + this.editing._removeToolbar(); + } + }, + _deselectOthers: function _deselectOthers(e) { + var _this2 = this; + + if (!this.editable) { + return; + } + + this.eachLayer(function (layer) { + if (layer.getElement() !== e.target) { + layer.deselect(); + } else { + _this2._toggleCollected(e, layer); + } + }); + + if (e) { + L.DomEvent.stopPropagation(e); + } + }, + _dragStartMultiple: function _dragStartMultiple(e) { + var overlay = e.target; + var map = this._map; + var i; + + if (!this.isCollected(overlay)) { + return; + } + + this.eachLayer(function (layer) { + layer._dragStartPoints = {}; + layer.deselect(); + + for (i = 0; i < 4; i++) { + var c = layer.getCorner(i); + layer._dragStartPoints[i] = map.latLngToLayerPoint(c); + } + }); + }, + _dragMultiple: function _dragMultiple(e) { + var overlay = e.target; + var map = this._map; + + if (!this.isCollected(overlay)) { + return; + } + + var topLeft = map.latLngToLayerPoint(overlay.getCorner(0)); + + var delta = overlay._dragStartPoints[0].subtract(topLeft); + + this._updateCollectionFromPoints(delta, overlay); + }, + _toRemove: function _toRemove() { + var _this3 = this; + + var layerArr = this.getLayers(); + return layerArr.filter(function (layer) { + var mode = layer.editing._mode; + return _this3.isCollected(layer) && mode !== 'lock'; + }); + }, + _toMove: function _toMove(overlay) { + var _this4 = this; + + var layerArr = this.getLayers(); + return layerArr.filter(function (layer) { + var mode = layer.editing._mode; + return layer !== overlay && _this4.isCollected(layer) && mode !== 'lock'; + }); + }, + _updateCollectionFromPoints: function _updateCollectionFromPoints(delta, overlay) { + var layersToMove = this._toMove(overlay); + + var p = new L.Transformation(1, -delta.x, 1, -delta.y); + var i; + layersToMove.forEach(function (layer) { + var movedPoints = {}; + + for (i = 0; i < 4; i++) { + movedPoints[i] = p.transform(layer._dragStartPoints[i]); + } + + layer.setCornersFromPoints(movedPoints); + }); + }, + _getAvgCmPerPixel: function _getAvgCmPerPixel(imgs) { + var reduce = imgs.reduce(function (sum, img) { + return sum + img.cm_per_pixel; + }, 0); + return reduce / imgs.length; + }, + generateExportJson: function generateExportJson() { + var json = {}; + json.images = []; + this.eachLayer(function (layer) { + if (this.isCollected(layer)) { + var sections = layer._image.src.split('/'); + + var filename = sections[sections.length - 1]; + var zc = layer.getCorners(); + var corners = [{ + lat: zc[0].lat, + lon: zc[0].lng + }, { + lat: zc[1].lat, + lon: zc[1].lng + }, { + lat: zc[3].lat, + lon: zc[3].lng + }, { + lat: zc[2].lat, + lon: zc[2].lng + }]; + json.images.push({ + id: layer._leaflet_id, + src: layer._image.src, + width: layer._image.width, + height: layer._image.height, + image_file_name: filename, + nodes: corners, + cm_per_pixel: L.ImageUtil.getCmPerPixel(layer) + }); + } + }, this); + json.images = json.images.reverse(); + json.avg_cm_per_pixel = this._getAvgCmPerPixel(json.images); + return json; + } +}); + +L.distortableCollection = function (id, options) { + return new L.DistortableCollection(id, options); +}; + +/***/ }), + +/***/ "./src/DistortableImageOverlay.js": +/*!****************************************!*\ + !*** ./src/DistortableImageOverlay.js ***! + \****************************************/ +/***/ (function() { + +L.DistortableImageOverlay = L.ImageOverlay.extend({ + options: { + height: 200, + crossOrigin: true, + // todo: find ideal number to prevent distortions during RotateScale, and make it dynamic (remove hardcoding) + edgeMinWidth: 50, + editable: true, + mode: 'distort', + selected: false, + interactive: true, + tooltipText: 'Unknow image' + }, + initialize: function initialize(url, options) { + L.setOptions(this, options); + L.Utils.initTranslation.call(this); + this.edgeMinWidth = this.options.edgeMinWidth; + this.editable = this.options.editable; + this._selected = this.options.selected; + this._url = url; + this.rotation = {}; + this.interactive = this.options.interactive; + this.tooltipText = this.options.tooltipText; + }, + onAdd: function onAdd(map) { + var _this = this; + + this._map = map; + + if (!this.getElement()) { + this._initImage(); + } + + map.on('viewreset', this._reset, this); + + if (this.options.corners) { + this._corners = this.options.corners; + + if (map.options.zoomAnimation && L.Browser.any3d) { + map.on('zoomanim', this._animateZoom, this); + } + } // Have to wait for the image to load because need to access its w/h + + + L.DomEvent.on(this.getElement(), 'load', function () { + _this.getPane().appendChild(_this.getElement()); + + _this._initImageDimensions(); + + if (_this.options.rotation) { + var units = _this.options.rotation.deg >= 0 ? 'deg' : 'rad'; + + _this.setAngle(_this.options.rotation[units], units); + } else { + _this.rotation = { + deg: 0, + rad: 0 + }; + + _this._reset(); + } + /* Initialize default corners if not already set */ + + + if (!_this._corners) { + if (map.options.zoomAnimation && L.Browser.any3d) { + map.on('zoomanim', _this._animateZoom, _this); + } + } + /** if there is a featureGroup, only its editable option matters */ + + + var eventParents = _this._eventParents; + + if (eventParents) { + _this.eP = eventParents[Object.keys(eventParents)[0]]; + + if (_this.eP.editable) { + _this.editing.enable(); + } + } else { + if (_this.editable) { + _this.editing.enable(); + } + + _this.eP = null; + } + }); + L.DomEvent.on(this.getElement(), 'click', this.select, this); + L.DomEvent.on(map, { + singleclickon: this._singleClickListeners, + singleclickoff: this._resetClickListeners, + singleclick: this._singleClick + }, this); + /** + * custom events fired from DoubleClickLabels.js. Used to differentiate + * single / dblclick to not deselect images on map dblclick. + */ + + if (!(map.doubleClickZoom.enabled() || map.doubleClickLabels.enabled())) { + L.DomEvent.on(map, 'click', this.deselect, this); + } + + this.fire('add'); + L.DomEvent.on(this.getElement(), 'mousemove', this._activateTooltip, this); + L.DomEvent.on(this.getElement(), 'mouseout', this._closeTooltip, this); + }, + onRemove: function onRemove(map) { + L.DomEvent.off(this.getElement(), 'click', this.select, this); + L.DomEvent.off(map, { + singleclickon: this._singleClickListeners, + singleclickoff: this._resetClickListeners, + singleclick: this._singleClick + }, this); + L.DomEvent.off(map, 'click', this.deselect, this); + + if (this.editing) { + this.editing.disable(); + } + + this.fire('remove'); + L.ImageOverlay.prototype.onRemove.call(this, map); + L.DomEvent.off(this.getElement(), 'mouseover', this._deactivateTooltip, this); + }, + _initImageDimensions: function _initImageDimensions() { + var map = this._map; + var originalImageWidth = L.DomUtil.getStyle(this.getElement(), 'width'); + var originalImageHeight = L.DomUtil.getStyle(this.getElement(), 'height'); + var aspectRatio = parseInt(originalImageWidth) / parseInt(originalImageHeight); + var imageHeight = this.options.height; + var imageWidth = parseInt(aspectRatio * imageHeight); + var center = map.project(map.getCenter()); + var offset = L.point(imageWidth, imageHeight).divideBy(2); + + if (this.options.corners) { + this._corners = this.options.corners; + } else { + this._corners = [map.unproject(center.subtract(offset)), map.unproject(center.add(L.point(offset.x, -offset.y))), map.unproject(center.add(L.point(-offset.x, offset.y))), map.unproject(center.add(offset))]; + } + + this._initialDimensions = { + 'center': center, + 'offset': offset, + 'zoom': map.getZoom() + }; + this.setBounds(L.latLngBounds(this.getCorners())); + }, + _singleClick: function _singleClick(e) { + if (e.type === 'singleclick') { + this.deselect(); + } else { + return; + } + }, + _singleClickListeners: function _singleClickListeners() { + var map = this._map; + L.DomEvent.off(map, 'click', this.deselect, this); + L.DomEvent.on(map, 'singleclick', this.deselect, this); + }, + _resetClickListeners: function _resetClickListeners() { + var map = this._map; + L.DomEvent.on(map, 'click', this.deselect, this); + L.DomEvent.off(map, 'singleclick', this.deselect, this); + }, + isSelected: function isSelected() { + return this._selected; + }, + deselect: function deselect() { + var edit = this.editing; + + if (!edit.enabled()) { + return; + } + + edit._removeToolbar(); + + edit._hideMarkers(); + + this._selected = false; + this.fire('deselect'); + return this; + }, + select: function select(e) { + var edit = this.editing; + var eP = this.eP; + + if (!edit.enabled()) { + return; + } + + if (e) { + L.DomEvent.stopPropagation(e); + } // this ensures deselection of all other images, allowing us to keep collection group optional + + + this._programmaticGrouping(); + + this._selected = true; + + edit._addToolbar(); + + edit._showMarkers(); + + this.fire('select'); // we run the selection logic 1st anyway because the collection group's _addToolbar method depends on it + + if (eP && eP.anyCollected()) { + this.deselect(); + return; + } + + return this; + }, + _programmaticGrouping: function _programmaticGrouping() { + this._map.eachLayer(function (layer) { + if (layer instanceof L.DistortableImageOverlay) { + layer.deselect(); + } + }); + }, + setCorner: function setCorner(corner, latlng) { + var edit = this.editing; + this._corners[corner] = latlng; + this.setBounds(L.latLngBounds(this.getCorners())); + this.fire('update'); + + if (edit.toolbar && edit.toolbar instanceof L.DistortableImage.PopupBar) { + edit._updateToolbarPos(); + } + + this.edited = true; + return this; + }, + _cornerExceedsMapLats: function _cornerExceedsMapLats(zoom, corner, map) { + if (map.options.crs.Simple == L.CRS.Simple) { + return false; + } else { + var exceedsTop; + var exceedsBottom; + + if (zoom === 0) { + exceedsTop = map.project(corner).y < 2; + exceedsBottom = map.project(corner).y >= 255; + } else { + exceedsTop = map.project(corner).y / zoom < 2; + exceedsBottom = map.project(corner).y / Math.pow(2, zoom) >= 255; + } + + return exceedsTop || exceedsBottom; + } + }, + _activateTooltip: function _activateTooltip(ev) { + if (!this._selected) { + this.bindTooltip(this.tooltipText, { + direction: 'top' + }).openTooltip(); + } + }, + _closeTooltip: function _closeTooltip() { + this.closeTooltip(); + }, + _deactivateTooltip: function _deactivateTooltip() { + this.unbindTooltip(); + }, + setCorners: function setCorners(latlngObj) { + var map = this._map; + var zoom = map.getZoom(); + var edit = this.editing; + var i = 0; // this is to fix https://github.com/publiclab/Leaflet.DistortableImage/issues/402 + + for (var k in latlngObj) { + if (this._cornerExceedsMapLats(zoom, latlngObj[k], map)) { + // calling reset / update w/ the same corners bc it prevents a marker flicker for rotate + this.setBounds(L.latLngBounds(this.getCorners())); + this.fire('update'); + return; + } + } + + for (var _k in latlngObj) { + this._corners[i] = latlngObj[_k]; + i += 1; + } + + this.setBounds(L.latLngBounds(this.getCorners())); + this.fire('update'); + + if (edit.toolbar && edit.toolbar instanceof L.DistortableImage.PopupBar) { + edit._updateToolbarPos(); + } + + this.edited = true; + return this; + }, + setCornersFromPoints: function setCornersFromPoints(pointsObj) { + var map = this._map; + var zoom = map.getZoom(); + var edit = this.editing; + var i = 0; + + for (var k in pointsObj) { + var corner = map.layerPointToLatLng(pointsObj[k]); + + if (this._cornerExceedsMapLats(zoom, corner, map)) { + // calling reset / update w/ the same corners bc it prevents a marker flicker for rotate + this.setBounds(L.latLngBounds(this.getCorners())); + this.fire('update'); + return; + } + } + + for (var _k2 in pointsObj) { + this._corners[i] = map.layerPointToLatLng(pointsObj[_k2]); + i += 1; + } + + this.setBounds(L.latLngBounds(this.getCorners())); + this.fire('update'); + + if (edit.toolbar && edit.toolbar instanceof L.DistortableImage.PopupBar) { + edit._updateToolbarPos(); + } + + this.edited = true; + return this; + }, + scaleBy: function scaleBy(scale) { + var map = this._map; + var center = map.project(this.getCenter()); + var i; + var p; + var scaledCorners = {}; + + if (scale === 0) { + return; + } + + for (i = 0; i < 4; i++) { + p = map.project(this.getCorner(i)).subtract(center).multiplyBy(scale).add(center); + scaledCorners[i] = map.unproject(p); + } + + this.setCorners(scaledCorners); + return this; + }, + getAngle: function getAngle() { + var unit = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'deg'; + var matrix = this.getElement().style[L.DomUtil.TRANSFORM].split('matrix3d')[1].slice(1, -1).split(','); + var row0x = matrix[0]; + var row0y = matrix[1]; + var row1x = matrix[4]; + var row1y = matrix[5]; + var determinant = row0x * row1y - row0y * row1x; + var angle = L.TrigUtil.calcAngle(row0x, row0y, 'rad'); + + if (determinant < 0) { + angle += angle < 0 ? Math.PI : -Math.PI; + } + + if (angle < 0) { + angle = 2 * Math.PI + angle; + } + + return unit === 'deg' ? Math.round(L.TrigUtil.radiansToDegrees(angle)) : L.Util.formatNum(angle, 2); + }, + setAngle: function setAngle(angle) { + var unit = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'deg'; + var currentAngle = this.getAngle(unit); + var angleToRotateBy = angle - currentAngle; + this.rotateBy(angleToRotateBy, unit); + return this; + }, + rotateBy: function rotateBy(angle) { + var unit = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'deg'; + var map = this._map; + var center = map.project(this.getCenter()); + var corners = {}; + var i; + var p; + var q; + + if (unit === 'deg') { + angle = L.TrigUtil.degreesToRadians(angle); + } + + for (i = 0; i < 4; i++) { + p = map.project(this.getCorner(i)).subtract(center); + q = L.point(Math.cos(angle) * p.x - Math.sin(angle) * p.y, Math.sin(angle) * p.x + Math.cos(angle) * p.y); + corners[i] = map.unproject(q.add(center)); + } + + this.setCorners(corners); + return this; + }, + dragBy: function dragBy(formerPoint, newPoint) { + var map = this._map; + var i; + var p; + var transCorners = {}; + var delta = map.project(formerPoint).subtract(map.project(newPoint)); + + for (i = 0; i < 4; i++) { + p = map.project(this.getCorner(i)).subtract(delta); + transCorners[i] = map.unproject(p); + } + + this.setCorners(transCorners); + }, + restore: function restore() { + var map = this._map; + var center = this._initialDimensions.center; + var offset = this._initialDimensions.offset; + var zoom = this._initialDimensions.zoom; + var corners = [center.subtract(offset), center.add(L.point(offset.x, -offset.y)), center.add(L.point(-offset.x, offset.y)), center.add(offset)]; + + for (var i = 0; i < 4; i++) { + if (!map.unproject(corners[i], zoom).equals(this.getCorner(i))) { + this.setCorner(i, map.unproject(corners[i], zoom)); + } + } + + this.edited = false; + this.fire('restore'); + return this; + }, + + /* Copied from Leaflet v0.7 https://github.com/Leaflet/Leaflet/blob/66282f14bcb180ec87d9818d9f3c9f75afd01b30/src/dom/DomUtil.js#L189-L199 */ + + /* since L.DomUtil.getTranslateString() is deprecated in Leaflet v1.0 */ + _getTranslateString: function _getTranslateString(point) { + // on WebKit browsers (Chrome/Safari/iOS Safari/Android) + // using translate3d instead of translate + // makes animation smoother as it ensures HW accel is used. + // Firefox 13 doesn't care + // (same speed either way), Opera 12 doesn't support translate3d + var is3d = L.Browser.webkit3d; + var open = 'translate' + (is3d ? '3d' : '') + '('; + var close = (is3d ? ',0' : '') + ')'; + return open + point.x + 'px,' + point.y + 'px' + close; + }, + _reset: function _reset() { + var map = this._map; + var image = this.getElement(); + var latLngToLayerPoint = L.bind(map.latLngToLayerPoint, map); + + var transformMatrix = this._calculateProjectiveTransform(latLngToLayerPoint); + + var topLeft = latLngToLayerPoint(this.getCorner(0)); + var warp = L.DomUtil.getMatrixString(transformMatrix); + + var translation = this._getTranslateString(topLeft); + /* See L.DomUtil.setPosition. Mainly for the purposes of L.Draggable. */ + + + image._leaflet_pos = topLeft; + image.style[L.DomUtil.TRANSFORM] = [translation, warp].join(' '); + /* Set origin to the upper-left corner rather than + * the center of the image, which is the default. + */ + + image.style[L.DomUtil.TRANSFORM + '-origin'] = '0 0 0'; + this.rotation.deg = this.getAngle(); + this.rotation.rad = this.getAngle('rad'); + }, + + /* + * Calculates the transform string that will be + * correct *at the end* of zooming. + * Leaflet then generates a CSS3 animation between the current transform and + * future transform which makes the transition appear smooth. + */ + _animateZoom: function _animateZoom(event) { + var map = this._map; + var image = this.getElement(); + + var latLngToNewLayerPoint = function latLngToNewLayerPoint(latlng) { + return map._latLngToNewLayerPoint(latlng, event.zoom, event.center); + }; + + var transformMatrix = this._calculateProjectiveTransform(latLngToNewLayerPoint); + + var topLeft = latLngToNewLayerPoint(this.getCorner(0)); + var warp = L.DomUtil.getMatrixString(transformMatrix); + + var translation = this._getTranslateString(topLeft); + /* See L.DomUtil.setPosition. Mainly for the purposes of L.Draggable. */ + + + image._leaflet_pos = topLeft; + image.style[L.DomUtil.TRANSFORM] = [translation, warp].join(' '); + }, + getCorners: function getCorners() { + return this._corners; + }, + getCorner: function getCorner(i) { + return this._corners[i]; + }, + // image (vertex) centroid calculation + getCenter: function getCenter() { + var map = this._map; + var reduce = this.getCorners().reduce(function (agg, corner) { + return agg.add(map.project(corner)); + }, L.point(0, 0)); + return map.unproject(reduce.divideBy(4)); + }, + _calculateProjectiveTransform: function _calculateProjectiveTransform(latLngToCartesian) { + /* Setting reasonable but made-up image defaults + * allow us to place images on the map before + * they've finished downloading. */ + var offset = latLngToCartesian(this.getCorner(0)); + var w = this.getElement().offsetWidth || 500; + var h = this.getElement().offsetHeight || 375; + var c = []; + var j; + /* Convert corners to container points (i.e. cartesian coordinates). */ + + for (j = 0; j < 4; j++) { + c.push(latLngToCartesian(this.getCorner(j))._subtract(offset)); + } + /* + * This matrix describes the action of + * the CSS transform on each corner of the image. + * It maps from the coordinate system centered + * at the upper left corner of the image + * to the region bounded by the latlngs in this._corners. + * For example: + * 0, 0, c[0].x, c[0].y + * says that the upper-left corner of the image + * maps to the first latlng in this._corners. + */ + + + return L.MatrixUtil.general2DProjection(0, 0, c[0].x, c[0].y, w, 0, c[1].x, c[1].y, 0, h, c[2].x, c[2].y, w, h, c[3].x, c[3].y); + } +}); + +L.distortableImageOverlay = function (id, options) { + // remove temp + return new L.DistortableImageOverlay(id, options); // remove temp +}; + +L.Map.addInitHook(function () { + if (!L.DomUtil.hasClass(this.getContainer(), 'ldi')) { + L.DomUtil.addClass(this.getContainer(), 'ldi'); + } +}); + +/***/ }), + +/***/ "./src/components/DistortableImage.Keymapper.js": +/*!******************************************************!*\ + !*** ./src/components/DistortableImage.Keymapper.js ***! + \******************************************************/ +/***/ (function() { + +var _this = this; + +L.DomUtil = L.DomUtil || {}; +L.DistortableImage = L.DistortableImage || {}; +L.distortableImage = L.DistortableImage; +L.DistortableImage.Keymapper = L.Handler.extend({ + options: { + position: 'topright' + }, + initialize: function initialize(map, options) { + this._map = map; + L.setOptions(this, options); + }, + addHooks: function addHooks() { + if (!this._keymapper) { + this._container = this._buildContainer(); + this._scrollWrapper = this._wrap(); + this._toggler = this._createButton(); + + this._setMapper(this._container, this._scrollWrapper, this._toggler); + + L.DomEvent.on(this._toggler, 'click', this._toggleKeymapper, this); + L.DomEvent.disableClickPropagation(this._container); + L.DomEvent.disableScrollPropagation(this._container); + } + }, + removeHooks: function removeHooks() { + if (this._keymapper) { + L.DomEvent.off(this._toggler, 'click', this._toggleKeymapper, this); + L.DomUtil.remove(this._toggler); + L.DomUtil.remove(this._scrollWrapper); + L.DomUtil.remove(this._container); + this._keymapper = false; + } + }, + _buildContainer: function _buildContainer() { + var container = L.DomUtil.create('div', 'ldi-keymapper-hide'); + container.setAttribute('id', 'ldi-keymapper'); + var divider = L.DomUtil.create('br', 'divider'); + container.appendChild(divider); + return container; + }, + _createButton: function _createButton() { + var toggler = L.DomUtil.create('a', ''); + toggler.innerHTML = L.IconUtil.create('keyboard_open'); + toggler.setAttribute('id', 'toggle-keymapper'); + toggler.setAttribute('href', '#'); + toggler.setAttribute('title', 'Show keymap'); // Will force screen readers like VoiceOver to read this as "Show keymap - button" + + toggler.setAttribute('role', 'button'); + toggler.setAttribute('aria-label', 'Show keymap'); + return toggler; + }, + _wrap: function _wrap() { + var wrap = L.DomUtil.create('div', ''); + wrap.setAttribute('id', 'keymapper-wrapper'); + wrap.style.display = 'none'; + return wrap; + }, + _setMapper: function _setMapper(container, wrap, button) { + this._keymapper = L.control({ + position: this.options.position + }); + + this._keymapper.onAdd = function () { + container.appendChild(wrap); + wrap.insertAdjacentHTML('beforeend', '' + '
' + + /* eslint-disable */ + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '
Rotate Mode
R
RotateScale Mode
r
Scale Mode
s
Distort Mode
d
Drag Mode
D
Lock (Mode) / Unlock Image
l\xa0u
Stack up / down
q\xa0a
Add / Remove Image Border
b
Toggle Opacity
o
Deselect All
esc
Delete Image(s)
delete\xa0backspace
Export Image(s)
e
'); + /* eslint-enable */ + + container.appendChild(button); + return container; + }; + + this._keymapper.addTo(this._map); + }, + _toggleKeymapper: function _toggleKeymapper(e) { + e.preventDefault(); + this._container.className = this._container.className === 'ldi-keymapper leaflet-control' ? 'ldi-keymapper-hide leaflet-control' : 'ldi-keymapper leaflet-control'; + this._scrollWrapper.style.display = this._scrollWrapper.style.display === 'none' ? 'block' : 'none'; + this._toggler.innerHTML = this._toggler.innerHTML === 'close' ? L.IconUtil.create('keyboard_open') : 'close'; + L.IconUtil.toggleTitle(this._toggler, 'Show keymap', 'Hide keymap'); + L.DomUtil.toggleClass(this._toggler, 'close-icon'); + }, + _injectIconSet: function _injectIconSet() { + if (document.querySelector('#keymapper-iconset')) { + return; + } + + var el = L.DomUtil.create('div', ''); + el.id = 'keymapper-iconset'; + el.setAttribute('hidden', 'hidden'); + this._iconset = new L.KeymapperIconSet().render(); + el.innerHTML = this._iconset; + document.querySelector('.leaflet-control-container').appendChild(el); + } +}); +L.DistortableImage.Keymapper.addInitHook(function () { + L.DistortableImage.Keymapper.prototype._n = L.DistortableImage.Keymapper.prototype._n ? L.DistortableImage.Keymapper.prototype._n + 1 : 1; // dont enable keymapper for mobile + + if (L.DistortableImage.Keymapper.prototype._n === 1 && !L.Browser.mobile) { + _this.enable(); + + _this._injectIconSet(); + } +}); + +L.distortableImage.keymapper = function (map, options) { + return new L.DistortableImage.Keymapper(map, options); +}; + +/***/ }), + +/***/ "./src/edit/DistortableCollection.Edit.js": +/*!************************************************!*\ + !*** ./src/edit/DistortableCollection.Edit.js ***! + \************************************************/ +/***/ (function() { + +L.DistortableImage = L.DistortableImage || {}; // this class holds the keybindings and toolbar API for an image collection instance + +L.DistortableCollection.Edit = L.Handler.extend({ + options: { + keymap: L.distortableImage.group_action_map + }, + initialize: function initialize(group, options) { + this._group = group; + this._exportOpts = group.options.exportOpts; + L.setOptions(this, options); + L.distortableImage.group_action_map.Escape = '_decollectAll'; + }, + addHooks: function addHooks() { + var group = this._group; + var map = group._map; + this.editActions = this.options.actions; + this.runExporter = L.bind(L.Utils.getNestedVal(this, '_exportOpts', 'exporter') || this.startExport, this); + L.DomEvent.on(document, 'keydown', this._onKeyDown, this); + + if (!(map.doubleClickZoom.enabled() || map.doubleClickLabels.enabled())) { + L.DomEvent.on(map, 'click', this._decollectAll, this); + } + + L.DomEvent.on(map, { + singleclickon: this._singleClickListeners, + singleclickoff: this._resetClickListeners, + singleclick: this._singleClick, + boxcollectend: this._addCollections + }, this); + this._group.editable = true; + + this._group.eachLayer(function (layer) { + return layer.editing.enable(); + }); + }, + removeHooks: function removeHooks() { + var group = this._group; + var map = group._map; + L.DomEvent.off(document, 'keydown', this._onKeyDown, this); + + if (!(map.doubleClickZoom.enabled() || map.doubleClickLabels.enabled())) { + L.DomEvent.off(map, 'click', this._decollectAll, this); + } + + L.DomEvent.off(map, { + singleclickon: this._singleClickListeners, + singleclickoff: this._resetClickListeners, + singleclick: this._singleClick, + boxcollectend: this._addCollections + }, this); + + this._decollectAll(); + + this._group.editable = false; + + this._group.eachLayer(function (layer) { + return layer.editing.disable(); + }); + }, + enable: function enable() { + this._enabled = true; + this.addHooks(); + return this; + }, + disable: function disable() { + this._enabled = false; + this.removeHooks(); + return this; + }, + _onKeyDown: function _onKeyDown(e) { + var keymap = this.options.keymap; + var handlerName = keymap[e.key]; + + if (!this[handlerName]) { + return; + } + + if (this._group.anyCollected()) { + this[handlerName].call(this); + } + }, + _singleClick: function _singleClick(e) { + if (e.type === 'singleclick') { + this._decollectAll(e); + } else { + return; + } + }, + _singleClickListeners: function _singleClickListeners() { + var map = this._group._map; + L.DomEvent.off(map, 'click', this._decollectAll, this); + L.DomEvent.on(map, 'singleclick', this._decollectAll, this); + }, + _resetClickListeners: function _resetClickListeners() { + var map = this._group._map; + L.DomEvent.on(map, 'click', this._decollectAll, this); + L.DomEvent.off(map, 'singleclick', this._decollectAll, this); + }, + _decollectAll: function _decollectAll(e) { + var oe; + + if (e) { + oe = e.originalEvent; + } + /** + * prevents image deselection following the 'boxcollectend' event - note 'shift' must not be released until dragging is complete + * also prevents deselection following a click on a disabled img by differentiating it from the map + */ + + + if (oe && (oe.shiftKey || oe.target instanceof HTMLImageElement)) { + return; + } + + this._group.eachLayer(function (layer) { + L.DomUtil.removeClass(layer.getElement(), 'collected'); + layer.deselect(); + }); + + this._removeToolbar(); + + if (e) { + L.DomEvent.stopPropagation(e); + } + }, + _unlockGroup: function _unlockGroup() { + var _this = this; + + if (!this.hasTool(L.UnlockAction)) { + return; + } + + this._group.eachLayer(function (layer) { + if (_this._group.isCollected(layer)) { + var edit = layer.editing; + + edit._unlock(); // unlock updates the layer's handles; deselect to ensure they're hidden + + + layer.deselect(); + } + }); + }, + _lockGroup: function _lockGroup() { + var _this2 = this; + + if (!this.hasTool(L.LockAction)) { + return; + } + + this._group.eachLayer(function (layer) { + if (_this2._group.isCollected(layer)) { + var edit = layer.editing; + + edit._lock(); // map.addLayer also deselects the image, so we reselect here + + + L.DomUtil.addClass(layer.getElement(), 'collected'); + } + }); + }, + _addCollections: function _addCollections(e) { + var _this3 = this; + + var box = e.boxCollectBounds; + var map = this._group._map; + + this._group.eachLayer(function (layer) { + var edit = layer.editing; + + if (layer.isSelected()) { + layer.deselect(); + } + + var zoom = map.getZoom(); + var center = map.getCenter(); + var imgBounds = L.latLngBounds(layer.getCorner(2), layer.getCorner(1)); + imgBounds = map._latLngBoundsToNewLayerBounds(imgBounds, zoom, center); + + if (box.intersects(imgBounds) && edit.enabled()) { + if (!_this3.toolbar) { + _this3._addToolbar(); + } + + L.DomUtil.addClass(layer.getElement(), 'collected'); + } + }); + }, + _removeGroup: function _removeGroup(e) { + var _this4 = this; + + if (!this.hasTool(L.DeleteAction)) { + return; + } + + var layersToRemove = this._group._toRemove(); + + var n = layersToRemove.length; + + if (n === 0) { + return; + } + + var choice = L.DomUtil.confirmDeletes(n); + + if (choice) { + layersToRemove.forEach(function (layer) { + _this4._group.removeLayer(layer); + }); + + if (!this._group.anyCollected()) { + this._removeToolbar(); + } + } + + if (e) { + L.DomEvent.stopPropagation(e); + } + }, + cancelExport: function cancelExport() { + if (!this.customCollection) { + this._exportOpts.collection = undefined; + } + + clearInterval(this.updateInterval); + }, + _addToolbar: function _addToolbar() { + var group = this._group; + var map = group._map; + + if (group.options.suppressToolbar || this.toolbar) { + return; + } + + this.toolbar = L.distortableImage.controlBar({ + actions: this.editActions, + position: 'topleft' + }).addTo(map, group); + }, + _removeToolbar: function _removeToolbar() { + var map = this._group._map; + + if (this.toolbar) { + map.removeLayer(this.toolbar); + this.toolbar = false; + } else { + return false; + } + }, + hasTool: function hasTool(value) { + return this.editActions.some(function (action) { + return action === value; + }); + }, + addTool: function addTool(value) { + if (value.baseClass === 'leaflet-toolbar-icon' && !this.hasTool(value)) { + this._removeToolbar(); + + this.editActions.push(value); + + this._addToolbar(); + } + + return this; + }, + removeTool: function removeTool(value) { + var _this5 = this; + + this.editActions.some(function (item, idx) { + if (_this5.editActions[idx] === value) { + _this5._removeToolbar(); + + _this5.editActions.splice(idx, 1); + + _this5._addToolbar(); + + return true; + } else { + return false; + } + }); + return this; + }, + startExport: function startExport() { + var _this6 = this; + + if (!this.hasTool(L.ExportAction)) { + return; + } + + return new Promise(function (resolve) { + var opts = _this6._exportOpts; + opts.resolve = resolve; // allow resolving promise in user-defined functions, to stop spinner on completion + + var statusUrl; + _this6.updateInterval = null; // this may be overridden to update the UI to show export progress or completion + + var _defaultUpdater = function _defaultUpdater(data) { + data = JSON.parse(data); // optimization: fetch status directly from google storage: + + if (data.status_url) { + if (statusUrl !== data.status_url && data.status_url.match('.json')) { + // if (data.status_url && data.status_url.substr(0,1) === "/") { + // opts.statusUrl = opts.statusUrl + data.status_url; + // } else { + statusUrl = data.status_url; // } + } + + if (data.status === 'complete') { + clearInterval(_this6.updateInterval); + + if (!_this6.customCollection) { + _this6._exportOpts.collection = undefined; + } + + resolve(); + + if (data.jpg !== null) { + alert('Export succeeded. ' + opts.exportUrl + data.jpg); + } + } // TODO: update to clearInterval when status == "failed" if we update that in this file: + // https://github.com/publiclab/mapknitter-exporter/blob/main/lib/mapknitterExporter.rb + + + console.log(data); + } + }; // receives the URL of status.json, and starts running the updater to repeatedly fetch from status.json; + // this may be overridden to integrate with any UI + + + var _defaultHandleStatusRes = function _defaultHandleStatusRes(data) { + statusUrl = opts.statusUrl + data; // repeatedly fetch the status.json + + _this6.updateInterval = setInterval(function () { + var reqOpts = { + method: 'GET' + }; + var req = new Request("".concat(statusUrl, "?").concat(Date.now()), reqOpts); + fetch(req).then(function (res) { + if (res.ok) { + return res.text(); + } + }).then(opts.updater); + }, opts.frequency); + }; // initiate the export + + + var _defaultFetchStatusUrl = function _defaultFetchStatusUrl(mergedOpts) { + var form = new FormData(); + form.append('collection', JSON.stringify(mergedOpts.collection)); + form.append('scale', mergedOpts.scale); + form.append('upload', true); + var reqOpts = { + method: 'POST', + body: form + }; + var req = new Request(mergedOpts.exportStartUrl, reqOpts); + fetch(req).then(function (res) { + if (res.ok) { + return res.text(); + } + }).then(mergedOpts.handleStatusRes); + }; // If the user has passed collection property + + + _this6.customCollection = !!opts.collection; + + if (!_this6.customCollection) { + opts.collection = _this6._group.generateExportJson().images; + } + + opts.frequency = opts.frequency || 3000; + opts.scale = opts.scale || 100; // switch it to _getAvgCmPerPixel ! + + opts.updater = opts.updater || _defaultUpdater; + opts.handleStatusRes = opts.handleStatusRes || _defaultHandleStatusRes; + opts.fetchStatusUrl = opts.fetchStatusUrl || _defaultFetchStatusUrl; + opts.fetchStatusUrl(opts); + }); + } +}); + +L.distortableCollection.edit = function (group, options) { + return new L.DistortableCollection.Edit(group, options); +}; + +/***/ }), + +/***/ "./src/edit/DistortableImage.Edit.js": +/*!*******************************************!*\ + !*** ./src/edit/DistortableImage.Edit.js ***! + \*******************************************/ +/***/ (function() { + +L.DistortableImage = L.DistortableImage || {}; // holds the keybindings & toolbar API for an individual image instance + +L.DistortableImage.Edit = L.Handler.extend({ + options: { + opacity: 0.7, + outline: '1px solid red', + keymap: L.distortableImage.action_map + }, + initialize: function initialize(overlay, options) { + this._overlay = overlay; + this._toggledImage = false; + this._mode = overlay.options.mode; + this._transparent = false; + this._outlined = false; + L.setOptions(this, options); + L.distortableImage.action_map.Escape = '_deselect'; + }, + + /* Run on image selection. */ + addHooks: function addHooks() { + var overlay = this._overlay; + this.editActions = this.options.actions; + /* bring the selected image into view */ + + overlay.bringToFront(); + + this._initModes(); + + this._initHandles(); + + this._appendHandlesandDragable(); + + if (overlay.isSelected() && !overlay.options.suppressToolbar) { + this._addToolbar(); + } + + this.parentGroup = overlay.eP ? overlay.eP : false; + L.DomEvent.on(overlay.getElement(), { + dblclick: this.nextMode + }, this); + L.DomEvent.on(window, 'keydown', this._onKeyDown, this); + }, + + /* Run on image deselection. */ + removeHooks: function removeHooks() { + var overlay = this._overlay; + var eP = this.parentGroup; // First, check if dragging exists - it may be off due to locking + + this._disableDragging(); + + if (this.toolbar) { + this._removeToolbar(); + } + + for (var handle in this._handles) { + L.DomUtil.remove(handle); + } + /** + * ensures if you disable an image while it is multi-selected + * additional deselection logic is run + */ + + + if (L.DomUtil.hasClass(overlay.getElement(), 'collected')) { + L.DomUtil.removeClass(overlay.getElement(), 'collected'); + } + + if (eP && !eP.anyCollected() && eP.editing.toolbar) { + eP.editing._removeToolbar(); + } + + L.DomEvent.off(overlay.getElement(), { + dblclick: this.nextMode + }, this); + L.DomEvent.off(window, 'keydown', this._onKeyDown, this); + }, + disable: function disable() { + if (!this._enabled) { + return this; + } + + this._overlay.deselect(); + + this._enabled = false; + this.removeHooks(); + return this; + }, + _initModes: function _initModes() { + this._modes = {}; // passed from L.DistortablImage.PopupBar. If the mode is one + // of the current toolbar actions, adds it to this._modes + + for (var mode in L.DistortableImage.Edit.MODES) { + var action = L.DistortableImage.Edit.MODES[mode]; + + if (this.editActions.indexOf(action) !== -1) { + this._modes[mode] = action; + } + } // sets the current mode to the 1st available one if the one selected + // during initialization is not available + + + if (!this._modes[this._mode]) { + this._mode = Object.keys(this._modes)[0]; + } + }, + _initHandles: function _initHandles() { + var overlay = this._overlay; + var i; + this._dragHandles = L.layerGroup(); + + for (i = 0; i < 4; i++) { + this._dragHandles.addLayer(L.dragHandle(overlay, i)); + } + + this._scaleHandles = L.layerGroup(); + + for (i = 0; i < 4; i++) { + this._scaleHandles.addLayer(L.scaleHandle(overlay, i)); + } + + this._distortHandles = L.layerGroup(); + + for (i = 0; i < 4; i++) { + this._distortHandles.addLayer(L.distortHandle(overlay, i)); + } + + this._rotateHandles = L.layerGroup(); // individual rotate + + for (i = 0; i < 4; i++) { + this._rotateHandles.addLayer(L.rotateHandle(overlay, i)); + } // handle includes rotate AND scale + + + this._freeRotateHandles = L.layerGroup(); + + for (i = 0; i < 4; i++) { + this._freeRotateHandles.addLayer(L.freeRotateHandle(overlay, i)); + } + + this._lockHandles = L.layerGroup(); + + for (i = 0; i < 4; i++) { + this._lockHandles.addLayer(L.lockHandle(overlay, i, { + draggable: false + })); + } + + this._handles = { + drag: this._dragHandles, + scale: this._scaleHandles, + distort: this._distortHandles, + rotate: this._rotateHandles, + freeRotate: this._freeRotateHandles, + lock: this._lockHandles + }; + }, + _appendHandlesandDragable: function _appendHandlesandDragable() { + var ov = this._overlay; // won't throw error if user adds 0 mode actions to toolbar + + if (!this._mode) { + this._enableDragging(); + + return; + } + + this._updateHandle(); + + if (!ov.isSelected() && this.currentHandle) { + this.currentHandle.eachLayer(function (handle) { + handle.setOpacity(0); + + if (handle.dragging) { + handle.dragging.disable(); + } + }); + } + + if (!this.isMode('lock')) { + this._enableDragging(); + } + }, + _onKeyDown: function _onKeyDown(e) { + var keymap = this.options.keymap; + var handlerName = keymap[e.key]; + var ov = this._overlay; + var eP = this.parentGroup; + + if (eP && eP.anyCollected()) { + return; + } + + if (this[handlerName] !== undefined && !ov.options.suppressToolbar) { + if (ov.isSelected() && this.toolbar) { + this[handlerName].call(this); + } + } + }, + replaceTool: function replaceTool(old, next) { + var _this = this; + + if (next.baseClass !== 'leaflet-toolbar-icon' || this.hasTool(next)) { + return this; + } + + this.editActions.some(function (item, idx) { + if (item === old) { + _this._removeToolbar(); + + _this.editActions[idx] = next; + + _this._addToolbar(); + + for (var mode in L.DistortableImage.Edit.MODES) { + if (L.DistortableImage.Edit.MODES[mode] === old) { + delete _this._modes[mode]; + + _this._nextOrNone(mode); + } else if (L.DistortableImage.Edit.MODES[mode] === next) { + _this._modes[mode] = next; + } + } + + return true; + } + }); + return this; + }, + addTool: function addTool(value) { + if (value.baseClass === 'leaflet-toolbar-icon' && !this.hasTool(value)) { + this._removeToolbar(); + + this.editActions.push(value); + + this._addToolbar(); + + for (var mode in L.DistortableImage.Edit.MODES) { + if (L.DistortableImage.Edit.MODES[mode] === value) { + this._modes[mode] = value; + } + } + + if (!this._overlay.isSelected()) { + this._removeToolbar(); + } + } + + return this; + }, + hasTool: function hasTool(value) { + return this.editActions.some(function (action) { + return action === value; + }); + }, + removeTool: function removeTool(value) { + var _this2 = this; + + this.editActions.some(function (item, idx) { + if (item === value) { + _this2._removeToolbar(); + + _this2.editActions.splice(idx, 1); + + _this2._addToolbar(); + + for (var mode in L.DistortableImage.Edit.MODES) { + if (L.DistortableImage.Edit.MODES[mode] === value) { + delete _this2._modes[mode]; + + _this2._nextOrNone(mode); + } + } + + return true; + } + }); + + if (!this._overlay.isSelected()) { + this._removeToolbar(); + } + + return this; + }, + // set the mode to the next mode or if that was the last one set mode to '' + _nextOrNone: function _nextOrNone(mode) { + if (this.isMode(mode)) { + if (Object.keys(this.getModes()).length >= 1) { + this.nextMode(); + } else { + if (mode === 'lock') { + this._enableDragging(); + } + + this._mode = ''; + + this._updateHandle(); + } + } + }, + _removeToolbar: function _removeToolbar() { + var ov = this._overlay; + var map = ov._map; + + if (this.toolbar) { + map.removeLayer(this.toolbar); + this.toolbar = false; + } + }, + _enableDragging: function _enableDragging() { + var _this3 = this; + + var overlay = this._overlay; + var map = overlay._map; + this.dragging = new L.Draggable(overlay.getElement()); + this.dragging.enable(); + /* Hide toolbars and markers while dragging; click will re-show it */ + + this.dragging.on('dragstart', function () { + overlay.fire('dragstart'); + + _this3._removeToolbar(); + }); + /* + * Adjust default behavior of L.Draggable, which overwrites the CSS3 + * distort transformations that we set when it calls L.DomUtil.setPosition. + */ + + this.dragging._updatePosition = function () { + var topLeft = overlay.getCorner(0); + + var delta = this._newPos.subtract(map.latLngToLayerPoint(topLeft)); + + var currentPoint; + var corners = {}; + var i; + this.fire('predrag'); + + for (i = 0; i < 4; i++) { + currentPoint = map.latLngToLayerPoint(overlay.getCorner(i)); + corners[i] = map.layerPointToLatLng(currentPoint.add(delta)); + } + + overlay.setCorners(corners); + overlay.fire('drag'); + this.fire('drag'); + }; + + this.dragging.on('dragend', function () { + overlay.fire('dragend'); + }); + }, + _disableDragging: function _disableDragging() { + if (this.dragging) { + this.dragging.disable(); + delete this.dragging; + } + }, + _dragMode: function _dragMode() { + this.setMode('drag'); + }, + _scaleMode: function _scaleMode() { + this.setMode('scale'); + }, + _distortMode: function _distortMode() { + this.setMode('distort'); + }, + _rotateMode: function _rotateMode() { + this.setMode('rotate'); + }, + _freeRotateMode: function _freeRotateMode() { + this.setMode('freeRotate'); + }, + _toggleLockMode: function _toggleLockMode() { + if (this.isMode('lock')) { + this._unlock(); + } else { + this._lock(); + } + }, + _toggleOpacity: function _toggleOpacity() { + var image = this._overlay.getElement(); + + if (!this.hasTool(L.OpacityAction)) { + return; + } + + this._transparent = !this._transparent; + var opacity = this._transparent ? this.options.opacity : 1; + L.DomUtil.setOpacity(image, opacity); + image.setAttribute('opacity', opacity); + + this._refresh(); + }, + _toggleBorder: function _toggleBorder() { + var image = this._overlay.getElement(); + + if (!this.hasTool(L.BorderAction)) { + return; + } + + this._outlined = !this._outlined; + var outline = this._outlined ? this.options.outline : 'none'; + image.style.outline = outline; + + this._refresh(); + }, + // compare this to using overlay zIndex + _toggleOrder: function _toggleOrder() { + if (this._toggledImage) { + this._stackUp(); + } else { + this._stackDown(); + } + }, + _removeOverlay: function _removeOverlay() { + var ov = this._overlay; + var eP = this.parentGroup; + + if (this.isMode('lock') || !this.hasTool(L.DeleteAction)) { + return; + } + + var choice = L.DomUtil.confirmDelete(); + + if (!choice) { + return; + } + + this._removeToolbar(); + + if (eP) { + eP.removeLayer(ov); + } else { + ov._map.removeLayer(ov); + } + }, + // Based on https://github.com/publiclab/mapknitter/blob/8d94132c81b3040ae0d0b4627e685ff75275b416/app/assets/javascripts/mapknitter/Map.js#L47-L82 + _getExport: function _getExport() { + var overlay = this._overlay; + var map = overlay._map; + var img = overlay.getElement(); + + if (!this.hasTool(L.ExportAction)) { + return; + } // make a new image + + + var downloadable = new Image(); + downloadable.id = downloadable.id || 'tempId12345'; + document.body.appendChild(downloadable); + + downloadable.onload = function onLoadDownloadableImage() { + var height = downloadable.height; + var width = downloadable.width; + var nw = map.latLngToLayerPoint(overlay.getCorner(0)); + var ne = map.latLngToLayerPoint(overlay.getCorner(1)); + var sw = map.latLngToLayerPoint(overlay.getCorner(2)); + var se = map.latLngToLayerPoint(overlay.getCorner(3)); // I think this is to move the image to the upper left corner, + // eslint-disable-next-line max-len + // jywarren: i think we may need these or the image goes off the edge of the canvas + // jywarren: but these seem to break the distortion math... + // jywarren: i think it should be rejiggered so it + // finds the most negative values of x and y and then + // adds those to all coordinates + // nw.x -= nw.x; + // ne.x -= nw.x; + // se.x -= nw.x; + // sw.x -= nw.x; + // nw.y -= nw.y; + // ne.y -= nw.y; + // se.y -= nw.y; + // sw.y -= nw.y; + // run once warping is complete + + downloadable.onload = function () { + L.DomUtil.remove(downloadable); + }; + + if (window && window.hasOwnProperty('warpWebGl')) { + warpWebGl(downloadable.id, [0, 0, width, 0, width, height, 0, height], [nw.x, nw.y, ne.x, ne.y, se.x, se.y, sw.x, sw.y], true // trigger download + ); + } + }; + + downloadable.src = overlay.options.fullResolutionSrc || img.src; + }, + _stackUp: function _stackUp() { + var t = this._toggledImage; + + if (!t || !this.hasTool(L.StackAction)) { + return; + } + + this._toggledImage = false; + + this._overlay.bringToFront(); + + this._refresh(); + }, + _stackDown: function _stackDown() { + var t = this._toggledImage; + + if (t || !this.hasTool(L.StackAction)) { + return; + } + + this._toggledImage = true; + + this._overlay.bringToBack(); + + this._refresh(); + }, + _unlock: function _unlock() { + var ov = this._overlay; + var map = ov._map; + var eP = this.parentGroup; + + if (!this.isMode('lock')) { + return; + } + + if (eP && !eP.isCollected(ov) || !eP) { + if (!this.hasTool(L.LockAction)) { + return; + } + } + + if (this.currentHandle) { + map.removeLayer(this.currentHandle); + } + + if (ov.options.mode === 'lock' || !this.hasMode(ov.options.mode)) { + this._mode = ''; + this.currentHandle = ''; + } else { + this._mode = ov.options.mode; + } + + this._updateHandle(); + + this._enableDragging(); + + this._refresh(); + }, + _lock: function _lock() { + var ov = this._overlay; + var map = ov._map; + var eP = this.parentGroup; + + if (this.isMode('lock')) { + return; + } + + if (eP && !eP.isCollected(ov) || !eP) { + if (!this.hasTool(L.LockAction)) { + return; + } + } + + if (this.currentHandle) { + map.removeLayer(this.currentHandle); + } + + this._mode = 'lock'; + + this._updateHandle(); + + this._disableDragging(); + + this._refresh(); + }, + _deselect: function _deselect() { + this._overlay.deselect(); + }, + _showMarkers: function _showMarkers(e) { + var eP = this.parentGroup; + + if (!this.currentHandle) { + return; + } // only markers we want in collect interface for now is lock + + + if (!this.isMode('lock') && eP && eP.anyCollected()) { + return; + } + + this.currentHandle.eachLayer(function (handle) { + handle.setOpacity(1); + + if (handle.dragging) { + handle.dragging.enable(); + } + + L.DomUtil.addClass(handle.getElement(), 'leaflet-interactive'); + }); + }, + _hideMarkers: function _hideMarkers() { + var ov = this._overlay; + var eP = this.parentGroup; // workaround for race condition w/ feature group + + if (!this._handles) { + this._initHandles(); + } + + if (!this.currentHandle) { + return; + } + + if (this.isMode('lock') && eP && eP.isCollected(ov)) { + return; + } + + this.currentHandle.eachLayer(function (handle) { + handle.setOpacity(0); + + if (handle.dragging) { + handle.dragging.disable(); + } + + L.DomUtil.removeClass(handle.getElement(), 'leaflet-interactive'); + }); + }, + _updateHandle: function _updateHandle() { + var ov = this._overlay; + var map = ov._map; + var mode = this.getMode(); + + if (this.currentHandle) { + map.removeLayer(this.currentHandle); + } + + this.currentHandle = mode === '' ? '' : this._handles[mode]; + + if (this.currentHandle !== '') { + map.addLayer(this.currentHandle); + } + }, + _addToolbar: function _addToolbar() { + var ov = this._overlay; + var eP = this.parentGroup; + var map = ov._map; // Find the topmost point on the image. + + var corners = ov.getCorners(); + var maxLat = -Infinity; + + if (eP && eP.anyCollected()) { + eP.editing._addToolbar(); + + return; + } + + if (ov.options.suppressToolbar || this.toolbar) { + return; + } + + for (var i = 0; i < corners.length; i++) { + if (corners[i].lat > maxLat) { + maxLat = corners[i].lat; + } + } // Longitude is based on the centroid of the image. + + + var raisedPoint = ov.getCenter(); + raisedPoint.lat = maxLat; + this.toolbar = L.distortableImage.popupBar(raisedPoint, { + actions: this.editActions + }).addTo(map, ov); + ov.fire('toolbar:created'); + }, + _refresh: function _refresh() { + if (this.toolbar) { + this._removeToolbar(); + } + + this._addToolbar(); + }, + _updateToolbarPos: function _updateToolbarPos() { + var overlay = this._overlay; // Find the topmost point on the image. + + var corners = overlay.getCorners(); + var toolbar = this.toolbar; + var maxLat = -Infinity; + + if (toolbar && toolbar instanceof L.DistortableImage.PopupBar) { + for (var i = 0; i < corners.length; i++) { + if (corners[i].lat > maxLat) { + maxLat = corners[i].lat; + } + } // Longitude is based on the centroid of the image. + + + var raisedPoint = overlay.getCenter(); + raisedPoint.lat = maxLat; + + if (!overlay.options.suppressToolbar) { + this.toolbar.setLatLng(raisedPoint); + } + } + }, + hasMode: function hasMode(mode) { + return !!this._modes[mode]; + }, + getMode: function getMode() { + if (!this.enabled()) { + return; + } + + return this._mode; + }, + getModes: function getModes() { + return this._modes; + }, + isMode: function isMode(mode) { + if (!this.enabled()) { + return false; + } + + return this._mode === mode; + }, + setMode: function setMode(newMode) { + var ov = this._overlay; + var eP = this.parentGroup; + var mode = this.getMode(); + + if (mode === newMode || !this.hasMode(newMode) || !this.enabled()) { + return; + } + + if (this.toolbar) { + this.toolbar.clickTool(newMode); + } + + if (this.isMode('lock') && !this.dragging) { + this._enableDragging(); + } + + this._mode = newMode; + + if (this.isMode('lock')) { + this._disableDragging(); + } + + this._updateHandle(); + + this._refresh(); + + if (eP && eP.isCollected(ov)) { + ov.deselect(); + } + + return this; + }, + + /** + * need to attach a stop to img dblclick or it will propagate to + * the map and fire the handler that shows map location labels on map dblclick. + */ + nextMode: function nextMode(e) { + var mode = this.getMode(); + var eP = this.parentGroup; + var modesArray = Object.keys(this.getModes()); + var idx = modesArray.indexOf(mode); + var nextIdx = (idx + 1) % modesArray.length; + var newMode = modesArray[nextIdx]; + + if (e) { + if (eP && eP.anyCollected()) { + return; + } + + L.DomEvent.stop(e); + } + + return this.setMode(newMode); + } +}); + +L.distortableImage.edit = function (overlay, options) { + return new L.DistortableImage.Edit(overlay, options); +}; + +/***/ }), + +/***/ "./src/edit/actions/BorderAction.js": +/*!******************************************!*\ + !*** ./src/edit/actions/BorderAction.js ***! + \******************************************/ +/***/ (function() { + +L.BorderAction = L.EditAction.extend({ + initialize: function initialize(map, overlay, options) { + var edit = overlay.editing; + var mode = edit._mode; + var use; + var tooltip; + + if (edit._outlined) { + use = 'border_outer'; + tooltip = overlay.options.translation.removeBorder; + } else { + use = 'border_clear'; + tooltip = overlay.options.translation.addBorder; + } + + options = options || {}; + options.toolbarIcon = { + svg: true, + html: use, + tooltip: tooltip, + className: mode === 'lock' ? 'disabled' : '' + }; // conditional for disabling keybindings for this action when the image is locked. + + L.DistortableImage.action_map.b = mode === 'lock' ? '' : '_toggleBorder'; + L.EditAction.prototype.initialize.call(this, map, overlay, options); + }, + addHooks: function addHooks() { + var edit = this._overlay.editing; + L.IconUtil.toggleXlink(this._link, 'border_clear', 'border_outer'); + L.IconUtil.toggleTitle(this._link, 'Remove Border', 'Add Border'); + + edit._toggleBorder(); + } +}); + +/***/ }), + +/***/ "./src/edit/actions/DeleteAction.js": +/*!******************************************!*\ + !*** ./src/edit/actions/DeleteAction.js ***! + \******************************************/ +/***/ (function() { + +L.DeleteAction = L.EditAction.extend({ + initialize: function initialize(map, overlay, options) { + var edit = overlay.editing; + var use = 'delete_forever'; + var tooltip; + /** + * we can tell whether the overlay is an instance of `L.DistortableImageOverlay` or `L.DistortableCollection` bc only + * the former should have `parentGroup` defined on it. From there we call the apporpriate keybindings and methods. + */ + + if (edit instanceof L.DistortableImage.Edit) { + tooltip = overlay.options.translation.deleteImage; // backspace windows / delete mac + + L.DistortableImage.action_map.Backspace = edit._mode === 'lock' ? '' : '_removeOverlay'; + } else { + tooltip = overlay.options.translation.deleteImages; + L.DistortableImage.group_action_map.Backspace = edit._mode === 'lock' ? '' : '_removeGroup'; + } + + options = options || {}; + options.toolbarIcon = { + svg: true, + html: use, + tooltip: tooltip, + className: edit._mode === 'lock' ? 'disabled' : '' + }; + L.EditAction.prototype.initialize.call(this, map, overlay, options); + }, + addHooks: function addHooks() { + var edit = this._overlay.editing; + + if (edit instanceof L.DistortableImage.Edit) { + edit._removeOverlay(); + } else { + edit._removeGroup(); + } + } +}); + +/***/ }), + +/***/ "./src/edit/actions/DistortAction.js": +/*!*******************************************!*\ + !*** ./src/edit/actions/DistortAction.js ***! + \*******************************************/ +/***/ (function() { + +L.DistortAction = L.EditAction.extend({ + initialize: function initialize(map, overlay, options) { + options = options || {}; + options.toolbarIcon = { + svg: true, + html: 'distort', + tooltip: overlay.options.translation.distortImage, + className: 'distort' + }; + L.DistortableImage.action_map.d = '_distortMode'; + L.EditAction.prototype.initialize.call(this, map, overlay, options); + }, + addHooks: function addHooks() { + var edit = this._overlay.editing; + + edit._distortMode(); + } +}); + +/***/ }), + +/***/ "./src/edit/actions/DragAction.js": +/*!****************************************!*\ + !*** ./src/edit/actions/DragAction.js ***! + \****************************************/ +/***/ (function() { + +L.DragAction = L.EditAction.extend({ + initialize: function initialize(map, overlay, options) { + options = options || {}; + options.toolbarIcon = { + svg: true, + html: 'drag', + tooltip: overlay.options.translation.dragImage, + className: 'drag' + }; + L.DistortableImage.action_map.D = '_dragMode'; + L.EditAction.prototype.initialize.call(this, map, overlay, options); + }, + addHooks: function addHooks() { + var edit = this._overlay.editing; + + edit._dragMode(); + } +}); + +/***/ }), + +/***/ "./src/edit/actions/EditAction.js": +/*!****************************************!*\ + !*** ./src/edit/actions/EditAction.js ***! + \****************************************/ +/***/ (function() { + +L.DistortableImage = L.DistortableImage || {}; +L.distortableImage = L.DistortableImage; +L.DistortableImage.action_map = {}; +L.EditAction = L.Toolbar2.Action.extend({ + options: { + toolbarIcon: { + svg: false, + html: '', + className: '', + tooltip: '' + } + }, + initialize: function initialize(map, overlay, options) { + this._overlay = overlay; + this._map = map; + L.setOptions(this, options); + L.Toolbar2.Action.prototype.initialize.call(this, options); + + this._injectIconSet(); + }, + _createIcon: function _createIcon(toolbar, container, args) { + var _this = this; + + var iconOptions = this.options.toolbarIcon; + var className = iconOptions.className; + var edit = this._overlay.editing; + this.toolbar = toolbar; + this._icon = L.DomUtil.create('li', '', container); + this._link = L.DomUtil.create('a', '', this._icon); + + if (iconOptions.svg) { + this._link.innerHTML = L.IconUtil.create(iconOptions.html); + } else { + this._link.innerHTML = iconOptions.html; + } + + this._link.setAttribute('href', '#'); + + this._link.setAttribute('title', iconOptions.tooltip); + + this._link.setAttribute('role', 'button'); + + L.DomUtil.addClass(this._link, this.constructor.baseClass); + + if (className) { + L.DomUtil.addClass(this._link, className); + + if (className === 'disabled') { + L.DomUtil.addClass(this._icon, className); + } + + if (className === edit._mode) { + L.DomUtil.addClass(this._link, 'selected-mode'); + } else { + L.DomUtil.removeClass(this._link, 'selected-mode'); + } + } + + L.DomEvent.on(this._link, 'click', this.enable, this); + L.DomEvent.on(this._overlay, 'update', function () { + var match = _this._link.innerHTML.match(/xlink:href="#restore"/); + + if (match && match.length === 1) { + _this._enableAction(); + } + }); + /* Add secondary toolbar */ + + this._addSubToolbar(toolbar, this._icon, args); + }, + _injectIconSet: function _injectIconSet() { + if (document.querySelector('#iconset')) { + return; + } + + var el = document.createElement('div'); + el.id = 'iconset'; + el.setAttribute('hidden', 'hidden'); + el.innerHTML = new L.ToolbarIconSet().render(); + document.querySelector('.leaflet-marker-pane').appendChild(el); + }, + _enableAction: function _enableAction() { + L.DomUtil.removeClass(this._link.parentElement, 'disabled'); + L.DomUtil.removeClass(this._link, 'disabled'); + }, + _disableAction: function _disableAction() { + L.DomUtil.addClass(this._link.parentElement, 'disabled'); + L.DomUtil.addClass(this._link, 'disabled'); + } +}); + +L.editAction = function (map, overlay, options) { + return new L.EditAction(map, overlay, options); +}; + +/***/ }), + +/***/ "./src/edit/actions/ExportAction.js": +/*!******************************************!*\ + !*** ./src/edit/actions/ExportAction.js ***! + \******************************************/ +/***/ (function() { + +L.ExportAction = L.EditAction.extend({ + // This function is executed every time we select an image + initialize: function initialize(map, overlay, options) { + var edit = overlay.editing; + var tooltip; + this.isExporting = false; + this.mouseLeaveSkip = true; + this.isHooksExecuted = false; + + if (edit instanceof L.DistortableImage.Edit) { + L.DistortableImage.action_map.e = '_getExport'; + tooltip = overlay.options.translation.exportImage; + } else { + L.DistortableImage.group_action_map.e = 'runExporter'; + tooltip = overlay.options.translation.exportImages; + } + + options = options || {}; + options.toolbarIcon = { + svg: true, + html: 'get_app', + tooltip: tooltip + }; + L.EditAction.prototype.initialize.call(this, map, overlay, options); + }, + addHooks: function addHooks() { + var edit = this._overlay.editing; + + if (edit instanceof L.DistortableImage.Edit) { + edit._getExport(); + + return; + } // Make sure that addHooks is executed only once, event listeners will handle the rest + + + if (this.isHooksExecuted) { + return; + } else { + this.isHooksExecuted = true; + } + + var exportTool = this._link.parentElement; + this.mouseEnterHandler = this.handleMouseEnter.bind(this); + this.mouseLeaveHandler = this.handleMouseLeave.bind(this); + L.DomEvent.on(exportTool, 'click', function () { + if (!this.isExporting) { + this.isExporting = true; + this.renderExportIcon(); + setTimeout(this.attachMouseEventListeners.bind(this, exportTool), 100); + edit.runExporter().then(function () { + this.resetState(); + this.detachMouseEventListeners(exportTool); + }.bind(this)); + } else { + // Clicking on the export icon after export has started will be ignored + if (this.mouseLeaveSkip) { + return; + } + + this.resetState(); + this.detachMouseEventListeners(exportTool); + edit.cancelExport(); + } + }, this); + }, + resetState: function resetState() { + this.renderDownloadIcon(); + this.isExporting = false; + this.mouseLeaveSkip = true; + }, + attachMouseEventListeners: function attachMouseEventListeners(element) { + element.addEventListener('mouseenter', this.mouseEnterHandler); + element.addEventListener('mouseleave', this.mouseLeaveHandler); + }, + detachMouseEventListeners: function detachMouseEventListeners(element) { + element.removeEventListener('mouseenter', this.mouseEnterHandler); + element.removeEventListener('mouseleave', this.mouseLeaveHandler); + }, + handleMouseEnter: function handleMouseEnter() { + this.renderCancelIcon(); + }, + handleMouseLeave: function handleMouseLeave() { + if (this.mouseLeaveSkip) { + this.mouseLeaveSkip = false; + } else { + this.renderExportIcon(); + } + }, + renderDownloadIcon: function renderDownloadIcon() { + L.IconUtil.toggleXlink(this._link, 'get_app', 'spinner'); + L.IconUtil.toggleTitle(this._link, 'Export Images', 'Loading...'); + L.DomUtil.removeClass(this._link.firstChild, 'loader'); + }, + renderExportIcon: function renderExportIcon() { + L.IconUtil.toggleXlink(this._link, 'spinner'); + L.IconUtil.toggleTitle(this._link, 'Export Images', 'Loading...'); + L.IconUtil.addClassToSvg(this._link, 'loader'); + }, + renderCancelIcon: function renderCancelIcon() { + L.IconUtil.toggleXlink(this._link, 'cancel'); + L.IconUtil.toggleTitle(this._link, 'Cancel Export', 'Loading...'); + L.DomUtil.removeClass(this._link.firstChild, 'loader'); + } +}); + +/***/ }), + +/***/ "./src/edit/actions/FreeRotateAction.js": +/*!**********************************************!*\ + !*** ./src/edit/actions/FreeRotateAction.js ***! + \**********************************************/ +/***/ (function() { + +L.FreeRotateAction = L.EditAction.extend({ + initialize: function initialize(map, overlay, options) { + options = options || {}; + options.toolbarIcon = { + svg: true, + html: 'crop_rotate', + tooltip: overlay.options.translation.freeRotateImage, + className: 'freeRotate' + }; + L.DistortableImage.action_map.f = '_freeRotateMode'; + L.EditAction.prototype.initialize.call(this, map, overlay, options); + }, + addHooks: function addHooks() { + var edit = this._overlay.editing; + + edit._freeRotateMode(); + } +}); + +/***/ }), + +/***/ "./src/edit/actions/GeolocateAction.js": +/*!*********************************************!*\ + !*** ./src/edit/actions/GeolocateAction.js ***! + \*********************************************/ +/***/ (function() { + +L.GeolocateAction = L.EditAction.extend({ + initialize: function initialize(map, overlay, options) { + var edit = overlay.editing; + options = options || {}; + options.toolbarIcon = { + svg: true, + html: 'explore', + tooltip: overlay.options.translation.geolocateImage, + className: edit._mode === 'lock' ? 'disabled' : '' + }; + L.EditAction.prototype.initialize.call(this, map, overlay, options); + }, + addHooks: function addHooks() { + var image = this._overlay.getElement(); + + EXIF.getData(image, L.EXIF(image)); + } +}); + +/***/ }), + +/***/ "./src/edit/actions/LockAction.js": +/*!****************************************!*\ + !*** ./src/edit/actions/LockAction.js ***! + \****************************************/ +/***/ (function() { + +L.LockAction = L.EditAction.extend({ + initialize: function initialize(map, overlay, options) { + var edit = overlay.editing; + var use; + var tooltip; + + if (edit instanceof L.DistortableImage.Edit) { + L.DistortableImage.action_map.u = '_unlock'; + L.DistortableImage.action_map.l = '_lock'; + tooltip = overlay.options.translation.lockMode; + use = edit.isMode('lock') ? 'lock' : 'unlock'; + } else { + L.DistortableImage.group_action_map.l = '_lockGroup'; + tooltip = overlay.options.translation.lockImages; + use = 'lock'; + } + + options = options || {}; + options.toolbarIcon = { + svg: true, + html: use, + tooltip: tooltip, + className: 'lock' + }; + L.EditAction.prototype.initialize.call(this, map, overlay, options); + }, + addHooks: function addHooks() { + var edit = this._overlay.editing; + + if (edit instanceof L.DistortableImage.Edit) { + edit._toggleLockMode(); + } else { + edit._lockGroup(); + } + } +}); + +/***/ }), + +/***/ "./src/edit/actions/OpacityAction.js": +/*!*******************************************!*\ + !*** ./src/edit/actions/OpacityAction.js ***! + \*******************************************/ +/***/ (function() { + +L.OpacityAction = L.EditAction.extend({ + initialize: function initialize(map, overlay, options) { + var edit = overlay.editing; + var mode = edit._mode; + var use; + var tooltip; + + if (edit._transparent) { + use = 'opacity_empty'; + tooltip = overlay.options.translation.makeImageOpaque; + } else { + use = 'opacity'; + tooltip = overlay.options.translation.makeImageTransparent; + } + + options = options || {}; + options.toolbarIcon = { + svg: true, + html: use, + tooltip: tooltip, + className: mode === 'lock' ? 'disabled' : '' + }; + L.DistortableImage.action_map.o = mode === 'lock' ? '' : '_toggleOpacity'; + L.EditAction.prototype.initialize.call(this, map, overlay, options); + }, + addHooks: function addHooks() { + var edit = this._overlay.editing; + var link = this._link; + L.IconUtil.toggleXlink(link, 'opacity', 'opacity_empty'); + L.IconUtil.toggleTitle(link, 'Make Image Transparent', 'Make Image Opaque'); + + edit._toggleOpacity(); + } +}); + +/***/ }), + +/***/ "./src/edit/actions/RestoreAction.js": +/*!*******************************************!*\ + !*** ./src/edit/actions/RestoreAction.js ***! + \*******************************************/ +/***/ (function() { + +L.RestoreAction = L.EditAction.extend({ + initialize: function initialize(map, overlay, options) { + var mode = L.Utils.getNestedVal(overlay, 'editing', '_mode'); + var edited = overlay.edited; + options = options || {}; + options.toolbarIcon = { + svg: true, + html: 'restore', + tooltip: overlay.options.translation.restoreImage, + className: edited && mode !== 'lock' ? '' : 'disabled' + }; + L.EditAction.prototype.initialize.call(this, map, overlay, options); + }, + addHooks: function addHooks() { + var ov = this._overlay; + L.DomEvent.on(ov, { + edit: this._enableAction, + restore: this._disableAction + }, this); + ov.restore(); + } +}); + +/***/ }), + +/***/ "./src/edit/actions/RotateAction.js": +/*!******************************************!*\ + !*** ./src/edit/actions/RotateAction.js ***! + \******************************************/ +/***/ (function() { + +L.RotateAction = L.EditAction.extend({ + initialize: function initialize(map, overlay, options) { + options = options || {}; + options.toolbarIcon = { + svg: true, + html: 'rotate', + tooltip: overlay.options.translation.rotateImage, + className: 'rotate' + }; + L.DistortableImage.action_map.r = '_rotateMode'; + L.EditAction.prototype.initialize.call(this, map, overlay, options); + }, + addHooks: function addHooks() { + var edit = this._overlay.editing; + + edit._rotateMode(); + } +}); + +/***/ }), + +/***/ "./src/edit/actions/ScaleAction.js": +/*!*****************************************!*\ + !*** ./src/edit/actions/ScaleAction.js ***! + \*****************************************/ +/***/ (function() { + +L.ScaleAction = L.EditAction.extend({ + initialize: function initialize(map, overlay, options) { + options = options || {}; + options.toolbarIcon = { + svg: true, + html: 'scale', + tooltip: overlay.options.translation.scaleImage, + className: 'scale' + }; + L.DistortableImage.action_map.s = '_scaleMode'; + L.EditAction.prototype.initialize.call(this, map, overlay, options); + }, + addHooks: function addHooks() { + var edit = this._overlay.editing; + + edit._scaleMode(); + } +}); + +/***/ }), + +/***/ "./src/edit/actions/StackAction.js": +/*!*****************************************!*\ + !*** ./src/edit/actions/StackAction.js ***! + \*****************************************/ +/***/ (function() { + +L.StackAction = L.EditAction.extend({ + initialize: function initialize(map, overlay, options) { + var edit = overlay.editing; + var use; + var tooltip; + + if (edit._toggledImage) { + use = 'flip_to_back'; + tooltip = overlay.options.translation.stackToFront; + } else { + use = 'flip_to_front'; + tooltip = overlay.options.translation.stackToBack; + } + + options = options || {}; + options.toolbarIcon = { + svg: true, + html: use, + tooltip: tooltip, + className: edit._mode === 'lock' ? 'disabled' : '' + }; + L.DistortableImage.action_map.q = edit._mode === 'lock' ? '' : '_stackUp'; + L.DistortableImage.action_map.a = edit._mode === 'lock' ? '' : '_stackDown'; + L.EditAction.prototype.initialize.call(this, map, overlay, options); + }, + addHooks: function addHooks() { + var edit = this._overlay.editing; + L.IconUtil.toggleXlink(this._link, 'flip_to_front', 'flip_to_back'); + L.IconUtil.toggleTitle(this._link, 'Stack to Front', 'Stack to Back'); + + edit._toggleOrder(); + } +}); + +/***/ }), + +/***/ "./src/edit/actions/UnlockAction.js": +/*!******************************************!*\ + !*** ./src/edit/actions/UnlockAction.js ***! + \******************************************/ +/***/ (function() { + +L.UnlockAction = L.EditAction.extend({ + initialize: function initialize(map, overlay, options) { + options = options || {}; + options.toolbarIcon = { + svg: true, + html: 'unlock', + tooltip: overlay.options.translation.unlockImages + }; + L.DistortableImage.group_action_map.u = '_unlockGroup'; + L.EditAction.prototype.initialize.call(this, map, overlay, options); + }, + addHooks: function addHooks() { + var edit = this._overlay.editing; + + edit._unlockGroup(); + } +}); + +/***/ }), + +/***/ "./src/edit/getEXIFdata.js": +/*!*********************************!*\ + !*** ./src/edit/getEXIFdata.js ***! + \*********************************/ +/***/ (function() { + +/* eslint-disable no-unused-vars */ +L.EXIF = function getEXIFdata(img) { + if (Object.keys(EXIF.getAllTags(img)).length !== 0) { + console.log(EXIF.getAllTags(img)); + var GPS = EXIF.getAllTags(img); + var altitude; + /* If the lat/lng is available. */ + + if (typeof GPS.GPSLatitude !== 'undefined' && typeof GPS.GPSLongitude !== 'undefined') { + // sadly, encoded in [degrees,minutes,seconds] + // primitive value = GPS.GPSLatitude[x].numerator + var lat = GPS.GPSLatitude[0] + GPS.GPSLatitude[1] / 60 + GPS.GPSLatitude[2] / 3600; + var lng = GPS.GPSLongitude[0] + GPS.GPSLongitude[1] / 60 + GPS.GPSLongitude[2] / 3600; + + if (GPS.GPSLatitudeRef !== 'N') { + lat = lat * -1; + } + + if (GPS.GPSLongitudeRef === 'W') { + lng = lng * -1; + } + } // Attempt to use GPS compass heading; will require + // some trig to calc corner points, which you can find below: + + + var angle = 0; // "T" refers to "True north", so -90. + + if (GPS.GPSImgDirectionRef === 'T') { + angle = Math.PI / 180 * (GPS.GPSImgDirection.numerator / GPS.GPSImgDirection.denominator - 90); // "M" refers to "Magnetic north" + } else if (GPS.GPSImgDirectionRef === 'M') { + angle = Math.PI / 180 * (GPS.GPSImgDirection.numerator / GPS.GPSImgDirection.denominator - 90); + } else { + console.log('No compass data found'); + } + + console.log('Orientation:', GPS.Orientation); + /* If there is orientation data -- i.e. landscape/portrait etc */ + + if (GPS.Orientation === 6) { + // CCW + angle += Math.PI / 180 * -90; + } else if (GPS.Orientation === 8) { + // CW + angle += Math.PI / 180 * 90; + } else if (GPS.Orientation === 3) { + // 180 + angle += Math.PI / 180 * 180; + } + /* If there is altitude data */ + + + if (typeof GPS.GPSAltitude !== 'undefined' && typeof GPS.GPSAltitudeRef !== 'undefined') { + // Attempt to use GPS altitude: + // (may eventually need to find EXIF field of view for correction) + if (typeof GPS.GPSAltitude !== 'undefined' && typeof GPS.GPSAltitudeRef !== 'undefined') { + altitude = GPS.GPSAltitude.numerator / GPS.GPSAltitude.denominator + GPS.GPSAltitudeRef; + } else { + altitude = 0; // none + } + } + } else { + alert('EXIF initialized. Press again to view data in console.'); + } +}; + +/***/ }), + +/***/ "./src/edit/handles/DistortHandle.js": +/*!*******************************************!*\ + !*** ./src/edit/handles/DistortHandle.js ***! + \*******************************************/ +/***/ (function() { + +L.DistortHandle = L.EditHandle.extend({ + options: { + TYPE: 'distort', + icon: L.icon({ + iconUrl: // eslint-disable-next-line max-len + 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAChSURBVO3BIU4DURgGwNkvL2B6AkQTLBqP4QCoSm7DDXoBLBZHDbfgICAIZjEV3YTn9uVHdMZZtcnCfI13bIzxg0emg6Nm6QVbYz3jylEsXRrvwommb49X67jFkz80fR9Mb1YxTzqiWBSLYlEsikWxKBbFolgUi2JRLIpFsSgWxaJY03fHHOu40dH07bAzWCx9Ge/TiWbpHgdsjPGNB2f/yS+7xRCyiiZPJQAAAABJRU5ErkJggg==', + iconSize: [32, 32], + iconAnchor: [16, 16] + }) + }, + _onHandleDrag: function _onHandleDrag() { + var overlay = this._handled; + overlay.setCorner(this._corner, this.getLatLng()); + }, + updateHandle: function updateHandle() { + this.setLatLng(this._handled.getCorner(this._corner)); + } +}); + +L.distortHandle = function (overlay, idx, options) { + return new L.DistortHandle(overlay, idx, options); +}; + +/***/ }), + +/***/ "./src/edit/handles/DragHandle.js": +/*!****************************************!*\ + !*** ./src/edit/handles/DragHandle.js ***! + \****************************************/ +/***/ (function() { + +L.DragHandle = L.EditHandle.extend({ + options: { + TYPE: 'drag', + icon: L.icon({ + // eslint-disable-next-line max-len + iconUrl: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAsVJREFUeNrMVztLXEEUvnNVFAVBAhY2aRKbTZEHJNpYabuNjSgYg/GxdsmPSJkUAa/ZdVEX8mgWYVutbHxAHkVskjQBuUUgBISVhCQk3wnfwMlk1rusN1wHPubOzJlzvjlz5sxc01Ma/hUEwQnwDIjqc7uvgv9YYO86qgIwCXQbdNTlQ8kcCBHgBch8TcloF6oJGr6phk6EQAkfdz3zvgDr9Mr7Fg1fptEZoM8jsmrokpfsiIFO4IIjuE2v1EDmR4LRdlR5Gh51hj8D34ABtm8YTtqna0TgklIw5CgQguKxIojEjmFROg/MKQO27NkFAB+4wAPouGUJiIvWKHwbAxX2XyWRKWkqhT+pbJntJZJuUzISW0+5hW+obxrVBsfvoH/dqCCJuU97GBh2VteLSiYvArmErT8EVoAK9Bw7enbpVYmvAQlyowYforrH5jXL2rPHI/TKONDB7u9AlavdaTBPvPmazUeQuy8f7UomUgTEwIJPEQ3sQGE/6ll2l9H/KcEzBcfWn2IclluM3DpddJxSHujlFkscbUPvmB0LHVnLrId7nlaZVkEc6QGXQI1MAwZcWmVRHeNaQwJMMiU2cwy4s7p/RJ2ckpvIQs+cIs+5GzitloLKHUV3MPREuXbTOKO91dX387gGTONxIgEWm+E61FFrpcyqXLHsEwiDjEsjAksqw5XPoL9MHVrn6QR4q+XZrDaR4RoWzq2ymafuRA/Mq1stSsHLVkcbdf9VjOcx8ZH3+SFWcCWlVPyWuUBOwUWdC1wP5NVjYiXFWLO69PZ6CRTUY6KSIoEKdf6T3IzzgHxnsyHctNBEkmn6Oob8ExUDg/ahGybd177cDjzH5xHwgDiSvoS7I/LZyvxJZj0wod7tkX5G0XVC7rEyLhfLJjBGbKoLLEfZWObyKeZ6oY82g+yf5Zn/mJyHX7PMf04z/T3/LcAAu4E6iiyJqf0AAAAASUVORK5CYII=', + iconSize: [32, 32], + iconAnchor: [16, 16] + }) + }, + _onHandleDrag: function _onHandleDrag() { + var overlay = this._handled; + var formerLatLng = overlay.getCorner(this._corner); + var newLatLng = this.getLatLng(); + overlay.dragBy(formerLatLng, newLatLng); + }, + updateHandle: function updateHandle() { + this.setLatLng(this._handled.getCorner(this._corner)); + } +}); + +L.dragHandle = function (overlay, idx, options) { + return new L.DragHandle(overlay, idx, options); +}; + +/***/ }), + +/***/ "./src/edit/handles/EditHandle.js": +/*!****************************************!*\ + !*** ./src/edit/handles/EditHandle.js ***! + \****************************************/ +/***/ (function() { + +L.EditHandle = L.Marker.extend({ + initialize: function initialize(overlay, corner, options) { + var latlng = overlay.getCorner(corner); + L.setOptions(this, options); + this._handled = overlay; + this._corner = corner; + var markerOptions = { + draggable: true, + zIndexOffset: 10 + }; + + if (options && options.hasOwnProperty('draggable')) { + markerOptions.draggable = options.draggable; + } + + L.Marker.prototype.initialize.call(this, latlng, markerOptions); + }, + onAdd: function onAdd(map) { + L.Marker.prototype.onAdd.call(this, map); + + this._bindListeners(); + + this.updateHandle(); + }, + onRemove: function onRemove(map) { + this._unbindListeners(); + + L.Marker.prototype.onRemove.call(this, map); + }, + _onHandleDragStart: function _onHandleDragStart() { + this._handled.fire('editstart'); + }, + _onHandleDragEnd: function _onHandleDragEnd() { + this._fireEdit(); + }, + _fireEdit: function _fireEdit() { + this._handled.edited = true; + + this._handled.fire('edit'); + }, + _bindListeners: function _bindListeners() { + this.on({ + contextmenu: L.DomEvent.stop, + dragstart: this._onHandleDragStart, + drag: this._onHandleDrag, + dragend: this._onHandleDragEnd + }, this); + + this._handled._map.on('zoomend', this.updateHandle, this); + + this._handled.on('update', this.updateHandle, this); + }, + _unbindListeners: function _unbindListeners() { + this.off({ + contextmenu: L.DomEvent.stop, + dragstart: this._onHandleDragStart, + drag: this._onHandleDrag, + dragend: this._onHandleDragEnd + }, this); + + this._handled._map.off('zoomend', this.updateHandle, this); + + this._handled.off('update', this.updateHandle, this); + }, + + /* Takes two latlngs and calculates the scaling difference. */ + _calculateScalingFactor: function _calculateScalingFactor(latlngA, latlngB) { + var overlay = this._handled; + var map = overlay._map; + var centerPoint = map.latLngToLayerPoint(overlay.getCenter()); + var formerPoint = map.latLngToLayerPoint(latlngA); + var newPoint = map.latLngToLayerPoint(latlngB); + + var formerRadiusSquared = this._d2(centerPoint, formerPoint); + + var newRadiusSquared = this._d2(centerPoint, newPoint); + + return Math.sqrt(newRadiusSquared / formerRadiusSquared); + }, + + /* Distance between two points in cartesian space, squared (distance formula). */ + _d2: function _d2(a, b) { + var dx = a.x - b.x; + var dy = a.y - b.y; + return Math.pow(dx, 2) + Math.pow(dy, 2); + }, + + /* Takes two latlngs and calculates the angle between them. */ + calculateAngleDelta: function calculateAngleDelta(latlngA, latlngB) { + var overlay = this._handled; + var map = overlay._map; + var centerPoint = map.latLngToLayerPoint(overlay.getCenter()); + var formerPoint = map.latLngToLayerPoint(latlngA); + var newPoint = map.latLngToLayerPoint(latlngB); + var initialAngle = Math.atan2(centerPoint.y - formerPoint.y, centerPoint.x - formerPoint.x); + var newAngle = Math.atan2(centerPoint.y - newPoint.y, centerPoint.x - newPoint.x); + return newAngle - initialAngle; + } +}); + +/***/ }), + +/***/ "./src/edit/handles/FreeRotateHandle.js": +/*!**********************************************!*\ + !*** ./src/edit/handles/FreeRotateHandle.js ***! + \**********************************************/ +/***/ (function() { + +L.FreeRotateHandle = L.EditHandle.extend({ + options: { + TYPE: 'freeRotate', + icon: L.icon({ + iconUrl: // eslint-disable-next-line max-len + 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAHiSURBVMXBa3HbShgA0PMp/1sCCo8oCEpgTaCXgIXAJiDzyCJoAUTm4UVQAns1Y8+snWnTvJyeE16hkjDgDrfoNTMKcpC9UPiLSo8JyetkjEHxjPCMyoS199kFoz8Iv1HpMaN3qWDCHoegOKkkRwnJpRmroHgiPFEZ8IBekzEGxQtUEhKSS/fB7Ew4U+lxcGkVZG9QWWPSFAxBcdK59KApuA+yNwp2uEdx1GN25sZJZULSfAtm77SlbNjju6MvG75u+WHRWVR6rDVjMPsgwYyVZl3pLTpHkyYHOx8syMiayaJzlDTZ9YyaZNFVkiYH2ZUEBcVJJXVImuz6Js3Qofe59pq7DoOTILu+g+a288mCouk7/1iH4qTS+2QdDppbV1ZJmrnDXnPnc5UOs2Z0fUmTuyBr+krvSioJyUmQO0dZM7mepMkWnaNRkyrJB6uskTSjxY3Fll8bvmJwlDb83FJ8gMqAB80uyBY3Trb82PAfvjj6vuHnluIdKgMeNXOwctK5NKBoHitrb1RJeHRp5Ux4ojLg0aWMHGQvUOkxIWkKVsHsTPiNSo8HDC5lZIsgO6n0uMUdRvQuFQxB8UR4RmXC2vvsgtEfhL+o9JiQvE7GGBTPCK9QSUjoMWgKDthjDrIX+h/k0I7gth6N5gAAAABJRU5ErkJggg==', + iconSize: [32, 32], + iconAnchor: [16, 16] + }) + }, + _onHandleDrag: function _onHandleDrag() { + var overlay = this._handled; + var map = overlay._map; + var formerLatLng = overlay.getCorner(this._corner); + var newLatLng = this.getLatLng(); + var angle = this.calculateAngleDelta(formerLatLng, newLatLng); + + var scale = this._calculateScalingFactor(formerLatLng, newLatLng); + + if (angle !== 0) { + overlay.rotateBy(angle, 'rad'); + } + + var edgeMinWidth = overlay.edgeMinWidth; + + if (!edgeMinWidth) { + edgeMinWidth = 50; + } + /* just in case */ + + + var corner1 = map.latLngToContainerPoint(overlay.getCorner(0)); + var corner2 = map.latLngToContainerPoint(overlay.getCorner(1)); + var w = Math.abs(corner1.x - corner2.x); + var h = Math.abs(corner1.y - corner2.y); + var distance = Math.sqrt(w * w + h * h); + + if (distance > edgeMinWidth || scale > 1) { + overlay.scaleBy(scale); + } else { + overlay.scaleBy(1); + } + }, + updateHandle: function updateHandle() { + this.setLatLng(this._handled.getCorner(this._corner)); + } +}); + +L.freeRotateHandle = function (overlay, idx, options) { + return new L.FreeRotateHandle(overlay, idx, options); +}; + +/***/ }), + +/***/ "./src/edit/handles/LockHandle.js": +/*!****************************************!*\ + !*** ./src/edit/handles/LockHandle.js ***! + \****************************************/ +/***/ (function() { + +L.LockHandle = L.EditHandle.extend({ + options: { + TYPE: 'lock', + interactive: false, + icon: L.icon({ + // eslint-disable-next-line max-len + iconUrl: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAD8SURBVO3BPU7CYAAA0AdfjIcQlRCQBG7C3gk2uIPG2RC3Dk16Gz0FTO1WZs/gwGCMP/2+xsSl7+n1er1Iz9LtRQjaPeMeO+TinLDCJV78YqjdA04YodKuxhUaPGoRxMmxwRQZSt87Yo4KExGCeAUyLLFB4bMacxywEClIU2KDKXbInTUYo8JCgoFuGoxQO5uiwY1EA91VmDqrcKeDoX8WdNNgjApvmGGLXKIgXY0xGkxQYItrrFFIEKQ5Yo4KEx9yrDFDhlKkIF6NOQ5Y+KpAhiXWKEQI4pxwiwoLPyuxwQw75FoE7fZYocFEuwI7jHCBV39gL92TXq/Xi/AOcmczZmaIMScAAAAASUVORK5CYII=', + iconSize: [32, 32], + iconAnchor: [16, 16] + }) + }, + onRemove: function onRemove(map) { + this.unbindTooltip(); + L.EditHandle.prototype.onRemove.call(this, map); + }, + _bindListeners: function _bindListeners() { + var icon = this.getElement(); + + L.EditHandle.prototype._bindListeners.call(this); + + L.DomEvent.on(icon, { + mousedown: this._tooltipOn, + mouseup: this._tooltipOff + }, this); + L.DomEvent.on(document, 'pointerleave', this._tooltipOff, this); + }, + _unbindListeners: function _unbindListeners() { + var icon = this.getElement(); + + L.EditHandle.prototype._bindListeners.call(this); + + L.DomEvent.off(icon, { + mousedown: this._tooltipOn, + mouseup: this._tooltipOff + }, this); + L.DomEvent.off(document, 'pointerleave', this._tooltipOff, this); + }, + + /* cannot be dragged */ + _onHandleDrag: function _onHandleDrag() {}, + updateHandle: function updateHandle() { + this.setLatLng(this._handled.getCorner(this._corner)); + }, + _tooltipOn: function _tooltipOn(e) { + var eP = this._handled.parentGroup; + var edit = eP ? eP.editing : this._handled.editing; + + if (e.shiftKey) { + return; + } + + if (!this._handled.isSelected() && eP && !eP.isCollected(this._handled)) { + return; + } + + var handlesArr = edit._lockHandles; + this._timer = setTimeout(L.bind(function () { + if (this._timeout) { + clearTimeout(this._timeout); + } + + if (!this.getTooltip()) { + this.bindTooltip('Locked!', { + permanent: true + }); + } else { + handlesArr.eachLayer(function (handle) { + if (this !== handle) { + handle.closeTooltip(); + } + }); + } + + this.openTooltip(); + }, this), 500); + }, + _tooltipOff: function _tooltipOff(e) { + var eP = this._handled.parentGroup; + var edit = eP ? eP.editing : this._handled.editing; + + if (e.shiftKey) { + return; + } + + if (!this._handled.isSelected() && eP && !eP.isCollected(this._handled)) { + return; + } + + var handlesArr = edit._lockHandles; + + if (e.currentTarget === document) { + handlesArr.eachLayer(function (handle) { + handle.closeTooltip(); + }); + } + + if (this._timer) { + clearTimeout(this._timer); + } + + this._timeout = setTimeout(L.bind(function () { + this.closeTooltip(); + }, this), 400); + } +}); + +L.lockHandle = function (overlay, idx, options) { + return new L.LockHandle(overlay, idx, options); +}; + +/***/ }), + +/***/ "./src/edit/handles/RotateHandle.js": +/*!******************************************!*\ + !*** ./src/edit/handles/RotateHandle.js ***! + \******************************************/ +/***/ (function() { + +L.RotateHandle = L.EditHandle.extend({ + options: { + TYPE: 'rotate', + icon: L.icon({ + iconUrl: // eslint-disable-next-line max-len + 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAHiSURBVMXBa3HbShgA0PMp/1sCCo8oCEpgTaCXgIXAJiDzyCJoAUTm4UVQAns1Y8+snWnTvJyeE16hkjDgDrfoNTMKcpC9UPiLSo8JyetkjEHxjPCMyoS199kFoz8Iv1HpMaN3qWDCHoegOKkkRwnJpRmroHgiPFEZ8IBekzEGxQtUEhKSS/fB7Ew4U+lxcGkVZG9QWWPSFAxBcdK59KApuA+yNwp2uEdx1GN25sZJZULSfAtm77SlbNjju6MvG75u+WHRWVR6rDVjMPsgwYyVZl3pLTpHkyYHOx8syMiayaJzlDTZ9YyaZNFVkiYH2ZUEBcVJJXVImuz6Js3Qofe59pq7DoOTILu+g+a288mCouk7/1iH4qTS+2QdDppbV1ZJmrnDXnPnc5UOs2Z0fUmTuyBr+krvSioJyUmQO0dZM7mepMkWnaNRkyrJB6uskTSjxY3Fll8bvmJwlDb83FJ8gMqAB80uyBY3Trb82PAfvjj6vuHnluIdKgMeNXOwctK5NKBoHitrb1RJeHRp5Ux4ojLg0aWMHGQvUOkxIWkKVsHsTPiNSo8HDC5lZIsgO6n0uMUdRvQuFQxB8UR4RmXC2vvsgtEfhL+o9JiQvE7GGBTPCK9QSUjoMWgKDthjDrIX+h/k0I7gth6N5gAAAABJRU5ErkJggg==', + iconSize: [32, 32], + iconAnchor: [16, 16] + }) + }, + _onHandleDrag: function _onHandleDrag() { + var overlay = this._handled; + var formerLatLng = overlay.getCorner(this._corner); + var newLatLng = this.getLatLng(); + var angle = this.calculateAngleDelta(formerLatLng, newLatLng); + /* + * running rotation logic even for an angle delta of 0 + * prevents a small, occasional marker flicker + */ + + overlay.rotateBy(angle, 'rad'); + }, + updateHandle: function updateHandle() { + this.setLatLng(this._handled.getCorner(this._corner)); + } +}); + +L.rotateHandle = function (overlay, idx, options) { + return new L.RotateHandle(overlay, idx, options); +}; + +/***/ }), + +/***/ "./src/edit/handles/ScaleHandle.js": +/*!*****************************************!*\ + !*** ./src/edit/handles/ScaleHandle.js ***! + \*****************************************/ +/***/ (function() { + +L.ScaleHandle = L.EditHandle.extend({ + options: { + TYPE: 'scale', + icon: L.icon({ + iconUrl: // eslint-disable-next-line max-len + 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2ZXJzaW9uPSIxLjEiIHdpZHRoPSI0NTkiIGhlaWdodD0iNDY0IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCA1MTIgNTEyIiB4bWw6c3BhY2U9InByZXNlcnZlIiBzdHlsZT0iIj48cmVjdCBpZD0iYmFja2dyb3VuZHJlY3QiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIHg9IjAiIHk9IjAiIGZpbGw9Im5vbmUiIHN0cm9rZT0ibm9uZSIgY2xhc3M9IiIgc3R5bGU9IiIvPjxnIGNsYXNzPSJjdXJyZW50TGF5ZXIiIHN0eWxlPSIiPjx0aXRsZT5MYXllciAxPC90aXRsZT48cGF0aCBkPSJNNDU5LjA0OTE1OTUzMDQ3MTM0LDg2LjkyNjIzNDUxMjU1MDAyIFYwIGgtODUuNzE0NTczMzU2MzEyMDkgdjI3LjA0MzcxNzQwMzkwNDQ1MiBIODUuNzE0NTczMzU2MzEyMDMgVjAgSDAgdjg2LjkyNjIzNDUxMjU1MDAyIGgyNS43MTQzNzIwMDY4OTM2MjYgdjI4OS43NTQxMTUwNDE4MzM0IEgwIHY4Ni45MjYyMzQ1MTI1NTAwMiBoODUuNzE0NTczMzU2MzEyMDkgdi0yNy4wNDM3MTc0MDM5MDQ0NTIgaDI4NS43MTUyNDQ1MjEwNDAzIHYyNy4wNDM3MTc0MDM5MDQ0NTIgaDg1LjcxNDU3MzM1NjMxMjA5IHYtODYuOTI2MjM0NTEyNTUwMDIgaC0yMy44MDk2MDM3MTAwODY2OSBWODYuOTI2MjM0NTEyNTUwMDIgSDQ1OS4wNDkxNTk1MzA0NzEzNCB6TTM4NC43NjMxOTU5NTUwMDA5LDEyLjU1NjAxMTY1MTgxMjc4MSBoNjEuOTA0OTY5NjQ2MjI1Mzk2IHY2Mi43ODAwNTgyNTkwNjM5MSBoLTYxLjkwNDk2OTY0NjIyNTM5NiBWMTIuNTU2MDExNjUxODEyNzgxIHpNMTIuMzgwOTkzOTI5MjQ1MDUsMTIuNTU2MDExNjUxODEyNzgxIGg2MS45MDQ5Njk2NDYyMjUzOTYgdjYyLjc4MDA1ODI1OTA2MzkxIEgxMi4zODA5OTM5MjkyNDUwNSBWMTIuNTU2MDExNjUxODEyNzgxIHpNNzQuMjg1OTYzNTc1NDcwNTMsNDUxLjA1MDU3MjQxNTEyMDY2IEgxMi4zODA5OTM5MjkyNDUwNSB2LTYyLjc4MDA1ODI1OTA2MzkxIGg2MS45MDQ5Njk2NDYyMjUzOTYgVjQ1MS4wNTA1NzI0MTUxMjA2NiB6TTQ0NS43MTU3ODE0NTI4MjI3NCw0NTEuMDUwNTcyNDE1MTIwNjYgaC02Mi44NTczNTM3OTQ2Mjg4NjQgdi02Mi43ODAwNTgyNTkwNjM5MSBoNjIuODU3MzUzNzk0NjI4ODY0IFY0NTEuMDUwNTcyNDE1MTIwNjYgek00MDcuNjIwNDE1NTE2Njg0MjYsMzc2LjY4MDM0OTU1NDM4MzQ0IGgtMzYuMTkwNTk3NjM5MzMxNzcgdjMyLjgzODc5OTcwNDc0MTEyIEg4NS43MTQ1NzMzNTYzMTIwMyB2LTMyLjgzODc5OTcwNDc0MTEyIEg0OS41MjM5NzU3MTY5ODAzMiBWODYuOTI2MjM0NTEyNTUwMDIgaDM2LjE5MDU5NzYzOTMzMTc3IFY1MC4yMjQwNDY2MDcyNTExMjUgaDI4Ny42MjAwMTI4MTc4NDcyIHYzNi43MDIxODc5MDUyOTg5IGgzNC4yODU4MjkzNDI1MjQ4MzUgVjM3Ni42ODAzNDk1NTQzODM0NCB6IiBpZD0ic3ZnXzIiIGNsYXNzPSIiIGZpbGw9IiMxYTFhZWIiIGZpbGwtb3BhY2l0eT0iMSIvPjwvZz48L3N2Zz4=', + iconSize: [32, 32], + iconAnchor: [16, 16] + }) + }, + _onHandleDrag: function _onHandleDrag() { + var overlay = this._handled; + var map = overlay._map; + var edgeMinWidth = overlay.edgeMinWidth; + var formerLatLng = overlay.getCorner(this._corner); + var newLatLng = this.getLatLng(); + + var scale = this._calculateScalingFactor(formerLatLng, newLatLng); + /* + * checks whether the "edgeMinWidth" property is set and tracks the minimum edge length; + * this enables preventing scaling to zero, but we might also add an overall scale limit + */ + + + if (!edgeMinWidth) { + edgeMinWidth = 50; + } + /* just in case */ + + + var corner1 = map.latLngToLayerPoint(overlay.getCorner(0)); + var corner2 = map.latLngToLayerPoint(overlay.getCorner(1)); + var w = Math.abs(corner1.x - corner2.x); + var h = Math.abs(corner1.y - corner2.y); + var distance = Math.sqrt(w * w + h * h); + + if (distance > edgeMinWidth || scale > 1) { + overlay.scaleBy(scale); + /* + * running scale logic even for a scale ratio of 1 + * prevents a small, occasional marker flicker + */ + } else { + overlay.scaleBy(1); + } + }, + updateHandle: function updateHandle() { + this.setLatLng(this._handled.getCorner(this._corner)); + } +}); + +L.scaleHandle = function (overlay, idx, options) { + return new L.ScaleHandle(overlay, idx, options); +}; + +/***/ }), + +/***/ "./src/edit/toolbars/DistortableImage.ControlBar.js": +/*!**********************************************************!*\ + !*** ./src/edit/toolbars/DistortableImage.ControlBar.js ***! + \**********************************************************/ +/***/ (function() { + +L.distortableImage = L.DistortableImage || {}; +L.distortableImage = L.DistortableImage; +L.DistortableImage.group_action_map = {}; +L.DistortableImage.ControlBar = L.Toolbar2.Control.extend({}); + +L.distortableImage.controlBar = function (options) { + return new L.DistortableImage.ControlBar(options); +}; +/** addInitHooks run before onAdd */ + + +L.DistortableCollection.addInitHook(function () { + /** Default actions */ + this.ACTIONS = [L.ExportAction, L.DeleteAction, L.LockAction, L.UnlockAction]; // all possible modes + + L.DistortableCollection.Edit.MODES = { + lock: L.LockAction, + unlock: L.UnlockAction + }; + var a = this.options.actions ? this.options.actions : this.ACTIONS; + this.editing = L.distortableCollection.edit(this, { + actions: a + }); +}); + +/***/ }), + +/***/ "./src/edit/toolbars/DistortableImage.PopupBar.js": +/*!********************************************************!*\ + !*** ./src/edit/toolbars/DistortableImage.PopupBar.js ***! + \********************************************************/ +/***/ (function() { + +L.DistortableImage = L.DistortableImage || {}; +L.distortableImage = L.DistortableImage; +L.DistortableImage.action_map = {}; +L.DistortableImage.PopupBar = L.Toolbar2.Popup.extend({ + options: { + anchor: [0, -10] + }, + initialize: function initialize(latlng, options) { + L.setOptions(this, options); + L.Toolbar2.Popup.prototype.initialize.call(this, latlng, options); + }, + addHooks: function addHooks(map, ov) { + this.map = map; + this.ov = ov; + }, + tools: function tools() { + if (this._ul) { + return this._ul.children; + } + }, + clickTool: function clickTool(name) { + var tools = this.tools(); + + for (var i = 0; i < tools.length; i++) { + var tool = tools.item(i).children[0]; + + if (L.DomUtil.hasClass(tool, name)) { + tool.click(); + return tool; + } + } + + return false; + } +}); + +L.distortableImage.popupBar = function (latlng, options) { + return new L.DistortableImage.PopupBar(latlng, options); +}; + +L.DistortableImageOverlay.addInitHook(function () { + /** Default actions */ + this.ACTIONS = [L.DragAction, L.ScaleAction, L.DistortAction, L.RotateAction, L.FreeRotateAction, L.LockAction, L.OpacityAction, L.BorderAction, L.ExportAction, L.DeleteAction]; // all possible modes + + L.DistortableImage.Edit.MODES = { + drag: L.DragAction, + scale: L.ScaleAction, + distort: L.DistortAction, + rotate: L.RotateAction, + freeRotate: L.FreeRotateAction, + lock: L.LockAction + }; + var a = this.options.actions ? this.options.actions : this.ACTIONS; + this.editing = L.distortableImage.edit(this, { + actions: a + }); +}); + +/***/ }), + +/***/ "./src/iconsets/IconSet.js": +/*!*********************************!*\ + !*** ./src/iconsets/IconSet.js ***! + \*********************************/ +/***/ (function() { + +/* this is the baseclass other IconSets inherit from, +* we don't use it directly */ +L.IconSet = L.Class.extend({ + _svg: '', + _symbols: '', + render: function render() { + this.addSymbols(this._symbols); + return this._svg; + }, + addSymbols: function addSymbols(symbols) { + this._svg += symbols; + } +}); + +/***/ }), + +/***/ "./src/iconsets/KeymapperIconSet.js": +/*!******************************************!*\ + !*** ./src/iconsets/KeymapperIconSet.js ***! + \******************************************/ +/***/ (function() { + +L.KeymapperIconSet = L.IconSet.extend({ + _symbols: // eslint-disable-next-line max-len + '' +}); + +/***/ }), + +/***/ "./src/iconsets/ToolbarIconSet.js": +/*!****************************************!*\ + !*** ./src/iconsets/ToolbarIconSet.js ***! + \****************************************/ +/***/ (function() { + +/* eslint-disable max-len */ +L.ToolbarIconSet = L.IconSet.extend({ + _symbols: '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' +}); + +/***/ }), + +/***/ "./src/mapmixins/BoxCollector.js": +/*!***************************************!*\ + !*** ./src/mapmixins/BoxCollector.js ***! + \***************************************/ +/***/ (function() { + +L.Map.mergeOptions({ + boxCollector: true, + boxZoom: false +}); +/** + * primarily Leaflet 1.5.1 source code. Overriden so that it's a collection box used with + * our `L.DistortableCollection` class instead of a zoom box. + * */ + +L.Map.BoxCollector = L.Map.BoxZoom.extend({ + initialize: function initialize(map) { + this._map = map; + this._container = map._container; + this._pane = map._panes.overlayPane; + this._resetStateTimeout = 0; + map.on('unload', this._destroy, this); + }, + addHooks: function addHooks() { + L.DomEvent.on(this._container, 'mousedown', this._onMouseDown, this); + }, + removeHooks: function removeHooks() { + L.DomEvent.off(this._container, 'mousedown', this._onMouseDown, this); + }, + moved: function moved() { + return this._moved; + }, + _destroy: function _destroy() { + L.DomUtil.remove(this._pane); + delete this._pane; + }, + _resetState: function _resetState() { + this._resetStateTimeout = 0; + this._moved = false; + }, + _clearDeferredResetState: function _clearDeferredResetState() { + if (this._resetStateTimeout !== 0) { + clearTimeout(this._resetStateTimeout); + this._resetStateTimeout = 0; + } + }, + _onMouseDown: function _onMouseDown(e) { + if (!e.shiftKey || e.which !== 1 && e.button !== 1) { + return false; + } // Clear the deferred resetState if it hasn't executed yet, otherwise it + // will interrupt the interaction and orphan a box element in the container. + + + this._clearDeferredResetState(); + + this._resetState(); + + L.DomUtil.disableTextSelection(); + L.DomUtil.disableImageDrag(); + this._startPoint = this._map.mouseEventToContainerPoint(e); + L.DomEvent.on(document, { + contextmenu: L.DomEvent.stop, + mousemove: this._onMouseMove, + mouseup: this._onMouseUp + }, this); + }, + _onMouseMove: function _onMouseMove(e) { + if (!this._moved) { + this._moved = true; + this._box = L.DomUtil.create('div', 'leaflet-zoom-box', this._container); + L.DomUtil.addClass(this._container, 'leaflet-crosshair'); + + this._map.fire('boxzoomstart'); + } + + this._point = this._map.mouseEventToContainerPoint(e); + this._bounds = L.bounds(this._startPoint, this._point); + + var size = this._bounds.getSize(); + + L.DomUtil.setPosition(this._box, this._bounds.min); + this._box.style.width = size.x + 'px'; + this._box.style.height = size.y + 'px'; + }, + _finish: function _finish() { + if (this._moved) { + L.DomUtil.remove(this._box); + L.DomUtil.removeClass(this._container, 'leaflet-crosshair'); + } + + L.DomUtil.enableTextSelection(); + L.DomUtil.enableImageDrag(); + L.DomEvent.off(document, { + contextmenu: L.DomEvent.stop, + mousemove: this._onMouseMove, + mouseup: this._onMouseUp + }, this); + }, + _onMouseUp: function _onMouseUp(e) { + if (e.which !== 1 && e.button !== 1) { + return; + } + + this._finish(); + + if (!this._moved) { + return; + } // Postpone to next JS tick so internal click event handling + // still see it as "moved". + + + this._clearDeferredResetState(); + + this._resetStateTimeout = setTimeout(L.Util.bind(this._resetState, this), 0); + var bounds = L.latLngBounds(this._map.containerPointToLatLng(this._bounds.getBottomLeft()), this._map.containerPointToLatLng(this._bounds.getTopRight())); + + var zoom = this._map.getZoom(); + + var center = this._map.getCenter(); // calls the `project` method but 1st updates the pixel origin - see https://github.com/publiclab/Leaflet.DistortableImage/pull/344 + + + bounds = this._map._latLngBoundsToNewLayerBounds(bounds, zoom, center); + + this._map.fire('boxcollectend', { + boxCollectBounds: bounds + }); + } +}); +L.Map.addInitHook('addHandler', 'boxCollector', L.Map.BoxCollector); + +/***/ }), + +/***/ "./src/mapmixins/DoubleClickLabels.js": +/*!********************************************!*\ + !*** ./src/mapmixins/DoubleClickLabels.js ***! + \********************************************/ +/***/ (function() { + +L.Map.mergeOptions({ + doubleClickLabels: true +}); +/** + * The `doubleClickLabels` handler replaces `doubleClickZoom` by default if `#addGoogleMutant` + * is used unless the options 'labels: false' or 'doubleClickZoom: false` were passed to it. + */ + +L.Map.DoubleClickLabels = L.Map.DoubleClickZoom.extend({ + enable: function enable() { + var map = this._map; + + if (this._enabled) { + return this; + } // disable 'doubleClickZoom' if 'doubleClickLabels' is enabled. + + + if (map.doubleClickZoom.enabled()) { + map.doubleClickZoom.disable(); + } + + this._map.fire('singleclickon'); + + this._enabled = true; + this.addHooks(); + return this; + }, + disable: function disable() { + if (!this._enabled) { + return this; + } + + this._enabled = false; + this.removeHooks(); + return this; + }, + _fireIfSingle: function _fireIfSingle(e) { + var map = this._map; + var oe = e.originalEvent; // prevents deselection in case of box selector + + if (oe && oe.shiftKey) { + return; + } + + map._clicked += 1; + this._map._clickTimeout = setTimeout(function () { + if (map._clicked === 1) { + map._clicked = 0; + map.fire('singleclick', { + type: 'singleclick' + }); + } else { + // manually fire doubleclick event only for touch screens that don't natively fire it + if (L.Browser.touch && oe && oe.sourceCapabilities.firesTouchEvents) { + map.fire('dblclick'); + } + } + }, 250); + }, + _onDoubleClick: function _onDoubleClick() { + var map = this._map; + var labels = map._labels; + setTimeout(function () { + map._clicked = 0; + clearTimeout(map._clickTimeout); + }, 0); + + if (!labels) { + return; + } + + if (labels.options.opacity === 1) { + labels.options.opacity = 0; + labels.setOpacity(0); + } else { + labels.options.opacity = 1; + labels.setOpacity(1); + } + } +}); +L.Map.addInitHook('addHandler', 'doubleClickLabels', L.Map.DoubleClickLabels); + +/***/ }), + +/***/ "./src/mapmixins/DoubleClickZoom.js": +/*!******************************************!*\ + !*** ./src/mapmixins/DoubleClickZoom.js ***! + \******************************************/ +/***/ (function() { + +/** + * `L.Map.DoubleClickZoom` from leaflet 1.5.1, overrwritten so that it + * 1) Fires a `singleclick` event to avoid deselecting images on `dblclick`. + * 2) Maintains a mutually exclusive relationship with the map's `DoubleClickLabels` handler + */ +L.Map.DoubleClickZoom.include({ + addHooks: function addHooks() { + this._map.on({ + click: this._fireIfSingle, + dblclick: this._onDoubleClick + }, this); + }, + removeHooks: function removeHooks() { + this._map.off({ + click: this._fireIfSingle, + dblclick: this._onDoubleClick + }, this); + }, + enable: function enable() { + if (this._enabled) { + return this; + } // don't enable 'doubleClickZoom' unless 'doubleClickLabels' is disabled first + + + if (this._map.doubleClickLabels) { + if (this._map.doubleClickLabels.enabled()) { + return this; + } + } // signify to collection/instance classes to turn on 'singleclick' listeners + + + this._map.fire('singleclickon'); + + this._enabled = true; + this.addHooks(); + return this; + }, + disable: function disable() { + if (!this._enabled) { + return this; + } // signify to collection/instance safe to swap 'singleclick' listeners with 'click' listeners. + + + this._map.fire('singleclickoff'); + + this._enabled = false; + this.removeHooks(); + return this; + }, + _fireIfSingle: function _fireIfSingle(e) { + var map = this._map; + var oe = e.originalEvent; // prevents deselection in case of box selector + + if (oe && oe.shiftKey) { + return; + } + + map._clicked += 1; + this._map._clickTimeout = setTimeout(function () { + if (map._clicked === 1) { + map._clicked = 0; + map.fire('singleclick', { + type: 'singleclick' + }); + } else { + // manually fire doubleclick event only for touch screens that don't natively fire it + if (L.Browser.touch && oe && oe.sourceCapabilities.firesTouchEvents) { + /* in `DoubleClickLabels.js`, we just do map.fire('dblclick') bc `_onDoublClick` doesn't use the + passed "e" (for now). To generate a 'real' DOM event that will have all of its corresponding core + properties (originalEvent, latlng, etc.), use Leaflet's `#map._fireDOMEvent` (Leaflet 1.5.1 source) */ + map._fireDOMEvent(oe, 'dblclick', [map]); + } + } + }, 250); + }, + _onDoubleClick: function _onDoubleClick(e) { + var map = this._map; + var oe = e.originalEvent; + setTimeout(function () { + map._clicked = 0; + clearTimeout(map._clickTimeout); + }, 0); + + if (!oe) { + return false; + } + + var oldZoom = map.getZoom(); + var delta = map.options.zoomDelta; + var zoom = oe.shiftKey ? oldZoom - delta : oldZoom + delta; + + if (map.options.doubleClickZoom === 'center') { + map.setZoom(zoom); + } else { + map.setZoomAround(e.containerPoint, zoom); + } + } +}); + +/***/ }), + +/***/ "./src/mapmixins/MapMixins.js": +/*!************************************!*\ + !*** ./src/mapmixins/MapMixins.js ***! + \************************************/ +/***/ (function() { + +/* eslint-disable max-len */ +L.Map.include({ + _clicked: 0, + addGoogleMutant: function addGoogleMutant(opts) { + var url = 'http://mt0.google.com/vt/lyrs=s&x={x}&y={y}&z={z}'; + opts = this.mutantOptions = L.extend({ + mutantOpacity: 0.8, + maxZoom: 24, + maxNativeZoom: 20, + minZoom: 0, + labels: true, + labelOpacity: 1, + doubleClickLabels: true + }, opts); + + if (!opts.labels) { + this.mutantOptions = L.extend(this.mutantOptions, { + labelOpacity: opts.labels ? 1 : undefined, + doubleClickLabels: opts.labels ? true : undefined + }); + } + + this._googleMutant = L.tileLayer(url, { + maxZoom: opts.maxZoom, + maxNativeZoom: opts.maxNativeZoom, + minZoom: opts.minZoom, + opacity: opts.mutantOpacity + }).addTo(this); + + if (opts.labels) { + this._addLabels(opts); + } // shouldn't have this handler at all if there are no labels to toggle + else { + this.doubleClickLabels = undefined; + } + + return this; + }, + _addLabels: function _addLabels(opts) { + var url = 'https://stamen-tiles-{s}.a.ssl.fastly.net/toner-labels/{z}/{x}/{y}{r}.{ext}'; + + if (opts.labelOpacity !== 0 && opts.labelOpacity !== 1) { + opts.labelOpacity = 1; + } + + this._labels = L.tileLayer(url, { + attribution: 'Map tiles by Stamen Design, CC BY 3.0 — Map data © OpenStreetMap contributors', + subdomains: 'abcd', + interactive: false, + opacity: opts.labelOpacity, + maxZoom: opts.maxZoom, + maxNativeZoom: opts.maxNativeZoom, + minZoom: opts.minZoom, + ext: 'png' + }).addTo(this); + + if (this.mutantOptions.doubleClickLabels) { + this.doubleClickLabels.enable(); + } + + return this; + } +}); // start off with doubleClickZoom enabled, doubleClickLabels can later be enabled instead +// during initialization + +L.Map.addInitHook(function () { + this.doubleClickLabels.disable(); + this.doubleClickZoom.enable(); +}); + +/***/ }), + +/***/ "./src/util/DomUtil.js": +/*!*****************************!*\ + !*** ./src/util/DomUtil.js ***! + \*****************************/ +/***/ (function() { + +L.DomUtil = L.extend(L.DomUtil, { + initTranslation: function initTranslation(obj) { + this.translation = obj; + }, + getMatrixString: function getMatrixString(m) { + var is3d = L.Browser.webkit3d || L.Browser.gecko3d || L.Browser.ie3d; + /* + * Since matrix3d takes a 4*4 matrix, we add in an empty row and column, + * which act as the identity on the z-axis. + * See: + * http://franklinta.com/2014/09/08/computing-css-matrix3d-transforms/ + * https://developer.mozilla.org/en-US/docs/Web/CSS/transform-function#M.C3.B6bius'_homogeneous_coordinates_in_projective_geometry + */ + + var matrix = [m[0], m[3], 0, m[6], m[1], m[4], 0, m[7], 0, 0, 1, 0, m[2], m[5], 0, m[8]]; + var str = is3d ? 'matrix3d(' + matrix.join(',') + ')' : ''; + + if (!is3d) { + console.log('Your browser must support 3D CSS transforms' + 'in order to use DistortableImageOverlay.'); + } + + return str; + }, + toggleClass: function toggleClass(el, className) { + var c = className; + return this.hasClass(el, c) ? this.removeClass(el, c) : this.addClass(el, c); + }, + confirmDelete: function confirmDelete() { + return window.confirm(this.translation.confirmImageDelete); + }, + confirmDeletes: function confirmDeletes(n) { + if (n === 1) { + return this.confirmDelete(); + } + + var translation = this.translation.confirmImagesDeletes; + var warningMsg = ''; + + if (typeof translation === 'function') { + warningMsg = translation(n); + } else { + warningMsg = translation; + } + + return window.confirm(warningMsg); + } +}); + +/***/ }), + +/***/ "./src/util/IconUtil.js": +/*!******************************!*\ + !*** ./src/util/IconUtil.js ***! + \******************************/ +/***/ (function() { + +L.IconUtil = { + /* creates an svg elemenet with built in accessibility properties + * and standardized classes for styling, takes in the fragment + * identifier (id) of the symbol to reference. note for symplicity + * we allow providing the icon target with or without the '#' prefix + */ + create: function create(ref) { + if (/^#/.test(ref)) { + ref = ref.replace(/^#/, ''); + } + + return '' + '' + ''; + }, + addClassToSvg: function addClassToSvg(container, loader) { + var svg = container.querySelector('svg'); + + if (svg) { + L.DomUtil.addClass(svg, loader); + } + }, + // finds the use element and toggles its icon reference + toggleXlink: function toggleXlink(container, ref1, ref2) { + if (!/^#/.test(ref1)) { + ref1 = '#' + ref1; + } + + if (!/^#/.test(ref2)) { + ref2 = '#' + ref2; + } + + var use = container.querySelector('use'); + + if (use) { + var toggled = use.getAttribute('xlink:href') === ref1 ? ref2 : ref1; + use.setAttribute('xlink:href', toggled); + return toggled; + } + + return false; + }, + toggleTitle: function toggleTitle(container, title1, title2) { + var toggled = container.getAttribute('title') === title1 ? title2 : title1; + container.setAttribute('title', toggled); + + if (container.hasAttribute('aria-label')) { + container.setAttribute('aria-label', toggled); + } + + return toggled; + } +}; + +/***/ }), + +/***/ "./src/util/ImageUtil.js": +/*!*******************************!*\ + !*** ./src/util/ImageUtil.js ***! + \*******************************/ +/***/ (function() { + +L.ImageUtil = { + getCmPerPixel: function getCmPerPixel(overlay) { + var map = overlay._map; + var dist = map.latLngToLayerPoint(overlay.getCorner(0)).distanceTo(map.latLngToLayerPoint(overlay.getCorner(1))); + return dist * 100 / overlay.getElement().width; + } +}; + +/***/ }), + +/***/ "./src/util/MatrixUtil.js": +/*!********************************!*\ + !*** ./src/util/MatrixUtil.js ***! + \********************************/ +/***/ (function() { + +L.MatrixUtil = { + // Compute the adjugate of m + adj: function adj(m) { + return [m[4] * m[8] - m[5] * m[7], m[2] * m[7] - m[1] * m[8], m[1] * m[5] - m[2] * m[4], m[5] * m[6] - m[3] * m[8], m[0] * m[8] - m[2] * m[6], m[2] * m[3] - m[0] * m[5], m[3] * m[7] - m[4] * m[6], m[1] * m[6] - m[0] * m[7], m[0] * m[4] - m[1] * m[3]]; + }, + // multiply two 3*3 matrices + multmm: function multmm(a, b) { + var c = []; + var i; + + for (i = 0; i < 3; i++) { + for (var j = 0; j < 3; j++) { + var cij = 0; + + for (var k = 0; k < 3; k++) { + cij += a[3 * i + k] * b[3 * k + j]; + } + + c[3 * i + j] = cij; + } + } + + return c; + }, + // multiply a 3*3 matrix and a 3-vector + multmv: function multmv(m, v) { + return [m[0] * v[0] + m[1] * v[1] + m[2] * v[2], m[3] * v[0] + m[4] * v[1] + m[5] * v[2], m[6] * v[0] + m[7] * v[1] + m[8] * v[2]]; + }, + // multiply a scalar and a 3*3 matrix + multsm: function multsm(s, m) { + var matrix = []; + + for (var i = 0, l = m.length; i < l; i++) { + matrix.push(s * m[i]); + } + + return matrix; + }, + basisToPoints: function basisToPoints(x1, y1, x2, y2, x3, y3, x4, y4) { + var m = [x1, x2, x3, y1, y2, y3, 1, 1, 1]; + var v = L.MatrixUtil.multmv(L.MatrixUtil.adj(m), [x4, y4, 1]); + return L.MatrixUtil.multmm(m, [v[0], 0, 0, 0, v[1], 0, 0, 0, v[2]]); + }, + project: function project(m, x, y) { + var v = L.MatrixUtil.multmv(m, [x, y, 1]); + return [v[0] / v[2], v[1] / v[2]]; + }, + general2DProjection: function general2DProjection(x1s, y1s, x1d, y1d, x2s, y2s, x2d, y2d, x3s, y3s, x3d, y3d, x4s, y4s, x4d, y4d) { + var s = L.MatrixUtil.basisToPoints(x1s, y1s, x2s, y2s, x3s, y3s, x4s, y4s); + var d = L.MatrixUtil.basisToPoints(x1d, y1d, x2d, y2d, x3d, y3d, x4d, y4d); + var m = L.MatrixUtil.multmm(d, L.MatrixUtil.adj(s)); // Normalize to the unique matrix with m[8] == 1. + // See: http://franklinta.com/2014/09/08/computing-css-matrix3d-transforms/ + + return L.MatrixUtil.multsm(1 / m[8], m); + } +}; + +/***/ }), + +/***/ "./src/util/TrigUtil.js": +/*!******************************!*\ + !*** ./src/util/TrigUtil.js ***! + \******************************/ +/***/ (function() { + +L.TrigUtil = { + calcAngle: function calcAngle(x, y) { + var unit = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'deg'; + return unit === 'deg' ? this.radiansToDegrees(Math.atan2(y, x)) : Math.atan2(y, x); + }, + radiansToDegrees: function radiansToDegrees(angle) { + return angle * 180 / Math.PI; + }, + degreesToRadians: function degreesToRadians(angle) { + return angle * Math.PI / 180; + } +}; + +/***/ }), + +/***/ "./src/util/Utils.js": +/*!***************************!*\ + !*** ./src/util/Utils.js ***! + \***************************/ +/***/ (function() { + +L.Utils = { + initTranslation: function initTranslation() { + var translation = { + deleteImage: 'Delete Image', + deleteImages: 'Delete Images', + distortImage: 'Distort Image', + dragImage: 'Drag Image', + exportImage: 'Export Image', + exportImages: 'Export Images', + removeBorder: 'Remove Border', + addBorder: 'Add Border', + freeRotateImage: 'Free rotate Image', + geolocateImage: 'Geolocate Image', + lockMode: 'Lock Mode', + lockImages: 'Lock Images', + makeImageOpaque: 'Make Image Opaque', + makeImageTransparent: 'Make Image Transparent', + restoreImage: 'Restore Natural Image', + rotateImage: 'Rotate Image', + scaleImage: 'Scale Image', + stackToFront: 'Stack to Front', + stackToBack: 'Stack to Back', + unlockImages: 'Unlock Images', + confirmImageDelete: 'Are you sure? This image will be permanently deleted from the map.', + confirmImagesDeletes: 'Are you sure? These images will be permanently deleted from the map.' + }; + + if (!this.options.translation) { + this.options.translation = translation; + } else { + // If the translation for a word is not specified, fallback to English. + for (var key in translation) { + if (!this.options.translation.hasOwnProperty(key)) { + this.options.translation[key] = translation[key]; + } + } + } + + L.DomUtil.initTranslation(this.options.translation); + }, + getNestedVal: function getNestedVal(obj, key, nestedKey) { + var dig = [key, nestedKey]; + return dig.reduce(function (obj, k) { + return obj && obj[k]; + }, obj); + } +}; + +/***/ }), + +/***/ "./node_modules/events/events.js": +/*!***************************************!*\ + !*** ./node_modules/events/events.js ***! + \***************************************/ +/***/ (function(module) { + +"use strict"; +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + + + +var R = typeof Reflect === 'object' ? Reflect : null +var ReflectApply = R && typeof R.apply === 'function' + ? R.apply + : function ReflectApply(target, receiver, args) { + return Function.prototype.apply.call(target, receiver, args); + } + +var ReflectOwnKeys +if (R && typeof R.ownKeys === 'function') { + ReflectOwnKeys = R.ownKeys +} else if (Object.getOwnPropertySymbols) { + ReflectOwnKeys = function ReflectOwnKeys(target) { + return Object.getOwnPropertyNames(target) + .concat(Object.getOwnPropertySymbols(target)); + }; +} else { + ReflectOwnKeys = function ReflectOwnKeys(target) { + return Object.getOwnPropertyNames(target); + }; +} + +function ProcessEmitWarning(warning) { + if (console && console.warn) console.warn(warning); +} + +var NumberIsNaN = Number.isNaN || function NumberIsNaN(value) { + return value !== value; +} + +function EventEmitter() { + EventEmitter.init.call(this); +} +module.exports = EventEmitter; +module.exports.once = once; + +// Backwards-compat with node 0.10.x +EventEmitter.EventEmitter = EventEmitter; + +EventEmitter.prototype._events = undefined; +EventEmitter.prototype._eventsCount = 0; +EventEmitter.prototype._maxListeners = undefined; + +// By default EventEmitters will print a warning if more than 10 listeners are +// added to it. This is a useful default which helps finding memory leaks. +var defaultMaxListeners = 10; + +function checkListener(listener) { + if (typeof listener !== 'function') { + throw new TypeError('The "listener" argument must be of type Function. Received type ' + typeof listener); + } +} + +Object.defineProperty(EventEmitter, 'defaultMaxListeners', { + enumerable: true, + get: function() { + return defaultMaxListeners; + }, + set: function(arg) { + if (typeof arg !== 'number' || arg < 0 || NumberIsNaN(arg)) { + throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received ' + arg + '.'); + } + defaultMaxListeners = arg; + } +}); + +EventEmitter.init = function() { + + if (this._events === undefined || + this._events === Object.getPrototypeOf(this)._events) { + this._events = Object.create(null); + this._eventsCount = 0; + } + + this._maxListeners = this._maxListeners || undefined; +}; + +// Obviously not all Emitters should be limited to 10. This function allows +// that to be increased. Set to zero for unlimited. +EventEmitter.prototype.setMaxListeners = function setMaxListeners(n) { + if (typeof n !== 'number' || n < 0 || NumberIsNaN(n)) { + throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received ' + n + '.'); + } + this._maxListeners = n; + return this; +}; + +function _getMaxListeners(that) { + if (that._maxListeners === undefined) + return EventEmitter.defaultMaxListeners; + return that._maxListeners; +} + +EventEmitter.prototype.getMaxListeners = function getMaxListeners() { + return _getMaxListeners(this); +}; + +EventEmitter.prototype.emit = function emit(type) { + var args = []; + for (var i = 1; i < arguments.length; i++) args.push(arguments[i]); + var doError = (type === 'error'); + + var events = this._events; + if (events !== undefined) + doError = (doError && events.error === undefined); + else if (!doError) + return false; + + // If there is no 'error' event listener then throw. + if (doError) { + var er; + if (args.length > 0) + er = args[0]; + if (er instanceof Error) { + // Note: The comments on the `throw` lines are intentional, they show + // up in Node's output if this results in an unhandled exception. + throw er; // Unhandled 'error' event + } + // At least give some kind of context to the user + var err = new Error('Unhandled error.' + (er ? ' (' + er.message + ')' : '')); + err.context = er; + throw err; // Unhandled 'error' event + } + + var handler = events[type]; + + if (handler === undefined) + return false; + + if (typeof handler === 'function') { + ReflectApply(handler, this, args); + } else { + var len = handler.length; + var listeners = arrayClone(handler, len); + for (var i = 0; i < len; ++i) + ReflectApply(listeners[i], this, args); + } + + return true; +}; + +function _addListener(target, type, listener, prepend) { + var m; + var events; + var existing; + + checkListener(listener); + + events = target._events; + if (events === undefined) { + events = target._events = Object.create(null); + target._eventsCount = 0; + } else { + // To avoid recursion in the case that type === "newListener"! Before + // adding it to the listeners, first emit "newListener". + if (events.newListener !== undefined) { + target.emit('newListener', type, + listener.listener ? listener.listener : listener); + + // Re-assign `events` because a newListener handler could have caused the + // this._events to be assigned to a new object + events = target._events; + } + existing = events[type]; + } + + if (existing === undefined) { + // Optimize the case of one listener. Don't need the extra array object. + existing = events[type] = listener; + ++target._eventsCount; + } else { + if (typeof existing === 'function') { + // Adding the second element, need to change to array. + existing = events[type] = + prepend ? [listener, existing] : [existing, listener]; + // If we've already got an array, just append. + } else if (prepend) { + existing.unshift(listener); + } else { + existing.push(listener); + } + + // Check for listener leak + m = _getMaxListeners(target); + if (m > 0 && existing.length > m && !existing.warned) { + existing.warned = true; + // No error code for this since it is a Warning + // eslint-disable-next-line no-restricted-syntax + var w = new Error('Possible EventEmitter memory leak detected. ' + + existing.length + ' ' + String(type) + ' listeners ' + + 'added. Use emitter.setMaxListeners() to ' + + 'increase limit'); + w.name = 'MaxListenersExceededWarning'; + w.emitter = target; + w.type = type; + w.count = existing.length; + ProcessEmitWarning(w); + } + } + + return target; +} + +EventEmitter.prototype.addListener = function addListener(type, listener) { + return _addListener(this, type, listener, false); +}; + +EventEmitter.prototype.on = EventEmitter.prototype.addListener; + +EventEmitter.prototype.prependListener = + function prependListener(type, listener) { + return _addListener(this, type, listener, true); + }; + +function onceWrapper() { + if (!this.fired) { + this.target.removeListener(this.type, this.wrapFn); + this.fired = true; + if (arguments.length === 0) + return this.listener.call(this.target); + return this.listener.apply(this.target, arguments); + } +} + +function _onceWrap(target, type, listener) { + var state = { fired: false, wrapFn: undefined, target: target, type: type, listener: listener }; + var wrapped = onceWrapper.bind(state); + wrapped.listener = listener; + state.wrapFn = wrapped; + return wrapped; +} + +EventEmitter.prototype.once = function once(type, listener) { + checkListener(listener); + this.on(type, _onceWrap(this, type, listener)); + return this; +}; + +EventEmitter.prototype.prependOnceListener = + function prependOnceListener(type, listener) { + checkListener(listener); + this.prependListener(type, _onceWrap(this, type, listener)); + return this; + }; + +// Emits a 'removeListener' event if and only if the listener was removed. +EventEmitter.prototype.removeListener = + function removeListener(type, listener) { + var list, events, position, i, originalListener; + + checkListener(listener); + + events = this._events; + if (events === undefined) + return this; + + list = events[type]; + if (list === undefined) + return this; + + if (list === listener || list.listener === listener) { + if (--this._eventsCount === 0) + this._events = Object.create(null); + else { + delete events[type]; + if (events.removeListener) + this.emit('removeListener', type, list.listener || listener); + } + } else if (typeof list !== 'function') { + position = -1; + + for (i = list.length - 1; i >= 0; i--) { + if (list[i] === listener || list[i].listener === listener) { + originalListener = list[i].listener; + position = i; + break; + } + } + + if (position < 0) + return this; + + if (position === 0) + list.shift(); + else { + spliceOne(list, position); + } + + if (list.length === 1) + events[type] = list[0]; + + if (events.removeListener !== undefined) + this.emit('removeListener', type, originalListener || listener); + } + + return this; + }; + +EventEmitter.prototype.off = EventEmitter.prototype.removeListener; + +EventEmitter.prototype.removeAllListeners = + function removeAllListeners(type) { + var listeners, events, i; + + events = this._events; + if (events === undefined) + return this; + + // not listening for removeListener, no need to emit + if (events.removeListener === undefined) { + if (arguments.length === 0) { + this._events = Object.create(null); + this._eventsCount = 0; + } else if (events[type] !== undefined) { + if (--this._eventsCount === 0) + this._events = Object.create(null); + else + delete events[type]; + } + return this; + } + + // emit removeListener for all listeners on all events + if (arguments.length === 0) { + var keys = Object.keys(events); + var key; + for (i = 0; i < keys.length; ++i) { + key = keys[i]; + if (key === 'removeListener') continue; + this.removeAllListeners(key); + } + this.removeAllListeners('removeListener'); + this._events = Object.create(null); + this._eventsCount = 0; + return this; + } + + listeners = events[type]; + + if (typeof listeners === 'function') { + this.removeListener(type, listeners); + } else if (listeners !== undefined) { + // LIFO order + for (i = listeners.length - 1; i >= 0; i--) { + this.removeListener(type, listeners[i]); + } + } + + return this; + }; + +function _listeners(target, type, unwrap) { + var events = target._events; + + if (events === undefined) + return []; + + var evlistener = events[type]; + if (evlistener === undefined) + return []; + + if (typeof evlistener === 'function') + return unwrap ? [evlistener.listener || evlistener] : [evlistener]; + + return unwrap ? + unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length); +} + +EventEmitter.prototype.listeners = function listeners(type) { + return _listeners(this, type, true); +}; + +EventEmitter.prototype.rawListeners = function rawListeners(type) { + return _listeners(this, type, false); +}; + +EventEmitter.listenerCount = function(emitter, type) { + if (typeof emitter.listenerCount === 'function') { + return emitter.listenerCount(type); + } else { + return listenerCount.call(emitter, type); + } +}; + +EventEmitter.prototype.listenerCount = listenerCount; +function listenerCount(type) { + var events = this._events; + + if (events !== undefined) { + var evlistener = events[type]; + + if (typeof evlistener === 'function') { + return 1; + } else if (evlistener !== undefined) { + return evlistener.length; + } + } + + return 0; +} + +EventEmitter.prototype.eventNames = function eventNames() { + return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : []; +}; + +function arrayClone(arr, n) { + var copy = new Array(n); + for (var i = 0; i < n; ++i) + copy[i] = arr[i]; + return copy; +} + +function spliceOne(list, index) { + for (; index + 1 < list.length; index++) + list[index] = list[index + 1]; + list.pop(); +} + +function unwrapListeners(arr) { + var ret = new Array(arr.length); + for (var i = 0; i < ret.length; ++i) { + ret[i] = arr[i].listener || arr[i]; + } + return ret; +} + +function once(emitter, name) { + return new Promise(function (resolve, reject) { + function errorListener(err) { + emitter.removeListener(name, resolver); + reject(err); + } + + function resolver() { + if (typeof emitter.removeListener === 'function') { + emitter.removeListener('error', errorListener); + } + resolve([].slice.call(arguments)); + }; + + eventTargetAgnosticAddListener(emitter, name, resolver, { once: true }); + if (name !== 'error') { + addErrorHandlerIfEventEmitter(emitter, errorListener, { once: true }); + } + }); +} + +function addErrorHandlerIfEventEmitter(emitter, handler, flags) { + if (typeof emitter.on === 'function') { + eventTargetAgnosticAddListener(emitter, 'error', handler, flags); + } +} + +function eventTargetAgnosticAddListener(emitter, name, listener, flags) { + if (typeof emitter.on === 'function') { + if (flags.once) { + emitter.once(name, listener); + } else { + emitter.on(name, listener); + } + } else if (typeof emitter.addEventListener === 'function') { + // EventTarget does not have `error` event semantics like Node + // EventEmitters, we do not listen for `error` events here. + emitter.addEventListener(name, function wrapListener(arg) { + // IE does not have builtin `{ once: true }` support so we + // have to do it manually. + if (flags.once) { + emitter.removeEventListener(name, wrapListener); + } + listener(arg); + }); + } else { + throw new TypeError('The "emitter" argument must be of type EventEmitter. Received type ' + typeof emitter); + } +} + + +/***/ }), + +/***/ "./node_modules/html-entities/lib/index.js": +/*!*************************************************!*\ + !*** ./node_modules/html-entities/lib/index.js ***! + \*************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +var __assign = (this && this.__assign) || function () { + __assign = Object.assign || function(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +var named_references_1 = __webpack_require__(/*! ./named-references */ "./node_modules/html-entities/lib/named-references.js"); +var numeric_unicode_map_1 = __webpack_require__(/*! ./numeric-unicode-map */ "./node_modules/html-entities/lib/numeric-unicode-map.js"); +var surrogate_pairs_1 = __webpack_require__(/*! ./surrogate-pairs */ "./node_modules/html-entities/lib/surrogate-pairs.js"); +var allNamedReferences = __assign(__assign({}, named_references_1.namedReferences), { all: named_references_1.namedReferences.html5 }); +var encodeRegExps = { + specialChars: /[<>'"&]/g, + nonAscii: /(?:[<>'"&\u0080-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])/g, + nonAsciiPrintable: /(?:[<>'"&\x01-\x08\x11-\x15\x17-\x1F\x7f-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])/g, + extensive: /(?:[\x01-\x0c\x0e-\x1f\x21-\x2c\x2e-\x2f\x3a-\x40\x5b-\x60\x7b-\x7d\x7f-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])/g +}; +var defaultEncodeOptions = { + mode: 'specialChars', + level: 'all', + numeric: 'decimal' +}; +/** Encodes all the necessary (specified by `level`) characters in the text */ +function encode(text, _a) { + var _b = _a === void 0 ? defaultEncodeOptions : _a, _c = _b.mode, mode = _c === void 0 ? 'specialChars' : _c, _d = _b.numeric, numeric = _d === void 0 ? 'decimal' : _d, _e = _b.level, level = _e === void 0 ? 'all' : _e; + if (!text) { + return ''; + } + var encodeRegExp = encodeRegExps[mode]; + var references = allNamedReferences[level].characters; + var isHex = numeric === 'hexadecimal'; + encodeRegExp.lastIndex = 0; + var _b = encodeRegExp.exec(text); + var _c; + if (_b) { + _c = ''; + var _d = 0; + do { + if (_d !== _b.index) { + _c += text.substring(_d, _b.index); + } + var _e = _b[0]; + var result_1 = references[_e]; + if (!result_1) { + var code_1 = _e.length > 1 ? surrogate_pairs_1.getCodePoint(_e, 0) : _e.charCodeAt(0); + result_1 = (isHex ? '&#x' + code_1.toString(16) : '&#' + code_1) + ';'; + } + _c += result_1; + _d = _b.index + _e.length; + } while ((_b = encodeRegExp.exec(text))); + if (_d !== text.length) { + _c += text.substring(_d); + } + } + else { + _c = + text; + } + return _c; +} +exports.encode = encode; +var defaultDecodeOptions = { + scope: 'body', + level: 'all' +}; +var strict = /&(?:#\d+|#[xX][\da-fA-F]+|[0-9a-zA-Z]+);/g; +var attribute = /&(?:#\d+|#[xX][\da-fA-F]+|[0-9a-zA-Z]+)[;=]?/g; +var baseDecodeRegExps = { + xml: { + strict: strict, + attribute: attribute, + body: named_references_1.bodyRegExps.xml + }, + html4: { + strict: strict, + attribute: attribute, + body: named_references_1.bodyRegExps.html4 + }, + html5: { + strict: strict, + attribute: attribute, + body: named_references_1.bodyRegExps.html5 + } +}; +var decodeRegExps = __assign(__assign({}, baseDecodeRegExps), { all: baseDecodeRegExps.html5 }); +var fromCharCode = String.fromCharCode; +var outOfBoundsChar = fromCharCode(65533); +var defaultDecodeEntityOptions = { + level: 'all' +}; +/** Decodes a single entity */ +function decodeEntity(entity, _a) { + var _b = (_a === void 0 ? defaultDecodeEntityOptions : _a).level, level = _b === void 0 ? 'all' : _b; + if (!entity) { + return ''; + } + var _b = entity; + var decodeEntityLastChar_1 = entity[entity.length - 1]; + if (false) {} + else if (false) {} + else { + var decodeResultByReference_1 = allNamedReferences[level].entities[entity]; + if (decodeResultByReference_1) { + _b = decodeResultByReference_1; + } + else if (entity[0] === '&' && entity[1] === '#') { + var decodeSecondChar_1 = entity[2]; + var decodeCode_1 = decodeSecondChar_1 == 'x' || decodeSecondChar_1 == 'X' + ? parseInt(entity.substr(3), 16) + : parseInt(entity.substr(2)); + _b = + decodeCode_1 >= 0x10ffff + ? outOfBoundsChar + : decodeCode_1 > 65535 + ? surrogate_pairs_1.fromCodePoint(decodeCode_1) + : fromCharCode(numeric_unicode_map_1.numericUnicodeMap[decodeCode_1] || decodeCode_1); + } + } + return _b; +} +exports.decodeEntity = decodeEntity; +/** Decodes all entities in the text */ +function decode(text, _a) { + var decodeSecondChar_1 = _a === void 0 ? defaultDecodeOptions : _a, decodeCode_1 = decodeSecondChar_1.level, level = decodeCode_1 === void 0 ? 'all' : decodeCode_1, _b = decodeSecondChar_1.scope, scope = _b === void 0 ? level === 'xml' ? 'strict' : 'body' : _b; + if (!text) { + return ''; + } + var decodeRegExp = decodeRegExps[level][scope]; + var references = allNamedReferences[level].entities; + var isAttribute = scope === 'attribute'; + var isStrict = scope === 'strict'; + decodeRegExp.lastIndex = 0; + var replaceMatch_1 = decodeRegExp.exec(text); + var replaceResult_1; + if (replaceMatch_1) { + replaceResult_1 = ''; + var replaceLastIndex_1 = 0; + do { + if (replaceLastIndex_1 !== replaceMatch_1.index) { + replaceResult_1 += text.substring(replaceLastIndex_1, replaceMatch_1.index); + } + var replaceInput_1 = replaceMatch_1[0]; + var decodeResult_1 = replaceInput_1; + var decodeEntityLastChar_2 = replaceInput_1[replaceInput_1.length - 1]; + if (isAttribute + && decodeEntityLastChar_2 === '=') { + decodeResult_1 = replaceInput_1; + } + else if (isStrict + && decodeEntityLastChar_2 !== ';') { + decodeResult_1 = replaceInput_1; + } + else { + var decodeResultByReference_2 = references[replaceInput_1]; + if (decodeResultByReference_2) { + decodeResult_1 = decodeResultByReference_2; + } + else if (replaceInput_1[0] === '&' && replaceInput_1[1] === '#') { + var decodeSecondChar_2 = replaceInput_1[2]; + var decodeCode_2 = decodeSecondChar_2 == 'x' || decodeSecondChar_2 == 'X' + ? parseInt(replaceInput_1.substr(3), 16) + : parseInt(replaceInput_1.substr(2)); + decodeResult_1 = + decodeCode_2 >= 0x10ffff + ? outOfBoundsChar + : decodeCode_2 > 65535 + ? surrogate_pairs_1.fromCodePoint(decodeCode_2) + : fromCharCode(numeric_unicode_map_1.numericUnicodeMap[decodeCode_2] || decodeCode_2); + } + } + replaceResult_1 += decodeResult_1; + replaceLastIndex_1 = replaceMatch_1.index + replaceInput_1.length; + } while ((replaceMatch_1 = decodeRegExp.exec(text))); + if (replaceLastIndex_1 !== text.length) { + replaceResult_1 += text.substring(replaceLastIndex_1); + } + } + else { + replaceResult_1 = + text; + } + return replaceResult_1; +} +exports.decode = decode; + + +/***/ }), + +/***/ "./node_modules/html-entities/lib/named-references.js": +/*!************************************************************!*\ + !*** ./node_modules/html-entities/lib/named-references.js ***! + \************************************************************/ +/***/ (function(__unused_webpack_module, exports) { + +"use strict"; +Object.defineProperty(exports, "__esModule", ({value:true}));exports.bodyRegExps={xml:/&(?:#\d+|#[xX][\da-fA-F]+|[0-9a-zA-Z]+);?/g,html4:/&(?:nbsp|iexcl|cent|pound|curren|yen|brvbar|sect|uml|copy|ordf|laquo|not|shy|reg|macr|deg|plusmn|sup2|sup3|acute|micro|para|middot|cedil|sup1|ordm|raquo|frac14|frac12|frac34|iquest|Agrave|Aacute|Acirc|Atilde|Auml|Aring|AElig|Ccedil|Egrave|Eacute|Ecirc|Euml|Igrave|Iacute|Icirc|Iuml|ETH|Ntilde|Ograve|Oacute|Ocirc|Otilde|Ouml|times|Oslash|Ugrave|Uacute|Ucirc|Uuml|Yacute|THORN|szlig|agrave|aacute|acirc|atilde|auml|aring|aelig|ccedil|egrave|eacute|ecirc|euml|igrave|iacute|icirc|iuml|eth|ntilde|ograve|oacute|ocirc|otilde|ouml|divide|oslash|ugrave|uacute|ucirc|uuml|yacute|thorn|yuml|quot|amp|lt|gt|#\d+|#[xX][\da-fA-F]+|[0-9a-zA-Z]+);?/g,html5:/&(?:AElig|AMP|Aacute|Acirc|Agrave|Aring|Atilde|Auml|COPY|Ccedil|ETH|Eacute|Ecirc|Egrave|Euml|GT|Iacute|Icirc|Igrave|Iuml|LT|Ntilde|Oacute|Ocirc|Ograve|Oslash|Otilde|Ouml|QUOT|REG|THORN|Uacute|Ucirc|Ugrave|Uuml|Yacute|aacute|acirc|acute|aelig|agrave|amp|aring|atilde|auml|brvbar|ccedil|cedil|cent|copy|curren|deg|divide|eacute|ecirc|egrave|eth|euml|frac12|frac14|frac34|gt|iacute|icirc|iexcl|igrave|iquest|iuml|laquo|lt|macr|micro|middot|nbsp|not|ntilde|oacute|ocirc|ograve|ordf|ordm|oslash|otilde|ouml|para|plusmn|pound|quot|raquo|reg|sect|shy|sup1|sup2|sup3|szlig|thorn|times|uacute|ucirc|ugrave|uml|uuml|yacute|yen|yuml|#\d+|#[xX][\da-fA-F]+|[0-9a-zA-Z]+);?/g};exports.namedReferences={xml:{entities:{"<":"<",">":">",""":'"',"'":"'","&":"&"},characters:{"<":"<",">":">",'"':""","'":"'","&":"&"}},html4:{entities:{"'":"'"," ":" "," ":" ","¡":"¡","¡":"¡","¢":"¢","¢":"¢","£":"£","£":"£","¤":"¤","¤":"¤","¥":"¥","¥":"¥","¦":"¦","¦":"¦","§":"§","§":"§","¨":"¨","¨":"¨","©":"©","©":"©","ª":"ª","ª":"ª","«":"«","«":"«","¬":"¬","¬":"¬","­":"­","­":"­","®":"®","®":"®","¯":"¯","¯":"¯","°":"°","°":"°","±":"±","±":"±","²":"²","²":"²","³":"³","³":"³","´":"´","´":"´","µ":"µ","µ":"µ","¶":"¶","¶":"¶","·":"·","·":"·","¸":"¸","¸":"¸","¹":"¹","¹":"¹","º":"º","º":"º","»":"»","»":"»","¼":"¼","¼":"¼","½":"½","½":"½","¾":"¾","¾":"¾","¿":"¿","¿":"¿","À":"À","À":"À","Á":"Á","Á":"Á","Â":"Â","Â":"Â","Ã":"Ã","Ã":"Ã","Ä":"Ä","Ä":"Ä","Å":"Å","Å":"Å","Æ":"Æ","Æ":"Æ","Ç":"Ç","Ç":"Ç","È":"È","È":"È","É":"É","É":"É","Ê":"Ê","Ê":"Ê","Ë":"Ë","Ë":"Ë","Ì":"Ì","Ì":"Ì","Í":"Í","Í":"Í","Î":"Î","Î":"Î","Ï":"Ï","Ï":"Ï","Ð":"Ð","Ð":"Ð","Ñ":"Ñ","Ñ":"Ñ","Ò":"Ò","Ò":"Ò","Ó":"Ó","Ó":"Ó","Ô":"Ô","Ô":"Ô","Õ":"Õ","Õ":"Õ","Ö":"Ö","Ö":"Ö","×":"×","×":"×","Ø":"Ø","Ø":"Ø","Ù":"Ù","Ù":"Ù","Ú":"Ú","Ú":"Ú","Û":"Û","Û":"Û","Ü":"Ü","Ü":"Ü","Ý":"Ý","Ý":"Ý","Þ":"Þ","Þ":"Þ","ß":"ß","ß":"ß","à":"à","à":"à","á":"á","á":"á","â":"â","â":"â","ã":"ã","ã":"ã","ä":"ä","ä":"ä","å":"å","å":"å","æ":"æ","æ":"æ","ç":"ç","ç":"ç","è":"è","è":"è","é":"é","é":"é","ê":"ê","ê":"ê","ë":"ë","ë":"ë","ì":"ì","ì":"ì","í":"í","í":"í","î":"î","î":"î","ï":"ï","ï":"ï","ð":"ð","ð":"ð","ñ":"ñ","ñ":"ñ","ò":"ò","ò":"ò","ó":"ó","ó":"ó","ô":"ô","ô":"ô","õ":"õ","õ":"õ","ö":"ö","ö":"ö","÷":"÷","÷":"÷","ø":"ø","ø":"ø","ù":"ù","ù":"ù","ú":"ú","ú":"ú","û":"û","û":"û","ü":"ü","ü":"ü","ý":"ý","ý":"ý","þ":"þ","þ":"þ","ÿ":"ÿ","ÿ":"ÿ",""":'"',""":'"',"&":"&","&":"&","<":"<","<":"<",">":">",">":">","Œ":"Œ","œ":"œ","Š":"Š","š":"š","Ÿ":"Ÿ","ˆ":"ˆ","˜":"˜"," ":" "," ":" "," ":" ","‌":"‌","‍":"‍","‎":"‎","‏":"‏","–":"–","—":"—","‘":"‘","’":"’","‚":"‚","“":"“","”":"”","„":"„","†":"†","‡":"‡","‰":"‰","‹":"‹","›":"›","€":"€","ƒ":"ƒ","Α":"Α","Β":"Β","Γ":"Γ","Δ":"Δ","Ε":"Ε","Ζ":"Ζ","Η":"Η","Θ":"Θ","Ι":"Ι","Κ":"Κ","Λ":"Λ","Μ":"Μ","Ν":"Ν","Ξ":"Ξ","Ο":"Ο","Π":"Π","Ρ":"Ρ","Σ":"Σ","Τ":"Τ","Υ":"Υ","Φ":"Φ","Χ":"Χ","Ψ":"Ψ","Ω":"Ω","α":"α","β":"β","γ":"γ","δ":"δ","ε":"ε","ζ":"ζ","η":"η","θ":"θ","ι":"ι","κ":"κ","λ":"λ","μ":"μ","ν":"ν","ξ":"ξ","ο":"ο","π":"π","ρ":"ρ","ς":"ς","σ":"σ","τ":"τ","υ":"υ","φ":"φ","χ":"χ","ψ":"ψ","ω":"ω","ϑ":"ϑ","ϒ":"ϒ","ϖ":"ϖ","•":"•","…":"…","′":"′","″":"″","‾":"‾","⁄":"⁄","℘":"℘","ℑ":"ℑ","ℜ":"ℜ","™":"™","ℵ":"ℵ","←":"←","↑":"↑","→":"→","↓":"↓","↔":"↔","↵":"↵","⇐":"⇐","⇑":"⇑","⇒":"⇒","⇓":"⇓","⇔":"⇔","∀":"∀","∂":"∂","∃":"∃","∅":"∅","∇":"∇","∈":"∈","∉":"∉","∋":"∋","∏":"∏","∑":"∑","−":"−","∗":"∗","√":"√","∝":"∝","∞":"∞","∠":"∠","∧":"∧","∨":"∨","∩":"∩","∪":"∪","∫":"∫","∴":"∴","∼":"∼","≅":"≅","≈":"≈","≠":"≠","≡":"≡","≤":"≤","≥":"≥","⊂":"⊂","⊃":"⊃","⊄":"⊄","⊆":"⊆","⊇":"⊇","⊕":"⊕","⊗":"⊗","⊥":"⊥","⋅":"⋅","⌈":"⌈","⌉":"⌉","⌊":"⌊","⌋":"⌋","⟨":"〈","⟩":"〉","◊":"◊","♠":"♠","♣":"♣","♥":"♥","♦":"♦"},characters:{"'":"'"," ":" ","¡":"¡","¢":"¢","£":"£","¤":"¤","¥":"¥","¦":"¦","§":"§","¨":"¨","©":"©","ª":"ª","«":"«","¬":"¬","­":"­","®":"®","¯":"¯","°":"°","±":"±","²":"²","³":"³","´":"´","µ":"µ","¶":"¶","·":"·","¸":"¸","¹":"¹","º":"º","»":"»","¼":"¼","½":"½","¾":"¾","¿":"¿","À":"À","Á":"Á","Â":"Â","Ã":"Ã","Ä":"Ä","Å":"Å","Æ":"Æ","Ç":"Ç","È":"È","É":"É","Ê":"Ê","Ë":"Ë","Ì":"Ì","Í":"Í","Î":"Î","Ï":"Ï","Ð":"Ð","Ñ":"Ñ","Ò":"Ò","Ó":"Ó","Ô":"Ô","Õ":"Õ","Ö":"Ö","×":"×","Ø":"Ø","Ù":"Ù","Ú":"Ú","Û":"Û","Ü":"Ü","Ý":"Ý","Þ":"Þ","ß":"ß","à":"à","á":"á","â":"â","ã":"ã","ä":"ä","å":"å","æ":"æ","ç":"ç","è":"è","é":"é","ê":"ê","ë":"ë","ì":"ì","í":"í","î":"î","ï":"ï","ð":"ð","ñ":"ñ","ò":"ò","ó":"ó","ô":"ô","õ":"õ","ö":"ö","÷":"÷","ø":"ø","ù":"ù","ú":"ú","û":"û","ü":"ü","ý":"ý","þ":"þ","ÿ":"ÿ",'"':""","&":"&","<":"<",">":">","Œ":"Œ","œ":"œ","Š":"Š","š":"š","Ÿ":"Ÿ","ˆ":"ˆ","˜":"˜"," ":" "," ":" "," ":" ","‌":"‌","‍":"‍","‎":"‎","‏":"‏","–":"–","—":"—","‘":"‘","’":"’","‚":"‚","“":"“","”":"”","„":"„","†":"†","‡":"‡","‰":"‰","‹":"‹","›":"›","€":"€","ƒ":"ƒ","Α":"Α","Β":"Β","Γ":"Γ","Δ":"Δ","Ε":"Ε","Ζ":"Ζ","Η":"Η","Θ":"Θ","Ι":"Ι","Κ":"Κ","Λ":"Λ","Μ":"Μ","Ν":"Ν","Ξ":"Ξ","Ο":"Ο","Π":"Π","Ρ":"Ρ","Σ":"Σ","Τ":"Τ","Υ":"Υ","Φ":"Φ","Χ":"Χ","Ψ":"Ψ","Ω":"Ω","α":"α","β":"β","γ":"γ","δ":"δ","ε":"ε","ζ":"ζ","η":"η","θ":"θ","ι":"ι","κ":"κ","λ":"λ","μ":"μ","ν":"ν","ξ":"ξ","ο":"ο","π":"π","ρ":"ρ","ς":"ς","σ":"σ","τ":"τ","υ":"υ","φ":"φ","χ":"χ","ψ":"ψ","ω":"ω","ϑ":"ϑ","ϒ":"ϒ","ϖ":"ϖ","•":"•","…":"…","′":"′","″":"″","‾":"‾","⁄":"⁄","℘":"℘","ℑ":"ℑ","ℜ":"ℜ","™":"™","ℵ":"ℵ","←":"←","↑":"↑","→":"→","↓":"↓","↔":"↔","↵":"↵","⇐":"⇐","⇑":"⇑","⇒":"⇒","⇓":"⇓","⇔":"⇔","∀":"∀","∂":"∂","∃":"∃","∅":"∅","∇":"∇","∈":"∈","∉":"∉","∋":"∋","∏":"∏","∑":"∑","−":"−","∗":"∗","√":"√","∝":"∝","∞":"∞","∠":"∠","∧":"∧","∨":"∨","∩":"∩","∪":"∪","∫":"∫","∴":"∴","∼":"∼","≅":"≅","≈":"≈","≠":"≠","≡":"≡","≤":"≤","≥":"≥","⊂":"⊂","⊃":"⊃","⊄":"⊄","⊆":"⊆","⊇":"⊇","⊕":"⊕","⊗":"⊗","⊥":"⊥","⋅":"⋅","⌈":"⌈","⌉":"⌉","⌊":"⌊","⌋":"⌋","〈":"⟨","〉":"⟩","◊":"◊","♠":"♠","♣":"♣","♥":"♥","♦":"♦"}},html5:{entities:{"Æ":"Æ","Æ":"Æ","&":"&","&":"&","Á":"Á","Á":"Á","Ă":"Ă","Â":"Â","Â":"Â","А":"А","𝔄":"𝔄","À":"À","À":"À","Α":"Α","Ā":"Ā","⩓":"⩓","Ą":"Ą","𝔸":"𝔸","⁡":"⁡","Å":"Å","Å":"Å","𝒜":"𝒜","≔":"≔","Ã":"Ã","Ã":"Ã","Ä":"Ä","Ä":"Ä","∖":"∖","⫧":"⫧","⌆":"⌆","Б":"Б","∵":"∵","ℬ":"ℬ","Β":"Β","𝔅":"𝔅","𝔹":"𝔹","˘":"˘","ℬ":"ℬ","≎":"≎","Ч":"Ч","©":"©","©":"©","Ć":"Ć","⋒":"⋒","ⅅ":"ⅅ","ℭ":"ℭ","Č":"Č","Ç":"Ç","Ç":"Ç","Ĉ":"Ĉ","∰":"∰","Ċ":"Ċ","¸":"¸","·":"·","ℭ":"ℭ","Χ":"Χ","⊙":"⊙","⊖":"⊖","⊕":"⊕","⊗":"⊗","∲":"∲","”":"”","’":"’","∷":"∷","⩴":"⩴","≡":"≡","∯":"∯","∮":"∮","ℂ":"ℂ","∐":"∐","∳":"∳","⨯":"⨯","𝒞":"𝒞","⋓":"⋓","≍":"≍","ⅅ":"ⅅ","⤑":"⤑","Ђ":"Ђ","Ѕ":"Ѕ","Џ":"Џ","‡":"‡","↡":"↡","⫤":"⫤","Ď":"Ď","Д":"Д","∇":"∇","Δ":"Δ","𝔇":"𝔇","´":"´","˙":"˙","˝":"˝","`":"`","˜":"˜","⋄":"⋄","ⅆ":"ⅆ","𝔻":"𝔻","¨":"¨","⃜":"⃜","≐":"≐","∯":"∯","¨":"¨","⇓":"⇓","⇐":"⇐","⇔":"⇔","⫤":"⫤","⟸":"⟸","⟺":"⟺","⟹":"⟹","⇒":"⇒","⊨":"⊨","⇑":"⇑","⇕":"⇕","∥":"∥","↓":"↓","⤓":"⤓","⇵":"⇵","̑":"̑","⥐":"⥐","⥞":"⥞","↽":"↽","⥖":"⥖","⥟":"⥟","⇁":"⇁","⥗":"⥗","⊤":"⊤","↧":"↧","⇓":"⇓","𝒟":"𝒟","Đ":"Đ","Ŋ":"Ŋ","Ð":"Ð","Ð":"Ð","É":"É","É":"É","Ě":"Ě","Ê":"Ê","Ê":"Ê","Э":"Э","Ė":"Ė","𝔈":"𝔈","È":"È","È":"È","∈":"∈","Ē":"Ē","◻":"◻","▫":"▫","Ę":"Ę","𝔼":"𝔼","Ε":"Ε","⩵":"⩵","≂":"≂","⇌":"⇌","ℰ":"ℰ","⩳":"⩳","Η":"Η","Ë":"Ë","Ë":"Ë","∃":"∃","ⅇ":"ⅇ","Ф":"Ф","𝔉":"𝔉","◼":"◼","▪":"▪","𝔽":"𝔽","∀":"∀","ℱ":"ℱ","ℱ":"ℱ","Ѓ":"Ѓ",">":">",">":">","Γ":"Γ","Ϝ":"Ϝ","Ğ":"Ğ","Ģ":"Ģ","Ĝ":"Ĝ","Г":"Г","Ġ":"Ġ","𝔊":"𝔊","⋙":"⋙","𝔾":"𝔾","≥":"≥","⋛":"⋛","≧":"≧","⪢":"⪢","≷":"≷","⩾":"⩾","≳":"≳","𝒢":"𝒢","≫":"≫","Ъ":"Ъ","ˇ":"ˇ","^":"^","Ĥ":"Ĥ","ℌ":"ℌ","ℋ":"ℋ","ℍ":"ℍ","─":"─","ℋ":"ℋ","Ħ":"Ħ","≎":"≎","≏":"≏","Е":"Е","IJ":"IJ","Ё":"Ё","Í":"Í","Í":"Í","Î":"Î","Î":"Î","И":"И","İ":"İ","ℑ":"ℑ","Ì":"Ì","Ì":"Ì","ℑ":"ℑ","Ī":"Ī","ⅈ":"ⅈ","⇒":"⇒","∬":"∬","∫":"∫","⋂":"⋂","⁣":"⁣","⁢":"⁢","Į":"Į","𝕀":"𝕀","Ι":"Ι","ℐ":"ℐ","Ĩ":"Ĩ","І":"І","Ï":"Ï","Ï":"Ï","Ĵ":"Ĵ","Й":"Й","𝔍":"𝔍","𝕁":"𝕁","𝒥":"𝒥","Ј":"Ј","Є":"Є","Х":"Х","Ќ":"Ќ","Κ":"Κ","Ķ":"Ķ","К":"К","𝔎":"𝔎","𝕂":"𝕂","𝒦":"𝒦","Љ":"Љ","<":"<","<":"<","Ĺ":"Ĺ","Λ":"Λ","⟪":"⟪","ℒ":"ℒ","↞":"↞","Ľ":"Ľ","Ļ":"Ļ","Л":"Л","⟨":"⟨","←":"←","⇤":"⇤","⇆":"⇆","⌈":"⌈","⟦":"⟦","⥡":"⥡","⇃":"⇃","⥙":"⥙","⌊":"⌊","↔":"↔","⥎":"⥎","⊣":"⊣","↤":"↤","⥚":"⥚","⊲":"⊲","⧏":"⧏","⊴":"⊴","⥑":"⥑","⥠":"⥠","↿":"↿","⥘":"⥘","↼":"↼","⥒":"⥒","⇐":"⇐","⇔":"⇔","⋚":"⋚","≦":"≦","≶":"≶","⪡":"⪡","⩽":"⩽","≲":"≲","𝔏":"𝔏","⋘":"⋘","⇚":"⇚","Ŀ":"Ŀ","⟵":"⟵","⟷":"⟷","⟶":"⟶","⟸":"⟸","⟺":"⟺","⟹":"⟹","𝕃":"𝕃","↙":"↙","↘":"↘","ℒ":"ℒ","↰":"↰","Ł":"Ł","≪":"≪","⤅":"⤅","М":"М"," ":" ","ℳ":"ℳ","𝔐":"𝔐","∓":"∓","𝕄":"𝕄","ℳ":"ℳ","Μ":"Μ","Њ":"Њ","Ń":"Ń","Ň":"Ň","Ņ":"Ņ","Н":"Н","​":"​","​":"​","​":"​","​":"​","≫":"≫","≪":"≪"," ":"\n","𝔑":"𝔑","⁠":"⁠"," ":" ","ℕ":"ℕ","⫬":"⫬","≢":"≢","≭":"≭","∦":"∦","∉":"∉","≠":"≠","≂̸":"≂̸","∄":"∄","≯":"≯","≱":"≱","≧̸":"≧̸","≫̸":"≫̸","≹":"≹","⩾̸":"⩾̸","≵":"≵","≎̸":"≎̸","≏̸":"≏̸","⋪":"⋪","⧏̸":"⧏̸","⋬":"⋬","≮":"≮","≰":"≰","≸":"≸","≪̸":"≪̸","⩽̸":"⩽̸","≴":"≴","⪢̸":"⪢̸","⪡̸":"⪡̸","⊀":"⊀","⪯̸":"⪯̸","⋠":"⋠","∌":"∌","⋫":"⋫","⧐̸":"⧐̸","⋭":"⋭","⊏̸":"⊏̸","⋢":"⋢","⊐̸":"⊐̸","⋣":"⋣","⊂⃒":"⊂⃒","⊈":"⊈","⊁":"⊁","⪰̸":"⪰̸","⋡":"⋡","≿̸":"≿̸","⊃⃒":"⊃⃒","⊉":"⊉","≁":"≁","≄":"≄","≇":"≇","≉":"≉","∤":"∤","𝒩":"𝒩","Ñ":"Ñ","Ñ":"Ñ","Ν":"Ν","Œ":"Œ","Ó":"Ó","Ó":"Ó","Ô":"Ô","Ô":"Ô","О":"О","Ő":"Ő","𝔒":"𝔒","Ò":"Ò","Ò":"Ò","Ō":"Ō","Ω":"Ω","Ο":"Ο","𝕆":"𝕆","“":"“","‘":"‘","⩔":"⩔","𝒪":"𝒪","Ø":"Ø","Ø":"Ø","Õ":"Õ","Õ":"Õ","⨷":"⨷","Ö":"Ö","Ö":"Ö","‾":"‾","⏞":"⏞","⎴":"⎴","⏜":"⏜","∂":"∂","П":"П","𝔓":"𝔓","Φ":"Φ","Π":"Π","±":"±","ℌ":"ℌ","ℙ":"ℙ","⪻":"⪻","≺":"≺","⪯":"⪯","≼":"≼","≾":"≾","″":"″","∏":"∏","∷":"∷","∝":"∝","𝒫":"𝒫","Ψ":"Ψ",""":'"',""":'"',"𝔔":"𝔔","ℚ":"ℚ","𝒬":"𝒬","⤐":"⤐","®":"®","®":"®","Ŕ":"Ŕ","⟫":"⟫","↠":"↠","⤖":"⤖","Ř":"Ř","Ŗ":"Ŗ","Р":"Р","ℜ":"ℜ","∋":"∋","⇋":"⇋","⥯":"⥯","ℜ":"ℜ","Ρ":"Ρ","⟩":"⟩","→":"→","⇥":"⇥","⇄":"⇄","⌉":"⌉","⟧":"⟧","⥝":"⥝","⇂":"⇂","⥕":"⥕","⌋":"⌋","⊢":"⊢","↦":"↦","⥛":"⥛","⊳":"⊳","⧐":"⧐","⊵":"⊵","⥏":"⥏","⥜":"⥜","↾":"↾","⥔":"⥔","⇀":"⇀","⥓":"⥓","⇒":"⇒","ℝ":"ℝ","⥰":"⥰","⇛":"⇛","ℛ":"ℛ","↱":"↱","⧴":"⧴","Щ":"Щ","Ш":"Ш","Ь":"Ь","Ś":"Ś","⪼":"⪼","Š":"Š","Ş":"Ş","Ŝ":"Ŝ","С":"С","𝔖":"𝔖","↓":"↓","←":"←","→":"→","↑":"↑","Σ":"Σ","∘":"∘","𝕊":"𝕊","√":"√","□":"□","⊓":"⊓","⊏":"⊏","⊑":"⊑","⊐":"⊐","⊒":"⊒","⊔":"⊔","𝒮":"𝒮","⋆":"⋆","⋐":"⋐","⋐":"⋐","⊆":"⊆","≻":"≻","⪰":"⪰","≽":"≽","≿":"≿","∋":"∋","∑":"∑","⋑":"⋑","⊃":"⊃","⊇":"⊇","⋑":"⋑","Þ":"Þ","Þ":"Þ","™":"™","Ћ":"Ћ","Ц":"Ц"," ":"\t","Τ":"Τ","Ť":"Ť","Ţ":"Ţ","Т":"Т","𝔗":"𝔗","∴":"∴","Θ":"Θ","  ":"  "," ":" ","∼":"∼","≃":"≃","≅":"≅","≈":"≈","𝕋":"𝕋","⃛":"⃛","𝒯":"𝒯","Ŧ":"Ŧ","Ú":"Ú","Ú":"Ú","↟":"↟","⥉":"⥉","Ў":"Ў","Ŭ":"Ŭ","Û":"Û","Û":"Û","У":"У","Ű":"Ű","𝔘":"𝔘","Ù":"Ù","Ù":"Ù","Ū":"Ū","_":"_","⏟":"⏟","⎵":"⎵","⏝":"⏝","⋃":"⋃","⊎":"⊎","Ų":"Ų","𝕌":"𝕌","↑":"↑","⤒":"⤒","⇅":"⇅","↕":"↕","⥮":"⥮","⊥":"⊥","↥":"↥","⇑":"⇑","⇕":"⇕","↖":"↖","↗":"↗","ϒ":"ϒ","Υ":"Υ","Ů":"Ů","𝒰":"𝒰","Ũ":"Ũ","Ü":"Ü","Ü":"Ü","⊫":"⊫","⫫":"⫫","В":"В","⊩":"⊩","⫦":"⫦","⋁":"⋁","‖":"‖","‖":"‖","∣":"∣","|":"|","❘":"❘","≀":"≀"," ":" ","𝔙":"𝔙","𝕍":"𝕍","𝒱":"𝒱","⊪":"⊪","Ŵ":"Ŵ","⋀":"⋀","𝔚":"𝔚","𝕎":"𝕎","𝒲":"𝒲","𝔛":"𝔛","Ξ":"Ξ","𝕏":"𝕏","𝒳":"𝒳","Я":"Я","Ї":"Ї","Ю":"Ю","Ý":"Ý","Ý":"Ý","Ŷ":"Ŷ","Ы":"Ы","𝔜":"𝔜","𝕐":"𝕐","𝒴":"𝒴","Ÿ":"Ÿ","Ж":"Ж","Ź":"Ź","Ž":"Ž","З":"З","Ż":"Ż","​":"​","Ζ":"Ζ","ℨ":"ℨ","ℤ":"ℤ","𝒵":"𝒵","á":"á","á":"á","ă":"ă","∾":"∾","∾̳":"∾̳","∿":"∿","â":"â","â":"â","´":"´","´":"´","а":"а","æ":"æ","æ":"æ","⁡":"⁡","𝔞":"𝔞","à":"à","à":"à","ℵ":"ℵ","ℵ":"ℵ","α":"α","ā":"ā","⨿":"⨿","&":"&","&":"&","∧":"∧","⩕":"⩕","⩜":"⩜","⩘":"⩘","⩚":"⩚","∠":"∠","⦤":"⦤","∠":"∠","∡":"∡","⦨":"⦨","⦩":"⦩","⦪":"⦪","⦫":"⦫","⦬":"⦬","⦭":"⦭","⦮":"⦮","⦯":"⦯","∟":"∟","⊾":"⊾","⦝":"⦝","∢":"∢","Å":"Å","⍼":"⍼","ą":"ą","𝕒":"𝕒","≈":"≈","⩰":"⩰","⩯":"⩯","≊":"≊","≋":"≋","'":"'","≈":"≈","≊":"≊","å":"å","å":"å","𝒶":"𝒶","*":"*","≈":"≈","≍":"≍","ã":"ã","ã":"ã","ä":"ä","ä":"ä","∳":"∳","⨑":"⨑","⫭":"⫭","≌":"≌","϶":"϶","‵":"‵","∽":"∽","⋍":"⋍","⊽":"⊽","⌅":"⌅","⌅":"⌅","⎵":"⎵","⎶":"⎶","≌":"≌","б":"б","„":"„","∵":"∵","∵":"∵","⦰":"⦰","϶":"϶","ℬ":"ℬ","β":"β","ℶ":"ℶ","≬":"≬","𝔟":"𝔟","⋂":"⋂","◯":"◯","⋃":"⋃","⨀":"⨀","⨁":"⨁","⨂":"⨂","⨆":"⨆","★":"★","▽":"▽","△":"△","⨄":"⨄","⋁":"⋁","⋀":"⋀","⤍":"⤍","⧫":"⧫","▪":"▪","▴":"▴","▾":"▾","◂":"◂","▸":"▸","␣":"␣","▒":"▒","░":"░","▓":"▓","█":"█","=⃥":"=⃥","≡⃥":"≡⃥","⌐":"⌐","𝕓":"𝕓","⊥":"⊥","⊥":"⊥","⋈":"⋈","╗":"╗","╔":"╔","╖":"╖","╓":"╓","═":"═","╦":"╦","╩":"╩","╤":"╤","╧":"╧","╝":"╝","╚":"╚","╜":"╜","╙":"╙","║":"║","╬":"╬","╣":"╣","╠":"╠","╫":"╫","╢":"╢","╟":"╟","⧉":"⧉","╕":"╕","╒":"╒","┐":"┐","┌":"┌","─":"─","╥":"╥","╨":"╨","┬":"┬","┴":"┴","⊟":"⊟","⊞":"⊞","⊠":"⊠","╛":"╛","╘":"╘","┘":"┘","└":"└","│":"│","╪":"╪","╡":"╡","╞":"╞","┼":"┼","┤":"┤","├":"├","‵":"‵","˘":"˘","¦":"¦","¦":"¦","𝒷":"𝒷","⁏":"⁏","∽":"∽","⋍":"⋍","\":"\\","⧅":"⧅","⟈":"⟈","•":"•","•":"•","≎":"≎","⪮":"⪮","≏":"≏","≏":"≏","ć":"ć","∩":"∩","⩄":"⩄","⩉":"⩉","⩋":"⩋","⩇":"⩇","⩀":"⩀","∩︀":"∩︀","⁁":"⁁","ˇ":"ˇ","⩍":"⩍","č":"č","ç":"ç","ç":"ç","ĉ":"ĉ","⩌":"⩌","⩐":"⩐","ċ":"ċ","¸":"¸","¸":"¸","⦲":"⦲","¢":"¢","¢":"¢","·":"·","𝔠":"𝔠","ч":"ч","✓":"✓","✓":"✓","χ":"χ","○":"○","⧃":"⧃","ˆ":"ˆ","≗":"≗","↺":"↺","↻":"↻","®":"®","Ⓢ":"Ⓢ","⊛":"⊛","⊚":"⊚","⊝":"⊝","≗":"≗","⨐":"⨐","⫯":"⫯","⧂":"⧂","♣":"♣","♣":"♣",":":":","≔":"≔","≔":"≔",",":",","@":"@","∁":"∁","∘":"∘","∁":"∁","ℂ":"ℂ","≅":"≅","⩭":"⩭","∮":"∮","𝕔":"𝕔","∐":"∐","©":"©","©":"©","℗":"℗","↵":"↵","✗":"✗","𝒸":"𝒸","⫏":"⫏","⫑":"⫑","⫐":"⫐","⫒":"⫒","⋯":"⋯","⤸":"⤸","⤵":"⤵","⋞":"⋞","⋟":"⋟","↶":"↶","⤽":"⤽","∪":"∪","⩈":"⩈","⩆":"⩆","⩊":"⩊","⊍":"⊍","⩅":"⩅","∪︀":"∪︀","↷":"↷","⤼":"⤼","⋞":"⋞","⋟":"⋟","⋎":"⋎","⋏":"⋏","¤":"¤","¤":"¤","↶":"↶","↷":"↷","⋎":"⋎","⋏":"⋏","∲":"∲","∱":"∱","⌭":"⌭","⇓":"⇓","⥥":"⥥","†":"†","ℸ":"ℸ","↓":"↓","‐":"‐","⊣":"⊣","⤏":"⤏","˝":"˝","ď":"ď","д":"д","ⅆ":"ⅆ","‡":"‡","⇊":"⇊","⩷":"⩷","°":"°","°":"°","δ":"δ","⦱":"⦱","⥿":"⥿","𝔡":"𝔡","⇃":"⇃","⇂":"⇂","⋄":"⋄","⋄":"⋄","♦":"♦","♦":"♦","¨":"¨","ϝ":"ϝ","⋲":"⋲","÷":"÷","÷":"÷","÷":"÷","⋇":"⋇","⋇":"⋇","ђ":"ђ","⌞":"⌞","⌍":"⌍","$":"$","𝕕":"𝕕","˙":"˙","≐":"≐","≑":"≑","∸":"∸","∔":"∔","⊡":"⊡","⌆":"⌆","↓":"↓","⇊":"⇊","⇃":"⇃","⇂":"⇂","⤐":"⤐","⌟":"⌟","⌌":"⌌","𝒹":"𝒹","ѕ":"ѕ","⧶":"⧶","đ":"đ","⋱":"⋱","▿":"▿","▾":"▾","⇵":"⇵","⥯":"⥯","⦦":"⦦","џ":"џ","⟿":"⟿","⩷":"⩷","≑":"≑","é":"é","é":"é","⩮":"⩮","ě":"ě","≖":"≖","ê":"ê","ê":"ê","≕":"≕","э":"э","ė":"ė","ⅇ":"ⅇ","≒":"≒","𝔢":"𝔢","⪚":"⪚","è":"è","è":"è","⪖":"⪖","⪘":"⪘","⪙":"⪙","⏧":"⏧","ℓ":"ℓ","⪕":"⪕","⪗":"⪗","ē":"ē","∅":"∅","∅":"∅","∅":"∅"," ":" "," ":" "," ":" ","ŋ":"ŋ"," ":" ","ę":"ę","𝕖":"𝕖","⋕":"⋕","⧣":"⧣","⩱":"⩱","ε":"ε","ε":"ε","ϵ":"ϵ","≖":"≖","≕":"≕","≂":"≂","⪖":"⪖","⪕":"⪕","=":"=","≟":"≟","≡":"≡","⩸":"⩸","⧥":"⧥","≓":"≓","⥱":"⥱","ℯ":"ℯ","≐":"≐","≂":"≂","η":"η","ð":"ð","ð":"ð","ë":"ë","ë":"ë","€":"€","!":"!","∃":"∃","ℰ":"ℰ","ⅇ":"ⅇ","≒":"≒","ф":"ф","♀":"♀","ffi":"ffi","ff":"ff","ffl":"ffl","𝔣":"𝔣","fi":"fi","fj":"fj","♭":"♭","fl":"fl","▱":"▱","ƒ":"ƒ","𝕗":"𝕗","∀":"∀","⋔":"⋔","⫙":"⫙","⨍":"⨍","½":"½","½":"½","⅓":"⅓","¼":"¼","¼":"¼","⅕":"⅕","⅙":"⅙","⅛":"⅛","⅔":"⅔","⅖":"⅖","¾":"¾","¾":"¾","⅗":"⅗","⅜":"⅜","⅘":"⅘","⅚":"⅚","⅝":"⅝","⅞":"⅞","⁄":"⁄","⌢":"⌢","𝒻":"𝒻","≧":"≧","⪌":"⪌","ǵ":"ǵ","γ":"γ","ϝ":"ϝ","⪆":"⪆","ğ":"ğ","ĝ":"ĝ","г":"г","ġ":"ġ","≥":"≥","⋛":"⋛","≥":"≥","≧":"≧","⩾":"⩾","⩾":"⩾","⪩":"⪩","⪀":"⪀","⪂":"⪂","⪄":"⪄","⋛︀":"⋛︀","⪔":"⪔","𝔤":"𝔤","≫":"≫","⋙":"⋙","ℷ":"ℷ","ѓ":"ѓ","≷":"≷","⪒":"⪒","⪥":"⪥","⪤":"⪤","≩":"≩","⪊":"⪊","⪊":"⪊","⪈":"⪈","⪈":"⪈","≩":"≩","⋧":"⋧","𝕘":"𝕘","`":"`","ℊ":"ℊ","≳":"≳","⪎":"⪎","⪐":"⪐",">":">",">":">","⪧":"⪧","⩺":"⩺","⋗":"⋗","⦕":"⦕","⩼":"⩼","⪆":"⪆","⥸":"⥸","⋗":"⋗","⋛":"⋛","⪌":"⪌","≷":"≷","≳":"≳","≩︀":"≩︀","≩︀":"≩︀","⇔":"⇔"," ":" ","½":"½","ℋ":"ℋ","ъ":"ъ","↔":"↔","⥈":"⥈","↭":"↭","ℏ":"ℏ","ĥ":"ĥ","♥":"♥","♥":"♥","…":"…","⊹":"⊹","𝔥":"𝔥","⤥":"⤥","⤦":"⤦","⇿":"⇿","∻":"∻","↩":"↩","↪":"↪","𝕙":"𝕙","―":"―","𝒽":"𝒽","ℏ":"ℏ","ħ":"ħ","⁃":"⁃","‐":"‐","í":"í","í":"í","⁣":"⁣","î":"î","î":"î","и":"и","е":"е","¡":"¡","¡":"¡","⇔":"⇔","𝔦":"𝔦","ì":"ì","ì":"ì","ⅈ":"ⅈ","⨌":"⨌","∭":"∭","⧜":"⧜","℩":"℩","ij":"ij","ī":"ī","ℑ":"ℑ","ℐ":"ℐ","ℑ":"ℑ","ı":"ı","⊷":"⊷","Ƶ":"Ƶ","∈":"∈","℅":"℅","∞":"∞","⧝":"⧝","ı":"ı","∫":"∫","⊺":"⊺","ℤ":"ℤ","⊺":"⊺","⨗":"⨗","⨼":"⨼","ё":"ё","į":"į","𝕚":"𝕚","ι":"ι","⨼":"⨼","¿":"¿","¿":"¿","𝒾":"𝒾","∈":"∈","⋹":"⋹","⋵":"⋵","⋴":"⋴","⋳":"⋳","∈":"∈","⁢":"⁢","ĩ":"ĩ","і":"і","ï":"ï","ï":"ï","ĵ":"ĵ","й":"й","𝔧":"𝔧","ȷ":"ȷ","𝕛":"𝕛","𝒿":"𝒿","ј":"ј","є":"є","κ":"κ","ϰ":"ϰ","ķ":"ķ","к":"к","𝔨":"𝔨","ĸ":"ĸ","х":"х","ќ":"ќ","𝕜":"𝕜","𝓀":"𝓀","⇚":"⇚","⇐":"⇐","⤛":"⤛","⤎":"⤎","≦":"≦","⪋":"⪋","⥢":"⥢","ĺ":"ĺ","⦴":"⦴","ℒ":"ℒ","λ":"λ","⟨":"⟨","⦑":"⦑","⟨":"⟨","⪅":"⪅","«":"«","«":"«","←":"←","⇤":"⇤","⤟":"⤟","⤝":"⤝","↩":"↩","↫":"↫","⤹":"⤹","⥳":"⥳","↢":"↢","⪫":"⪫","⤙":"⤙","⪭":"⪭","⪭︀":"⪭︀","⤌":"⤌","❲":"❲","{":"{","[":"[","⦋":"⦋","⦏":"⦏","⦍":"⦍","ľ":"ľ","ļ":"ļ","⌈":"⌈","{":"{","л":"л","⤶":"⤶","“":"“","„":"„","⥧":"⥧","⥋":"⥋","↲":"↲","≤":"≤","←":"←","↢":"↢","↽":"↽","↼":"↼","⇇":"⇇","↔":"↔","⇆":"⇆","⇋":"⇋","↭":"↭","⋋":"⋋","⋚":"⋚","≤":"≤","≦":"≦","⩽":"⩽","⩽":"⩽","⪨":"⪨","⩿":"⩿","⪁":"⪁","⪃":"⪃","⋚︀":"⋚︀","⪓":"⪓","⪅":"⪅","⋖":"⋖","⋚":"⋚","⪋":"⪋","≶":"≶","≲":"≲","⥼":"⥼","⌊":"⌊","𝔩":"𝔩","≶":"≶","⪑":"⪑","↽":"↽","↼":"↼","⥪":"⥪","▄":"▄","љ":"љ","≪":"≪","⇇":"⇇","⌞":"⌞","⥫":"⥫","◺":"◺","ŀ":"ŀ","⎰":"⎰","⎰":"⎰","≨":"≨","⪉":"⪉","⪉":"⪉","⪇":"⪇","⪇":"⪇","≨":"≨","⋦":"⋦","⟬":"⟬","⇽":"⇽","⟦":"⟦","⟵":"⟵","⟷":"⟷","⟼":"⟼","⟶":"⟶","↫":"↫","↬":"↬","⦅":"⦅","𝕝":"𝕝","⨭":"⨭","⨴":"⨴","∗":"∗","_":"_","◊":"◊","◊":"◊","⧫":"⧫","(":"(","⦓":"⦓","⇆":"⇆","⌟":"⌟","⇋":"⇋","⥭":"⥭","‎":"‎","⊿":"⊿","‹":"‹","𝓁":"𝓁","↰":"↰","≲":"≲","⪍":"⪍","⪏":"⪏","[":"[","‘":"‘","‚":"‚","ł":"ł","<":"<","<":"<","⪦":"⪦","⩹":"⩹","⋖":"⋖","⋋":"⋋","⋉":"⋉","⥶":"⥶","⩻":"⩻","⦖":"⦖","◃":"◃","⊴":"⊴","◂":"◂","⥊":"⥊","⥦":"⥦","≨︀":"≨︀","≨︀":"≨︀","∺":"∺","¯":"¯","¯":"¯","♂":"♂","✠":"✠","✠":"✠","↦":"↦","↦":"↦","↧":"↧","↤":"↤","↥":"↥","▮":"▮","⨩":"⨩","м":"м","—":"—","∡":"∡","𝔪":"𝔪","℧":"℧","µ":"µ","µ":"µ","∣":"∣","*":"*","⫰":"⫰","·":"·","·":"·","−":"−","⊟":"⊟","∸":"∸","⨪":"⨪","⫛":"⫛","…":"…","∓":"∓","⊧":"⊧","𝕞":"𝕞","∓":"∓","𝓂":"𝓂","∾":"∾","μ":"μ","⊸":"⊸","⊸":"⊸","⋙̸":"⋙̸","≫⃒":"≫⃒","≫̸":"≫̸","⇍":"⇍","⇎":"⇎","⋘̸":"⋘̸","≪⃒":"≪⃒","≪̸":"≪̸","⇏":"⇏","⊯":"⊯","⊮":"⊮","∇":"∇","ń":"ń","∠⃒":"∠⃒","≉":"≉","⩰̸":"⩰̸","≋̸":"≋̸","ʼn":"ʼn","≉":"≉","♮":"♮","♮":"♮","ℕ":"ℕ"," ":" "," ":" ","≎̸":"≎̸","≏̸":"≏̸","⩃":"⩃","ň":"ň","ņ":"ņ","≇":"≇","⩭̸":"⩭̸","⩂":"⩂","н":"н","–":"–","≠":"≠","⇗":"⇗","⤤":"⤤","↗":"↗","↗":"↗","≐̸":"≐̸","≢":"≢","⤨":"⤨","≂̸":"≂̸","∄":"∄","∄":"∄","𝔫":"𝔫","≧̸":"≧̸","≱":"≱","≱":"≱","≧̸":"≧̸","⩾̸":"⩾̸","⩾̸":"⩾̸","≵":"≵","≯":"≯","≯":"≯","⇎":"⇎","↮":"↮","⫲":"⫲","∋":"∋","⋼":"⋼","⋺":"⋺","∋":"∋","њ":"њ","⇍":"⇍","≦̸":"≦̸","↚":"↚","‥":"‥","≰":"≰","↚":"↚","↮":"↮","≰":"≰","≦̸":"≦̸","⩽̸":"⩽̸","⩽̸":"⩽̸","≮":"≮","≴":"≴","≮":"≮","⋪":"⋪","⋬":"⋬","∤":"∤","𝕟":"𝕟","¬":"¬","¬":"¬","∉":"∉","⋹̸":"⋹̸","⋵̸":"⋵̸","∉":"∉","⋷":"⋷","⋶":"⋶","∌":"∌","∌":"∌","⋾":"⋾","⋽":"⋽","∦":"∦","∦":"∦","⫽⃥":"⫽⃥","∂̸":"∂̸","⨔":"⨔","⊀":"⊀","⋠":"⋠","⪯̸":"⪯̸","⊀":"⊀","⪯̸":"⪯̸","⇏":"⇏","↛":"↛","⤳̸":"⤳̸","↝̸":"↝̸","↛":"↛","⋫":"⋫","⋭":"⋭","⊁":"⊁","⋡":"⋡","⪰̸":"⪰̸","𝓃":"𝓃","∤":"∤","∦":"∦","≁":"≁","≄":"≄","≄":"≄","∤":"∤","∦":"∦","⋢":"⋢","⋣":"⋣","⊄":"⊄","⫅̸":"⫅̸","⊈":"⊈","⊂⃒":"⊂⃒","⊈":"⊈","⫅̸":"⫅̸","⊁":"⊁","⪰̸":"⪰̸","⊅":"⊅","⫆̸":"⫆̸","⊉":"⊉","⊃⃒":"⊃⃒","⊉":"⊉","⫆̸":"⫆̸","≹":"≹","ñ":"ñ","ñ":"ñ","≸":"≸","⋪":"⋪","⋬":"⋬","⋫":"⋫","⋭":"⋭","ν":"ν","#":"#","№":"№"," ":" ","⊭":"⊭","⤄":"⤄","≍⃒":"≍⃒","⊬":"⊬","≥⃒":"≥⃒",">⃒":">⃒","⧞":"⧞","⤂":"⤂","≤⃒":"≤⃒","<⃒":"<⃒","⊴⃒":"⊴⃒","⤃":"⤃","⊵⃒":"⊵⃒","∼⃒":"∼⃒","⇖":"⇖","⤣":"⤣","↖":"↖","↖":"↖","⤧":"⤧","Ⓢ":"Ⓢ","ó":"ó","ó":"ó","⊛":"⊛","⊚":"⊚","ô":"ô","ô":"ô","о":"о","⊝":"⊝","ő":"ő","⨸":"⨸","⊙":"⊙","⦼":"⦼","œ":"œ","⦿":"⦿","𝔬":"𝔬","˛":"˛","ò":"ò","ò":"ò","⧁":"⧁","⦵":"⦵","Ω":"Ω","∮":"∮","↺":"↺","⦾":"⦾","⦻":"⦻","‾":"‾","⧀":"⧀","ō":"ō","ω":"ω","ο":"ο","⦶":"⦶","⊖":"⊖","𝕠":"𝕠","⦷":"⦷","⦹":"⦹","⊕":"⊕","∨":"∨","↻":"↻","⩝":"⩝","ℴ":"ℴ","ℴ":"ℴ","ª":"ª","ª":"ª","º":"º","º":"º","⊶":"⊶","⩖":"⩖","⩗":"⩗","⩛":"⩛","ℴ":"ℴ","ø":"ø","ø":"ø","⊘":"⊘","õ":"õ","õ":"õ","⊗":"⊗","⨶":"⨶","ö":"ö","ö":"ö","⌽":"⌽","∥":"∥","¶":"¶","¶":"¶","∥":"∥","⫳":"⫳","⫽":"⫽","∂":"∂","п":"п","%":"%",".":".","‰":"‰","⊥":"⊥","‱":"‱","𝔭":"𝔭","φ":"φ","ϕ":"ϕ","ℳ":"ℳ","☎":"☎","π":"π","⋔":"⋔","ϖ":"ϖ","ℏ":"ℏ","ℎ":"ℎ","ℏ":"ℏ","+":"+","⨣":"⨣","⊞":"⊞","⨢":"⨢","∔":"∔","⨥":"⨥","⩲":"⩲","±":"±","±":"±","⨦":"⨦","⨧":"⨧","±":"±","⨕":"⨕","𝕡":"𝕡","£":"£","£":"£","≺":"≺","⪳":"⪳","⪷":"⪷","≼":"≼","⪯":"⪯","≺":"≺","⪷":"⪷","≼":"≼","⪯":"⪯","⪹":"⪹","⪵":"⪵","⋨":"⋨","≾":"≾","′":"′","ℙ":"ℙ","⪵":"⪵","⪹":"⪹","⋨":"⋨","∏":"∏","⌮":"⌮","⌒":"⌒","⌓":"⌓","∝":"∝","∝":"∝","≾":"≾","⊰":"⊰","𝓅":"𝓅","ψ":"ψ"," ":" ","𝔮":"𝔮","⨌":"⨌","𝕢":"𝕢","⁗":"⁗","𝓆":"𝓆","ℍ":"ℍ","⨖":"⨖","?":"?","≟":"≟",""":'"',""":'"',"⇛":"⇛","⇒":"⇒","⤜":"⤜","⤏":"⤏","⥤":"⥤","∽̱":"∽̱","ŕ":"ŕ","√":"√","⦳":"⦳","⟩":"⟩","⦒":"⦒","⦥":"⦥","⟩":"⟩","»":"»","»":"»","→":"→","⥵":"⥵","⇥":"⇥","⤠":"⤠","⤳":"⤳","⤞":"⤞","↪":"↪","↬":"↬","⥅":"⥅","⥴":"⥴","↣":"↣","↝":"↝","⤚":"⤚","∶":"∶","ℚ":"ℚ","⤍":"⤍","❳":"❳","}":"}","]":"]","⦌":"⦌","⦎":"⦎","⦐":"⦐","ř":"ř","ŗ":"ŗ","⌉":"⌉","}":"}","р":"р","⤷":"⤷","⥩":"⥩","”":"”","”":"”","↳":"↳","ℜ":"ℜ","ℛ":"ℛ","ℜ":"ℜ","ℝ":"ℝ","▭":"▭","®":"®","®":"®","⥽":"⥽","⌋":"⌋","𝔯":"𝔯","⇁":"⇁","⇀":"⇀","⥬":"⥬","ρ":"ρ","ϱ":"ϱ","→":"→","↣":"↣","⇁":"⇁","⇀":"⇀","⇄":"⇄","⇌":"⇌","⇉":"⇉","↝":"↝","⋌":"⋌","˚":"˚","≓":"≓","⇄":"⇄","⇌":"⇌","‏":"‏","⎱":"⎱","⎱":"⎱","⫮":"⫮","⟭":"⟭","⇾":"⇾","⟧":"⟧","⦆":"⦆","𝕣":"𝕣","⨮":"⨮","⨵":"⨵",")":")","⦔":"⦔","⨒":"⨒","⇉":"⇉","›":"›","𝓇":"𝓇","↱":"↱","]":"]","’":"’","’":"’","⋌":"⋌","⋊":"⋊","▹":"▹","⊵":"⊵","▸":"▸","⧎":"⧎","⥨":"⥨","℞":"℞","ś":"ś","‚":"‚","≻":"≻","⪴":"⪴","⪸":"⪸","š":"š","≽":"≽","⪰":"⪰","ş":"ş","ŝ":"ŝ","⪶":"⪶","⪺":"⪺","⋩":"⋩","⨓":"⨓","≿":"≿","с":"с","⋅":"⋅","⊡":"⊡","⩦":"⩦","⇘":"⇘","⤥":"⤥","↘":"↘","↘":"↘","§":"§","§":"§",";":";","⤩":"⤩","∖":"∖","∖":"∖","✶":"✶","𝔰":"𝔰","⌢":"⌢","♯":"♯","щ":"щ","ш":"ш","∣":"∣","∥":"∥","­":"­","­":"­","σ":"σ","ς":"ς","ς":"ς","∼":"∼","⩪":"⩪","≃":"≃","≃":"≃","⪞":"⪞","⪠":"⪠","⪝":"⪝","⪟":"⪟","≆":"≆","⨤":"⨤","⥲":"⥲","←":"←","∖":"∖","⨳":"⨳","⧤":"⧤","∣":"∣","⌣":"⌣","⪪":"⪪","⪬":"⪬","⪬︀":"⪬︀","ь":"ь","/":"/","⧄":"⧄","⌿":"⌿","𝕤":"𝕤","♠":"♠","♠":"♠","∥":"∥","⊓":"⊓","⊓︀":"⊓︀","⊔":"⊔","⊔︀":"⊔︀","⊏":"⊏","⊑":"⊑","⊏":"⊏","⊑":"⊑","⊐":"⊐","⊒":"⊒","⊐":"⊐","⊒":"⊒","□":"□","□":"□","▪":"▪","▪":"▪","→":"→","𝓈":"𝓈","∖":"∖","⌣":"⌣","⋆":"⋆","☆":"☆","★":"★","ϵ":"ϵ","ϕ":"ϕ","¯":"¯","⊂":"⊂","⫅":"⫅","⪽":"⪽","⊆":"⊆","⫃":"⫃","⫁":"⫁","⫋":"⫋","⊊":"⊊","⪿":"⪿","⥹":"⥹","⊂":"⊂","⊆":"⊆","⫅":"⫅","⊊":"⊊","⫋":"⫋","⫇":"⫇","⫕":"⫕","⫓":"⫓","≻":"≻","⪸":"⪸","≽":"≽","⪰":"⪰","⪺":"⪺","⪶":"⪶","⋩":"⋩","≿":"≿","∑":"∑","♪":"♪","¹":"¹","¹":"¹","²":"²","²":"²","³":"³","³":"³","⊃":"⊃","⫆":"⫆","⪾":"⪾","⫘":"⫘","⊇":"⊇","⫄":"⫄","⟉":"⟉","⫗":"⫗","⥻":"⥻","⫂":"⫂","⫌":"⫌","⊋":"⊋","⫀":"⫀","⊃":"⊃","⊇":"⊇","⫆":"⫆","⊋":"⊋","⫌":"⫌","⫈":"⫈","⫔":"⫔","⫖":"⫖","⇙":"⇙","⤦":"⤦","↙":"↙","↙":"↙","⤪":"⤪","ß":"ß","ß":"ß","⌖":"⌖","τ":"τ","⎴":"⎴","ť":"ť","ţ":"ţ","т":"т","⃛":"⃛","⌕":"⌕","𝔱":"𝔱","∴":"∴","∴":"∴","θ":"θ","ϑ":"ϑ","ϑ":"ϑ","≈":"≈","∼":"∼"," ":" ","≈":"≈","∼":"∼","þ":"þ","þ":"þ","˜":"˜","×":"×","×":"×","⊠":"⊠","⨱":"⨱","⨰":"⨰","∭":"∭","⤨":"⤨","⊤":"⊤","⌶":"⌶","⫱":"⫱","𝕥":"𝕥","⫚":"⫚","⤩":"⤩","‴":"‴","™":"™","▵":"▵","▿":"▿","◃":"◃","⊴":"⊴","≜":"≜","▹":"▹","⊵":"⊵","◬":"◬","≜":"≜","⨺":"⨺","⨹":"⨹","⧍":"⧍","⨻":"⨻","⏢":"⏢","𝓉":"𝓉","ц":"ц","ћ":"ћ","ŧ":"ŧ","≬":"≬","↞":"↞","↠":"↠","⇑":"⇑","⥣":"⥣","ú":"ú","ú":"ú","↑":"↑","ў":"ў","ŭ":"ŭ","û":"û","û":"û","у":"у","⇅":"⇅","ű":"ű","⥮":"⥮","⥾":"⥾","𝔲":"𝔲","ù":"ù","ù":"ù","↿":"↿","↾":"↾","▀":"▀","⌜":"⌜","⌜":"⌜","⌏":"⌏","◸":"◸","ū":"ū","¨":"¨","¨":"¨","ų":"ų","𝕦":"𝕦","↑":"↑","↕":"↕","↿":"↿","↾":"↾","⊎":"⊎","υ":"υ","ϒ":"ϒ","υ":"υ","⇈":"⇈","⌝":"⌝","⌝":"⌝","⌎":"⌎","ů":"ů","◹":"◹","𝓊":"𝓊","⋰":"⋰","ũ":"ũ","▵":"▵","▴":"▴","⇈":"⇈","ü":"ü","ü":"ü","⦧":"⦧","⇕":"⇕","⫨":"⫨","⫩":"⫩","⊨":"⊨","⦜":"⦜","ϵ":"ϵ","ϰ":"ϰ","∅":"∅","ϕ":"ϕ","ϖ":"ϖ","∝":"∝","↕":"↕","ϱ":"ϱ","ς":"ς","⊊︀":"⊊︀","⫋︀":"⫋︀","⊋︀":"⊋︀","⫌︀":"⫌︀","ϑ":"ϑ","⊲":"⊲","⊳":"⊳","в":"в","⊢":"⊢","∨":"∨","⊻":"⊻","≚":"≚","⋮":"⋮","|":"|","|":"|","𝔳":"𝔳","⊲":"⊲","⊂⃒":"⊂⃒","⊃⃒":"⊃⃒","𝕧":"𝕧","∝":"∝","⊳":"⊳","𝓋":"𝓋","⫋︀":"⫋︀","⊊︀":"⊊︀","⫌︀":"⫌︀","⊋︀":"⊋︀","⦚":"⦚","ŵ":"ŵ","⩟":"⩟","∧":"∧","≙":"≙","℘":"℘","𝔴":"𝔴","𝕨":"𝕨","℘":"℘","≀":"≀","≀":"≀","𝓌":"𝓌","⋂":"⋂","◯":"◯","⋃":"⋃","▽":"▽","𝔵":"𝔵","⟺":"⟺","⟷":"⟷","ξ":"ξ","⟸":"⟸","⟵":"⟵","⟼":"⟼","⋻":"⋻","⨀":"⨀","𝕩":"𝕩","⨁":"⨁","⨂":"⨂","⟹":"⟹","⟶":"⟶","𝓍":"𝓍","⨆":"⨆","⨄":"⨄","△":"△","⋁":"⋁","⋀":"⋀","ý":"ý","ý":"ý","я":"я","ŷ":"ŷ","ы":"ы","¥":"¥","¥":"¥","𝔶":"𝔶","ї":"ї","𝕪":"𝕪","𝓎":"𝓎","ю":"ю","ÿ":"ÿ","ÿ":"ÿ","ź":"ź","ž":"ž","з":"з","ż":"ż","ℨ":"ℨ","ζ":"ζ","𝔷":"𝔷","ж":"ж","⇝":"⇝","𝕫":"𝕫","𝓏":"𝓏","‍":"‍","‌":"‌"},characters:{"Æ":"Æ","&":"&","Á":"Á","Ă":"Ă","Â":"Â","А":"А","𝔄":"𝔄","À":"À","Α":"Α","Ā":"Ā","⩓":"⩓","Ą":"Ą","𝔸":"𝔸","⁡":"⁡","Å":"Å","𝒜":"𝒜","≔":"≔","Ã":"Ã","Ä":"Ä","∖":"∖","⫧":"⫧","⌆":"⌆","Б":"Б","∵":"∵","ℬ":"ℬ","Β":"Β","𝔅":"𝔅","𝔹":"𝔹","˘":"˘","≎":"≎","Ч":"Ч","©":"©","Ć":"Ć","⋒":"⋒","ⅅ":"ⅅ","ℭ":"ℭ","Č":"Č","Ç":"Ç","Ĉ":"Ĉ","∰":"∰","Ċ":"Ċ","¸":"¸","·":"·","Χ":"Χ","⊙":"⊙","⊖":"⊖","⊕":"⊕","⊗":"⊗","∲":"∲","”":"”","’":"’","∷":"∷","⩴":"⩴","≡":"≡","∯":"∯","∮":"∮","ℂ":"ℂ","∐":"∐","∳":"∳","⨯":"⨯","𝒞":"𝒞","⋓":"⋓","≍":"≍","⤑":"⤑","Ђ":"Ђ","Ѕ":"Ѕ","Џ":"Џ","‡":"‡","↡":"↡","⫤":"⫤","Ď":"Ď","Д":"Д","∇":"∇","Δ":"Δ","𝔇":"𝔇","´":"´","˙":"˙","˝":"˝","`":"`","˜":"˜","⋄":"⋄","ⅆ":"ⅆ","𝔻":"𝔻","¨":"¨","⃜":"⃜","≐":"≐","⇓":"⇓","⇐":"⇐","⇔":"⇔","⟸":"⟸","⟺":"⟺","⟹":"⟹","⇒":"⇒","⊨":"⊨","⇑":"⇑","⇕":"⇕","∥":"∥","↓":"↓","⤓":"⤓","⇵":"⇵","̑":"̑","⥐":"⥐","⥞":"⥞","↽":"↽","⥖":"⥖","⥟":"⥟","⇁":"⇁","⥗":"⥗","⊤":"⊤","↧":"↧","𝒟":"𝒟","Đ":"Đ","Ŋ":"Ŋ","Ð":"Ð","É":"É","Ě":"Ě","Ê":"Ê","Э":"Э","Ė":"Ė","𝔈":"𝔈","È":"È","∈":"∈","Ē":"Ē","◻":"◻","▫":"▫","Ę":"Ę","𝔼":"𝔼","Ε":"Ε","⩵":"⩵","≂":"≂","⇌":"⇌","ℰ":"ℰ","⩳":"⩳","Η":"Η","Ë":"Ë","∃":"∃","ⅇ":"ⅇ","Ф":"Ф","𝔉":"𝔉","◼":"◼","▪":"▪","𝔽":"𝔽","∀":"∀","ℱ":"ℱ","Ѓ":"Ѓ",">":">","Γ":"Γ","Ϝ":"Ϝ","Ğ":"Ğ","Ģ":"Ģ","Ĝ":"Ĝ","Г":"Г","Ġ":"Ġ","𝔊":"𝔊","⋙":"⋙","𝔾":"𝔾","≥":"≥","⋛":"⋛","≧":"≧","⪢":"⪢","≷":"≷","⩾":"⩾","≳":"≳","𝒢":"𝒢","≫":"≫","Ъ":"Ъ","ˇ":"ˇ","^":"^","Ĥ":"Ĥ","ℌ":"ℌ","ℋ":"ℋ","ℍ":"ℍ","─":"─","Ħ":"Ħ","≏":"≏","Е":"Е","IJ":"IJ","Ё":"Ё","Í":"Í","Î":"Î","И":"И","İ":"İ","ℑ":"ℑ","Ì":"Ì","Ī":"Ī","ⅈ":"ⅈ","∬":"∬","∫":"∫","⋂":"⋂","⁣":"⁣","⁢":"⁢","Į":"Į","𝕀":"𝕀","Ι":"Ι","ℐ":"ℐ","Ĩ":"Ĩ","І":"І","Ï":"Ï","Ĵ":"Ĵ","Й":"Й","𝔍":"𝔍","𝕁":"𝕁","𝒥":"𝒥","Ј":"Ј","Є":"Є","Х":"Х","Ќ":"Ќ","Κ":"Κ","Ķ":"Ķ","К":"К","𝔎":"𝔎","𝕂":"𝕂","𝒦":"𝒦","Љ":"Љ","<":"<","Ĺ":"Ĺ","Λ":"Λ","⟪":"⟪","ℒ":"ℒ","↞":"↞","Ľ":"Ľ","Ļ":"Ļ","Л":"Л","⟨":"⟨","←":"←","⇤":"⇤","⇆":"⇆","⌈":"⌈","⟦":"⟦","⥡":"⥡","⇃":"⇃","⥙":"⥙","⌊":"⌊","↔":"↔","⥎":"⥎","⊣":"⊣","↤":"↤","⥚":"⥚","⊲":"⊲","⧏":"⧏","⊴":"⊴","⥑":"⥑","⥠":"⥠","↿":"↿","⥘":"⥘","↼":"↼","⥒":"⥒","⋚":"⋚","≦":"≦","≶":"≶","⪡":"⪡","⩽":"⩽","≲":"≲","𝔏":"𝔏","⋘":"⋘","⇚":"⇚","Ŀ":"Ŀ","⟵":"⟵","⟷":"⟷","⟶":"⟶","𝕃":"𝕃","↙":"↙","↘":"↘","↰":"↰","Ł":"Ł","≪":"≪","⤅":"⤅","М":"М"," ":" ","ℳ":"ℳ","𝔐":"𝔐","∓":"∓","𝕄":"𝕄","Μ":"Μ","Њ":"Њ","Ń":"Ń","Ň":"Ň","Ņ":"Ņ","Н":"Н","​":"​","\n":" ","𝔑":"𝔑","⁠":"⁠"," ":" ","ℕ":"ℕ","⫬":"⫬","≢":"≢","≭":"≭","∦":"∦","∉":"∉","≠":"≠","≂̸":"≂̸","∄":"∄","≯":"≯","≱":"≱","≧̸":"≧̸","≫̸":"≫̸","≹":"≹","⩾̸":"⩾̸","≵":"≵","≎̸":"≎̸","≏̸":"≏̸","⋪":"⋪","⧏̸":"⧏̸","⋬":"⋬","≮":"≮","≰":"≰","≸":"≸","≪̸":"≪̸","⩽̸":"⩽̸","≴":"≴","⪢̸":"⪢̸","⪡̸":"⪡̸","⊀":"⊀","⪯̸":"⪯̸","⋠":"⋠","∌":"∌","⋫":"⋫","⧐̸":"⧐̸","⋭":"⋭","⊏̸":"⊏̸","⋢":"⋢","⊐̸":"⊐̸","⋣":"⋣","⊂⃒":"⊂⃒","⊈":"⊈","⊁":"⊁","⪰̸":"⪰̸","⋡":"⋡","≿̸":"≿̸","⊃⃒":"⊃⃒","⊉":"⊉","≁":"≁","≄":"≄","≇":"≇","≉":"≉","∤":"∤","𝒩":"𝒩","Ñ":"Ñ","Ν":"Ν","Œ":"Œ","Ó":"Ó","Ô":"Ô","О":"О","Ő":"Ő","𝔒":"𝔒","Ò":"Ò","Ō":"Ō","Ω":"Ω","Ο":"Ο","𝕆":"𝕆","“":"“","‘":"‘","⩔":"⩔","𝒪":"𝒪","Ø":"Ø","Õ":"Õ","⨷":"⨷","Ö":"Ö","‾":"‾","⏞":"⏞","⎴":"⎴","⏜":"⏜","∂":"∂","П":"П","𝔓":"𝔓","Φ":"Φ","Π":"Π","±":"±","ℙ":"ℙ","⪻":"⪻","≺":"≺","⪯":"⪯","≼":"≼","≾":"≾","″":"″","∏":"∏","∝":"∝","𝒫":"𝒫","Ψ":"Ψ",'"':""","𝔔":"𝔔","ℚ":"ℚ","𝒬":"𝒬","⤐":"⤐","®":"®","Ŕ":"Ŕ","⟫":"⟫","↠":"↠","⤖":"⤖","Ř":"Ř","Ŗ":"Ŗ","Р":"Р","ℜ":"ℜ","∋":"∋","⇋":"⇋","⥯":"⥯","Ρ":"Ρ","⟩":"⟩","→":"→","⇥":"⇥","⇄":"⇄","⌉":"⌉","⟧":"⟧","⥝":"⥝","⇂":"⇂","⥕":"⥕","⌋":"⌋","⊢":"⊢","↦":"↦","⥛":"⥛","⊳":"⊳","⧐":"⧐","⊵":"⊵","⥏":"⥏","⥜":"⥜","↾":"↾","⥔":"⥔","⇀":"⇀","⥓":"⥓","ℝ":"ℝ","⥰":"⥰","⇛":"⇛","ℛ":"ℛ","↱":"↱","⧴":"⧴","Щ":"Щ","Ш":"Ш","Ь":"Ь","Ś":"Ś","⪼":"⪼","Š":"Š","Ş":"Ş","Ŝ":"Ŝ","С":"С","𝔖":"𝔖","↑":"↑","Σ":"Σ","∘":"∘","𝕊":"𝕊","√":"√","□":"□","⊓":"⊓","⊏":"⊏","⊑":"⊑","⊐":"⊐","⊒":"⊒","⊔":"⊔","𝒮":"𝒮","⋆":"⋆","⋐":"⋐","⊆":"⊆","≻":"≻","⪰":"⪰","≽":"≽","≿":"≿","∑":"∑","⋑":"⋑","⊃":"⊃","⊇":"⊇","Þ":"Þ","™":"™","Ћ":"Ћ","Ц":"Ц","\t":" ","Τ":"Τ","Ť":"Ť","Ţ":"Ţ","Т":"Т","𝔗":"𝔗","∴":"∴","Θ":"Θ","  ":"  "," ":" ","∼":"∼","≃":"≃","≅":"≅","≈":"≈","𝕋":"𝕋","⃛":"⃛","𝒯":"𝒯","Ŧ":"Ŧ","Ú":"Ú","↟":"↟","⥉":"⥉","Ў":"Ў","Ŭ":"Ŭ","Û":"Û","У":"У","Ű":"Ű","𝔘":"𝔘","Ù":"Ù","Ū":"Ū",_:"_","⏟":"⏟","⎵":"⎵","⏝":"⏝","⋃":"⋃","⊎":"⊎","Ų":"Ų","𝕌":"𝕌","⤒":"⤒","⇅":"⇅","↕":"↕","⥮":"⥮","⊥":"⊥","↥":"↥","↖":"↖","↗":"↗","ϒ":"ϒ","Υ":"Υ","Ů":"Ů","𝒰":"𝒰","Ũ":"Ũ","Ü":"Ü","⊫":"⊫","⫫":"⫫","В":"В","⊩":"⊩","⫦":"⫦","⋁":"⋁","‖":"‖","∣":"∣","|":"|","❘":"❘","≀":"≀"," ":" ","𝔙":"𝔙","𝕍":"𝕍","𝒱":"𝒱","⊪":"⊪","Ŵ":"Ŵ","⋀":"⋀","𝔚":"𝔚","𝕎":"𝕎","𝒲":"𝒲","𝔛":"𝔛","Ξ":"Ξ","𝕏":"𝕏","𝒳":"𝒳","Я":"Я","Ї":"Ї","Ю":"Ю","Ý":"Ý","Ŷ":"Ŷ","Ы":"Ы","𝔜":"𝔜","𝕐":"𝕐","𝒴":"𝒴","Ÿ":"Ÿ","Ж":"Ж","Ź":"Ź","Ž":"Ž","З":"З","Ż":"Ż","Ζ":"Ζ","ℨ":"ℨ","ℤ":"ℤ","𝒵":"𝒵","á":"á","ă":"ă","∾":"∾","∾̳":"∾̳","∿":"∿","â":"â","а":"а","æ":"æ","𝔞":"𝔞","à":"à","ℵ":"ℵ","α":"α","ā":"ā","⨿":"⨿","∧":"∧","⩕":"⩕","⩜":"⩜","⩘":"⩘","⩚":"⩚","∠":"∠","⦤":"⦤","∡":"∡","⦨":"⦨","⦩":"⦩","⦪":"⦪","⦫":"⦫","⦬":"⦬","⦭":"⦭","⦮":"⦮","⦯":"⦯","∟":"∟","⊾":"⊾","⦝":"⦝","∢":"∢","⍼":"⍼","ą":"ą","𝕒":"𝕒","⩰":"⩰","⩯":"⩯","≊":"≊","≋":"≋","'":"'","å":"å","𝒶":"𝒶","*":"*","ã":"ã","ä":"ä","⨑":"⨑","⫭":"⫭","≌":"≌","϶":"϶","‵":"‵","∽":"∽","⋍":"⋍","⊽":"⊽","⌅":"⌅","⎶":"⎶","б":"б","„":"„","⦰":"⦰","β":"β","ℶ":"ℶ","≬":"≬","𝔟":"𝔟","◯":"◯","⨀":"⨀","⨁":"⨁","⨂":"⨂","⨆":"⨆","★":"★","▽":"▽","△":"△","⨄":"⨄","⤍":"⤍","⧫":"⧫","▴":"▴","▾":"▾","◂":"◂","▸":"▸","␣":"␣","▒":"▒","░":"░","▓":"▓","█":"█","=⃥":"=⃥","≡⃥":"≡⃥","⌐":"⌐","𝕓":"𝕓","⋈":"⋈","╗":"╗","╔":"╔","╖":"╖","╓":"╓","═":"═","╦":"╦","╩":"╩","╤":"╤","╧":"╧","╝":"╝","╚":"╚","╜":"╜","╙":"╙","║":"║","╬":"╬","╣":"╣","╠":"╠","╫":"╫","╢":"╢","╟":"╟","⧉":"⧉","╕":"╕","╒":"╒","┐":"┐","┌":"┌","╥":"╥","╨":"╨","┬":"┬","┴":"┴","⊟":"⊟","⊞":"⊞","⊠":"⊠","╛":"╛","╘":"╘","┘":"┘","└":"└","│":"│","╪":"╪","╡":"╡","╞":"╞","┼":"┼","┤":"┤","├":"├","¦":"¦","𝒷":"𝒷","⁏":"⁏","\\":"\","⧅":"⧅","⟈":"⟈","•":"•","⪮":"⪮","ć":"ć","∩":"∩","⩄":"⩄","⩉":"⩉","⩋":"⩋","⩇":"⩇","⩀":"⩀","∩︀":"∩︀","⁁":"⁁","⩍":"⩍","č":"č","ç":"ç","ĉ":"ĉ","⩌":"⩌","⩐":"⩐","ċ":"ċ","⦲":"⦲","¢":"¢","𝔠":"𝔠","ч":"ч","✓":"✓","χ":"χ","○":"○","⧃":"⧃","ˆ":"ˆ","≗":"≗","↺":"↺","↻":"↻","Ⓢ":"Ⓢ","⊛":"⊛","⊚":"⊚","⊝":"⊝","⨐":"⨐","⫯":"⫯","⧂":"⧂","♣":"♣",":":":",",":",","@":"@","∁":"∁","⩭":"⩭","𝕔":"𝕔","℗":"℗","↵":"↵","✗":"✗","𝒸":"𝒸","⫏":"⫏","⫑":"⫑","⫐":"⫐","⫒":"⫒","⋯":"⋯","⤸":"⤸","⤵":"⤵","⋞":"⋞","⋟":"⋟","↶":"↶","⤽":"⤽","∪":"∪","⩈":"⩈","⩆":"⩆","⩊":"⩊","⊍":"⊍","⩅":"⩅","∪︀":"∪︀","↷":"↷","⤼":"⤼","⋎":"⋎","⋏":"⋏","¤":"¤","∱":"∱","⌭":"⌭","⥥":"⥥","†":"†","ℸ":"ℸ","‐":"‐","⤏":"⤏","ď":"ď","д":"д","⇊":"⇊","⩷":"⩷","°":"°","δ":"δ","⦱":"⦱","⥿":"⥿","𝔡":"𝔡","♦":"♦","ϝ":"ϝ","⋲":"⋲","÷":"÷","⋇":"⋇","ђ":"ђ","⌞":"⌞","⌍":"⌍",$:"$","𝕕":"𝕕","≑":"≑","∸":"∸","∔":"∔","⊡":"⊡","⌟":"⌟","⌌":"⌌","𝒹":"𝒹","ѕ":"ѕ","⧶":"⧶","đ":"đ","⋱":"⋱","▿":"▿","⦦":"⦦","џ":"џ","⟿":"⟿","é":"é","⩮":"⩮","ě":"ě","≖":"≖","ê":"ê","≕":"≕","э":"э","ė":"ė","≒":"≒","𝔢":"𝔢","⪚":"⪚","è":"è","⪖":"⪖","⪘":"⪘","⪙":"⪙","⏧":"⏧","ℓ":"ℓ","⪕":"⪕","⪗":"⪗","ē":"ē","∅":"∅"," ":" "," ":" "," ":" ","ŋ":"ŋ"," ":" ","ę":"ę","𝕖":"𝕖","⋕":"⋕","⧣":"⧣","⩱":"⩱","ε":"ε","ϵ":"ϵ","=":"=","≟":"≟","⩸":"⩸","⧥":"⧥","≓":"≓","⥱":"⥱","ℯ":"ℯ","η":"η","ð":"ð","ë":"ë","€":"€","!":"!","ф":"ф","♀":"♀","ffi":"ffi","ff":"ff","ffl":"ffl","𝔣":"𝔣","fi":"fi",fj:"fj","♭":"♭","fl":"fl","▱":"▱","ƒ":"ƒ","𝕗":"𝕗","⋔":"⋔","⫙":"⫙","⨍":"⨍","½":"½","⅓":"⅓","¼":"¼","⅕":"⅕","⅙":"⅙","⅛":"⅛","⅔":"⅔","⅖":"⅖","¾":"¾","⅗":"⅗","⅜":"⅜","⅘":"⅘","⅚":"⅚","⅝":"⅝","⅞":"⅞","⁄":"⁄","⌢":"⌢","𝒻":"𝒻","⪌":"⪌","ǵ":"ǵ","γ":"γ","⪆":"⪆","ğ":"ğ","ĝ":"ĝ","г":"г","ġ":"ġ","⪩":"⪩","⪀":"⪀","⪂":"⪂","⪄":"⪄","⋛︀":"⋛︀","⪔":"⪔","𝔤":"𝔤","ℷ":"ℷ","ѓ":"ѓ","⪒":"⪒","⪥":"⪥","⪤":"⪤","≩":"≩","⪊":"⪊","⪈":"⪈","⋧":"⋧","𝕘":"𝕘","ℊ":"ℊ","⪎":"⪎","⪐":"⪐","⪧":"⪧","⩺":"⩺","⋗":"⋗","⦕":"⦕","⩼":"⩼","⥸":"⥸","≩︀":"≩︀","ъ":"ъ","⥈":"⥈","↭":"↭","ℏ":"ℏ","ĥ":"ĥ","♥":"♥","…":"…","⊹":"⊹","𝔥":"𝔥","⤥":"⤥","⤦":"⤦","⇿":"⇿","∻":"∻","↩":"↩","↪":"↪","𝕙":"𝕙","―":"―","𝒽":"𝒽","ħ":"ħ","⁃":"⁃","í":"í","î":"î","и":"и","е":"е","¡":"¡","𝔦":"𝔦","ì":"ì","⨌":"⨌","∭":"∭","⧜":"⧜","℩":"℩","ij":"ij","ī":"ī","ı":"ı","⊷":"⊷","Ƶ":"Ƶ","℅":"℅","∞":"∞","⧝":"⧝","⊺":"⊺","⨗":"⨗","⨼":"⨼","ё":"ё","į":"į","𝕚":"𝕚","ι":"ι","¿":"¿","𝒾":"𝒾","⋹":"⋹","⋵":"⋵","⋴":"⋴","⋳":"⋳","ĩ":"ĩ","і":"і","ï":"ï","ĵ":"ĵ","й":"й","𝔧":"𝔧","ȷ":"ȷ","𝕛":"𝕛","𝒿":"𝒿","ј":"ј","є":"є","κ":"κ","ϰ":"ϰ","ķ":"ķ","к":"к","𝔨":"𝔨","ĸ":"ĸ","х":"х","ќ":"ќ","𝕜":"𝕜","𝓀":"𝓀","⤛":"⤛","⤎":"⤎","⪋":"⪋","⥢":"⥢","ĺ":"ĺ","⦴":"⦴","λ":"λ","⦑":"⦑","⪅":"⪅","«":"«","⤟":"⤟","⤝":"⤝","↫":"↫","⤹":"⤹","⥳":"⥳","↢":"↢","⪫":"⪫","⤙":"⤙","⪭":"⪭","⪭︀":"⪭︀","⤌":"⤌","❲":"❲","{":"{","[":"[","⦋":"⦋","⦏":"⦏","⦍":"⦍","ľ":"ľ","ļ":"ļ","л":"л","⤶":"⤶","⥧":"⥧","⥋":"⥋","↲":"↲","≤":"≤","⇇":"⇇","⋋":"⋋","⪨":"⪨","⩿":"⩿","⪁":"⪁","⪃":"⪃","⋚︀":"⋚︀","⪓":"⪓","⋖":"⋖","⥼":"⥼","𝔩":"𝔩","⪑":"⪑","⥪":"⥪","▄":"▄","љ":"љ","⥫":"⥫","◺":"◺","ŀ":"ŀ","⎰":"⎰","≨":"≨","⪉":"⪉","⪇":"⪇","⋦":"⋦","⟬":"⟬","⇽":"⇽","⟼":"⟼","↬":"↬","⦅":"⦅","𝕝":"𝕝","⨭":"⨭","⨴":"⨴","∗":"∗","◊":"◊","(":"(","⦓":"⦓","⥭":"⥭","‎":"‎","⊿":"⊿","‹":"‹","𝓁":"𝓁","⪍":"⪍","⪏":"⪏","‚":"‚","ł":"ł","⪦":"⪦","⩹":"⩹","⋉":"⋉","⥶":"⥶","⩻":"⩻","⦖":"⦖","◃":"◃","⥊":"⥊","⥦":"⥦","≨︀":"≨︀","∺":"∺","¯":"¯","♂":"♂","✠":"✠","▮":"▮","⨩":"⨩","м":"м","—":"—","𝔪":"𝔪","℧":"℧","µ":"µ","⫰":"⫰","−":"−","⨪":"⨪","⫛":"⫛","⊧":"⊧","𝕞":"𝕞","𝓂":"𝓂","μ":"μ","⊸":"⊸","⋙̸":"⋙̸","≫⃒":"≫⃒","⇍":"⇍","⇎":"⇎","⋘̸":"⋘̸","≪⃒":"≪⃒","⇏":"⇏","⊯":"⊯","⊮":"⊮","ń":"ń","∠⃒":"∠⃒","⩰̸":"⩰̸","≋̸":"≋̸","ʼn":"ʼn","♮":"♮","⩃":"⩃","ň":"ň","ņ":"ņ","⩭̸":"⩭̸","⩂":"⩂","н":"н","–":"–","⇗":"⇗","⤤":"⤤","≐̸":"≐̸","⤨":"⤨","𝔫":"𝔫","↮":"↮","⫲":"⫲","⋼":"⋼","⋺":"⋺","њ":"њ","≦̸":"≦̸","↚":"↚","‥":"‥","𝕟":"𝕟","¬":"¬","⋹̸":"⋹̸","⋵̸":"⋵̸","⋷":"⋷","⋶":"⋶","⋾":"⋾","⋽":"⋽","⫽⃥":"⫽⃥","∂̸":"∂̸","⨔":"⨔","↛":"↛","⤳̸":"⤳̸","↝̸":"↝̸","𝓃":"𝓃","⊄":"⊄","⫅̸":"⫅̸","⊅":"⊅","⫆̸":"⫆̸","ñ":"ñ","ν":"ν","#":"#","№":"№"," ":" ","⊭":"⊭","⤄":"⤄","≍⃒":"≍⃒","⊬":"⊬","≥⃒":"≥⃒",">⃒":">⃒","⧞":"⧞","⤂":"⤂","≤⃒":"≤⃒","<⃒":"<⃒","⊴⃒":"⊴⃒","⤃":"⤃","⊵⃒":"⊵⃒","∼⃒":"∼⃒","⇖":"⇖","⤣":"⤣","⤧":"⤧","ó":"ó","ô":"ô","о":"о","ő":"ő","⨸":"⨸","⦼":"⦼","œ":"œ","⦿":"⦿","𝔬":"𝔬","˛":"˛","ò":"ò","⧁":"⧁","⦵":"⦵","⦾":"⦾","⦻":"⦻","⧀":"⧀","ō":"ō","ω":"ω","ο":"ο","⦶":"⦶","𝕠":"𝕠","⦷":"⦷","⦹":"⦹","∨":"∨","⩝":"⩝","ℴ":"ℴ","ª":"ª","º":"º","⊶":"⊶","⩖":"⩖","⩗":"⩗","⩛":"⩛","ø":"ø","⊘":"⊘","õ":"õ","⨶":"⨶","ö":"ö","⌽":"⌽","¶":"¶","⫳":"⫳","⫽":"⫽","п":"п","%":"%",".":".","‰":"‰","‱":"‱","𝔭":"𝔭","φ":"φ","ϕ":"ϕ","☎":"☎","π":"π","ϖ":"ϖ","ℎ":"ℎ","+":"+","⨣":"⨣","⨢":"⨢","⨥":"⨥","⩲":"⩲","⨦":"⨦","⨧":"⨧","⨕":"⨕","𝕡":"𝕡","£":"£","⪳":"⪳","⪷":"⪷","⪹":"⪹","⪵":"⪵","⋨":"⋨","′":"′","⌮":"⌮","⌒":"⌒","⌓":"⌓","⊰":"⊰","𝓅":"𝓅","ψ":"ψ"," ":" ","𝔮":"𝔮","𝕢":"𝕢","⁗":"⁗","𝓆":"𝓆","⨖":"⨖","?":"?","⤜":"⤜","⥤":"⥤","∽̱":"∽̱","ŕ":"ŕ","⦳":"⦳","⦒":"⦒","⦥":"⦥","»":"»","⥵":"⥵","⤠":"⤠","⤳":"⤳","⤞":"⤞","⥅":"⥅","⥴":"⥴","↣":"↣","↝":"↝","⤚":"⤚","∶":"∶","❳":"❳","}":"}","]":"]","⦌":"⦌","⦎":"⦎","⦐":"⦐","ř":"ř","ŗ":"ŗ","р":"р","⤷":"⤷","⥩":"⥩","↳":"↳","▭":"▭","⥽":"⥽","𝔯":"𝔯","⥬":"⥬","ρ":"ρ","ϱ":"ϱ","⇉":"⇉","⋌":"⋌","˚":"˚","‏":"‏","⎱":"⎱","⫮":"⫮","⟭":"⟭","⇾":"⇾","⦆":"⦆","𝕣":"𝕣","⨮":"⨮","⨵":"⨵",")":")","⦔":"⦔","⨒":"⨒","›":"›","𝓇":"𝓇","⋊":"⋊","▹":"▹","⧎":"⧎","⥨":"⥨","℞":"℞","ś":"ś","⪴":"⪴","⪸":"⪸","š":"š","ş":"ş","ŝ":"ŝ","⪶":"⪶","⪺":"⪺","⋩":"⋩","⨓":"⨓","с":"с","⋅":"⋅","⩦":"⩦","⇘":"⇘","§":"§",";":";","⤩":"⤩","✶":"✶","𝔰":"𝔰","♯":"♯","щ":"щ","ш":"ш","­":"­","σ":"σ","ς":"ς","⩪":"⩪","⪞":"⪞","⪠":"⪠","⪝":"⪝","⪟":"⪟","≆":"≆","⨤":"⨤","⥲":"⥲","⨳":"⨳","⧤":"⧤","⌣":"⌣","⪪":"⪪","⪬":"⪬","⪬︀":"⪬︀","ь":"ь","/":"/","⧄":"⧄","⌿":"⌿","𝕤":"𝕤","♠":"♠","⊓︀":"⊓︀","⊔︀":"⊔︀","𝓈":"𝓈","☆":"☆","⊂":"⊂","⫅":"⫅","⪽":"⪽","⫃":"⫃","⫁":"⫁","⫋":"⫋","⊊":"⊊","⪿":"⪿","⥹":"⥹","⫇":"⫇","⫕":"⫕","⫓":"⫓","♪":"♪","¹":"¹","²":"²","³":"³","⫆":"⫆","⪾":"⪾","⫘":"⫘","⫄":"⫄","⟉":"⟉","⫗":"⫗","⥻":"⥻","⫂":"⫂","⫌":"⫌","⊋":"⊋","⫀":"⫀","⫈":"⫈","⫔":"⫔","⫖":"⫖","⇙":"⇙","⤪":"⤪","ß":"ß","⌖":"⌖","τ":"τ","ť":"ť","ţ":"ţ","т":"т","⌕":"⌕","𝔱":"𝔱","θ":"θ","ϑ":"ϑ","þ":"þ","×":"×","⨱":"⨱","⨰":"⨰","⌶":"⌶","⫱":"⫱","𝕥":"𝕥","⫚":"⫚","‴":"‴","▵":"▵","≜":"≜","◬":"◬","⨺":"⨺","⨹":"⨹","⧍":"⧍","⨻":"⨻","⏢":"⏢","𝓉":"𝓉","ц":"ц","ћ":"ћ","ŧ":"ŧ","⥣":"⥣","ú":"ú","ў":"ў","ŭ":"ŭ","û":"û","у":"у","ű":"ű","⥾":"⥾","𝔲":"𝔲","ù":"ù","▀":"▀","⌜":"⌜","⌏":"⌏","◸":"◸","ū":"ū","ų":"ų","𝕦":"𝕦","υ":"υ","⇈":"⇈","⌝":"⌝","⌎":"⌎","ů":"ů","◹":"◹","𝓊":"𝓊","⋰":"⋰","ũ":"ũ","ü":"ü","⦧":"⦧","⫨":"⫨","⫩":"⫩","⦜":"⦜","⊊︀":"⊊︀","⫋︀":"⫋︀","⊋︀":"⊋︀","⫌︀":"⫌︀","в":"в","⊻":"⊻","≚":"≚","⋮":"⋮","𝔳":"𝔳","𝕧":"𝕧","𝓋":"𝓋","⦚":"⦚","ŵ":"ŵ","⩟":"⩟","≙":"≙","℘":"℘","𝔴":"𝔴","𝕨":"𝕨","𝓌":"𝓌","𝔵":"𝔵","ξ":"ξ","⋻":"⋻","𝕩":"𝕩","𝓍":"𝓍","ý":"ý","я":"я","ŷ":"ŷ","ы":"ы","¥":"¥","𝔶":"𝔶","ї":"ї","𝕪":"𝕪","𝓎":"𝓎","ю":"ю","ÿ":"ÿ","ź":"ź","ž":"ž","з":"з","ż":"ż","ζ":"ζ","𝔷":"𝔷","ж":"ж","⇝":"⇝","𝕫":"𝕫","𝓏":"𝓏","‍":"‍","‌":"‌"}}}; + +/***/ }), + +/***/ "./node_modules/html-entities/lib/numeric-unicode-map.js": +/*!***************************************************************!*\ + !*** ./node_modules/html-entities/lib/numeric-unicode-map.js ***! + \***************************************************************/ +/***/ (function(__unused_webpack_module, exports) { + +"use strict"; +Object.defineProperty(exports, "__esModule", ({value:true}));exports.numericUnicodeMap={0:65533,128:8364,130:8218,131:402,132:8222,133:8230,134:8224,135:8225,136:710,137:8240,138:352,139:8249,140:338,142:381,145:8216,146:8217,147:8220,148:8221,149:8226,150:8211,151:8212,152:732,153:8482,154:353,155:8250,156:339,158:382,159:376}; + +/***/ }), + +/***/ "./node_modules/html-entities/lib/surrogate-pairs.js": +/*!***********************************************************!*\ + !*** ./node_modules/html-entities/lib/surrogate-pairs.js ***! + \***********************************************************/ +/***/ (function(__unused_webpack_module, exports) { + +"use strict"; +Object.defineProperty(exports, "__esModule", ({value:true}));exports.fromCodePoint=String.fromCodePoint||function(astralCodePoint){return String.fromCharCode(Math.floor((astralCodePoint-65536)/1024)+55296,(astralCodePoint-65536)%1024+56320)};exports.getCodePoint=String.prototype.codePointAt?function(input,position){return input.codePointAt(position)}:function(input,position){return(input.charCodeAt(position)-55296)*1024+input.charCodeAt(position+1)-56320+65536};exports.highSurrogateFrom=55296;exports.highSurrogateTo=56319; + +/***/ }), + +/***/ "./node_modules/webpack-dev-server/client/clients/WebSocketClient.js": +/*!***************************************************************************!*\ + !*** ./node_modules/webpack-dev-server/client/clients/WebSocketClient.js ***! + \***************************************************************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": function() { return /* binding */ WebSocketClient; } +/* harmony export */ }); +/* harmony import */ var _utils_log_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils/log.js */ "./node_modules/webpack-dev-server/client/utils/log.js"); +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + + + +var WebSocketClient = /*#__PURE__*/function () { + /** + * @param {string} url + */ + function WebSocketClient(url) { + _classCallCheck(this, WebSocketClient); + + this.client = new WebSocket(url); + + this.client.onerror = function (error) { + _utils_log_js__WEBPACK_IMPORTED_MODULE_0__.log.error(error); + }; + } + /** + * @param {(...args: any[]) => void} f + */ + + + _createClass(WebSocketClient, [{ + key: "onOpen", + value: function onOpen(f) { + this.client.onopen = f; + } + /** + * @param {(...args: any[]) => void} f + */ + + }, { + key: "onClose", + value: function onClose(f) { + this.client.onclose = f; + } // call f with the message string as the first argument + + /** + * @param {(...args: any[]) => void} f + */ + + }, { + key: "onMessage", + value: function onMessage(f) { + this.client.onmessage = function (e) { + f(e.data); + }; + } + }]); + + return WebSocketClient; +}(); + + + +/***/ }), + +/***/ "./node_modules/webpack-dev-server/client/index.js?protocol=ws%3A&hostname=localhost&port=8081&pathname=%2Fws&logging=none&reconnect=10": +/*!**********************************************************************************************************************************************!*\ + !*** ./node_modules/webpack-dev-server/client/index.js?protocol=ws%3A&hostname=localhost&port=8081&pathname=%2Fws&logging=none&reconnect=10 ***! + \**********************************************************************************************************************************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +"use strict"; +var __resourceQuery = "?protocol=ws%3A&hostname=localhost&port=8081&pathname=%2Fws&logging=none&reconnect=10"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var webpack_hot_log_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! webpack/hot/log.js */ "./node_modules/webpack/hot/log.js"); +/* harmony import */ var webpack_hot_log_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(webpack_hot_log_js__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var _utils_stripAnsi_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils/stripAnsi.js */ "./node_modules/webpack-dev-server/client/utils/stripAnsi.js"); +/* harmony import */ var _utils_parseURL_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utils/parseURL.js */ "./node_modules/webpack-dev-server/client/utils/parseURL.js"); +/* harmony import */ var _socket_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./socket.js */ "./node_modules/webpack-dev-server/client/socket.js"); +/* harmony import */ var _overlay_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./overlay.js */ "./node_modules/webpack-dev-server/client/overlay.js"); +/* harmony import */ var _utils_log_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./utils/log.js */ "./node_modules/webpack-dev-server/client/utils/log.js"); +/* harmony import */ var _utils_sendMessage_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./utils/sendMessage.js */ "./node_modules/webpack-dev-server/client/utils/sendMessage.js"); +/* harmony import */ var _utils_reloadApp_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./utils/reloadApp.js */ "./node_modules/webpack-dev-server/client/utils/reloadApp.js"); +/* harmony import */ var _utils_createSocketURL_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./utils/createSocketURL.js */ "./node_modules/webpack-dev-server/client/utils/createSocketURL.js"); +/* global __resourceQuery, __webpack_hash__ */ +/// + + + + + + + + + +/** + * @typedef {Object} Options + * @property {boolean} hot + * @property {boolean} liveReload + * @property {boolean} progress + * @property {boolean | { warnings?: boolean, errors?: boolean, trustedTypesPolicyName?: string }} overlay + * @property {string} [logging] + * @property {number} [reconnect] + */ + +/** + * @typedef {Object} Status + * @property {boolean} isUnloading + * @property {string} currentHash + * @property {string} [previousHash] + */ + +/** + * @type {Status} + */ + +var status = { + isUnloading: false, + // TODO Workaround for webpack v4, `__webpack_hash__` is not replaced without HotModuleReplacement + // eslint-disable-next-line camelcase + currentHash: true ? __webpack_require__.h() : 0 +}; +/** @type {Options} */ + +var options = { + hot: false, + liveReload: false, + progress: false, + overlay: false +}; +var parsedResourceQuery = (0,_utils_parseURL_js__WEBPACK_IMPORTED_MODULE_2__["default"])(__resourceQuery); + +if (parsedResourceQuery.hot === "true") { + options.hot = true; + _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.info("Hot Module Replacement enabled."); +} + +if (parsedResourceQuery["live-reload"] === "true") { + options.liveReload = true; + _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.info("Live Reloading enabled."); +} + +if (parsedResourceQuery.logging) { + options.logging = parsedResourceQuery.logging; +} + +if (typeof parsedResourceQuery.reconnect !== "undefined") { + options.reconnect = Number(parsedResourceQuery.reconnect); +} +/** + * @param {string} level + */ + + +function setAllLogLevel(level) { + // This is needed because the HMR logger operate separately from dev server logger + webpack_hot_log_js__WEBPACK_IMPORTED_MODULE_0___default().setLogLevel(level === "verbose" || level === "log" ? "info" : level); + (0,_utils_log_js__WEBPACK_IMPORTED_MODULE_5__.setLogLevel)(level); +} + +if (options.logging) { + setAllLogLevel(options.logging); +} + +self.addEventListener("beforeunload", function () { + status.isUnloading = true; +}); +var onSocketMessage = { + hot: function hot() { + if (parsedResourceQuery.hot === "false") { + return; + } + + options.hot = true; + _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.info("Hot Module Replacement enabled."); + }, + liveReload: function liveReload() { + if (parsedResourceQuery["live-reload"] === "false") { + return; + } + + options.liveReload = true; + _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.info("Live Reloading enabled."); + }, + invalid: function invalid() { + _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.info("App updated. Recompiling..."); // Fixes #1042. overlay doesn't clear if errors are fixed but warnings remain. + + if (options.overlay) { + (0,_overlay_js__WEBPACK_IMPORTED_MODULE_4__.hide)(); + } + + (0,_utils_sendMessage_js__WEBPACK_IMPORTED_MODULE_6__["default"])("Invalid"); + }, + + /** + * @param {string} hash + */ + hash: function hash(_hash) { + status.previousHash = status.currentHash; + status.currentHash = _hash; + }, + logging: setAllLogLevel, + + /** + * @param {boolean} value + */ + overlay: function overlay(value) { + if (typeof document === "undefined") { + return; + } + + options.overlay = value; + }, + + /** + * @param {number} value + */ + reconnect: function reconnect(value) { + if (parsedResourceQuery.reconnect === "false") { + return; + } + + options.reconnect = value; + }, + + /** + * @param {boolean} value + */ + progress: function progress(value) { + options.progress = value; + }, + + /** + * @param {{ pluginName?: string, percent: number, msg: string }} data + */ + "progress-update": function progressUpdate(data) { + if (options.progress) { + _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.info("".concat(data.pluginName ? "[".concat(data.pluginName, "] ") : "").concat(data.percent, "% - ").concat(data.msg, ".")); + } + + (0,_utils_sendMessage_js__WEBPACK_IMPORTED_MODULE_6__["default"])("Progress", data); + }, + "still-ok": function stillOk() { + _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.info("Nothing changed."); + + if (options.overlay) { + (0,_overlay_js__WEBPACK_IMPORTED_MODULE_4__.hide)(); + } + + (0,_utils_sendMessage_js__WEBPACK_IMPORTED_MODULE_6__["default"])("StillOk"); + }, + ok: function ok() { + (0,_utils_sendMessage_js__WEBPACK_IMPORTED_MODULE_6__["default"])("Ok"); + + if (options.overlay) { + (0,_overlay_js__WEBPACK_IMPORTED_MODULE_4__.hide)(); + } + + (0,_utils_reloadApp_js__WEBPACK_IMPORTED_MODULE_7__["default"])(options, status); + }, + // TODO: remove in v5 in favor of 'static-changed' + + /** + * @param {string} file + */ + "content-changed": function contentChanged(file) { + _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.info("".concat(file ? "\"".concat(file, "\"") : "Content", " from static directory was changed. Reloading...")); + self.location.reload(); + }, + + /** + * @param {string} file + */ + "static-changed": function staticChanged(file) { + _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.info("".concat(file ? "\"".concat(file, "\"") : "Content", " from static directory was changed. Reloading...")); + self.location.reload(); + }, + + /** + * @param {Error[]} warnings + * @param {any} params + */ + warnings: function warnings(_warnings, params) { + _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.warn("Warnings while compiling."); + + var printableWarnings = _warnings.map(function (error) { + var _formatProblem = (0,_overlay_js__WEBPACK_IMPORTED_MODULE_4__.formatProblem)("warning", error), + header = _formatProblem.header, + body = _formatProblem.body; + + return "".concat(header, "\n").concat((0,_utils_stripAnsi_js__WEBPACK_IMPORTED_MODULE_1__["default"])(body)); + }); + + (0,_utils_sendMessage_js__WEBPACK_IMPORTED_MODULE_6__["default"])("Warnings", printableWarnings); + + for (var i = 0; i < printableWarnings.length; i++) { + _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.warn(printableWarnings[i]); + } + + var needShowOverlayForWarnings = typeof options.overlay === "boolean" ? options.overlay : options.overlay && options.overlay.warnings; + + if (needShowOverlayForWarnings) { + var trustedTypesPolicyName = typeof options.overlay === "object" && options.overlay.trustedTypesPolicyName; + (0,_overlay_js__WEBPACK_IMPORTED_MODULE_4__.show)("warning", _warnings, trustedTypesPolicyName || null); + } + + if (params && params.preventReloading) { + return; + } + + (0,_utils_reloadApp_js__WEBPACK_IMPORTED_MODULE_7__["default"])(options, status); + }, + + /** + * @param {Error[]} errors + */ + errors: function errors(_errors) { + _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.error("Errors while compiling. Reload prevented."); + + var printableErrors = _errors.map(function (error) { + var _formatProblem2 = (0,_overlay_js__WEBPACK_IMPORTED_MODULE_4__.formatProblem)("error", error), + header = _formatProblem2.header, + body = _formatProblem2.body; + + return "".concat(header, "\n").concat((0,_utils_stripAnsi_js__WEBPACK_IMPORTED_MODULE_1__["default"])(body)); + }); + + (0,_utils_sendMessage_js__WEBPACK_IMPORTED_MODULE_6__["default"])("Errors", printableErrors); + + for (var i = 0; i < printableErrors.length; i++) { + _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.error(printableErrors[i]); + } + + var needShowOverlayForErrors = typeof options.overlay === "boolean" ? options.overlay : options.overlay && options.overlay.errors; + + if (needShowOverlayForErrors) { + var trustedTypesPolicyName = typeof options.overlay === "object" && options.overlay.trustedTypesPolicyName; + (0,_overlay_js__WEBPACK_IMPORTED_MODULE_4__.show)("error", _errors, trustedTypesPolicyName || null); + } + }, + + /** + * @param {Error} error + */ + error: function error(_error) { + _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.error(_error); + }, + close: function close() { + _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.info("Disconnected!"); + + if (options.overlay) { + (0,_overlay_js__WEBPACK_IMPORTED_MODULE_4__.hide)(); + } + + (0,_utils_sendMessage_js__WEBPACK_IMPORTED_MODULE_6__["default"])("Close"); + } +}; +var socketURL = (0,_utils_createSocketURL_js__WEBPACK_IMPORTED_MODULE_8__["default"])(parsedResourceQuery); +(0,_socket_js__WEBPACK_IMPORTED_MODULE_3__["default"])(socketURL, onSocketMessage, options.reconnect); + +/***/ }), + +/***/ "./node_modules/webpack-dev-server/client/modules/logger/index.js": +/*!************************************************************************!*\ + !*** ./node_modules/webpack-dev-server/client/modules/logger/index.js ***! + \************************************************************************/ +/***/ (function(__unused_webpack_module, exports) { + +/******/ (function() { // webpackBootstrap +/******/ "use strict"; +/******/ var __webpack_modules__ = ({ + +/***/ "./client-src/modules/logger/SyncBailHookFake.js": +/*!*******************************************************!*\ + !*** ./client-src/modules/logger/SyncBailHookFake.js ***! + \*******************************************************/ +/***/ (function(module) { + + +/** + * Client stub for tapable SyncBailHook + */ + +module.exports = function clientTapableSyncBailHook() { + return { + call: function call() {} + }; +}; + +/***/ }), + +/***/ "./node_modules/webpack/lib/logging/Logger.js": +/*!****************************************************!*\ + !*** ./node_modules/webpack/lib/logging/Logger.js ***! + \****************************************************/ +/***/ (function(__unused_webpack_module, exports) { + +/* + MIT License http://www.opensource.org/licenses/mit-license.php + Author Tobias Koppers @sokra +*/ + + +function _toConsumableArray(arr) { + return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); +} + +function _nonIterableSpread() { + throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); +} + +function _unsupportedIterableToArray(o, minLen) { + if (!o) return; + if (typeof o === "string") return _arrayLikeToArray(o, minLen); + var n = Object.prototype.toString.call(o).slice(8, -1); + if (n === "Object" && o.constructor) n = o.constructor.name; + if (n === "Map" || n === "Set") return Array.from(o); + if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); +} + +function _iterableToArray(iter) { + if (typeof (typeof Symbol !== "undefined" ? Symbol : function (i) { return i; }) !== "undefined" && iter[(typeof Symbol !== "undefined" ? Symbol : function (i) { return i; }).iterator] != null || iter["@@iterator"] != null) return Array.from(iter); +} + +function _arrayWithoutHoles(arr) { + if (Array.isArray(arr)) return _arrayLikeToArray(arr); +} + +function _arrayLikeToArray(arr, len) { + if (len == null || len > arr.length) len = arr.length; + + for (var i = 0, arr2 = new Array(len); i < len; i++) { + arr2[i] = arr[i]; + } + + return arr2; +} + +function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } +} + +function _defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } +} + +function _createClass(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties(Constructor.prototype, protoProps); + if (staticProps) _defineProperties(Constructor, staticProps); + Object.defineProperty(Constructor, "prototype", { + writable: false + }); + return Constructor; +} + +var LogType = Object.freeze({ + error: + /** @type {"error"} */ + "error", + // message, c style arguments + warn: + /** @type {"warn"} */ + "warn", + // message, c style arguments + info: + /** @type {"info"} */ + "info", + // message, c style arguments + log: + /** @type {"log"} */ + "log", + // message, c style arguments + debug: + /** @type {"debug"} */ + "debug", + // message, c style arguments + trace: + /** @type {"trace"} */ + "trace", + // no arguments + group: + /** @type {"group"} */ + "group", + // [label] + groupCollapsed: + /** @type {"groupCollapsed"} */ + "groupCollapsed", + // [label] + groupEnd: + /** @type {"groupEnd"} */ + "groupEnd", + // [label] + profile: + /** @type {"profile"} */ + "profile", + // [profileName] + profileEnd: + /** @type {"profileEnd"} */ + "profileEnd", + // [profileName] + time: + /** @type {"time"} */ + "time", + // name, time as [seconds, nanoseconds] + clear: + /** @type {"clear"} */ + "clear", + // no arguments + status: + /** @type {"status"} */ + "status" // message, arguments + +}); +exports.LogType = LogType; +/** @typedef {typeof LogType[keyof typeof LogType]} LogTypeEnum */ + +var LOG_SYMBOL = (typeof Symbol !== "undefined" ? Symbol : function (i) { return i; })("webpack logger raw log method"); +var TIMERS_SYMBOL = (typeof Symbol !== "undefined" ? Symbol : function (i) { return i; })("webpack logger times"); +var TIMERS_AGGREGATES_SYMBOL = (typeof Symbol !== "undefined" ? Symbol : function (i) { return i; })("webpack logger aggregated times"); + +var WebpackLogger = /*#__PURE__*/function () { + /** + * @param {function(LogTypeEnum, any[]=): void} log log function + * @param {function(string | function(): string): WebpackLogger} getChildLogger function to create child logger + */ + function WebpackLogger(log, getChildLogger) { + _classCallCheck(this, WebpackLogger); + + this[LOG_SYMBOL] = log; + this.getChildLogger = getChildLogger; + } + + _createClass(WebpackLogger, [{ + key: "error", + value: function error() { + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + this[LOG_SYMBOL](LogType.error, args); + } + }, { + key: "warn", + value: function warn() { + for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { + args[_key2] = arguments[_key2]; + } + + this[LOG_SYMBOL](LogType.warn, args); + } + }, { + key: "info", + value: function info() { + for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) { + args[_key3] = arguments[_key3]; + } + + this[LOG_SYMBOL](LogType.info, args); + } + }, { + key: "log", + value: function log() { + for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) { + args[_key4] = arguments[_key4]; + } + + this[LOG_SYMBOL](LogType.log, args); + } + }, { + key: "debug", + value: function debug() { + for (var _len5 = arguments.length, args = new Array(_len5), _key5 = 0; _key5 < _len5; _key5++) { + args[_key5] = arguments[_key5]; + } + + this[LOG_SYMBOL](LogType.debug, args); + } + }, { + key: "assert", + value: function assert(assertion) { + if (!assertion) { + for (var _len6 = arguments.length, args = new Array(_len6 > 1 ? _len6 - 1 : 0), _key6 = 1; _key6 < _len6; _key6++) { + args[_key6 - 1] = arguments[_key6]; + } + + this[LOG_SYMBOL](LogType.error, args); + } + } + }, { + key: "trace", + value: function trace() { + this[LOG_SYMBOL](LogType.trace, ["Trace"]); + } + }, { + key: "clear", + value: function clear() { + this[LOG_SYMBOL](LogType.clear); + } + }, { + key: "status", + value: function status() { + for (var _len7 = arguments.length, args = new Array(_len7), _key7 = 0; _key7 < _len7; _key7++) { + args[_key7] = arguments[_key7]; + } + + this[LOG_SYMBOL](LogType.status, args); + } + }, { + key: "group", + value: function group() { + for (var _len8 = arguments.length, args = new Array(_len8), _key8 = 0; _key8 < _len8; _key8++) { + args[_key8] = arguments[_key8]; + } + + this[LOG_SYMBOL](LogType.group, args); + } + }, { + key: "groupCollapsed", + value: function groupCollapsed() { + for (var _len9 = arguments.length, args = new Array(_len9), _key9 = 0; _key9 < _len9; _key9++) { + args[_key9] = arguments[_key9]; + } + + this[LOG_SYMBOL](LogType.groupCollapsed, args); + } + }, { + key: "groupEnd", + value: function groupEnd() { + for (var _len10 = arguments.length, args = new Array(_len10), _key10 = 0; _key10 < _len10; _key10++) { + args[_key10] = arguments[_key10]; + } + + this[LOG_SYMBOL](LogType.groupEnd, args); + } + }, { + key: "profile", + value: function profile(label) { + this[LOG_SYMBOL](LogType.profile, [label]); + } + }, { + key: "profileEnd", + value: function profileEnd(label) { + this[LOG_SYMBOL](LogType.profileEnd, [label]); + } + }, { + key: "time", + value: function time(label) { + this[TIMERS_SYMBOL] = this[TIMERS_SYMBOL] || new Map(); + this[TIMERS_SYMBOL].set(label, process.hrtime()); + } + }, { + key: "timeLog", + value: function timeLog(label) { + var prev = this[TIMERS_SYMBOL] && this[TIMERS_SYMBOL].get(label); + + if (!prev) { + throw new Error("No such label '".concat(label, "' for WebpackLogger.timeLog()")); + } + + var time = process.hrtime(prev); + this[LOG_SYMBOL](LogType.time, [label].concat(_toConsumableArray(time))); + } + }, { + key: "timeEnd", + value: function timeEnd(label) { + var prev = this[TIMERS_SYMBOL] && this[TIMERS_SYMBOL].get(label); + + if (!prev) { + throw new Error("No such label '".concat(label, "' for WebpackLogger.timeEnd()")); + } + + var time = process.hrtime(prev); + this[TIMERS_SYMBOL].delete(label); + this[LOG_SYMBOL](LogType.time, [label].concat(_toConsumableArray(time))); + } + }, { + key: "timeAggregate", + value: function timeAggregate(label) { + var prev = this[TIMERS_SYMBOL] && this[TIMERS_SYMBOL].get(label); + + if (!prev) { + throw new Error("No such label '".concat(label, "' for WebpackLogger.timeAggregate()")); + } + + var time = process.hrtime(prev); + this[TIMERS_SYMBOL].delete(label); + this[TIMERS_AGGREGATES_SYMBOL] = this[TIMERS_AGGREGATES_SYMBOL] || new Map(); + var current = this[TIMERS_AGGREGATES_SYMBOL].get(label); + + if (current !== undefined) { + if (time[1] + current[1] > 1e9) { + time[0] += current[0] + 1; + time[1] = time[1] - 1e9 + current[1]; + } else { + time[0] += current[0]; + time[1] += current[1]; + } + } + + this[TIMERS_AGGREGATES_SYMBOL].set(label, time); + } + }, { + key: "timeAggregateEnd", + value: function timeAggregateEnd(label) { + if (this[TIMERS_AGGREGATES_SYMBOL] === undefined) return; + var time = this[TIMERS_AGGREGATES_SYMBOL].get(label); + if (time === undefined) return; + this[TIMERS_AGGREGATES_SYMBOL].delete(label); + this[LOG_SYMBOL](LogType.time, [label].concat(_toConsumableArray(time))); + } + }]); + + return WebpackLogger; +}(); + +exports.Logger = WebpackLogger; + +/***/ }), + +/***/ "./node_modules/webpack/lib/logging/createConsoleLogger.js": +/*!*****************************************************************!*\ + !*** ./node_modules/webpack/lib/logging/createConsoleLogger.js ***! + \*****************************************************************/ +/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_10785__) { + +/* + MIT License http://www.opensource.org/licenses/mit-license.php + Author Tobias Koppers @sokra +*/ + + +function _toConsumableArray(arr) { + return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); +} + +function _nonIterableSpread() { + throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); +} + +function _unsupportedIterableToArray(o, minLen) { + if (!o) return; + if (typeof o === "string") return _arrayLikeToArray(o, minLen); + var n = Object.prototype.toString.call(o).slice(8, -1); + if (n === "Object" && o.constructor) n = o.constructor.name; + if (n === "Map" || n === "Set") return Array.from(o); + if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); +} + +function _iterableToArray(iter) { + if (typeof (typeof Symbol !== "undefined" ? Symbol : function (i) { return i; }) !== "undefined" && iter[(typeof Symbol !== "undefined" ? Symbol : function (i) { return i; }).iterator] != null || iter["@@iterator"] != null) return Array.from(iter); +} + +function _arrayWithoutHoles(arr) { + if (Array.isArray(arr)) return _arrayLikeToArray(arr); +} + +function _arrayLikeToArray(arr, len) { + if (len == null || len > arr.length) len = arr.length; + + for (var i = 0, arr2 = new Array(len); i < len; i++) { + arr2[i] = arr[i]; + } + + return arr2; +} + +var _require = __nested_webpack_require_10785__(/*! ./Logger */ "./node_modules/webpack/lib/logging/Logger.js"), + LogType = _require.LogType; +/** @typedef {import("../../declarations/WebpackOptions").FilterItemTypes} FilterItemTypes */ + +/** @typedef {import("../../declarations/WebpackOptions").FilterTypes} FilterTypes */ + +/** @typedef {import("./Logger").LogTypeEnum} LogTypeEnum */ + +/** @typedef {function(string): boolean} FilterFunction */ + +/** + * @typedef {Object} LoggerConsole + * @property {function(): void} clear + * @property {function(): void} trace + * @property {(...args: any[]) => void} info + * @property {(...args: any[]) => void} log + * @property {(...args: any[]) => void} warn + * @property {(...args: any[]) => void} error + * @property {(...args: any[]) => void=} debug + * @property {(...args: any[]) => void=} group + * @property {(...args: any[]) => void=} groupCollapsed + * @property {(...args: any[]) => void=} groupEnd + * @property {(...args: any[]) => void=} status + * @property {(...args: any[]) => void=} profile + * @property {(...args: any[]) => void=} profileEnd + * @property {(...args: any[]) => void=} logTime + */ + +/** + * @typedef {Object} LoggerOptions + * @property {false|true|"none"|"error"|"warn"|"info"|"log"|"verbose"} level loglevel + * @property {FilterTypes|boolean} debug filter for debug logging + * @property {LoggerConsole} console the console to log to + */ + +/** + * @param {FilterItemTypes} item an input item + * @returns {FilterFunction} filter function + */ + + +var filterToFunction = function filterToFunction(item) { + if (typeof item === "string") { + var regExp = new RegExp("[\\\\/]".concat(item.replace( // eslint-disable-next-line no-useless-escape + /[-[\]{}()*+?.\\^$|]/g, "\\$&"), "([\\\\/]|$|!|\\?)")); + return function (ident) { + return regExp.test(ident); + }; + } + + if (item && typeof item === "object" && typeof item.test === "function") { + return function (ident) { + return item.test(ident); + }; + } + + if (typeof item === "function") { + return item; + } + + if (typeof item === "boolean") { + return function () { + return item; + }; + } +}; +/** + * @enum {number} + */ + + +var LogLevel = { + none: 6, + false: 6, + error: 5, + warn: 4, + info: 3, + log: 2, + true: 2, + verbose: 1 +}; +/** + * @param {LoggerOptions} options options object + * @returns {function(string, LogTypeEnum, any[]): void} logging function + */ + +module.exports = function (_ref) { + var _ref$level = _ref.level, + level = _ref$level === void 0 ? "info" : _ref$level, + _ref$debug = _ref.debug, + debug = _ref$debug === void 0 ? false : _ref$debug, + console = _ref.console; + var debugFilters = typeof debug === "boolean" ? [function () { + return debug; + }] : + /** @type {FilterItemTypes[]} */ + [].concat(debug).map(filterToFunction); + /** @type {number} */ + + var loglevel = LogLevel["".concat(level)] || 0; + /** + * @param {string} name name of the logger + * @param {LogTypeEnum} type type of the log entry + * @param {any[]} args arguments of the log entry + * @returns {void} + */ + + var logger = function logger(name, type, args) { + var labeledArgs = function labeledArgs() { + if (Array.isArray(args)) { + if (args.length > 0 && typeof args[0] === "string") { + return ["[".concat(name, "] ").concat(args[0])].concat(_toConsumableArray(args.slice(1))); + } else { + return ["[".concat(name, "]")].concat(_toConsumableArray(args)); + } + } else { + return []; + } + }; + + var debug = debugFilters.some(function (f) { + return f(name); + }); + + switch (type) { + case LogType.debug: + if (!debug) return; // eslint-disable-next-line node/no-unsupported-features/node-builtins + + if (typeof console.debug === "function") { + // eslint-disable-next-line node/no-unsupported-features/node-builtins + console.debug.apply(console, _toConsumableArray(labeledArgs())); + } else { + console.log.apply(console, _toConsumableArray(labeledArgs())); + } + + break; + + case LogType.log: + if (!debug && loglevel > LogLevel.log) return; + console.log.apply(console, _toConsumableArray(labeledArgs())); + break; + + case LogType.info: + if (!debug && loglevel > LogLevel.info) return; + console.info.apply(console, _toConsumableArray(labeledArgs())); + break; + + case LogType.warn: + if (!debug && loglevel > LogLevel.warn) return; + console.warn.apply(console, _toConsumableArray(labeledArgs())); + break; + + case LogType.error: + if (!debug && loglevel > LogLevel.error) return; + console.error.apply(console, _toConsumableArray(labeledArgs())); + break; + + case LogType.trace: + if (!debug) return; + console.trace(); + break; + + case LogType.groupCollapsed: + if (!debug && loglevel > LogLevel.log) return; + + if (!debug && loglevel > LogLevel.verbose) { + // eslint-disable-next-line node/no-unsupported-features/node-builtins + if (typeof console.groupCollapsed === "function") { + // eslint-disable-next-line node/no-unsupported-features/node-builtins + console.groupCollapsed.apply(console, _toConsumableArray(labeledArgs())); + } else { + console.log.apply(console, _toConsumableArray(labeledArgs())); + } + + break; + } + + // falls through + + case LogType.group: + if (!debug && loglevel > LogLevel.log) return; // eslint-disable-next-line node/no-unsupported-features/node-builtins + + if (typeof console.group === "function") { + // eslint-disable-next-line node/no-unsupported-features/node-builtins + console.group.apply(console, _toConsumableArray(labeledArgs())); + } else { + console.log.apply(console, _toConsumableArray(labeledArgs())); + } + + break; + + case LogType.groupEnd: + if (!debug && loglevel > LogLevel.log) return; // eslint-disable-next-line node/no-unsupported-features/node-builtins + + if (typeof console.groupEnd === "function") { + // eslint-disable-next-line node/no-unsupported-features/node-builtins + console.groupEnd(); + } + + break; + + case LogType.time: + { + if (!debug && loglevel > LogLevel.log) return; + var ms = args[1] * 1000 + args[2] / 1000000; + var msg = "[".concat(name, "] ").concat(args[0], ": ").concat(ms, " ms"); + + if (typeof console.logTime === "function") { + console.logTime(msg); + } else { + console.log(msg); + } + + break; + } + + case LogType.profile: + // eslint-disable-next-line node/no-unsupported-features/node-builtins + if (typeof console.profile === "function") { + // eslint-disable-next-line node/no-unsupported-features/node-builtins + console.profile.apply(console, _toConsumableArray(labeledArgs())); + } + + break; + + case LogType.profileEnd: + // eslint-disable-next-line node/no-unsupported-features/node-builtins + if (typeof console.profileEnd === "function") { + // eslint-disable-next-line node/no-unsupported-features/node-builtins + console.profileEnd.apply(console, _toConsumableArray(labeledArgs())); + } + + break; + + case LogType.clear: + if (!debug && loglevel > LogLevel.log) return; // eslint-disable-next-line node/no-unsupported-features/node-builtins + + if (typeof console.clear === "function") { + // eslint-disable-next-line node/no-unsupported-features/node-builtins + console.clear(); + } + + break; + + case LogType.status: + if (!debug && loglevel > LogLevel.info) return; + + if (typeof console.status === "function") { + if (args.length === 0) { + console.status(); + } else { + console.status.apply(console, _toConsumableArray(labeledArgs())); + } + } else { + if (args.length !== 0) { + console.info.apply(console, _toConsumableArray(labeledArgs())); + } + } + + break; + + default: + throw new Error("Unexpected LogType ".concat(type)); + } + }; + + return logger; +}; + +/***/ }), + +/***/ "./node_modules/webpack/lib/logging/runtime.js": +/*!*****************************************************!*\ + !*** ./node_modules/webpack/lib/logging/runtime.js ***! + \*****************************************************/ +/***/ (function(__unused_webpack_module, exports, __nested_webpack_require_20872__) { + +/* + MIT License http://www.opensource.org/licenses/mit-license.php + Author Tobias Koppers @sokra +*/ + + +function _extends() { + _extends = Object.assign ? Object.assign.bind() : function (target) { + for (var i = 1; i < arguments.length; i++) { + var source = arguments[i]; + + for (var key in source) { + if (Object.prototype.hasOwnProperty.call(source, key)) { + target[key] = source[key]; + } + } + } + + return target; + }; + return _extends.apply(this, arguments); +} + +var SyncBailHook = __nested_webpack_require_20872__(/*! tapable/lib/SyncBailHook */ "./client-src/modules/logger/SyncBailHookFake.js"); + +var _require = __nested_webpack_require_20872__(/*! ./Logger */ "./node_modules/webpack/lib/logging/Logger.js"), + Logger = _require.Logger; + +var createConsoleLogger = __nested_webpack_require_20872__(/*! ./createConsoleLogger */ "./node_modules/webpack/lib/logging/createConsoleLogger.js"); +/** @type {createConsoleLogger.LoggerOptions} */ + + +var currentDefaultLoggerOptions = { + level: "info", + debug: false, + console: console +}; +var currentDefaultLogger = createConsoleLogger(currentDefaultLoggerOptions); +/** + * @param {string} name name of the logger + * @returns {Logger} a logger + */ + +exports.getLogger = function (name) { + return new Logger(function (type, args) { + if (exports.hooks.log.call(name, type, args) === undefined) { + currentDefaultLogger(name, type, args); + } + }, function (childName) { + return exports.getLogger("".concat(name, "/").concat(childName)); + }); +}; +/** + * @param {createConsoleLogger.LoggerOptions} options new options, merge with old options + * @returns {void} + */ + + +exports.configureDefaultLogger = function (options) { + _extends(currentDefaultLoggerOptions, options); + + currentDefaultLogger = createConsoleLogger(currentDefaultLoggerOptions); +}; + +exports.hooks = { + log: new SyncBailHook(["origin", "type", "args"]) +}; + +/***/ }) + +/******/ }); +/************************************************************************/ +/******/ // The module cache +/******/ var __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __nested_webpack_require_23009__(moduleId) { +/******/ // Check if module is in cache +/******/ var cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ __webpack_modules__[moduleId](module, module.exports, __nested_webpack_require_23009__); +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/define property getters */ +/******/ !function() { +/******/ // define getter functions for harmony exports +/******/ __nested_webpack_require_23009__.d = function(exports, definition) { +/******/ for(var key in definition) { +/******/ if(__nested_webpack_require_23009__.o(definition, key) && !__nested_webpack_require_23009__.o(exports, key)) { +/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); +/******/ } +/******/ } +/******/ }; +/******/ }(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ !function() { +/******/ __nested_webpack_require_23009__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); } +/******/ }(); +/******/ +/******/ /* webpack/runtime/make namespace object */ +/******/ !function() { +/******/ // define __esModule on exports +/******/ __nested_webpack_require_23009__.r = function(exports) { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ }(); +/******/ +/************************************************************************/ +var __webpack_exports__ = {}; +// This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk. +!function() { +/*!********************************************!*\ + !*** ./client-src/modules/logger/index.js ***! + \********************************************/ +__nested_webpack_require_23009__.r(__webpack_exports__); +/* harmony export */ __nested_webpack_require_23009__.d(__webpack_exports__, { +/* harmony export */ "default": function() { return /* reexport default export from named module */ webpack_lib_logging_runtime_js__WEBPACK_IMPORTED_MODULE_0__; } +/* harmony export */ }); +/* harmony import */ var webpack_lib_logging_runtime_js__WEBPACK_IMPORTED_MODULE_0__ = __nested_webpack_require_23009__(/*! webpack/lib/logging/runtime.js */ "./node_modules/webpack/lib/logging/runtime.js"); + +}(); +var __webpack_export_target__ = exports; +for(var i in __webpack_exports__) __webpack_export_target__[i] = __webpack_exports__[i]; +if(__webpack_exports__.__esModule) Object.defineProperty(__webpack_export_target__, "__esModule", { value: true }); +/******/ })() +; + +/***/ }), + +/***/ "./node_modules/webpack-dev-server/client/overlay.js": +/*!***********************************************************!*\ + !*** ./node_modules/webpack-dev-server/client/overlay.js ***! + \***********************************************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "formatProblem": function() { return /* binding */ formatProblem; }, +/* harmony export */ "hide": function() { return /* binding */ hide; }, +/* harmony export */ "show": function() { return /* binding */ show; } +/* harmony export */ }); +/* harmony import */ var ansi_html_community__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ansi-html-community */ "./node_modules/ansi-html-community/index.js"); +/* harmony import */ var ansi_html_community__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(ansi_html_community__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var html_entities__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! html-entities */ "./node_modules/html-entities/lib/index.js"); +/* harmony import */ var html_entities__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(html_entities__WEBPACK_IMPORTED_MODULE_1__); +// The error overlay is inspired (and mostly copied) from Create React App (https://github.com/facebookincubator/create-react-app) +// They, in turn, got inspired by webpack-hot-middleware (https://github.com/glenjamin/webpack-hot-middleware). + + +var colors = { + reset: ["transparent", "transparent"], + black: "181818", + red: "E36049", + green: "B3CB74", + yellow: "FFD080", + blue: "7CAFC2", + magenta: "7FACCA", + cyan: "C3C2EF", + lightgrey: "EBE7E3", + darkgrey: "6D7891" +}; +/** @type {HTMLIFrameElement | null | undefined} */ + +var iframeContainerElement; +/** @type {HTMLDivElement | null | undefined} */ + +var containerElement; +/** @type {Array<(element: HTMLDivElement) => void>} */ + +var onLoadQueue = []; +/** @type {TrustedTypePolicy | undefined} */ + +var overlayTrustedTypesPolicy; +ansi_html_community__WEBPACK_IMPORTED_MODULE_0___default().setColors(colors); +/** + * @param {string | null} trustedTypesPolicyName + */ + +function createContainer(trustedTypesPolicyName) { + // Enable Trusted Types if they are available in the current browser. + if (window.trustedTypes) { + overlayTrustedTypesPolicy = window.trustedTypes.createPolicy(trustedTypesPolicyName || "webpack-dev-server#overlay", { + createHTML: function createHTML(value) { + return value; + } + }); + } + + iframeContainerElement = document.createElement("iframe"); + iframeContainerElement.id = "webpack-dev-server-client-overlay"; + iframeContainerElement.src = "about:blank"; + iframeContainerElement.style.position = "fixed"; + iframeContainerElement.style.left = 0; + iframeContainerElement.style.top = 0; + iframeContainerElement.style.right = 0; + iframeContainerElement.style.bottom = 0; + iframeContainerElement.style.width = "100vw"; + iframeContainerElement.style.height = "100vh"; + iframeContainerElement.style.border = "none"; + iframeContainerElement.style.zIndex = 9999999999; + + iframeContainerElement.onload = function () { + containerElement = + /** @type {Document} */ + + /** @type {HTMLIFrameElement} */ + iframeContainerElement.contentDocument.createElement("div"); + containerElement.id = "webpack-dev-server-client-overlay-div"; + containerElement.style.position = "fixed"; + containerElement.style.boxSizing = "border-box"; + containerElement.style.left = 0; + containerElement.style.top = 0; + containerElement.style.right = 0; + containerElement.style.bottom = 0; + containerElement.style.width = "100vw"; + containerElement.style.height = "100vh"; + containerElement.style.backgroundColor = "rgba(0, 0, 0, 0.85)"; + containerElement.style.color = "#E8E8E8"; + containerElement.style.fontFamily = "Menlo, Consolas, monospace"; + containerElement.style.fontSize = "large"; + containerElement.style.padding = "2rem"; + containerElement.style.lineHeight = "1.2"; + containerElement.style.whiteSpace = "pre-wrap"; + containerElement.style.overflow = "auto"; + var headerElement = document.createElement("span"); + headerElement.innerText = "Compiled with problems:"; + var closeButtonElement = document.createElement("button"); + closeButtonElement.innerText = "X"; + closeButtonElement.style.background = "transparent"; + closeButtonElement.style.border = "none"; + closeButtonElement.style.fontSize = "20px"; + closeButtonElement.style.fontWeight = "bold"; + closeButtonElement.style.color = "white"; + closeButtonElement.style.cursor = "pointer"; + closeButtonElement.style.cssFloat = "right"; // @ts-ignore + + closeButtonElement.style.styleFloat = "right"; + closeButtonElement.addEventListener("click", function () { + hide(); + }); + containerElement.appendChild(headerElement); + containerElement.appendChild(closeButtonElement); + containerElement.appendChild(document.createElement("br")); + containerElement.appendChild(document.createElement("br")); + /** @type {Document} */ + + /** @type {HTMLIFrameElement} */ + iframeContainerElement.contentDocument.body.appendChild(containerElement); + onLoadQueue.forEach(function (onLoad) { + onLoad( + /** @type {HTMLDivElement} */ + containerElement); + }); + onLoadQueue = []; + /** @type {HTMLIFrameElement} */ + + iframeContainerElement.onload = null; + }; + + document.body.appendChild(iframeContainerElement); +} +/** + * @param {(element: HTMLDivElement) => void} callback + * @param {string | null} trustedTypesPolicyName + */ + + +function ensureOverlayExists(callback, trustedTypesPolicyName) { + if (containerElement) { + // Everything is ready, call the callback right away. + callback(containerElement); + return; + } + + onLoadQueue.push(callback); + + if (iframeContainerElement) { + return; + } + + createContainer(trustedTypesPolicyName); +} // Successful compilation. + + +function hide() { + if (!iframeContainerElement) { + return; + } // Clean up and reset internal state. + + + document.body.removeChild(iframeContainerElement); + iframeContainerElement = null; + containerElement = null; +} +/** + * @param {string} type + * @param {string | { file?: string, moduleName?: string, loc?: string, message?: string }} item + * @returns {{ header: string, body: string }} + */ + + +function formatProblem(type, item) { + var header = type === "warning" ? "WARNING" : "ERROR"; + var body = ""; + + if (typeof item === "string") { + body += item; + } else { + var file = item.file || ""; // eslint-disable-next-line no-nested-ternary + + var moduleName = item.moduleName ? item.moduleName.indexOf("!") !== -1 ? "".concat(item.moduleName.replace(/^(\s|\S)*!/, ""), " (").concat(item.moduleName, ")") : "".concat(item.moduleName) : ""; + var loc = item.loc; + header += "".concat(moduleName || file ? " in ".concat(moduleName ? "".concat(moduleName).concat(file ? " (".concat(file, ")") : "") : file).concat(loc ? " ".concat(loc) : "") : ""); + body += item.message || ""; + } + + return { + header: header, + body: body + }; +} // Compilation with errors (e.g. syntax error or missing modules). + +/** + * @param {string} type + * @param {Array} messages + * @param {string | null} trustedTypesPolicyName + */ + + +function show(type, messages, trustedTypesPolicyName) { + ensureOverlayExists(function () { + messages.forEach(function (message) { + var entryElement = document.createElement("div"); + var typeElement = document.createElement("span"); + + var _formatProblem = formatProblem(type, message), + header = _formatProblem.header, + body = _formatProblem.body; + + typeElement.innerText = header; + typeElement.style.color = "#".concat(colors.red); // Make it look similar to our terminal. + + var text = ansi_html_community__WEBPACK_IMPORTED_MODULE_0___default()((0,html_entities__WEBPACK_IMPORTED_MODULE_1__.encode)(body)); + var messageTextNode = document.createElement("div"); + messageTextNode.innerHTML = overlayTrustedTypesPolicy ? overlayTrustedTypesPolicy.createHTML(text) : text; + entryElement.appendChild(typeElement); + entryElement.appendChild(document.createElement("br")); + entryElement.appendChild(document.createElement("br")); + entryElement.appendChild(messageTextNode); + entryElement.appendChild(document.createElement("br")); + entryElement.appendChild(document.createElement("br")); + /** @type {HTMLDivElement} */ + + containerElement.appendChild(entryElement); + }); + }, trustedTypesPolicyName); +} + + + +/***/ }), + +/***/ "./node_modules/webpack-dev-server/client/socket.js": +/*!**********************************************************!*\ + !*** ./node_modules/webpack-dev-server/client/socket.js ***! + \**********************************************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "client": function() { return /* binding */ client; } +/* harmony export */ }); +/* harmony import */ var _clients_WebSocketClient_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./clients/WebSocketClient.js */ "./node_modules/webpack-dev-server/client/clients/WebSocketClient.js"); +/* harmony import */ var _utils_log_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils/log.js */ "./node_modules/webpack-dev-server/client/utils/log.js"); +/* provided dependency */ var __webpack_dev_server_client__ = __webpack_require__(/*! ./node_modules/webpack-dev-server/client/clients/WebSocketClient.js */ "./node_modules/webpack-dev-server/client/clients/WebSocketClient.js"); +/* global __webpack_dev_server_client__ */ + + // this WebsocketClient is here as a default fallback, in case the client is not injected + +/* eslint-disable camelcase */ + +var Client = // eslint-disable-next-line no-nested-ternary +typeof __webpack_dev_server_client__ !== "undefined" ? typeof __webpack_dev_server_client__.default !== "undefined" ? __webpack_dev_server_client__.default : __webpack_dev_server_client__ : _clients_WebSocketClient_js__WEBPACK_IMPORTED_MODULE_0__["default"]; +/* eslint-enable camelcase */ + +var retries = 0; +var maxRetries = 10; // Initialized client is exported so external consumers can utilize the same instance +// It is mutable to enforce singleton +// eslint-disable-next-line import/no-mutable-exports + +var client = null; +/** + * @param {string} url + * @param {{ [handler: string]: (data?: any, params?: any) => any }} handlers + * @param {number} [reconnect] + */ + +var socket = function initSocket(url, handlers, reconnect) { + client = new Client(url); + client.onOpen(function () { + retries = 0; + + if (typeof reconnect !== "undefined") { + maxRetries = reconnect; + } + }); + client.onClose(function () { + if (retries === 0) { + handlers.close(); + } // Try to reconnect. + + + client = null; // After 10 retries stop trying, to prevent logspam. + + if (retries < maxRetries) { + // Exponentially increase timeout to reconnect. + // Respectfully copied from the package `got`. + // eslint-disable-next-line no-restricted-properties + var retryInMs = 1000 * Math.pow(2, retries) + Math.random() * 100; + retries += 1; + _utils_log_js__WEBPACK_IMPORTED_MODULE_1__.log.info("Trying to reconnect..."); + setTimeout(function () { + socket(url, handlers, reconnect); + }, retryInMs); + } + }); + client.onMessage( + /** + * @param {any} data + */ + function (data) { + var message = JSON.parse(data); + + if (handlers[message.type]) { + handlers[message.type](message.data, message.params); + } + }); +}; + +/* harmony default export */ __webpack_exports__["default"] = (socket); + +/***/ }), + +/***/ "./node_modules/webpack-dev-server/client/utils/createSocketURL.js": +/*!*************************************************************************!*\ + !*** ./node_modules/webpack-dev-server/client/utils/createSocketURL.js ***! + \*************************************************************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/** + * @param {{ protocol?: string, auth?: string, hostname?: string, port?: string, pathname?: string, search?: string, hash?: string, slashes?: boolean }} objURL + * @returns {string} + */ +function format(objURL) { + var protocol = objURL.protocol || ""; + + if (protocol && protocol.substr(-1) !== ":") { + protocol += ":"; + } + + var auth = objURL.auth || ""; + + if (auth) { + auth = encodeURIComponent(auth); + auth = auth.replace(/%3A/i, ":"); + auth += "@"; + } + + var host = ""; + + if (objURL.hostname) { + host = auth + (objURL.hostname.indexOf(":") === -1 ? objURL.hostname : "[".concat(objURL.hostname, "]")); + + if (objURL.port) { + host += ":".concat(objURL.port); + } + } + + var pathname = objURL.pathname || ""; + + if (objURL.slashes) { + host = "//".concat(host || ""); + + if (pathname && pathname.charAt(0) !== "/") { + pathname = "/".concat(pathname); + } + } else if (!host) { + host = ""; + } + + var search = objURL.search || ""; + + if (search && search.charAt(0) !== "?") { + search = "?".concat(search); + } + + var hash = objURL.hash || ""; + + if (hash && hash.charAt(0) !== "#") { + hash = "#".concat(hash); + } + + pathname = pathname.replace(/[?#]/g, + /** + * @param {string} match + * @returns {string} + */ + function (match) { + return encodeURIComponent(match); + }); + search = search.replace("#", "%23"); + return "".concat(protocol).concat(host).concat(pathname).concat(search).concat(hash); +} +/** + * @param {URL & { fromCurrentScript?: boolean }} parsedURL + * @returns {string} + */ + + +function createSocketURL(parsedURL) { + var hostname = parsedURL.hostname; // Node.js module parses it as `::` + // `new URL(urlString, [baseURLString])` parses it as '[::]' + + var isInAddrAny = hostname === "0.0.0.0" || hostname === "::" || hostname === "[::]"; // why do we need this check? + // hostname n/a for file protocol (example, when using electron, ionic) + // see: https://github.com/webpack/webpack-dev-server/pull/384 + + if (isInAddrAny && self.location.hostname && self.location.protocol.indexOf("http") === 0) { + hostname = self.location.hostname; + } + + var socketURLProtocol = parsedURL.protocol || self.location.protocol; // When https is used in the app, secure web sockets are always necessary because the browser doesn't accept non-secure web sockets. + + if (socketURLProtocol === "auto:" || hostname && isInAddrAny && self.location.protocol === "https:") { + socketURLProtocol = self.location.protocol; + } + + socketURLProtocol = socketURLProtocol.replace(/^(?:http|.+-extension|file)/i, "ws"); + var socketURLAuth = ""; // `new URL(urlString, [baseURLstring])` doesn't have `auth` property + // Parse authentication credentials in case we need them + + if (parsedURL.username) { + socketURLAuth = parsedURL.username; // Since HTTP basic authentication does not allow empty username, + // we only include password if the username is not empty. + + if (parsedURL.password) { + // Result: : + socketURLAuth = socketURLAuth.concat(":", parsedURL.password); + } + } // In case the host is a raw IPv6 address, it can be enclosed in + // the brackets as the brackets are needed in the final URL string. + // Need to remove those as url.format blindly adds its own set of brackets + // if the host string contains colons. That would lead to non-working + // double brackets (e.g. [[::]]) host + // + // All of these web socket url params are optionally passed in through resourceQuery, + // so we need to fall back to the default if they are not provided + + + var socketURLHostname = (hostname || self.location.hostname || "localhost").replace(/^\[(.*)\]$/, "$1"); + var socketURLPort = parsedURL.port; + + if (!socketURLPort || socketURLPort === "0") { + socketURLPort = self.location.port; + } // If path is provided it'll be passed in via the resourceQuery as a + // query param so it has to be parsed out of the querystring in order for the + // client to open the socket to the correct location. + + + var socketURLPathname = "/ws"; + + if (parsedURL.pathname && !parsedURL.fromCurrentScript) { + socketURLPathname = parsedURL.pathname; + } + + return format({ + protocol: socketURLProtocol, + auth: socketURLAuth, + hostname: socketURLHostname, + port: socketURLPort, + pathname: socketURLPathname, + slashes: true + }); +} + +/* harmony default export */ __webpack_exports__["default"] = (createSocketURL); + +/***/ }), + +/***/ "./node_modules/webpack-dev-server/client/utils/getCurrentScriptSource.js": +/*!********************************************************************************!*\ + !*** ./node_modules/webpack-dev-server/client/utils/getCurrentScriptSource.js ***! + \********************************************************************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/** + * @returns {string} + */ +function getCurrentScriptSource() { + // `document.currentScript` is the most accurate way to find the current script, + // but is not supported in all browsers. + if (document.currentScript) { + return document.currentScript.getAttribute("src"); + } // Fallback to getting all scripts running in the document. + + + var scriptElements = document.scripts || []; + var scriptElementsWithSrc = Array.prototype.filter.call(scriptElements, function (element) { + return element.getAttribute("src"); + }); + + if (scriptElementsWithSrc.length > 0) { + var currentScript = scriptElementsWithSrc[scriptElementsWithSrc.length - 1]; + return currentScript.getAttribute("src"); + } // Fail as there was no script to use. + + + throw new Error("[webpack-dev-server] Failed to get current script source."); +} + +/* harmony default export */ __webpack_exports__["default"] = (getCurrentScriptSource); + +/***/ }), + +/***/ "./node_modules/webpack-dev-server/client/utils/log.js": +/*!*************************************************************!*\ + !*** ./node_modules/webpack-dev-server/client/utils/log.js ***! + \*************************************************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "log": function() { return /* binding */ log; }, +/* harmony export */ "setLogLevel": function() { return /* binding */ setLogLevel; } +/* harmony export */ }); +/* harmony import */ var _modules_logger_index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/logger/index.js */ "./node_modules/webpack-dev-server/client/modules/logger/index.js"); +/* harmony import */ var _modules_logger_index_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_modules_logger_index_js__WEBPACK_IMPORTED_MODULE_0__); + +var name = "webpack-dev-server"; // default level is set on the client side, so it does not need +// to be set by the CLI or API + +var defaultLevel = "info"; // options new options, merge with old options + +/** + * @param {false | true | "none" | "error" | "warn" | "info" | "log" | "verbose"} level + * @returns {void} + */ + +function setLogLevel(level) { + _modules_logger_index_js__WEBPACK_IMPORTED_MODULE_0___default().configureDefaultLogger({ + level: level + }); +} + +setLogLevel(defaultLevel); +var log = _modules_logger_index_js__WEBPACK_IMPORTED_MODULE_0___default().getLogger(name); + + +/***/ }), + +/***/ "./node_modules/webpack-dev-server/client/utils/parseURL.js": +/*!******************************************************************!*\ + !*** ./node_modules/webpack-dev-server/client/utils/parseURL.js ***! + \******************************************************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _getCurrentScriptSource_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getCurrentScriptSource.js */ "./node_modules/webpack-dev-server/client/utils/getCurrentScriptSource.js"); + +/** + * @param {string} resourceQuery + * @returns {{ [key: string]: string | boolean }} + */ + +function parseURL(resourceQuery) { + /** @type {{ [key: string]: string }} */ + var options = {}; + + if (typeof resourceQuery === "string" && resourceQuery !== "") { + var searchParams = resourceQuery.slice(1).split("&"); + + for (var i = 0; i < searchParams.length; i++) { + var pair = searchParams[i].split("="); + options[pair[0]] = decodeURIComponent(pair[1]); + } + } else { + // Else, get the url from the

Images

- - + + +

diff --git a/examples/js/archive.js b/examples/js/archive.js index 0bf3549d5..c20afbad0 100644 --- a/examples/js/archive.js +++ b/examples/js/archive.js @@ -21,7 +21,9 @@ const setupMap = () => { }; const setupCollection = () => { - map.imgGroup = L.distortableCollection().addTo(map); + map.imgGroup = L.distortableCollection( + {tooltipControl: switchTooltipBtn} // Remove there will be no need to pass this object "distortableCollection" anymore + ).addTo(map); }; setupMap(); @@ -59,11 +61,13 @@ function extractKey() { let imageCount = 0; let fetchedFrom; -function renderImages(file, url) { - if (file.format === 'PNG' || file.format === 'JPEG') { + +const renderImages = (fullResImages, url) => { + fullResImages.forEach((file) => { const imageRow = document.createElement('div'); const image = new Image(150, 150); const placeButton = document.createElement('a'); + // link back to the images' source URL fetchedFrom = document.createElement('p'); const fetchedFromUrl = document.createElement('a'); fetchedFromUrl.setAttribute('href', input.value); @@ -73,15 +77,52 @@ function renderImages(file, url) { placeButton.classList.add('btn', 'btn-sm', 'btn-outline-secondary', 'place-button'); placeButton.innerHTML = 'Place on map'; - + // store the full-resolution image URL in a "data-original" attribute + image.setAttribute('data-original', `${url.replace('metadata', 'download')}/${file.name}`); image.src = `${url.replace('metadata', 'download')}/${file.name}`; imageRow.classList.add('d-flex', 'justify-content-between', 'align-items-center', 'mb-4', 'pe-5'); imageRow.append(image, placeButton); + imageContainer.appendChild(imageRow); + imageCount++; + }); +}; + +// renders thumbnails or images in thumbnail size +const renderThumbnails = (thumbnails = [], url, fullResImgs) => { + const imagesToRender = thumbnails || fullResImgs; + + console.log('imagesToRender-inside render thumbnail: ', imagesToRender); + + imagesToRender.forEach((file) => { + const imageRow = document.createElement('div'); + const image = new Image(65, 65); + const placeButton = document.createElement('a'); + // link back to the images' source URL + fetchedFrom = document.createElement('p'); + const fetchedFromUrl = document.createElement('a'); + fetchedFromUrl.setAttribute('href', input.value); + fetchedFromUrl.setAttribute('target', '_blank'); + fetchedFromUrl.innerHTML = 'this Internet Archive Collection'; + fetchedFrom.appendChild(fetchedFromUrl); + const fileName = document.createElement('p'); + fileName.innerHTML = file.name; + fileName.classList.add('m-0'); + fileName.style.fontSize = '12px'; + + placeButton.classList.add('btn', 'btn-sm', 'btn-outline-secondary', 'place-button', 'mt-1'); + placeButton.innerHTML = 'Place'; + placeButton.setAttribute('title', 'Place image on map'); + // store the full-resolution image URL in a "data-original" attribute + image.setAttribute('data-original', `${url.replace('metadata', 'download')}/${thumbnails ? file.original : file.name}`); + image.src = `${url.replace('metadata', 'download')}/${file.name}`; + imageRow.classList.add('col-4', 'd-flex', 'flex-column', 'p-2', 'align-items-center'); + imageRow.append(image, placeButton, fileName); imageContainer.appendChild(imageRow); + imageContainer.setAttribute('class', 'row'); imageCount++; - } -} + }); +}; function showImages(getUrl) { const url = getUrl.replace('details', 'metadata'); @@ -92,6 +133,21 @@ function showImages(getUrl) { response.data.files.forEach((file) => { renderImages(file, url); }); + + const imageThumbnails = response.data.files.filter(file => file.source === 'derivative'); + const fullResImages = response.data.files.filter(file => file.format === 'PNG' || file.format === 'JPEG'); + count = response.data.files.filter((file)=> { + if (file.format === 'PNG' || file.format === 'JPEG' || file.format.includes('Thumb')) return file; + }).length; + if (count > 100) { + if (imageThumbnails.length === fullResImages.length) { + renderThumbnails(imageThumbnails, url, fullResImages); + } else { + renderThumbnails(false, url, fullResImages); + } + } else { + renderImages(fullResImages, url); + } responseText.innerHTML = imageCount ? `${imageCount} image(s) fetched successfully from ${fetchedFrom.innerHTML}.` : 'No images found in the link provided...'; } else { responseText.innerHTML = 'No images found in the link provided...'; diff --git a/src/DistortableCollection.js b/src/DistortableCollection.js index 75d43026b..201fbeece 100644 --- a/src/DistortableCollection.js +++ b/src/DistortableCollection.js @@ -2,6 +2,7 @@ const arr = []; L.DistortableCollection = L.FeatureGroup.extend({ options: { editable: true, + tooltipControl: document.createElement('button'), // ************************transfer to archive.js file exportOpts: { exportStartUrl: '//export.mapknitter.org/export', statusUrl: '//export.mapknitter.org', @@ -15,6 +16,7 @@ L.DistortableCollection = L.FeatureGroup.extend({ L.Utils.initTranslation.call(this); this.editable = this.options.editable; + this.tooltipControl = this.options.tooltipControl; }, onAdd(map) { @@ -30,13 +32,46 @@ L.DistortableCollection = L.FeatureGroup.extend({ */ this.on('layeradd', this._addEvents, this); this.on('layerremove', this._removeEvents, this); + L.DomEvent.on(this.tooltipControl, 'click', this._updateTooltipBtn, this); // ************************transfer to archive.js file + }, + + _updateTooltipBtn(e) { // ************************transfer to archive.js file + if (e.target.textContent === 'Open Tooltip') { + e.target.textContent = 'Close Tooltip'; + this.eachLayer((layer) => { + L.DomEvent.on(layer.getElement(), 'mousemove', layer.activateTooltip, layer); + L.DomEvent.on(layer.getElement(), 'mouseout', layer.closeToolTip, layer); + e.target.textContent = 'Close Tooltip'; + }); + + return; + } + + if (e.target.textContent === 'Close Tooltip') { + e.target.textContent = 'Open Tooltip'; + this.eachLayer((layer) => { + L.DomEvent.off(layer.getElement(), 'mouseout'); + L.DomEvent.off(layer.getElement(), 'mousemove'); + }); + + return; + } }, onRemove() { if (this.editing) { this.editing.disable(); } - this.off('layeradd', this._addEvents, this); this.off('layerremove', this._removeEvents, this); + + if (e.target.textContent === 'Close Tooltip') { // ************************transfer to archive.js file + e.target.textContent = 'Open Tooltip'; + this.eachLayer((layer) => { + L.DomEvent.off(layer.getElement(), 'mouseout'); + L.DomEvent.off(layer.getElement(), 'mousemove'); + }); + + return; + } }, _addEvents(e) { diff --git a/src/DistortableImageOverlay.js b/src/DistortableImageOverlay.js index 35dc60ff5..b05a0c872 100644 --- a/src/DistortableImageOverlay.js +++ b/src/DistortableImageOverlay.js @@ -9,7 +9,8 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ mode: 'distort', selected: false, interactive: true, - tooltipText: 'Unknow image', + tooltipText: 'Unknown image', // default tooltipText + tooltipOpen: false, }, initialize(url, options) { @@ -236,17 +237,17 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ } }, - _activateTooltip(ev) { + activateTooltip() { if (!this._selected) { this.bindTooltip(this.tooltipText, {direction: 'top'}).openTooltip(); } }, - _closeTooltip() { + closeToolTip() { this.closeTooltip(); }, - _deactivateTooltip() { + deactivateTooltip() { this.unbindTooltip(); }, @@ -557,8 +558,8 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ }, }); -L.distortableImageOverlay = function(id, options) { // remove temp - return new L.DistortableImageOverlay(id, options); // remove temp +L.distortableImageOverlay = function(id, options) { + return new L.DistortableImageOverlay(id, options); }; L.Map.addInitHook(function() { From bd63422a95188b3f2ba859e708205e64a4fd5646 Mon Sep 17 00:00:00 2001 From: segun Date: Mon, 16 Jan 2023 17:42:54 +0100 Subject: [PATCH 46/57] update --- dist/leaflet.distortableimage.js | 39 ++++++++++++++++++++++++++++++-- examples/archive.html | 1 - examples/select.html | 1 + src/DistortableImageOverlay.js | 34 +++++++++++++++++++++++++--- 4 files changed, 69 insertions(+), 6 deletions(-) diff --git a/dist/leaflet.distortableimage.js b/dist/leaflet.distortableimage.js index 5cf2ebe57..51459fae5 100644 --- a/dist/leaflet.distortableimage.js +++ b/dist/leaflet.distortableimage.js @@ -604,6 +604,7 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ L.DomEvent.on(map, 'click', this.deselect, this); } +<<<<<<< HEAD this.fire('add'); <<<<<<< HEAD L.DomEvent.on(this.getElement(), 'mousemove', this._activateTooltip, this); @@ -758,8 +759,6 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ } }, <<<<<<< HEAD - _activateTooltip: function _activateTooltip(ev) { -======= activateTooltip: function activateTooltip() { >>>>>>> 33ec3de (update) if (!this._selected) { @@ -772,6 +771,42 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ this.closeTooltip(); }, deactivateTooltip: function deactivateTooltip() { +======= + // SEGUN ------------------------------------------------------------------------------------------------------------------------------- + // Work in progress on this function + _activateTooltip: function _activateTooltip(ev) { + var index = 0; + var xAxis = []; // stores previous values of x coordinate + + var yAxis = []; // stores previous values of y coordinate, may be needed later + // let newPosX = 0; + + if (!this._selected) { + // Consider using "if (!this.selected)" instead + // console.log('mouseOVER_DONE/mouseMOVE_DONE-TOOLTIP-ACTIVATED'); // To be deleted + // console.log('x-axis:', ev.x); // To be deleted + // console.log('y-axis:', ev.y); // To be deleted + xAxis[index] = ev.x; + yAxis[index] = ev.y; // May be needed later + // newPosX = xAxis[index-1] - xAxis[index]; // - works but not perfect + // newPosX = (xAxis[index-1] - xAxis[index]) - ((xAxis[index])/4); // - better than above but not perfect + // newPosX =(xAxis[index-1] - xAxis[index]) - (xAxis[index] - this.imageWidth); // - works but no perfect + + ++index; + this.bindTooltip(this.tooltipText, { + sticky: true, + direction: 'top', + offset: L.point([ev.x - 700, ev.y - 500]) + }).openTooltip(); // POC only, work still in progress on this - hardcoded, works not perfect yet + } + }, + _closeTooltip: function _closeTooltip() { + // console.log('mouseOUT_DONE-TOOLTIP-CLOSED'); // To be deleted + this.closeTooltip(); + }, + _deactivateTooltip: function _deactivateTooltip() { + // console.log('MouseoverENDED & mousemoveENDED-TOOLTIP-DEACTIVATED'); - To be deleted +>>>>>>> parent of 1fcea57 (tooltip centered on image) this.unbindTooltip(); }, setCorners: function setCorners(latlngObj) { diff --git a/examples/archive.html b/examples/archive.html index b7a77da5d..c5a798a53 100644 --- a/examples/archive.html +++ b/examples/archive.html @@ -65,7 +65,6 @@

Images

-
diff --git a/examples/select.html b/examples/select.html index 3a6e2196d..888cde8b8 100644 --- a/examples/select.html +++ b/examples/select.html @@ -20,6 +20,7 @@
+
diff --git a/src/DistortableImageOverlay.js b/src/DistortableImageOverlay.js index b05a0c872..a71e7b146 100644 --- a/src/DistortableImageOverlay.js +++ b/src/DistortableImageOverlay.js @@ -242,12 +242,40 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ this.bindTooltip(this.tooltipText, {direction: 'top'}).openTooltip(); } }, - - closeToolTip() { + // SEGUN ------------------------------------------------------------------------------------------------------------------------------- + // Work in progress on this function + // _activateTooltip(ev) { + // let index = 0; + // const xAxis = []; // stores previous values of x coordinate + // const yAxis = []; // stores previous values of y coordinate, may be needed later + // // let newPosX = 0; + + // if (!this._selected) { // Consider using "if (!this.selected)" instead + // // console.log('mouseOVER_DONE/mouseMOVE_DONE-TOOLTIP-ACTIVATED'); // To be deleted + // // console.log('x-axis:', ev.x); // To be deleted + // // console.log('y-axis:', ev.y); // To be deleted + + // xAxis[index] = ev.x; + // yAxis[index] = ev.y; // May be needed later + + // // newPosX = xAxis[index-1] - xAxis[index]; // - works but not perfect + // // newPosX = (xAxis[index-1] - xAxis[index]) - ((xAxis[index])/4); // - better than above but not perfect + // // newPosX =(xAxis[index-1] - xAxis[index]) - (xAxis[index] - this.imageWidth); // - works but no perfect + // ++index; + + // this.bindTooltip( + // this.tooltipText, + // {sticky: true, direction: 'top', offset: L.point([ev.x - 700, ev.y - 500])}).openTooltip(); // POC only, work still in progress on this - hardcoded, works not perfect yet + // } + // }, + + _closeTooltip() { + // console.log('mouseOUT_DONE-TOOLTIP-CLOSED'); // To be deleted this.closeTooltip(); }, - deactivateTooltip() { + _deactivateTooltip() { + // console.log('MouseoverENDED & mousemoveENDED-TOOLTIP-DEACTIVATED'); - To be deleted this.unbindTooltip(); }, From 9537359128d648837447197234c21d5c01a850ff Mon Sep 17 00:00:00 2001 From: segun Date: Mon, 16 Jan 2023 22:11:58 +0100 Subject: [PATCH 47/57] hotfix --- dist/leaflet.distortableimage.js | 5 +++-- src/DistortableImageOverlay.js | 27 ++++++++++++++++++++++++--- 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/dist/leaflet.distortableimage.js b/dist/leaflet.distortableimage.js index 51459fae5..447867a8f 100644 --- a/dist/leaflet.distortableimage.js +++ b/dist/leaflet.distortableimage.js @@ -610,7 +610,9 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ L.DomEvent.on(this.getElement(), 'mousemove', this._activateTooltip, this); L.DomEvent.on(this.getElement(), 'mouseout', this._closeTooltip, this); ======= ->>>>>>> 33ec3de (update) + this.fire('add'); // SEGUN ------------------------------------------------------------------------------------------------------------------------------ + // L.DomEvent.on(this.getElement(), 'mouseover mousemove', this._activateTooltip, this); + // L.DomEvent.on(this.getElement(), 'mouseout', this._closeTooltip, this); }, onRemove: function onRemove(map) { L.DomEvent.off(this.getElement(), 'click', this.select, this); @@ -806,7 +808,6 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ }, _deactivateTooltip: function _deactivateTooltip() { // console.log('MouseoverENDED & mousemoveENDED-TOOLTIP-DEACTIVATED'); - To be deleted ->>>>>>> parent of 1fcea57 (tooltip centered on image) this.unbindTooltip(); }, setCorners: function setCorners(latlngObj) { diff --git a/src/DistortableImageOverlay.js b/src/DistortableImageOverlay.js index a71e7b146..ecc4c627e 100644 --- a/src/DistortableImageOverlay.js +++ b/src/DistortableImageOverlay.js @@ -237,9 +237,30 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ } }, - activateTooltip() { - if (!this._selected) { - this.bindTooltip(this.tooltipText, {direction: 'top'}).openTooltip(); + // SEGUN ------------------------------------------------------------------------------------------------------------------------------- + // Work in progress on this function + _activateTooltip(ev) { + let index = 0; + const xAxis = []; // stores previous values of x coordinate + const yAxis = []; // stores previous values of y coordinate, may be needed later + // let newPosX = 0; + + if (!this._selected) { // Consider using "if (!this.selected)" instead + // console.log('mouseOVER_DONE/mouseMOVE_DONE-TOOLTIP-ACTIVATED'); // To be deleted + // console.log('x-axis:', ev.x); // To be deleted + // console.log('y-axis:', ev.y); // To be deleted + + xAxis[index] = ev.x; + yAxis[index] = ev.y; // May be needed later + + // newPosX = xAxis[index-1] - xAxis[index]; // - works but not perfect + // newPosX = (xAxis[index-1] - xAxis[index]) - ((xAxis[index])/4); // - better than above but not perfect + // newPosX =(xAxis[index-1] - xAxis[index]) - (xAxis[index] - this.imageWidth); // - works but no perfect + ++index; + + this.bindTooltip( + this.tooltipText, + {sticky: true, direction: 'top', offset: L.point([ev.x - 700, ev.y - 500])}).openTooltip(); // POC only, work still in progress on this - hardcoded, works not perfect yet } }, // SEGUN ------------------------------------------------------------------------------------------------------------------------------- From 0c1cd18723a387060b68bf63b43fc9b173f52c33 Mon Sep 17 00:00:00 2001 From: segun Date: Mon, 16 Jan 2023 22:48:58 +0100 Subject: [PATCH 48/57] update --- dist/leaflet.distortableimage.js | 8412 +----------------------------- examples/js/archive.js | 8 +- src/DistortableCollection.js | 36 - src/DistortableImageOverlay.js | 55 +- 4 files changed, 4 insertions(+), 8507 deletions(-) diff --git a/dist/leaflet.distortableimage.js b/dist/leaflet.distortableimage.js index 447867a8f..a55b5e3b5 100644 --- a/dist/leaflet.distortableimage.js +++ b/dist/leaflet.distortableimage.js @@ -1,8412 +1,2 @@ -/******/ (function() { // webpackBootstrap -/******/ var __webpack_modules__ = ({ - -/***/ "./node_modules/ansi-html-community/index.js": -/*!***************************************************!*\ - !*** ./node_modules/ansi-html-community/index.js ***! - \***************************************************/ -/***/ (function(module) { - -"use strict"; - - -module.exports = ansiHTML - -// Reference to https://github.com/sindresorhus/ansi-regex -var _regANSI = /(?:(?:\u001b\[)|\u009b)(?:(?:[0-9]{1,3})?(?:(?:;[0-9]{0,3})*)?[A-M|f-m])|\u001b[A-M]/ - -var _defColors = { - reset: ['fff', '000'], // [FOREGROUD_COLOR, BACKGROUND_COLOR] - black: '000', - red: 'ff0000', - green: '209805', - yellow: 'e8bf03', - blue: '0000ff', - magenta: 'ff00ff', - cyan: '00ffee', - lightgrey: 'f0f0f0', - darkgrey: '888' -} -var _styles = { - 30: 'black', - 31: 'red', - 32: 'green', - 33: 'yellow', - 34: 'blue', - 35: 'magenta', - 36: 'cyan', - 37: 'lightgrey' -} -var _openTags = { - '1': 'font-weight:bold', // bold - '2': 'opacity:0.5', // dim - '3': '', // italic - '4': '', // underscore - '8': 'display:none', // hidden - '9': '' // delete -} -var _closeTags = { - '23': '', // reset italic - '24': '', // reset underscore - '29': '' // reset delete -} - -;[0, 21, 22, 27, 28, 39, 49].forEach(function (n) { - _closeTags[n] = '' -}) - -/** - * Converts text with ANSI color codes to HTML markup. - * @param {String} text - * @returns {*} - */ -function ansiHTML (text) { - // Returns the text if the string has no ANSI escape code. - if (!_regANSI.test(text)) { - return text - } - - // Cache opened sequence. - var ansiCodes = [] - // Replace with markup. - var ret = text.replace(/\033\[(\d+)m/g, function (match, seq) { - var ot = _openTags[seq] - if (ot) { - // If current sequence has been opened, close it. - if (!!~ansiCodes.indexOf(seq)) { // eslint-disable-line no-extra-boolean-cast - ansiCodes.pop() - return '' - } - // Open tag. - ansiCodes.push(seq) - return ot[0] === '<' ? ot : '' - } - - var ct = _closeTags[seq] - if (ct) { - // Pop sequence - ansiCodes.pop() - return ct - } - return '' - }) - - // Make sure tags are closed. - var l = ansiCodes.length - ;(l > 0) && (ret += Array(l + 1).join('')) - - return ret -} - -/** - * Customize colors. - * @param {Object} colors reference to _defColors - */ -ansiHTML.setColors = function (colors) { - if (typeof colors !== 'object') { - throw new Error('`colors` parameter must be an Object.') - } - - var _finalColors = {} - for (var key in _defColors) { - var hex = colors.hasOwnProperty(key) ? colors[key] : null - if (!hex) { - _finalColors[key] = _defColors[key] - continue - } - if ('reset' === key) { - if (typeof hex === 'string') { - hex = [hex] - } - if (!Array.isArray(hex) || hex.length === 0 || hex.some(function (h) { - return typeof h !== 'string' - })) { - throw new Error('The value of `' + key + '` property must be an Array and each item could only be a hex string, e.g.: FF0000') - } - var defHexColor = _defColors[key] - if (!hex[0]) { - hex[0] = defHexColor[0] - } - if (hex.length === 1 || !hex[1]) { - hex = [hex[0]] - hex.push(defHexColor[1]) - } - - hex = hex.slice(0, 2) - } else if (typeof hex !== 'string') { - throw new Error('The value of `' + key + '` property must be a hex string, e.g.: FF0000') - } - _finalColors[key] = hex - } - _setTags(_finalColors) -} - -/** - * Reset colors. - */ -ansiHTML.reset = function () { - _setTags(_defColors) -} - -/** - * Expose tags, including open and close. - * @type {Object} - */ -ansiHTML.tags = {} - -if (Object.defineProperty) { - Object.defineProperty(ansiHTML.tags, 'open', { - get: function () { return _openTags } - }) - Object.defineProperty(ansiHTML.tags, 'close', { - get: function () { return _closeTags } - }) -} else { - ansiHTML.tags.open = _openTags - ansiHTML.tags.close = _closeTags -} - -function _setTags (colors) { - // reset all - _openTags['0'] = 'font-weight:normal;opacity:1;color:#' + colors.reset[0] + ';background:#' + colors.reset[1] - // inverse - _openTags['7'] = 'color:#' + colors.reset[1] + ';background:#' + colors.reset[0] - // dark grey - _openTags['90'] = 'color:#' + colors.darkgrey - - for (var code in _styles) { - var color = _styles[code] - var oriColor = colors[color] || '000' - _openTags[code] = 'color:#' + oriColor - code = parseInt(code) - _openTags[(code + 10).toString()] = 'background:#' + oriColor - } -} - -ansiHTML.reset() - - -/***/ }), - -/***/ "./src/DistortableCollection.js": -/*!**************************************!*\ - !*** ./src/DistortableCollection.js ***! - \**************************************/ -/***/ (function() { - -var arr = []; -L.DistortableCollection = L.FeatureGroup.extend({ - options: { - editable: true, - tooltipControl: document.createElement('button'), - // ************************transfer to archive.js file - exportOpts: { - exportStartUrl: '//export.mapknitter.org/export', - statusUrl: '//export.mapknitter.org', - exportUrl: 'http://export.mapknitter.org/' - } - }, - initialize: function initialize(options) { - L.setOptions(this, options); - L.FeatureGroup.prototype.initialize.call(this, options); - L.Utils.initTranslation.call(this); - this.editable = this.options.editable; - this.tooltipControl = this.options.tooltipControl; - }, - onAdd: function onAdd(map) { - L.FeatureGroup.prototype.onAdd.call(this, map); - this._map = map; - - if (this.editable) { - this.editing.enable(); - } - /** - * although we have a DistortableCollection.Edit class that handles collection events to keep our code managable, - * events that need to be added on individual images are kept here to do so through `layeradd`. - */ - - - this.on('layeradd', this._addEvents, this); - this.on('layerremove', this._removeEvents, this); - L.DomEvent.on(this.tooltipControl, 'click', this._updateTooltipBtn, this); // ************************transfer to archive.js file - }, - _updateTooltipBtn: function _updateTooltipBtn(e) { - // ************************transfer to archive.js file - if (e.target.textContent === 'Open Tooltip') { - e.target.textContent = 'Close Tooltip'; - this.eachLayer(function (layer) { - L.DomEvent.on(layer.getElement(), 'mousemove', layer.activateTooltip, layer); - L.DomEvent.on(layer.getElement(), 'mouseout', layer.closeToolTip, layer); - e.target.textContent = 'Close Tooltip'; - }); - return; - } - - if (e.target.textContent === 'Close Tooltip') { - e.target.textContent = 'Open Tooltip'; - this.eachLayer(function (layer) { - L.DomEvent.off(layer.getElement(), 'mouseout'); - L.DomEvent.off(layer.getElement(), 'mousemove'); - }); - return; - } - }, - onRemove: function onRemove() { - if (this.editing) { - this.editing.disable(); - } - - this.off('layeradd', this._addEvents, this); - this.off('layerremove', this._removeEvents, this); - - if (e.target.textContent === 'Close Tooltip') { - // ************************transfer to archive.js file - e.target.textContent = 'Open Tooltip'; - this.eachLayer(function (layer) { - L.DomEvent.off(layer.getElement(), 'mouseout'); - L.DomEvent.off(layer.getElement(), 'mousemove'); - }); - return; - } - }, - _addEvents: function _addEvents(e) { - var layer = e.layer; - L.DomEvent.on(layer, { - dragstart: this._dragStartMultiple, - drag: this._dragMultiple - }, this); - L.DomEvent.on(layer.getElement(), { - mousedown: this._deselectOthers, - - /* Enable longpress for multi select for touch devices. */ - contextmenu: this._longPressMultiSelect - }, this); - }, - _removeEvents: function _removeEvents(e) { - var layer = e.layer; - L.DomEvent.off(layer, { - dragstart: this._dragStartMultiple, - drag: this._dragMultiple - }, this); - L.DomEvent.off(layer.getElement(), { - mousedown: this._deselectOthers, - contextmenu: this._longPressMultiSelect - }, this); - }, - _longPressMultiSelect: function _longPressMultiSelect(e) { - var _this = this; - - if (!this.editable) { - return; - } - - e.preventDefault(); - this.eachLayer(function (layer) { - var edit = layer.editing; - - if (layer.getElement() === e.target && edit.enabled()) { - L.DomUtil.toggleClass(layer.getElement(), 'collected'); - - if (_this.anyCollected()) { - layer.deselect(); - - _this.editing._addToolbar(); - } else { - _this.editing._removeToolbar(); - } - } - }); - }, - isCollected: function isCollected(overlay) { - return L.DomUtil.hasClass(overlay.getElement(), 'collected'); - }, - anyCollected: function anyCollected() { - var layerArr = this.getLayers(); - return layerArr.some(this.isCollected.bind(this)); - }, - _toggleCollected: function _toggleCollected(e, layer) { - if (e.shiftKey) { - /* conditional prevents disabled images from flickering multi-select mode */ - if (layer.editing.enabled()) { - L.DomUtil.toggleClass(e.target, 'collected'); // re-order layers by _leaflet_id to match their display order in UI - // add new layer to right position and avoid repitition - - var newArr = arr.every(function (each) { - return each._leaflet_id !== layer._leaflet_id; - }); - - if (newArr) { - arr.push(layer); - } else { - arr.splice(arr.indexOf(layer), 1); - } - } - } - - if (this.anyCollected()) { - layer.deselect(); - } else { - this.editing._removeToolbar(); - } - }, - _deselectOthers: function _deselectOthers(e) { - var _this2 = this; - - if (!this.editable) { - return; - } - - this.eachLayer(function (layer) { - if (layer.getElement() !== e.target) { - layer.deselect(); - } else { - _this2._toggleCollected(e, layer); - } - }); - - if (e) { - L.DomEvent.stopPropagation(e); - } - }, - _dragStartMultiple: function _dragStartMultiple(e) { - var overlay = e.target; - var map = this._map; - var i; - - if (!this.isCollected(overlay)) { - return; - } - - this.eachLayer(function (layer) { - layer._dragStartPoints = {}; - layer.deselect(); - - for (i = 0; i < 4; i++) { - var c = layer.getCorner(i); - layer._dragStartPoints[i] = map.latLngToLayerPoint(c); - } - }); - }, - _dragMultiple: function _dragMultiple(e) { - var overlay = e.target; - var map = this._map; - - if (!this.isCollected(overlay)) { - return; - } - - var topLeft = map.latLngToLayerPoint(overlay.getCorner(0)); - - var delta = overlay._dragStartPoints[0].subtract(topLeft); - - this._updateCollectionFromPoints(delta, overlay); - }, - _toRemove: function _toRemove() { - var _this3 = this; - - var layerArr = this.getLayers(); - return layerArr.filter(function (layer) { - var mode = layer.editing._mode; - return _this3.isCollected(layer) && mode !== 'lock'; - }); - }, - _toMove: function _toMove(overlay) { - var _this4 = this; - - var layerArr = this.getLayers(); - return layerArr.filter(function (layer) { - var mode = layer.editing._mode; - return layer !== overlay && _this4.isCollected(layer) && mode !== 'lock'; - }); - }, - _updateCollectionFromPoints: function _updateCollectionFromPoints(delta, overlay) { - var layersToMove = this._toMove(overlay); - - var p = new L.Transformation(1, -delta.x, 1, -delta.y); - var i; - layersToMove.forEach(function (layer) { - var movedPoints = {}; - - for (i = 0; i < 4; i++) { - movedPoints[i] = p.transform(layer._dragStartPoints[i]); - } - - layer.setCornersFromPoints(movedPoints); - }); - }, - _getAvgCmPerPixel: function _getAvgCmPerPixel(imgs) { - var reduce = imgs.reduce(function (sum, img) { - return sum + img.cm_per_pixel; - }, 0); - return reduce / imgs.length; - }, - generateExportJson: function generateExportJson() { - var json = {}; - json.images = []; - this.eachLayer(function (layer) { - if (this.isCollected(layer)) { - var sections = layer._image.src.split('/'); - - var filename = sections[sections.length - 1]; - var zc = layer.getCorners(); - var corners = [{ - lat: zc[0].lat, - lon: zc[0].lng - }, { - lat: zc[1].lat, - lon: zc[1].lng - }, { - lat: zc[3].lat, - lon: zc[3].lng - }, { - lat: zc[2].lat, - lon: zc[2].lng - }]; - json.images.push({ - id: layer._leaflet_id, - src: layer._image.src, - width: layer._image.width, - height: layer._image.height, - image_file_name: filename, - nodes: corners, - cm_per_pixel: L.ImageUtil.getCmPerPixel(layer) - }); - } - }, this); - json.images = json.images.reverse(); - json.avg_cm_per_pixel = this._getAvgCmPerPixel(json.images); - return json; - } -}); - -L.distortableCollection = function (id, options) { - return new L.DistortableCollection(id, options); -}; - -/***/ }), - -/***/ "./src/DistortableImageOverlay.js": -/*!****************************************!*\ - !*** ./src/DistortableImageOverlay.js ***! - \****************************************/ -/***/ (function() { - -L.DistortableImageOverlay = L.ImageOverlay.extend({ - options: { - height: 200, - crossOrigin: true, - // todo: find ideal number to prevent distortions during RotateScale, and make it dynamic (remove hardcoding) - edgeMinWidth: 50, - editable: true, - mode: 'distort', - selected: false, - interactive: true, -<<<<<<< HEAD - tooltipText: 'Unknow image' -======= - tooltipText: 'Unknown image', - // default tooltipText - tooltipOpen: false ->>>>>>> 33ec3de (update) - }, - initialize: function initialize(url, options) { - L.setOptions(this, options); - L.Utils.initTranslation.call(this); - this.edgeMinWidth = this.options.edgeMinWidth; - this.editable = this.options.editable; - this._selected = this.options.selected; - this._url = url; - this.rotation = {}; - this.interactive = this.options.interactive; -<<<<<<< HEAD - this.tooltipText = this.options.tooltipText; -======= - this.tooltipText = options.tooltipText; - this.tooltipOpen = options.tooltipOpen; ->>>>>>> 33ec3de (update) - }, - onAdd: function onAdd(map) { - var _this = this; - - this._map = map; - - if (!this.getElement()) { - this._initImage(); - } - - map.on('viewreset', this._reset, this); - - if (this.options.corners) { - this._corners = this.options.corners; - - if (map.options.zoomAnimation && L.Browser.any3d) { - map.on('zoomanim', this._animateZoom, this); - } - } // Have to wait for the image to load because need to access its w/h - - - L.DomEvent.on(this.getElement(), 'load', function () { - _this.getPane().appendChild(_this.getElement()); - - _this._initImageDimensions(); - - if (_this.options.rotation) { - var units = _this.options.rotation.deg >= 0 ? 'deg' : 'rad'; - - _this.setAngle(_this.options.rotation[units], units); - } else { - _this.rotation = { - deg: 0, - rad: 0 - }; - - _this._reset(); - } - /* Initialize default corners if not already set */ - - - if (!_this._corners) { - if (map.options.zoomAnimation && L.Browser.any3d) { - map.on('zoomanim', _this._animateZoom, _this); - } - } - /** if there is a featureGroup, only its editable option matters */ - - - var eventParents = _this._eventParents; - - if (eventParents) { - _this.eP = eventParents[Object.keys(eventParents)[0]]; - - if (_this.eP.editable) { - _this.editing.enable(); - } - } else { - if (_this.editable) { - _this.editing.enable(); - } - - _this.eP = null; - } - }); - L.DomEvent.on(this.getElement(), 'click', this.select, this); - L.DomEvent.on(map, { - singleclickon: this._singleClickListeners, - singleclickoff: this._resetClickListeners, - singleclick: this._singleClick - }, this); - /** - * custom events fired from DoubleClickLabels.js. Used to differentiate - * single / dblclick to not deselect images on map dblclick. - */ - - if (!(map.doubleClickZoom.enabled() || map.doubleClickLabels.enabled())) { - L.DomEvent.on(map, 'click', this.deselect, this); - } - -<<<<<<< HEAD - this.fire('add'); -<<<<<<< HEAD - L.DomEvent.on(this.getElement(), 'mousemove', this._activateTooltip, this); - L.DomEvent.on(this.getElement(), 'mouseout', this._closeTooltip, this); -======= - this.fire('add'); // SEGUN ------------------------------------------------------------------------------------------------------------------------------ - // L.DomEvent.on(this.getElement(), 'mouseover mousemove', this._activateTooltip, this); - // L.DomEvent.on(this.getElement(), 'mouseout', this._closeTooltip, this); - }, - onRemove: function onRemove(map) { - L.DomEvent.off(this.getElement(), 'click', this.select, this); - L.DomEvent.off(map, { - singleclickon: this._singleClickListeners, - singleclickoff: this._resetClickListeners, - singleclick: this._singleClick - }, this); - L.DomEvent.off(map, 'click', this.deselect, this); - - if (this.editing) { - this.editing.disable(); - } - - this.fire('remove'); - L.ImageOverlay.prototype.onRemove.call(this, map); -<<<<<<< HEAD - L.DomEvent.off(this.getElement(), 'mouseover', this._deactivateTooltip, this); -======= ->>>>>>> 33ec3de (update) - }, - _initImageDimensions: function _initImageDimensions() { - var map = this._map; - var originalImageWidth = L.DomUtil.getStyle(this.getElement(), 'width'); - var originalImageHeight = L.DomUtil.getStyle(this.getElement(), 'height'); - var aspectRatio = parseInt(originalImageWidth) / parseInt(originalImageHeight); - var imageHeight = this.options.height; - var imageWidth = parseInt(aspectRatio * imageHeight); - var center = map.project(map.getCenter()); - var offset = L.point(imageWidth, imageHeight).divideBy(2); - - if (this.options.corners) { - this._corners = this.options.corners; - } else { - this._corners = [map.unproject(center.subtract(offset)), map.unproject(center.add(L.point(offset.x, -offset.y))), map.unproject(center.add(L.point(-offset.x, offset.y))), map.unproject(center.add(offset))]; - } - - this._initialDimensions = { - 'center': center, - 'offset': offset, - 'zoom': map.getZoom() - }; - this.setBounds(L.latLngBounds(this.getCorners())); - }, - _singleClick: function _singleClick(e) { - if (e.type === 'singleclick') { - this.deselect(); - } else { - return; - } - }, - _singleClickListeners: function _singleClickListeners() { - var map = this._map; - L.DomEvent.off(map, 'click', this.deselect, this); - L.DomEvent.on(map, 'singleclick', this.deselect, this); - }, - _resetClickListeners: function _resetClickListeners() { - var map = this._map; - L.DomEvent.on(map, 'click', this.deselect, this); - L.DomEvent.off(map, 'singleclick', this.deselect, this); - }, - isSelected: function isSelected() { - return this._selected; - }, - deselect: function deselect() { - var edit = this.editing; - - if (!edit.enabled()) { - return; - } - - edit._removeToolbar(); - - edit._hideMarkers(); - - this._selected = false; - this.fire('deselect'); - return this; - }, - select: function select(e) { - var edit = this.editing; - var eP = this.eP; - - if (!edit.enabled()) { - return; - } - - if (e) { - L.DomEvent.stopPropagation(e); - } // this ensures deselection of all other images, allowing us to keep collection group optional - - - this._programmaticGrouping(); - - this._selected = true; - - edit._addToolbar(); - - edit._showMarkers(); - - this.fire('select'); // we run the selection logic 1st anyway because the collection group's _addToolbar method depends on it - - if (eP && eP.anyCollected()) { - this.deselect(); - return; - } - - return this; - }, - _programmaticGrouping: function _programmaticGrouping() { - this._map.eachLayer(function (layer) { - if (layer instanceof L.DistortableImageOverlay) { - layer.deselect(); - } - }); - }, - setCorner: function setCorner(corner, latlng) { - var edit = this.editing; - this._corners[corner] = latlng; - this.setBounds(L.latLngBounds(this.getCorners())); - this.fire('update'); - - if (edit.toolbar && edit.toolbar instanceof L.DistortableImage.PopupBar) { - edit._updateToolbarPos(); - } - - this.edited = true; - return this; - }, - _cornerExceedsMapLats: function _cornerExceedsMapLats(zoom, corner, map) { - if (map.options.crs.Simple == L.CRS.Simple) { - return false; - } else { - var exceedsTop; - var exceedsBottom; - - if (zoom === 0) { - exceedsTop = map.project(corner).y < 2; - exceedsBottom = map.project(corner).y >= 255; - } else { - exceedsTop = map.project(corner).y / zoom < 2; - exceedsBottom = map.project(corner).y / Math.pow(2, zoom) >= 255; - } - - return exceedsTop || exceedsBottom; - } - }, -<<<<<<< HEAD - activateTooltip: function activateTooltip() { ->>>>>>> 33ec3de (update) - if (!this._selected) { - this.bindTooltip(this.tooltipText, { - direction: 'top' - }).openTooltip(); - } - }, - closeToolTip: function closeToolTip() { - this.closeTooltip(); - }, - deactivateTooltip: function deactivateTooltip() { -======= - // SEGUN ------------------------------------------------------------------------------------------------------------------------------- - // Work in progress on this function - _activateTooltip: function _activateTooltip(ev) { - var index = 0; - var xAxis = []; // stores previous values of x coordinate - - var yAxis = []; // stores previous values of y coordinate, may be needed later - // let newPosX = 0; - - if (!this._selected) { - // Consider using "if (!this.selected)" instead - // console.log('mouseOVER_DONE/mouseMOVE_DONE-TOOLTIP-ACTIVATED'); // To be deleted - // console.log('x-axis:', ev.x); // To be deleted - // console.log('y-axis:', ev.y); // To be deleted - xAxis[index] = ev.x; - yAxis[index] = ev.y; // May be needed later - // newPosX = xAxis[index-1] - xAxis[index]; // - works but not perfect - // newPosX = (xAxis[index-1] - xAxis[index]) - ((xAxis[index])/4); // - better than above but not perfect - // newPosX =(xAxis[index-1] - xAxis[index]) - (xAxis[index] - this.imageWidth); // - works but no perfect - - ++index; - this.bindTooltip(this.tooltipText, { - sticky: true, - direction: 'top', - offset: L.point([ev.x - 700, ev.y - 500]) - }).openTooltip(); // POC only, work still in progress on this - hardcoded, works not perfect yet - } - }, - _closeTooltip: function _closeTooltip() { - // console.log('mouseOUT_DONE-TOOLTIP-CLOSED'); // To be deleted - this.closeTooltip(); - }, - _deactivateTooltip: function _deactivateTooltip() { - // console.log('MouseoverENDED & mousemoveENDED-TOOLTIP-DEACTIVATED'); - To be deleted - this.unbindTooltip(); - }, - setCorners: function setCorners(latlngObj) { - var map = this._map; - var zoom = map.getZoom(); - var edit = this.editing; - var i = 0; // this is to fix https://github.com/publiclab/Leaflet.DistortableImage/issues/402 - - for (var k in latlngObj) { - if (this._cornerExceedsMapLats(zoom, latlngObj[k], map)) { - // calling reset / update w/ the same corners bc it prevents a marker flicker for rotate - this.setBounds(L.latLngBounds(this.getCorners())); - this.fire('update'); - return; - } - } - - for (var _k in latlngObj) { - this._corners[i] = latlngObj[_k]; - i += 1; - } - - this.setBounds(L.latLngBounds(this.getCorners())); - this.fire('update'); - - if (edit.toolbar && edit.toolbar instanceof L.DistortableImage.PopupBar) { - edit._updateToolbarPos(); - } - - this.edited = true; - return this; - }, - setCornersFromPoints: function setCornersFromPoints(pointsObj) { - var map = this._map; - var zoom = map.getZoom(); - var edit = this.editing; - var i = 0; - - for (var k in pointsObj) { - var corner = map.layerPointToLatLng(pointsObj[k]); - - if (this._cornerExceedsMapLats(zoom, corner, map)) { - // calling reset / update w/ the same corners bc it prevents a marker flicker for rotate - this.setBounds(L.latLngBounds(this.getCorners())); - this.fire('update'); - return; - } - } - - for (var _k2 in pointsObj) { - this._corners[i] = map.layerPointToLatLng(pointsObj[_k2]); - i += 1; - } - - this.setBounds(L.latLngBounds(this.getCorners())); - this.fire('update'); - - if (edit.toolbar && edit.toolbar instanceof L.DistortableImage.PopupBar) { - edit._updateToolbarPos(); - } - - this.edited = true; - return this; - }, - scaleBy: function scaleBy(scale) { - var map = this._map; - var center = map.project(this.getCenter()); - var i; - var p; - var scaledCorners = {}; - - if (scale === 0) { - return; - } - - for (i = 0; i < 4; i++) { - p = map.project(this.getCorner(i)).subtract(center).multiplyBy(scale).add(center); - scaledCorners[i] = map.unproject(p); - } - - this.setCorners(scaledCorners); - return this; - }, - getAngle: function getAngle() { - var unit = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'deg'; - var matrix = this.getElement().style[L.DomUtil.TRANSFORM].split('matrix3d')[1].slice(1, -1).split(','); - var row0x = matrix[0]; - var row0y = matrix[1]; - var row1x = matrix[4]; - var row1y = matrix[5]; - var determinant = row0x * row1y - row0y * row1x; - var angle = L.TrigUtil.calcAngle(row0x, row0y, 'rad'); - - if (determinant < 0) { - angle += angle < 0 ? Math.PI : -Math.PI; - } - - if (angle < 0) { - angle = 2 * Math.PI + angle; - } - - return unit === 'deg' ? Math.round(L.TrigUtil.radiansToDegrees(angle)) : L.Util.formatNum(angle, 2); - }, - setAngle: function setAngle(angle) { - var unit = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'deg'; - var currentAngle = this.getAngle(unit); - var angleToRotateBy = angle - currentAngle; - this.rotateBy(angleToRotateBy, unit); - return this; - }, - rotateBy: function rotateBy(angle) { - var unit = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'deg'; - var map = this._map; - var center = map.project(this.getCenter()); - var corners = {}; - var i; - var p; - var q; - - if (unit === 'deg') { - angle = L.TrigUtil.degreesToRadians(angle); - } - - for (i = 0; i < 4; i++) { - p = map.project(this.getCorner(i)).subtract(center); - q = L.point(Math.cos(angle) * p.x - Math.sin(angle) * p.y, Math.sin(angle) * p.x + Math.cos(angle) * p.y); - corners[i] = map.unproject(q.add(center)); - } - - this.setCorners(corners); - return this; - }, - dragBy: function dragBy(formerPoint, newPoint) { - var map = this._map; - var i; - var p; - var transCorners = {}; - var delta = map.project(formerPoint).subtract(map.project(newPoint)); - - for (i = 0; i < 4; i++) { - p = map.project(this.getCorner(i)).subtract(delta); - transCorners[i] = map.unproject(p); - } - - this.setCorners(transCorners); - }, - restore: function restore() { - var map = this._map; - var center = this._initialDimensions.center; - var offset = this._initialDimensions.offset; - var zoom = this._initialDimensions.zoom; - var corners = [center.subtract(offset), center.add(L.point(offset.x, -offset.y)), center.add(L.point(-offset.x, offset.y)), center.add(offset)]; - - for (var i = 0; i < 4; i++) { - if (!map.unproject(corners[i], zoom).equals(this.getCorner(i))) { - this.setCorner(i, map.unproject(corners[i], zoom)); - } - } - - this.edited = false; - this.fire('restore'); - return this; - }, - - /* Copied from Leaflet v0.7 https://github.com/Leaflet/Leaflet/blob/66282f14bcb180ec87d9818d9f3c9f75afd01b30/src/dom/DomUtil.js#L189-L199 */ - - /* since L.DomUtil.getTranslateString() is deprecated in Leaflet v1.0 */ - _getTranslateString: function _getTranslateString(point) { - // on WebKit browsers (Chrome/Safari/iOS Safari/Android) - // using translate3d instead of translate - // makes animation smoother as it ensures HW accel is used. - // Firefox 13 doesn't care - // (same speed either way), Opera 12 doesn't support translate3d - var is3d = L.Browser.webkit3d; - var open = 'translate' + (is3d ? '3d' : '') + '('; - var close = (is3d ? ',0' : '') + ')'; - return open + point.x + 'px,' + point.y + 'px' + close; - }, - _reset: function _reset() { - var map = this._map; - var image = this.getElement(); - var latLngToLayerPoint = L.bind(map.latLngToLayerPoint, map); - - var transformMatrix = this._calculateProjectiveTransform(latLngToLayerPoint); - - var topLeft = latLngToLayerPoint(this.getCorner(0)); - var warp = L.DomUtil.getMatrixString(transformMatrix); - - var translation = this._getTranslateString(topLeft); - /* See L.DomUtil.setPosition. Mainly for the purposes of L.Draggable. */ - - - image._leaflet_pos = topLeft; - image.style[L.DomUtil.TRANSFORM] = [translation, warp].join(' '); - /* Set origin to the upper-left corner rather than - * the center of the image, which is the default. - */ - - image.style[L.DomUtil.TRANSFORM + '-origin'] = '0 0 0'; - this.rotation.deg = this.getAngle(); - this.rotation.rad = this.getAngle('rad'); - }, - - /* - * Calculates the transform string that will be - * correct *at the end* of zooming. - * Leaflet then generates a CSS3 animation between the current transform and - * future transform which makes the transition appear smooth. - */ - _animateZoom: function _animateZoom(event) { - var map = this._map; - var image = this.getElement(); - - var latLngToNewLayerPoint = function latLngToNewLayerPoint(latlng) { - return map._latLngToNewLayerPoint(latlng, event.zoom, event.center); - }; - - var transformMatrix = this._calculateProjectiveTransform(latLngToNewLayerPoint); - - var topLeft = latLngToNewLayerPoint(this.getCorner(0)); - var warp = L.DomUtil.getMatrixString(transformMatrix); - - var translation = this._getTranslateString(topLeft); - /* See L.DomUtil.setPosition. Mainly for the purposes of L.Draggable. */ - - - image._leaflet_pos = topLeft; - image.style[L.DomUtil.TRANSFORM] = [translation, warp].join(' '); - }, - getCorners: function getCorners() { - return this._corners; - }, - getCorner: function getCorner(i) { - return this._corners[i]; - }, - // image (vertex) centroid calculation - getCenter: function getCenter() { - var map = this._map; - var reduce = this.getCorners().reduce(function (agg, corner) { - return agg.add(map.project(corner)); - }, L.point(0, 0)); - return map.unproject(reduce.divideBy(4)); - }, - _calculateProjectiveTransform: function _calculateProjectiveTransform(latLngToCartesian) { - /* Setting reasonable but made-up image defaults - * allow us to place images on the map before - * they've finished downloading. */ - var offset = latLngToCartesian(this.getCorner(0)); - var w = this.getElement().offsetWidth || 500; - var h = this.getElement().offsetHeight || 375; - var c = []; - var j; - /* Convert corners to container points (i.e. cartesian coordinates). */ - - for (j = 0; j < 4; j++) { - c.push(latLngToCartesian(this.getCorner(j))._subtract(offset)); - } - /* - * This matrix describes the action of - * the CSS transform on each corner of the image. - * It maps from the coordinate system centered - * at the upper left corner of the image - * to the region bounded by the latlngs in this._corners. - * For example: - * 0, 0, c[0].x, c[0].y - * says that the upper-left corner of the image - * maps to the first latlng in this._corners. - */ - - - return L.MatrixUtil.general2DProjection(0, 0, c[0].x, c[0].y, w, 0, c[1].x, c[1].y, 0, h, c[2].x, c[2].y, w, h, c[3].x, c[3].y); - } -}); - -L.distortableImageOverlay = function (id, options) { - return new L.DistortableImageOverlay(id, options); -}; - -L.Map.addInitHook(function () { - if (!L.DomUtil.hasClass(this.getContainer(), 'ldi')) { - L.DomUtil.addClass(this.getContainer(), 'ldi'); - } -}); - -/***/ }), - -/***/ "./src/components/DistortableImage.Keymapper.js": -/*!******************************************************!*\ - !*** ./src/components/DistortableImage.Keymapper.js ***! - \******************************************************/ -/***/ (function() { - -var _this = this; - -L.DomUtil = L.DomUtil || {}; -L.DistortableImage = L.DistortableImage || {}; -L.distortableImage = L.DistortableImage; -L.DistortableImage.Keymapper = L.Handler.extend({ - options: { - position: 'topright' - }, - initialize: function initialize(map, options) { - this._map = map; - L.setOptions(this, options); - }, - addHooks: function addHooks() { - if (!this._keymapper) { - this._container = this._buildContainer(); - this._scrollWrapper = this._wrap(); - this._toggler = this._createButton(); - - this._setMapper(this._container, this._scrollWrapper, this._toggler); - - L.DomEvent.on(this._toggler, 'click', this._toggleKeymapper, this); - L.DomEvent.disableClickPropagation(this._container); - L.DomEvent.disableScrollPropagation(this._container); - } - }, - removeHooks: function removeHooks() { - if (this._keymapper) { - L.DomEvent.off(this._toggler, 'click', this._toggleKeymapper, this); - L.DomUtil.remove(this._toggler); - L.DomUtil.remove(this._scrollWrapper); - L.DomUtil.remove(this._container); - this._keymapper = false; - } - }, - _buildContainer: function _buildContainer() { - var container = L.DomUtil.create('div', 'ldi-keymapper-hide'); - container.setAttribute('id', 'ldi-keymapper'); - var divider = L.DomUtil.create('br', 'divider'); - container.appendChild(divider); - return container; - }, - _createButton: function _createButton() { - var toggler = L.DomUtil.create('a', ''); - toggler.innerHTML = L.IconUtil.create('keyboard_open'); - toggler.setAttribute('id', 'toggle-keymapper'); - toggler.setAttribute('href', '#'); - toggler.setAttribute('title', 'Show keymap'); // Will force screen readers like VoiceOver to read this as "Show keymap - button" - - toggler.setAttribute('role', 'button'); - toggler.setAttribute('aria-label', 'Show keymap'); - return toggler; - }, - _wrap: function _wrap() { - var wrap = L.DomUtil.create('div', ''); - wrap.setAttribute('id', 'keymapper-wrapper'); - wrap.style.display = 'none'; - return wrap; - }, - _setMapper: function _setMapper(container, wrap, button) { - this._keymapper = L.control({ - position: this.options.position - }); - - this._keymapper.onAdd = function () { - container.appendChild(wrap); - wrap.insertAdjacentHTML('beforeend', '' + '
' + - /* eslint-disable */ - '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '
Rotate Mode
R
RotateScale Mode
r
Scale Mode
s
Distort Mode
d
Drag Mode
D
Lock (Mode) / Unlock Image
l\xa0u
Stack up / down
q\xa0a
Add / Remove Image Border
b
Toggle Opacity
o
Deselect All
esc
Delete Image(s)
delete\xa0backspace
Export Image(s)
e
'); - /* eslint-enable */ - - container.appendChild(button); - return container; - }; - - this._keymapper.addTo(this._map); - }, - _toggleKeymapper: function _toggleKeymapper(e) { - e.preventDefault(); - this._container.className = this._container.className === 'ldi-keymapper leaflet-control' ? 'ldi-keymapper-hide leaflet-control' : 'ldi-keymapper leaflet-control'; - this._scrollWrapper.style.display = this._scrollWrapper.style.display === 'none' ? 'block' : 'none'; - this._toggler.innerHTML = this._toggler.innerHTML === 'close' ? L.IconUtil.create('keyboard_open') : 'close'; - L.IconUtil.toggleTitle(this._toggler, 'Show keymap', 'Hide keymap'); - L.DomUtil.toggleClass(this._toggler, 'close-icon'); - }, - _injectIconSet: function _injectIconSet() { - if (document.querySelector('#keymapper-iconset')) { - return; - } - - var el = L.DomUtil.create('div', ''); - el.id = 'keymapper-iconset'; - el.setAttribute('hidden', 'hidden'); - this._iconset = new L.KeymapperIconSet().render(); - el.innerHTML = this._iconset; - document.querySelector('.leaflet-control-container').appendChild(el); - } -}); -L.DistortableImage.Keymapper.addInitHook(function () { - L.DistortableImage.Keymapper.prototype._n = L.DistortableImage.Keymapper.prototype._n ? L.DistortableImage.Keymapper.prototype._n + 1 : 1; // dont enable keymapper for mobile - - if (L.DistortableImage.Keymapper.prototype._n === 1 && !L.Browser.mobile) { - _this.enable(); - - _this._injectIconSet(); - } -}); - -L.distortableImage.keymapper = function (map, options) { - return new L.DistortableImage.Keymapper(map, options); -}; - -/***/ }), - -/***/ "./src/edit/DistortableCollection.Edit.js": -/*!************************************************!*\ - !*** ./src/edit/DistortableCollection.Edit.js ***! - \************************************************/ -/***/ (function() { - -L.DistortableImage = L.DistortableImage || {}; // this class holds the keybindings and toolbar API for an image collection instance - -L.DistortableCollection.Edit = L.Handler.extend({ - options: { - keymap: L.distortableImage.group_action_map - }, - initialize: function initialize(group, options) { - this._group = group; - this._exportOpts = group.options.exportOpts; - L.setOptions(this, options); - L.distortableImage.group_action_map.Escape = '_decollectAll'; - }, - addHooks: function addHooks() { - var group = this._group; - var map = group._map; - this.editActions = this.options.actions; - this.runExporter = L.bind(L.Utils.getNestedVal(this, '_exportOpts', 'exporter') || this.startExport, this); - L.DomEvent.on(document, 'keydown', this._onKeyDown, this); - - if (!(map.doubleClickZoom.enabled() || map.doubleClickLabels.enabled())) { - L.DomEvent.on(map, 'click', this._decollectAll, this); - } - - L.DomEvent.on(map, { - singleclickon: this._singleClickListeners, - singleclickoff: this._resetClickListeners, - singleclick: this._singleClick, - boxcollectend: this._addCollections - }, this); - this._group.editable = true; - - this._group.eachLayer(function (layer) { - return layer.editing.enable(); - }); - }, - removeHooks: function removeHooks() { - var group = this._group; - var map = group._map; - L.DomEvent.off(document, 'keydown', this._onKeyDown, this); - - if (!(map.doubleClickZoom.enabled() || map.doubleClickLabels.enabled())) { - L.DomEvent.off(map, 'click', this._decollectAll, this); - } - - L.DomEvent.off(map, { - singleclickon: this._singleClickListeners, - singleclickoff: this._resetClickListeners, - singleclick: this._singleClick, - boxcollectend: this._addCollections - }, this); - - this._decollectAll(); - - this._group.editable = false; - - this._group.eachLayer(function (layer) { - return layer.editing.disable(); - }); - }, - enable: function enable() { - this._enabled = true; - this.addHooks(); - return this; - }, - disable: function disable() { - this._enabled = false; - this.removeHooks(); - return this; - }, - _onKeyDown: function _onKeyDown(e) { - var keymap = this.options.keymap; - var handlerName = keymap[e.key]; - - if (!this[handlerName]) { - return; - } - - if (this._group.anyCollected()) { - this[handlerName].call(this); - } - }, - _singleClick: function _singleClick(e) { - if (e.type === 'singleclick') { - this._decollectAll(e); - } else { - return; - } - }, - _singleClickListeners: function _singleClickListeners() { - var map = this._group._map; - L.DomEvent.off(map, 'click', this._decollectAll, this); - L.DomEvent.on(map, 'singleclick', this._decollectAll, this); - }, - _resetClickListeners: function _resetClickListeners() { - var map = this._group._map; - L.DomEvent.on(map, 'click', this._decollectAll, this); - L.DomEvent.off(map, 'singleclick', this._decollectAll, this); - }, - _decollectAll: function _decollectAll(e) { - var oe; - - if (e) { - oe = e.originalEvent; - } - /** - * prevents image deselection following the 'boxcollectend' event - note 'shift' must not be released until dragging is complete - * also prevents deselection following a click on a disabled img by differentiating it from the map - */ - - - if (oe && (oe.shiftKey || oe.target instanceof HTMLImageElement)) { - return; - } - - this._group.eachLayer(function (layer) { - L.DomUtil.removeClass(layer.getElement(), 'collected'); - layer.deselect(); - }); - - this._removeToolbar(); - - if (e) { - L.DomEvent.stopPropagation(e); - } - }, - _unlockGroup: function _unlockGroup() { - var _this = this; - - if (!this.hasTool(L.UnlockAction)) { - return; - } - - this._group.eachLayer(function (layer) { - if (_this._group.isCollected(layer)) { - var edit = layer.editing; - - edit._unlock(); // unlock updates the layer's handles; deselect to ensure they're hidden - - - layer.deselect(); - } - }); - }, - _lockGroup: function _lockGroup() { - var _this2 = this; - - if (!this.hasTool(L.LockAction)) { - return; - } - - this._group.eachLayer(function (layer) { - if (_this2._group.isCollected(layer)) { - var edit = layer.editing; - - edit._lock(); // map.addLayer also deselects the image, so we reselect here - - - L.DomUtil.addClass(layer.getElement(), 'collected'); - } - }); - }, - _addCollections: function _addCollections(e) { - var _this3 = this; - - var box = e.boxCollectBounds; - var map = this._group._map; - - this._group.eachLayer(function (layer) { - var edit = layer.editing; - - if (layer.isSelected()) { - layer.deselect(); - } - - var zoom = map.getZoom(); - var center = map.getCenter(); - var imgBounds = L.latLngBounds(layer.getCorner(2), layer.getCorner(1)); - imgBounds = map._latLngBoundsToNewLayerBounds(imgBounds, zoom, center); - - if (box.intersects(imgBounds) && edit.enabled()) { - if (!_this3.toolbar) { - _this3._addToolbar(); - } - - L.DomUtil.addClass(layer.getElement(), 'collected'); - } - }); - }, - _removeGroup: function _removeGroup(e) { - var _this4 = this; - - if (!this.hasTool(L.DeleteAction)) { - return; - } - - var layersToRemove = this._group._toRemove(); - - var n = layersToRemove.length; - - if (n === 0) { - return; - } - - var choice = L.DomUtil.confirmDeletes(n); - - if (choice) { - layersToRemove.forEach(function (layer) { - _this4._group.removeLayer(layer); - }); - - if (!this._group.anyCollected()) { - this._removeToolbar(); - } - } - - if (e) { - L.DomEvent.stopPropagation(e); - } - }, - cancelExport: function cancelExport() { - if (!this.customCollection) { - this._exportOpts.collection = undefined; - } - - clearInterval(this.updateInterval); - }, - _addToolbar: function _addToolbar() { - var group = this._group; - var map = group._map; - - if (group.options.suppressToolbar || this.toolbar) { - return; - } - - this.toolbar = L.distortableImage.controlBar({ - actions: this.editActions, - position: 'topleft' - }).addTo(map, group); - }, - _removeToolbar: function _removeToolbar() { - var map = this._group._map; - - if (this.toolbar) { - map.removeLayer(this.toolbar); - this.toolbar = false; - } else { - return false; - } - }, - hasTool: function hasTool(value) { - return this.editActions.some(function (action) { - return action === value; - }); - }, - addTool: function addTool(value) { - if (value.baseClass === 'leaflet-toolbar-icon' && !this.hasTool(value)) { - this._removeToolbar(); - - this.editActions.push(value); - - this._addToolbar(); - } - - return this; - }, - removeTool: function removeTool(value) { - var _this5 = this; - - this.editActions.some(function (item, idx) { - if (_this5.editActions[idx] === value) { - _this5._removeToolbar(); - - _this5.editActions.splice(idx, 1); - - _this5._addToolbar(); - - return true; - } else { - return false; - } - }); - return this; - }, - startExport: function startExport() { - var _this6 = this; - - if (!this.hasTool(L.ExportAction)) { - return; - } - - return new Promise(function (resolve) { - var opts = _this6._exportOpts; - opts.resolve = resolve; // allow resolving promise in user-defined functions, to stop spinner on completion - - var statusUrl; - _this6.updateInterval = null; // this may be overridden to update the UI to show export progress or completion - - var _defaultUpdater = function _defaultUpdater(data) { - data = JSON.parse(data); // optimization: fetch status directly from google storage: - - if (data.status_url) { - if (statusUrl !== data.status_url && data.status_url.match('.json')) { - // if (data.status_url && data.status_url.substr(0,1) === "/") { - // opts.statusUrl = opts.statusUrl + data.status_url; - // } else { - statusUrl = data.status_url; // } - } - - if (data.status === 'complete') { - clearInterval(_this6.updateInterval); - - if (!_this6.customCollection) { - _this6._exportOpts.collection = undefined; - } - - resolve(); - - if (data.jpg !== null) { - alert('Export succeeded. ' + opts.exportUrl + data.jpg); - } - } // TODO: update to clearInterval when status == "failed" if we update that in this file: - // https://github.com/publiclab/mapknitter-exporter/blob/main/lib/mapknitterExporter.rb - - - console.log(data); - } - }; // receives the URL of status.json, and starts running the updater to repeatedly fetch from status.json; - // this may be overridden to integrate with any UI - - - var _defaultHandleStatusRes = function _defaultHandleStatusRes(data) { - statusUrl = opts.statusUrl + data; // repeatedly fetch the status.json - - _this6.updateInterval = setInterval(function () { - var reqOpts = { - method: 'GET' - }; - var req = new Request("".concat(statusUrl, "?").concat(Date.now()), reqOpts); - fetch(req).then(function (res) { - if (res.ok) { - return res.text(); - } - }).then(opts.updater); - }, opts.frequency); - }; // initiate the export - - - var _defaultFetchStatusUrl = function _defaultFetchStatusUrl(mergedOpts) { - var form = new FormData(); - form.append('collection', JSON.stringify(mergedOpts.collection)); - form.append('scale', mergedOpts.scale); - form.append('upload', true); - var reqOpts = { - method: 'POST', - body: form - }; - var req = new Request(mergedOpts.exportStartUrl, reqOpts); - fetch(req).then(function (res) { - if (res.ok) { - return res.text(); - } - }).then(mergedOpts.handleStatusRes); - }; // If the user has passed collection property - - - _this6.customCollection = !!opts.collection; - - if (!_this6.customCollection) { - opts.collection = _this6._group.generateExportJson().images; - } - - opts.frequency = opts.frequency || 3000; - opts.scale = opts.scale || 100; // switch it to _getAvgCmPerPixel ! - - opts.updater = opts.updater || _defaultUpdater; - opts.handleStatusRes = opts.handleStatusRes || _defaultHandleStatusRes; - opts.fetchStatusUrl = opts.fetchStatusUrl || _defaultFetchStatusUrl; - opts.fetchStatusUrl(opts); - }); - } -}); - -L.distortableCollection.edit = function (group, options) { - return new L.DistortableCollection.Edit(group, options); -}; - -/***/ }), - -/***/ "./src/edit/DistortableImage.Edit.js": -/*!*******************************************!*\ - !*** ./src/edit/DistortableImage.Edit.js ***! - \*******************************************/ -/***/ (function() { - -L.DistortableImage = L.DistortableImage || {}; // holds the keybindings & toolbar API for an individual image instance - -L.DistortableImage.Edit = L.Handler.extend({ - options: { - opacity: 0.7, - outline: '1px solid red', - keymap: L.distortableImage.action_map - }, - initialize: function initialize(overlay, options) { - this._overlay = overlay; - this._toggledImage = false; - this._mode = overlay.options.mode; - this._transparent = false; - this._outlined = false; - L.setOptions(this, options); - L.distortableImage.action_map.Escape = '_deselect'; - }, - - /* Run on image selection. */ - addHooks: function addHooks() { - var overlay = this._overlay; - this.editActions = this.options.actions; - /* bring the selected image into view */ - - overlay.bringToFront(); - - this._initModes(); - - this._initHandles(); - - this._appendHandlesandDragable(); - - if (overlay.isSelected() && !overlay.options.suppressToolbar) { - this._addToolbar(); - } - - this.parentGroup = overlay.eP ? overlay.eP : false; - L.DomEvent.on(overlay.getElement(), { - dblclick: this.nextMode - }, this); - L.DomEvent.on(window, 'keydown', this._onKeyDown, this); - }, - - /* Run on image deselection. */ - removeHooks: function removeHooks() { - var overlay = this._overlay; - var eP = this.parentGroup; // First, check if dragging exists - it may be off due to locking - - this._disableDragging(); - - if (this.toolbar) { - this._removeToolbar(); - } - - for (var handle in this._handles) { - L.DomUtil.remove(handle); - } - /** - * ensures if you disable an image while it is multi-selected - * additional deselection logic is run - */ - - - if (L.DomUtil.hasClass(overlay.getElement(), 'collected')) { - L.DomUtil.removeClass(overlay.getElement(), 'collected'); - } - - if (eP && !eP.anyCollected() && eP.editing.toolbar) { - eP.editing._removeToolbar(); - } - - L.DomEvent.off(overlay.getElement(), { - dblclick: this.nextMode - }, this); - L.DomEvent.off(window, 'keydown', this._onKeyDown, this); - }, - disable: function disable() { - if (!this._enabled) { - return this; - } - - this._overlay.deselect(); - - this._enabled = false; - this.removeHooks(); - return this; - }, - _initModes: function _initModes() { - this._modes = {}; // passed from L.DistortablImage.PopupBar. If the mode is one - // of the current toolbar actions, adds it to this._modes - - for (var mode in L.DistortableImage.Edit.MODES) { - var action = L.DistortableImage.Edit.MODES[mode]; - - if (this.editActions.indexOf(action) !== -1) { - this._modes[mode] = action; - } - } // sets the current mode to the 1st available one if the one selected - // during initialization is not available - - - if (!this._modes[this._mode]) { - this._mode = Object.keys(this._modes)[0]; - } - }, - _initHandles: function _initHandles() { - var overlay = this._overlay; - var i; - this._dragHandles = L.layerGroup(); - - for (i = 0; i < 4; i++) { - this._dragHandles.addLayer(L.dragHandle(overlay, i)); - } - - this._scaleHandles = L.layerGroup(); - - for (i = 0; i < 4; i++) { - this._scaleHandles.addLayer(L.scaleHandle(overlay, i)); - } - - this._distortHandles = L.layerGroup(); - - for (i = 0; i < 4; i++) { - this._distortHandles.addLayer(L.distortHandle(overlay, i)); - } - - this._rotateHandles = L.layerGroup(); // individual rotate - - for (i = 0; i < 4; i++) { - this._rotateHandles.addLayer(L.rotateHandle(overlay, i)); - } // handle includes rotate AND scale - - - this._freeRotateHandles = L.layerGroup(); - - for (i = 0; i < 4; i++) { - this._freeRotateHandles.addLayer(L.freeRotateHandle(overlay, i)); - } - - this._lockHandles = L.layerGroup(); - - for (i = 0; i < 4; i++) { - this._lockHandles.addLayer(L.lockHandle(overlay, i, { - draggable: false - })); - } - - this._handles = { - drag: this._dragHandles, - scale: this._scaleHandles, - distort: this._distortHandles, - rotate: this._rotateHandles, - freeRotate: this._freeRotateHandles, - lock: this._lockHandles - }; - }, - _appendHandlesandDragable: function _appendHandlesandDragable() { - var ov = this._overlay; // won't throw error if user adds 0 mode actions to toolbar - - if (!this._mode) { - this._enableDragging(); - - return; - } - - this._updateHandle(); - - if (!ov.isSelected() && this.currentHandle) { - this.currentHandle.eachLayer(function (handle) { - handle.setOpacity(0); - - if (handle.dragging) { - handle.dragging.disable(); - } - }); - } - - if (!this.isMode('lock')) { - this._enableDragging(); - } - }, - _onKeyDown: function _onKeyDown(e) { - var keymap = this.options.keymap; - var handlerName = keymap[e.key]; - var ov = this._overlay; - var eP = this.parentGroup; - - if (eP && eP.anyCollected()) { - return; - } - - if (this[handlerName] !== undefined && !ov.options.suppressToolbar) { - if (ov.isSelected() && this.toolbar) { - this[handlerName].call(this); - } - } - }, - replaceTool: function replaceTool(old, next) { - var _this = this; - - if (next.baseClass !== 'leaflet-toolbar-icon' || this.hasTool(next)) { - return this; - } - - this.editActions.some(function (item, idx) { - if (item === old) { - _this._removeToolbar(); - - _this.editActions[idx] = next; - - _this._addToolbar(); - - for (var mode in L.DistortableImage.Edit.MODES) { - if (L.DistortableImage.Edit.MODES[mode] === old) { - delete _this._modes[mode]; - - _this._nextOrNone(mode); - } else if (L.DistortableImage.Edit.MODES[mode] === next) { - _this._modes[mode] = next; - } - } - - return true; - } - }); - return this; - }, - addTool: function addTool(value) { - if (value.baseClass === 'leaflet-toolbar-icon' && !this.hasTool(value)) { - this._removeToolbar(); - - this.editActions.push(value); - - this._addToolbar(); - - for (var mode in L.DistortableImage.Edit.MODES) { - if (L.DistortableImage.Edit.MODES[mode] === value) { - this._modes[mode] = value; - } - } - - if (!this._overlay.isSelected()) { - this._removeToolbar(); - } - } - - return this; - }, - hasTool: function hasTool(value) { - return this.editActions.some(function (action) { - return action === value; - }); - }, - removeTool: function removeTool(value) { - var _this2 = this; - - this.editActions.some(function (item, idx) { - if (item === value) { - _this2._removeToolbar(); - - _this2.editActions.splice(idx, 1); - - _this2._addToolbar(); - - for (var mode in L.DistortableImage.Edit.MODES) { - if (L.DistortableImage.Edit.MODES[mode] === value) { - delete _this2._modes[mode]; - - _this2._nextOrNone(mode); - } - } - - return true; - } - }); - - if (!this._overlay.isSelected()) { - this._removeToolbar(); - } - - return this; - }, - // set the mode to the next mode or if that was the last one set mode to '' - _nextOrNone: function _nextOrNone(mode) { - if (this.isMode(mode)) { - if (Object.keys(this.getModes()).length >= 1) { - this.nextMode(); - } else { - if (mode === 'lock') { - this._enableDragging(); - } - - this._mode = ''; - - this._updateHandle(); - } - } - }, - _removeToolbar: function _removeToolbar() { - var ov = this._overlay; - var map = ov._map; - - if (this.toolbar) { - map.removeLayer(this.toolbar); - this.toolbar = false; - } - }, - _enableDragging: function _enableDragging() { - var _this3 = this; - - var overlay = this._overlay; - var map = overlay._map; - this.dragging = new L.Draggable(overlay.getElement()); - this.dragging.enable(); - /* Hide toolbars and markers while dragging; click will re-show it */ - - this.dragging.on('dragstart', function () { - overlay.fire('dragstart'); - - _this3._removeToolbar(); - }); - /* - * Adjust default behavior of L.Draggable, which overwrites the CSS3 - * distort transformations that we set when it calls L.DomUtil.setPosition. - */ - - this.dragging._updatePosition = function () { - var topLeft = overlay.getCorner(0); - - var delta = this._newPos.subtract(map.latLngToLayerPoint(topLeft)); - - var currentPoint; - var corners = {}; - var i; - this.fire('predrag'); - - for (i = 0; i < 4; i++) { - currentPoint = map.latLngToLayerPoint(overlay.getCorner(i)); - corners[i] = map.layerPointToLatLng(currentPoint.add(delta)); - } - - overlay.setCorners(corners); - overlay.fire('drag'); - this.fire('drag'); - }; - - this.dragging.on('dragend', function () { - overlay.fire('dragend'); - }); - }, - _disableDragging: function _disableDragging() { - if (this.dragging) { - this.dragging.disable(); - delete this.dragging; - } - }, - _dragMode: function _dragMode() { - this.setMode('drag'); - }, - _scaleMode: function _scaleMode() { - this.setMode('scale'); - }, - _distortMode: function _distortMode() { - this.setMode('distort'); - }, - _rotateMode: function _rotateMode() { - this.setMode('rotate'); - }, - _freeRotateMode: function _freeRotateMode() { - this.setMode('freeRotate'); - }, - _toggleLockMode: function _toggleLockMode() { - if (this.isMode('lock')) { - this._unlock(); - } else { - this._lock(); - } - }, - _toggleOpacity: function _toggleOpacity() { - var image = this._overlay.getElement(); - - if (!this.hasTool(L.OpacityAction)) { - return; - } - - this._transparent = !this._transparent; - var opacity = this._transparent ? this.options.opacity : 1; - L.DomUtil.setOpacity(image, opacity); - image.setAttribute('opacity', opacity); - - this._refresh(); - }, - _toggleBorder: function _toggleBorder() { - var image = this._overlay.getElement(); - - if (!this.hasTool(L.BorderAction)) { - return; - } - - this._outlined = !this._outlined; - var outline = this._outlined ? this.options.outline : 'none'; - image.style.outline = outline; - - this._refresh(); - }, - // compare this to using overlay zIndex - _toggleOrder: function _toggleOrder() { - if (this._toggledImage) { - this._stackUp(); - } else { - this._stackDown(); - } - }, - _removeOverlay: function _removeOverlay() { - var ov = this._overlay; - var eP = this.parentGroup; - - if (this.isMode('lock') || !this.hasTool(L.DeleteAction)) { - return; - } - - var choice = L.DomUtil.confirmDelete(); - - if (!choice) { - return; - } - - this._removeToolbar(); - - if (eP) { - eP.removeLayer(ov); - } else { - ov._map.removeLayer(ov); - } - }, - // Based on https://github.com/publiclab/mapknitter/blob/8d94132c81b3040ae0d0b4627e685ff75275b416/app/assets/javascripts/mapknitter/Map.js#L47-L82 - _getExport: function _getExport() { - var overlay = this._overlay; - var map = overlay._map; - var img = overlay.getElement(); - - if (!this.hasTool(L.ExportAction)) { - return; - } // make a new image - - - var downloadable = new Image(); - downloadable.id = downloadable.id || 'tempId12345'; - document.body.appendChild(downloadable); - - downloadable.onload = function onLoadDownloadableImage() { - var height = downloadable.height; - var width = downloadable.width; - var nw = map.latLngToLayerPoint(overlay.getCorner(0)); - var ne = map.latLngToLayerPoint(overlay.getCorner(1)); - var sw = map.latLngToLayerPoint(overlay.getCorner(2)); - var se = map.latLngToLayerPoint(overlay.getCorner(3)); // I think this is to move the image to the upper left corner, - // eslint-disable-next-line max-len - // jywarren: i think we may need these or the image goes off the edge of the canvas - // jywarren: but these seem to break the distortion math... - // jywarren: i think it should be rejiggered so it - // finds the most negative values of x and y and then - // adds those to all coordinates - // nw.x -= nw.x; - // ne.x -= nw.x; - // se.x -= nw.x; - // sw.x -= nw.x; - // nw.y -= nw.y; - // ne.y -= nw.y; - // se.y -= nw.y; - // sw.y -= nw.y; - // run once warping is complete - - downloadable.onload = function () { - L.DomUtil.remove(downloadable); - }; - - if (window && window.hasOwnProperty('warpWebGl')) { - warpWebGl(downloadable.id, [0, 0, width, 0, width, height, 0, height], [nw.x, nw.y, ne.x, ne.y, se.x, se.y, sw.x, sw.y], true // trigger download - ); - } - }; - - downloadable.src = overlay.options.fullResolutionSrc || img.src; - }, - _stackUp: function _stackUp() { - var t = this._toggledImage; - - if (!t || !this.hasTool(L.StackAction)) { - return; - } - - this._toggledImage = false; - - this._overlay.bringToFront(); - - this._refresh(); - }, - _stackDown: function _stackDown() { - var t = this._toggledImage; - - if (t || !this.hasTool(L.StackAction)) { - return; - } - - this._toggledImage = true; - - this._overlay.bringToBack(); - - this._refresh(); - }, - _unlock: function _unlock() { - var ov = this._overlay; - var map = ov._map; - var eP = this.parentGroup; - - if (!this.isMode('lock')) { - return; - } - - if (eP && !eP.isCollected(ov) || !eP) { - if (!this.hasTool(L.LockAction)) { - return; - } - } - - if (this.currentHandle) { - map.removeLayer(this.currentHandle); - } - - if (ov.options.mode === 'lock' || !this.hasMode(ov.options.mode)) { - this._mode = ''; - this.currentHandle = ''; - } else { - this._mode = ov.options.mode; - } - - this._updateHandle(); - - this._enableDragging(); - - this._refresh(); - }, - _lock: function _lock() { - var ov = this._overlay; - var map = ov._map; - var eP = this.parentGroup; - - if (this.isMode('lock')) { - return; - } - - if (eP && !eP.isCollected(ov) || !eP) { - if (!this.hasTool(L.LockAction)) { - return; - } - } - - if (this.currentHandle) { - map.removeLayer(this.currentHandle); - } - - this._mode = 'lock'; - - this._updateHandle(); - - this._disableDragging(); - - this._refresh(); - }, - _deselect: function _deselect() { - this._overlay.deselect(); - }, - _showMarkers: function _showMarkers(e) { - var eP = this.parentGroup; - - if (!this.currentHandle) { - return; - } // only markers we want in collect interface for now is lock - - - if (!this.isMode('lock') && eP && eP.anyCollected()) { - return; - } - - this.currentHandle.eachLayer(function (handle) { - handle.setOpacity(1); - - if (handle.dragging) { - handle.dragging.enable(); - } - - L.DomUtil.addClass(handle.getElement(), 'leaflet-interactive'); - }); - }, - _hideMarkers: function _hideMarkers() { - var ov = this._overlay; - var eP = this.parentGroup; // workaround for race condition w/ feature group - - if (!this._handles) { - this._initHandles(); - } - - if (!this.currentHandle) { - return; - } - - if (this.isMode('lock') && eP && eP.isCollected(ov)) { - return; - } - - this.currentHandle.eachLayer(function (handle) { - handle.setOpacity(0); - - if (handle.dragging) { - handle.dragging.disable(); - } - - L.DomUtil.removeClass(handle.getElement(), 'leaflet-interactive'); - }); - }, - _updateHandle: function _updateHandle() { - var ov = this._overlay; - var map = ov._map; - var mode = this.getMode(); - - if (this.currentHandle) { - map.removeLayer(this.currentHandle); - } - - this.currentHandle = mode === '' ? '' : this._handles[mode]; - - if (this.currentHandle !== '') { - map.addLayer(this.currentHandle); - } - }, - _addToolbar: function _addToolbar() { - var ov = this._overlay; - var eP = this.parentGroup; - var map = ov._map; // Find the topmost point on the image. - - var corners = ov.getCorners(); - var maxLat = -Infinity; - - if (eP && eP.anyCollected()) { - eP.editing._addToolbar(); - - return; - } - - if (ov.options.suppressToolbar || this.toolbar) { - return; - } - - for (var i = 0; i < corners.length; i++) { - if (corners[i].lat > maxLat) { - maxLat = corners[i].lat; - } - } // Longitude is based on the centroid of the image. - - - var raisedPoint = ov.getCenter(); - raisedPoint.lat = maxLat; - this.toolbar = L.distortableImage.popupBar(raisedPoint, { - actions: this.editActions - }).addTo(map, ov); - ov.fire('toolbar:created'); - }, - _refresh: function _refresh() { - if (this.toolbar) { - this._removeToolbar(); - } - - this._addToolbar(); - }, - _updateToolbarPos: function _updateToolbarPos() { - var overlay = this._overlay; // Find the topmost point on the image. - - var corners = overlay.getCorners(); - var toolbar = this.toolbar; - var maxLat = -Infinity; - - if (toolbar && toolbar instanceof L.DistortableImage.PopupBar) { - for (var i = 0; i < corners.length; i++) { - if (corners[i].lat > maxLat) { - maxLat = corners[i].lat; - } - } // Longitude is based on the centroid of the image. - - - var raisedPoint = overlay.getCenter(); - raisedPoint.lat = maxLat; - - if (!overlay.options.suppressToolbar) { - this.toolbar.setLatLng(raisedPoint); - } - } - }, - hasMode: function hasMode(mode) { - return !!this._modes[mode]; - }, - getMode: function getMode() { - if (!this.enabled()) { - return; - } - - return this._mode; - }, - getModes: function getModes() { - return this._modes; - }, - isMode: function isMode(mode) { - if (!this.enabled()) { - return false; - } - - return this._mode === mode; - }, - setMode: function setMode(newMode) { - var ov = this._overlay; - var eP = this.parentGroup; - var mode = this.getMode(); - - if (mode === newMode || !this.hasMode(newMode) || !this.enabled()) { - return; - } - - if (this.toolbar) { - this.toolbar.clickTool(newMode); - } - - if (this.isMode('lock') && !this.dragging) { - this._enableDragging(); - } - - this._mode = newMode; - - if (this.isMode('lock')) { - this._disableDragging(); - } - - this._updateHandle(); - - this._refresh(); - - if (eP && eP.isCollected(ov)) { - ov.deselect(); - } - - return this; - }, - - /** - * need to attach a stop to img dblclick or it will propagate to - * the map and fire the handler that shows map location labels on map dblclick. - */ - nextMode: function nextMode(e) { - var mode = this.getMode(); - var eP = this.parentGroup; - var modesArray = Object.keys(this.getModes()); - var idx = modesArray.indexOf(mode); - var nextIdx = (idx + 1) % modesArray.length; - var newMode = modesArray[nextIdx]; - - if (e) { - if (eP && eP.anyCollected()) { - return; - } - - L.DomEvent.stop(e); - } - - return this.setMode(newMode); - } -}); - -L.distortableImage.edit = function (overlay, options) { - return new L.DistortableImage.Edit(overlay, options); -}; - -/***/ }), - -/***/ "./src/edit/actions/BorderAction.js": -/*!******************************************!*\ - !*** ./src/edit/actions/BorderAction.js ***! - \******************************************/ -/***/ (function() { - -L.BorderAction = L.EditAction.extend({ - initialize: function initialize(map, overlay, options) { - var edit = overlay.editing; - var mode = edit._mode; - var use; - var tooltip; - - if (edit._outlined) { - use = 'border_outer'; - tooltip = overlay.options.translation.removeBorder; - } else { - use = 'border_clear'; - tooltip = overlay.options.translation.addBorder; - } - - options = options || {}; - options.toolbarIcon = { - svg: true, - html: use, - tooltip: tooltip, - className: mode === 'lock' ? 'disabled' : '' - }; // conditional for disabling keybindings for this action when the image is locked. - - L.DistortableImage.action_map.b = mode === 'lock' ? '' : '_toggleBorder'; - L.EditAction.prototype.initialize.call(this, map, overlay, options); - }, - addHooks: function addHooks() { - var edit = this._overlay.editing; - L.IconUtil.toggleXlink(this._link, 'border_clear', 'border_outer'); - L.IconUtil.toggleTitle(this._link, 'Remove Border', 'Add Border'); - - edit._toggleBorder(); - } -}); - -/***/ }), - -/***/ "./src/edit/actions/DeleteAction.js": -/*!******************************************!*\ - !*** ./src/edit/actions/DeleteAction.js ***! - \******************************************/ -/***/ (function() { - -L.DeleteAction = L.EditAction.extend({ - initialize: function initialize(map, overlay, options) { - var edit = overlay.editing; - var use = 'delete_forever'; - var tooltip; - /** - * we can tell whether the overlay is an instance of `L.DistortableImageOverlay` or `L.DistortableCollection` bc only - * the former should have `parentGroup` defined on it. From there we call the apporpriate keybindings and methods. - */ - - if (edit instanceof L.DistortableImage.Edit) { - tooltip = overlay.options.translation.deleteImage; // backspace windows / delete mac - - L.DistortableImage.action_map.Backspace = edit._mode === 'lock' ? '' : '_removeOverlay'; - } else { - tooltip = overlay.options.translation.deleteImages; - L.DistortableImage.group_action_map.Backspace = edit._mode === 'lock' ? '' : '_removeGroup'; - } - - options = options || {}; - options.toolbarIcon = { - svg: true, - html: use, - tooltip: tooltip, - className: edit._mode === 'lock' ? 'disabled' : '' - }; - L.EditAction.prototype.initialize.call(this, map, overlay, options); - }, - addHooks: function addHooks() { - var edit = this._overlay.editing; - - if (edit instanceof L.DistortableImage.Edit) { - edit._removeOverlay(); - } else { - edit._removeGroup(); - } - } -}); - -/***/ }), - -/***/ "./src/edit/actions/DistortAction.js": -/*!*******************************************!*\ - !*** ./src/edit/actions/DistortAction.js ***! - \*******************************************/ -/***/ (function() { - -L.DistortAction = L.EditAction.extend({ - initialize: function initialize(map, overlay, options) { - options = options || {}; - options.toolbarIcon = { - svg: true, - html: 'distort', - tooltip: overlay.options.translation.distortImage, - className: 'distort' - }; - L.DistortableImage.action_map.d = '_distortMode'; - L.EditAction.prototype.initialize.call(this, map, overlay, options); - }, - addHooks: function addHooks() { - var edit = this._overlay.editing; - - edit._distortMode(); - } -}); - -/***/ }), - -/***/ "./src/edit/actions/DragAction.js": -/*!****************************************!*\ - !*** ./src/edit/actions/DragAction.js ***! - \****************************************/ -/***/ (function() { - -L.DragAction = L.EditAction.extend({ - initialize: function initialize(map, overlay, options) { - options = options || {}; - options.toolbarIcon = { - svg: true, - html: 'drag', - tooltip: overlay.options.translation.dragImage, - className: 'drag' - }; - L.DistortableImage.action_map.D = '_dragMode'; - L.EditAction.prototype.initialize.call(this, map, overlay, options); - }, - addHooks: function addHooks() { - var edit = this._overlay.editing; - - edit._dragMode(); - } -}); - -/***/ }), - -/***/ "./src/edit/actions/EditAction.js": -/*!****************************************!*\ - !*** ./src/edit/actions/EditAction.js ***! - \****************************************/ -/***/ (function() { - -L.DistortableImage = L.DistortableImage || {}; -L.distortableImage = L.DistortableImage; -L.DistortableImage.action_map = {}; -L.EditAction = L.Toolbar2.Action.extend({ - options: { - toolbarIcon: { - svg: false, - html: '', - className: '', - tooltip: '' - } - }, - initialize: function initialize(map, overlay, options) { - this._overlay = overlay; - this._map = map; - L.setOptions(this, options); - L.Toolbar2.Action.prototype.initialize.call(this, options); - - this._injectIconSet(); - }, - _createIcon: function _createIcon(toolbar, container, args) { - var _this = this; - - var iconOptions = this.options.toolbarIcon; - var className = iconOptions.className; - var edit = this._overlay.editing; - this.toolbar = toolbar; - this._icon = L.DomUtil.create('li', '', container); - this._link = L.DomUtil.create('a', '', this._icon); - - if (iconOptions.svg) { - this._link.innerHTML = L.IconUtil.create(iconOptions.html); - } else { - this._link.innerHTML = iconOptions.html; - } - - this._link.setAttribute('href', '#'); - - this._link.setAttribute('title', iconOptions.tooltip); - - this._link.setAttribute('role', 'button'); - - L.DomUtil.addClass(this._link, this.constructor.baseClass); - - if (className) { - L.DomUtil.addClass(this._link, className); - - if (className === 'disabled') { - L.DomUtil.addClass(this._icon, className); - } - - if (className === edit._mode) { - L.DomUtil.addClass(this._link, 'selected-mode'); - } else { - L.DomUtil.removeClass(this._link, 'selected-mode'); - } - } - - L.DomEvent.on(this._link, 'click', this.enable, this); - L.DomEvent.on(this._overlay, 'update', function () { - var match = _this._link.innerHTML.match(/xlink:href="#restore"/); - - if (match && match.length === 1) { - _this._enableAction(); - } - }); - /* Add secondary toolbar */ - - this._addSubToolbar(toolbar, this._icon, args); - }, - _injectIconSet: function _injectIconSet() { - if (document.querySelector('#iconset')) { - return; - } - - var el = document.createElement('div'); - el.id = 'iconset'; - el.setAttribute('hidden', 'hidden'); - el.innerHTML = new L.ToolbarIconSet().render(); - document.querySelector('.leaflet-marker-pane').appendChild(el); - }, - _enableAction: function _enableAction() { - L.DomUtil.removeClass(this._link.parentElement, 'disabled'); - L.DomUtil.removeClass(this._link, 'disabled'); - }, - _disableAction: function _disableAction() { - L.DomUtil.addClass(this._link.parentElement, 'disabled'); - L.DomUtil.addClass(this._link, 'disabled'); - } -}); - -L.editAction = function (map, overlay, options) { - return new L.EditAction(map, overlay, options); -}; - -/***/ }), - -/***/ "./src/edit/actions/ExportAction.js": -/*!******************************************!*\ - !*** ./src/edit/actions/ExportAction.js ***! - \******************************************/ -/***/ (function() { - -L.ExportAction = L.EditAction.extend({ - // This function is executed every time we select an image - initialize: function initialize(map, overlay, options) { - var edit = overlay.editing; - var tooltip; - this.isExporting = false; - this.mouseLeaveSkip = true; - this.isHooksExecuted = false; - - if (edit instanceof L.DistortableImage.Edit) { - L.DistortableImage.action_map.e = '_getExport'; - tooltip = overlay.options.translation.exportImage; - } else { - L.DistortableImage.group_action_map.e = 'runExporter'; - tooltip = overlay.options.translation.exportImages; - } - - options = options || {}; - options.toolbarIcon = { - svg: true, - html: 'get_app', - tooltip: tooltip - }; - L.EditAction.prototype.initialize.call(this, map, overlay, options); - }, - addHooks: function addHooks() { - var edit = this._overlay.editing; - - if (edit instanceof L.DistortableImage.Edit) { - edit._getExport(); - - return; - } // Make sure that addHooks is executed only once, event listeners will handle the rest - - - if (this.isHooksExecuted) { - return; - } else { - this.isHooksExecuted = true; - } - - var exportTool = this._link.parentElement; - this.mouseEnterHandler = this.handleMouseEnter.bind(this); - this.mouseLeaveHandler = this.handleMouseLeave.bind(this); - L.DomEvent.on(exportTool, 'click', function () { - if (!this.isExporting) { - this.isExporting = true; - this.renderExportIcon(); - setTimeout(this.attachMouseEventListeners.bind(this, exportTool), 100); - edit.runExporter().then(function () { - this.resetState(); - this.detachMouseEventListeners(exportTool); - }.bind(this)); - } else { - // Clicking on the export icon after export has started will be ignored - if (this.mouseLeaveSkip) { - return; - } - - this.resetState(); - this.detachMouseEventListeners(exportTool); - edit.cancelExport(); - } - }, this); - }, - resetState: function resetState() { - this.renderDownloadIcon(); - this.isExporting = false; - this.mouseLeaveSkip = true; - }, - attachMouseEventListeners: function attachMouseEventListeners(element) { - element.addEventListener('mouseenter', this.mouseEnterHandler); - element.addEventListener('mouseleave', this.mouseLeaveHandler); - }, - detachMouseEventListeners: function detachMouseEventListeners(element) { - element.removeEventListener('mouseenter', this.mouseEnterHandler); - element.removeEventListener('mouseleave', this.mouseLeaveHandler); - }, - handleMouseEnter: function handleMouseEnter() { - this.renderCancelIcon(); - }, - handleMouseLeave: function handleMouseLeave() { - if (this.mouseLeaveSkip) { - this.mouseLeaveSkip = false; - } else { - this.renderExportIcon(); - } - }, - renderDownloadIcon: function renderDownloadIcon() { - L.IconUtil.toggleXlink(this._link, 'get_app', 'spinner'); - L.IconUtil.toggleTitle(this._link, 'Export Images', 'Loading...'); - L.DomUtil.removeClass(this._link.firstChild, 'loader'); - }, - renderExportIcon: function renderExportIcon() { - L.IconUtil.toggleXlink(this._link, 'spinner'); - L.IconUtil.toggleTitle(this._link, 'Export Images', 'Loading...'); - L.IconUtil.addClassToSvg(this._link, 'loader'); - }, - renderCancelIcon: function renderCancelIcon() { - L.IconUtil.toggleXlink(this._link, 'cancel'); - L.IconUtil.toggleTitle(this._link, 'Cancel Export', 'Loading...'); - L.DomUtil.removeClass(this._link.firstChild, 'loader'); - } -}); - -/***/ }), - -/***/ "./src/edit/actions/FreeRotateAction.js": -/*!**********************************************!*\ - !*** ./src/edit/actions/FreeRotateAction.js ***! - \**********************************************/ -/***/ (function() { - -L.FreeRotateAction = L.EditAction.extend({ - initialize: function initialize(map, overlay, options) { - options = options || {}; - options.toolbarIcon = { - svg: true, - html: 'crop_rotate', - tooltip: overlay.options.translation.freeRotateImage, - className: 'freeRotate' - }; - L.DistortableImage.action_map.f = '_freeRotateMode'; - L.EditAction.prototype.initialize.call(this, map, overlay, options); - }, - addHooks: function addHooks() { - var edit = this._overlay.editing; - - edit._freeRotateMode(); - } -}); - -/***/ }), - -/***/ "./src/edit/actions/GeolocateAction.js": -/*!*********************************************!*\ - !*** ./src/edit/actions/GeolocateAction.js ***! - \*********************************************/ -/***/ (function() { - -L.GeolocateAction = L.EditAction.extend({ - initialize: function initialize(map, overlay, options) { - var edit = overlay.editing; - options = options || {}; - options.toolbarIcon = { - svg: true, - html: 'explore', - tooltip: overlay.options.translation.geolocateImage, - className: edit._mode === 'lock' ? 'disabled' : '' - }; - L.EditAction.prototype.initialize.call(this, map, overlay, options); - }, - addHooks: function addHooks() { - var image = this._overlay.getElement(); - - EXIF.getData(image, L.EXIF(image)); - } -}); - -/***/ }), - -/***/ "./src/edit/actions/LockAction.js": -/*!****************************************!*\ - !*** ./src/edit/actions/LockAction.js ***! - \****************************************/ -/***/ (function() { - -L.LockAction = L.EditAction.extend({ - initialize: function initialize(map, overlay, options) { - var edit = overlay.editing; - var use; - var tooltip; - - if (edit instanceof L.DistortableImage.Edit) { - L.DistortableImage.action_map.u = '_unlock'; - L.DistortableImage.action_map.l = '_lock'; - tooltip = overlay.options.translation.lockMode; - use = edit.isMode('lock') ? 'lock' : 'unlock'; - } else { - L.DistortableImage.group_action_map.l = '_lockGroup'; - tooltip = overlay.options.translation.lockImages; - use = 'lock'; - } - - options = options || {}; - options.toolbarIcon = { - svg: true, - html: use, - tooltip: tooltip, - className: 'lock' - }; - L.EditAction.prototype.initialize.call(this, map, overlay, options); - }, - addHooks: function addHooks() { - var edit = this._overlay.editing; - - if (edit instanceof L.DistortableImage.Edit) { - edit._toggleLockMode(); - } else { - edit._lockGroup(); - } - } -}); - -/***/ }), - -/***/ "./src/edit/actions/OpacityAction.js": -/*!*******************************************!*\ - !*** ./src/edit/actions/OpacityAction.js ***! - \*******************************************/ -/***/ (function() { - -L.OpacityAction = L.EditAction.extend({ - initialize: function initialize(map, overlay, options) { - var edit = overlay.editing; - var mode = edit._mode; - var use; - var tooltip; - - if (edit._transparent) { - use = 'opacity_empty'; - tooltip = overlay.options.translation.makeImageOpaque; - } else { - use = 'opacity'; - tooltip = overlay.options.translation.makeImageTransparent; - } - - options = options || {}; - options.toolbarIcon = { - svg: true, - html: use, - tooltip: tooltip, - className: mode === 'lock' ? 'disabled' : '' - }; - L.DistortableImage.action_map.o = mode === 'lock' ? '' : '_toggleOpacity'; - L.EditAction.prototype.initialize.call(this, map, overlay, options); - }, - addHooks: function addHooks() { - var edit = this._overlay.editing; - var link = this._link; - L.IconUtil.toggleXlink(link, 'opacity', 'opacity_empty'); - L.IconUtil.toggleTitle(link, 'Make Image Transparent', 'Make Image Opaque'); - - edit._toggleOpacity(); - } -}); - -/***/ }), - -/***/ "./src/edit/actions/RestoreAction.js": -/*!*******************************************!*\ - !*** ./src/edit/actions/RestoreAction.js ***! - \*******************************************/ -/***/ (function() { - -L.RestoreAction = L.EditAction.extend({ - initialize: function initialize(map, overlay, options) { - var mode = L.Utils.getNestedVal(overlay, 'editing', '_mode'); - var edited = overlay.edited; - options = options || {}; - options.toolbarIcon = { - svg: true, - html: 'restore', - tooltip: overlay.options.translation.restoreImage, - className: edited && mode !== 'lock' ? '' : 'disabled' - }; - L.EditAction.prototype.initialize.call(this, map, overlay, options); - }, - addHooks: function addHooks() { - var ov = this._overlay; - L.DomEvent.on(ov, { - edit: this._enableAction, - restore: this._disableAction - }, this); - ov.restore(); - } -}); - -/***/ }), - -/***/ "./src/edit/actions/RotateAction.js": -/*!******************************************!*\ - !*** ./src/edit/actions/RotateAction.js ***! - \******************************************/ -/***/ (function() { - -L.RotateAction = L.EditAction.extend({ - initialize: function initialize(map, overlay, options) { - options = options || {}; - options.toolbarIcon = { - svg: true, - html: 'rotate', - tooltip: overlay.options.translation.rotateImage, - className: 'rotate' - }; - L.DistortableImage.action_map.r = '_rotateMode'; - L.EditAction.prototype.initialize.call(this, map, overlay, options); - }, - addHooks: function addHooks() { - var edit = this._overlay.editing; - - edit._rotateMode(); - } -}); - -/***/ }), - -/***/ "./src/edit/actions/ScaleAction.js": -/*!*****************************************!*\ - !*** ./src/edit/actions/ScaleAction.js ***! - \*****************************************/ -/***/ (function() { - -L.ScaleAction = L.EditAction.extend({ - initialize: function initialize(map, overlay, options) { - options = options || {}; - options.toolbarIcon = { - svg: true, - html: 'scale', - tooltip: overlay.options.translation.scaleImage, - className: 'scale' - }; - L.DistortableImage.action_map.s = '_scaleMode'; - L.EditAction.prototype.initialize.call(this, map, overlay, options); - }, - addHooks: function addHooks() { - var edit = this._overlay.editing; - - edit._scaleMode(); - } -}); - -/***/ }), - -/***/ "./src/edit/actions/StackAction.js": -/*!*****************************************!*\ - !*** ./src/edit/actions/StackAction.js ***! - \*****************************************/ -/***/ (function() { - -L.StackAction = L.EditAction.extend({ - initialize: function initialize(map, overlay, options) { - var edit = overlay.editing; - var use; - var tooltip; - - if (edit._toggledImage) { - use = 'flip_to_back'; - tooltip = overlay.options.translation.stackToFront; - } else { - use = 'flip_to_front'; - tooltip = overlay.options.translation.stackToBack; - } - - options = options || {}; - options.toolbarIcon = { - svg: true, - html: use, - tooltip: tooltip, - className: edit._mode === 'lock' ? 'disabled' : '' - }; - L.DistortableImage.action_map.q = edit._mode === 'lock' ? '' : '_stackUp'; - L.DistortableImage.action_map.a = edit._mode === 'lock' ? '' : '_stackDown'; - L.EditAction.prototype.initialize.call(this, map, overlay, options); - }, - addHooks: function addHooks() { - var edit = this._overlay.editing; - L.IconUtil.toggleXlink(this._link, 'flip_to_front', 'flip_to_back'); - L.IconUtil.toggleTitle(this._link, 'Stack to Front', 'Stack to Back'); - - edit._toggleOrder(); - } -}); - -/***/ }), - -/***/ "./src/edit/actions/UnlockAction.js": -/*!******************************************!*\ - !*** ./src/edit/actions/UnlockAction.js ***! - \******************************************/ -/***/ (function() { - -L.UnlockAction = L.EditAction.extend({ - initialize: function initialize(map, overlay, options) { - options = options || {}; - options.toolbarIcon = { - svg: true, - html: 'unlock', - tooltip: overlay.options.translation.unlockImages - }; - L.DistortableImage.group_action_map.u = '_unlockGroup'; - L.EditAction.prototype.initialize.call(this, map, overlay, options); - }, - addHooks: function addHooks() { - var edit = this._overlay.editing; - - edit._unlockGroup(); - } -}); - -/***/ }), - -/***/ "./src/edit/getEXIFdata.js": -/*!*********************************!*\ - !*** ./src/edit/getEXIFdata.js ***! - \*********************************/ -/***/ (function() { - -/* eslint-disable no-unused-vars */ -L.EXIF = function getEXIFdata(img) { - if (Object.keys(EXIF.getAllTags(img)).length !== 0) { - console.log(EXIF.getAllTags(img)); - var GPS = EXIF.getAllTags(img); - var altitude; - /* If the lat/lng is available. */ - - if (typeof GPS.GPSLatitude !== 'undefined' && typeof GPS.GPSLongitude !== 'undefined') { - // sadly, encoded in [degrees,minutes,seconds] - // primitive value = GPS.GPSLatitude[x].numerator - var lat = GPS.GPSLatitude[0] + GPS.GPSLatitude[1] / 60 + GPS.GPSLatitude[2] / 3600; - var lng = GPS.GPSLongitude[0] + GPS.GPSLongitude[1] / 60 + GPS.GPSLongitude[2] / 3600; - - if (GPS.GPSLatitudeRef !== 'N') { - lat = lat * -1; - } - - if (GPS.GPSLongitudeRef === 'W') { - lng = lng * -1; - } - } // Attempt to use GPS compass heading; will require - // some trig to calc corner points, which you can find below: - - - var angle = 0; // "T" refers to "True north", so -90. - - if (GPS.GPSImgDirectionRef === 'T') { - angle = Math.PI / 180 * (GPS.GPSImgDirection.numerator / GPS.GPSImgDirection.denominator - 90); // "M" refers to "Magnetic north" - } else if (GPS.GPSImgDirectionRef === 'M') { - angle = Math.PI / 180 * (GPS.GPSImgDirection.numerator / GPS.GPSImgDirection.denominator - 90); - } else { - console.log('No compass data found'); - } - - console.log('Orientation:', GPS.Orientation); - /* If there is orientation data -- i.e. landscape/portrait etc */ - - if (GPS.Orientation === 6) { - // CCW - angle += Math.PI / 180 * -90; - } else if (GPS.Orientation === 8) { - // CW - angle += Math.PI / 180 * 90; - } else if (GPS.Orientation === 3) { - // 180 - angle += Math.PI / 180 * 180; - } - /* If there is altitude data */ - - - if (typeof GPS.GPSAltitude !== 'undefined' && typeof GPS.GPSAltitudeRef !== 'undefined') { - // Attempt to use GPS altitude: - // (may eventually need to find EXIF field of view for correction) - if (typeof GPS.GPSAltitude !== 'undefined' && typeof GPS.GPSAltitudeRef !== 'undefined') { - altitude = GPS.GPSAltitude.numerator / GPS.GPSAltitude.denominator + GPS.GPSAltitudeRef; - } else { - altitude = 0; // none - } - } - } else { - alert('EXIF initialized. Press again to view data in console.'); - } -}; - -/***/ }), - -/***/ "./src/edit/handles/DistortHandle.js": -/*!*******************************************!*\ - !*** ./src/edit/handles/DistortHandle.js ***! - \*******************************************/ -/***/ (function() { - -L.DistortHandle = L.EditHandle.extend({ - options: { - TYPE: 'distort', - icon: L.icon({ - iconUrl: // eslint-disable-next-line max-len - 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAChSURBVO3BIU4DURgGwNkvL2B6AkQTLBqP4QCoSm7DDXoBLBZHDbfgICAIZjEV3YTn9uVHdMZZtcnCfI13bIzxg0emg6Nm6QVbYz3jylEsXRrvwommb49X67jFkz80fR9Mb1YxTzqiWBSLYlEsikWxKBbFolgUi2JRLIpFsSgWxaJY03fHHOu40dH07bAzWCx9Ge/TiWbpHgdsjPGNB2f/yS+7xRCyiiZPJQAAAABJRU5ErkJggg==', - iconSize: [32, 32], - iconAnchor: [16, 16] - }) - }, - _onHandleDrag: function _onHandleDrag() { - var overlay = this._handled; - overlay.setCorner(this._corner, this.getLatLng()); - }, - updateHandle: function updateHandle() { - this.setLatLng(this._handled.getCorner(this._corner)); - } -}); - -L.distortHandle = function (overlay, idx, options) { - return new L.DistortHandle(overlay, idx, options); -}; - -/***/ }), - -/***/ "./src/edit/handles/DragHandle.js": -/*!****************************************!*\ - !*** ./src/edit/handles/DragHandle.js ***! - \****************************************/ -/***/ (function() { - -L.DragHandle = L.EditHandle.extend({ - options: { - TYPE: 'drag', - icon: L.icon({ - // eslint-disable-next-line max-len - iconUrl: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAsVJREFUeNrMVztLXEEUvnNVFAVBAhY2aRKbTZEHJNpYabuNjSgYg/GxdsmPSJkUAa/ZdVEX8mgWYVutbHxAHkVskjQBuUUgBISVhCQk3wnfwMlk1rusN1wHPubOzJlzvjlz5sxc01Ma/hUEwQnwDIjqc7uvgv9YYO86qgIwCXQbdNTlQ8kcCBHgBch8TcloF6oJGr6phk6EQAkfdz3zvgDr9Mr7Fg1fptEZoM8jsmrokpfsiIFO4IIjuE2v1EDmR4LRdlR5Gh51hj8D34ABtm8YTtqna0TgklIw5CgQguKxIojEjmFROg/MKQO27NkFAB+4wAPouGUJiIvWKHwbAxX2XyWRKWkqhT+pbJntJZJuUzISW0+5hW+obxrVBsfvoH/dqCCJuU97GBh2VteLSiYvArmErT8EVoAK9Bw7enbpVYmvAQlyowYforrH5jXL2rPHI/TKONDB7u9AlavdaTBPvPmazUeQuy8f7UomUgTEwIJPEQ3sQGE/6ll2l9H/KcEzBcfWn2IclluM3DpddJxSHujlFkscbUPvmB0LHVnLrId7nlaZVkEc6QGXQI1MAwZcWmVRHeNaQwJMMiU2cwy4s7p/RJ2ckpvIQs+cIs+5GzitloLKHUV3MPREuXbTOKO91dX387gGTONxIgEWm+E61FFrpcyqXLHsEwiDjEsjAksqw5XPoL9MHVrn6QR4q+XZrDaR4RoWzq2ymafuRA/Mq1stSsHLVkcbdf9VjOcx8ZH3+SFWcCWlVPyWuUBOwUWdC1wP5NVjYiXFWLO69PZ6CRTUY6KSIoEKdf6T3IzzgHxnsyHctNBEkmn6Oob8ExUDg/ahGybd177cDjzH5xHwgDiSvoS7I/LZyvxJZj0wod7tkX5G0XVC7rEyLhfLJjBGbKoLLEfZWObyKeZ6oY82g+yf5Zn/mJyHX7PMf04z/T3/LcAAu4E6iiyJqf0AAAAASUVORK5CYII=', - iconSize: [32, 32], - iconAnchor: [16, 16] - }) - }, - _onHandleDrag: function _onHandleDrag() { - var overlay = this._handled; - var formerLatLng = overlay.getCorner(this._corner); - var newLatLng = this.getLatLng(); - overlay.dragBy(formerLatLng, newLatLng); - }, - updateHandle: function updateHandle() { - this.setLatLng(this._handled.getCorner(this._corner)); - } -}); - -L.dragHandle = function (overlay, idx, options) { - return new L.DragHandle(overlay, idx, options); -}; - -/***/ }), - -/***/ "./src/edit/handles/EditHandle.js": -/*!****************************************!*\ - !*** ./src/edit/handles/EditHandle.js ***! - \****************************************/ -/***/ (function() { - -L.EditHandle = L.Marker.extend({ - initialize: function initialize(overlay, corner, options) { - var latlng = overlay.getCorner(corner); - L.setOptions(this, options); - this._handled = overlay; - this._corner = corner; - var markerOptions = { - draggable: true, - zIndexOffset: 10 - }; - - if (options && options.hasOwnProperty('draggable')) { - markerOptions.draggable = options.draggable; - } - - L.Marker.prototype.initialize.call(this, latlng, markerOptions); - }, - onAdd: function onAdd(map) { - L.Marker.prototype.onAdd.call(this, map); - - this._bindListeners(); - - this.updateHandle(); - }, - onRemove: function onRemove(map) { - this._unbindListeners(); - - L.Marker.prototype.onRemove.call(this, map); - }, - _onHandleDragStart: function _onHandleDragStart() { - this._handled.fire('editstart'); - }, - _onHandleDragEnd: function _onHandleDragEnd() { - this._fireEdit(); - }, - _fireEdit: function _fireEdit() { - this._handled.edited = true; - - this._handled.fire('edit'); - }, - _bindListeners: function _bindListeners() { - this.on({ - contextmenu: L.DomEvent.stop, - dragstart: this._onHandleDragStart, - drag: this._onHandleDrag, - dragend: this._onHandleDragEnd - }, this); - - this._handled._map.on('zoomend', this.updateHandle, this); - - this._handled.on('update', this.updateHandle, this); - }, - _unbindListeners: function _unbindListeners() { - this.off({ - contextmenu: L.DomEvent.stop, - dragstart: this._onHandleDragStart, - drag: this._onHandleDrag, - dragend: this._onHandleDragEnd - }, this); - - this._handled._map.off('zoomend', this.updateHandle, this); - - this._handled.off('update', this.updateHandle, this); - }, - - /* Takes two latlngs and calculates the scaling difference. */ - _calculateScalingFactor: function _calculateScalingFactor(latlngA, latlngB) { - var overlay = this._handled; - var map = overlay._map; - var centerPoint = map.latLngToLayerPoint(overlay.getCenter()); - var formerPoint = map.latLngToLayerPoint(latlngA); - var newPoint = map.latLngToLayerPoint(latlngB); - - var formerRadiusSquared = this._d2(centerPoint, formerPoint); - - var newRadiusSquared = this._d2(centerPoint, newPoint); - - return Math.sqrt(newRadiusSquared / formerRadiusSquared); - }, - - /* Distance between two points in cartesian space, squared (distance formula). */ - _d2: function _d2(a, b) { - var dx = a.x - b.x; - var dy = a.y - b.y; - return Math.pow(dx, 2) + Math.pow(dy, 2); - }, - - /* Takes two latlngs and calculates the angle between them. */ - calculateAngleDelta: function calculateAngleDelta(latlngA, latlngB) { - var overlay = this._handled; - var map = overlay._map; - var centerPoint = map.latLngToLayerPoint(overlay.getCenter()); - var formerPoint = map.latLngToLayerPoint(latlngA); - var newPoint = map.latLngToLayerPoint(latlngB); - var initialAngle = Math.atan2(centerPoint.y - formerPoint.y, centerPoint.x - formerPoint.x); - var newAngle = Math.atan2(centerPoint.y - newPoint.y, centerPoint.x - newPoint.x); - return newAngle - initialAngle; - } -}); - -/***/ }), - -/***/ "./src/edit/handles/FreeRotateHandle.js": -/*!**********************************************!*\ - !*** ./src/edit/handles/FreeRotateHandle.js ***! - \**********************************************/ -/***/ (function() { - -L.FreeRotateHandle = L.EditHandle.extend({ - options: { - TYPE: 'freeRotate', - icon: L.icon({ - iconUrl: // eslint-disable-next-line max-len - 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAHiSURBVMXBa3HbShgA0PMp/1sCCo8oCEpgTaCXgIXAJiDzyCJoAUTm4UVQAns1Y8+snWnTvJyeE16hkjDgDrfoNTMKcpC9UPiLSo8JyetkjEHxjPCMyoS199kFoz8Iv1HpMaN3qWDCHoegOKkkRwnJpRmroHgiPFEZ8IBekzEGxQtUEhKSS/fB7Ew4U+lxcGkVZG9QWWPSFAxBcdK59KApuA+yNwp2uEdx1GN25sZJZULSfAtm77SlbNjju6MvG75u+WHRWVR6rDVjMPsgwYyVZl3pLTpHkyYHOx8syMiayaJzlDTZ9YyaZNFVkiYH2ZUEBcVJJXVImuz6Js3Qofe59pq7DoOTILu+g+a288mCouk7/1iH4qTS+2QdDppbV1ZJmrnDXnPnc5UOs2Z0fUmTuyBr+krvSioJyUmQO0dZM7mepMkWnaNRkyrJB6uskTSjxY3Fll8bvmJwlDb83FJ8gMqAB80uyBY3Trb82PAfvjj6vuHnluIdKgMeNXOwctK5NKBoHitrb1RJeHRp5Ux4ojLg0aWMHGQvUOkxIWkKVsHsTPiNSo8HDC5lZIsgO6n0uMUdRvQuFQxB8UR4RmXC2vvsgtEfhL+o9JiQvE7GGBTPCK9QSUjoMWgKDthjDrIX+h/k0I7gth6N5gAAAABJRU5ErkJggg==', - iconSize: [32, 32], - iconAnchor: [16, 16] - }) - }, - _onHandleDrag: function _onHandleDrag() { - var overlay = this._handled; - var map = overlay._map; - var formerLatLng = overlay.getCorner(this._corner); - var newLatLng = this.getLatLng(); - var angle = this.calculateAngleDelta(formerLatLng, newLatLng); - - var scale = this._calculateScalingFactor(formerLatLng, newLatLng); - - if (angle !== 0) { - overlay.rotateBy(angle, 'rad'); - } - - var edgeMinWidth = overlay.edgeMinWidth; - - if (!edgeMinWidth) { - edgeMinWidth = 50; - } - /* just in case */ - - - var corner1 = map.latLngToContainerPoint(overlay.getCorner(0)); - var corner2 = map.latLngToContainerPoint(overlay.getCorner(1)); - var w = Math.abs(corner1.x - corner2.x); - var h = Math.abs(corner1.y - corner2.y); - var distance = Math.sqrt(w * w + h * h); - - if (distance > edgeMinWidth || scale > 1) { - overlay.scaleBy(scale); - } else { - overlay.scaleBy(1); - } - }, - updateHandle: function updateHandle() { - this.setLatLng(this._handled.getCorner(this._corner)); - } -}); - -L.freeRotateHandle = function (overlay, idx, options) { - return new L.FreeRotateHandle(overlay, idx, options); -}; - -/***/ }), - -/***/ "./src/edit/handles/LockHandle.js": -/*!****************************************!*\ - !*** ./src/edit/handles/LockHandle.js ***! - \****************************************/ -/***/ (function() { - -L.LockHandle = L.EditHandle.extend({ - options: { - TYPE: 'lock', - interactive: false, - icon: L.icon({ - // eslint-disable-next-line max-len - iconUrl: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAD8SURBVO3BPU7CYAAA0AdfjIcQlRCQBG7C3gk2uIPG2RC3Dk16Gz0FTO1WZs/gwGCMP/2+xsSl7+n1er1Iz9LtRQjaPeMeO+TinLDCJV78YqjdA04YodKuxhUaPGoRxMmxwRQZSt87Yo4KExGCeAUyLLFB4bMacxywEClIU2KDKXbInTUYo8JCgoFuGoxQO5uiwY1EA91VmDqrcKeDoX8WdNNgjApvmGGLXKIgXY0xGkxQYItrrFFIEKQ5Yo4KEx9yrDFDhlKkIF6NOQ5Y+KpAhiXWKEQI4pxwiwoLPyuxwQw75FoE7fZYocFEuwI7jHCBV39gL92TXq/Xi/AOcmczZmaIMScAAAAASUVORK5CYII=', - iconSize: [32, 32], - iconAnchor: [16, 16] - }) - }, - onRemove: function onRemove(map) { - this.unbindTooltip(); - L.EditHandle.prototype.onRemove.call(this, map); - }, - _bindListeners: function _bindListeners() { - var icon = this.getElement(); - - L.EditHandle.prototype._bindListeners.call(this); - - L.DomEvent.on(icon, { - mousedown: this._tooltipOn, - mouseup: this._tooltipOff - }, this); - L.DomEvent.on(document, 'pointerleave', this._tooltipOff, this); - }, - _unbindListeners: function _unbindListeners() { - var icon = this.getElement(); - - L.EditHandle.prototype._bindListeners.call(this); - - L.DomEvent.off(icon, { - mousedown: this._tooltipOn, - mouseup: this._tooltipOff - }, this); - L.DomEvent.off(document, 'pointerleave', this._tooltipOff, this); - }, - - /* cannot be dragged */ - _onHandleDrag: function _onHandleDrag() {}, - updateHandle: function updateHandle() { - this.setLatLng(this._handled.getCorner(this._corner)); - }, - _tooltipOn: function _tooltipOn(e) { - var eP = this._handled.parentGroup; - var edit = eP ? eP.editing : this._handled.editing; - - if (e.shiftKey) { - return; - } - - if (!this._handled.isSelected() && eP && !eP.isCollected(this._handled)) { - return; - } - - var handlesArr = edit._lockHandles; - this._timer = setTimeout(L.bind(function () { - if (this._timeout) { - clearTimeout(this._timeout); - } - - if (!this.getTooltip()) { - this.bindTooltip('Locked!', { - permanent: true - }); - } else { - handlesArr.eachLayer(function (handle) { - if (this !== handle) { - handle.closeTooltip(); - } - }); - } - - this.openTooltip(); - }, this), 500); - }, - _tooltipOff: function _tooltipOff(e) { - var eP = this._handled.parentGroup; - var edit = eP ? eP.editing : this._handled.editing; - - if (e.shiftKey) { - return; - } - - if (!this._handled.isSelected() && eP && !eP.isCollected(this._handled)) { - return; - } - - var handlesArr = edit._lockHandles; - - if (e.currentTarget === document) { - handlesArr.eachLayer(function (handle) { - handle.closeTooltip(); - }); - } - - if (this._timer) { - clearTimeout(this._timer); - } - - this._timeout = setTimeout(L.bind(function () { - this.closeTooltip(); - }, this), 400); - } -}); - -L.lockHandle = function (overlay, idx, options) { - return new L.LockHandle(overlay, idx, options); -}; - -/***/ }), - -/***/ "./src/edit/handles/RotateHandle.js": -/*!******************************************!*\ - !*** ./src/edit/handles/RotateHandle.js ***! - \******************************************/ -/***/ (function() { - -L.RotateHandle = L.EditHandle.extend({ - options: { - TYPE: 'rotate', - icon: L.icon({ - iconUrl: // eslint-disable-next-line max-len - 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAHiSURBVMXBa3HbShgA0PMp/1sCCo8oCEpgTaCXgIXAJiDzyCJoAUTm4UVQAns1Y8+snWnTvJyeE16hkjDgDrfoNTMKcpC9UPiLSo8JyetkjEHxjPCMyoS199kFoz8Iv1HpMaN3qWDCHoegOKkkRwnJpRmroHgiPFEZ8IBekzEGxQtUEhKSS/fB7Ew4U+lxcGkVZG9QWWPSFAxBcdK59KApuA+yNwp2uEdx1GN25sZJZULSfAtm77SlbNjju6MvG75u+WHRWVR6rDVjMPsgwYyVZl3pLTpHkyYHOx8syMiayaJzlDTZ9YyaZNFVkiYH2ZUEBcVJJXVImuz6Js3Qofe59pq7DoOTILu+g+a288mCouk7/1iH4qTS+2QdDppbV1ZJmrnDXnPnc5UOs2Z0fUmTuyBr+krvSioJyUmQO0dZM7mepMkWnaNRkyrJB6uskTSjxY3Fll8bvmJwlDb83FJ8gMqAB80uyBY3Trb82PAfvjj6vuHnluIdKgMeNXOwctK5NKBoHitrb1RJeHRp5Ux4ojLg0aWMHGQvUOkxIWkKVsHsTPiNSo8HDC5lZIsgO6n0uMUdRvQuFQxB8UR4RmXC2vvsgtEfhL+o9JiQvE7GGBTPCK9QSUjoMWgKDthjDrIX+h/k0I7gth6N5gAAAABJRU5ErkJggg==', - iconSize: [32, 32], - iconAnchor: [16, 16] - }) - }, - _onHandleDrag: function _onHandleDrag() { - var overlay = this._handled; - var formerLatLng = overlay.getCorner(this._corner); - var newLatLng = this.getLatLng(); - var angle = this.calculateAngleDelta(formerLatLng, newLatLng); - /* - * running rotation logic even for an angle delta of 0 - * prevents a small, occasional marker flicker - */ - - overlay.rotateBy(angle, 'rad'); - }, - updateHandle: function updateHandle() { - this.setLatLng(this._handled.getCorner(this._corner)); - } -}); - -L.rotateHandle = function (overlay, idx, options) { - return new L.RotateHandle(overlay, idx, options); -}; - -/***/ }), - -/***/ "./src/edit/handles/ScaleHandle.js": -/*!*****************************************!*\ - !*** ./src/edit/handles/ScaleHandle.js ***! - \*****************************************/ -/***/ (function() { - -L.ScaleHandle = L.EditHandle.extend({ - options: { - TYPE: 'scale', - icon: L.icon({ - iconUrl: // eslint-disable-next-line max-len - 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2ZXJzaW9uPSIxLjEiIHdpZHRoPSI0NTkiIGhlaWdodD0iNDY0IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCA1MTIgNTEyIiB4bWw6c3BhY2U9InByZXNlcnZlIiBzdHlsZT0iIj48cmVjdCBpZD0iYmFja2dyb3VuZHJlY3QiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIHg9IjAiIHk9IjAiIGZpbGw9Im5vbmUiIHN0cm9rZT0ibm9uZSIgY2xhc3M9IiIgc3R5bGU9IiIvPjxnIGNsYXNzPSJjdXJyZW50TGF5ZXIiIHN0eWxlPSIiPjx0aXRsZT5MYXllciAxPC90aXRsZT48cGF0aCBkPSJNNDU5LjA0OTE1OTUzMDQ3MTM0LDg2LjkyNjIzNDUxMjU1MDAyIFYwIGgtODUuNzE0NTczMzU2MzEyMDkgdjI3LjA0MzcxNzQwMzkwNDQ1MiBIODUuNzE0NTczMzU2MzEyMDMgVjAgSDAgdjg2LjkyNjIzNDUxMjU1MDAyIGgyNS43MTQzNzIwMDY4OTM2MjYgdjI4OS43NTQxMTUwNDE4MzM0IEgwIHY4Ni45MjYyMzQ1MTI1NTAwMiBoODUuNzE0NTczMzU2MzEyMDkgdi0yNy4wNDM3MTc0MDM5MDQ0NTIgaDI4NS43MTUyNDQ1MjEwNDAzIHYyNy4wNDM3MTc0MDM5MDQ0NTIgaDg1LjcxNDU3MzM1NjMxMjA5IHYtODYuOTI2MjM0NTEyNTUwMDIgaC0yMy44MDk2MDM3MTAwODY2OSBWODYuOTI2MjM0NTEyNTUwMDIgSDQ1OS4wNDkxNTk1MzA0NzEzNCB6TTM4NC43NjMxOTU5NTUwMDA5LDEyLjU1NjAxMTY1MTgxMjc4MSBoNjEuOTA0OTY5NjQ2MjI1Mzk2IHY2Mi43ODAwNTgyNTkwNjM5MSBoLTYxLjkwNDk2OTY0NjIyNTM5NiBWMTIuNTU2MDExNjUxODEyNzgxIHpNMTIuMzgwOTkzOTI5MjQ1MDUsMTIuNTU2MDExNjUxODEyNzgxIGg2MS45MDQ5Njk2NDYyMjUzOTYgdjYyLjc4MDA1ODI1OTA2MzkxIEgxMi4zODA5OTM5MjkyNDUwNSBWMTIuNTU2MDExNjUxODEyNzgxIHpNNzQuMjg1OTYzNTc1NDcwNTMsNDUxLjA1MDU3MjQxNTEyMDY2IEgxMi4zODA5OTM5MjkyNDUwNSB2LTYyLjc4MDA1ODI1OTA2MzkxIGg2MS45MDQ5Njk2NDYyMjUzOTYgVjQ1MS4wNTA1NzI0MTUxMjA2NiB6TTQ0NS43MTU3ODE0NTI4MjI3NCw0NTEuMDUwNTcyNDE1MTIwNjYgaC02Mi44NTczNTM3OTQ2Mjg4NjQgdi02Mi43ODAwNTgyNTkwNjM5MSBoNjIuODU3MzUzNzk0NjI4ODY0IFY0NTEuMDUwNTcyNDE1MTIwNjYgek00MDcuNjIwNDE1NTE2Njg0MjYsMzc2LjY4MDM0OTU1NDM4MzQ0IGgtMzYuMTkwNTk3NjM5MzMxNzcgdjMyLjgzODc5OTcwNDc0MTEyIEg4NS43MTQ1NzMzNTYzMTIwMyB2LTMyLjgzODc5OTcwNDc0MTEyIEg0OS41MjM5NzU3MTY5ODAzMiBWODYuOTI2MjM0NTEyNTUwMDIgaDM2LjE5MDU5NzYzOTMzMTc3IFY1MC4yMjQwNDY2MDcyNTExMjUgaDI4Ny42MjAwMTI4MTc4NDcyIHYzNi43MDIxODc5MDUyOTg5IGgzNC4yODU4MjkzNDI1MjQ4MzUgVjM3Ni42ODAzNDk1NTQzODM0NCB6IiBpZD0ic3ZnXzIiIGNsYXNzPSIiIGZpbGw9IiMxYTFhZWIiIGZpbGwtb3BhY2l0eT0iMSIvPjwvZz48L3N2Zz4=', - iconSize: [32, 32], - iconAnchor: [16, 16] - }) - }, - _onHandleDrag: function _onHandleDrag() { - var overlay = this._handled; - var map = overlay._map; - var edgeMinWidth = overlay.edgeMinWidth; - var formerLatLng = overlay.getCorner(this._corner); - var newLatLng = this.getLatLng(); - - var scale = this._calculateScalingFactor(formerLatLng, newLatLng); - /* - * checks whether the "edgeMinWidth" property is set and tracks the minimum edge length; - * this enables preventing scaling to zero, but we might also add an overall scale limit - */ - - - if (!edgeMinWidth) { - edgeMinWidth = 50; - } - /* just in case */ - - - var corner1 = map.latLngToLayerPoint(overlay.getCorner(0)); - var corner2 = map.latLngToLayerPoint(overlay.getCorner(1)); - var w = Math.abs(corner1.x - corner2.x); - var h = Math.abs(corner1.y - corner2.y); - var distance = Math.sqrt(w * w + h * h); - - if (distance > edgeMinWidth || scale > 1) { - overlay.scaleBy(scale); - /* - * running scale logic even for a scale ratio of 1 - * prevents a small, occasional marker flicker - */ - } else { - overlay.scaleBy(1); - } - }, - updateHandle: function updateHandle() { - this.setLatLng(this._handled.getCorner(this._corner)); - } -}); - -L.scaleHandle = function (overlay, idx, options) { - return new L.ScaleHandle(overlay, idx, options); -}; - -/***/ }), - -/***/ "./src/edit/toolbars/DistortableImage.ControlBar.js": -/*!**********************************************************!*\ - !*** ./src/edit/toolbars/DistortableImage.ControlBar.js ***! - \**********************************************************/ -/***/ (function() { - -L.distortableImage = L.DistortableImage || {}; -L.distortableImage = L.DistortableImage; -L.DistortableImage.group_action_map = {}; -L.DistortableImage.ControlBar = L.Toolbar2.Control.extend({}); - -L.distortableImage.controlBar = function (options) { - return new L.DistortableImage.ControlBar(options); -}; -/** addInitHooks run before onAdd */ - - -L.DistortableCollection.addInitHook(function () { - /** Default actions */ - this.ACTIONS = [L.ExportAction, L.DeleteAction, L.LockAction, L.UnlockAction]; // all possible modes - - L.DistortableCollection.Edit.MODES = { - lock: L.LockAction, - unlock: L.UnlockAction - }; - var a = this.options.actions ? this.options.actions : this.ACTIONS; - this.editing = L.distortableCollection.edit(this, { - actions: a - }); -}); - -/***/ }), - -/***/ "./src/edit/toolbars/DistortableImage.PopupBar.js": -/*!********************************************************!*\ - !*** ./src/edit/toolbars/DistortableImage.PopupBar.js ***! - \********************************************************/ -/***/ (function() { - -L.DistortableImage = L.DistortableImage || {}; -L.distortableImage = L.DistortableImage; -L.DistortableImage.action_map = {}; -L.DistortableImage.PopupBar = L.Toolbar2.Popup.extend({ - options: { - anchor: [0, -10] - }, - initialize: function initialize(latlng, options) { - L.setOptions(this, options); - L.Toolbar2.Popup.prototype.initialize.call(this, latlng, options); - }, - addHooks: function addHooks(map, ov) { - this.map = map; - this.ov = ov; - }, - tools: function tools() { - if (this._ul) { - return this._ul.children; - } - }, - clickTool: function clickTool(name) { - var tools = this.tools(); - - for (var i = 0; i < tools.length; i++) { - var tool = tools.item(i).children[0]; - - if (L.DomUtil.hasClass(tool, name)) { - tool.click(); - return tool; - } - } - - return false; - } -}); - -L.distortableImage.popupBar = function (latlng, options) { - return new L.DistortableImage.PopupBar(latlng, options); -}; - -L.DistortableImageOverlay.addInitHook(function () { - /** Default actions */ - this.ACTIONS = [L.DragAction, L.ScaleAction, L.DistortAction, L.RotateAction, L.FreeRotateAction, L.LockAction, L.OpacityAction, L.BorderAction, L.ExportAction, L.DeleteAction]; // all possible modes - - L.DistortableImage.Edit.MODES = { - drag: L.DragAction, - scale: L.ScaleAction, - distort: L.DistortAction, - rotate: L.RotateAction, - freeRotate: L.FreeRotateAction, - lock: L.LockAction - }; - var a = this.options.actions ? this.options.actions : this.ACTIONS; - this.editing = L.distortableImage.edit(this, { - actions: a - }); -}); - -/***/ }), - -/***/ "./src/iconsets/IconSet.js": -/*!*********************************!*\ - !*** ./src/iconsets/IconSet.js ***! - \*********************************/ -/***/ (function() { - -/* this is the baseclass other IconSets inherit from, -* we don't use it directly */ -L.IconSet = L.Class.extend({ - _svg: '', - _symbols: '', - render: function render() { - this.addSymbols(this._symbols); - return this._svg; - }, - addSymbols: function addSymbols(symbols) { - this._svg += symbols; - } -}); - -/***/ }), - -/***/ "./src/iconsets/KeymapperIconSet.js": -/*!******************************************!*\ - !*** ./src/iconsets/KeymapperIconSet.js ***! - \******************************************/ -/***/ (function() { - -L.KeymapperIconSet = L.IconSet.extend({ - _symbols: // eslint-disable-next-line max-len - '' -}); - -/***/ }), - -/***/ "./src/iconsets/ToolbarIconSet.js": -/*!****************************************!*\ - !*** ./src/iconsets/ToolbarIconSet.js ***! - \****************************************/ -/***/ (function() { - -/* eslint-disable max-len */ -L.ToolbarIconSet = L.IconSet.extend({ - _symbols: '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' -}); - -/***/ }), - -/***/ "./src/mapmixins/BoxCollector.js": -/*!***************************************!*\ - !*** ./src/mapmixins/BoxCollector.js ***! - \***************************************/ -/***/ (function() { - -L.Map.mergeOptions({ - boxCollector: true, - boxZoom: false -}); -/** - * primarily Leaflet 1.5.1 source code. Overriden so that it's a collection box used with - * our `L.DistortableCollection` class instead of a zoom box. - * */ - -L.Map.BoxCollector = L.Map.BoxZoom.extend({ - initialize: function initialize(map) { - this._map = map; - this._container = map._container; - this._pane = map._panes.overlayPane; - this._resetStateTimeout = 0; - map.on('unload', this._destroy, this); - }, - addHooks: function addHooks() { - L.DomEvent.on(this._container, 'mousedown', this._onMouseDown, this); - }, - removeHooks: function removeHooks() { - L.DomEvent.off(this._container, 'mousedown', this._onMouseDown, this); - }, - moved: function moved() { - return this._moved; - }, - _destroy: function _destroy() { - L.DomUtil.remove(this._pane); - delete this._pane; - }, - _resetState: function _resetState() { - this._resetStateTimeout = 0; - this._moved = false; - }, - _clearDeferredResetState: function _clearDeferredResetState() { - if (this._resetStateTimeout !== 0) { - clearTimeout(this._resetStateTimeout); - this._resetStateTimeout = 0; - } - }, - _onMouseDown: function _onMouseDown(e) { - if (!e.shiftKey || e.which !== 1 && e.button !== 1) { - return false; - } // Clear the deferred resetState if it hasn't executed yet, otherwise it - // will interrupt the interaction and orphan a box element in the container. - - - this._clearDeferredResetState(); - - this._resetState(); - - L.DomUtil.disableTextSelection(); - L.DomUtil.disableImageDrag(); - this._startPoint = this._map.mouseEventToContainerPoint(e); - L.DomEvent.on(document, { - contextmenu: L.DomEvent.stop, - mousemove: this._onMouseMove, - mouseup: this._onMouseUp - }, this); - }, - _onMouseMove: function _onMouseMove(e) { - if (!this._moved) { - this._moved = true; - this._box = L.DomUtil.create('div', 'leaflet-zoom-box', this._container); - L.DomUtil.addClass(this._container, 'leaflet-crosshair'); - - this._map.fire('boxzoomstart'); - } - - this._point = this._map.mouseEventToContainerPoint(e); - this._bounds = L.bounds(this._startPoint, this._point); - - var size = this._bounds.getSize(); - - L.DomUtil.setPosition(this._box, this._bounds.min); - this._box.style.width = size.x + 'px'; - this._box.style.height = size.y + 'px'; - }, - _finish: function _finish() { - if (this._moved) { - L.DomUtil.remove(this._box); - L.DomUtil.removeClass(this._container, 'leaflet-crosshair'); - } - - L.DomUtil.enableTextSelection(); - L.DomUtil.enableImageDrag(); - L.DomEvent.off(document, { - contextmenu: L.DomEvent.stop, - mousemove: this._onMouseMove, - mouseup: this._onMouseUp - }, this); - }, - _onMouseUp: function _onMouseUp(e) { - if (e.which !== 1 && e.button !== 1) { - return; - } - - this._finish(); - - if (!this._moved) { - return; - } // Postpone to next JS tick so internal click event handling - // still see it as "moved". - - - this._clearDeferredResetState(); - - this._resetStateTimeout = setTimeout(L.Util.bind(this._resetState, this), 0); - var bounds = L.latLngBounds(this._map.containerPointToLatLng(this._bounds.getBottomLeft()), this._map.containerPointToLatLng(this._bounds.getTopRight())); - - var zoom = this._map.getZoom(); - - var center = this._map.getCenter(); // calls the `project` method but 1st updates the pixel origin - see https://github.com/publiclab/Leaflet.DistortableImage/pull/344 - - - bounds = this._map._latLngBoundsToNewLayerBounds(bounds, zoom, center); - - this._map.fire('boxcollectend', { - boxCollectBounds: bounds - }); - } -}); -L.Map.addInitHook('addHandler', 'boxCollector', L.Map.BoxCollector); - -/***/ }), - -/***/ "./src/mapmixins/DoubleClickLabels.js": -/*!********************************************!*\ - !*** ./src/mapmixins/DoubleClickLabels.js ***! - \********************************************/ -/***/ (function() { - -L.Map.mergeOptions({ - doubleClickLabels: true -}); -/** - * The `doubleClickLabels` handler replaces `doubleClickZoom` by default if `#addGoogleMutant` - * is used unless the options 'labels: false' or 'doubleClickZoom: false` were passed to it. - */ - -L.Map.DoubleClickLabels = L.Map.DoubleClickZoom.extend({ - enable: function enable() { - var map = this._map; - - if (this._enabled) { - return this; - } // disable 'doubleClickZoom' if 'doubleClickLabels' is enabled. - - - if (map.doubleClickZoom.enabled()) { - map.doubleClickZoom.disable(); - } - - this._map.fire('singleclickon'); - - this._enabled = true; - this.addHooks(); - return this; - }, - disable: function disable() { - if (!this._enabled) { - return this; - } - - this._enabled = false; - this.removeHooks(); - return this; - }, - _fireIfSingle: function _fireIfSingle(e) { - var map = this._map; - var oe = e.originalEvent; // prevents deselection in case of box selector - - if (oe && oe.shiftKey) { - return; - } - - map._clicked += 1; - this._map._clickTimeout = setTimeout(function () { - if (map._clicked === 1) { - map._clicked = 0; - map.fire('singleclick', { - type: 'singleclick' - }); - } else { - // manually fire doubleclick event only for touch screens that don't natively fire it - if (L.Browser.touch && oe && oe.sourceCapabilities.firesTouchEvents) { - map.fire('dblclick'); - } - } - }, 250); - }, - _onDoubleClick: function _onDoubleClick() { - var map = this._map; - var labels = map._labels; - setTimeout(function () { - map._clicked = 0; - clearTimeout(map._clickTimeout); - }, 0); - - if (!labels) { - return; - } - - if (labels.options.opacity === 1) { - labels.options.opacity = 0; - labels.setOpacity(0); - } else { - labels.options.opacity = 1; - labels.setOpacity(1); - } - } -}); -L.Map.addInitHook('addHandler', 'doubleClickLabels', L.Map.DoubleClickLabels); - -/***/ }), - -/***/ "./src/mapmixins/DoubleClickZoom.js": -/*!******************************************!*\ - !*** ./src/mapmixins/DoubleClickZoom.js ***! - \******************************************/ -/***/ (function() { - -/** - * `L.Map.DoubleClickZoom` from leaflet 1.5.1, overrwritten so that it - * 1) Fires a `singleclick` event to avoid deselecting images on `dblclick`. - * 2) Maintains a mutually exclusive relationship with the map's `DoubleClickLabels` handler - */ -L.Map.DoubleClickZoom.include({ - addHooks: function addHooks() { - this._map.on({ - click: this._fireIfSingle, - dblclick: this._onDoubleClick - }, this); - }, - removeHooks: function removeHooks() { - this._map.off({ - click: this._fireIfSingle, - dblclick: this._onDoubleClick - }, this); - }, - enable: function enable() { - if (this._enabled) { - return this; - } // don't enable 'doubleClickZoom' unless 'doubleClickLabels' is disabled first - - - if (this._map.doubleClickLabels) { - if (this._map.doubleClickLabels.enabled()) { - return this; - } - } // signify to collection/instance classes to turn on 'singleclick' listeners - - - this._map.fire('singleclickon'); - - this._enabled = true; - this.addHooks(); - return this; - }, - disable: function disable() { - if (!this._enabled) { - return this; - } // signify to collection/instance safe to swap 'singleclick' listeners with 'click' listeners. - - - this._map.fire('singleclickoff'); - - this._enabled = false; - this.removeHooks(); - return this; - }, - _fireIfSingle: function _fireIfSingle(e) { - var map = this._map; - var oe = e.originalEvent; // prevents deselection in case of box selector - - if (oe && oe.shiftKey) { - return; - } - - map._clicked += 1; - this._map._clickTimeout = setTimeout(function () { - if (map._clicked === 1) { - map._clicked = 0; - map.fire('singleclick', { - type: 'singleclick' - }); - } else { - // manually fire doubleclick event only for touch screens that don't natively fire it - if (L.Browser.touch && oe && oe.sourceCapabilities.firesTouchEvents) { - /* in `DoubleClickLabels.js`, we just do map.fire('dblclick') bc `_onDoublClick` doesn't use the - passed "e" (for now). To generate a 'real' DOM event that will have all of its corresponding core - properties (originalEvent, latlng, etc.), use Leaflet's `#map._fireDOMEvent` (Leaflet 1.5.1 source) */ - map._fireDOMEvent(oe, 'dblclick', [map]); - } - } - }, 250); - }, - _onDoubleClick: function _onDoubleClick(e) { - var map = this._map; - var oe = e.originalEvent; - setTimeout(function () { - map._clicked = 0; - clearTimeout(map._clickTimeout); - }, 0); - - if (!oe) { - return false; - } - - var oldZoom = map.getZoom(); - var delta = map.options.zoomDelta; - var zoom = oe.shiftKey ? oldZoom - delta : oldZoom + delta; - - if (map.options.doubleClickZoom === 'center') { - map.setZoom(zoom); - } else { - map.setZoomAround(e.containerPoint, zoom); - } - } -}); - -/***/ }), - -/***/ "./src/mapmixins/MapMixins.js": -/*!************************************!*\ - !*** ./src/mapmixins/MapMixins.js ***! - \************************************/ -/***/ (function() { - -/* eslint-disable max-len */ -L.Map.include({ - _clicked: 0, - addGoogleMutant: function addGoogleMutant(opts) { - var url = 'http://mt0.google.com/vt/lyrs=s&x={x}&y={y}&z={z}'; - opts = this.mutantOptions = L.extend({ - mutantOpacity: 0.8, - maxZoom: 24, - maxNativeZoom: 20, - minZoom: 0, - labels: true, - labelOpacity: 1, - doubleClickLabels: true - }, opts); - - if (!opts.labels) { - this.mutantOptions = L.extend(this.mutantOptions, { - labelOpacity: opts.labels ? 1 : undefined, - doubleClickLabels: opts.labels ? true : undefined - }); - } - - this._googleMutant = L.tileLayer(url, { - maxZoom: opts.maxZoom, - maxNativeZoom: opts.maxNativeZoom, - minZoom: opts.minZoom, - opacity: opts.mutantOpacity - }).addTo(this); - - if (opts.labels) { - this._addLabels(opts); - } // shouldn't have this handler at all if there are no labels to toggle - else { - this.doubleClickLabels = undefined; - } - - return this; - }, - _addLabels: function _addLabels(opts) { - var url = 'https://stamen-tiles-{s}.a.ssl.fastly.net/toner-labels/{z}/{x}/{y}{r}.{ext}'; - - if (opts.labelOpacity !== 0 && opts.labelOpacity !== 1) { - opts.labelOpacity = 1; - } - - this._labels = L.tileLayer(url, { - attribution: 'Map tiles by Stamen Design, CC BY 3.0 — Map data © OpenStreetMap contributors', - subdomains: 'abcd', - interactive: false, - opacity: opts.labelOpacity, - maxZoom: opts.maxZoom, - maxNativeZoom: opts.maxNativeZoom, - minZoom: opts.minZoom, - ext: 'png' - }).addTo(this); - - if (this.mutantOptions.doubleClickLabels) { - this.doubleClickLabels.enable(); - } - - return this; - } -}); // start off with doubleClickZoom enabled, doubleClickLabels can later be enabled instead -// during initialization - -L.Map.addInitHook(function () { - this.doubleClickLabels.disable(); - this.doubleClickZoom.enable(); -}); - -/***/ }), - -/***/ "./src/util/DomUtil.js": -/*!*****************************!*\ - !*** ./src/util/DomUtil.js ***! - \*****************************/ -/***/ (function() { - -L.DomUtil = L.extend(L.DomUtil, { - initTranslation: function initTranslation(obj) { - this.translation = obj; - }, - getMatrixString: function getMatrixString(m) { - var is3d = L.Browser.webkit3d || L.Browser.gecko3d || L.Browser.ie3d; - /* - * Since matrix3d takes a 4*4 matrix, we add in an empty row and column, - * which act as the identity on the z-axis. - * See: - * http://franklinta.com/2014/09/08/computing-css-matrix3d-transforms/ - * https://developer.mozilla.org/en-US/docs/Web/CSS/transform-function#M.C3.B6bius'_homogeneous_coordinates_in_projective_geometry - */ - - var matrix = [m[0], m[3], 0, m[6], m[1], m[4], 0, m[7], 0, 0, 1, 0, m[2], m[5], 0, m[8]]; - var str = is3d ? 'matrix3d(' + matrix.join(',') + ')' : ''; - - if (!is3d) { - console.log('Your browser must support 3D CSS transforms' + 'in order to use DistortableImageOverlay.'); - } - - return str; - }, - toggleClass: function toggleClass(el, className) { - var c = className; - return this.hasClass(el, c) ? this.removeClass(el, c) : this.addClass(el, c); - }, - confirmDelete: function confirmDelete() { - return window.confirm(this.translation.confirmImageDelete); - }, - confirmDeletes: function confirmDeletes(n) { - if (n === 1) { - return this.confirmDelete(); - } - - var translation = this.translation.confirmImagesDeletes; - var warningMsg = ''; - - if (typeof translation === 'function') { - warningMsg = translation(n); - } else { - warningMsg = translation; - } - - return window.confirm(warningMsg); - } -}); - -/***/ }), - -/***/ "./src/util/IconUtil.js": -/*!******************************!*\ - !*** ./src/util/IconUtil.js ***! - \******************************/ -/***/ (function() { - -L.IconUtil = { - /* creates an svg elemenet with built in accessibility properties - * and standardized classes for styling, takes in the fragment - * identifier (id) of the symbol to reference. note for symplicity - * we allow providing the icon target with or without the '#' prefix - */ - create: function create(ref) { - if (/^#/.test(ref)) { - ref = ref.replace(/^#/, ''); - } - - return '' + '' + ''; - }, - addClassToSvg: function addClassToSvg(container, loader) { - var svg = container.querySelector('svg'); - - if (svg) { - L.DomUtil.addClass(svg, loader); - } - }, - // finds the use element and toggles its icon reference - toggleXlink: function toggleXlink(container, ref1, ref2) { - if (!/^#/.test(ref1)) { - ref1 = '#' + ref1; - } - - if (!/^#/.test(ref2)) { - ref2 = '#' + ref2; - } - - var use = container.querySelector('use'); - - if (use) { - var toggled = use.getAttribute('xlink:href') === ref1 ? ref2 : ref1; - use.setAttribute('xlink:href', toggled); - return toggled; - } - - return false; - }, - toggleTitle: function toggleTitle(container, title1, title2) { - var toggled = container.getAttribute('title') === title1 ? title2 : title1; - container.setAttribute('title', toggled); - - if (container.hasAttribute('aria-label')) { - container.setAttribute('aria-label', toggled); - } - - return toggled; - } -}; - -/***/ }), - -/***/ "./src/util/ImageUtil.js": -/*!*******************************!*\ - !*** ./src/util/ImageUtil.js ***! - \*******************************/ -/***/ (function() { - -L.ImageUtil = { - getCmPerPixel: function getCmPerPixel(overlay) { - var map = overlay._map; - var dist = map.latLngToLayerPoint(overlay.getCorner(0)).distanceTo(map.latLngToLayerPoint(overlay.getCorner(1))); - return dist * 100 / overlay.getElement().width; - } -}; - -/***/ }), - -/***/ "./src/util/MatrixUtil.js": -/*!********************************!*\ - !*** ./src/util/MatrixUtil.js ***! - \********************************/ -/***/ (function() { - -L.MatrixUtil = { - // Compute the adjugate of m - adj: function adj(m) { - return [m[4] * m[8] - m[5] * m[7], m[2] * m[7] - m[1] * m[8], m[1] * m[5] - m[2] * m[4], m[5] * m[6] - m[3] * m[8], m[0] * m[8] - m[2] * m[6], m[2] * m[3] - m[0] * m[5], m[3] * m[7] - m[4] * m[6], m[1] * m[6] - m[0] * m[7], m[0] * m[4] - m[1] * m[3]]; - }, - // multiply two 3*3 matrices - multmm: function multmm(a, b) { - var c = []; - var i; - - for (i = 0; i < 3; i++) { - for (var j = 0; j < 3; j++) { - var cij = 0; - - for (var k = 0; k < 3; k++) { - cij += a[3 * i + k] * b[3 * k + j]; - } - - c[3 * i + j] = cij; - } - } - - return c; - }, - // multiply a 3*3 matrix and a 3-vector - multmv: function multmv(m, v) { - return [m[0] * v[0] + m[1] * v[1] + m[2] * v[2], m[3] * v[0] + m[4] * v[1] + m[5] * v[2], m[6] * v[0] + m[7] * v[1] + m[8] * v[2]]; - }, - // multiply a scalar and a 3*3 matrix - multsm: function multsm(s, m) { - var matrix = []; - - for (var i = 0, l = m.length; i < l; i++) { - matrix.push(s * m[i]); - } - - return matrix; - }, - basisToPoints: function basisToPoints(x1, y1, x2, y2, x3, y3, x4, y4) { - var m = [x1, x2, x3, y1, y2, y3, 1, 1, 1]; - var v = L.MatrixUtil.multmv(L.MatrixUtil.adj(m), [x4, y4, 1]); - return L.MatrixUtil.multmm(m, [v[0], 0, 0, 0, v[1], 0, 0, 0, v[2]]); - }, - project: function project(m, x, y) { - var v = L.MatrixUtil.multmv(m, [x, y, 1]); - return [v[0] / v[2], v[1] / v[2]]; - }, - general2DProjection: function general2DProjection(x1s, y1s, x1d, y1d, x2s, y2s, x2d, y2d, x3s, y3s, x3d, y3d, x4s, y4s, x4d, y4d) { - var s = L.MatrixUtil.basisToPoints(x1s, y1s, x2s, y2s, x3s, y3s, x4s, y4s); - var d = L.MatrixUtil.basisToPoints(x1d, y1d, x2d, y2d, x3d, y3d, x4d, y4d); - var m = L.MatrixUtil.multmm(d, L.MatrixUtil.adj(s)); // Normalize to the unique matrix with m[8] == 1. - // See: http://franklinta.com/2014/09/08/computing-css-matrix3d-transforms/ - - return L.MatrixUtil.multsm(1 / m[8], m); - } -}; - -/***/ }), - -/***/ "./src/util/TrigUtil.js": -/*!******************************!*\ - !*** ./src/util/TrigUtil.js ***! - \******************************/ -/***/ (function() { - -L.TrigUtil = { - calcAngle: function calcAngle(x, y) { - var unit = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'deg'; - return unit === 'deg' ? this.radiansToDegrees(Math.atan2(y, x)) : Math.atan2(y, x); - }, - radiansToDegrees: function radiansToDegrees(angle) { - return angle * 180 / Math.PI; - }, - degreesToRadians: function degreesToRadians(angle) { - return angle * Math.PI / 180; - } -}; - -/***/ }), - -/***/ "./src/util/Utils.js": -/*!***************************!*\ - !*** ./src/util/Utils.js ***! - \***************************/ -/***/ (function() { - -L.Utils = { - initTranslation: function initTranslation() { - var translation = { - deleteImage: 'Delete Image', - deleteImages: 'Delete Images', - distortImage: 'Distort Image', - dragImage: 'Drag Image', - exportImage: 'Export Image', - exportImages: 'Export Images', - removeBorder: 'Remove Border', - addBorder: 'Add Border', - freeRotateImage: 'Free rotate Image', - geolocateImage: 'Geolocate Image', - lockMode: 'Lock Mode', - lockImages: 'Lock Images', - makeImageOpaque: 'Make Image Opaque', - makeImageTransparent: 'Make Image Transparent', - restoreImage: 'Restore Natural Image', - rotateImage: 'Rotate Image', - scaleImage: 'Scale Image', - stackToFront: 'Stack to Front', - stackToBack: 'Stack to Back', - unlockImages: 'Unlock Images', - confirmImageDelete: 'Are you sure? This image will be permanently deleted from the map.', - confirmImagesDeletes: 'Are you sure? These images will be permanently deleted from the map.' - }; - - if (!this.options.translation) { - this.options.translation = translation; - } else { - // If the translation for a word is not specified, fallback to English. - for (var key in translation) { - if (!this.options.translation.hasOwnProperty(key)) { - this.options.translation[key] = translation[key]; - } - } - } - - L.DomUtil.initTranslation(this.options.translation); - }, - getNestedVal: function getNestedVal(obj, key, nestedKey) { - var dig = [key, nestedKey]; - return dig.reduce(function (obj, k) { - return obj && obj[k]; - }, obj); - } -}; - -/***/ }), - -/***/ "./node_modules/events/events.js": -/*!***************************************!*\ - !*** ./node_modules/events/events.js ***! - \***************************************/ -/***/ (function(module) { - -"use strict"; -// Copyright Joyent, Inc. and other Node contributors. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to permit -// persons to whom the Software is furnished to do so, subject to the -// following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -// USE OR OTHER DEALINGS IN THE SOFTWARE. - - - -var R = typeof Reflect === 'object' ? Reflect : null -var ReflectApply = R && typeof R.apply === 'function' - ? R.apply - : function ReflectApply(target, receiver, args) { - return Function.prototype.apply.call(target, receiver, args); - } - -var ReflectOwnKeys -if (R && typeof R.ownKeys === 'function') { - ReflectOwnKeys = R.ownKeys -} else if (Object.getOwnPropertySymbols) { - ReflectOwnKeys = function ReflectOwnKeys(target) { - return Object.getOwnPropertyNames(target) - .concat(Object.getOwnPropertySymbols(target)); - }; -} else { - ReflectOwnKeys = function ReflectOwnKeys(target) { - return Object.getOwnPropertyNames(target); - }; -} - -function ProcessEmitWarning(warning) { - if (console && console.warn) console.warn(warning); -} - -var NumberIsNaN = Number.isNaN || function NumberIsNaN(value) { - return value !== value; -} - -function EventEmitter() { - EventEmitter.init.call(this); -} -module.exports = EventEmitter; -module.exports.once = once; - -// Backwards-compat with node 0.10.x -EventEmitter.EventEmitter = EventEmitter; - -EventEmitter.prototype._events = undefined; -EventEmitter.prototype._eventsCount = 0; -EventEmitter.prototype._maxListeners = undefined; - -// By default EventEmitters will print a warning if more than 10 listeners are -// added to it. This is a useful default which helps finding memory leaks. -var defaultMaxListeners = 10; - -function checkListener(listener) { - if (typeof listener !== 'function') { - throw new TypeError('The "listener" argument must be of type Function. Received type ' + typeof listener); - } -} - -Object.defineProperty(EventEmitter, 'defaultMaxListeners', { - enumerable: true, - get: function() { - return defaultMaxListeners; - }, - set: function(arg) { - if (typeof arg !== 'number' || arg < 0 || NumberIsNaN(arg)) { - throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received ' + arg + '.'); - } - defaultMaxListeners = arg; - } -}); - -EventEmitter.init = function() { - - if (this._events === undefined || - this._events === Object.getPrototypeOf(this)._events) { - this._events = Object.create(null); - this._eventsCount = 0; - } - - this._maxListeners = this._maxListeners || undefined; -}; - -// Obviously not all Emitters should be limited to 10. This function allows -// that to be increased. Set to zero for unlimited. -EventEmitter.prototype.setMaxListeners = function setMaxListeners(n) { - if (typeof n !== 'number' || n < 0 || NumberIsNaN(n)) { - throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received ' + n + '.'); - } - this._maxListeners = n; - return this; -}; - -function _getMaxListeners(that) { - if (that._maxListeners === undefined) - return EventEmitter.defaultMaxListeners; - return that._maxListeners; -} - -EventEmitter.prototype.getMaxListeners = function getMaxListeners() { - return _getMaxListeners(this); -}; - -EventEmitter.prototype.emit = function emit(type) { - var args = []; - for (var i = 1; i < arguments.length; i++) args.push(arguments[i]); - var doError = (type === 'error'); - - var events = this._events; - if (events !== undefined) - doError = (doError && events.error === undefined); - else if (!doError) - return false; - - // If there is no 'error' event listener then throw. - if (doError) { - var er; - if (args.length > 0) - er = args[0]; - if (er instanceof Error) { - // Note: The comments on the `throw` lines are intentional, they show - // up in Node's output if this results in an unhandled exception. - throw er; // Unhandled 'error' event - } - // At least give some kind of context to the user - var err = new Error('Unhandled error.' + (er ? ' (' + er.message + ')' : '')); - err.context = er; - throw err; // Unhandled 'error' event - } - - var handler = events[type]; - - if (handler === undefined) - return false; - - if (typeof handler === 'function') { - ReflectApply(handler, this, args); - } else { - var len = handler.length; - var listeners = arrayClone(handler, len); - for (var i = 0; i < len; ++i) - ReflectApply(listeners[i], this, args); - } - - return true; -}; - -function _addListener(target, type, listener, prepend) { - var m; - var events; - var existing; - - checkListener(listener); - - events = target._events; - if (events === undefined) { - events = target._events = Object.create(null); - target._eventsCount = 0; - } else { - // To avoid recursion in the case that type === "newListener"! Before - // adding it to the listeners, first emit "newListener". - if (events.newListener !== undefined) { - target.emit('newListener', type, - listener.listener ? listener.listener : listener); - - // Re-assign `events` because a newListener handler could have caused the - // this._events to be assigned to a new object - events = target._events; - } - existing = events[type]; - } - - if (existing === undefined) { - // Optimize the case of one listener. Don't need the extra array object. - existing = events[type] = listener; - ++target._eventsCount; - } else { - if (typeof existing === 'function') { - // Adding the second element, need to change to array. - existing = events[type] = - prepend ? [listener, existing] : [existing, listener]; - // If we've already got an array, just append. - } else if (prepend) { - existing.unshift(listener); - } else { - existing.push(listener); - } - - // Check for listener leak - m = _getMaxListeners(target); - if (m > 0 && existing.length > m && !existing.warned) { - existing.warned = true; - // No error code for this since it is a Warning - // eslint-disable-next-line no-restricted-syntax - var w = new Error('Possible EventEmitter memory leak detected. ' + - existing.length + ' ' + String(type) + ' listeners ' + - 'added. Use emitter.setMaxListeners() to ' + - 'increase limit'); - w.name = 'MaxListenersExceededWarning'; - w.emitter = target; - w.type = type; - w.count = existing.length; - ProcessEmitWarning(w); - } - } - - return target; -} - -EventEmitter.prototype.addListener = function addListener(type, listener) { - return _addListener(this, type, listener, false); -}; - -EventEmitter.prototype.on = EventEmitter.prototype.addListener; - -EventEmitter.prototype.prependListener = - function prependListener(type, listener) { - return _addListener(this, type, listener, true); - }; - -function onceWrapper() { - if (!this.fired) { - this.target.removeListener(this.type, this.wrapFn); - this.fired = true; - if (arguments.length === 0) - return this.listener.call(this.target); - return this.listener.apply(this.target, arguments); - } -} - -function _onceWrap(target, type, listener) { - var state = { fired: false, wrapFn: undefined, target: target, type: type, listener: listener }; - var wrapped = onceWrapper.bind(state); - wrapped.listener = listener; - state.wrapFn = wrapped; - return wrapped; -} - -EventEmitter.prototype.once = function once(type, listener) { - checkListener(listener); - this.on(type, _onceWrap(this, type, listener)); - return this; -}; - -EventEmitter.prototype.prependOnceListener = - function prependOnceListener(type, listener) { - checkListener(listener); - this.prependListener(type, _onceWrap(this, type, listener)); - return this; - }; - -// Emits a 'removeListener' event if and only if the listener was removed. -EventEmitter.prototype.removeListener = - function removeListener(type, listener) { - var list, events, position, i, originalListener; - - checkListener(listener); - - events = this._events; - if (events === undefined) - return this; - - list = events[type]; - if (list === undefined) - return this; - - if (list === listener || list.listener === listener) { - if (--this._eventsCount === 0) - this._events = Object.create(null); - else { - delete events[type]; - if (events.removeListener) - this.emit('removeListener', type, list.listener || listener); - } - } else if (typeof list !== 'function') { - position = -1; - - for (i = list.length - 1; i >= 0; i--) { - if (list[i] === listener || list[i].listener === listener) { - originalListener = list[i].listener; - position = i; - break; - } - } - - if (position < 0) - return this; - - if (position === 0) - list.shift(); - else { - spliceOne(list, position); - } - - if (list.length === 1) - events[type] = list[0]; - - if (events.removeListener !== undefined) - this.emit('removeListener', type, originalListener || listener); - } - - return this; - }; - -EventEmitter.prototype.off = EventEmitter.prototype.removeListener; - -EventEmitter.prototype.removeAllListeners = - function removeAllListeners(type) { - var listeners, events, i; - - events = this._events; - if (events === undefined) - return this; - - // not listening for removeListener, no need to emit - if (events.removeListener === undefined) { - if (arguments.length === 0) { - this._events = Object.create(null); - this._eventsCount = 0; - } else if (events[type] !== undefined) { - if (--this._eventsCount === 0) - this._events = Object.create(null); - else - delete events[type]; - } - return this; - } - - // emit removeListener for all listeners on all events - if (arguments.length === 0) { - var keys = Object.keys(events); - var key; - for (i = 0; i < keys.length; ++i) { - key = keys[i]; - if (key === 'removeListener') continue; - this.removeAllListeners(key); - } - this.removeAllListeners('removeListener'); - this._events = Object.create(null); - this._eventsCount = 0; - return this; - } - - listeners = events[type]; - - if (typeof listeners === 'function') { - this.removeListener(type, listeners); - } else if (listeners !== undefined) { - // LIFO order - for (i = listeners.length - 1; i >= 0; i--) { - this.removeListener(type, listeners[i]); - } - } - - return this; - }; - -function _listeners(target, type, unwrap) { - var events = target._events; - - if (events === undefined) - return []; - - var evlistener = events[type]; - if (evlistener === undefined) - return []; - - if (typeof evlistener === 'function') - return unwrap ? [evlistener.listener || evlistener] : [evlistener]; - - return unwrap ? - unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length); -} - -EventEmitter.prototype.listeners = function listeners(type) { - return _listeners(this, type, true); -}; - -EventEmitter.prototype.rawListeners = function rawListeners(type) { - return _listeners(this, type, false); -}; - -EventEmitter.listenerCount = function(emitter, type) { - if (typeof emitter.listenerCount === 'function') { - return emitter.listenerCount(type); - } else { - return listenerCount.call(emitter, type); - } -}; - -EventEmitter.prototype.listenerCount = listenerCount; -function listenerCount(type) { - var events = this._events; - - if (events !== undefined) { - var evlistener = events[type]; - - if (typeof evlistener === 'function') { - return 1; - } else if (evlistener !== undefined) { - return evlistener.length; - } - } - - return 0; -} - -EventEmitter.prototype.eventNames = function eventNames() { - return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : []; -}; - -function arrayClone(arr, n) { - var copy = new Array(n); - for (var i = 0; i < n; ++i) - copy[i] = arr[i]; - return copy; -} - -function spliceOne(list, index) { - for (; index + 1 < list.length; index++) - list[index] = list[index + 1]; - list.pop(); -} - -function unwrapListeners(arr) { - var ret = new Array(arr.length); - for (var i = 0; i < ret.length; ++i) { - ret[i] = arr[i].listener || arr[i]; - } - return ret; -} - -function once(emitter, name) { - return new Promise(function (resolve, reject) { - function errorListener(err) { - emitter.removeListener(name, resolver); - reject(err); - } - - function resolver() { - if (typeof emitter.removeListener === 'function') { - emitter.removeListener('error', errorListener); - } - resolve([].slice.call(arguments)); - }; - - eventTargetAgnosticAddListener(emitter, name, resolver, { once: true }); - if (name !== 'error') { - addErrorHandlerIfEventEmitter(emitter, errorListener, { once: true }); - } - }); -} - -function addErrorHandlerIfEventEmitter(emitter, handler, flags) { - if (typeof emitter.on === 'function') { - eventTargetAgnosticAddListener(emitter, 'error', handler, flags); - } -} - -function eventTargetAgnosticAddListener(emitter, name, listener, flags) { - if (typeof emitter.on === 'function') { - if (flags.once) { - emitter.once(name, listener); - } else { - emitter.on(name, listener); - } - } else if (typeof emitter.addEventListener === 'function') { - // EventTarget does not have `error` event semantics like Node - // EventEmitters, we do not listen for `error` events here. - emitter.addEventListener(name, function wrapListener(arg) { - // IE does not have builtin `{ once: true }` support so we - // have to do it manually. - if (flags.once) { - emitter.removeEventListener(name, wrapListener); - } - listener(arg); - }); - } else { - throw new TypeError('The "emitter" argument must be of type EventEmitter. Received type ' + typeof emitter); - } -} - - -/***/ }), - -/***/ "./node_modules/html-entities/lib/index.js": -/*!*************************************************!*\ - !*** ./node_modules/html-entities/lib/index.js ***! - \*************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - -"use strict"; - -var __assign = (this && this.__assign) || function () { - __assign = Object.assign || function(t) { - for (var s, i = 1, n = arguments.length; i < n; i++) { - s = arguments[i]; - for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) - t[p] = s[p]; - } - return t; - }; - return __assign.apply(this, arguments); -}; -Object.defineProperty(exports, "__esModule", ({ value: true })); -var named_references_1 = __webpack_require__(/*! ./named-references */ "./node_modules/html-entities/lib/named-references.js"); -var numeric_unicode_map_1 = __webpack_require__(/*! ./numeric-unicode-map */ "./node_modules/html-entities/lib/numeric-unicode-map.js"); -var surrogate_pairs_1 = __webpack_require__(/*! ./surrogate-pairs */ "./node_modules/html-entities/lib/surrogate-pairs.js"); -var allNamedReferences = __assign(__assign({}, named_references_1.namedReferences), { all: named_references_1.namedReferences.html5 }); -var encodeRegExps = { - specialChars: /[<>'"&]/g, - nonAscii: /(?:[<>'"&\u0080-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])/g, - nonAsciiPrintable: /(?:[<>'"&\x01-\x08\x11-\x15\x17-\x1F\x7f-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])/g, - extensive: /(?:[\x01-\x0c\x0e-\x1f\x21-\x2c\x2e-\x2f\x3a-\x40\x5b-\x60\x7b-\x7d\x7f-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])/g -}; -var defaultEncodeOptions = { - mode: 'specialChars', - level: 'all', - numeric: 'decimal' -}; -/** Encodes all the necessary (specified by `level`) characters in the text */ -function encode(text, _a) { - var _b = _a === void 0 ? defaultEncodeOptions : _a, _c = _b.mode, mode = _c === void 0 ? 'specialChars' : _c, _d = _b.numeric, numeric = _d === void 0 ? 'decimal' : _d, _e = _b.level, level = _e === void 0 ? 'all' : _e; - if (!text) { - return ''; - } - var encodeRegExp = encodeRegExps[mode]; - var references = allNamedReferences[level].characters; - var isHex = numeric === 'hexadecimal'; - encodeRegExp.lastIndex = 0; - var _b = encodeRegExp.exec(text); - var _c; - if (_b) { - _c = ''; - var _d = 0; - do { - if (_d !== _b.index) { - _c += text.substring(_d, _b.index); - } - var _e = _b[0]; - var result_1 = references[_e]; - if (!result_1) { - var code_1 = _e.length > 1 ? surrogate_pairs_1.getCodePoint(_e, 0) : _e.charCodeAt(0); - result_1 = (isHex ? '&#x' + code_1.toString(16) : '&#' + code_1) + ';'; - } - _c += result_1; - _d = _b.index + _e.length; - } while ((_b = encodeRegExp.exec(text))); - if (_d !== text.length) { - _c += text.substring(_d); - } - } - else { - _c = - text; - } - return _c; -} -exports.encode = encode; -var defaultDecodeOptions = { - scope: 'body', - level: 'all' -}; -var strict = /&(?:#\d+|#[xX][\da-fA-F]+|[0-9a-zA-Z]+);/g; -var attribute = /&(?:#\d+|#[xX][\da-fA-F]+|[0-9a-zA-Z]+)[;=]?/g; -var baseDecodeRegExps = { - xml: { - strict: strict, - attribute: attribute, - body: named_references_1.bodyRegExps.xml - }, - html4: { - strict: strict, - attribute: attribute, - body: named_references_1.bodyRegExps.html4 - }, - html5: { - strict: strict, - attribute: attribute, - body: named_references_1.bodyRegExps.html5 - } -}; -var decodeRegExps = __assign(__assign({}, baseDecodeRegExps), { all: baseDecodeRegExps.html5 }); -var fromCharCode = String.fromCharCode; -var outOfBoundsChar = fromCharCode(65533); -var defaultDecodeEntityOptions = { - level: 'all' -}; -/** Decodes a single entity */ -function decodeEntity(entity, _a) { - var _b = (_a === void 0 ? defaultDecodeEntityOptions : _a).level, level = _b === void 0 ? 'all' : _b; - if (!entity) { - return ''; - } - var _b = entity; - var decodeEntityLastChar_1 = entity[entity.length - 1]; - if (false) {} - else if (false) {} - else { - var decodeResultByReference_1 = allNamedReferences[level].entities[entity]; - if (decodeResultByReference_1) { - _b = decodeResultByReference_1; - } - else if (entity[0] === '&' && entity[1] === '#') { - var decodeSecondChar_1 = entity[2]; - var decodeCode_1 = decodeSecondChar_1 == 'x' || decodeSecondChar_1 == 'X' - ? parseInt(entity.substr(3), 16) - : parseInt(entity.substr(2)); - _b = - decodeCode_1 >= 0x10ffff - ? outOfBoundsChar - : decodeCode_1 > 65535 - ? surrogate_pairs_1.fromCodePoint(decodeCode_1) - : fromCharCode(numeric_unicode_map_1.numericUnicodeMap[decodeCode_1] || decodeCode_1); - } - } - return _b; -} -exports.decodeEntity = decodeEntity; -/** Decodes all entities in the text */ -function decode(text, _a) { - var decodeSecondChar_1 = _a === void 0 ? defaultDecodeOptions : _a, decodeCode_1 = decodeSecondChar_1.level, level = decodeCode_1 === void 0 ? 'all' : decodeCode_1, _b = decodeSecondChar_1.scope, scope = _b === void 0 ? level === 'xml' ? 'strict' : 'body' : _b; - if (!text) { - return ''; - } - var decodeRegExp = decodeRegExps[level][scope]; - var references = allNamedReferences[level].entities; - var isAttribute = scope === 'attribute'; - var isStrict = scope === 'strict'; - decodeRegExp.lastIndex = 0; - var replaceMatch_1 = decodeRegExp.exec(text); - var replaceResult_1; - if (replaceMatch_1) { - replaceResult_1 = ''; - var replaceLastIndex_1 = 0; - do { - if (replaceLastIndex_1 !== replaceMatch_1.index) { - replaceResult_1 += text.substring(replaceLastIndex_1, replaceMatch_1.index); - } - var replaceInput_1 = replaceMatch_1[0]; - var decodeResult_1 = replaceInput_1; - var decodeEntityLastChar_2 = replaceInput_1[replaceInput_1.length - 1]; - if (isAttribute - && decodeEntityLastChar_2 === '=') { - decodeResult_1 = replaceInput_1; - } - else if (isStrict - && decodeEntityLastChar_2 !== ';') { - decodeResult_1 = replaceInput_1; - } - else { - var decodeResultByReference_2 = references[replaceInput_1]; - if (decodeResultByReference_2) { - decodeResult_1 = decodeResultByReference_2; - } - else if (replaceInput_1[0] === '&' && replaceInput_1[1] === '#') { - var decodeSecondChar_2 = replaceInput_1[2]; - var decodeCode_2 = decodeSecondChar_2 == 'x' || decodeSecondChar_2 == 'X' - ? parseInt(replaceInput_1.substr(3), 16) - : parseInt(replaceInput_1.substr(2)); - decodeResult_1 = - decodeCode_2 >= 0x10ffff - ? outOfBoundsChar - : decodeCode_2 > 65535 - ? surrogate_pairs_1.fromCodePoint(decodeCode_2) - : fromCharCode(numeric_unicode_map_1.numericUnicodeMap[decodeCode_2] || decodeCode_2); - } - } - replaceResult_1 += decodeResult_1; - replaceLastIndex_1 = replaceMatch_1.index + replaceInput_1.length; - } while ((replaceMatch_1 = decodeRegExp.exec(text))); - if (replaceLastIndex_1 !== text.length) { - replaceResult_1 += text.substring(replaceLastIndex_1); - } - } - else { - replaceResult_1 = - text; - } - return replaceResult_1; -} -exports.decode = decode; - - -/***/ }), - -/***/ "./node_modules/html-entities/lib/named-references.js": -/*!************************************************************!*\ - !*** ./node_modules/html-entities/lib/named-references.js ***! - \************************************************************/ -/***/ (function(__unused_webpack_module, exports) { - -"use strict"; -Object.defineProperty(exports, "__esModule", ({value:true}));exports.bodyRegExps={xml:/&(?:#\d+|#[xX][\da-fA-F]+|[0-9a-zA-Z]+);?/g,html4:/&(?:nbsp|iexcl|cent|pound|curren|yen|brvbar|sect|uml|copy|ordf|laquo|not|shy|reg|macr|deg|plusmn|sup2|sup3|acute|micro|para|middot|cedil|sup1|ordm|raquo|frac14|frac12|frac34|iquest|Agrave|Aacute|Acirc|Atilde|Auml|Aring|AElig|Ccedil|Egrave|Eacute|Ecirc|Euml|Igrave|Iacute|Icirc|Iuml|ETH|Ntilde|Ograve|Oacute|Ocirc|Otilde|Ouml|times|Oslash|Ugrave|Uacute|Ucirc|Uuml|Yacute|THORN|szlig|agrave|aacute|acirc|atilde|auml|aring|aelig|ccedil|egrave|eacute|ecirc|euml|igrave|iacute|icirc|iuml|eth|ntilde|ograve|oacute|ocirc|otilde|ouml|divide|oslash|ugrave|uacute|ucirc|uuml|yacute|thorn|yuml|quot|amp|lt|gt|#\d+|#[xX][\da-fA-F]+|[0-9a-zA-Z]+);?/g,html5:/&(?:AElig|AMP|Aacute|Acirc|Agrave|Aring|Atilde|Auml|COPY|Ccedil|ETH|Eacute|Ecirc|Egrave|Euml|GT|Iacute|Icirc|Igrave|Iuml|LT|Ntilde|Oacute|Ocirc|Ograve|Oslash|Otilde|Ouml|QUOT|REG|THORN|Uacute|Ucirc|Ugrave|Uuml|Yacute|aacute|acirc|acute|aelig|agrave|amp|aring|atilde|auml|brvbar|ccedil|cedil|cent|copy|curren|deg|divide|eacute|ecirc|egrave|eth|euml|frac12|frac14|frac34|gt|iacute|icirc|iexcl|igrave|iquest|iuml|laquo|lt|macr|micro|middot|nbsp|not|ntilde|oacute|ocirc|ograve|ordf|ordm|oslash|otilde|ouml|para|plusmn|pound|quot|raquo|reg|sect|shy|sup1|sup2|sup3|szlig|thorn|times|uacute|ucirc|ugrave|uml|uuml|yacute|yen|yuml|#\d+|#[xX][\da-fA-F]+|[0-9a-zA-Z]+);?/g};exports.namedReferences={xml:{entities:{"<":"<",">":">",""":'"',"'":"'","&":"&"},characters:{"<":"<",">":">",'"':""","'":"'","&":"&"}},html4:{entities:{"'":"'"," ":" "," ":" ","¡":"¡","¡":"¡","¢":"¢","¢":"¢","£":"£","£":"£","¤":"¤","¤":"¤","¥":"¥","¥":"¥","¦":"¦","¦":"¦","§":"§","§":"§","¨":"¨","¨":"¨","©":"©","©":"©","ª":"ª","ª":"ª","«":"«","«":"«","¬":"¬","¬":"¬","­":"­","­":"­","®":"®","®":"®","¯":"¯","¯":"¯","°":"°","°":"°","±":"±","±":"±","²":"²","²":"²","³":"³","³":"³","´":"´","´":"´","µ":"µ","µ":"µ","¶":"¶","¶":"¶","·":"·","·":"·","¸":"¸","¸":"¸","¹":"¹","¹":"¹","º":"º","º":"º","»":"»","»":"»","¼":"¼","¼":"¼","½":"½","½":"½","¾":"¾","¾":"¾","¿":"¿","¿":"¿","À":"À","À":"À","Á":"Á","Á":"Á","Â":"Â","Â":"Â","Ã":"Ã","Ã":"Ã","Ä":"Ä","Ä":"Ä","Å":"Å","Å":"Å","Æ":"Æ","Æ":"Æ","Ç":"Ç","Ç":"Ç","È":"È","È":"È","É":"É","É":"É","Ê":"Ê","Ê":"Ê","Ë":"Ë","Ë":"Ë","Ì":"Ì","Ì":"Ì","Í":"Í","Í":"Í","Î":"Î","Î":"Î","Ï":"Ï","Ï":"Ï","Ð":"Ð","Ð":"Ð","Ñ":"Ñ","Ñ":"Ñ","Ò":"Ò","Ò":"Ò","Ó":"Ó","Ó":"Ó","Ô":"Ô","Ô":"Ô","Õ":"Õ","Õ":"Õ","Ö":"Ö","Ö":"Ö","×":"×","×":"×","Ø":"Ø","Ø":"Ø","Ù":"Ù","Ù":"Ù","Ú":"Ú","Ú":"Ú","Û":"Û","Û":"Û","Ü":"Ü","Ü":"Ü","Ý":"Ý","Ý":"Ý","Þ":"Þ","Þ":"Þ","ß":"ß","ß":"ß","à":"à","à":"à","á":"á","á":"á","â":"â","â":"â","ã":"ã","ã":"ã","ä":"ä","ä":"ä","å":"å","å":"å","æ":"æ","æ":"æ","ç":"ç","ç":"ç","è":"è","è":"è","é":"é","é":"é","ê":"ê","ê":"ê","ë":"ë","ë":"ë","ì":"ì","ì":"ì","í":"í","í":"í","î":"î","î":"î","ï":"ï","ï":"ï","ð":"ð","ð":"ð","ñ":"ñ","ñ":"ñ","ò":"ò","ò":"ò","ó":"ó","ó":"ó","ô":"ô","ô":"ô","õ":"õ","õ":"õ","ö":"ö","ö":"ö","÷":"÷","÷":"÷","ø":"ø","ø":"ø","ù":"ù","ù":"ù","ú":"ú","ú":"ú","û":"û","û":"û","ü":"ü","ü":"ü","ý":"ý","ý":"ý","þ":"þ","þ":"þ","ÿ":"ÿ","ÿ":"ÿ",""":'"',""":'"',"&":"&","&":"&","<":"<","<":"<",">":">",">":">","Œ":"Œ","œ":"œ","Š":"Š","š":"š","Ÿ":"Ÿ","ˆ":"ˆ","˜":"˜"," ":" "," ":" "," ":" ","‌":"‌","‍":"‍","‎":"‎","‏":"‏","–":"–","—":"—","‘":"‘","’":"’","‚":"‚","“":"“","”":"”","„":"„","†":"†","‡":"‡","‰":"‰","‹":"‹","›":"›","€":"€","ƒ":"ƒ","Α":"Α","Β":"Β","Γ":"Γ","Δ":"Δ","Ε":"Ε","Ζ":"Ζ","Η":"Η","Θ":"Θ","Ι":"Ι","Κ":"Κ","Λ":"Λ","Μ":"Μ","Ν":"Ν","Ξ":"Ξ","Ο":"Ο","Π":"Π","Ρ":"Ρ","Σ":"Σ","Τ":"Τ","Υ":"Υ","Φ":"Φ","Χ":"Χ","Ψ":"Ψ","Ω":"Ω","α":"α","β":"β","γ":"γ","δ":"δ","ε":"ε","ζ":"ζ","η":"η","θ":"θ","ι":"ι","κ":"κ","λ":"λ","μ":"μ","ν":"ν","ξ":"ξ","ο":"ο","π":"π","ρ":"ρ","ς":"ς","σ":"σ","τ":"τ","υ":"υ","φ":"φ","χ":"χ","ψ":"ψ","ω":"ω","ϑ":"ϑ","ϒ":"ϒ","ϖ":"ϖ","•":"•","…":"…","′":"′","″":"″","‾":"‾","⁄":"⁄","℘":"℘","ℑ":"ℑ","ℜ":"ℜ","™":"™","ℵ":"ℵ","←":"←","↑":"↑","→":"→","↓":"↓","↔":"↔","↵":"↵","⇐":"⇐","⇑":"⇑","⇒":"⇒","⇓":"⇓","⇔":"⇔","∀":"∀","∂":"∂","∃":"∃","∅":"∅","∇":"∇","∈":"∈","∉":"∉","∋":"∋","∏":"∏","∑":"∑","−":"−","∗":"∗","√":"√","∝":"∝","∞":"∞","∠":"∠","∧":"∧","∨":"∨","∩":"∩","∪":"∪","∫":"∫","∴":"∴","∼":"∼","≅":"≅","≈":"≈","≠":"≠","≡":"≡","≤":"≤","≥":"≥","⊂":"⊂","⊃":"⊃","⊄":"⊄","⊆":"⊆","⊇":"⊇","⊕":"⊕","⊗":"⊗","⊥":"⊥","⋅":"⋅","⌈":"⌈","⌉":"⌉","⌊":"⌊","⌋":"⌋","⟨":"〈","⟩":"〉","◊":"◊","♠":"♠","♣":"♣","♥":"♥","♦":"♦"},characters:{"'":"'"," ":" ","¡":"¡","¢":"¢","£":"£","¤":"¤","¥":"¥","¦":"¦","§":"§","¨":"¨","©":"©","ª":"ª","«":"«","¬":"¬","­":"­","®":"®","¯":"¯","°":"°","±":"±","²":"²","³":"³","´":"´","µ":"µ","¶":"¶","·":"·","¸":"¸","¹":"¹","º":"º","»":"»","¼":"¼","½":"½","¾":"¾","¿":"¿","À":"À","Á":"Á","Â":"Â","Ã":"Ã","Ä":"Ä","Å":"Å","Æ":"Æ","Ç":"Ç","È":"È","É":"É","Ê":"Ê","Ë":"Ë","Ì":"Ì","Í":"Í","Î":"Î","Ï":"Ï","Ð":"Ð","Ñ":"Ñ","Ò":"Ò","Ó":"Ó","Ô":"Ô","Õ":"Õ","Ö":"Ö","×":"×","Ø":"Ø","Ù":"Ù","Ú":"Ú","Û":"Û","Ü":"Ü","Ý":"Ý","Þ":"Þ","ß":"ß","à":"à","á":"á","â":"â","ã":"ã","ä":"ä","å":"å","æ":"æ","ç":"ç","è":"è","é":"é","ê":"ê","ë":"ë","ì":"ì","í":"í","î":"î","ï":"ï","ð":"ð","ñ":"ñ","ò":"ò","ó":"ó","ô":"ô","õ":"õ","ö":"ö","÷":"÷","ø":"ø","ù":"ù","ú":"ú","û":"û","ü":"ü","ý":"ý","þ":"þ","ÿ":"ÿ",'"':""","&":"&","<":"<",">":">","Œ":"Œ","œ":"œ","Š":"Š","š":"š","Ÿ":"Ÿ","ˆ":"ˆ","˜":"˜"," ":" "," ":" "," ":" ","‌":"‌","‍":"‍","‎":"‎","‏":"‏","–":"–","—":"—","‘":"‘","’":"’","‚":"‚","“":"“","”":"”","„":"„","†":"†","‡":"‡","‰":"‰","‹":"‹","›":"›","€":"€","ƒ":"ƒ","Α":"Α","Β":"Β","Γ":"Γ","Δ":"Δ","Ε":"Ε","Ζ":"Ζ","Η":"Η","Θ":"Θ","Ι":"Ι","Κ":"Κ","Λ":"Λ","Μ":"Μ","Ν":"Ν","Ξ":"Ξ","Ο":"Ο","Π":"Π","Ρ":"Ρ","Σ":"Σ","Τ":"Τ","Υ":"Υ","Φ":"Φ","Χ":"Χ","Ψ":"Ψ","Ω":"Ω","α":"α","β":"β","γ":"γ","δ":"δ","ε":"ε","ζ":"ζ","η":"η","θ":"θ","ι":"ι","κ":"κ","λ":"λ","μ":"μ","ν":"ν","ξ":"ξ","ο":"ο","π":"π","ρ":"ρ","ς":"ς","σ":"σ","τ":"τ","υ":"υ","φ":"φ","χ":"χ","ψ":"ψ","ω":"ω","ϑ":"ϑ","ϒ":"ϒ","ϖ":"ϖ","•":"•","…":"…","′":"′","″":"″","‾":"‾","⁄":"⁄","℘":"℘","ℑ":"ℑ","ℜ":"ℜ","™":"™","ℵ":"ℵ","←":"←","↑":"↑","→":"→","↓":"↓","↔":"↔","↵":"↵","⇐":"⇐","⇑":"⇑","⇒":"⇒","⇓":"⇓","⇔":"⇔","∀":"∀","∂":"∂","∃":"∃","∅":"∅","∇":"∇","∈":"∈","∉":"∉","∋":"∋","∏":"∏","∑":"∑","−":"−","∗":"∗","√":"√","∝":"∝","∞":"∞","∠":"∠","∧":"∧","∨":"∨","∩":"∩","∪":"∪","∫":"∫","∴":"∴","∼":"∼","≅":"≅","≈":"≈","≠":"≠","≡":"≡","≤":"≤","≥":"≥","⊂":"⊂","⊃":"⊃","⊄":"⊄","⊆":"⊆","⊇":"⊇","⊕":"⊕","⊗":"⊗","⊥":"⊥","⋅":"⋅","⌈":"⌈","⌉":"⌉","⌊":"⌊","⌋":"⌋","〈":"⟨","〉":"⟩","◊":"◊","♠":"♠","♣":"♣","♥":"♥","♦":"♦"}},html5:{entities:{"Æ":"Æ","Æ":"Æ","&":"&","&":"&","Á":"Á","Á":"Á","Ă":"Ă","Â":"Â","Â":"Â","А":"А","𝔄":"𝔄","À":"À","À":"À","Α":"Α","Ā":"Ā","⩓":"⩓","Ą":"Ą","𝔸":"𝔸","⁡":"⁡","Å":"Å","Å":"Å","𝒜":"𝒜","≔":"≔","Ã":"Ã","Ã":"Ã","Ä":"Ä","Ä":"Ä","∖":"∖","⫧":"⫧","⌆":"⌆","Б":"Б","∵":"∵","ℬ":"ℬ","Β":"Β","𝔅":"𝔅","𝔹":"𝔹","˘":"˘","ℬ":"ℬ","≎":"≎","Ч":"Ч","©":"©","©":"©","Ć":"Ć","⋒":"⋒","ⅅ":"ⅅ","ℭ":"ℭ","Č":"Č","Ç":"Ç","Ç":"Ç","Ĉ":"Ĉ","∰":"∰","Ċ":"Ċ","¸":"¸","·":"·","ℭ":"ℭ","Χ":"Χ","⊙":"⊙","⊖":"⊖","⊕":"⊕","⊗":"⊗","∲":"∲","”":"”","’":"’","∷":"∷","⩴":"⩴","≡":"≡","∯":"∯","∮":"∮","ℂ":"ℂ","∐":"∐","∳":"∳","⨯":"⨯","𝒞":"𝒞","⋓":"⋓","≍":"≍","ⅅ":"ⅅ","⤑":"⤑","Ђ":"Ђ","Ѕ":"Ѕ","Џ":"Џ","‡":"‡","↡":"↡","⫤":"⫤","Ď":"Ď","Д":"Д","∇":"∇","Δ":"Δ","𝔇":"𝔇","´":"´","˙":"˙","˝":"˝","`":"`","˜":"˜","⋄":"⋄","ⅆ":"ⅆ","𝔻":"𝔻","¨":"¨","⃜":"⃜","≐":"≐","∯":"∯","¨":"¨","⇓":"⇓","⇐":"⇐","⇔":"⇔","⫤":"⫤","⟸":"⟸","⟺":"⟺","⟹":"⟹","⇒":"⇒","⊨":"⊨","⇑":"⇑","⇕":"⇕","∥":"∥","↓":"↓","⤓":"⤓","⇵":"⇵","̑":"̑","⥐":"⥐","⥞":"⥞","↽":"↽","⥖":"⥖","⥟":"⥟","⇁":"⇁","⥗":"⥗","⊤":"⊤","↧":"↧","⇓":"⇓","𝒟":"𝒟","Đ":"Đ","Ŋ":"Ŋ","Ð":"Ð","Ð":"Ð","É":"É","É":"É","Ě":"Ě","Ê":"Ê","Ê":"Ê","Э":"Э","Ė":"Ė","𝔈":"𝔈","È":"È","È":"È","∈":"∈","Ē":"Ē","◻":"◻","▫":"▫","Ę":"Ę","𝔼":"𝔼","Ε":"Ε","⩵":"⩵","≂":"≂","⇌":"⇌","ℰ":"ℰ","⩳":"⩳","Η":"Η","Ë":"Ë","Ë":"Ë","∃":"∃","ⅇ":"ⅇ","Ф":"Ф","𝔉":"𝔉","◼":"◼","▪":"▪","𝔽":"𝔽","∀":"∀","ℱ":"ℱ","ℱ":"ℱ","Ѓ":"Ѓ",">":">",">":">","Γ":"Γ","Ϝ":"Ϝ","Ğ":"Ğ","Ģ":"Ģ","Ĝ":"Ĝ","Г":"Г","Ġ":"Ġ","𝔊":"𝔊","⋙":"⋙","𝔾":"𝔾","≥":"≥","⋛":"⋛","≧":"≧","⪢":"⪢","≷":"≷","⩾":"⩾","≳":"≳","𝒢":"𝒢","≫":"≫","Ъ":"Ъ","ˇ":"ˇ","^":"^","Ĥ":"Ĥ","ℌ":"ℌ","ℋ":"ℋ","ℍ":"ℍ","─":"─","ℋ":"ℋ","Ħ":"Ħ","≎":"≎","≏":"≏","Е":"Е","IJ":"IJ","Ё":"Ё","Í":"Í","Í":"Í","Î":"Î","Î":"Î","И":"И","İ":"İ","ℑ":"ℑ","Ì":"Ì","Ì":"Ì","ℑ":"ℑ","Ī":"Ī","ⅈ":"ⅈ","⇒":"⇒","∬":"∬","∫":"∫","⋂":"⋂","⁣":"⁣","⁢":"⁢","Į":"Į","𝕀":"𝕀","Ι":"Ι","ℐ":"ℐ","Ĩ":"Ĩ","І":"І","Ï":"Ï","Ï":"Ï","Ĵ":"Ĵ","Й":"Й","𝔍":"𝔍","𝕁":"𝕁","𝒥":"𝒥","Ј":"Ј","Є":"Є","Х":"Х","Ќ":"Ќ","Κ":"Κ","Ķ":"Ķ","К":"К","𝔎":"𝔎","𝕂":"𝕂","𝒦":"𝒦","Љ":"Љ","<":"<","<":"<","Ĺ":"Ĺ","Λ":"Λ","⟪":"⟪","ℒ":"ℒ","↞":"↞","Ľ":"Ľ","Ļ":"Ļ","Л":"Л","⟨":"⟨","←":"←","⇤":"⇤","⇆":"⇆","⌈":"⌈","⟦":"⟦","⥡":"⥡","⇃":"⇃","⥙":"⥙","⌊":"⌊","↔":"↔","⥎":"⥎","⊣":"⊣","↤":"↤","⥚":"⥚","⊲":"⊲","⧏":"⧏","⊴":"⊴","⥑":"⥑","⥠":"⥠","↿":"↿","⥘":"⥘","↼":"↼","⥒":"⥒","⇐":"⇐","⇔":"⇔","⋚":"⋚","≦":"≦","≶":"≶","⪡":"⪡","⩽":"⩽","≲":"≲","𝔏":"𝔏","⋘":"⋘","⇚":"⇚","Ŀ":"Ŀ","⟵":"⟵","⟷":"⟷","⟶":"⟶","⟸":"⟸","⟺":"⟺","⟹":"⟹","𝕃":"𝕃","↙":"↙","↘":"↘","ℒ":"ℒ","↰":"↰","Ł":"Ł","≪":"≪","⤅":"⤅","М":"М"," ":" ","ℳ":"ℳ","𝔐":"𝔐","∓":"∓","𝕄":"𝕄","ℳ":"ℳ","Μ":"Μ","Њ":"Њ","Ń":"Ń","Ň":"Ň","Ņ":"Ņ","Н":"Н","​":"​","​":"​","​":"​","​":"​","≫":"≫","≪":"≪"," ":"\n","𝔑":"𝔑","⁠":"⁠"," ":" ","ℕ":"ℕ","⫬":"⫬","≢":"≢","≭":"≭","∦":"∦","∉":"∉","≠":"≠","≂̸":"≂̸","∄":"∄","≯":"≯","≱":"≱","≧̸":"≧̸","≫̸":"≫̸","≹":"≹","⩾̸":"⩾̸","≵":"≵","≎̸":"≎̸","≏̸":"≏̸","⋪":"⋪","⧏̸":"⧏̸","⋬":"⋬","≮":"≮","≰":"≰","≸":"≸","≪̸":"≪̸","⩽̸":"⩽̸","≴":"≴","⪢̸":"⪢̸","⪡̸":"⪡̸","⊀":"⊀","⪯̸":"⪯̸","⋠":"⋠","∌":"∌","⋫":"⋫","⧐̸":"⧐̸","⋭":"⋭","⊏̸":"⊏̸","⋢":"⋢","⊐̸":"⊐̸","⋣":"⋣","⊂⃒":"⊂⃒","⊈":"⊈","⊁":"⊁","⪰̸":"⪰̸","⋡":"⋡","≿̸":"≿̸","⊃⃒":"⊃⃒","⊉":"⊉","≁":"≁","≄":"≄","≇":"≇","≉":"≉","∤":"∤","𝒩":"𝒩","Ñ":"Ñ","Ñ":"Ñ","Ν":"Ν","Œ":"Œ","Ó":"Ó","Ó":"Ó","Ô":"Ô","Ô":"Ô","О":"О","Ő":"Ő","𝔒":"𝔒","Ò":"Ò","Ò":"Ò","Ō":"Ō","Ω":"Ω","Ο":"Ο","𝕆":"𝕆","“":"“","‘":"‘","⩔":"⩔","𝒪":"𝒪","Ø":"Ø","Ø":"Ø","Õ":"Õ","Õ":"Õ","⨷":"⨷","Ö":"Ö","Ö":"Ö","‾":"‾","⏞":"⏞","⎴":"⎴","⏜":"⏜","∂":"∂","П":"П","𝔓":"𝔓","Φ":"Φ","Π":"Π","±":"±","ℌ":"ℌ","ℙ":"ℙ","⪻":"⪻","≺":"≺","⪯":"⪯","≼":"≼","≾":"≾","″":"″","∏":"∏","∷":"∷","∝":"∝","𝒫":"𝒫","Ψ":"Ψ",""":'"',""":'"',"𝔔":"𝔔","ℚ":"ℚ","𝒬":"𝒬","⤐":"⤐","®":"®","®":"®","Ŕ":"Ŕ","⟫":"⟫","↠":"↠","⤖":"⤖","Ř":"Ř","Ŗ":"Ŗ","Р":"Р","ℜ":"ℜ","∋":"∋","⇋":"⇋","⥯":"⥯","ℜ":"ℜ","Ρ":"Ρ","⟩":"⟩","→":"→","⇥":"⇥","⇄":"⇄","⌉":"⌉","⟧":"⟧","⥝":"⥝","⇂":"⇂","⥕":"⥕","⌋":"⌋","⊢":"⊢","↦":"↦","⥛":"⥛","⊳":"⊳","⧐":"⧐","⊵":"⊵","⥏":"⥏","⥜":"⥜","↾":"↾","⥔":"⥔","⇀":"⇀","⥓":"⥓","⇒":"⇒","ℝ":"ℝ","⥰":"⥰","⇛":"⇛","ℛ":"ℛ","↱":"↱","⧴":"⧴","Щ":"Щ","Ш":"Ш","Ь":"Ь","Ś":"Ś","⪼":"⪼","Š":"Š","Ş":"Ş","Ŝ":"Ŝ","С":"С","𝔖":"𝔖","↓":"↓","←":"←","→":"→","↑":"↑","Σ":"Σ","∘":"∘","𝕊":"𝕊","√":"√","□":"□","⊓":"⊓","⊏":"⊏","⊑":"⊑","⊐":"⊐","⊒":"⊒","⊔":"⊔","𝒮":"𝒮","⋆":"⋆","⋐":"⋐","⋐":"⋐","⊆":"⊆","≻":"≻","⪰":"⪰","≽":"≽","≿":"≿","∋":"∋","∑":"∑","⋑":"⋑","⊃":"⊃","⊇":"⊇","⋑":"⋑","Þ":"Þ","Þ":"Þ","™":"™","Ћ":"Ћ","Ц":"Ц"," ":"\t","Τ":"Τ","Ť":"Ť","Ţ":"Ţ","Т":"Т","𝔗":"𝔗","∴":"∴","Θ":"Θ","  ":"  "," ":" ","∼":"∼","≃":"≃","≅":"≅","≈":"≈","𝕋":"𝕋","⃛":"⃛","𝒯":"𝒯","Ŧ":"Ŧ","Ú":"Ú","Ú":"Ú","↟":"↟","⥉":"⥉","Ў":"Ў","Ŭ":"Ŭ","Û":"Û","Û":"Û","У":"У","Ű":"Ű","𝔘":"𝔘","Ù":"Ù","Ù":"Ù","Ū":"Ū","_":"_","⏟":"⏟","⎵":"⎵","⏝":"⏝","⋃":"⋃","⊎":"⊎","Ų":"Ų","𝕌":"𝕌","↑":"↑","⤒":"⤒","⇅":"⇅","↕":"↕","⥮":"⥮","⊥":"⊥","↥":"↥","⇑":"⇑","⇕":"⇕","↖":"↖","↗":"↗","ϒ":"ϒ","Υ":"Υ","Ů":"Ů","𝒰":"𝒰","Ũ":"Ũ","Ü":"Ü","Ü":"Ü","⊫":"⊫","⫫":"⫫","В":"В","⊩":"⊩","⫦":"⫦","⋁":"⋁","‖":"‖","‖":"‖","∣":"∣","|":"|","❘":"❘","≀":"≀"," ":" ","𝔙":"𝔙","𝕍":"𝕍","𝒱":"𝒱","⊪":"⊪","Ŵ":"Ŵ","⋀":"⋀","𝔚":"𝔚","𝕎":"𝕎","𝒲":"𝒲","𝔛":"𝔛","Ξ":"Ξ","𝕏":"𝕏","𝒳":"𝒳","Я":"Я","Ї":"Ї","Ю":"Ю","Ý":"Ý","Ý":"Ý","Ŷ":"Ŷ","Ы":"Ы","𝔜":"𝔜","𝕐":"𝕐","𝒴":"𝒴","Ÿ":"Ÿ","Ж":"Ж","Ź":"Ź","Ž":"Ž","З":"З","Ż":"Ż","​":"​","Ζ":"Ζ","ℨ":"ℨ","ℤ":"ℤ","𝒵":"𝒵","á":"á","á":"á","ă":"ă","∾":"∾","∾̳":"∾̳","∿":"∿","â":"â","â":"â","´":"´","´":"´","а":"а","æ":"æ","æ":"æ","⁡":"⁡","𝔞":"𝔞","à":"à","à":"à","ℵ":"ℵ","ℵ":"ℵ","α":"α","ā":"ā","⨿":"⨿","&":"&","&":"&","∧":"∧","⩕":"⩕","⩜":"⩜","⩘":"⩘","⩚":"⩚","∠":"∠","⦤":"⦤","∠":"∠","∡":"∡","⦨":"⦨","⦩":"⦩","⦪":"⦪","⦫":"⦫","⦬":"⦬","⦭":"⦭","⦮":"⦮","⦯":"⦯","∟":"∟","⊾":"⊾","⦝":"⦝","∢":"∢","Å":"Å","⍼":"⍼","ą":"ą","𝕒":"𝕒","≈":"≈","⩰":"⩰","⩯":"⩯","≊":"≊","≋":"≋","'":"'","≈":"≈","≊":"≊","å":"å","å":"å","𝒶":"𝒶","*":"*","≈":"≈","≍":"≍","ã":"ã","ã":"ã","ä":"ä","ä":"ä","∳":"∳","⨑":"⨑","⫭":"⫭","≌":"≌","϶":"϶","‵":"‵","∽":"∽","⋍":"⋍","⊽":"⊽","⌅":"⌅","⌅":"⌅","⎵":"⎵","⎶":"⎶","≌":"≌","б":"б","„":"„","∵":"∵","∵":"∵","⦰":"⦰","϶":"϶","ℬ":"ℬ","β":"β","ℶ":"ℶ","≬":"≬","𝔟":"𝔟","⋂":"⋂","◯":"◯","⋃":"⋃","⨀":"⨀","⨁":"⨁","⨂":"⨂","⨆":"⨆","★":"★","▽":"▽","△":"△","⨄":"⨄","⋁":"⋁","⋀":"⋀","⤍":"⤍","⧫":"⧫","▪":"▪","▴":"▴","▾":"▾","◂":"◂","▸":"▸","␣":"␣","▒":"▒","░":"░","▓":"▓","█":"█","=⃥":"=⃥","≡⃥":"≡⃥","⌐":"⌐","𝕓":"𝕓","⊥":"⊥","⊥":"⊥","⋈":"⋈","╗":"╗","╔":"╔","╖":"╖","╓":"╓","═":"═","╦":"╦","╩":"╩","╤":"╤","╧":"╧","╝":"╝","╚":"╚","╜":"╜","╙":"╙","║":"║","╬":"╬","╣":"╣","╠":"╠","╫":"╫","╢":"╢","╟":"╟","⧉":"⧉","╕":"╕","╒":"╒","┐":"┐","┌":"┌","─":"─","╥":"╥","╨":"╨","┬":"┬","┴":"┴","⊟":"⊟","⊞":"⊞","⊠":"⊠","╛":"╛","╘":"╘","┘":"┘","└":"└","│":"│","╪":"╪","╡":"╡","╞":"╞","┼":"┼","┤":"┤","├":"├","‵":"‵","˘":"˘","¦":"¦","¦":"¦","𝒷":"𝒷","⁏":"⁏","∽":"∽","⋍":"⋍","\":"\\","⧅":"⧅","⟈":"⟈","•":"•","•":"•","≎":"≎","⪮":"⪮","≏":"≏","≏":"≏","ć":"ć","∩":"∩","⩄":"⩄","⩉":"⩉","⩋":"⩋","⩇":"⩇","⩀":"⩀","∩︀":"∩︀","⁁":"⁁","ˇ":"ˇ","⩍":"⩍","č":"č","ç":"ç","ç":"ç","ĉ":"ĉ","⩌":"⩌","⩐":"⩐","ċ":"ċ","¸":"¸","¸":"¸","⦲":"⦲","¢":"¢","¢":"¢","·":"·","𝔠":"𝔠","ч":"ч","✓":"✓","✓":"✓","χ":"χ","○":"○","⧃":"⧃","ˆ":"ˆ","≗":"≗","↺":"↺","↻":"↻","®":"®","Ⓢ":"Ⓢ","⊛":"⊛","⊚":"⊚","⊝":"⊝","≗":"≗","⨐":"⨐","⫯":"⫯","⧂":"⧂","♣":"♣","♣":"♣",":":":","≔":"≔","≔":"≔",",":",","@":"@","∁":"∁","∘":"∘","∁":"∁","ℂ":"ℂ","≅":"≅","⩭":"⩭","∮":"∮","𝕔":"𝕔","∐":"∐","©":"©","©":"©","℗":"℗","↵":"↵","✗":"✗","𝒸":"𝒸","⫏":"⫏","⫑":"⫑","⫐":"⫐","⫒":"⫒","⋯":"⋯","⤸":"⤸","⤵":"⤵","⋞":"⋞","⋟":"⋟","↶":"↶","⤽":"⤽","∪":"∪","⩈":"⩈","⩆":"⩆","⩊":"⩊","⊍":"⊍","⩅":"⩅","∪︀":"∪︀","↷":"↷","⤼":"⤼","⋞":"⋞","⋟":"⋟","⋎":"⋎","⋏":"⋏","¤":"¤","¤":"¤","↶":"↶","↷":"↷","⋎":"⋎","⋏":"⋏","∲":"∲","∱":"∱","⌭":"⌭","⇓":"⇓","⥥":"⥥","†":"†","ℸ":"ℸ","↓":"↓","‐":"‐","⊣":"⊣","⤏":"⤏","˝":"˝","ď":"ď","д":"д","ⅆ":"ⅆ","‡":"‡","⇊":"⇊","⩷":"⩷","°":"°","°":"°","δ":"δ","⦱":"⦱","⥿":"⥿","𝔡":"𝔡","⇃":"⇃","⇂":"⇂","⋄":"⋄","⋄":"⋄","♦":"♦","♦":"♦","¨":"¨","ϝ":"ϝ","⋲":"⋲","÷":"÷","÷":"÷","÷":"÷","⋇":"⋇","⋇":"⋇","ђ":"ђ","⌞":"⌞","⌍":"⌍","$":"$","𝕕":"𝕕","˙":"˙","≐":"≐","≑":"≑","∸":"∸","∔":"∔","⊡":"⊡","⌆":"⌆","↓":"↓","⇊":"⇊","⇃":"⇃","⇂":"⇂","⤐":"⤐","⌟":"⌟","⌌":"⌌","𝒹":"𝒹","ѕ":"ѕ","⧶":"⧶","đ":"đ","⋱":"⋱","▿":"▿","▾":"▾","⇵":"⇵","⥯":"⥯","⦦":"⦦","џ":"џ","⟿":"⟿","⩷":"⩷","≑":"≑","é":"é","é":"é","⩮":"⩮","ě":"ě","≖":"≖","ê":"ê","ê":"ê","≕":"≕","э":"э","ė":"ė","ⅇ":"ⅇ","≒":"≒","𝔢":"𝔢","⪚":"⪚","è":"è","è":"è","⪖":"⪖","⪘":"⪘","⪙":"⪙","⏧":"⏧","ℓ":"ℓ","⪕":"⪕","⪗":"⪗","ē":"ē","∅":"∅","∅":"∅","∅":"∅"," ":" "," ":" "," ":" ","ŋ":"ŋ"," ":" ","ę":"ę","𝕖":"𝕖","⋕":"⋕","⧣":"⧣","⩱":"⩱","ε":"ε","ε":"ε","ϵ":"ϵ","≖":"≖","≕":"≕","≂":"≂","⪖":"⪖","⪕":"⪕","=":"=","≟":"≟","≡":"≡","⩸":"⩸","⧥":"⧥","≓":"≓","⥱":"⥱","ℯ":"ℯ","≐":"≐","≂":"≂","η":"η","ð":"ð","ð":"ð","ë":"ë","ë":"ë","€":"€","!":"!","∃":"∃","ℰ":"ℰ","ⅇ":"ⅇ","≒":"≒","ф":"ф","♀":"♀","ffi":"ffi","ff":"ff","ffl":"ffl","𝔣":"𝔣","fi":"fi","fj":"fj","♭":"♭","fl":"fl","▱":"▱","ƒ":"ƒ","𝕗":"𝕗","∀":"∀","⋔":"⋔","⫙":"⫙","⨍":"⨍","½":"½","½":"½","⅓":"⅓","¼":"¼","¼":"¼","⅕":"⅕","⅙":"⅙","⅛":"⅛","⅔":"⅔","⅖":"⅖","¾":"¾","¾":"¾","⅗":"⅗","⅜":"⅜","⅘":"⅘","⅚":"⅚","⅝":"⅝","⅞":"⅞","⁄":"⁄","⌢":"⌢","𝒻":"𝒻","≧":"≧","⪌":"⪌","ǵ":"ǵ","γ":"γ","ϝ":"ϝ","⪆":"⪆","ğ":"ğ","ĝ":"ĝ","г":"г","ġ":"ġ","≥":"≥","⋛":"⋛","≥":"≥","≧":"≧","⩾":"⩾","⩾":"⩾","⪩":"⪩","⪀":"⪀","⪂":"⪂","⪄":"⪄","⋛︀":"⋛︀","⪔":"⪔","𝔤":"𝔤","≫":"≫","⋙":"⋙","ℷ":"ℷ","ѓ":"ѓ","≷":"≷","⪒":"⪒","⪥":"⪥","⪤":"⪤","≩":"≩","⪊":"⪊","⪊":"⪊","⪈":"⪈","⪈":"⪈","≩":"≩","⋧":"⋧","𝕘":"𝕘","`":"`","ℊ":"ℊ","≳":"≳","⪎":"⪎","⪐":"⪐",">":">",">":">","⪧":"⪧","⩺":"⩺","⋗":"⋗","⦕":"⦕","⩼":"⩼","⪆":"⪆","⥸":"⥸","⋗":"⋗","⋛":"⋛","⪌":"⪌","≷":"≷","≳":"≳","≩︀":"≩︀","≩︀":"≩︀","⇔":"⇔"," ":" ","½":"½","ℋ":"ℋ","ъ":"ъ","↔":"↔","⥈":"⥈","↭":"↭","ℏ":"ℏ","ĥ":"ĥ","♥":"♥","♥":"♥","…":"…","⊹":"⊹","𝔥":"𝔥","⤥":"⤥","⤦":"⤦","⇿":"⇿","∻":"∻","↩":"↩","↪":"↪","𝕙":"𝕙","―":"―","𝒽":"𝒽","ℏ":"ℏ","ħ":"ħ","⁃":"⁃","‐":"‐","í":"í","í":"í","⁣":"⁣","î":"î","î":"î","и":"и","е":"е","¡":"¡","¡":"¡","⇔":"⇔","𝔦":"𝔦","ì":"ì","ì":"ì","ⅈ":"ⅈ","⨌":"⨌","∭":"∭","⧜":"⧜","℩":"℩","ij":"ij","ī":"ī","ℑ":"ℑ","ℐ":"ℐ","ℑ":"ℑ","ı":"ı","⊷":"⊷","Ƶ":"Ƶ","∈":"∈","℅":"℅","∞":"∞","⧝":"⧝","ı":"ı","∫":"∫","⊺":"⊺","ℤ":"ℤ","⊺":"⊺","⨗":"⨗","⨼":"⨼","ё":"ё","į":"į","𝕚":"𝕚","ι":"ι","⨼":"⨼","¿":"¿","¿":"¿","𝒾":"𝒾","∈":"∈","⋹":"⋹","⋵":"⋵","⋴":"⋴","⋳":"⋳","∈":"∈","⁢":"⁢","ĩ":"ĩ","і":"і","ï":"ï","ï":"ï","ĵ":"ĵ","й":"й","𝔧":"𝔧","ȷ":"ȷ","𝕛":"𝕛","𝒿":"𝒿","ј":"ј","є":"є","κ":"κ","ϰ":"ϰ","ķ":"ķ","к":"к","𝔨":"𝔨","ĸ":"ĸ","х":"х","ќ":"ќ","𝕜":"𝕜","𝓀":"𝓀","⇚":"⇚","⇐":"⇐","⤛":"⤛","⤎":"⤎","≦":"≦","⪋":"⪋","⥢":"⥢","ĺ":"ĺ","⦴":"⦴","ℒ":"ℒ","λ":"λ","⟨":"⟨","⦑":"⦑","⟨":"⟨","⪅":"⪅","«":"«","«":"«","←":"←","⇤":"⇤","⤟":"⤟","⤝":"⤝","↩":"↩","↫":"↫","⤹":"⤹","⥳":"⥳","↢":"↢","⪫":"⪫","⤙":"⤙","⪭":"⪭","⪭︀":"⪭︀","⤌":"⤌","❲":"❲","{":"{","[":"[","⦋":"⦋","⦏":"⦏","⦍":"⦍","ľ":"ľ","ļ":"ļ","⌈":"⌈","{":"{","л":"л","⤶":"⤶","“":"“","„":"„","⥧":"⥧","⥋":"⥋","↲":"↲","≤":"≤","←":"←","↢":"↢","↽":"↽","↼":"↼","⇇":"⇇","↔":"↔","⇆":"⇆","⇋":"⇋","↭":"↭","⋋":"⋋","⋚":"⋚","≤":"≤","≦":"≦","⩽":"⩽","⩽":"⩽","⪨":"⪨","⩿":"⩿","⪁":"⪁","⪃":"⪃","⋚︀":"⋚︀","⪓":"⪓","⪅":"⪅","⋖":"⋖","⋚":"⋚","⪋":"⪋","≶":"≶","≲":"≲","⥼":"⥼","⌊":"⌊","𝔩":"𝔩","≶":"≶","⪑":"⪑","↽":"↽","↼":"↼","⥪":"⥪","▄":"▄","љ":"љ","≪":"≪","⇇":"⇇","⌞":"⌞","⥫":"⥫","◺":"◺","ŀ":"ŀ","⎰":"⎰","⎰":"⎰","≨":"≨","⪉":"⪉","⪉":"⪉","⪇":"⪇","⪇":"⪇","≨":"≨","⋦":"⋦","⟬":"⟬","⇽":"⇽","⟦":"⟦","⟵":"⟵","⟷":"⟷","⟼":"⟼","⟶":"⟶","↫":"↫","↬":"↬","⦅":"⦅","𝕝":"𝕝","⨭":"⨭","⨴":"⨴","∗":"∗","_":"_","◊":"◊","◊":"◊","⧫":"⧫","(":"(","⦓":"⦓","⇆":"⇆","⌟":"⌟","⇋":"⇋","⥭":"⥭","‎":"‎","⊿":"⊿","‹":"‹","𝓁":"𝓁","↰":"↰","≲":"≲","⪍":"⪍","⪏":"⪏","[":"[","‘":"‘","‚":"‚","ł":"ł","<":"<","<":"<","⪦":"⪦","⩹":"⩹","⋖":"⋖","⋋":"⋋","⋉":"⋉","⥶":"⥶","⩻":"⩻","⦖":"⦖","◃":"◃","⊴":"⊴","◂":"◂","⥊":"⥊","⥦":"⥦","≨︀":"≨︀","≨︀":"≨︀","∺":"∺","¯":"¯","¯":"¯","♂":"♂","✠":"✠","✠":"✠","↦":"↦","↦":"↦","↧":"↧","↤":"↤","↥":"↥","▮":"▮","⨩":"⨩","м":"м","—":"—","∡":"∡","𝔪":"𝔪","℧":"℧","µ":"µ","µ":"µ","∣":"∣","*":"*","⫰":"⫰","·":"·","·":"·","−":"−","⊟":"⊟","∸":"∸","⨪":"⨪","⫛":"⫛","…":"…","∓":"∓","⊧":"⊧","𝕞":"𝕞","∓":"∓","𝓂":"𝓂","∾":"∾","μ":"μ","⊸":"⊸","⊸":"⊸","⋙̸":"⋙̸","≫⃒":"≫⃒","≫̸":"≫̸","⇍":"⇍","⇎":"⇎","⋘̸":"⋘̸","≪⃒":"≪⃒","≪̸":"≪̸","⇏":"⇏","⊯":"⊯","⊮":"⊮","∇":"∇","ń":"ń","∠⃒":"∠⃒","≉":"≉","⩰̸":"⩰̸","≋̸":"≋̸","ʼn":"ʼn","≉":"≉","♮":"♮","♮":"♮","ℕ":"ℕ"," ":" "," ":" ","≎̸":"≎̸","≏̸":"≏̸","⩃":"⩃","ň":"ň","ņ":"ņ","≇":"≇","⩭̸":"⩭̸","⩂":"⩂","н":"н","–":"–","≠":"≠","⇗":"⇗","⤤":"⤤","↗":"↗","↗":"↗","≐̸":"≐̸","≢":"≢","⤨":"⤨","≂̸":"≂̸","∄":"∄","∄":"∄","𝔫":"𝔫","≧̸":"≧̸","≱":"≱","≱":"≱","≧̸":"≧̸","⩾̸":"⩾̸","⩾̸":"⩾̸","≵":"≵","≯":"≯","≯":"≯","⇎":"⇎","↮":"↮","⫲":"⫲","∋":"∋","⋼":"⋼","⋺":"⋺","∋":"∋","њ":"њ","⇍":"⇍","≦̸":"≦̸","↚":"↚","‥":"‥","≰":"≰","↚":"↚","↮":"↮","≰":"≰","≦̸":"≦̸","⩽̸":"⩽̸","⩽̸":"⩽̸","≮":"≮","≴":"≴","≮":"≮","⋪":"⋪","⋬":"⋬","∤":"∤","𝕟":"𝕟","¬":"¬","¬":"¬","∉":"∉","⋹̸":"⋹̸","⋵̸":"⋵̸","∉":"∉","⋷":"⋷","⋶":"⋶","∌":"∌","∌":"∌","⋾":"⋾","⋽":"⋽","∦":"∦","∦":"∦","⫽⃥":"⫽⃥","∂̸":"∂̸","⨔":"⨔","⊀":"⊀","⋠":"⋠","⪯̸":"⪯̸","⊀":"⊀","⪯̸":"⪯̸","⇏":"⇏","↛":"↛","⤳̸":"⤳̸","↝̸":"↝̸","↛":"↛","⋫":"⋫","⋭":"⋭","⊁":"⊁","⋡":"⋡","⪰̸":"⪰̸","𝓃":"𝓃","∤":"∤","∦":"∦","≁":"≁","≄":"≄","≄":"≄","∤":"∤","∦":"∦","⋢":"⋢","⋣":"⋣","⊄":"⊄","⫅̸":"⫅̸","⊈":"⊈","⊂⃒":"⊂⃒","⊈":"⊈","⫅̸":"⫅̸","⊁":"⊁","⪰̸":"⪰̸","⊅":"⊅","⫆̸":"⫆̸","⊉":"⊉","⊃⃒":"⊃⃒","⊉":"⊉","⫆̸":"⫆̸","≹":"≹","ñ":"ñ","ñ":"ñ","≸":"≸","⋪":"⋪","⋬":"⋬","⋫":"⋫","⋭":"⋭","ν":"ν","#":"#","№":"№"," ":" ","⊭":"⊭","⤄":"⤄","≍⃒":"≍⃒","⊬":"⊬","≥⃒":"≥⃒",">⃒":">⃒","⧞":"⧞","⤂":"⤂","≤⃒":"≤⃒","<⃒":"<⃒","⊴⃒":"⊴⃒","⤃":"⤃","⊵⃒":"⊵⃒","∼⃒":"∼⃒","⇖":"⇖","⤣":"⤣","↖":"↖","↖":"↖","⤧":"⤧","Ⓢ":"Ⓢ","ó":"ó","ó":"ó","⊛":"⊛","⊚":"⊚","ô":"ô","ô":"ô","о":"о","⊝":"⊝","ő":"ő","⨸":"⨸","⊙":"⊙","⦼":"⦼","œ":"œ","⦿":"⦿","𝔬":"𝔬","˛":"˛","ò":"ò","ò":"ò","⧁":"⧁","⦵":"⦵","Ω":"Ω","∮":"∮","↺":"↺","⦾":"⦾","⦻":"⦻","‾":"‾","⧀":"⧀","ō":"ō","ω":"ω","ο":"ο","⦶":"⦶","⊖":"⊖","𝕠":"𝕠","⦷":"⦷","⦹":"⦹","⊕":"⊕","∨":"∨","↻":"↻","⩝":"⩝","ℴ":"ℴ","ℴ":"ℴ","ª":"ª","ª":"ª","º":"º","º":"º","⊶":"⊶","⩖":"⩖","⩗":"⩗","⩛":"⩛","ℴ":"ℴ","ø":"ø","ø":"ø","⊘":"⊘","õ":"õ","õ":"õ","⊗":"⊗","⨶":"⨶","ö":"ö","ö":"ö","⌽":"⌽","∥":"∥","¶":"¶","¶":"¶","∥":"∥","⫳":"⫳","⫽":"⫽","∂":"∂","п":"п","%":"%",".":".","‰":"‰","⊥":"⊥","‱":"‱","𝔭":"𝔭","φ":"φ","ϕ":"ϕ","ℳ":"ℳ","☎":"☎","π":"π","⋔":"⋔","ϖ":"ϖ","ℏ":"ℏ","ℎ":"ℎ","ℏ":"ℏ","+":"+","⨣":"⨣","⊞":"⊞","⨢":"⨢","∔":"∔","⨥":"⨥","⩲":"⩲","±":"±","±":"±","⨦":"⨦","⨧":"⨧","±":"±","⨕":"⨕","𝕡":"𝕡","£":"£","£":"£","≺":"≺","⪳":"⪳","⪷":"⪷","≼":"≼","⪯":"⪯","≺":"≺","⪷":"⪷","≼":"≼","⪯":"⪯","⪹":"⪹","⪵":"⪵","⋨":"⋨","≾":"≾","′":"′","ℙ":"ℙ","⪵":"⪵","⪹":"⪹","⋨":"⋨","∏":"∏","⌮":"⌮","⌒":"⌒","⌓":"⌓","∝":"∝","∝":"∝","≾":"≾","⊰":"⊰","𝓅":"𝓅","ψ":"ψ"," ":" ","𝔮":"𝔮","⨌":"⨌","𝕢":"𝕢","⁗":"⁗","𝓆":"𝓆","ℍ":"ℍ","⨖":"⨖","?":"?","≟":"≟",""":'"',""":'"',"⇛":"⇛","⇒":"⇒","⤜":"⤜","⤏":"⤏","⥤":"⥤","∽̱":"∽̱","ŕ":"ŕ","√":"√","⦳":"⦳","⟩":"⟩","⦒":"⦒","⦥":"⦥","⟩":"⟩","»":"»","»":"»","→":"→","⥵":"⥵","⇥":"⇥","⤠":"⤠","⤳":"⤳","⤞":"⤞","↪":"↪","↬":"↬","⥅":"⥅","⥴":"⥴","↣":"↣","↝":"↝","⤚":"⤚","∶":"∶","ℚ":"ℚ","⤍":"⤍","❳":"❳","}":"}","]":"]","⦌":"⦌","⦎":"⦎","⦐":"⦐","ř":"ř","ŗ":"ŗ","⌉":"⌉","}":"}","р":"р","⤷":"⤷","⥩":"⥩","”":"”","”":"”","↳":"↳","ℜ":"ℜ","ℛ":"ℛ","ℜ":"ℜ","ℝ":"ℝ","▭":"▭","®":"®","®":"®","⥽":"⥽","⌋":"⌋","𝔯":"𝔯","⇁":"⇁","⇀":"⇀","⥬":"⥬","ρ":"ρ","ϱ":"ϱ","→":"→","↣":"↣","⇁":"⇁","⇀":"⇀","⇄":"⇄","⇌":"⇌","⇉":"⇉","↝":"↝","⋌":"⋌","˚":"˚","≓":"≓","⇄":"⇄","⇌":"⇌","‏":"‏","⎱":"⎱","⎱":"⎱","⫮":"⫮","⟭":"⟭","⇾":"⇾","⟧":"⟧","⦆":"⦆","𝕣":"𝕣","⨮":"⨮","⨵":"⨵",")":")","⦔":"⦔","⨒":"⨒","⇉":"⇉","›":"›","𝓇":"𝓇","↱":"↱","]":"]","’":"’","’":"’","⋌":"⋌","⋊":"⋊","▹":"▹","⊵":"⊵","▸":"▸","⧎":"⧎","⥨":"⥨","℞":"℞","ś":"ś","‚":"‚","≻":"≻","⪴":"⪴","⪸":"⪸","š":"š","≽":"≽","⪰":"⪰","ş":"ş","ŝ":"ŝ","⪶":"⪶","⪺":"⪺","⋩":"⋩","⨓":"⨓","≿":"≿","с":"с","⋅":"⋅","⊡":"⊡","⩦":"⩦","⇘":"⇘","⤥":"⤥","↘":"↘","↘":"↘","§":"§","§":"§",";":";","⤩":"⤩","∖":"∖","∖":"∖","✶":"✶","𝔰":"𝔰","⌢":"⌢","♯":"♯","щ":"щ","ш":"ш","∣":"∣","∥":"∥","­":"­","­":"­","σ":"σ","ς":"ς","ς":"ς","∼":"∼","⩪":"⩪","≃":"≃","≃":"≃","⪞":"⪞","⪠":"⪠","⪝":"⪝","⪟":"⪟","≆":"≆","⨤":"⨤","⥲":"⥲","←":"←","∖":"∖","⨳":"⨳","⧤":"⧤","∣":"∣","⌣":"⌣","⪪":"⪪","⪬":"⪬","⪬︀":"⪬︀","ь":"ь","/":"/","⧄":"⧄","⌿":"⌿","𝕤":"𝕤","♠":"♠","♠":"♠","∥":"∥","⊓":"⊓","⊓︀":"⊓︀","⊔":"⊔","⊔︀":"⊔︀","⊏":"⊏","⊑":"⊑","⊏":"⊏","⊑":"⊑","⊐":"⊐","⊒":"⊒","⊐":"⊐","⊒":"⊒","□":"□","□":"□","▪":"▪","▪":"▪","→":"→","𝓈":"𝓈","∖":"∖","⌣":"⌣","⋆":"⋆","☆":"☆","★":"★","ϵ":"ϵ","ϕ":"ϕ","¯":"¯","⊂":"⊂","⫅":"⫅","⪽":"⪽","⊆":"⊆","⫃":"⫃","⫁":"⫁","⫋":"⫋","⊊":"⊊","⪿":"⪿","⥹":"⥹","⊂":"⊂","⊆":"⊆","⫅":"⫅","⊊":"⊊","⫋":"⫋","⫇":"⫇","⫕":"⫕","⫓":"⫓","≻":"≻","⪸":"⪸","≽":"≽","⪰":"⪰","⪺":"⪺","⪶":"⪶","⋩":"⋩","≿":"≿","∑":"∑","♪":"♪","¹":"¹","¹":"¹","²":"²","²":"²","³":"³","³":"³","⊃":"⊃","⫆":"⫆","⪾":"⪾","⫘":"⫘","⊇":"⊇","⫄":"⫄","⟉":"⟉","⫗":"⫗","⥻":"⥻","⫂":"⫂","⫌":"⫌","⊋":"⊋","⫀":"⫀","⊃":"⊃","⊇":"⊇","⫆":"⫆","⊋":"⊋","⫌":"⫌","⫈":"⫈","⫔":"⫔","⫖":"⫖","⇙":"⇙","⤦":"⤦","↙":"↙","↙":"↙","⤪":"⤪","ß":"ß","ß":"ß","⌖":"⌖","τ":"τ","⎴":"⎴","ť":"ť","ţ":"ţ","т":"т","⃛":"⃛","⌕":"⌕","𝔱":"𝔱","∴":"∴","∴":"∴","θ":"θ","ϑ":"ϑ","ϑ":"ϑ","≈":"≈","∼":"∼"," ":" ","≈":"≈","∼":"∼","þ":"þ","þ":"þ","˜":"˜","×":"×","×":"×","⊠":"⊠","⨱":"⨱","⨰":"⨰","∭":"∭","⤨":"⤨","⊤":"⊤","⌶":"⌶","⫱":"⫱","𝕥":"𝕥","⫚":"⫚","⤩":"⤩","‴":"‴","™":"™","▵":"▵","▿":"▿","◃":"◃","⊴":"⊴","≜":"≜","▹":"▹","⊵":"⊵","◬":"◬","≜":"≜","⨺":"⨺","⨹":"⨹","⧍":"⧍","⨻":"⨻","⏢":"⏢","𝓉":"𝓉","ц":"ц","ћ":"ћ","ŧ":"ŧ","≬":"≬","↞":"↞","↠":"↠","⇑":"⇑","⥣":"⥣","ú":"ú","ú":"ú","↑":"↑","ў":"ў","ŭ":"ŭ","û":"û","û":"û","у":"у","⇅":"⇅","ű":"ű","⥮":"⥮","⥾":"⥾","𝔲":"𝔲","ù":"ù","ù":"ù","↿":"↿","↾":"↾","▀":"▀","⌜":"⌜","⌜":"⌜","⌏":"⌏","◸":"◸","ū":"ū","¨":"¨","¨":"¨","ų":"ų","𝕦":"𝕦","↑":"↑","↕":"↕","↿":"↿","↾":"↾","⊎":"⊎","υ":"υ","ϒ":"ϒ","υ":"υ","⇈":"⇈","⌝":"⌝","⌝":"⌝","⌎":"⌎","ů":"ů","◹":"◹","𝓊":"𝓊","⋰":"⋰","ũ":"ũ","▵":"▵","▴":"▴","⇈":"⇈","ü":"ü","ü":"ü","⦧":"⦧","⇕":"⇕","⫨":"⫨","⫩":"⫩","⊨":"⊨","⦜":"⦜","ϵ":"ϵ","ϰ":"ϰ","∅":"∅","ϕ":"ϕ","ϖ":"ϖ","∝":"∝","↕":"↕","ϱ":"ϱ","ς":"ς","⊊︀":"⊊︀","⫋︀":"⫋︀","⊋︀":"⊋︀","⫌︀":"⫌︀","ϑ":"ϑ","⊲":"⊲","⊳":"⊳","в":"в","⊢":"⊢","∨":"∨","⊻":"⊻","≚":"≚","⋮":"⋮","|":"|","|":"|","𝔳":"𝔳","⊲":"⊲","⊂⃒":"⊂⃒","⊃⃒":"⊃⃒","𝕧":"𝕧","∝":"∝","⊳":"⊳","𝓋":"𝓋","⫋︀":"⫋︀","⊊︀":"⊊︀","⫌︀":"⫌︀","⊋︀":"⊋︀","⦚":"⦚","ŵ":"ŵ","⩟":"⩟","∧":"∧","≙":"≙","℘":"℘","𝔴":"𝔴","𝕨":"𝕨","℘":"℘","≀":"≀","≀":"≀","𝓌":"𝓌","⋂":"⋂","◯":"◯","⋃":"⋃","▽":"▽","𝔵":"𝔵","⟺":"⟺","⟷":"⟷","ξ":"ξ","⟸":"⟸","⟵":"⟵","⟼":"⟼","⋻":"⋻","⨀":"⨀","𝕩":"𝕩","⨁":"⨁","⨂":"⨂","⟹":"⟹","⟶":"⟶","𝓍":"𝓍","⨆":"⨆","⨄":"⨄","△":"△","⋁":"⋁","⋀":"⋀","ý":"ý","ý":"ý","я":"я","ŷ":"ŷ","ы":"ы","¥":"¥","¥":"¥","𝔶":"𝔶","ї":"ї","𝕪":"𝕪","𝓎":"𝓎","ю":"ю","ÿ":"ÿ","ÿ":"ÿ","ź":"ź","ž":"ž","з":"з","ż":"ż","ℨ":"ℨ","ζ":"ζ","𝔷":"𝔷","ж":"ж","⇝":"⇝","𝕫":"𝕫","𝓏":"𝓏","‍":"‍","‌":"‌"},characters:{"Æ":"Æ","&":"&","Á":"Á","Ă":"Ă","Â":"Â","А":"А","𝔄":"𝔄","À":"À","Α":"Α","Ā":"Ā","⩓":"⩓","Ą":"Ą","𝔸":"𝔸","⁡":"⁡","Å":"Å","𝒜":"𝒜","≔":"≔","Ã":"Ã","Ä":"Ä","∖":"∖","⫧":"⫧","⌆":"⌆","Б":"Б","∵":"∵","ℬ":"ℬ","Β":"Β","𝔅":"𝔅","𝔹":"𝔹","˘":"˘","≎":"≎","Ч":"Ч","©":"©","Ć":"Ć","⋒":"⋒","ⅅ":"ⅅ","ℭ":"ℭ","Č":"Č","Ç":"Ç","Ĉ":"Ĉ","∰":"∰","Ċ":"Ċ","¸":"¸","·":"·","Χ":"Χ","⊙":"⊙","⊖":"⊖","⊕":"⊕","⊗":"⊗","∲":"∲","”":"”","’":"’","∷":"∷","⩴":"⩴","≡":"≡","∯":"∯","∮":"∮","ℂ":"ℂ","∐":"∐","∳":"∳","⨯":"⨯","𝒞":"𝒞","⋓":"⋓","≍":"≍","⤑":"⤑","Ђ":"Ђ","Ѕ":"Ѕ","Џ":"Џ","‡":"‡","↡":"↡","⫤":"⫤","Ď":"Ď","Д":"Д","∇":"∇","Δ":"Δ","𝔇":"𝔇","´":"´","˙":"˙","˝":"˝","`":"`","˜":"˜","⋄":"⋄","ⅆ":"ⅆ","𝔻":"𝔻","¨":"¨","⃜":"⃜","≐":"≐","⇓":"⇓","⇐":"⇐","⇔":"⇔","⟸":"⟸","⟺":"⟺","⟹":"⟹","⇒":"⇒","⊨":"⊨","⇑":"⇑","⇕":"⇕","∥":"∥","↓":"↓","⤓":"⤓","⇵":"⇵","̑":"̑","⥐":"⥐","⥞":"⥞","↽":"↽","⥖":"⥖","⥟":"⥟","⇁":"⇁","⥗":"⥗","⊤":"⊤","↧":"↧","𝒟":"𝒟","Đ":"Đ","Ŋ":"Ŋ","Ð":"Ð","É":"É","Ě":"Ě","Ê":"Ê","Э":"Э","Ė":"Ė","𝔈":"𝔈","È":"È","∈":"∈","Ē":"Ē","◻":"◻","▫":"▫","Ę":"Ę","𝔼":"𝔼","Ε":"Ε","⩵":"⩵","≂":"≂","⇌":"⇌","ℰ":"ℰ","⩳":"⩳","Η":"Η","Ë":"Ë","∃":"∃","ⅇ":"ⅇ","Ф":"Ф","𝔉":"𝔉","◼":"◼","▪":"▪","𝔽":"𝔽","∀":"∀","ℱ":"ℱ","Ѓ":"Ѓ",">":">","Γ":"Γ","Ϝ":"Ϝ","Ğ":"Ğ","Ģ":"Ģ","Ĝ":"Ĝ","Г":"Г","Ġ":"Ġ","𝔊":"𝔊","⋙":"⋙","𝔾":"𝔾","≥":"≥","⋛":"⋛","≧":"≧","⪢":"⪢","≷":"≷","⩾":"⩾","≳":"≳","𝒢":"𝒢","≫":"≫","Ъ":"Ъ","ˇ":"ˇ","^":"^","Ĥ":"Ĥ","ℌ":"ℌ","ℋ":"ℋ","ℍ":"ℍ","─":"─","Ħ":"Ħ","≏":"≏","Е":"Е","IJ":"IJ","Ё":"Ё","Í":"Í","Î":"Î","И":"И","İ":"İ","ℑ":"ℑ","Ì":"Ì","Ī":"Ī","ⅈ":"ⅈ","∬":"∬","∫":"∫","⋂":"⋂","⁣":"⁣","⁢":"⁢","Į":"Į","𝕀":"𝕀","Ι":"Ι","ℐ":"ℐ","Ĩ":"Ĩ","І":"І","Ï":"Ï","Ĵ":"Ĵ","Й":"Й","𝔍":"𝔍","𝕁":"𝕁","𝒥":"𝒥","Ј":"Ј","Є":"Є","Х":"Х","Ќ":"Ќ","Κ":"Κ","Ķ":"Ķ","К":"К","𝔎":"𝔎","𝕂":"𝕂","𝒦":"𝒦","Љ":"Љ","<":"<","Ĺ":"Ĺ","Λ":"Λ","⟪":"⟪","ℒ":"ℒ","↞":"↞","Ľ":"Ľ","Ļ":"Ļ","Л":"Л","⟨":"⟨","←":"←","⇤":"⇤","⇆":"⇆","⌈":"⌈","⟦":"⟦","⥡":"⥡","⇃":"⇃","⥙":"⥙","⌊":"⌊","↔":"↔","⥎":"⥎","⊣":"⊣","↤":"↤","⥚":"⥚","⊲":"⊲","⧏":"⧏","⊴":"⊴","⥑":"⥑","⥠":"⥠","↿":"↿","⥘":"⥘","↼":"↼","⥒":"⥒","⋚":"⋚","≦":"≦","≶":"≶","⪡":"⪡","⩽":"⩽","≲":"≲","𝔏":"𝔏","⋘":"⋘","⇚":"⇚","Ŀ":"Ŀ","⟵":"⟵","⟷":"⟷","⟶":"⟶","𝕃":"𝕃","↙":"↙","↘":"↘","↰":"↰","Ł":"Ł","≪":"≪","⤅":"⤅","М":"М"," ":" ","ℳ":"ℳ","𝔐":"𝔐","∓":"∓","𝕄":"𝕄","Μ":"Μ","Њ":"Њ","Ń":"Ń","Ň":"Ň","Ņ":"Ņ","Н":"Н","​":"​","\n":" ","𝔑":"𝔑","⁠":"⁠"," ":" ","ℕ":"ℕ","⫬":"⫬","≢":"≢","≭":"≭","∦":"∦","∉":"∉","≠":"≠","≂̸":"≂̸","∄":"∄","≯":"≯","≱":"≱","≧̸":"≧̸","≫̸":"≫̸","≹":"≹","⩾̸":"⩾̸","≵":"≵","≎̸":"≎̸","≏̸":"≏̸","⋪":"⋪","⧏̸":"⧏̸","⋬":"⋬","≮":"≮","≰":"≰","≸":"≸","≪̸":"≪̸","⩽̸":"⩽̸","≴":"≴","⪢̸":"⪢̸","⪡̸":"⪡̸","⊀":"⊀","⪯̸":"⪯̸","⋠":"⋠","∌":"∌","⋫":"⋫","⧐̸":"⧐̸","⋭":"⋭","⊏̸":"⊏̸","⋢":"⋢","⊐̸":"⊐̸","⋣":"⋣","⊂⃒":"⊂⃒","⊈":"⊈","⊁":"⊁","⪰̸":"⪰̸","⋡":"⋡","≿̸":"≿̸","⊃⃒":"⊃⃒","⊉":"⊉","≁":"≁","≄":"≄","≇":"≇","≉":"≉","∤":"∤","𝒩":"𝒩","Ñ":"Ñ","Ν":"Ν","Œ":"Œ","Ó":"Ó","Ô":"Ô","О":"О","Ő":"Ő","𝔒":"𝔒","Ò":"Ò","Ō":"Ō","Ω":"Ω","Ο":"Ο","𝕆":"𝕆","“":"“","‘":"‘","⩔":"⩔","𝒪":"𝒪","Ø":"Ø","Õ":"Õ","⨷":"⨷","Ö":"Ö","‾":"‾","⏞":"⏞","⎴":"⎴","⏜":"⏜","∂":"∂","П":"П","𝔓":"𝔓","Φ":"Φ","Π":"Π","±":"±","ℙ":"ℙ","⪻":"⪻","≺":"≺","⪯":"⪯","≼":"≼","≾":"≾","″":"″","∏":"∏","∝":"∝","𝒫":"𝒫","Ψ":"Ψ",'"':""","𝔔":"𝔔","ℚ":"ℚ","𝒬":"𝒬","⤐":"⤐","®":"®","Ŕ":"Ŕ","⟫":"⟫","↠":"↠","⤖":"⤖","Ř":"Ř","Ŗ":"Ŗ","Р":"Р","ℜ":"ℜ","∋":"∋","⇋":"⇋","⥯":"⥯","Ρ":"Ρ","⟩":"⟩","→":"→","⇥":"⇥","⇄":"⇄","⌉":"⌉","⟧":"⟧","⥝":"⥝","⇂":"⇂","⥕":"⥕","⌋":"⌋","⊢":"⊢","↦":"↦","⥛":"⥛","⊳":"⊳","⧐":"⧐","⊵":"⊵","⥏":"⥏","⥜":"⥜","↾":"↾","⥔":"⥔","⇀":"⇀","⥓":"⥓","ℝ":"ℝ","⥰":"⥰","⇛":"⇛","ℛ":"ℛ","↱":"↱","⧴":"⧴","Щ":"Щ","Ш":"Ш","Ь":"Ь","Ś":"Ś","⪼":"⪼","Š":"Š","Ş":"Ş","Ŝ":"Ŝ","С":"С","𝔖":"𝔖","↑":"↑","Σ":"Σ","∘":"∘","𝕊":"𝕊","√":"√","□":"□","⊓":"⊓","⊏":"⊏","⊑":"⊑","⊐":"⊐","⊒":"⊒","⊔":"⊔","𝒮":"𝒮","⋆":"⋆","⋐":"⋐","⊆":"⊆","≻":"≻","⪰":"⪰","≽":"≽","≿":"≿","∑":"∑","⋑":"⋑","⊃":"⊃","⊇":"⊇","Þ":"Þ","™":"™","Ћ":"Ћ","Ц":"Ц","\t":" ","Τ":"Τ","Ť":"Ť","Ţ":"Ţ","Т":"Т","𝔗":"𝔗","∴":"∴","Θ":"Θ","  ":"  "," ":" ","∼":"∼","≃":"≃","≅":"≅","≈":"≈","𝕋":"𝕋","⃛":"⃛","𝒯":"𝒯","Ŧ":"Ŧ","Ú":"Ú","↟":"↟","⥉":"⥉","Ў":"Ў","Ŭ":"Ŭ","Û":"Û","У":"У","Ű":"Ű","𝔘":"𝔘","Ù":"Ù","Ū":"Ū",_:"_","⏟":"⏟","⎵":"⎵","⏝":"⏝","⋃":"⋃","⊎":"⊎","Ų":"Ų","𝕌":"𝕌","⤒":"⤒","⇅":"⇅","↕":"↕","⥮":"⥮","⊥":"⊥","↥":"↥","↖":"↖","↗":"↗","ϒ":"ϒ","Υ":"Υ","Ů":"Ů","𝒰":"𝒰","Ũ":"Ũ","Ü":"Ü","⊫":"⊫","⫫":"⫫","В":"В","⊩":"⊩","⫦":"⫦","⋁":"⋁","‖":"‖","∣":"∣","|":"|","❘":"❘","≀":"≀"," ":" ","𝔙":"𝔙","𝕍":"𝕍","𝒱":"𝒱","⊪":"⊪","Ŵ":"Ŵ","⋀":"⋀","𝔚":"𝔚","𝕎":"𝕎","𝒲":"𝒲","𝔛":"𝔛","Ξ":"Ξ","𝕏":"𝕏","𝒳":"𝒳","Я":"Я","Ї":"Ї","Ю":"Ю","Ý":"Ý","Ŷ":"Ŷ","Ы":"Ы","𝔜":"𝔜","𝕐":"𝕐","𝒴":"𝒴","Ÿ":"Ÿ","Ж":"Ж","Ź":"Ź","Ž":"Ž","З":"З","Ż":"Ż","Ζ":"Ζ","ℨ":"ℨ","ℤ":"ℤ","𝒵":"𝒵","á":"á","ă":"ă","∾":"∾","∾̳":"∾̳","∿":"∿","â":"â","а":"а","æ":"æ","𝔞":"𝔞","à":"à","ℵ":"ℵ","α":"α","ā":"ā","⨿":"⨿","∧":"∧","⩕":"⩕","⩜":"⩜","⩘":"⩘","⩚":"⩚","∠":"∠","⦤":"⦤","∡":"∡","⦨":"⦨","⦩":"⦩","⦪":"⦪","⦫":"⦫","⦬":"⦬","⦭":"⦭","⦮":"⦮","⦯":"⦯","∟":"∟","⊾":"⊾","⦝":"⦝","∢":"∢","⍼":"⍼","ą":"ą","𝕒":"𝕒","⩰":"⩰","⩯":"⩯","≊":"≊","≋":"≋","'":"'","å":"å","𝒶":"𝒶","*":"*","ã":"ã","ä":"ä","⨑":"⨑","⫭":"⫭","≌":"≌","϶":"϶","‵":"‵","∽":"∽","⋍":"⋍","⊽":"⊽","⌅":"⌅","⎶":"⎶","б":"б","„":"„","⦰":"⦰","β":"β","ℶ":"ℶ","≬":"≬","𝔟":"𝔟","◯":"◯","⨀":"⨀","⨁":"⨁","⨂":"⨂","⨆":"⨆","★":"★","▽":"▽","△":"△","⨄":"⨄","⤍":"⤍","⧫":"⧫","▴":"▴","▾":"▾","◂":"◂","▸":"▸","␣":"␣","▒":"▒","░":"░","▓":"▓","█":"█","=⃥":"=⃥","≡⃥":"≡⃥","⌐":"⌐","𝕓":"𝕓","⋈":"⋈","╗":"╗","╔":"╔","╖":"╖","╓":"╓","═":"═","╦":"╦","╩":"╩","╤":"╤","╧":"╧","╝":"╝","╚":"╚","╜":"╜","╙":"╙","║":"║","╬":"╬","╣":"╣","╠":"╠","╫":"╫","╢":"╢","╟":"╟","⧉":"⧉","╕":"╕","╒":"╒","┐":"┐","┌":"┌","╥":"╥","╨":"╨","┬":"┬","┴":"┴","⊟":"⊟","⊞":"⊞","⊠":"⊠","╛":"╛","╘":"╘","┘":"┘","└":"└","│":"│","╪":"╪","╡":"╡","╞":"╞","┼":"┼","┤":"┤","├":"├","¦":"¦","𝒷":"𝒷","⁏":"⁏","\\":"\","⧅":"⧅","⟈":"⟈","•":"•","⪮":"⪮","ć":"ć","∩":"∩","⩄":"⩄","⩉":"⩉","⩋":"⩋","⩇":"⩇","⩀":"⩀","∩︀":"∩︀","⁁":"⁁","⩍":"⩍","č":"č","ç":"ç","ĉ":"ĉ","⩌":"⩌","⩐":"⩐","ċ":"ċ","⦲":"⦲","¢":"¢","𝔠":"𝔠","ч":"ч","✓":"✓","χ":"χ","○":"○","⧃":"⧃","ˆ":"ˆ","≗":"≗","↺":"↺","↻":"↻","Ⓢ":"Ⓢ","⊛":"⊛","⊚":"⊚","⊝":"⊝","⨐":"⨐","⫯":"⫯","⧂":"⧂","♣":"♣",":":":",",":",","@":"@","∁":"∁","⩭":"⩭","𝕔":"𝕔","℗":"℗","↵":"↵","✗":"✗","𝒸":"𝒸","⫏":"⫏","⫑":"⫑","⫐":"⫐","⫒":"⫒","⋯":"⋯","⤸":"⤸","⤵":"⤵","⋞":"⋞","⋟":"⋟","↶":"↶","⤽":"⤽","∪":"∪","⩈":"⩈","⩆":"⩆","⩊":"⩊","⊍":"⊍","⩅":"⩅","∪︀":"∪︀","↷":"↷","⤼":"⤼","⋎":"⋎","⋏":"⋏","¤":"¤","∱":"∱","⌭":"⌭","⥥":"⥥","†":"†","ℸ":"ℸ","‐":"‐","⤏":"⤏","ď":"ď","д":"д","⇊":"⇊","⩷":"⩷","°":"°","δ":"δ","⦱":"⦱","⥿":"⥿","𝔡":"𝔡","♦":"♦","ϝ":"ϝ","⋲":"⋲","÷":"÷","⋇":"⋇","ђ":"ђ","⌞":"⌞","⌍":"⌍",$:"$","𝕕":"𝕕","≑":"≑","∸":"∸","∔":"∔","⊡":"⊡","⌟":"⌟","⌌":"⌌","𝒹":"𝒹","ѕ":"ѕ","⧶":"⧶","đ":"đ","⋱":"⋱","▿":"▿","⦦":"⦦","џ":"џ","⟿":"⟿","é":"é","⩮":"⩮","ě":"ě","≖":"≖","ê":"ê","≕":"≕","э":"э","ė":"ė","≒":"≒","𝔢":"𝔢","⪚":"⪚","è":"è","⪖":"⪖","⪘":"⪘","⪙":"⪙","⏧":"⏧","ℓ":"ℓ","⪕":"⪕","⪗":"⪗","ē":"ē","∅":"∅"," ":" "," ":" "," ":" ","ŋ":"ŋ"," ":" ","ę":"ę","𝕖":"𝕖","⋕":"⋕","⧣":"⧣","⩱":"⩱","ε":"ε","ϵ":"ϵ","=":"=","≟":"≟","⩸":"⩸","⧥":"⧥","≓":"≓","⥱":"⥱","ℯ":"ℯ","η":"η","ð":"ð","ë":"ë","€":"€","!":"!","ф":"ф","♀":"♀","ffi":"ffi","ff":"ff","ffl":"ffl","𝔣":"𝔣","fi":"fi",fj:"fj","♭":"♭","fl":"fl","▱":"▱","ƒ":"ƒ","𝕗":"𝕗","⋔":"⋔","⫙":"⫙","⨍":"⨍","½":"½","⅓":"⅓","¼":"¼","⅕":"⅕","⅙":"⅙","⅛":"⅛","⅔":"⅔","⅖":"⅖","¾":"¾","⅗":"⅗","⅜":"⅜","⅘":"⅘","⅚":"⅚","⅝":"⅝","⅞":"⅞","⁄":"⁄","⌢":"⌢","𝒻":"𝒻","⪌":"⪌","ǵ":"ǵ","γ":"γ","⪆":"⪆","ğ":"ğ","ĝ":"ĝ","г":"г","ġ":"ġ","⪩":"⪩","⪀":"⪀","⪂":"⪂","⪄":"⪄","⋛︀":"⋛︀","⪔":"⪔","𝔤":"𝔤","ℷ":"ℷ","ѓ":"ѓ","⪒":"⪒","⪥":"⪥","⪤":"⪤","≩":"≩","⪊":"⪊","⪈":"⪈","⋧":"⋧","𝕘":"𝕘","ℊ":"ℊ","⪎":"⪎","⪐":"⪐","⪧":"⪧","⩺":"⩺","⋗":"⋗","⦕":"⦕","⩼":"⩼","⥸":"⥸","≩︀":"≩︀","ъ":"ъ","⥈":"⥈","↭":"↭","ℏ":"ℏ","ĥ":"ĥ","♥":"♥","…":"…","⊹":"⊹","𝔥":"𝔥","⤥":"⤥","⤦":"⤦","⇿":"⇿","∻":"∻","↩":"↩","↪":"↪","𝕙":"𝕙","―":"―","𝒽":"𝒽","ħ":"ħ","⁃":"⁃","í":"í","î":"î","и":"и","е":"е","¡":"¡","𝔦":"𝔦","ì":"ì","⨌":"⨌","∭":"∭","⧜":"⧜","℩":"℩","ij":"ij","ī":"ī","ı":"ı","⊷":"⊷","Ƶ":"Ƶ","℅":"℅","∞":"∞","⧝":"⧝","⊺":"⊺","⨗":"⨗","⨼":"⨼","ё":"ё","į":"į","𝕚":"𝕚","ι":"ι","¿":"¿","𝒾":"𝒾","⋹":"⋹","⋵":"⋵","⋴":"⋴","⋳":"⋳","ĩ":"ĩ","і":"і","ï":"ï","ĵ":"ĵ","й":"й","𝔧":"𝔧","ȷ":"ȷ","𝕛":"𝕛","𝒿":"𝒿","ј":"ј","є":"є","κ":"κ","ϰ":"ϰ","ķ":"ķ","к":"к","𝔨":"𝔨","ĸ":"ĸ","х":"х","ќ":"ќ","𝕜":"𝕜","𝓀":"𝓀","⤛":"⤛","⤎":"⤎","⪋":"⪋","⥢":"⥢","ĺ":"ĺ","⦴":"⦴","λ":"λ","⦑":"⦑","⪅":"⪅","«":"«","⤟":"⤟","⤝":"⤝","↫":"↫","⤹":"⤹","⥳":"⥳","↢":"↢","⪫":"⪫","⤙":"⤙","⪭":"⪭","⪭︀":"⪭︀","⤌":"⤌","❲":"❲","{":"{","[":"[","⦋":"⦋","⦏":"⦏","⦍":"⦍","ľ":"ľ","ļ":"ļ","л":"л","⤶":"⤶","⥧":"⥧","⥋":"⥋","↲":"↲","≤":"≤","⇇":"⇇","⋋":"⋋","⪨":"⪨","⩿":"⩿","⪁":"⪁","⪃":"⪃","⋚︀":"⋚︀","⪓":"⪓","⋖":"⋖","⥼":"⥼","𝔩":"𝔩","⪑":"⪑","⥪":"⥪","▄":"▄","љ":"љ","⥫":"⥫","◺":"◺","ŀ":"ŀ","⎰":"⎰","≨":"≨","⪉":"⪉","⪇":"⪇","⋦":"⋦","⟬":"⟬","⇽":"⇽","⟼":"⟼","↬":"↬","⦅":"⦅","𝕝":"𝕝","⨭":"⨭","⨴":"⨴","∗":"∗","◊":"◊","(":"(","⦓":"⦓","⥭":"⥭","‎":"‎","⊿":"⊿","‹":"‹","𝓁":"𝓁","⪍":"⪍","⪏":"⪏","‚":"‚","ł":"ł","⪦":"⪦","⩹":"⩹","⋉":"⋉","⥶":"⥶","⩻":"⩻","⦖":"⦖","◃":"◃","⥊":"⥊","⥦":"⥦","≨︀":"≨︀","∺":"∺","¯":"¯","♂":"♂","✠":"✠","▮":"▮","⨩":"⨩","м":"м","—":"—","𝔪":"𝔪","℧":"℧","µ":"µ","⫰":"⫰","−":"−","⨪":"⨪","⫛":"⫛","⊧":"⊧","𝕞":"𝕞","𝓂":"𝓂","μ":"μ","⊸":"⊸","⋙̸":"⋙̸","≫⃒":"≫⃒","⇍":"⇍","⇎":"⇎","⋘̸":"⋘̸","≪⃒":"≪⃒","⇏":"⇏","⊯":"⊯","⊮":"⊮","ń":"ń","∠⃒":"∠⃒","⩰̸":"⩰̸","≋̸":"≋̸","ʼn":"ʼn","♮":"♮","⩃":"⩃","ň":"ň","ņ":"ņ","⩭̸":"⩭̸","⩂":"⩂","н":"н","–":"–","⇗":"⇗","⤤":"⤤","≐̸":"≐̸","⤨":"⤨","𝔫":"𝔫","↮":"↮","⫲":"⫲","⋼":"⋼","⋺":"⋺","њ":"њ","≦̸":"≦̸","↚":"↚","‥":"‥","𝕟":"𝕟","¬":"¬","⋹̸":"⋹̸","⋵̸":"⋵̸","⋷":"⋷","⋶":"⋶","⋾":"⋾","⋽":"⋽","⫽⃥":"⫽⃥","∂̸":"∂̸","⨔":"⨔","↛":"↛","⤳̸":"⤳̸","↝̸":"↝̸","𝓃":"𝓃","⊄":"⊄","⫅̸":"⫅̸","⊅":"⊅","⫆̸":"⫆̸","ñ":"ñ","ν":"ν","#":"#","№":"№"," ":" ","⊭":"⊭","⤄":"⤄","≍⃒":"≍⃒","⊬":"⊬","≥⃒":"≥⃒",">⃒":">⃒","⧞":"⧞","⤂":"⤂","≤⃒":"≤⃒","<⃒":"<⃒","⊴⃒":"⊴⃒","⤃":"⤃","⊵⃒":"⊵⃒","∼⃒":"∼⃒","⇖":"⇖","⤣":"⤣","⤧":"⤧","ó":"ó","ô":"ô","о":"о","ő":"ő","⨸":"⨸","⦼":"⦼","œ":"œ","⦿":"⦿","𝔬":"𝔬","˛":"˛","ò":"ò","⧁":"⧁","⦵":"⦵","⦾":"⦾","⦻":"⦻","⧀":"⧀","ō":"ō","ω":"ω","ο":"ο","⦶":"⦶","𝕠":"𝕠","⦷":"⦷","⦹":"⦹","∨":"∨","⩝":"⩝","ℴ":"ℴ","ª":"ª","º":"º","⊶":"⊶","⩖":"⩖","⩗":"⩗","⩛":"⩛","ø":"ø","⊘":"⊘","õ":"õ","⨶":"⨶","ö":"ö","⌽":"⌽","¶":"¶","⫳":"⫳","⫽":"⫽","п":"п","%":"%",".":".","‰":"‰","‱":"‱","𝔭":"𝔭","φ":"φ","ϕ":"ϕ","☎":"☎","π":"π","ϖ":"ϖ","ℎ":"ℎ","+":"+","⨣":"⨣","⨢":"⨢","⨥":"⨥","⩲":"⩲","⨦":"⨦","⨧":"⨧","⨕":"⨕","𝕡":"𝕡","£":"£","⪳":"⪳","⪷":"⪷","⪹":"⪹","⪵":"⪵","⋨":"⋨","′":"′","⌮":"⌮","⌒":"⌒","⌓":"⌓","⊰":"⊰","𝓅":"𝓅","ψ":"ψ"," ":" ","𝔮":"𝔮","𝕢":"𝕢","⁗":"⁗","𝓆":"𝓆","⨖":"⨖","?":"?","⤜":"⤜","⥤":"⥤","∽̱":"∽̱","ŕ":"ŕ","⦳":"⦳","⦒":"⦒","⦥":"⦥","»":"»","⥵":"⥵","⤠":"⤠","⤳":"⤳","⤞":"⤞","⥅":"⥅","⥴":"⥴","↣":"↣","↝":"↝","⤚":"⤚","∶":"∶","❳":"❳","}":"}","]":"]","⦌":"⦌","⦎":"⦎","⦐":"⦐","ř":"ř","ŗ":"ŗ","р":"р","⤷":"⤷","⥩":"⥩","↳":"↳","▭":"▭","⥽":"⥽","𝔯":"𝔯","⥬":"⥬","ρ":"ρ","ϱ":"ϱ","⇉":"⇉","⋌":"⋌","˚":"˚","‏":"‏","⎱":"⎱","⫮":"⫮","⟭":"⟭","⇾":"⇾","⦆":"⦆","𝕣":"𝕣","⨮":"⨮","⨵":"⨵",")":")","⦔":"⦔","⨒":"⨒","›":"›","𝓇":"𝓇","⋊":"⋊","▹":"▹","⧎":"⧎","⥨":"⥨","℞":"℞","ś":"ś","⪴":"⪴","⪸":"⪸","š":"š","ş":"ş","ŝ":"ŝ","⪶":"⪶","⪺":"⪺","⋩":"⋩","⨓":"⨓","с":"с","⋅":"⋅","⩦":"⩦","⇘":"⇘","§":"§",";":";","⤩":"⤩","✶":"✶","𝔰":"𝔰","♯":"♯","щ":"щ","ш":"ш","­":"­","σ":"σ","ς":"ς","⩪":"⩪","⪞":"⪞","⪠":"⪠","⪝":"⪝","⪟":"⪟","≆":"≆","⨤":"⨤","⥲":"⥲","⨳":"⨳","⧤":"⧤","⌣":"⌣","⪪":"⪪","⪬":"⪬","⪬︀":"⪬︀","ь":"ь","/":"/","⧄":"⧄","⌿":"⌿","𝕤":"𝕤","♠":"♠","⊓︀":"⊓︀","⊔︀":"⊔︀","𝓈":"𝓈","☆":"☆","⊂":"⊂","⫅":"⫅","⪽":"⪽","⫃":"⫃","⫁":"⫁","⫋":"⫋","⊊":"⊊","⪿":"⪿","⥹":"⥹","⫇":"⫇","⫕":"⫕","⫓":"⫓","♪":"♪","¹":"¹","²":"²","³":"³","⫆":"⫆","⪾":"⪾","⫘":"⫘","⫄":"⫄","⟉":"⟉","⫗":"⫗","⥻":"⥻","⫂":"⫂","⫌":"⫌","⊋":"⊋","⫀":"⫀","⫈":"⫈","⫔":"⫔","⫖":"⫖","⇙":"⇙","⤪":"⤪","ß":"ß","⌖":"⌖","τ":"τ","ť":"ť","ţ":"ţ","т":"т","⌕":"⌕","𝔱":"𝔱","θ":"θ","ϑ":"ϑ","þ":"þ","×":"×","⨱":"⨱","⨰":"⨰","⌶":"⌶","⫱":"⫱","𝕥":"𝕥","⫚":"⫚","‴":"‴","▵":"▵","≜":"≜","◬":"◬","⨺":"⨺","⨹":"⨹","⧍":"⧍","⨻":"⨻","⏢":"⏢","𝓉":"𝓉","ц":"ц","ћ":"ћ","ŧ":"ŧ","⥣":"⥣","ú":"ú","ў":"ў","ŭ":"ŭ","û":"û","у":"у","ű":"ű","⥾":"⥾","𝔲":"𝔲","ù":"ù","▀":"▀","⌜":"⌜","⌏":"⌏","◸":"◸","ū":"ū","ų":"ų","𝕦":"𝕦","υ":"υ","⇈":"⇈","⌝":"⌝","⌎":"⌎","ů":"ů","◹":"◹","𝓊":"𝓊","⋰":"⋰","ũ":"ũ","ü":"ü","⦧":"⦧","⫨":"⫨","⫩":"⫩","⦜":"⦜","⊊︀":"⊊︀","⫋︀":"⫋︀","⊋︀":"⊋︀","⫌︀":"⫌︀","в":"в","⊻":"⊻","≚":"≚","⋮":"⋮","𝔳":"𝔳","𝕧":"𝕧","𝓋":"𝓋","⦚":"⦚","ŵ":"ŵ","⩟":"⩟","≙":"≙","℘":"℘","𝔴":"𝔴","𝕨":"𝕨","𝓌":"𝓌","𝔵":"𝔵","ξ":"ξ","⋻":"⋻","𝕩":"𝕩","𝓍":"𝓍","ý":"ý","я":"я","ŷ":"ŷ","ы":"ы","¥":"¥","𝔶":"𝔶","ї":"ї","𝕪":"𝕪","𝓎":"𝓎","ю":"ю","ÿ":"ÿ","ź":"ź","ž":"ž","з":"з","ż":"ż","ζ":"ζ","𝔷":"𝔷","ж":"ж","⇝":"⇝","𝕫":"𝕫","𝓏":"𝓏","‍":"‍","‌":"‌"}}}; - -/***/ }), - -/***/ "./node_modules/html-entities/lib/numeric-unicode-map.js": -/*!***************************************************************!*\ - !*** ./node_modules/html-entities/lib/numeric-unicode-map.js ***! - \***************************************************************/ -/***/ (function(__unused_webpack_module, exports) { - -"use strict"; -Object.defineProperty(exports, "__esModule", ({value:true}));exports.numericUnicodeMap={0:65533,128:8364,130:8218,131:402,132:8222,133:8230,134:8224,135:8225,136:710,137:8240,138:352,139:8249,140:338,142:381,145:8216,146:8217,147:8220,148:8221,149:8226,150:8211,151:8212,152:732,153:8482,154:353,155:8250,156:339,158:382,159:376}; - -/***/ }), - -/***/ "./node_modules/html-entities/lib/surrogate-pairs.js": -/*!***********************************************************!*\ - !*** ./node_modules/html-entities/lib/surrogate-pairs.js ***! - \***********************************************************/ -/***/ (function(__unused_webpack_module, exports) { - -"use strict"; -Object.defineProperty(exports, "__esModule", ({value:true}));exports.fromCodePoint=String.fromCodePoint||function(astralCodePoint){return String.fromCharCode(Math.floor((astralCodePoint-65536)/1024)+55296,(astralCodePoint-65536)%1024+56320)};exports.getCodePoint=String.prototype.codePointAt?function(input,position){return input.codePointAt(position)}:function(input,position){return(input.charCodeAt(position)-55296)*1024+input.charCodeAt(position+1)-56320+65536};exports.highSurrogateFrom=55296;exports.highSurrogateTo=56319; - -/***/ }), - -/***/ "./node_modules/webpack-dev-server/client/clients/WebSocketClient.js": -/*!***************************************************************************!*\ - !*** ./node_modules/webpack-dev-server/client/clients/WebSocketClient.js ***! - \***************************************************************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ WebSocketClient; } -/* harmony export */ }); -/* harmony import */ var _utils_log_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils/log.js */ "./node_modules/webpack-dev-server/client/utils/log.js"); -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } - -function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } - - - -var WebSocketClient = /*#__PURE__*/function () { - /** - * @param {string} url - */ - function WebSocketClient(url) { - _classCallCheck(this, WebSocketClient); - - this.client = new WebSocket(url); - - this.client.onerror = function (error) { - _utils_log_js__WEBPACK_IMPORTED_MODULE_0__.log.error(error); - }; - } - /** - * @param {(...args: any[]) => void} f - */ - - - _createClass(WebSocketClient, [{ - key: "onOpen", - value: function onOpen(f) { - this.client.onopen = f; - } - /** - * @param {(...args: any[]) => void} f - */ - - }, { - key: "onClose", - value: function onClose(f) { - this.client.onclose = f; - } // call f with the message string as the first argument - - /** - * @param {(...args: any[]) => void} f - */ - - }, { - key: "onMessage", - value: function onMessage(f) { - this.client.onmessage = function (e) { - f(e.data); - }; - } - }]); - - return WebSocketClient; -}(); - - - -/***/ }), - -/***/ "./node_modules/webpack-dev-server/client/index.js?protocol=ws%3A&hostname=localhost&port=8081&pathname=%2Fws&logging=none&reconnect=10": -/*!**********************************************************************************************************************************************!*\ - !*** ./node_modules/webpack-dev-server/client/index.js?protocol=ws%3A&hostname=localhost&port=8081&pathname=%2Fws&logging=none&reconnect=10 ***! - \**********************************************************************************************************************************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { - -"use strict"; -var __resourceQuery = "?protocol=ws%3A&hostname=localhost&port=8081&pathname=%2Fws&logging=none&reconnect=10"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var webpack_hot_log_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! webpack/hot/log.js */ "./node_modules/webpack/hot/log.js"); -/* harmony import */ var webpack_hot_log_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(webpack_hot_log_js__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _utils_stripAnsi_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils/stripAnsi.js */ "./node_modules/webpack-dev-server/client/utils/stripAnsi.js"); -/* harmony import */ var _utils_parseURL_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utils/parseURL.js */ "./node_modules/webpack-dev-server/client/utils/parseURL.js"); -/* harmony import */ var _socket_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./socket.js */ "./node_modules/webpack-dev-server/client/socket.js"); -/* harmony import */ var _overlay_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./overlay.js */ "./node_modules/webpack-dev-server/client/overlay.js"); -/* harmony import */ var _utils_log_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./utils/log.js */ "./node_modules/webpack-dev-server/client/utils/log.js"); -/* harmony import */ var _utils_sendMessage_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./utils/sendMessage.js */ "./node_modules/webpack-dev-server/client/utils/sendMessage.js"); -/* harmony import */ var _utils_reloadApp_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./utils/reloadApp.js */ "./node_modules/webpack-dev-server/client/utils/reloadApp.js"); -/* harmony import */ var _utils_createSocketURL_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./utils/createSocketURL.js */ "./node_modules/webpack-dev-server/client/utils/createSocketURL.js"); -/* global __resourceQuery, __webpack_hash__ */ -/// - - - - - - - - - -/** - * @typedef {Object} Options - * @property {boolean} hot - * @property {boolean} liveReload - * @property {boolean} progress - * @property {boolean | { warnings?: boolean, errors?: boolean, trustedTypesPolicyName?: string }} overlay - * @property {string} [logging] - * @property {number} [reconnect] - */ - -/** - * @typedef {Object} Status - * @property {boolean} isUnloading - * @property {string} currentHash - * @property {string} [previousHash] - */ - -/** - * @type {Status} - */ - -var status = { - isUnloading: false, - // TODO Workaround for webpack v4, `__webpack_hash__` is not replaced without HotModuleReplacement - // eslint-disable-next-line camelcase - currentHash: true ? __webpack_require__.h() : 0 -}; -/** @type {Options} */ - -var options = { - hot: false, - liveReload: false, - progress: false, - overlay: false -}; -var parsedResourceQuery = (0,_utils_parseURL_js__WEBPACK_IMPORTED_MODULE_2__["default"])(__resourceQuery); - -if (parsedResourceQuery.hot === "true") { - options.hot = true; - _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.info("Hot Module Replacement enabled."); -} - -if (parsedResourceQuery["live-reload"] === "true") { - options.liveReload = true; - _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.info("Live Reloading enabled."); -} - -if (parsedResourceQuery.logging) { - options.logging = parsedResourceQuery.logging; -} - -if (typeof parsedResourceQuery.reconnect !== "undefined") { - options.reconnect = Number(parsedResourceQuery.reconnect); -} -/** - * @param {string} level - */ - - -function setAllLogLevel(level) { - // This is needed because the HMR logger operate separately from dev server logger - webpack_hot_log_js__WEBPACK_IMPORTED_MODULE_0___default().setLogLevel(level === "verbose" || level === "log" ? "info" : level); - (0,_utils_log_js__WEBPACK_IMPORTED_MODULE_5__.setLogLevel)(level); -} - -if (options.logging) { - setAllLogLevel(options.logging); -} - -self.addEventListener("beforeunload", function () { - status.isUnloading = true; -}); -var onSocketMessage = { - hot: function hot() { - if (parsedResourceQuery.hot === "false") { - return; - } - - options.hot = true; - _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.info("Hot Module Replacement enabled."); - }, - liveReload: function liveReload() { - if (parsedResourceQuery["live-reload"] === "false") { - return; - } - - options.liveReload = true; - _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.info("Live Reloading enabled."); - }, - invalid: function invalid() { - _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.info("App updated. Recompiling..."); // Fixes #1042. overlay doesn't clear if errors are fixed but warnings remain. - - if (options.overlay) { - (0,_overlay_js__WEBPACK_IMPORTED_MODULE_4__.hide)(); - } - - (0,_utils_sendMessage_js__WEBPACK_IMPORTED_MODULE_6__["default"])("Invalid"); - }, - - /** - * @param {string} hash - */ - hash: function hash(_hash) { - status.previousHash = status.currentHash; - status.currentHash = _hash; - }, - logging: setAllLogLevel, - - /** - * @param {boolean} value - */ - overlay: function overlay(value) { - if (typeof document === "undefined") { - return; - } - - options.overlay = value; - }, - - /** - * @param {number} value - */ - reconnect: function reconnect(value) { - if (parsedResourceQuery.reconnect === "false") { - return; - } - - options.reconnect = value; - }, - - /** - * @param {boolean} value - */ - progress: function progress(value) { - options.progress = value; - }, - - /** - * @param {{ pluginName?: string, percent: number, msg: string }} data - */ - "progress-update": function progressUpdate(data) { - if (options.progress) { - _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.info("".concat(data.pluginName ? "[".concat(data.pluginName, "] ") : "").concat(data.percent, "% - ").concat(data.msg, ".")); - } - - (0,_utils_sendMessage_js__WEBPACK_IMPORTED_MODULE_6__["default"])("Progress", data); - }, - "still-ok": function stillOk() { - _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.info("Nothing changed."); - - if (options.overlay) { - (0,_overlay_js__WEBPACK_IMPORTED_MODULE_4__.hide)(); - } - - (0,_utils_sendMessage_js__WEBPACK_IMPORTED_MODULE_6__["default"])("StillOk"); - }, - ok: function ok() { - (0,_utils_sendMessage_js__WEBPACK_IMPORTED_MODULE_6__["default"])("Ok"); - - if (options.overlay) { - (0,_overlay_js__WEBPACK_IMPORTED_MODULE_4__.hide)(); - } - - (0,_utils_reloadApp_js__WEBPACK_IMPORTED_MODULE_7__["default"])(options, status); - }, - // TODO: remove in v5 in favor of 'static-changed' - - /** - * @param {string} file - */ - "content-changed": function contentChanged(file) { - _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.info("".concat(file ? "\"".concat(file, "\"") : "Content", " from static directory was changed. Reloading...")); - self.location.reload(); - }, - - /** - * @param {string} file - */ - "static-changed": function staticChanged(file) { - _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.info("".concat(file ? "\"".concat(file, "\"") : "Content", " from static directory was changed. Reloading...")); - self.location.reload(); - }, - - /** - * @param {Error[]} warnings - * @param {any} params - */ - warnings: function warnings(_warnings, params) { - _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.warn("Warnings while compiling."); - - var printableWarnings = _warnings.map(function (error) { - var _formatProblem = (0,_overlay_js__WEBPACK_IMPORTED_MODULE_4__.formatProblem)("warning", error), - header = _formatProblem.header, - body = _formatProblem.body; - - return "".concat(header, "\n").concat((0,_utils_stripAnsi_js__WEBPACK_IMPORTED_MODULE_1__["default"])(body)); - }); - - (0,_utils_sendMessage_js__WEBPACK_IMPORTED_MODULE_6__["default"])("Warnings", printableWarnings); - - for (var i = 0; i < printableWarnings.length; i++) { - _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.warn(printableWarnings[i]); - } - - var needShowOverlayForWarnings = typeof options.overlay === "boolean" ? options.overlay : options.overlay && options.overlay.warnings; - - if (needShowOverlayForWarnings) { - var trustedTypesPolicyName = typeof options.overlay === "object" && options.overlay.trustedTypesPolicyName; - (0,_overlay_js__WEBPACK_IMPORTED_MODULE_4__.show)("warning", _warnings, trustedTypesPolicyName || null); - } - - if (params && params.preventReloading) { - return; - } - - (0,_utils_reloadApp_js__WEBPACK_IMPORTED_MODULE_7__["default"])(options, status); - }, - - /** - * @param {Error[]} errors - */ - errors: function errors(_errors) { - _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.error("Errors while compiling. Reload prevented."); - - var printableErrors = _errors.map(function (error) { - var _formatProblem2 = (0,_overlay_js__WEBPACK_IMPORTED_MODULE_4__.formatProblem)("error", error), - header = _formatProblem2.header, - body = _formatProblem2.body; - - return "".concat(header, "\n").concat((0,_utils_stripAnsi_js__WEBPACK_IMPORTED_MODULE_1__["default"])(body)); - }); - - (0,_utils_sendMessage_js__WEBPACK_IMPORTED_MODULE_6__["default"])("Errors", printableErrors); - - for (var i = 0; i < printableErrors.length; i++) { - _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.error(printableErrors[i]); - } - - var needShowOverlayForErrors = typeof options.overlay === "boolean" ? options.overlay : options.overlay && options.overlay.errors; - - if (needShowOverlayForErrors) { - var trustedTypesPolicyName = typeof options.overlay === "object" && options.overlay.trustedTypesPolicyName; - (0,_overlay_js__WEBPACK_IMPORTED_MODULE_4__.show)("error", _errors, trustedTypesPolicyName || null); - } - }, - - /** - * @param {Error} error - */ - error: function error(_error) { - _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.error(_error); - }, - close: function close() { - _utils_log_js__WEBPACK_IMPORTED_MODULE_5__.log.info("Disconnected!"); - - if (options.overlay) { - (0,_overlay_js__WEBPACK_IMPORTED_MODULE_4__.hide)(); - } - - (0,_utils_sendMessage_js__WEBPACK_IMPORTED_MODULE_6__["default"])("Close"); - } -}; -var socketURL = (0,_utils_createSocketURL_js__WEBPACK_IMPORTED_MODULE_8__["default"])(parsedResourceQuery); -(0,_socket_js__WEBPACK_IMPORTED_MODULE_3__["default"])(socketURL, onSocketMessage, options.reconnect); - -/***/ }), - -/***/ "./node_modules/webpack-dev-server/client/modules/logger/index.js": -/*!************************************************************************!*\ - !*** ./node_modules/webpack-dev-server/client/modules/logger/index.js ***! - \************************************************************************/ -/***/ (function(__unused_webpack_module, exports) { - -/******/ (function() { // webpackBootstrap -/******/ "use strict"; -/******/ var __webpack_modules__ = ({ - -/***/ "./client-src/modules/logger/SyncBailHookFake.js": -/*!*******************************************************!*\ - !*** ./client-src/modules/logger/SyncBailHookFake.js ***! - \*******************************************************/ -/***/ (function(module) { - - -/** - * Client stub for tapable SyncBailHook - */ - -module.exports = function clientTapableSyncBailHook() { - return { - call: function call() {} - }; -}; - -/***/ }), - -/***/ "./node_modules/webpack/lib/logging/Logger.js": -/*!****************************************************!*\ - !*** ./node_modules/webpack/lib/logging/Logger.js ***! - \****************************************************/ -/***/ (function(__unused_webpack_module, exports) { - -/* - MIT License http://www.opensource.org/licenses/mit-license.php - Author Tobias Koppers @sokra -*/ - - -function _toConsumableArray(arr) { - return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); -} - -function _nonIterableSpread() { - throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); -} - -function _unsupportedIterableToArray(o, minLen) { - if (!o) return; - if (typeof o === "string") return _arrayLikeToArray(o, minLen); - var n = Object.prototype.toString.call(o).slice(8, -1); - if (n === "Object" && o.constructor) n = o.constructor.name; - if (n === "Map" || n === "Set") return Array.from(o); - if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); -} - -function _iterableToArray(iter) { - if (typeof (typeof Symbol !== "undefined" ? Symbol : function (i) { return i; }) !== "undefined" && iter[(typeof Symbol !== "undefined" ? Symbol : function (i) { return i; }).iterator] != null || iter["@@iterator"] != null) return Array.from(iter); -} - -function _arrayWithoutHoles(arr) { - if (Array.isArray(arr)) return _arrayLikeToArray(arr); -} - -function _arrayLikeToArray(arr, len) { - if (len == null || len > arr.length) len = arr.length; - - for (var i = 0, arr2 = new Array(len); i < len; i++) { - arr2[i] = arr[i]; - } - - return arr2; -} - -function _classCallCheck(instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a function"); - } -} - -function _defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i]; - descriptor.enumerable = descriptor.enumerable || false; - descriptor.configurable = true; - if ("value" in descriptor) descriptor.writable = true; - Object.defineProperty(target, descriptor.key, descriptor); - } -} - -function _createClass(Constructor, protoProps, staticProps) { - if (protoProps) _defineProperties(Constructor.prototype, protoProps); - if (staticProps) _defineProperties(Constructor, staticProps); - Object.defineProperty(Constructor, "prototype", { - writable: false - }); - return Constructor; -} - -var LogType = Object.freeze({ - error: - /** @type {"error"} */ - "error", - // message, c style arguments - warn: - /** @type {"warn"} */ - "warn", - // message, c style arguments - info: - /** @type {"info"} */ - "info", - // message, c style arguments - log: - /** @type {"log"} */ - "log", - // message, c style arguments - debug: - /** @type {"debug"} */ - "debug", - // message, c style arguments - trace: - /** @type {"trace"} */ - "trace", - // no arguments - group: - /** @type {"group"} */ - "group", - // [label] - groupCollapsed: - /** @type {"groupCollapsed"} */ - "groupCollapsed", - // [label] - groupEnd: - /** @type {"groupEnd"} */ - "groupEnd", - // [label] - profile: - /** @type {"profile"} */ - "profile", - // [profileName] - profileEnd: - /** @type {"profileEnd"} */ - "profileEnd", - // [profileName] - time: - /** @type {"time"} */ - "time", - // name, time as [seconds, nanoseconds] - clear: - /** @type {"clear"} */ - "clear", - // no arguments - status: - /** @type {"status"} */ - "status" // message, arguments - -}); -exports.LogType = LogType; -/** @typedef {typeof LogType[keyof typeof LogType]} LogTypeEnum */ - -var LOG_SYMBOL = (typeof Symbol !== "undefined" ? Symbol : function (i) { return i; })("webpack logger raw log method"); -var TIMERS_SYMBOL = (typeof Symbol !== "undefined" ? Symbol : function (i) { return i; })("webpack logger times"); -var TIMERS_AGGREGATES_SYMBOL = (typeof Symbol !== "undefined" ? Symbol : function (i) { return i; })("webpack logger aggregated times"); - -var WebpackLogger = /*#__PURE__*/function () { - /** - * @param {function(LogTypeEnum, any[]=): void} log log function - * @param {function(string | function(): string): WebpackLogger} getChildLogger function to create child logger - */ - function WebpackLogger(log, getChildLogger) { - _classCallCheck(this, WebpackLogger); - - this[LOG_SYMBOL] = log; - this.getChildLogger = getChildLogger; - } - - _createClass(WebpackLogger, [{ - key: "error", - value: function error() { - for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { - args[_key] = arguments[_key]; - } - - this[LOG_SYMBOL](LogType.error, args); - } - }, { - key: "warn", - value: function warn() { - for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { - args[_key2] = arguments[_key2]; - } - - this[LOG_SYMBOL](LogType.warn, args); - } - }, { - key: "info", - value: function info() { - for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) { - args[_key3] = arguments[_key3]; - } - - this[LOG_SYMBOL](LogType.info, args); - } - }, { - key: "log", - value: function log() { - for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) { - args[_key4] = arguments[_key4]; - } - - this[LOG_SYMBOL](LogType.log, args); - } - }, { - key: "debug", - value: function debug() { - for (var _len5 = arguments.length, args = new Array(_len5), _key5 = 0; _key5 < _len5; _key5++) { - args[_key5] = arguments[_key5]; - } - - this[LOG_SYMBOL](LogType.debug, args); - } - }, { - key: "assert", - value: function assert(assertion) { - if (!assertion) { - for (var _len6 = arguments.length, args = new Array(_len6 > 1 ? _len6 - 1 : 0), _key6 = 1; _key6 < _len6; _key6++) { - args[_key6 - 1] = arguments[_key6]; - } - - this[LOG_SYMBOL](LogType.error, args); - } - } - }, { - key: "trace", - value: function trace() { - this[LOG_SYMBOL](LogType.trace, ["Trace"]); - } - }, { - key: "clear", - value: function clear() { - this[LOG_SYMBOL](LogType.clear); - } - }, { - key: "status", - value: function status() { - for (var _len7 = arguments.length, args = new Array(_len7), _key7 = 0; _key7 < _len7; _key7++) { - args[_key7] = arguments[_key7]; - } - - this[LOG_SYMBOL](LogType.status, args); - } - }, { - key: "group", - value: function group() { - for (var _len8 = arguments.length, args = new Array(_len8), _key8 = 0; _key8 < _len8; _key8++) { - args[_key8] = arguments[_key8]; - } - - this[LOG_SYMBOL](LogType.group, args); - } - }, { - key: "groupCollapsed", - value: function groupCollapsed() { - for (var _len9 = arguments.length, args = new Array(_len9), _key9 = 0; _key9 < _len9; _key9++) { - args[_key9] = arguments[_key9]; - } - - this[LOG_SYMBOL](LogType.groupCollapsed, args); - } - }, { - key: "groupEnd", - value: function groupEnd() { - for (var _len10 = arguments.length, args = new Array(_len10), _key10 = 0; _key10 < _len10; _key10++) { - args[_key10] = arguments[_key10]; - } - - this[LOG_SYMBOL](LogType.groupEnd, args); - } - }, { - key: "profile", - value: function profile(label) { - this[LOG_SYMBOL](LogType.profile, [label]); - } - }, { - key: "profileEnd", - value: function profileEnd(label) { - this[LOG_SYMBOL](LogType.profileEnd, [label]); - } - }, { - key: "time", - value: function time(label) { - this[TIMERS_SYMBOL] = this[TIMERS_SYMBOL] || new Map(); - this[TIMERS_SYMBOL].set(label, process.hrtime()); - } - }, { - key: "timeLog", - value: function timeLog(label) { - var prev = this[TIMERS_SYMBOL] && this[TIMERS_SYMBOL].get(label); - - if (!prev) { - throw new Error("No such label '".concat(label, "' for WebpackLogger.timeLog()")); - } - - var time = process.hrtime(prev); - this[LOG_SYMBOL](LogType.time, [label].concat(_toConsumableArray(time))); - } - }, { - key: "timeEnd", - value: function timeEnd(label) { - var prev = this[TIMERS_SYMBOL] && this[TIMERS_SYMBOL].get(label); - - if (!prev) { - throw new Error("No such label '".concat(label, "' for WebpackLogger.timeEnd()")); - } - - var time = process.hrtime(prev); - this[TIMERS_SYMBOL].delete(label); - this[LOG_SYMBOL](LogType.time, [label].concat(_toConsumableArray(time))); - } - }, { - key: "timeAggregate", - value: function timeAggregate(label) { - var prev = this[TIMERS_SYMBOL] && this[TIMERS_SYMBOL].get(label); - - if (!prev) { - throw new Error("No such label '".concat(label, "' for WebpackLogger.timeAggregate()")); - } - - var time = process.hrtime(prev); - this[TIMERS_SYMBOL].delete(label); - this[TIMERS_AGGREGATES_SYMBOL] = this[TIMERS_AGGREGATES_SYMBOL] || new Map(); - var current = this[TIMERS_AGGREGATES_SYMBOL].get(label); - - if (current !== undefined) { - if (time[1] + current[1] > 1e9) { - time[0] += current[0] + 1; - time[1] = time[1] - 1e9 + current[1]; - } else { - time[0] += current[0]; - time[1] += current[1]; - } - } - - this[TIMERS_AGGREGATES_SYMBOL].set(label, time); - } - }, { - key: "timeAggregateEnd", - value: function timeAggregateEnd(label) { - if (this[TIMERS_AGGREGATES_SYMBOL] === undefined) return; - var time = this[TIMERS_AGGREGATES_SYMBOL].get(label); - if (time === undefined) return; - this[TIMERS_AGGREGATES_SYMBOL].delete(label); - this[LOG_SYMBOL](LogType.time, [label].concat(_toConsumableArray(time))); - } - }]); - - return WebpackLogger; -}(); - -exports.Logger = WebpackLogger; - -/***/ }), - -/***/ "./node_modules/webpack/lib/logging/createConsoleLogger.js": -/*!*****************************************************************!*\ - !*** ./node_modules/webpack/lib/logging/createConsoleLogger.js ***! - \*****************************************************************/ -/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_10785__) { - -/* - MIT License http://www.opensource.org/licenses/mit-license.php - Author Tobias Koppers @sokra -*/ - - -function _toConsumableArray(arr) { - return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); -} - -function _nonIterableSpread() { - throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); -} - -function _unsupportedIterableToArray(o, minLen) { - if (!o) return; - if (typeof o === "string") return _arrayLikeToArray(o, minLen); - var n = Object.prototype.toString.call(o).slice(8, -1); - if (n === "Object" && o.constructor) n = o.constructor.name; - if (n === "Map" || n === "Set") return Array.from(o); - if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); -} - -function _iterableToArray(iter) { - if (typeof (typeof Symbol !== "undefined" ? Symbol : function (i) { return i; }) !== "undefined" && iter[(typeof Symbol !== "undefined" ? Symbol : function (i) { return i; }).iterator] != null || iter["@@iterator"] != null) return Array.from(iter); -} - -function _arrayWithoutHoles(arr) { - if (Array.isArray(arr)) return _arrayLikeToArray(arr); -} - -function _arrayLikeToArray(arr, len) { - if (len == null || len > arr.length) len = arr.length; - - for (var i = 0, arr2 = new Array(len); i < len; i++) { - arr2[i] = arr[i]; - } - - return arr2; -} - -var _require = __nested_webpack_require_10785__(/*! ./Logger */ "./node_modules/webpack/lib/logging/Logger.js"), - LogType = _require.LogType; -/** @typedef {import("../../declarations/WebpackOptions").FilterItemTypes} FilterItemTypes */ - -/** @typedef {import("../../declarations/WebpackOptions").FilterTypes} FilterTypes */ - -/** @typedef {import("./Logger").LogTypeEnum} LogTypeEnum */ - -/** @typedef {function(string): boolean} FilterFunction */ - -/** - * @typedef {Object} LoggerConsole - * @property {function(): void} clear - * @property {function(): void} trace - * @property {(...args: any[]) => void} info - * @property {(...args: any[]) => void} log - * @property {(...args: any[]) => void} warn - * @property {(...args: any[]) => void} error - * @property {(...args: any[]) => void=} debug - * @property {(...args: any[]) => void=} group - * @property {(...args: any[]) => void=} groupCollapsed - * @property {(...args: any[]) => void=} groupEnd - * @property {(...args: any[]) => void=} status - * @property {(...args: any[]) => void=} profile - * @property {(...args: any[]) => void=} profileEnd - * @property {(...args: any[]) => void=} logTime - */ - -/** - * @typedef {Object} LoggerOptions - * @property {false|true|"none"|"error"|"warn"|"info"|"log"|"verbose"} level loglevel - * @property {FilterTypes|boolean} debug filter for debug logging - * @property {LoggerConsole} console the console to log to - */ - -/** - * @param {FilterItemTypes} item an input item - * @returns {FilterFunction} filter function - */ - - -var filterToFunction = function filterToFunction(item) { - if (typeof item === "string") { - var regExp = new RegExp("[\\\\/]".concat(item.replace( // eslint-disable-next-line no-useless-escape - /[-[\]{}()*+?.\\^$|]/g, "\\$&"), "([\\\\/]|$|!|\\?)")); - return function (ident) { - return regExp.test(ident); - }; - } - - if (item && typeof item === "object" && typeof item.test === "function") { - return function (ident) { - return item.test(ident); - }; - } - - if (typeof item === "function") { - return item; - } - - if (typeof item === "boolean") { - return function () { - return item; - }; - } -}; -/** - * @enum {number} - */ - - -var LogLevel = { - none: 6, - false: 6, - error: 5, - warn: 4, - info: 3, - log: 2, - true: 2, - verbose: 1 -}; -/** - * @param {LoggerOptions} options options object - * @returns {function(string, LogTypeEnum, any[]): void} logging function - */ - -module.exports = function (_ref) { - var _ref$level = _ref.level, - level = _ref$level === void 0 ? "info" : _ref$level, - _ref$debug = _ref.debug, - debug = _ref$debug === void 0 ? false : _ref$debug, - console = _ref.console; - var debugFilters = typeof debug === "boolean" ? [function () { - return debug; - }] : - /** @type {FilterItemTypes[]} */ - [].concat(debug).map(filterToFunction); - /** @type {number} */ - - var loglevel = LogLevel["".concat(level)] || 0; - /** - * @param {string} name name of the logger - * @param {LogTypeEnum} type type of the log entry - * @param {any[]} args arguments of the log entry - * @returns {void} - */ - - var logger = function logger(name, type, args) { - var labeledArgs = function labeledArgs() { - if (Array.isArray(args)) { - if (args.length > 0 && typeof args[0] === "string") { - return ["[".concat(name, "] ").concat(args[0])].concat(_toConsumableArray(args.slice(1))); - } else { - return ["[".concat(name, "]")].concat(_toConsumableArray(args)); - } - } else { - return []; - } - }; - - var debug = debugFilters.some(function (f) { - return f(name); - }); - - switch (type) { - case LogType.debug: - if (!debug) return; // eslint-disable-next-line node/no-unsupported-features/node-builtins - - if (typeof console.debug === "function") { - // eslint-disable-next-line node/no-unsupported-features/node-builtins - console.debug.apply(console, _toConsumableArray(labeledArgs())); - } else { - console.log.apply(console, _toConsumableArray(labeledArgs())); - } - - break; - - case LogType.log: - if (!debug && loglevel > LogLevel.log) return; - console.log.apply(console, _toConsumableArray(labeledArgs())); - break; - - case LogType.info: - if (!debug && loglevel > LogLevel.info) return; - console.info.apply(console, _toConsumableArray(labeledArgs())); - break; - - case LogType.warn: - if (!debug && loglevel > LogLevel.warn) return; - console.warn.apply(console, _toConsumableArray(labeledArgs())); - break; - - case LogType.error: - if (!debug && loglevel > LogLevel.error) return; - console.error.apply(console, _toConsumableArray(labeledArgs())); - break; - - case LogType.trace: - if (!debug) return; - console.trace(); - break; - - case LogType.groupCollapsed: - if (!debug && loglevel > LogLevel.log) return; - - if (!debug && loglevel > LogLevel.verbose) { - // eslint-disable-next-line node/no-unsupported-features/node-builtins - if (typeof console.groupCollapsed === "function") { - // eslint-disable-next-line node/no-unsupported-features/node-builtins - console.groupCollapsed.apply(console, _toConsumableArray(labeledArgs())); - } else { - console.log.apply(console, _toConsumableArray(labeledArgs())); - } - - break; - } - - // falls through - - case LogType.group: - if (!debug && loglevel > LogLevel.log) return; // eslint-disable-next-line node/no-unsupported-features/node-builtins - - if (typeof console.group === "function") { - // eslint-disable-next-line node/no-unsupported-features/node-builtins - console.group.apply(console, _toConsumableArray(labeledArgs())); - } else { - console.log.apply(console, _toConsumableArray(labeledArgs())); - } - - break; - - case LogType.groupEnd: - if (!debug && loglevel > LogLevel.log) return; // eslint-disable-next-line node/no-unsupported-features/node-builtins - - if (typeof console.groupEnd === "function") { - // eslint-disable-next-line node/no-unsupported-features/node-builtins - console.groupEnd(); - } - - break; - - case LogType.time: - { - if (!debug && loglevel > LogLevel.log) return; - var ms = args[1] * 1000 + args[2] / 1000000; - var msg = "[".concat(name, "] ").concat(args[0], ": ").concat(ms, " ms"); - - if (typeof console.logTime === "function") { - console.logTime(msg); - } else { - console.log(msg); - } - - break; - } - - case LogType.profile: - // eslint-disable-next-line node/no-unsupported-features/node-builtins - if (typeof console.profile === "function") { - // eslint-disable-next-line node/no-unsupported-features/node-builtins - console.profile.apply(console, _toConsumableArray(labeledArgs())); - } - - break; - - case LogType.profileEnd: - // eslint-disable-next-line node/no-unsupported-features/node-builtins - if (typeof console.profileEnd === "function") { - // eslint-disable-next-line node/no-unsupported-features/node-builtins - console.profileEnd.apply(console, _toConsumableArray(labeledArgs())); - } - - break; - - case LogType.clear: - if (!debug && loglevel > LogLevel.log) return; // eslint-disable-next-line node/no-unsupported-features/node-builtins - - if (typeof console.clear === "function") { - // eslint-disable-next-line node/no-unsupported-features/node-builtins - console.clear(); - } - - break; - - case LogType.status: - if (!debug && loglevel > LogLevel.info) return; - - if (typeof console.status === "function") { - if (args.length === 0) { - console.status(); - } else { - console.status.apply(console, _toConsumableArray(labeledArgs())); - } - } else { - if (args.length !== 0) { - console.info.apply(console, _toConsumableArray(labeledArgs())); - } - } - - break; - - default: - throw new Error("Unexpected LogType ".concat(type)); - } - }; - - return logger; -}; - -/***/ }), - -/***/ "./node_modules/webpack/lib/logging/runtime.js": -/*!*****************************************************!*\ - !*** ./node_modules/webpack/lib/logging/runtime.js ***! - \*****************************************************/ -/***/ (function(__unused_webpack_module, exports, __nested_webpack_require_20872__) { - -/* - MIT License http://www.opensource.org/licenses/mit-license.php - Author Tobias Koppers @sokra -*/ - - -function _extends() { - _extends = Object.assign ? Object.assign.bind() : function (target) { - for (var i = 1; i < arguments.length; i++) { - var source = arguments[i]; - - for (var key in source) { - if (Object.prototype.hasOwnProperty.call(source, key)) { - target[key] = source[key]; - } - } - } - - return target; - }; - return _extends.apply(this, arguments); -} - -var SyncBailHook = __nested_webpack_require_20872__(/*! tapable/lib/SyncBailHook */ "./client-src/modules/logger/SyncBailHookFake.js"); - -var _require = __nested_webpack_require_20872__(/*! ./Logger */ "./node_modules/webpack/lib/logging/Logger.js"), - Logger = _require.Logger; - -var createConsoleLogger = __nested_webpack_require_20872__(/*! ./createConsoleLogger */ "./node_modules/webpack/lib/logging/createConsoleLogger.js"); -/** @type {createConsoleLogger.LoggerOptions} */ - - -var currentDefaultLoggerOptions = { - level: "info", - debug: false, - console: console -}; -var currentDefaultLogger = createConsoleLogger(currentDefaultLoggerOptions); -/** - * @param {string} name name of the logger - * @returns {Logger} a logger - */ - -exports.getLogger = function (name) { - return new Logger(function (type, args) { - if (exports.hooks.log.call(name, type, args) === undefined) { - currentDefaultLogger(name, type, args); - } - }, function (childName) { - return exports.getLogger("".concat(name, "/").concat(childName)); - }); -}; -/** - * @param {createConsoleLogger.LoggerOptions} options new options, merge with old options - * @returns {void} - */ - - -exports.configureDefaultLogger = function (options) { - _extends(currentDefaultLoggerOptions, options); - - currentDefaultLogger = createConsoleLogger(currentDefaultLoggerOptions); -}; - -exports.hooks = { - log: new SyncBailHook(["origin", "type", "args"]) -}; - -/***/ }) - -/******/ }); -/************************************************************************/ -/******/ // The module cache -/******/ var __webpack_module_cache__ = {}; -/******/ -/******/ // The require function -/******/ function __nested_webpack_require_23009__(moduleId) { -/******/ // Check if module is in cache -/******/ var cachedModule = __webpack_module_cache__[moduleId]; -/******/ if (cachedModule !== undefined) { -/******/ return cachedModule.exports; -/******/ } -/******/ // Create a new module (and put it into the cache) -/******/ var module = __webpack_module_cache__[moduleId] = { -/******/ // no module.id needed -/******/ // no module.loaded needed -/******/ exports: {} -/******/ }; -/******/ -/******/ // Execute the module function -/******/ __webpack_modules__[moduleId](module, module.exports, __nested_webpack_require_23009__); -/******/ -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } -/******/ -/************************************************************************/ -/******/ /* webpack/runtime/define property getters */ -/******/ !function() { -/******/ // define getter functions for harmony exports -/******/ __nested_webpack_require_23009__.d = function(exports, definition) { -/******/ for(var key in definition) { -/******/ if(__nested_webpack_require_23009__.o(definition, key) && !__nested_webpack_require_23009__.o(exports, key)) { -/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); -/******/ } -/******/ } -/******/ }; -/******/ }(); -/******/ -/******/ /* webpack/runtime/hasOwnProperty shorthand */ -/******/ !function() { -/******/ __nested_webpack_require_23009__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); } -/******/ }(); -/******/ -/******/ /* webpack/runtime/make namespace object */ -/******/ !function() { -/******/ // define __esModule on exports -/******/ __nested_webpack_require_23009__.r = function(exports) { -/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { -/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); -/******/ } -/******/ Object.defineProperty(exports, '__esModule', { value: true }); -/******/ }; -/******/ }(); -/******/ -/************************************************************************/ -var __webpack_exports__ = {}; -// This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk. -!function() { -/*!********************************************!*\ - !*** ./client-src/modules/logger/index.js ***! - \********************************************/ -__nested_webpack_require_23009__.r(__webpack_exports__); -/* harmony export */ __nested_webpack_require_23009__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* reexport default export from named module */ webpack_lib_logging_runtime_js__WEBPACK_IMPORTED_MODULE_0__; } -/* harmony export */ }); -/* harmony import */ var webpack_lib_logging_runtime_js__WEBPACK_IMPORTED_MODULE_0__ = __nested_webpack_require_23009__(/*! webpack/lib/logging/runtime.js */ "./node_modules/webpack/lib/logging/runtime.js"); - -}(); -var __webpack_export_target__ = exports; -for(var i in __webpack_exports__) __webpack_export_target__[i] = __webpack_exports__[i]; -if(__webpack_exports__.__esModule) Object.defineProperty(__webpack_export_target__, "__esModule", { value: true }); -/******/ })() -; - -/***/ }), - -/***/ "./node_modules/webpack-dev-server/client/overlay.js": -/*!***********************************************************!*\ - !*** ./node_modules/webpack-dev-server/client/overlay.js ***! - \***********************************************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "formatProblem": function() { return /* binding */ formatProblem; }, -/* harmony export */ "hide": function() { return /* binding */ hide; }, -/* harmony export */ "show": function() { return /* binding */ show; } -/* harmony export */ }); -/* harmony import */ var ansi_html_community__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ansi-html-community */ "./node_modules/ansi-html-community/index.js"); -/* harmony import */ var ansi_html_community__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(ansi_html_community__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var html_entities__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! html-entities */ "./node_modules/html-entities/lib/index.js"); -/* harmony import */ var html_entities__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(html_entities__WEBPACK_IMPORTED_MODULE_1__); -// The error overlay is inspired (and mostly copied) from Create React App (https://github.com/facebookincubator/create-react-app) -// They, in turn, got inspired by webpack-hot-middleware (https://github.com/glenjamin/webpack-hot-middleware). - - -var colors = { - reset: ["transparent", "transparent"], - black: "181818", - red: "E36049", - green: "B3CB74", - yellow: "FFD080", - blue: "7CAFC2", - magenta: "7FACCA", - cyan: "C3C2EF", - lightgrey: "EBE7E3", - darkgrey: "6D7891" -}; -/** @type {HTMLIFrameElement | null | undefined} */ - -var iframeContainerElement; -/** @type {HTMLDivElement | null | undefined} */ - -var containerElement; -/** @type {Array<(element: HTMLDivElement) => void>} */ - -var onLoadQueue = []; -/** @type {TrustedTypePolicy | undefined} */ - -var overlayTrustedTypesPolicy; -ansi_html_community__WEBPACK_IMPORTED_MODULE_0___default().setColors(colors); -/** - * @param {string | null} trustedTypesPolicyName - */ - -function createContainer(trustedTypesPolicyName) { - // Enable Trusted Types if they are available in the current browser. - if (window.trustedTypes) { - overlayTrustedTypesPolicy = window.trustedTypes.createPolicy(trustedTypesPolicyName || "webpack-dev-server#overlay", { - createHTML: function createHTML(value) { - return value; - } - }); - } - - iframeContainerElement = document.createElement("iframe"); - iframeContainerElement.id = "webpack-dev-server-client-overlay"; - iframeContainerElement.src = "about:blank"; - iframeContainerElement.style.position = "fixed"; - iframeContainerElement.style.left = 0; - iframeContainerElement.style.top = 0; - iframeContainerElement.style.right = 0; - iframeContainerElement.style.bottom = 0; - iframeContainerElement.style.width = "100vw"; - iframeContainerElement.style.height = "100vh"; - iframeContainerElement.style.border = "none"; - iframeContainerElement.style.zIndex = 9999999999; - - iframeContainerElement.onload = function () { - containerElement = - /** @type {Document} */ - - /** @type {HTMLIFrameElement} */ - iframeContainerElement.contentDocument.createElement("div"); - containerElement.id = "webpack-dev-server-client-overlay-div"; - containerElement.style.position = "fixed"; - containerElement.style.boxSizing = "border-box"; - containerElement.style.left = 0; - containerElement.style.top = 0; - containerElement.style.right = 0; - containerElement.style.bottom = 0; - containerElement.style.width = "100vw"; - containerElement.style.height = "100vh"; - containerElement.style.backgroundColor = "rgba(0, 0, 0, 0.85)"; - containerElement.style.color = "#E8E8E8"; - containerElement.style.fontFamily = "Menlo, Consolas, monospace"; - containerElement.style.fontSize = "large"; - containerElement.style.padding = "2rem"; - containerElement.style.lineHeight = "1.2"; - containerElement.style.whiteSpace = "pre-wrap"; - containerElement.style.overflow = "auto"; - var headerElement = document.createElement("span"); - headerElement.innerText = "Compiled with problems:"; - var closeButtonElement = document.createElement("button"); - closeButtonElement.innerText = "X"; - closeButtonElement.style.background = "transparent"; - closeButtonElement.style.border = "none"; - closeButtonElement.style.fontSize = "20px"; - closeButtonElement.style.fontWeight = "bold"; - closeButtonElement.style.color = "white"; - closeButtonElement.style.cursor = "pointer"; - closeButtonElement.style.cssFloat = "right"; // @ts-ignore - - closeButtonElement.style.styleFloat = "right"; - closeButtonElement.addEventListener("click", function () { - hide(); - }); - containerElement.appendChild(headerElement); - containerElement.appendChild(closeButtonElement); - containerElement.appendChild(document.createElement("br")); - containerElement.appendChild(document.createElement("br")); - /** @type {Document} */ - - /** @type {HTMLIFrameElement} */ - iframeContainerElement.contentDocument.body.appendChild(containerElement); - onLoadQueue.forEach(function (onLoad) { - onLoad( - /** @type {HTMLDivElement} */ - containerElement); - }); - onLoadQueue = []; - /** @type {HTMLIFrameElement} */ - - iframeContainerElement.onload = null; - }; - - document.body.appendChild(iframeContainerElement); -} -/** - * @param {(element: HTMLDivElement) => void} callback - * @param {string | null} trustedTypesPolicyName - */ - - -function ensureOverlayExists(callback, trustedTypesPolicyName) { - if (containerElement) { - // Everything is ready, call the callback right away. - callback(containerElement); - return; - } - - onLoadQueue.push(callback); - - if (iframeContainerElement) { - return; - } - - createContainer(trustedTypesPolicyName); -} // Successful compilation. - - -function hide() { - if (!iframeContainerElement) { - return; - } // Clean up and reset internal state. - - - document.body.removeChild(iframeContainerElement); - iframeContainerElement = null; - containerElement = null; -} -/** - * @param {string} type - * @param {string | { file?: string, moduleName?: string, loc?: string, message?: string }} item - * @returns {{ header: string, body: string }} - */ - - -function formatProblem(type, item) { - var header = type === "warning" ? "WARNING" : "ERROR"; - var body = ""; - - if (typeof item === "string") { - body += item; - } else { - var file = item.file || ""; // eslint-disable-next-line no-nested-ternary - - var moduleName = item.moduleName ? item.moduleName.indexOf("!") !== -1 ? "".concat(item.moduleName.replace(/^(\s|\S)*!/, ""), " (").concat(item.moduleName, ")") : "".concat(item.moduleName) : ""; - var loc = item.loc; - header += "".concat(moduleName || file ? " in ".concat(moduleName ? "".concat(moduleName).concat(file ? " (".concat(file, ")") : "") : file).concat(loc ? " ".concat(loc) : "") : ""); - body += item.message || ""; - } - - return { - header: header, - body: body - }; -} // Compilation with errors (e.g. syntax error or missing modules). - -/** - * @param {string} type - * @param {Array} messages - * @param {string | null} trustedTypesPolicyName - */ - - -function show(type, messages, trustedTypesPolicyName) { - ensureOverlayExists(function () { - messages.forEach(function (message) { - var entryElement = document.createElement("div"); - var typeElement = document.createElement("span"); - - var _formatProblem = formatProblem(type, message), - header = _formatProblem.header, - body = _formatProblem.body; - - typeElement.innerText = header; - typeElement.style.color = "#".concat(colors.red); // Make it look similar to our terminal. - - var text = ansi_html_community__WEBPACK_IMPORTED_MODULE_0___default()((0,html_entities__WEBPACK_IMPORTED_MODULE_1__.encode)(body)); - var messageTextNode = document.createElement("div"); - messageTextNode.innerHTML = overlayTrustedTypesPolicy ? overlayTrustedTypesPolicy.createHTML(text) : text; - entryElement.appendChild(typeElement); - entryElement.appendChild(document.createElement("br")); - entryElement.appendChild(document.createElement("br")); - entryElement.appendChild(messageTextNode); - entryElement.appendChild(document.createElement("br")); - entryElement.appendChild(document.createElement("br")); - /** @type {HTMLDivElement} */ - - containerElement.appendChild(entryElement); - }); - }, trustedTypesPolicyName); -} - - - -/***/ }), - -/***/ "./node_modules/webpack-dev-server/client/socket.js": -/*!**********************************************************!*\ - !*** ./node_modules/webpack-dev-server/client/socket.js ***! - \**********************************************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "client": function() { return /* binding */ client; } -/* harmony export */ }); -/* harmony import */ var _clients_WebSocketClient_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./clients/WebSocketClient.js */ "./node_modules/webpack-dev-server/client/clients/WebSocketClient.js"); -/* harmony import */ var _utils_log_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils/log.js */ "./node_modules/webpack-dev-server/client/utils/log.js"); -/* provided dependency */ var __webpack_dev_server_client__ = __webpack_require__(/*! ./node_modules/webpack-dev-server/client/clients/WebSocketClient.js */ "./node_modules/webpack-dev-server/client/clients/WebSocketClient.js"); -/* global __webpack_dev_server_client__ */ - - // this WebsocketClient is here as a default fallback, in case the client is not injected - -/* eslint-disable camelcase */ - -var Client = // eslint-disable-next-line no-nested-ternary -typeof __webpack_dev_server_client__ !== "undefined" ? typeof __webpack_dev_server_client__.default !== "undefined" ? __webpack_dev_server_client__.default : __webpack_dev_server_client__ : _clients_WebSocketClient_js__WEBPACK_IMPORTED_MODULE_0__["default"]; -/* eslint-enable camelcase */ - -var retries = 0; -var maxRetries = 10; // Initialized client is exported so external consumers can utilize the same instance -// It is mutable to enforce singleton -// eslint-disable-next-line import/no-mutable-exports - -var client = null; -/** - * @param {string} url - * @param {{ [handler: string]: (data?: any, params?: any) => any }} handlers - * @param {number} [reconnect] - */ - -var socket = function initSocket(url, handlers, reconnect) { - client = new Client(url); - client.onOpen(function () { - retries = 0; - - if (typeof reconnect !== "undefined") { - maxRetries = reconnect; - } - }); - client.onClose(function () { - if (retries === 0) { - handlers.close(); - } // Try to reconnect. - - - client = null; // After 10 retries stop trying, to prevent logspam. - - if (retries < maxRetries) { - // Exponentially increase timeout to reconnect. - // Respectfully copied from the package `got`. - // eslint-disable-next-line no-restricted-properties - var retryInMs = 1000 * Math.pow(2, retries) + Math.random() * 100; - retries += 1; - _utils_log_js__WEBPACK_IMPORTED_MODULE_1__.log.info("Trying to reconnect..."); - setTimeout(function () { - socket(url, handlers, reconnect); - }, retryInMs); - } - }); - client.onMessage( - /** - * @param {any} data - */ - function (data) { - var message = JSON.parse(data); - - if (handlers[message.type]) { - handlers[message.type](message.data, message.params); - } - }); -}; - -/* harmony default export */ __webpack_exports__["default"] = (socket); - -/***/ }), - -/***/ "./node_modules/webpack-dev-server/client/utils/createSocketURL.js": -/*!*************************************************************************!*\ - !*** ./node_modules/webpack-dev-server/client/utils/createSocketURL.js ***! - \*************************************************************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/** - * @param {{ protocol?: string, auth?: string, hostname?: string, port?: string, pathname?: string, search?: string, hash?: string, slashes?: boolean }} objURL - * @returns {string} - */ -function format(objURL) { - var protocol = objURL.protocol || ""; - - if (protocol && protocol.substr(-1) !== ":") { - protocol += ":"; - } - - var auth = objURL.auth || ""; - - if (auth) { - auth = encodeURIComponent(auth); - auth = auth.replace(/%3A/i, ":"); - auth += "@"; - } - - var host = ""; - - if (objURL.hostname) { - host = auth + (objURL.hostname.indexOf(":") === -1 ? objURL.hostname : "[".concat(objURL.hostname, "]")); - - if (objURL.port) { - host += ":".concat(objURL.port); - } - } - - var pathname = objURL.pathname || ""; - - if (objURL.slashes) { - host = "//".concat(host || ""); - - if (pathname && pathname.charAt(0) !== "/") { - pathname = "/".concat(pathname); - } - } else if (!host) { - host = ""; - } - - var search = objURL.search || ""; - - if (search && search.charAt(0) !== "?") { - search = "?".concat(search); - } - - var hash = objURL.hash || ""; - - if (hash && hash.charAt(0) !== "#") { - hash = "#".concat(hash); - } - - pathname = pathname.replace(/[?#]/g, - /** - * @param {string} match - * @returns {string} - */ - function (match) { - return encodeURIComponent(match); - }); - search = search.replace("#", "%23"); - return "".concat(protocol).concat(host).concat(pathname).concat(search).concat(hash); -} -/** - * @param {URL & { fromCurrentScript?: boolean }} parsedURL - * @returns {string} - */ - - -function createSocketURL(parsedURL) { - var hostname = parsedURL.hostname; // Node.js module parses it as `::` - // `new URL(urlString, [baseURLString])` parses it as '[::]' - - var isInAddrAny = hostname === "0.0.0.0" || hostname === "::" || hostname === "[::]"; // why do we need this check? - // hostname n/a for file protocol (example, when using electron, ionic) - // see: https://github.com/webpack/webpack-dev-server/pull/384 - - if (isInAddrAny && self.location.hostname && self.location.protocol.indexOf("http") === 0) { - hostname = self.location.hostname; - } - - var socketURLProtocol = parsedURL.protocol || self.location.protocol; // When https is used in the app, secure web sockets are always necessary because the browser doesn't accept non-secure web sockets. - - if (socketURLProtocol === "auto:" || hostname && isInAddrAny && self.location.protocol === "https:") { - socketURLProtocol = self.location.protocol; - } - - socketURLProtocol = socketURLProtocol.replace(/^(?:http|.+-extension|file)/i, "ws"); - var socketURLAuth = ""; // `new URL(urlString, [baseURLstring])` doesn't have `auth` property - // Parse authentication credentials in case we need them - - if (parsedURL.username) { - socketURLAuth = parsedURL.username; // Since HTTP basic authentication does not allow empty username, - // we only include password if the username is not empty. - - if (parsedURL.password) { - // Result: : - socketURLAuth = socketURLAuth.concat(":", parsedURL.password); - } - } // In case the host is a raw IPv6 address, it can be enclosed in - // the brackets as the brackets are needed in the final URL string. - // Need to remove those as url.format blindly adds its own set of brackets - // if the host string contains colons. That would lead to non-working - // double brackets (e.g. [[::]]) host - // - // All of these web socket url params are optionally passed in through resourceQuery, - // so we need to fall back to the default if they are not provided - - - var socketURLHostname = (hostname || self.location.hostname || "localhost").replace(/^\[(.*)\]$/, "$1"); - var socketURLPort = parsedURL.port; - - if (!socketURLPort || socketURLPort === "0") { - socketURLPort = self.location.port; - } // If path is provided it'll be passed in via the resourceQuery as a - // query param so it has to be parsed out of the querystring in order for the - // client to open the socket to the correct location. - - - var socketURLPathname = "/ws"; - - if (parsedURL.pathname && !parsedURL.fromCurrentScript) { - socketURLPathname = parsedURL.pathname; - } - - return format({ - protocol: socketURLProtocol, - auth: socketURLAuth, - hostname: socketURLHostname, - port: socketURLPort, - pathname: socketURLPathname, - slashes: true - }); -} - -/* harmony default export */ __webpack_exports__["default"] = (createSocketURL); - -/***/ }), - -/***/ "./node_modules/webpack-dev-server/client/utils/getCurrentScriptSource.js": -/*!********************************************************************************!*\ - !*** ./node_modules/webpack-dev-server/client/utils/getCurrentScriptSource.js ***! - \********************************************************************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/** - * @returns {string} - */ -function getCurrentScriptSource() { - // `document.currentScript` is the most accurate way to find the current script, - // but is not supported in all browsers. - if (document.currentScript) { - return document.currentScript.getAttribute("src"); - } // Fallback to getting all scripts running in the document. - - - var scriptElements = document.scripts || []; - var scriptElementsWithSrc = Array.prototype.filter.call(scriptElements, function (element) { - return element.getAttribute("src"); - }); - - if (scriptElementsWithSrc.length > 0) { - var currentScript = scriptElementsWithSrc[scriptElementsWithSrc.length - 1]; - return currentScript.getAttribute("src"); - } // Fail as there was no script to use. - - - throw new Error("[webpack-dev-server] Failed to get current script source."); -} - -/* harmony default export */ __webpack_exports__["default"] = (getCurrentScriptSource); - -/***/ }), - -/***/ "./node_modules/webpack-dev-server/client/utils/log.js": -/*!*************************************************************!*\ - !*** ./node_modules/webpack-dev-server/client/utils/log.js ***! - \*************************************************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "log": function() { return /* binding */ log; }, -/* harmony export */ "setLogLevel": function() { return /* binding */ setLogLevel; } -/* harmony export */ }); -/* harmony import */ var _modules_logger_index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/logger/index.js */ "./node_modules/webpack-dev-server/client/modules/logger/index.js"); -/* harmony import */ var _modules_logger_index_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_modules_logger_index_js__WEBPACK_IMPORTED_MODULE_0__); - -var name = "webpack-dev-server"; // default level is set on the client side, so it does not need -// to be set by the CLI or API - -var defaultLevel = "info"; // options new options, merge with old options - -/** - * @param {false | true | "none" | "error" | "warn" | "info" | "log" | "verbose"} level - * @returns {void} - */ - -function setLogLevel(level) { - _modules_logger_index_js__WEBPACK_IMPORTED_MODULE_0___default().configureDefaultLogger({ - level: level - }); -} - -setLogLevel(defaultLevel); -var log = _modules_logger_index_js__WEBPACK_IMPORTED_MODULE_0___default().getLogger(name); - - -/***/ }), - -/***/ "./node_modules/webpack-dev-server/client/utils/parseURL.js": -/*!******************************************************************!*\ - !*** ./node_modules/webpack-dev-server/client/utils/parseURL.js ***! - \******************************************************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _getCurrentScriptSource_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getCurrentScriptSource.js */ "./node_modules/webpack-dev-server/client/utils/getCurrentScriptSource.js"); - -/** - * @param {string} resourceQuery - * @returns {{ [key: string]: string | boolean }} - */ - -function parseURL(resourceQuery) { - /** @type {{ [key: string]: string }} */ - var options = {}; - - if (typeof resourceQuery === "string" && resourceQuery !== "") { - var searchParams = resourceQuery.slice(1).split("&"); - - for (var i = 0; i < searchParams.length; i++) { - var pair = searchParams[i].split("="); - options[pair[0]] = decodeURIComponent(pair[1]); - } - } else { - // Else, get the url from the
Rotate Mode
R
RotateScale Mode
r
Scale Mode
s
Distort Mode
d
Drag Mode
D
Lock (Mode) / Unlock Image
l u
Stack up / down
q a
Add / Remove Image Border
b
Toggle Opacity
o
Deselect All
esc
Delete Image(s)
delete backspace
Export Image(s)
e
'),t.appendChild(i),t},this._keymapper.addTo(this._map)},_toggleKeymapper:function(t){t.preventDefault(),this._container.className="ldi-keymapper leaflet-control"===this._container.className?"ldi-keymapper-hide leaflet-control":"ldi-keymapper leaflet-control",this._scrollWrapper.style.display="none"===this._scrollWrapper.style.display?"block":"none",this._toggler.innerHTML="close"===this._toggler.innerHTML?L.IconUtil.create("keyboard_open"):"close",L.IconUtil.toggleTitle(this._toggler,"Show keymap","Hide keymap"),L.DomUtil.toggleClass(this._toggler,"close-icon")},_injectIconSet:function(){if(!document.querySelector("#keymapper-iconset")){var t=L.DomUtil.create("div","");t.id="keymapper-iconset",t.setAttribute("hidden","hidden"),this._iconset=(new L.KeymapperIconSet).render(),t.innerHTML=this._iconset,document.querySelector(".leaflet-control-container").appendChild(t)}}}),L.DistortableImage.Keymapper.addInitHook((function(){L.DistortableImage.Keymapper.prototype._n=L.DistortableImage.Keymapper.prototype._n?L.DistortableImage.Keymapper.prototype._n+1:1,1!==L.DistortableImage.Keymapper.prototype._n||L.Browser.mobile||(t.enable(),t._injectIconSet())})),L.distortableImage.keymapper=function(t,e){return new L.DistortableImage.Keymapper(t,e)}},428:function(){L.DistortableImage=L.DistortableImage||{},L.DistortableCollection.Edit=L.Handler.extend({options:{keymap:L.distortableImage.group_action_map},initialize:function(t,e){this._group=t,this._exportOpts=t.options.exportOpts,L.setOptions(this,e),L.distortableImage.group_action_map.Escape="_decollectAll"},addHooks:function(){var t=this._group._map;this.editActions=this.options.actions,this.runExporter=L.bind(L.Utils.getNestedVal(this,"_exportOpts","exporter")||this.startExport,this),L.DomEvent.on(document,"keydown",this._onKeyDown,this),t.doubleClickZoom.enabled()||t.doubleClickLabels.enabled()||L.DomEvent.on(t,"click",this._decollectAll,this),L.DomEvent.on(t,{singleclickon:this._singleClickListeners,singleclickoff:this._resetClickListeners,singleclick:this._singleClick,boxcollectend:this._addCollections},this),this._group.editable=!0,this._group.eachLayer((function(t){return t.editing.enable()}))},removeHooks:function(){var t=this._group._map;L.DomEvent.off(document,"keydown",this._onKeyDown,this),t.doubleClickZoom.enabled()||t.doubleClickLabels.enabled()||L.DomEvent.off(t,"click",this._decollectAll,this),L.DomEvent.off(t,{singleclickon:this._singleClickListeners,singleclickoff:this._resetClickListeners,singleclick:this._singleClick,boxcollectend:this._addCollections},this),this._decollectAll(),this._group.editable=!1,this._group.eachLayer((function(t){return t.editing.disable()}))},enable:function(){return this._enabled=!0,this.addHooks(),this},disable:function(){return this._enabled=!1,this.removeHooks(),this},_onKeyDown:function(t){var e=this.options.keymap[t.key];this[e]&&this._group.anyCollected()&&this[e].call(this)},_singleClick:function(t){"singleclick"===t.type&&this._decollectAll(t)},_singleClickListeners:function(){var t=this._group._map;L.DomEvent.off(t,"click",this._decollectAll,this),L.DomEvent.on(t,"singleclick",this._decollectAll,this)},_resetClickListeners:function(){var t=this._group._map;L.DomEvent.on(t,"click",this._decollectAll,this),L.DomEvent.off(t,"singleclick",this._decollectAll,this)},_decollectAll:function(t){var e;t&&(e=t.originalEvent),e&&(e.shiftKey||e.target instanceof HTMLImageElement)||(this._group.eachLayer((function(t){L.DomUtil.removeClass(t.getElement(),"collected"),t.deselect()})),this._removeToolbar(),t&&L.DomEvent.stopPropagation(t))},_unlockGroup:function(){var t=this;this.hasTool(L.UnlockAction)&&this._group.eachLayer((function(e){t._group.isCollected(e)&&(e.editing._unlock(),e.deselect())}))},_lockGroup:function(){var t=this;this.hasTool(L.LockAction)&&this._group.eachLayer((function(e){t._group.isCollected(e)&&(e.editing._lock(),L.DomUtil.addClass(e.getElement(),"collected"))}))},_addCollections:function(t){var e=this,i=t.boxCollectBounds,o=this._group._map;this._group.eachLayer((function(t){var n=t.editing;t.isSelected()&&t.deselect();var a=o.getZoom(),s=o.getCenter(),r=L.latLngBounds(t.getCorner(2),t.getCorner(1));r=o._latLngBoundsToNewLayerBounds(r,a,s),i.intersects(r)&&n.enabled()&&(e.toolbar||e._addToolbar(),L.DomUtil.addClass(t.getElement(),"collected"))}))},_removeGroup:function(t){var e=this;if(this.hasTool(L.DeleteAction)){var i=this._group._toRemove(),o=i.length;0!==o&&(L.DomUtil.confirmDeletes(o)&&(i.forEach((function(t){e._group.removeLayer(t)})),this._group.anyCollected()||this._removeToolbar()),t&&L.DomEvent.stopPropagation(t))}},cancelExport:function(){this.customCollection||(this._exportOpts.collection=void 0),clearInterval(this.updateInterval)},_addToolbar:function(){var t=this._group,e=t._map;t.options.suppressToolbar||this.toolbar||(this.toolbar=L.distortableImage.controlBar({actions:this.editActions,position:"topleft"}).addTo(e,t))},_removeToolbar:function(){var t=this._group._map;if(!this.toolbar)return!1;t.removeLayer(this.toolbar),this.toolbar=!1},hasTool:function(t){return this.editActions.some((function(e){return e===t}))},addTool:function(t){return"leaflet-toolbar-icon"!==t.baseClass||this.hasTool(t)||(this._removeToolbar(),this.editActions.push(t),this._addToolbar()),this},removeTool:function(t){var e=this;return this.editActions.some((function(i,o){return e.editActions[o]===t&&(e._removeToolbar(),e.editActions.splice(o,1),e._addToolbar(),!0)})),this},startExport:function(){var t=this;if(this.hasTool(L.ExportAction))return new Promise((function(e){var i,o=t._exportOpts;o.resolve=e,t.updateInterval=null,t.customCollection=!!o.collection,t.customCollection||(o.collection=t._group.generateExportJson().images),o.frequency=o.frequency||3e3,o.scale=o.scale||100,o.updater=o.updater||function(n){(n=JSON.parse(n)).status_url&&(i!==n.status_url&&n.status_url.match(".json")&&(i=n.status_url),"complete"===n.status&&(clearInterval(t.updateInterval),t.customCollection||(t._exportOpts.collection=void 0),e(),null!==n.jpg&&alert("Export succeeded. "+o.exportUrl+n.jpg)),console.log(n))},o.handleStatusRes=o.handleStatusRes||function(e){i=o.statusUrl+e,t.updateInterval=setInterval((function(){var t=new Request("".concat(i,"?").concat(Date.now()),{method:"GET"});fetch(t).then((function(t){if(t.ok)return t.text()})).then(o.updater)}),o.frequency)},o.fetchStatusUrl=o.fetchStatusUrl||function(t){var e=new FormData;e.append("collection",JSON.stringify(t.collection)),e.append("scale",t.scale),e.append("upload",!0);var i={method:"POST",body:e},o=new Request(t.exportStartUrl,i);fetch(o).then((function(t){if(t.ok)return t.text()})).then(t.handleStatusRes)},o.fetchStatusUrl(o)}))}}),L.distortableCollection.edit=function(t,e){return new L.DistortableCollection.Edit(t,e)}},397:function(){L.DistortableImage=L.DistortableImage||{},L.DistortableImage.Edit=L.Handler.extend({options:{opacity:.7,outline:"1px solid red",keymap:L.distortableImage.action_map},initialize:function(t,e){this._overlay=t,this._toggledImage=!1,this._mode=t.options.mode,this._transparent=!1,this._outlined=!1,L.setOptions(this,e),L.distortableImage.action_map.Escape="_deselect"},addHooks:function(){var t=this._overlay;this.editActions=this.options.actions,t.bringToFront(),this._initModes(),this._initHandles(),this._appendHandlesandDragable(),t.isSelected()&&!t.options.suppressToolbar&&this._addToolbar(),this.parentGroup=!!t.eP&&t.eP,L.DomEvent.on(t.getElement(),{dblclick:this.nextMode},this),L.DomEvent.on(window,"keydown",this._onKeyDown,this)},removeHooks:function(){var t=this._overlay,e=this.parentGroup;for(var i in this._disableDragging(),this.toolbar&&this._removeToolbar(),this._handles)L.DomUtil.remove(i);L.DomUtil.hasClass(t.getElement(),"collected")&&L.DomUtil.removeClass(t.getElement(),"collected"),e&&!e.anyCollected()&&e.editing.toolbar&&e.editing._removeToolbar(),L.DomEvent.off(t.getElement(),{dblclick:this.nextMode},this),L.DomEvent.off(window,"keydown",this._onKeyDown,this)},disable:function(){return this._enabled?(this._overlay.deselect(),this._enabled=!1,this.removeHooks(),this):this},_initModes:function(){for(var t in this._modes={},L.DistortableImage.Edit.MODES){var e=L.DistortableImage.Edit.MODES[t];-1!==this.editActions.indexOf(e)&&(this._modes[t]=e)}this._modes[this._mode]||(this._mode=Object.keys(this._modes)[0])},_initHandles:function(){var t,e=this._overlay;for(this._dragHandles=L.layerGroup(),t=0;t<4;t++)this._dragHandles.addLayer(L.dragHandle(e,t));for(this._scaleHandles=L.layerGroup(),t=0;t<4;t++)this._scaleHandles.addLayer(L.scaleHandle(e,t));for(this._distortHandles=L.layerGroup(),t=0;t<4;t++)this._distortHandles.addLayer(L.distortHandle(e,t));for(this._rotateHandles=L.layerGroup(),t=0;t<4;t++)this._rotateHandles.addLayer(L.rotateHandle(e,t));for(this._freeRotateHandles=L.layerGroup(),t=0;t<4;t++)this._freeRotateHandles.addLayer(L.freeRotateHandle(e,t));for(this._lockHandles=L.layerGroup(),t=0;t<4;t++)this._lockHandles.addLayer(L.lockHandle(e,t,{draggable:!1}));this._handles={drag:this._dragHandles,scale:this._scaleHandles,distort:this._distortHandles,rotate:this._rotateHandles,freeRotate:this._freeRotateHandles,lock:this._lockHandles}},_appendHandlesandDragable:function(){var t=this._overlay;this._mode?(this._updateHandle(),!t.isSelected()&&this.currentHandle&&this.currentHandle.eachLayer((function(t){t.setOpacity(0),t.dragging&&t.dragging.disable()})),this.isMode("lock")||this._enableDragging()):this._enableDragging()},_onKeyDown:function(t){var e=this.options.keymap[t.key],i=this._overlay,o=this.parentGroup;o&&o.anyCollected()||void 0===this[e]||i.options.suppressToolbar||i.isSelected()&&this.toolbar&&this[e].call(this)},replaceTool:function(t,e){var i=this;return"leaflet-toolbar-icon"!==e.baseClass||this.hasTool(e)||this.editActions.some((function(o,n){if(o===t){for(var a in i._removeToolbar(),i.editActions[n]=e,i._addToolbar(),L.DistortableImage.Edit.MODES)L.DistortableImage.Edit.MODES[a]===t?(delete i._modes[a],i._nextOrNone(a)):L.DistortableImage.Edit.MODES[a]===e&&(i._modes[a]=e);return!0}})),this},addTool:function(t){if("leaflet-toolbar-icon"===t.baseClass&&!this.hasTool(t)){for(var e in this._removeToolbar(),this.editActions.push(t),this._addToolbar(),L.DistortableImage.Edit.MODES)L.DistortableImage.Edit.MODES[e]===t&&(this._modes[e]=t);this._overlay.isSelected()||this._removeToolbar()}return this},hasTool:function(t){return this.editActions.some((function(e){return e===t}))},removeTool:function(t){var e=this;return this.editActions.some((function(i,o){if(i===t){for(var n in e._removeToolbar(),e.editActions.splice(o,1),e._addToolbar(),L.DistortableImage.Edit.MODES)L.DistortableImage.Edit.MODES[n]===t&&(delete e._modes[n],e._nextOrNone(n));return!0}})),this._overlay.isSelected()||this._removeToolbar(),this},_nextOrNone:function(t){this.isMode(t)&&(Object.keys(this.getModes()).length>=1?this.nextMode():("lock"===t&&this._enableDragging(),this._mode="",this._updateHandle()))},_removeToolbar:function(){var t=this._overlay._map;this.toolbar&&(t.removeLayer(this.toolbar),this.toolbar=!1)},_enableDragging:function(){var t=this,e=this._overlay,i=e._map;this.dragging=new L.Draggable(e.getElement()),this.dragging.enable(),this.dragging.on("dragstart",(function(){e.fire("dragstart"),t._removeToolbar()})),this.dragging._updatePosition=function(){var t,o,n=e.getCorner(0),a=this._newPos.subtract(i.latLngToLayerPoint(n)),s={};for(this.fire("predrag"),o=0;o<4;o++)t=i.latLngToLayerPoint(e.getCorner(o)),s[o]=i.layerPointToLatLng(t.add(a));e.setCorners(s),e.fire("drag"),this.fire("drag")},this.dragging.on("dragend",(function(){e.fire("dragend")}))},_disableDragging:function(){this.dragging&&(this.dragging.disable(),delete this.dragging)},_dragMode:function(){this.setMode("drag")},_scaleMode:function(){this.setMode("scale")},_distortMode:function(){this.setMode("distort")},_rotateMode:function(){this.setMode("rotate")},_freeRotateMode:function(){this.setMode("freeRotate")},_toggleLockMode:function(){this.isMode("lock")?this._unlock():this._lock()},_toggleOpacity:function(){var t=this._overlay.getElement();if(this.hasTool(L.OpacityAction)){this._transparent=!this._transparent;var e=this._transparent?this.options.opacity:1;L.DomUtil.setOpacity(t,e),t.setAttribute("opacity",e),this._refresh()}},_toggleBorder:function(){var t=this._overlay.getElement();if(this.hasTool(L.BorderAction)){this._outlined=!this._outlined;var e=this._outlined?this.options.outline:"none";t.style.outline=e,this._refresh()}},_toggleOrder:function(){this._toggledImage?this._stackUp():this._stackDown()},_removeOverlay:function(){var t=this._overlay,e=this.parentGroup;!this.isMode("lock")&&this.hasTool(L.DeleteAction)&&L.DomUtil.confirmDelete()&&(this._removeToolbar(),e?e.removeLayer(t):t._map.removeLayer(t))},_getExport:function(){var t=this._overlay,e=t._map,i=t.getElement();if(this.hasTool(L.ExportAction)){var o=new Image;o.id=o.id||"tempId12345",document.body.appendChild(o),o.onload=function(){var i=o.height,n=o.width,a=e.latLngToLayerPoint(t.getCorner(0)),s=e.latLngToLayerPoint(t.getCorner(1)),r=e.latLngToLayerPoint(t.getCorner(2)),l=e.latLngToLayerPoint(t.getCorner(3));o.onload=function(){L.DomUtil.remove(o)},window&&window.hasOwnProperty("warpWebGl")&&warpWebGl(o.id,[0,0,n,0,n,i,0,i],[a.x,a.y,s.x,s.y,l.x,l.y,r.x,r.y],!0)},o.src=t.options.fullResolutionSrc||i.src}},_stackUp:function(){this._toggledImage&&this.hasTool(L.StackAction)&&(this._toggledImage=!1,this._overlay.bringToFront(),this._refresh())},_stackDown:function(){!this._toggledImage&&this.hasTool(L.StackAction)&&(this._toggledImage=!0,this._overlay.bringToBack(),this._refresh())},_unlock:function(){var t=this._overlay,e=t._map,i=this.parentGroup;this.isMode("lock")&&((!i||i.isCollected(t))&&i||this.hasTool(L.LockAction))&&(this.currentHandle&&e.removeLayer(this.currentHandle),"lock"!==t.options.mode&&this.hasMode(t.options.mode)?this._mode=t.options.mode:(this._mode="",this.currentHandle=""),this._updateHandle(),this._enableDragging(),this._refresh())},_lock:function(){var t=this._overlay,e=t._map,i=this.parentGroup;this.isMode("lock")||((!i||i.isCollected(t))&&i||this.hasTool(L.LockAction))&&(this.currentHandle&&e.removeLayer(this.currentHandle),this._mode="lock",this._updateHandle(),this._disableDragging(),this._refresh())},_deselect:function(){this._overlay.deselect()},_showMarkers:function(t){var e=this.parentGroup;this.currentHandle&&(!this.isMode("lock")&&e&&e.anyCollected()||this.currentHandle.eachLayer((function(t){t.setOpacity(1),t.dragging&&t.dragging.enable(),L.DomUtil.addClass(t.getElement(),"leaflet-interactive")})))},_hideMarkers:function(){var t=this._overlay,e=this.parentGroup;this._handles||this._initHandles(),this.currentHandle&&(this.isMode("lock")&&e&&e.isCollected(t)||this.currentHandle.eachLayer((function(t){t.setOpacity(0),t.dragging&&t.dragging.disable(),L.DomUtil.removeClass(t.getElement(),"leaflet-interactive")})))},_updateHandle:function(){var t=this._overlay._map,e=this.getMode();this.currentHandle&&t.removeLayer(this.currentHandle),this.currentHandle=""===e?"":this._handles[e],""!==this.currentHandle&&t.addLayer(this.currentHandle)},_addToolbar:function(){var t=this._overlay,e=this.parentGroup,i=t._map,o=t.getCorners(),n=-1/0;if(e&&e.anyCollected())e.editing._addToolbar();else if(!t.options.suppressToolbar&&!this.toolbar){for(var a=0;an&&(n=o[a].lat);var s=t.getCenter();s.lat=n,this.toolbar=L.distortableImage.popupBar(s,{actions:this.editActions}).addTo(i,t),t.fire("toolbar:created")}},_refresh:function(){this.toolbar&&this._removeToolbar(),this._addToolbar()},_updateToolbarPos:function(){var t=this._overlay,e=t.getCorners(),i=this.toolbar,o=-1/0;if(i&&i instanceof L.DistortableImage.PopupBar){for(var n=0;no&&(o=e[n].lat);var a=t.getCenter();a.lat=o,t.options.suppressToolbar||this.toolbar.setLatLng(a)}},hasMode:function(t){return!!this._modes[t]},getMode:function(){if(this.enabled())return this._mode},getModes:function(){return this._modes},isMode:function(t){return!!this.enabled()&&this._mode===t},setMode:function(t){var e=this._overlay,i=this.parentGroup;if(this.getMode()!==t&&this.hasMode(t)&&this.enabled())return this.toolbar&&this.toolbar.clickTool(t),this.isMode("lock")&&!this.dragging&&this._enableDragging(),this._mode=t,this.isMode("lock")&&this._disableDragging(),this._updateHandle(),this._refresh(),i&&i.isCollected(e)&&e.deselect(),this},nextMode:function(t){var e=this.getMode(),i=this.parentGroup,o=Object.keys(this.getModes()),n=o.indexOf(e),a=o[(n+1)%o.length];if(t){if(i&&i.anyCollected())return;L.DomEvent.stop(t)}return this.setMode(a)}}),L.distortableImage.edit=function(t,e){return new L.DistortableImage.Edit(t,e)}},426:function(){L.BorderAction=L.EditAction.extend({initialize:function(t,e,i){var o,n,a=e.editing,s=a._mode;a._outlined?(o="border_outer",n=e.options.translation.removeBorder):(o="border_clear",n=e.options.translation.addBorder),(i=i||{}).toolbarIcon={svg:!0,html:o,tooltip:n,className:"lock"===s?"disabled":""},L.DistortableImage.action_map.b="lock"===s?"":"_toggleBorder",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){var t=this._overlay.editing;L.IconUtil.toggleXlink(this._link,"border_clear","border_outer"),L.IconUtil.toggleTitle(this._link,"Remove Border","Add Border"),t._toggleBorder()}})},114:function(){L.DeleteAction=L.EditAction.extend({initialize:function(t,e,i){var o,n=e.editing;n instanceof L.DistortableImage.Edit?(o=e.options.translation.deleteImage,L.DistortableImage.action_map.Backspace="lock"===n._mode?"":"_removeOverlay"):(o=e.options.translation.deleteImages,L.DistortableImage.group_action_map.Backspace="lock"===n._mode?"":"_removeGroup"),(i=i||{}).toolbarIcon={svg:!0,html:"delete_forever",tooltip:o,className:"lock"===n._mode?"disabled":""},L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){var t=this._overlay.editing;t instanceof L.DistortableImage.Edit?t._removeOverlay():t._removeGroup()}})},231:function(){L.DistortAction=L.EditAction.extend({initialize:function(t,e,i){(i=i||{}).toolbarIcon={svg:!0,html:"distort",tooltip:e.options.translation.distortImage,className:"distort"},L.DistortableImage.action_map.d="_distortMode",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){this._overlay.editing._distortMode()}})},541:function(){L.DragAction=L.EditAction.extend({initialize:function(t,e,i){(i=i||{}).toolbarIcon={svg:!0,html:"drag",tooltip:e.options.translation.dragImage,className:"drag"},L.DistortableImage.action_map.D="_dragMode",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){this._overlay.editing._dragMode()}})},280:function(){L.DistortableImage=L.DistortableImage||{},L.distortableImage=L.DistortableImage,L.DistortableImage.action_map={},L.EditAction=L.Toolbar2.Action.extend({options:{toolbarIcon:{svg:!1,html:"",className:"",tooltip:""}},initialize:function(t,e,i){this._overlay=e,this._map=t,L.setOptions(this,i),L.Toolbar2.Action.prototype.initialize.call(this,i),this._injectIconSet()},_createIcon:function(t,e,i){var o=this,n=this.options.toolbarIcon,a=n.className,s=this._overlay.editing;this.toolbar=t,this._icon=L.DomUtil.create("li","",e),this._link=L.DomUtil.create("a","",this._icon),n.svg?this._link.innerHTML=L.IconUtil.create(n.html):this._link.innerHTML=n.html,this._link.setAttribute("href","#"),this._link.setAttribute("title",n.tooltip),this._link.setAttribute("role","button"),L.DomUtil.addClass(this._link,this.constructor.baseClass),a&&(L.DomUtil.addClass(this._link,a),"disabled"===a&&L.DomUtil.addClass(this._icon,a),a===s._mode?L.DomUtil.addClass(this._link,"selected-mode"):L.DomUtil.removeClass(this._link,"selected-mode")),L.DomEvent.on(this._link,"click",this.enable,this),L.DomEvent.on(this._overlay,"update",(function(){var t=o._link.innerHTML.match(/xlink:href="#restore"/);t&&1===t.length&&o._enableAction()})),this._addSubToolbar(t,this._icon,i)},_injectIconSet:function(){if(!document.querySelector("#iconset")){var t=document.createElement("div");t.id="iconset",t.setAttribute("hidden","hidden"),t.innerHTML=(new L.ToolbarIconSet).render(),document.querySelector(".leaflet-marker-pane").appendChild(t)}},_enableAction:function(){L.DomUtil.removeClass(this._link.parentElement,"disabled"),L.DomUtil.removeClass(this._link,"disabled")},_disableAction:function(){L.DomUtil.addClass(this._link.parentElement,"disabled"),L.DomUtil.addClass(this._link,"disabled")}}),L.editAction=function(t,e,i){return new L.EditAction(t,e,i)}},149:function(){L.ExportAction=L.EditAction.extend({initialize:function(t,e,i){var o,n=e.editing;this.isExporting=!1,this.mouseLeaveSkip=!0,this.isHooksExecuted=!1,n instanceof L.DistortableImage.Edit?(L.DistortableImage.action_map.e="_getExport",o=e.options.translation.exportImage):(L.DistortableImage.group_action_map.e="runExporter",o=e.options.translation.exportImages),(i=i||{}).toolbarIcon={svg:!0,html:"get_app",tooltip:o},L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){var t=this._overlay.editing;if(t instanceof L.DistortableImage.Edit)t._getExport();else if(!this.isHooksExecuted){this.isHooksExecuted=!0;var e=this._link.parentElement;this.mouseEnterHandler=this.handleMouseEnter.bind(this),this.mouseLeaveHandler=this.handleMouseLeave.bind(this),L.DomEvent.on(e,"click",(function(){if(this.isExporting){if(this.mouseLeaveSkip)return;this.resetState(),this.detachMouseEventListeners(e),t.cancelExport()}else this.isExporting=!0,this.renderExportIcon(),setTimeout(this.attachMouseEventListeners.bind(this,e),100),t.runExporter().then(function(){this.resetState(),this.detachMouseEventListeners(e)}.bind(this))}),this)}},resetState:function(){this.renderDownloadIcon(),this.isExporting=!1,this.mouseLeaveSkip=!0},attachMouseEventListeners:function(t){t.addEventListener("mouseenter",this.mouseEnterHandler),t.addEventListener("mouseleave",this.mouseLeaveHandler)},detachMouseEventListeners:function(t){t.removeEventListener("mouseenter",this.mouseEnterHandler),t.removeEventListener("mouseleave",this.mouseLeaveHandler)},handleMouseEnter:function(){this.renderCancelIcon()},handleMouseLeave:function(){this.mouseLeaveSkip?this.mouseLeaveSkip=!1:this.renderExportIcon()},renderDownloadIcon:function(){L.IconUtil.toggleXlink(this._link,"get_app","spinner"),L.IconUtil.toggleTitle(this._link,"Export Images","Loading..."),L.DomUtil.removeClass(this._link.firstChild,"loader")},renderExportIcon:function(){L.IconUtil.toggleXlink(this._link,"spinner"),L.IconUtil.toggleTitle(this._link,"Export Images","Loading..."),L.IconUtil.addClassToSvg(this._link,"loader")},renderCancelIcon:function(){L.IconUtil.toggleXlink(this._link,"cancel"),L.IconUtil.toggleTitle(this._link,"Cancel Export","Loading..."),L.DomUtil.removeClass(this._link.firstChild,"loader")}})},74:function(){L.FreeRotateAction=L.EditAction.extend({initialize:function(t,e,i){(i=i||{}).toolbarIcon={svg:!0,html:"crop_rotate",tooltip:e.options.translation.freeRotateImage,className:"freeRotate"},L.DistortableImage.action_map.f="_freeRotateMode",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){this._overlay.editing._freeRotateMode()}})},691:function(){L.GeolocateAction=L.EditAction.extend({initialize:function(t,e,i){var o=e.editing;(i=i||{}).toolbarIcon={svg:!0,html:"explore",tooltip:e.options.translation.geolocateImage,className:"lock"===o._mode?"disabled":""},L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){var t=this._overlay.getElement();EXIF.getData(t,L.EXIF(t))}})},105:function(){L.LockAction=L.EditAction.extend({initialize:function(t,e,i){var o,n,a=e.editing;a instanceof L.DistortableImage.Edit?(L.DistortableImage.action_map.u="_unlock",L.DistortableImage.action_map.l="_lock",n=e.options.translation.lockMode,o=a.isMode("lock")?"lock":"unlock"):(L.DistortableImage.group_action_map.l="_lockGroup",n=e.options.translation.lockImages,o="lock"),(i=i||{}).toolbarIcon={svg:!0,html:o,tooltip:n,className:"lock"},L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){var t=this._overlay.editing;t instanceof L.DistortableImage.Edit?t._toggleLockMode():t._lockGroup()}})},944:function(){L.OpacityAction=L.EditAction.extend({initialize:function(t,e,i){var o,n,a=e.editing,s=a._mode;a._transparent?(o="opacity_empty",n=e.options.translation.makeImageOpaque):(o="opacity",n=e.options.translation.makeImageTransparent),(i=i||{}).toolbarIcon={svg:!0,html:o,tooltip:n,className:"lock"===s?"disabled":""},L.DistortableImage.action_map.o="lock"===s?"":"_toggleOpacity",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){var t=this._overlay.editing,e=this._link;L.IconUtil.toggleXlink(e,"opacity","opacity_empty"),L.IconUtil.toggleTitle(e,"Make Image Transparent","Make Image Opaque"),t._toggleOpacity()}})},954:function(){L.RestoreAction=L.EditAction.extend({initialize:function(t,e,i){var o=L.Utils.getNestedVal(e,"editing","_mode"),n=e.edited;(i=i||{}).toolbarIcon={svg:!0,html:"restore",tooltip:e.options.translation.restoreImage,className:n&&"lock"!==o?"":"disabled"},L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){var t=this._overlay;L.DomEvent.on(t,{edit:this._enableAction,restore:this._disableAction},this),t.restore()}})},178:function(){L.RotateAction=L.EditAction.extend({initialize:function(t,e,i){(i=i||{}).toolbarIcon={svg:!0,html:"rotate",tooltip:e.options.translation.rotateImage,className:"rotate"},L.DistortableImage.action_map.r="_rotateMode",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){this._overlay.editing._rotateMode()}})},547:function(){L.ScaleAction=L.EditAction.extend({initialize:function(t,e,i){(i=i||{}).toolbarIcon={svg:!0,html:"scale",tooltip:e.options.translation.scaleImage,className:"scale"},L.DistortableImage.action_map.s="_scaleMode",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){this._overlay.editing._scaleMode()}})},886:function(){L.StackAction=L.EditAction.extend({initialize:function(t,e,i){var o,n,a=e.editing;a._toggledImage?(o="flip_to_back",n=e.options.translation.stackToFront):(o="flip_to_front",n=e.options.translation.stackToBack),(i=i||{}).toolbarIcon={svg:!0,html:o,tooltip:n,className:"lock"===a._mode?"disabled":""},L.DistortableImage.action_map.q="lock"===a._mode?"":"_stackUp",L.DistortableImage.action_map.a="lock"===a._mode?"":"_stackDown",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){var t=this._overlay.editing;L.IconUtil.toggleXlink(this._link,"flip_to_front","flip_to_back"),L.IconUtil.toggleTitle(this._link,"Stack to Front","Stack to Back"),t._toggleOrder()}})},129:function(){L.UnlockAction=L.EditAction.extend({initialize:function(t,e,i){(i=i||{}).toolbarIcon={svg:!0,html:"unlock",tooltip:e.options.translation.unlockImages},L.DistortableImage.group_action_map.u="_unlockGroup",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){this._overlay.editing._unlockGroup()}})},743:function(){L.EXIF=function(t){if(0!==Object.keys(EXIF.getAllTags(t)).length){console.log(EXIF.getAllTags(t));var e=EXIF.getAllTags(t);void 0!==e.GPSLatitude&&void 0!==e.GPSLongitude&&(e.GPSLatitude[0],e.GPSLatitude[1],e.GPSLatitude[2],e.GPSLongitude[0],e.GPSLongitude[1],e.GPSLongitude[2],e.GPSLatitudeRef,e.GPSLongitudeRef),"T"===e.GPSImgDirectionRef||"M"===e.GPSImgDirectionRef?(Math.PI,e.GPSImgDirection.numerator,e.GPSImgDirection.denominator):console.log("No compass data found"),console.log("Orientation:",e.Orientation),(6===e.Orientation||8===e.Orientation||3===e.Orientation)&&Math.PI,void 0!==e.GPSAltitude&&void 0!==e.GPSAltitudeRef&&void 0!==e.GPSAltitude&&void 0!==e.GPSAltitudeRef&&(e.GPSAltitude.numerator,e.GPSAltitude.denominator,e.GPSAltitudeRef)}else alert("EXIF initialized. Press again to view data in console.")}},92:function(){L.DistortHandle=L.EditHandle.extend({options:{TYPE:"distort",icon:L.icon({iconUrl:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAChSURBVO3BIU4DURgGwNkvL2B6AkQTLBqP4QCoSm7DDXoBLBZHDbfgICAIZjEV3YTn9uVHdMZZtcnCfI13bIzxg0emg6Nm6QVbYz3jylEsXRrvwommb49X67jFkz80fR9Mb1YxTzqiWBSLYlEsikWxKBbFolgUi2JRLIpFsSgWxaJY03fHHOu40dH07bAzWCx9Ge/TiWbpHgdsjPGNB2f/yS+7xRCyiiZPJQAAAABJRU5ErkJggg==",iconSize:[32,32],iconAnchor:[16,16]})},_onHandleDrag:function(){this._handled.setCorner(this._corner,this.getLatLng())},updateHandle:function(){this.setLatLng(this._handled.getCorner(this._corner))}}),L.distortHandle=function(t,e,i){return new L.DistortHandle(t,e,i)}},194:function(){L.DragHandle=L.EditHandle.extend({options:{TYPE:"drag",icon:L.icon({iconUrl:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAsVJREFUeNrMVztLXEEUvnNVFAVBAhY2aRKbTZEHJNpYabuNjSgYg/GxdsmPSJkUAa/ZdVEX8mgWYVutbHxAHkVskjQBuUUgBISVhCQk3wnfwMlk1rusN1wHPubOzJlzvjlz5sxc01Ma/hUEwQnwDIjqc7uvgv9YYO86qgIwCXQbdNTlQ8kcCBHgBch8TcloF6oJGr6phk6EQAkfdz3zvgDr9Mr7Fg1fptEZoM8jsmrokpfsiIFO4IIjuE2v1EDmR4LRdlR5Gh51hj8D34ABtm8YTtqna0TgklIw5CgQguKxIojEjmFROg/MKQO27NkFAB+4wAPouGUJiIvWKHwbAxX2XyWRKWkqhT+pbJntJZJuUzISW0+5hW+obxrVBsfvoH/dqCCJuU97GBh2VteLSiYvArmErT8EVoAK9Bw7enbpVYmvAQlyowYforrH5jXL2rPHI/TKONDB7u9AlavdaTBPvPmazUeQuy8f7UomUgTEwIJPEQ3sQGE/6ll2l9H/KcEzBcfWn2IclluM3DpddJxSHujlFkscbUPvmB0LHVnLrId7nlaZVkEc6QGXQI1MAwZcWmVRHeNaQwJMMiU2cwy4s7p/RJ2ckpvIQs+cIs+5GzitloLKHUV3MPREuXbTOKO91dX387gGTONxIgEWm+E61FFrpcyqXLHsEwiDjEsjAksqw5XPoL9MHVrn6QR4q+XZrDaR4RoWzq2ymafuRA/Mq1stSsHLVkcbdf9VjOcx8ZH3+SFWcCWlVPyWuUBOwUWdC1wP5NVjYiXFWLO69PZ6CRTUY6KSIoEKdf6T3IzzgHxnsyHctNBEkmn6Oob8ExUDg/ahGybd177cDjzH5xHwgDiSvoS7I/LZyvxJZj0wod7tkX5G0XVC7rEyLhfLJjBGbKoLLEfZWObyKeZ6oY82g+yf5Zn/mJyHX7PMf04z/T3/LcAAu4E6iiyJqf0AAAAASUVORK5CYII=",iconSize:[32,32],iconAnchor:[16,16]})},_onHandleDrag:function(){var t=this._handled,e=t.getCorner(this._corner),i=this.getLatLng();t.dragBy(e,i)},updateHandle:function(){this.setLatLng(this._handled.getCorner(this._corner))}}),L.dragHandle=function(t,e,i){return new L.DragHandle(t,e,i)}},988:function(){L.EditHandle=L.Marker.extend({initialize:function(t,e,i){var o=t.getCorner(e);L.setOptions(this,i),this._handled=t,this._corner=e;var n={draggable:!0,zIndexOffset:10};i&&i.hasOwnProperty("draggable")&&(n.draggable=i.draggable),L.Marker.prototype.initialize.call(this,o,n)},onAdd:function(t){L.Marker.prototype.onAdd.call(this,t),this._bindListeners(),this.updateHandle()},onRemove:function(t){this._unbindListeners(),L.Marker.prototype.onRemove.call(this,t)},_onHandleDragStart:function(){this._handled.fire("editstart")},_onHandleDragEnd:function(){this._fireEdit()},_fireEdit:function(){this._handled.edited=!0,this._handled.fire("edit")},_bindListeners:function(){this.on({contextmenu:L.DomEvent.stop,dragstart:this._onHandleDragStart,drag:this._onHandleDrag,dragend:this._onHandleDragEnd},this),this._handled._map.on("zoomend",this.updateHandle,this),this._handled.on("update",this.updateHandle,this)},_unbindListeners:function(){this.off({contextmenu:L.DomEvent.stop,dragstart:this._onHandleDragStart,drag:this._onHandleDrag,dragend:this._onHandleDragEnd},this),this._handled._map.off("zoomend",this.updateHandle,this),this._handled.off("update",this.updateHandle,this)},_calculateScalingFactor:function(t,e){var i=this._handled,o=i._map,n=o.latLngToLayerPoint(i.getCenter()),a=o.latLngToLayerPoint(t),s=o.latLngToLayerPoint(e),r=this._d2(n,a),l=this._d2(n,s);return Math.sqrt(l/r)},_d2:function(t,e){var i=t.x-e.x,o=t.y-e.y;return Math.pow(i,2)+Math.pow(o,2)},calculateAngleDelta:function(t,e){var i=this._handled,o=i._map,n=o.latLngToLayerPoint(i.getCenter()),a=o.latLngToLayerPoint(t),s=o.latLngToLayerPoint(e),r=Math.atan2(n.y-a.y,n.x-a.x);return Math.atan2(n.y-s.y,n.x-s.x)-r}})},206:function(){L.FreeRotateHandle=L.EditHandle.extend({options:{TYPE:"freeRotate",icon:L.icon({iconUrl:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAHiSURBVMXBa3HbShgA0PMp/1sCCo8oCEpgTaCXgIXAJiDzyCJoAUTm4UVQAns1Y8+snWnTvJyeE16hkjDgDrfoNTMKcpC9UPiLSo8JyetkjEHxjPCMyoS199kFoz8Iv1HpMaN3qWDCHoegOKkkRwnJpRmroHgiPFEZ8IBekzEGxQtUEhKSS/fB7Ew4U+lxcGkVZG9QWWPSFAxBcdK59KApuA+yNwp2uEdx1GN25sZJZULSfAtm77SlbNjju6MvG75u+WHRWVR6rDVjMPsgwYyVZl3pLTpHkyYHOx8syMiayaJzlDTZ9YyaZNFVkiYH2ZUEBcVJJXVImuz6Js3Qofe59pq7DoOTILu+g+a288mCouk7/1iH4qTS+2QdDppbV1ZJmrnDXnPnc5UOs2Z0fUmTuyBr+krvSioJyUmQO0dZM7mepMkWnaNRkyrJB6uskTSjxY3Fll8bvmJwlDb83FJ8gMqAB80uyBY3Trb82PAfvjj6vuHnluIdKgMeNXOwctK5NKBoHitrb1RJeHRp5Ux4ojLg0aWMHGQvUOkxIWkKVsHsTPiNSo8HDC5lZIsgO6n0uMUdRvQuFQxB8UR4RmXC2vvsgtEfhL+o9JiQvE7GGBTPCK9QSUjoMWgKDthjDrIX+h/k0I7gth6N5gAAAABJRU5ErkJggg==",iconSize:[32,32],iconAnchor:[16,16]})},_onHandleDrag:function(){var t=this._handled,e=t._map,i=t.getCorner(this._corner),o=this.getLatLng(),n=this.calculateAngleDelta(i,o),a=this._calculateScalingFactor(i,o);0!==n&&t.rotateBy(n,"rad");var s=t.edgeMinWidth;s||(s=50);var r=e.latLngToContainerPoint(t.getCorner(0)),l=e.latLngToContainerPoint(t.getCorner(1)),c=Math.abs(r.x-l.x),d=Math.abs(r.y-l.y);Math.sqrt(c*c+d*d)>s||a>1?t.scaleBy(a):t.scaleBy(1)},updateHandle:function(){this.setLatLng(this._handled.getCorner(this._corner))}}),L.freeRotateHandle=function(t,e,i){return new L.FreeRotateHandle(t,e,i)}},789:function(){L.LockHandle=L.EditHandle.extend({options:{TYPE:"lock",interactive:!1,icon:L.icon({iconUrl:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAD8SURBVO3BPU7CYAAA0AdfjIcQlRCQBG7C3gk2uIPG2RC3Dk16Gz0FTO1WZs/gwGCMP/2+xsSl7+n1er1Iz9LtRQjaPeMeO+TinLDCJV78YqjdA04YodKuxhUaPGoRxMmxwRQZSt87Yo4KExGCeAUyLLFB4bMacxywEClIU2KDKXbInTUYo8JCgoFuGoxQO5uiwY1EA91VmDqrcKeDoX8WdNNgjApvmGGLXKIgXY0xGkxQYItrrFFIEKQ5Yo4KEx9yrDFDhlKkIF6NOQ5Y+KpAhiXWKEQI4pxwiwoLPyuxwQw75FoE7fZYocFEuwI7jHCBV39gL92TXq/Xi/AOcmczZmaIMScAAAAASUVORK5CYII=",iconSize:[32,32],iconAnchor:[16,16]})},onRemove:function(t){this.unbindTooltip(),L.EditHandle.prototype.onRemove.call(this,t)},_bindListeners:function(){var t=this.getElement();L.EditHandle.prototype._bindListeners.call(this),L.DomEvent.on(t,{mousedown:this._tooltipOn,mouseup:this._tooltipOff},this),L.DomEvent.on(document,"pointerleave",this._tooltipOff,this)},_unbindListeners:function(){var t=this.getElement();L.EditHandle.prototype._bindListeners.call(this),L.DomEvent.off(t,{mousedown:this._tooltipOn,mouseup:this._tooltipOff},this),L.DomEvent.off(document,"pointerleave",this._tooltipOff,this)},_onHandleDrag:function(){},updateHandle:function(){this.setLatLng(this._handled.getCorner(this._corner))},_tooltipOn:function(t){var e=this._handled.parentGroup,i=e?e.editing:this._handled.editing;if(!t.shiftKey&&(this._handled.isSelected()||!e||e.isCollected(this._handled))){var o=i._lockHandles;this._timer=setTimeout(L.bind((function(){this._timeout&&clearTimeout(this._timeout),this.getTooltip()?o.eachLayer((function(t){this!==t&&t.closeTooltip()})):this.bindTooltip("Locked!",{permanent:!0}),this.openTooltip()}),this),500)}},_tooltipOff:function(t){var e=this._handled.parentGroup,i=e?e.editing:this._handled.editing;if(!t.shiftKey&&(this._handled.isSelected()||!e||e.isCollected(this._handled))){var o=i._lockHandles;t.currentTarget===document&&o.eachLayer((function(t){t.closeTooltip()})),this._timer&&clearTimeout(this._timer),this._timeout=setTimeout(L.bind((function(){this.closeTooltip()}),this),400)}}}),L.lockHandle=function(t,e,i){return new L.LockHandle(t,e,i)}},337:function(){L.RotateHandle=L.EditHandle.extend({options:{TYPE:"rotate",icon:L.icon({iconUrl:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAHiSURBVMXBa3HbShgA0PMp/1sCCo8oCEpgTaCXgIXAJiDzyCJoAUTm4UVQAns1Y8+snWnTvJyeE16hkjDgDrfoNTMKcpC9UPiLSo8JyetkjEHxjPCMyoS199kFoz8Iv1HpMaN3qWDCHoegOKkkRwnJpRmroHgiPFEZ8IBekzEGxQtUEhKSS/fB7Ew4U+lxcGkVZG9QWWPSFAxBcdK59KApuA+yNwp2uEdx1GN25sZJZULSfAtm77SlbNjju6MvG75u+WHRWVR6rDVjMPsgwYyVZl3pLTpHkyYHOx8syMiayaJzlDTZ9YyaZNFVkiYH2ZUEBcVJJXVImuz6Js3Qofe59pq7DoOTILu+g+a288mCouk7/1iH4qTS+2QdDppbV1ZJmrnDXnPnc5UOs2Z0fUmTuyBr+krvSioJyUmQO0dZM7mepMkWnaNRkyrJB6uskTSjxY3Fll8bvmJwlDb83FJ8gMqAB80uyBY3Trb82PAfvjj6vuHnluIdKgMeNXOwctK5NKBoHitrb1RJeHRp5Ux4ojLg0aWMHGQvUOkxIWkKVsHsTPiNSo8HDC5lZIsgO6n0uMUdRvQuFQxB8UR4RmXC2vvsgtEfhL+o9JiQvE7GGBTPCK9QSUjoMWgKDthjDrIX+h/k0I7gth6N5gAAAABJRU5ErkJggg==",iconSize:[32,32],iconAnchor:[16,16]})},_onHandleDrag:function(){var t=this._handled,e=t.getCorner(this._corner),i=this.getLatLng(),o=this.calculateAngleDelta(e,i);t.rotateBy(o,"rad")},updateHandle:function(){this.setLatLng(this._handled.getCorner(this._corner))}}),L.rotateHandle=function(t,e,i){return new L.RotateHandle(t,e,i)}},350:function(){L.ScaleHandle=L.EditHandle.extend({options:{TYPE:"scale",icon:L.icon({iconUrl:"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2ZXJzaW9uPSIxLjEiIHdpZHRoPSI0NTkiIGhlaWdodD0iNDY0IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCA1MTIgNTEyIiB4bWw6c3BhY2U9InByZXNlcnZlIiBzdHlsZT0iIj48cmVjdCBpZD0iYmFja2dyb3VuZHJlY3QiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIHg9IjAiIHk9IjAiIGZpbGw9Im5vbmUiIHN0cm9rZT0ibm9uZSIgY2xhc3M9IiIgc3R5bGU9IiIvPjxnIGNsYXNzPSJjdXJyZW50TGF5ZXIiIHN0eWxlPSIiPjx0aXRsZT5MYXllciAxPC90aXRsZT48cGF0aCBkPSJNNDU5LjA0OTE1OTUzMDQ3MTM0LDg2LjkyNjIzNDUxMjU1MDAyIFYwIGgtODUuNzE0NTczMzU2MzEyMDkgdjI3LjA0MzcxNzQwMzkwNDQ1MiBIODUuNzE0NTczMzU2MzEyMDMgVjAgSDAgdjg2LjkyNjIzNDUxMjU1MDAyIGgyNS43MTQzNzIwMDY4OTM2MjYgdjI4OS43NTQxMTUwNDE4MzM0IEgwIHY4Ni45MjYyMzQ1MTI1NTAwMiBoODUuNzE0NTczMzU2MzEyMDkgdi0yNy4wNDM3MTc0MDM5MDQ0NTIgaDI4NS43MTUyNDQ1MjEwNDAzIHYyNy4wNDM3MTc0MDM5MDQ0NTIgaDg1LjcxNDU3MzM1NjMxMjA5IHYtODYuOTI2MjM0NTEyNTUwMDIgaC0yMy44MDk2MDM3MTAwODY2OSBWODYuOTI2MjM0NTEyNTUwMDIgSDQ1OS4wNDkxNTk1MzA0NzEzNCB6TTM4NC43NjMxOTU5NTUwMDA5LDEyLjU1NjAxMTY1MTgxMjc4MSBoNjEuOTA0OTY5NjQ2MjI1Mzk2IHY2Mi43ODAwNTgyNTkwNjM5MSBoLTYxLjkwNDk2OTY0NjIyNTM5NiBWMTIuNTU2MDExNjUxODEyNzgxIHpNMTIuMzgwOTkzOTI5MjQ1MDUsMTIuNTU2MDExNjUxODEyNzgxIGg2MS45MDQ5Njk2NDYyMjUzOTYgdjYyLjc4MDA1ODI1OTA2MzkxIEgxMi4zODA5OTM5MjkyNDUwNSBWMTIuNTU2MDExNjUxODEyNzgxIHpNNzQuMjg1OTYzNTc1NDcwNTMsNDUxLjA1MDU3MjQxNTEyMDY2IEgxMi4zODA5OTM5MjkyNDUwNSB2LTYyLjc4MDA1ODI1OTA2MzkxIGg2MS45MDQ5Njk2NDYyMjUzOTYgVjQ1MS4wNTA1NzI0MTUxMjA2NiB6TTQ0NS43MTU3ODE0NTI4MjI3NCw0NTEuMDUwNTcyNDE1MTIwNjYgaC02Mi44NTczNTM3OTQ2Mjg4NjQgdi02Mi43ODAwNTgyNTkwNjM5MSBoNjIuODU3MzUzNzk0NjI4ODY0IFY0NTEuMDUwNTcyNDE1MTIwNjYgek00MDcuNjIwNDE1NTE2Njg0MjYsMzc2LjY4MDM0OTU1NDM4MzQ0IGgtMzYuMTkwNTk3NjM5MzMxNzcgdjMyLjgzODc5OTcwNDc0MTEyIEg4NS43MTQ1NzMzNTYzMTIwMyB2LTMyLjgzODc5OTcwNDc0MTEyIEg0OS41MjM5NzU3MTY5ODAzMiBWODYuOTI2MjM0NTEyNTUwMDIgaDM2LjE5MDU5NzYzOTMzMTc3IFY1MC4yMjQwNDY2MDcyNTExMjUgaDI4Ny42MjAwMTI4MTc4NDcyIHYzNi43MDIxODc5MDUyOTg5IGgzNC4yODU4MjkzNDI1MjQ4MzUgVjM3Ni42ODAzNDk1NTQzODM0NCB6IiBpZD0ic3ZnXzIiIGNsYXNzPSIiIGZpbGw9IiMxYTFhZWIiIGZpbGwtb3BhY2l0eT0iMSIvPjwvZz48L3N2Zz4=",iconSize:[32,32],iconAnchor:[16,16]})},_onHandleDrag:function(){var t=this._handled,e=t._map,i=t.edgeMinWidth,o=t.getCorner(this._corner),n=this.getLatLng(),a=this._calculateScalingFactor(o,n);i||(i=50);var s=e.latLngToLayerPoint(t.getCorner(0)),r=e.latLngToLayerPoint(t.getCorner(1)),l=Math.abs(s.x-r.x),c=Math.abs(s.y-r.y);Math.sqrt(l*l+c*c)>i||a>1?t.scaleBy(a):t.scaleBy(1)},updateHandle:function(){this.setLatLng(this._handled.getCorner(this._corner))}}),L.scaleHandle=function(t,e,i){return new L.ScaleHandle(t,e,i)}},719:function(){L.distortableImage=L.DistortableImage||{},L.distortableImage=L.DistortableImage,L.DistortableImage.group_action_map={},L.DistortableImage.ControlBar=L.Toolbar2.Control.extend({}),L.distortableImage.controlBar=function(t){return new L.DistortableImage.ControlBar(t)},L.DistortableCollection.addInitHook((function(){this.ACTIONS=[L.ExportAction,L.DeleteAction,L.LockAction,L.UnlockAction],L.DistortableCollection.Edit.MODES={lock:L.LockAction,unlock:L.UnlockAction};var t=this.options.actions?this.options.actions:this.ACTIONS;this.editing=L.distortableCollection.edit(this,{actions:t})}))},93:function(){L.DistortableImage=L.DistortableImage||{},L.distortableImage=L.DistortableImage,L.DistortableImage.action_map={},L.DistortableImage.PopupBar=L.Toolbar2.Popup.extend({options:{anchor:[0,-10]},initialize:function(t,e){L.setOptions(this,e),L.Toolbar2.Popup.prototype.initialize.call(this,t,e)},addHooks:function(t,e){this.map=t,this.ov=e},tools:function(){if(this._ul)return this._ul.children},clickTool:function(t){for(var e=this.tools(),i=0;i',_symbols:"",render:function(){return this.addSymbols(this._symbols),this._svg},addSymbols:function(t){this._svg+=t}})},261:function(){L.KeymapperIconSet=L.IconSet.extend({_symbols:''})},929:function(){L.ToolbarIconSet=L.IconSet.extend({_symbols:''})},496:function(){L.Map.mergeOptions({boxCollector:!0,boxZoom:!1}),L.Map.BoxCollector=L.Map.BoxZoom.extend({initialize:function(t){this._map=t,this._container=t._container,this._pane=t._panes.overlayPane,this._resetStateTimeout=0,t.on("unload",this._destroy,this)},addHooks:function(){L.DomEvent.on(this._container,"mousedown",this._onMouseDown,this)},removeHooks:function(){L.DomEvent.off(this._container,"mousedown",this._onMouseDown,this)},moved:function(){return this._moved},_destroy:function(){L.DomUtil.remove(this._pane),delete this._pane},_resetState:function(){this._resetStateTimeout=0,this._moved=!1},_clearDeferredResetState:function(){0!==this._resetStateTimeout&&(clearTimeout(this._resetStateTimeout),this._resetStateTimeout=0)},_onMouseDown:function(t){if(!t.shiftKey||1!==t.which&&1!==t.button)return!1;this._clearDeferredResetState(),this._resetState(),L.DomUtil.disableTextSelection(),L.DomUtil.disableImageDrag(),this._startPoint=this._map.mouseEventToContainerPoint(t),L.DomEvent.on(document,{contextmenu:L.DomEvent.stop,mousemove:this._onMouseMove,mouseup:this._onMouseUp},this)},_onMouseMove:function(t){this._moved||(this._moved=!0,this._box=L.DomUtil.create("div","leaflet-zoom-box",this._container),L.DomUtil.addClass(this._container,"leaflet-crosshair"),this._map.fire("boxzoomstart")),this._point=this._map.mouseEventToContainerPoint(t),this._bounds=L.bounds(this._startPoint,this._point);var e=this._bounds.getSize();L.DomUtil.setPosition(this._box,this._bounds.min),this._box.style.width=e.x+"px",this._box.style.height=e.y+"px"},_finish:function(){this._moved&&(L.DomUtil.remove(this._box),L.DomUtil.removeClass(this._container,"leaflet-crosshair")),L.DomUtil.enableTextSelection(),L.DomUtil.enableImageDrag(),L.DomEvent.off(document,{contextmenu:L.DomEvent.stop,mousemove:this._onMouseMove,mouseup:this._onMouseUp},this)},_onMouseUp:function(t){if((1===t.which||1===t.button)&&(this._finish(),this._moved)){this._clearDeferredResetState(),this._resetStateTimeout=setTimeout(L.Util.bind(this._resetState,this),0);var e=L.latLngBounds(this._map.containerPointToLatLng(this._bounds.getBottomLeft()),this._map.containerPointToLatLng(this._bounds.getTopRight())),i=this._map.getZoom(),o=this._map.getCenter();e=this._map._latLngBoundsToNewLayerBounds(e,i,o),this._map.fire("boxcollectend",{boxCollectBounds:e})}}}),L.Map.addInitHook("addHandler","boxCollector",L.Map.BoxCollector)},291:function(){L.Map.mergeOptions({doubleClickLabels:!0}),L.Map.DoubleClickLabels=L.Map.DoubleClickZoom.extend({enable:function(){var t=this._map;return this._enabled||(t.doubleClickZoom.enabled()&&t.doubleClickZoom.disable(),this._map.fire("singleclickon"),this._enabled=!0,this.addHooks()),this},disable:function(){return this._enabled?(this._enabled=!1,this.removeHooks(),this):this},_fireIfSingle:function(t){var e=this._map,i=t.originalEvent;i&&i.shiftKey||(e._clicked+=1,this._map._clickTimeout=setTimeout((function(){1===e._clicked?(e._clicked=0,e.fire("singleclick",{type:"singleclick"})):L.Browser.touch&&i&&i.sourceCapabilities.firesTouchEvents&&e.fire("dblclick")}),250))},_onDoubleClick:function(){var t=this._map,e=t._labels;setTimeout((function(){t._clicked=0,clearTimeout(t._clickTimeout)}),0),e&&(1===e.options.opacity?(e.options.opacity=0,e.setOpacity(0)):(e.options.opacity=1,e.setOpacity(1)))}}),L.Map.addInitHook("addHandler","doubleClickLabels",L.Map.DoubleClickLabels)},752:function(){L.Map.DoubleClickZoom.include({addHooks:function(){this._map.on({click:this._fireIfSingle,dblclick:this._onDoubleClick},this)},removeHooks:function(){this._map.off({click:this._fireIfSingle,dblclick:this._onDoubleClick},this)},enable:function(){return this._enabled||this._map.doubleClickLabels&&this._map.doubleClickLabels.enabled()||(this._map.fire("singleclickon"),this._enabled=!0,this.addHooks()),this},disable:function(){return this._enabled?(this._map.fire("singleclickoff"),this._enabled=!1,this.removeHooks(),this):this},_fireIfSingle:function(t){var e=this._map,i=t.originalEvent;i&&i.shiftKey||(e._clicked+=1,this._map._clickTimeout=setTimeout((function(){1===e._clicked?(e._clicked=0,e.fire("singleclick",{type:"singleclick"})):L.Browser.touch&&i&&i.sourceCapabilities.firesTouchEvents&&e._fireDOMEvent(i,"dblclick",[e])}),250))},_onDoubleClick:function(t){var e=this._map,i=t.originalEvent;if(setTimeout((function(){e._clicked=0,clearTimeout(e._clickTimeout)}),0),!i)return!1;var o=e.getZoom(),n=e.options.zoomDelta,a=i.shiftKey?o-n:o+n;"center"===e.options.doubleClickZoom?e.setZoom(a):e.setZoomAround(t.containerPoint,a)}})},131:function(){L.Map.include({_clicked:0,addGoogleMutant:function(t){return(t=this.mutantOptions=L.extend({mutantOpacity:.8,maxZoom:24,maxNativeZoom:20,minZoom:0,labels:!0,labelOpacity:1,doubleClickLabels:!0},t)).labels||(this.mutantOptions=L.extend(this.mutantOptions,{labelOpacity:t.labels?1:void 0,doubleClickLabels:!!t.labels||void 0})),this._googleMutant=L.tileLayer("http://mt0.google.com/vt/lyrs=s&x={x}&y={y}&z={z}",{maxZoom:t.maxZoom,maxNativeZoom:t.maxNativeZoom,minZoom:t.minZoom,opacity:t.mutantOpacity}).addTo(this),t.labels?this._addLabels(t):this.doubleClickLabels=void 0,this},_addLabels:function(t){return 0!==t.labelOpacity&&1!==t.labelOpacity&&(t.labelOpacity=1),this._labels=L.tileLayer("https://stamen-tiles-{s}.a.ssl.fastly.net/toner-labels/{z}/{x}/{y}{r}.{ext}",{attribution:'Map tiles by Stamen Design, CC BY 3.0 — Map data © OpenStreetMap contributors',subdomains:"abcd",interactive:!1,opacity:t.labelOpacity,maxZoom:t.maxZoom,maxNativeZoom:t.maxNativeZoom,minZoom:t.minZoom,ext:"png"}).addTo(this),this.mutantOptions.doubleClickLabels&&this.doubleClickLabels.enable(),this}}),L.Map.addInitHook((function(){this.doubleClickLabels.disable(),this.doubleClickZoom.enable()}))},999:function(){L.DomUtil=L.extend(L.DomUtil,{initTranslation:function(t){this.translation=t},getMatrixString:function(t){var e=L.Browser.webkit3d||L.Browser.gecko3d||L.Browser.ie3d,i=[t[0],t[3],0,t[6],t[1],t[4],0,t[7],0,0,1,0,t[2],t[5],0,t[8]],o=e?"matrix3d("+i.join(",")+")":"";return e||console.log("Your browser must support 3D CSS transformsin order to use DistortableImageOverlay."),o},toggleClass:function(t,e){var i=e;return this.hasClass(t,i)?this.removeClass(t,i):this.addClass(t,i)},confirmDelete:function(){return window.confirm(this.translation.confirmImageDelete)},confirmDeletes:function(t){if(1===t)return this.confirmDelete();var e,i=this.translation.confirmImagesDeletes;return e="function"==typeof i?i(t):i,window.confirm(e)}})},85:function(){L.IconUtil={create:function(t){return/^#/.test(t)&&(t=t.replace(/^#/,"")),''},addClassToSvg:function(t,e){var i=t.querySelector("svg");i&&L.DomUtil.addClass(i,e)},toggleXlink:function(t,e,i){/^#/.test(e)||(e="#"+e),/^#/.test(i)||(i="#"+i);var o=t.querySelector("use");if(o){var n=o.getAttribute("xlink:href")===e?i:e;return o.setAttribute("xlink:href",n),n}return!1},toggleTitle:function(t,e,i){var o=t.getAttribute("title")===e?i:e;return t.setAttribute("title",o),t.hasAttribute("aria-label")&&t.setAttribute("aria-label",o),o}}},351:function(){L.ImageUtil={getCmPerPixel:function(t){var e=t._map;return 100*e.latLngToLayerPoint(t.getCorner(0)).distanceTo(e.latLngToLayerPoint(t.getCorner(1)))/t.getElement().width}}},360:function(){L.MatrixUtil={adj:function(t){return[t[4]*t[8]-t[5]*t[7],t[2]*t[7]-t[1]*t[8],t[1]*t[5]-t[2]*t[4],t[5]*t[6]-t[3]*t[8],t[0]*t[8]-t[2]*t[6],t[2]*t[3]-t[0]*t[5],t[3]*t[7]-t[4]*t[6],t[1]*t[6]-t[0]*t[7],t[0]*t[4]-t[1]*t[3]]},multmm:function(t,e){var i,o=[];for(i=0;i<3;i++)for(var n=0;n<3;n++){for(var a=0,s=0;s<3;s++)a+=t[3*i+s]*e[3*s+n];o[3*i+n]=a}return o},multmv:function(t,e){return[t[0]*e[0]+t[1]*e[1]+t[2]*e[2],t[3]*e[0]+t[4]*e[1]+t[5]*e[2],t[6]*e[0]+t[7]*e[1]+t[8]*e[2]]},multsm:function(t,e){for(var i=[],o=0,n=e.length;o2&&void 0!==arguments[2]?arguments[2]:"deg";return"deg"===i?this.radiansToDegrees(Math.atan2(e,t)):Math.atan2(e,t)},radiansToDegrees:function(t){return 180*t/Math.PI},degreesToRadians:function(t){return t*Math.PI/180}}},866:function(){L.Utils={initTranslation:function(){var t={deleteImage:"Delete Image",deleteImages:"Delete Images",distortImage:"Distort Image",dragImage:"Drag Image",exportImage:"Export Image",exportImages:"Export Images",removeBorder:"Remove Border",addBorder:"Add Border",freeRotateImage:"Free rotate Image",geolocateImage:"Geolocate Image",lockMode:"Lock Mode",lockImages:"Lock Images",makeImageOpaque:"Make Image Opaque",makeImageTransparent:"Make Image Transparent",restoreImage:"Restore Natural Image",rotateImage:"Rotate Image",scaleImage:"Scale Image",stackToFront:"Stack to Front",stackToBack:"Stack to Back",unlockImages:"Unlock Images",confirmImageDelete:"Are you sure? This image will be permanently deleted from the map.",confirmImagesDeletes:"Are you sure? These images will be permanently deleted from the map."};if(this.options.translation)for(var e in t)this.options.translation.hasOwnProperty(e)||(this.options.translation[e]=t[e]);else this.options.translation=t;L.DomUtil.initTranslation(this.options.translation)},getNestedVal:function(t,e,i){return[e,i].reduce((function(t,e){return t&&t[e]}),t)}}}};t[999](),t[85](),t[351](),t[360](),t[682](),t[866](),t[477](),t[808](),t[743](),t[988](),t[92](),t[194](),t[206](),t[789](),t[337](),t[350](),t[376](),t[261](),t[929](),t[280](),t[426](),t[114](),t[231](),t[541](),t[149](),t[74](),t[691](),t[105](),t[944](),t[954](),t[178](),t[547](),t[886](),t[129](),t[93](),t[719](),t[397](),t[428](),t[782](),t[752](),t[496](),t[291](),t[131]()}(); //# sourceMappingURL=leaflet.distortableimage.js.map \ No newline at end of file diff --git a/examples/js/archive.js b/examples/js/archive.js index c20afbad0..43b6d25ad 100644 --- a/examples/js/archive.js +++ b/examples/js/archive.js @@ -21,9 +21,7 @@ const setupMap = () => { }; const setupCollection = () => { - map.imgGroup = L.distortableCollection( - {tooltipControl: switchTooltipBtn} // Remove there will be no need to pass this object "distortableCollection" anymore - ).addTo(map); + map.imgGroup = L.distortableCollection().addTo(map); }; setupMap(); @@ -130,10 +128,6 @@ function showImages(getUrl) { axios.get(url) .then((response) => { if (response.data.files && response.data.files.length != 0) { - response.data.files.forEach((file) => { - renderImages(file, url); - }); - const imageThumbnails = response.data.files.filter(file => file.source === 'derivative'); const fullResImages = response.data.files.filter(file => file.format === 'PNG' || file.format === 'JPEG'); count = response.data.files.filter((file)=> { diff --git a/src/DistortableCollection.js b/src/DistortableCollection.js index 201fbeece..bce3b9116 100644 --- a/src/DistortableCollection.js +++ b/src/DistortableCollection.js @@ -2,7 +2,6 @@ const arr = []; L.DistortableCollection = L.FeatureGroup.extend({ options: { editable: true, - tooltipControl: document.createElement('button'), // ************************transfer to archive.js file exportOpts: { exportStartUrl: '//export.mapknitter.org/export', statusUrl: '//export.mapknitter.org', @@ -16,7 +15,6 @@ L.DistortableCollection = L.FeatureGroup.extend({ L.Utils.initTranslation.call(this); this.editable = this.options.editable; - this.tooltipControl = this.options.tooltipControl; }, onAdd(map) { @@ -32,46 +30,12 @@ L.DistortableCollection = L.FeatureGroup.extend({ */ this.on('layeradd', this._addEvents, this); this.on('layerremove', this._removeEvents, this); - L.DomEvent.on(this.tooltipControl, 'click', this._updateTooltipBtn, this); // ************************transfer to archive.js file - }, - - _updateTooltipBtn(e) { // ************************transfer to archive.js file - if (e.target.textContent === 'Open Tooltip') { - e.target.textContent = 'Close Tooltip'; - this.eachLayer((layer) => { - L.DomEvent.on(layer.getElement(), 'mousemove', layer.activateTooltip, layer); - L.DomEvent.on(layer.getElement(), 'mouseout', layer.closeToolTip, layer); - e.target.textContent = 'Close Tooltip'; - }); - - return; - } - - if (e.target.textContent === 'Close Tooltip') { - e.target.textContent = 'Open Tooltip'; - this.eachLayer((layer) => { - L.DomEvent.off(layer.getElement(), 'mouseout'); - L.DomEvent.off(layer.getElement(), 'mousemove'); - }); - - return; - } }, onRemove() { if (this.editing) { this.editing.disable(); } this.off('layeradd', this._addEvents, this); this.off('layerremove', this._removeEvents, this); - - if (e.target.textContent === 'Close Tooltip') { // ************************transfer to archive.js file - e.target.textContent = 'Open Tooltip'; - this.eachLayer((layer) => { - L.DomEvent.off(layer.getElement(), 'mouseout'); - L.DomEvent.off(layer.getElement(), 'mousemove'); - }); - - return; - } }, _addEvents(e) { diff --git a/src/DistortableImageOverlay.js b/src/DistortableImageOverlay.js index ecc4c627e..ed46ee1f8 100644 --- a/src/DistortableImageOverlay.js +++ b/src/DistortableImageOverlay.js @@ -9,7 +9,7 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ mode: 'distort', selected: false, interactive: true, - tooltipText: 'Unknown image', // default tooltipText + tooltipText: 'Unknown image', tooltipOpen: false, }, @@ -237,66 +237,15 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ } }, - // SEGUN ------------------------------------------------------------------------------------------------------------------------------- - // Work in progress on this function _activateTooltip(ev) { - let index = 0; - const xAxis = []; // stores previous values of x coordinate - const yAxis = []; // stores previous values of y coordinate, may be needed later - // let newPosX = 0; - - if (!this._selected) { // Consider using "if (!this.selected)" instead - // console.log('mouseOVER_DONE/mouseMOVE_DONE-TOOLTIP-ACTIVATED'); // To be deleted - // console.log('x-axis:', ev.x); // To be deleted - // console.log('y-axis:', ev.y); // To be deleted - - xAxis[index] = ev.x; - yAxis[index] = ev.y; // May be needed later - - // newPosX = xAxis[index-1] - xAxis[index]; // - works but not perfect - // newPosX = (xAxis[index-1] - xAxis[index]) - ((xAxis[index])/4); // - better than above but not perfect - // newPosX =(xAxis[index-1] - xAxis[index]) - (xAxis[index] - this.imageWidth); // - works but no perfect - ++index; - - this.bindTooltip( - this.tooltipText, - {sticky: true, direction: 'top', offset: L.point([ev.x - 700, ev.y - 500])}).openTooltip(); // POC only, work still in progress on this - hardcoded, works not perfect yet - } + this.bindTooltip(this.tooltipText, {direction: 'top'}).openTooltip(); }, - // SEGUN ------------------------------------------------------------------------------------------------------------------------------- - // Work in progress on this function - // _activateTooltip(ev) { - // let index = 0; - // const xAxis = []; // stores previous values of x coordinate - // const yAxis = []; // stores previous values of y coordinate, may be needed later - // // let newPosX = 0; - - // if (!this._selected) { // Consider using "if (!this.selected)" instead - // // console.log('mouseOVER_DONE/mouseMOVE_DONE-TOOLTIP-ACTIVATED'); // To be deleted - // // console.log('x-axis:', ev.x); // To be deleted - // // console.log('y-axis:', ev.y); // To be deleted - - // xAxis[index] = ev.x; - // yAxis[index] = ev.y; // May be needed later - - // // newPosX = xAxis[index-1] - xAxis[index]; // - works but not perfect - // // newPosX = (xAxis[index-1] - xAxis[index]) - ((xAxis[index])/4); // - better than above but not perfect - // // newPosX =(xAxis[index-1] - xAxis[index]) - (xAxis[index] - this.imageWidth); // - works but no perfect - // ++index; - - // this.bindTooltip( - // this.tooltipText, - // {sticky: true, direction: 'top', offset: L.point([ev.x - 700, ev.y - 500])}).openTooltip(); // POC only, work still in progress on this - hardcoded, works not perfect yet - // } - // }, _closeTooltip() { - // console.log('mouseOUT_DONE-TOOLTIP-CLOSED'); // To be deleted this.closeTooltip(); }, _deactivateTooltip() { - // console.log('MouseoverENDED & mousemoveENDED-TOOLTIP-DEACTIVATED'); - To be deleted this.unbindTooltip(); }, From a91b0e2af952d50c45a6e7f0f50de318280cc82a Mon Sep 17 00:00:00 2001 From: segun Date: Tue, 17 Jan 2023 00:15:42 +0100 Subject: [PATCH 49/57] update --- dist/leaflet.distortableimage.js | 54 ++++++-------------------------- src/DistortableCollection.js | 36 --------------------- src/DistortableImageOverlay.js | 9 +++--- 3 files changed, 14 insertions(+), 85 deletions(-) diff --git a/dist/leaflet.distortableimage.js b/dist/leaflet.distortableimage.js index 08a66d47b..65ad221ea 100644 --- a/dist/leaflet.distortableimage.js +++ b/dist/leaflet.distortableimage.js @@ -1,6 +1,3 @@ -<<<<<<< HEAD -!function(){var t={808:function(){var t=[];L.DistortableCollection=L.FeatureGroup.extend({options:{editable:!0,exportOpts:{exportStartUrl:"//export.mapknitter.org/export",statusUrl:"//export.mapknitter.org",exportUrl:"http://export.mapknitter.org/"}},initialize:function(t){L.setOptions(this,t),L.FeatureGroup.prototype.initialize.call(this,t),L.Utils.initTranslation.call(this),this.editable=this.options.editable},onAdd:function(t){L.FeatureGroup.prototype.onAdd.call(this,t),this._map=t,this.editable&&this.editing.enable(),this.on("layeradd",this._addEvents,this),this.on("layerremove",this._removeEvents,this)},onRemove:function(){this.editing&&this.editing.disable(),this.off("layeradd",this._addEvents,this),this.off("layerremove",this._removeEvents,this)},_addEvents:function(t){var e=t.layer;L.DomEvent.on(e,{dragstart:this._dragStartMultiple,drag:this._dragMultiple},this),L.DomEvent.on(e.getElement(),{mousedown:this._deselectOthers,contextmenu:this._longPressMultiSelect},this)},_removeEvents:function(t){var e=t.layer;L.DomEvent.off(e,{dragstart:this._dragStartMultiple,drag:this._dragMultiple},this),L.DomEvent.off(e.getElement(),{mousedown:this._deselectOthers,contextmenu:this._longPressMultiSelect},this)},_longPressMultiSelect:function(t){var e=this;this.editable&&(t.preventDefault(),this.eachLayer((function(i){var o=i.editing;i.getElement()===t.target&&o.enabled()&&(L.DomUtil.toggleClass(i.getElement(),"collected"),e.anyCollected()?(i.deselect(),e.editing._addToolbar()):e.editing._removeToolbar())})))},isCollected:function(t){return L.DomUtil.hasClass(t.getElement(),"collected")},anyCollected:function(){return this.getLayers().some(this.isCollected.bind(this))},_toggleCollected:function(e,i){e.shiftKey&&i.editing.enabled()&&(L.DomUtil.toggleClass(e.target,"collected"),t.every((function(t){return t._leaflet_id!==i._leaflet_id}))?t.push(i):t.splice(t.indexOf(i),1)),this.anyCollected()?i.deselect():this.editing._removeToolbar()},_deselectOthers:function(t){var e=this;this.editable&&(this.eachLayer((function(i){i.getElement()!==t.target?i.deselect():e._toggleCollected(t,i)})),t&&L.DomEvent.stopPropagation(t))},_dragStartMultiple:function(t){var e,i=t.target,o=this._map;this.isCollected(i)&&this.eachLayer((function(t){for(t._dragStartPoints={},t.deselect(),e=0;e<4;e++){var i=t.getCorner(e);t._dragStartPoints[e]=o.latLngToLayerPoint(i)}}))},_dragMultiple:function(t){var e=t.target,i=this._map;if(this.isCollected(e)){var o=i.latLngToLayerPoint(e.getCorner(0)),n=e._dragStartPoints[0].subtract(o);this._updateCollectionFromPoints(n,e)}},_toRemove:function(){var t=this;return this.getLayers().filter((function(e){var i=e.editing._mode;return t.isCollected(e)&&"lock"!==i}))},_toMove:function(t){var e=this;return this.getLayers().filter((function(i){var o=i.editing._mode;return i!==t&&e.isCollected(i)&&"lock"!==o}))},_updateCollectionFromPoints:function(t,e){var i,o=this._toMove(e),n=new L.Transformation(1,-t.x,1,-t.y);o.forEach((function(t){var e={};for(i=0;i<4;i++)e[i]=n.transform(t._dragStartPoints[i]);t.setCornersFromPoints(e)}))},_getAvgCmPerPixel:function(t){return t.reduce((function(t,e){return t+e.cm_per_pixel}),0)/t.length},generateExportJson:function(){var t={images:[]};return this.eachLayer((function(e){if(this.isCollected(e)){var i=e._image.src.split("/"),o=i[i.length-1],n=e.getCorners(),a=[{lat:n[0].lat,lon:n[0].lng},{lat:n[1].lat,lon:n[1].lng},{lat:n[3].lat,lon:n[3].lng},{lat:n[2].lat,lon:n[2].lng}];t.images.push({id:e._leaflet_id,src:e._image.src,width:e._image.width,height:e._image.height,image_file_name:o,nodes:a,cm_per_pixel:L.ImageUtil.getCmPerPixel(e)})}}),this),t.images=t.images.reverse(),t.avg_cm_per_pixel=this._getAvgCmPerPixel(t.images),t}}),L.distortableCollection=function(t,e){return new L.DistortableCollection(t,e)}},477:function(){L.DistortableImageOverlay=L.ImageOverlay.extend({options:{height:200,crossOrigin:!0,edgeMinWidth:50,editable:!0,mode:"distort",selected:!1,interactive:!0,tooltipText:"Unknown image",tooltipOpen:!1},initialize:function(t,e){L.setOptions(this,e),L.Utils.initTranslation.call(this),this.edgeMinWidth=this.options.edgeMinWidth,this.editable=this.options.editable,this._selected=this.options.selected,this._url=t,this.rotation={},this.interactive=this.options.interactive,this.tooltipText=this.options.tooltipText},onAdd:function(t){var e=this;this._map=t,this.getElement()||this._initImage(),t.on("viewreset",this._reset,this),this.options.corners&&(this._corners=this.options.corners,t.options.zoomAnimation&&L.Browser.any3d&&t.on("zoomanim",this._animateZoom,this)),L.DomEvent.on(this.getElement(),"load",(function(){if(e.getPane().appendChild(e.getElement()),e._initImageDimensions(),e.options.rotation){var i=e.options.rotation.deg>=0?"deg":"rad";e.setAngle(e.options.rotation[i],i)}else e.rotation={deg:0,rad:0},e._reset();e._corners||t.options.zoomAnimation&&L.Browser.any3d&&t.on("zoomanim",e._animateZoom,e);var o=e._eventParents;o?(e.eP=o[Object.keys(o)[0]],e.eP.editable&&e.editing.enable()):(e.editable&&e.editing.enable(),e.eP=null)})),L.DomEvent.on(this.getElement(),"click",this.select,this),L.DomEvent.on(t,{singleclickon:this._singleClickListeners,singleclickoff:this._resetClickListeners,singleclick:this._singleClick},this),t.doubleClickZoom.enabled()||t.doubleClickLabels.enabled()||L.DomEvent.on(t,"click",this.deselect,this),this.fire("add"),L.DomEvent.on(this.getElement(),"mousemove",this._activateTooltip,this),L.DomEvent.on(this.getElement(),"mouseout",this._closeTooltip,this)},onRemove:function(t){L.DomEvent.off(this.getElement(),"click",this.select,this),L.DomEvent.off(t,{singleclickon:this._singleClickListeners,singleclickoff:this._resetClickListeners,singleclick:this._singleClick},this),L.DomEvent.off(t,"click",this.deselect,this),this.editing&&this.editing.disable(),this.fire("remove"),L.ImageOverlay.prototype.onRemove.call(this,t),L.DomEvent.off(this.getElement(),"mouseover",this._deactivateTooltip,this)},_initImageDimensions:function(){var t=this._map,e=L.DomUtil.getStyle(this.getElement(),"width"),i=L.DomUtil.getStyle(this.getElement(),"height"),o=parseInt(e)/parseInt(i),n=this.options.height,a=parseInt(o*n),s=t.project(t.getCenter()),r=L.point(a,n).divideBy(2);this.options.corners?this._corners=this.options.corners:this._corners=[t.unproject(s.subtract(r)),t.unproject(s.add(L.point(r.x,-r.y))),t.unproject(s.add(L.point(-r.x,r.y))),t.unproject(s.add(r))],this._initialDimensions={center:s,offset:r,zoom:t.getZoom()},this.setBounds(L.latLngBounds(this.getCorners()))},_singleClick:function(t){"singleclick"===t.type&&this.deselect()},_singleClickListeners:function(){var t=this._map;L.DomEvent.off(t,"click",this.deselect,this),L.DomEvent.on(t,"singleclick",this.deselect,this)},_resetClickListeners:function(){var t=this._map;L.DomEvent.on(t,"click",this.deselect,this),L.DomEvent.off(t,"singleclick",this.deselect,this)},isSelected:function(){return this._selected},deselect:function(){var t=this.editing;if(t.enabled())return t._removeToolbar(),t._hideMarkers(),this._selected=!1,this.fire("deselect"),this},select:function(t){var e=this.editing,i=this.eP;if(e.enabled()){if(t&&L.DomEvent.stopPropagation(t),this._programmaticGrouping(),this._selected=!0,e._addToolbar(),e._showMarkers(),this.fire("select"),!i||!i.anyCollected())return this;this.deselect()}},_programmaticGrouping:function(){this._map.eachLayer((function(t){t instanceof L.DistortableImageOverlay&&t.deselect()}))},setCorner:function(t,e){var i=this.editing;return this._corners[t]=e,this.setBounds(L.latLngBounds(this.getCorners())),this.fire("update"),i.toolbar&&i.toolbar instanceof L.DistortableImage.PopupBar&&i._updateToolbarPos(),this.edited=!0,this},_cornerExceedsMapLats:function(t,e,i){return i.options.crs.Simple!=L.CRS.Simple&&(0===t?(o=i.project(e).y<2,n=i.project(e).y>=255):(o=i.project(e).y/t<2,n=i.project(e).y/Math.pow(2,t)>=255),o||n);var o,n},_activateTooltip:function(t){this.bindTooltip(this.tooltipText,{direction:"top"}).openTooltip()},_closeTooltip:function(){this.closeTooltip()},_deactivateTooltip:function(){this.unbindTooltip()},setCorners:function(t){var e=this._map,i=e.getZoom(),o=this.editing,n=0;for(var a in t)if(this._cornerExceedsMapLats(i,t[a],e))return this.setBounds(L.latLngBounds(this.getCorners())),void this.fire("update");for(var s in t)this._corners[n]=t[s],n+=1;return this.setBounds(L.latLngBounds(this.getCorners())),this.fire("update"),o.toolbar&&o.toolbar instanceof L.DistortableImage.PopupBar&&o._updateToolbarPos(),this.edited=!0,this},setCornersFromPoints:function(t){var e=this._map,i=e.getZoom(),o=this.editing,n=0;for(var a in t){var s=e.layerPointToLatLng(t[a]);if(this._cornerExceedsMapLats(i,s,e))return this.setBounds(L.latLngBounds(this.getCorners())),void this.fire("update")}for(var r in t)this._corners[n]=e.layerPointToLatLng(t[r]),n+=1;return this.setBounds(L.latLngBounds(this.getCorners())),this.fire("update"),o.toolbar&&o.toolbar instanceof L.DistortableImage.PopupBar&&o._updateToolbarPos(),this.edited=!0,this},scaleBy:function(t){var e,i,o=this._map,n=o.project(this.getCenter()),a={};if(0!==t){for(e=0;e<4;e++)i=o.project(this.getCorner(e)).subtract(n).multiplyBy(t).add(n),a[e]=o.unproject(i);return this.setCorners(a),this}},getAngle:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"deg",e=this.getElement().style[L.DomUtil.TRANSFORM].split("matrix3d")[1].slice(1,-1).split(","),i=e[0],o=e[1],n=e[4],a=e[5],s=i*a-o*n,r=L.TrigUtil.calcAngle(i,o,"rad");return s<0&&(r+=r<0?Math.PI:-Math.PI),r<0&&(r=2*Math.PI+r),"deg"===t?Math.round(L.TrigUtil.radiansToDegrees(r)):L.Util.formatNum(r,2)},setAngle:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"deg",i=this.getAngle(e),o=t-i;return this.rotateBy(o,e),this},rotateBy:function(t){var e,i,o,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"deg",a=this._map,s=a.project(this.getCenter()),r={};for("deg"===n&&(t=L.TrigUtil.degreesToRadians(t)),e=0;e<4;e++)i=a.project(this.getCorner(e)).subtract(s),o=L.point(Math.cos(t)*i.x-Math.sin(t)*i.y,Math.sin(t)*i.x+Math.cos(t)*i.y),r[e]=a.unproject(o.add(s));return this.setCorners(r),this},dragBy:function(t,e){var i,o,n=this._map,a={},s=n.project(t).subtract(n.project(e));for(i=0;i<4;i++)o=n.project(this.getCorner(i)).subtract(s),a[i]=n.unproject(o);this.setCorners(a)},restore:function(){for(var t=this._map,e=this._initialDimensions.center,i=this._initialDimensions.offset,o=this._initialDimensions.zoom,n=[e.subtract(i),e.add(L.point(i.x,-i.y)),e.add(L.point(-i.x,i.y)),e.add(i)],a=0;a<4;a++)t.unproject(n[a],o).equals(this.getCorner(a))||this.setCorner(a,t.unproject(n[a],o));return this.edited=!1,this.fire("restore"),this},_getTranslateString:function(t){var e=L.Browser.webkit3d,i=(e?",0":"")+")";return"translate"+(e?"3d":"")+"("+t.x+"px,"+t.y+"px"+i},_reset:function(){var t=this._map,e=this.getElement(),i=L.bind(t.latLngToLayerPoint,t),o=this._calculateProjectiveTransform(i),n=i(this.getCorner(0)),a=L.DomUtil.getMatrixString(o),s=this._getTranslateString(n);e._leaflet_pos=n,e.style[L.DomUtil.TRANSFORM]=[s,a].join(" "),e.style[L.DomUtil.TRANSFORM+"-origin"]="0 0 0",this.rotation.deg=this.getAngle(),this.rotation.rad=this.getAngle("rad")},_animateZoom:function(t){var e=this._map,i=this.getElement(),o=function(i){return e._latLngToNewLayerPoint(i,t.zoom,t.center)},n=this._calculateProjectiveTransform(o),a=o(this.getCorner(0)),s=L.DomUtil.getMatrixString(n),r=this._getTranslateString(a);i._leaflet_pos=a,i.style[L.DomUtil.TRANSFORM]=[r,s].join(" ")},getCorners:function(){return this._corners},getCorner:function(t){return this._corners[t]},getCenter:function(){var t=this._map,e=this.getCorners().reduce((function(e,i){return e.add(t.project(i))}),L.point(0,0));return t.unproject(e.divideBy(4))},_calculateProjectiveTransform:function(t){var e,i=t(this.getCorner(0)),o=this.getElement().offsetWidth||500,n=this.getElement().offsetHeight||375,a=[];for(e=0;e<4;e++)a.push(t(this.getCorner(e))._subtract(i));return L.MatrixUtil.general2DProjection(0,0,a[0].x,a[0].y,o,0,a[1].x,a[1].y,0,n,a[2].x,a[2].y,o,n,a[3].x,a[3].y)}}),L.distortableImageOverlay=function(t,e){return new L.DistortableImageOverlay(t,e)},L.Map.addInitHook((function(){L.DomUtil.hasClass(this.getContainer(),"ldi")||L.DomUtil.addClass(this.getContainer(),"ldi")}))},782:function(){var t=this;L.DomUtil=L.DomUtil||{},L.DistortableImage=L.DistortableImage||{},L.distortableImage=L.DistortableImage,L.DistortableImage.Keymapper=L.Handler.extend({options:{position:"topright"},initialize:function(t,e){this._map=t,L.setOptions(this,e)},addHooks:function(){this._keymapper||(this._container=this._buildContainer(),this._scrollWrapper=this._wrap(),this._toggler=this._createButton(),this._setMapper(this._container,this._scrollWrapper,this._toggler),L.DomEvent.on(this._toggler,"click",this._toggleKeymapper,this),L.DomEvent.disableClickPropagation(this._container),L.DomEvent.disableScrollPropagation(this._container))},removeHooks:function(){this._keymapper&&(L.DomEvent.off(this._toggler,"click",this._toggleKeymapper,this),L.DomUtil.remove(this._toggler),L.DomUtil.remove(this._scrollWrapper),L.DomUtil.remove(this._container),this._keymapper=!1)},_buildContainer:function(){var t=L.DomUtil.create("div","ldi-keymapper-hide");t.setAttribute("id","ldi-keymapper");var e=L.DomUtil.create("br","divider");return t.appendChild(e),t},_createButton:function(){var t=L.DomUtil.create("a","");return t.innerHTML=L.IconUtil.create("keyboard_open"),t.setAttribute("id","toggle-keymapper"),t.setAttribute("href","#"),t.setAttribute("title","Show keymap"),t.setAttribute("role","button"),t.setAttribute("aria-label","Show keymap"),t},_wrap:function(){var t=L.DomUtil.create("div","");return t.setAttribute("id","keymapper-wrapper"),t.style.display="none",t},_setMapper:function(t,e,i){this._keymapper=L.control({position:this.options.position}),this._keymapper.onAdd=function(){return t.appendChild(e),e.insertAdjacentHTML("beforeend",'
Rotate Mode
R
RotateScale Mode
r
Scale Mode
s
Distort Mode
d
Drag Mode
D
Lock (Mode) / Unlock Image
l u
Stack up / down
q a
Add / Remove Image Border
b
Toggle Opacity
o
Deselect All
esc
Delete Image(s)
delete backspace
Export Image(s)
e
'),t.appendChild(i),t},this._keymapper.addTo(this._map)},_toggleKeymapper:function(t){t.preventDefault(),this._container.className="ldi-keymapper leaflet-control"===this._container.className?"ldi-keymapper-hide leaflet-control":"ldi-keymapper leaflet-control",this._scrollWrapper.style.display="none"===this._scrollWrapper.style.display?"block":"none",this._toggler.innerHTML="close"===this._toggler.innerHTML?L.IconUtil.create("keyboard_open"):"close",L.IconUtil.toggleTitle(this._toggler,"Show keymap","Hide keymap"),L.DomUtil.toggleClass(this._toggler,"close-icon")},_injectIconSet:function(){if(!document.querySelector("#keymapper-iconset")){var t=L.DomUtil.create("div","");t.id="keymapper-iconset",t.setAttribute("hidden","hidden"),this._iconset=(new L.KeymapperIconSet).render(),t.innerHTML=this._iconset,document.querySelector(".leaflet-control-container").appendChild(t)}}}),L.DistortableImage.Keymapper.addInitHook((function(){L.DistortableImage.Keymapper.prototype._n=L.DistortableImage.Keymapper.prototype._n?L.DistortableImage.Keymapper.prototype._n+1:1,1!==L.DistortableImage.Keymapper.prototype._n||L.Browser.mobile||(t.enable(),t._injectIconSet())})),L.distortableImage.keymapper=function(t,e){return new L.DistortableImage.Keymapper(t,e)}},428:function(){L.DistortableImage=L.DistortableImage||{},L.DistortableCollection.Edit=L.Handler.extend({options:{keymap:L.distortableImage.group_action_map},initialize:function(t,e){this._group=t,this._exportOpts=t.options.exportOpts,L.setOptions(this,e),L.distortableImage.group_action_map.Escape="_decollectAll"},addHooks:function(){var t=this._group._map;this.editActions=this.options.actions,this.runExporter=L.bind(L.Utils.getNestedVal(this,"_exportOpts","exporter")||this.startExport,this),L.DomEvent.on(document,"keydown",this._onKeyDown,this),t.doubleClickZoom.enabled()||t.doubleClickLabels.enabled()||L.DomEvent.on(t,"click",this._decollectAll,this),L.DomEvent.on(t,{singleclickon:this._singleClickListeners,singleclickoff:this._resetClickListeners,singleclick:this._singleClick,boxcollectend:this._addCollections},this),this._group.editable=!0,this._group.eachLayer((function(t){return t.editing.enable()}))},removeHooks:function(){var t=this._group._map;L.DomEvent.off(document,"keydown",this._onKeyDown,this),t.doubleClickZoom.enabled()||t.doubleClickLabels.enabled()||L.DomEvent.off(t,"click",this._decollectAll,this),L.DomEvent.off(t,{singleclickon:this._singleClickListeners,singleclickoff:this._resetClickListeners,singleclick:this._singleClick,boxcollectend:this._addCollections},this),this._decollectAll(),this._group.editable=!1,this._group.eachLayer((function(t){return t.editing.disable()}))},enable:function(){return this._enabled=!0,this.addHooks(),this},disable:function(){return this._enabled=!1,this.removeHooks(),this},_onKeyDown:function(t){var e=this.options.keymap[t.key];this[e]&&this._group.anyCollected()&&this[e].call(this)},_singleClick:function(t){"singleclick"===t.type&&this._decollectAll(t)},_singleClickListeners:function(){var t=this._group._map;L.DomEvent.off(t,"click",this._decollectAll,this),L.DomEvent.on(t,"singleclick",this._decollectAll,this)},_resetClickListeners:function(){var t=this._group._map;L.DomEvent.on(t,"click",this._decollectAll,this),L.DomEvent.off(t,"singleclick",this._decollectAll,this)},_decollectAll:function(t){var e;t&&(e=t.originalEvent),e&&(e.shiftKey||e.target instanceof HTMLImageElement)||(this._group.eachLayer((function(t){L.DomUtil.removeClass(t.getElement(),"collected"),t.deselect()})),this._removeToolbar(),t&&L.DomEvent.stopPropagation(t))},_unlockGroup:function(){var t=this;this.hasTool(L.UnlockAction)&&this._group.eachLayer((function(e){t._group.isCollected(e)&&(e.editing._unlock(),e.deselect())}))},_lockGroup:function(){var t=this;this.hasTool(L.LockAction)&&this._group.eachLayer((function(e){t._group.isCollected(e)&&(e.editing._lock(),L.DomUtil.addClass(e.getElement(),"collected"))}))},_addCollections:function(t){var e=this,i=t.boxCollectBounds,o=this._group._map;this._group.eachLayer((function(t){var n=t.editing;t.isSelected()&&t.deselect();var a=o.getZoom(),s=o.getCenter(),r=L.latLngBounds(t.getCorner(2),t.getCorner(1));r=o._latLngBoundsToNewLayerBounds(r,a,s),i.intersects(r)&&n.enabled()&&(e.toolbar||e._addToolbar(),L.DomUtil.addClass(t.getElement(),"collected"))}))},_removeGroup:function(t){var e=this;if(this.hasTool(L.DeleteAction)){var i=this._group._toRemove(),o=i.length;0!==o&&(L.DomUtil.confirmDeletes(o)&&(i.forEach((function(t){e._group.removeLayer(t)})),this._group.anyCollected()||this._removeToolbar()),t&&L.DomEvent.stopPropagation(t))}},cancelExport:function(){this.customCollection||(this._exportOpts.collection=void 0),clearInterval(this.updateInterval)},_addToolbar:function(){var t=this._group,e=t._map;t.options.suppressToolbar||this.toolbar||(this.toolbar=L.distortableImage.controlBar({actions:this.editActions,position:"topleft"}).addTo(e,t))},_removeToolbar:function(){var t=this._group._map;if(!this.toolbar)return!1;t.removeLayer(this.toolbar),this.toolbar=!1},hasTool:function(t){return this.editActions.some((function(e){return e===t}))},addTool:function(t){return"leaflet-toolbar-icon"!==t.baseClass||this.hasTool(t)||(this._removeToolbar(),this.editActions.push(t),this._addToolbar()),this},removeTool:function(t){var e=this;return this.editActions.some((function(i,o){return e.editActions[o]===t&&(e._removeToolbar(),e.editActions.splice(o,1),e._addToolbar(),!0)})),this},startExport:function(){var t=this;if(this.hasTool(L.ExportAction))return new Promise((function(e){var i,o=t._exportOpts;o.resolve=e,t.updateInterval=null,t.customCollection=!!o.collection,t.customCollection||(o.collection=t._group.generateExportJson().images),o.frequency=o.frequency||3e3,o.scale=o.scale||100,o.updater=o.updater||function(n){(n=JSON.parse(n)).status_url&&(i!==n.status_url&&n.status_url.match(".json")&&(i=n.status_url),"complete"===n.status&&(clearInterval(t.updateInterval),t.customCollection||(t._exportOpts.collection=void 0),e(),null!==n.jpg&&alert("Export succeeded. "+o.exportUrl+n.jpg)),console.log(n))},o.handleStatusRes=o.handleStatusRes||function(e){i=o.statusUrl+e,t.updateInterval=setInterval((function(){var t=new Request("".concat(i,"?").concat(Date.now()),{method:"GET"});fetch(t).then((function(t){if(t.ok)return t.text()})).then(o.updater)}),o.frequency)},o.fetchStatusUrl=o.fetchStatusUrl||function(t){var e=new FormData;e.append("collection",JSON.stringify(t.collection)),e.append("scale",t.scale),e.append("upload",!0);var i={method:"POST",body:e},o=new Request(t.exportStartUrl,i);fetch(o).then((function(t){if(t.ok)return t.text()})).then(t.handleStatusRes)},o.fetchStatusUrl(o)}))}}),L.distortableCollection.edit=function(t,e){return new L.DistortableCollection.Edit(t,e)}},397:function(){L.DistortableImage=L.DistortableImage||{},L.DistortableImage.Edit=L.Handler.extend({options:{opacity:.7,outline:"1px solid red",keymap:L.distortableImage.action_map},initialize:function(t,e){this._overlay=t,this._toggledImage=!1,this._mode=t.options.mode,this._transparent=!1,this._outlined=!1,L.setOptions(this,e),L.distortableImage.action_map.Escape="_deselect"},addHooks:function(){var t=this._overlay;this.editActions=this.options.actions,t.bringToFront(),this._initModes(),this._initHandles(),this._appendHandlesandDragable(),t.isSelected()&&!t.options.suppressToolbar&&this._addToolbar(),this.parentGroup=!!t.eP&&t.eP,L.DomEvent.on(t.getElement(),{dblclick:this.nextMode},this),L.DomEvent.on(window,"keydown",this._onKeyDown,this)},removeHooks:function(){var t=this._overlay,e=this.parentGroup;for(var i in this._disableDragging(),this.toolbar&&this._removeToolbar(),this._handles)L.DomUtil.remove(i);L.DomUtil.hasClass(t.getElement(),"collected")&&L.DomUtil.removeClass(t.getElement(),"collected"),e&&!e.anyCollected()&&e.editing.toolbar&&e.editing._removeToolbar(),L.DomEvent.off(t.getElement(),{dblclick:this.nextMode},this),L.DomEvent.off(window,"keydown",this._onKeyDown,this)},disable:function(){return this._enabled?(this._overlay.deselect(),this._enabled=!1,this.removeHooks(),this):this},_initModes:function(){for(var t in this._modes={},L.DistortableImage.Edit.MODES){var e=L.DistortableImage.Edit.MODES[t];-1!==this.editActions.indexOf(e)&&(this._modes[t]=e)}this._modes[this._mode]||(this._mode=Object.keys(this._modes)[0])},_initHandles:function(){var t,e=this._overlay;for(this._dragHandles=L.layerGroup(),t=0;t<4;t++)this._dragHandles.addLayer(L.dragHandle(e,t));for(this._scaleHandles=L.layerGroup(),t=0;t<4;t++)this._scaleHandles.addLayer(L.scaleHandle(e,t));for(this._distortHandles=L.layerGroup(),t=0;t<4;t++)this._distortHandles.addLayer(L.distortHandle(e,t));for(this._rotateHandles=L.layerGroup(),t=0;t<4;t++)this._rotateHandles.addLayer(L.rotateHandle(e,t));for(this._freeRotateHandles=L.layerGroup(),t=0;t<4;t++)this._freeRotateHandles.addLayer(L.freeRotateHandle(e,t));for(this._lockHandles=L.layerGroup(),t=0;t<4;t++)this._lockHandles.addLayer(L.lockHandle(e,t,{draggable:!1}));this._handles={drag:this._dragHandles,scale:this._scaleHandles,distort:this._distortHandles,rotate:this._rotateHandles,freeRotate:this._freeRotateHandles,lock:this._lockHandles}},_appendHandlesandDragable:function(){var t=this._overlay;this._mode?(this._updateHandle(),!t.isSelected()&&this.currentHandle&&this.currentHandle.eachLayer((function(t){t.setOpacity(0),t.dragging&&t.dragging.disable()})),this.isMode("lock")||this._enableDragging()):this._enableDragging()},_onKeyDown:function(t){var e=this.options.keymap[t.key],i=this._overlay,o=this.parentGroup;o&&o.anyCollected()||void 0===this[e]||i.options.suppressToolbar||i.isSelected()&&this.toolbar&&this[e].call(this)},replaceTool:function(t,e){var i=this;return"leaflet-toolbar-icon"!==e.baseClass||this.hasTool(e)||this.editActions.some((function(o,n){if(o===t){for(var a in i._removeToolbar(),i.editActions[n]=e,i._addToolbar(),L.DistortableImage.Edit.MODES)L.DistortableImage.Edit.MODES[a]===t?(delete i._modes[a],i._nextOrNone(a)):L.DistortableImage.Edit.MODES[a]===e&&(i._modes[a]=e);return!0}})),this},addTool:function(t){if("leaflet-toolbar-icon"===t.baseClass&&!this.hasTool(t)){for(var e in this._removeToolbar(),this.editActions.push(t),this._addToolbar(),L.DistortableImage.Edit.MODES)L.DistortableImage.Edit.MODES[e]===t&&(this._modes[e]=t);this._overlay.isSelected()||this._removeToolbar()}return this},hasTool:function(t){return this.editActions.some((function(e){return e===t}))},removeTool:function(t){var e=this;return this.editActions.some((function(i,o){if(i===t){for(var n in e._removeToolbar(),e.editActions.splice(o,1),e._addToolbar(),L.DistortableImage.Edit.MODES)L.DistortableImage.Edit.MODES[n]===t&&(delete e._modes[n],e._nextOrNone(n));return!0}})),this._overlay.isSelected()||this._removeToolbar(),this},_nextOrNone:function(t){this.isMode(t)&&(Object.keys(this.getModes()).length>=1?this.nextMode():("lock"===t&&this._enableDragging(),this._mode="",this._updateHandle()))},_removeToolbar:function(){var t=this._overlay._map;this.toolbar&&(t.removeLayer(this.toolbar),this.toolbar=!1)},_enableDragging:function(){var t=this,e=this._overlay,i=e._map;this.dragging=new L.Draggable(e.getElement()),this.dragging.enable(),this.dragging.on("dragstart",(function(){e.fire("dragstart"),t._removeToolbar()})),this.dragging._updatePosition=function(){var t,o,n=e.getCorner(0),a=this._newPos.subtract(i.latLngToLayerPoint(n)),s={};for(this.fire("predrag"),o=0;o<4;o++)t=i.latLngToLayerPoint(e.getCorner(o)),s[o]=i.layerPointToLatLng(t.add(a));e.setCorners(s),e.fire("drag"),this.fire("drag")},this.dragging.on("dragend",(function(){e.fire("dragend")}))},_disableDragging:function(){this.dragging&&(this.dragging.disable(),delete this.dragging)},_dragMode:function(){this.setMode("drag")},_scaleMode:function(){this.setMode("scale")},_distortMode:function(){this.setMode("distort")},_rotateMode:function(){this.setMode("rotate")},_freeRotateMode:function(){this.setMode("freeRotate")},_toggleLockMode:function(){this.isMode("lock")?this._unlock():this._lock()},_toggleOpacity:function(){var t=this._overlay.getElement();if(this.hasTool(L.OpacityAction)){this._transparent=!this._transparent;var e=this._transparent?this.options.opacity:1;L.DomUtil.setOpacity(t,e),t.setAttribute("opacity",e),this._refresh()}},_toggleBorder:function(){var t=this._overlay.getElement();if(this.hasTool(L.BorderAction)){this._outlined=!this._outlined;var e=this._outlined?this.options.outline:"none";t.style.outline=e,this._refresh()}},_toggleOrder:function(){this._toggledImage?this._stackUp():this._stackDown()},_removeOverlay:function(){var t=this._overlay,e=this.parentGroup;!this.isMode("lock")&&this.hasTool(L.DeleteAction)&&L.DomUtil.confirmDelete()&&(this._removeToolbar(),e?e.removeLayer(t):t._map.removeLayer(t))},_getExport:function(){var t=this._overlay,e=t._map,i=t.getElement();if(this.hasTool(L.ExportAction)){var o=new Image;o.id=o.id||"tempId12345",document.body.appendChild(o),o.onload=function(){var i=o.height,n=o.width,a=e.latLngToLayerPoint(t.getCorner(0)),s=e.latLngToLayerPoint(t.getCorner(1)),r=e.latLngToLayerPoint(t.getCorner(2)),l=e.latLngToLayerPoint(t.getCorner(3));o.onload=function(){L.DomUtil.remove(o)},window&&window.hasOwnProperty("warpWebGl")&&warpWebGl(o.id,[0,0,n,0,n,i,0,i],[a.x,a.y,s.x,s.y,l.x,l.y,r.x,r.y],!0)},o.src=t.options.fullResolutionSrc||i.src}},_stackUp:function(){this._toggledImage&&this.hasTool(L.StackAction)&&(this._toggledImage=!1,this._overlay.bringToFront(),this._refresh())},_stackDown:function(){!this._toggledImage&&this.hasTool(L.StackAction)&&(this._toggledImage=!0,this._overlay.bringToBack(),this._refresh())},_unlock:function(){var t=this._overlay,e=t._map,i=this.parentGroup;this.isMode("lock")&&((!i||i.isCollected(t))&&i||this.hasTool(L.LockAction))&&(this.currentHandle&&e.removeLayer(this.currentHandle),"lock"!==t.options.mode&&this.hasMode(t.options.mode)?this._mode=t.options.mode:(this._mode="",this.currentHandle=""),this._updateHandle(),this._enableDragging(),this._refresh())},_lock:function(){var t=this._overlay,e=t._map,i=this.parentGroup;this.isMode("lock")||((!i||i.isCollected(t))&&i||this.hasTool(L.LockAction))&&(this.currentHandle&&e.removeLayer(this.currentHandle),this._mode="lock",this._updateHandle(),this._disableDragging(),this._refresh())},_deselect:function(){this._overlay.deselect()},_showMarkers:function(t){var e=this.parentGroup;this.currentHandle&&(!this.isMode("lock")&&e&&e.anyCollected()||this.currentHandle.eachLayer((function(t){t.setOpacity(1),t.dragging&&t.dragging.enable(),L.DomUtil.addClass(t.getElement(),"leaflet-interactive")})))},_hideMarkers:function(){var t=this._overlay,e=this.parentGroup;this._handles||this._initHandles(),this.currentHandle&&(this.isMode("lock")&&e&&e.isCollected(t)||this.currentHandle.eachLayer((function(t){t.setOpacity(0),t.dragging&&t.dragging.disable(),L.DomUtil.removeClass(t.getElement(),"leaflet-interactive")})))},_updateHandle:function(){var t=this._overlay._map,e=this.getMode();this.currentHandle&&t.removeLayer(this.currentHandle),this.currentHandle=""===e?"":this._handles[e],""!==this.currentHandle&&t.addLayer(this.currentHandle)},_addToolbar:function(){var t=this._overlay,e=this.parentGroup,i=t._map,o=t.getCorners(),n=-1/0;if(e&&e.anyCollected())e.editing._addToolbar();else if(!t.options.suppressToolbar&&!this.toolbar){for(var a=0;an&&(n=o[a].lat);var s=t.getCenter();s.lat=n,this.toolbar=L.distortableImage.popupBar(s,{actions:this.editActions}).addTo(i,t),t.fire("toolbar:created")}},_refresh:function(){this.toolbar&&this._removeToolbar(),this._addToolbar()},_updateToolbarPos:function(){var t=this._overlay,e=t.getCorners(),i=this.toolbar,o=-1/0;if(i&&i instanceof L.DistortableImage.PopupBar){for(var n=0;no&&(o=e[n].lat);var a=t.getCenter();a.lat=o,t.options.suppressToolbar||this.toolbar.setLatLng(a)}},hasMode:function(t){return!!this._modes[t]},getMode:function(){if(this.enabled())return this._mode},getModes:function(){return this._modes},isMode:function(t){return!!this.enabled()&&this._mode===t},setMode:function(t){var e=this._overlay,i=this.parentGroup;if(this.getMode()!==t&&this.hasMode(t)&&this.enabled())return this.toolbar&&this.toolbar.clickTool(t),this.isMode("lock")&&!this.dragging&&this._enableDragging(),this._mode=t,this.isMode("lock")&&this._disableDragging(),this._updateHandle(),this._refresh(),i&&i.isCollected(e)&&e.deselect(),this},nextMode:function(t){var e=this.getMode(),i=this.parentGroup,o=Object.keys(this.getModes()),n=o.indexOf(e),a=o[(n+1)%o.length];if(t){if(i&&i.anyCollected())return;L.DomEvent.stop(t)}return this.setMode(a)}}),L.distortableImage.edit=function(t,e){return new L.DistortableImage.Edit(t,e)}},426:function(){L.BorderAction=L.EditAction.extend({initialize:function(t,e,i){var o,n,a=e.editing,s=a._mode;a._outlined?(o="border_outer",n=e.options.translation.removeBorder):(o="border_clear",n=e.options.translation.addBorder),(i=i||{}).toolbarIcon={svg:!0,html:o,tooltip:n,className:"lock"===s?"disabled":""},L.DistortableImage.action_map.b="lock"===s?"":"_toggleBorder",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){var t=this._overlay.editing;L.IconUtil.toggleXlink(this._link,"border_clear","border_outer"),L.IconUtil.toggleTitle(this._link,"Remove Border","Add Border"),t._toggleBorder()}})},114:function(){L.DeleteAction=L.EditAction.extend({initialize:function(t,e,i){var o,n=e.editing;n instanceof L.DistortableImage.Edit?(o=e.options.translation.deleteImage,L.DistortableImage.action_map.Backspace="lock"===n._mode?"":"_removeOverlay"):(o=e.options.translation.deleteImages,L.DistortableImage.group_action_map.Backspace="lock"===n._mode?"":"_removeGroup"),(i=i||{}).toolbarIcon={svg:!0,html:"delete_forever",tooltip:o,className:"lock"===n._mode?"disabled":""},L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){var t=this._overlay.editing;t instanceof L.DistortableImage.Edit?t._removeOverlay():t._removeGroup()}})},231:function(){L.DistortAction=L.EditAction.extend({initialize:function(t,e,i){(i=i||{}).toolbarIcon={svg:!0,html:"distort",tooltip:e.options.translation.distortImage,className:"distort"},L.DistortableImage.action_map.d="_distortMode",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){this._overlay.editing._distortMode()}})},541:function(){L.DragAction=L.EditAction.extend({initialize:function(t,e,i){(i=i||{}).toolbarIcon={svg:!0,html:"drag",tooltip:e.options.translation.dragImage,className:"drag"},L.DistortableImage.action_map.D="_dragMode",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){this._overlay.editing._dragMode()}})},280:function(){L.DistortableImage=L.DistortableImage||{},L.distortableImage=L.DistortableImage,L.DistortableImage.action_map={},L.EditAction=L.Toolbar2.Action.extend({options:{toolbarIcon:{svg:!1,html:"",className:"",tooltip:""}},initialize:function(t,e,i){this._overlay=e,this._map=t,L.setOptions(this,i),L.Toolbar2.Action.prototype.initialize.call(this,i),this._injectIconSet()},_createIcon:function(t,e,i){var o=this,n=this.options.toolbarIcon,a=n.className,s=this._overlay.editing;this.toolbar=t,this._icon=L.DomUtil.create("li","",e),this._link=L.DomUtil.create("a","",this._icon),n.svg?this._link.innerHTML=L.IconUtil.create(n.html):this._link.innerHTML=n.html,this._link.setAttribute("href","#"),this._link.setAttribute("title",n.tooltip),this._link.setAttribute("role","button"),L.DomUtil.addClass(this._link,this.constructor.baseClass),a&&(L.DomUtil.addClass(this._link,a),"disabled"===a&&L.DomUtil.addClass(this._icon,a),a===s._mode?L.DomUtil.addClass(this._link,"selected-mode"):L.DomUtil.removeClass(this._link,"selected-mode")),L.DomEvent.on(this._link,"click",this.enable,this),L.DomEvent.on(this._overlay,"update",(function(){var t=o._link.innerHTML.match(/xlink:href="#restore"/);t&&1===t.length&&o._enableAction()})),this._addSubToolbar(t,this._icon,i)},_injectIconSet:function(){if(!document.querySelector("#iconset")){var t=document.createElement("div");t.id="iconset",t.setAttribute("hidden","hidden"),t.innerHTML=(new L.ToolbarIconSet).render(),document.querySelector(".leaflet-marker-pane").appendChild(t)}},_enableAction:function(){L.DomUtil.removeClass(this._link.parentElement,"disabled"),L.DomUtil.removeClass(this._link,"disabled")},_disableAction:function(){L.DomUtil.addClass(this._link.parentElement,"disabled"),L.DomUtil.addClass(this._link,"disabled")}}),L.editAction=function(t,e,i){return new L.EditAction(t,e,i)}},149:function(){L.ExportAction=L.EditAction.extend({initialize:function(t,e,i){var o,n=e.editing;this.isExporting=!1,this.mouseLeaveSkip=!0,this.isHooksExecuted=!1,n instanceof L.DistortableImage.Edit?(L.DistortableImage.action_map.e="_getExport",o=e.options.translation.exportImage):(L.DistortableImage.group_action_map.e="runExporter",o=e.options.translation.exportImages),(i=i||{}).toolbarIcon={svg:!0,html:"get_app",tooltip:o},L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){var t=this._overlay.editing;if(t instanceof L.DistortableImage.Edit)t._getExport();else if(!this.isHooksExecuted){this.isHooksExecuted=!0;var e=this._link.parentElement;this.mouseEnterHandler=this.handleMouseEnter.bind(this),this.mouseLeaveHandler=this.handleMouseLeave.bind(this),L.DomEvent.on(e,"click",(function(){if(this.isExporting){if(this.mouseLeaveSkip)return;this.resetState(),this.detachMouseEventListeners(e),t.cancelExport()}else this.isExporting=!0,this.renderExportIcon(),setTimeout(this.attachMouseEventListeners.bind(this,e),100),t.runExporter().then(function(){this.resetState(),this.detachMouseEventListeners(e)}.bind(this))}),this)}},resetState:function(){this.renderDownloadIcon(),this.isExporting=!1,this.mouseLeaveSkip=!0},attachMouseEventListeners:function(t){t.addEventListener("mouseenter",this.mouseEnterHandler),t.addEventListener("mouseleave",this.mouseLeaveHandler)},detachMouseEventListeners:function(t){t.removeEventListener("mouseenter",this.mouseEnterHandler),t.removeEventListener("mouseleave",this.mouseLeaveHandler)},handleMouseEnter:function(){this.renderCancelIcon()},handleMouseLeave:function(){this.mouseLeaveSkip?this.mouseLeaveSkip=!1:this.renderExportIcon()},renderDownloadIcon:function(){L.IconUtil.toggleXlink(this._link,"get_app","spinner"),L.IconUtil.toggleTitle(this._link,"Export Images","Loading..."),L.DomUtil.removeClass(this._link.firstChild,"loader")},renderExportIcon:function(){L.IconUtil.toggleXlink(this._link,"spinner"),L.IconUtil.toggleTitle(this._link,"Export Images","Loading..."),L.IconUtil.addClassToSvg(this._link,"loader")},renderCancelIcon:function(){L.IconUtil.toggleXlink(this._link,"cancel"),L.IconUtil.toggleTitle(this._link,"Cancel Export","Loading..."),L.DomUtil.removeClass(this._link.firstChild,"loader")}})},74:function(){L.FreeRotateAction=L.EditAction.extend({initialize:function(t,e,i){(i=i||{}).toolbarIcon={svg:!0,html:"crop_rotate",tooltip:e.options.translation.freeRotateImage,className:"freeRotate"},L.DistortableImage.action_map.f="_freeRotateMode",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){this._overlay.editing._freeRotateMode()}})},691:function(){L.GeolocateAction=L.EditAction.extend({initialize:function(t,e,i){var o=e.editing;(i=i||{}).toolbarIcon={svg:!0,html:"explore",tooltip:e.options.translation.geolocateImage,className:"lock"===o._mode?"disabled":""},L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){var t=this._overlay.getElement();EXIF.getData(t,L.EXIF(t))}})},105:function(){L.LockAction=L.EditAction.extend({initialize:function(t,e,i){var o,n,a=e.editing;a instanceof L.DistortableImage.Edit?(L.DistortableImage.action_map.u="_unlock",L.DistortableImage.action_map.l="_lock",n=e.options.translation.lockMode,o=a.isMode("lock")?"lock":"unlock"):(L.DistortableImage.group_action_map.l="_lockGroup",n=e.options.translation.lockImages,o="lock"),(i=i||{}).toolbarIcon={svg:!0,html:o,tooltip:n,className:"lock"},L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){var t=this._overlay.editing;t instanceof L.DistortableImage.Edit?t._toggleLockMode():t._lockGroup()}})},944:function(){L.OpacityAction=L.EditAction.extend({initialize:function(t,e,i){var o,n,a=e.editing,s=a._mode;a._transparent?(o="opacity_empty",n=e.options.translation.makeImageOpaque):(o="opacity",n=e.options.translation.makeImageTransparent),(i=i||{}).toolbarIcon={svg:!0,html:o,tooltip:n,className:"lock"===s?"disabled":""},L.DistortableImage.action_map.o="lock"===s?"":"_toggleOpacity",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){var t=this._overlay.editing,e=this._link;L.IconUtil.toggleXlink(e,"opacity","opacity_empty"),L.IconUtil.toggleTitle(e,"Make Image Transparent","Make Image Opaque"),t._toggleOpacity()}})},954:function(){L.RestoreAction=L.EditAction.extend({initialize:function(t,e,i){var o=L.Utils.getNestedVal(e,"editing","_mode"),n=e.edited;(i=i||{}).toolbarIcon={svg:!0,html:"restore",tooltip:e.options.translation.restoreImage,className:n&&"lock"!==o?"":"disabled"},L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){var t=this._overlay;L.DomEvent.on(t,{edit:this._enableAction,restore:this._disableAction},this),t.restore()}})},178:function(){L.RotateAction=L.EditAction.extend({initialize:function(t,e,i){(i=i||{}).toolbarIcon={svg:!0,html:"rotate",tooltip:e.options.translation.rotateImage,className:"rotate"},L.DistortableImage.action_map.r="_rotateMode",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){this._overlay.editing._rotateMode()}})},547:function(){L.ScaleAction=L.EditAction.extend({initialize:function(t,e,i){(i=i||{}).toolbarIcon={svg:!0,html:"scale",tooltip:e.options.translation.scaleImage,className:"scale"},L.DistortableImage.action_map.s="_scaleMode",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){this._overlay.editing._scaleMode()}})},886:function(){L.StackAction=L.EditAction.extend({initialize:function(t,e,i){var o,n,a=e.editing;a._toggledImage?(o="flip_to_back",n=e.options.translation.stackToFront):(o="flip_to_front",n=e.options.translation.stackToBack),(i=i||{}).toolbarIcon={svg:!0,html:o,tooltip:n,className:"lock"===a._mode?"disabled":""},L.DistortableImage.action_map.q="lock"===a._mode?"":"_stackUp",L.DistortableImage.action_map.a="lock"===a._mode?"":"_stackDown",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){var t=this._overlay.editing;L.IconUtil.toggleXlink(this._link,"flip_to_front","flip_to_back"),L.IconUtil.toggleTitle(this._link,"Stack to Front","Stack to Back"),t._toggleOrder()}})},129:function(){L.UnlockAction=L.EditAction.extend({initialize:function(t,e,i){(i=i||{}).toolbarIcon={svg:!0,html:"unlock",tooltip:e.options.translation.unlockImages},L.DistortableImage.group_action_map.u="_unlockGroup",L.EditAction.prototype.initialize.call(this,t,e,i)},addHooks:function(){this._overlay.editing._unlockGroup()}})},743:function(){L.EXIF=function(t){if(0!==Object.keys(EXIF.getAllTags(t)).length){console.log(EXIF.getAllTags(t));var e=EXIF.getAllTags(t);void 0!==e.GPSLatitude&&void 0!==e.GPSLongitude&&(e.GPSLatitude[0],e.GPSLatitude[1],e.GPSLatitude[2],e.GPSLongitude[0],e.GPSLongitude[1],e.GPSLongitude[2],e.GPSLatitudeRef,e.GPSLongitudeRef),"T"===e.GPSImgDirectionRef||"M"===e.GPSImgDirectionRef?(Math.PI,e.GPSImgDirection.numerator,e.GPSImgDirection.denominator):console.log("No compass data found"),console.log("Orientation:",e.Orientation),(6===e.Orientation||8===e.Orientation||3===e.Orientation)&&Math.PI,void 0!==e.GPSAltitude&&void 0!==e.GPSAltitudeRef&&void 0!==e.GPSAltitude&&void 0!==e.GPSAltitudeRef&&(e.GPSAltitude.numerator,e.GPSAltitude.denominator,e.GPSAltitudeRef)}else alert("EXIF initialized. Press again to view data in console.")}},92:function(){L.DistortHandle=L.EditHandle.extend({options:{TYPE:"distort",icon:L.icon({iconUrl:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAChSURBVO3BIU4DURgGwNkvL2B6AkQTLBqP4QCoSm7DDXoBLBZHDbfgICAIZjEV3YTn9uVHdMZZtcnCfI13bIzxg0emg6Nm6QVbYz3jylEsXRrvwommb49X67jFkz80fR9Mb1YxTzqiWBSLYlEsikWxKBbFolgUi2JRLIpFsSgWxaJY03fHHOu40dH07bAzWCx9Ge/TiWbpHgdsjPGNB2f/yS+7xRCyiiZPJQAAAABJRU5ErkJggg==",iconSize:[32,32],iconAnchor:[16,16]})},_onHandleDrag:function(){this._handled.setCorner(this._corner,this.getLatLng())},updateHandle:function(){this.setLatLng(this._handled.getCorner(this._corner))}}),L.distortHandle=function(t,e,i){return new L.DistortHandle(t,e,i)}},194:function(){L.DragHandle=L.EditHandle.extend({options:{TYPE:"drag",icon:L.icon({iconUrl:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAsVJREFUeNrMVztLXEEUvnNVFAVBAhY2aRKbTZEHJNpYabuNjSgYg/GxdsmPSJkUAa/ZdVEX8mgWYVutbHxAHkVskjQBuUUgBISVhCQk3wnfwMlk1rusN1wHPubOzJlzvjlz5sxc01Ma/hUEwQnwDIjqc7uvgv9YYO86qgIwCXQbdNTlQ8kcCBHgBch8TcloF6oJGr6phk6EQAkfdz3zvgDr9Mr7Fg1fptEZoM8jsmrokpfsiIFO4IIjuE2v1EDmR4LRdlR5Gh51hj8D34ABtm8YTtqna0TgklIw5CgQguKxIojEjmFROg/MKQO27NkFAB+4wAPouGUJiIvWKHwbAxX2XyWRKWkqhT+pbJntJZJuUzISW0+5hW+obxrVBsfvoH/dqCCJuU97GBh2VteLSiYvArmErT8EVoAK9Bw7enbpVYmvAQlyowYforrH5jXL2rPHI/TKONDB7u9AlavdaTBPvPmazUeQuy8f7UomUgTEwIJPEQ3sQGE/6ll2l9H/KcEzBcfWn2IclluM3DpddJxSHujlFkscbUPvmB0LHVnLrId7nlaZVkEc6QGXQI1MAwZcWmVRHeNaQwJMMiU2cwy4s7p/RJ2ckpvIQs+cIs+5GzitloLKHUV3MPREuXbTOKO91dX387gGTONxIgEWm+E61FFrpcyqXLHsEwiDjEsjAksqw5XPoL9MHVrn6QR4q+XZrDaR4RoWzq2ymafuRA/Mq1stSsHLVkcbdf9VjOcx8ZH3+SFWcCWlVPyWuUBOwUWdC1wP5NVjYiXFWLO69PZ6CRTUY6KSIoEKdf6T3IzzgHxnsyHctNBEkmn6Oob8ExUDg/ahGybd177cDjzH5xHwgDiSvoS7I/LZyvxJZj0wod7tkX5G0XVC7rEyLhfLJjBGbKoLLEfZWObyKeZ6oY82g+yf5Zn/mJyHX7PMf04z/T3/LcAAu4E6iiyJqf0AAAAASUVORK5CYII=",iconSize:[32,32],iconAnchor:[16,16]})},_onHandleDrag:function(){var t=this._handled,e=t.getCorner(this._corner),i=this.getLatLng();t.dragBy(e,i)},updateHandle:function(){this.setLatLng(this._handled.getCorner(this._corner))}}),L.dragHandle=function(t,e,i){return new L.DragHandle(t,e,i)}},988:function(){L.EditHandle=L.Marker.extend({initialize:function(t,e,i){var o=t.getCorner(e);L.setOptions(this,i),this._handled=t,this._corner=e;var n={draggable:!0,zIndexOffset:10};i&&i.hasOwnProperty("draggable")&&(n.draggable=i.draggable),L.Marker.prototype.initialize.call(this,o,n)},onAdd:function(t){L.Marker.prototype.onAdd.call(this,t),this._bindListeners(),this.updateHandle()},onRemove:function(t){this._unbindListeners(),L.Marker.prototype.onRemove.call(this,t)},_onHandleDragStart:function(){this._handled.fire("editstart")},_onHandleDragEnd:function(){this._fireEdit()},_fireEdit:function(){this._handled.edited=!0,this._handled.fire("edit")},_bindListeners:function(){this.on({contextmenu:L.DomEvent.stop,dragstart:this._onHandleDragStart,drag:this._onHandleDrag,dragend:this._onHandleDragEnd},this),this._handled._map.on("zoomend",this.updateHandle,this),this._handled.on("update",this.updateHandle,this)},_unbindListeners:function(){this.off({contextmenu:L.DomEvent.stop,dragstart:this._onHandleDragStart,drag:this._onHandleDrag,dragend:this._onHandleDragEnd},this),this._handled._map.off("zoomend",this.updateHandle,this),this._handled.off("update",this.updateHandle,this)},_calculateScalingFactor:function(t,e){var i=this._handled,o=i._map,n=o.latLngToLayerPoint(i.getCenter()),a=o.latLngToLayerPoint(t),s=o.latLngToLayerPoint(e),r=this._d2(n,a),l=this._d2(n,s);return Math.sqrt(l/r)},_d2:function(t,e){var i=t.x-e.x,o=t.y-e.y;return Math.pow(i,2)+Math.pow(o,2)},calculateAngleDelta:function(t,e){var i=this._handled,o=i._map,n=o.latLngToLayerPoint(i.getCenter()),a=o.latLngToLayerPoint(t),s=o.latLngToLayerPoint(e),r=Math.atan2(n.y-a.y,n.x-a.x);return Math.atan2(n.y-s.y,n.x-s.x)-r}})},206:function(){L.FreeRotateHandle=L.EditHandle.extend({options:{TYPE:"freeRotate",icon:L.icon({iconUrl:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAHiSURBVMXBa3HbShgA0PMp/1sCCo8oCEpgTaCXgIXAJiDzyCJoAUTm4UVQAns1Y8+snWnTvJyeE16hkjDgDrfoNTMKcpC9UPiLSo8JyetkjEHxjPCMyoS199kFoz8Iv1HpMaN3qWDCHoegOKkkRwnJpRmroHgiPFEZ8IBekzEGxQtUEhKSS/fB7Ew4U+lxcGkVZG9QWWPSFAxBcdK59KApuA+yNwp2uEdx1GN25sZJZULSfAtm77SlbNjju6MvG75u+WHRWVR6rDVjMPsgwYyVZl3pLTpHkyYHOx8syMiayaJzlDTZ9YyaZNFVkiYH2ZUEBcVJJXVImuz6Js3Qofe59pq7DoOTILu+g+a288mCouk7/1iH4qTS+2QdDppbV1ZJmrnDXnPnc5UOs2Z0fUmTuyBr+krvSioJyUmQO0dZM7mepMkWnaNRkyrJB6uskTSjxY3Fll8bvmJwlDb83FJ8gMqAB80uyBY3Trb82PAfvjj6vuHnluIdKgMeNXOwctK5NKBoHitrb1RJeHRp5Ux4ojLg0aWMHGQvUOkxIWkKVsHsTPiNSo8HDC5lZIsgO6n0uMUdRvQuFQxB8UR4RmXC2vvsgtEfhL+o9JiQvE7GGBTPCK9QSUjoMWgKDthjDrIX+h/k0I7gth6N5gAAAABJRU5ErkJggg==",iconSize:[32,32],iconAnchor:[16,16]})},_onHandleDrag:function(){var t=this._handled,e=t._map,i=t.getCorner(this._corner),o=this.getLatLng(),n=this.calculateAngleDelta(i,o),a=this._calculateScalingFactor(i,o);0!==n&&t.rotateBy(n,"rad");var s=t.edgeMinWidth;s||(s=50);var r=e.latLngToContainerPoint(t.getCorner(0)),l=e.latLngToContainerPoint(t.getCorner(1)),c=Math.abs(r.x-l.x),d=Math.abs(r.y-l.y);Math.sqrt(c*c+d*d)>s||a>1?t.scaleBy(a):t.scaleBy(1)},updateHandle:function(){this.setLatLng(this._handled.getCorner(this._corner))}}),L.freeRotateHandle=function(t,e,i){return new L.FreeRotateHandle(t,e,i)}},789:function(){L.LockHandle=L.EditHandle.extend({options:{TYPE:"lock",interactive:!1,icon:L.icon({iconUrl:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAD8SURBVO3BPU7CYAAA0AdfjIcQlRCQBG7C3gk2uIPG2RC3Dk16Gz0FTO1WZs/gwGCMP/2+xsSl7+n1er1Iz9LtRQjaPeMeO+TinLDCJV78YqjdA04YodKuxhUaPGoRxMmxwRQZSt87Yo4KExGCeAUyLLFB4bMacxywEClIU2KDKXbInTUYo8JCgoFuGoxQO5uiwY1EA91VmDqrcKeDoX8WdNNgjApvmGGLXKIgXY0xGkxQYItrrFFIEKQ5Yo4KEx9yrDFDhlKkIF6NOQ5Y+KpAhiXWKEQI4pxwiwoLPyuxwQw75FoE7fZYocFEuwI7jHCBV39gL92TXq/Xi/AOcmczZmaIMScAAAAASUVORK5CYII=",iconSize:[32,32],iconAnchor:[16,16]})},onRemove:function(t){this.unbindTooltip(),L.EditHandle.prototype.onRemove.call(this,t)},_bindListeners:function(){var t=this.getElement();L.EditHandle.prototype._bindListeners.call(this),L.DomEvent.on(t,{mousedown:this._tooltipOn,mouseup:this._tooltipOff},this),L.DomEvent.on(document,"pointerleave",this._tooltipOff,this)},_unbindListeners:function(){var t=this.getElement();L.EditHandle.prototype._bindListeners.call(this),L.DomEvent.off(t,{mousedown:this._tooltipOn,mouseup:this._tooltipOff},this),L.DomEvent.off(document,"pointerleave",this._tooltipOff,this)},_onHandleDrag:function(){},updateHandle:function(){this.setLatLng(this._handled.getCorner(this._corner))},_tooltipOn:function(t){var e=this._handled.parentGroup,i=e?e.editing:this._handled.editing;if(!t.shiftKey&&(this._handled.isSelected()||!e||e.isCollected(this._handled))){var o=i._lockHandles;this._timer=setTimeout(L.bind((function(){this._timeout&&clearTimeout(this._timeout),this.getTooltip()?o.eachLayer((function(t){this!==t&&t.closeTooltip()})):this.bindTooltip("Locked!",{permanent:!0}),this.openTooltip()}),this),500)}},_tooltipOff:function(t){var e=this._handled.parentGroup,i=e?e.editing:this._handled.editing;if(!t.shiftKey&&(this._handled.isSelected()||!e||e.isCollected(this._handled))){var o=i._lockHandles;t.currentTarget===document&&o.eachLayer((function(t){t.closeTooltip()})),this._timer&&clearTimeout(this._timer),this._timeout=setTimeout(L.bind((function(){this.closeTooltip()}),this),400)}}}),L.lockHandle=function(t,e,i){return new L.LockHandle(t,e,i)}},337:function(){L.RotateHandle=L.EditHandle.extend({options:{TYPE:"rotate",icon:L.icon({iconUrl:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAAHiSURBVMXBa3HbShgA0PMp/1sCCo8oCEpgTaCXgIXAJiDzyCJoAUTm4UVQAns1Y8+snWnTvJyeE16hkjDgDrfoNTMKcpC9UPiLSo8JyetkjEHxjPCMyoS199kFoz8Iv1HpMaN3qWDCHoegOKkkRwnJpRmroHgiPFEZ8IBekzEGxQtUEhKSS/fB7Ew4U+lxcGkVZG9QWWPSFAxBcdK59KApuA+yNwp2uEdx1GN25sZJZULSfAtm77SlbNjju6MvG75u+WHRWVR6rDVjMPsgwYyVZl3pLTpHkyYHOx8syMiayaJzlDTZ9YyaZNFVkiYH2ZUEBcVJJXVImuz6Js3Qofe59pq7DoOTILu+g+a288mCouk7/1iH4qTS+2QdDppbV1ZJmrnDXnPnc5UOs2Z0fUmTuyBr+krvSioJyUmQO0dZM7mepMkWnaNRkyrJB6uskTSjxY3Fll8bvmJwlDb83FJ8gMqAB80uyBY3Trb82PAfvjj6vuHnluIdKgMeNXOwctK5NKBoHitrb1RJeHRp5Ux4ojLg0aWMHGQvUOkxIWkKVsHsTPiNSo8HDC5lZIsgO6n0uMUdRvQuFQxB8UR4RmXC2vvsgtEfhL+o9JiQvE7GGBTPCK9QSUjoMWgKDthjDrIX+h/k0I7gth6N5gAAAABJRU5ErkJggg==",iconSize:[32,32],iconAnchor:[16,16]})},_onHandleDrag:function(){var t=this._handled,e=t.getCorner(this._corner),i=this.getLatLng(),o=this.calculateAngleDelta(e,i);t.rotateBy(o,"rad")},updateHandle:function(){this.setLatLng(this._handled.getCorner(this._corner))}}),L.rotateHandle=function(t,e,i){return new L.RotateHandle(t,e,i)}},350:function(){L.ScaleHandle=L.EditHandle.extend({options:{TYPE:"scale",icon:L.icon({iconUrl:"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2ZXJzaW9uPSIxLjEiIHdpZHRoPSI0NTkiIGhlaWdodD0iNDY0IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCA1MTIgNTEyIiB4bWw6c3BhY2U9InByZXNlcnZlIiBzdHlsZT0iIj48cmVjdCBpZD0iYmFja2dyb3VuZHJlY3QiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIHg9IjAiIHk9IjAiIGZpbGw9Im5vbmUiIHN0cm9rZT0ibm9uZSIgY2xhc3M9IiIgc3R5bGU9IiIvPjxnIGNsYXNzPSJjdXJyZW50TGF5ZXIiIHN0eWxlPSIiPjx0aXRsZT5MYXllciAxPC90aXRsZT48cGF0aCBkPSJNNDU5LjA0OTE1OTUzMDQ3MTM0LDg2LjkyNjIzNDUxMjU1MDAyIFYwIGgtODUuNzE0NTczMzU2MzEyMDkgdjI3LjA0MzcxNzQwMzkwNDQ1MiBIODUuNzE0NTczMzU2MzEyMDMgVjAgSDAgdjg2LjkyNjIzNDUxMjU1MDAyIGgyNS43MTQzNzIwMDY4OTM2MjYgdjI4OS43NTQxMTUwNDE4MzM0IEgwIHY4Ni45MjYyMzQ1MTI1NTAwMiBoODUuNzE0NTczMzU2MzEyMDkgdi0yNy4wNDM3MTc0MDM5MDQ0NTIgaDI4NS43MTUyNDQ1MjEwNDAzIHYyNy4wNDM3MTc0MDM5MDQ0NTIgaDg1LjcxNDU3MzM1NjMxMjA5IHYtODYuOTI2MjM0NTEyNTUwMDIgaC0yMy44MDk2MDM3MTAwODY2OSBWODYuOTI2MjM0NTEyNTUwMDIgSDQ1OS4wNDkxNTk1MzA0NzEzNCB6TTM4NC43NjMxOTU5NTUwMDA5LDEyLjU1NjAxMTY1MTgxMjc4MSBoNjEuOTA0OTY5NjQ2MjI1Mzk2IHY2Mi43ODAwNTgyNTkwNjM5MSBoLTYxLjkwNDk2OTY0NjIyNTM5NiBWMTIuNTU2MDExNjUxODEyNzgxIHpNMTIuMzgwOTkzOTI5MjQ1MDUsMTIuNTU2MDExNjUxODEyNzgxIGg2MS45MDQ5Njk2NDYyMjUzOTYgdjYyLjc4MDA1ODI1OTA2MzkxIEgxMi4zODA5OTM5MjkyNDUwNSBWMTIuNTU2MDExNjUxODEyNzgxIHpNNzQuMjg1OTYzNTc1NDcwNTMsNDUxLjA1MDU3MjQxNTEyMDY2IEgxMi4zODA5OTM5MjkyNDUwNSB2LTYyLjc4MDA1ODI1OTA2MzkxIGg2MS45MDQ5Njk2NDYyMjUzOTYgVjQ1MS4wNTA1NzI0MTUxMjA2NiB6TTQ0NS43MTU3ODE0NTI4MjI3NCw0NTEuMDUwNTcyNDE1MTIwNjYgaC02Mi44NTczNTM3OTQ2Mjg4NjQgdi02Mi43ODAwNTgyNTkwNjM5MSBoNjIuODU3MzUzNzk0NjI4ODY0IFY0NTEuMDUwNTcyNDE1MTIwNjYgek00MDcuNjIwNDE1NTE2Njg0MjYsMzc2LjY4MDM0OTU1NDM4MzQ0IGgtMzYuMTkwNTk3NjM5MzMxNzcgdjMyLjgzODc5OTcwNDc0MTEyIEg4NS43MTQ1NzMzNTYzMTIwMyB2LTMyLjgzODc5OTcwNDc0MTEyIEg0OS41MjM5NzU3MTY5ODAzMiBWODYuOTI2MjM0NTEyNTUwMDIgaDM2LjE5MDU5NzYzOTMzMTc3IFY1MC4yMjQwNDY2MDcyNTExMjUgaDI4Ny42MjAwMTI4MTc4NDcyIHYzNi43MDIxODc5MDUyOTg5IGgzNC4yODU4MjkzNDI1MjQ4MzUgVjM3Ni42ODAzNDk1NTQzODM0NCB6IiBpZD0ic3ZnXzIiIGNsYXNzPSIiIGZpbGw9IiMxYTFhZWIiIGZpbGwtb3BhY2l0eT0iMSIvPjwvZz48L3N2Zz4=",iconSize:[32,32],iconAnchor:[16,16]})},_onHandleDrag:function(){var t=this._handled,e=t._map,i=t.edgeMinWidth,o=t.getCorner(this._corner),n=this.getLatLng(),a=this._calculateScalingFactor(o,n);i||(i=50);var s=e.latLngToLayerPoint(t.getCorner(0)),r=e.latLngToLayerPoint(t.getCorner(1)),l=Math.abs(s.x-r.x),c=Math.abs(s.y-r.y);Math.sqrt(l*l+c*c)>i||a>1?t.scaleBy(a):t.scaleBy(1)},updateHandle:function(){this.setLatLng(this._handled.getCorner(this._corner))}}),L.scaleHandle=function(t,e,i){return new L.ScaleHandle(t,e,i)}},719:function(){L.distortableImage=L.DistortableImage||{},L.distortableImage=L.DistortableImage,L.DistortableImage.group_action_map={},L.DistortableImage.ControlBar=L.Toolbar2.Control.extend({}),L.distortableImage.controlBar=function(t){return new L.DistortableImage.ControlBar(t)},L.DistortableCollection.addInitHook((function(){this.ACTIONS=[L.ExportAction,L.DeleteAction,L.LockAction,L.UnlockAction],L.DistortableCollection.Edit.MODES={lock:L.LockAction,unlock:L.UnlockAction};var t=this.options.actions?this.options.actions:this.ACTIONS;this.editing=L.distortableCollection.edit(this,{actions:t})}))},93:function(){L.DistortableImage=L.DistortableImage||{},L.distortableImage=L.DistortableImage,L.DistortableImage.action_map={},L.DistortableImage.PopupBar=L.Toolbar2.Popup.extend({options:{anchor:[0,-10]},initialize:function(t,e){L.setOptions(this,e),L.Toolbar2.Popup.prototype.initialize.call(this,t,e)},addHooks:function(t,e){this.map=t,this.ov=e},tools:function(){if(this._ul)return this._ul.children},clickTool:function(t){for(var e=this.tools(),i=0;i',_symbols:"",render:function(){return this.addSymbols(this._symbols),this._svg},addSymbols:function(t){this._svg+=t}})},261:function(){L.KeymapperIconSet=L.IconSet.extend({_symbols:''})},929:function(){L.ToolbarIconSet=L.IconSet.extend({_symbols:''})},496:function(){L.Map.mergeOptions({boxCollector:!0,boxZoom:!1}),L.Map.BoxCollector=L.Map.BoxZoom.extend({initialize:function(t){this._map=t,this._container=t._container,this._pane=t._panes.overlayPane,this._resetStateTimeout=0,t.on("unload",this._destroy,this)},addHooks:function(){L.DomEvent.on(this._container,"mousedown",this._onMouseDown,this)},removeHooks:function(){L.DomEvent.off(this._container,"mousedown",this._onMouseDown,this)},moved:function(){return this._moved},_destroy:function(){L.DomUtil.remove(this._pane),delete this._pane},_resetState:function(){this._resetStateTimeout=0,this._moved=!1},_clearDeferredResetState:function(){0!==this._resetStateTimeout&&(clearTimeout(this._resetStateTimeout),this._resetStateTimeout=0)},_onMouseDown:function(t){if(!t.shiftKey||1!==t.which&&1!==t.button)return!1;this._clearDeferredResetState(),this._resetState(),L.DomUtil.disableTextSelection(),L.DomUtil.disableImageDrag(),this._startPoint=this._map.mouseEventToContainerPoint(t),L.DomEvent.on(document,{contextmenu:L.DomEvent.stop,mousemove:this._onMouseMove,mouseup:this._onMouseUp},this)},_onMouseMove:function(t){this._moved||(this._moved=!0,this._box=L.DomUtil.create("div","leaflet-zoom-box",this._container),L.DomUtil.addClass(this._container,"leaflet-crosshair"),this._map.fire("boxzoomstart")),this._point=this._map.mouseEventToContainerPoint(t),this._bounds=L.bounds(this._startPoint,this._point);var e=this._bounds.getSize();L.DomUtil.setPosition(this._box,this._bounds.min),this._box.style.width=e.x+"px",this._box.style.height=e.y+"px"},_finish:function(){this._moved&&(L.DomUtil.remove(this._box),L.DomUtil.removeClass(this._container,"leaflet-crosshair")),L.DomUtil.enableTextSelection(),L.DomUtil.enableImageDrag(),L.DomEvent.off(document,{contextmenu:L.DomEvent.stop,mousemove:this._onMouseMove,mouseup:this._onMouseUp},this)},_onMouseUp:function(t){if((1===t.which||1===t.button)&&(this._finish(),this._moved)){this._clearDeferredResetState(),this._resetStateTimeout=setTimeout(L.Util.bind(this._resetState,this),0);var e=L.latLngBounds(this._map.containerPointToLatLng(this._bounds.getBottomLeft()),this._map.containerPointToLatLng(this._bounds.getTopRight())),i=this._map.getZoom(),o=this._map.getCenter();e=this._map._latLngBoundsToNewLayerBounds(e,i,o),this._map.fire("boxcollectend",{boxCollectBounds:e})}}}),L.Map.addInitHook("addHandler","boxCollector",L.Map.BoxCollector)},291:function(){L.Map.mergeOptions({doubleClickLabels:!0}),L.Map.DoubleClickLabels=L.Map.DoubleClickZoom.extend({enable:function(){var t=this._map;return this._enabled||(t.doubleClickZoom.enabled()&&t.doubleClickZoom.disable(),this._map.fire("singleclickon"),this._enabled=!0,this.addHooks()),this},disable:function(){return this._enabled?(this._enabled=!1,this.removeHooks(),this):this},_fireIfSingle:function(t){var e=this._map,i=t.originalEvent;i&&i.shiftKey||(e._clicked+=1,this._map._clickTimeout=setTimeout((function(){1===e._clicked?(e._clicked=0,e.fire("singleclick",{type:"singleclick"})):L.Browser.touch&&i&&i.sourceCapabilities.firesTouchEvents&&e.fire("dblclick")}),250))},_onDoubleClick:function(){var t=this._map,e=t._labels;setTimeout((function(){t._clicked=0,clearTimeout(t._clickTimeout)}),0),e&&(1===e.options.opacity?(e.options.opacity=0,e.setOpacity(0)):(e.options.opacity=1,e.setOpacity(1)))}}),L.Map.addInitHook("addHandler","doubleClickLabels",L.Map.DoubleClickLabels)},752:function(){L.Map.DoubleClickZoom.include({addHooks:function(){this._map.on({click:this._fireIfSingle,dblclick:this._onDoubleClick},this)},removeHooks:function(){this._map.off({click:this._fireIfSingle,dblclick:this._onDoubleClick},this)},enable:function(){return this._enabled||this._map.doubleClickLabels&&this._map.doubleClickLabels.enabled()||(this._map.fire("singleclickon"),this._enabled=!0,this.addHooks()),this},disable:function(){return this._enabled?(this._map.fire("singleclickoff"),this._enabled=!1,this.removeHooks(),this):this},_fireIfSingle:function(t){var e=this._map,i=t.originalEvent;i&&i.shiftKey||(e._clicked+=1,this._map._clickTimeout=setTimeout((function(){1===e._clicked?(e._clicked=0,e.fire("singleclick",{type:"singleclick"})):L.Browser.touch&&i&&i.sourceCapabilities.firesTouchEvents&&e._fireDOMEvent(i,"dblclick",[e])}),250))},_onDoubleClick:function(t){var e=this._map,i=t.originalEvent;if(setTimeout((function(){e._clicked=0,clearTimeout(e._clickTimeout)}),0),!i)return!1;var o=e.getZoom(),n=e.options.zoomDelta,a=i.shiftKey?o-n:o+n;"center"===e.options.doubleClickZoom?e.setZoom(a):e.setZoomAround(t.containerPoint,a)}})},131:function(){L.Map.include({_clicked:0,addGoogleMutant:function(t){return(t=this.mutantOptions=L.extend({mutantOpacity:.8,maxZoom:24,maxNativeZoom:20,minZoom:0,labels:!0,labelOpacity:1,doubleClickLabels:!0},t)).labels||(this.mutantOptions=L.extend(this.mutantOptions,{labelOpacity:t.labels?1:void 0,doubleClickLabels:!!t.labels||void 0})),this._googleMutant=L.tileLayer("http://mt0.google.com/vt/lyrs=s&x={x}&y={y}&z={z}",{maxZoom:t.maxZoom,maxNativeZoom:t.maxNativeZoom,minZoom:t.minZoom,opacity:t.mutantOpacity}).addTo(this),t.labels?this._addLabels(t):this.doubleClickLabels=void 0,this},_addLabels:function(t){return 0!==t.labelOpacity&&1!==t.labelOpacity&&(t.labelOpacity=1),this._labels=L.tileLayer("https://stamen-tiles-{s}.a.ssl.fastly.net/toner-labels/{z}/{x}/{y}{r}.{ext}",{attribution:'Map tiles by Stamen Design, CC BY 3.0 — Map data © OpenStreetMap contributors',subdomains:"abcd",interactive:!1,opacity:t.labelOpacity,maxZoom:t.maxZoom,maxNativeZoom:t.maxNativeZoom,minZoom:t.minZoom,ext:"png"}).addTo(this),this.mutantOptions.doubleClickLabels&&this.doubleClickLabels.enable(),this}}),L.Map.addInitHook((function(){this.doubleClickLabels.disable(),this.doubleClickZoom.enable()}))},999:function(){L.DomUtil=L.extend(L.DomUtil,{initTranslation:function(t){this.translation=t},getMatrixString:function(t){var e=L.Browser.webkit3d||L.Browser.gecko3d||L.Browser.ie3d,i=[t[0],t[3],0,t[6],t[1],t[4],0,t[7],0,0,1,0,t[2],t[5],0,t[8]],o=e?"matrix3d("+i.join(",")+")":"";return e||console.log("Your browser must support 3D CSS transformsin order to use DistortableImageOverlay."),o},toggleClass:function(t,e){var i=e;return this.hasClass(t,i)?this.removeClass(t,i):this.addClass(t,i)},confirmDelete:function(){return window.confirm(this.translation.confirmImageDelete)},confirmDeletes:function(t){if(1===t)return this.confirmDelete();var e,i=this.translation.confirmImagesDeletes;return e="function"==typeof i?i(t):i,window.confirm(e)}})},85:function(){L.IconUtil={create:function(t){return/^#/.test(t)&&(t=t.replace(/^#/,"")),''},addClassToSvg:function(t,e){var i=t.querySelector("svg");i&&L.DomUtil.addClass(i,e)},toggleXlink:function(t,e,i){/^#/.test(e)||(e="#"+e),/^#/.test(i)||(i="#"+i);var o=t.querySelector("use");if(o){var n=o.getAttribute("xlink:href")===e?i:e;return o.setAttribute("xlink:href",n),n}return!1},toggleTitle:function(t,e,i){var o=t.getAttribute("title")===e?i:e;return t.setAttribute("title",o),t.hasAttribute("aria-label")&&t.setAttribute("aria-label",o),o}}},351:function(){L.ImageUtil={getCmPerPixel:function(t){var e=t._map;return 100*e.latLngToLayerPoint(t.getCorner(0)).distanceTo(e.latLngToLayerPoint(t.getCorner(1)))/t.getElement().width}}},360:function(){L.MatrixUtil={adj:function(t){return[t[4]*t[8]-t[5]*t[7],t[2]*t[7]-t[1]*t[8],t[1]*t[5]-t[2]*t[4],t[5]*t[6]-t[3]*t[8],t[0]*t[8]-t[2]*t[6],t[2]*t[3]-t[0]*t[5],t[3]*t[7]-t[4]*t[6],t[1]*t[6]-t[0]*t[7],t[0]*t[4]-t[1]*t[3]]},multmm:function(t,e){var i,o=[];for(i=0;i<3;i++)for(var n=0;n<3;n++){for(var a=0,s=0;s<3;s++)a+=t[3*i+s]*e[3*s+n];o[3*i+n]=a}return o},multmv:function(t,e){return[t[0]*e[0]+t[1]*e[1]+t[2]*e[2],t[3]*e[0]+t[4]*e[1]+t[5]*e[2],t[6]*e[0]+t[7]*e[1]+t[8]*e[2]]},multsm:function(t,e){for(var i=[],o=0,n=e.length;o2&&void 0!==arguments[2]?arguments[2]:"deg";return"deg"===i?this.radiansToDegrees(Math.atan2(e,t)):Math.atan2(e,t)},radiansToDegrees:function(t){return 180*t/Math.PI},degreesToRadians:function(t){return t*Math.PI/180}}},866:function(){L.Utils={initTranslation:function(){var t={deleteImage:"Delete Image",deleteImages:"Delete Images",distortImage:"Distort Image",dragImage:"Drag Image",exportImage:"Export Image",exportImages:"Export Images",removeBorder:"Remove Border",addBorder:"Add Border",freeRotateImage:"Free rotate Image",geolocateImage:"Geolocate Image",lockMode:"Lock Mode",lockImages:"Lock Images",makeImageOpaque:"Make Image Opaque",makeImageTransparent:"Make Image Transparent",restoreImage:"Restore Natural Image",rotateImage:"Rotate Image",scaleImage:"Scale Image",stackToFront:"Stack to Front",stackToBack:"Stack to Back",unlockImages:"Unlock Images",confirmImageDelete:"Are you sure? This image will be permanently deleted from the map.",confirmImagesDeletes:"Are you sure? These images will be permanently deleted from the map."};if(this.options.translation)for(var e in t)this.options.translation.hasOwnProperty(e)||(this.options.translation[e]=t[e]);else this.options.translation=t;L.DomUtil.initTranslation(this.options.translation)},getNestedVal:function(t,e,i){return[e,i].reduce((function(t,e){return t&&t[e]}),t)}}}};t[999](),t[85](),t[351](),t[360](),t[682](),t[866](),t[477](),t[808](),t[743](),t[988](),t[92](),t[194](),t[206](),t[789](),t[337](),t[350](),t[376](),t[261](),t[929](),t[280](),t[426](),t[114](),t[231](),t[541](),t[149](),t[74](),t[691](),t[105](),t[944](),t[954](),t[178](),t[547](),t[886](),t[129](),t[93](),t[719](),t[397](),t[428](),t[782](),t[752](),t[496](),t[291](),t[131]()}(); -======= /******/ (function() { // webpackBootstrap /******/ var __webpack_modules__ = ({ @@ -201,7 +198,6 @@ var arr = []; L.DistortableCollection = L.FeatureGroup.extend({ options: { editable: true, - tooltipControl: document.createElement('button'), exportOpts: { exportStartUrl: '//export.mapknitter.org/export', statusUrl: '//export.mapknitter.org', @@ -213,7 +209,6 @@ L.DistortableCollection = L.FeatureGroup.extend({ L.FeatureGroup.prototype.initialize.call(this, options); L.Utils.initTranslation.call(this); this.editable = this.options.editable; - this.tooltipControl = this.options.tooltipControl; }, onAdd: function onAdd(map) { L.FeatureGroup.prototype.onAdd.call(this, map); @@ -230,27 +225,6 @@ L.DistortableCollection = L.FeatureGroup.extend({ this.on('layeradd', this._addEvents, this); this.on('layerremove', this._removeEvents, this); - L.DomEvent.on(this.tooltipControl, 'click', this._updateTooltipBtn, this); - }, - _updateTooltipBtn: function _updateTooltipBtn(e) { - if (e.target.textContent === 'Open Tooltip') { - e.target.textContent = 'Close Tooltip'; - this.eachLayer(function (layer) { - L.DomEvent.on(layer.getElement(), 'mousemove', layer.activateTooltip, layer); - L.DomEvent.on(layer.getElement(), 'mouseout', layer.closeToolTip, layer); - e.target.textContent = 'Close Tooltip'; - }); - return; - } - - if (e.target.textContent === 'Close Tooltip') { - e.target.textContent = 'Open Tooltip'; - this.eachLayer(function (layer) { - L.DomEvent.off(layer.getElement(), 'mouseout'); - L.DomEvent.off(layer.getElement(), 'mousemove'); - }); - return; - } }, onRemove: function onRemove() { if (this.editing) { @@ -259,15 +233,6 @@ L.DistortableCollection = L.FeatureGroup.extend({ this.off('layeradd', this._addEvents, this); this.off('layerremove', this._removeEvents, this); - - if (e.target.textContent === 'Close Tooltip') { - e.target.textContent = 'Open Tooltip'; - this.eachLayer(function (layer) { - L.DomEvent.off(layer.getElement(), 'mouseout'); - L.DomEvent.off(layer.getElement(), 'mousemove'); - }); - return; - } }, _addEvents: function _addEvents(e) { var layer = e.layer; @@ -501,9 +466,7 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ mode: 'distort', selected: false, interactive: true, - tooltipText: 'Unknown image', - // default tooltipText - tooltipOpen: false + tooltipText: 'Unknown image' }, initialize: function initialize(url, options) { L.setOptions(this, options); @@ -514,8 +477,7 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ this._url = url; this.rotation = {}; this.interactive = this.options.interactive; - this.tooltipText = options.tooltipText; - this.tooltipOpen = options.tooltipOpen; + this.tooltipText = this.options.tooltipText; }, onAdd: function onAdd(map) { var _this = this; @@ -597,6 +559,8 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ } this.fire('add'); + L.DomEvent.on(this.getElement(), 'mousemove', this.activateTooltip, this); + L.DomEvent.on(this.getElement(), 'mouseout', this.closeTooltip, this); }, onRemove: function onRemove(map) { L.DomEvent.off(this.getElement(), 'click', this.select, this); @@ -613,6 +577,8 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ this.fire('remove'); L.ImageOverlay.prototype.onRemove.call(this, map); + L.DomEvent.on(this.getElement(), 'mouseout', this.closeTooltip, this); + L.DomEvent.off(this.getElement(), 'mousemove', this.deactivateTooltip, this); }, _initImageDimensions: function _initImageDimensions() { var map = this._map; @@ -655,7 +621,7 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ L.DomEvent.off(map, 'singleclick', this.deselect, this); }, isSelected: function isSelected() { - return this._selected; // this._selected + return this._selected; }, deselect: function deselect() { var edit = this.editing; @@ -1026,8 +992,7 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ }); L.distortableImageOverlay = function (id, options) { - // remove temp - return new L.DistortableImageOverlay(id, options); // remove temp + return new L.DistortableImageOverlay(id, options); }; L.Map.addInitHook(function () { @@ -7321,7 +7286,7 @@ module.exports.formatError = function (err) { /******/ /******/ /* webpack/runtime/getFullHash */ /******/ !function() { -/******/ __webpack_require__.h = function() { return "1599ccb50a3537105b01"; } +/******/ __webpack_require__.h = function() { return "9879b70368715db77abe"; } /******/ }(); /******/ /******/ /* webpack/runtime/hasOwnProperty shorthand */ @@ -8353,5 +8318,4 @@ module.exports.formatError = function (err) { /******/ /******/ })() ; ->>>>>>> 24c08afffbd3bd1a91a1ae26c8c22af7e484bb90 //# sourceMappingURL=leaflet.distortableimage.js.map \ No newline at end of file diff --git a/src/DistortableCollection.js b/src/DistortableCollection.js index b536b84ca..bce3b9116 100644 --- a/src/DistortableCollection.js +++ b/src/DistortableCollection.js @@ -2,7 +2,6 @@ const arr = []; L.DistortableCollection = L.FeatureGroup.extend({ options: { editable: true, - tooltipControl: document.createElement('button'), exportOpts: { exportStartUrl: '//export.mapknitter.org/export', statusUrl: '//export.mapknitter.org', @@ -16,7 +15,6 @@ L.DistortableCollection = L.FeatureGroup.extend({ L.Utils.initTranslation.call(this); this.editable = this.options.editable; - this.tooltipControl = this.options.tooltipControl; }, onAdd(map) { @@ -32,46 +30,12 @@ L.DistortableCollection = L.FeatureGroup.extend({ */ this.on('layeradd', this._addEvents, this); this.on('layerremove', this._removeEvents, this); - L.DomEvent.on(this.tooltipControl, 'click', this._updateTooltipBtn, this); - }, - - _updateTooltipBtn(e) { - if (e.target.textContent === 'Open Tooltip') { - e.target.textContent = 'Close Tooltip'; - this.eachLayer((layer) => { - L.DomEvent.on(layer.getElement(), 'mousemove', layer.activateTooltip, layer); - L.DomEvent.on(layer.getElement(), 'mouseout', layer.closeToolTip, layer); - e.target.textContent = 'Close Tooltip'; - }); - - return; - } - - if (e.target.textContent === 'Close Tooltip') { - e.target.textContent = 'Open Tooltip'; - this.eachLayer((layer) => { - L.DomEvent.off(layer.getElement(), 'mouseout'); - L.DomEvent.off(layer.getElement(), 'mousemove'); - }); - - return; - } }, onRemove() { if (this.editing) { this.editing.disable(); } this.off('layeradd', this._addEvents, this); this.off('layerremove', this._removeEvents, this); - - if (e.target.textContent === 'Close Tooltip') { - e.target.textContent = 'Open Tooltip'; - this.eachLayer((layer) => { - L.DomEvent.off(layer.getElement(), 'mouseout'); - L.DomEvent.off(layer.getElement(), 'mousemove'); - }); - - return; - } }, _addEvents(e) { diff --git a/src/DistortableImageOverlay.js b/src/DistortableImageOverlay.js index ab6890c9f..722e69cac 100644 --- a/src/DistortableImageOverlay.js +++ b/src/DistortableImageOverlay.js @@ -10,7 +10,6 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ selected: false, interactive: true, tooltipText: 'Unknown image', - tooltipOpen: false, }, initialize(url, options) { @@ -22,6 +21,7 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ this._selected = this.options.selected; this._url = url; this.rotation = {}; + this.interactive = this.options.interactive; this.tooltipText = this.options.tooltipText; }, @@ -87,8 +87,8 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ this.fire('add'); - L.DomEvent.on(this.getElement(), 'mousemove', this._activateTooltip, this); - L.DomEvent.on(this.getElement(), 'mouseout', this._closeTooltip, this); + L.DomEvent.on(this.getElement(), 'mousemove', this.activateTooltip, this); + L.DomEvent.on(this.getElement(), 'mouseout', this.closeTooltip, this); }, onRemove(map) { @@ -105,7 +105,8 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ L.ImageOverlay.prototype.onRemove.call(this, map); - L.DomEvent.off(this.getElement(), 'mouseover', this._deactivateTooltip, this); + L.DomEvent.on(this.getElement(), 'mouseout', this.closeTooltip, this); + L.DomEvent.off(this.getElement(), 'mousemove', this.deactivateTooltip, this); }, _initImageDimensions() { From d1f6d0a27b26f74d34dfdbcc91a961b4eadd33f7 Mon Sep 17 00:00:00 2001 From: segun Date: Tue, 17 Jan 2023 00:21:11 +0100 Subject: [PATCH 50/57] remove cc file --- examples/archive.css | 21 --------------------- 1 file changed, 21 deletions(-) delete mode 100644 examples/archive.css diff --git a/examples/archive.css b/examples/archive.css deleted file mode 100644 index 01e80b042..000000000 --- a/examples/archive.css +++ /dev/null @@ -1,21 +0,0 @@ - -/*REMOVE IF NOT NEEDED .distortableImageTooltip { - position: relative; - display: inline-block; - border-bottom: 1px white; - z-index: 1800; - position: absolute; -} */ - -/* .tooltipText { - width: 120px; - bottom: 100%; - left: 50%; - margin-left: -60px; - visibility: hidden; - background-color: #fff; - color: red; - text-align: center; - padding: 5px 0; - border-radius: 6px; -} */ \ No newline at end of file From c9d0a138d3d2e09430b8d94f13f28cbe2190e98d Mon Sep 17 00:00:00 2001 From: segun Date: Tue, 17 Jan 2023 10:21:06 +0100 Subject: [PATCH 51/57] update --- dist/leaflet.distortableimage.js | 4 ++-- src/DistortableImageOverlay.js | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/dist/leaflet.distortableimage.js b/dist/leaflet.distortableimage.js index 65ad221ea..cb7d761d7 100644 --- a/dist/leaflet.distortableimage.js +++ b/dist/leaflet.distortableimage.js @@ -466,7 +466,7 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ mode: 'distort', selected: false, interactive: true, - tooltipText: 'Unknown image' + tooltipText: '' }, initialize: function initialize(url, options) { L.setOptions(this, options); @@ -7286,7 +7286,7 @@ module.exports.formatError = function (err) { /******/ /******/ /* webpack/runtime/getFullHash */ /******/ !function() { -/******/ __webpack_require__.h = function() { return "9879b70368715db77abe"; } +/******/ __webpack_require__.h = function() { return "1d513f6e6ef4497721d3"; } /******/ }(); /******/ /******/ /* webpack/runtime/hasOwnProperty shorthand */ diff --git a/src/DistortableImageOverlay.js b/src/DistortableImageOverlay.js index 722e69cac..29b3f9d71 100644 --- a/src/DistortableImageOverlay.js +++ b/src/DistortableImageOverlay.js @@ -9,7 +9,7 @@ L.DistortableImageOverlay = L.ImageOverlay.extend({ mode: 'distort', selected: false, interactive: true, - tooltipText: 'Unknown image', + tooltipText: '', }, initialize(url, options) { From 55d3997f521693266c61c95d70b6006119e4c756 Mon Sep 17 00:00:00 2001 From: segun Date: Tue, 17 Jan 2023 17:25:37 +0100 Subject: [PATCH 52/57] cleanup --- examples/js/archive.js | 4 ---- 1 file changed, 4 deletions(-) diff --git a/examples/js/archive.js b/examples/js/archive.js index af60c7244..ecfbdda45 100644 --- a/examples/js/archive.js +++ b/examples/js/archive.js @@ -47,7 +47,6 @@ function extractKey() { else if (input.value.includes('http://')) { getUrl = input.value.replace('http:', 'https:'); input.value = getUrl; - console.log('input', input.value); showImages(getUrl); } else @@ -89,8 +88,6 @@ const renderImages = (fullResImages, url) => { const renderThumbnails = (thumbnails = [], url, fullResImgs) => { const imagesToRender = thumbnails || fullResImgs; - console.log('imagesToRender-inside render thumbnail: ', imagesToRender); - imagesToRender.forEach((file) => { const imageRow = document.createElement('div'); const image = new Image(65, 65); @@ -155,7 +152,6 @@ function showImages(getUrl) { }) .catch((error) => { responseText.innerHTML = 'Uh-oh! Something\'s not right with the link provided!'; - console.log(error); }) .finally(() => { bootstrap.Modal.getInstance(welcomeModal).hide(); From 961cd01d4a6d9d1a0ab9ae8f454f040b08eddcb4 Mon Sep 17 00:00:00 2001 From: Jeffrey Warren Date: Tue, 17 Jan 2023 11:46:41 -0500 Subject: [PATCH 53/57] Update src/DistortableCollection.js --- src/DistortableCollection.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/DistortableCollection.js b/src/DistortableCollection.js index bce3b9116..5185ad389 100644 --- a/src/DistortableCollection.js +++ b/src/DistortableCollection.js @@ -34,6 +34,7 @@ L.DistortableCollection = L.FeatureGroup.extend({ onRemove() { if (this.editing) { this.editing.disable(); } + this.off('layeradd', this._addEvents, this); this.off('layerremove', this._removeEvents, this); }, From e32017140cbd7855752e432643443cda36e929e0 Mon Sep 17 00:00:00 2001 From: Jeffrey Warren Date: Tue, 17 Jan 2023 11:46:59 -0500 Subject: [PATCH 54/57] Update src/DistortableCollection.js --- src/DistortableCollection.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/DistortableCollection.js b/src/DistortableCollection.js index 5185ad389..bce3b9116 100644 --- a/src/DistortableCollection.js +++ b/src/DistortableCollection.js @@ -34,7 +34,6 @@ L.DistortableCollection = L.FeatureGroup.extend({ onRemove() { if (this.editing) { this.editing.disable(); } - this.off('layeradd', this._addEvents, this); this.off('layerremove', this._removeEvents, this); }, From 079ec14a6be074d9a53b46661e6155b5eb1d0e30 Mon Sep 17 00:00:00 2001 From: Jeffrey Warren Date: Tue, 17 Jan 2023 11:47:59 -0500 Subject: [PATCH 55/57] Update examples/js/archive.js --- examples/js/archive.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/js/archive.js b/examples/js/archive.js index ecfbdda45..42aacce71 100644 --- a/examples/js/archive.js +++ b/examples/js/archive.js @@ -151,7 +151,7 @@ function showImages(getUrl) { } }) .catch((error) => { - responseText.innerHTML = 'Uh-oh! Something\'s not right with the link provided!'; + console.log(error); }) .finally(() => { bootstrap.Modal.getInstance(welcomeModal).hide(); From f9cfe2e23586344d4e2582b99d26cdac965933da Mon Sep 17 00:00:00 2001 From: Jeffrey Warren Date: Tue, 17 Jan 2023 11:48:39 -0500 Subject: [PATCH 56/57] Update .gitignore --- .gitignore | 1 - 1 file changed, 1 deletion(-) diff --git a/.gitignore b/.gitignore index 9531bf3b6..b407d3097 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,6 @@ node_modules coverage todo.txt -observation.txt *.swp *.swo package-lock.json From 6d8f5472d345430645cc1d1dccd0e123753ec219 Mon Sep 17 00:00:00 2001 From: Jeffrey Warren Date: Tue, 17 Jan 2023 11:49:45 -0500 Subject: [PATCH 57/57] Update examples/js/archive.js --- examples/js/archive.js | 1 + 1 file changed, 1 insertion(+) diff --git a/examples/js/archive.js b/examples/js/archive.js index 42aacce71..41d2671d0 100644 --- a/examples/js/archive.js +++ b/examples/js/archive.js @@ -151,6 +151,7 @@ function showImages(getUrl) { } }) .catch((error) => { + responseText.innerHTML = 'Uh-oh! Something\'s not right with the link provided!'; console.log(error); }) .finally(() => {